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,174 @@
|
|
|
1
|
+
"""Control a `ProtocolEngine` without async/await."""
|
|
2
|
+
|
|
3
|
+
from typing import cast, Any, Optional, overload
|
|
4
|
+
|
|
5
|
+
from opentrons_shared_data.labware.types import LabwareUri
|
|
6
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
7
|
+
|
|
8
|
+
from .. import commands
|
|
9
|
+
from ..commands.command_unions import CREATE_TYPES_BY_PARAMS_TYPE
|
|
10
|
+
from ..state.state import StateView
|
|
11
|
+
from ..types import (
|
|
12
|
+
Liquid,
|
|
13
|
+
LabwareOffsetCreate,
|
|
14
|
+
)
|
|
15
|
+
from .transports import ChildThreadTransport
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SyncClient:
|
|
19
|
+
"""Control a `ProtocolEngine` without async/await.
|
|
20
|
+
|
|
21
|
+
Normally, `ProtocolEngine` provides an async/await interface, like this:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
aspirate_result = await protocol_engine.add_and_execute_command(aspirate_command)
|
|
25
|
+
dispense_result = await protocol_engine.add_and_execute_command(dispense_command)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
But we sometimes want to control it with plain old non-async blocking method calls.
|
|
29
|
+
To accomplish that, this class adapts `ProtocolEngine`'s interface into this:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
aspirate_result = sync_client.aspirate(...)
|
|
33
|
+
dispense_result = sync_client.dispense(...)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This is intended to help implement the Python Protocol API, which is all non-async.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# todo(mm, 2024-06-13): The separation of responsibilities between this class
|
|
40
|
+
# and ChildThreadTransport has grown to be pretty fuzzy. Clarify or merge the two
|
|
41
|
+
# classes.
|
|
42
|
+
|
|
43
|
+
def __init__(self, transport: ChildThreadTransport) -> None:
|
|
44
|
+
"""Initialize the `SyncClient`.
|
|
45
|
+
|
|
46
|
+
Params:
|
|
47
|
+
transport: The interface for the new `SyncClient` to use to
|
|
48
|
+
communicate with the `ProtocolEngine`.
|
|
49
|
+
"""
|
|
50
|
+
self._transport = transport
|
|
51
|
+
|
|
52
|
+
def execute_command(self, params: commands.CommandParams) -> None:
|
|
53
|
+
"""Execute a ProtocolEngine command, including error recovery.
|
|
54
|
+
|
|
55
|
+
See `ChildThreadTransport.execute_command_wait_for_recovery()` for exact
|
|
56
|
+
behavior.
|
|
57
|
+
"""
|
|
58
|
+
CreateType = CREATE_TYPES_BY_PARAMS_TYPE[type(params)]
|
|
59
|
+
create_request = CreateType(params=cast(Any, params))
|
|
60
|
+
self._transport.execute_command_wait_for_recovery(create_request)
|
|
61
|
+
|
|
62
|
+
@overload
|
|
63
|
+
def execute_command_without_recovery(
|
|
64
|
+
self, params: commands.LoadLabwareParams
|
|
65
|
+
) -> commands.LoadLabwareResult:
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
@overload
|
|
69
|
+
def execute_command_without_recovery(
|
|
70
|
+
self, params: commands.LoadModuleParams
|
|
71
|
+
) -> commands.LoadModuleResult:
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
@overload
|
|
75
|
+
def execute_command_without_recovery(
|
|
76
|
+
self, params: commands.LoadPipetteParams
|
|
77
|
+
) -> commands.LoadPipetteResult:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
@overload
|
|
81
|
+
def execute_command_without_recovery(
|
|
82
|
+
self, params: commands.LoadLidStackParams
|
|
83
|
+
) -> commands.LoadLidStackResult:
|
|
84
|
+
pass
|
|
85
|
+
|
|
86
|
+
@overload
|
|
87
|
+
def execute_command_without_recovery(
|
|
88
|
+
self, params: commands.LoadLidParams
|
|
89
|
+
) -> commands.LoadLidResult:
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
@overload
|
|
93
|
+
def execute_command_without_recovery(
|
|
94
|
+
self, params: commands.LiquidProbeParams
|
|
95
|
+
) -> commands.LiquidProbeResult:
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
@overload
|
|
99
|
+
def execute_command_without_recovery(
|
|
100
|
+
self, params: commands.TryLiquidProbeParams
|
|
101
|
+
) -> commands.TryLiquidProbeResult:
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
@overload
|
|
105
|
+
def execute_command_without_recovery(
|
|
106
|
+
self, params: commands.LoadLiquidClassParams
|
|
107
|
+
) -> commands.LoadLiquidClassResult:
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
@overload
|
|
111
|
+
def execute_command_without_recovery(
|
|
112
|
+
self, params: commands.GetNextTipParams
|
|
113
|
+
) -> commands.GetNextTipResult:
|
|
114
|
+
pass
|
|
115
|
+
|
|
116
|
+
def execute_command_without_recovery(
|
|
117
|
+
self, params: commands.CommandParams
|
|
118
|
+
) -> commands.CommandResult:
|
|
119
|
+
"""Execute a ProtocolEngine command.
|
|
120
|
+
|
|
121
|
+
See `ChildThreadTransport.execute_command()` for exact
|
|
122
|
+
behavior.
|
|
123
|
+
"""
|
|
124
|
+
CreateType = CREATE_TYPES_BY_PARAMS_TYPE[type(params)]
|
|
125
|
+
create_request = CreateType(params=cast(Any, params))
|
|
126
|
+
return self._transport.execute_command(create_request)
|
|
127
|
+
|
|
128
|
+
@property
|
|
129
|
+
def state(self) -> StateView:
|
|
130
|
+
"""Get a view of the engine's state."""
|
|
131
|
+
return self._transport.state
|
|
132
|
+
|
|
133
|
+
def add_labware_definition(self, definition: LabwareDefinition) -> LabwareUri:
|
|
134
|
+
"""Add a labware definition to the engine."""
|
|
135
|
+
return self._transport.call_method(
|
|
136
|
+
"add_labware_definition",
|
|
137
|
+
definition=definition,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def add_addressable_area(self, addressable_area_name: str) -> None:
|
|
141
|
+
"""Add an addressable area to the engine's state."""
|
|
142
|
+
self._transport.call_method(
|
|
143
|
+
"add_addressable_area", addressable_area_name=addressable_area_name
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
def add_liquid(
|
|
147
|
+
self, name: str, color: Optional[str], description: Optional[str]
|
|
148
|
+
) -> Liquid:
|
|
149
|
+
"""Add a liquid to the engine."""
|
|
150
|
+
return self._transport.call_method("add_liquid", name=name, color=color, description=description) # type: ignore[no-any-return]
|
|
151
|
+
|
|
152
|
+
def reset_tips(self, labware_id: str) -> None:
|
|
153
|
+
"""Reset a labware's tip tracking state.."""
|
|
154
|
+
self._transport.call_method(
|
|
155
|
+
"reset_tips",
|
|
156
|
+
labware_id=labware_id,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
def add_labware_offset(self, request: LabwareOffsetCreate) -> None:
|
|
160
|
+
"""Add a labware offset."""
|
|
161
|
+
self._transport.call_method("add_labware_offset", request=request)
|
|
162
|
+
|
|
163
|
+
def set_pipette_movement_speed(
|
|
164
|
+
self, pipette_id: str, speed: Optional[float]
|
|
165
|
+
) -> None:
|
|
166
|
+
"""Set the speed of a pipette's X/Y/Z movements. Does not affect plunger speed.
|
|
167
|
+
|
|
168
|
+
None will use the hardware API's default.
|
|
169
|
+
"""
|
|
170
|
+
self._transport.call_method(
|
|
171
|
+
"set_pipette_movement_speed",
|
|
172
|
+
pipette_id=pipette_id,
|
|
173
|
+
speed=speed,
|
|
174
|
+
)
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""A helper for controlling a `ProtocolEngine` without async/await."""
|
|
2
|
+
from asyncio import AbstractEventLoop, run_coroutine_threadsafe
|
|
3
|
+
from typing import Any, Final, overload
|
|
4
|
+
from typing_extensions import Literal
|
|
5
|
+
|
|
6
|
+
from opentrons_shared_data.labware.types import LabwareUri
|
|
7
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from ..protocol_engine import ProtocolEngine
|
|
11
|
+
from ..errors import ProtocolCommandFailedError
|
|
12
|
+
from ..error_recovery_policy import ErrorRecoveryType
|
|
13
|
+
from ..state.state import StateView
|
|
14
|
+
from ..commands import Command, CommandCreate, CommandResult, CommandStatus
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class RunStoppedBeforeCommandError(RuntimeError):
|
|
18
|
+
"""Raised if the ProtocolEngine was stopped before a command could start."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, command: Command) -> None:
|
|
21
|
+
self._command = command
|
|
22
|
+
super().__init__(
|
|
23
|
+
f"The run was stopped"
|
|
24
|
+
f" before {command.commandType} command {command.id} could execute."
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ChildThreadTransport:
|
|
29
|
+
"""A helper for controlling a `ProtocolEngine` without async/await.
|
|
30
|
+
|
|
31
|
+
You shouldn't use this directly, except to construct it and then pass it to a `SyncClient`.
|
|
32
|
+
|
|
33
|
+
This class is responsible for doing the actual transformation from async `ProtocolEngine` calls
|
|
34
|
+
to non-async ones, and doing it in a thread-safe way.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, engine: ProtocolEngine, loop: AbstractEventLoop) -> None:
|
|
38
|
+
"""Initialize the `ChildThreadTransport`.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
engine: The `ProtocolEngine` instance that you want to interact with.
|
|
42
|
+
It must be running in a thread *other* than the one from which you
|
|
43
|
+
want to synchronously access it.
|
|
44
|
+
loop: The event loop that `engine` is running in (in the other thread).
|
|
45
|
+
"""
|
|
46
|
+
# We might access these from different threads,
|
|
47
|
+
# so let's make them Final for (shallow) immutability.
|
|
48
|
+
self._engine: Final = engine
|
|
49
|
+
self._loop: Final = loop
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def state(self) -> StateView:
|
|
53
|
+
"""Get a view of the Protocol Engine's state."""
|
|
54
|
+
return self._engine.state_view
|
|
55
|
+
|
|
56
|
+
def execute_command(self, request: CommandCreate) -> CommandResult:
|
|
57
|
+
"""Execute a ProtocolEngine command.
|
|
58
|
+
|
|
59
|
+
This blocks until the command completes. If the command fails, this will always
|
|
60
|
+
raise the failure as an exception--even if ProtocolEngine deemed the failure
|
|
61
|
+
recoverable.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
request: The ProtocolEngine command request
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
The command's result data.
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
ProtocolEngineError: If the command execution was not successful,
|
|
71
|
+
the specific error that caused the command to fail is raised.
|
|
72
|
+
|
|
73
|
+
If the run was stopped before the command could complete, that's
|
|
74
|
+
also signaled as this exception.
|
|
75
|
+
"""
|
|
76
|
+
command = run_coroutine_threadsafe(
|
|
77
|
+
self._engine.add_and_execute_command(request=request),
|
|
78
|
+
loop=self._loop,
|
|
79
|
+
).result()
|
|
80
|
+
|
|
81
|
+
# TODO: this needs to have an actual code
|
|
82
|
+
if command.error is not None:
|
|
83
|
+
error = command.error
|
|
84
|
+
raise ProtocolCommandFailedError(
|
|
85
|
+
original_error=error,
|
|
86
|
+
message=f"{error.errorType}: {error.detail}",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if command.result is None:
|
|
90
|
+
# This can happen with a certain pause timing:
|
|
91
|
+
#
|
|
92
|
+
# 1. The engine is paused.
|
|
93
|
+
# 2. The user's Python script calls this method to start a new command,
|
|
94
|
+
# which remains `queued` because of the pause.
|
|
95
|
+
# 3. The engine is stopped. The returned command will be `queued`
|
|
96
|
+
# and won't have a result.
|
|
97
|
+
raise RunStoppedBeforeCommandError(command)
|
|
98
|
+
|
|
99
|
+
return command.result
|
|
100
|
+
|
|
101
|
+
def execute_command_wait_for_recovery(self, request: CommandCreate) -> Command:
|
|
102
|
+
"""Execute a ProtocolEngine command, including error recovery.
|
|
103
|
+
|
|
104
|
+
This blocks until the command completes. Additionally, if the command fails,
|
|
105
|
+
this will continue to block until its error recovery has been completed.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
request: The ProtocolEngine command request.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
The command. If error recovery happened for it, the command will be
|
|
112
|
+
reported here as failed.
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
ProtocolEngineError: If the command failed, *and* the failure was not
|
|
116
|
+
recovered from.
|
|
117
|
+
|
|
118
|
+
If the run was stopped before the command could complete, that's
|
|
119
|
+
also signalled as this exception.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
async def run_in_pe_thread() -> Command:
|
|
123
|
+
command = await self._engine.add_and_execute_command_wait_for_recovery(
|
|
124
|
+
request=request
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
if command.error is not None:
|
|
128
|
+
error_recovery_type = (
|
|
129
|
+
self._engine.state_view.commands.get_error_recovery_type(command.id)
|
|
130
|
+
)
|
|
131
|
+
error_should_fail_run = (
|
|
132
|
+
error_recovery_type == ErrorRecoveryType.FAIL_RUN
|
|
133
|
+
)
|
|
134
|
+
if error_should_fail_run:
|
|
135
|
+
error = command.error
|
|
136
|
+
# TODO: this needs to have an actual code
|
|
137
|
+
raise ProtocolCommandFailedError(
|
|
138
|
+
original_error=error,
|
|
139
|
+
message=f"{error.errorType}: {error.detail}",
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
elif command.status == CommandStatus.QUEUED:
|
|
143
|
+
# This can happen with a certain pause timing:
|
|
144
|
+
#
|
|
145
|
+
# 1. The engine is paused.
|
|
146
|
+
# 2. The user's Python script calls this method to start a new command,
|
|
147
|
+
# which remains `queued` because of the pause.
|
|
148
|
+
# 3. The engine is stopped. The returned command will be `queued`,
|
|
149
|
+
# and won't have a result.
|
|
150
|
+
raise RunStoppedBeforeCommandError(command)
|
|
151
|
+
|
|
152
|
+
return command
|
|
153
|
+
|
|
154
|
+
command = run_coroutine_threadsafe(
|
|
155
|
+
run_in_pe_thread(),
|
|
156
|
+
loop=self._loop,
|
|
157
|
+
).result()
|
|
158
|
+
|
|
159
|
+
return command
|
|
160
|
+
|
|
161
|
+
@overload
|
|
162
|
+
def call_method(
|
|
163
|
+
self,
|
|
164
|
+
method_name: Literal["add_labware_definition"],
|
|
165
|
+
*,
|
|
166
|
+
definition: LabwareDefinition,
|
|
167
|
+
) -> LabwareUri:
|
|
168
|
+
...
|
|
169
|
+
|
|
170
|
+
@overload
|
|
171
|
+
def call_method(
|
|
172
|
+
self,
|
|
173
|
+
method_name: Literal["reset_tips"],
|
|
174
|
+
*,
|
|
175
|
+
labware_id: str,
|
|
176
|
+
) -> None:
|
|
177
|
+
...
|
|
178
|
+
|
|
179
|
+
@overload
|
|
180
|
+
def call_method(
|
|
181
|
+
self,
|
|
182
|
+
method_name: str,
|
|
183
|
+
**kwargs: Any,
|
|
184
|
+
) -> Any:
|
|
185
|
+
...
|
|
186
|
+
|
|
187
|
+
def call_method(self, method_name: str, **kwargs: Any) -> Any:
|
|
188
|
+
"""Execute a ProtocolEngine method, returning the result."""
|
|
189
|
+
return run_coroutine_threadsafe(
|
|
190
|
+
self._call_method(method_name, **kwargs),
|
|
191
|
+
loop=self._loop,
|
|
192
|
+
).result()
|
|
193
|
+
|
|
194
|
+
async def _call_method(self, method_name: str, **kwargs: Any) -> Any:
|
|
195
|
+
method = getattr(self._engine, method_name)
|
|
196
|
+
assert callable(method), f"{method_name} is not a method of ProtocolEngine"
|
|
197
|
+
return method(**kwargs)
|