opentrons 8.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +557 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +187 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/scripts/update_module_fw.py +274 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +276 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1186 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +501 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1027 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3272 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1447 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +350 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +68 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1164 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2408 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1432 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1515 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +310 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +310 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +852 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0.dist-info/METADATA +37 -0
- opentrons-8.6.0.dist-info/RECORD +601 -0
- opentrons-8.6.0.dist-info/WHEEL +4 -0
- opentrons-8.6.0.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"""Protocol engine state management."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Callable, Dict, List, Optional, Sequence, TypeVar
|
|
6
|
+
from typing_extensions import ParamSpec
|
|
7
|
+
|
|
8
|
+
from opentrons_shared_data.deck.types import DeckDefinitionV5
|
|
9
|
+
from opentrons_shared_data.robot.types import RobotDefinition
|
|
10
|
+
|
|
11
|
+
from opentrons.protocol_engine.error_recovery_policy import ErrorRecoveryPolicy
|
|
12
|
+
from opentrons.protocol_engine.types import LiquidClassRecordWithId, ModuleOffsetData
|
|
13
|
+
from opentrons.util.change_notifier import ChangeNotifier
|
|
14
|
+
|
|
15
|
+
from ..resources import DeckFixedLabware
|
|
16
|
+
from ..actions import Action, ActionHandler
|
|
17
|
+
from ._abstract_store import HasState, HandlesActions
|
|
18
|
+
from .commands import CommandState, CommandStore, CommandView
|
|
19
|
+
from .addressable_areas import (
|
|
20
|
+
AddressableAreaState,
|
|
21
|
+
AddressableAreaStore,
|
|
22
|
+
AddressableAreaView,
|
|
23
|
+
)
|
|
24
|
+
from .labware import LabwareState, LabwareStore, LabwareView
|
|
25
|
+
from .pipettes import PipetteState, PipetteStore, PipetteView
|
|
26
|
+
from .modules import ModuleState, ModuleStore, ModuleView
|
|
27
|
+
from .liquids import LiquidState, LiquidView, LiquidStore
|
|
28
|
+
from .liquid_classes import LiquidClassState, LiquidClassStore, LiquidClassView
|
|
29
|
+
from .tips import TipState, TipView, TipStore
|
|
30
|
+
from .wells import WellState, WellView, WellStore
|
|
31
|
+
from .geometry import GeometryView
|
|
32
|
+
from .motion import MotionView
|
|
33
|
+
from .files import FileView, FileState, FileStore
|
|
34
|
+
from .config import Config
|
|
35
|
+
from .state_summary import StateSummary
|
|
36
|
+
from ..types import DeckConfigurationType
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
_ParamsT = ParamSpec("_ParamsT")
|
|
40
|
+
_ReturnT = TypeVar("_ReturnT")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class State:
|
|
45
|
+
"""Underlying engine state."""
|
|
46
|
+
|
|
47
|
+
commands: CommandState
|
|
48
|
+
addressable_areas: AddressableAreaState
|
|
49
|
+
labware: LabwareState
|
|
50
|
+
pipettes: PipetteState
|
|
51
|
+
modules: ModuleState
|
|
52
|
+
liquids: LiquidState
|
|
53
|
+
liquid_classes: LiquidClassState
|
|
54
|
+
tips: TipState
|
|
55
|
+
wells: WellState
|
|
56
|
+
files: FileState
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class StateView(HasState[State]):
|
|
60
|
+
"""A read-only view of computed state."""
|
|
61
|
+
|
|
62
|
+
_state: State
|
|
63
|
+
_commands: CommandView
|
|
64
|
+
_addressable_areas: AddressableAreaView
|
|
65
|
+
_labware: LabwareView
|
|
66
|
+
_pipettes: PipetteView
|
|
67
|
+
_modules: ModuleView
|
|
68
|
+
_liquid: LiquidView
|
|
69
|
+
_liquid_classes: LiquidClassView
|
|
70
|
+
_tips: TipView
|
|
71
|
+
_wells: WellView
|
|
72
|
+
_geometry: GeometryView
|
|
73
|
+
_motion: MotionView
|
|
74
|
+
_files: FileView
|
|
75
|
+
_config: Config
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def commands(self) -> CommandView:
|
|
79
|
+
"""Get state view selectors for commands state."""
|
|
80
|
+
return self._commands
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def addressable_areas(self) -> AddressableAreaView:
|
|
84
|
+
"""Get state view selectors for addressable area state."""
|
|
85
|
+
return self._addressable_areas
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def labware(self) -> LabwareView:
|
|
89
|
+
"""Get state view selectors for labware state."""
|
|
90
|
+
return self._labware
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def pipettes(self) -> PipetteView:
|
|
94
|
+
"""Get state view selectors for pipette state."""
|
|
95
|
+
return self._pipettes
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def modules(self) -> ModuleView:
|
|
99
|
+
"""Get state view selectors for hardware module state."""
|
|
100
|
+
return self._modules
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def liquid(self) -> LiquidView:
|
|
104
|
+
"""Get state view selectors for liquid state."""
|
|
105
|
+
return self._liquid
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def liquid_classes(self) -> LiquidClassView:
|
|
109
|
+
"""Get state view selectors for liquid class state."""
|
|
110
|
+
return self._liquid_classes
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def tips(self) -> TipView:
|
|
114
|
+
"""Get state view selectors for tip state."""
|
|
115
|
+
return self._tips
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def wells(self) -> WellView:
|
|
119
|
+
"""Get state view selectors for well state."""
|
|
120
|
+
return self._wells
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def geometry(self) -> GeometryView:
|
|
124
|
+
"""Get state view selectors for derived geometry state."""
|
|
125
|
+
return self._geometry
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def motion(self) -> MotionView:
|
|
129
|
+
"""Get state view selectors for derived motion state."""
|
|
130
|
+
return self._motion
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def files(self) -> FileView:
|
|
134
|
+
"""Get state view selectors for engine create file state."""
|
|
135
|
+
return self._files
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def config(self) -> Config:
|
|
139
|
+
"""Get ProtocolEngine configuration."""
|
|
140
|
+
return self._config
|
|
141
|
+
|
|
142
|
+
def get_summary(self) -> StateSummary:
|
|
143
|
+
"""Get protocol run data."""
|
|
144
|
+
error = self._commands.get_error()
|
|
145
|
+
# TODO maybe add summary here for AA
|
|
146
|
+
return StateSummary.model_construct(
|
|
147
|
+
status=self._commands.get_status(),
|
|
148
|
+
errors=[] if error is None else [error],
|
|
149
|
+
pipettes=self._pipettes.get_all(),
|
|
150
|
+
labware=self._labware.get_all(),
|
|
151
|
+
labwareOffsets=self._labware.get_labware_offsets(),
|
|
152
|
+
modules=self._modules.get_all(),
|
|
153
|
+
completedAt=self._state.commands.run_completed_at,
|
|
154
|
+
startedAt=self._state.commands.run_started_at,
|
|
155
|
+
liquids=self._liquid.get_all(),
|
|
156
|
+
wells=self._wells.get_all(),
|
|
157
|
+
hasEverEnteredErrorRecovery=self._commands.get_has_entered_recovery_mode(),
|
|
158
|
+
files=self._state.files.file_ids,
|
|
159
|
+
liquidClasses=[
|
|
160
|
+
LiquidClassRecordWithId(
|
|
161
|
+
liquidClassId=liquid_class_id, **dict(liquid_class_record)
|
|
162
|
+
)
|
|
163
|
+
for liquid_class_id, liquid_class_record in self._liquid_classes.get_all().items()
|
|
164
|
+
],
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class StateStore(StateView, ActionHandler):
|
|
169
|
+
"""ProtocolEngine state store.
|
|
170
|
+
|
|
171
|
+
A StateStore manages several substores, which will modify themselves in
|
|
172
|
+
reaction to commands and other protocol events. State instances inside
|
|
173
|
+
stores should be treated as immutable.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
def __init__(
|
|
177
|
+
self,
|
|
178
|
+
*,
|
|
179
|
+
config: Config,
|
|
180
|
+
deck_definition: DeckDefinitionV5,
|
|
181
|
+
deck_fixed_labware: Sequence[DeckFixedLabware],
|
|
182
|
+
robot_definition: RobotDefinition,
|
|
183
|
+
is_door_open: bool,
|
|
184
|
+
error_recovery_policy: ErrorRecoveryPolicy,
|
|
185
|
+
change_notifier: Optional[ChangeNotifier] = None,
|
|
186
|
+
module_calibration_offsets: Optional[Dict[str, ModuleOffsetData]] = None,
|
|
187
|
+
deck_configuration: Optional[DeckConfigurationType] = None,
|
|
188
|
+
notify_publishers: Optional[Callable[[], None]] = None,
|
|
189
|
+
) -> None:
|
|
190
|
+
"""Initialize a StateStore and its substores.
|
|
191
|
+
|
|
192
|
+
Arguments:
|
|
193
|
+
config: Top-level configuration.
|
|
194
|
+
deck_definition: The deck definition to preload into
|
|
195
|
+
labware state.
|
|
196
|
+
deck_fixed_labware: Labware definitions from the deck
|
|
197
|
+
definition to preload into labware state.
|
|
198
|
+
is_door_open: Whether the robot's door is currently open.
|
|
199
|
+
error_recovery_policy: The run's initial error recovery policy.
|
|
200
|
+
change_notifier: Internal state change notifier.
|
|
201
|
+
module_calibration_offsets: Module offsets to preload.
|
|
202
|
+
deck_configuration: The initial deck configuration the addressable area store will be instantiated with.
|
|
203
|
+
robot_definition: Static information about the robot type being used.
|
|
204
|
+
notify_publishers: Notifies robot server publishers of internal state change.
|
|
205
|
+
"""
|
|
206
|
+
self._command_store = CommandStore(
|
|
207
|
+
config=config,
|
|
208
|
+
is_door_open=is_door_open,
|
|
209
|
+
error_recovery_policy=error_recovery_policy,
|
|
210
|
+
)
|
|
211
|
+
self._pipette_store = PipetteStore()
|
|
212
|
+
if deck_configuration is None:
|
|
213
|
+
deck_configuration = []
|
|
214
|
+
self._addressable_area_store = AddressableAreaStore(
|
|
215
|
+
deck_configuration=deck_configuration,
|
|
216
|
+
config=config,
|
|
217
|
+
deck_definition=deck_definition,
|
|
218
|
+
robot_definition=robot_definition,
|
|
219
|
+
)
|
|
220
|
+
self._labware_store = LabwareStore(
|
|
221
|
+
deck_fixed_labware=deck_fixed_labware,
|
|
222
|
+
deck_definition=deck_definition,
|
|
223
|
+
)
|
|
224
|
+
self._module_store = ModuleStore(
|
|
225
|
+
config=config,
|
|
226
|
+
deck_fixed_labware=deck_fixed_labware,
|
|
227
|
+
module_calibration_offsets=module_calibration_offsets,
|
|
228
|
+
)
|
|
229
|
+
self._liquid_store = LiquidStore()
|
|
230
|
+
self._liquid_class_store = LiquidClassStore()
|
|
231
|
+
self._tip_store = TipStore()
|
|
232
|
+
self._well_store = WellStore()
|
|
233
|
+
self._file_store = FileStore()
|
|
234
|
+
|
|
235
|
+
self._substores: List[HandlesActions] = [
|
|
236
|
+
self._command_store,
|
|
237
|
+
self._pipette_store,
|
|
238
|
+
self._addressable_area_store,
|
|
239
|
+
self._labware_store,
|
|
240
|
+
self._module_store,
|
|
241
|
+
self._liquid_store,
|
|
242
|
+
self._liquid_class_store,
|
|
243
|
+
self._tip_store,
|
|
244
|
+
self._well_store,
|
|
245
|
+
self._file_store,
|
|
246
|
+
]
|
|
247
|
+
self._config = config
|
|
248
|
+
self._change_notifier = change_notifier or ChangeNotifier()
|
|
249
|
+
self._notify_robot_server = notify_publishers
|
|
250
|
+
self._initialize_state()
|
|
251
|
+
|
|
252
|
+
def handle_action(self, action: Action) -> None:
|
|
253
|
+
"""Modify State in reaction to an action.
|
|
254
|
+
|
|
255
|
+
Arguments:
|
|
256
|
+
action: An action object representing a state change. Will be
|
|
257
|
+
passed to all substores so they can react accordingly.
|
|
258
|
+
"""
|
|
259
|
+
for substore in self._substores:
|
|
260
|
+
substore.handle_action(action)
|
|
261
|
+
|
|
262
|
+
self._update_state_views()
|
|
263
|
+
|
|
264
|
+
async def wait_for(
|
|
265
|
+
self,
|
|
266
|
+
condition: Callable[_ParamsT, _ReturnT],
|
|
267
|
+
*args: _ParamsT.args,
|
|
268
|
+
**kwargs: _ParamsT.kwargs,
|
|
269
|
+
) -> _ReturnT:
|
|
270
|
+
"""Wait for a condition to become true, checking whenever state changes.
|
|
271
|
+
|
|
272
|
+
If the condition is already true, return immediately.
|
|
273
|
+
|
|
274
|
+
!!! Warning:
|
|
275
|
+
This will only return when `condition` is true right now.
|
|
276
|
+
If you're not careful, this can cause you to miss updates,
|
|
277
|
+
and potentially wait forever.
|
|
278
|
+
|
|
279
|
+
For example, suppose:
|
|
280
|
+
|
|
281
|
+
1. Things start out in state A.
|
|
282
|
+
2. You start waiting specifically for state B.
|
|
283
|
+
3. State transitions A -> B.
|
|
284
|
+
Your task could theoretically run now,
|
|
285
|
+
but the event loop decides not to do that.
|
|
286
|
+
4. State transitions B -> C.
|
|
287
|
+
5. The event loop decides to run your task now.
|
|
288
|
+
But this method will only return when the state is B,
|
|
289
|
+
which it isn't now, so your task will stay waiting indefinitely.
|
|
290
|
+
|
|
291
|
+
To fix this, design your `condition` to look for something that,
|
|
292
|
+
after it first becomes true, remains true forever. For example,
|
|
293
|
+
suppose you want to wait for the engine to reach a specific command.
|
|
294
|
+
Don't use a `condition` that checks if that command is running now.
|
|
295
|
+
Instead, use a `condition` that checks if it ever has been running.
|
|
296
|
+
|
|
297
|
+
If this isn't possible, then you need other means to ensure that
|
|
298
|
+
no other task can transition the state out of the condition that you
|
|
299
|
+
care about until after you've had a chance to operate on the state
|
|
300
|
+
while it's in that condition.
|
|
301
|
+
|
|
302
|
+
Arguments:
|
|
303
|
+
condition: A function that returns a truthy value when the `await`
|
|
304
|
+
should resolve.
|
|
305
|
+
*args: Positional arguments to pass to `condition`.
|
|
306
|
+
**kwargs: Named arguments to pass to `condition`.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
The truthy value returned by the `condition` function.
|
|
310
|
+
|
|
311
|
+
Raises:
|
|
312
|
+
The exception raised by the `condition` function, if any.
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
def predicate() -> _ReturnT:
|
|
316
|
+
return condition(*args, **kwargs)
|
|
317
|
+
|
|
318
|
+
return await self._wait_for(condition=predicate, truthiness_to_wait_for=True)
|
|
319
|
+
|
|
320
|
+
def clear_command_history(self) -> None:
|
|
321
|
+
"""Clear CommandHistory state."""
|
|
322
|
+
self._command_store.clear_history()
|
|
323
|
+
|
|
324
|
+
async def wait_for_not(
|
|
325
|
+
self,
|
|
326
|
+
condition: Callable[_ParamsT, _ReturnT],
|
|
327
|
+
*args: _ParamsT.args,
|
|
328
|
+
**kwargs: _ParamsT.kwargs,
|
|
329
|
+
) -> _ReturnT:
|
|
330
|
+
"""Like `wait_for()`, except wait for the condition to become false.
|
|
331
|
+
|
|
332
|
+
See the documentation in `wait_for()`, especially the warning about condition
|
|
333
|
+
design.
|
|
334
|
+
|
|
335
|
+
The advantage of having this separate method over just passing a wrapper lambda
|
|
336
|
+
as the condition to `wait_for()` yourself is that wrapper lambdas are hard to
|
|
337
|
+
test in the mock-heavy Decoy + Protocol Engine style.
|
|
338
|
+
"""
|
|
339
|
+
|
|
340
|
+
def predicate() -> _ReturnT:
|
|
341
|
+
return condition(*args, **kwargs)
|
|
342
|
+
|
|
343
|
+
return await self._wait_for(condition=predicate, truthiness_to_wait_for=False)
|
|
344
|
+
|
|
345
|
+
async def _wait_for(
|
|
346
|
+
self, condition: Callable[[], _ReturnT], truthiness_to_wait_for: bool
|
|
347
|
+
) -> _ReturnT:
|
|
348
|
+
current_value = condition()
|
|
349
|
+
|
|
350
|
+
while bool(current_value) != truthiness_to_wait_for:
|
|
351
|
+
await self._change_notifier.wait()
|
|
352
|
+
current_value = condition()
|
|
353
|
+
|
|
354
|
+
return current_value
|
|
355
|
+
|
|
356
|
+
def _get_next_state(self) -> State:
|
|
357
|
+
"""Get a new instance of the state value object."""
|
|
358
|
+
return State(
|
|
359
|
+
commands=self._command_store.state,
|
|
360
|
+
addressable_areas=self._addressable_area_store.state,
|
|
361
|
+
labware=self._labware_store.state,
|
|
362
|
+
pipettes=self._pipette_store.state,
|
|
363
|
+
modules=self._module_store.state,
|
|
364
|
+
liquids=self._liquid_store.state,
|
|
365
|
+
liquid_classes=self._liquid_class_store.state,
|
|
366
|
+
tips=self._tip_store.state,
|
|
367
|
+
wells=self._well_store.state,
|
|
368
|
+
files=self._file_store.state,
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
def _initialize_state(self) -> None:
|
|
372
|
+
"""Initialize state data and view."""
|
|
373
|
+
state = self._get_next_state()
|
|
374
|
+
|
|
375
|
+
# Base states
|
|
376
|
+
self._state = state
|
|
377
|
+
self._commands = CommandView(state.commands)
|
|
378
|
+
self._addressable_areas = AddressableAreaView(state.addressable_areas)
|
|
379
|
+
self._labware = LabwareView(state.labware)
|
|
380
|
+
self._pipettes = PipetteView(state.pipettes)
|
|
381
|
+
self._modules = ModuleView(state=state.modules)
|
|
382
|
+
self._liquid = LiquidView(state.liquids)
|
|
383
|
+
self._liquid_classes = LiquidClassView(state.liquid_classes)
|
|
384
|
+
self._tips = TipView(state.tips)
|
|
385
|
+
self._wells = WellView(state.wells)
|
|
386
|
+
self._files = FileView(state.files)
|
|
387
|
+
|
|
388
|
+
# Derived states
|
|
389
|
+
self._geometry = GeometryView(
|
|
390
|
+
config=self._config,
|
|
391
|
+
labware_view=self._labware,
|
|
392
|
+
well_view=self._wells,
|
|
393
|
+
module_view=self._modules,
|
|
394
|
+
pipette_view=self._pipettes,
|
|
395
|
+
addressable_area_view=self._addressable_areas,
|
|
396
|
+
)
|
|
397
|
+
self._motion = MotionView(
|
|
398
|
+
config=self._config,
|
|
399
|
+
labware_view=self._labware,
|
|
400
|
+
pipette_view=self._pipettes,
|
|
401
|
+
addressable_area_view=self._addressable_areas,
|
|
402
|
+
geometry_view=self._geometry,
|
|
403
|
+
module_view=self._modules,
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
def _update_state_views(self) -> None:
|
|
407
|
+
"""Update state view interfaces to use latest underlying values."""
|
|
408
|
+
next_state = self._get_next_state()
|
|
409
|
+
self._state = next_state
|
|
410
|
+
self._commands._state = next_state.commands
|
|
411
|
+
self._addressable_areas._state = next_state.addressable_areas
|
|
412
|
+
self._labware._state = next_state.labware
|
|
413
|
+
self._pipettes._state = next_state.pipettes
|
|
414
|
+
self._modules._state = next_state.modules
|
|
415
|
+
self._liquid._state = next_state.liquids
|
|
416
|
+
self._liquid_classes._state = next_state.liquid_classes
|
|
417
|
+
self._tips._state = next_state.tips
|
|
418
|
+
self._wells._state = next_state.wells
|
|
419
|
+
self._change_notifier.notify()
|
|
420
|
+
if self._notify_robot_server is not None:
|
|
421
|
+
self._notify_robot_server()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Public protocol run data models."""
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
|
|
6
|
+
from ..errors import ErrorOccurrence
|
|
7
|
+
from ..types import (
|
|
8
|
+
EngineStatus,
|
|
9
|
+
LoadedLabware,
|
|
10
|
+
LabwareOffset,
|
|
11
|
+
LoadedModule,
|
|
12
|
+
LoadedPipette,
|
|
13
|
+
Liquid,
|
|
14
|
+
LiquidClassRecordWithId,
|
|
15
|
+
WellInfoSummary,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class StateSummary(BaseModel):
|
|
20
|
+
"""Data from a protocol run."""
|
|
21
|
+
|
|
22
|
+
status: EngineStatus
|
|
23
|
+
# errors is a list for historical reasons. (This model needs to stay compatible with
|
|
24
|
+
# robot-server's database.) It shouldn't have more than 1 element.
|
|
25
|
+
errors: List[ErrorOccurrence]
|
|
26
|
+
hasEverEnteredErrorRecovery: bool = Field(default=False)
|
|
27
|
+
labware: List[LoadedLabware]
|
|
28
|
+
pipettes: List[LoadedPipette]
|
|
29
|
+
modules: List[LoadedModule]
|
|
30
|
+
labwareOffsets: List[LabwareOffset]
|
|
31
|
+
startedAt: Optional[datetime] = None
|
|
32
|
+
completedAt: Optional[datetime] = None
|
|
33
|
+
liquids: List[Liquid] = Field(default_factory=list)
|
|
34
|
+
wells: List[WellInfoSummary] = Field(default_factory=list)
|
|
35
|
+
files: List[str] = Field(default_factory=list)
|
|
36
|
+
liquidClasses: List[LiquidClassRecordWithId] = Field(default_factory=list)
|