opentrons 8.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +557 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +187 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/scripts/update_module_fw.py +274 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +276 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1186 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +501 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1027 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3272 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1447 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +350 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +68 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1164 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2408 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1432 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1515 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +310 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +310 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +852 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0.dist-info/METADATA +37 -0
- opentrons-8.6.0.dist-info/RECORD +601 -0
- opentrons-8.6.0.dist-info/WHEEL +4 -0
- opentrons-8.6.0.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"""The interface that implements ProtocolContext."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import abstractmethod, ABC
|
|
6
|
+
from typing import Generic, List, Optional, Union, Tuple, Dict, TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from opentrons_shared_data.deck.types import DeckDefinitionV5, SlotDefV3
|
|
9
|
+
from opentrons_shared_data.pipette.types import PipetteNameType
|
|
10
|
+
from opentrons_shared_data.labware.types import LabwareDefinition
|
|
11
|
+
from opentrons_shared_data.robot.types import RobotType
|
|
12
|
+
|
|
13
|
+
from opentrons.types import (
|
|
14
|
+
DeckSlotName,
|
|
15
|
+
StagingSlotName,
|
|
16
|
+
Location,
|
|
17
|
+
Mount,
|
|
18
|
+
Point,
|
|
19
|
+
)
|
|
20
|
+
from opentrons.hardware_control import SyncHardwareAPI
|
|
21
|
+
from opentrons.hardware_control.modules.types import ModuleModel
|
|
22
|
+
from opentrons.protocols.api_support.util import AxisMaxSpeeds
|
|
23
|
+
|
|
24
|
+
from .instrument import InstrumentCoreType
|
|
25
|
+
from .labware import LabwareCoreType, LabwareLoadParams
|
|
26
|
+
from .module import ModuleCoreType
|
|
27
|
+
from .._liquid import Liquid, LiquidClass
|
|
28
|
+
from .robot import AbstractRobot
|
|
29
|
+
from .._types import OffDeckType
|
|
30
|
+
from ..disposal_locations import TrashBin, WasteChute
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from ..labware import Labware
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class AbstractProtocol(
|
|
37
|
+
ABC, Generic[InstrumentCoreType, LabwareCoreType, ModuleCoreType]
|
|
38
|
+
):
|
|
39
|
+
@property
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def fixed_trash(self) -> Optional[LabwareCoreType]:
|
|
42
|
+
"""Get the fixed trash labware core."""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
@abstractmethod
|
|
47
|
+
def robot_type(self) -> RobotType:
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
@abstractmethod
|
|
51
|
+
def get_max_speeds(self) -> AxisMaxSpeeds:
|
|
52
|
+
...
|
|
53
|
+
|
|
54
|
+
@abstractmethod
|
|
55
|
+
def get_hardware(self) -> SyncHardwareAPI:
|
|
56
|
+
...
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
def is_simulating(self) -> bool:
|
|
60
|
+
...
|
|
61
|
+
|
|
62
|
+
@abstractmethod
|
|
63
|
+
def add_labware_definition(
|
|
64
|
+
self,
|
|
65
|
+
definition: LabwareDefinition,
|
|
66
|
+
) -> LabwareLoadParams:
|
|
67
|
+
"""Add a labware definition to the set of loadable definitions."""
|
|
68
|
+
...
|
|
69
|
+
|
|
70
|
+
@abstractmethod
|
|
71
|
+
def append_disposal_location(
|
|
72
|
+
self,
|
|
73
|
+
disposal_location: Union[Labware, TrashBin, WasteChute],
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Append a disposal location object to the core"""
|
|
76
|
+
...
|
|
77
|
+
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def load_labware(
|
|
80
|
+
self,
|
|
81
|
+
load_name: str,
|
|
82
|
+
location: Union[
|
|
83
|
+
DeckSlotName, StagingSlotName, LabwareCoreType, ModuleCoreType, OffDeckType
|
|
84
|
+
],
|
|
85
|
+
label: Optional[str],
|
|
86
|
+
namespace: Optional[str],
|
|
87
|
+
version: Optional[int],
|
|
88
|
+
) -> LabwareCoreType:
|
|
89
|
+
"""Load a labware using its identifying parameters."""
|
|
90
|
+
...
|
|
91
|
+
|
|
92
|
+
@abstractmethod
|
|
93
|
+
def load_adapter(
|
|
94
|
+
self,
|
|
95
|
+
load_name: str,
|
|
96
|
+
location: Union[DeckSlotName, StagingSlotName, ModuleCoreType, OffDeckType],
|
|
97
|
+
namespace: Optional[str],
|
|
98
|
+
version: Optional[int],
|
|
99
|
+
) -> LabwareCoreType:
|
|
100
|
+
"""Load an adapter using its identifying parameters"""
|
|
101
|
+
...
|
|
102
|
+
|
|
103
|
+
@abstractmethod
|
|
104
|
+
def load_lid(
|
|
105
|
+
self,
|
|
106
|
+
load_name: str,
|
|
107
|
+
location: LabwareCoreType,
|
|
108
|
+
namespace: Optional[str],
|
|
109
|
+
version: Optional[int],
|
|
110
|
+
) -> LabwareCoreType:
|
|
111
|
+
"""Load an individual lid labware using its identifying parameters. Must be loaded on a labware."""
|
|
112
|
+
...
|
|
113
|
+
|
|
114
|
+
@abstractmethod
|
|
115
|
+
def move_labware(
|
|
116
|
+
self,
|
|
117
|
+
labware_core: LabwareCoreType,
|
|
118
|
+
new_location: Union[
|
|
119
|
+
DeckSlotName,
|
|
120
|
+
StagingSlotName,
|
|
121
|
+
LabwareCoreType,
|
|
122
|
+
ModuleCoreType,
|
|
123
|
+
OffDeckType,
|
|
124
|
+
WasteChute,
|
|
125
|
+
TrashBin,
|
|
126
|
+
],
|
|
127
|
+
use_gripper: bool,
|
|
128
|
+
pause_for_manual_move: bool,
|
|
129
|
+
pick_up_offset: Optional[Tuple[float, float, float]],
|
|
130
|
+
drop_offset: Optional[Tuple[float, float, float]],
|
|
131
|
+
) -> None:
|
|
132
|
+
...
|
|
133
|
+
|
|
134
|
+
@abstractmethod
|
|
135
|
+
def move_lid(
|
|
136
|
+
self,
|
|
137
|
+
source_location: Union[DeckSlotName, StagingSlotName, LabwareCoreType],
|
|
138
|
+
new_location: Union[
|
|
139
|
+
DeckSlotName,
|
|
140
|
+
StagingSlotName,
|
|
141
|
+
LabwareCoreType,
|
|
142
|
+
OffDeckType,
|
|
143
|
+
WasteChute,
|
|
144
|
+
TrashBin,
|
|
145
|
+
],
|
|
146
|
+
use_gripper: bool,
|
|
147
|
+
pause_for_manual_move: bool,
|
|
148
|
+
pick_up_offset: Optional[Tuple[float, float, float]],
|
|
149
|
+
drop_offset: Optional[Tuple[float, float, float]],
|
|
150
|
+
) -> LabwareCoreType | None:
|
|
151
|
+
...
|
|
152
|
+
|
|
153
|
+
@abstractmethod
|
|
154
|
+
def load_module(
|
|
155
|
+
self,
|
|
156
|
+
model: ModuleModel,
|
|
157
|
+
deck_slot: Optional[DeckSlotName],
|
|
158
|
+
configuration: Optional[str],
|
|
159
|
+
) -> ModuleCoreType:
|
|
160
|
+
...
|
|
161
|
+
|
|
162
|
+
@abstractmethod
|
|
163
|
+
def load_instrument(
|
|
164
|
+
self,
|
|
165
|
+
instrument_name: PipetteNameType,
|
|
166
|
+
mount: Mount,
|
|
167
|
+
liquid_presence_detection: bool = False,
|
|
168
|
+
) -> InstrumentCoreType:
|
|
169
|
+
...
|
|
170
|
+
|
|
171
|
+
@abstractmethod
|
|
172
|
+
def load_trash_bin(self, slot_name: DeckSlotName, area_name: str) -> TrashBin:
|
|
173
|
+
...
|
|
174
|
+
|
|
175
|
+
@abstractmethod
|
|
176
|
+
def load_ot2_fixed_trash_bin(self) -> None:
|
|
177
|
+
...
|
|
178
|
+
|
|
179
|
+
@abstractmethod
|
|
180
|
+
def load_waste_chute(self) -> WasteChute:
|
|
181
|
+
...
|
|
182
|
+
|
|
183
|
+
@abstractmethod
|
|
184
|
+
def pause(self, msg: Optional[str]) -> None:
|
|
185
|
+
...
|
|
186
|
+
|
|
187
|
+
@abstractmethod
|
|
188
|
+
def comment(self, msg: str) -> None:
|
|
189
|
+
...
|
|
190
|
+
|
|
191
|
+
@abstractmethod
|
|
192
|
+
def delay(self, seconds: float, msg: Optional[str]) -> None:
|
|
193
|
+
...
|
|
194
|
+
|
|
195
|
+
@abstractmethod
|
|
196
|
+
def home(self) -> None:
|
|
197
|
+
...
|
|
198
|
+
|
|
199
|
+
@abstractmethod
|
|
200
|
+
def set_rail_lights(self, on: bool) -> None:
|
|
201
|
+
...
|
|
202
|
+
|
|
203
|
+
@abstractmethod
|
|
204
|
+
def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]:
|
|
205
|
+
...
|
|
206
|
+
|
|
207
|
+
@abstractmethod
|
|
208
|
+
def get_rail_lights_on(self) -> bool:
|
|
209
|
+
...
|
|
210
|
+
|
|
211
|
+
@abstractmethod
|
|
212
|
+
def door_closed(self) -> bool:
|
|
213
|
+
...
|
|
214
|
+
|
|
215
|
+
@abstractmethod
|
|
216
|
+
def get_last_location(
|
|
217
|
+
self,
|
|
218
|
+
mount: Optional[Mount] = None,
|
|
219
|
+
) -> Optional[Union[Location, TrashBin, WasteChute]]:
|
|
220
|
+
...
|
|
221
|
+
|
|
222
|
+
@abstractmethod
|
|
223
|
+
def set_last_location(
|
|
224
|
+
self,
|
|
225
|
+
location: Optional[Location],
|
|
226
|
+
mount: Optional[Mount] = None,
|
|
227
|
+
) -> None:
|
|
228
|
+
...
|
|
229
|
+
|
|
230
|
+
@abstractmethod
|
|
231
|
+
def load_lid_stack(
|
|
232
|
+
self,
|
|
233
|
+
load_name: str,
|
|
234
|
+
location: Union[DeckSlotName, StagingSlotName, LabwareCoreType],
|
|
235
|
+
quantity: int,
|
|
236
|
+
namespace: Optional[str],
|
|
237
|
+
version: Optional[int],
|
|
238
|
+
) -> LabwareCoreType:
|
|
239
|
+
...
|
|
240
|
+
|
|
241
|
+
@abstractmethod
|
|
242
|
+
def get_deck_definition(self) -> DeckDefinitionV5:
|
|
243
|
+
"""Get the geometry definition of the robot's deck."""
|
|
244
|
+
|
|
245
|
+
@abstractmethod
|
|
246
|
+
def get_slot_definition(
|
|
247
|
+
self, slot: Union[DeckSlotName, StagingSlotName]
|
|
248
|
+
) -> SlotDefV3:
|
|
249
|
+
"""Get the slot definition from the robot's deck."""
|
|
250
|
+
|
|
251
|
+
@abstractmethod
|
|
252
|
+
def get_slot_definitions(self) -> Dict[str, SlotDefV3]:
|
|
253
|
+
"""Get all standard slot definitions available in the deck definition."""
|
|
254
|
+
|
|
255
|
+
@abstractmethod
|
|
256
|
+
def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]:
|
|
257
|
+
"""Get all staging slot definitions available in the deck definition."""
|
|
258
|
+
|
|
259
|
+
@abstractmethod
|
|
260
|
+
def get_slot_item(
|
|
261
|
+
self, slot_name: Union[DeckSlotName, StagingSlotName]
|
|
262
|
+
) -> Union[LabwareCoreType, ModuleCoreType, None]:
|
|
263
|
+
"""Get the contents of a given slot, if any."""
|
|
264
|
+
|
|
265
|
+
@abstractmethod
|
|
266
|
+
def get_labware_on_module(
|
|
267
|
+
self, module_core: ModuleCoreType
|
|
268
|
+
) -> Optional[LabwareCoreType]:
|
|
269
|
+
"""Get the labware on a given module, if any."""
|
|
270
|
+
|
|
271
|
+
@abstractmethod
|
|
272
|
+
def get_labware_on_labware(
|
|
273
|
+
self, labware_core: LabwareCoreType
|
|
274
|
+
) -> Optional[LabwareCoreType]:
|
|
275
|
+
"""Get the labware on a given labware, if any."""
|
|
276
|
+
|
|
277
|
+
@abstractmethod
|
|
278
|
+
def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point:
|
|
279
|
+
"""Get the absolute coordinate of a slot's center."""
|
|
280
|
+
|
|
281
|
+
@abstractmethod
|
|
282
|
+
def get_highest_z(self) -> float:
|
|
283
|
+
"""Get the highest Z point of all deck items."""
|
|
284
|
+
|
|
285
|
+
@abstractmethod
|
|
286
|
+
def get_labware_cores(self) -> List[LabwareCoreType]:
|
|
287
|
+
"""Get all loaded labware cores."""
|
|
288
|
+
|
|
289
|
+
@abstractmethod
|
|
290
|
+
def get_module_cores(self) -> List[ModuleCoreType]:
|
|
291
|
+
"""Get all loaded module cores."""
|
|
292
|
+
|
|
293
|
+
@abstractmethod
|
|
294
|
+
def define_liquid(
|
|
295
|
+
self, name: str, description: Optional[str], display_color: Optional[str]
|
|
296
|
+
) -> Liquid:
|
|
297
|
+
"""Define a liquid to load into a well."""
|
|
298
|
+
|
|
299
|
+
@abstractmethod
|
|
300
|
+
def get_liquid_class(self, name: str, version: int) -> LiquidClass:
|
|
301
|
+
"""Get an instance of a built-in liquid class."""
|
|
302
|
+
|
|
303
|
+
@abstractmethod
|
|
304
|
+
def get_labware_location(
|
|
305
|
+
self, labware_core: LabwareCoreType
|
|
306
|
+
) -> Union[str, LabwareCoreType, ModuleCoreType, OffDeckType]:
|
|
307
|
+
"""Get labware parent location."""
|
|
308
|
+
|
|
309
|
+
@abstractmethod
|
|
310
|
+
def load_robot(self) -> AbstractRobot:
|
|
311
|
+
"""Load a Robot Core context into a protocol"""
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from abc import abstractmethod, ABC
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
from opentrons.types import AxisMapType, Mount, Point
|
|
5
|
+
from opentrons_shared_data.pipette.types import PipetteNameType
|
|
6
|
+
from opentrons.protocol_api._types import PlungerPositionTypes, PipetteActionTypes
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AbstractRobot(ABC):
|
|
10
|
+
@abstractmethod
|
|
11
|
+
def get_pipette_type_from_engine(
|
|
12
|
+
self, mount: Union[Mount, str]
|
|
13
|
+
) -> Optional[PipetteNameType]:
|
|
14
|
+
...
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def get_plunger_position_from_volume(
|
|
18
|
+
self, mount: Mount, volume: float, action: PipetteActionTypes, robot_type: str
|
|
19
|
+
) -> float:
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def get_plunger_position_from_name(
|
|
24
|
+
self, mount: Mount, position_name: PlungerPositionTypes
|
|
25
|
+
) -> float:
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def move_to(self, mount: Mount, destination: Point, speed: Optional[float]) -> None:
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
@abstractmethod
|
|
33
|
+
def move_axes_to(
|
|
34
|
+
self,
|
|
35
|
+
axis_map: AxisMapType,
|
|
36
|
+
critical_point: Optional[AxisMapType],
|
|
37
|
+
speed: Optional[float],
|
|
38
|
+
) -> None:
|
|
39
|
+
...
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def move_axes_relative(self, axis_map: AxisMapType, speed: Optional[float]) -> None:
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def release_grip(self) -> None:
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def close_gripper(self, force: Optional[float] = None) -> None:
|
|
51
|
+
...
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Abstract interface for Well core implementations."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import TypeVar, Optional, Union
|
|
5
|
+
|
|
6
|
+
from opentrons.types import Point, Mount
|
|
7
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
8
|
+
|
|
9
|
+
from .._liquid import Liquid
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AbstractWellCore(ABC):
|
|
13
|
+
"""Well core interface."""
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def diameter(self) -> Optional[float]:
|
|
18
|
+
"""Get the well's diameter, if circular."""
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def length(self) -> Optional[float]:
|
|
23
|
+
"""Get the well's length, if rectangular."""
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def width(self) -> Optional[float]:
|
|
28
|
+
"""Get the well's width, if rectangular."""
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def depth(self) -> float:
|
|
33
|
+
"""Get the well's depth."""
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def has_tip(self) -> bool:
|
|
37
|
+
"""Whether the well contains a tip."""
|
|
38
|
+
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def set_has_tip(self, value: bool) -> None:
|
|
41
|
+
"""Set the well as containing or not containing a tip."""
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def get_display_name(self) -> str:
|
|
45
|
+
"""Get the full display name of the well (e.g. "A1 of Some Labware on 5")."""
|
|
46
|
+
|
|
47
|
+
@abstractmethod
|
|
48
|
+
def get_name(self) -> str:
|
|
49
|
+
"""Get the name of the well (e.g. "A1")."""
|
|
50
|
+
|
|
51
|
+
@abstractmethod
|
|
52
|
+
def get_column_name(self) -> str:
|
|
53
|
+
"""Get the column portion of the well name (e.g. "1")."""
|
|
54
|
+
|
|
55
|
+
@abstractmethod
|
|
56
|
+
def get_row_name(self) -> str:
|
|
57
|
+
"""Get the row portion of the well name (e.g. "A")."""
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def get_max_volume(self) -> float:
|
|
61
|
+
"""Get the well's maximum liquid volume."""
|
|
62
|
+
|
|
63
|
+
@abstractmethod
|
|
64
|
+
def get_top(self, z_offset: float) -> Point:
|
|
65
|
+
"""Get the coordinate of the well's top, with an z-offset."""
|
|
66
|
+
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def get_bottom(self, z_offset: float) -> Point:
|
|
69
|
+
"""Get the coordinate of the well's bottom, with an z-offset."""
|
|
70
|
+
|
|
71
|
+
@abstractmethod
|
|
72
|
+
def get_center(self) -> Point:
|
|
73
|
+
"""Get the coordinate of the well's center."""
|
|
74
|
+
|
|
75
|
+
@abstractmethod
|
|
76
|
+
def get_meniscus(self) -> Union[Point, LiquidTrackingType]:
|
|
77
|
+
"""Get the coordinate of the well's meniscus."""
|
|
78
|
+
|
|
79
|
+
@abstractmethod
|
|
80
|
+
def load_liquid(
|
|
81
|
+
self,
|
|
82
|
+
liquid: Liquid,
|
|
83
|
+
volume: float,
|
|
84
|
+
) -> None:
|
|
85
|
+
"""Load liquid into a well."""
|
|
86
|
+
|
|
87
|
+
@abstractmethod
|
|
88
|
+
def from_center_cartesian(self, x: float, y: float, z: float) -> Point:
|
|
89
|
+
"""Gets point in deck coordinates based on percentage of the radius of each axis."""
|
|
90
|
+
|
|
91
|
+
@abstractmethod
|
|
92
|
+
def estimate_liquid_height_after_pipetting(
|
|
93
|
+
self,
|
|
94
|
+
mount: Mount | str,
|
|
95
|
+
operation_volume: float,
|
|
96
|
+
) -> LiquidTrackingType:
|
|
97
|
+
"""Estimate what the liquid height will be after pipetting, without raising an error."""
|
|
98
|
+
|
|
99
|
+
@abstractmethod
|
|
100
|
+
def current_liquid_height(self) -> LiquidTrackingType:
|
|
101
|
+
"""Get the current liquid height."""
|
|
102
|
+
|
|
103
|
+
@abstractmethod
|
|
104
|
+
def get_liquid_volume(self) -> LiquidTrackingType:
|
|
105
|
+
"""Get the current volume within a well."""
|
|
106
|
+
|
|
107
|
+
@abstractmethod
|
|
108
|
+
def height_from_volume(self, volume: LiquidTrackingType) -> LiquidTrackingType:
|
|
109
|
+
"""Return the height in a well corresponding to a given volume."""
|
|
110
|
+
|
|
111
|
+
@abstractmethod
|
|
112
|
+
def volume_from_height(self, height: LiquidTrackingType) -> LiquidTrackingType:
|
|
113
|
+
"""Return the volume contained in a well at any height."""
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
WellCoreType = TypeVar("WellCoreType", bound=AbstractWellCore)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Well grid information."""
|
|
2
|
+
import collections
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Dict, List
|
|
5
|
+
|
|
6
|
+
from opentrons_shared_data.labware.constants import WELL_NAME_PATTERN
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass(frozen=True)
|
|
10
|
+
class WellGrid:
|
|
11
|
+
"""Well grid information.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
columns_by_name: An ordered mapping of well names, keyed by column names.
|
|
15
|
+
rows_by_name: An ordered mapping of well names, keyed by row names.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
rows_by_name: Dict[str, List[str]]
|
|
19
|
+
columns_by_name: Dict[str, List[str]]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# NOTE(mc, 2022-11-11): to preserve historical behavior,
|
|
23
|
+
# this function organizes rows and columns using the well name,
|
|
24
|
+
# rather than the well's position in the labware definition's `ordering` field.
|
|
25
|
+
# Logic originally added in https://github.com/Opentrons/opentrons/pull/2418
|
|
26
|
+
def create(columns: List[List[str]]) -> WellGrid:
|
|
27
|
+
columns_by_name = collections.defaultdict(list)
|
|
28
|
+
rows_by_name = collections.defaultdict(list)
|
|
29
|
+
|
|
30
|
+
for column in columns:
|
|
31
|
+
for well_name in column:
|
|
32
|
+
well_name_match = WELL_NAME_PATTERN.match(well_name)
|
|
33
|
+
|
|
34
|
+
assert (
|
|
35
|
+
well_name_match is not None
|
|
36
|
+
), "Well name did not match required pattern; please check labware definition."
|
|
37
|
+
|
|
38
|
+
row_name, column_name = well_name_match.group(1, 2)
|
|
39
|
+
rows_by_name[row_name].append(well_name)
|
|
40
|
+
columns_by_name[column_name].append(well_name)
|
|
41
|
+
|
|
42
|
+
return WellGrid(
|
|
43
|
+
columns_by_name=columns_by_name,
|
|
44
|
+
rows_by_name=rows_by_name,
|
|
45
|
+
)
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""ProtocolContext factory."""
|
|
2
|
+
import asyncio
|
|
3
|
+
from typing import Any, Dict, Optional, Union, cast
|
|
4
|
+
|
|
5
|
+
from opentrons_shared_data.labware.types import LabwareDefinition
|
|
6
|
+
|
|
7
|
+
from opentrons.hardware_control import (
|
|
8
|
+
HardwareControlAPI,
|
|
9
|
+
ThreadManager,
|
|
10
|
+
SynchronousAdapter,
|
|
11
|
+
)
|
|
12
|
+
from opentrons.legacy_broker import LegacyBroker
|
|
13
|
+
from opentrons.util.broker import Broker
|
|
14
|
+
from opentrons.protocol_engine import ProtocolEngine
|
|
15
|
+
from opentrons.protocol_engine.clients import SyncClient, ChildThreadTransport
|
|
16
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
17
|
+
from opentrons.protocols.api_support.deck_type import (
|
|
18
|
+
should_load_fixed_trash_area_for_python_protocol,
|
|
19
|
+
)
|
|
20
|
+
from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
|
|
21
|
+
|
|
22
|
+
from .protocol_context import ProtocolContext
|
|
23
|
+
from .deck import Deck
|
|
24
|
+
from .disposal_locations import TrashBin
|
|
25
|
+
|
|
26
|
+
from .core.common import ProtocolCore as AbstractProtocolCore
|
|
27
|
+
from .core.legacy.deck import Deck as LegacyDeck
|
|
28
|
+
from .core.legacy.legacy_protocol_core import LegacyProtocolCore
|
|
29
|
+
from .core.legacy.labware_offset_provider import (
|
|
30
|
+
AbstractLabwareOffsetProvider,
|
|
31
|
+
LabwareOffsetProvider,
|
|
32
|
+
NullLabwareOffsetProvider,
|
|
33
|
+
)
|
|
34
|
+
from .core.legacy_simulator.legacy_protocol_core import LegacyProtocolCoreSimulator
|
|
35
|
+
from .core.engine import ENGINE_CORE_API_VERSION, ProtocolCore
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ProtocolEngineCoreRequiredError(Exception):
|
|
39
|
+
"""Raised when a Protocol Engine core was required, but not provided.
|
|
40
|
+
|
|
41
|
+
This can happen when creating a ProtocolContext with a high api_version.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def create_protocol_context(
|
|
46
|
+
api_version: APIVersion,
|
|
47
|
+
*,
|
|
48
|
+
hardware_api: Union[HardwareControlAPI, ThreadManager[HardwareControlAPI]],
|
|
49
|
+
deck_type: str,
|
|
50
|
+
protocol_engine: Optional[ProtocolEngine] = None,
|
|
51
|
+
protocol_engine_loop: Optional[asyncio.AbstractEventLoop] = None,
|
|
52
|
+
broker: Optional[LegacyBroker] = None,
|
|
53
|
+
equipment_broker: Optional[Broker[Any]] = None,
|
|
54
|
+
use_simulating_core: bool = False,
|
|
55
|
+
extra_labware: Optional[Dict[str, LabwareDefinition]] = None,
|
|
56
|
+
bundled_labware: Optional[Dict[str, LabwareDefinition]] = None,
|
|
57
|
+
bundled_data: Optional[Dict[str, bytes]] = None,
|
|
58
|
+
) -> ProtocolContext:
|
|
59
|
+
"""Create a ProtocolContext for use in a Python protocol.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
api_version: The API version to target.
|
|
63
|
+
hardware_api: Control interface to the device's hardware.
|
|
64
|
+
deck_type: What kind of deck the device has.
|
|
65
|
+
This must match the deck type in `protocol_engine`'s config, if there is one.
|
|
66
|
+
protocol_engine: A ProtocolEngine to use for labware offsets
|
|
67
|
+
and core protocol logic. If omitted, labware offsets will
|
|
68
|
+
all be (0, 0, 0) and ProtocolEngine-based core will not work.
|
|
69
|
+
protocol_engine_loop: An event loop running in the thread where
|
|
70
|
+
ProtocolEngine mutations must occur.
|
|
71
|
+
broker: A message broker for protocol command event publishing.
|
|
72
|
+
equipment_broker: A message broker for equipment load event publishing.
|
|
73
|
+
use_simulating_core: For pre-ProtocolEngine API versions,
|
|
74
|
+
use a simulating protocol core that will skip _most_ calls
|
|
75
|
+
to the `hardware_api`.
|
|
76
|
+
extra_labware: Extra labware definitions to include in
|
|
77
|
+
labware definition lookup paths.
|
|
78
|
+
bundled_labware: Do not use in new code. Leftover from
|
|
79
|
+
experimental ZIP protocol bundles.
|
|
80
|
+
bundled_data: Do not use in new code. Leftover from
|
|
81
|
+
experimental ZIP protocol bundles.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
A ready-to-use ProtocolContext.
|
|
85
|
+
"""
|
|
86
|
+
if api_version > MAX_SUPPORTED_VERSION:
|
|
87
|
+
raise ValueError(
|
|
88
|
+
f"API version {api_version} is not supported by this robot software."
|
|
89
|
+
f" Please reduce your API version to {MAX_SUPPORTED_VERSION} or below"
|
|
90
|
+
f" or update your robot."
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
sync_hardware: SynchronousAdapter[HardwareControlAPI]
|
|
94
|
+
labware_offset_provider: AbstractLabwareOffsetProvider
|
|
95
|
+
core: Union[ProtocolCore, LegacyProtocolCoreSimulator, LegacyProtocolCore]
|
|
96
|
+
|
|
97
|
+
if isinstance(hardware_api, ThreadManager):
|
|
98
|
+
sync_hardware = hardware_api.sync
|
|
99
|
+
else:
|
|
100
|
+
sync_hardware = SynchronousAdapter(hardware_api)
|
|
101
|
+
|
|
102
|
+
if protocol_engine is not None:
|
|
103
|
+
assert deck_type == protocol_engine.state_view.config.deck_type.value
|
|
104
|
+
labware_offset_provider = LabwareOffsetProvider(engine=protocol_engine)
|
|
105
|
+
else:
|
|
106
|
+
labware_offset_provider = NullLabwareOffsetProvider()
|
|
107
|
+
|
|
108
|
+
if api_version >= ENGINE_CORE_API_VERSION:
|
|
109
|
+
# TODO(mc, 2022-8-22): replace raise with strict typing
|
|
110
|
+
if protocol_engine is None or protocol_engine_loop is None:
|
|
111
|
+
raise ProtocolEngineCoreRequiredError(
|
|
112
|
+
"ProtocolEngine PAPI core is enabled, but no ProtocolEngine given."
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
engine_client_transport = ChildThreadTransport(
|
|
116
|
+
engine=protocol_engine, loop=protocol_engine_loop
|
|
117
|
+
)
|
|
118
|
+
engine_client = SyncClient(transport=engine_client_transport)
|
|
119
|
+
core = ProtocolCore(
|
|
120
|
+
engine_client=engine_client,
|
|
121
|
+
api_version=api_version,
|
|
122
|
+
sync_hardware=sync_hardware,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
elif use_simulating_core:
|
|
126
|
+
legacy_deck = LegacyDeck(deck_type=deck_type)
|
|
127
|
+
core = LegacyProtocolCoreSimulator(
|
|
128
|
+
sync_hardware=sync_hardware,
|
|
129
|
+
labware_offset_provider=labware_offset_provider,
|
|
130
|
+
deck_layout=legacy_deck,
|
|
131
|
+
equipment_broker=equipment_broker,
|
|
132
|
+
api_version=api_version,
|
|
133
|
+
bundled_labware=bundled_labware,
|
|
134
|
+
extra_labware=extra_labware,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
else:
|
|
138
|
+
legacy_deck = LegacyDeck(deck_type=deck_type)
|
|
139
|
+
core = LegacyProtocolCore(
|
|
140
|
+
sync_hardware=sync_hardware,
|
|
141
|
+
labware_offset_provider=labware_offset_provider,
|
|
142
|
+
deck_layout=legacy_deck,
|
|
143
|
+
equipment_broker=equipment_broker,
|
|
144
|
+
api_version=api_version,
|
|
145
|
+
bundled_labware=bundled_labware,
|
|
146
|
+
extra_labware=extra_labware,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# TODO(mc, 2022-12-06): add API version guard in addition to instance check
|
|
150
|
+
# this swap may happen once `ctx.move_labware` off-deck is implemented
|
|
151
|
+
deck = None if isinstance(core, ProtocolCore) else cast(Deck, core.get_deck())
|
|
152
|
+
|
|
153
|
+
context = ProtocolContext(
|
|
154
|
+
api_version=api_version,
|
|
155
|
+
# TODO(mm, 2023-05-11): This cast shouldn't be necessary.
|
|
156
|
+
# Fix this by making the appropriate TypeVars covariant?
|
|
157
|
+
# https://peps.python.org/pep-0484/#covariance-and-contravariance
|
|
158
|
+
core=cast(AbstractProtocolCore, core),
|
|
159
|
+
broker=broker,
|
|
160
|
+
deck=deck,
|
|
161
|
+
bundled_data=bundled_data,
|
|
162
|
+
)
|
|
163
|
+
# If we're loading an engine based core into the context, and we're on api level 2.16 or above, on an OT-2 we need
|
|
164
|
+
# to insert a fixed trash addressable area into the protocol engine, for correctness in anything that relies on
|
|
165
|
+
# knowing what addressable areas have been loaded (and any checks involving trash geometry). Because the method
|
|
166
|
+
# that uses this in the core relies on the sync client and this code will run in the main thread (which if called
|
|
167
|
+
# will cause a deadlock), we're directly calling the protocol engine method here where we have access to it.
|
|
168
|
+
if (
|
|
169
|
+
protocol_engine is not None
|
|
170
|
+
and should_load_fixed_trash_area_for_python_protocol(
|
|
171
|
+
api_version=api_version,
|
|
172
|
+
robot_type=protocol_engine.state_view.config.robot_type,
|
|
173
|
+
)
|
|
174
|
+
):
|
|
175
|
+
assert isinstance(context.fixed_trash, TrashBin)
|
|
176
|
+
protocol_engine.add_addressable_area(context.fixed_trash.area_name)
|
|
177
|
+
return context
|