ExternalAxis: option (b) homing - user A=0 at home, deterministic on re-home
Three changes that together implement option (b) home semantics: 1. Mach.home for the external axis: replace G28.3 with explicit AVR position sync (Cmd.set_axis) + planner abs sync (position_change) + G92 a0 (set user-coord origin to current physical position, computing offset = home_position_mm). G28.3 was wrong: it preserves the current user-coord position and adjusts the offset to bridge to the new abs. After a move away from home and a re-home, the offset accumulates (134 -> 268 -> ...). G92 a0 with a freshly-synced abs always produces offset = home_position_mm regardless of prior state. 2. Planner.__encode: stop stripping the external axis target from the AVR line. The AVR has no motor mapped to A so it steps no motor, but exec_move_to_target updates ex.position[A] which gets reported back as ap. Leaving A in the AVR target keeps state.ap consistent with gplan's idea of A; stripping it left ex.position[A] stale and clobbered ExternalAxis's state.ap on the next status report. Side benefit: removes the special-case empty-string return for pure external moves; every line block follows the same path now. 3. ExternalAxis.enqueue_target_mm: stop writing to state.<axis>p from the planner hot path. The AVR's status reports drive it instead, which avoids DRO jitter (jump to target then snap back to intermediate values as the trapezoid runs). _pos_mm internal mirror is still updated for delta computation. Re-verified with the integration smoke test in tmp/20260503_option_b/: home/move-down/move-up/re-home/home-from-bottom all produce the expected DRO position values (0 at home, -134 at bottom).
This commit is contained in:
@@ -92,17 +92,21 @@ script#control-view-template(type="text/x-template")
|
||||
.fa.fa-arrow-down.ico(style="transform: rotate(-45deg)")
|
||||
button.jbtn(@click="jog_fn(0, 0, -1, 0)") Z−
|
||||
|
||||
// Row 4 — W axis (auxcnc) when enabled.
|
||||
// W- | W+ | Probe XYZ | Probe Z
|
||||
// "Home W" lives in the DRO table's actions column on the
|
||||
// right, so it doesn't need a tile here.
|
||||
template(v-if="w.enabled")
|
||||
button.jbtn(@click="aux_jog_incr(-1)", :disabled="!w.enabled")
|
||||
// Row 4 — A axis (the auxcnc-driven external axis) when enabled.
|
||||
// A- | A+ | Probe XYZ | Probe Z
|
||||
// "Home A" lives in the DRO table's actions column on the
|
||||
// right, so it doesn't need a tile here. The legacy w.enabled
|
||||
// gate is kept so older installs (where the auxcnc axis still
|
||||
// appears as W via the side-channel) keep working.
|
||||
template(v-if="w.enabled || a.enabled")
|
||||
button.jbtn(@click="aux_jog_incr(-1)",
|
||||
:disabled="!(w.enabled || a.enabled)")
|
||||
.fa.fa-arrow-down.ico
|
||||
span.lbl W−
|
||||
button.jbtn(@click="aux_jog_incr(+1)", :disabled="!w.enabled")
|
||||
span.lbl A−
|
||||
button.jbtn(@click="aux_jog_incr(+1)",
|
||||
:disabled="!(w.enabled || a.enabled)")
|
||||
.fa.fa-arrow-up.ico
|
||||
span.lbl W+
|
||||
span.lbl A+
|
||||
button.jbtn(@click="showProbeDialog('xyz')",
|
||||
:class="{'load-on': !state['pw']}")
|
||||
.fa.fa-bullseye.ico
|
||||
|
||||
Reference in New Issue
Block a user