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,89 @@
|
|
|
1
|
+
"""Command models to wait for heating a Thermocycler's lid."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, TYPE_CHECKING
|
|
4
|
+
from typing_extensions import Literal, Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
9
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
13
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
WaitForLidTemperatureCommandType = Literal["thermocycler/waitForLidTemperature"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WaitForLidTemperatureParams(BaseModel):
|
|
20
|
+
"""Input parameters to wait for Thermocycler's lid temperature."""
|
|
21
|
+
|
|
22
|
+
moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class WaitForLidTemperatureResult(BaseModel):
|
|
26
|
+
"""Result data from wait for Thermocycler's lid temperature."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class WaitForLidTemperatureImpl(
|
|
30
|
+
AbstractCommandImpl[
|
|
31
|
+
WaitForLidTemperatureParams, SuccessData[WaitForLidTemperatureResult]
|
|
32
|
+
]
|
|
33
|
+
):
|
|
34
|
+
"""Execution implementation of Thermocycler's wait for lid temperature command."""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
state_view: StateView,
|
|
39
|
+
equipment: EquipmentHandler,
|
|
40
|
+
**unused_dependencies: object,
|
|
41
|
+
) -> None:
|
|
42
|
+
self._state_view = state_view
|
|
43
|
+
self._equipment = equipment
|
|
44
|
+
|
|
45
|
+
async def execute(
|
|
46
|
+
self,
|
|
47
|
+
params: WaitForLidTemperatureParams,
|
|
48
|
+
) -> SuccessData[WaitForLidTemperatureResult]:
|
|
49
|
+
"""Wait for a Thermocycler's lid temperature."""
|
|
50
|
+
thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
|
|
51
|
+
params.moduleId
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Raises error if no target temperature
|
|
55
|
+
thermocycler_state.get_target_lid_temperature()
|
|
56
|
+
|
|
57
|
+
thermocycler_hardware = self._equipment.get_module_hardware_api(
|
|
58
|
+
thermocycler_state.module_id
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
if thermocycler_hardware is not None:
|
|
62
|
+
await thermocycler_hardware.wait_for_lid_target()
|
|
63
|
+
|
|
64
|
+
return SuccessData(
|
|
65
|
+
public=WaitForLidTemperatureResult(),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class WaitForLidTemperature(
|
|
70
|
+
BaseCommand[
|
|
71
|
+
WaitForLidTemperatureParams, WaitForLidTemperatureResult, ErrorOccurrence
|
|
72
|
+
]
|
|
73
|
+
):
|
|
74
|
+
"""A command to wait for a Thermocycler's lid temperature."""
|
|
75
|
+
|
|
76
|
+
commandType: WaitForLidTemperatureCommandType = "thermocycler/waitForLidTemperature"
|
|
77
|
+
params: WaitForLidTemperatureParams
|
|
78
|
+
result: Optional[WaitForLidTemperatureResult] = None
|
|
79
|
+
|
|
80
|
+
_ImplementationCls: Type[WaitForLidTemperatureImpl] = WaitForLidTemperatureImpl
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class WaitForLidTemperatureCreate(BaseCommandCreate[WaitForLidTemperatureParams]):
|
|
84
|
+
"""A request to create Thermocycler's wait for lid temperature command."""
|
|
85
|
+
|
|
86
|
+
commandType: WaitForLidTemperatureCommandType = "thermocycler/waitForLidTemperature"
|
|
87
|
+
params: WaitForLidTemperatureParams
|
|
88
|
+
|
|
89
|
+
_CommandCls: Type[WaitForLidTemperature] = WaitForLidTemperature
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""Touch tip command request, result, and implementation models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type, Any
|
|
5
|
+
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
from pydantic import Field
|
|
8
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
9
|
+
|
|
10
|
+
from opentrons.types import Point
|
|
11
|
+
|
|
12
|
+
from ..errors import (
|
|
13
|
+
TouchTipDisabledError,
|
|
14
|
+
TouchTipIncompatibleArgumentsError,
|
|
15
|
+
LabwareIsTipRackError,
|
|
16
|
+
)
|
|
17
|
+
from ..types import DeckPoint
|
|
18
|
+
from .command import (
|
|
19
|
+
AbstractCommandImpl,
|
|
20
|
+
BaseCommand,
|
|
21
|
+
BaseCommandCreate,
|
|
22
|
+
SuccessData,
|
|
23
|
+
DefinedErrorData,
|
|
24
|
+
)
|
|
25
|
+
from .pipetting_common import (
|
|
26
|
+
PipetteIdMixin,
|
|
27
|
+
)
|
|
28
|
+
from .movement_common import (
|
|
29
|
+
WellLocationMixin,
|
|
30
|
+
DestinationPositionResult,
|
|
31
|
+
StallOrCollisionError,
|
|
32
|
+
move_to_well,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from ..execution import MovementHandler, GantryMover
|
|
37
|
+
from ..state.state import StateView
|
|
38
|
+
from ..resources.model_utils import ModelUtils
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
TouchTipCommandType = Literal["touchTip"]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
45
|
+
s.pop("default", None)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TouchTipParams(PipetteIdMixin, WellLocationMixin):
|
|
49
|
+
"""Payload needed to touch a pipette tip the sides of a specific well."""
|
|
50
|
+
|
|
51
|
+
radius: float = Field(
|
|
52
|
+
1.0,
|
|
53
|
+
description=(
|
|
54
|
+
"The proportion of the target well's radius the pipette tip will move towards."
|
|
55
|
+
),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
mmFromEdge: float | SkipJsonSchema[None] = Field(
|
|
59
|
+
None,
|
|
60
|
+
description="Offset away from the the well edge, in millimeters."
|
|
61
|
+
"Incompatible when a radius is included as a non 1.0 value.",
|
|
62
|
+
json_schema_extra=_remove_default,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
speed: float | SkipJsonSchema[None] = Field(
|
|
66
|
+
None,
|
|
67
|
+
description=(
|
|
68
|
+
"Override the travel speed in mm/s."
|
|
69
|
+
" This controls the straight linear speed of motion."
|
|
70
|
+
),
|
|
71
|
+
json_schema_extra=_remove_default,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class TouchTipResult(DestinationPositionResult):
|
|
76
|
+
"""Result data from the execution of a TouchTip."""
|
|
77
|
+
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class TouchTipImplementation(
|
|
82
|
+
AbstractCommandImpl[
|
|
83
|
+
TouchTipParams,
|
|
84
|
+
SuccessData[TouchTipResult] | DefinedErrorData[StallOrCollisionError],
|
|
85
|
+
]
|
|
86
|
+
):
|
|
87
|
+
"""Touch tip command implementation."""
|
|
88
|
+
|
|
89
|
+
def __init__(
|
|
90
|
+
self,
|
|
91
|
+
state_view: StateView,
|
|
92
|
+
movement: MovementHandler,
|
|
93
|
+
gantry_mover: GantryMover,
|
|
94
|
+
model_utils: ModelUtils,
|
|
95
|
+
**kwargs: object,
|
|
96
|
+
) -> None:
|
|
97
|
+
self._state_view = state_view
|
|
98
|
+
self._movement = movement
|
|
99
|
+
self._gantry_mover = gantry_mover
|
|
100
|
+
self._model_utils = model_utils
|
|
101
|
+
|
|
102
|
+
async def execute(
|
|
103
|
+
self, params: TouchTipParams
|
|
104
|
+
) -> SuccessData[TouchTipResult] | DefinedErrorData[StallOrCollisionError]:
|
|
105
|
+
"""Touch tip to sides of a well using the requested pipette."""
|
|
106
|
+
pipette_id = params.pipetteId
|
|
107
|
+
labware_id = params.labwareId
|
|
108
|
+
well_name = params.wellName
|
|
109
|
+
|
|
110
|
+
if params.radius != 1.0 and params.mmFromEdge is not None:
|
|
111
|
+
raise TouchTipIncompatibleArgumentsError(
|
|
112
|
+
"Cannot use mmFromEdge with a radius that is not 1.0"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if self._state_view.labware.get_has_quirk(labware_id, "touchTipDisabled"):
|
|
116
|
+
raise TouchTipDisabledError(
|
|
117
|
+
f"Touch tip not allowed on labware {labware_id}"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
if self._state_view.labware.is_tiprack(labware_id):
|
|
121
|
+
raise LabwareIsTipRackError("Cannot touch tip on tip rack")
|
|
122
|
+
|
|
123
|
+
center_result = await move_to_well(
|
|
124
|
+
movement=self._movement,
|
|
125
|
+
model_utils=self._model_utils,
|
|
126
|
+
pipette_id=pipette_id,
|
|
127
|
+
labware_id=labware_id,
|
|
128
|
+
well_name=well_name,
|
|
129
|
+
well_location=params.wellLocation,
|
|
130
|
+
)
|
|
131
|
+
if isinstance(center_result, DefinedErrorData):
|
|
132
|
+
return center_result
|
|
133
|
+
|
|
134
|
+
touch_speed = self._state_view.pipettes.get_movement_speed(
|
|
135
|
+
pipette_id, params.speed
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
mm_from_edge = params.mmFromEdge if params.mmFromEdge is not None else 0
|
|
139
|
+
touch_waypoints = self._state_view.motion.get_touch_tip_waypoints(
|
|
140
|
+
pipette_id=pipette_id,
|
|
141
|
+
labware_id=labware_id,
|
|
142
|
+
well_name=well_name,
|
|
143
|
+
radius=params.radius,
|
|
144
|
+
mm_from_edge=mm_from_edge,
|
|
145
|
+
center_point=Point(
|
|
146
|
+
center_result.public.position.x,
|
|
147
|
+
center_result.public.position.y,
|
|
148
|
+
center_result.public.position.z,
|
|
149
|
+
),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
final_point = await self._gantry_mover.move_to(
|
|
153
|
+
pipette_id=pipette_id,
|
|
154
|
+
waypoints=touch_waypoints,
|
|
155
|
+
speed=touch_speed,
|
|
156
|
+
)
|
|
157
|
+
final_deck_point = DeckPoint.model_construct(
|
|
158
|
+
x=final_point.x, y=final_point.y, z=final_point.z
|
|
159
|
+
)
|
|
160
|
+
state_update = center_result.state_update.set_pipette_location(
|
|
161
|
+
pipette_id=pipette_id,
|
|
162
|
+
new_labware_id=labware_id,
|
|
163
|
+
new_well_name=well_name,
|
|
164
|
+
new_deck_point=final_deck_point,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
return SuccessData(
|
|
168
|
+
public=TouchTipResult(position=final_deck_point),
|
|
169
|
+
state_update=state_update,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class TouchTip(BaseCommand[TouchTipParams, TouchTipResult, StallOrCollisionError]):
|
|
174
|
+
"""Touch up tip command model."""
|
|
175
|
+
|
|
176
|
+
commandType: TouchTipCommandType = "touchTip"
|
|
177
|
+
params: TouchTipParams
|
|
178
|
+
result: Optional[TouchTipResult] = None
|
|
179
|
+
|
|
180
|
+
_ImplementationCls: Type[TouchTipImplementation] = TouchTipImplementation
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class TouchTipCreate(BaseCommandCreate[TouchTipParams]):
|
|
184
|
+
"""Touch tip command creation request model."""
|
|
185
|
+
|
|
186
|
+
commandType: TouchTipCommandType = "touchTip"
|
|
187
|
+
params: TouchTipParams
|
|
188
|
+
|
|
189
|
+
_CommandCls: Type[TouchTip] = TouchTip
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""Commands that are "unsafe".
|
|
2
|
+
|
|
3
|
+
"Unsafe" means that they can cause inaccuracy or incorrect behavior. They should
|
|
4
|
+
therefore never be used in protocols, and should only be used otherwise as a last
|
|
5
|
+
resort.
|
|
6
|
+
|
|
7
|
+
These exist as a necessary evil for implementing things like error recovery.
|
|
8
|
+
Even in those narrow contexts, these commands must be used with care.
|
|
9
|
+
e.g. after an `UpdatePositionEstimators` command, there must be a `Home` command,
|
|
10
|
+
or positioning will be subtly wrong. Each unsafe command should document its intended
|
|
11
|
+
use case and its caveats.
|
|
12
|
+
|
|
13
|
+
Because we don't expect unsafe commands to be used in any protocols whose behavior we
|
|
14
|
+
must preserve, we may change the commands' semantics over time. We may also change
|
|
15
|
+
their shapes if we're confident that it won't break something in robot-server's
|
|
16
|
+
persistent storage.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
from .unsafe_blow_out_in_place import (
|
|
21
|
+
UnsafeBlowOutInPlaceCommandType,
|
|
22
|
+
UnsafeBlowOutInPlaceParams,
|
|
23
|
+
UnsafeBlowOutInPlaceResult,
|
|
24
|
+
UnsafeBlowOutInPlace,
|
|
25
|
+
UnsafeBlowOutInPlaceCreate,
|
|
26
|
+
)
|
|
27
|
+
from .unsafe_drop_tip_in_place import (
|
|
28
|
+
UnsafeDropTipInPlaceCommandType,
|
|
29
|
+
UnsafeDropTipInPlaceParams,
|
|
30
|
+
UnsafeDropTipInPlaceResult,
|
|
31
|
+
UnsafeDropTipInPlace,
|
|
32
|
+
UnsafeDropTipInPlaceCreate,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
from .update_position_estimators import (
|
|
36
|
+
UpdatePositionEstimatorsCommandType,
|
|
37
|
+
UpdatePositionEstimatorsParams,
|
|
38
|
+
UpdatePositionEstimatorsResult,
|
|
39
|
+
UpdatePositionEstimators,
|
|
40
|
+
UpdatePositionEstimatorsCreate,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
from .unsafe_engage_axes import (
|
|
44
|
+
UnsafeEngageAxesCommandType,
|
|
45
|
+
UnsafeEngageAxesParams,
|
|
46
|
+
UnsafeEngageAxesResult,
|
|
47
|
+
UnsafeEngageAxes,
|
|
48
|
+
UnsafeEngageAxesCreate,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
from .unsafe_ungrip_labware import (
|
|
52
|
+
UnsafeUngripLabwareCommandType,
|
|
53
|
+
UnsafeUngripLabwareParams,
|
|
54
|
+
UnsafeUngripLabwareResult,
|
|
55
|
+
UnsafeUngripLabware,
|
|
56
|
+
UnsafeUngripLabwareCreate,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
from .unsafe_place_labware import (
|
|
61
|
+
UnsafePlaceLabwareCommandType,
|
|
62
|
+
UnsafePlaceLabwareParams,
|
|
63
|
+
UnsafePlaceLabwareResult,
|
|
64
|
+
UnsafePlaceLabware,
|
|
65
|
+
UnsafePlaceLabwareCreate,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
from .unsafe_stacker_manual_retrieve import (
|
|
69
|
+
UnsafeFlexStackerManualRetrieveCommandType,
|
|
70
|
+
UnsafeFlexStackerManualRetrieveParams,
|
|
71
|
+
UnsafeFlexStackerManualRetrieveResult,
|
|
72
|
+
UnsafeFlexStackerManualRetrieve,
|
|
73
|
+
UnsafeFlexStackerManualRetrieveCreate,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
from .unsafe_stacker_close_latch import (
|
|
77
|
+
UnsafeFlexStackerCloseLatchCommandType,
|
|
78
|
+
UnsafeFlexStackerCloseLatchParams,
|
|
79
|
+
UnsafeFlexStackerCloseLatchResult,
|
|
80
|
+
UnsafeFlexStackerCloseLatch,
|
|
81
|
+
UnsafeFlexStackerCloseLatchCreate,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
from .unsafe_stacker_open_latch import (
|
|
85
|
+
UnsafeFlexStackerOpenLatchCommandType,
|
|
86
|
+
UnsafeFlexStackerOpenLatchParams,
|
|
87
|
+
UnsafeFlexStackerOpenLatchResult,
|
|
88
|
+
UnsafeFlexStackerOpenLatch,
|
|
89
|
+
UnsafeFlexStackerOpenLatchCreate,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
from .unsafe_stacker_prepare_shuttle import (
|
|
93
|
+
UnsafeFlexStackerPrepareShuttleCommandType,
|
|
94
|
+
UnsafeFlexStackerPrepareShuttleParams,
|
|
95
|
+
UnsafeFlexStackerPrepareShuttleResult,
|
|
96
|
+
UnsafeFlexStackerPrepareShuttle,
|
|
97
|
+
UnsafeFlexStackerPrepareShuttleCreate,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
__all__ = [
|
|
101
|
+
# Unsafe blow-out-in-place command models
|
|
102
|
+
"UnsafeBlowOutInPlaceCommandType",
|
|
103
|
+
"UnsafeBlowOutInPlaceParams",
|
|
104
|
+
"UnsafeBlowOutInPlaceResult",
|
|
105
|
+
"UnsafeBlowOutInPlace",
|
|
106
|
+
"UnsafeBlowOutInPlaceCreate",
|
|
107
|
+
# Unsafe drop-tip command models
|
|
108
|
+
"UnsafeDropTipInPlaceCommandType",
|
|
109
|
+
"UnsafeDropTipInPlaceParams",
|
|
110
|
+
"UnsafeDropTipInPlaceResult",
|
|
111
|
+
"UnsafeDropTipInPlace",
|
|
112
|
+
"UnsafeDropTipInPlaceCreate",
|
|
113
|
+
# Update position estimate command models
|
|
114
|
+
"UpdatePositionEstimatorsCommandType",
|
|
115
|
+
"UpdatePositionEstimatorsParams",
|
|
116
|
+
"UpdatePositionEstimatorsResult",
|
|
117
|
+
"UpdatePositionEstimators",
|
|
118
|
+
"UpdatePositionEstimatorsCreate",
|
|
119
|
+
# Unsafe engage axes
|
|
120
|
+
"UnsafeEngageAxesCommandType",
|
|
121
|
+
"UnsafeEngageAxesParams",
|
|
122
|
+
"UnsafeEngageAxesResult",
|
|
123
|
+
"UnsafeEngageAxes",
|
|
124
|
+
"UnsafeEngageAxesCreate",
|
|
125
|
+
# Unsafe ungrip labware
|
|
126
|
+
"UnsafeUngripLabwareCommandType",
|
|
127
|
+
"UnsafeUngripLabwareParams",
|
|
128
|
+
"UnsafeUngripLabwareResult",
|
|
129
|
+
"UnsafeUngripLabware",
|
|
130
|
+
"UnsafeUngripLabwareCreate",
|
|
131
|
+
# Unsafe place labware
|
|
132
|
+
"UnsafePlaceLabwareCommandType",
|
|
133
|
+
"UnsafePlaceLabwareParams",
|
|
134
|
+
"UnsafePlaceLabwareResult",
|
|
135
|
+
"UnsafePlaceLabware",
|
|
136
|
+
"UnsafePlaceLabwareCreate",
|
|
137
|
+
# Unsafe manual retrieve
|
|
138
|
+
"UnsafeFlexStackerManualRetrieveCommandType",
|
|
139
|
+
"UnsafeFlexStackerManualRetrieveParams",
|
|
140
|
+
"UnsafeFlexStackerManualRetrieveResult",
|
|
141
|
+
"UnsafeFlexStackerManualRetrieve",
|
|
142
|
+
"UnsafeFlexStackerManualRetrieveCreate",
|
|
143
|
+
# Unsafe flex stacker close latch
|
|
144
|
+
"UnsafeFlexStackerCloseLatchCommandType",
|
|
145
|
+
"UnsafeFlexStackerCloseLatchParams",
|
|
146
|
+
"UnsafeFlexStackerCloseLatchResult",
|
|
147
|
+
"UnsafeFlexStackerCloseLatch",
|
|
148
|
+
"UnsafeFlexStackerCloseLatchCreate",
|
|
149
|
+
# Unsafe flex stacker open latch
|
|
150
|
+
"UnsafeFlexStackerOpenLatchCommandType",
|
|
151
|
+
"UnsafeFlexStackerOpenLatchParams",
|
|
152
|
+
"UnsafeFlexStackerOpenLatchResult",
|
|
153
|
+
"UnsafeFlexStackerOpenLatch",
|
|
154
|
+
"UnsafeFlexStackerOpenLatchCreate",
|
|
155
|
+
# Unsafe flex stacker prepare shuttle
|
|
156
|
+
"UnsafeFlexStackerPrepareShuttleCommandType",
|
|
157
|
+
"UnsafeFlexStackerPrepareShuttleParams",
|
|
158
|
+
"UnsafeFlexStackerPrepareShuttleResult",
|
|
159
|
+
"UnsafeFlexStackerPrepareShuttle",
|
|
160
|
+
"UnsafeFlexStackerPrepareShuttleCreate",
|
|
161
|
+
]
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Command models to blow out in place while plunger positions are unknown."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type
|
|
5
|
+
from typing_extensions import Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
10
|
+
from ..pipetting_common import PipetteIdMixin, FlowRateMixin
|
|
11
|
+
from ...resources import ensure_ot3_hardware
|
|
12
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
13
|
+
from ...state import update_types
|
|
14
|
+
|
|
15
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
16
|
+
from opentrons.hardware_control.types import Axis
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from ...execution import PipettingHandler
|
|
20
|
+
from ...state.state import StateView
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
UnsafeBlowOutInPlaceCommandType = Literal["unsafe/blowOutInPlace"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class UnsafeBlowOutInPlaceParams(PipetteIdMixin, FlowRateMixin):
|
|
27
|
+
"""Payload required to blow-out in place while position is unknown."""
|
|
28
|
+
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class UnsafeBlowOutInPlaceResult(BaseModel):
|
|
33
|
+
"""Result data from an UnsafeBlowOutInPlace command."""
|
|
34
|
+
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class UnsafeBlowOutInPlaceImplementation(
|
|
39
|
+
AbstractCommandImpl[
|
|
40
|
+
UnsafeBlowOutInPlaceParams, SuccessData[UnsafeBlowOutInPlaceResult]
|
|
41
|
+
]
|
|
42
|
+
):
|
|
43
|
+
"""UnsafeBlowOutInPlace command implementation."""
|
|
44
|
+
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
pipetting: PipettingHandler,
|
|
48
|
+
state_view: StateView,
|
|
49
|
+
hardware_api: HardwareControlAPI,
|
|
50
|
+
**kwargs: object,
|
|
51
|
+
) -> None:
|
|
52
|
+
self._pipetting = pipetting
|
|
53
|
+
self._state_view = state_view
|
|
54
|
+
self._hardware_api = hardware_api
|
|
55
|
+
|
|
56
|
+
async def execute(
|
|
57
|
+
self, params: UnsafeBlowOutInPlaceParams
|
|
58
|
+
) -> SuccessData[UnsafeBlowOutInPlaceResult]:
|
|
59
|
+
"""Blow-out without moving the pipette even when position is unknown."""
|
|
60
|
+
ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
|
|
61
|
+
pipette_location = self._state_view.motion.get_pipette_location(
|
|
62
|
+
params.pipetteId
|
|
63
|
+
)
|
|
64
|
+
await ot3_hardware_api.update_axis_position_estimations(
|
|
65
|
+
[Axis.of_main_tool_actuator(pipette_location.mount.to_hw_mount())]
|
|
66
|
+
)
|
|
67
|
+
await self._pipetting.blow_out_in_place(
|
|
68
|
+
pipette_id=params.pipetteId, flow_rate=params.flowRate
|
|
69
|
+
)
|
|
70
|
+
state_update = update_types.StateUpdate()
|
|
71
|
+
state_update.set_fluid_empty(pipette_id=params.pipetteId)
|
|
72
|
+
state_update.set_pipette_ready_to_aspirate(
|
|
73
|
+
pipette_id=params.pipetteId, ready_to_aspirate=False
|
|
74
|
+
)
|
|
75
|
+
return SuccessData(
|
|
76
|
+
public=UnsafeBlowOutInPlaceResult(), state_update=state_update
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class UnsafeBlowOutInPlace(
|
|
81
|
+
BaseCommand[UnsafeBlowOutInPlaceParams, UnsafeBlowOutInPlaceResult, ErrorOccurrence]
|
|
82
|
+
):
|
|
83
|
+
"""UnsafeBlowOutInPlace command model."""
|
|
84
|
+
|
|
85
|
+
commandType: UnsafeBlowOutInPlaceCommandType = "unsafe/blowOutInPlace"
|
|
86
|
+
params: UnsafeBlowOutInPlaceParams
|
|
87
|
+
result: Optional[UnsafeBlowOutInPlaceResult] = None
|
|
88
|
+
|
|
89
|
+
_ImplementationCls: Type[
|
|
90
|
+
UnsafeBlowOutInPlaceImplementation
|
|
91
|
+
] = UnsafeBlowOutInPlaceImplementation
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class UnsafeBlowOutInPlaceCreate(BaseCommandCreate[UnsafeBlowOutInPlaceParams]):
|
|
95
|
+
"""UnsafeBlowOutInPlace command request model."""
|
|
96
|
+
|
|
97
|
+
commandType: UnsafeBlowOutInPlaceCommandType = "unsafe/blowOutInPlace"
|
|
98
|
+
params: UnsafeBlowOutInPlaceParams
|
|
99
|
+
|
|
100
|
+
_CommandCls: Type[UnsafeBlowOutInPlace] = UnsafeBlowOutInPlace
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Command models to drop tip in place while plunger positions are unknown."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Type, Any
|
|
5
|
+
|
|
6
|
+
from pydantic import Field, BaseModel
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
from typing_extensions import Literal
|
|
9
|
+
|
|
10
|
+
from opentrons.hardware_control import HardwareControlAPI
|
|
11
|
+
from opentrons.hardware_control.types import Axis
|
|
12
|
+
|
|
13
|
+
from opentrons.protocol_engine.state.update_types import StateUpdate
|
|
14
|
+
from ..pipetting_common import PipetteIdMixin
|
|
15
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
16
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
17
|
+
from ...resources import ensure_ot3_hardware
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from ...execution import TipHandler
|
|
21
|
+
from ...state.state import StateView
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
UnsafeDropTipInPlaceCommandType = Literal["unsafe/dropTipInPlace"]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
28
|
+
s.pop("default", None)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class UnsafeDropTipInPlaceParams(PipetteIdMixin):
|
|
32
|
+
"""Payload required to drop a tip in place even if the plunger position is not known."""
|
|
33
|
+
|
|
34
|
+
homeAfter: bool | SkipJsonSchema[None] = Field(
|
|
35
|
+
None,
|
|
36
|
+
description=(
|
|
37
|
+
"Whether to home this pipette's plunger after dropping the tip."
|
|
38
|
+
" You should normally leave this unspecified to let the robot choose"
|
|
39
|
+
" a safe default depending on its hardware."
|
|
40
|
+
),
|
|
41
|
+
json_schema_extra=_remove_default,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class UnsafeDropTipInPlaceResult(BaseModel):
|
|
46
|
+
"""Result data from the execution of an UnsafeDropTipInPlace command."""
|
|
47
|
+
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class UnsafeDropTipInPlaceImplementation(
|
|
52
|
+
AbstractCommandImpl[
|
|
53
|
+
UnsafeDropTipInPlaceParams, SuccessData[UnsafeDropTipInPlaceResult]
|
|
54
|
+
]
|
|
55
|
+
):
|
|
56
|
+
"""Unsafe drop tip in place command implementation."""
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
tip_handler: TipHandler,
|
|
61
|
+
state_view: StateView,
|
|
62
|
+
hardware_api: HardwareControlAPI,
|
|
63
|
+
**kwargs: object,
|
|
64
|
+
) -> None:
|
|
65
|
+
self._state_view = state_view
|
|
66
|
+
self._tip_handler = tip_handler
|
|
67
|
+
self._hardware_api = hardware_api
|
|
68
|
+
|
|
69
|
+
async def execute(
|
|
70
|
+
self, params: UnsafeDropTipInPlaceParams
|
|
71
|
+
) -> SuccessData[UnsafeDropTipInPlaceResult]:
|
|
72
|
+
"""Drop a tip using the requested pipette, even if the plunger position is not known."""
|
|
73
|
+
ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
|
|
74
|
+
pipette_location = self._state_view.motion.get_pipette_location(
|
|
75
|
+
params.pipetteId
|
|
76
|
+
)
|
|
77
|
+
await ot3_hardware_api.update_axis_position_estimations(
|
|
78
|
+
[Axis.of_main_tool_actuator(pipette_location.mount.to_hw_mount())]
|
|
79
|
+
)
|
|
80
|
+
await self._tip_handler.drop_tip(
|
|
81
|
+
pipette_id=params.pipetteId,
|
|
82
|
+
home_after=params.homeAfter,
|
|
83
|
+
ignore_plunger=(
|
|
84
|
+
self._state_view.pipettes.get_active_channels(params.pipetteId) == 96
|
|
85
|
+
),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
state_update = StateUpdate()
|
|
89
|
+
state_update.update_pipette_tip_state(
|
|
90
|
+
pipette_id=params.pipetteId,
|
|
91
|
+
tip_geometry=None,
|
|
92
|
+
tip_source=None,
|
|
93
|
+
)
|
|
94
|
+
state_update.set_fluid_unknown(pipette_id=params.pipetteId)
|
|
95
|
+
|
|
96
|
+
return SuccessData(
|
|
97
|
+
public=UnsafeDropTipInPlaceResult(), state_update=state_update
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class UnsafeDropTipInPlace(
|
|
102
|
+
BaseCommand[UnsafeDropTipInPlaceParams, UnsafeDropTipInPlaceResult, ErrorOccurrence]
|
|
103
|
+
):
|
|
104
|
+
"""Drop tip in place command model."""
|
|
105
|
+
|
|
106
|
+
commandType: UnsafeDropTipInPlaceCommandType = "unsafe/dropTipInPlace"
|
|
107
|
+
params: UnsafeDropTipInPlaceParams
|
|
108
|
+
result: Optional[UnsafeDropTipInPlaceResult] = None
|
|
109
|
+
|
|
110
|
+
_ImplementationCls: Type[
|
|
111
|
+
UnsafeDropTipInPlaceImplementation
|
|
112
|
+
] = UnsafeDropTipInPlaceImplementation
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class UnsafeDropTipInPlaceCreate(BaseCommandCreate[UnsafeDropTipInPlaceParams]):
|
|
116
|
+
"""Drop tip in place command creation request model."""
|
|
117
|
+
|
|
118
|
+
commandType: UnsafeDropTipInPlaceCommandType = "unsafe/dropTipInPlace"
|
|
119
|
+
params: UnsafeDropTipInPlaceParams
|
|
120
|
+
|
|
121
|
+
_CommandCls: Type[UnsafeDropTipInPlace] = UnsafeDropTipInPlace
|