Skip to content

feat(hamilton): add Prep device over TCP transport - #1196

Open
cmoscy wants to merge 13 commits into
PyLabRobot:mainfrom
cmoscy:hamilton-prep
Open

feat(hamilton): add Prep device over TCP transport#1196
cmoscy wants to merge 13 commits into
PyLabRobot:mainfrom
cmoscy:hamilton-prep

Conversation

@cmoscy

@cmoscy cmoscy commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Stacked on #1195.

Adds a plain Prep device on the Hamilton TCP transport (channels / head8 / gripper), plus PrepDeck, liquid-class resolver, shared tip/volume finalize helpers, and a basic demo wired into the Hamilton docs.

Resource-facing APIs (no LiquidHandler/Backend) are intentionally not included.

cmoscy added 12 commits August 8, 2026 15:43
Replace the thin post-PyLabRobot#1000 stub with the HOI/HARP session client, command
layer, wire types, and introspection stack so Prep/Nimbus can build on it.
Python 3.9 binds asyncio.Lock to the current loop at Socket construction, so
HamiltonTCPClient cannot be created in sync TestCase methods. Use
IsolatedAsyncioTestCase for those cases.
Plain Prep package with channels/head8/gripper over HamiltonTCPClient,
kwargs for LH params, local op types, PrepDeck, and liquid_class_resolver.
…pick

Expose resource-aware plate drop with deck reassignment, arm-level
pick_up_at_location, and optional resource_width on pick_up_resource so
notebooks no longer compute grip geometry by hand.
Delete prep/standard op dataclasses; peers take TipSpots/wells + vols with
kwargs instead of constructing op objects.
Queue intents before device commands and commit or roll back from
ChannelSuccesses so labware trackers stay consistent for deck and
visualizer updates without vendor-specific bookkeeping.
Replace private mounted-tip maps with TipTrackers and call shared
finalize after pick/drop and aspirate/dispense so spot, well, and
mount state update from command outcomes.
Move to mount XY at traverse height before PrepPickUpTool, matching
tip pickup, so tool engage does not swoop down from an arbitrary pose.
Show deck-rooted visualizer updates for tip spots and well fills, with
status prints for channel mount state during dual-channel transfer.
Capture tip/volume tracking through dual-channel and 8MPH sections, link
the notebook under Hamilton Prep docs, add channels volume-tracker coverage,
and apply ruff formatting on the related Prep modules.
Drop field(kw_only=...) (3.10+), default dest in __post_init__, and declare
dest on constructors that pass it. Also fix liquid-class test typing,
gripper mount isinstance, and head8 test formatting for CI.
Those investigation notebooks are not in the PR; listing them in conf.py
leaked local-only paths into shared docs config. Demo wiring stays via
hamilton/prep/index.md.
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.

1 participant