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,179 @@
|
|
|
1
|
+
"""Wrappers for Protocol API v2 execution pipeline."""
|
|
2
|
+
import asyncio
|
|
3
|
+
from typing import Dict, Iterable, Optional, cast
|
|
4
|
+
|
|
5
|
+
from anyio import to_thread
|
|
6
|
+
|
|
7
|
+
from opentrons_shared_data.labware.types import (
|
|
8
|
+
LabwareDefinition as LabwareDefinitionTypedDict,
|
|
9
|
+
)
|
|
10
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
11
|
+
|
|
12
|
+
from opentrons.calibration_storage.helpers import uri_from_details
|
|
13
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
14
|
+
from opentrons.legacy_broker import LegacyBroker
|
|
15
|
+
from opentrons.protocol_engine import ProtocolEngine
|
|
16
|
+
from opentrons.protocol_engine.types import (
|
|
17
|
+
PrimitiveRunTimeParamValuesType,
|
|
18
|
+
CSVRuntimeParamPaths,
|
|
19
|
+
)
|
|
20
|
+
from opentrons.protocol_reader import ProtocolSource, ProtocolFileRole
|
|
21
|
+
from opentrons.util.broker import Broker
|
|
22
|
+
|
|
23
|
+
from opentrons.protocol_api import (
|
|
24
|
+
ProtocolContext,
|
|
25
|
+
ParameterContext,
|
|
26
|
+
create_protocol_context,
|
|
27
|
+
Parameters,
|
|
28
|
+
)
|
|
29
|
+
from opentrons.protocol_api.core.engine import ENGINE_CORE_API_VERSION
|
|
30
|
+
from opentrons.protocol_api.core.legacy.load_info import LoadInfo
|
|
31
|
+
|
|
32
|
+
from opentrons.protocols.parse import PythonParseMode, parse
|
|
33
|
+
from opentrons.protocols.execution.execute import run_protocol
|
|
34
|
+
from opentrons.protocols.execution.execute_python import exec_add_parameters
|
|
35
|
+
from opentrons.protocols.types import Protocol, PythonProtocol
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# The earliest Python Protocol API version ("apiLevel") where the protocol's simulation
|
|
39
|
+
# and execution will be handled by Protocol Engine, rather than the previous direct hardware calls from protocol api.
|
|
40
|
+
#
|
|
41
|
+
# Note that even when simulation and execution are handled by the legacy machinery,
|
|
42
|
+
# Protocol Engine still has some involvement for analyzing the simulation and
|
|
43
|
+
# monitoring the execution.
|
|
44
|
+
LEGACY_PYTHON_API_VERSION_CUTOFF = ENGINE_CORE_API_VERSION
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# The earliest JSON protocol schema version where the protocol is executed directly by
|
|
48
|
+
# Protocol Engine, rather than going through Python Protocol API v2.
|
|
49
|
+
LEGACY_JSON_SCHEMA_VERSION_CUTOFF = 6
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class PythonAndLegacyFileReader:
|
|
53
|
+
"""Interface to read Protocol API v2 protocols prior to execution."""
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def read(
|
|
57
|
+
protocol_source: ProtocolSource,
|
|
58
|
+
labware_definitions: Iterable[LabwareDefinition],
|
|
59
|
+
python_parse_mode: PythonParseMode,
|
|
60
|
+
) -> Protocol:
|
|
61
|
+
"""Read a PAPIv2 protocol into a data structure."""
|
|
62
|
+
protocol_file_path = protocol_source.main_file
|
|
63
|
+
protocol_contents = protocol_file_path.read_text(encoding="utf-8")
|
|
64
|
+
extra_labware: Dict[str, LabwareDefinitionTypedDict] = {
|
|
65
|
+
uri_from_details(
|
|
66
|
+
namespace=lw.namespace,
|
|
67
|
+
load_name=lw.parameters.loadName,
|
|
68
|
+
version=lw.version,
|
|
69
|
+
): cast(LabwareDefinitionTypedDict, lw.model_dump(exclude_none=True))
|
|
70
|
+
for lw in labware_definitions
|
|
71
|
+
}
|
|
72
|
+
data_file_paths = [
|
|
73
|
+
data_file.path
|
|
74
|
+
for data_file in protocol_source.files
|
|
75
|
+
if data_file.role == ProtocolFileRole.DATA
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
return parse(
|
|
79
|
+
protocol_file=protocol_contents,
|
|
80
|
+
filename=protocol_file_path.name,
|
|
81
|
+
extra_labware=extra_labware,
|
|
82
|
+
extra_data={
|
|
83
|
+
data_path.name: data_path.read_bytes() for data_path in data_file_paths
|
|
84
|
+
},
|
|
85
|
+
python_parse_mode=python_parse_mode,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class ProtocolContextCreator:
|
|
90
|
+
"""Interface to construct Protocol API v2 contexts."""
|
|
91
|
+
|
|
92
|
+
_USE_SIMULATING_CORE = False
|
|
93
|
+
|
|
94
|
+
def __init__(
|
|
95
|
+
self,
|
|
96
|
+
hardware_api: HardwareControlAPI,
|
|
97
|
+
protocol_engine: ProtocolEngine,
|
|
98
|
+
) -> None:
|
|
99
|
+
"""Prepare the LegacyContextCreator.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
hardware_api: The hardware control interface.
|
|
103
|
+
Will be wrapped in a `SynchronousAdapter`.
|
|
104
|
+
May be real hardware or a simulator.
|
|
105
|
+
protocol_engine: Interface for the context to load labware offsets.
|
|
106
|
+
"""
|
|
107
|
+
self._hardware_api = hardware_api
|
|
108
|
+
self._protocol_engine = protocol_engine
|
|
109
|
+
|
|
110
|
+
def create(
|
|
111
|
+
self,
|
|
112
|
+
protocol: Protocol,
|
|
113
|
+
broker: Optional[LegacyBroker],
|
|
114
|
+
equipment_broker: Optional[Broker[LoadInfo]],
|
|
115
|
+
) -> ProtocolContext:
|
|
116
|
+
"""Create a Protocol API v2 context."""
|
|
117
|
+
extra_labware = (
|
|
118
|
+
protocol.extra_labware if isinstance(protocol, PythonProtocol) else None
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
bundled_data = (
|
|
122
|
+
protocol.bundled_data if isinstance(protocol, PythonProtocol) else None
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
return create_protocol_context(
|
|
126
|
+
api_version=protocol.api_level,
|
|
127
|
+
hardware_api=self._hardware_api,
|
|
128
|
+
deck_type=self._protocol_engine.state_view.config.deck_type.value,
|
|
129
|
+
protocol_engine=self._protocol_engine,
|
|
130
|
+
protocol_engine_loop=asyncio.get_running_loop(),
|
|
131
|
+
broker=broker,
|
|
132
|
+
equipment_broker=equipment_broker,
|
|
133
|
+
extra_labware=extra_labware,
|
|
134
|
+
use_simulating_core=self._USE_SIMULATING_CORE,
|
|
135
|
+
bundled_data=bundled_data,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class SimulatingContextCreator(ProtocolContextCreator):
|
|
140
|
+
"""Interface to construct PAPIv2 contexts using simulating implementations.
|
|
141
|
+
|
|
142
|
+
Avoids some calls to the hardware API for performance.
|
|
143
|
+
See `opentrons.protocols.context.simulator`.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
_USE_SIMULATING_CORE = True
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class PythonProtocolExecutor:
|
|
150
|
+
"""Interface to execute Protocol API v2 protocols in a child thread."""
|
|
151
|
+
|
|
152
|
+
@staticmethod
|
|
153
|
+
async def execute(
|
|
154
|
+
protocol: Protocol,
|
|
155
|
+
context: ProtocolContext,
|
|
156
|
+
run_time_parameters_with_overrides: Optional[Parameters],
|
|
157
|
+
) -> None:
|
|
158
|
+
"""Execute a PAPIv2 protocol with a given ProtocolContext in a child thread."""
|
|
159
|
+
await to_thread.run_sync(
|
|
160
|
+
run_protocol,
|
|
161
|
+
protocol,
|
|
162
|
+
context,
|
|
163
|
+
run_time_parameters_with_overrides,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
@staticmethod
|
|
167
|
+
def extract_run_parameters(
|
|
168
|
+
protocol: PythonProtocol,
|
|
169
|
+
parameter_context: ParameterContext,
|
|
170
|
+
run_time_param_overrides: Optional[PrimitiveRunTimeParamValuesType],
|
|
171
|
+
run_time_param_file_overrides: Optional[CSVRuntimeParamPaths],
|
|
172
|
+
) -> Optional[Parameters]:
|
|
173
|
+
"""Extract the parameters defined in the protocol, overridden with values for the run."""
|
|
174
|
+
return exec_add_parameters(
|
|
175
|
+
protocol=protocol,
|
|
176
|
+
parameter_context=parameter_context,
|
|
177
|
+
run_time_param_overrides=run_time_param_overrides,
|
|
178
|
+
run_time_param_file_overrides=run_time_param_file_overrides,
|
|
179
|
+
)
|
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
"""Engine/Runner provider."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import enum
|
|
6
|
+
from typing import Optional, Union, List, Dict, AsyncGenerator, Mapping
|
|
7
|
+
|
|
8
|
+
from anyio import move_on_after
|
|
9
|
+
|
|
10
|
+
from opentrons.types import NozzleMapInterface
|
|
11
|
+
from opentrons_shared_data.labware.types import LabwareUri
|
|
12
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
13
|
+
from opentrons_shared_data.errors import GeneralError
|
|
14
|
+
from opentrons_shared_data.robot.types import RobotType
|
|
15
|
+
|
|
16
|
+
from . import protocol_runner, RunResult, JsonRunner, PythonAndLegacyRunner
|
|
17
|
+
from ..hardware_control import HardwareControlAPI
|
|
18
|
+
from ..hardware_control.modules import AbstractModule as HardwareModuleAPI
|
|
19
|
+
from ..protocol_engine import (
|
|
20
|
+
ProtocolEngine,
|
|
21
|
+
CommandCreate,
|
|
22
|
+
Command,
|
|
23
|
+
StateSummary,
|
|
24
|
+
CommandPointer,
|
|
25
|
+
CommandSlice,
|
|
26
|
+
CommandErrorSlice,
|
|
27
|
+
DeckType,
|
|
28
|
+
ErrorOccurrence,
|
|
29
|
+
)
|
|
30
|
+
from ..protocol_engine.errors import RunStoppedError
|
|
31
|
+
from ..protocol_engine.types import (
|
|
32
|
+
PostRunHardwareState,
|
|
33
|
+
EngineStatus,
|
|
34
|
+
LabwareOffsetCreate,
|
|
35
|
+
LegacyLabwareOffsetCreate,
|
|
36
|
+
LabwareOffset,
|
|
37
|
+
DeckConfigurationType,
|
|
38
|
+
RunTimeParameter,
|
|
39
|
+
PrimitiveRunTimeParamValuesType,
|
|
40
|
+
CSVRuntimeParamPaths,
|
|
41
|
+
CommandAnnotation,
|
|
42
|
+
ModuleModel,
|
|
43
|
+
)
|
|
44
|
+
from ..protocol_engine.error_recovery_policy import ErrorRecoveryPolicy
|
|
45
|
+
|
|
46
|
+
from ..protocol_reader import JsonProtocolConfig, PythonProtocolConfig, ProtocolSource
|
|
47
|
+
from ..protocols.parse import PythonParseMode
|
|
48
|
+
from ..protocol_engine.state.module_substates import FlexStackerSubState
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class NoProtocolRunAvailable(RuntimeError):
|
|
52
|
+
"""An error raised if there is no protocol run available."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class UnknownProtocolParseMode(RuntimeError):
|
|
56
|
+
"""An error raised if given an unknown protocol parse mode."""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class RunNotFound(GeneralError):
|
|
60
|
+
"""An error raised if there is no run associated."""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class ParseMode(enum.Enum):
|
|
64
|
+
"""Configure optional rules for when `opentrons.protocols.parse.parse()` parses protocols."""
|
|
65
|
+
|
|
66
|
+
NORMAL = enum.auto()
|
|
67
|
+
ALLOW_LEGACY_METADATA_AND_REQUIREMENTS = enum.auto()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class RunOrchestrator:
|
|
71
|
+
"""Provider for runners and associated protocol engine.
|
|
72
|
+
|
|
73
|
+
Build runners, manage command execution, run state and in-memory protocol engine associated to the runners.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
_protocol_runner: Optional[
|
|
77
|
+
Union[protocol_runner.JsonRunner, protocol_runner.PythonAndLegacyRunner, None]
|
|
78
|
+
]
|
|
79
|
+
_setup_runner: protocol_runner.LiveRunner
|
|
80
|
+
_fixit_runner: protocol_runner.LiveRunner
|
|
81
|
+
_protocol_live_runner: protocol_runner.LiveRunner
|
|
82
|
+
_hardware_api: HardwareControlAPI
|
|
83
|
+
_protocol_engine: ProtocolEngine
|
|
84
|
+
|
|
85
|
+
def __init__(
|
|
86
|
+
self,
|
|
87
|
+
protocol_engine: ProtocolEngine,
|
|
88
|
+
# todo(mm, 2024-07-05): This hardware_api param looks unused?
|
|
89
|
+
hardware_api: HardwareControlAPI,
|
|
90
|
+
fixit_runner: protocol_runner.LiveRunner,
|
|
91
|
+
setup_runner: protocol_runner.LiveRunner,
|
|
92
|
+
protocol_live_runner: protocol_runner.LiveRunner,
|
|
93
|
+
json_or_python_protocol_runner: Optional[
|
|
94
|
+
Union[protocol_runner.PythonAndLegacyRunner, protocol_runner.JsonRunner]
|
|
95
|
+
] = None,
|
|
96
|
+
run_id: Optional[str] = None,
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Initialize a run orchestrator interface.
|
|
99
|
+
|
|
100
|
+
Arguments:
|
|
101
|
+
protocol_engine: Protocol engine instance.
|
|
102
|
+
hardware_api: Hardware control API instance.
|
|
103
|
+
fixit_runner: LiveRunner for fixit commands.
|
|
104
|
+
setup_runner: LiveRunner for setup commands.
|
|
105
|
+
protocol_live_runner: LiveRunner for protocol commands.
|
|
106
|
+
json_or_python_protocol_runner: JsonRunner/PythonAndLegacyRunner for protocol commands.
|
|
107
|
+
run_id: run id if any, associated to the runner/engine.
|
|
108
|
+
"""
|
|
109
|
+
self._run_id = run_id
|
|
110
|
+
self._protocol_engine = protocol_engine
|
|
111
|
+
self._protocol_runner = json_or_python_protocol_runner
|
|
112
|
+
self._setup_runner = setup_runner
|
|
113
|
+
self._fixit_runner = fixit_runner
|
|
114
|
+
self._protocol_live_runner = protocol_live_runner
|
|
115
|
+
self._fixit_runner.prepare()
|
|
116
|
+
self._setup_runner.prepare()
|
|
117
|
+
self._protocol_engine.set_and_start_queue_worker(self.command_generator)
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def run_id(self) -> str:
|
|
121
|
+
"""Get the "current" persisted run_id."""
|
|
122
|
+
if not self._run_id:
|
|
123
|
+
raise RunNotFound()
|
|
124
|
+
return self._run_id
|
|
125
|
+
|
|
126
|
+
@classmethod
|
|
127
|
+
def build_orchestrator(
|
|
128
|
+
cls,
|
|
129
|
+
hardware_api: HardwareControlAPI,
|
|
130
|
+
protocol_engine: ProtocolEngine,
|
|
131
|
+
protocol_config: Optional[
|
|
132
|
+
Union[JsonProtocolConfig, PythonProtocolConfig]
|
|
133
|
+
] = None,
|
|
134
|
+
post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED,
|
|
135
|
+
drop_tips_after_run: bool = True,
|
|
136
|
+
run_id: Optional[str] = None,
|
|
137
|
+
) -> "RunOrchestrator":
|
|
138
|
+
"""Build a RunOrchestrator provider."""
|
|
139
|
+
setup_runner = protocol_runner.LiveRunner(
|
|
140
|
+
protocol_engine=protocol_engine,
|
|
141
|
+
hardware_api=hardware_api,
|
|
142
|
+
)
|
|
143
|
+
fixit_runner = protocol_runner.LiveRunner(
|
|
144
|
+
protocol_engine=protocol_engine,
|
|
145
|
+
hardware_api=hardware_api,
|
|
146
|
+
)
|
|
147
|
+
protocol_live_runner = protocol_runner.LiveRunner(
|
|
148
|
+
protocol_engine=protocol_engine,
|
|
149
|
+
hardware_api=hardware_api,
|
|
150
|
+
)
|
|
151
|
+
json_or_python_runner = None
|
|
152
|
+
if protocol_config:
|
|
153
|
+
json_or_python_runner = protocol_runner.create_protocol_runner(
|
|
154
|
+
protocol_config=protocol_config,
|
|
155
|
+
protocol_engine=protocol_engine,
|
|
156
|
+
hardware_api=hardware_api,
|
|
157
|
+
post_run_hardware_state=post_run_hardware_state,
|
|
158
|
+
drop_tips_after_run=drop_tips_after_run,
|
|
159
|
+
)
|
|
160
|
+
return cls(
|
|
161
|
+
run_id=run_id,
|
|
162
|
+
json_or_python_protocol_runner=json_or_python_runner,
|
|
163
|
+
setup_runner=setup_runner,
|
|
164
|
+
fixit_runner=fixit_runner,
|
|
165
|
+
hardware_api=hardware_api,
|
|
166
|
+
protocol_engine=protocol_engine,
|
|
167
|
+
protocol_live_runner=protocol_live_runner,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def play(self, deck_configuration: Optional[DeckConfigurationType] = None) -> None:
|
|
171
|
+
"""Start or resume the run."""
|
|
172
|
+
# todo(mm, 2024-07-09): The deck configuration is set at the same time here for
|
|
173
|
+
# historical reasons. It's unsafe to change the deck configuration mid-run
|
|
174
|
+
# and we're relying on the caller to not do that.
|
|
175
|
+
self._protocol_engine.set_deck_configuration(deck_configuration)
|
|
176
|
+
self._protocol_engine.play()
|
|
177
|
+
|
|
178
|
+
async def run(
|
|
179
|
+
self,
|
|
180
|
+
deck_configuration: DeckConfigurationType,
|
|
181
|
+
protocol_source: Optional[ProtocolSource] = None,
|
|
182
|
+
run_time_param_values: Optional[PrimitiveRunTimeParamValuesType] = None,
|
|
183
|
+
) -> RunResult:
|
|
184
|
+
"""Start the run."""
|
|
185
|
+
if self._protocol_runner:
|
|
186
|
+
return await self._protocol_runner.run(
|
|
187
|
+
deck_configuration=deck_configuration,
|
|
188
|
+
protocol_source=protocol_source,
|
|
189
|
+
run_time_param_values=run_time_param_values,
|
|
190
|
+
)
|
|
191
|
+
elif self._protocol_live_runner:
|
|
192
|
+
return await self._protocol_live_runner.run(
|
|
193
|
+
deck_configuration=deck_configuration
|
|
194
|
+
)
|
|
195
|
+
else:
|
|
196
|
+
return await self._setup_runner.run(deck_configuration=deck_configuration)
|
|
197
|
+
|
|
198
|
+
def pause(self) -> None:
|
|
199
|
+
"""Pause the run."""
|
|
200
|
+
self._protocol_engine.request_pause()
|
|
201
|
+
|
|
202
|
+
async def stop(self) -> None:
|
|
203
|
+
"""Stop the run."""
|
|
204
|
+
if self.run_has_started():
|
|
205
|
+
await self._protocol_engine.request_stop()
|
|
206
|
+
else:
|
|
207
|
+
await self.finish(
|
|
208
|
+
drop_tips_after_run=False,
|
|
209
|
+
set_run_status=False,
|
|
210
|
+
post_run_hardware_state=PostRunHardwareState.STAY_ENGAGED_IN_PLACE,
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
def resume_from_recovery(self, reconcile_false_positive: bool) -> None:
|
|
214
|
+
"""Resume the run from recovery."""
|
|
215
|
+
self._protocol_engine.resume_from_recovery(reconcile_false_positive)
|
|
216
|
+
|
|
217
|
+
async def finish(
|
|
218
|
+
self,
|
|
219
|
+
error: Optional[Exception] = None,
|
|
220
|
+
drop_tips_after_run: bool = True,
|
|
221
|
+
set_run_status: bool = True,
|
|
222
|
+
post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED,
|
|
223
|
+
) -> None:
|
|
224
|
+
"""Finish the run."""
|
|
225
|
+
await self._protocol_engine.finish(
|
|
226
|
+
error=error,
|
|
227
|
+
drop_tips_after_run=drop_tips_after_run,
|
|
228
|
+
set_run_status=set_run_status,
|
|
229
|
+
post_run_hardware_state=post_run_hardware_state,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
def get_state_summary(self) -> StateSummary:
|
|
233
|
+
"""Get protocol run data."""
|
|
234
|
+
return self._protocol_engine.state_view.get_summary()
|
|
235
|
+
|
|
236
|
+
def get_loaded_labware_definitions(self) -> List[LabwareDefinition]:
|
|
237
|
+
"""Get loaded labware definitions."""
|
|
238
|
+
return self._protocol_engine.state_view.labware.get_loaded_labware_definitions()
|
|
239
|
+
|
|
240
|
+
def get_run_time_parameters(self) -> List[RunTimeParameter]:
|
|
241
|
+
"""Get the list of run time parameters defined in the protocol, if any.
|
|
242
|
+
|
|
243
|
+
This returns a list of all run time parameters with their validated definitions
|
|
244
|
+
and client-requested values. Will always be empty before loading the runner.
|
|
245
|
+
|
|
246
|
+
If there was an error during RTP definition validation, then this list will
|
|
247
|
+
contain the parameter definitions that were validated before the error occurred.
|
|
248
|
+
These parameters' values will be default values.
|
|
249
|
+
|
|
250
|
+
If all definitions validated successfully but an error occurred while
|
|
251
|
+
setting the RTP values with those sent by the client, then only the parameters
|
|
252
|
+
whose values were successfully set will have the client-requested values while
|
|
253
|
+
the others will contain the default values.
|
|
254
|
+
"""
|
|
255
|
+
return (
|
|
256
|
+
[]
|
|
257
|
+
if self._protocol_runner is None
|
|
258
|
+
else self._protocol_runner.run_time_parameters
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
def get_command_annotations(self) -> List[CommandAnnotation]:
|
|
262
|
+
"""Get the list of command annotations defined in the protocol, if any."""
|
|
263
|
+
return (
|
|
264
|
+
[]
|
|
265
|
+
if self._protocol_runner is None
|
|
266
|
+
else self._protocol_runner.command_annotations
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
def get_current_command(self) -> Optional[CommandPointer]:
|
|
270
|
+
"""Get the "current" command, if any."""
|
|
271
|
+
return self._protocol_engine.state_view.commands.get_current()
|
|
272
|
+
|
|
273
|
+
def get_most_recently_finalized_command(self) -> Optional[CommandPointer]:
|
|
274
|
+
"""Get the most recently finalized command, if any."""
|
|
275
|
+
most_recently_finalized_command = (
|
|
276
|
+
self._protocol_engine.state_view.commands.get_most_recently_finalized_command()
|
|
277
|
+
)
|
|
278
|
+
return (
|
|
279
|
+
CommandPointer(
|
|
280
|
+
command_id=most_recently_finalized_command.command.id,
|
|
281
|
+
command_key=most_recently_finalized_command.command.key,
|
|
282
|
+
created_at=most_recently_finalized_command.command.createdAt,
|
|
283
|
+
index=most_recently_finalized_command.index,
|
|
284
|
+
)
|
|
285
|
+
if most_recently_finalized_command
|
|
286
|
+
else None
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
def get_command_slice(
|
|
290
|
+
self, cursor: Optional[int], length: int, include_fixit_commands: bool
|
|
291
|
+
) -> CommandSlice:
|
|
292
|
+
"""Get a slice of run commands.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
cursor: Requested index of first command in the returned slice.
|
|
296
|
+
length: Length of slice to return.
|
|
297
|
+
include_fixit_commands: Get all command intents.
|
|
298
|
+
"""
|
|
299
|
+
return self._protocol_engine.state_view.commands.get_slice(
|
|
300
|
+
cursor=cursor, length=length, include_fixit_commands=include_fixit_commands
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
def get_command_error_slice(
|
|
304
|
+
self,
|
|
305
|
+
cursor: int,
|
|
306
|
+
length: int,
|
|
307
|
+
) -> CommandErrorSlice:
|
|
308
|
+
"""Get a slice of run commands errors.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
cursor: Requested index of first error in the returned slice.
|
|
312
|
+
If the cursor is omitted, a cursor will be selected automatically
|
|
313
|
+
based on the last error occurence.
|
|
314
|
+
length: Length of slice to return.
|
|
315
|
+
"""
|
|
316
|
+
return self._protocol_engine.state_view.commands.get_errors_slice(
|
|
317
|
+
cursor=cursor, length=length
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
def get_command_recovery_target(self) -> Optional[CommandPointer]:
|
|
321
|
+
"""Get the current error recovery target."""
|
|
322
|
+
return self._protocol_engine.state_view.commands.get_recovery_target()
|
|
323
|
+
|
|
324
|
+
def get_command(self, command_id: str) -> Command:
|
|
325
|
+
"""Get a run's command by ID."""
|
|
326
|
+
return self._protocol_engine.state_view.commands.get(command_id=command_id)
|
|
327
|
+
|
|
328
|
+
def get_all_commands(self) -> List[Command]:
|
|
329
|
+
"""Get all run commands."""
|
|
330
|
+
return self._protocol_engine.state_view.commands.get_all()
|
|
331
|
+
|
|
332
|
+
def get_command_errors(self) -> List[ErrorOccurrence]:
|
|
333
|
+
"""Get all run command errors."""
|
|
334
|
+
return self._protocol_engine.state_view.commands.get_all_errors()
|
|
335
|
+
|
|
336
|
+
def get_run_status(self) -> EngineStatus:
|
|
337
|
+
"""Get the current execution status of the engine."""
|
|
338
|
+
return self._protocol_engine.state_view.commands.get_status()
|
|
339
|
+
|
|
340
|
+
def get_is_run_terminal(self) -> bool:
|
|
341
|
+
"""Get whether engine is in a terminal state."""
|
|
342
|
+
return self._protocol_engine.state_view.commands.get_is_terminal()
|
|
343
|
+
|
|
344
|
+
def run_has_started(self) -> bool:
|
|
345
|
+
"""Get whether the run has started."""
|
|
346
|
+
return self._protocol_engine.state_view.commands.has_been_played()
|
|
347
|
+
|
|
348
|
+
def run_has_stopped(self) -> bool:
|
|
349
|
+
"""Get whether the run has stopped."""
|
|
350
|
+
return self._protocol_engine.state_view.commands.get_is_stopped()
|
|
351
|
+
|
|
352
|
+
def add_labware_offset(
|
|
353
|
+
self, request: LabwareOffsetCreate | LegacyLabwareOffsetCreate
|
|
354
|
+
) -> LabwareOffset:
|
|
355
|
+
"""Add a new labware offset to state."""
|
|
356
|
+
return self._protocol_engine.add_labware_offset(request)
|
|
357
|
+
|
|
358
|
+
def add_labware_definition(self, definition: LabwareDefinition) -> LabwareUri:
|
|
359
|
+
"""Add a new labware definition to state."""
|
|
360
|
+
return self._protocol_engine.add_labware_definition(definition)
|
|
361
|
+
|
|
362
|
+
async def add_command_and_wait_for_interval(
|
|
363
|
+
self,
|
|
364
|
+
command: CommandCreate,
|
|
365
|
+
wait_until_complete: bool = False,
|
|
366
|
+
timeout: Optional[int] = None,
|
|
367
|
+
failed_command_id: Optional[str] = None,
|
|
368
|
+
) -> Command:
|
|
369
|
+
"""Add a new command to execute and wait for it to complete if needed."""
|
|
370
|
+
added_command = self._protocol_engine.add_command(
|
|
371
|
+
request=command, failed_command_id=failed_command_id
|
|
372
|
+
)
|
|
373
|
+
if wait_until_complete:
|
|
374
|
+
timeout_sec = None if timeout is None else timeout / 1000.0
|
|
375
|
+
with move_on_after(timeout_sec):
|
|
376
|
+
await self._protocol_engine.wait_for_command(added_command.id)
|
|
377
|
+
return added_command
|
|
378
|
+
|
|
379
|
+
def estop(self) -> None:
|
|
380
|
+
"""Handle an E-stop event from the hardware API."""
|
|
381
|
+
return self._protocol_engine.estop()
|
|
382
|
+
|
|
383
|
+
async def use_attached_modules(
|
|
384
|
+
self, modules_by_id: Dict[str, HardwareModuleAPI]
|
|
385
|
+
) -> None:
|
|
386
|
+
"""Load attached modules directly into state, without locations."""
|
|
387
|
+
await self._protocol_engine.use_attached_modules(modules_by_id=modules_by_id)
|
|
388
|
+
|
|
389
|
+
def get_protocol_runner(self) -> Optional[Union[JsonRunner, PythonAndLegacyRunner]]:
|
|
390
|
+
"""Get run's protocol runner if any, if not return None."""
|
|
391
|
+
return self._protocol_runner
|
|
392
|
+
|
|
393
|
+
async def load(
|
|
394
|
+
self,
|
|
395
|
+
protocol_source: ProtocolSource,
|
|
396
|
+
run_time_param_values: Optional[PrimitiveRunTimeParamValuesType],
|
|
397
|
+
run_time_param_paths: Optional[CSVRuntimeParamPaths],
|
|
398
|
+
parse_mode: ParseMode,
|
|
399
|
+
) -> None:
|
|
400
|
+
"""Load a json/python protocol."""
|
|
401
|
+
assert self._protocol_runner is not None
|
|
402
|
+
if isinstance(self._protocol_runner, JsonRunner):
|
|
403
|
+
await self._protocol_runner.load(protocol_source=protocol_source)
|
|
404
|
+
elif isinstance(self._protocol_runner, PythonAndLegacyRunner):
|
|
405
|
+
python_parse_mode = self._map_parse_mode_to_python_parse_mode(parse_mode)
|
|
406
|
+
await self._protocol_runner.load(
|
|
407
|
+
protocol_source=protocol_source,
|
|
408
|
+
# Conservatively assume that we're re-running a protocol that
|
|
409
|
+
# was uploaded before we added stricter validation, and that
|
|
410
|
+
# doesn't conform to the new rules.
|
|
411
|
+
python_parse_mode=python_parse_mode,
|
|
412
|
+
run_time_param_values=run_time_param_values,
|
|
413
|
+
run_time_param_paths=run_time_param_paths,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
def get_is_okay_to_clear(self) -> bool:
|
|
417
|
+
"""Get whether the engine is stopped or sitting idly, so it could be removed."""
|
|
418
|
+
return self._protocol_engine.state_view.commands.get_is_okay_to_clear()
|
|
419
|
+
|
|
420
|
+
def prepare(self) -> None:
|
|
421
|
+
"""Prepare live runner for a run."""
|
|
422
|
+
self._protocol_live_runner.prepare()
|
|
423
|
+
|
|
424
|
+
def get_robot_type(self) -> RobotType:
|
|
425
|
+
"""Get engine robot type."""
|
|
426
|
+
return self._protocol_engine.state_view.config.robot_type
|
|
427
|
+
|
|
428
|
+
def get_deck_type(self) -> DeckType:
|
|
429
|
+
"""Get engine deck type."""
|
|
430
|
+
return self._protocol_engine.state_view.config.deck_type
|
|
431
|
+
|
|
432
|
+
def get_nozzle_maps(self) -> Mapping[str, NozzleMapInterface]:
|
|
433
|
+
"""Get current nozzle maps keyed by pipette id."""
|
|
434
|
+
return self._protocol_engine.state_view.pipettes.get_nozzle_configurations()
|
|
435
|
+
|
|
436
|
+
def get_tip_attached(self) -> Dict[str, bool]:
|
|
437
|
+
"""Get current tip state keyed by pipette id."""
|
|
438
|
+
|
|
439
|
+
def has_tip_attached(pipette_id: str) -> bool:
|
|
440
|
+
return (
|
|
441
|
+
self._protocol_engine.state_view.pipettes.get_attached_tip(pipette_id)
|
|
442
|
+
is not None
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
pipette_ids = (
|
|
446
|
+
pipette.id
|
|
447
|
+
for pipette in self._protocol_engine.state_view.pipettes.get_all()
|
|
448
|
+
)
|
|
449
|
+
return {pipette_id: has_tip_attached(pipette_id) for pipette_id in pipette_ids}
|
|
450
|
+
|
|
451
|
+
def set_error_recovery_policy(self, policy: ErrorRecoveryPolicy) -> None:
|
|
452
|
+
"""Create error recovery policy for the run."""
|
|
453
|
+
self._protocol_engine.set_error_recovery_policy(policy)
|
|
454
|
+
|
|
455
|
+
def get_flex_stacker_substate(self) -> Mapping[str, FlexStackerSubState]:
|
|
456
|
+
"""Get current (if any) Flex Stacker Substates keyed by module id."""
|
|
457
|
+
modules = self._protocol_engine.state_view.modules.get_all()
|
|
458
|
+
stackers: Dict[str, FlexStackerSubState] = {}
|
|
459
|
+
for module in modules:
|
|
460
|
+
if module.model == ModuleModel.FLEX_STACKER_MODULE_V1:
|
|
461
|
+
stackers[
|
|
462
|
+
module.id
|
|
463
|
+
] = self._protocol_engine.state_view.modules.get_flex_stacker_substate(
|
|
464
|
+
module.id
|
|
465
|
+
)
|
|
466
|
+
return stackers
|
|
467
|
+
|
|
468
|
+
async def command_generator(self) -> AsyncGenerator[str, None]:
|
|
469
|
+
"""Yield next command to execute."""
|
|
470
|
+
while True:
|
|
471
|
+
try:
|
|
472
|
+
# TODO(tz, 6-26-2024): avoid using private accessor in a follow up pr.
|
|
473
|
+
command_id = await self._protocol_engine._state_store.wait_for(
|
|
474
|
+
condition=self._protocol_engine.state_view.commands.get_next_to_execute
|
|
475
|
+
)
|
|
476
|
+
# Assert for type hinting. This is valid because the wait_for() above
|
|
477
|
+
# only returns when the value is truthy.
|
|
478
|
+
assert command_id is not None
|
|
479
|
+
yield command_id
|
|
480
|
+
except RunStoppedError:
|
|
481
|
+
# There are no more commands that we should execute, either because the run has
|
|
482
|
+
# completed on its own, or because a client requested it to stop.
|
|
483
|
+
break
|
|
484
|
+
|
|
485
|
+
@staticmethod
|
|
486
|
+
def _map_parse_mode_to_python_parse_mode(parse_mode: ParseMode) -> PythonParseMode:
|
|
487
|
+
if parse_mode == ParseMode.NORMAL:
|
|
488
|
+
return PythonParseMode.NORMAL
|
|
489
|
+
elif parse_mode == ParseMode.ALLOW_LEGACY_METADATA_AND_REQUIREMENTS:
|
|
490
|
+
return PythonParseMode.ALLOW_LEGACY_METADATA_AND_REQUIREMENTS
|
|
491
|
+
else:
|
|
492
|
+
raise UnknownProtocolParseMode()
|
|
493
|
+
|
|
494
|
+
def clear_command_history(self) -> None:
|
|
495
|
+
"""Force cleanup of command history."""
|
|
496
|
+
self._protocol_engine.clear_command_history()
|