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,31 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from .types import PauseType
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class PauseManager:
|
|
7
|
+
"""This class determines whether or not the hardware controller should
|
|
8
|
+
pause or resume by evaluating the pause and resume types. The use of two
|
|
9
|
+
pause types are used to separate the delay resume (triggered when the delay
|
|
10
|
+
timer runs out) and the pause resume (trigged by user via the app).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self) -> None:
|
|
14
|
+
self.queue: List[PauseType] = []
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def should_pause(self) -> bool:
|
|
18
|
+
return bool(self.queue)
|
|
19
|
+
|
|
20
|
+
def resume(self, pause_type: PauseType) -> None:
|
|
21
|
+
try:
|
|
22
|
+
self.queue.remove(pause_type)
|
|
23
|
+
except ValueError:
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
def pause(self, pause_type: PauseType) -> None:
|
|
27
|
+
if pause_type not in self.queue:
|
|
28
|
+
self.queue.append(pause_type)
|
|
29
|
+
|
|
30
|
+
def reset(self) -> None:
|
|
31
|
+
self.queue = []
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import contextlib
|
|
3
|
+
import logging
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from typing import AsyncGenerator, List, Optional
|
|
6
|
+
from opentrons.hardware_control.modules.errors import AbsorbanceReaderDisconnectedError
|
|
7
|
+
from opentrons_shared_data.errors.exceptions import ModuleCommunicationError
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
log = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Reader(ABC):
|
|
14
|
+
@abstractmethod
|
|
15
|
+
async def read(self) -> None:
|
|
16
|
+
"""Read some data from an external source."""
|
|
17
|
+
|
|
18
|
+
def on_error(self, exception: Exception) -> None:
|
|
19
|
+
"""Handle an error from calling `read`."""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Poller:
|
|
23
|
+
"""A poller to call a given reader on an interval.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
reader: An interface to read data.
|
|
27
|
+
interval: The poll interval, in seconds.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
interval: float
|
|
31
|
+
|
|
32
|
+
def __init__(self, reader: Reader, interval: float) -> None:
|
|
33
|
+
self.interval = interval
|
|
34
|
+
self._reader = reader
|
|
35
|
+
self._read_lock: Optional["asyncio.Lock"] = None
|
|
36
|
+
self._poll_waiters: List["asyncio.Future[None]"] = []
|
|
37
|
+
self._poll_forever_task: Optional["asyncio.Task[None]"] = None
|
|
38
|
+
|
|
39
|
+
async def start(self) -> None:
|
|
40
|
+
if self._poll_forever_task is None:
|
|
41
|
+
self._poll_forever_task = asyncio.create_task(self._poll_forever())
|
|
42
|
+
await self.wait_next_poll()
|
|
43
|
+
|
|
44
|
+
async def stop(self) -> None:
|
|
45
|
+
"""Stop polling."""
|
|
46
|
+
task = self._poll_forever_task
|
|
47
|
+
if task is not None:
|
|
48
|
+
async with self._use_read_lock():
|
|
49
|
+
task.cancel()
|
|
50
|
+
await asyncio.gather(task, return_exceptions=True)
|
|
51
|
+
for waiter in self._poll_waiters:
|
|
52
|
+
waiter.cancel(msg="Module was removed")
|
|
53
|
+
self._poll_forever_task = None
|
|
54
|
+
|
|
55
|
+
async def wait_next_poll(self) -> None:
|
|
56
|
+
"""Wait for the next poll to complete.
|
|
57
|
+
|
|
58
|
+
If called in the middle of a read, it will not return until
|
|
59
|
+
the next complete read. If a read raises an exception,
|
|
60
|
+
it will be passed through to `wait_next_poll`.
|
|
61
|
+
"""
|
|
62
|
+
if not self._poll_forever_task or self._poll_forever_task.done():
|
|
63
|
+
raise ModuleCommunicationError(message="Module was removed")
|
|
64
|
+
|
|
65
|
+
poll_future = asyncio.get_running_loop().create_future()
|
|
66
|
+
self._poll_waiters.append(poll_future)
|
|
67
|
+
await poll_future
|
|
68
|
+
|
|
69
|
+
@contextlib.asynccontextmanager
|
|
70
|
+
async def _use_read_lock(self) -> AsyncGenerator[None, None]:
|
|
71
|
+
self._read_lock = self._read_lock or asyncio.Lock()
|
|
72
|
+
|
|
73
|
+
async with self._read_lock:
|
|
74
|
+
yield
|
|
75
|
+
|
|
76
|
+
async def _poll_forever(self) -> None:
|
|
77
|
+
"""Polling loop."""
|
|
78
|
+
while True:
|
|
79
|
+
await self._poll_once()
|
|
80
|
+
await asyncio.sleep(self.interval)
|
|
81
|
+
|
|
82
|
+
@staticmethod
|
|
83
|
+
def _set_waiter_complete(
|
|
84
|
+
waiter: "asyncio.Future[None]", e: Optional[Exception] = None
|
|
85
|
+
) -> None:
|
|
86
|
+
try:
|
|
87
|
+
waiter.set_result(None) if e is None else waiter.set_exception(e)
|
|
88
|
+
except asyncio.InvalidStateError:
|
|
89
|
+
log.warning("Poller waiter was already cancelled")
|
|
90
|
+
|
|
91
|
+
async def _poll_once(self) -> None:
|
|
92
|
+
"""Trigger a single read, notifying listeners of success or error."""
|
|
93
|
+
previous_waiters = self._poll_waiters
|
|
94
|
+
self._poll_waiters = []
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
async with self._use_read_lock():
|
|
98
|
+
await self._reader.read()
|
|
99
|
+
except asyncio.CancelledError:
|
|
100
|
+
raise
|
|
101
|
+
except AbsorbanceReaderDisconnectedError as e:
|
|
102
|
+
for waiter in previous_waiters:
|
|
103
|
+
Poller._set_waiter_complete(waiter, None)
|
|
104
|
+
self._reader.on_error(e)
|
|
105
|
+
except Exception as e:
|
|
106
|
+
log.exception("Polling exception")
|
|
107
|
+
self._reader.on_error(e)
|
|
108
|
+
for waiter in previous_waiters:
|
|
109
|
+
Poller._set_waiter_complete(waiter, e)
|
|
110
|
+
else:
|
|
111
|
+
for waiter in previous_waiters:
|
|
112
|
+
Poller._set_waiter_complete(waiter)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Typing protocols describing a hardware controller."""
|
|
2
|
+
from typing_extensions import Protocol, Type
|
|
3
|
+
|
|
4
|
+
from .module_provider import ModuleProvider
|
|
5
|
+
from .hardware_manager import HardwareManager
|
|
6
|
+
from .chassis_accessory_manager import ChassisAccessoryManager
|
|
7
|
+
from .event_sourcer import EventSourcer
|
|
8
|
+
from .liquid_handler import LiquidHandler
|
|
9
|
+
from .calibratable import Calibratable
|
|
10
|
+
from .configurable import Configurable
|
|
11
|
+
from .motion_controller import MotionController
|
|
12
|
+
from .instrument_configurer import InstrumentConfigurer
|
|
13
|
+
from .execution_controllable import ExecutionControllable
|
|
14
|
+
from .asyncio_configurable import AsyncioConfigurable
|
|
15
|
+
from .stoppable import Stoppable
|
|
16
|
+
from .simulatable import Simulatable
|
|
17
|
+
from .identifiable import Identifiable
|
|
18
|
+
from .gripper_controller import GripperController
|
|
19
|
+
from .flex_calibratable import FlexCalibratable
|
|
20
|
+
from .flex_instrument_configurer import FlexInstrumentConfigurer
|
|
21
|
+
from .position_estimator import PositionEstimator
|
|
22
|
+
|
|
23
|
+
from .types import (
|
|
24
|
+
CalibrationType,
|
|
25
|
+
MountArgType,
|
|
26
|
+
ConfigType,
|
|
27
|
+
OT2RobotType,
|
|
28
|
+
FlexRobotType,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class HardwareControlInterface(
|
|
33
|
+
ModuleProvider,
|
|
34
|
+
ExecutionControllable,
|
|
35
|
+
LiquidHandler[CalibrationType, MountArgType, ConfigType],
|
|
36
|
+
ChassisAccessoryManager,
|
|
37
|
+
HardwareManager,
|
|
38
|
+
AsyncioConfigurable,
|
|
39
|
+
Stoppable,
|
|
40
|
+
Simulatable,
|
|
41
|
+
Identifiable[Type[OT2RobotType]],
|
|
42
|
+
Protocol[CalibrationType, MountArgType, ConfigType],
|
|
43
|
+
):
|
|
44
|
+
"""A mypy protocol for a hardware controller.
|
|
45
|
+
|
|
46
|
+
This class provides an protocol for the basic hardware controller class,
|
|
47
|
+
with at least two implementations: one for the OT-2, and one for the
|
|
48
|
+
OT-3. While the two classes have the same API, fundamental architectural
|
|
49
|
+
decisions in the OT-2 hardware controller (specifically the data types used
|
|
50
|
+
in the HardwareControl/backend split) make it unsuitable for the OT-3.
|
|
51
|
+
|
|
52
|
+
This is a protocol rather than an ABC because of the use of wrapping adapters
|
|
53
|
+
such as ThreadManager and SynchAdapter. Because those classes work via
|
|
54
|
+
getattr, they can't inherit from an ABC that requires specific methods;
|
|
55
|
+
however, they can satisfy protocols.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def get_robot_type(self) -> Type[OT2RobotType]:
|
|
59
|
+
return OT2RobotType
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class FlexHardwareControlInterface(
|
|
63
|
+
PositionEstimator,
|
|
64
|
+
ModuleProvider,
|
|
65
|
+
ExecutionControllable,
|
|
66
|
+
LiquidHandler[CalibrationType, MountArgType, ConfigType],
|
|
67
|
+
ChassisAccessoryManager,
|
|
68
|
+
HardwareManager,
|
|
69
|
+
AsyncioConfigurable,
|
|
70
|
+
Stoppable,
|
|
71
|
+
Simulatable,
|
|
72
|
+
GripperController,
|
|
73
|
+
FlexCalibratable,
|
|
74
|
+
FlexInstrumentConfigurer[MountArgType],
|
|
75
|
+
Identifiable[Type[FlexRobotType]],
|
|
76
|
+
Protocol[CalibrationType, MountArgType, ConfigType],
|
|
77
|
+
):
|
|
78
|
+
"""A mypy protocol for a hardware controller with Flex-specific extensions.
|
|
79
|
+
|
|
80
|
+
The interface for the Flex controller is mostly in-line with the OT-2 interface,
|
|
81
|
+
with some additional functionality and parameterization not supported on the OT-2.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
def get_robot_type(self) -> Type[FlexRobotType]:
|
|
85
|
+
return FlexRobotType
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
__all__ = [
|
|
89
|
+
"HardwareControlInterface",
|
|
90
|
+
"FlexHardwareControlInterface",
|
|
91
|
+
"Simulatable",
|
|
92
|
+
"Stoppable",
|
|
93
|
+
"AsyncioConfigurable",
|
|
94
|
+
"ExecutionControllable",
|
|
95
|
+
"InstrumentConfigurer",
|
|
96
|
+
"MotionController",
|
|
97
|
+
"Configurable",
|
|
98
|
+
"Calibratable",
|
|
99
|
+
"LiquidHandler",
|
|
100
|
+
"EventSourcer",
|
|
101
|
+
"ChassisAccessoryManager",
|
|
102
|
+
"HardwareManager",
|
|
103
|
+
"ModuleProvider",
|
|
104
|
+
"Identifiable",
|
|
105
|
+
"FlexCalibratable",
|
|
106
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from asyncio import AbstractEventLoop
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class AsyncioConfigurable(Protocol):
|
|
6
|
+
"""Protocol specifying controllability of asyncio behavior"""
|
|
7
|
+
|
|
8
|
+
@property
|
|
9
|
+
def loop(self) -> AbstractEventLoop:
|
|
10
|
+
"""The event loop used by this instance."""
|
|
11
|
+
...
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from typing_extensions import Protocol
|
|
2
|
+
from .types import CalibrationType
|
|
3
|
+
|
|
4
|
+
from ..util import DeckTransformState
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Calibratable(Protocol[CalibrationType]):
|
|
8
|
+
"""Protocol specifying calibration information"""
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
def robot_calibration(self) -> CalibrationType:
|
|
12
|
+
"""The currently-active robot calibration of the machine."""
|
|
13
|
+
...
|
|
14
|
+
|
|
15
|
+
def reset_robot_calibration(self) -> None:
|
|
16
|
+
"""Reset the active robot calibration to the machine default.
|
|
17
|
+
|
|
18
|
+
This may be an identity on some machines but not on others; this
|
|
19
|
+
method is therefore preferred to using set_robot_calibration() with a
|
|
20
|
+
caller-constructed identity.
|
|
21
|
+
"""
|
|
22
|
+
...
|
|
23
|
+
|
|
24
|
+
def reset_deck_calibration(self) -> None:
|
|
25
|
+
"""Resets only deck calibration data."""
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
def load_deck_calibration(self) -> None:
|
|
29
|
+
"""Loads only any deck calibration data that is stored."""
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
def set_robot_calibration(self, robot_calibration: CalibrationType) -> None:
|
|
33
|
+
"""Set the current robot calibration from stored data."""
|
|
34
|
+
...
|
|
35
|
+
|
|
36
|
+
def validate_calibration(self) -> DeckTransformState:
|
|
37
|
+
"""Check whether the current calibration is valid."""
|
|
38
|
+
...
|
|
39
|
+
|
|
40
|
+
def build_temporary_identity_calibration(self) -> CalibrationType:
|
|
41
|
+
"""
|
|
42
|
+
Get temporary default calibration data suitable for use during
|
|
43
|
+
calibration
|
|
44
|
+
"""
|
|
45
|
+
...
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
from typing import Dict, Optional
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
from ..types import (
|
|
4
|
+
DoorState,
|
|
5
|
+
StatusBarState,
|
|
6
|
+
EstopState,
|
|
7
|
+
StatusBarUpdateListener,
|
|
8
|
+
StatusBarUpdateUnsubscriber,
|
|
9
|
+
)
|
|
10
|
+
from .event_sourcer import EventSourcer
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ChassisAccessoryManager(EventSourcer, Protocol):
|
|
14
|
+
"""Protocol specifying control of non-motion peripherals on the robot."""
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def door_state(self) -> DoorState:
|
|
18
|
+
"""The current state of the machine's door."""
|
|
19
|
+
...
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def module_door_serial(self) -> str | None:
|
|
23
|
+
"""The serial number of a module with an open door."""
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
async def set_lights(
|
|
27
|
+
self,
|
|
28
|
+
button: Optional[bool] = None,
|
|
29
|
+
rails: Optional[bool] = None,
|
|
30
|
+
) -> None:
|
|
31
|
+
"""Control the robot lights.
|
|
32
|
+
|
|
33
|
+
button If specified, turn the button light on (`True`) or
|
|
34
|
+
off (`False`). If not specified, do not change the
|
|
35
|
+
button light.
|
|
36
|
+
rails: If specified, turn the rail lights on (`True`) or
|
|
37
|
+
off (`False`). If not specified, do not change the
|
|
38
|
+
rail lights.
|
|
39
|
+
"""
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
async def get_lights(self) -> Dict[str, bool]:
|
|
43
|
+
"""Return the current status of the robot lights.
|
|
44
|
+
|
|
45
|
+
:returns: A dict of the lights: `{'button': bool, 'rails': bool}`
|
|
46
|
+
"""
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
async def identify(self, duration_s: int = 5) -> None:
|
|
50
|
+
"""Run a routine to identify the robot.
|
|
51
|
+
|
|
52
|
+
duration_s: The duration to blink for, in seconds.
|
|
53
|
+
"""
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
async def set_status_bar_state(self, state: StatusBarState) -> None:
|
|
57
|
+
"""Control the status bar to indicate robot state.
|
|
58
|
+
|
|
59
|
+
state: The state to set the robot to. Some states are transient
|
|
60
|
+
and will implicitly revert back to the previous state after a short
|
|
61
|
+
action, while others"""
|
|
62
|
+
...
|
|
63
|
+
|
|
64
|
+
async def set_status_bar_enabled(self, enabled: bool) -> None:
|
|
65
|
+
"""Enable or disable the status bar entirely.
|
|
66
|
+
|
|
67
|
+
enabled: True to turn the status bar on, false to turn it off."""
|
|
68
|
+
|
|
69
|
+
def get_status_bar_state(self) -> StatusBarState:
|
|
70
|
+
"""Get the current status bar state.
|
|
71
|
+
|
|
72
|
+
:returns: The current status bar state enumeration."""
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
def add_status_bar_listener(
|
|
76
|
+
self, listener: StatusBarUpdateListener
|
|
77
|
+
) -> StatusBarUpdateUnsubscriber:
|
|
78
|
+
"""Add a listener to the status bar state.
|
|
79
|
+
|
|
80
|
+
listener: The listener to add.
|
|
81
|
+
:returns: A callback function that removes the listener."""
|
|
82
|
+
...
|
|
83
|
+
|
|
84
|
+
def get_estop_state(self) -> EstopState:
|
|
85
|
+
"""Get the current Estop state.
|
|
86
|
+
|
|
87
|
+
If the Estop is not supported on this robot, this will always return Disengaged.
|
|
88
|
+
|
|
89
|
+
:returns: The current Estop state."""
|
|
90
|
+
...
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from typing import Dict, Any
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from .types import ConfigType
|
|
5
|
+
from opentrons.hardware_control.types import HardwareFeatureFlags
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Configurable(Protocol[ConfigType]):
|
|
9
|
+
"""Protocol specifying hardware control configuration."""
|
|
10
|
+
|
|
11
|
+
def get_config(self) -> ConfigType:
|
|
12
|
+
"""Get the robot's configuration object.
|
|
13
|
+
|
|
14
|
+
:returns .RobotConfig: The object.
|
|
15
|
+
"""
|
|
16
|
+
...
|
|
17
|
+
|
|
18
|
+
def set_config(self, config: ConfigType) -> None:
|
|
19
|
+
"""Replace the currently-loaded config"""
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def hardware_feature_flags(self) -> HardwareFeatureFlags:
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@hardware_feature_flags.setter
|
|
27
|
+
def hardware_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None:
|
|
28
|
+
"""Replace the currently-configured hardware feature flags."""
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def config(self) -> ConfigType:
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
@config.setter
|
|
36
|
+
def config(self, config: ConfigType) -> None:
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
async def update_config(self, **kwargs: Dict[str, Any]) -> None:
|
|
40
|
+
"""Update values of the robot's configuration.
|
|
41
|
+
|
|
42
|
+
`kwargs` should contain keys of the robot's configuration. For
|
|
43
|
+
instance, `update_config(log_level='debug)` would change the API
|
|
44
|
+
server log level to logging.DEBUG.
|
|
45
|
+
|
|
46
|
+
Documentation on keys can be found in the documentation for RobotConfig.
|
|
47
|
+
"""
|
|
48
|
+
...
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Callable
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from ..types import HardwareEventHandler
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class EventSourcer(Protocol):
|
|
8
|
+
"""Protocol specifying how to react to events."""
|
|
9
|
+
|
|
10
|
+
def register_callback(self, cb: HardwareEventHandler) -> Callable[[], None]:
|
|
11
|
+
"""Register a callback that will be called when an event occurs.
|
|
12
|
+
|
|
13
|
+
The events may be asynchronous, from various things that can happen
|
|
14
|
+
to the hardware (for instance, the door opening or closing).
|
|
15
|
+
|
|
16
|
+
The returned callable removes the callback.
|
|
17
|
+
"""
|
|
18
|
+
...
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from typing_extensions import Protocol
|
|
2
|
+
from ..types import PauseType
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ExecutionControllable(Protocol):
|
|
6
|
+
"""A protocol specifying run control (pause, resume)."""
|
|
7
|
+
|
|
8
|
+
def pause(self, pause_type: PauseType) -> None:
|
|
9
|
+
"""
|
|
10
|
+
Pause motion of the robot after a current motion concludes.
|
|
11
|
+
|
|
12
|
+
Individual calls to move
|
|
13
|
+
(which aspirate and dispense and other calls may depend on) are
|
|
14
|
+
considered atomic and will always complete if they have been called
|
|
15
|
+
prior to a call to this method. However, subsequent calls to move that
|
|
16
|
+
occur when the system is paused will not proceed until the system is
|
|
17
|
+
resumed with resume.
|
|
18
|
+
"""
|
|
19
|
+
...
|
|
20
|
+
|
|
21
|
+
def pause_with_message(self, message: str) -> None:
|
|
22
|
+
"""Pause motion of the robot as with pause, but specify a message."""
|
|
23
|
+
...
|
|
24
|
+
|
|
25
|
+
def resume(self, pause_type: PauseType) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Resume motion after a call to pause.
|
|
28
|
+
"""
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
async def delay(self, duration_s: float) -> None:
|
|
32
|
+
"""Delay execution by pausing and sleeping."""
|
|
33
|
+
...
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from typing import Optional, Tuple, List, AsyncIterator, Union
|
|
2
|
+
import contextlib
|
|
3
|
+
from typing_extensions import Protocol
|
|
4
|
+
|
|
5
|
+
from opentrons import types as top_types
|
|
6
|
+
from opentrons.config.types import (
|
|
7
|
+
CapacitivePassSettings,
|
|
8
|
+
)
|
|
9
|
+
from opentrons.hardware_control.types import (
|
|
10
|
+
Axis,
|
|
11
|
+
OT3Mount,
|
|
12
|
+
InstrumentProbeType,
|
|
13
|
+
GripperProbe,
|
|
14
|
+
)
|
|
15
|
+
from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
|
|
16
|
+
GripperCalibrationOffset,
|
|
17
|
+
PipetteOffsetSummary,
|
|
18
|
+
)
|
|
19
|
+
from opentrons.hardware_control.modules.module_calibration import (
|
|
20
|
+
ModuleCalibrationOffset,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class FlexCalibratable(Protocol):
|
|
25
|
+
"""Calibration extensions for Flex hardware."""
|
|
26
|
+
|
|
27
|
+
async def capacitive_probe(
|
|
28
|
+
self,
|
|
29
|
+
mount: OT3Mount,
|
|
30
|
+
moving_axis: Axis,
|
|
31
|
+
target_pos: float,
|
|
32
|
+
pass_settings: CapacitivePassSettings,
|
|
33
|
+
retract_after: bool = True,
|
|
34
|
+
probe: Optional[InstrumentProbeType] = None,
|
|
35
|
+
) -> Tuple[float, bool]:
|
|
36
|
+
"""Determine the position of something using the capacitive sensor.
|
|
37
|
+
|
|
38
|
+
This function orchestrates detecting the position of a collision between the
|
|
39
|
+
capacitive probe on the tool on the specified mount, and some fixed element
|
|
40
|
+
of the robot.
|
|
41
|
+
|
|
42
|
+
When calling this function, the mount's probe critical point should already
|
|
43
|
+
be aligned in the probe axis with the item to be probed.
|
|
44
|
+
|
|
45
|
+
It will move the mount's probe critical point to a small distance behind
|
|
46
|
+
the expected position of the element (which is target_pos, in deck coordinates,
|
|
47
|
+
in the axis to be probed) while running the tool's capacitive sensor. When the
|
|
48
|
+
sensor senses contact, the mount stops.
|
|
49
|
+
|
|
50
|
+
This function moves away and returns the sensed position.
|
|
51
|
+
|
|
52
|
+
This sensed position can be used in several ways, including
|
|
53
|
+
- To get an absolute position in deck coordinates of whatever was
|
|
54
|
+
targeted, if something was guaranteed to be physically present.
|
|
55
|
+
- To detect whether a collision occured at all. If this function
|
|
56
|
+
returns a value far enough past the anticipated position, then it indicates
|
|
57
|
+
there was no material there.
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
async def capacitive_sweep(
|
|
62
|
+
self,
|
|
63
|
+
mount: OT3Mount,
|
|
64
|
+
moving_axis: Axis,
|
|
65
|
+
begin: top_types.Point,
|
|
66
|
+
end: top_types.Point,
|
|
67
|
+
speed_mm_s: float,
|
|
68
|
+
) -> List[float]:
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
# Note that there is a default implementation of this function to allow for
|
|
72
|
+
# the asynccontextmanager decorator to propagate properly.
|
|
73
|
+
@contextlib.asynccontextmanager
|
|
74
|
+
async def restore_system_constrants(self) -> AsyncIterator[None]:
|
|
75
|
+
yield
|
|
76
|
+
|
|
77
|
+
async def reset_instrument_offset(
|
|
78
|
+
self, mount: Union[top_types.Mount, OT3Mount], to_default: bool = True
|
|
79
|
+
) -> None:
|
|
80
|
+
...
|
|
81
|
+
|
|
82
|
+
def add_gripper_probe(self, probe: GripperProbe) -> None:
|
|
83
|
+
...
|
|
84
|
+
|
|
85
|
+
def remove_gripper_probe(self) -> None:
|
|
86
|
+
...
|
|
87
|
+
|
|
88
|
+
async def save_instrument_offset(
|
|
89
|
+
self, mount: Union[top_types.Mount, OT3Mount], delta: top_types.Point
|
|
90
|
+
) -> Union[GripperCalibrationOffset, PipetteOffsetSummary]:
|
|
91
|
+
...
|
|
92
|
+
|
|
93
|
+
async def save_module_offset(
|
|
94
|
+
self, module_id: str, mount: OT3Mount, slot: str, offset: top_types.Point
|
|
95
|
+
) -> Optional[ModuleCalibrationOffset]:
|
|
96
|
+
...
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Flex-specific extensions to instrument configuration."""
|
|
2
|
+
from typing import Union, Optional
|
|
3
|
+
from typing_extensions import Protocol
|
|
4
|
+
|
|
5
|
+
from .types import MountArgType
|
|
6
|
+
|
|
7
|
+
from opentrons.hardware_control.dev_types import (
|
|
8
|
+
PipetteStateDict,
|
|
9
|
+
)
|
|
10
|
+
from opentrons.hardware_control.types import (
|
|
11
|
+
TipStateType,
|
|
12
|
+
InstrumentProbeType,
|
|
13
|
+
)
|
|
14
|
+
from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
|
|
15
|
+
PipetteOffsetSummary,
|
|
16
|
+
GripperCalibrationOffset,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class FlexInstrumentConfigurer(Protocol[MountArgType]):
|
|
21
|
+
"""A protocol specifying Flex-specific extensions to instrument configuration."""
|
|
22
|
+
|
|
23
|
+
async def get_instrument_state(
|
|
24
|
+
self,
|
|
25
|
+
mount: MountArgType,
|
|
26
|
+
) -> PipetteStateDict:
|
|
27
|
+
...
|
|
28
|
+
|
|
29
|
+
def get_instrument_offset(
|
|
30
|
+
self, mount: MountArgType
|
|
31
|
+
) -> Union[GripperCalibrationOffset, PipetteOffsetSummary, None]:
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
async def get_tip_presence_status(
|
|
35
|
+
self,
|
|
36
|
+
mount: MountArgType,
|
|
37
|
+
) -> TipStateType:
|
|
38
|
+
"""Check tip presence status.
|
|
39
|
+
|
|
40
|
+
If a high throughput pipette is present,
|
|
41
|
+
move the tip motors down before checking the sensor status.
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
async def verify_tip_presence(
|
|
46
|
+
self,
|
|
47
|
+
mount: MountArgType,
|
|
48
|
+
expected: TipStateType,
|
|
49
|
+
follow_singular_sensor: Optional[InstrumentProbeType] = None,
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Check tip presence status and raise if it does not match `expected`."""
|
|
52
|
+
...
|