Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
278586b
ODTC Sila, Codec, Connection Init
cmoscy Jan 26, 2026
1358d29
Consolidate classes, async commands and rquest_id handling
cmoscy Jan 26, 2026
92143c6
Add async command pattern: CommandExecution base class and MethodExec…
cmoscy Jan 26, 2026
813e569
Doc and test notebook
cmoscy Jan 26, 2026
d41c26a
States
cmoscy Jan 26, 2026
e8d3d3a
refactor(odtc): centralize response parsing and verify idle state aft…
cmoscy Jan 26, 2026
1f9417f
Formatting and notebook example
cmoscy Jan 27, 2026
ad1a6f2
feat: Add protocol management and temperature control to Inheco ODTC
cmoscy Jan 27, 2026
94b4315
Formatting and fluid quantity checking
cmoscy Jan 27, 2026
ade262d
Sila2 Style Command Lifecycle Management
cmoscy Feb 10, 2026
cb86ea3
ODTC: send_command vs start_command, get_method/list_methods, doc con…
cmoscy Feb 11, 2026
3b46ece
Align ODTC with the standard Thermocycler resource pattern (single entry
cmoscy Feb 12, 2026
2bb0fea
Merge branch 'PyLabRobot:main' into odtc
cmoscy Feb 12, 2026
44ab52a
Reconnect without Reset. Simulation Mode. Clean up Prints for tempera…
cmoscy Feb 13, 2026
b4ad920
Merge branch 'PyLabRobot:main' into odtc
cmoscy Feb 13, 2026
b94e165
Remove redundant notebook
cmoscy Feb 13, 2026
ea6ceae
Separate PreMethods vs Methods for Viewing. Display full protocol for…
cmoscy Feb 13, 2026
8371259
Checkpoint. Data Event handling and progress.
cmoscy Feb 13, 2026
ca8d579
Refactor. Comms reorganization and ODTC Method, Protocol, Config Cons…
cmoscy Feb 13, 2026
939e436
ODTCProtocol
cmoscy Feb 14, 2026
8d7ed52
Replaced StoredProtocol with ODTCProtocol
cmoscy Feb 14, 2026
4c5a61b
Progress Polling
cmoscy Feb 14, 2026
dc91515
Register execution ids for tracking
cmoscy Feb 14, 2026
ed389ec
Fix
cmoscy Feb 14, 2026
b35db2a
wait is __await__
cmoscy Feb 14, 2026
30a3d64
Remove prints
cmoscy Feb 14, 2026
3dda9fe
Centralize ODTCProtocol Lifecycle and Progress Reporting to ODTCProgr…
cmoscy Feb 15, 2026
fd07d35
Merge branch 'PyLabRobot:main' into odtc
cmoscy Feb 15, 2026
a824c92
Formatting
cmoscy Feb 15, 2026
ab4264a
Line Formatting
cmoscy Feb 15, 2026
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
36 changes: 34 additions & 2 deletions pylabrobot/thermocycling/backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,45 @@ async def deactivate_lid(self):
"""Deactivate thermocycler lid."""

@abstractmethod
async def run_protocol(self, protocol: Protocol, block_max_volume: float):
"""Execute thermocycler protocol run.
async def run_protocol(
self,
protocol: Protocol,
block_max_volume: float,
**kwargs,
):
"""Execute thermocycler protocol run (always non-blocking).

Starts the protocol and returns an execution handle immediately. To block
until completion, await the handle (e.g. await handle.wait()) or use
wait_for_profile_completion() on the thermocycler.

Args:
protocol: Protocol object containing stages with steps and repeats.
block_max_volume: Maximum block volume (µL) for safety.
**kwargs: Backend-specific options (e.g. ODTC accepts config=ODTCConfig).

Returns:
Execution handle (backend-specific; e.g. MethodExecution for ODTC), or
None for backends that do not return a handle. Caller can await
handle.wait() or use wait_for_profile_completion() to block until done.
"""

async def run_stored_protocol(self, name: str, wait: bool = False, **kwargs):
"""Execute a stored protocol by name (optional; backends that support it override).

Args:
name: Name of the stored protocol to run.
wait: If False (default), start and return an execution handle. If True,
block until done then return the (completed) handle.
**kwargs: Backend-specific options.

Returns:
Execution handle (backend-specific). Same as run_protocol.

Raises:
NotImplementedError: This backend does not support running stored protocols by name.
"""
raise NotImplementedError("This backend does not support running stored protocols by name.")

@abstractmethod
async def get_block_current_temperature(self) -> List[float]:
Expand Down
2 changes: 1 addition & 1 deletion pylabrobot/thermocycling/chatterbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ async def deactivate_lid(self):
print("Deactivating lid.")
self._state.lid_target = None

async def run_protocol(self, protocol: Protocol, block_max_volume: float):
async def run_protocol(self, protocol: Protocol, block_max_volume: float, **kwargs):
"""Run a protocol with stages and repeats."""
print("Running protocol:")

Expand Down
245 changes: 245 additions & 0 deletions pylabrobot/thermocycling/inheco/README.md

Large diffs are not rendered by default.

48 changes: 48 additions & 0 deletions pylabrobot/thermocycling/inheco/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""Inheco ODTC thermocycler implementation.

Preferred: use ODTCThermocycler (owns connection params and dimensions):

tc = ODTCThermocycler(
name="odtc1",
odtc_ip="192.168.1.100",
variant=384,
child_location=Coordinate.zero(),
)

Alternative: use generic Thermocycler with ODTCBackend (e.g. for custom backend):

backend = ODTCBackend(odtc_ip="192.168.1.100", variant=384)
tc = Thermocycler(
name="odtc1",
size_x=147,
size_y=298,
size_z=130,
backend=backend,
child_location=...,
)

Variant accepts 96, 384 or device codes (960000, 384000). Use tc.run_protocol(protocol,
block_max_volume) for in-memory protocols; tc.run_stored_protocol("my_pcr") for
stored-by-name (ODTC only).
"""

from .odtc_backend import ODTCBackend, ODTCExecution
from .odtc_model import ODTC_DIMENSIONS, ODTCProgress, ODTCProtocol, ProtocolList, normalize_variant
from .odtc_thermocycler import ODTCThermocycler

# Backward-compat aliases (single execution handle type)
CommandExecution = ODTCExecution
MethodExecution = ODTCExecution

__all__ = [
"CommandExecution",
"MethodExecution",
"ODTCBackend",
"ODTC_DIMENSIONS",
"ODTCExecution",
"ODTCProgress",
"ODTCProtocol",
"ODTCThermocycler",
"ProtocolList",
"normalize_variant",
]
Loading