opentrons 8.6.0a1__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.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +501 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +183 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +215 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1115 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +396 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1025 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3212 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1425 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -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 +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +349 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +58 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1158 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2359 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1459 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1500 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +308 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +303 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +848 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0a1.dist-info/METADATA +37 -0
- opentrons-8.6.0a1.dist-info/RECORD +600 -0
- opentrons-8.6.0a1.dist-info/WHEEL +4 -0
- opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Command models to open the latch of a Flex Stacker."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
from typing import Optional, Literal, TYPE_CHECKING
|
|
7
|
+
from typing_extensions import Type
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
12
|
+
from ...errors import (
|
|
13
|
+
ErrorOccurrence,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from ...state.state import StateView
|
|
18
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
19
|
+
|
|
20
|
+
UnsafeFlexStackerOpenLatchCommandType = Literal["unsafe/flexStacker/openLatch"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class UnsafeFlexStackerOpenLatchParams(BaseModel):
|
|
24
|
+
"""The parameters defining how a stacker should open its latch."""
|
|
25
|
+
|
|
26
|
+
moduleId: str = Field(..., description="Unique ID of the Flex Stacker")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class UnsafeFlexStackerOpenLatchResult(BaseModel):
|
|
30
|
+
"""Result data from a stacker UnsafeFlexStackerOpenLatch command."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class UnsafeFlexStackerOpenLatchImpl(
|
|
34
|
+
AbstractCommandImpl[
|
|
35
|
+
UnsafeFlexStackerOpenLatchParams, SuccessData[UnsafeFlexStackerOpenLatchResult]
|
|
36
|
+
]
|
|
37
|
+
):
|
|
38
|
+
"""Implementation of a stacker UnsafeFlexStackerOpenLatch command."""
|
|
39
|
+
|
|
40
|
+
def __init__(
|
|
41
|
+
self, state_view: StateView, equipment: EquipmentHandler, **kwargs: object
|
|
42
|
+
) -> None:
|
|
43
|
+
self._state_view = state_view
|
|
44
|
+
self._equipment = equipment
|
|
45
|
+
|
|
46
|
+
async def execute(
|
|
47
|
+
self, params: UnsafeFlexStackerOpenLatchParams
|
|
48
|
+
) -> SuccessData[UnsafeFlexStackerOpenLatchResult]:
|
|
49
|
+
"""Execute the stacker UnsafeFlexStackerOpenLatch command.
|
|
50
|
+
|
|
51
|
+
Opening the latch could result in labware falling down the stacker hopper,
|
|
52
|
+
resulting in an error state. This command should be used with care, outside of
|
|
53
|
+
a protocol and followed by a close latch command.
|
|
54
|
+
"""
|
|
55
|
+
stacker_state = self._state_view.modules.get_flex_stacker_substate(
|
|
56
|
+
params.moduleId
|
|
57
|
+
)
|
|
58
|
+
stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
|
|
59
|
+
|
|
60
|
+
if stacker_hw is not None:
|
|
61
|
+
await stacker_hw.open_latch()
|
|
62
|
+
return SuccessData(public=UnsafeFlexStackerOpenLatchResult())
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class UnsafeFlexStackerOpenLatch(
|
|
66
|
+
BaseCommand[
|
|
67
|
+
UnsafeFlexStackerOpenLatchParams,
|
|
68
|
+
UnsafeFlexStackerOpenLatchResult,
|
|
69
|
+
ErrorOccurrence,
|
|
70
|
+
]
|
|
71
|
+
):
|
|
72
|
+
"""A command to UnsafeFlexStackerOpenLatch the Flex Stacker of labware."""
|
|
73
|
+
|
|
74
|
+
commandType: UnsafeFlexStackerOpenLatchCommandType = "unsafe/flexStacker/openLatch"
|
|
75
|
+
params: UnsafeFlexStackerOpenLatchParams
|
|
76
|
+
result: Optional[UnsafeFlexStackerOpenLatchResult] = None
|
|
77
|
+
|
|
78
|
+
_ImplementationCls: Type[
|
|
79
|
+
UnsafeFlexStackerOpenLatchImpl
|
|
80
|
+
] = UnsafeFlexStackerOpenLatchImpl
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class UnsafeFlexStackerOpenLatchCreate(
|
|
84
|
+
BaseCommandCreate[UnsafeFlexStackerOpenLatchParams]
|
|
85
|
+
):
|
|
86
|
+
"""A request to execute a Flex Stacker UnsafeFlexStackerOpenLatch command."""
|
|
87
|
+
|
|
88
|
+
commandType: UnsafeFlexStackerOpenLatchCommandType = "unsafe/flexStacker/openLatch"
|
|
89
|
+
params: UnsafeFlexStackerOpenLatchParams
|
|
90
|
+
|
|
91
|
+
_CommandCls: Type[UnsafeFlexStackerOpenLatch] = UnsafeFlexStackerOpenLatch
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Command models to prepare the stacker shuttle for movement."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
from typing import Literal, Union, TYPE_CHECKING
|
|
7
|
+
from typing_extensions import Type
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from opentrons_shared_data.errors.exceptions import FlexStackerStallError
|
|
12
|
+
|
|
13
|
+
from ..flex_stacker.common import FlexStackerStallOrCollisionError
|
|
14
|
+
from ..command import (
|
|
15
|
+
AbstractCommandImpl,
|
|
16
|
+
BaseCommand,
|
|
17
|
+
BaseCommandCreate,
|
|
18
|
+
SuccessData,
|
|
19
|
+
DefinedErrorData,
|
|
20
|
+
)
|
|
21
|
+
from ...errors import ErrorOccurrence
|
|
22
|
+
from ...resources import ModelUtils
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from ...state.state import StateView
|
|
26
|
+
from ...execution import EquipmentHandler
|
|
27
|
+
|
|
28
|
+
UnsafeFlexStackerPrepareShuttleCommandType = Literal[
|
|
29
|
+
"unsafe/flexStacker/prepareShuttle"
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class UnsafeFlexStackerPrepareShuttleParams(BaseModel):
|
|
34
|
+
"""The parameters for a UnsafeFlexStackerPrepareShuttle command."""
|
|
35
|
+
|
|
36
|
+
moduleId: str = Field(..., description="Unique ID of the Flex Stacker")
|
|
37
|
+
ignoreLatch: bool = Field(
|
|
38
|
+
default=False, description="Ignore the latch state of the shuttle"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class UnsafeFlexStackerPrepareShuttleResult(BaseModel):
|
|
43
|
+
"""Result data from a stacker UnsafeFlexStackerPrepareShuttle command."""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
_ExecuteReturn = Union[
|
|
47
|
+
SuccessData[UnsafeFlexStackerPrepareShuttleResult],
|
|
48
|
+
DefinedErrorData[FlexStackerStallOrCollisionError],
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class UnsafeFlexStackerPrepareShuttleImpl(
|
|
53
|
+
AbstractCommandImpl[UnsafeFlexStackerPrepareShuttleParams, _ExecuteReturn]
|
|
54
|
+
):
|
|
55
|
+
"""Implementation of a stacker prepare shuttle command."""
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
state_view: StateView,
|
|
60
|
+
equipment: EquipmentHandler,
|
|
61
|
+
model_utils: ModelUtils,
|
|
62
|
+
**kwargs: object,
|
|
63
|
+
) -> None:
|
|
64
|
+
self._state_view = state_view
|
|
65
|
+
self._equipment = equipment
|
|
66
|
+
self._model_utils = model_utils
|
|
67
|
+
|
|
68
|
+
async def execute(
|
|
69
|
+
self, params: UnsafeFlexStackerPrepareShuttleParams
|
|
70
|
+
) -> _ExecuteReturn:
|
|
71
|
+
"""Execute the stacker prepare shuttle command.
|
|
72
|
+
|
|
73
|
+
Moving the shuttle directly affects the state of the flex stacker and
|
|
74
|
+
could affect its ability to execute the next command. This command
|
|
75
|
+
should be used with care.
|
|
76
|
+
"""
|
|
77
|
+
stacker_state = self._state_view.modules.get_flex_stacker_substate(
|
|
78
|
+
params.moduleId
|
|
79
|
+
)
|
|
80
|
+
# Allow propagation of ModuleNotAttachedError.
|
|
81
|
+
stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
|
|
82
|
+
|
|
83
|
+
try:
|
|
84
|
+
if stacker_hw is not None:
|
|
85
|
+
await stacker_hw.home_all(params.ignoreLatch)
|
|
86
|
+
except FlexStackerStallError as e:
|
|
87
|
+
return DefinedErrorData(
|
|
88
|
+
public=FlexStackerStallOrCollisionError(
|
|
89
|
+
id=self._model_utils.generate_id(),
|
|
90
|
+
createdAt=self._model_utils.get_timestamp(),
|
|
91
|
+
wrappedErrors=[
|
|
92
|
+
ErrorOccurrence.from_failed(
|
|
93
|
+
id=self._model_utils.generate_id(),
|
|
94
|
+
createdAt=self._model_utils.get_timestamp(),
|
|
95
|
+
error=e,
|
|
96
|
+
)
|
|
97
|
+
],
|
|
98
|
+
errorInfo={},
|
|
99
|
+
),
|
|
100
|
+
)
|
|
101
|
+
# TODO we should also add a check for shuttle not detected error
|
|
102
|
+
|
|
103
|
+
return SuccessData(public=UnsafeFlexStackerPrepareShuttleResult())
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class UnsafeFlexStackerPrepareShuttle(
|
|
107
|
+
BaseCommand[
|
|
108
|
+
UnsafeFlexStackerPrepareShuttleParams,
|
|
109
|
+
UnsafeFlexStackerPrepareShuttleResult,
|
|
110
|
+
ErrorOccurrence,
|
|
111
|
+
]
|
|
112
|
+
):
|
|
113
|
+
"""A command to prepare Flex Stacker shuttle."""
|
|
114
|
+
|
|
115
|
+
commandType: UnsafeFlexStackerPrepareShuttleCommandType = (
|
|
116
|
+
"unsafe/flexStacker/prepareShuttle"
|
|
117
|
+
)
|
|
118
|
+
params: UnsafeFlexStackerPrepareShuttleParams
|
|
119
|
+
result: UnsafeFlexStackerPrepareShuttleResult | None = None
|
|
120
|
+
|
|
121
|
+
_ImplementationCls: Type[
|
|
122
|
+
UnsafeFlexStackerPrepareShuttleImpl
|
|
123
|
+
] = UnsafeFlexStackerPrepareShuttleImpl
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class UnsafeFlexStackerPrepareShuttleCreate(
|
|
127
|
+
BaseCommandCreate[UnsafeFlexStackerPrepareShuttleParams]
|
|
128
|
+
):
|
|
129
|
+
"""A request to execute a Flex Stacker UnsafeFlexStackerPrepareShuttle command."""
|
|
130
|
+
|
|
131
|
+
commandType: UnsafeFlexStackerPrepareShuttleCommandType = (
|
|
132
|
+
"unsafe/flexStacker/prepareShuttle"
|
|
133
|
+
)
|
|
134
|
+
params: UnsafeFlexStackerPrepareShuttleParams
|
|
135
|
+
|
|
136
|
+
_CommandCls: Type[UnsafeFlexStackerPrepareShuttle] = UnsafeFlexStackerPrepareShuttle
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Ungrip labware payload, result, and implementaiton."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from opentrons.hardware_control.types import Axis
|
|
6
|
+
from opentrons.protocol_engine.errors.exceptions import GripperNotAttachedError
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
from typing import Optional, Type
|
|
9
|
+
from typing_extensions import Literal
|
|
10
|
+
|
|
11
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
12
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
13
|
+
from ...resources import ensure_ot3_hardware
|
|
14
|
+
|
|
15
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
UnsafeUngripLabwareCommandType = Literal["unsafe/ungripLabware"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class UnsafeUngripLabwareParams(BaseModel):
|
|
22
|
+
"""Payload required for an UngripLabware command."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class UnsafeUngripLabwareResult(BaseModel):
|
|
26
|
+
"""Result data from the execution of an UngripLabware command."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class UnsafeUngripLabwareImplementation(
|
|
30
|
+
AbstractCommandImpl[
|
|
31
|
+
UnsafeUngripLabwareParams,
|
|
32
|
+
SuccessData[UnsafeUngripLabwareResult],
|
|
33
|
+
]
|
|
34
|
+
):
|
|
35
|
+
"""Ungrip labware command implementation."""
|
|
36
|
+
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
hardware_api: HardwareControlAPI,
|
|
40
|
+
**kwargs: object,
|
|
41
|
+
) -> None:
|
|
42
|
+
self._hardware_api = hardware_api
|
|
43
|
+
|
|
44
|
+
async def execute(
|
|
45
|
+
self, params: UnsafeUngripLabwareParams
|
|
46
|
+
) -> SuccessData[UnsafeUngripLabwareResult]:
|
|
47
|
+
"""Ungrip Labware."""
|
|
48
|
+
ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
|
|
49
|
+
if not ot3_hardware_api.has_gripper():
|
|
50
|
+
raise GripperNotAttachedError("No gripper found to perform ungrip.")
|
|
51
|
+
await ot3_hardware_api.home([Axis.G])
|
|
52
|
+
return SuccessData(
|
|
53
|
+
public=UnsafeUngripLabwareResult(),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class UnsafeUngripLabware(
|
|
58
|
+
BaseCommand[UnsafeUngripLabwareParams, UnsafeUngripLabwareResult, ErrorOccurrence]
|
|
59
|
+
):
|
|
60
|
+
"""UnsafeUngripLabware command model."""
|
|
61
|
+
|
|
62
|
+
commandType: UnsafeUngripLabwareCommandType = "unsafe/ungripLabware"
|
|
63
|
+
params: UnsafeUngripLabwareParams
|
|
64
|
+
result: Optional[UnsafeUngripLabwareResult] = None
|
|
65
|
+
|
|
66
|
+
_ImplementationCls: Type[
|
|
67
|
+
UnsafeUngripLabwareImplementation
|
|
68
|
+
] = UnsafeUngripLabwareImplementation
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class UnsafeUngripLabwareCreate(BaseCommandCreate[UnsafeUngripLabwareParams]):
|
|
72
|
+
"""UnsafeEngageAxes command request model."""
|
|
73
|
+
|
|
74
|
+
commandType: UnsafeUngripLabwareCommandType = "unsafe/ungripLabware"
|
|
75
|
+
params: UnsafeUngripLabwareParams
|
|
76
|
+
|
|
77
|
+
_CommandCls: Type[UnsafeUngripLabware] = UnsafeUngripLabware
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Update position estimators payload, result, and implementaiton."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from typing import TYPE_CHECKING, Optional, List, Type
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
|
|
8
|
+
from ...types import MotorAxis
|
|
9
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
10
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
11
|
+
from ...resources import ensure_ot3_hardware
|
|
12
|
+
|
|
13
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ...execution import GantryMover
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
UpdatePositionEstimatorsCommandType = Literal["unsafe/updatePositionEstimators"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UpdatePositionEstimatorsParams(BaseModel):
|
|
23
|
+
"""Payload required for an UpdatePositionEstimators command."""
|
|
24
|
+
|
|
25
|
+
axes: List[MotorAxis] = Field(
|
|
26
|
+
...,
|
|
27
|
+
description=(
|
|
28
|
+
"The axes for which to update the position estimators."
|
|
29
|
+
" Any axes that are not physically present will be ignored."
|
|
30
|
+
),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class UpdatePositionEstimatorsResult(BaseModel):
|
|
35
|
+
"""Result data from the execution of an UpdatePositionEstimators command."""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class UpdatePositionEstimatorsImplementation(
|
|
39
|
+
AbstractCommandImpl[
|
|
40
|
+
UpdatePositionEstimatorsParams,
|
|
41
|
+
SuccessData[UpdatePositionEstimatorsResult],
|
|
42
|
+
]
|
|
43
|
+
):
|
|
44
|
+
"""Update position estimators command implementation."""
|
|
45
|
+
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
hardware_api: HardwareControlAPI,
|
|
49
|
+
gantry_mover: GantryMover,
|
|
50
|
+
**kwargs: object,
|
|
51
|
+
) -> None:
|
|
52
|
+
self._hardware_api = hardware_api
|
|
53
|
+
self._gantry_mover = gantry_mover
|
|
54
|
+
|
|
55
|
+
async def execute(
|
|
56
|
+
self, params: UpdatePositionEstimatorsParams
|
|
57
|
+
) -> SuccessData[UpdatePositionEstimatorsResult]:
|
|
58
|
+
"""Update axis position estimators from their encoders."""
|
|
59
|
+
ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
|
|
60
|
+
await ot3_hardware_api.update_axis_position_estimations(
|
|
61
|
+
self._gantry_mover.motor_axes_to_present_hardware_axes(params.axes)
|
|
62
|
+
)
|
|
63
|
+
return SuccessData(
|
|
64
|
+
public=UpdatePositionEstimatorsResult(),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class UpdatePositionEstimators(
|
|
69
|
+
BaseCommand[
|
|
70
|
+
UpdatePositionEstimatorsParams, UpdatePositionEstimatorsResult, ErrorOccurrence
|
|
71
|
+
]
|
|
72
|
+
):
|
|
73
|
+
"""UpdatePositionEstimators command model."""
|
|
74
|
+
|
|
75
|
+
commandType: UpdatePositionEstimatorsCommandType = "unsafe/updatePositionEstimators"
|
|
76
|
+
params: UpdatePositionEstimatorsParams
|
|
77
|
+
result: Optional[UpdatePositionEstimatorsResult] = None
|
|
78
|
+
|
|
79
|
+
_ImplementationCls: Type[
|
|
80
|
+
UpdatePositionEstimatorsImplementation
|
|
81
|
+
] = UpdatePositionEstimatorsImplementation
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class UpdatePositionEstimatorsCreate(BaseCommandCreate[UpdatePositionEstimatorsParams]):
|
|
85
|
+
"""UpdatePositionEstimators command request model."""
|
|
86
|
+
|
|
87
|
+
commandType: UpdatePositionEstimatorsCommandType = "unsafe/updatePositionEstimators"
|
|
88
|
+
params: UpdatePositionEstimatorsParams
|
|
89
|
+
|
|
90
|
+
_CommandCls: Type[UpdatePositionEstimators] = UpdatePositionEstimators
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""Unseal tip from pipette command request, result, and implementation models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pydantic import Field
|
|
6
|
+
from typing import TYPE_CHECKING, Optional, Type, Final
|
|
7
|
+
from typing_extensions import Literal
|
|
8
|
+
|
|
9
|
+
from opentrons.protocol_engine.resources.model_utils import ModelUtils
|
|
10
|
+
|
|
11
|
+
from ..types import DropTipWellLocation
|
|
12
|
+
from .pipetting_common import (
|
|
13
|
+
PipetteIdMixin,
|
|
14
|
+
)
|
|
15
|
+
from .movement_common import (
|
|
16
|
+
DestinationPositionResult,
|
|
17
|
+
move_to_well,
|
|
18
|
+
StallOrCollisionError,
|
|
19
|
+
)
|
|
20
|
+
from .command import (
|
|
21
|
+
AbstractCommandImpl,
|
|
22
|
+
BaseCommand,
|
|
23
|
+
BaseCommandCreate,
|
|
24
|
+
DefinedErrorData,
|
|
25
|
+
SuccessData,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from ..state.state import StateView
|
|
30
|
+
from ..execution import MovementHandler, TipHandler, GantryMover
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
UnsealPipetteFromTipCommandType = Literal["unsealPipetteFromTip"]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class UnsealPipetteFromTipParams(PipetteIdMixin):
|
|
37
|
+
"""Payload required to drop a tip in a specific well."""
|
|
38
|
+
|
|
39
|
+
labwareId: str = Field(..., description="Identifier of labware to use.")
|
|
40
|
+
wellName: str = Field(..., description="Name of well to use in labware.")
|
|
41
|
+
wellLocation: DropTipWellLocation = Field(
|
|
42
|
+
default_factory=DropTipWellLocation,
|
|
43
|
+
description="Relative well location at which to drop the tip.",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class UnsealPipetteFromTipResult(DestinationPositionResult):
|
|
48
|
+
"""Result data from the execution of a DropTip command."""
|
|
49
|
+
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
_ExecuteReturn = (
|
|
54
|
+
SuccessData[UnsealPipetteFromTipResult] | DefinedErrorData[StallOrCollisionError]
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
CUSTOM_TIP_LENGTH_MARGIN: Final = 10
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class UnsealPipetteFromTipImplementation(
|
|
61
|
+
AbstractCommandImpl[UnsealPipetteFromTipParams, _ExecuteReturn]
|
|
62
|
+
):
|
|
63
|
+
"""Drop tip command implementation."""
|
|
64
|
+
|
|
65
|
+
def __init__(
|
|
66
|
+
self,
|
|
67
|
+
state_view: StateView,
|
|
68
|
+
tip_handler: TipHandler,
|
|
69
|
+
movement: MovementHandler,
|
|
70
|
+
model_utils: ModelUtils,
|
|
71
|
+
gantry_mover: GantryMover,
|
|
72
|
+
**kwargs: object,
|
|
73
|
+
) -> None:
|
|
74
|
+
self._state_view = state_view
|
|
75
|
+
self._tip_handler = tip_handler
|
|
76
|
+
self._movement_handler = movement
|
|
77
|
+
self._model_utils = model_utils
|
|
78
|
+
self._gantry_mover = gantry_mover
|
|
79
|
+
|
|
80
|
+
async def execute(self, params: UnsealPipetteFromTipParams) -> _ExecuteReturn:
|
|
81
|
+
"""Move to and drop a tip using the requested pipette."""
|
|
82
|
+
pipette_id = params.pipetteId
|
|
83
|
+
labware_id = params.labwareId
|
|
84
|
+
well_name = params.wellName
|
|
85
|
+
|
|
86
|
+
well_location = params.wellLocation
|
|
87
|
+
|
|
88
|
+
tip_geometry = self._state_view.geometry.get_nominal_tip_geometry(
|
|
89
|
+
pipette_id, labware_id, well_name
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
is_partially_configured = self._state_view.pipettes.get_is_partially_configured(
|
|
93
|
+
pipette_id=pipette_id
|
|
94
|
+
)
|
|
95
|
+
tip_drop_location = self._state_view.geometry.get_checked_tip_drop_location(
|
|
96
|
+
pipette_id=pipette_id,
|
|
97
|
+
labware_id=labware_id,
|
|
98
|
+
well_location=well_location,
|
|
99
|
+
partially_configured=is_partially_configured,
|
|
100
|
+
override_default_offset=-(tip_geometry.length - CUSTOM_TIP_LENGTH_MARGIN),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
move_result = await move_to_well(
|
|
104
|
+
movement=self._movement_handler,
|
|
105
|
+
model_utils=self._model_utils,
|
|
106
|
+
pipette_id=pipette_id,
|
|
107
|
+
labware_id=labware_id,
|
|
108
|
+
well_name=well_name,
|
|
109
|
+
well_location=tip_drop_location,
|
|
110
|
+
)
|
|
111
|
+
if isinstance(move_result, DefinedErrorData):
|
|
112
|
+
return move_result
|
|
113
|
+
|
|
114
|
+
await self._tip_handler.drop_tip(
|
|
115
|
+
pipette_id=pipette_id,
|
|
116
|
+
home_after=None,
|
|
117
|
+
do_not_ignore_tip_presence=False,
|
|
118
|
+
ignore_plunger=True,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
return SuccessData(
|
|
122
|
+
public=UnsealPipetteFromTipResult(position=move_result.public.position),
|
|
123
|
+
state_update=move_result.state_update.set_fluid_unknown(
|
|
124
|
+
pipette_id=pipette_id
|
|
125
|
+
).update_pipette_tip_state(
|
|
126
|
+
pipette_id=params.pipetteId, tip_geometry=None, tip_source=None
|
|
127
|
+
),
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class UnsealPipetteFromTip(
|
|
132
|
+
BaseCommand[
|
|
133
|
+
UnsealPipetteFromTipParams, UnsealPipetteFromTipResult, StallOrCollisionError
|
|
134
|
+
]
|
|
135
|
+
):
|
|
136
|
+
"""Unseal pipette command model."""
|
|
137
|
+
|
|
138
|
+
commandType: UnsealPipetteFromTipCommandType = "unsealPipetteFromTip"
|
|
139
|
+
params: UnsealPipetteFromTipParams
|
|
140
|
+
result: Optional[UnsealPipetteFromTipResult] = None
|
|
141
|
+
|
|
142
|
+
_ImplementationCls: Type[
|
|
143
|
+
UnsealPipetteFromTipImplementation
|
|
144
|
+
] = UnsealPipetteFromTipImplementation
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class UnsealPipetteFromTipCreate(BaseCommandCreate[UnsealPipetteFromTipParams]):
|
|
148
|
+
"""Unseal pipette command creation request model."""
|
|
149
|
+
|
|
150
|
+
commandType: UnsealPipetteFromTipCommandType = "unsealPipetteFromTip"
|
|
151
|
+
params: UnsealPipetteFromTipParams
|
|
152
|
+
|
|
153
|
+
_CommandCls: Type[UnsealPipetteFromTip] = UnsealPipetteFromTip
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Verify tip presence command request, result and implementation models."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import TYPE_CHECKING, Optional, Type, Any
|
|
4
|
+
|
|
5
|
+
from pydantic import Field, BaseModel
|
|
6
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
7
|
+
from typing_extensions import Literal
|
|
8
|
+
|
|
9
|
+
from .pipetting_common import PipetteIdMixin
|
|
10
|
+
from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
11
|
+
from ..errors.error_occurrence import ErrorOccurrence
|
|
12
|
+
|
|
13
|
+
from ..types import TipPresenceStatus, InstrumentSensorId
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ..execution import TipHandler
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
VerifyTipPresenceCommandType = Literal["verifyTipPresence"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
23
|
+
s.pop("default", None)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class VerifyTipPresenceParams(PipetteIdMixin):
|
|
27
|
+
"""Payload required for a VerifyTipPresence command."""
|
|
28
|
+
|
|
29
|
+
expectedState: TipPresenceStatus = Field(
|
|
30
|
+
..., description="The expected tip presence status on the pipette."
|
|
31
|
+
)
|
|
32
|
+
followSingularSensor: InstrumentSensorId | SkipJsonSchema[None] = Field(
|
|
33
|
+
default=None,
|
|
34
|
+
description="The sensor id to follow if the other can be ignored.",
|
|
35
|
+
json_schema_extra=_remove_default,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class VerifyTipPresenceResult(BaseModel):
|
|
40
|
+
"""Result data from the execution of a VerifyTipPresence command."""
|
|
41
|
+
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class VerifyTipPresenceImplementation(
|
|
46
|
+
AbstractCommandImpl[VerifyTipPresenceParams, SuccessData[VerifyTipPresenceResult]]
|
|
47
|
+
):
|
|
48
|
+
"""VerifyTipPresence command implementation."""
|
|
49
|
+
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
tip_handler: TipHandler,
|
|
53
|
+
**kwargs: object,
|
|
54
|
+
) -> None:
|
|
55
|
+
self._tip_handler = tip_handler
|
|
56
|
+
|
|
57
|
+
async def execute(
|
|
58
|
+
self, params: VerifyTipPresenceParams
|
|
59
|
+
) -> SuccessData[VerifyTipPresenceResult]:
|
|
60
|
+
"""Verify if tip presence is as expected for the requested pipette."""
|
|
61
|
+
pipette_id = params.pipetteId
|
|
62
|
+
expected_state = params.expectedState
|
|
63
|
+
follow_singular_sensor = (
|
|
64
|
+
InstrumentSensorId.to_instrument_probe_type(params.followSingularSensor)
|
|
65
|
+
if params.followSingularSensor
|
|
66
|
+
else None
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
await self._tip_handler.verify_tip_presence(
|
|
70
|
+
pipette_id=pipette_id,
|
|
71
|
+
expected=expected_state,
|
|
72
|
+
follow_singular_sensor=follow_singular_sensor,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return SuccessData(
|
|
76
|
+
public=VerifyTipPresenceResult(),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class VerifyTipPresence(
|
|
81
|
+
BaseCommand[VerifyTipPresenceParams, VerifyTipPresenceResult, ErrorOccurrence]
|
|
82
|
+
):
|
|
83
|
+
"""VerifyTipPresence command model."""
|
|
84
|
+
|
|
85
|
+
commandType: VerifyTipPresenceCommandType = "verifyTipPresence"
|
|
86
|
+
params: VerifyTipPresenceParams
|
|
87
|
+
result: Optional[VerifyTipPresenceResult] = None
|
|
88
|
+
|
|
89
|
+
_ImplementationCls: Type[
|
|
90
|
+
VerifyTipPresenceImplementation
|
|
91
|
+
] = VerifyTipPresenceImplementation
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class VerifyTipPresenceCreate(BaseCommandCreate[VerifyTipPresenceParams]):
|
|
95
|
+
"""VerifyTipPresence command creation request model."""
|
|
96
|
+
|
|
97
|
+
commandType: VerifyTipPresenceCommandType = "verifyTipPresence"
|
|
98
|
+
params: VerifyTipPresenceParams
|
|
99
|
+
|
|
100
|
+
_CommandCls: Type[VerifyTipPresence] = VerifyTipPresence
|