Skip to content

Add named device signals and reusable Python I/O skills - #54

Draft
Jepson2k wants to merge 20 commits into
feat/tcp-calibrationfrom
feat/named-device-signals
Draft

Jepson2k wants to merge 20 commits into
feat/tcp-calibrationfrom
feat/named-device-signals

Conversation

@Jepson2k

@Jepson2k Jepson2k commented Sep 7, 2026 •

Copy link
Copy Markdown
Owner

Name existing digital channels under Setup → Signals, then use the saved mappings from Python or insert a fixed call from the Skills panel. Saving a mapping does not write an output. Read and Write query the controller, with write readback confirmation and the existing browser control lease.

Reusable read_signal, wait_signal, and write_signal skills support both sync and async programs. Waits return typed matched/timeout outcomes; lost communication and unconfirmed writes remain errors. Cancellation requests the backend's existing Stop behavior. Preview requires an explicit constant SignalFixture and advances its simulated clock when a wait times out. A missing fixture stays visible as an unresolved editor diagnostic rather than an unexpected application error.

Validation: five Commander regression/browser checks passed, covering saved mapping/export, live read/write, timeout, cancellation, disconnection, generated Python insertion/run, and explicit-fixture preview workflows passed on PAROL6 fake serial. The named-signal UI and skills also passed against par6d --sim. Chromium layout verification used hardware WebGL on Raspberry Pi.

Stacked on #53. Coordinated branch: feat/named-device-signals. Requires the companion waldoctl and backend changes; dependency pins target waldoctl v0.16.0 and PAROL6 v0.10.0.

Companion PRs: ctl, p0, p6.

CI follow-ups: classify short final I/O reads correctly when Windows timers expire early; verify subdirectory programs by actually running them; recheck native completion before treating an idle automatic-calibration move as a Stop. The completion/Stop interleaving failed deterministically before the fix and passes with the full automatic-calibration workflow.

Program Stop now terminates the subprocess and sends a bounded native Stop before clearing the run state; unconfirmed stops remain errors. A real motion cancellation regression failed before the fix and passes along with a subsequent MCP-launched program. The UI cancellation test waits for native execution and the eventual result, and the signal browser test waits through tab transitions before clicking.

TCP settings now refresh each page from controller readback even when another page has already updated the shared calibration cache; this addresses stale inputs observed in macOS CI. The existing tool-change/reload workflow passes locally.

Signal controls use shorter labels and fit the compact Setup form. Pending signal mappings are included when saving the setup.

Screenshots — revised interface, PAROL6 and PAR6

Captured in Chromium on September 10 from the combined feature stack; shared panels may include later PRs. PAROL6 uses fake serial; PAR6 uses par6d --sim.

PAROL6 — saved signal mapping and controller readback.

PAROL6 — saved signal mapping and controller readback.

PAR6 — saved signal mapping and controller readback.

PAR6 — saved signal mapping and controller readback.

Jepson2k and others added 18 commits September 7, 2026 13:16
# Conflicts:
#	waldo_commander/components/named_setup.py
#	waldo_commander/components/skill_library.py
# Conflicts:
#	waldo_commander/components/skill_library.py
…ed-device-signals

# Conflicts:
#	waldo_commander/components/named_setup.py
The status broadcast already carries the digital I/O vector, so the wait
reads it there: a level is seen on the tick the controller publishes it,
with no poll interval between reads to cross and no query per poll. The
poll_interval and observation_timeout parameters are gone with the loop.

Silence stays distinguishable from a level that never arrived: a status
predicate that never runs means no broadcast reached the client, which
raises ConnectionError rather than reporting a timeout. A mapping the
controller's I/O layout no longer fits also still raises -- wait_status
logs a raising predicate and carries on, which would otherwise surface as
a timeout.

SKIP=ty: pre-existing DryRunRobotClient.skill_capabilities diagnostic.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rebinding a mapping saved for another arm changes the setup's signals
signature without changing any widget value, and only widget changes
refreshed the unsaved-edit indicator -- so Load took the no-dialog path and
discarded the rebinding silently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ed-device-signals

# Conflicts:
#	tests/test_handeye_panel_integration.py
#	waldo_commander/components/handeye_calibration.py
#	waldo_commander/components/skill_library.py
# Conflicts:
#	waldo_commander/components/skill_library.py
# Conflicts:
#	waldo_commander/components/skill_library.py
isinstance against the DryRunClient protocol resolves members statically
and never matches the preview wrapper or the skill guard; is_dry_run asks
the way a call would.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N8zt66KjkzgZLtQuSfJd9r

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants