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,353 @@
|
|
|
1
|
+
"""Seal tips to pipette command request, result, and implementation models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type, Union
|
|
5
|
+
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
from pydantic import Field, BaseModel
|
|
8
|
+
|
|
9
|
+
from opentrons_shared_data.errors.exceptions import PositionUnknownError
|
|
10
|
+
|
|
11
|
+
from opentrons.types import MountType
|
|
12
|
+
from opentrons.protocol_engine.types import MotorAxis
|
|
13
|
+
from ..resources import ModelUtils, ensure_ot3_hardware
|
|
14
|
+
from ..types import PickUpTipWellLocation, FluidKind, AspiratedFluid, LabwareWellId
|
|
15
|
+
from .pipetting_common import (
|
|
16
|
+
PipetteIdMixin,
|
|
17
|
+
)
|
|
18
|
+
from .movement_common import (
|
|
19
|
+
DestinationPositionResult,
|
|
20
|
+
StallOrCollisionError,
|
|
21
|
+
move_to_well,
|
|
22
|
+
)
|
|
23
|
+
from .command import (
|
|
24
|
+
AbstractCommandImpl,
|
|
25
|
+
BaseCommand,
|
|
26
|
+
BaseCommandCreate,
|
|
27
|
+
DefinedErrorData,
|
|
28
|
+
SuccessData,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
32
|
+
from opentrons.hardware_control.types import Axis
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from ..state.state import StateView
|
|
36
|
+
from ..execution import (
|
|
37
|
+
MovementHandler,
|
|
38
|
+
TipHandler,
|
|
39
|
+
GantryMover,
|
|
40
|
+
PipettingHandler,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
SealPipetteToTipCommandType = Literal["sealPipetteToTip"]
|
|
45
|
+
_CAM_PREP_DISTANCE_DEFAULT = 8.25
|
|
46
|
+
_CAM_PRESS_DISTANCE_DEFAULT = 3.5
|
|
47
|
+
_CAM_EJECTOR_PUSH_MM_DEFAULT = 7.0
|
|
48
|
+
_PRESS_FIT_PREP_DISTANCE_DEFAULT = 0
|
|
49
|
+
_PRESS_FIT_PRESS_DISTANCE_DEFAULT = -11.0
|
|
50
|
+
_PRESS_FIT_EJECTOR_PUSH_MM_DEFAULT = 0
|
|
51
|
+
_SAFE_TOP_VOLUME = 1000
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class TipPickUpParams(BaseModel):
|
|
55
|
+
"""Payload used to specify press-tip parameters for a seal command."""
|
|
56
|
+
|
|
57
|
+
prepDistance: float = Field(
|
|
58
|
+
default=0, description="The distance to move down to fit the tips on."
|
|
59
|
+
)
|
|
60
|
+
pressDistance: float = Field(
|
|
61
|
+
default=0, description="The distance to press on tips."
|
|
62
|
+
)
|
|
63
|
+
ejectorPushMm: float = Field(
|
|
64
|
+
default=0,
|
|
65
|
+
description="The distance to back off to ensure that the tip presence sensors are not triggered.",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class SealPipetteToTipParams(PipetteIdMixin):
|
|
70
|
+
"""Payload needed to seal resin tips to a pipette."""
|
|
71
|
+
|
|
72
|
+
labwareId: str = Field(..., description="Identifier of labware to use.")
|
|
73
|
+
wellName: str = Field(..., description="Name of well to use in labware.")
|
|
74
|
+
wellLocation: PickUpTipWellLocation = Field(
|
|
75
|
+
default_factory=PickUpTipWellLocation,
|
|
76
|
+
description="Relative well location at which to pick up the tip.",
|
|
77
|
+
)
|
|
78
|
+
tipPickUpParams: Optional[TipPickUpParams] = Field(
|
|
79
|
+
default=None, description="Specific parameters for "
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SealPipetteToTipResult(DestinationPositionResult):
|
|
84
|
+
"""Result data from the execution of a SealPipetteToTip."""
|
|
85
|
+
|
|
86
|
+
tipVolume: float = Field(
|
|
87
|
+
0.0,
|
|
88
|
+
description="Maximum volume of liquid that the picked up tip can hold, in µL.",
|
|
89
|
+
ge=0.0,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
tipLength: float = Field(
|
|
93
|
+
0.0,
|
|
94
|
+
description="The length of the tip in mm.",
|
|
95
|
+
ge=0.0,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
tipDiameter: float = Field(
|
|
99
|
+
0.0,
|
|
100
|
+
description="The diameter of the tip in mm.",
|
|
101
|
+
ge=0.0,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
_ExecuteReturn = Union[
|
|
106
|
+
SuccessData[SealPipetteToTipResult],
|
|
107
|
+
DefinedErrorData[StallOrCollisionError],
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class SealPipetteToTipImplementation(
|
|
112
|
+
AbstractCommandImpl[SealPipetteToTipParams, _ExecuteReturn]
|
|
113
|
+
):
|
|
114
|
+
"""Seal pipette command implementation."""
|
|
115
|
+
|
|
116
|
+
def __init__(
|
|
117
|
+
self,
|
|
118
|
+
state_view: StateView,
|
|
119
|
+
tip_handler: TipHandler,
|
|
120
|
+
model_utils: ModelUtils,
|
|
121
|
+
movement: MovementHandler,
|
|
122
|
+
hardware_api: HardwareControlAPI,
|
|
123
|
+
gantry_mover: GantryMover,
|
|
124
|
+
pipetting: PipettingHandler,
|
|
125
|
+
**kwargs: object,
|
|
126
|
+
) -> None:
|
|
127
|
+
self._state_view = state_view
|
|
128
|
+
self._tip_handler = tip_handler
|
|
129
|
+
self._model_utils = model_utils
|
|
130
|
+
self._movement = movement
|
|
131
|
+
self._gantry_mover = gantry_mover
|
|
132
|
+
self._pipetting = pipetting
|
|
133
|
+
self._hardware_api = hardware_api
|
|
134
|
+
|
|
135
|
+
async def relative_pickup_tip(
|
|
136
|
+
self,
|
|
137
|
+
tip_pick_up_params: TipPickUpParams,
|
|
138
|
+
mount: MountType,
|
|
139
|
+
) -> None:
|
|
140
|
+
"""A relative press-fit pick up command using gantry moves."""
|
|
141
|
+
prep_distance = tip_pick_up_params.prepDistance
|
|
142
|
+
press_distance = tip_pick_up_params.pressDistance
|
|
143
|
+
retract_distance = -1 * (press_distance) / 2
|
|
144
|
+
|
|
145
|
+
mount_axis = MotorAxis.LEFT_Z if mount == MountType.LEFT else MotorAxis.RIGHT_Z
|
|
146
|
+
ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
|
|
147
|
+
# TODO chb, 2025-01-29): Factor out the movement constants and relocate this logic into the hardware controller
|
|
148
|
+
try:
|
|
149
|
+
await self._gantry_mover.move_axes(
|
|
150
|
+
axis_map={mount_axis: prep_distance},
|
|
151
|
+
speed=10,
|
|
152
|
+
relative_move=True,
|
|
153
|
+
expect_stalls=True,
|
|
154
|
+
)
|
|
155
|
+
except PositionUnknownError:
|
|
156
|
+
# if this happens it's from the get position after the move and we can ignore it
|
|
157
|
+
pass
|
|
158
|
+
|
|
159
|
+
await ot3_hardware_api.update_axis_position_estimations(
|
|
160
|
+
self._gantry_mover.motor_axes_to_present_hardware_axes([mount_axis])
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Drive mount down for press-fit
|
|
164
|
+
try:
|
|
165
|
+
await self._gantry_mover.move_axes(
|
|
166
|
+
axis_map={mount_axis: press_distance},
|
|
167
|
+
speed=10.0,
|
|
168
|
+
relative_move=True,
|
|
169
|
+
expect_stalls=True,
|
|
170
|
+
)
|
|
171
|
+
except PositionUnknownError:
|
|
172
|
+
# if this happens it's from the get position after the move and we can ignore it
|
|
173
|
+
pass
|
|
174
|
+
|
|
175
|
+
await ot3_hardware_api.update_axis_position_estimations(
|
|
176
|
+
self._gantry_mover.motor_axes_to_present_hardware_axes([mount_axis])
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
try:
|
|
180
|
+
await self._gantry_mover.move_axes(
|
|
181
|
+
axis_map={mount_axis: retract_distance}, speed=5.5, relative_move=True
|
|
182
|
+
)
|
|
183
|
+
except PositionUnknownError:
|
|
184
|
+
# if this happens it's from the get position after the move and we can ignore it
|
|
185
|
+
pass
|
|
186
|
+
|
|
187
|
+
await ot3_hardware_api.update_axis_position_estimations(
|
|
188
|
+
self._gantry_mover.motor_axes_to_present_hardware_axes([mount_axis])
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
async def cam_action_relative_pickup_tip(
|
|
192
|
+
self,
|
|
193
|
+
tip_pick_up_params: TipPickUpParams,
|
|
194
|
+
mount: MountType,
|
|
195
|
+
) -> None:
|
|
196
|
+
"""A cam action pick up command using gantry moves."""
|
|
197
|
+
prep_distance = tip_pick_up_params.prepDistance
|
|
198
|
+
press_distance = tip_pick_up_params.pressDistance
|
|
199
|
+
ejector_push_mm = tip_pick_up_params.ejectorPushMm
|
|
200
|
+
retract_distance = -1 * (prep_distance + press_distance)
|
|
201
|
+
|
|
202
|
+
mount_axis = MotorAxis.LEFT_Z if mount == MountType.LEFT else MotorAxis.RIGHT_Z
|
|
203
|
+
|
|
204
|
+
# TODO chb, 2025-01-29): Factor out the movement constants and relocate this logic into the hardware controller
|
|
205
|
+
await self._gantry_mover.move_axes(
|
|
206
|
+
axis_map={mount_axis: -6}, speed=10, relative_move=True
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# Drive Q down 3mm at fast speed - look into the pick up tip fuinction to find slow and fast: 10.0
|
|
210
|
+
await self._gantry_mover.move_axes(
|
|
211
|
+
axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: prep_distance},
|
|
212
|
+
speed=10.0,
|
|
213
|
+
relative_move=True,
|
|
214
|
+
)
|
|
215
|
+
# 2.8mm at slow speed - cam action pickup speed: 5.5
|
|
216
|
+
await self._gantry_mover.move_axes(
|
|
217
|
+
axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: press_distance},
|
|
218
|
+
speed=5.5,
|
|
219
|
+
relative_move=True,
|
|
220
|
+
)
|
|
221
|
+
# retract cam : 11.05
|
|
222
|
+
await self._gantry_mover.move_axes(
|
|
223
|
+
axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: retract_distance},
|
|
224
|
+
speed=5.5,
|
|
225
|
+
relative_move=True,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
# Lower tip presence
|
|
229
|
+
await self._gantry_mover.move_axes(
|
|
230
|
+
axis_map={mount_axis: 2}, speed=10, relative_move=True
|
|
231
|
+
)
|
|
232
|
+
await self._gantry_mover.move_axes(
|
|
233
|
+
axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: ejector_push_mm},
|
|
234
|
+
speed=5.5,
|
|
235
|
+
relative_move=True,
|
|
236
|
+
)
|
|
237
|
+
await self._gantry_mover.move_axes(
|
|
238
|
+
axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: -1 * ejector_push_mm},
|
|
239
|
+
speed=5.5,
|
|
240
|
+
relative_move=True,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
async def execute(
|
|
244
|
+
self, params: SealPipetteToTipParams
|
|
245
|
+
) -> Union[SuccessData[SealPipetteToTipResult], _ExecuteReturn]:
|
|
246
|
+
"""Move to and pick up a tip using the requested pipette."""
|
|
247
|
+
pipette_id = params.pipetteId
|
|
248
|
+
labware_id = params.labwareId
|
|
249
|
+
well_name = params.wellName
|
|
250
|
+
|
|
251
|
+
well_location = self._state_view.geometry.convert_pick_up_tip_well_location(
|
|
252
|
+
well_location=params.wellLocation
|
|
253
|
+
)
|
|
254
|
+
move_result = await move_to_well(
|
|
255
|
+
movement=self._movement,
|
|
256
|
+
model_utils=self._model_utils,
|
|
257
|
+
pipette_id=pipette_id,
|
|
258
|
+
labware_id=labware_id,
|
|
259
|
+
well_name=well_name,
|
|
260
|
+
well_location=well_location,
|
|
261
|
+
)
|
|
262
|
+
if isinstance(move_result, DefinedErrorData):
|
|
263
|
+
return move_result
|
|
264
|
+
|
|
265
|
+
# Aspirate to move plunger to a maximum volume position per pipette type
|
|
266
|
+
tip_geometry = self._state_view.geometry.get_nominal_tip_geometry(
|
|
267
|
+
pipette_id, labware_id, well_name
|
|
268
|
+
)
|
|
269
|
+
if self._state_view.pipettes.get_mount(pipette_id) == MountType.LEFT:
|
|
270
|
+
await self._hardware_api.home(axes=[Axis.P_L])
|
|
271
|
+
else:
|
|
272
|
+
await self._hardware_api.home(axes=[Axis.P_R])
|
|
273
|
+
|
|
274
|
+
# Begin relative pickup steps for the resin tips
|
|
275
|
+
|
|
276
|
+
channels = self._state_view.pipettes.get_active_channels(pipette_id)
|
|
277
|
+
mount = self._state_view.pipettes.get_mount(pipette_id)
|
|
278
|
+
tip_pick_up_params = params.tipPickUpParams
|
|
279
|
+
|
|
280
|
+
if channels == 96:
|
|
281
|
+
if tip_pick_up_params is None:
|
|
282
|
+
tip_pick_up_params = TipPickUpParams(
|
|
283
|
+
prepDistance=_CAM_PREP_DISTANCE_DEFAULT,
|
|
284
|
+
pressDistance=_CAM_PRESS_DISTANCE_DEFAULT,
|
|
285
|
+
ejectorPushMm=_CAM_EJECTOR_PUSH_MM_DEFAULT,
|
|
286
|
+
)
|
|
287
|
+
await self.cam_action_relative_pickup_tip(
|
|
288
|
+
tip_pick_up_params=tip_pick_up_params,
|
|
289
|
+
mount=mount,
|
|
290
|
+
)
|
|
291
|
+
else:
|
|
292
|
+
if tip_pick_up_params is None:
|
|
293
|
+
tip_pick_up_params = TipPickUpParams(
|
|
294
|
+
prepDistance=_PRESS_FIT_PREP_DISTANCE_DEFAULT,
|
|
295
|
+
pressDistance=_PRESS_FIT_PRESS_DISTANCE_DEFAULT,
|
|
296
|
+
ejectorPushMm=_PRESS_FIT_EJECTOR_PUSH_MM_DEFAULT,
|
|
297
|
+
)
|
|
298
|
+
await self.relative_pickup_tip(
|
|
299
|
+
tip_pick_up_params=tip_pick_up_params,
|
|
300
|
+
mount=mount,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
# cache_tip
|
|
304
|
+
if self._state_view.config.use_virtual_pipettes is False:
|
|
305
|
+
self._tip_handler.cache_tip(pipette_id, tip_geometry)
|
|
306
|
+
hw_instr = self._hardware_api.hardware_instruments[mount.to_hw_mount()]
|
|
307
|
+
if hw_instr is not None:
|
|
308
|
+
hw_instr.set_current_volume(_SAFE_TOP_VOLUME)
|
|
309
|
+
|
|
310
|
+
state_update = move_result.state_update.update_pipette_tip_state(
|
|
311
|
+
pipette_id=pipette_id,
|
|
312
|
+
tip_geometry=tip_geometry,
|
|
313
|
+
tip_source=LabwareWellId(labware_id=labware_id, well_name=well_name),
|
|
314
|
+
).set_fluid_aspirated(
|
|
315
|
+
pipette_id=pipette_id,
|
|
316
|
+
fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=_SAFE_TOP_VOLUME),
|
|
317
|
+
)
|
|
318
|
+
return SuccessData(
|
|
319
|
+
public=SealPipetteToTipResult(
|
|
320
|
+
tipVolume=tip_geometry.volume,
|
|
321
|
+
tipLength=tip_geometry.length,
|
|
322
|
+
tipDiameter=tip_geometry.diameter,
|
|
323
|
+
position=move_result.public.position,
|
|
324
|
+
),
|
|
325
|
+
state_update=state_update,
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class SealPipetteToTip(
|
|
330
|
+
BaseCommand[
|
|
331
|
+
SealPipetteToTipParams,
|
|
332
|
+
SealPipetteToTipResult,
|
|
333
|
+
StallOrCollisionError,
|
|
334
|
+
]
|
|
335
|
+
):
|
|
336
|
+
"""Seal tip command model."""
|
|
337
|
+
|
|
338
|
+
commandType: SealPipetteToTipCommandType = "sealPipetteToTip"
|
|
339
|
+
params: SealPipetteToTipParams
|
|
340
|
+
result: Optional[SealPipetteToTipResult] = None
|
|
341
|
+
|
|
342
|
+
_ImplementationCls: Type[
|
|
343
|
+
SealPipetteToTipImplementation
|
|
344
|
+
] = SealPipetteToTipImplementation
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
class SealPipetteToTipCreate(BaseCommandCreate[SealPipetteToTipParams]):
|
|
348
|
+
"""Seal tip command creation request model."""
|
|
349
|
+
|
|
350
|
+
commandType: SealPipetteToTipCommandType = "sealPipetteToTip"
|
|
351
|
+
params: SealPipetteToTipParams
|
|
352
|
+
|
|
353
|
+
_CommandCls: Type[SealPipetteToTip] = SealPipetteToTip
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""setRailLights command request, result, and implementation models."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
|
|
7
|
+
from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
8
|
+
from ..errors.error_occurrence import ErrorOccurrence
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from ..execution import RailLightsHandler
|
|
12
|
+
|
|
13
|
+
SetRailLightsCommandType = Literal["setRailLights"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SetRailLightsParams(BaseModel):
|
|
17
|
+
"""Payload required to set the rail lights on or off."""
|
|
18
|
+
|
|
19
|
+
on: bool = Field(
|
|
20
|
+
...,
|
|
21
|
+
description="The field that determines if the light is turned off or on.",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SetRailLightsResult(BaseModel):
|
|
26
|
+
"""Result data from the execution of a setRailLights command."""
|
|
27
|
+
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SetRailLightsImplementation(
|
|
32
|
+
AbstractCommandImpl[SetRailLightsParams, SuccessData[SetRailLightsResult]]
|
|
33
|
+
):
|
|
34
|
+
"""setRailLights command implementation."""
|
|
35
|
+
|
|
36
|
+
def __init__(self, rail_lights: RailLightsHandler, **kwargs: object) -> None:
|
|
37
|
+
self._rail_lights = rail_lights
|
|
38
|
+
|
|
39
|
+
async def execute(
|
|
40
|
+
self, params: SetRailLightsParams
|
|
41
|
+
) -> SuccessData[SetRailLightsResult]:
|
|
42
|
+
"""Dispatch a set lights command setting the state of the rail lights."""
|
|
43
|
+
await self._rail_lights.set_rail_lights(params.on)
|
|
44
|
+
return SuccessData(
|
|
45
|
+
public=SetRailLightsResult(),
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class SetRailLights(
|
|
50
|
+
BaseCommand[SetRailLightsParams, SetRailLightsResult, ErrorOccurrence]
|
|
51
|
+
):
|
|
52
|
+
"""setRailLights command model."""
|
|
53
|
+
|
|
54
|
+
commandType: SetRailLightsCommandType = "setRailLights"
|
|
55
|
+
params: SetRailLightsParams
|
|
56
|
+
result: Optional[SetRailLightsResult] = None
|
|
57
|
+
|
|
58
|
+
_ImplementationCls: Type[SetRailLightsImplementation] = SetRailLightsImplementation
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class SetRailLightsCreate(BaseCommandCreate[SetRailLightsParams]):
|
|
62
|
+
"""setRailLights command request model."""
|
|
63
|
+
|
|
64
|
+
commandType: SetRailLightsCommandType = "setRailLights"
|
|
65
|
+
params: SetRailLightsParams
|
|
66
|
+
|
|
67
|
+
_CommandCls: Type[SetRailLights] = SetRailLights
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""setStatusBar command request, result, and implementation models."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
import enum
|
|
7
|
+
|
|
8
|
+
from opentrons.hardware_control.types import StatusBarState
|
|
9
|
+
from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
10
|
+
from ..errors.error_occurrence import ErrorOccurrence
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from ..execution import StatusBarHandler
|
|
14
|
+
|
|
15
|
+
SetStatusBarCommandType = Literal["setStatusBar"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class StatusBarAnimation(enum.Enum):
|
|
19
|
+
"""Status Bar animation options."""
|
|
20
|
+
|
|
21
|
+
IDLE = "idle"
|
|
22
|
+
CONFIRM = "confirm"
|
|
23
|
+
UPDATING = "updating"
|
|
24
|
+
DISCO = "disco"
|
|
25
|
+
OFF = "off"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _animation_to_status_bar_state(animation: StatusBarAnimation) -> StatusBarState:
|
|
29
|
+
return {
|
|
30
|
+
StatusBarAnimation.IDLE: StatusBarState.IDLE,
|
|
31
|
+
StatusBarAnimation.CONFIRM: StatusBarState.CONFIRMATION,
|
|
32
|
+
StatusBarAnimation.UPDATING: StatusBarState.UPDATING,
|
|
33
|
+
StatusBarAnimation.DISCO: StatusBarState.DISCO,
|
|
34
|
+
StatusBarAnimation.OFF: StatusBarState.OFF,
|
|
35
|
+
}[animation]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SetStatusBarParams(BaseModel):
|
|
39
|
+
"""Payload required to set the status bar to run an animation."""
|
|
40
|
+
|
|
41
|
+
animation: StatusBarAnimation = Field(
|
|
42
|
+
...,
|
|
43
|
+
description="The animation that should be executed on the status bar.",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class SetStatusBarResult(BaseModel):
|
|
48
|
+
"""Result data from the execution of a SetStatusBar command."""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SetStatusBarImplementation(
|
|
52
|
+
AbstractCommandImpl[SetStatusBarParams, SuccessData[SetStatusBarResult]]
|
|
53
|
+
):
|
|
54
|
+
"""setStatusBar command implementation."""
|
|
55
|
+
|
|
56
|
+
def __init__(self, status_bar: StatusBarHandler, **kwargs: object) -> None:
|
|
57
|
+
self._status_bar = status_bar
|
|
58
|
+
|
|
59
|
+
async def execute(
|
|
60
|
+
self, params: SetStatusBarParams
|
|
61
|
+
) -> SuccessData[SetStatusBarResult]:
|
|
62
|
+
"""Execute the setStatusBar command."""
|
|
63
|
+
if not self._status_bar.status_bar_should_not_be_changed():
|
|
64
|
+
state = _animation_to_status_bar_state(params.animation)
|
|
65
|
+
await self._status_bar.set_status_bar(state)
|
|
66
|
+
return SuccessData(
|
|
67
|
+
public=SetStatusBarResult(),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class SetStatusBar(
|
|
72
|
+
BaseCommand[SetStatusBarParams, SetStatusBarResult, ErrorOccurrence]
|
|
73
|
+
):
|
|
74
|
+
"""setStatusBar command model."""
|
|
75
|
+
|
|
76
|
+
commandType: SetStatusBarCommandType = "setStatusBar"
|
|
77
|
+
params: SetStatusBarParams
|
|
78
|
+
result: Optional[SetStatusBarResult] = None
|
|
79
|
+
|
|
80
|
+
_ImplementationCls: Type[SetStatusBarImplementation] = SetStatusBarImplementation
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SetStatusBarCreate(BaseCommandCreate[SetStatusBarParams]):
|
|
84
|
+
"""setStatusBar command request model."""
|
|
85
|
+
|
|
86
|
+
commandType: SetStatusBarCommandType = "setStatusBar"
|
|
87
|
+
params: SetStatusBarParams
|
|
88
|
+
|
|
89
|
+
_CommandCls: Type[SetStatusBar] = SetStatusBar
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Temperature Module protocol commands."""
|
|
2
|
+
|
|
3
|
+
from .set_target_temperature import (
|
|
4
|
+
SetTargetTemperature,
|
|
5
|
+
SetTargetTemperatureCreate,
|
|
6
|
+
SetTargetTemperatureParams,
|
|
7
|
+
SetTargetTemperatureResult,
|
|
8
|
+
SetTargetTemperatureCommandType,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from .wait_for_temperature import (
|
|
12
|
+
WaitForTemperature,
|
|
13
|
+
WaitForTemperatureCreate,
|
|
14
|
+
WaitForTemperatureParams,
|
|
15
|
+
WaitForTemperatureResult,
|
|
16
|
+
WaitForTemperatureCommandType,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from .deactivate import (
|
|
20
|
+
DeactivateTemperature,
|
|
21
|
+
DeactivateTemperatureCreate,
|
|
22
|
+
DeactivateTemperatureParams,
|
|
23
|
+
DeactivateTemperatureResult,
|
|
24
|
+
DeactivateTemperatureCommandType,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
# temperatureModule/setTargetTemperature
|
|
29
|
+
"SetTargetTemperature",
|
|
30
|
+
"SetTargetTemperatureCreate",
|
|
31
|
+
"SetTargetTemperatureParams",
|
|
32
|
+
"SetTargetTemperatureResult",
|
|
33
|
+
"SetTargetTemperatureCommandType",
|
|
34
|
+
# temperatureModule/waitForTemperature
|
|
35
|
+
"WaitForTemperature",
|
|
36
|
+
"WaitForTemperatureCreate",
|
|
37
|
+
"WaitForTemperatureParams",
|
|
38
|
+
"WaitForTemperatureResult",
|
|
39
|
+
"WaitForTemperatureCommandType",
|
|
40
|
+
# temperatureModule/deactivateTemperature
|
|
41
|
+
"DeactivateTemperature",
|
|
42
|
+
"DeactivateTemperatureCreate",
|
|
43
|
+
"DeactivateTemperatureParams",
|
|
44
|
+
"DeactivateTemperatureResult",
|
|
45
|
+
"DeactivateTemperatureCommandType",
|
|
46
|
+
]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Command models to deactivate a Temperature Module."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, TYPE_CHECKING
|
|
4
|
+
from typing_extensions import Literal, Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
9
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
13
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
14
|
+
|
|
15
|
+
DeactivateTemperatureCommandType = Literal["temperatureModule/deactivate"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DeactivateTemperatureParams(BaseModel):
|
|
19
|
+
"""Input parameters to deactivate a Temperature Module."""
|
|
20
|
+
|
|
21
|
+
moduleId: str = Field(..., description="Unique ID of the Temperature Module.")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DeactivateTemperatureResult(BaseModel):
|
|
25
|
+
"""Result data from deactivating a Temperature Module."""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class DeactivateTemperatureImpl(
|
|
29
|
+
AbstractCommandImpl[
|
|
30
|
+
DeactivateTemperatureParams, SuccessData[DeactivateTemperatureResult]
|
|
31
|
+
]
|
|
32
|
+
):
|
|
33
|
+
"""Execution implementation of a Temperature Module's deactivate command."""
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
state_view: StateView,
|
|
38
|
+
equipment: EquipmentHandler,
|
|
39
|
+
**unused_dependencies: object,
|
|
40
|
+
) -> None:
|
|
41
|
+
self._state_view = state_view
|
|
42
|
+
self._equipment = equipment
|
|
43
|
+
|
|
44
|
+
async def execute(
|
|
45
|
+
self, params: DeactivateTemperatureParams
|
|
46
|
+
) -> SuccessData[DeactivateTemperatureResult]:
|
|
47
|
+
"""Deactivate a Temperature Module."""
|
|
48
|
+
# Allow propagation of ModuleNotLoadedError and WrongModuleTypeError.
|
|
49
|
+
module_substate = self._state_view.modules.get_temperature_module_substate(
|
|
50
|
+
module_id=params.moduleId
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# Allow propagation of ModuleNotAttachedError.
|
|
54
|
+
temp_hardware_module = self._equipment.get_module_hardware_api(
|
|
55
|
+
module_substate.module_id
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
if temp_hardware_module is not None:
|
|
59
|
+
await temp_hardware_module.deactivate()
|
|
60
|
+
return SuccessData(
|
|
61
|
+
public=DeactivateTemperatureResult(),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class DeactivateTemperature(
|
|
66
|
+
BaseCommand[
|
|
67
|
+
DeactivateTemperatureParams, DeactivateTemperatureResult, ErrorOccurrence
|
|
68
|
+
]
|
|
69
|
+
):
|
|
70
|
+
"""A command to deactivate a Temperature Module."""
|
|
71
|
+
|
|
72
|
+
commandType: DeactivateTemperatureCommandType = "temperatureModule/deactivate"
|
|
73
|
+
|
|
74
|
+
params: DeactivateTemperatureParams
|
|
75
|
+
result: Optional[DeactivateTemperatureResult] = None
|
|
76
|
+
|
|
77
|
+
_ImplementationCls: Type[DeactivateTemperatureImpl] = DeactivateTemperatureImpl
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class DeactivateTemperatureCreate(BaseCommandCreate[DeactivateTemperatureParams]):
|
|
81
|
+
"""A request to deactivate a Temperature Module."""
|
|
82
|
+
|
|
83
|
+
commandType: DeactivateTemperatureCommandType = "temperatureModule/deactivate"
|
|
84
|
+
params: DeactivateTemperatureParams
|
|
85
|
+
|
|
86
|
+
_CommandCls: Type[DeactivateTemperature] = DeactivateTemperature
|