Rename user-facing 'W axis' references to 'A axis' / 'auxiliary axis'

The auxcnc-driven stepper has been integrated into gplan as a
virtual A axis since the option-b migration. User-facing labels
that still said 'W axis' are now confusing because the user types
G-code with A, sees 'A' in the DRO, but config tabs and tooltips
still talked about W.

Cleaned up:
  - Settings tab label W Axis -> A Axis (route slug stays #w-axis
    for back-compat with bookmarks)
  - WAxisSettings.svelte tooltips and tip text say 'auxiliary' or
    just describe the field generically
  - control-view.pug DRO row tooltips, comments, labels
  - control-view.js console.error messages and route-comments
  - axis-vars.js _compute_aux_axis tooltips
  - AuxAxis.py boot-banner message

Internal identifiers (filenames WAxisSettings.svelte, route slug
#w-axis, aux.json fields min_w/max_w, internal comments referring
to the historical W-as-aux design) are kept where they are tied to
on-disk state or wire formats - those rename moves are not
worthwhile and would force users to migrate their aux.json files.
This commit is contained in:
2026-05-03 13:29:34 +02:00
parent 4a494a101d
commit c4c20c6d0a
6 changed files with 45 additions and 40 deletions

View File

@@ -256,10 +256,11 @@ module.exports = {
}, },
_compute_aux_axis: function() { _compute_aux_axis: function() {
// Virtual W axis driven by the auxcnc ESP32. Position, homed // Auxiliary axis driven by the auxcnc ESP32 (typically
// flag and presence come from the bbctrl AuxAxis driver via // exposed to gplan as A). Position, homed flag and
// state.aux_*. No motor mapping, no soft-limit warnings on // presence come from the bbctrl AuxAxis driver via
// toolpath bounds (auxcnc enforces its own). // state.aux_*. No motor mapping, no soft-limit warnings
// on toolpath bounds (auxcnc enforces its own).
const enabled = !!this.state.aux_enabled; const enabled = !!this.state.aux_enabled;
const present = !!this.state.aux_present; const present = !!this.state.aux_present;
const homed = !!this.state.aux_homed; const homed = !!this.state.aux_homed;
@@ -269,12 +270,12 @@ module.exports = {
let state = present ? "UNHOMED" : "OFFLINE"; let state = present ? "UNHOMED" : "OFFLINE";
let icon = present ? "question-circle" : "plug"; let icon = present ? "question-circle" : "plug";
let title = present let title = present
? "Click the home button to home W axis." ? "Click the home button to home the auxiliary axis."
: "Aux controller not connected on /dev/ttyUSB0."; : "Aux controller not connected on /dev/ttyUSB0.";
if (homed) { if (homed) {
state = "HOMED"; state = "HOMED";
icon = "check-circle"; icon = "check-circle";
title = "W axis successfully homed."; title = "Auxiliary axis successfully homed.";
} else if (!present) { } else if (!present) {
klass += " error"; klass += " error";
} }
@@ -295,7 +296,7 @@ module.exports = {
title: title, title: title,
ticon: "check-circle", ticon: "check-circle",
tstate: "OK", tstate: "OK",
toolmsg: "W axis is not constrained by tool path bounds.", toolmsg: "Auxiliary axis is not constrained by tool path bounds.",
tklass: `${homed ? "homed" : "unhomed"} axis-w`, tklass: `${homed ? "homed" : "unhomed"} axis-w`,
isAux: true, isAux: true,
}; };

View File

@@ -251,24 +251,24 @@ module.exports = {
aux_home: function () { aux_home: function () {
api.put("aux/home").catch(function (err) { api.put("aux/home").catch(function (err) {
console.error("W home failed:", err); console.error("Aux home failed:", err);
}); });
}, },
// Home every enabled axis (legacy Onefinity "Home All"). Sequence: // Home every enabled axis (legacy Onefinity "Home All"). Sequence:
// 1. Z, X, Y (and A/B/C if enabled) via /api/home on the AVR // 1. Z, X, Y (and A/B/C if enabled) via /api/home on the AVR
// 2. W axis via /api/aux/home on the ESP // 2. Auxiliary axis via /api/aux/home on the ESP
// ONLY when the auxcnc axis is not integrated as a virtual // ONLY when the auxcnc axis is not integrated as a virtual
// machine axis. With the gplan W-as-A integration // machine axis. With the gplan A-axis integration (synthetic
// (synthetic motor 4 enabled), Mach.home() already homes // motor 4 enabled), Mach.home() already homes the external
// the external axis as part of the xyzabc pass calling // axis as part of the xyzabc pass - calling aux/home
// aux/home afterwards would home it a second time. // afterwards would home it a second time.
// /api/home returns as soon as the request is queued, not when // /api/home returns as soon as the request is queued, not when
// homing completes, so we have to watch state.cycle: // homing completes, so we have to watch state.cycle:
// - first wait for it to *leave* 'idle' (cycle began), // - first wait for it to *leave* 'idle' (cycle began),
// - then wait for it to come *back* to 'idle' (cycle ended). // - then wait for it to come *back* to 'idle' (cycle ended).
// Only then do we fire the W home, so the gantry and the auxcnc // Only then do we fire the auxiliary home, so the gantry and the
// ESP never move at the same time. // auxcnc ESP never move at the same time.
home_all: async function () { home_all: async function () {
this.ask_home = false; this.ask_home = false;
try { try {
@@ -289,14 +289,14 @@ module.exports = {
// Phase 1: wait up to 5s for the homing cycle to actually start. // Phase 1: wait up to 5s for the homing cycle to actually start.
// If the request was rejected upstream (e.g. estopped) cycle // If the request was rejected upstream (e.g. estopped) cycle
// never leaves idle and we bail rather than home W in isolation. // never leaves idle and we bail rather than home A in isolation.
const startedAt = Date.now(); const startedAt = Date.now();
while (Date.now() - startedAt < 5000) { while (Date.now() - startedAt < 5000) {
if (cycleNow() != "idle") break; if (cycleNow() != "idle") break;
await wait(100); await wait(100);
} }
if (cycleNow() == "idle") { if (cycleNow() == "idle") {
console.warn("home_all: main homing cycle never started; skipping W"); console.warn("home_all: main homing cycle never started; skipping aux");
return; return;
} }
@@ -312,13 +312,13 @@ module.exports = {
} }
api.put("aux/home").catch(function (err) { api.put("aux/home").catch(function (err) {
console.error("W home failed:", err); console.error("Aux home failed:", err);
}); });
}, },
aux_jog: function (delta_mm) { aux_jog: function (delta_mm) {
api.put("aux/jog", { mm: delta_mm }).catch(function (err) { api.put("aux/jog", { mm: delta_mm }).catch(function (err) {
console.error("W jog failed:", err); console.error("Aux jog failed:", err);
}); });
}, },

View File

@@ -57,9 +57,11 @@ module.exports = {
{ sub: "motor", motor: 1, href: "#motor:1", icon: "fa-arrows-up-down-left-right", label: "Motor 1" }, { sub: "motor", motor: 1, href: "#motor:1", icon: "fa-arrows-up-down-left-right", label: "Motor 1" },
{ sub: "motor", motor: 2, href: "#motor:2", icon: "fa-arrows-up-down-left-right", label: "Motor 2" }, { sub: "motor", motor: 2, href: "#motor:2", icon: "fa-arrows-up-down-left-right", label: "Motor 2" },
{ sub: "motor", motor: 3, href: "#motor:3", icon: "fa-arrows-up-down-left-right", label: "Motor 3" }, { sub: "motor", motor: 3, href: "#motor:3", icon: "fa-arrows-up-down-left-right", label: "Motor 3" },
// W axis is auxiliary (auxcnc ESP32). It mounts the existing // Auxiliary axis (auxcnc ESP32 - exposed to gplan as A).
// WAxisSettings Svelte component on its own page. // Mounts the WAxisSettings Svelte component on its own page.
{ sub: "w-axis", href: "#w-axis", icon: "fa-arrows-up-down", label: "W Axis" }, // The route slug stays "#w-axis" for back-compat with any
// bookmarks; the visible label and tab content say "A Axis".
{ sub: "w-axis", href: "#w-axis", icon: "fa-arrows-up-down", label: "A Axis" },
{ section: " " }, { section: " " },
{ sub: "help", href: "#help", icon: "fa-circle-question", label: "Help" }, { sub: "help", href: "#help", icon: "fa-circle-question", label: "Help" },
], ],

View File

@@ -219,7 +219,7 @@ script#control-view-template(type="text/x-template")
// Master Home All. Each row's Actions cell has a per-axis // Master Home All. Each row's Actions cell has a per-axis
// home button; this header-level button homes every // home button; this header-level button homes every
// enabled axis (legacy Onefinity behavior). Auto-includes // enabled axis (legacy Onefinity behavior). Auto-includes
// the W axis when it is enabled. // the auxiliary A axis when it is enabled.
button.icon-btn(:disabled="!is_idle", button.icon-btn(:disabled="!is_idle",
title="Home all axes.", @click="home_all()") title="Home all axes.", @click="home_all()")
.fa.fa-house-chimney .fa.fa-house-chimney
@@ -252,8 +252,8 @@ script#control-view-template(type="text/x-template")
// Legacy W axis row - shown only when the auxcnc stepper is // Legacy W axis row - shown only when the auxcnc stepper is
// *not* exposed as a virtual A axis. After v2 the standard // *not* exposed as a virtual A axis. After v2 the standard
// A row above renders this axis natively (with full offset // A row above renders this axis natively (with full offset
// + set-position support); the W row stays for backwards // + set-position support); this row only appears on legacy
// compatibility with installs that haven't migrated. // installs that haven't migrated yet.
.dro-row(:class="w.klass + ' ' + w.tklass", .dro-row(:class="w.klass + ' ' + w.tklass",
v-if="w.enabled && !a.enabled", v-if="w.enabled && !a.enabled",
:title="w.title") :title="w.title")
@@ -268,7 +268,7 @@ script#control-view-template(type="text/x-template")
.fa.fa-location-dot .fa.fa-location-dot
button.icon-btn(:class="w.homed ? 'state-green' : 'state-amber'", button.icon-btn(:class="w.homed ? 'state-green' : 'state-amber'",
:disabled="!w.enabled", :disabled="!w.enabled",
title="Home W axis.", @click="aux_home()") title="Home auxiliary axis.", @click="aux_home()")
.fa.fa-home .fa.fa-home
// ----- Status strip ----- // ----- Status strip -----

View File

@@ -525,7 +525,7 @@ class AuxAxis(object):
self._present = True self._present = True
self._publish_state() self._publish_state()
self.ctrl.state.add_message( self.ctrl.state.add_message(
'W axis controller restarted - re-home before use') 'Auxiliary axis controller restarted - re-home before use')
return return
# Topic dispatch: "[topic] body..." # Topic dispatch: "[topic] body..."

View File

@@ -4,9 +4,11 @@
import * as api from "$lib/api"; import * as api from "$lib/api";
// Mirrors the DEFAULTS in src/py/bbctrl/AuxAxis.py. The "enabled" // Mirrors the DEFAULTS in src/py/bbctrl/AuxAxis.py. The "enabled"
// flag is read-only here; toggling the W axis on/off is done via // flag is read-only here; toggling the auxiliary A axis on/off
// aux.json on disk, so adding/removing the hardware doesn't have a // is done via aux.json on disk, so adding/removing the hardware
// surprise UI that bricks bring-up. // doesn't have a surprise UI that bricks bring-up. Field names
// (min_w/max_w) keep the historical "w" prefix for back-compat
// with existing aux.json files - rename happens at display only.
type AuxConfig = { type AuxConfig = {
enabled: boolean; enabled: boolean;
port: string; port: string;
@@ -73,9 +75,9 @@
} }
} }
// Mark the root config as modified whenever a W axis field is // Mark the root config as modified whenever an auxiliary axis
// edited, so the master Save button highlights and the user knows // field is edited, so the master Save button highlights and
// there are unsaved changes. // the user knows there are unsaved changes.
function markDirty() { function markDirty() {
try { try {
const root = (window as any).$root || (window as any).Vue?.root; const root = (window as any).$root || (window as any).Vue?.root;
@@ -88,7 +90,7 @@
<div class="w-axis-settings"> <div class="w-axis-settings">
{#if !cfg} {#if !cfg}
<p class="tip">Loading W axis configuration...</p> <p class="tip">Loading auxiliary A axis configuration...</p>
{:else} {:else}
<div class="status"> <div class="status">
{#if status} {#if status}
@@ -109,7 +111,7 @@
<div class="pure-form pure-form-aligned" on:input={markDirty} on:change={markDirty}> <div class="pure-form pure-form-aligned" on:input={markDirty} on:change={markDirty}>
<fieldset> <fieldset>
<div class="pure-control-group" title="Enable the auxcnc W axis. Edit aux.json to toggle."> <div class="pure-control-group" title="Enable the auxiliary axis (auxcnc-driven A). Edit aux.json to toggle.">
<label for="enabled">enabled</label> <label for="enabled">enabled</label>
<input id="enabled" type="checkbox" checked={cfg.enabled} disabled /> <input id="enabled" type="checkbox" checked={cfg.enabled} disabled />
<label for="" class="units">(edit aux.json)</label> <label for="" class="units">(edit aux.json)</label>
@@ -128,7 +130,7 @@
<h3>Mechanics</h3> <h3>Mechanics</h3>
<fieldset> <fieldset>
<div class="pure-control-group" title="Logical steps per mm of W travel."> <div class="pure-control-group" title="Logical steps per mm of axis travel.">
<label for="steps_per_mm">steps per mm</label> <label for="steps_per_mm">steps per mm</label>
<input id="steps_per_mm" type="number" bind:value={cfg.steps_per_mm} step="any" /> <input id="steps_per_mm" type="number" bind:value={cfg.steps_per_mm} step="any" />
<label for="" class="units">steps/mm</label> <label for="" class="units">steps/mm</label>
@@ -196,12 +198,12 @@
<div class="pure-control-group" title="Direction the axis moves when looking for the home limit switch."> <div class="pure-control-group" title="Direction the axis moves when looking for the home limit switch.">
<label for="home_dir">home direction</label> <label for="home_dir">home direction</label>
<select id="home_dir" bind:value={cfg.home_dir}> <select id="home_dir" bind:value={cfg.home_dir}>
<option value="-">- (toward W-)</option> <option value="-">- (toward A-)</option>
<option value="+">+ (toward W+)</option> <option value="+">+ (toward A+)</option>
</select> </select>
</div> </div>
<div class="pure-control-group" title="W position assigned when homing completes."> <div class="pure-control-group" title="Axis position assigned when homing completes.">
<label for="home_position_mm">home position</label> <label for="home_position_mm">home position</label>
<input id="home_position_mm" type="number" bind:value={cfg.home_position_mm} step="any" /> <input id="home_position_mm" type="number" bind:value={cfg.home_position_mm} step="any" />
<label for="" class="units">mm</label> <label for="" class="units">mm</label>
@@ -263,7 +265,7 @@
master <strong>Save</strong> button at the bottom of the master <strong>Save</strong> button at the bottom of the
settings rail. Homing rates and the limit polarity are settings rail. Homing rates and the limit polarity are
pushed to the ESP immediately; any running motion is pushed to the ESP immediately; any running motion is
unaffected. Re-home the W axis after changing direction, unaffected. Re-home the auxiliary axis after changing direction,
sign, or step settings. sign, or step settings.
</div> </div>
</div> </div>