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,25 @@
|
|
|
1
|
+
"""Rail Lights command handling."""
|
|
2
|
+
|
|
3
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class RailLightsHandler:
|
|
7
|
+
"""Handle interaction with the rail lights."""
|
|
8
|
+
|
|
9
|
+
_hardware_api: HardwareControlAPI
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
hardware_api: HardwareControlAPI,
|
|
14
|
+
) -> None:
|
|
15
|
+
"""Initialize a RailLightsHandler instance."""
|
|
16
|
+
self._hardware_api = hardware_api
|
|
17
|
+
|
|
18
|
+
async def set_rail_lights(
|
|
19
|
+
self,
|
|
20
|
+
on: bool,
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Set the rail lights."""
|
|
23
|
+
await self._hardware_api.set_lights(
|
|
24
|
+
rails=on,
|
|
25
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Run control command side-effect logic."""
|
|
2
|
+
import asyncio
|
|
3
|
+
|
|
4
|
+
from ..state.state import StateStore
|
|
5
|
+
from ..actions import ActionDispatcher, PauseAction, PauseSource
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RunControlHandler:
|
|
9
|
+
"""Implementation logic for protocol run control."""
|
|
10
|
+
|
|
11
|
+
_state_store: StateStore
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
state_store: StateStore,
|
|
16
|
+
action_dispatcher: ActionDispatcher,
|
|
17
|
+
) -> None:
|
|
18
|
+
"""Initialize a RunControlHandler instance."""
|
|
19
|
+
self._state_store = state_store
|
|
20
|
+
self._action_dispatcher = action_dispatcher
|
|
21
|
+
|
|
22
|
+
async def wait_for_resume(self) -> None:
|
|
23
|
+
"""Issue a PauseAction to the store, pausing the run."""
|
|
24
|
+
if not self._state_store.config.ignore_pause:
|
|
25
|
+
self._action_dispatcher.dispatch(PauseAction(source=PauseSource.PROTOCOL))
|
|
26
|
+
await self._state_store.wait_for(
|
|
27
|
+
condition=self._state_store.commands.get_is_running
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
async def wait_for_duration(self, seconds: float) -> None:
|
|
31
|
+
"""Delay protocol execution for a duration."""
|
|
32
|
+
if not self._state_store.config.ignore_pause:
|
|
33
|
+
await asyncio.sleep(seconds)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Status Bar command handling."""
|
|
2
|
+
|
|
3
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
4
|
+
from opentrons.hardware_control.types import StatusBarState
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class StatusBarHandler:
|
|
8
|
+
"""Handle interaction with the status bar."""
|
|
9
|
+
|
|
10
|
+
_hardware_api: HardwareControlAPI
|
|
11
|
+
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
hardware_api: HardwareControlAPI,
|
|
15
|
+
) -> None:
|
|
16
|
+
"""Initialize a StatusBarHandler instance."""
|
|
17
|
+
self._hardware_api = hardware_api
|
|
18
|
+
|
|
19
|
+
async def set_status_bar(
|
|
20
|
+
self,
|
|
21
|
+
status: StatusBarState,
|
|
22
|
+
) -> None:
|
|
23
|
+
"""Set the status bar."""
|
|
24
|
+
await self._hardware_api.set_status_bar_state(state=status)
|
|
25
|
+
|
|
26
|
+
def status_bar_should_not_be_changed(self) -> bool:
|
|
27
|
+
"""Checks whether the status bar is seemingly busy."""
|
|
28
|
+
state = self._hardware_api.get_status_bar_state()
|
|
29
|
+
|
|
30
|
+
return state not in [
|
|
31
|
+
StatusBarState.IDLE,
|
|
32
|
+
StatusBarState.UPDATING,
|
|
33
|
+
StatusBarState.OFF,
|
|
34
|
+
]
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""Helpers for flagging unsafe movements to a Thermocycler Module."""
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from opentrons.drivers.types import ThermocyclerLidStatus
|
|
5
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
6
|
+
from opentrons.hardware_control.modules import Thermocycler as HardwareThermocycler
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
from opentrons.protocol_engine.state.module_substates import ThermocyclerModuleId
|
|
10
|
+
from ..types import ModuleLocation, LabwareLocation
|
|
11
|
+
from ..state.state import StateStore
|
|
12
|
+
from ..errors import ThermocyclerNotOpenError, WrongModuleTypeError
|
|
13
|
+
|
|
14
|
+
from .equipment import EquipmentHandler
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ThermocyclerMovementFlagger:
|
|
18
|
+
"""A helper for flagging unsafe movements to a Thermocycler Module.
|
|
19
|
+
|
|
20
|
+
This is only intended for use by movement handlers.
|
|
21
|
+
It's a separate class for independent testability.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
state_store: StateStore,
|
|
27
|
+
hardware_api: HardwareControlAPI,
|
|
28
|
+
equipment: EquipmentHandler,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Initialize the ThermocyclerMovementFlagger.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
state_store: The Protocol Engine state store interface. Used to figure out
|
|
34
|
+
which Thermocycler a labware is in, if any.
|
|
35
|
+
hardware_api: The underlying hardware interface. Used to query
|
|
36
|
+
Thermocyclers' current lid states.
|
|
37
|
+
equipment: The protocol engine interface to move a present thermocycler to an
|
|
38
|
+
operable state if need be.
|
|
39
|
+
"""
|
|
40
|
+
self._state_store = state_store
|
|
41
|
+
self._hardware_api = hardware_api
|
|
42
|
+
self._equipment = equipment
|
|
43
|
+
|
|
44
|
+
async def _verify_tc_lid_status(self, module_id: str) -> None:
|
|
45
|
+
"""Ensure the thermocycler's lid state is correct or raise an error."""
|
|
46
|
+
try:
|
|
47
|
+
hw_tc_lid_status = await self._get_hardware_thermocycler_lid_status(
|
|
48
|
+
module_id=module_id
|
|
49
|
+
)
|
|
50
|
+
except self._HardwareThermocyclerMissingError as e:
|
|
51
|
+
raise ThermocyclerNotOpenError(
|
|
52
|
+
"Thermocycler must be open when moving to labware inside it,"
|
|
53
|
+
" but can't confirm Thermocycler's current status."
|
|
54
|
+
) from e
|
|
55
|
+
|
|
56
|
+
if (
|
|
57
|
+
hw_tc_lid_status == ThermocyclerLidStatus.IN_BETWEEN
|
|
58
|
+
or hw_tc_lid_status == ThermocyclerLidStatus.UNKNOWN
|
|
59
|
+
):
|
|
60
|
+
# NOTE(cm): due to a potential hardware bug, the thermocycler might lose its position
|
|
61
|
+
# status when idling in an open position and default to UNKNOWN or IN_BETWEEN.
|
|
62
|
+
# This tries to recover only from an unexpected known position.
|
|
63
|
+
await self._open_tc_lid(module_id=module_id)
|
|
64
|
+
hw_tc_lid_status = await self._get_hardware_thermocycler_lid_status(
|
|
65
|
+
module_id=module_id
|
|
66
|
+
)
|
|
67
|
+
if hw_tc_lid_status != ThermocyclerLidStatus.OPEN:
|
|
68
|
+
raise ThermocyclerNotOpenError(
|
|
69
|
+
f"Thermocycler must be open when moving to labware inside it,"
|
|
70
|
+
f' but Thermocycler is currently "{hw_tc_lid_status}".'
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
async def _open_tc_lid(self, module_id: str) -> None:
|
|
74
|
+
"""Try to open the thermocycler lid."""
|
|
75
|
+
tc_hardware = self._equipment.get_module_hardware_api(
|
|
76
|
+
ThermocyclerModuleId(module_id)
|
|
77
|
+
)
|
|
78
|
+
if tc_hardware:
|
|
79
|
+
await tc_hardware.open()
|
|
80
|
+
|
|
81
|
+
async def ensure_labware_in_open_thermocycler(
|
|
82
|
+
self, labware_parent: LabwareLocation
|
|
83
|
+
) -> None:
|
|
84
|
+
"""Flag unsafe movements to a Thermocycler.
|
|
85
|
+
|
|
86
|
+
If the given labware is in a Thermocycler, and that Thermocycler's lid isn't
|
|
87
|
+
currently open according the engine's thermocycler state as well as
|
|
88
|
+
the hardware API (for non-virtual modules), tries to open the thermocycler lid.
|
|
89
|
+
If this is unsuccessful, raises ThermocyclerNotOpenError.
|
|
90
|
+
If it is a virtual module, checks only for thermocycler lid state in engine.
|
|
91
|
+
|
|
92
|
+
Otherwise, no-ops.
|
|
93
|
+
|
|
94
|
+
Warning:
|
|
95
|
+
Various limitations with our hardware API and Thermocycler firmware mean
|
|
96
|
+
this method can't detect every case where the Thermocycler lid is non-open.
|
|
97
|
+
|
|
98
|
+
1. While the lid is in transit, the Thermocycler doesn't respond to status
|
|
99
|
+
polls.
|
|
100
|
+
2. The Thermocycler doesn't report when the user presses its physical
|
|
101
|
+
lid open button; we have to wait for the next poll to find out, which
|
|
102
|
+
can be tens of seconds because of (1).
|
|
103
|
+
3. Nothing protects the Thermocycler hardware controller from being accessed
|
|
104
|
+
concurrently by multiple tasks.
|
|
105
|
+
And updating the Thermocycler state from one task doesn't guarantee that
|
|
106
|
+
that update will be immediately visible from a different task.
|
|
107
|
+
So, for example, if a legacy module control HTTP endpoint starts closing
|
|
108
|
+
the Thermocycler, and then a Protocol Engine task quickly polls the
|
|
109
|
+
Thermocycler through this method, this method may see the lid as open
|
|
110
|
+
even though it's in transit.
|
|
111
|
+
"""
|
|
112
|
+
if isinstance(labware_parent, ModuleLocation):
|
|
113
|
+
module_id = labware_parent.moduleId
|
|
114
|
+
else:
|
|
115
|
+
return # Labware not on a module.
|
|
116
|
+
try:
|
|
117
|
+
tc_substate = self._state_store.modules.get_thermocycler_module_substate(
|
|
118
|
+
module_id=module_id
|
|
119
|
+
)
|
|
120
|
+
except WrongModuleTypeError:
|
|
121
|
+
return # Labware on a module, but not a Thermocycler.
|
|
122
|
+
|
|
123
|
+
if not tc_substate.is_lid_open:
|
|
124
|
+
raise ThermocyclerNotOpenError(
|
|
125
|
+
"Thermocycler must be open when moving to labware inside it."
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# There is a chance that the engine might not have the latest lid status;
|
|
129
|
+
# do a hardware state check just to be sure that the lid is truly open.
|
|
130
|
+
if not self._state_store.config.use_virtual_modules:
|
|
131
|
+
await self._verify_tc_lid_status(module_id=module_id)
|
|
132
|
+
|
|
133
|
+
async def _get_hardware_thermocycler_lid_status(
|
|
134
|
+
self,
|
|
135
|
+
module_id: str,
|
|
136
|
+
) -> ThermocyclerLidStatus:
|
|
137
|
+
"""Get lid status of the hardware Thermocycler corresponding with the module ID.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Lid status of the requested attached thermocycler.
|
|
141
|
+
|
|
142
|
+
Raises:
|
|
143
|
+
_HardwareThermocyclerMissingError: If we can't find that Thermocycler in
|
|
144
|
+
the hardware API, so we can't fetch its current lid status.
|
|
145
|
+
It's unclear if this can happen in practice...
|
|
146
|
+
maybe if the module disconnects between when it was loaded into
|
|
147
|
+
Protocol Engine and when this function is called?
|
|
148
|
+
"""
|
|
149
|
+
thermocycler_serial = self._state_store.modules.get_serial_number(
|
|
150
|
+
module_id=module_id
|
|
151
|
+
)
|
|
152
|
+
thermocycler = await self._find_thermocycler_by_serial(
|
|
153
|
+
serial_number=thermocycler_serial
|
|
154
|
+
)
|
|
155
|
+
if thermocycler is None:
|
|
156
|
+
raise self._HardwareThermocyclerMissingError(
|
|
157
|
+
f"No Thermocycler found" f' with serial number "{thermocycler_serial}".'
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
lid_status = thermocycler.lid_status
|
|
161
|
+
# An attached thermocycler should always have lid status unless it's in error
|
|
162
|
+
# or it was just connected and hasn't been polled for status yet.
|
|
163
|
+
assert lid_status is not None, (
|
|
164
|
+
"Did not receive a valid lid status from thermocycler. "
|
|
165
|
+
"Cannot verify safe pipette movement"
|
|
166
|
+
)
|
|
167
|
+
return lid_status
|
|
168
|
+
|
|
169
|
+
async def _find_thermocycler_by_serial(
|
|
170
|
+
self, serial_number: str
|
|
171
|
+
) -> Optional[HardwareThermocycler]:
|
|
172
|
+
"""Find the hardware Thermocycler with the given serial number.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
The matching hardware Thermocycler, or None if none was found.
|
|
176
|
+
"""
|
|
177
|
+
for module in self._hardware_api.attached_modules:
|
|
178
|
+
# Different module types have different keys under .device_info.
|
|
179
|
+
# Thermocyclers should always have .device_info["serial"].
|
|
180
|
+
if (
|
|
181
|
+
isinstance(module, HardwareThermocycler)
|
|
182
|
+
and module.device_info["serial"] == serial_number
|
|
183
|
+
):
|
|
184
|
+
return module
|
|
185
|
+
return None
|
|
186
|
+
|
|
187
|
+
class _HardwareThermocyclerMissingError(Exception):
|
|
188
|
+
pass
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Thermocycler plate lift handling for labware movement using gripper."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import asyncio
|
|
5
|
+
from typing import TYPE_CHECKING, AsyncGenerator, Optional
|
|
6
|
+
from opentrons.hardware_control.modules.thermocycler import Thermocycler
|
|
7
|
+
from opentrons.protocol_engine.types import LabwareLocation, ModuleLocation, ModuleModel
|
|
8
|
+
from opentrons.protocol_engine.state.state import StateStore
|
|
9
|
+
from opentrons.protocol_engine.state.module_substates import ThermocyclerModuleId
|
|
10
|
+
from contextlib import asynccontextmanager
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from opentrons.protocol_engine.execution import EquipmentHandler, MovementHandler
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ThermocyclerPlateLifter:
|
|
17
|
+
"""Implementation logic for TC Gen2 plate lifting."""
|
|
18
|
+
|
|
19
|
+
_state_store: StateStore
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
state_store: StateStore,
|
|
24
|
+
equipment: EquipmentHandler,
|
|
25
|
+
movement: MovementHandler,
|
|
26
|
+
) -> None:
|
|
27
|
+
"""Initialize a ThermocyclerPlateLifter instance."""
|
|
28
|
+
self._state_store = state_store
|
|
29
|
+
self._equipment = equipment
|
|
30
|
+
self._movement = movement
|
|
31
|
+
|
|
32
|
+
def _get_tc_hardware(
|
|
33
|
+
self, labware_location: LabwareLocation
|
|
34
|
+
) -> Optional[Thermocycler]:
|
|
35
|
+
if isinstance(labware_location, ModuleLocation):
|
|
36
|
+
module_id = labware_location.moduleId
|
|
37
|
+
if (
|
|
38
|
+
self._state_store.modules.get_connected_model(module_id)
|
|
39
|
+
== ModuleModel.THERMOCYCLER_MODULE_V2
|
|
40
|
+
):
|
|
41
|
+
# We already verify that TC lid is open before moving labware. So,
|
|
42
|
+
# only assert that that is still true.
|
|
43
|
+
assert self._state_store.modules.get_thermocycler_module_substate(
|
|
44
|
+
module_id
|
|
45
|
+
).is_lid_open, (
|
|
46
|
+
"Thermocycler lid needs to be open before performing a plate lift"
|
|
47
|
+
)
|
|
48
|
+
return self._equipment.get_module_hardware_api(
|
|
49
|
+
ThermocyclerModuleId(labware_location.moduleId)
|
|
50
|
+
)
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
@asynccontextmanager
|
|
54
|
+
async def lift_plate_for_labware_movement(
|
|
55
|
+
self,
|
|
56
|
+
labware_location: LabwareLocation,
|
|
57
|
+
) -> AsyncGenerator[None, None]:
|
|
58
|
+
"""Lift plate if moving labware from Thermocycler Gen2.
|
|
59
|
+
|
|
60
|
+
The 'lift_plate' function unsticks the plate, but does not leave the plate lifted.
|
|
61
|
+
In order to leave the plate in a "lifted" position when picking up with the gripper,
|
|
62
|
+
we need to use another function of the TC that will move the lid motor without returning
|
|
63
|
+
it until the plate has been moved.
|
|
64
|
+
|
|
65
|
+
If we are moving labware from TC Gen2, then there is a chance that the labware
|
|
66
|
+
will need unsticking so it can be picked up. TC gen1 is neither compatible with
|
|
67
|
+
the gripper/OT3 nor does it have any plate lifting mechanism so we no-op for it.
|
|
68
|
+
"""
|
|
69
|
+
thermocycler_hardware = self._get_tc_hardware(labware_location=labware_location)
|
|
70
|
+
if thermocycler_hardware is not None:
|
|
71
|
+
await self._movement.home(axes=None)
|
|
72
|
+
await thermocycler_hardware.lift_plate()
|
|
73
|
+
try:
|
|
74
|
+
await thermocycler_hardware.raise_plate()
|
|
75
|
+
yield
|
|
76
|
+
except asyncio.CancelledError as e:
|
|
77
|
+
raise e
|
|
78
|
+
else:
|
|
79
|
+
await thermocycler_hardware.return_from_raise_plate()
|
|
80
|
+
else:
|
|
81
|
+
yield
|