Merge pull request #8747 from thinkyhead/bf2_sync_M420_M852

[2.0.x] M852 changes position. Position change reporting.
This commit is contained in:
Scott Lahteine 2017-12-10 22:40:32 -06:00 committed by GitHub
commit f53e0702fc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 88 additions and 42 deletions

View file

@ -128,13 +128,17 @@ void set_bed_leveling_enabled(const bool enable/*=true*/) {
// so compensation will give the right stepper counts. // so compensation will give the right stepper counts.
planner.unapply_leveling(current_position); planner.unapply_leveling(current_position);
SYNC_PLAN_POSITION_KINEMATIC();
#endif // OLDSCHOOL_ABL #endif // OLDSCHOOL_ABL
} }
} }
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
void set_z_fade_height(const float zfh) { void set_z_fade_height(const float zfh, const bool do_report/*=true*/) {
if (planner.z_fade_height == zfh) return; // do nothing if no change
const bool level_active = planner.leveling_active; const bool level_active = planner.leveling_active;
@ -145,6 +149,10 @@ void set_bed_leveling_enabled(const bool enable/*=true*/) {
planner.set_z_fade_height(zfh); planner.set_z_fade_height(zfh);
if (level_active) { if (level_active) {
const float oldpos[XYZE] = {
current_position[X_AXIS], current_position[Y_AXIS],
current_position[Z_AXIS], current_position[E_AXIS]
};
#if ENABLED(AUTO_BED_LEVELING_UBL) #if ENABLED(AUTO_BED_LEVELING_UBL)
set_bed_leveling_enabled(true); // turn back on after changing fade height set_bed_leveling_enabled(true); // turn back on after changing fade height
#else #else
@ -155,7 +163,10 @@ void set_bed_leveling_enabled(const bool enable/*=true*/) {
Z_AXIS Z_AXIS
#endif #endif
); );
SYNC_PLAN_POSITION_KINEMATIC();
#endif #endif
if (do_report && memcmp(oldpos, current_position, sizeof(oldpos)))
report_current_position();
} }
} }

View file

@ -47,7 +47,7 @@ void set_bed_leveling_enabled(const bool enable=true);
void reset_bed_level(); void reset_bed_level();
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
void set_z_fade_height(const float zfh); void set_z_fade_height(const float zfh, const bool do_report=true);
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) #if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING)

View file

