Don't apply M428 if an error occurs

- Also move audio feedback into the command
- Added shorthand for `lcd_buzz` availability
This commit is contained in:
Scott Lahteine
2015-04-29 19:05:48 -07:00
parent d065d37822
commit d4c74b8f8c
5 changed files with 49 additions and 24 deletions

View File

@ -36,6 +36,7 @@
#endif
#endif // ENABLE_AUTO_BED_LEVELING
#define HAS_LCD_BUZZ (defined(ULTRALCD) || (defined(BEEPER) && BEEPER >= 0) || defined(LCD_USE_I2C_BUZZER))
#define SERVO_LEVELING (defined(ENABLE_AUTO_BED_LEVELING) && PROBE_SERVO_DEACTIVATION_DELAY > 0)
#ifdef MESH_BED_LEVELING
@ -4091,7 +4092,7 @@ inline void gcode_M226() {
#endif // NUM_SERVOS > 0
#if BEEPER > 0 || defined(ULTRALCD) || defined(LCD_USE_I2C_BUZZER)
#if HAS_LCD_BUZZ
/**
* M300: Play beep sound S<frequency Hz> P<duration ms>
@ -4103,7 +4104,7 @@ inline void gcode_M226() {
lcd_buzz(beepP, beepS);
}
#endif // BEEPER>0 || ULTRALCD || LCD_USE_I2C_BUZZER
#endif // HAS_LCD_BUZZ
#ifdef PIDTEMP
@ -4507,27 +4508,50 @@ inline void gcode_M410() { quickStop(); }
/**
* M428: Set home_offset based on the distance between the
* current_position and the nearest "reference position."
* If an axis is past center the endstop position
* current_position and the nearest "reference point."
* If an axis is past center its endstop position
* is the reference-point. Otherwise it uses 0. This allows
* the Z offset to be set near the bed when using a max endstop.
*
* M428 can't be used more than 2cm away from 0 or an endstop.
*
* Use M206 to set these values directly.
*/
inline void gcode_M428() {
bool err = false;
float new_offs[3], new_pos[3];
memcpy(new_pos, current_position, sizeof(new_pos));
memcpy(new_offs, home_offset, sizeof(new_offs));
for (int8_t i = X_AXIS; i <= Z_AXIS; i++) {
float base = (current_position[i] > (min_pos[i] + max_pos[i]) / 2) ? base_home_pos(i) : 0,
diff = current_position[i] - base;
if (diff > -20 && diff < 20) {
home_offset[i] -= diff;
current_position[i] = base;
}
else {
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR);
if (axis_known_position[i]) {
float base = (new_pos[i] > (min_pos[i] + max_pos[i]) / 2) ? base_home_pos(i) : 0,
diff = new_pos[i] - base;
if (diff > -20 && diff < 20) {
new_offs[i] -= diff;
new_pos[i] = base;
}
else {
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR);
LCD_ALERTMESSAGEPGM("Err: Too far!");
#if HAS_LCD_BUZZ
enqueuecommands_P(PSTR("M300 S40 P200"));
#endif
err = true;
break;
}
}
}
sync_plan_position();
if (!err) {
memcpy(current_position, new_pos, sizeof(new_pos));
memcpy(home_offset, new_offs, sizeof(new_offs));
sync_plan_position();
LCD_ALERTMESSAGEPGM("Offset applied.");
#if HAS_LCD_BUZZ
enqueuecommands_P(PSTR("M300 S659 P200\nM300 S698 P200"));
#endif
}
}
/**
@ -5277,11 +5301,11 @@ void process_commands() {
break;
#endif // NUM_SERVOS > 0
#if BEEPER > 0 || defined(ULTRALCD) || defined(LCD_USE_I2C_BUZZER)
#if HAS_LCD_BUZZ
case 300: // M300 - Play beep tone
gcode_M300();
break;
#endif // BEEPER > 0 || ULTRALCD || LCD_USE_I2C_BUZZER
#endif // HAS_LCD_BUZZ
#ifdef PIDTEMP
case 301: // M301