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,792 @@
|
|
|
1
|
+
from asyncio import Queue
|
|
2
|
+
import enum
|
|
3
|
+
import logging
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import cast, Tuple, Union, List, Callable, Dict, TypeVar, Type
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
from opentrons import types as top_types
|
|
8
|
+
from opentrons_shared_data.pipette.types import PipetteChannelType
|
|
9
|
+
from opentrons.config import feature_flags
|
|
10
|
+
|
|
11
|
+
MODULE_LOG = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MotionChecks(enum.Enum):
|
|
15
|
+
NONE = 0
|
|
16
|
+
LOW = 1
|
|
17
|
+
HIGH = 2
|
|
18
|
+
BOTH = 3
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class OT3Mount(enum.Enum):
|
|
22
|
+
LEFT = top_types.Mount.LEFT.value
|
|
23
|
+
RIGHT = top_types.Mount.RIGHT.value
|
|
24
|
+
GRIPPER = enum.auto()
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def from_mount(
|
|
28
|
+
cls,
|
|
29
|
+
mount: Union[
|
|
30
|
+
top_types.Mount, top_types.MountType, top_types.OT3MountType, "OT3Mount"
|
|
31
|
+
],
|
|
32
|
+
) -> "OT3Mount":
|
|
33
|
+
if mount == top_types.Mount.EXTENSION or mount == top_types.MountType.EXTENSION:
|
|
34
|
+
return OT3Mount.GRIPPER
|
|
35
|
+
return cls[mount.name]
|
|
36
|
+
|
|
37
|
+
def to_mount(self) -> top_types.Mount:
|
|
38
|
+
if self.value == self.GRIPPER.value:
|
|
39
|
+
return top_types.Mount.EXTENSION
|
|
40
|
+
return top_types.Mount[self.name]
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def pipette_mounts(cls) -> List["Literal[OT3Mount.LEFT, OT3Mount.RIGHT]"]:
|
|
44
|
+
return [cls.LEFT, cls.RIGHT]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class OT3AxisKind(enum.Enum):
|
|
48
|
+
"""An enum of the different kinds of axis we have.
|
|
49
|
+
|
|
50
|
+
The machine may have different numbers of specific axes implementing
|
|
51
|
+
each axis kind.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
X = 0
|
|
55
|
+
#: Gantry X axis
|
|
56
|
+
Y = 1
|
|
57
|
+
#: Gantry Y axis
|
|
58
|
+
Z = 2
|
|
59
|
+
#: Z axis (of the left and right)
|
|
60
|
+
P = 3
|
|
61
|
+
#: Plunger axis (of the left and right pipettes)
|
|
62
|
+
Z_G = 4
|
|
63
|
+
#: Gripper Z axis
|
|
64
|
+
Q = 6
|
|
65
|
+
#: High-throughput tip grabbing axis
|
|
66
|
+
OTHER = 6
|
|
67
|
+
#: The internal axes of high throughput pipettes, for instance
|
|
68
|
+
|
|
69
|
+
def __str__(self) -> str:
|
|
70
|
+
return self.name
|
|
71
|
+
|
|
72
|
+
def is_z_axis(self) -> bool:
|
|
73
|
+
return self in [OT3AxisKind.Z, OT3AxisKind.Z_G]
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class Axis(enum.Enum):
|
|
77
|
+
X = 0 # gantry
|
|
78
|
+
Y = 1
|
|
79
|
+
Z_L = 2 # left pipette mount Z
|
|
80
|
+
Z_R = 3 # right pipette mount Z
|
|
81
|
+
Z_G = 4 # gripper mount Z
|
|
82
|
+
P_L = 5 # left pipette plunger
|
|
83
|
+
P_R = 6 # right pipette plunger
|
|
84
|
+
Q = 7 # hi-throughput pipette tiprack grab
|
|
85
|
+
G = 8 # gripper grab
|
|
86
|
+
|
|
87
|
+
# OT2 axes' aliases:
|
|
88
|
+
Z = Z_L # left pipette mount Z
|
|
89
|
+
A = Z_R # right pipette mount Z
|
|
90
|
+
B = P_L # left pipette plunger
|
|
91
|
+
C = P_R # right pipette plunger
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def by_mount(cls, mount: Union[top_types.Mount, OT3Mount]) -> "Axis":
|
|
95
|
+
bm = {
|
|
96
|
+
top_types.Mount.LEFT: cls.Z_L,
|
|
97
|
+
top_types.Mount.RIGHT: cls.Z_R,
|
|
98
|
+
top_types.Mount.EXTENSION: cls.Z_G,
|
|
99
|
+
OT3Mount.LEFT: cls.Z_L,
|
|
100
|
+
OT3Mount.RIGHT: cls.Z_R,
|
|
101
|
+
OT3Mount.GRIPPER: cls.Z_G,
|
|
102
|
+
}
|
|
103
|
+
return bm[mount]
|
|
104
|
+
|
|
105
|
+
@classmethod
|
|
106
|
+
def pipette_axes(cls) -> Tuple["Axis", "Axis"]:
|
|
107
|
+
"""The axes which are used for moving plunger motors."""
|
|
108
|
+
return cls.P_L, cls.P_R
|
|
109
|
+
|
|
110
|
+
@classmethod
|
|
111
|
+
def mount_axes(cls) -> None:
|
|
112
|
+
"""The axes which are used for moving instruments up and down."""
|
|
113
|
+
raise NotImplementedError(
|
|
114
|
+
"`Axis.mount_axes` has been removed. Use `Axis.ot2_mount_axes` or "
|
|
115
|
+
"`Axis.ot3_mount_axes` instead."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
@classmethod
|
|
119
|
+
def ot2_mount_axes(cls) -> Tuple["Axis", "Axis"]:
|
|
120
|
+
"""The OT2 axes which are used for moving instruments up and down."""
|
|
121
|
+
# TODO (spp, 2023-07-14): make this a separate function outside of Axis
|
|
122
|
+
# Does this need to be Z_R, Z_L ?
|
|
123
|
+
return cls.Z_L, cls.Z_R
|
|
124
|
+
|
|
125
|
+
@classmethod
|
|
126
|
+
def ot3_mount_axes(cls) -> Tuple["Axis", "Axis", "Axis"]:
|
|
127
|
+
"""The OT3 axes which are used for moving instruments up and down."""
|
|
128
|
+
# TODO (spp, 2023-07-14): make this a separate function outside of Axis
|
|
129
|
+
return cls.Z_R, cls.Z_L, cls.Z_G
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def gantry_axes(
|
|
133
|
+
cls,
|
|
134
|
+
) -> Tuple["Axis", "Axis", "Axis", "Axis", "Axis"]:
|
|
135
|
+
"""The axes which are tied to the gantry and require the deck
|
|
136
|
+
calibration transform
|
|
137
|
+
"""
|
|
138
|
+
return cls.X, cls.Y, cls.Z_L, cls.Z_R, cls.Z_G
|
|
139
|
+
|
|
140
|
+
@classmethod
|
|
141
|
+
def of_main_tool_actuator(cls, mount: Union[top_types.Mount, OT3Mount]) -> "Axis":
|
|
142
|
+
if isinstance(mount, top_types.Mount):
|
|
143
|
+
checked_mount = OT3Mount.from_mount(mount)
|
|
144
|
+
else:
|
|
145
|
+
checked_mount = mount
|
|
146
|
+
pm = {OT3Mount.LEFT: cls.P_L, OT3Mount.RIGHT: cls.P_R, OT3Mount.GRIPPER: cls.G}
|
|
147
|
+
return pm[checked_mount]
|
|
148
|
+
|
|
149
|
+
@classmethod
|
|
150
|
+
def to_kind(cls, axis: "Axis") -> OT3AxisKind:
|
|
151
|
+
kind_map: Dict[Axis, OT3AxisKind] = {
|
|
152
|
+
cls.P_L: OT3AxisKind.P,
|
|
153
|
+
cls.P_R: OT3AxisKind.P,
|
|
154
|
+
cls.X: OT3AxisKind.X,
|
|
155
|
+
cls.Y: OT3AxisKind.Y,
|
|
156
|
+
cls.Z_L: OT3AxisKind.Z,
|
|
157
|
+
cls.Z_R: OT3AxisKind.Z,
|
|
158
|
+
cls.Z_G: OT3AxisKind.Z_G,
|
|
159
|
+
cls.Q: OT3AxisKind.Q,
|
|
160
|
+
cls.G: OT3AxisKind.OTHER,
|
|
161
|
+
}
|
|
162
|
+
return kind_map[axis]
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def of_kind(cls, kind: OT3AxisKind) -> List["Axis"]:
|
|
166
|
+
kind_map: Dict[OT3AxisKind, List[Axis]] = {
|
|
167
|
+
OT3AxisKind.P: [cls.P_R, cls.P_L],
|
|
168
|
+
OT3AxisKind.X: [cls.X],
|
|
169
|
+
OT3AxisKind.Y: [cls.Y],
|
|
170
|
+
OT3AxisKind.Z: [cls.Z_L, cls.Z_R],
|
|
171
|
+
OT3AxisKind.Z_G: [cls.Z_G],
|
|
172
|
+
OT3AxisKind.Q: [cls.Q],
|
|
173
|
+
OT3AxisKind.OTHER: [cls.Q, cls.G],
|
|
174
|
+
}
|
|
175
|
+
return kind_map[kind]
|
|
176
|
+
|
|
177
|
+
@classmethod
|
|
178
|
+
def to_ot2_mount(cls, inst: "Axis") -> top_types.Mount:
|
|
179
|
+
# TODO (spp, 2023-07-14): make this a separate function outside of Axis
|
|
180
|
+
return {
|
|
181
|
+
cls.Z: top_types.Mount.LEFT,
|
|
182
|
+
cls.A: top_types.Mount.RIGHT,
|
|
183
|
+
cls.B: top_types.Mount.LEFT,
|
|
184
|
+
cls.C: top_types.Mount.RIGHT,
|
|
185
|
+
}[inst]
|
|
186
|
+
|
|
187
|
+
@classmethod
|
|
188
|
+
def to_ot3_mount(cls, inst: "Axis") -> OT3Mount:
|
|
189
|
+
# TODO (spp, 2023-07-14): make this a separate function outside of Axis
|
|
190
|
+
return {
|
|
191
|
+
cls.Z_R: OT3Mount.RIGHT,
|
|
192
|
+
cls.Z_L: OT3Mount.LEFT,
|
|
193
|
+
cls.P_L: OT3Mount.LEFT,
|
|
194
|
+
cls.P_R: OT3Mount.RIGHT,
|
|
195
|
+
cls.Z_G: OT3Mount.GRIPPER,
|
|
196
|
+
cls.G: OT3Mount.GRIPPER,
|
|
197
|
+
}[inst]
|
|
198
|
+
|
|
199
|
+
def __str__(self) -> str:
|
|
200
|
+
return self.name
|
|
201
|
+
|
|
202
|
+
def of_point(self, point: top_types.Point) -> float:
|
|
203
|
+
if Axis.to_kind(self).is_z_axis():
|
|
204
|
+
return point.z
|
|
205
|
+
elif self == Axis.X:
|
|
206
|
+
return point.x
|
|
207
|
+
elif self == Axis.Y:
|
|
208
|
+
return point.y
|
|
209
|
+
else:
|
|
210
|
+
raise KeyError(self)
|
|
211
|
+
|
|
212
|
+
def set_in_point(self, point: top_types.Point, position: float) -> top_types.Point:
|
|
213
|
+
if Axis.to_kind(self).is_z_axis():
|
|
214
|
+
return point._replace(z=position)
|
|
215
|
+
elif self == Axis.X:
|
|
216
|
+
return point._replace(x=position)
|
|
217
|
+
elif self == Axis.Y:
|
|
218
|
+
return point._replace(y=position)
|
|
219
|
+
else:
|
|
220
|
+
raise KeyError(self)
|
|
221
|
+
|
|
222
|
+
@classmethod
|
|
223
|
+
def ot2_axes(cls) -> List["Axis"]:
|
|
224
|
+
"""Returns only OT2 axes."""
|
|
225
|
+
# TODO (spp, 2023-07-14): make this a separate function outside of Axis
|
|
226
|
+
return [axis for axis in Axis if axis not in [Axis.Z_G, Axis.Q, Axis.G]]
|
|
227
|
+
|
|
228
|
+
@classmethod
|
|
229
|
+
def of_plunger(cls, mount: top_types.Mount) -> "Axis":
|
|
230
|
+
"""Get plunger axes.
|
|
231
|
+
|
|
232
|
+
Same as `of_main_tool_actuator` but for OT2 backwards compatibility.
|
|
233
|
+
"""
|
|
234
|
+
return cls.of_main_tool_actuator(mount)
|
|
235
|
+
|
|
236
|
+
@classmethod
|
|
237
|
+
def node_axes(cls) -> List["Axis"]:
|
|
238
|
+
"""
|
|
239
|
+
Get a list of axes that are backed by flex canbus nodes.
|
|
240
|
+
"""
|
|
241
|
+
return [cls.X, cls.Y, cls.Z_L, cls.Z_R, cls.P_L, cls.P_R, cls.Z_G, cls.G]
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class SubSystem(enum.Enum):
|
|
245
|
+
"""An enumeration of ot3 components.
|
|
246
|
+
|
|
247
|
+
This is a complete list of unique firmware nodes in the ot3.
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
gantry_x = 0
|
|
251
|
+
gantry_y = 1
|
|
252
|
+
head = 2
|
|
253
|
+
pipette_left = 3
|
|
254
|
+
pipette_right = 4
|
|
255
|
+
gripper = 5
|
|
256
|
+
rear_panel = 6
|
|
257
|
+
motor_controller_board = 7
|
|
258
|
+
hepa_uv = 8
|
|
259
|
+
|
|
260
|
+
def __str__(self) -> str:
|
|
261
|
+
return self.name
|
|
262
|
+
|
|
263
|
+
@classmethod
|
|
264
|
+
def of_mount(
|
|
265
|
+
cls: "Type[SubSystem]", mount: Union[top_types.Mount, OT3Mount]
|
|
266
|
+
) -> "Literal[SubSystem.pipette_left, SubSystem.pipette_right, SubSystem.gripper]":
|
|
267
|
+
return cast(
|
|
268
|
+
Literal[SubSystem.pipette_left, SubSystem.pipette_right, SubSystem.gripper],
|
|
269
|
+
{
|
|
270
|
+
top_types.Mount.LEFT: cls.pipette_left,
|
|
271
|
+
top_types.Mount.RIGHT: cls.pipette_right,
|
|
272
|
+
OT3Mount.LEFT: cls.pipette_left,
|
|
273
|
+
OT3Mount.RIGHT: cls.pipette_right,
|
|
274
|
+
OT3Mount.GRIPPER: cls.gripper,
|
|
275
|
+
}[mount],
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
OT3SubSystem = SubSystem
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class PipetteSubType(enum.Enum):
|
|
283
|
+
"""Pipette type to map from lower level PipetteType."""
|
|
284
|
+
|
|
285
|
+
pipette_single = 1
|
|
286
|
+
pipette_multi = 2
|
|
287
|
+
pipette_96 = 3
|
|
288
|
+
|
|
289
|
+
def __str__(self) -> str:
|
|
290
|
+
return self.name
|
|
291
|
+
|
|
292
|
+
@classmethod
|
|
293
|
+
def from_channels(cls, channels: PipetteChannelType) -> "PipetteSubType":
|
|
294
|
+
pipette_subtype_lookup = {
|
|
295
|
+
PipetteChannelType.SINGLE_CHANNEL: cls.pipette_single,
|
|
296
|
+
PipetteChannelType.EIGHT_CHANNEL: cls.pipette_multi,
|
|
297
|
+
PipetteChannelType.NINETY_SIX_CHANNEL: cls.pipette_96,
|
|
298
|
+
}
|
|
299
|
+
return pipette_subtype_lookup[channels]
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
class UpdateState(enum.Enum):
|
|
303
|
+
"""Update state to map from lower level FirmwareUpdateStatus"""
|
|
304
|
+
|
|
305
|
+
queued = "queued"
|
|
306
|
+
updating = "updating"
|
|
307
|
+
done = "done"
|
|
308
|
+
|
|
309
|
+
def __str__(self) -> str:
|
|
310
|
+
return self.value
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@dataclass(frozen=True)
|
|
314
|
+
class UpdateStatus:
|
|
315
|
+
subsystem: SubSystem
|
|
316
|
+
state: UpdateState
|
|
317
|
+
progress: int
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
@dataclass
|
|
321
|
+
class SubSystemState:
|
|
322
|
+
ok: bool
|
|
323
|
+
current_fw_version: int
|
|
324
|
+
next_fw_version: int
|
|
325
|
+
fw_update_needed: bool
|
|
326
|
+
current_fw_sha: str
|
|
327
|
+
pcba_revision: str
|
|
328
|
+
update_state: Union[UpdateState, None]
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
BCAxes = Axis # This doesn't seem to be used. Remove?
|
|
332
|
+
AxisMapValue = TypeVar("AxisMapValue")
|
|
333
|
+
OT3AxisMap = Dict[Axis, AxisMapValue]
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
@dataclass
|
|
337
|
+
class CurrentConfig:
|
|
338
|
+
hold_current: float
|
|
339
|
+
run_current: float
|
|
340
|
+
|
|
341
|
+
def as_tuple(self) -> Tuple[float, float]:
|
|
342
|
+
return self.hold_current, self.run_current
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
@dataclass(frozen=True)
|
|
346
|
+
class MotorStatus:
|
|
347
|
+
motor_ok: bool
|
|
348
|
+
encoder_ok: bool
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class DoorState(enum.Enum):
|
|
352
|
+
OPEN = False
|
|
353
|
+
CLOSED = True
|
|
354
|
+
|
|
355
|
+
def __str__(self) -> str:
|
|
356
|
+
return self.name.lower()
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
class EstopState(enum.Enum):
|
|
360
|
+
"""Enumerated state machine for the estop status."""
|
|
361
|
+
|
|
362
|
+
PHYSICALLY_ENGAGED = enum.auto()
|
|
363
|
+
LOGICALLY_ENGAGED = enum.auto()
|
|
364
|
+
DISENGAGED = enum.auto()
|
|
365
|
+
NOT_PRESENT = enum.auto()
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
class EstopAttachLocation(enum.Enum):
|
|
369
|
+
"""Enumerated estop attach locations."""
|
|
370
|
+
|
|
371
|
+
LEFT = enum.auto()
|
|
372
|
+
RIGHT = enum.auto()
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class EstopPhysicalStatus(enum.Enum):
|
|
376
|
+
"""Possible status of an estop."""
|
|
377
|
+
|
|
378
|
+
ENGAGED = enum.auto()
|
|
379
|
+
DISENGAGED = enum.auto()
|
|
380
|
+
NOT_PRESENT = enum.auto()
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
class HardwareEventType(enum.Enum):
|
|
384
|
+
DOOR_SWITCH_CHANGE = enum.auto()
|
|
385
|
+
ERROR_MESSAGE = enum.auto()
|
|
386
|
+
ESTOP_CHANGE = enum.auto()
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
@dataclass
|
|
390
|
+
class EstopOverallStatus:
|
|
391
|
+
state: EstopState
|
|
392
|
+
left_physical_state: EstopPhysicalStatus
|
|
393
|
+
right_physical_state: EstopPhysicalStatus
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
@dataclass
|
|
397
|
+
class HepaFanState:
|
|
398
|
+
fan_on: bool
|
|
399
|
+
duty_cycle: int
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
@dataclass
|
|
403
|
+
class HepaUVState:
|
|
404
|
+
light_on: bool
|
|
405
|
+
uv_duration_s: int
|
|
406
|
+
remaining_time_s: int
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
@dataclass(frozen=True)
|
|
410
|
+
class DoorStateNotification:
|
|
411
|
+
event: Literal[
|
|
412
|
+
HardwareEventType.DOOR_SWITCH_CHANGE
|
|
413
|
+
] = HardwareEventType.DOOR_SWITCH_CHANGE
|
|
414
|
+
new_state: DoorState = DoorState.CLOSED
|
|
415
|
+
module_serial: str | None = None
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
@dataclass(frozen=True)
|
|
419
|
+
class EstopStateNotification:
|
|
420
|
+
event: Literal[HardwareEventType.ESTOP_CHANGE] = HardwareEventType.ESTOP_CHANGE
|
|
421
|
+
old_state: EstopState = EstopState.NOT_PRESENT
|
|
422
|
+
new_state: EstopState = EstopState.NOT_PRESENT
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
@dataclass(frozen=True)
|
|
426
|
+
class ErrorMessageNotification:
|
|
427
|
+
message: str
|
|
428
|
+
event: Literal[HardwareEventType.ERROR_MESSAGE] = HardwareEventType.ERROR_MESSAGE
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
# new event types get new dataclasses
|
|
432
|
+
# when we add more event types we add them here
|
|
433
|
+
HardwareEvent = Union[
|
|
434
|
+
DoorStateNotification, ErrorMessageNotification, EstopStateNotification
|
|
435
|
+
]
|
|
436
|
+
|
|
437
|
+
HardwareEventHandler = Callable[[HardwareEvent], None]
|
|
438
|
+
HardwareEventUnsubscriber = Callable[[], None]
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
RevisionLiteral = Literal["2.1", "A", "B", "C", "UNKNOWN"]
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
class BoardRevision(enum.Enum):
|
|
445
|
+
UNKNOWN = enum.auto()
|
|
446
|
+
OG = enum.auto()
|
|
447
|
+
A = enum.auto()
|
|
448
|
+
B = enum.auto()
|
|
449
|
+
C = enum.auto()
|
|
450
|
+
FLEX_B2 = enum.auto()
|
|
451
|
+
|
|
452
|
+
@classmethod
|
|
453
|
+
def by_bits(cls, rev_bits: Tuple[bool, bool]) -> "BoardRevision":
|
|
454
|
+
br = {
|
|
455
|
+
(True, True): cls.OG,
|
|
456
|
+
(False, True): cls.A,
|
|
457
|
+
(True, False): cls.B,
|
|
458
|
+
(False, False): cls.C,
|
|
459
|
+
}
|
|
460
|
+
return br[rev_bits]
|
|
461
|
+
|
|
462
|
+
def real_name(self) -> Union[RevisionLiteral, Literal["UNKNOWN"]]:
|
|
463
|
+
rn = "2.1" if self.name == "OG" else self.name
|
|
464
|
+
return cast(Union[RevisionLiteral, Literal["UNKNOWN"]], rn)
|
|
465
|
+
|
|
466
|
+
def __str__(self) -> str:
|
|
467
|
+
return self.real_name()
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
class CriticalPoint(enum.Enum):
|
|
471
|
+
"""Possibilities for the point to move in a move call.
|
|
472
|
+
|
|
473
|
+
The active critical point determines the offsets that are added to the
|
|
474
|
+
gantry position when moving a pipette around.
|
|
475
|
+
"""
|
|
476
|
+
|
|
477
|
+
MOUNT = enum.auto()
|
|
478
|
+
"""
|
|
479
|
+
For legacy reasons, the position of the end of a P300 single. The default
|
|
480
|
+
when no pipette is attached, and used for consistent behavior in certain
|
|
481
|
+
contexts (like change pipette) when a variety of different pipettes might
|
|
482
|
+
be attached.
|
|
483
|
+
"""
|
|
484
|
+
|
|
485
|
+
NOZZLE = enum.auto()
|
|
486
|
+
"""
|
|
487
|
+
The end of the nozzle of a single pipette or the end of the back-most
|
|
488
|
+
nozzle of a multipipette. Only relevant when a pipette is present.
|
|
489
|
+
"""
|
|
490
|
+
|
|
491
|
+
TIP = enum.auto()
|
|
492
|
+
"""
|
|
493
|
+
The end of the tip of a single pipette or the end of the back-most
|
|
494
|
+
tip of a multipipette. Only relevant when a pipette is present and
|
|
495
|
+
a tip with known tip length is attached.
|
|
496
|
+
"""
|
|
497
|
+
|
|
498
|
+
XY_CENTER = enum.auto()
|
|
499
|
+
"""
|
|
500
|
+
Separately from the z component of the critical point, XY_CENTER means
|
|
501
|
+
the critical point under consideration is the XY center of the pipette.
|
|
502
|
+
This changes nothing for single pipettes, but makes multipipettes
|
|
503
|
+
move their centers - so between channels 4 and 5 - to the specified
|
|
504
|
+
point. This is the same as the GRIPPER_JAW_CENTER for grippers.
|
|
505
|
+
"""
|
|
506
|
+
|
|
507
|
+
INSTRUMENT_XY_CENTER = enum.auto()
|
|
508
|
+
"""
|
|
509
|
+
The INSTRUMENT_XY_CENTER means the critical point under consideration is
|
|
510
|
+
the XY center of the entire pipette, regardless of configuration.
|
|
511
|
+
No pipettes, single or multi, will change their instrument center point.
|
|
512
|
+
"""
|
|
513
|
+
|
|
514
|
+
FRONT_NOZZLE = enum.auto()
|
|
515
|
+
"""
|
|
516
|
+
The end of the front-most nozzle of a multipipette with a tip attached.
|
|
517
|
+
Only relevant when a multichannel pipette is present.
|
|
518
|
+
"""
|
|
519
|
+
|
|
520
|
+
GRIPPER_JAW_CENTER = enum.auto()
|
|
521
|
+
"""
|
|
522
|
+
The center of the gripper jaw engagement zone, such that if this critical
|
|
523
|
+
point is moved to the center of a labware the gripper will be ready to
|
|
524
|
+
grip it.
|
|
525
|
+
"""
|
|
526
|
+
|
|
527
|
+
GRIPPER_FRONT_CALIBRATION_PIN = enum.auto()
|
|
528
|
+
"""
|
|
529
|
+
The center of the bottom face of a calibration pin inserted in the gripper's
|
|
530
|
+
front calibration pin slot.
|
|
531
|
+
"""
|
|
532
|
+
|
|
533
|
+
GRIPPER_REAR_CALIBRATION_PIN = enum.auto()
|
|
534
|
+
"""
|
|
535
|
+
The center of the bottom face of a calibration pin inserted in the gripper's
|
|
536
|
+
back calibration pin slot.
|
|
537
|
+
"""
|
|
538
|
+
|
|
539
|
+
Y_CENTER = enum.auto()
|
|
540
|
+
"""
|
|
541
|
+
Y_CENTER means the critical point under consideration is at the same X
|
|
542
|
+
coordinate as the default nozzle point (i.e. TIP | NOZZLE | FRONT_NOZZLE)
|
|
543
|
+
but halfway in between the Y axis bounding box of the pipette - it is the
|
|
544
|
+
XY center of the first column in the pipette. It's really only relevant for
|
|
545
|
+
the 96; it will produce the same position as XY_CENTER on an eight or one
|
|
546
|
+
channel pipette.
|
|
547
|
+
"""
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
class ExecutionState(enum.Enum):
|
|
551
|
+
RUNNING = enum.auto()
|
|
552
|
+
PAUSED = enum.auto()
|
|
553
|
+
CANCELLED = enum.auto()
|
|
554
|
+
|
|
555
|
+
def __str__(self) -> str:
|
|
556
|
+
return self.name
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
class HardwareAction(enum.Enum):
|
|
560
|
+
DROPTIP = enum.auto()
|
|
561
|
+
ASPIRATE = enum.auto()
|
|
562
|
+
DISPENSE = enum.auto()
|
|
563
|
+
BLOWOUT = enum.auto()
|
|
564
|
+
PREPARE_ASPIRATE = enum.auto()
|
|
565
|
+
LIQUID_PROBE = enum.auto()
|
|
566
|
+
|
|
567
|
+
def __str__(self) -> str:
|
|
568
|
+
return self.name
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
class PauseType(enum.Enum):
|
|
572
|
+
PAUSE = 0
|
|
573
|
+
DELAY = 1
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
class StatusBarState(enum.Enum):
|
|
577
|
+
"""Semantic status bar states.
|
|
578
|
+
|
|
579
|
+
These mostly correspond to cases listed out in the Flex manual.
|
|
580
|
+
"""
|
|
581
|
+
|
|
582
|
+
IDLE = enum.auto()
|
|
583
|
+
RUNNING = enum.auto()
|
|
584
|
+
PAUSED = enum.auto()
|
|
585
|
+
HARDWARE_ERROR = enum.auto()
|
|
586
|
+
SOFTWARE_ERROR = enum.auto()
|
|
587
|
+
ERROR_RECOVERY = enum.auto()
|
|
588
|
+
CONFIRMATION = enum.auto()
|
|
589
|
+
RUN_COMPLETED = enum.auto()
|
|
590
|
+
UPDATING = enum.auto()
|
|
591
|
+
ACTIVATION = enum.auto()
|
|
592
|
+
DISCO = enum.auto()
|
|
593
|
+
OFF = enum.auto()
|
|
594
|
+
|
|
595
|
+
def transient(self) -> bool:
|
|
596
|
+
return self.value in {
|
|
597
|
+
StatusBarState.CONFIRMATION.value,
|
|
598
|
+
StatusBarState.RUN_COMPLETED.value,
|
|
599
|
+
StatusBarState.ACTIVATION.value,
|
|
600
|
+
StatusBarState.DISCO.value,
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
@dataclass(frozen=True)
|
|
605
|
+
class StatusBarUpdateEvent:
|
|
606
|
+
state: StatusBarState
|
|
607
|
+
enabled: bool
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
StatusBarUpdateListener = Callable[[StatusBarUpdateEvent], None]
|
|
611
|
+
StatusBarUpdateUnsubscriber = Callable[[], None]
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
@dataclass
|
|
615
|
+
class AionotifyEvent:
|
|
616
|
+
flags: enum.EnumMeta
|
|
617
|
+
name: str
|
|
618
|
+
|
|
619
|
+
@classmethod
|
|
620
|
+
def build(cls, name: str, flags: List[enum.Enum]) -> "AionotifyEvent":
|
|
621
|
+
# See https://github.com/python/mypy/issues/5317
|
|
622
|
+
# as to why mypy cannot detect that list
|
|
623
|
+
# comprehension or variables cannot be dynamically
|
|
624
|
+
# determined to meet the argument criteria for
|
|
625
|
+
# enums. Hence, the type ignore below.
|
|
626
|
+
flag_list = [f.name for f in flags]
|
|
627
|
+
Flag = enum.Enum("Flag", flag_list) # type: ignore
|
|
628
|
+
return cls(flags=Flag, name=name)
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
class GripperJawState(enum.Enum):
|
|
632
|
+
UNHOMED = enum.auto()
|
|
633
|
+
#: the gripper must be homed before it can do anything
|
|
634
|
+
HOMED_READY = enum.auto()
|
|
635
|
+
#: the gripper has been homed and is at its fully-open homed position
|
|
636
|
+
GRIPPING = enum.auto()
|
|
637
|
+
#: the gripper is actively force-control gripping something
|
|
638
|
+
HOLDING = enum.auto()
|
|
639
|
+
#: the gripper is in position-control mode
|
|
640
|
+
STOPPED = enum.auto()
|
|
641
|
+
#: the gripper has been homed before but is stopped now
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
class InstrumentProbeType(enum.Enum):
|
|
645
|
+
PRIMARY = enum.auto()
|
|
646
|
+
SECONDARY = enum.auto()
|
|
647
|
+
BOTH = enum.auto()
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
class TipScrapeType(enum.Enum):
|
|
651
|
+
NONE = enum.auto()
|
|
652
|
+
RIGHT_ONE_COL = enum.auto()
|
|
653
|
+
LEFT_ONE_COL = enum.auto()
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
class GripperProbe(enum.Enum):
|
|
657
|
+
FRONT = enum.auto()
|
|
658
|
+
REAR = enum.auto()
|
|
659
|
+
|
|
660
|
+
@classmethod
|
|
661
|
+
def to_type(cls, gp: "GripperProbe") -> InstrumentProbeType:
|
|
662
|
+
if gp == cls.FRONT:
|
|
663
|
+
return InstrumentProbeType.SECONDARY
|
|
664
|
+
else:
|
|
665
|
+
return InstrumentProbeType.PRIMARY
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
class TipStateType(enum.Enum):
|
|
669
|
+
ABSENT = 0
|
|
670
|
+
PRESENT = 1
|
|
671
|
+
|
|
672
|
+
def __str__(self) -> str:
|
|
673
|
+
return self.name
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
@dataclass
|
|
677
|
+
class HardwareFeatureFlags:
|
|
678
|
+
"""
|
|
679
|
+
Hardware configuration options that can be passed to API instances.
|
|
680
|
+
Some options may not be relevant to every robot.
|
|
681
|
+
|
|
682
|
+
These generally map to the feature flag options in the opentrons.config
|
|
683
|
+
module.
|
|
684
|
+
"""
|
|
685
|
+
|
|
686
|
+
use_old_aspiration_functions: bool = (
|
|
687
|
+
False # To support pipette backwards compatability
|
|
688
|
+
)
|
|
689
|
+
require_estop: bool = True
|
|
690
|
+
stall_detection_enabled: bool = True
|
|
691
|
+
overpressure_detection_enabled: bool = True
|
|
692
|
+
|
|
693
|
+
@classmethod
|
|
694
|
+
def build_from_ff(cls) -> "HardwareFeatureFlags":
|
|
695
|
+
"""Build from the feature flags configuration file on disc.
|
|
696
|
+
|
|
697
|
+
Note that, if this class is built from the default constructor, the values
|
|
698
|
+
of all of the flags are just the default values instead of the values in the
|
|
699
|
+
feature_flags file or environment variables. Use this constructor to ensure
|
|
700
|
+
the right values are pulled in.
|
|
701
|
+
"""
|
|
702
|
+
return HardwareFeatureFlags(
|
|
703
|
+
use_old_aspiration_functions=feature_flags.use_old_aspiration_functions(),
|
|
704
|
+
require_estop=feature_flags.require_estop(),
|
|
705
|
+
stall_detection_enabled=feature_flags.stall_detection_enabled(),
|
|
706
|
+
overpressure_detection_enabled=feature_flags.overpressure_detection_enabled(),
|
|
707
|
+
)
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
class EarlyLiquidSenseTrigger(RuntimeError):
|
|
711
|
+
"""Error raised if sensor threshold reached before minimum probing distance."""
|
|
712
|
+
|
|
713
|
+
def __init__(
|
|
714
|
+
self, triggered_at: Dict[Axis, float], min_z_pos: Dict[Axis, float]
|
|
715
|
+
) -> None:
|
|
716
|
+
"""Initialize EarlyLiquidSenseTrigger error."""
|
|
717
|
+
super().__init__(
|
|
718
|
+
f"Liquid threshold triggered early at z={triggered_at}mm, "
|
|
719
|
+
f"minimum z position = {min_z_pos}"
|
|
720
|
+
)
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
class FailedTipStateCheck(RuntimeError):
|
|
724
|
+
"""Error raised if the tip ejector state does not match the expected value."""
|
|
725
|
+
|
|
726
|
+
def __init__(
|
|
727
|
+
self, expected_state: TipStateType, actual_state: TipStateType
|
|
728
|
+
) -> None:
|
|
729
|
+
"""Initialize FailedTipStateCheck error."""
|
|
730
|
+
super().__init__(
|
|
731
|
+
f"Expected tip state {expected_state}, but received {actual_state}."
|
|
732
|
+
)
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
@enum.unique
|
|
736
|
+
class PipetteSensorId(int, enum.Enum):
|
|
737
|
+
"""Sensor IDs available.
|
|
738
|
+
|
|
739
|
+
Not to be confused with SensorType. This is the ID value that separate
|
|
740
|
+
two or more of the same type of sensor within a system.
|
|
741
|
+
|
|
742
|
+
Note that this is a copy of an enum defined in opentrons_hardware.firmware_bindings.constants. That version
|
|
743
|
+
is authoritative; this version is here because this data is exposed above the hardware control layer and
|
|
744
|
+
therefore needs a typing source here so that we don't create a dependency on the internal hardware package.
|
|
745
|
+
"""
|
|
746
|
+
|
|
747
|
+
S0 = 0x0
|
|
748
|
+
S1 = 0x1
|
|
749
|
+
UNUSED = 0x2
|
|
750
|
+
BOTH = 0x3
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
@enum.unique
|
|
754
|
+
class PipetteSensorType(int, enum.Enum):
|
|
755
|
+
"""Sensor types available.
|
|
756
|
+
|
|
757
|
+
Note that this is a copy of an enum defined in opentrons_hardware.firmware_bindings.constants. That version
|
|
758
|
+
is authoritative; this version is here because this data is exposed above the hardware control layer and
|
|
759
|
+
therefore needs a typing source here so that we don't create a dependency on the internal hardware package.
|
|
760
|
+
"""
|
|
761
|
+
|
|
762
|
+
tip = 0x00
|
|
763
|
+
capacitive = 0x01
|
|
764
|
+
environment = 0x02
|
|
765
|
+
pressure = 0x03
|
|
766
|
+
pressure_temperature = 0x04
|
|
767
|
+
humidity = 0x05
|
|
768
|
+
temperature = 0x06
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
@dataclass(frozen=True)
|
|
772
|
+
class PipetteSensorData:
|
|
773
|
+
"""Sensor data from a monitored sensor.
|
|
774
|
+
|
|
775
|
+
Note that this is a copy of an enum defined in opentrons_hardware.firmware_bindings.constants. That version
|
|
776
|
+
is authoritative; this version is here because this data is exposed above the hardware control layer and
|
|
777
|
+
therefore needs a typing source here so that we don't create a dependency on the internal hardware package.
|
|
778
|
+
"""
|
|
779
|
+
|
|
780
|
+
sensor_type: PipetteSensorType
|
|
781
|
+
_as_int: int
|
|
782
|
+
_as_float: float
|
|
783
|
+
|
|
784
|
+
def to_float(self) -> float:
|
|
785
|
+
return self._as_float
|
|
786
|
+
|
|
787
|
+
@property
|
|
788
|
+
def to_int(self) -> int:
|
|
789
|
+
return self._as_int
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
PipetteSensorResponseQueue = Queue[Dict[PipetteSensorId, List[PipetteSensorData]]]
|