@ -71,17 +71,19 @@
volatile int unified_bed_leveling::encoder_diff; volatile int unified_bed_leveling::encoder_diff;
unified_bed_leveling::unified_bed_leveling() { unified_bed_leveling::unified_bed_leveling() {
ubl_cnt++; // Debug counter to insure we only have one UBL object present in memory. We can eliminate this (and all references to ubl_cnt) very soon. ubl_cnt++; // Debug counter to ensure we only have one UBL object present in memory. We can eliminate this (and all references to ubl_cnt) very soon.
reset(); reset();
} }
void unified_bed_leveling::reset() { void unified_bed_leveling::reset() {
const bool was_enabled = planner.leveling_active;
set_bed_leveling_enabled(false); set_bed_leveling_enabled(false);
storage_slot = -1; storage_slot = -1;
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
planner.set_z_fade_height(10.0); planner.set_z_fade_height(10.0);
#endif #endif
ZERO(z_values); ZERO(z_values);
if (was_enabled) report_current_position();
} }
void unified_bed_leveling::invalidate() { void unified_bed_leveling::invalidate() {

View file

@ -45,6 +45,11 @@
*/ */
void GcodeSuite::M420() { void GcodeSuite::M420() {
const float oldpos[XYZE] = {
current_position[X_AXIS], current_position[Y_AXIS],
current_position[Z_AXIS], current_position[E_AXIS]
};
#if ENABLED(AUTO_BED_LEVELING_UBL) #if ENABLED(AUTO_BED_LEVELING_UBL)
// L to load a mesh from the EEPROM // L to load a mesh from the EEPROM
@ -104,13 +109,16 @@ void GcodeSuite::M420() {
#endif #endif
} }
const bool to_enable = parser.boolval('S');
if (parser.seen('S')) set_bed_leveling_enabled(to_enable);
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
if (parser.seen('Z')) set_z_fade_height(parser.value_linear_units()); if (parser.seen('Z')) set_z_fade_height(parser.value_linear_units(), false);
#endif #endif
bool to_enable = false;
if (parser.seen('S')) {
to_enable = parser.value_bool();
set_bed_leveling_enabled(to_enable);
}
const bool new_status = planner.leveling_active; const bool new_status = planner.leveling_active;
if (to_enable && !new_status) { if (to_enable && !new_status) {
@ -129,6 +137,10 @@ void GcodeSuite::M420() {
else else
SERIAL_ECHOLNPGM(MSG_OFF); SERIAL_ECHOLNPGM(MSG_OFF);
#endif #endif
// Report change in position
if (memcmp(oldpos, current_position, sizeof(oldpos)))
report_current_position();
} }
#endif // HAS_LEVELING #endif // HAS_LEVELING

View file

@ -285,6 +285,7 @@ void GcodeSuite::G29() {
bed_level_virt_interpolate(); bed_level_virt_interpolate();
#endif #endif
set_bed_leveling_enabled(abl_should_enable); set_bed_leveling_enabled(abl_should_enable);
if (abl_should_enable) report_current_position();
} }
return; return;
} // parser.seen('W') } // parser.seen('W')

View file

@ -36,37 +36,47 @@
* K[yz_factor] - New YZ skew factor * K[yz_factor] - New YZ skew factor
*/ */
void GcodeSuite::M852() { void GcodeSuite::M852() {
const bool ijk = parser.seen('I') || parser.seen('S') uint8_t ijk = 0, badval = 0, setval = 0;
#if ENABLED(SKEW_CORRECTION_FOR_Z)
|| parser.seen('J') || parser.seen('K')
#endif
;
bool badval = false;
if (parser.seen('I') || parser.seen('S')) { if (parser.seen('I') || parser.seen('S')) {
++ijk;
const float value = parser.value_linear_units(); const float value = parser.value_linear_units();
if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
planner.xy_skew_factor = value; if (planner.xy_skew_factor != value) {
planner.xy_skew_factor = value;
++setval;
}
}
else else
badval = true; ++badval;
} }
#if ENABLED(SKEW_CORRECTION_FOR_Z) #if ENABLED(SKEW_CORRECTION_FOR_Z)
if (parser.seen('J')) { if (parser.seen('J')) {
++ijk;
const float value = parser.value_linear_units(); const float value = parser.value_linear_units();
if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
planner.xz_skew_factor = value; if (planner.xz_skew_factor != value) {
planner.xz_skew_factor = value;
++setval;
}
}
else else
badval = true; ++badval;
} }
if (parser.seen('K')) { if (parser.seen('K')) {
++ijk;
const float value = parser.value_linear_units(); const float value = parser.value_linear_units();
if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
planner.yz_skew_factor = value; if (planner.yz_skew_factor != value) {
planner.yz_skew_factor = value;
++setval;
}
}
else else
badval = true; ++badval;
} }
#endif #endif
@ -74,6 +84,13 @@ void GcodeSuite::M852() {
if (badval) if (badval)
SERIAL_ECHOLNPGM(MSG_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " MSG_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX)); SERIAL_ECHOLNPGM(MSG_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " MSG_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX));
// When skew is changed the current position changes
if (setval) {
set_current_from_steppers_for_axis(ALL_AXES);
SYNC_PLAN_POSITION_KINEMATIC();
report_current_position();
}
if (!ijk) { if (!ijk) {
SERIAL_ECHO_START(); SERIAL_ECHO_START();
SERIAL_ECHOPAIR(MSG_SKEW_FACTOR " XY: ", planner.xy_skew_factor); SERIAL_ECHOPAIR(MSG_SKEW_FACTOR " XY: ", planner.xy_skew_factor);

View file

@ -216,14 +216,15 @@ MarlinSettings settings;
float new_z_fade_height; float new_z_fade_height;
#endif #endif
#if ENABLED(CNC_COORDINATE_SYSTEMS)
bool position_changed;
#endif
/** /**
* Post-process after Retrieve or Reset * Post-process after Retrieve or Reset
*/ */
void MarlinSettings::postprocess() { void MarlinSettings::postprocess() {
const float oldpos[XYZE] = {
current_position[X_AXIS], current_position[Y_AXIS],
current_position[Z_AXIS], current_position[E_AXIS]
};
// steps per s2 needs to be updated to agree with units per s2 // steps per s2 needs to be updated to agree with units per s2
planner.reset_acceleration_rates(); planner.reset_acceleration_rates();
@ -233,10 +234,6 @@ void MarlinSettings::postprocess() {
recalc_delta_settings(); recalc_delta_settings();
#endif #endif
// Refresh steps_to_mm with the reciprocal of axis_steps_per_mm
// and init stepper.count[], planner.position[] with current_position
planner.refresh_positioning();
#if ENABLED(PIDTEMP) #if ENABLED(PIDTEMP)
thermalManager.updatePID(); thermalManager.updatePID();
#endif #endif
@ -249,7 +246,7 @@ void MarlinSettings::postprocess() {
#endif #endif
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
set_z_fade_height(new_z_fade_height); set_z_fade_height(new_z_fade_height, false); // false = no report
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
@ -264,13 +261,14 @@ void MarlinSettings::postprocess() {
#if ENABLED(FWRETRACT) #if ENABLED(FWRETRACT)
fwretract.refresh_autoretract(); fwretract.refresh_autoretract();
#endif #endif
// Refresh steps_to_mm with the reciprocal of axis_steps_per_mm
// and init stepper.count[], planner.position[] with current_position
planner.refresh_positioning();
#if ENABLED(CNC_COORDINATE_SYSTEMS) // Various factors can change the current position
if (position_changed) { if (memcmp(oldpos, current_position, sizeof(oldpos)))
report_current_position(); report_current_position();
position_changed = false;
}
#endif
} }
#if ENABLED(EEPROM_SETTINGS) #if ENABLED(EEPROM_SETTINGS)
@ -308,7 +306,7 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(ver); // invalidate data first EEPROM_WRITE(ver); // invalidate data first
EEPROM_SKIP(working_crc); // Skip the checksum slot EEPROM_SKIP(working_crc); // Skip the checksum slot
working_crc = 0; // Init to 0. Accumulated by EEPROM_READ working_crc = 0; // clear before first "real data"
const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ; const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ;
EEPROM_WRITE(esteppers); EEPROM_WRITE(esteppers);
@ -342,7 +340,7 @@ void MarlinSettings::postprocess() {
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
const float zfh = planner.z_fade_height; const float zfh = planner.z_fade_height;
#else #else
const float zfh = 0.0; const float zfh = 10.0;
#endif #endif
EEPROM_WRITE(zfh); EEPROM_WRITE(zfh);
@ -725,7 +723,7 @@ void MarlinSettings::postprocess() {
float dummy = 0; float dummy = 0;
bool dummyb; bool dummyb;
working_crc = 0; //clear before reading first "real data" working_crc = 0; // Init to 0. Accumulated by EEPROM_READ
// Number of esteppers may change // Number of esteppers may change
uint8_t esteppers; uint8_t esteppers;
@ -913,7 +911,6 @@ void MarlinSettings::postprocess() {
#if DISABLED(ULTIPANEL) #if DISABLED(ULTIPANEL)
int lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_speed[2]; int lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_speed[2];
#endif #endif
EEPROM_READ(lcd_preheat_hotend_temp); // 2 floats EEPROM_READ(lcd_preheat_hotend_temp); // 2 floats
EEPROM_READ(lcd_preheat_bed_temp); // 2 floats EEPROM_READ(lcd_preheat_bed_temp); // 2 floats
EEPROM_READ(lcd_preheat_fan_speed); // 2 floats EEPROM_READ(lcd_preheat_fan_speed); // 2 floats
@ -1094,7 +1091,7 @@ void MarlinSettings::postprocess() {
// //
#if ENABLED(CNC_COORDINATE_SYSTEMS) #if ENABLED(CNC_COORDINATE_SYSTEMS)
position_changed = gcode.select_coordinate_system(-1); // Go back to machine space (void)gcode.select_coordinate_system(-1); // Go back to machine space
EEPROM_READ(gcode.coordinate_system); // 27 floats EEPROM_READ(gcode.coordinate_system); // 27 floats
#else #else
for (uint8_t q = 27; q--;) EEPROM_READ(dummy); for (uint8_t q = 27; q--;) EEPROM_READ(dummy);

View file

@ -211,6 +211,12 @@ void get_cartesian_from_steppers() {
* Set the current_position for an axis based on * Set the current_position for an axis based on
* the stepper positions, removing any leveling that * the stepper positions, removing any leveling that
* may have been applied. * may have been applied.
*
* To prevent small shifts in axis position always call
* SYNC_PLAN_POSITION_KINEMATIC after updating axes with this.
*
* To keep hosts in sync, always call report_current_position
* after updating the current_position.
*/ */
void set_current_from_steppers_for_axis(const AxisEnum axis) { void set_current_from_steppers_for_axis(const AxisEnum axis) {
get_cartesian_from_steppers(); get_cartesian_from_steppers();