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,82 @@
|
|
|
1
|
+
"""Update position estimators payload, result, and implementaiton."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from typing import TYPE_CHECKING, Optional, List, Type
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
|
|
8
|
+
from ...types import MotorAxis
|
|
9
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
10
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
11
|
+
from ...resources import ensure_ot3_hardware
|
|
12
|
+
|
|
13
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ...execution import GantryMover
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
UnsafeEngageAxesCommandType = Literal["unsafe/engageAxes"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UnsafeEngageAxesParams(BaseModel):
|
|
23
|
+
"""Payload required for an UnsafeEngageAxes command."""
|
|
24
|
+
|
|
25
|
+
axes: List[MotorAxis] = Field(..., description="The axes for which to enable.")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class UnsafeEngageAxesResult(BaseModel):
|
|
29
|
+
"""Result data from the execution of an UnsafeEngageAxes command."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class UnsafeEngageAxesImplementation(
|
|
33
|
+
AbstractCommandImpl[
|
|
34
|
+
UnsafeEngageAxesParams,
|
|
35
|
+
SuccessData[UnsafeEngageAxesResult],
|
|
36
|
+
]
|
|
37
|
+
):
|
|
38
|
+
"""Enable axes command implementation."""
|
|
39
|
+
|
|
40
|
+
def __init__(
|
|
41
|
+
self,
|
|
42
|
+
hardware_api: HardwareControlAPI,
|
|
43
|
+
gantry_mover: GantryMover,
|
|
44
|
+
**kwargs: object,
|
|
45
|
+
) -> None:
|
|
46
|
+
self._hardware_api = hardware_api
|
|
47
|
+
self._gantry_mover = gantry_mover
|
|
48
|
+
|
|
49
|
+
async def execute(
|
|
50
|
+
self, params: UnsafeEngageAxesParams
|
|
51
|
+
) -> SuccessData[UnsafeEngageAxesResult]:
|
|
52
|
+
"""Enable exes."""
|
|
53
|
+
ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
|
|
54
|
+
await ot3_hardware_api.engage_axes(
|
|
55
|
+
self._gantry_mover.motor_axes_to_present_hardware_axes(params.axes)
|
|
56
|
+
)
|
|
57
|
+
return SuccessData(
|
|
58
|
+
public=UnsafeEngageAxesResult(),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class UnsafeEngageAxes(
|
|
63
|
+
BaseCommand[UnsafeEngageAxesParams, UnsafeEngageAxesResult, ErrorOccurrence]
|
|
64
|
+
):
|
|
65
|
+
"""UnsafeEngageAxes command model."""
|
|
66
|
+
|
|
67
|
+
commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes"
|
|
68
|
+
params: UnsafeEngageAxesParams
|
|
69
|
+
result: Optional[UnsafeEngageAxesResult] = None
|
|
70
|
+
|
|
71
|
+
_ImplementationCls: Type[
|
|
72
|
+
UnsafeEngageAxesImplementation
|
|
73
|
+
] = UnsafeEngageAxesImplementation
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class UnsafeEngageAxesCreate(BaseCommandCreate[UnsafeEngageAxesParams]):
|
|
77
|
+
"""UnsafeEngageAxes command request model."""
|
|
78
|
+
|
|
79
|
+
commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes"
|
|
80
|
+
params: UnsafeEngageAxesParams
|
|
81
|
+
|
|
82
|
+
_CommandCls: Type[UnsafeEngageAxes] = UnsafeEngageAxes
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"""Place labware payload, result, and implementaiton."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
|
|
7
|
+
from opentrons_shared_data.labware.types import LabwareUri
|
|
8
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from opentrons.hardware_control.types import Axis, OT3Mount
|
|
12
|
+
from opentrons.motion_planning.waypoints import get_gripper_labware_placement_waypoints
|
|
13
|
+
from opentrons.protocol_engine.errors.exceptions import (
|
|
14
|
+
CannotPerformGripperAction,
|
|
15
|
+
GripperNotAttachedError,
|
|
16
|
+
)
|
|
17
|
+
from opentrons.types import Point
|
|
18
|
+
|
|
19
|
+
from ...types import (
|
|
20
|
+
DeckSlotLocation,
|
|
21
|
+
ModuleModel,
|
|
22
|
+
OnDeckLabwareLocation,
|
|
23
|
+
)
|
|
24
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
25
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
26
|
+
from ...resources import ensure_ot3_hardware
|
|
27
|
+
|
|
28
|
+
from opentrons.hardware_control import HardwareControlAPI, OT3HardwareControlAPI
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from ...state.state import StateView
|
|
32
|
+
from ...execution.equipment import EquipmentHandler
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
UnsafePlaceLabwareCommandType = Literal["unsafe/placeLabware"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class UnsafePlaceLabwareParams(BaseModel):
|
|
39
|
+
"""Payload required for an UnsafePlaceLabware command."""
|
|
40
|
+
|
|
41
|
+
labwareURI: str = Field(..., description="Labware URI for labware.")
|
|
42
|
+
location: OnDeckLabwareLocation = Field(
|
|
43
|
+
..., description="Where to place the labware."
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class UnsafePlaceLabwareResult(BaseModel):
|
|
48
|
+
"""Result data from the execution of an UnsafePlaceLabware command."""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class UnsafePlaceLabwareImplementation(
|
|
52
|
+
AbstractCommandImpl[
|
|
53
|
+
UnsafePlaceLabwareParams,
|
|
54
|
+
SuccessData[UnsafePlaceLabwareResult],
|
|
55
|
+
]
|
|
56
|
+
):
|
|
57
|
+
"""The UnsafePlaceLabware command implementation."""
|
|
58
|
+
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
hardware_api: HardwareControlAPI,
|
|
62
|
+
state_view: StateView,
|
|
63
|
+
equipment: EquipmentHandler,
|
|
64
|
+
**kwargs: object,
|
|
65
|
+
) -> None:
|
|
66
|
+
self._hardware_api = hardware_api
|
|
67
|
+
self._state_view = state_view
|
|
68
|
+
self._equipment = equipment
|
|
69
|
+
|
|
70
|
+
async def execute(
|
|
71
|
+
self, params: UnsafePlaceLabwareParams
|
|
72
|
+
) -> SuccessData[UnsafePlaceLabwareResult]:
|
|
73
|
+
"""Place Labware.
|
|
74
|
+
|
|
75
|
+
This command is used only when the gripper is in the middle of moving
|
|
76
|
+
labware but is interrupted before completing the move. (i.e., the e-stop
|
|
77
|
+
is pressed, get into error recovery, etc).
|
|
78
|
+
|
|
79
|
+
Unlike the `moveLabware` command, where you pick a source and destination
|
|
80
|
+
location, this command takes the labwareURI of the labware to be moved
|
|
81
|
+
and location to move it to.
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
ot3api = ensure_ot3_hardware(self._hardware_api)
|
|
85
|
+
if not ot3api.has_gripper():
|
|
86
|
+
raise GripperNotAttachedError("No gripper found to perform labware place.")
|
|
87
|
+
|
|
88
|
+
if ot3api.gripper_jaw_can_home():
|
|
89
|
+
raise CannotPerformGripperAction(
|
|
90
|
+
"Cannot place labware when gripper is not gripping."
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
location = self._state_view.geometry.ensure_valid_gripper_location(
|
|
94
|
+
params.location,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
definition = self._state_view.labware.get_definition_by_uri(
|
|
98
|
+
# todo(mm, 2024-11-07): This is an unsafe cast from untrusted input.
|
|
99
|
+
# We need a str -> LabwareUri parse/validate function.
|
|
100
|
+
LabwareUri(params.labwareURI)
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# todo(mm, 2024-11-06): This is only correct in the special case of an
|
|
104
|
+
# absorbance reader lid. Its definition currently puts the offsets for *itself*
|
|
105
|
+
# in the property that's normally meant for offsets for its *children.*
|
|
106
|
+
final_offsets = self._state_view.labware.get_child_gripper_offsets(
|
|
107
|
+
labware_definition=definition, slot_name=None
|
|
108
|
+
)
|
|
109
|
+
drop_offset = (
|
|
110
|
+
Point(
|
|
111
|
+
final_offsets.dropOffset.x,
|
|
112
|
+
final_offsets.dropOffset.y,
|
|
113
|
+
final_offsets.dropOffset.z,
|
|
114
|
+
)
|
|
115
|
+
if final_offsets
|
|
116
|
+
else None
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
if isinstance(params.location, DeckSlotLocation):
|
|
120
|
+
self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
|
|
121
|
+
params.location.slotName.id
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# This is an absorbance reader, move the lid to its dock (staging area).
|
|
125
|
+
if isinstance(location, DeckSlotLocation):
|
|
126
|
+
module = self._state_view.modules.get_by_slot(location.slotName)
|
|
127
|
+
if module and module.model == ModuleModel.ABSORBANCE_READER_V1:
|
|
128
|
+
location = self._state_view.modules.absorbance_reader_dock_location(
|
|
129
|
+
module.id
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# NOTE: When the estop is pressed, the gantry loses position, lets use
|
|
133
|
+
# the encoders to sync position.
|
|
134
|
+
# Ideally, we'd do a full home, but this command is used when
|
|
135
|
+
# the gripper is holding the plate reader, and a full home would
|
|
136
|
+
# bang it into the right window.
|
|
137
|
+
await ot3api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G])
|
|
138
|
+
await ot3api.engage_axes([Axis.X, Axis.Y])
|
|
139
|
+
await ot3api.update_axis_position_estimations([Axis.X, Axis.Y])
|
|
140
|
+
|
|
141
|
+
# Place the labware down
|
|
142
|
+
await self._start_movement(ot3api, definition, location, drop_offset)
|
|
143
|
+
|
|
144
|
+
return SuccessData(public=UnsafePlaceLabwareResult())
|
|
145
|
+
|
|
146
|
+
async def _start_movement(
|
|
147
|
+
self,
|
|
148
|
+
ot3api: OT3HardwareControlAPI,
|
|
149
|
+
labware_definition: LabwareDefinition,
|
|
150
|
+
location: OnDeckLabwareLocation,
|
|
151
|
+
drop_offset: Optional[Point],
|
|
152
|
+
) -> None:
|
|
153
|
+
gripper_homed_position = await ot3api.gantry_position(
|
|
154
|
+
mount=OT3Mount.GRIPPER,
|
|
155
|
+
refresh=True,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
to_labware_center = self._state_view.geometry.get_labware_grip_point(
|
|
159
|
+
labware_definition=labware_definition, location=location
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
movement_waypoints = get_gripper_labware_placement_waypoints(
|
|
163
|
+
to_labware_center=to_labware_center,
|
|
164
|
+
gripper_home_z=gripper_homed_position.z,
|
|
165
|
+
drop_offset=drop_offset,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# start movement
|
|
169
|
+
for waypoint_data in movement_waypoints:
|
|
170
|
+
if waypoint_data.jaw_open:
|
|
171
|
+
if waypoint_data.dropping:
|
|
172
|
+
# This `disengage_axes` step is important in order to engage
|
|
173
|
+
# the electronic brake on the Z axis of the gripper. The brake
|
|
174
|
+
# has a stronger holding force on the axis than the hold current,
|
|
175
|
+
# and prevents the axis from spuriously dropping when e.g. the notch
|
|
176
|
+
# on the side of a falling tiprack catches the jaw.
|
|
177
|
+
await ot3api.disengage_axes([Axis.Z_G])
|
|
178
|
+
await ot3api.ungrip()
|
|
179
|
+
if waypoint_data.dropping:
|
|
180
|
+
# We lost the position estimation after disengaging the axis, so
|
|
181
|
+
# it is necessary to home it next
|
|
182
|
+
await ot3api.home_z(OT3Mount.GRIPPER)
|
|
183
|
+
await ot3api.move_to(
|
|
184
|
+
mount=OT3Mount.GRIPPER, abs_position=waypoint_data.position
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class UnsafePlaceLabware(
|
|
189
|
+
BaseCommand[UnsafePlaceLabwareParams, UnsafePlaceLabwareResult, ErrorOccurrence]
|
|
190
|
+
):
|
|
191
|
+
"""UnsafePlaceLabware command model."""
|
|
192
|
+
|
|
193
|
+
commandType: UnsafePlaceLabwareCommandType = "unsafe/placeLabware"
|
|
194
|
+
params: UnsafePlaceLabwareParams
|
|
195
|
+
result: Optional[UnsafePlaceLabwareResult] = None
|
|
196
|
+
|
|
197
|
+
_ImplementationCls: Type[
|
|
198
|
+
UnsafePlaceLabwareImplementation
|
|
199
|
+
] = UnsafePlaceLabwareImplementation
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class UnsafePlaceLabwareCreate(BaseCommandCreate[UnsafePlaceLabwareParams]):
|
|
203
|
+
"""UnsafePlaceLabware command request model."""
|
|
204
|
+
|
|
205
|
+
commandType: UnsafePlaceLabwareCommandType = "unsafe/placeLabware"
|
|
206
|
+
params: UnsafePlaceLabwareParams
|
|
207
|
+
|
|
208
|
+
_CommandCls: Type[UnsafePlaceLabware] = UnsafePlaceLabware
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""Command models to close the latch of a Flex Stacker."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
from typing import Optional, Literal, TYPE_CHECKING
|
|
7
|
+
from typing_extensions import Type
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
12
|
+
from ...errors import ErrorOccurrence
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from ...state.state import StateView
|
|
16
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
17
|
+
|
|
18
|
+
UnsafeFlexStackerCloseLatchCommandType = Literal["unsafe/flexStacker/closeLatch"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class UnsafeFlexStackerCloseLatchParams(BaseModel):
|
|
22
|
+
"""The parameters defining how a stacker should close its latch."""
|
|
23
|
+
|
|
24
|
+
moduleId: str = Field(..., description="Unique ID of the Flex Stacker")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class UnsafeFlexStackerCloseLatchResult(BaseModel):
|
|
28
|
+
"""Result data from a stacker UnsafeFlexStackerCloseLatch command."""
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class UnsafeFlexStackerCloseLatchImpl(
|
|
32
|
+
AbstractCommandImpl[
|
|
33
|
+
UnsafeFlexStackerCloseLatchParams,
|
|
34
|
+
SuccessData[UnsafeFlexStackerCloseLatchResult],
|
|
35
|
+
]
|
|
36
|
+
):
|
|
37
|
+
"""Implementation of a stacker UnsafeFlexStackerCloseLatch command."""
|
|
38
|
+
|
|
39
|
+
def __init__(
|
|
40
|
+
self, state_view: StateView, equipment: EquipmentHandler, **kwargs: object
|
|
41
|
+
) -> None:
|
|
42
|
+
self._state_view = state_view
|
|
43
|
+
self._equipment = equipment
|
|
44
|
+
|
|
45
|
+
async def execute(
|
|
46
|
+
self, params: UnsafeFlexStackerCloseLatchParams
|
|
47
|
+
) -> SuccessData[UnsafeFlexStackerCloseLatchResult]:
|
|
48
|
+
"""Execute the stacker UnsafeFlexStackerCloseLatch command.
|
|
49
|
+
|
|
50
|
+
Closing the latch modifies the state of the flex stacker and affects its
|
|
51
|
+
ability to execute the next command. This command should be used with care
|
|
52
|
+
outside of a protocol.
|
|
53
|
+
"""
|
|
54
|
+
stacker_state = self._state_view.modules.get_flex_stacker_substate(
|
|
55
|
+
params.moduleId
|
|
56
|
+
)
|
|
57
|
+
stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
|
|
58
|
+
|
|
59
|
+
if stacker_hw is not None:
|
|
60
|
+
await stacker_hw.close_latch()
|
|
61
|
+
return SuccessData(public=UnsafeFlexStackerCloseLatchResult())
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class UnsafeFlexStackerCloseLatch(
|
|
65
|
+
BaseCommand[
|
|
66
|
+
UnsafeFlexStackerCloseLatchParams,
|
|
67
|
+
UnsafeFlexStackerCloseLatchResult,
|
|
68
|
+
ErrorOccurrence,
|
|
69
|
+
]
|
|
70
|
+
):
|
|
71
|
+
"""A command to UnsafeFlexStackerCloseLatch the Flex Stacker of labware."""
|
|
72
|
+
|
|
73
|
+
commandType: UnsafeFlexStackerCloseLatchCommandType = (
|
|
74
|
+
"unsafe/flexStacker/closeLatch"
|
|
75
|
+
)
|
|
76
|
+
params: UnsafeFlexStackerCloseLatchParams
|
|
77
|
+
result: Optional[UnsafeFlexStackerCloseLatchResult] = None
|
|
78
|
+
|
|
79
|
+
_ImplementationCls: Type[
|
|
80
|
+
UnsafeFlexStackerCloseLatchImpl
|
|
81
|
+
] = UnsafeFlexStackerCloseLatchImpl
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class UnsafeFlexStackerCloseLatchCreate(
|
|
85
|
+
BaseCommandCreate[UnsafeFlexStackerCloseLatchParams]
|
|
86
|
+
):
|
|
87
|
+
"""A request to execute a Flex Stacker UnsafeFlexStackerCloseLatch command."""
|
|
88
|
+
|
|
89
|
+
commandType: UnsafeFlexStackerCloseLatchCommandType = (
|
|
90
|
+
"unsafe/flexStacker/closeLatch"
|
|
91
|
+
)
|
|
92
|
+
params: UnsafeFlexStackerCloseLatchParams
|
|
93
|
+
|
|
94
|
+
_CommandCls: Type[UnsafeFlexStackerCloseLatch] = UnsafeFlexStackerCloseLatch
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"""Command models to manually retrieve a labware from a Flex Stacker in an unsafe situation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import Literal, TYPE_CHECKING, Any, Union, cast
|
|
5
|
+
from typing_extensions import Type
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
9
|
+
|
|
10
|
+
from ..command import (
|
|
11
|
+
AbstractCommandImpl,
|
|
12
|
+
BaseCommand,
|
|
13
|
+
BaseCommandCreate,
|
|
14
|
+
SuccessData,
|
|
15
|
+
DefinedErrorData,
|
|
16
|
+
)
|
|
17
|
+
from ..flex_stacker.common import (
|
|
18
|
+
FlexStackerStallOrCollisionError,
|
|
19
|
+
labware_locations_for_group,
|
|
20
|
+
build_retrieve_labware_move_updates,
|
|
21
|
+
primary_location_sequence,
|
|
22
|
+
adapter_location_sequence,
|
|
23
|
+
lid_location_sequence,
|
|
24
|
+
)
|
|
25
|
+
from ...errors import (
|
|
26
|
+
ErrorOccurrence,
|
|
27
|
+
CannotPerformModuleAction,
|
|
28
|
+
LocationIsOccupiedError,
|
|
29
|
+
FlexStackerLabwarePoolNotYetDefinedError,
|
|
30
|
+
)
|
|
31
|
+
from ...resources import ModelUtils
|
|
32
|
+
from ...state import update_types
|
|
33
|
+
from ...types import (
|
|
34
|
+
ModuleLocation,
|
|
35
|
+
LabwareLocationSequence,
|
|
36
|
+
InStackerHopperLocation,
|
|
37
|
+
)
|
|
38
|
+
from opentrons.hardware_control.modules.types import PlatformState
|
|
39
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition
|
|
40
|
+
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
43
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
44
|
+
|
|
45
|
+
UnsafeFlexStackerManualRetrieveCommandType = Literal[
|
|
46
|
+
"unsafe/flexStacker/manualRetrieve"
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
51
|
+
s.pop("default", None)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class UnsafeFlexStackerManualRetrieveParams(BaseModel):
|
|
55
|
+
"""Input parameters for a labware retrieval command."""
|
|
56
|
+
|
|
57
|
+
moduleId: str = Field(
|
|
58
|
+
...,
|
|
59
|
+
description="Unique ID of the Flex Stacker.",
|
|
60
|
+
)
|
|
61
|
+
labwareId: str | SkipJsonSchema[None] = Field(
|
|
62
|
+
None,
|
|
63
|
+
description="Do not use. Present for internal backward compatibility.",
|
|
64
|
+
json_schema_extra=_remove_default,
|
|
65
|
+
)
|
|
66
|
+
displayName: str | SkipJsonSchema[None] = Field(
|
|
67
|
+
None,
|
|
68
|
+
description="Do not use. Present for internal backward compatibility.",
|
|
69
|
+
json_schema_extra=_remove_default,
|
|
70
|
+
)
|
|
71
|
+
adapterId: str | SkipJsonSchema[None] = Field(
|
|
72
|
+
None,
|
|
73
|
+
description="Do not use. Present for internal backward compatibility.",
|
|
74
|
+
json_schema_extra=_remove_default,
|
|
75
|
+
)
|
|
76
|
+
lidId: str | SkipJsonSchema[None] = Field(
|
|
77
|
+
None,
|
|
78
|
+
description="Do not use. Present for internal backward compatibility.",
|
|
79
|
+
json_schema_extra=_remove_default,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class UnsafeFlexStackerManualRetrieveResult(BaseModel):
|
|
84
|
+
"""Result data from a labware retrieval command."""
|
|
85
|
+
|
|
86
|
+
labwareId: str = Field(
|
|
87
|
+
...,
|
|
88
|
+
description="The labware ID of the primary retrieved labware.",
|
|
89
|
+
)
|
|
90
|
+
adapterId: str | None = Field(
|
|
91
|
+
None,
|
|
92
|
+
description="The optional Adapter Labware ID of the adapter under a primary labware.",
|
|
93
|
+
)
|
|
94
|
+
lidId: str | None = Field(
|
|
95
|
+
None,
|
|
96
|
+
description="The optional Lid Labware ID of the lid on a primary labware.",
|
|
97
|
+
)
|
|
98
|
+
primaryLocationSequence: LabwareLocationSequence = Field(
|
|
99
|
+
..., description="The origin location of the primary labware."
|
|
100
|
+
)
|
|
101
|
+
lidLocationSequence: LabwareLocationSequence | None = Field(
|
|
102
|
+
None,
|
|
103
|
+
description="The origin location of the adapter labware under a primary labware.",
|
|
104
|
+
)
|
|
105
|
+
adapterLocationSequence: LabwareLocationSequence | None = Field(
|
|
106
|
+
None, description="The origin location of the lid labware on a primary labware."
|
|
107
|
+
)
|
|
108
|
+
originalPrimaryLocationSequence: LabwareLocationSequence = Field(
|
|
109
|
+
..., description="The original location of the just-retrieved primary labware"
|
|
110
|
+
)
|
|
111
|
+
originalAdapterLocationSequence: LabwareLocationSequence | None = Field(
|
|
112
|
+
None, description="The original location of an adapter labware if any"
|
|
113
|
+
)
|
|
114
|
+
originalLidLocationSequence: LabwareLocationSequence | None = Field(
|
|
115
|
+
None, description="The original location of a lid labware if any"
|
|
116
|
+
)
|
|
117
|
+
primaryLabwareURI: str = Field(
|
|
118
|
+
...,
|
|
119
|
+
description="The labware definition URI of the primary labware.",
|
|
120
|
+
)
|
|
121
|
+
adapterLabwareURI: str | None = Field(
|
|
122
|
+
None,
|
|
123
|
+
description="The labware definition URI of the adapter labware.",
|
|
124
|
+
)
|
|
125
|
+
lidLabwareURI: str | None = Field(
|
|
126
|
+
None,
|
|
127
|
+
description="The labware definition URI of the lid labware.",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
_ExecuteReturn = Union[
|
|
132
|
+
SuccessData[UnsafeFlexStackerManualRetrieveResult],
|
|
133
|
+
DefinedErrorData[FlexStackerStallOrCollisionError],
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class UnsafeFlexStackerManualRetrieveImpl(
|
|
138
|
+
AbstractCommandImpl[UnsafeFlexStackerManualRetrieveParams, _ExecuteReturn]
|
|
139
|
+
):
|
|
140
|
+
"""Implementation of a labware retrieval command."""
|
|
141
|
+
|
|
142
|
+
def __init__(
|
|
143
|
+
self,
|
|
144
|
+
state_view: StateView,
|
|
145
|
+
equipment: EquipmentHandler,
|
|
146
|
+
model_utils: ModelUtils,
|
|
147
|
+
**kwargs: object,
|
|
148
|
+
) -> None:
|
|
149
|
+
self._state_view = state_view
|
|
150
|
+
self._equipment = equipment
|
|
151
|
+
self._model_utils = model_utils
|
|
152
|
+
|
|
153
|
+
async def execute(
|
|
154
|
+
self, params: UnsafeFlexStackerManualRetrieveParams
|
|
155
|
+
) -> _ExecuteReturn:
|
|
156
|
+
"""Execute the labware retrieval command."""
|
|
157
|
+
stacker_state = self._state_view.modules.get_flex_stacker_substate(
|
|
158
|
+
params.moduleId
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
pool_definitions = stacker_state.get_pool_definition_ordered_list()
|
|
162
|
+
location = self._state_view.modules.get_location(params.moduleId)
|
|
163
|
+
if pool_definitions is None:
|
|
164
|
+
raise FlexStackerLabwarePoolNotYetDefinedError(
|
|
165
|
+
message=f"The Flex Stacker in {location} has not been configured yet and cannot be filled."
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
if len(stacker_state.contained_labware_bottom_first) == 0:
|
|
169
|
+
raise CannotPerformModuleAction(
|
|
170
|
+
message=f"Cannot retrieve labware from Flex Stacker in {location} because it contains no labware"
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
stacker_loc = ModuleLocation(moduleId=params.moduleId)
|
|
174
|
+
# Allow propagation of ModuleNotAttachedError.
|
|
175
|
+
stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
|
|
176
|
+
|
|
177
|
+
# Validate that the stacker is fully in the gripper position
|
|
178
|
+
if stacker_hw:
|
|
179
|
+
stacker_hw.set_stacker_identify(True)
|
|
180
|
+
if stacker_hw.platform_state != PlatformState.EXTENDED:
|
|
181
|
+
raise CannotPerformModuleAction(
|
|
182
|
+
f"Cannot manually retrieve a labware from Flex Stacker in {location} if the carriage is not in gripper position."
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
# In theory given this is an unsafe manual retrieve this should never raise
|
|
187
|
+
self._state_view.labware.raise_if_labware_in_location(stacker_loc)
|
|
188
|
+
except LocationIsOccupiedError:
|
|
189
|
+
raise CannotPerformModuleAction(
|
|
190
|
+
f"Cannot retrieve a labware from Flex Stacker in {location} if the carriage is occupied"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
to_retrieve = stacker_state.contained_labware_bottom_first[0]
|
|
194
|
+
remaining = stacker_state.contained_labware_bottom_first[1:]
|
|
195
|
+
|
|
196
|
+
locations, offsets = build_retrieve_labware_move_updates(
|
|
197
|
+
to_retrieve, stacker_state, self._state_view
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# Update the state to reflect the labware is now in the Flex Stacker slot
|
|
201
|
+
# todo(chb, 2025-02-19): This ModuleLocation piece should probably instead be an AddressableAreaLocation
|
|
202
|
+
# but that has implications for where labware are set by things like module.load_labware(..) and what
|
|
203
|
+
# happens when we move labware.
|
|
204
|
+
stacker_area = (
|
|
205
|
+
self._state_view.modules.ensure_and_convert_module_fixture_location(
|
|
206
|
+
deck_slot=self._state_view.modules.get_location(
|
|
207
|
+
params.moduleId
|
|
208
|
+
).slotName,
|
|
209
|
+
model=self._state_view.modules.get(params.moduleId).model,
|
|
210
|
+
)
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
original_locations = labware_locations_for_group(
|
|
214
|
+
to_retrieve,
|
|
215
|
+
self._state_view.geometry.get_predicted_location_sequence(
|
|
216
|
+
InStackerHopperLocation(moduleId=params.moduleId)
|
|
217
|
+
),
|
|
218
|
+
)
|
|
219
|
+
new_locations = labware_locations_for_group(
|
|
220
|
+
to_retrieve,
|
|
221
|
+
self._state_view.geometry.get_predicted_location_sequence(
|
|
222
|
+
ModuleLocation(moduleId=params.moduleId)
|
|
223
|
+
),
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
if stacker_hw is not None:
|
|
227
|
+
stacker_hw.set_stacker_identify(False)
|
|
228
|
+
|
|
229
|
+
return SuccessData(
|
|
230
|
+
public=UnsafeFlexStackerManualRetrieveResult(
|
|
231
|
+
labwareId=to_retrieve.primaryLabwareId,
|
|
232
|
+
adapterId=to_retrieve.adapterLabwareId,
|
|
233
|
+
lidId=to_retrieve.lidLabwareId,
|
|
234
|
+
primaryLocationSequence=primary_location_sequence(new_locations),
|
|
235
|
+
adapterLocationSequence=adapter_location_sequence(new_locations),
|
|
236
|
+
lidLocationSequence=lid_location_sequence(new_locations),
|
|
237
|
+
originalPrimaryLocationSequence=primary_location_sequence(
|
|
238
|
+
original_locations
|
|
239
|
+
),
|
|
240
|
+
originalAdapterLocationSequence=adapter_location_sequence(
|
|
241
|
+
original_locations
|
|
242
|
+
),
|
|
243
|
+
originalLidLocationSequence=lid_location_sequence(original_locations),
|
|
244
|
+
primaryLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
|
|
245
|
+
cast(LabwareDefinition, stacker_state.pool_primary_definition)
|
|
246
|
+
),
|
|
247
|
+
adapterLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
|
|
248
|
+
stacker_state.pool_adapter_definition
|
|
249
|
+
),
|
|
250
|
+
lidLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
|
|
251
|
+
stacker_state.pool_lid_definition
|
|
252
|
+
),
|
|
253
|
+
),
|
|
254
|
+
state_update=(
|
|
255
|
+
update_types.StateUpdate()
|
|
256
|
+
.set_batch_labware_location(
|
|
257
|
+
new_locations_by_id=locations, new_offset_ids_by_id=offsets
|
|
258
|
+
)
|
|
259
|
+
.update_flex_stacker_contained_labware(params.moduleId, remaining)
|
|
260
|
+
.set_addressable_area_used(stacker_area)
|
|
261
|
+
),
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class UnsafeFlexStackerManualRetrieve(
|
|
266
|
+
BaseCommand[
|
|
267
|
+
UnsafeFlexStackerManualRetrieveParams,
|
|
268
|
+
UnsafeFlexStackerManualRetrieveResult,
|
|
269
|
+
ErrorOccurrence,
|
|
270
|
+
]
|
|
271
|
+
):
|
|
272
|
+
"""A command to manually retrieve a labware from a Flex Stacker."""
|
|
273
|
+
|
|
274
|
+
commandType: UnsafeFlexStackerManualRetrieveCommandType = (
|
|
275
|
+
"unsafe/flexStacker/manualRetrieve"
|
|
276
|
+
)
|
|
277
|
+
params: UnsafeFlexStackerManualRetrieveParams
|
|
278
|
+
result: UnsafeFlexStackerManualRetrieveResult | None = None
|
|
279
|
+
|
|
280
|
+
_ImplementationCls: Type[
|
|
281
|
+
UnsafeFlexStackerManualRetrieveImpl
|
|
282
|
+
] = UnsafeFlexStackerManualRetrieveImpl
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
class UnsafeFlexStackerManualRetrieveCreate(
|
|
286
|
+
BaseCommandCreate[UnsafeFlexStackerManualRetrieveParams]
|
|
287
|
+
):
|
|
288
|
+
"""A request to execute a Flex Stacker manual retrieve command."""
|
|
289
|
+
|
|
290
|
+
commandType: UnsafeFlexStackerManualRetrieveCommandType = (
|
|
291
|
+
"unsafe/flexStacker/manualRetrieve"
|
|
292
|
+
)
|
|
293
|
+
params: UnsafeFlexStackerManualRetrieveParams
|
|
294
|
+
|
|
295
|
+
_CommandCls: Type[UnsafeFlexStackerManualRetrieve] = UnsafeFlexStackerManualRetrieve
|