Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ UE = "UE"
commutated = "commutated"
commutating = "commutating"
DOUT = "DOUT"
LSI = "LSI"
LSO = "LSO"
SPP = "SPP"
inconsistence = "inconsistence"
mis = "mis"
RHE = "RHE"
Expand Down
15 changes: 15 additions & 0 deletions docs/api/pylabrobot.capabilities.rst
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,21 @@ Barcode Scanning
BarcodeScannerBackend


Plate Access
------------

.. currentmodule:: pylabrobot.capabilities.plate_access

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

PlateAccess
PlateAccessBackend
PlateAccessState


Microscopy
----------

Expand Down
29 changes: 29 additions & 0 deletions docs/api/pylabrobot.labcyte.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
.. currentmodule:: pylabrobot.labcyte

pylabrobot.labcyte package
==========================

Echo
----

.. currentmodule:: pylabrobot.labcyte.echo

.. autosummary::
:toctree: _autosummary
:nosignatures:
:recursive:

Echo
EchoDriver
EchoPlateMap
EchoInstrumentInfo
EchoSurveyParams
EchoSurveyWell
EchoSurveyData
EchoSurveyRunResult
EchoDryPlateMode
EchoDryPlateParams
EchoPlateAccessBackend
EchoError
EchoProtocolError
EchoCommandError
1 change: 1 addition & 0 deletions docs/api/pylabrobot.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ Manufacturers
pylabrobot.byonoy
pylabrobot.hamilton
pylabrobot.inheco
pylabrobot.labcyte
pylabrobot.liconic
pylabrobot.mettler_toledo
pylabrobot.molecular_devices
Expand Down
1 change: 1 addition & 0 deletions docs/user_guide/capabilities/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ loading-tray
pumping
weighing
barcode-scanning
plate-access
microscopy
automated-retrieval
absorbance
Expand Down
69 changes: 69 additions & 0 deletions docs/user_guide/capabilities/plate-access.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Plate Access

The plate access capability standardizes a narrow but common class of machine interactions:
locking an instrument, presenting an access path for the source or destination side, polling
access state, and closing the door afterwards.

This is useful for devices where the user-facing control surface is about getting hardware into
an accessible state rather than immediately running a transfer or assay.

## API

```python
from pylabrobot.capabilities.plate_access import PlateAccessState
```

Capability methods:

- `lock(app=None, owner=None)`
- `unlock()`
- `get_access_state()`
- `open_source_plate(timeout=30.0, poll_interval=0.1) -> PlateAccessState`
- `close_source_plate(plate_type=None, barcode_location=None, barcode="", timeout=30.0, poll_interval=0.1) -> PlateAccessState`
- `open_destination_plate(timeout=30.0, poll_interval=0.1) -> PlateAccessState`
- `close_destination_plate(plate_type=None, barcode_location=None, barcode="", timeout=30.0, poll_interval=0.1) -> PlateAccessState`
- `close_door(timeout=30.0, poll_interval=0.1) -> PlateAccessState`

`get_access_state()` returns a `PlateAccessState` with normalized fields for:

- source access open/closed
- destination access open/closed when the backend can infer them
- door open/closed
- source and destination plate position values when available
- a `raw` dictionary with the backend's native state payload

## Echo Example

```python
import asyncio

from pylabrobot.labcyte import Echo


async def main():
async with Echo(host="192.168.0.25") as echo:
info = await echo.get_instrument_info()
print(info.model, info.serial_number)

await echo.lock()
try:
baseline = await echo.get_access_state()
print("baseline:", baseline)

opened = await echo.open_source_plate(timeout=2.0)
print("opened:", opened)

retracted = await echo.close_source_plate(timeout=2.0)
print("retracted:", retracted)

closed = await echo.close_door(timeout=2.0)
print("closed:", closed)
finally:
await echo.unlock()


asyncio.run(main())
```

For the Echo integration, motion commands require an active lock. Read-only polling and
instrument info queries do not.
1 change: 1 addition & 0 deletions docs/user_guide/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ brooks/index
byonoy/index
hamilton/index
inheco/index
labcyte/index
liconic/index
mettler_toledo/index
molecular_devices/index
Expand Down
Loading