@ -20,72 +20,72 @@
* V19 EEPROM Layout :
*
* ver
* axis_steps_per_unit ( x4 )
* max_feedrate ( x4 )
* max_acceleration_units_per_sq_second ( x4 )
* acceleration
* retract_acceleration
* travel_acceleration
* minimumfeedrate
* mintravelfeedrate
* minsegmenttime
* max_xy_jerk
* max_z_jerk
* max_e_jerk
* home_offset ( x3 )
* M92 XYZE axis_steps_per_unit ( x4 )
* M203 XYZE max_feedrate ( x4 )
* M201 XYZE max_acceleration_units_per_sq_second ( x4 )
* M204 P acceleration
* M204 R retract_acceleration
* M204 T travel_acceleration
* M205 S minimumfeedrate
* M205 T mintravelfeedrate
* M205 B minsegmenttime
* M205 X max_xy_jerk
* M205 Z max_z_jerk
* M205 E max_e_jerk
* M206 XYZ home_offset ( x3 )
*
* Mesh bed leveling :
* active
* mesh_num_x
* mesh_num_y
* z_values[ ] [ ]
* zprobe_zoffset
* M420 S active
* mesh_num_x ( set in firmware )
* mesh_num_y ( set in firmware )
* M421 XYZ z_values[ ] [ ]
* M851 zprobe_zoffset
*
* DELTA :
* endstop_adj ( x3 )
* delta_radius
* delta_diagonal_rod
* delta_segments_per_second
* M666 XYZ endstop_adj ( x3 )
* M665 R delta_radius
* M665 L delta_diagonal_rod
* M665 S delta_segments_per_second
*
* ULTIPANEL :
* plaPreheatHotendTemp
* plaPreheatHPBTemp
* plaPreheatFanSpeed
* absPreheatHotendTemp
* absPreheatHPBTemp
* absPreheatFanSpeed
* M145 S0 H plaPreheatHotendTemp
* M145 S0 B plaPreheatHPBTemp
* M145 S0 F plaPreheatFanSpeed
* M145 S1 H absPreheatHotendTemp
* M145 S1 B absPreheatHPBTemp
* M145 S1 F absPreheatFanSpeed
*
* PIDTEMP :
* Kp[ 0 ] , Ki [ 0 ] , Kd [ 0 ] , Kc [ 0 ]
* Kp[ 1 ] , Ki [ 1 ] , Kd [ 1 ] , Kc [ 1 ]
* Kp[ 2 ] , Ki [ 2 ] , Kd [ 2 ] , Kc [ 2 ]
* Kp[ 3 ] , Ki [ 3 ] , Kd [ 3 ] , Kc [ 3 ]
* M301 E0 PIDC Kp[ 0 ] , Ki [ 0 ] , Kd [ 0 ] , Kc [ 0 ]
* M301 E1 PIDC Kp[ 1 ] , Ki [ 1 ] , Kd [ 1 ] , Kc [ 1 ]
* M301 E2 PIDC Kp[ 2 ] , Ki [ 2 ] , Kd [ 2 ] , Kc [ 2 ]
* M301 E3 PIDC Kp[ 3 ] , Ki [ 3 ] , Kd [ 3 ] , Kc [ 3 ]
*
* PIDTEMPBED :
* bedKp, bedKi , bedKd
* M304 PID bedKp, bedKi , bedKd
*
* DOGLCD :
* lcd_contrast
* M250 C lcd_contrast
*
* SCARA :
* axis_scaling ( x3 )
* M365 XYZ axis_scaling ( x3 )
*
* FWRETRACT :
* autoretract_enabled
* retract_length
* retract_length_swap
* retract_feedrate
* retract_zlift
* retract_recover_length
* retract_recover_length_swap
* retract_recover_feedrate
* M209 S autoretract_enabled
* M207 S retract_length
* M207 W retract_length_swap
* M207 F retract_feedrate
* M207 Z retract_zlift
* M208 S retract_recover_length
* M208 W retract_recover_length_swap
* M208 F retract_recover_feedrate
*
* volumetric_enabled
* M200 D volumetric_enabled ( D > 0 makes this enabled )
*
* filament_size ( x4 )
* M200 T D filament_size ( x4 ) ( T0 . .3 )
*
* Z_DUAL_ENDSTOPS
* z_endstop_adj
* Z_DUAL_ENDSTOPS :
* M666 Z z_endstop_adj
*
*/
# include "Marlin.h"
@ -122,7 +122,9 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) {
# define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value))
# define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value))
//======================================================================================
/**
* Store Configuration Settings - M500
*/
# define DUMMY_PID_VALUE 3000.0f
@ -235,7 +237,7 @@ void Config_StoreSettings() {
EEPROM_WRITE_VAR ( i , bedKi ) ;
EEPROM_WRITE_VAR ( i , bedKd ) ;
# ifndef DOGLCD
# ifndef HAS_LCD_CONTRAST
int lcd_contrast = 32 ;
# endif
EEPROM_WRITE_VAR ( i , lcd_contrast ) ;
@ -286,6 +288,10 @@ void Config_StoreSettings() {
SERIAL_ECHOLNPGM ( " bytes) " ) ;
}
/**
* Retrieve Configuration Settings - M501
*/
void Config_RetrieveSettings ( ) {
int i = EEPROM_OFFSET ;
@ -412,7 +418,7 @@ void Config_RetrieveSettings() {
for ( int q = 2 ; q - - ; ) EEPROM_READ_VAR ( i , dummy ) ; // bedKi, bedKd
}
# ifndef DOGLCD
# ifndef HAS_LCD_CONTRAST
int lcd_contrast ;
# endif
EEPROM_READ_VAR ( i , lcd_contrast ) ;
@ -467,6 +473,10 @@ void Config_RetrieveSettings() {
# endif // EEPROM_SETTINGS
/**
* Reset Configuration Settings - M502
*/
void Config_ResetDefault ( ) {
float tmp1 [ ] = DEFAULT_AXIS_STEPS_PER_UNIT ;
float tmp2 [ ] = DEFAULT_MAX_FEEDRATE ;
@ -522,7 +532,7 @@ void Config_ResetDefault() {
absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED ;
# endif
# ifdef DOGLCD
# ifdef HAS_LCD_CONTRAST
lcd_contrast = DEFAULT_LCD_CONTRAST ;
# endif
@ -584,14 +594,20 @@ void Config_ResetDefault() {
# ifndef DISABLE_M503
/**
* Print Configuration Settings - M503
*/
# define CONFIG_ECHO_START do{ if (!forReplay) SERIAL_ECHO_START; }while(0)
void Config_PrintSettings ( bool forReplay ) {
// Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Steps per unit: " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M92 X " , axis_steps_per_unit [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , axis_steps_per_unit [ Y_AXIS ] ) ;
@ -599,23 +615,23 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_ECHOPAIR ( " E " , axis_steps_per_unit [ E_AXIS ] ) ;
SERIAL_EOL ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
# ifdef SCARA
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Scaling factors: " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M365 X " , axis_scaling [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , axis_scaling [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , axis_scaling [ Z_AXIS ] ) ;
SERIAL_EOL ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
# endif // SCARA
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Maximum feedrates (mm/s): " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M203 X " , max_feedrate [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , max_feedrate [ Y_AXIS ] ) ;
@ -623,160 +639,224 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_ECHOPAIR ( " E " , max_feedrate [ E_AXIS ] ) ;
SERIAL_EOL ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Maximum Acceleration (mm/s2): " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M201 X " , max_acceleration_units_per_sq_second [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , max_acceleration_units_per_sq_second [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , max_acceleration_units_per_sq_second [ Z_AXIS ] ) ;
SERIAL_ECHOPAIR ( " M201 X " , max_acceleration_units_per_sq_second [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , max_acceleration_units_per_sq_second [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , max_acceleration_units_per_sq_second [ Z_AXIS ] ) ;
SERIAL_ECHOPAIR ( " E " , max_acceleration_units_per_sq_second [ E_AXIS ] ) ;
SERIAL_EOL ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Accelerations: P=printing, R=retract and T=travel " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M204 P " , acceleration ) ;
SERIAL_ECHOPAIR ( " M204 P " , acceleration ) ;
SERIAL_ECHOPAIR ( " R " , retract_acceleration ) ;
SERIAL_ECHOPAIR ( " T " , travel_acceleration ) ;
SERIAL_EOL ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s) " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M205 S " , minimumfeedrate ) ;
SERIAL_ECHOPAIR ( " T " , mintravelfeedrate ) ;
SERIAL_ECHOPAIR ( " B " , minsegmenttime ) ;
SERIAL_ECHOPAIR ( " X " , max_xy_jerk ) ;
SERIAL_ECHOPAIR ( " M205 S " , minimumfeedrate ) ;
SERIAL_ECHOPAIR ( " T " , mintravelfeedrate ) ;
SERIAL_ECHOPAIR ( " B " , minsegmenttime ) ;
SERIAL_ECHOPAIR ( " X " , max_xy_jerk ) ;
SERIAL_ECHOPAIR ( " Z " , max_z_jerk ) ;
SERIAL_ECHOPAIR ( " E " , max_e_jerk ) ;
SERIAL_EOL ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Home offset (mm): " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M206 X " , home_offset [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , home_offset [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , home_offset [ Z_AXIS ] ) ;
SERIAL_ECHOPAIR ( " M206 X " , home_offset [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , home_offset [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , home_offset [ Z_AXIS ] ) ;
SERIAL_EOL ;
# ifdef MESH_BED_LEVELING
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Mesh bed leveling: " ) ;
CONFIG_ECHO_START ;
}
SERIAL_ECHOPAIR ( " M420 S " , ( int32_t ) mbl . active ) ;
SERIAL_ECHOPAIR ( " X " , MESH_NUM_X_POINTS ) ;
SERIAL_ECHOPAIR ( " Y " , MESH_NUM_Y_POINTS ) ;
SERIAL_EOL ;
for ( int y = 0 ; y < MESH_NUM_Y_POINTS ; y + + ) {
for ( int x = 0 ; x < MESH_NUM_X_POINTS ; x + + ) {
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M421 X " , x ) ;
SERIAL_ECHOPAIR ( " Y " , y ) ;
SERIAL_ECHOPAIR ( " Z " , mbl . z_values [ y ] [ x ] ) ;
SERIAL_EOL ;
}
}
# endif
# ifdef DELTA
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Endstop adjustment (mm): " ) ;
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M666 X " , endstop_adj [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , endstop_adj [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , endstop_adj [ Z_AXIS ] ) ;
SERIAL_ECHOPAIR ( " M666 X " , endstop_adj [ X_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Y " , endstop_adj [ Y_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z " , endstop_adj [ Z_AXIS ] ) ;
SERIAL_EOL ;
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
SERIAL_ECHOLNPGM ( " Delta settings: L=delta_diagonal_rod, R=delta_radius, S=delta_segments_per_second " ) ;
SERIAL_ECHO_START ;
SERIAL_ECHOPAIR ( " M665 L " , delta_diagonal_rod ) ;
SERIAL_ECHOPAIR ( " R " , delta_radius ) ;
SERIAL_ECHOPAIR ( " S " , delta_segments_per_second ) ;
CONFIG _ECHO_START;
SERIAL_ECHOPAIR ( " M665 L " , delta_diagonal_rod ) ;
SERIAL_ECHOPAIR ( " R " , delta_radius ) ;
SERIAL_ECHOPAIR ( " S " , delta_segments_per_second ) ;
SERIAL_EOL ;
# elif defined(Z_DUAL_ENDSTOPS)
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Z2 Endstop adjustment (mm): " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M666 Z " , z_endstop_adj ) ;
SERIAL_ECHOPAIR ( " M666 Z " , z_endstop_adj ) ;
SERIAL_EOL ;
# endif // DELTA
# ifdef ULTIPANEL
CONFIG_ECHO_START ;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Material heatup parameters: " ) ;
CONFIG_ECHO_START ;
}
SERIAL_ECHOPAIR ( " M145 M0 H " , ( unsigned long ) plaPreheatHotendTemp ) ;
SERIAL_ECHOPAIR ( " B " , ( unsigned long ) plaPreheatHPBTemp ) ;
SERIAL_ECHOPAIR ( " F " , ( unsigned long ) plaPreheatFanSpeed ) ;
SERIAL_EOL ;
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M145 M1 H " , ( unsigned long ) absPreheatHotendTemp ) ;
SERIAL_ECHOPAIR ( " B " , ( unsigned long ) absPreheatHPBTemp ) ;
SERIAL_ECHOPAIR ( " F " , ( unsigned long ) absPreheatFanSpeed ) ;
SERIAL_EOL ;
# endif // ULTIPANEL
# if defined(PIDTEMP) || defined(PIDTEMPBED)
SERIAL_ECHO_START ;
CONFIG_ECHO_START ;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " PID settings: " ) ;
SERIAL_ECHO_START ;
}
# if defined(PIDTEMP) && defined(PIDTEMPBED)
SERIAL_EOL ;
# endif
# ifdef PIDTEMP
SERIAL_ECHOPAIR ( " M301 P " , PID_PARAM ( Kp , 0 ) ) ; // for compatibility with hosts, only echos values for E0
SERIAL_ECHOPAIR ( " I " , unscalePID_i ( PID_PARAM ( Ki , 0 ) ) ) ;
SERIAL_ECHOPAIR ( " D " , unscalePID_d ( PID_PARAM ( Kd , 0 ) ) ) ;
SERIAL_EOL ;
# endif
# if EXTRUDERS > 1
if ( forReplay ) {
for ( uint8_t i = 0 ; i < EXTRUDERS ; i + + ) {
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M301 E " , ( unsigned long ) i ) ;
SERIAL_ECHOPAIR ( " P " , PID_PARAM ( Kp , i ) ) ;
SERIAL_ECHOPAIR ( " I " , unscalePID_i ( PID_PARAM ( Ki , i ) ) ) ;
SERIAL_ECHOPAIR ( " D " , unscalePID_d ( PID_PARAM ( Kd , i ) ) ) ;
# ifdef PID_ADD_EXTRUSION_RATE
SERIAL_ECHOPAIR ( " C " , PID_PARAM ( Kc , i ) ) ;
# endif
SERIAL_EOL ;
}
}
else
# endif // EXTRUDERS > 1
// !forReplay || EXTRUDERS == 1
{
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M301 P " , PID_PARAM ( Kp , 0 ) ) ; // for compatibility with hosts, only echo values for E0
SERIAL_ECHOPAIR ( " I " , unscalePID_i ( PID_PARAM ( Ki , 0 ) ) ) ;
SERIAL_ECHOPAIR ( " D " , unscalePID_d ( PID_PARAM ( Kd , 0 ) ) ) ;
# ifdef PID_ADD_EXTRUSION_RATE
SERIAL_ECHOPAIR ( " C " , PID_PARAM ( Kc , 0 ) ) ;
# endif
SERIAL_EOL ;
}
# endif // PIDTEMP
# ifdef PIDTEMPBED
SERIAL_ECHOPAIR ( " M304 P " , bedKp ) ; // for compatibility with hosts, only echos values for E0
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M304 P " , bedKp ) ;
SERIAL_ECHOPAIR ( " I " , unscalePID_i ( bedKi ) ) ;
SERIAL_ECHOPAIR ( " D " , unscalePID_d ( bedKd ) ) ;
SERIAL_EOL ;
# endif
# endif // PIDTEMP || PIDTEMPBED
# ifdef HAS_LCD_CONTRAST
CONFIG_ECHO_START ;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " LCD Contrast: " ) ;
CONFIG_ECHO_START ;
}
SERIAL_ECHOPAIR ( " M250 C " , ( unsigned long ) lcd_contrast ) ;
SERIAL_EOL ;
# endif
# ifdef FWRETRACT
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Retract: S=Length (mm) F:Speed (mm/m) Z: ZLift (mm) " ) ;
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M207 S " , retract_length ) ;
# if EXTRUDERS > 1
SERIAL_ECHOPAIR ( " W " , retract_length_swap ) ;
# endif
SERIAL_ECHOPAIR ( " F " , retract_feedrate * 60 ) ;
SERIAL_ECHOPAIR ( " Z " , retract_zlift ) ;
SERIAL_EOL ;
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Recover: S=Extra length (mm) F:Speed (mm/m) " ) ;
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M208 S " , retract_recover_length ) ;
# if EXTRUDERS > 1
SERIAL_ECHOPAIR ( " W " , retract_recover_length_swap ) ;
# endif
SERIAL_ECHOPAIR ( " F " , retract_recover_feedrate * 60 ) ;
SERIAL_EOL ;
SERIAL_ECHO_START ;
CONFIG _ECHO_START;
if ( ! forReplay ) {
SERIAL_ECHOLNPGM ( " Auto-Retract: S=0 to disable, 1 to interpret extrude-only moves as retracts or recoveries " ) ;
SERIAL _ECHO_START;
CONFIG _ECHO_START;
}
SERIAL_ECHOPAIR ( " M209 S " , ( unsigned long ) ( autoretract_enabled ? 1 : 0 ) ) ;
SERIAL_EOL ;
# if EXTRUDERS > 1
if ( ! forReplay ) {
SERIAL_ECHO_START ;
SERIAL_ECHOLNPGM ( " Multi-extruder settings: " ) ;
SERIAL_ECHO_START ;
SERIAL_ECHOPAIR ( " Swap retract length (mm): " , retract_length_swap ) ;
SERIAL_EOL ;
SERIAL_ECHO_START ;
SERIAL_ECHOPAIR ( " Swap rec. addl. length (mm): " , retract_recover_length_swap ) ;
SERIAL_EOL ;
}
# endif // EXTRUDERS > 1
# endif // FWRETRACT
SERIAL_ECHO_START ;
if ( volumetric_enabled ) {
if ( ! forReplay ) {
CONFIG_ECHO_START ;
SERIAL_ECHOLNPGM ( " Filament settings: " ) ;
SERIAL_ECHO_START ;
}
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M200 D " , filament_size [ 0 ] ) ;
SERIAL_EOL ;
# if EXTRUDERS > 1
SERIAL _ECHO_START;
CONFIG _ECHO_START;
SERIAL_ECHOPAIR ( " M200 T1 D " , filament_size [ 1 ] ) ;
SERIAL_EOL ;
# if EXTRUDERS > 2
SERIAL _ECHO_START;
CONFIG _ECHO_START;
SERIAL_ECHOPAIR ( " M200 T2 D " , filament_size [ 2 ] ) ;
SERIAL_EOL ;
# if EXTRUDERS > 3
SERIAL _ECHO_START;
CONFIG _ECHO_START;
SERIAL_ECHOPAIR ( " M200 T3 D " , filament_size [ 3 ] ) ;
SERIAL_EOL ;
# endif
@ -785,21 +865,23 @@ void Config_PrintSettings(bool forReplay) {
} else {
if ( ! forReplay ) {
CONFIG_ECHO_START ;
SERIAL_ECHOLNPGM ( " Filament settings: Disabled " ) ;
}
}
# ifdef ENABLE_AUTO_BED_LEVELING
SERIAL_ECHO_START ;
# ifdef CUSTOM_M_CODES
if ( ! forReplay ) {
CONFIG_ECHO_START ;
SERIAL_ECHOLNPGM ( " Z-Probe Offset (mm): " ) ;
SERIAL_ECHO_START ;
}
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " M " , ( unsigned long ) CUSTOM_M_CODE_SET_Z_PROBE_OFFSET ) ;
SERIAL_ECHOPAIR ( " Z " , - zprobe_zoffset ) ;
# else
if ( ! forReplay ) {
CONFIG_ECHO_START ;
SERIAL_ECHOPAIR ( " Z-Probe Offset (mm): " , - zprobe_zoffset ) ;
}
# endif