Settings rail: add W Axis entry; deploy scripts (local/hardware/prod)

UX
- The V09 redesign already exposed the W axis in the Control jog grid
  (row 4 when w.enabled) and as a row in the DRO table. The Settings
  shell now also surfaces a dedicated 'W Axis' rail entry that smooth-
  scrolls to the W Axis (auxcnc) section of the main settings page.
  The rail item is marked active only while the user is on Display &
  Units AND the W Axis link was the most recent click.
- The W Axis section in src/svelte-components/src/components/Settings
  View.svelte gets an id="w-axis" anchor so the scroll lands cleanly.

Tested live against onefinity.local. Aux status reports
{enabled: true, present: true, pos_mm: 43.96, homed: false}; the W
axis row appears in the DRO with the right purple styling, and the
jog row 4 shows W- / Home W / W+ / Probe.

Deploy scripts
- deploy.sh dispatches to scripts/deploy/{local,hardware,prod}.sh
  with shorthand wrappers (deploy-local.sh / deploy-hardware.sh /
  deploy-prod.sh).
- local: builds the UI bundle and serves build/http/ via
  python3 -m http.server 8770 in a tmux session 'onefin-local'.
  Useful for visual iteration on macOS — chrome only, no controller.
- hardware: rsyncs the freshly built build/http/ tree onto the Pi at
  onefinity.local and restarts bbctrl. Stages to /tmp on the Pi and
  uses sudo to install into the running egg's bbctrl/http directory,
  so iteration time is ~5 seconds.
- prod: requires a clean working tree, then runs 'make pkg' followed
  by 'make update HOST=onefinity.local PASSWORD=onefinity'.

Defaults can be overridden with environment variables (HOST, PASSWORD,
REMOTE_USER for the hardware path).
This commit is contained in:
2026-04-30 21:45:17 +02:00
parent b8c4f53bb1
commit ea23f94b87
10 changed files with 275 additions and 2 deletions

75
scripts/deploy/local.sh Executable file
View File

@@ -0,0 +1,75 @@
#!/bin/bash
# --- Local development (macOS) ---
#
# Builds the UI bundle and static-serves it on http://localhost:8770/.
# Runs in a named tmux session so we can iterate (re-running this script
# rebuilds and restarts the server in-place, you keep your browser tab).
#
# What you'll see:
# * The full V09 chrome (header tabs, settings rail, jog grid, DRO
# skeleton, status strip).
# * A "DISCONNECTED" overlay because there's no controller backend.
# * The W axis row in jog/DRO is hidden (correct: it appears only when
# the controller reports `aux_enabled = true`). To exercise the W
# axis end-to-end, deploy to the Pi (`./deploy.sh hardware`).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$SCRIPT_DIR"
echo "🛠 Building UI bundle..."
make build/http/index.html >/dev/null
PORT="${PORT:-8770}"
SESSION="onefin-local"
ensure_tmux_window() {
local session="$1"
local window="${2:-}"
local target="${session}${window:+:$window}"
if tmux has-session -t "$session" 2>/dev/null; then
if tmux send-keys -t "$target" "" 2>/dev/null; then
echo "🔁 Reusing tmux session '$session'..."
tmux send-keys -t "$target" C-c
sleep 1
return
fi
echo "⚠️ Dead pane in '$session', recreating..."
tmux kill-session -t "$session" 2>/dev/null
fi
echo "🆕 Creating tmux session '$session'..."
tmux new-session -d -s "$session"
}
ensure_tmux_window "$SESSION"
# Free the port if a previous run is still listening.
if lsof -iTCP:"$PORT" -sTCP:LISTEN >/dev/null 2>&1; then
echo "⚠️ Port $PORT is busy; killing previous server..."
lsof -tiTCP:"$PORT" -sTCP:LISTEN | xargs -r kill 2>/dev/null || true
sleep 1
fi
tmux send-keys -t "$SESSION" \
"cd '$SCRIPT_DIR' && python3 -m http.server --directory build/http $PORT" \
C-m
echo ""
echo "✅ Static UI server started on http://localhost:$PORT/"
echo ""
echo " Routes to try:"
echo " http://localhost:$PORT/#control"
echo " http://localhost:$PORT/#program"
echo " http://localhost:$PORT/#console"
echo " http://localhost:$PORT/#settings (Display & Units)"
echo " http://localhost:$PORT/#admin-network (WiFi / IP)"
echo " http://localhost:$PORT/#motor:0 (Motor 0 settings)"
echo ""
echo " tmux: tmux attach -t $SESSION"
echo " stop: tmux kill-session -t $SESSION"
echo ""
echo " No controller is running, so the page shows DISCONNECTED and"
echo " axis values stay empty. For live data + W axis, run:"
echo " ./deploy.sh hardware (fast: rsync build/http -> Pi)"
echo " ./deploy.sh prod (full firmware update)"