Merge pull request #1801 from thinkyhead/fixup_probing
Minor optimizations
This commit is contained in:
		@@ -529,8 +529,10 @@ const bool Z_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,49 +62,48 @@
 | 
				
			|||||||
  #define MYSERIAL MSerial
 | 
					  #define MYSERIAL MSerial
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERIAL_PROTOCOL(x) (MYSERIAL.print(x))
 | 
					#define SERIAL_CHAR(x) MYSERIAL.write(x)
 | 
				
			||||||
#define SERIAL_PROTOCOL_F(x,y) (MYSERIAL.print(x,y))
 | 
					#define SERIAL_EOL SERIAL_CHAR('\n')
 | 
				
			||||||
#define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x)))
 | 
					
 | 
				
			||||||
#define SERIAL_PROTOCOLLN(x) (MYSERIAL.print(x),MYSERIAL.write('\n'))
 | 
					#define SERIAL_PROTOCOLCHAR(x) SERIAL_CHAR(x)
 | 
				
			||||||
#define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x)),MYSERIAL.write('\n'))
 | 
					#define SERIAL_PROTOCOL(x) MYSERIAL.print(x)
 | 
				
			||||||
 | 
					#define SERIAL_PROTOCOL_F(x,y) MYSERIAL.print(x,y)
 | 
				
			||||||
 | 
					#define SERIAL_PROTOCOLPGM(x) serialprintPGM(PSTR(x))
 | 
				
			||||||
 | 
					#define SERIAL_PROTOCOLLN(x) do{ MYSERIAL.print(x),MYSERIAL.write('\n'); }while(0)
 | 
				
			||||||
 | 
					#define SERIAL_PROTOCOLLNPGM(x) do{ serialprintPGM(PSTR(x)),MYSERIAL.write('\n'); }while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const char errormagic[] PROGMEM;
 | 
					extern const char errormagic[] PROGMEM;
 | 
				
			||||||
extern const char echomagic[] PROGMEM;
 | 
					extern const char echomagic[] PROGMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERIAL_ERROR_START (serialprintPGM(errormagic))
 | 
					#define SERIAL_ERROR_START serialprintPGM(errormagic)
 | 
				
			||||||
#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x)
 | 
					#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x)
 | 
				
			||||||
#define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x)
 | 
					#define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x)
 | 
				
			||||||
#define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x)
 | 
					#define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x)
 | 
				
			||||||
#define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
 | 
					#define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERIAL_ECHO_START (serialprintPGM(echomagic))
 | 
					#define SERIAL_ECHO_START serialprintPGM(echomagic)
 | 
				
			||||||
#define SERIAL_ECHO(x) SERIAL_PROTOCOL(x)
 | 
					#define SERIAL_ECHO(x) SERIAL_PROTOCOL(x)
 | 
				
			||||||
#define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x)
 | 
					#define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x)
 | 
				
			||||||
#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
 | 
					#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
 | 
				
			||||||
#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
 | 
					#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value)))
 | 
					#define SERIAL_ECHOPAIR(name,value) do{ serial_echopair_P(PSTR(name),(value)); }while(0)
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SERIAL_EOL MYSERIAL.write('\n')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void serial_echopair_P(const char *s_P, float v);
 | 
					void serial_echopair_P(const char *s_P, float v);
 | 
				
			||||||
void serial_echopair_P(const char *s_P, double v);
 | 
					void serial_echopair_P(const char *s_P, double v);
 | 
				
			||||||
