opentrons 8.2.0a4__py2.py3-none-any.whl → 8.3.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opentrons/calibration_storage/deck_configuration.py +3 -3
- opentrons/calibration_storage/file_operators.py +3 -3
- opentrons/calibration_storage/helpers.py +3 -1
- opentrons/calibration_storage/ot2/models/v1.py +16 -29
- opentrons/calibration_storage/ot2/tip_length.py +7 -4
- opentrons/calibration_storage/ot3/models/v1.py +14 -23
- opentrons/cli/analyze.py +18 -6
- opentrons/config/defaults_ot3.py +1 -0
- opentrons/drivers/asyncio/communication/__init__.py +2 -0
- opentrons/drivers/asyncio/communication/errors.py +16 -3
- opentrons/drivers/asyncio/communication/serial_connection.py +24 -9
- opentrons/drivers/command_builder.py +2 -2
- opentrons/drivers/flex_stacker/__init__.py +9 -0
- opentrons/drivers/flex_stacker/abstract.py +89 -0
- opentrons/drivers/flex_stacker/driver.py +260 -0
- opentrons/drivers/flex_stacker/simulator.py +109 -0
- opentrons/drivers/flex_stacker/types.py +138 -0
- opentrons/drivers/heater_shaker/driver.py +18 -3
- opentrons/drivers/temp_deck/driver.py +13 -3
- opentrons/drivers/thermocycler/driver.py +17 -3
- opentrons/execute.py +3 -1
- opentrons/hardware_control/__init__.py +1 -2
- opentrons/hardware_control/api.py +33 -21
- opentrons/hardware_control/backends/flex_protocol.py +17 -7
- opentrons/hardware_control/backends/ot3controller.py +213 -63
- opentrons/hardware_control/backends/ot3simulator.py +18 -9
- opentrons/hardware_control/backends/ot3utils.py +43 -15
- opentrons/hardware_control/dev_types.py +4 -0
- opentrons/hardware_control/emulation/heater_shaker.py +4 -0
- opentrons/hardware_control/emulation/module_server/client.py +1 -1
- opentrons/hardware_control/emulation/module_server/server.py +5 -3
- opentrons/hardware_control/emulation/settings.py +3 -4
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +2 -1
- opentrons/hardware_control/instruments/ot2/pipette.py +15 -22
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +8 -1
- opentrons/hardware_control/instruments/ot3/gripper.py +2 -2
- opentrons/hardware_control/instruments/ot3/pipette.py +23 -22
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +10 -1
- opentrons/hardware_control/modules/mod_abc.py +2 -2
- opentrons/hardware_control/motion_utilities.py +68 -0
- opentrons/hardware_control/nozzle_manager.py +39 -41
- opentrons/hardware_control/ot3_calibration.py +1 -1
- opentrons/hardware_control/ot3api.py +78 -31
- opentrons/hardware_control/protocols/gripper_controller.py +3 -0
- opentrons/hardware_control/protocols/hardware_manager.py +5 -1
- opentrons/hardware_control/protocols/liquid_handler.py +22 -1
- opentrons/hardware_control/protocols/motion_controller.py +7 -0
- opentrons/hardware_control/robot_calibration.py +1 -1
- opentrons/hardware_control/types.py +61 -0
- opentrons/legacy_commands/commands.py +37 -0
- opentrons/legacy_commands/types.py +39 -0
- opentrons/protocol_api/__init__.py +20 -1
- opentrons/protocol_api/_liquid.py +24 -49
- opentrons/protocol_api/_liquid_properties.py +754 -0
- opentrons/protocol_api/_types.py +24 -0
- opentrons/protocol_api/core/common.py +2 -0
- opentrons/protocol_api/core/engine/instrument.py +191 -10
- opentrons/protocol_api/core/engine/labware.py +29 -7
- opentrons/protocol_api/core/engine/protocol.py +130 -5
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/well.py +4 -1
- opentrons/protocol_api/core/instrument.py +73 -4
- opentrons/protocol_api/core/labware.py +13 -4
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +87 -3
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +13 -4
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +32 -1
- opentrons/protocol_api/core/legacy/legacy_robot_core.py +0 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +61 -3
- opentrons/protocol_api/core/protocol.py +34 -1
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/instrument_context.py +299 -44
- opentrons/protocol_api/labware.py +248 -9
- opentrons/protocol_api/module_contexts.py +21 -17
- opentrons/protocol_api/protocol_context.py +125 -4
- opentrons/protocol_api/robot_context.py +204 -32
- opentrons/protocol_api/validation.py +262 -3
- opentrons/protocol_engine/__init__.py +4 -0
- opentrons/protocol_engine/actions/actions.py +2 -3
- opentrons/protocol_engine/clients/sync_client.py +18 -0
- opentrons/protocol_engine/commands/__init__.py +121 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +1 -3
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +20 -6
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +1 -2
- opentrons/protocol_engine/commands/absorbance_reader/read.py +36 -10
- opentrons/protocol_engine/commands/air_gap_in_place.py +160 -0
- opentrons/protocol_engine/commands/aspirate.py +103 -53
- opentrons/protocol_engine/commands/aspirate_in_place.py +55 -51
- opentrons/protocol_engine/commands/blow_out.py +44 -39
- opentrons/protocol_engine/commands/blow_out_in_place.py +21 -32
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +13 -6
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +1 -1
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +3 -3
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +1 -1
- opentrons/protocol_engine/commands/command.py +73 -66
- opentrons/protocol_engine/commands/command_unions.py +140 -1
- opentrons/protocol_engine/commands/comment.py +1 -1
- opentrons/protocol_engine/commands/configure_for_volume.py +10 -3
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +6 -4
- opentrons/protocol_engine/commands/custom.py +6 -12
- opentrons/protocol_engine/commands/dispense.py +82 -48
- opentrons/protocol_engine/commands/dispense_in_place.py +71 -51
- opentrons/protocol_engine/commands/drop_tip.py +52 -31
- opentrons/protocol_engine/commands/drop_tip_in_place.py +79 -8
- opentrons/protocol_engine/commands/evotip_dispense.py +156 -0
- opentrons/protocol_engine/commands/evotip_seal_pipette.py +331 -0
- opentrons/protocol_engine/commands/evotip_unseal_pipette.py +160 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +4 -11
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +10 -4
- opentrons/protocol_engine/commands/home.py +13 -4
- opentrons/protocol_engine/commands/liquid_probe.py +125 -31
- opentrons/protocol_engine/commands/load_labware.py +33 -6
- opentrons/protocol_engine/commands/load_lid.py +146 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +189 -0
- opentrons/protocol_engine/commands/load_liquid.py +12 -4
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +31 -10
- opentrons/protocol_engine/commands/load_pipette.py +19 -8
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +1 -1
- opentrons/protocol_engine/commands/magnetic_module/engage.py +1 -1
- opentrons/protocol_engine/commands/move_labware.py +28 -6
- opentrons/protocol_engine/commands/move_relative.py +35 -25
- opentrons/protocol_engine/commands/move_to_addressable_area.py +40 -27
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +53 -32
- opentrons/protocol_engine/commands/move_to_coordinates.py +36 -22
- opentrons/protocol_engine/commands/move_to_well.py +40 -24
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +49 -27
- opentrons/protocol_engine/commands/pipetting_common.py +169 -87
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +24 -33
- opentrons/protocol_engine/commands/reload_labware.py +1 -1
- opentrons/protocol_engine/commands/retract_axis.py +1 -1
- opentrons/protocol_engine/commands/robot/__init__.py +69 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +77 -0
- opentrons/protocol_engine/commands/save_position.py +14 -5
- opentrons/protocol_engine/commands/set_rail_lights.py +1 -1
- opentrons/protocol_engine/commands/set_status_bar.py +1 -1
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +1 -1
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +1 -1
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +10 -4
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +9 -3
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +9 -3
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +11 -4
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +1 -1
- opentrons/protocol_engine/commands/touch_tip.py +65 -16
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +5 -2
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +13 -4
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +2 -5
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +1 -1
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +1 -1
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +2 -5
- opentrons/protocol_engine/commands/verify_tip_presence.py +11 -4
- opentrons/protocol_engine/commands/wait_for_duration.py +10 -3
- opentrons/protocol_engine/commands/wait_for_resume.py +10 -3
- opentrons/protocol_engine/errors/__init__.py +12 -0
- opentrons/protocol_engine/errors/error_occurrence.py +19 -20
- opentrons/protocol_engine/errors/exceptions.py +76 -0
- opentrons/protocol_engine/execution/command_executor.py +1 -1
- opentrons/protocol_engine/execution/equipment.py +73 -5
- opentrons/protocol_engine/execution/gantry_mover.py +369 -8
- opentrons/protocol_engine/execution/hardware_stopper.py +7 -7
- opentrons/protocol_engine/execution/movement.py +27 -0
- opentrons/protocol_engine/execution/pipetting.py +5 -1
- opentrons/protocol_engine/execution/tip_handler.py +34 -15
- opentrons/protocol_engine/notes/notes.py +1 -1
- opentrons/protocol_engine/protocol_engine.py +7 -6
- opentrons/protocol_engine/resources/labware_data_provider.py +1 -1
- opentrons/protocol_engine/resources/labware_validation.py +18 -0
- opentrons/protocol_engine/resources/module_data_provider.py +1 -1
- opentrons/protocol_engine/resources/pipette_data_provider.py +26 -0
- opentrons/protocol_engine/slot_standardization.py +9 -9
- opentrons/protocol_engine/state/_move_types.py +9 -5
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +25 -61
- opentrons/protocol_engine/state/command_history.py +12 -0
- opentrons/protocol_engine/state/commands.py +22 -14
- opentrons/protocol_engine/state/files.py +10 -12
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/frustum_helpers.py +63 -69
- opentrons/protocol_engine/state/geometry.py +47 -1
- opentrons/protocol_engine/state/labware.py +92 -26
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +16 -4
- opentrons/protocol_engine/state/modules.py +52 -70
- opentrons/protocol_engine/state/motion.py +6 -1
- opentrons/protocol_engine/state/pipettes.py +149 -58
- opentrons/protocol_engine/state/state.py +21 -2
- opentrons/protocol_engine/state/state_summary.py +4 -2
- opentrons/protocol_engine/state/tips.py +11 -44
- opentrons/protocol_engine/state/update_types.py +343 -48
- opentrons/protocol_engine/state/wells.py +19 -11
- opentrons/protocol_engine/types.py +176 -28
- opentrons/protocol_reader/extract_labware_definitions.py +5 -2
- opentrons/protocol_reader/file_format_validator.py +5 -5
- opentrons/protocol_runner/json_file_reader.py +9 -3
- opentrons/protocol_runner/json_translator.py +51 -25
- opentrons/protocol_runner/legacy_command_mapper.py +66 -64
- opentrons/protocol_runner/protocol_runner.py +35 -4
- opentrons/protocol_runner/python_protocol_wrappers.py +1 -1
- opentrons/protocol_runner/run_orchestrator.py +13 -3
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +1 -1
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +56 -0
- opentrons/protocols/advanced_control/{transfers.py → transfers/transfer.py} +10 -85
- opentrons/protocols/api_support/definitions.py +1 -1
- opentrons/protocols/api_support/instrument.py +1 -1
- opentrons/protocols/api_support/util.py +10 -0
- opentrons/protocols/labware.py +70 -8
- opentrons/protocols/models/json_protocol.py +5 -9
- opentrons/simulate.py +3 -1
- opentrons/types.py +162 -2
- opentrons/util/entrypoint_util.py +2 -5
- opentrons/util/logging_config.py +1 -1
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0.dist-info}/METADATA +16 -15
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0.dist-info}/RECORD +238 -208
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0.dist-info}/WHEEL +1 -1
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0.dist-info}/LICENSE +0 -0
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0.dist-info}/entry_points.txt +0 -0
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0.dist-info}/top_level.txt +0 -0
|
@@ -20,6 +20,7 @@ from . import temperature_module
|
|
|
20
20
|
from . import thermocycler
|
|
21
21
|
from . import calibration
|
|
22
22
|
from . import unsafe
|
|
23
|
+
from . import robot
|
|
23
24
|
|
|
24
25
|
from .hash_command_params import hash_protocol_command_params
|
|
25
26
|
from .generate_command_schema import generate_command_schema
|
|
@@ -34,13 +35,23 @@ from .command import (
|
|
|
34
35
|
|
|
35
36
|
from .command_unions import (
|
|
36
37
|
Command,
|
|
38
|
+
CommandAdapter,
|
|
37
39
|
CommandParams,
|
|
38
40
|
CommandCreate,
|
|
41
|
+
CommandCreateAdapter,
|
|
39
42
|
CommandResult,
|
|
40
43
|
CommandType,
|
|
41
44
|
CommandDefinedErrorData,
|
|
42
45
|
)
|
|
43
46
|
|
|
47
|
+
from .air_gap_in_place import (
|
|
48
|
+
AirGapInPlace,
|
|
49
|
+
AirGapInPlaceParams,
|
|
50
|
+
AirGapInPlaceCreate,
|
|
51
|
+
AirGapInPlaceResult,
|
|
52
|
+
AirGapInPlaceCommandType,
|
|
53
|
+
)
|
|
54
|
+
|
|
44
55
|
from .aspirate import (
|
|
45
56
|
Aspirate,
|
|
46
57
|
AspirateParams,
|
|
@@ -138,6 +149,15 @@ from .load_liquid import (
|
|
|
138
149
|
LoadLiquidImplementation,
|
|
139
150
|
)
|
|
140
151
|
|
|
152
|
+
from .load_liquid_class import (
|
|
153
|
+
LoadLiquidClass,
|
|
154
|
+
LoadLiquidClassParams,
|
|
155
|
+
LoadLiquidClassCreate,
|
|
156
|
+
LoadLiquidClassResult,
|
|
157
|
+
LoadLiquidClassCommandType,
|
|
158
|
+
LoadLiquidClassImplementation,
|
|
159
|
+
)
|
|
160
|
+
|
|
141
161
|
from .load_module import (
|
|
142
162
|
LoadModule,
|
|
143
163
|
LoadModuleParams,
|
|
@@ -154,6 +174,22 @@ from .load_pipette import (
|
|
|
154
174
|
LoadPipetteCommandType,
|
|
155
175
|
)
|
|
156
176
|
|
|
177
|
+
from .load_lid_stack import (
|
|
178
|
+
LoadLidStack,
|
|
179
|
+
LoadLidStackParams,
|
|
180
|
+
LoadLidStackCreate,
|
|
181
|
+
LoadLidStackResult,
|
|
182
|
+
LoadLidStackCommandType,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
from .load_lid import (
|
|
186
|
+
LoadLid,
|
|
187
|
+
LoadLidParams,
|
|
188
|
+
LoadLidCreate,
|
|
189
|
+
LoadLidResult,
|
|
190
|
+
LoadLidCommandType,
|
|
191
|
+
)
|
|
192
|
+
|
|
157
193
|
from .move_labware import (
|
|
158
194
|
MoveLabware,
|
|
159
195
|
MoveLabwareParams,
|
|
@@ -323,6 +359,14 @@ from .verify_tip_presence import (
|
|
|
323
359
|
VerifyTipPresenceCommandType,
|
|
324
360
|
)
|
|
325
361
|
|
|
362
|
+
from .get_next_tip import (
|
|
363
|
+
GetNextTip,
|
|
364
|
+
GetNextTipCreate,
|
|
365
|
+
GetNextTipParams,
|
|
366
|
+
GetNextTipResult,
|
|
367
|
+
GetNextTipCommandType,
|
|
368
|
+
)
|
|
369
|
+
|
|
326
370
|
from .liquid_probe import (
|
|
327
371
|
LiquidProbe,
|
|
328
372
|
LiquidProbeParams,
|
|
@@ -336,11 +380,35 @@ from .liquid_probe import (
|
|
|
336
380
|
TryLiquidProbeCommandType,
|
|
337
381
|
)
|
|
338
382
|
|
|
383
|
+
from .evotip_seal_pipette import (
|
|
384
|
+
EvotipSealPipette,
|
|
385
|
+
EvotipSealPipetteParams,
|
|
386
|
+
EvotipSealPipetteCreate,
|
|
387
|
+
EvotipSealPipetteResult,
|
|
388
|
+
EvotipSealPipetteCommandType,
|
|
389
|
+
)
|
|
390
|
+
from .evotip_unseal_pipette import (
|
|
391
|
+
EvotipUnsealPipette,
|
|
392
|
+
EvotipUnsealPipetteParams,
|
|
393
|
+
EvotipUnsealPipetteCreate,
|
|
394
|
+
EvotipUnsealPipetteResult,
|
|
395
|
+
EvotipUnsealPipetteCommandType,
|
|
396
|
+
)
|
|
397
|
+
from .evotip_dispense import (
|
|
398
|
+
EvotipDispense,
|
|
399
|
+
EvotipDispenseParams,
|
|
400
|
+
EvotipDispenseCreate,
|
|
401
|
+
EvotipDispenseResult,
|
|
402
|
+
EvotipDispenseCommandType,
|
|
403
|
+
)
|
|
404
|
+
|
|
339
405
|
__all__ = [
|
|
340
406
|
# command type unions
|
|
341
407
|
"Command",
|
|
408
|
+
"CommandAdapter",
|
|
342
409
|
"CommandParams",
|
|
343
410
|
"CommandCreate",
|
|
411
|
+
"CommandCreateAdapter",
|
|
344
412
|
"CommandResult",
|
|
345
413
|
"CommandType",
|
|
346
414
|
"CommandPrivateResult",
|
|
@@ -355,6 +423,12 @@ __all__ = [
|
|
|
355
423
|
"hash_protocol_command_params",
|
|
356
424
|
# command schema generation
|
|
357
425
|
"generate_command_schema",
|
|
426
|
+
# air gap command models
|
|
427
|
+
"AirGapInPlace",
|
|
428
|
+
"AirGapInPlaceCreate",
|
|
429
|
+
"AirGapInPlaceParams",
|
|
430
|
+
"AirGapInPlaceResult",
|
|
431
|
+
"AirGapInPlaceCommandType",
|
|
358
432
|
# aspirate command models
|
|
359
433
|
"Aspirate",
|
|
360
434
|
"AspirateCreate",
|
|
@@ -440,6 +514,20 @@ __all__ = [
|
|
|
440
514
|
"LoadPipetteResult",
|
|
441
515
|
"LoadPipetteCommandType",
|
|
442
516
|
"LoadPipettePrivateResult",
|
|
517
|
+
# load lid stack command models
|
|
518
|
+
"LoadLidStack",
|
|
519
|
+
"LoadLidStackCreate",
|
|
520
|
+
"LoadLidStackParams",
|
|
521
|
+
"LoadLidStackResult",
|
|
522
|
+
"LoadLidStackCommandType",
|
|
523
|
+
"LoadLidStackPrivateResult",
|
|
524
|
+
# load lid command models
|
|
525
|
+
"LoadLid",
|
|
526
|
+
"LoadLidCreate",
|
|
527
|
+
"LoadLidParams",
|
|
528
|
+
"LoadLidResult",
|
|
529
|
+
"LoadLidCommandType",
|
|
530
|
+
"LoadLidPrivateResult",
|
|
443
531
|
# move labware command models
|
|
444
532
|
"MoveLabware",
|
|
445
533
|
"MoveLabwareCreate",
|
|
@@ -538,6 +626,14 @@ __all__ = [
|
|
|
538
626
|
"LoadLiquidParams",
|
|
539
627
|
"LoadLiquidResult",
|
|
540
628
|
"LoadLiquidCommandType",
|
|
629
|
+
# load liquid class command models
|
|
630
|
+
"LoadLiquidClass",
|
|
631
|
+
"LoadLiquidClassParams",
|
|
632
|
+
"LoadLiquidClassCreate",
|
|
633
|
+
"LoadLiquidClassResult",
|
|
634
|
+
"LoadLiquidClassImplementation",
|
|
635
|
+
"LoadLiquidClassCommandType",
|
|
636
|
+
# hardware control command models
|
|
541
637
|
# hardware module command bundles
|
|
542
638
|
"absorbance_reader",
|
|
543
639
|
"heater_shaker",
|
|
@@ -548,6 +644,7 @@ __all__ = [
|
|
|
548
644
|
"calibration",
|
|
549
645
|
# unsafe command bundle
|
|
550
646
|
"unsafe",
|
|
647
|
+
"robot",
|
|
551
648
|
# configure pipette volume command bundle
|
|
552
649
|
"ConfigureForVolume",
|
|
553
650
|
"ConfigureForVolumeCreate",
|
|
@@ -578,6 +675,12 @@ __all__ = [
|
|
|
578
675
|
"VerifyTipPresenceParams",
|
|
579
676
|
"VerifyTipPresenceResult",
|
|
580
677
|
"VerifyTipPresenceCommandType",
|
|
678
|
+
# get next tip command bundle
|
|
679
|
+
"GetNextTip",
|
|
680
|
+
"GetNextTipCreate",
|
|
681
|
+
"GetNextTipParams",
|
|
682
|
+
"GetNextTipResult",
|
|
683
|
+
"GetNextTipCommandType",
|
|
581
684
|
# liquid probe command bundle
|
|
582
685
|
"LiquidProbe",
|
|
583
686
|
"LiquidProbeParams",
|
|
@@ -589,4 +692,22 @@ __all__ = [
|
|
|
589
692
|
"TryLiquidProbeCreate",
|
|
590
693
|
"TryLiquidProbeResult",
|
|
591
694
|
"TryLiquidProbeCommandType",
|
|
695
|
+
# evotip seal command bundle
|
|
696
|
+
"EvotipSealPipette",
|
|
697
|
+
"EvotipSealPipetteParams",
|
|
698
|
+
"EvotipSealPipetteCreate",
|
|
699
|
+
"EvotipSealPipetteResult",
|
|
700
|
+
"EvotipSealPipetteCommandType",
|
|
701
|
+
# evotip unseal command bundle
|
|
702
|
+
"EvotipUnsealPipette",
|
|
703
|
+
"EvotipUnsealPipetteParams",
|
|
704
|
+
"EvotipUnsealPipetteCreate",
|
|
705
|
+
"EvotipUnsealPipetteResult",
|
|
706
|
+
"EvotipUnsealPipetteCommandType",
|
|
707
|
+
# evotip dispense command bundle
|
|
708
|
+
"EvotipDispense",
|
|
709
|
+
"EvotipDispenseParams",
|
|
710
|
+
"EvotipDispenseCreate",
|
|
711
|
+
"EvotipDispenseResult",
|
|
712
|
+
"EvotipDispenseCommandType",
|
|
592
713
|
]
|
|
@@ -60,7 +60,6 @@ class CloseLidImpl(AbstractCommandImpl[CloseLidParams, SuccessData[CloseLidResul
|
|
|
60
60
|
hardware_lid_status = AbsorbanceReaderLidStatus.OFF
|
|
61
61
|
if not self._state_view.config.use_virtual_modules:
|
|
62
62
|
abs_reader = self._equipment.get_module_hardware_api(mod_substate.module_id)
|
|
63
|
-
|
|
64
63
|
if abs_reader is not None:
|
|
65
64
|
hardware_lid_status = await abs_reader.get_current_lid_status()
|
|
66
65
|
else:
|
|
@@ -95,7 +94,6 @@ class CloseLidImpl(AbstractCommandImpl[CloseLidParams, SuccessData[CloseLidResul
|
|
|
95
94
|
deck_slot=self._state_view.modules.get_location(
|
|
96
95
|
params.moduleId
|
|
97
96
|
).slotName,
|
|
98
|
-
deck_type=self._state_view.config.deck_type,
|
|
99
97
|
model=absorbance_model,
|
|
100
98
|
)
|
|
101
99
|
)
|
|
@@ -134,7 +132,7 @@ class CloseLid(BaseCommand[CloseLidParams, CloseLidResult, ErrorOccurrence]):
|
|
|
134
132
|
|
|
135
133
|
commandType: CloseLidCommandType = "absorbanceReader/closeLid"
|
|
136
134
|
params: CloseLidParams
|
|
137
|
-
result: Optional[CloseLidResult]
|
|
135
|
+
result: Optional[CloseLidResult] = None
|
|
138
136
|
|
|
139
137
|
_ImplementationCls: Type[CloseLidImpl] = CloseLidImpl
|
|
140
138
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Command models to initialize an Absorbance Reader."""
|
|
2
2
|
from __future__ import annotations
|
|
3
|
-
from typing import List, Optional, Literal, TYPE_CHECKING
|
|
3
|
+
from typing import List, Optional, Literal, TYPE_CHECKING, Any
|
|
4
4
|
from typing_extensions import Type
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
7
8
|
|
|
8
9
|
from opentrons.drivers.types import ABSMeasurementMode
|
|
9
10
|
from opentrons.protocol_engine.types import ABSMeasureMode
|
|
@@ -11,6 +12,7 @@ from opentrons.protocol_engine.types import ABSMeasureMode
|
|
|
11
12
|
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
12
13
|
from ...errors.error_occurrence import ErrorOccurrence
|
|
13
14
|
from ...errors import InvalidWavelengthError
|
|
15
|
+
from ...state import update_types
|
|
14
16
|
|
|
15
17
|
if TYPE_CHECKING:
|
|
16
18
|
from opentrons.protocol_engine.state.state import StateView
|
|
@@ -20,6 +22,10 @@ if TYPE_CHECKING:
|
|
|
20
22
|
InitializeCommandType = Literal["absorbanceReader/initialize"]
|
|
21
23
|
|
|
22
24
|
|
|
25
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
26
|
+
s.pop("default", None)
|
|
27
|
+
|
|
28
|
+
|
|
23
29
|
class InitializeParams(BaseModel):
|
|
24
30
|
"""Input parameters to initialize an absorbance reading."""
|
|
25
31
|
|
|
@@ -28,8 +34,10 @@ class InitializeParams(BaseModel):
|
|
|
28
34
|
..., description="Initialize single or multi measurement mode."
|
|
29
35
|
)
|
|
30
36
|
sampleWavelengths: List[int] = Field(..., description="Sample wavelengths in nm.")
|
|
31
|
-
referenceWavelength:
|
|
32
|
-
None,
|
|
37
|
+
referenceWavelength: int | SkipJsonSchema[None] = Field(
|
|
38
|
+
None,
|
|
39
|
+
description="Optional reference wavelength in nm.",
|
|
40
|
+
json_schema_extra=_remove_default,
|
|
33
41
|
)
|
|
34
42
|
|
|
35
43
|
|
|
@@ -53,6 +61,7 @@ class InitializeImpl(
|
|
|
53
61
|
|
|
54
62
|
async def execute(self, params: InitializeParams) -> SuccessData[InitializeResult]:
|
|
55
63
|
"""Initiate a single absorbance measurement."""
|
|
64
|
+
state_update = update_types.StateUpdate()
|
|
56
65
|
abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate(
|
|
57
66
|
module_id=params.moduleId
|
|
58
67
|
)
|
|
@@ -113,17 +122,22 @@ class InitializeImpl(
|
|
|
113
122
|
reference_wavelength=params.referenceWavelength,
|
|
114
123
|
)
|
|
115
124
|
|
|
116
|
-
|
|
117
|
-
|
|
125
|
+
state_update.initialize_absorbance_reader(
|
|
126
|
+
abs_reader_substate.module_id,
|
|
127
|
+
params.measureMode,
|
|
128
|
+
params.sampleWavelengths,
|
|
129
|
+
params.referenceWavelength,
|
|
118
130
|
)
|
|
119
131
|
|
|
132
|
+
return SuccessData(public=InitializeResult(), state_update=state_update)
|
|
133
|
+
|
|
120
134
|
|
|
121
135
|
class Initialize(BaseCommand[InitializeParams, InitializeResult, ErrorOccurrence]):
|
|
122
136
|
"""A command to initialize an Absorbance Reader."""
|
|
123
137
|
|
|
124
138
|
commandType: InitializeCommandType = "absorbanceReader/initialize"
|
|
125
139
|
params: InitializeParams
|
|
126
|
-
result: Optional[InitializeResult]
|
|
140
|
+
result: Optional[InitializeResult] = None
|
|
127
141
|
|
|
128
142
|
_ImplementationCls: Type[InitializeImpl] = InitializeImpl
|
|
129
143
|
|
|
@@ -91,7 +91,6 @@ class OpenLidImpl(AbstractCommandImpl[OpenLidParams, SuccessData[OpenLidResult]]
|
|
|
91
91
|
deck_slot=self._state_view.modules.get_location(
|
|
92
92
|
params.moduleId
|
|
93
93
|
).slotName,
|
|
94
|
-
deck_type=self._state_view.config.deck_type,
|
|
95
94
|
model=absorbance_model,
|
|
96
95
|
)
|
|
97
96
|
)
|
|
@@ -134,7 +133,7 @@ class OpenLid(BaseCommand[OpenLidParams, OpenLidResult, ErrorOccurrence]):
|
|
|
134
133
|
|
|
135
134
|
commandType: OpenLidCommandType = "absorbanceReader/openLid"
|
|
136
135
|
params: OpenLidParams
|
|
137
|
-
result: Optional[OpenLidResult]
|
|
136
|
+
result: Optional[OpenLidResult] = None
|
|
138
137
|
|
|
139
138
|
_ImplementationCls: Type[OpenLidImpl] = OpenLidImpl
|
|
140
139
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"""Command models to read absorbance."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
from typing import Optional, Dict, TYPE_CHECKING, List
|
|
5
|
-
from typing_extensions import Literal, Type
|
|
4
|
+
from typing import Optional, Dict, TYPE_CHECKING, List, Any
|
|
6
5
|
|
|
6
|
+
from typing_extensions import Literal, Type
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
9
|
|
|
9
10
|
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
10
11
|
from ...errors import CannotPerformModuleAction, StorageLimitReachedError
|
|
@@ -16,12 +17,17 @@ from ...resources.file_provider import (
|
|
|
16
17
|
MAXIMUM_CSV_FILE_LIMIT,
|
|
17
18
|
)
|
|
18
19
|
from ...resources import FileProvider
|
|
20
|
+
from ...state import update_types
|
|
19
21
|
|
|
20
22
|
if TYPE_CHECKING:
|
|
21
23
|
from opentrons.protocol_engine.state.state import StateView
|
|
22
24
|
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
23
25
|
|
|
24
26
|
|
|
27
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
28
|
+
s.pop("default", None)
|
|
29
|
+
|
|
30
|
+
|
|
25
31
|
ReadAbsorbanceCommandType = Literal["absorbanceReader/read"]
|
|
26
32
|
|
|
27
33
|
|
|
@@ -29,9 +35,10 @@ class ReadAbsorbanceParams(BaseModel):
|
|
|
29
35
|
"""Input parameters for an absorbance reading."""
|
|
30
36
|
|
|
31
37
|
moduleId: str = Field(..., description="Unique ID of the Absorbance Reader.")
|
|
32
|
-
fileName:
|
|
38
|
+
fileName: str | SkipJsonSchema[None] = Field(
|
|
33
39
|
None,
|
|
34
40
|
description="Optional file name to use when storing the results of a measurement.",
|
|
41
|
+
json_schema_extra=_remove_default,
|
|
35
42
|
)
|
|
36
43
|
|
|
37
44
|
|
|
@@ -67,6 +74,7 @@ class ReadAbsorbanceImpl(
|
|
|
67
74
|
self, params: ReadAbsorbanceParams
|
|
68
75
|
) -> SuccessData[ReadAbsorbanceResult]:
|
|
69
76
|
"""Initiate an absorbance measurement."""
|
|
77
|
+
state_update = update_types.StateUpdate()
|
|
70
78
|
abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate(
|
|
71
79
|
module_id=params.moduleId
|
|
72
80
|
)
|
|
@@ -117,7 +125,9 @@ class ReadAbsorbanceImpl(
|
|
|
117
125
|
)
|
|
118
126
|
asbsorbance_result[wavelength] = converted_values
|
|
119
127
|
transform_results.append(
|
|
120
|
-
ReadData.
|
|
128
|
+
ReadData.model_construct(
|
|
129
|
+
wavelength=wavelength, data=converted_values
|
|
130
|
+
)
|
|
121
131
|
)
|
|
122
132
|
# Handle the virtual module case for data creation (all zeroes)
|
|
123
133
|
elif self._state_view.config.use_virtual_modules:
|
|
@@ -131,22 +141,27 @@ class ReadAbsorbanceImpl(
|
|
|
131
141
|
)
|
|
132
142
|
asbsorbance_result[wavelength] = converted_values
|
|
133
143
|
transform_results.append(
|
|
134
|
-
ReadData.
|
|
144
|
+
ReadData.model_construct(
|
|
145
|
+
wavelength=wavelength, data=converted_values
|
|
146
|
+
)
|
|
135
147
|
)
|
|
136
148
|
else:
|
|
137
149
|
raise CannotPerformModuleAction(
|
|
138
150
|
"Plate Reader data cannot be requested with a module that has not been initialized."
|
|
139
151
|
)
|
|
140
152
|
|
|
153
|
+
state_update.set_absorbance_reader_data(
|
|
154
|
+
module_id=abs_reader_substate.module_id, read_result=asbsorbance_result
|
|
155
|
+
)
|
|
141
156
|
# TODO (cb, 10-17-2024): FILE PROVIDER - Some day we may want to break the file provider behavior into a seperate API function.
|
|
142
157
|
# When this happens, we probably will to have the change the command results handler we utilize to track file IDs in engine.
|
|
143
158
|
# Today, the action handler for the FileStore looks for a ReadAbsorbanceResult command action, this will need to be delinked.
|
|
144
159
|
|
|
145
160
|
# Begin interfacing with the file provider if the user provided a filename
|
|
146
|
-
file_ids = []
|
|
161
|
+
file_ids: list[str] = []
|
|
147
162
|
if params.fileName is not None:
|
|
148
163
|
# Create the Plate Reader Transform
|
|
149
|
-
plate_read_result = PlateReaderData.
|
|
164
|
+
plate_read_result = PlateReaderData.model_construct(
|
|
150
165
|
read_results=transform_results,
|
|
151
166
|
reference_wavelength=abs_reader_substate.reference_wavelength,
|
|
152
167
|
start_time=start_time,
|
|
@@ -167,15 +182,26 @@ class ReadAbsorbanceImpl(
|
|
|
167
182
|
)
|
|
168
183
|
file_ids.append(file_id)
|
|
169
184
|
|
|
185
|
+
state_update.files_added = update_types.FilesAddedUpdate(
|
|
186
|
+
file_ids=file_ids
|
|
187
|
+
)
|
|
170
188
|
# Return success data to api
|
|
171
189
|
return SuccessData(
|
|
172
190
|
public=ReadAbsorbanceResult(
|
|
173
|
-
data=asbsorbance_result,
|
|
191
|
+
data=asbsorbance_result,
|
|
192
|
+
fileIds=file_ids,
|
|
174
193
|
),
|
|
194
|
+
state_update=state_update,
|
|
175
195
|
)
|
|
176
196
|
|
|
197
|
+
state_update.files_added = update_types.FilesAddedUpdate(file_ids=file_ids)
|
|
198
|
+
|
|
177
199
|
return SuccessData(
|
|
178
|
-
public=ReadAbsorbanceResult(
|
|
200
|
+
public=ReadAbsorbanceResult(
|
|
201
|
+
data=asbsorbance_result,
|
|
202
|
+
fileIds=file_ids,
|
|
203
|
+
),
|
|
204
|
+
state_update=state_update,
|
|
179
205
|
)
|
|
180
206
|
|
|
181
207
|
|
|
@@ -186,7 +212,7 @@ class ReadAbsorbance(
|
|
|
186
212
|
|
|
187
213
|
commandType: ReadAbsorbanceCommandType = "absorbanceReader/read"
|
|
188
214
|
params: ReadAbsorbanceParams
|
|
189
|
-
result: Optional[ReadAbsorbanceResult]
|
|
215
|
+
result: Optional[ReadAbsorbanceResult] = None
|
|
190
216
|
|
|
191
217
|
_ImplementationCls: Type[ReadAbsorbanceImpl] = ReadAbsorbanceImpl
|
|
192
218
|
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""AirGap in place command request, result, and implementation models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type, Union
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
|
|
7
|
+
from opentrons_shared_data.errors.exceptions import PipetteOverpressureError
|
|
8
|
+
|
|
9
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
10
|
+
|
|
11
|
+
from .pipetting_common import (
|
|
12
|
+
PipetteIdMixin,
|
|
13
|
+
AspirateVolumeMixin,
|
|
14
|
+
FlowRateMixin,
|
|
15
|
+
BaseLiquidHandlingResult,
|
|
16
|
+
OverpressureError,
|
|
17
|
+
)
|
|
18
|
+
from .command import (
|
|
19
|
+
AbstractCommandImpl,
|
|
20
|
+
BaseCommand,
|
|
21
|
+
BaseCommandCreate,
|
|
22
|
+
SuccessData,
|
|
23
|
+
DefinedErrorData,
|
|
24
|
+
)
|
|
25
|
+
from ..errors.error_occurrence import ErrorOccurrence
|
|
26
|
+
from ..errors.exceptions import PipetteNotReadyToAspirateError
|
|
27
|
+
from ..state.update_types import StateUpdate
|
|
28
|
+
from ..types import AspiratedFluid, FluidKind
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from ..execution import PipettingHandler, GantryMover
|
|
32
|
+
from ..resources import ModelUtils
|
|
33
|
+
from ..state.state import StateView
|
|
34
|
+
from ..notes import CommandNoteAdder
|
|
35
|
+
|
|
36
|
+
AirGapInPlaceCommandType = Literal["airGapInPlace"]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AirGapInPlaceParams(PipetteIdMixin, AspirateVolumeMixin, FlowRateMixin):
|
|
40
|
+
"""Payload required to air gap in place."""
|
|
41
|
+
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class AirGapInPlaceResult(BaseLiquidHandlingResult):
|
|
46
|
+
"""Result data from the execution of a AirGapInPlace command."""
|
|
47
|
+
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
_ExecuteReturn = Union[
|
|
52
|
+
SuccessData[AirGapInPlaceResult],
|
|
53
|
+
DefinedErrorData[OverpressureError],
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class AirGapInPlaceImplementation(
|
|
58
|
+
AbstractCommandImpl[AirGapInPlaceParams, _ExecuteReturn]
|
|
59
|
+
):
|
|
60
|
+
"""AirGapInPlace command implementation."""
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
pipetting: PipettingHandler,
|
|
65
|
+
hardware_api: HardwareControlAPI,
|
|
66
|
+
state_view: StateView,
|
|
67
|
+
command_note_adder: CommandNoteAdder,
|
|
68
|
+
model_utils: ModelUtils,
|
|
69
|
+
gantry_mover: GantryMover,
|
|
70
|
+
**kwargs: object,
|
|
71
|
+
) -> None:
|
|
72
|
+
self._pipetting = pipetting
|
|
73
|
+
self._state_view = state_view
|
|
74
|
+
self._hardware_api = hardware_api
|
|
75
|
+
self._command_note_adder = command_note_adder
|
|
76
|
+
self._model_utils = model_utils
|
|
77
|
+
self._gantry_mover = gantry_mover
|
|
78
|
+
|
|
79
|
+
async def execute(self, params: AirGapInPlaceParams) -> _ExecuteReturn:
|
|
80
|
+
"""Air gap without moving the pipette.
|
|
81
|
+
|
|
82
|
+
Raises:
|
|
83
|
+
TipNotAttachedError: if no tip is attached to the pipette.
|
|
84
|
+
PipetteNotReadyToAirGapError: pipette plunger is not ready.
|
|
85
|
+
"""
|
|
86
|
+
ready_to_aspirate = self._pipetting.get_is_ready_to_aspirate(
|
|
87
|
+
pipette_id=params.pipetteId,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
if not ready_to_aspirate:
|
|
91
|
+
raise PipetteNotReadyToAspirateError(
|
|
92
|
+
"Pipette cannot air gap in place because of a previous blow out."
|
|
93
|
+
" The first aspirate following a blow-out must be from a specific well"
|
|
94
|
+
" so the plunger can be reset in a known safe position."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
state_update = StateUpdate()
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
current_position = await self._gantry_mover.get_position(params.pipetteId)
|
|
101
|
+
volume = await self._pipetting.aspirate_in_place(
|
|
102
|
+
pipette_id=params.pipetteId,
|
|
103
|
+
volume=params.volume,
|
|
104
|
+
flow_rate=params.flowRate,
|
|
105
|
+
command_note_adder=self._command_note_adder,
|
|
106
|
+
)
|
|
107
|
+
except PipetteOverpressureError as e:
|
|
108
|
+
return DefinedErrorData(
|
|
109
|
+
public=OverpressureError(
|
|
110
|
+
id=self._model_utils.generate_id(),
|
|
111
|
+
createdAt=self._model_utils.get_timestamp(),
|
|
112
|
+
wrappedErrors=[
|
|
113
|
+
ErrorOccurrence.from_failed(
|
|
114
|
+
id=self._model_utils.generate_id(),
|
|
115
|
+
createdAt=self._model_utils.get_timestamp(),
|
|
116
|
+
error=e,
|
|
117
|
+
)
|
|
118
|
+
],
|
|
119
|
+
errorInfo=(
|
|
120
|
+
{
|
|
121
|
+
"retryLocation": (
|
|
122
|
+
current_position.x,
|
|
123
|
+
current_position.y,
|
|
124
|
+
current_position.z,
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
),
|
|
129
|
+
state_update=state_update,
|
|
130
|
+
)
|
|
131
|
+
else:
|
|
132
|
+
state_update.set_fluid_aspirated(
|
|
133
|
+
pipette_id=params.pipetteId,
|
|
134
|
+
fluid=AspiratedFluid(kind=FluidKind.AIR, volume=volume),
|
|
135
|
+
)
|
|
136
|
+
return SuccessData(
|
|
137
|
+
public=AirGapInPlaceResult(volume=volume),
|
|
138
|
+
state_update=state_update,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class AirGapInPlace(
|
|
143
|
+
BaseCommand[AirGapInPlaceParams, AirGapInPlaceResult, OverpressureError]
|
|
144
|
+
):
|
|
145
|
+
"""AirGapInPlace command model."""
|
|
146
|
+
|
|
147
|
+
commandType: AirGapInPlaceCommandType = "airGapInPlace"
|
|
148
|
+
params: AirGapInPlaceParams
|
|
149
|
+
result: Optional[AirGapInPlaceResult] = None
|
|
150
|
+
|
|
151
|
+
_ImplementationCls: Type[AirGapInPlaceImplementation] = AirGapInPlaceImplementation
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class AirGapInPlaceCreate(BaseCommandCreate[AirGapInPlaceParams]):
|
|
155
|
+
"""AirGapInPlace command request model."""
|
|
156
|
+
|
|
157
|
+
commandType: AirGapInPlaceCommandType = "airGapInPlace"
|
|
158
|
+
params: AirGapInPlaceParams
|
|
159
|
+
|
|
160
|
+
_CommandCls: Type[AirGapInPlace] = AirGapInPlace
|