opentrons 8.6.0__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 +557 -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 +187 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +557 -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/scripts/update_module_fw.py +274 -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 +276 -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 +1186 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +501 -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 +400 -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 +1027 -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 +1006 -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 +3272 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1447 -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 +339 -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 +350 -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 +68 -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 +1164 -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 +2408 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1432 -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 +1515 -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 +310 -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 +310 -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 +852 -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.0.dist-info/METADATA +37 -0
- opentrons-8.6.0.dist-info/RECORD +601 -0
- opentrons-8.6.0.dist-info/WHEEL +4 -0
- opentrons-8.6.0.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Command execution module."""
|
|
2
|
+
|
|
3
|
+
from .command_executor import CommandExecutor
|
|
4
|
+
from .create_queue_worker import create_queue_worker
|
|
5
|
+
from .equipment import (
|
|
6
|
+
EquipmentHandler,
|
|
7
|
+
LoadedLabwareData,
|
|
8
|
+
LoadedPipetteData,
|
|
9
|
+
LoadedModuleData,
|
|
10
|
+
LoadedConfigureForVolumeData,
|
|
11
|
+
ReloadedLabwareData,
|
|
12
|
+
)
|
|
13
|
+
from .movement import MovementHandler
|
|
14
|
+
from .gantry_mover import GantryMover
|
|
15
|
+
from .labware_movement import LabwareMovementHandler
|
|
16
|
+
from .pipetting import PipettingHandler
|
|
17
|
+
from .tip_handler import TipHandler
|
|
18
|
+
from .queue_worker import QueueWorker
|
|
19
|
+
from .rail_lights import RailLightsHandler
|
|
20
|
+
from .run_control import RunControlHandler
|
|
21
|
+
from .hardware_stopper import HardwareStopper
|
|
22
|
+
from .door_watcher import DoorWatcher
|
|
23
|
+
from .status_bar import StatusBarHandler
|
|
24
|
+
from ..resources.file_provider import FileProvider
|
|
25
|
+
|
|
26
|
+
# .thermocycler_movement_flagger omitted from package's public interface.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"CommandExecutor",
|
|
31
|
+
"create_queue_worker",
|
|
32
|
+
"EquipmentHandler",
|
|
33
|
+
"LoadedLabwareData",
|
|
34
|
+
"ReloadedLabwareData",
|
|
35
|
+
"LoadedPipetteData",
|
|
36
|
+
"LoadedModuleData",
|
|
37
|
+
"LoadedConfigureForVolumeData",
|
|
38
|
+
"MovementHandler",
|
|
39
|
+
"GantryMover",
|
|
40
|
+
"PipettingHandler",
|
|
41
|
+
"TipHandler",
|
|
42
|
+
"LabwareMovementHandler",
|
|
43
|
+
"QueueWorker",
|
|
44
|
+
"RunControlHandler",
|
|
45
|
+
"HardwareStopper",
|
|
46
|
+
"DoorWatcher",
|
|
47
|
+
"RailLightsHandler",
|
|
48
|
+
"StatusBarHandler",
|
|
49
|
+
"FileProvider",
|
|
50
|
+
]
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Command side-effect execution logic container."""
|
|
2
|
+
import asyncio
|
|
3
|
+
from logging import getLogger
|
|
4
|
+
from typing import Optional, List, Protocol
|
|
5
|
+
|
|
6
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
7
|
+
|
|
8
|
+
from opentrons_shared_data.errors.exceptions import (
|
|
9
|
+
EStopActivatedError,
|
|
10
|
+
EnumeratedError,
|
|
11
|
+
PythonException,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from opentrons.protocol_engine.commands.command import SuccessData
|
|
15
|
+
from opentrons.protocol_engine.notes import make_error_recovery_debug_note
|
|
16
|
+
|
|
17
|
+
from ..state.state import StateStore
|
|
18
|
+
from ..resources import ModelUtils, FileProvider
|
|
19
|
+
from ..commands import CommandStatus
|
|
20
|
+
from ..actions import (
|
|
21
|
+
ActionDispatcher,
|
|
22
|
+
RunCommandAction,
|
|
23
|
+
SucceedCommandAction,
|
|
24
|
+
FailCommandAction,
|
|
25
|
+
)
|
|
26
|
+
from ..errors import RunStoppedError
|
|
27
|
+
from ..errors.exceptions import EStopActivatedError as PE_EStopActivatedError
|
|
28
|
+
from ..notes import CommandNote, CommandNoteTracker
|
|
29
|
+
from .equipment import EquipmentHandler
|
|
30
|
+
from .movement import MovementHandler
|
|
31
|
+
from .gantry_mover import GantryMover
|
|
32
|
+
from .labware_movement import LabwareMovementHandler
|
|
33
|
+
from .pipetting import PipettingHandler
|
|
34
|
+
from .tip_handler import TipHandler
|
|
35
|
+
from .run_control import RunControlHandler
|
|
36
|
+
from .rail_lights import RailLightsHandler
|
|
37
|
+
from .status_bar import StatusBarHandler
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
log = getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class CommandNoteTrackerProvider(Protocol):
|
|
44
|
+
"""The correct shape for a function that provides a CommandNoteTracker.
|
|
45
|
+
|
|
46
|
+
This function will be called by the executor once for each call to execute().
|
|
47
|
+
It is mostly useful for testing harnesses.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __call__(self) -> CommandNoteTracker:
|
|
51
|
+
"""Provide a new CommandNoteTracker."""
|
|
52
|
+
...
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class _NoteTracker(CommandNoteTracker):
|
|
56
|
+
def __init__(self) -> None:
|
|
57
|
+
self._notes: List[CommandNote] = []
|
|
58
|
+
|
|
59
|
+
def __call__(self, note: CommandNote) -> None:
|
|
60
|
+
self._notes.append(note)
|
|
61
|
+
|
|
62
|
+
def get_notes(self) -> List[CommandNote]:
|
|
63
|
+
return self._notes
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class CommandExecutor:
|
|
67
|
+
"""CommandExecutor container class.
|
|
68
|
+
|
|
69
|
+
CommandExecutor manages various child handlers that define procedures to
|
|
70
|
+
execute the side-effects of commands.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
75
|
+
hardware_api: HardwareControlAPI,
|
|
76
|
+
file_provider: FileProvider,
|
|
77
|
+
state_store: StateStore,
|
|
78
|
+
action_dispatcher: ActionDispatcher,
|
|
79
|
+
equipment: EquipmentHandler,
|
|
80
|
+
movement: MovementHandler,
|
|
81
|
+
gantry_mover: GantryMover,
|
|
82
|
+
labware_movement: LabwareMovementHandler,
|
|
83
|
+
pipetting: PipettingHandler,
|
|
84
|
+
tip_handler: TipHandler,
|
|
85
|
+
run_control: RunControlHandler,
|
|
86
|
+
rail_lights: RailLightsHandler,
|
|
87
|
+
status_bar: StatusBarHandler,
|
|
88
|
+
model_utils: Optional[ModelUtils] = None,
|
|
89
|
+
command_note_tracker_provider: Optional[CommandNoteTrackerProvider] = None,
|
|
90
|
+
) -> None:
|
|
91
|
+
"""Initialize the CommandExecutor with access to its dependencies."""
|
|
92
|
+
self._hardware_api = hardware_api
|
|
93
|
+
self._file_provider = file_provider
|
|
94
|
+
self._state_store = state_store
|
|
95
|
+
self._action_dispatcher = action_dispatcher
|
|
96
|
+
self._equipment = equipment
|
|
97
|
+
self._movement = movement
|
|
98
|
+
self._gantry_mover = gantry_mover
|
|
99
|
+
self._labware_movement = labware_movement
|
|
100
|
+
self._pipetting = pipetting
|
|
101
|
+
self._tip_handler = tip_handler
|
|
102
|
+
self._run_control = run_control
|
|
103
|
+
self._rail_lights = rail_lights
|
|
104
|
+
self._model_utils = model_utils or ModelUtils()
|
|
105
|
+
self._status_bar = status_bar
|
|
106
|
+
self._command_note_tracker_provider = (
|
|
107
|
+
command_note_tracker_provider or _NoteTracker
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
async def execute(self, command_id: str) -> None:
|
|
111
|
+
"""Run a given command's execution procedure.
|
|
112
|
+
|
|
113
|
+
Arguments:
|
|
114
|
+
command_id: The identifier of the command to execute. The
|
|
115
|
+
command itself will be looked up from state.
|
|
116
|
+
"""
|
|
117
|
+
queued_command = self._state_store.commands.get(command_id=command_id)
|
|
118
|
+
note_tracker = self._command_note_tracker_provider()
|
|
119
|
+
command_impl = queued_command._ImplementationCls(
|
|
120
|
+
state_view=self._state_store,
|
|
121
|
+
hardware_api=self._hardware_api,
|
|
122
|
+
file_provider=self._file_provider,
|
|
123
|
+
equipment=self._equipment,
|
|
124
|
+
movement=self._movement,
|
|
125
|
+
gantry_mover=self._gantry_mover,
|
|
126
|
+
labware_movement=self._labware_movement,
|
|
127
|
+
pipetting=self._pipetting,
|
|
128
|
+
tip_handler=self._tip_handler,
|
|
129
|
+
run_control=self._run_control,
|
|
130
|
+
rail_lights=self._rail_lights,
|
|
131
|
+
model_utils=self._model_utils,
|
|
132
|
+
status_bar=self._status_bar,
|
|
133
|
+
command_note_adder=note_tracker,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
started_at = self._model_utils.get_timestamp()
|
|
137
|
+
|
|
138
|
+
self._action_dispatcher.dispatch(
|
|
139
|
+
RunCommandAction(command_id=queued_command.id, started_at=started_at)
|
|
140
|
+
)
|
|
141
|
+
running_command = self._state_store.commands.get(queued_command.id)
|
|
142
|
+
error_recovery_policy = self._state_store.commands.get_error_recovery_policy()
|
|
143
|
+
|
|
144
|
+
log.debug(
|
|
145
|
+
f"Executing {running_command.id}, {running_command.commandType}, {running_command.params}"
|
|
146
|
+
)
|
|
147
|
+
try:
|
|
148
|
+
result = await command_impl.execute(
|
|
149
|
+
running_command.params # type: ignore[arg-type]
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
except (Exception, asyncio.CancelledError) as error:
|
|
153
|
+
# The command encountered an undefined error.
|
|
154
|
+
|
|
155
|
+
log.warning(f"Execution of {running_command.id} failed", exc_info=error)
|
|
156
|
+
# TODO(mc, 2022-11-14): mark command as stopped rather than failed
|
|
157
|
+
# https://opentrons.atlassian.net/browse/RCORE-390
|
|
158
|
+
if isinstance(error, asyncio.CancelledError):
|
|
159
|
+
error = RunStoppedError("Run was cancelled")
|
|
160
|
+
elif isinstance(error, EStopActivatedError):
|
|
161
|
+
error = PE_EStopActivatedError(wrapping=[error])
|
|
162
|
+
elif not isinstance(error, EnumeratedError):
|
|
163
|
+
error = PythonException(error)
|
|
164
|
+
|
|
165
|
+
error_recovery_type = error_recovery_policy(
|
|
166
|
+
self._state_store.config,
|
|
167
|
+
running_command,
|
|
168
|
+
None,
|
|
169
|
+
)
|
|
170
|
+
note_tracker(make_error_recovery_debug_note(error_recovery_type))
|
|
171
|
+
self._action_dispatcher.dispatch(
|
|
172
|
+
FailCommandAction(
|
|
173
|
+
error=error,
|
|
174
|
+
command_id=running_command.id,
|
|
175
|
+
running_command=running_command,
|
|
176
|
+
error_id=self._model_utils.generate_id(),
|
|
177
|
+
failed_at=self._model_utils.get_timestamp(),
|
|
178
|
+
notes=note_tracker.get_notes(),
|
|
179
|
+
type=error_recovery_type,
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
else:
|
|
184
|
+
if isinstance(result, SuccessData):
|
|
185
|
+
update = {
|
|
186
|
+
"result": result.public,
|
|
187
|
+
"status": CommandStatus.SUCCEEDED,
|
|
188
|
+
"completedAt": self._model_utils.get_timestamp(),
|
|
189
|
+
"notes": note_tracker.get_notes(),
|
|
190
|
+
}
|
|
191
|
+
succeeded_command = running_command.model_copy(update=update)
|
|
192
|
+
self._action_dispatcher.dispatch(
|
|
193
|
+
SucceedCommandAction(
|
|
194
|
+
command=succeeded_command,
|
|
195
|
+
state_update=result.state_update,
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
else:
|
|
199
|
+
# The command encountered a defined error.
|
|
200
|
+
error_recovery_type = error_recovery_policy(
|
|
201
|
+
self._state_store.config,
|
|
202
|
+
running_command,
|
|
203
|
+
result,
|
|
204
|
+
)
|
|
205
|
+
note_tracker(make_error_recovery_debug_note(error_recovery_type))
|
|
206
|
+
self._action_dispatcher.dispatch(
|
|
207
|
+
FailCommandAction(
|
|
208
|
+
error=result,
|
|
209
|
+
command_id=running_command.id,
|
|
210
|
+
running_command=running_command,
|
|
211
|
+
error_id=result.public.id,
|
|
212
|
+
failed_at=result.public.createdAt,
|
|
213
|
+
notes=note_tracker.get_notes(),
|
|
214
|
+
type=error_recovery_type,
|
|
215
|
+
)
|
|
216
|
+
)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""QueueWorker and dependency factory."""
|
|
2
|
+
from typing import AsyncGenerator, Callable
|
|
3
|
+
|
|
4
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
5
|
+
from opentrons.protocol_engine.execution.rail_lights import RailLightsHandler
|
|
6
|
+
|
|
7
|
+
from ..state.state import StateStore
|
|
8
|
+
from ..actions import ActionDispatcher
|
|
9
|
+
from ..resources import FileProvider
|
|
10
|
+
from .equipment import EquipmentHandler
|
|
11
|
+
from .movement import MovementHandler
|
|
12
|
+
from .gantry_mover import create_gantry_mover
|
|
13
|
+
from .labware_movement import LabwareMovementHandler
|
|
14
|
+
from .pipetting import create_pipetting_handler
|
|
15
|
+
from .tip_handler import create_tip_handler
|
|
16
|
+
from .run_control import RunControlHandler
|
|
17
|
+
from .command_executor import CommandExecutor
|
|
18
|
+
from .queue_worker import QueueWorker
|
|
19
|
+
from .status_bar import StatusBarHandler
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def create_queue_worker(
|
|
23
|
+
hardware_api: HardwareControlAPI,
|
|
24
|
+
file_provider: FileProvider,
|
|
25
|
+
state_store: StateStore,
|
|
26
|
+
action_dispatcher: ActionDispatcher,
|
|
27
|
+
command_generator: Callable[[], AsyncGenerator[str, None]],
|
|
28
|
+
) -> QueueWorker:
|
|
29
|
+
"""Create a ready-to-use QueueWorker instance.
|
|
30
|
+
|
|
31
|
+
Arguments:
|
|
32
|
+
hardware_api: Hardware control API to pass down to dependencies.
|
|
33
|
+
file_provider: Provides access to robot server file writing procedures for protocol output.
|
|
34
|
+
state_store: StateStore to pass down to dependencies.
|
|
35
|
+
action_dispatcher: ActionDispatcher to pass down to dependencies.
|
|
36
|
+
error_recovery_policy: ErrorRecoveryPolicy to pass down to dependencies.
|
|
37
|
+
command_generator: Command generator to get the next command to execute.
|
|
38
|
+
"""
|
|
39
|
+
gantry_mover = create_gantry_mover(
|
|
40
|
+
hardware_api=hardware_api,
|
|
41
|
+
state_view=state_store,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
equipment_handler = EquipmentHandler(
|
|
45
|
+
hardware_api=hardware_api,
|
|
46
|
+
state_store=state_store,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
movement_handler = MovementHandler(
|
|
50
|
+
hardware_api=hardware_api,
|
|
51
|
+
state_store=state_store,
|
|
52
|
+
gantry_mover=gantry_mover,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
labware_movement_handler = LabwareMovementHandler(
|
|
56
|
+
hardware_api=hardware_api,
|
|
57
|
+
state_store=state_store,
|
|
58
|
+
equipment=equipment_handler,
|
|
59
|
+
movement=movement_handler,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
pipetting_handler = create_pipetting_handler(
|
|
63
|
+
hardware_api=hardware_api,
|
|
64
|
+
state_view=state_store,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
tip_handler = create_tip_handler(
|
|
68
|
+
hardware_api=hardware_api,
|
|
69
|
+
state_view=state_store,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
run_control_handler = RunControlHandler(
|
|
73
|
+
state_store=state_store,
|
|
74
|
+
action_dispatcher=action_dispatcher,
|
|
75
|
+
)
|
|
76
|
+
rail_lights_handler = RailLightsHandler(
|
|
77
|
+
hardware_api=hardware_api,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
status_bar_handler = StatusBarHandler(hardware_api=hardware_api)
|
|
81
|
+
|
|
82
|
+
command_executor = CommandExecutor(
|
|
83
|
+
hardware_api=hardware_api,
|
|
84
|
+
file_provider=file_provider,
|
|
85
|
+
state_store=state_store,
|
|
86
|
+
action_dispatcher=action_dispatcher,
|
|
87
|
+
equipment=equipment_handler,
|
|
88
|
+
movement=movement_handler,
|
|
89
|
+
gantry_mover=gantry_mover,
|
|
90
|
+
labware_movement=labware_movement_handler,
|
|
91
|
+
pipetting=pipetting_handler,
|
|
92
|
+
tip_handler=tip_handler,
|
|
93
|
+
run_control=run_control_handler,
|
|
94
|
+
rail_lights=rail_lights_handler,
|
|
95
|
+
status_bar=status_bar_handler,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return QueueWorker(
|
|
99
|
+
state_store=state_store,
|
|
100
|
+
command_executor=command_executor,
|
|
101
|
+
command_generator=command_generator,
|
|
102
|
+
)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Forward door events from a `HardwareControlAPI` into a `ProtocolEngine`."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from asyncio import get_running_loop, run_coroutine_threadsafe
|
|
6
|
+
from typing import Callable, Optional
|
|
7
|
+
|
|
8
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
9
|
+
from opentrons.hardware_control.types import (
|
|
10
|
+
HardwareEvent,
|
|
11
|
+
DoorStateNotification,
|
|
12
|
+
DoorState,
|
|
13
|
+
PauseType,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from opentrons.protocol_engine.actions import ActionDispatcher, DoorChangeAction
|
|
17
|
+
|
|
18
|
+
from ..state.state import StateStore
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
_UnsubscribeCallback = Callable[[], None]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DoorWatcher:
|
|
25
|
+
"""Forward door events from a `HardwareControlAPI` into a `ProtocolEngine`."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
state_store: StateStore,
|
|
30
|
+
hardware_api: HardwareControlAPI,
|
|
31
|
+
action_dispatcher: ActionDispatcher,
|
|
32
|
+
) -> None:
|
|
33
|
+
"""Initialize the DoorWatcher.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
state_store: The StateStore to check if the protocol queue is running.
|
|
37
|
+
hardware_api: The HardwareControlAPI whose events we will listen for.
|
|
38
|
+
Assumed to be running in a separate thread from action_dispatcher.
|
|
39
|
+
action_dispatcher: The ActionDispatcher to dispatch actions into.
|
|
40
|
+
Assumed to be owned by the same event loop that this
|
|
41
|
+
DoorWatcher was constructed in.
|
|
42
|
+
"""
|
|
43
|
+
self._state_store = state_store
|
|
44
|
+
self._hardware_api = hardware_api
|
|
45
|
+
self._action_dispatcher = action_dispatcher
|
|
46
|
+
self._loop = get_running_loop()
|
|
47
|
+
self._unsubscribe_callback: Optional[_UnsubscribeCallback] = None
|
|
48
|
+
|
|
49
|
+
def start(self) -> None:
|
|
50
|
+
"""Subscribe to hardware events and start forwarding them as PE actions."""
|
|
51
|
+
if self._unsubscribe_callback is None:
|
|
52
|
+
self._unsubscribe_callback = self._hardware_api.register_callback(
|
|
53
|
+
self._handle_hardware_door_event
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def stop(self) -> None:
|
|
57
|
+
"""Unsubscribe from hardware events.
|
|
58
|
+
|
|
59
|
+
Safe to call more than once.
|
|
60
|
+
|
|
61
|
+
Warning:
|
|
62
|
+
This method does not wait for pending event dispatches to complete.
|
|
63
|
+
Depending on timing, there may be straggler hardware events
|
|
64
|
+
that the `ActionDispatcher` will see even after this method returns.
|
|
65
|
+
"""
|
|
66
|
+
if self._unsubscribe_callback is not None:
|
|
67
|
+
self._unsubscribe_callback()
|
|
68
|
+
self._unsubscribe_callback = None
|
|
69
|
+
|
|
70
|
+
def _handle_hardware_door_event(self, event: HardwareEvent) -> None:
|
|
71
|
+
"""Handle a door state hardware event, ensuring thread-safety.
|
|
72
|
+
|
|
73
|
+
This is used as a callback for HardwareControlAPI.register_callback(),
|
|
74
|
+
and it's run inside the hardware thread.
|
|
75
|
+
|
|
76
|
+
This method will only return after the `ProtocolEngine` processes the event.
|
|
77
|
+
If something else is hogging the event loop thread that the `ProtocolEngine`
|
|
78
|
+
is running in, that may take a moment, and the hardware thread may be blocked.
|
|
79
|
+
|
|
80
|
+
This method will deadlock if it's ever run from the same thread that
|
|
81
|
+
owns the event loop that this DoorWatcher was constructed in.
|
|
82
|
+
"""
|
|
83
|
+
if isinstance(event, DoorStateNotification):
|
|
84
|
+
coroutine = self._handle_hardware_door_event_async(event)
|
|
85
|
+
future = run_coroutine_threadsafe(coroutine, self._loop)
|
|
86
|
+
# Wait for the dispatch to complete before returning,
|
|
87
|
+
# which is important for ordering guarantees.
|
|
88
|
+
future.result()
|
|
89
|
+
|
|
90
|
+
async def _handle_hardware_door_event_async(
|
|
91
|
+
self, event: DoorStateNotification
|
|
92
|
+
) -> None:
|
|
93
|
+
"""Handle a door state hardware event.
|
|
94
|
+
|
|
95
|
+
This must run in the event loop that owns self._action_dispatcher, for safety.
|
|
96
|
+
|
|
97
|
+
Defined as an async function, so we can use this with
|
|
98
|
+
run_coroutine_threadsafe(), which lets us block until
|
|
99
|
+
the dispatch completes.
|
|
100
|
+
"""
|
|
101
|
+
# Throw away this event if this instance has already been stop()'d.
|
|
102
|
+
# This can happen if the stop() happens after the HardwareAPI has sent the event,
|
|
103
|
+
# but before this handler has had its turn to run in the asyncio event loop.
|
|
104
|
+
already_stopped = self._unsubscribe_callback is None
|
|
105
|
+
if already_stopped:
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
action = DoorChangeAction(
|
|
109
|
+
door_state=event.new_state, module_serial=event.module_serial
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
if (
|
|
113
|
+
self._state_store.commands.get_is_running()
|
|
114
|
+
and action.door_state == DoorState.OPEN
|
|
115
|
+
and self._state_store.config.block_on_door_open
|
|
116
|
+
):
|
|
117
|
+
self._hardware_api.pause(PauseType.PAUSE)
|
|
118
|
+
|
|
119
|
+
self._action_dispatcher.dispatch(action)
|