void serial_echopair_P(const char *s_P, unsigned long v);
 | 
					void serial_echopair_P(const char *s_P, unsigned long v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Things to write to serial from Program memory. Saves 400 to 2k of RAM.
 | 
					// Things to write to serial from Program memory. Saves 400 to 2k of RAM.
 | 
				
			||||||
FORCE_INLINE void serialprintPGM(const char *str)
 | 
					FORCE_INLINE void serialprintPGM(const char *str) {
 | 
				
			||||||
{
 | 
					  char ch;
 | 
				
			||||||
  char ch=pgm_read_byte(str);
 | 
					  while ((ch = pgm_read_byte(str))) {
 | 
				
			||||||
  while(ch)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    MYSERIAL.write(ch);
 | 
					    MYSERIAL.write(ch);
 | 
				
			||||||
    ch=pgm_read_byte(++str);
 | 
					    str++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
void get_command();
 | 
					void get_command();
 | 
				
			||||||
void process_commands();
 | 
					void process_commands();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148,7 +147,7 @@ void manage_inactivity(bool ignore_stepper_queue=false);
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if HAS_E0_ENABLE
 | 
					#if HAS_E0_ENABLE
 | 
				
			||||||
  #define enable_e0() E0_ENABLE_WRITE(E_ENABLE_ON)
 | 
					  #define enable_e0()  E0_ENABLE_WRITE( E_ENABLE_ON)
 | 
				
			||||||
  #define disable_e0() E0_ENABLE_WRITE(!E_ENABLE_ON)
 | 
					  #define disable_e0() E0_ENABLE_WRITE(!E_ENABLE_ON)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define enable_e0()  /* nothing */
 | 
					  #define enable_e0()  /* nothing */
 | 
				
			||||||
@@ -156,7 +155,7 @@ void manage_inactivity(bool ignore_stepper_queue=false);
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (EXTRUDERS > 1) && HAS_E1_ENABLE
 | 
					#if (EXTRUDERS > 1) && HAS_E1_ENABLE
 | 
				
			||||||
  #define enable_e1() E1_ENABLE_WRITE(E_ENABLE_ON)
 | 
					  #define enable_e1()  E1_ENABLE_WRITE( E_ENABLE_ON)
 | 
				
			||||||
  #define disable_e1() E1_ENABLE_WRITE(!E_ENABLE_ON)
 | 
					  #define disable_e1() E1_ENABLE_WRITE(!E_ENABLE_ON)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define enable_e1()  /* nothing */
 | 
					  #define enable_e1()  /* nothing */
 | 
				
			||||||
@@ -164,7 +163,7 @@ void manage_inactivity(bool ignore_stepper_queue=false);
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (EXTRUDERS > 2) && HAS_E2_ENABLE
 | 
					#if (EXTRUDERS > 2) && HAS_E2_ENABLE
 | 
				
			||||||
  #define enable_e2() E2_ENABLE_WRITE(E_ENABLE_ON)
 | 
					  #define enable_e2()  E2_ENABLE_WRITE( E_ENABLE_ON)
 | 
				
			||||||
  #define disable_e2() E2_ENABLE_WRITE(!E_ENABLE_ON)
 | 
					  #define disable_e2() E2_ENABLE_WRITE(!E_ENABLE_ON)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define enable_e2()  /* nothing */
 | 
					  #define enable_e2()  /* nothing */
 | 
				
			||||||
@@ -172,19 +171,29 @@ void manage_inactivity(bool ignore_stepper_queue=false);
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (EXTRUDERS > 3) && HAS_E3_ENABLE
 | 
					#if (EXTRUDERS > 3) && HAS_E3_ENABLE
 | 
				
			||||||
  #define enable_e3() E3_ENABLE_WRITE(E_ENABLE_ON)
 | 
					  #define enable_e3()  E3_ENABLE_WRITE( E_ENABLE_ON)
 | 
				
			||||||
  #define disable_e3() E3_ENABLE_WRITE(!E_ENABLE_ON)
 | 
					  #define disable_e3() E3_ENABLE_WRITE(!E_ENABLE_ON)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define enable_e3()  /* nothing */
 | 
					  #define enable_e3()  /* nothing */
 | 
				
			||||||
  #define disable_e3() /* nothing */
 | 
					  #define disable_e3() /* nothing */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The axis order in all axis related arrays is X, Y, Z, E
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define NUM_AXIS 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Axis indices as enumerated constants
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A_AXIS and B_AXIS are used by COREXY printers
 | 
				
			||||||
 | 
					 * X_HEAD and Y_HEAD is used for systems that don't have a 1:1 relationship between X_AXIS and X Head movement, like CoreXY bots.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum AxisEnum {X_AXIS=0, Y_AXIS=1, A_AXIS=0, B_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void enable_all_steppers();
 | 
					void enable_all_steppers();
 | 
				
			||||||
void disable_all_steppers();
 | 
					void disable_all_steppers();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum AxisEnum {X_AXIS=0, Y_AXIS=1, A_AXIS=0, B_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5};
 | 
					 | 
				
			||||||
//X_HEAD and Y_HEAD is used for systems that don't have a 1:1 relationship between X_AXIS and X Head movement, like CoreXY bots.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void FlushSerialRequestResend();
 | 
					void FlushSerialRequestResend();
 | 
				
			||||||
void ClearToSend();
 | 
					void ClearToSend();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -227,7 +236,7 @@ void refresh_cmd_timeout(void);
 | 
				
			|||||||
#ifndef CRITICAL_SECTION_START
 | 
					#ifndef CRITICAL_SECTION_START
 | 
				
			||||||
  #define CRITICAL_SECTION_START  unsigned char _sreg = SREG; cli();
 | 
					  #define CRITICAL_SECTION_START  unsigned char _sreg = SREG; cli();
 | 
				
			||||||
  #define CRITICAL_SECTION_END    SREG = _sreg;
 | 
					  #define CRITICAL_SECTION_END    SREG = _sreg;
 | 
				
			||||||
#endif //CRITICAL_SECTION_START
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern float homing_feedrate[];
 | 
					extern float homing_feedrate[];
 | 
				
			||||||
extern bool axis_relative_modes[];
 | 
					extern bool axis_relative_modes[];
 | 
				
			||||||
@@ -236,8 +245,9 @@ extern bool volumetric_enabled;
 | 
				
			|||||||
extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually
 | 
					extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually
 | 
				
			||||||
extern float filament_size[EXTRUDERS]; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
 | 
					extern float filament_size[EXTRUDERS]; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
 | 
				
			||||||
extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
 | 
					extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner
 | 
				
			||||||
extern float current_position[NUM_AXIS] ;
 | 
					extern float current_position[NUM_AXIS];
 | 
				
			||||||
extern float home_offset[3];
 | 
					extern float home_offset[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DELTA
 | 
					#ifdef DELTA
 | 
				
			||||||
  extern float endstop_adj[3];
 | 
					  extern float endstop_adj[3];
 | 
				
			||||||
  extern float delta_radius;
 | 
					  extern float delta_radius;
 | 
				
			||||||
@@ -245,18 +255,23 @@ extern float home_offset[3];
 | 
				
			|||||||
  extern float delta_segments_per_second;
 | 
					  extern float delta_segments_per_second;
 | 
				
			||||||
  void recalc_delta_settings(float radius, float diagonal_rod);
 | 
					  void recalc_delta_settings(float radius, float diagonal_rod);
 | 
				
			||||||
#elif defined(Z_DUAL_ENDSTOPS)
 | 
					#elif defined(Z_DUAL_ENDSTOPS)
 | 
				
			||||||
extern float z_endstop_adj;
 | 
					  extern float z_endstop_adj;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef SCARA
 | 
					#ifdef SCARA
 | 
				
			||||||
  extern float axis_scaling[3];  // Build size scaling
 | 
					  extern float axis_scaling[3];  // Build size scaling
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern float min_pos[3];
 | 
					extern float min_pos[3];
 | 
				
			||||||
extern float max_pos[3];
 | 
					extern float max_pos[3];
 | 
				
			||||||
extern bool axis_known_position[3];
 | 
					extern bool axis_known_position[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ENABLE_AUTO_BED_LEVELING
 | 
					#ifdef ENABLE_AUTO_BED_LEVELING
 | 
				
			||||||
  extern float zprobe_zoffset;
 | 
					  extern float zprobe_zoffset;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int fanSpeed;
 | 
					extern int fanSpeed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BARICUDA
 | 
					#ifdef BARICUDA
 | 
				
			||||||
  extern int ValvePressure;
 | 
					  extern int ValvePressure;
 | 
				
			||||||
  extern int EtoPPressure;
 | 
					  extern int EtoPPressure;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -268,8 +268,7 @@ void MarlinSerial::printFloat(double number, uint8_t digits) {
 | 
				
			|||||||
  print(int_part);
 | 
					  print(int_part);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Print the decimal point, but only if there are digits beyond
 | 
					  // Print the decimal point, but only if there are digits beyond
 | 
				
			||||||
  if (digits > 0)
 | 
					  if (digits > 0) print('.');
 | 
				
			||||||
    print("."); 
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Extract digits from the remainder one at a time
 | 
					  // Extract digits from the remainder one at a time
 | 
				
			||||||
  while (digits-- > 0) {
 | 
					  while (digits-- > 0) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -243,7 +243,7 @@ static unsigned long max_inactive_time = 0;
 | 
				
			|||||||
static unsigned long stepper_inactive_time = DEFAULT_STEPPER_DEACTIVE_TIME*1000l;
 | 
					static unsigned long stepper_inactive_time = DEFAULT_STEPPER_DEACTIVE_TIME*1000l;
 | 
				
			||||||
unsigned long starttime = 0; ///< Print job start time
 | 
					unsigned long starttime = 0; ///< Print job start time
 | 
				
			||||||
unsigned long stoptime = 0;  ///< Print job stop time
 | 
					unsigned long stoptime = 0;  ///< Print job stop time
 | 
				
			||||||
static uint8_t tmp_extruder;
 | 
					static uint8_t target_extruder;
 | 
				
			||||||
bool Stopped = false;
 | 
					bool Stopped = false;
 | 
				
			||||||
bool CooldownNoWait = true;
 | 
					bool CooldownNoWait = true;
 | 
				
			||||||
bool target_direction;
 | 
					bool target_direction;
 | 
				
			||||||
@@ -857,7 +857,9 @@ float code_value() {
 | 
				
			|||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
long code_value_long() { return (strtol(strchr_pointer + 1, NULL, 10)); }
 | 
					long code_value_long() { return strtol(strchr_pointer + 1, NULL, 10); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int16_t code_value_short() { return (int16_t)strtol(strchr_pointer + 1, NULL, 10); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool code_seen(char code) {
 | 
					bool code_seen(char code) {
 | 
				
			||||||
  strchr_pointer = strchr(cmdbuffer[bufindr], code);
 | 
					  strchr_pointer = strchr(cmdbuffer[bufindr], code);
 | 
				
			||||||
@@ -1410,9 +1412,9 @@ inline void sync_plan_position() {
 | 
				
			|||||||
      for (int y = 0; y < AUTO_BED_LEVELING_GRID_POINTS; y++) {
 | 
					      for (int y = 0; y < AUTO_BED_LEVELING_GRID_POINTS; y++) {
 | 
				
			||||||
        for (int x = 0; x < AUTO_BED_LEVELING_GRID_POINTS; x++) {
 | 
					        for (int x = 0; x < AUTO_BED_LEVELING_GRID_POINTS; x++) {
 | 
				
			||||||
          SERIAL_PROTOCOL_F(bed_level[x][y], 2);
 | 
					          SERIAL_PROTOCOL_F(bed_level[x][y], 2);
 | 
				
			||||||
          SERIAL_PROTOCOLPGM(" ");
 | 
					          SERIAL_PROTOCOLCHAR(' ');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        SERIAL_ECHOLN("");
 | 
					        SERIAL_EOL;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1685,7 +1687,7 @@ inline void gcode_G2_G3(bool clockwise) {
 | 
				
			|||||||
 * G4: Dwell S<seconds> or P<milliseconds>
 | 
					 * G4: Dwell S<seconds> or P<milliseconds>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
inline void gcode_G4() {
 | 
					inline void gcode_G4() {
 | 
				
			||||||
  unsigned long codenum=0;
 | 
					  unsigned long codenum = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LCD_MESSAGEPGM(MSG_DWELL);
 | 
					  LCD_MESSAGEPGM(MSG_DWELL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1711,7 +1713,7 @@ inline void gcode_G4() {
 | 
				
			|||||||
  inline void gcode_G10_G11(bool doRetract=false) {
 | 
					  inline void gcode_G10_G11(bool doRetract=false) {
 | 
				
			||||||
    #if EXTRUDERS > 1
 | 
					    #if EXTRUDERS > 1
 | 
				
			||||||
      if (doRetract) {
 | 
					      if (doRetract) {
 | 
				
			||||||
        retracted_swap[active_extruder] = (code_seen('S') && code_value_long() == 1); // checks for swap retract argument
 | 
					        retracted_swap[active_extruder] = (code_seen('S') && code_value_short() == 1); // checks for swap retract argument
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
    retract(doRetract
 | 
					    retract(doRetract
 | 
				
			||||||
@@ -2029,7 +2031,7 @@ inline void gcode_G28() {
 | 
				
			|||||||
  inline void gcode_G29() {
 | 
					  inline void gcode_G29() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static int probe_point = -1;
 | 
					    static int probe_point = -1;
 | 
				
			||||||
    MeshLevelingState state = code_seen('S') || code_seen('s') ? (MeshLevelingState)code_value_long() : MeshReport;
 | 
					    MeshLevelingState state = code_seen('S') || code_seen('s') ? (MeshLevelingState)code_value_short() : MeshReport;
 | 
				
			||||||
    if (state < 0 || state > 2) {
 | 
					    if (state < 0 || state > 2) {
 | 
				
			||||||
      SERIAL_PROTOCOLLNPGM("S out of range (0-2).");
 | 
					      SERIAL_PROTOCOLLNPGM("S out of range (0-2).");
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
@@ -2040,7 +2042,7 @@ inline void gcode_G28() {
 | 
				
			|||||||
        if (mbl.active) {
 | 
					        if (mbl.active) {
 | 
				
			||||||
          SERIAL_PROTOCOLPGM("Num X,Y: ");
 | 
					          SERIAL_PROTOCOLPGM("Num X,Y: ");
 | 
				
			||||||
          SERIAL_PROTOCOL(MESH_NUM_X_POINTS);
 | 
					          SERIAL_PROTOCOL(MESH_NUM_X_POINTS);
 | 
				
			||||||
          SERIAL_PROTOCOLPGM(",");
 | 
					          SERIAL_PROTOCOLCHAR(',');
 | 
				
			||||||
          SERIAL_PROTOCOL(MESH_NUM_Y_POINTS);
 | 
					          SERIAL_PROTOCOL(MESH_NUM_Y_POINTS);
 | 
				
			||||||
          SERIAL_PROTOCOLPGM("\nZ search height: ");
 | 
					          SERIAL_PROTOCOLPGM("\nZ search height: ");
 | 
				
			||||||
          SERIAL_PROTOCOL(MESH_HOME_SEARCH_Z);
 | 
					          SERIAL_PROTOCOL(MESH_HOME_SEARCH_Z);
 | 
				
			||||||
@@ -2156,7 +2158,7 @@ inline void gcode_G28() {
 | 
				
			|||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int verbose_level = code_seen('V') || code_seen('v') ? code_value_long() : 1;
 | 
					    int verbose_level = code_seen('V') || code_seen('v') ? code_value_short() : 1;
 | 
				
			||||||
    if (verbose_level < 0 || verbose_level > 4) {
 | 
					    if (verbose_level < 0 || verbose_level > 4) {
 | 
				
			||||||
      SERIAL_ECHOLNPGM("?(V)erbose Level is implausible (0-4).");
 | 
					      SERIAL_ECHOLNPGM("?(V)erbose Level is implausible (0-4).");
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
@@ -2178,19 +2180,19 @@ inline void gcode_G28() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      int auto_bed_leveling_grid_points = AUTO_BED_LEVELING_GRID_POINTS;
 | 
					      int auto_bed_leveling_grid_points = AUTO_BED_LEVELING_GRID_POINTS;
 | 
				
			||||||
      #ifndef DELTA
 | 
					      #ifndef DELTA
 | 
				
			||||||
        if (code_seen('P')) auto_bed_leveling_grid_points = code_value_long();
 | 
					        if (code_seen('P')) auto_bed_leveling_grid_points = code_value_short();
 | 
				
			||||||
        if (auto_bed_leveling_grid_points < 2) {
 | 
					        if (auto_bed_leveling_grid_points < 2) {
 | 
				
			||||||
          SERIAL_PROTOCOLPGM("?Number of probed (P)oints is implausible (2 minimum).\n");
 | 
					          SERIAL_PROTOCOLPGM("?Number of probed (P)oints is implausible (2 minimum).\n");
 | 
				
			||||||
          return;
 | 
					          return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      #endif
 | 
					      #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      xy_travel_speed = code_seen('S') ? code_value_long() : XY_TRAVEL_SPEED;
 | 
					      xy_travel_speed = code_seen('S') ? code_value_short() : XY_TRAVEL_SPEED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      int left_probe_bed_position = code_seen('L') ? code_value_long() : LEFT_PROBE_BED_POSITION,
 | 
					      int left_probe_bed_position = code_seen('L') ? code_value_short() : LEFT_PROBE_BED_POSITION,
 | 
				
			||||||
          right_probe_bed_position = code_seen('R') ? code_value_long() : RIGHT_PROBE_BED_POSITION,
 | 
					          right_probe_bed_position = code_seen('R') ? code_value_short() : RIGHT_PROBE_BED_POSITION,
 | 
				
			||||||
          front_probe_bed_position = code_seen('F') ? code_value_long() : FRONT_PROBE_BED_POSITION,
 | 
					          front_probe_bed_position = code_seen('F') ? code_value_short() : FRONT_PROBE_BED_POSITION,
 | 
				
			||||||
          back_probe_bed_position = code_seen('B') ? code_value_long() : BACK_PROBE_BED_POSITION;
 | 
					          back_probe_bed_position = code_seen('B') ? code_value_short() : BACK_PROBE_BED_POSITION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      bool left_out_l = left_probe_bed_position < MIN_PROBE_X,
 | 
					      bool left_out_l = left_probe_bed_position < MIN_PROBE_X,
 | 
				
			||||||
           left_out = left_out_l || left_probe_bed_position > right_probe_bed_position - MIN_PROBE_EDGE,
 | 
					           left_out = left_out_l || left_probe_bed_position > right_probe_bed_position - MIN_PROBE_EDGE,
 | 
				
			||||||
@@ -2394,7 +2396,7 @@ inline void gcode_G28() {
 | 
				
			|||||||
              if (diff >= 0.0)
 | 
					              if (diff >= 0.0)
 | 
				
			||||||
                SERIAL_PROTOCOLPGM(" +");   // Include + for column alignment
 | 
					                SERIAL_PROTOCOLPGM(" +");   // Include + for column alignment
 | 
				
			||||||
              else
 | 
					              else
 | 
				
			||||||
                SERIAL_PROTOCOLPGM(" ");
 | 
					                SERIAL_PROTOCOLCHAR(' ');
 | 
				
			||||||
              SERIAL_PROTOCOL_F(diff, 5);
 | 
					              SERIAL_PROTOCOL_F(diff, 5);
 | 
				
			||||||
            } // xx
 | 
					            } // xx
 | 
				
			||||||
            SERIAL_EOL;
 | 
					            SERIAL_EOL;
 | 
				
			||||||
@@ -2518,11 +2520,11 @@ inline void gcode_G92() {
 | 
				
			|||||||
    unsigned long codenum = 0;
 | 
					    unsigned long codenum = 0;
 | 
				
			||||||
    bool hasP = false, hasS = false;
 | 
					    bool hasP = false, hasS = false;
 | 
				
			||||||
    if (code_seen('P')) {
 | 
					    if (code_seen('P')) {
 | 
				
			||||||
      codenum = code_value(); // milliseconds to wait
 | 
					      codenum = code_value_short(); // milliseconds to wait
 | 
				
			||||||
      hasP = codenum > 0;
 | 
					      hasP = codenum > 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (code_seen('S')) {
 | 
					    if (code_seen('S')) {
 | 
				
			||||||
      codenum = code_value() * 1000; // seconds to wait
 | 
					      codenum = code_value_short() * 1000UL; // seconds to wait
 | 
				
			||||||
      hasS = codenum > 0;
 | 
					      hasS = codenum > 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    char* starpos = strchr(src, '*');
 | 
					    char* starpos = strchr(src, '*');
 | 
				
			||||||
@@ -2628,7 +2630,7 @@ inline void gcode_M17() {
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  inline void gcode_M26() {
 | 
					  inline void gcode_M26() {
 | 
				
			||||||
    if (card.cardOK && code_seen('S'))
 | 
					    if (card.cardOK && code_seen('S'))
 | 
				
			||||||
      card.setIndex(code_value_long());
 | 
					      card.setIndex(code_value_short());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
@@ -2719,7 +2721,7 @@ inline void gcode_M31() {
 | 
				
			|||||||
      card.openFile(namestartpos, true, !call_procedure);
 | 
					      card.openFile(namestartpos, true, !call_procedure);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (code_seen('S') && strchr_pointer < namestartpos) // "S" (must occur _before_ the filename!)
 | 
					      if (code_seen('S') && strchr_pointer < namestartpos) // "S" (must occur _before_ the filename!)
 | 
				
			||||||
        card.setIndex(code_value_long());
 | 
					        card.setIndex(code_value_short());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      card.startFileprint();
 | 
					      card.startFileprint();
 | 
				
			||||||
      if (!call_procedure)
 | 
					      if (!call_procedure)
 | 
				
			||||||
@@ -2747,11 +2749,11 @@ inline void gcode_M31() {
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
inline void gcode_M42() {
 | 
					inline void gcode_M42() {
 | 
				
			||||||
  if (code_seen('S')) {
 | 
					  if (code_seen('S')) {
 | 
				
			||||||
    int pin_status = code_value(),
 | 
					    int pin_status = code_value_short(),
 | 
				
			||||||
        pin_number = LED_PIN;
 | 
					        pin_number = LED_PIN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (code_seen('P') && pin_status >= 0 && pin_status <= 255)
 | 
					    if (code_seen('P') && pin_status >= 0 && pin_status <= 255)
 | 
				
			||||||
      pin_number = code_value();
 | 
					      pin_number = code_value_short();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins) / sizeof(*sensitive_pins)); i++) {
 | 
					    for (int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins) / sizeof(*sensitive_pins)); i++) {
 | 
				
			||||||
      if (sensitive_pins[i] == pin_number) {
 | 
					      if (sensitive_pins[i] == pin_number) {
 | 
				
			||||||
@@ -2810,7 +2812,7 @@ inline void gcode_M42() {
 | 
				
			|||||||
    int verbose_level = 1, n_samples = 10, n_legs = 0;
 | 
					    int verbose_level = 1, n_samples = 10, n_legs = 0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (code_seen('V') || code_seen('v')) {
 | 
					    if (code_seen('V') || code_seen('v')) {
 | 
				
			||||||
      verbose_level = code_value();
 | 
					      verbose_level = code_value_short();
 | 
				
			||||||
      if (verbose_level < 0 || verbose_level > 4 ) {
 | 
					      if (verbose_level < 0 || verbose_level > 4 ) {
 | 
				
			||||||
        SERIAL_PROTOCOLPGM("?Verbose Level not plausible (0-4).\n");
 | 
					        SERIAL_PROTOCOLPGM("?Verbose Level not plausible (0-4).\n");
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -2821,7 +2823,7 @@ inline void gcode_M42() {
 | 
				
			|||||||
      SERIAL_PROTOCOLPGM("M48 Z-Probe Repeatability test\n");
 | 
					      SERIAL_PROTOCOLPGM("M48 Z-Probe Repeatability test\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (code_seen('P') || code_seen('p') || code_seen('n')) { // `n` for legacy support only - please use `P`!
 | 
					    if (code_seen('P') || code_seen('p') || code_seen('n')) { // `n` for legacy support only - please use `P`!
 | 
				
			||||||
      n_samples = code_value();
 | 
					      n_samples = code_value_short();
 | 
				
			||||||
      if (n_samples < 4 || n_samples > 50) {
 | 
					      if (n_samples < 4 || n_samples > 50) {
 | 
				
			||||||
        SERIAL_PROTOCOLPGM("?Sample size not plausible (4-50).\n");
 | 
					        SERIAL_PROTOCOLPGM("?Sample size not plausible (4-50).\n");
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -2854,7 +2856,7 @@ inline void gcode_M42() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (code_seen('L') || code_seen('l')) {
 | 
					    if (code_seen('L') || code_seen('l')) {
 | 
				
			||||||
      n_legs = code_value();
 | 
					      n_legs = code_value_short();
 | 
				
			||||||
      if (n_legs == 1) n_legs = 2;
 | 
					      if (n_legs == 1) n_legs = 2;
 | 
				
			||||||
      if (n_legs < 0 || n_legs > 15) {
 | 
					      if (n_legs < 0 || n_legs > 15) {
 | 
				
			||||||
        SERIAL_PROTOCOLPGM("?Number of legs in movement not plausible (0-15).\n");
 | 
					        SERIAL_PROTOCOLPGM("?Number of legs in movement not plausible (0-15).\n");
 | 
				
			||||||
@@ -3036,12 +3038,15 @@ inline void gcode_M42() {
 | 
				
			|||||||
inline void gcode_M104() {
 | 
					inline void gcode_M104() {
 | 
				
			||||||
  if (setTargetedHotend(104)) return;
 | 
					  if (setTargetedHotend(104)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (code_seen('S')) setTargetHotend(code_value(), tmp_extruder);
 | 
					  if (code_seen('S')) {
 | 
				
			||||||
  #ifdef DUAL_X_CARRIAGE
 | 
					    float temp = code_value();
 | 
				
			||||||
    if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0)
 | 
					    setTargetHotend(temp, target_extruder);
 | 
				
			||||||
      setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset);
 | 
					    #ifdef DUAL_X_CARRIAGE
 | 
				
			||||||
  #endif
 | 
					      if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0)
 | 
				
			||||||
  setWatch();
 | 
					        setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset);
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
 | 
					    setWatch();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -3054,9 +3059,9 @@ inline void gcode_M105() {
 | 
				
			|||||||
    SERIAL_PROTOCOLPGM("ok");
 | 
					    SERIAL_PROTOCOLPGM("ok");
 | 
				
			||||||
    #if HAS_TEMP_0
 | 
					    #if HAS_TEMP_0
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(" T:");
 | 
					      SERIAL_PROTOCOLPGM(" T:");
 | 
				
			||||||
      SERIAL_PROTOCOL_F(degHotend(tmp_extruder), 1);
 | 
					      SERIAL_PROTOCOL_F(degHotend(target_extruder), 1);
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(" /");
 | 
					      SERIAL_PROTOCOLPGM(" /");
 | 
				
			||||||
      SERIAL_PROTOCOL_F(degTargetHotend(tmp_extruder), 1);
 | 
					      SERIAL_PROTOCOL_F(degTargetHotend(target_extruder), 1);
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
    #if HAS_TEMP_BED
 | 
					    #if HAS_TEMP_BED
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(" B:");
 | 
					      SERIAL_PROTOCOLPGM(" B:");
 | 
				
			||||||
@@ -3067,7 +3072,7 @@ inline void gcode_M105() {
 | 
				
			|||||||
    for (int8_t e = 0; e < EXTRUDERS; ++e) {
 | 
					    for (int8_t e = 0; e < EXTRUDERS; ++e) {
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(" T");
 | 
					      SERIAL_PROTOCOLPGM(" T");
 | 
				
			||||||
      SERIAL_PROTOCOL(e);
 | 
					      SERIAL_PROTOCOL(e);
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(":");
 | 
					      SERIAL_PROTOCOLCHAR(':');
 | 
				
			||||||
      SERIAL_PROTOCOL_F(degHotend(e), 1);
 | 
					      SERIAL_PROTOCOL_F(degHotend(e), 1);
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(" /");
 | 
					      SERIAL_PROTOCOLPGM(" /");
 | 
				
			||||||
      SERIAL_PROTOCOL_F(degTargetHotend(e), 1);
 | 
					      SERIAL_PROTOCOL_F(degTargetHotend(e), 1);
 | 
				
			||||||
@@ -3079,16 +3084,16 @@ inline void gcode_M105() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  SERIAL_PROTOCOLPGM(" @:");
 | 
					  SERIAL_PROTOCOLPGM(" @:");
 | 
				
			||||||
  #ifdef EXTRUDER_WATTS
 | 
					  #ifdef EXTRUDER_WATTS
 | 
				
			||||||
    SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127);
 | 
					    SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(target_extruder))/127);
 | 
				
			||||||
    SERIAL_PROTOCOLPGM("W");
 | 
					    SERIAL_PROTOCOLCHAR('W');
 | 
				
			||||||
  #else
 | 
					  #else
 | 
				
			||||||
    SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));
 | 
					    SERIAL_PROTOCOL(getHeaterPower(target_extruder));
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SERIAL_PROTOCOLPGM(" B@:");
 | 
					  SERIAL_PROTOCOLPGM(" B@:");
 | 
				
			||||||
  #ifdef BED_WATTS
 | 
					  #ifdef BED_WATTS
 | 
				
			||||||
    SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127);
 | 
					    SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127);
 | 
				
			||||||
    SERIAL_PROTOCOLPGM("W");
 | 
					    SERIAL_PROTOCOLCHAR('W');
 | 
				
			||||||
  #else
 | 
					  #else
 | 
				
			||||||
    SERIAL_PROTOCOL(getHeaterPower(-1));
 | 
					    SERIAL_PROTOCOL(getHeaterPower(-1));
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
@@ -3103,7 +3108,7 @@ inline void gcode_M105() {
 | 
				
			|||||||
    for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
 | 
					    for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
 | 
				
			||||||
      SERIAL_PROTOCOLPGM("  T");
 | 
					      SERIAL_PROTOCOLPGM("  T");
 | 
				
			||||||
      SERIAL_PROTOCOL(cur_extruder);
 | 
					      SERIAL_PROTOCOL(cur_extruder);
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(":");
 | 
					      SERIAL_PROTOCOLCHAR(':');
 | 
				
			||||||
      SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
 | 
					      SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
 | 
				
			||||||
      SERIAL_PROTOCOLPGM("C->");
 | 
					      SERIAL_PROTOCOLPGM("C->");
 | 
				
			||||||
      SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder)/OVERSAMPLENR,0);
 | 
					      SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder)/OVERSAMPLENR,0);
 | 
				
			||||||
@@ -3118,7 +3123,7 @@ inline void gcode_M105() {
 | 
				
			|||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * M106: Set Fan Speed
 | 
					   * M106: Set Fan Speed
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  inline void gcode_M106() { fanSpeed = code_seen('S') ? constrain(code_value(), 0, 255) : 255; }
 | 
					  inline void gcode_M106() { fanSpeed = code_seen('S') ? constrain(code_value_short(), 0, 255) : 255; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * M107: Fan Off
 | 
					   * M107: Fan Off
 | 
				
			||||||
@@ -3137,10 +3142,11 @@ inline void gcode_M109() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  CooldownNoWait = code_seen('S');
 | 
					  CooldownNoWait = code_seen('S');
 | 
				
			||||||
  if (CooldownNoWait || code_seen('R')) {
 | 
					  if (CooldownNoWait || code_seen('R')) {
 | 
				
			||||||
    setTargetHotend(code_value(), tmp_extruder);
 | 
					    float temp = code_value();
 | 
				
			||||||
 | 
					    setTargetHotend(temp, target_extruder);
 | 
				
			||||||
    #ifdef DUAL_X_CARRIAGE
 | 
					    #ifdef DUAL_X_CARRIAGE
 | 
				
			||||||
      if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0)
 | 
					      if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0)
 | 
				
			||||||
        setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset);
 | 
					        setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset);
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3156,7 +3162,7 @@ inline void gcode_M109() {
 | 
				
			|||||||
  unsigned long timetemp = millis();
 | 
					  unsigned long timetemp = millis();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* See if we are heating up or cooling down */
 | 
					  /* See if we are heating up or cooling down */
 | 
				
			||||||
  target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling
 | 
					  target_direction = isHeatingHotend(target_extruder); // true if heating, false if cooling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cancel_heatup = false;
 | 
					  cancel_heatup = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3167,15 +3173,15 @@ inline void gcode_M109() {
 | 
				
			|||||||
    while((!cancel_heatup)&&((residencyStart == -1) ||
 | 
					    while((!cancel_heatup)&&((residencyStart == -1) ||
 | 
				
			||||||
          (residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL)))) )
 | 
					          (residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL)))) )
 | 
				
			||||||
  #else
 | 
					  #else
 | 
				
			||||||
    while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) )
 | 
					    while ( target_direction ? (isHeatingHotend(target_extruder)) : (isCoolingHotend(target_extruder)&&(CooldownNoWait==false)) )
 | 
				
			||||||
  #endif //TEMP_RESIDENCY_TIME
 | 
					  #endif //TEMP_RESIDENCY_TIME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    { // while loop
 | 
					    { // while loop
 | 
				
			||||||
      if (millis() > timetemp + 1000UL) { //Print temp & remaining time every 1s while waiting
 | 
					      if (millis() > timetemp + 1000UL) { //Print temp & remaining time every 1s while waiting
 | 
				
			||||||
        SERIAL_PROTOCOLPGM("T:");
 | 
					        SERIAL_PROTOCOLPGM("T:");
 | 
				
			||||||
        SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
 | 
					        SERIAL_PROTOCOL_F(degHotend(target_extruder),1);
 | 
				
			||||||
        SERIAL_PROTOCOLPGM(" E:");
 | 
					        SERIAL_PROTOCOLPGM(" E:");
 | 
				
			||||||
        SERIAL_PROTOCOL((int)tmp_extruder);
 | 
					        SERIAL_PROTOCOL((int)target_extruder);
 | 
				
			||||||
        #ifdef TEMP_RESIDENCY_TIME
 | 
					        #ifdef TEMP_RESIDENCY_TIME
 | 
				
			||||||
          SERIAL_PROTOCOLPGM(" W:");
 | 
					          SERIAL_PROTOCOLPGM(" W:");
 | 
				
			||||||
          if (residencyStart > -1) {
 | 
					          if (residencyStart > -1) {
 | 
				
			||||||
@@ -3196,9 +3202,9 @@ inline void gcode_M109() {
 | 
				
			|||||||
      #ifdef TEMP_RESIDENCY_TIME
 | 
					      #ifdef TEMP_RESIDENCY_TIME
 | 
				
			||||||
        // start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
 | 
					        // start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
 | 
				
			||||||
        // or when current temp falls outside the hysteresis after target temp was reached
 | 
					        // or when current temp falls outside the hysteresis after target temp was reached
 | 
				
			||||||
        if ((residencyStart == -1 &&  target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder)-TEMP_WINDOW))) ||
 | 
					        if ((residencyStart == -1 &&  target_direction && (degHotend(target_extruder) >= (degTargetHotend(target_extruder)-TEMP_WINDOW))) ||
 | 
				
			||||||
            (residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder)+TEMP_WINDOW))) ||
 | 
					            (residencyStart == -1 && !target_direction && (degHotend(target_extruder) <= (degTargetHotend(target_extruder)+TEMP_WINDOW))) ||
 | 
				
			||||||
            (residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS) )
 | 
					            (residencyStart > -1 && labs(degHotend(target_extruder) - degTargetHotend(target_extruder)) > TEMP_HYSTERESIS) )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          residencyStart = millis();
 | 
					          residencyStart = millis();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -3535,9 +3541,9 @@ inline void gcode_M121() { enable_endstops(true); }
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  inline void gcode_M150() {
 | 
					  inline void gcode_M150() {
 | 
				
			||||||
    SendColors(
 | 
					    SendColors(
 | 
				
			||||||
      code_seen('R') ? (byte)code_value() : 0,
 | 
					      code_seen('R') ? (byte)code_value_short() : 0,
 | 
				
			||||||
      code_seen('U') ? (byte)code_value() : 0,
 | 
					      code_seen('U') ? (byte)code_value_short() : 0,
 | 
				
			||||||
      code_seen('B') ? (byte)code_value() : 0
 | 
					      code_seen('B') ? (byte)code_value_short() : 0
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3549,9 +3555,9 @@ inline void gcode_M121() { enable_endstops(true); }
 | 
				
			|||||||
 *       D<millimeters>
 | 
					 *       D<millimeters>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
inline void gcode_M200() {
 | 
					inline void gcode_M200() {
 | 
				
			||||||
  tmp_extruder = active_extruder;
 | 
					  int tmp_extruder = active_extruder;
 | 
				
			||||||
  if (code_seen('T')) {
 | 
					  if (code_seen('T')) {
 | 
				
			||||||
    tmp_extruder = code_value();
 | 
					    tmp_extruder = code_value_short();
 | 
				
			||||||
    if (tmp_extruder >= EXTRUDERS) {
 | 
					    if (tmp_extruder >= EXTRUDERS) {
 | 
				
			||||||
      SERIAL_ECHO_START;
 | 
					      SERIAL_ECHO_START;
 | 
				
			||||||
      SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER);
 | 
					      SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER);
 | 
				
			||||||
@@ -3622,27 +3628,23 @@ inline void gcode_M203() {
 | 
				
			|||||||
 *  Also sets minimum segment time in ms (B20000) to prevent buffer under-runs and M20 minimum feedrate
 | 
					 *  Also sets minimum segment time in ms (B20000) to prevent buffer under-runs and M20 minimum feedrate
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
inline void gcode_M204() {
 | 
					inline void gcode_M204() {
 | 
				
			||||||
  if (code_seen('S'))   // Kept for legacy compatibility. Should NOT BE USED for new developments.
 | 
					  if (code_seen('S')) {  // Kept for legacy compatibility. Should NOT BE USED for new developments.
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    acceleration = code_value();
 | 
					    acceleration = code_value();
 | 
				
			||||||
    travel_acceleration = acceleration;
 | 
					    travel_acceleration = acceleration;
 | 
				
			||||||
    SERIAL_ECHOPAIR("Setting Printing and Travelling Acceleration: ", acceleration );
 | 
					    SERIAL_ECHOPAIR("Setting Print and Travel Acceleration: ", acceleration );
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (code_seen('P'))
 | 
					  if (code_seen('P')) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    acceleration = code_value();
 | 
					    acceleration = code_value();
 | 
				
			||||||
    SERIAL_ECHOPAIR("Setting Printing Acceleration: ", acceleration );
 | 
					    SERIAL_ECHOPAIR("Setting Print Acceleration: ", acceleration );
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (code_seen('R'))
 | 
					  if (code_seen('R')) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    retract_acceleration = code_value();
 | 
					    retract_acceleration = code_value();
 | 
				
			||||||
    SERIAL_ECHOPAIR("Setting Retract Acceleration: ", retract_acceleration );
 | 
					    SERIAL_ECHOPAIR("Setting Retract Acceleration: ", retract_acceleration );
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (code_seen('T'))
 | 
					  if (code_seen('T')) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    travel_acceleration = code_value();
 | 
					    travel_acceleration = code_value();
 | 
				
			||||||
    SERIAL_ECHOPAIR("Setting Travel Acceleration: ", travel_acceleration );
 | 
					    SERIAL_ECHOPAIR("Setting Travel Acceleration: ", travel_acceleration );
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
@@ -3745,7 +3747,7 @@ inline void gcode_M206() {
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  inline void gcode_M209() {
 | 
					  inline void gcode_M209() {
 | 
				
			||||||
    if (code_seen('S')) {
 | 
					    if (code_seen('S')) {
 | 
				
			||||||
      int t = code_value();
 | 
					      int t = code_value_short();
 | 
				
			||||||
      switch(t) {
 | 
					      switch(t) {
 | 
				
			||||||
        case 0:
 | 
					        case 0:
 | 
				
			||||||
          autoretract_enabled = false;
 | 
					          autoretract_enabled = false;
 | 
				
			||||||
@@ -3774,23 +3776,23 @@ inline void gcode_M206() {
 | 
				
			|||||||
  inline void gcode_M218() {
 | 
					  inline void gcode_M218() {
 | 
				
			||||||
    if (setTargetedHotend(218)) return;
 | 
					    if (setTargetedHotend(218)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (code_seen('X')) extruder_offset[X_AXIS][tmp_extruder] = code_value();
 | 
					    if (code_seen('X')) extruder_offset[X_AXIS][target_extruder] = code_value();
 | 
				
			||||||
    if (code_seen('Y')) extruder_offset[Y_AXIS][tmp_extruder] = code_value();
 | 
					    if (code_seen('Y')) extruder_offset[Y_AXIS][target_extruder] = code_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #ifdef DUAL_X_CARRIAGE
 | 
					    #ifdef DUAL_X_CARRIAGE
 | 
				
			||||||
      if (code_seen('Z')) extruder_offset[Z_AXIS][tmp_extruder] = code_value();
 | 
					      if (code_seen('Z')) extruder_offset[Z_AXIS][target_extruder] = code_value();
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SERIAL_ECHO_START;
 | 
					    SERIAL_ECHO_START;
 | 
				
			||||||
    SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
 | 
					    SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
 | 
				
			||||||
    for (tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++) {
 | 
					    for (int e = 0; e < EXTRUDERS; e++) {
 | 
				
			||||||
      SERIAL_ECHO(" ");
 | 
					      SERIAL_CHAR(' ');
 | 
				
			||||||
      SERIAL_ECHO(extruder_offset[X_AXIS][tmp_extruder]);
 | 
					      SERIAL_ECHO(extruder_offset[X_AXIS][e]);
 | 
				
			||||||
      SERIAL_ECHO(",");
 | 
					      SERIAL_CHAR(',');
 | 
				
			||||||
      SERIAL_ECHO(extruder_offset[Y_AXIS][tmp_extruder]);
 | 
					      SERIAL_ECHO(extruder_offset[Y_AXIS][e]);
 | 
				
			||||||
      #ifdef DUAL_X_CARRIAGE
 | 
					      #ifdef DUAL_X_CARRIAGE
 | 
				
			||||||
        SERIAL_ECHO(",");
 | 
					        SERIAL_CHAR(',');
 | 
				
			||||||
        SERIAL_ECHO(extruder_offset[Z_AXIS][tmp_extruder]);
 | 
					        SERIAL_ECHO(extruder_offset[Z_AXIS][e]);
 | 
				
			||||||
      #endif
 | 
					      #endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
@@ -3813,7 +3815,7 @@ inline void gcode_M221() {
 | 
				
			|||||||
    int sval = code_value();
 | 
					    int sval = code_value();
 | 
				
			||||||
    if (code_seen('T')) {
 | 
					    if (code_seen('T')) {
 | 
				
			||||||
      if (setTargetedHotend(221)) return;
 | 
					      if (setTargetedHotend(221)) return;
 | 
				
			||||||
      extruder_multiply[tmp_extruder] = sval;
 | 
					      extruder_multiply[target_extruder] = sval;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
      extruder_multiply[active_extruder] = sval;
 | 
					      extruder_multiply[active_extruder] = sval;
 | 
				
			||||||
@@ -4044,7 +4046,7 @@ inline void gcode_M226() {
 | 
				
			|||||||
   * M250: Read and optionally set the LCD contrast
 | 
					   * M250: Read and optionally set the LCD contrast
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  inline void gcode_M250() {
 | 
					  inline void gcode_M250() {
 | 
				
			||||||
    if (code_seen('C')) lcd_setcontrast(code_value_long() & 0x3F);
 | 
					    if (code_seen('C')) lcd_setcontrast(code_value_short() & 0x3F);
 | 
				
			||||||
    SERIAL_PROTOCOLPGM("lcd contrast value: ");
 | 
					    SERIAL_PROTOCOLPGM("lcd contrast value: ");
 | 
				
			||||||
    SERIAL_PROTOCOL(lcd_contrast);
 | 
					    SERIAL_PROTOCOL(lcd_contrast);
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
@@ -4070,8 +4072,8 @@ inline void gcode_M226() {
 | 
				
			|||||||
 *       C<cycles>
 | 
					 *       C<cycles>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
inline void gcode_M303() {
 | 
					inline void gcode_M303() {
 | 
				
			||||||
  int e = code_seen('E') ? code_value_long() : 0;
 | 
					  int e = code_seen('E') ? code_value_short() : 0;
 | 
				
			||||||
  int c = code_seen('C') ? code_value_long() : 5;
 | 
					  int c = code_seen('C') ? code_value_short() : 5;
 | 
				
			||||||
  float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0);
 | 
					  float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0);
 | 
				
			||||||
  PID_autotune(temp, e, c);
 | 
					  PID_autotune(temp, e, c);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -4480,13 +4482,13 @@ inline void gcode_M503() {
 | 
				
			|||||||
        if (code_seen('R')) duplicate_extruder_temp_offset = code_value();
 | 
					        if (code_seen('R')) duplicate_extruder_temp_offset = code_value();
 | 
				
			||||||
        SERIAL_ECHO_START;
 | 
					        SERIAL_ECHO_START;
 | 
				
			||||||
        SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
 | 
					        SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
 | 
				
			||||||
        SERIAL_ECHO(" ");
 | 
					        SERIAL_CHAR(' ');
 | 
				
			||||||
        SERIAL_ECHO(extruder_offset[X_AXIS][0]);
 | 
					        SERIAL_ECHO(extruder_offset[X_AXIS][0]);
 | 
				
			||||||
        SERIAL_ECHO(",");
 | 
					        SERIAL_CHAR(',');
 | 
				
			||||||
        SERIAL_ECHO(extruder_offset[Y_AXIS][0]);
 | 
					        SERIAL_ECHO(extruder_offset[Y_AXIS][0]);
 | 
				
			||||||
        SERIAL_ECHO(" ");
 | 
					        SERIAL_CHAR(' ');
 | 
				
			||||||
        SERIAL_ECHO(duplicate_extruder_x_offset);
 | 
					        SERIAL_ECHO(duplicate_extruder_x_offset);
 | 
				
			||||||
        SERIAL_ECHO(",");
 | 
					        SERIAL_CHAR(',');
 | 
				
			||||||
        SERIAL_ECHOLN(extruder_offset[Y_AXIS][1]);
 | 
					        SERIAL_ECHOLN(extruder_offset[Y_AXIS][1]);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case DXC_FULL_CONTROL_MODE:
 | 
					      case DXC_FULL_CONTROL_MODE:
 | 
				
			||||||
@@ -4559,7 +4561,7 @@ inline void gcode_M907() {
 | 
				
			|||||||
   *       S# determines MS1 or MS2, X# sets the pin high/low.
 | 
					   *       S# determines MS1 or MS2, X# sets the pin high/low.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  inline void gcode_M351() {
 | 
					  inline void gcode_M351() {
 | 
				
			||||||
    if (code_seen('S')) switch(code_value_long()) {
 | 
					    if (code_seen('S')) switch(code_value_short()) {
 | 
				
			||||||
      case 1:
 | 
					      case 1:
 | 
				
			||||||
        for(int i=0;i<NUM_AXIS;i++) if (code_seen(axis_codes[i])) microstep_ms(i, code_value(), -1);
 | 
					        for(int i=0;i<NUM_AXIS;i++) if (code_seen(axis_codes[i])) microstep_ms(i, code_value(), -1);
 | 
				
			||||||
        if (code_seen('B')) microstep_ms(4, code_value(), -1);
 | 
					        if (code_seen('B')) microstep_ms(4, code_value(), -1);
 | 
				
			||||||
@@ -4585,21 +4587,26 @@ inline void gcode_M999() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void gcode_T() {
 | 
					inline void gcode_T() {
 | 
				
			||||||
  tmp_extruder = code_value();
 | 
					  int tmp_extruder = code_value();
 | 
				
			||||||
  if (tmp_extruder >= EXTRUDERS) {
 | 
					  if (tmp_extruder >= EXTRUDERS) {
 | 
				
			||||||
    SERIAL_ECHO_START;
 | 
					    SERIAL_ECHO_START;
 | 
				
			||||||
    SERIAL_ECHO("T");
 | 
					    SERIAL_CHAR('T');
 | 
				
			||||||
    SERIAL_ECHO(tmp_extruder);
 | 
					    SERIAL_ECHO(tmp_extruder);
 | 
				
			||||||
    SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
 | 
					    SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
 | 
					    target_extruder = tmp_extruder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #if EXTRUDERS > 1
 | 
					    #if EXTRUDERS > 1
 | 
				
			||||||
      bool make_move = false;
 | 
					      bool make_move = false;
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (code_seen('F')) {
 | 
					    if (code_seen('F')) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      #if EXTRUDERS > 1
 | 
					      #if EXTRUDERS > 1
 | 
				
			||||||
        make_move = true;
 | 
					        make_move = true;
 | 
				
			||||||
      #endif
 | 
					      #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      next_feedrate = code_value();
 | 
					      next_feedrate = code_value();
 | 
				
			||||||
      if (next_feedrate > 0.0) feedrate = next_feedrate;
 | 
					      if (next_feedrate > 0.0) feedrate = next_feedrate;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -4689,7 +4696,7 @@ inline void gcode_T() {
 | 
				
			|||||||
void process_commands() {
 | 
					void process_commands() {
 | 
				
			||||||
  if (code_seen('G')) {
 | 
					  if (code_seen('G')) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int gCode = code_value_long();
 | 
					    int gCode = code_value_short();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch(gCode) {
 | 
					    switch(gCode) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4764,7 +4771,7 @@ void process_commands() {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  else if (code_seen('M')) {
 | 
					  else if (code_seen('M')) {
 | 
				
			||||||
    switch( code_value_long() ) {
 | 
					    switch(code_value_short()) {
 | 
				
			||||||
      #ifdef ULTIPANEL
 | 
					      #ifdef ULTIPANEL
 | 
				
			||||||
        case 0: // M0 - Unconditional stop - Wait for user button press on LCD
 | 
					        case 0: // M0 - Unconditional stop - Wait for user button press on LCD
 | 
				
			||||||
        case 1: // M1 - Conditional stop - Wait for user button press on LCD
 | 
					        case 1: // M1 - Conditional stop - Wait for user button press on LCD
 | 
				
			||||||
@@ -5929,10 +5936,10 @@ void setPwmFrequency(uint8_t pin, int val)
 | 
				
			|||||||
#endif //FAST_PWM_FAN
 | 
					#endif //FAST_PWM_FAN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool setTargetedHotend(int code){
 | 
					bool setTargetedHotend(int code){
 | 
				
			||||||
  tmp_extruder = active_extruder;
 | 
					  target_extruder = active_extruder;
 | 
				
			||||||
  if(code_seen('T')) {
 | 
					  if (code_seen('T')) {
 | 
				
			||||||
    tmp_extruder = code_value();
 | 
					    target_extruder = code_value_short();
 | 
				
			||||||
    if(tmp_extruder >= EXTRUDERS) {
 | 
					    if (target_extruder >= EXTRUDERS) {
 | 
				
			||||||
      SERIAL_ECHO_START;
 | 
					      SERIAL_ECHO_START;
 | 
				
			||||||
      switch(code){
 | 
					      switch(code){
 | 
				
			||||||
        case 104:
 | 
					        case 104:
 | 
				
			||||||
@@ -5951,7 +5958,7 @@ bool setTargetedHotend(int code){
 | 
				
			|||||||
          SERIAL_ECHO(MSG_M221_INVALID_EXTRUDER);
 | 
					          SERIAL_ECHO(MSG_M221_INVALID_EXTRUDER);
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      SERIAL_ECHOLN(tmp_extruder);
 | 
					      SERIAL_ECHOLN(target_extruder);
 | 
				
			||||||
      return true;
 | 
					      return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -249,7 +249,7 @@ void CardReader::openFile(char* name, bool read, bool replace_current/*=true*/)
 | 
				
			|||||||
        if (!myDir.open(curDir, subdirname, O_READ)) {
 | 
					        if (!myDir.open(curDir, subdirname, O_READ)) {
 | 
				
			||||||
          SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
 | 
					          SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
 | 
				
			||||||
          SERIAL_PROTOCOL(subdirname);
 | 
					          SERIAL_PROTOCOL(subdirname);
 | 
				
			||||||
          SERIAL_PROTOCOLLNPGM(".");
 | 
					          SERIAL_PROTOCOLCHAR('.');
 | 
				
			||||||
          return;
 | 
					          return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
@@ -287,14 +287,14 @@ void CardReader::openFile(char* name, bool read, bool replace_current/*=true*/)
 | 
				
			|||||||
    else {
 | 
					    else {
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
 | 
					      SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
 | 
				
			||||||
      SERIAL_PROTOCOL(fname);
 | 
					      SERIAL_PROTOCOL(fname);
 | 
				
			||||||
      SERIAL_PROTOCOLLNPGM(".");
 | 
					      SERIAL_PROTOCOLCHAR('.');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else { //write
 | 
					  else { //write
 | 
				
			||||||
    if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) {
 | 
					    if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) {
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
 | 
					      SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
 | 
				
			||||||
      SERIAL_PROTOCOL(fname);
 | 
					      SERIAL_PROTOCOL(fname);
 | 
				
			||||||
      SERIAL_PROTOCOLLNPGM(".");
 | 
					      SERIAL_PROTOCOLCHAR('.');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
      saving = true;
 | 
					      saving = true;
 | 
				
			||||||
@@ -330,7 +330,7 @@ void CardReader::removeFile(char* name) {
 | 
				
			|||||||
        if (!myDir.open(curDir, subdirname, O_READ)) {
 | 
					        if (!myDir.open(curDir, subdirname, O_READ)) {
 | 
				
			||||||
          SERIAL_PROTOCOLPGM("open failed, File: ");
 | 
					          SERIAL_PROTOCOLPGM("open failed, File: ");
 | 
				
			||||||
          SERIAL_PROTOCOL(subdirname);
 | 
					          SERIAL_PROTOCOL(subdirname);
 | 
				
			||||||
          SERIAL_PROTOCOLLNPGM(".");
 | 
					          SERIAL_PROTOCOLCHAR('.');
 | 
				
			||||||
          return;
 | 
					          return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
@@ -360,7 +360,7 @@ void CardReader::removeFile(char* name) {
 | 
				
			|||||||
  else {
 | 
					  else {
 | 
				
			||||||
    SERIAL_PROTOCOLPGM("Deletion failed, File: ");
 | 
					    SERIAL_PROTOCOLPGM("Deletion failed, File: ");
 | 
				
			||||||
    SERIAL_PROTOCOL(fname);
 | 
					    SERIAL_PROTOCOL(fname);
 | 
				
			||||||
    SERIAL_PROTOCOLLNPGM(".");
 | 
					    SERIAL_PROTOCOLCHAR('.');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -368,7 +368,7 @@ void CardReader::getStatus() {
 | 
				
			|||||||
  if (cardOK) {
 | 
					  if (cardOK) {
 | 
				
			||||||
    SERIAL_PROTOCOLPGM(MSG_SD_PRINTING_BYTE);
 | 
					    SERIAL_PROTOCOLPGM(MSG_SD_PRINTING_BYTE);
 | 
				
			||||||
    SERIAL_PROTOCOL(sdpos);
 | 
					    SERIAL_PROTOCOL(sdpos);
 | 
				
			||||||
    SERIAL_PROTOCOLPGM("/");
 | 
					    SERIAL_PROTOCOLCHAR('/');
 | 
				
			||||||
    SERIAL_PROTOCOLLN(filesize);
 | 
					    SERIAL_PROTOCOLLN(filesize);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -553,8 +553,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// @section movement
 | 
					// @section movement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -499,8 +499,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -499,8 +499,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -522,8 +522,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {2000, 2000, 150, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {2000, 2000, 150, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -527,8 +527,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -551,8 +551,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  #define MANUAL_Z_HOME_POS 0.1  // Distance between nozzle and print surface after homing.
 | 
					  #define MANUAL_Z_HOME_POS 0.1  // Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {40*60, 40*60, 10*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {40*60, 40*60, 10*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -521,8 +521,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {120*60, 120*60, 7.2*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {120*60, 120*60, 7.2*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -566,8 +566,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  #define MANUAL_Z_HOME_POS 250 // For delta: Distance between nozzle and print surface after homing.
 | 
					  #define MANUAL_Z_HOME_POS 250 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// delta homing speeds must be the same on xyz
 | 
					// delta homing speeds must be the same on xyz
 | 
				
			||||||
#define HOMING_FEEDRATE {200*60, 200*60, 200*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {200*60, 200*60, 200*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -570,8 +570,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
 | 
				
			|||||||
  #define MANUAL_Z_HOME_POS 250 // For delta: Distance between nozzle and print surface after homing.
 | 
					  #define MANUAL_Z_HOME_POS 250 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// delta homing speeds must be the same on xyz
 | 
					// delta homing speeds must be the same on xyz
 | 
				
			||||||
#define HOMING_FEEDRATE {200*60, 200*60, 200*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {200*60, 200*60, 200*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -519,8 +519,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {1500, 1500, 120, 0}  // set the homing speeds (mm/min)   ***** MakiBox A6 *****
 | 
					#define HOMING_FEEDRATE {1500, 1500, 120, 0}  // set the homing speeds (mm/min)   ***** MakiBox A6 *****
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -521,8 +521,10 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 | 
				
			|||||||
  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
					  //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// MOVEMENT SETTINGS
 | 
					/**
 | 
				
			||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
 | 
					 * MOVEMENT SETTINGS
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
					#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}  // set the homing speeds (mm/min)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// default settings
 | 
					// default settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,7 +67,7 @@
 | 
				
			|||||||
//===========================================================================
 | 
					//===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long minsegmenttime;
 | 
					unsigned long minsegmenttime;
 | 
				
			||||||
float max_feedrate[NUM_AXIS]; // set the max speeds
 | 
					float max_feedrate[NUM_AXIS]; // Max speeds in mm per minute
 | 
				
			||||||
float axis_steps_per_unit[NUM_AXIS];
 | 
					float axis_steps_per_unit[NUM_AXIS];
 | 
				
			||||||
unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software
 | 
					unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software
 | 
				
			||||||
float minimumfeedrate;
 | 
					float minimumfeedrate;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,7 @@ unsigned char soft_pwm_bed;
 | 
				
			|||||||
    static unsigned long thermal_runaway_timer[4]; // = {0,0,0,0};
 | 
					    static unsigned long thermal_runaway_timer[4]; // = {0,0,0,0};
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #if HAS_BED_THERMAL_PROTECTION
 | 
					  #if HAS_BED_THERMAL_PROTECTION
 | 
				
			||||||
    static TRState thermal_runaway_bed_state_machine = { TRInactive, TRInactive, TRInactive, TRInactive };
 | 
					    static TRState thermal_runaway_bed_state_machine = TRInactive;
 | 
				
			||||||
    static unsigned long thermal_runaway_bed_timer;
 | 
					    static unsigned long thermal_runaway_bed_timer;
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,9 +125,9 @@ void matrix_3x3::debug(const char title[]) {
 | 
				
			|||||||
  int count = 0;
 | 
					  int count = 0;
 | 
				
			||||||
  for(int i=0; i<3; i++) {
 | 
					  for(int i=0; i<3; i++) {
 | 
				
			||||||
    for(int j=0; j<3; j++) {
 | 
					    for(int j=0; j<3; j++) {
 | 
				
			||||||
      if (matrix[count] >= 0.0) SERIAL_PROTOCOLPGM("+");
 | 
					      if (matrix[count] >= 0.0) SERIAL_PROTOCOLCHAR('+');
 | 
				
			||||||
      SERIAL_PROTOCOL_F(matrix[count], 6);
 | 
					      SERIAL_PROTOCOL_F(matrix[count], 6);
 | 
				
			||||||
      SERIAL_PROTOCOLPGM(" ");
 | 
					      SERIAL_PROTOCOLCHAR(' ');
 | 
				
			||||||
      count++;
 | 
					      count++;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SERIAL_EOL;
 | 
					    SERIAL_EOL;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user