Add ExtUI methods to babystep probe/nozzle offsets (#12590)

This commit is contained in:
Marcio Teixeira 2019-02-06 06:16:54 -07:00 committed by Scott Lahteine
parent 413e303ad5
commit 113af46a1b
2 changed files with 92 additions and 38 deletions

View file

@ -449,49 +449,86 @@ namespace ExtUI {
void setRetractAcceleration_mm_s2(const float acc) { planner.settings.retract_acceleration = acc; } void setRetractAcceleration_mm_s2(const float acc) { planner.settings.retract_acceleration = acc; }
void setTravelAcceleration_mm_s2(const float acc) { planner.settings.travel_acceleration = acc; } void setTravelAcceleration_mm_s2(const float acc) { planner.settings.travel_acceleration = acc; }
#if ENABLED(BABYSTEP_ZPROBE_OFFSET) #if ENABLED(BABYSTEPPING)
float getZOffset_mm() { bool babystepAxis_steps(const int16_t steps, const axis_t axis) {
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) switch (axis) {
if (active_extruder != 0) #if ENABLED(BABYSTEP_XY)
return hotend_offset[Z_AXIS][active_extruder]; case X: thermalManager.babystep_axis(X_AXIS, steps); break;
else case Y: thermalManager.babystep_axis(Y_AXIS, steps); break;
#endif #endif
case Z: thermalManager.babystep_axis(Z_AXIS, steps); break;
default: return false;
};
return true;
}
/**
* This function adjusts an axis during a print.
*
* When linked_nozzles is false, each nozzle in a multi-nozzle
* printer can be babystepped independently of the others. This
* lets the user to fine tune the Z-offset and Nozzle Offsets
* while observing the first layer of a print, regardless of
* what nozzle is printing.
*/
void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles) {
const float mm = steps * planner.steps_to_mm[axis];
if (!babystepAxis_steps(steps, axis)) return;
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
// Make it so babystepping in Z adjusts the Z probe offset.
if (axis == Z
#if EXTRUDERS > 1
&& (linked_nozzles || active_extruder == 0)
#endif
) zprobe_zoffset += mm;
#endif
#if EXTRUDERS > 1
/**
* When linked_nozzles is false, as an axis is babystepped
* adjust the hotend offsets so that the other nozzles are
* unaffected by the babystepping of the active nozzle.
*/
if (!linked_nozzles) {
HOTEND_LOOP()
if (e != active_extruder)
hotend_offset[axis][e] += mm;
normalizeNozzleOffset(X);
normalizeNozzleOffset(Y);
normalizeNozzleOffset(Z);
}
#else
UNUSED(linked_nozzles);
#endif
}
/**
* Converts a mm displacement to a number of whole number of
* steps that is at least mm long.
*/
int16_t mmToWholeSteps(const float mm, const axis_t axis) {
const float steps = mm / planner.steps_to_mm[axis];
return steps > 0 ? ceil(steps) : floor(steps);
}
#endif
#if HAS_BED_PROBE
float getZOffset_mm() {
return zprobe_zoffset; return zprobe_zoffset;
} }
void setZOffset_mm(const float value) { void setZOffset_mm(const float value) {
const float diff = (value - getZOffset_mm()) / planner.steps_to_mm[Z_AXIS]; if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
addZOffset_steps(diff > 0 ? CEIL(diff) : FLOOR(diff)); zprobe_zoffset = value;
}
void addZOffset_steps(int16_t babystep_increment) {
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
const bool do_probe = (active_extruder == 0);
#else
constexpr bool do_probe = true;
#endif
const float diff = planner.steps_to_mm[Z_AXIS] * babystep_increment,
new_probe_offset = zprobe_zoffset + diff,
new_offs =
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
do_probe ? new_probe_offset : hotend_offset[Z_AXIS][active_extruder] - diff
#else
new_probe_offset
#endif
;
if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
thermalManager.babystep_axis(Z_AXIS, babystep_increment);
if (do_probe) zprobe_zoffset = new_offs;
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
else hotend_offset[Z_AXIS][active_extruder] = new_offs;
#endif
} }
} }
#endif // ENABLED(BABYSTEP_ZPROBE_OFFSET) #endif // HAS_BED_PROBE
#if HOTENDS > 1 #if HOTENDS > 1
float getNozzleOffset_mm(const axis_t axis, const extruder_t extruder) { float getNozzleOffset_mm(const axis_t axis, const extruder_t extruder) {
if (extruder - E0 >= HOTENDS) return 0; if (extruder - E0 >= HOTENDS) return 0;
return hotend_offset[axis][extruder - E0]; return hotend_offset[axis][extruder - E0];
@ -501,7 +538,18 @@ namespace ExtUI {
if (extruder - E0 >= HOTENDS) return; if (extruder - E0 >= HOTENDS) return;
hotend_offset[axis][extruder - E0] = value; hotend_offset[axis][extruder - E0] = value;
} }
#endif
/**
* The UI should call this if needs to guarantee the first
* nozzle offset is zero (such as when it doesn't allow the
* user to edit the offset the first nozzle).
*/
void normalizeNozzleOffset(const axis_t axis) {
const float offs = hotend_offset[axis][0];
HOTEND_LOOP() hotend_offset[axis][e] -= offs;
}
#endif // HOTENDS > 1
#if ENABLED(BACKLASH_GCODE) #if ENABLED(BACKLASH_GCODE)
float getAxisBacklash_mm(const axis_t axis) { return backlash_distance_mm[axis]; } float getAxisBacklash_mm(const axis_t axis) { return backlash_distance_mm[axis]; }

View file

@ -136,16 +136,22 @@ namespace ExtUI {
extruder_t getActiveTool(); extruder_t getActiveTool();
void setActiveTool(const extruder_t, bool no_move); void setActiveTool(const extruder_t, bool no_move);
#if ENABLED(BABYSTEPPING)
int16_t mmToWholeSteps(const float mm, const axis_t axis);
bool babystepAxis_steps(const int16_t steps, const axis_t axis);
void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles);
#endif
#if HOTENDS > 1 #if HOTENDS > 1
float getNozzleOffset_mm(const axis_t, const extruder_t); float getNozzleOffset_mm(const axis_t, const extruder_t);
void setNozzleOffset_mm(const float, const axis_t, const extruder_t); void setNozzleOffset_mm(const float, const axis_t, const extruder_t);
void normalizeNozzleOffset(const axis_t axis);
#endif #endif
#if ENABLED(BABYSTEP_ZPROBE_OFFSET) #if HAS_BED_PROBE
float getZOffset_mm(); float getZOffset_mm();
void setZOffset_mm(const float); void setZOffset_mm(const float);
void addZOffset_steps(const int16_t);
#endif #endif
#if ENABLED(BACKLASH_GCODE) #if ENABLED(BACKLASH_GCODE)