Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
abc6bfb
test(api): liquid classes blowout properties (#17875)
y3rsh Mar 25, 2025
0ca4d00
fix(app): Fix blocking Flex LPC for OT-2 reasons (#17890)
mjhuff Mar 26, 2025
c0cb479
feat(hardware, api): Add a python-controlled tattle flag for resin ti…
ryanthecoder Mar 26, 2025
7d1f010
feat(shared-data): enable multi dispense blowout (#17895)
sanni-t Mar 27, 2025
e92d8ce
fix(app): Fix LPC not POSTing labware defs to the maintenance run (#1…
mjhuff Mar 27, 2025
3c6fb2b
fix(api): Estimating volume when liquid height is zero should return …
andySigler Mar 27, 2025
3222edc
chore(api,shared-data): update evotip definitions (#17907)
sfoster1 Mar 27, 2025
f424b78
fix(app): fix not applying offsets for locations containing modules (…
mjhuff Mar 27, 2025
f96192f
refactor(app): Add OT-2 LPC "skip" and immediately apply offsets (#17…
mjhuff Mar 27, 2025
456e6ac
chore: 8.4.0 alpha release notes (#17892)
emilyburghardt Mar 27, 2025
71a3a1c
fix(app): Fix ODD LPC labware selection (#17913)
mjhuff Mar 27, 2025
47e65d0
fix(app): Fix LPC offset tables not in sync (#17917)
mjhuff Mar 28, 2025
e1eac6f
fix(app): allow LPCing default offsets for 'stackingOnly' labware in…
mjhuff Mar 28, 2025
8ec0aa2
refactor(app): Drive device reset settings fully from client (#17921)
SyntaxColoring Mar 28, 2025
f427b14
fix(shared-data): fix multi dispense blowout flow rate values (#17904)
sanni-t Mar 28, 2025
d79a8fa
feat(api): add tip returning to distribute_liquid (#17920)
sanni-t Mar 28, 2025
8b5d76a
feat(app): Refactor labware details into labware & liquid details, ac…
smb2268 Mar 28, 2025
ecda6ca
feat(api): group together multiple wells for multi-channel transfers …
jbleon95 Mar 28, 2025
6e68ce2
fix(app): Do not LPC in staging area slots (#17926)
mjhuff Mar 28, 2025
e121992
chore(shared-data): show tiprack lid in LL (#17925)
sfoster1 Mar 28, 2025
b0d9f72
feat(app): Add default offset info banner to LPC (#17923)
mjhuff Mar 28, 2025
6187fb3
feat(app): Add an option to clear labware offsets (#17929)
SyntaxColoring Mar 30, 2025
016faab
feat(api): prepare for aspirate in air gap (#17919)
sfoster1 Mar 31, 2025
a84f4e1
fix(api): make the 8-channel evo pickup work (#17930)
sfoster1 Mar 31, 2025
562ca77
fix(hardware): handle usage responses better (#17942)
sfoster1 Mar 31, 2025
f134eb4
fix(app): Fix Desktop LPC "apply offsets" state (#17940)
mjhuff Mar 31, 2025
c0c9894
perf(robot-server): Optimize adding many offsets at once through `POS…
SyntaxColoring Apr 1, 2025
158c453
fix(app): do not infinitely jog during LPC (#17934)
mjhuff Apr 1, 2025
0bf9489
fix(app): remove display of offset vector in labware overlay on setup…
smb2268 Apr 1, 2025
5f4bcc0
chore: hardware CI workflows to 24.04 (#17956)
sfoster1 Apr 1, 2025
4d4a86a
refactor(app): Add testing for LPC flow hooks/utils (#17955)
mjhuff Apr 1, 2025
86a50e3
fix(api): do not move plunger in 96chan DTW (#17943)
sfoster1 Apr 1, 2025
c7ec93b
fix(api): dont crash subsystem manager with usage (#17954)
sfoster1 Apr 1, 2025
7afe1f1
fix(app): more robust custom labware validation (#17960)
jerader Apr 2, 2025
af501bb
fix(api): Liquid height at 0ul is 0mm not error (#17957)
andySigler Apr 2, 2025
bf44e16
fix(shared-data): no 20ul in default tipracks (#17963)
sfoster1 Apr 2, 2025
8e31989
fix(app): Fix local state issues when "resetting to default" in LPC (…
mjhuff Apr 2, 2025
4482fbe
fix(app): fix accumulating offsets on run record (#17969)
mjhuff Apr 2, 2025
9e89bc8
feat(robot-server,system-server): Return server timing metrics in HTT…
SyntaxColoring Apr 3, 2025
5f70a0f
fix(app): ER tip selection crashes when trying to get labware def (#1…
TamarZanzouri Apr 3, 2025
29245ca
feat(app): add inline notification when setting default offsets with …
mjhuff Apr 3, 2025
ed61606
feat(robot-server): Populate `locationSequence` on old runs and make …
SyntaxColoring Apr 3, 2025
eab3d0c
fix(app): fix applying offsets implicitly when navigating on the desk…
mjhuff Apr 3, 2025
46fd2bd
refactor(app): adjust width on "calibrate now" button (#17978)
mjhuff Apr 3, 2025
35ee5f5
fix(app): fix LPC disabled reasons not including fixture mismatch (#1…
mjhuff Apr 3, 2025
56b0229
fix(app): do not show post run drop tip prompt if just handled in Err…
mjhuff Apr 3, 2025
6346ce2
refactor(app): adjust protocol setup offsets table header (#17985)
mjhuff Apr 4, 2025
ca3d6af
fix(app): Labware setup UI fixes (#17987)
smb2268 Apr 4, 2025
d63a065
fix(shared-data): ethanol aspirate position reference (#17991)
sanni-t Apr 7, 2025
e762a98
fix(api, shared-data): Flex Stacker engine command optional fields (#…
ahiuchingau Apr 8, 2025
24f5cc5
feat(app, labware-library): add evotip definition assets (#18007)
jerader Apr 8, 2025
39ad078
refactor(api): change the names of liquid classes based transfers (#1…
sanni-t Apr 8, 2025
2bcadaa
merge chore_release-8.4.0 to edge
ahiuchingau Apr 8, 2025
ed44c50
fix command schema
ahiuchingau Apr 8, 2025
cfdf10b
oops
ahiuchingau Apr 8, 2025
91916fd
fix lint
ahiuchingau Apr 8, 2025
01d942f
Merge branch 'edge' into mergeback_release-8.4.0
ahiuchingau Apr 8, 2025
8d63591
docs(api): API reference entries for liquid class methods (#17887)
ecormany Apr 9, 2025
7b9af5d
chore(locize): sync translations (#18009)
y3rsh Apr 9, 2025
c0ae03e
chore(locize): sync for translations needed (#18009)
y3rsh Apr 9, 2025
bcb87f6
fix(api): make error message clearer for lld issues (#18005)
caila-marashaj Apr 9, 2025
c796d7b
re-merge
ahiuchingau Apr 9, 2025
388399a
fixup! re-merge
ahiuchingau Apr 9, 2025
1cfc194
Merge branch 'edge' into mergeback_release-8.4.0
ahiuchingau Apr 9, 2025
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
2 changes: 1 addition & 1 deletion .github/workflows/hardware-lint-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
lint-test:
name: 'hardware package linting and tests'
timeout-minutes: 20
runs-on: 'ubuntu-20.04'
runs-on: 'ubuntu-24.04'
steps:
- name: Checkout opentrons repo
uses: 'actions/checkout@v4'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/hardware-testing-protocols.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
lint-test:
name: 'hardware-testing protocols'
timeout-minutes: 20
runs-on: 'ubuntu-20.04'
runs-on: 'ubuntu-24.04'
steps:
- name: Checkout opentrons repo
uses: 'actions/checkout@v4'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/hardware-testing.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
lint-test:
name: 'hardware--testing package linting and tests'
timeout-minutes: 20
runs-on: 'ubuntu-20.04'
runs-on: 'ubuntu-24.04'
steps:
- name: Checkout opentrons repo
uses: 'actions/checkout@v4'
Expand Down
1 change: 1 addition & 0 deletions api/docs/v2/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,7 @@
("py:class", r".*protocol_api\.config.*"),
("py:class", r".*opentrons_shared_data.*"),
("py:class", r".*protocol_api._parameters.Parameters.*"),
("py:class", r".*protocol_api._liquid_properties.TransferProperties*"),
("py:class", r".*RobotContext"), # shh it's a secret (for now)
("py:class", r".*FlexStackerContext"), # ssh it's a secret (for now)
(
Expand Down
3 changes: 3 additions & 0 deletions api/docs/v2/new_protocol_api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ Wells and Liquids

.. autoclass:: opentrons.protocol_api.Liquid

.. autoclass:: opentrons.protocol_api.LiquidClass
:members:

.. _protocol-api-modules:

Modules
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class SubsystemManager:
_expected_core_targets: Set[FirmwareTarget]
_present_tools: tools.types.ToolSummary
_tool_task_condition: asyncio.Condition
_tool_task_state: Union[bool, Exception]
_tool_task_state: Union[bool, BaseException]
_updates_required: Dict[FirmwareTarget, FirmwareUpdateRequirements]
_updates_ongoing: Dict[SubSystem, UpdateStatus]
_update_bag: FirmwareUpdate
Expand Down Expand Up @@ -370,7 +370,8 @@ def update_state(status: UpdateStatus) -> None:
async def _tool_detection_task_main(self) -> None:
try:
await self._tool_detection_task_protected()
except Exception as e:
except BaseException as e:
log.exception("Tool reader task failed")
async with self._tool_task_condition:
self._tool_task_state = e
self._tool_task_condition.notify_all()
Expand Down Expand Up @@ -414,9 +415,7 @@ async def _tool_detection_task_protected(self) -> None:
)
self._present_tools = await self._tool_detector.resolve(to_resolve, 10.0)
log.info(f"Present tools are now {self._present_tools}")
await network.log_motor_usage_data(
self._can_messenger, list(set(base_can_nodes + [t for t in tool_nodes]))
)
await network.log_motor_usage_data(self._can_messenger)
async with self._tool_task_condition:
self._tool_task_state = True
self._tool_task_condition.notify_all()
Expand Down
8 changes: 4 additions & 4 deletions api/src/opentrons/protocol_api/core/engine/instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -1141,7 +1141,7 @@ def get_next_tip(
result.nextTipInfo if isinstance(result.nextTipInfo, NextTipInfo) else None
)

def transfer_liquid( # noqa: C901
def transfer_with_liquid_class( # noqa: C901
self,
liquid_class: LiquidClass,
volume: float,
Expand Down Expand Up @@ -1335,7 +1335,7 @@ def _pick_up_tip() -> WellCore:
_drop_tip()

# TODO(spp, 2025-02-25): wire up return tip
def distribute_liquid( # noqa: C901
def distribute_with_liquid_class( # noqa: C901
self,
liquid_class: LiquidClass,
volume: float,
Expand Down Expand Up @@ -1417,7 +1417,7 @@ def distribute_liquid( # noqa: C901
tip_working_volume=working_volume,
)
):
self.transfer_liquid(
self.transfer_with_liquid_class(
liquid_class=liquid_class,
volume=volume,
source=[source for _ in range(len(dest))],
Expand Down Expand Up @@ -1657,7 +1657,7 @@ def _tip_can_hold_volume_for_multi_dispensing(
<= tip_working_volume
)

def consolidate_liquid( # noqa: C901
def consolidate_with_liquid_class( # noqa: C901
self,
liquid_class: LiquidClass,
volume: float,
Expand Down
6 changes: 3 additions & 3 deletions api/src/opentrons/protocol_api/core/instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ def configure_nozzle_layout(
...

@abstractmethod
def transfer_liquid(
def transfer_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -374,7 +374,7 @@ def transfer_liquid(
...

@abstractmethod
def distribute_liquid(
def distribute_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -392,7 +392,7 @@ def distribute_liquid(
...

@abstractmethod
def consolidate_liquid(
def consolidate_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ def configure_nozzle_layout(
"""This will never be called because it was added in API 2.16."""
pass

def transfer_liquid(
def transfer_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -638,7 +638,7 @@ def transfer_liquid(
"""This will never be called because it was added in API 2.23"""
assert False, "transfer_liquid is not supported in legacy context"

def distribute_liquid(
def distribute_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -652,7 +652,7 @@ def distribute_liquid(
"""This will never be called because it was added in API 2.23"""
assert False, "distribute_liquid is not supported in legacy context"

def consolidate_liquid(
def consolidate_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ def configure_nozzle_layout(
"""This will never be called because it was added in API 2.15."""
pass

def transfer_liquid(
def transfer_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -527,7 +527,7 @@ def transfer_liquid(
"""This will never be called because it was added in API 2.23."""
assert False, "transfer_liquid is not supported in legacy context"

def distribute_liquid(
def distribute_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -541,7 +541,7 @@ def distribute_liquid(
"""This will never be called because it was added in API 2.23."""
assert False, "distribute_liquid is not supported in legacy context"

def consolidate_liquid(
def consolidate_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand Down
92 changes: 75 additions & 17 deletions api/src/opentrons/protocol_api/instrument_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -1509,7 +1509,7 @@ def _execute_transfer(self, plan: v1_transfer.TransferPlan) -> None:
getattr(self, cmd["method"])(*cmd["args"], **cmd["kwargs"])

@requires_version(2, 23)
def transfer_liquid(
def transfer_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -1526,11 +1526,32 @@ def transfer_liquid(
return_tip: bool = False,
visit_every_well: bool = False,
) -> InstrumentContext:
"""Transfer liquid from source to dest using the specified liquid class properties.
"""Move a particular type of liquid from one well or group of wells to another.

TODO: Add args description.
:param liquid_class: The type of liquid to move. You must specify the liquid class,
even if you have used :py:meth:`.load_liquid` to indicate what liquid the
source contains.
:type liquid_class: :py:class:`.LiquidClass`

:meta private:
:param volume: The amount, in µL, to aspirate from each source and dispense to
each destination.
:param source: A single well or a list of wells to aspirate liquid from.
:param dest: A single well or a list of wells to dispense liquid into.
:param new_tip: When to pick up and drop tips during the command.
Defaults to ``"once"``.

- ``"once"``: Use one tip for the entire command.
- ``"always"``: Use a new tip for each set of aspirate and dispense steps.
- ``"per source"``: Use one tip for each source well, even if
:ref:`tip refilling <complex-tip-refilling>` is required.
- ``"never"``: Do not pick up or drop tips at all.

See :ref:`param-tip-handling` for details.

:param trash_location: A trash container, well, or other location to dispose of
tips. Depending on the liquid class, the pipette may also blow out liquid here.
:param return_tip: Whether to drop used tips in their original locations
in the tip rack, instead of the trash.
"""
transfer_args = verify_and_normalize_transfer_args(
source=source,
Expand All @@ -1552,7 +1573,7 @@ def transfer_liquid(
" to transfer liquid onto one destinations from many sources, use 'consolidate_liquid'."
)

self._core.transfer_liquid(
self._core.transfer_with_liquid_class(
liquid_class=liquid_class,
volume=volume,
source=[
Expand All @@ -1574,7 +1595,7 @@ def transfer_liquid(
return self

@requires_version(2, 23)
def distribute_liquid(
def distribute_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -1590,12 +1611,30 @@ def distribute_liquid(
visit_every_well: bool = False,
) -> InstrumentContext:
"""
Distribute liquid from a single source to multiple destinations
using the specified liquid class properties.
Distribute a particular type of liquid from one well to a group of wells.

TODO: Add args description.
:param liquid_class: The type of liquid to move. You must specify the liquid class,
even if you have used :py:meth:`.load_liquid` to indicate what liquid the
source contains.
:type liquid_class: :py:class:`.LiquidClass`

:meta private:
:param volume: The amount, in µL, to aspirate from the source and dispense to
each destination.
:param source: A single well to aspirate liquid from.
:param dest: A list of wells to dispense liquid into.
:param new_tip: When to pick up and drop tips during the command.
Defaults to ``"once"``.

- ``"once"`` or ``"per source"``: Use one tip for the entire command.
- ``"always"``: Use a new tip for each set of aspirate and dispense steps.
- ``"never"``: Do not pick up or drop tips at all.

See :ref:`param-tip-handling` for details.

:param trash_location: A trash container, well, or other location to dispose of
tips. Depending on the liquid class, the pipette may also blow out liquid here.
:param return_tip: Whether to drop used tips in their original locations
in the tip rack, instead of the trash.
"""
transfer_args = verify_and_normalize_transfer_args(
source=source,
Expand All @@ -1621,7 +1660,7 @@ def distribute_liquid(
)

verified_source = transfer_args.sources_list[0]
self._core.distribute_liquid(
self._core.distribute_with_liquid_class(
liquid_class=liquid_class,
volume=volume,
source=(
Expand All @@ -1643,7 +1682,7 @@ def distribute_liquid(
return self

@requires_version(2, 23)
def consolidate_liquid(
def consolidate_with_liquid_class(
self,
liquid_class: LiquidClass,
volume: float,
Expand All @@ -1659,12 +1698,31 @@ def consolidate_liquid(
visit_every_well: bool = False,
) -> InstrumentContext:
"""
Consolidate liquid from multiple sources to a single destination
using the specified liquid class properties.
Consolidate a particular type of liquid from a group of wells to one well.

TODO: Add args description.
:param liquid_class: The type of liquid to move. You must specify the liquid class,
even if you have used :py:meth:`.load_liquid` to indicate what liquid the
source contains.
:type liquid_class: :py:class:`.LiquidClass`

:meta private:
:param volume: The amount, in µL, to aspirate from the source and dispense to
each destination.
:param source: A list of wells to aspirate liquid from.
:param dest: A single well to dispense liquid into.
:param new_tip: When to pick up and drop tips during the command.
Defaults to ``"once"``.

- ``"once"``: Use one tip for the entire command.
- ``"always"``: Use a new tip for each set of aspirate and dispense steps.
- ``"per source"``: Not available when consolidating.
- ``"never"``: Do not pick up or drop tips at all.

See :ref:`param-tip-handling` for details.

:param trash_location: A trash container, well, or other location to dispose of
tips. Depending on the liquid class, the pipette may also blow out liquid here.
:param return_tip: Whether to drop used tips in their original locations
in the tip rack, instead of the trash.
"""
transfer_args = verify_and_normalize_transfer_args(
source=source,
Expand All @@ -1690,7 +1748,7 @@ def consolidate_liquid(
)

verified_dest = transfer_args.destinations_list[0]
self._core.consolidate_liquid(
self._core.consolidate_with_liquid_class(
liquid_class=liquid_class,
volume=volume,
source=[
Expand Down
Loading
Loading