opentrons 8.6.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +501 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +183 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +215 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1115 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +396 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1025 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3212 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1425 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +349 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +58 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1158 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2359 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1459 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1500 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +308 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +303 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +848 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0a1.dist-info/METADATA +37 -0
- opentrons-8.6.0a1.dist-info/RECORD +600 -0
- opentrons-8.6.0a1.dist-info/WHEEL +4 -0
- opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"""Move to addressable area command request, result, and implementation models."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from pydantic import Field
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
|
|
7
|
+
from opentrons_shared_data.pipette.types import PipetteNameType
|
|
8
|
+
|
|
9
|
+
from ..errors import LocationNotAccessibleByPipetteError
|
|
10
|
+
from ..types import AddressableOffsetVector
|
|
11
|
+
from ..resources import fixture_validation
|
|
12
|
+
from .pipetting_common import (
|
|
13
|
+
PipetteIdMixin,
|
|
14
|
+
)
|
|
15
|
+
from .movement_common import (
|
|
16
|
+
MovementMixin,
|
|
17
|
+
DestinationPositionResult,
|
|
18
|
+
move_to_addressable_area,
|
|
19
|
+
StallOrCollisionError,
|
|
20
|
+
)
|
|
21
|
+
from .command import (
|
|
22
|
+
AbstractCommandImpl,
|
|
23
|
+
BaseCommand,
|
|
24
|
+
BaseCommandCreate,
|
|
25
|
+
SuccessData,
|
|
26
|
+
DefinedErrorData,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from ..execution import MovementHandler
|
|
31
|
+
from ..state.state import StateView
|
|
32
|
+
from ..resources.model_utils import ModelUtils
|
|
33
|
+
|
|
34
|
+
MoveToAddressableAreaCommandType = Literal["moveToAddressableArea"]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class MoveToAddressableAreaParams(PipetteIdMixin, MovementMixin):
|
|
38
|
+
"""Payload required to move a pipette to a specific addressable area.
|
|
39
|
+
|
|
40
|
+
An *addressable area* is a space in the robot that may or may not be usable depending on how
|
|
41
|
+
the robot's deck is configured. For example, if a Flex is configured with a waste chute, it will
|
|
42
|
+
have additional addressable areas representing the opening of the waste chute, where tips and
|
|
43
|
+
labware can be dropped.
|
|
44
|
+
|
|
45
|
+
This moves the pipette so all of its nozzles are centered over the addressable area.
|
|
46
|
+
If the pipette is currently configured with a partial tip layout, this centering is over all
|
|
47
|
+
the pipette's physical nozzles, not just the nozzles that are active.
|
|
48
|
+
|
|
49
|
+
The z-position will be chosen to put the bottom of the tips---or the bottom of the nozzles,
|
|
50
|
+
if there are no tips---level with the top of the addressable area.
|
|
51
|
+
|
|
52
|
+
When this command is executed, Protocol Engine will make sure the robot's deck is configured
|
|
53
|
+
such that the requested addressable area actually exists. For example, if you request
|
|
54
|
+
the addressable area B4, it will make sure the robot is set up with a B3/B4 staging area slot.
|
|
55
|
+
If that's not the case, the command will fail.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
addressableAreaName: str = Field(
|
|
59
|
+
...,
|
|
60
|
+
description=(
|
|
61
|
+
"The name of the addressable area that you want to use."
|
|
62
|
+
" Valid values are the `id`s of `addressableArea`s in the"
|
|
63
|
+
" [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)."
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
offset: AddressableOffsetVector = Field(
|
|
67
|
+
AddressableOffsetVector(x=0, y=0, z=0),
|
|
68
|
+
description="Relative offset of addressable area to move pipette's critical point.",
|
|
69
|
+
)
|
|
70
|
+
stayAtHighestPossibleZ: bool = Field(
|
|
71
|
+
False,
|
|
72
|
+
description=(
|
|
73
|
+
"If `true`, the pipette will retract to its highest possible height"
|
|
74
|
+
" and stay there instead of descending to the destination."
|
|
75
|
+
" `minimumZHeight` will be ignored."
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class MoveToAddressableAreaResult(DestinationPositionResult):
|
|
81
|
+
"""Result data from the execution of a MoveToAddressableArea command."""
|
|
82
|
+
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
_ExecuteReturn = (
|
|
87
|
+
SuccessData[MoveToAddressableAreaResult] | DefinedErrorData[StallOrCollisionError]
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class MoveToAddressableAreaImplementation(
|
|
92
|
+
AbstractCommandImpl[MoveToAddressableAreaParams, _ExecuteReturn]
|
|
93
|
+
):
|
|
94
|
+
"""Move to addressable area command implementation."""
|
|
95
|
+
|
|
96
|
+
def __init__(
|
|
97
|
+
self,
|
|
98
|
+
movement: MovementHandler,
|
|
99
|
+
state_view: StateView,
|
|
100
|
+
model_utils: ModelUtils,
|
|
101
|
+
**kwargs: object,
|
|
102
|
+
) -> None:
|
|
103
|
+
self._movement = movement
|
|
104
|
+
self._state_view = state_view
|
|
105
|
+
self._model_utils = model_utils
|
|
106
|
+
|
|
107
|
+
async def execute(self, params: MoveToAddressableAreaParams) -> _ExecuteReturn:
|
|
108
|
+
"""Move the requested pipette to the requested addressable area."""
|
|
109
|
+
self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
|
|
110
|
+
params.addressableAreaName
|
|
111
|
+
)
|
|
112
|
+
loaded_pipette = self._state_view.pipettes.get(params.pipetteId)
|
|
113
|
+
if loaded_pipette.pipetteName in (
|
|
114
|
+
PipetteNameType.P10_SINGLE,
|
|
115
|
+
PipetteNameType.P10_MULTI,
|
|
116
|
+
PipetteNameType.P50_MULTI,
|
|
117
|
+
PipetteNameType.P50_SINGLE,
|
|
118
|
+
PipetteNameType.P300_SINGLE,
|
|
119
|
+
PipetteNameType.P300_MULTI,
|
|
120
|
+
PipetteNameType.P1000_SINGLE,
|
|
121
|
+
):
|
|
122
|
+
extra_z_offset: Optional[float] = 5.0
|
|
123
|
+
else:
|
|
124
|
+
extra_z_offset = None
|
|
125
|
+
|
|
126
|
+
if fixture_validation.is_staging_slot(params.addressableAreaName):
|
|
127
|
+
raise LocationNotAccessibleByPipetteError(
|
|
128
|
+
f"Cannot move pipette to staging slot {params.addressableAreaName}"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
result = await move_to_addressable_area(
|
|
132
|
+
movement=self._movement,
|
|
133
|
+
model_utils=self._model_utils,
|
|
134
|
+
pipette_id=params.pipetteId,
|
|
135
|
+
addressable_area_name=params.addressableAreaName,
|
|
136
|
+
offset=params.offset,
|
|
137
|
+
force_direct=params.forceDirect,
|
|
138
|
+
minimum_z_height=params.minimumZHeight,
|
|
139
|
+
speed=params.speed,
|
|
140
|
+
stay_at_highest_possible_z=params.stayAtHighestPossibleZ,
|
|
141
|
+
highest_possible_z_extra_offset=extra_z_offset,
|
|
142
|
+
)
|
|
143
|
+
if isinstance(result, DefinedErrorData):
|
|
144
|
+
return result
|
|
145
|
+
else:
|
|
146
|
+
return SuccessData(
|
|
147
|
+
public=MoveToAddressableAreaResult(position=result.public.position),
|
|
148
|
+
state_update=result.state_update,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class MoveToAddressableArea(
|
|
153
|
+
BaseCommand[
|
|
154
|
+
MoveToAddressableAreaParams,
|
|
155
|
+
MoveToAddressableAreaResult,
|
|
156
|
+
StallOrCollisionError,
|
|
157
|
+
]
|
|
158
|
+
):
|
|
159
|
+
"""Move to addressable area command model."""
|
|
160
|
+
|
|
161
|
+
commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea"
|
|
162
|
+
params: MoveToAddressableAreaParams
|
|
163
|
+
result: Optional[MoveToAddressableAreaResult] = None
|
|
164
|
+
|
|
165
|
+
_ImplementationCls: Type[
|
|
166
|
+
MoveToAddressableAreaImplementation
|
|
167
|
+
] = MoveToAddressableAreaImplementation
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class MoveToAddressableAreaCreate(BaseCommandCreate[MoveToAddressableAreaParams]):
|
|
171
|
+
"""Move to addressable area command creation request model."""
|
|
172
|
+
|
|
173
|
+
commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea"
|
|
174
|
+
params: MoveToAddressableAreaParams
|
|
175
|
+
|
|
176
|
+
_CommandCls: Type[MoveToAddressableArea] = MoveToAddressableArea
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Move to addressable area for drop tip command request, result, and implementation models."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import TYPE_CHECKING, Optional, Type, Any
|
|
4
|
+
from typing_extensions import Literal
|
|
5
|
+
|
|
6
|
+
from pydantic import Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
|
|
9
|
+
from ..errors import LocationNotAccessibleByPipetteError
|
|
10
|
+
from ..types import AddressableOffsetVector
|
|
11
|
+
from ..resources import fixture_validation
|
|
12
|
+
from .pipetting_common import (
|
|
13
|
+
PipetteIdMixin,
|
|
14
|
+
)
|
|
15
|
+
from .movement_common import (
|
|
16
|
+
MovementMixin,
|
|
17
|
+
DestinationPositionResult,
|
|
18
|
+
move_to_addressable_area,
|
|
19
|
+
StallOrCollisionError,
|
|
20
|
+
)
|
|
21
|
+
from .command import (
|
|
22
|
+
AbstractCommandImpl,
|
|
23
|
+
BaseCommand,
|
|
24
|
+
BaseCommandCreate,
|
|
25
|
+
SuccessData,
|
|
26
|
+
DefinedErrorData,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from ..execution import MovementHandler
|
|
31
|
+
from ..state.state import StateView
|
|
32
|
+
from ..resources.model_utils import ModelUtils
|
|
33
|
+
|
|
34
|
+
MoveToAddressableAreaForDropTipCommandType = Literal["moveToAddressableAreaForDropTip"]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
38
|
+
s.pop("default", None)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin):
|
|
42
|
+
"""Payload required to move a pipette to a specific addressable area.
|
|
43
|
+
|
|
44
|
+
An *addressable area* is a space in the robot that may or may not be usable depending on how
|
|
45
|
+
the robot's deck is configured. For example, if a Flex is configured with a waste chute, it will
|
|
46
|
+
have additional addressable areas representing the opening of the waste chute, where tips and
|
|
47
|
+
labware can be dropped.
|
|
48
|
+
|
|
49
|
+
This moves the pipette so all of its nozzles are centered over the addressable area.
|
|
50
|
+
If the pipette is currently configured with a partial tip layout, this centering is over all
|
|
51
|
+
the pipette's physical nozzles, not just the nozzles that are active.
|
|
52
|
+
|
|
53
|
+
The z-position will be chosen to put the bottom of the tips---or the bottom of the nozzles,
|
|
54
|
+
if there are no tips---level with the top of the addressable area.
|
|
55
|
+
|
|
56
|
+
When this command is executed, Protocol Engine will make sure the robot's deck is configured
|
|
57
|
+
such that the requested addressable area actually exists. For example, if you request
|
|
58
|
+
the addressable area B4, it will make sure the robot is set up with a B3/B4 staging area slot.
|
|
59
|
+
If that's not the case, the command will fail.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
addressableAreaName: str = Field(
|
|
63
|
+
...,
|
|
64
|
+
description=(
|
|
65
|
+
"The name of the addressable area that you want to use."
|
|
66
|
+
" Valid values are the `id`s of `addressableArea`s in the"
|
|
67
|
+
" [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)."
|
|
68
|
+
),
|
|
69
|
+
)
|
|
70
|
+
offset: AddressableOffsetVector = Field(
|
|
71
|
+
AddressableOffsetVector(x=0, y=0, z=0),
|
|
72
|
+
description="Relative offset of addressable area to move pipette's critical point.",
|
|
73
|
+
)
|
|
74
|
+
alternateDropLocation: bool | SkipJsonSchema[None] = Field(
|
|
75
|
+
False,
|
|
76
|
+
description=(
|
|
77
|
+
"Whether to alternate location where tip is dropped within the addressable area."
|
|
78
|
+
" If True, this command will ignore the offset provided and alternate"
|
|
79
|
+
" between dropping tips at two predetermined locations inside the specified"
|
|
80
|
+
" labware well."
|
|
81
|
+
" If False, the tip will be dropped at the top center of the area."
|
|
82
|
+
),
|
|
83
|
+
json_schema_extra=_remove_default,
|
|
84
|
+
)
|
|
85
|
+
ignoreTipConfiguration: bool | SkipJsonSchema[None] = Field(
|
|
86
|
+
True,
|
|
87
|
+
description=(
|
|
88
|
+
"Whether to utilize the critical point of the tip configuraiton when moving to an addressable area."
|
|
89
|
+
" If True, this command will ignore the tip configuration and use the center of the entire instrument"
|
|
90
|
+
" as the critical point for movement."
|
|
91
|
+
" If False, this command will use the critical point provided by the current tip configuration."
|
|
92
|
+
),
|
|
93
|
+
json_schema_extra=_remove_default,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class MoveToAddressableAreaForDropTipResult(DestinationPositionResult):
|
|
98
|
+
"""Result data from the execution of a MoveToAddressableAreaForDropTip command."""
|
|
99
|
+
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
_ExecuteReturn = (
|
|
104
|
+
SuccessData[MoveToAddressableAreaForDropTipResult]
|
|
105
|
+
| DefinedErrorData[StallOrCollisionError]
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class MoveToAddressableAreaForDropTipImplementation(
|
|
110
|
+
AbstractCommandImpl[MoveToAddressableAreaForDropTipParams, _ExecuteReturn]
|
|
111
|
+
):
|
|
112
|
+
"""Move to addressable area for drop tip command implementation."""
|
|
113
|
+
|
|
114
|
+
def __init__(
|
|
115
|
+
self,
|
|
116
|
+
movement: MovementHandler,
|
|
117
|
+
state_view: StateView,
|
|
118
|
+
model_utils: ModelUtils,
|
|
119
|
+
**kwargs: object,
|
|
120
|
+
) -> None:
|
|
121
|
+
self._movement = movement
|
|
122
|
+
self._state_view = state_view
|
|
123
|
+
self._model_utils = model_utils
|
|
124
|
+
|
|
125
|
+
async def execute(
|
|
126
|
+
self, params: MoveToAddressableAreaForDropTipParams
|
|
127
|
+
) -> _ExecuteReturn:
|
|
128
|
+
"""Move the requested pipette to the requested addressable area in preperation of a drop tip."""
|
|
129
|
+
self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
|
|
130
|
+
params.addressableAreaName
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
if fixture_validation.is_staging_slot(params.addressableAreaName):
|
|
134
|
+
raise LocationNotAccessibleByPipetteError(
|
|
135
|
+
f"Cannot move pipette to staging slot {params.addressableAreaName}"
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
if params.alternateDropLocation:
|
|
139
|
+
offset = self._state_view.geometry.get_next_tip_drop_location_for_addressable_area(
|
|
140
|
+
addressable_area_name=params.addressableAreaName,
|
|
141
|
+
pipette_id=params.pipetteId,
|
|
142
|
+
)
|
|
143
|
+
else:
|
|
144
|
+
offset = params.offset
|
|
145
|
+
|
|
146
|
+
result = await move_to_addressable_area(
|
|
147
|
+
movement=self._movement,
|
|
148
|
+
model_utils=self._model_utils,
|
|
149
|
+
pipette_id=params.pipetteId,
|
|
150
|
+
addressable_area_name=params.addressableAreaName,
|
|
151
|
+
offset=offset,
|
|
152
|
+
force_direct=params.forceDirect,
|
|
153
|
+
minimum_z_height=params.minimumZHeight,
|
|
154
|
+
speed=params.speed,
|
|
155
|
+
ignore_tip_configuration=params.ignoreTipConfiguration,
|
|
156
|
+
)
|
|
157
|
+
if isinstance(result, DefinedErrorData):
|
|
158
|
+
return result
|
|
159
|
+
else:
|
|
160
|
+
return SuccessData(
|
|
161
|
+
public=MoveToAddressableAreaForDropTipResult(
|
|
162
|
+
position=result.public.position,
|
|
163
|
+
),
|
|
164
|
+
state_update=result.state_update,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class MoveToAddressableAreaForDropTip(
|
|
169
|
+
BaseCommand[
|
|
170
|
+
MoveToAddressableAreaForDropTipParams,
|
|
171
|
+
MoveToAddressableAreaForDropTipResult,
|
|
172
|
+
StallOrCollisionError,
|
|
173
|
+
]
|
|
174
|
+
):
|
|
175
|
+
"""Move to addressable area for drop tip command model."""
|
|
176
|
+
|
|
177
|
+
commandType: MoveToAddressableAreaForDropTipCommandType = (
|
|
178
|
+
"moveToAddressableAreaForDropTip"
|
|
179
|
+
)
|
|
180
|
+
params: MoveToAddressableAreaForDropTipParams
|
|
181
|
+
result: Optional[MoveToAddressableAreaForDropTipResult] = None
|
|
182
|
+
|
|
183
|
+
_ImplementationCls: Type[
|
|
184
|
+
MoveToAddressableAreaForDropTipImplementation
|
|
185
|
+
] = MoveToAddressableAreaForDropTipImplementation
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class MoveToAddressableAreaForDropTipCreate(
|
|
189
|
+
BaseCommandCreate[MoveToAddressableAreaForDropTipParams]
|
|
190
|
+
):
|
|
191
|
+
"""Move to addressable area for drop tip command creation request model."""
|
|
192
|
+
|
|
193
|
+
commandType: MoveToAddressableAreaForDropTipCommandType = (
|
|
194
|
+
"moveToAddressableAreaForDropTip"
|
|
195
|
+
)
|
|
196
|
+
params: MoveToAddressableAreaForDropTipParams
|
|
197
|
+
|
|
198
|
+
_CommandCls: Type[MoveToAddressableAreaForDropTip] = MoveToAddressableAreaForDropTip
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Move to coordinates command request, result, and implementation models."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from pydantic import Field
|
|
5
|
+
from typing import Optional, Type, TYPE_CHECKING
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
from ..types import DeckPoint
|
|
10
|
+
from .pipetting_common import PipetteIdMixin
|
|
11
|
+
from .movement_common import (
|
|
12
|
+
MovementMixin,
|
|
13
|
+
DestinationPositionResult,
|
|
14
|
+
move_to_coordinates,
|
|
15
|
+
StallOrCollisionError,
|
|
16
|
+
)
|
|
17
|
+
from .command import (
|
|
18
|
+
AbstractCommandImpl,
|
|
19
|
+
BaseCommand,
|
|
20
|
+
BaseCommandCreate,
|
|
21
|
+
SuccessData,
|
|
22
|
+
DefinedErrorData,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from ..execution import MovementHandler
|
|
27
|
+
from ..resources.model_utils import ModelUtils
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
MoveToCoordinatesCommandType = Literal["moveToCoordinates"]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class MoveToCoordinatesParams(PipetteIdMixin, MovementMixin):
|
|
34
|
+
"""Payload required to move a pipette to coordinates."""
|
|
35
|
+
|
|
36
|
+
coordinates: DeckPoint = Field(
|
|
37
|
+
...,
|
|
38
|
+
description="X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class MoveToCoordinatesResult(DestinationPositionResult):
|
|
43
|
+
"""Result data from the execution of a MoveToCoordinates command."""
|
|
44
|
+
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
_ExecuteReturn = (
|
|
49
|
+
SuccessData[MoveToCoordinatesResult] | DefinedErrorData[StallOrCollisionError]
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class MoveToCoordinatesImplementation(
|
|
54
|
+
AbstractCommandImpl[MoveToCoordinatesParams, _ExecuteReturn]
|
|
55
|
+
):
|
|
56
|
+
"""Move to coordinates command implementation."""
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
movement: MovementHandler,
|
|
61
|
+
model_utils: ModelUtils,
|
|
62
|
+
**kwargs: object,
|
|
63
|
+
) -> None:
|
|
64
|
+
self._movement = movement
|
|
65
|
+
self._model_utils = model_utils
|
|
66
|
+
|
|
67
|
+
async def execute(self, params: MoveToCoordinatesParams) -> _ExecuteReturn:
|
|
68
|
+
"""Move the requested pipette to the requested coordinates."""
|
|
69
|
+
result = await move_to_coordinates(
|
|
70
|
+
movement=self._movement,
|
|
71
|
+
model_utils=self._model_utils,
|
|
72
|
+
pipette_id=params.pipetteId,
|
|
73
|
+
deck_coordinates=params.coordinates,
|
|
74
|
+
direct=params.forceDirect,
|
|
75
|
+
additional_min_travel_z=params.minimumZHeight,
|
|
76
|
+
speed=params.speed,
|
|
77
|
+
)
|
|
78
|
+
if isinstance(result, DefinedErrorData):
|
|
79
|
+
return result
|
|
80
|
+
else:
|
|
81
|
+
return SuccessData(
|
|
82
|
+
public=MoveToCoordinatesResult(position=result.public.position),
|
|
83
|
+
state_update=result.state_update,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class MoveToCoordinates(
|
|
88
|
+
BaseCommand[MoveToCoordinatesParams, MoveToCoordinatesResult, StallOrCollisionError]
|
|
89
|
+
):
|
|
90
|
+
"""Move to well command model."""
|
|
91
|
+
|
|
92
|
+
commandType: MoveToCoordinatesCommandType = "moveToCoordinates"
|
|
93
|
+
params: MoveToCoordinatesParams
|
|
94
|
+
result: Optional[MoveToCoordinatesResult] = None
|
|
95
|
+
|
|
96
|
+
_ImplementationCls: Type[
|
|
97
|
+
MoveToCoordinatesImplementation
|
|
98
|
+
] = MoveToCoordinatesImplementation
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class MoveToCoordinatesCreate(BaseCommandCreate[MoveToCoordinatesParams]):
|
|
102
|
+
"""Move to coordinates command creation request model."""
|
|
103
|
+
|
|
104
|
+
commandType: MoveToCoordinatesCommandType = "moveToCoordinates"
|
|
105
|
+
params: MoveToCoordinatesParams
|
|
106
|
+
|
|
107
|
+
_CommandCls: Type[MoveToCoordinates] = MoveToCoordinates
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Move to well command request, result, and implementation models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
|
|
7
|
+
from .pipetting_common import (
|
|
8
|
+
PipetteIdMixin,
|
|
9
|
+
)
|
|
10
|
+
from .movement_common import (
|
|
11
|
+
LiquidHandlingWellLocationMixin,
|
|
12
|
+
MovementMixin,
|
|
13
|
+
DestinationPositionResult,
|
|
14
|
+
StallOrCollisionError,
|
|
15
|
+
move_to_well,
|
|
16
|
+
)
|
|
17
|
+
from .command import (
|
|
18
|
+
AbstractCommandImpl,
|
|
19
|
+
BaseCommand,
|
|
20
|
+
BaseCommandCreate,
|
|
21
|
+
SuccessData,
|
|
22
|
+
DefinedErrorData,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from ..execution import MovementHandler
|
|
27
|
+
from ..state.state import StateView
|
|
28
|
+
from ..resources.model_utils import ModelUtils
|
|
29
|
+
|
|
30
|
+
MoveToWellCommandType = Literal["moveToWell"]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class MoveToWellParams(PipetteIdMixin, LiquidHandlingWellLocationMixin, MovementMixin):
|
|
34
|
+
"""Payload required to move a pipette to a specific well."""
|
|
35
|
+
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MoveToWellResult(DestinationPositionResult):
|
|
40
|
+
"""Result data from the execution of a MoveToWell command."""
|
|
41
|
+
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class MoveToWellImplementation(
|
|
46
|
+
AbstractCommandImpl[
|
|
47
|
+
MoveToWellParams,
|
|
48
|
+
SuccessData[MoveToWellResult] | DefinedErrorData[StallOrCollisionError],
|
|
49
|
+
]
|
|
50
|
+
):
|
|
51
|
+
"""Move to well command implementation."""
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
state_view: StateView,
|
|
56
|
+
movement: MovementHandler,
|
|
57
|
+
model_utils: ModelUtils,
|
|
58
|
+
**kwargs: object,
|
|
59
|
+
) -> None:
|
|
60
|
+
self._state_view = state_view
|
|
61
|
+
self._movement = movement
|
|
62
|
+
self._model_utils = model_utils
|
|
63
|
+
|
|
64
|
+
async def execute(
|
|
65
|
+
self, params: MoveToWellParams
|
|
66
|
+
) -> SuccessData[MoveToWellResult] | DefinedErrorData[StallOrCollisionError]:
|
|
67
|
+
"""Move the requested pipette to the requested well."""
|
|
68
|
+
pipette_id = params.pipetteId
|
|
69
|
+
labware_id = params.labwareId
|
|
70
|
+
well_name = params.wellName
|
|
71
|
+
well_location = params.wellLocation
|
|
72
|
+
# TODO(cm): implement move_to_well with meniscus + volume offset
|
|
73
|
+
if well_location.volumeOffset:
|
|
74
|
+
if (
|
|
75
|
+
well_location.volumeOffset != 0
|
|
76
|
+
and well_location.volumeOffset != "operationVolume"
|
|
77
|
+
):
|
|
78
|
+
raise ValueError("volume offset not supported with MoveToWell")
|
|
79
|
+
|
|
80
|
+
move_result = await move_to_well(
|
|
81
|
+
model_utils=self._model_utils,
|
|
82
|
+
movement=self._movement,
|
|
83
|
+
pipette_id=pipette_id,
|
|
84
|
+
labware_id=labware_id,
|
|
85
|
+
well_name=well_name,
|
|
86
|
+
well_location=well_location,
|
|
87
|
+
force_direct=params.forceDirect,
|
|
88
|
+
minimum_z_height=params.minimumZHeight,
|
|
89
|
+
speed=params.speed,
|
|
90
|
+
operation_volume=None,
|
|
91
|
+
)
|
|
92
|
+
if isinstance(move_result, DefinedErrorData):
|
|
93
|
+
return move_result
|
|
94
|
+
else:
|
|
95
|
+
return SuccessData(
|
|
96
|
+
public=MoveToWellResult(position=move_result.public.position),
|
|
97
|
+
state_update=move_result.state_update,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class MoveToWell(
|
|
102
|
+
BaseCommand[MoveToWellParams, MoveToWellResult, StallOrCollisionError]
|
|
103
|
+
):
|
|
104
|
+
"""Move to well command model."""
|
|
105
|
+
|
|
106
|
+
commandType: MoveToWellCommandType = "moveToWell"
|
|
107
|
+
params: MoveToWellParams
|
|
108
|
+
result: Optional[MoveToWellResult] = None
|
|
109
|
+
|
|
110
|
+
_ImplementationCls: Type[MoveToWellImplementation] = MoveToWellImplementation
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class MoveToWellCreate(BaseCommandCreate[MoveToWellParams]):
|
|
114
|
+
"""Move to well command creation request model."""
|
|
115
|
+
|
|
116
|
+
commandType: MoveToWellCommandType = "moveToWell"
|
|
117
|
+
params: MoveToWellParams
|
|
118
|
+
|
|
119
|
+
_CommandCls: Type[MoveToWell] = MoveToWell
|