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,243 @@
|
|
|
1
|
+
from typing import Dict, List, Optional, Mapping
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from opentrons.types import Point
|
|
5
|
+
from ..types import Axis, CriticalPoint, MotionChecks
|
|
6
|
+
from .types import MountArgType
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class MotionController(Protocol[MountArgType]):
|
|
10
|
+
"""Protocol specifying fundamental motion controls."""
|
|
11
|
+
|
|
12
|
+
def get_deck_from_machine(
|
|
13
|
+
self, machine_pos: Dict[Axis, float]
|
|
14
|
+
) -> Dict[Axis, float]:
|
|
15
|
+
"""Convert machine coordinates to deck coordinates."""
|
|
16
|
+
...
|
|
17
|
+
|
|
18
|
+
async def halt(self, disengage_before_stopping: bool = False) -> None:
|
|
19
|
+
"""Immediately stop motion.
|
|
20
|
+
|
|
21
|
+
Calls to stop through the synch adapter while other calls
|
|
22
|
+
are ongoing will typically wait until those calls are done, since most
|
|
23
|
+
of the async calls here in fact block the loop while they talk to
|
|
24
|
+
smoothie. To provide actual immediate halting, call this method which
|
|
25
|
+
does not require use of the loop.
|
|
26
|
+
|
|
27
|
+
If disengage_before_stopping is True, the motors will disengage first and then
|
|
28
|
+
stop in place. Disengaging creates a smoother halt but requires homing after
|
|
29
|
+
in order to resume movement.
|
|
30
|
+
"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
async def stop(self, home_after: bool = True) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Stop motion as soon as possible, reset, and optionally home.
|
|
36
|
+
|
|
37
|
+
This will cancel motion (after the current call to :py:meth:`move`;
|
|
38
|
+
see :py:meth:`pause` for more detail), then home and reset the
|
|
39
|
+
robot.
|
|
40
|
+
"""
|
|
41
|
+
...
|
|
42
|
+
|
|
43
|
+
async def reset(self) -> None:
|
|
44
|
+
"""Reset the stored state of the system.
|
|
45
|
+
|
|
46
|
+
This will re-scan instruments and models, clearing any cached
|
|
47
|
+
information about their presence or state.
|
|
48
|
+
"""
|
|
49
|
+
...
|
|
50
|
+
|
|
51
|
+
# Gantry/frame (i.e. not pipette) action API
|
|
52
|
+
async def home_z(
|
|
53
|
+
self,
|
|
54
|
+
mount: Optional[MountArgType] = None,
|
|
55
|
+
allow_home_other: bool = True,
|
|
56
|
+
) -> None:
|
|
57
|
+
"""Home a selected z-axis, or both if not specified."""
|
|
58
|
+
...
|
|
59
|
+
|
|
60
|
+
async def home_plunger(self, mount: MountArgType) -> None:
|
|
61
|
+
"""
|
|
62
|
+
Home the plunger motor for a mount, and then return it to the 'bottom'
|
|
63
|
+
position.
|
|
64
|
+
|
|
65
|
+
mount: the mount associated with the target plunger
|
|
66
|
+
"""
|
|
67
|
+
...
|
|
68
|
+
|
|
69
|
+
async def home(self, axes: Optional[List[Axis]] = None) -> None:
|
|
70
|
+
"""Home a list of axes and initialize current position.
|
|
71
|
+
|
|
72
|
+
axes A list of axes to home. Default is `None`, which will
|
|
73
|
+
home everything.
|
|
74
|
+
"""
|
|
75
|
+
...
|
|
76
|
+
|
|
77
|
+
async def current_position(
|
|
78
|
+
self,
|
|
79
|
+
mount: MountArgType,
|
|
80
|
+
critical_point: Optional[CriticalPoint] = None,
|
|
81
|
+
refresh: bool = False,
|
|
82
|
+
# TODO(mc, 2021-11-15): combine with `refresh` for more reliable
|
|
83
|
+
# position reporting when motors are not homed
|
|
84
|
+
fail_on_not_homed: bool = False,
|
|
85
|
+
) -> Dict[Axis, float]:
|
|
86
|
+
"""Return the postion (in deck coords) of the critical point of the
|
|
87
|
+
specified mount.
|
|
88
|
+
|
|
89
|
+
This returns cached position to avoid hitting the smoothie driver
|
|
90
|
+
unless ``refresh`` is ``True``.
|
|
91
|
+
|
|
92
|
+
If `critical_point` is specified, that critical point will be applied
|
|
93
|
+
instead of the default one. For instance, if
|
|
94
|
+
`critical_point=CriticalPoints.MOUNT` then the position of the mount
|
|
95
|
+
will be returned. If the critical point specified does not exist, then
|
|
96
|
+
the next one down is returned - for instance, if there is no tip on the
|
|
97
|
+
specified mount but `CriticalPoint.TIP` was specified, the position of
|
|
98
|
+
the nozzle will be returned.
|
|
99
|
+
|
|
100
|
+
If `fail_on_not_homed` is `True`, this method will raise a `PositionUnknownError`
|
|
101
|
+
if any of the relavent axes are not homed, regardless of `refresh`.
|
|
102
|
+
"""
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
async def gantry_position(
|
|
106
|
+
self,
|
|
107
|
+
mount: MountArgType,
|
|
108
|
+
critical_point: Optional[CriticalPoint] = None,
|
|
109
|
+
refresh: bool = False,
|
|
110
|
+
# TODO(mc, 2021-11-15): combine with `refresh` for more reliable
|
|
111
|
+
# position reporting when motors are not homed
|
|
112
|
+
fail_on_not_homed: bool = False,
|
|
113
|
+
) -> Point:
|
|
114
|
+
"""Retrieve the position of just the currently-active pipette.
|
|
115
|
+
|
|
116
|
+
While current_position returns the position of every actuator on the system,
|
|
117
|
+
this function just returns the x, y, and z of the critical point of whichever
|
|
118
|
+
pipette is currently active (last moved).
|
|
119
|
+
"""
|
|
120
|
+
...
|
|
121
|
+
|
|
122
|
+
async def move_to(
|
|
123
|
+
self,
|
|
124
|
+
mount: MountArgType,
|
|
125
|
+
abs_position: Point,
|
|
126
|
+
speed: Optional[float] = None,
|
|
127
|
+
critical_point: Optional[CriticalPoint] = None,
|
|
128
|
+
max_speeds: Optional[Dict[Axis, float]] = None,
|
|
129
|
+
) -> None:
|
|
130
|
+
"""Move the critical point of the specified mount to a location
|
|
131
|
+
relative to the deck, at the specified speed. 'speed' sets the speed
|
|
132
|
+
of all robot axes to the given value. So, if multiple axes are to be
|
|
133
|
+
moved, they will do so at the same speed
|
|
134
|
+
|
|
135
|
+
The critical point of the mount depends on the current status of
|
|
136
|
+
the mount:
|
|
137
|
+
- If the mount does not have anything attached, its critical point is
|
|
138
|
+
the bottom of the mount attach bracket.
|
|
139
|
+
- If the mount has a pipette attached and it is not known to have a
|
|
140
|
+
pipette tip, the critical point is the end of the nozzle of a single
|
|
141
|
+
pipette or the end of the backmost nozzle of a multipipette
|
|
142
|
+
- If the mount has a pipette attached and it is known to have a
|
|
143
|
+
pipette tip, the critical point is the end of the pipette tip for
|
|
144
|
+
a single pipette or the end of the tip of the backmost nozzle of a
|
|
145
|
+
multipipette
|
|
146
|
+
|
|
147
|
+
:param mount: The mount to move
|
|
148
|
+
:param abs_position: The target absolute position in
|
|
149
|
+
deck coordinates to move the
|
|
150
|
+
critical point to
|
|
151
|
+
:param speed: An overall head speed to use during the move
|
|
152
|
+
:param critical_point: The critical point to move. In most situations
|
|
153
|
+
this is not needed. If not specified, the
|
|
154
|
+
current critical point will be moved. If
|
|
155
|
+
specified, the critical point must be one that
|
|
156
|
+
actually exists - that is, specifying
|
|
157
|
+
:py:attr:`.CriticalPoint.NOZZLE` when no pipette
|
|
158
|
+
is attached or :py:attr:`.CriticalPoint.TIP`
|
|
159
|
+
when no tip is applied will result in an error.
|
|
160
|
+
:param max_speeds: An optional override for per-axis maximum speeds. If
|
|
161
|
+
an axis is specified, it will not move faster than
|
|
162
|
+
the given speed. Note that this does not make that
|
|
163
|
+
axis move precisely at the given speed; it only
|
|
164
|
+
it if it was going to go faster. Direct speed
|
|
165
|
+
is still set by ``speed``.
|
|
166
|
+
"""
|
|
167
|
+
...
|
|
168
|
+
|
|
169
|
+
async def move_axes(
|
|
170
|
+
self,
|
|
171
|
+
position: Mapping[Axis, float],
|
|
172
|
+
speed: Optional[float] = None,
|
|
173
|
+
max_speeds: Optional[Dict[Axis, float]] = None,
|
|
174
|
+
expect_stalls: bool = False,
|
|
175
|
+
) -> None:
|
|
176
|
+
"""Moves the effectors of the specified axis to the specified position.
|
|
177
|
+
The effector of the x,y axis is the center of the carriage.
|
|
178
|
+
The effector of the pipette mount axis are the mount critical points but only in z.
|
|
179
|
+
"""
|
|
180
|
+
...
|
|
181
|
+
|
|
182
|
+
async def move_rel(
|
|
183
|
+
self,
|
|
184
|
+
mount: MountArgType,
|
|
185
|
+
delta: Point,
|
|
186
|
+
speed: Optional[float] = None,
|
|
187
|
+
max_speeds: Optional[Dict[Axis, float]] = None,
|
|
188
|
+
check_bounds: MotionChecks = MotionChecks.NONE,
|
|
189
|
+
fail_on_not_homed: bool = False,
|
|
190
|
+
) -> None:
|
|
191
|
+
"""Move the critical point of the specified mount by a specified
|
|
192
|
+
displacement in a specified direction, at the specified speed.
|
|
193
|
+
'speed' sets the speed of all axes to the given value. So, if multiple
|
|
194
|
+
axes are to be moved, they will do so at the same speed.
|
|
195
|
+
|
|
196
|
+
If fail_on_not_homed is True (default False), if an axis that is not
|
|
197
|
+
homed moves it will raise a PositionUnknownError. Otherwise, it will home the axis.
|
|
198
|
+
"""
|
|
199
|
+
...
|
|
200
|
+
|
|
201
|
+
def get_engaged_axes(self) -> Dict[Axis, bool]:
|
|
202
|
+
"""Which axes are engaged and holding."""
|
|
203
|
+
...
|
|
204
|
+
|
|
205
|
+
@property
|
|
206
|
+
def engaged_axes(self) -> Dict[Axis, bool]:
|
|
207
|
+
"""Which axes are engaged and holding"""
|
|
208
|
+
return self.get_engaged_axes()
|
|
209
|
+
|
|
210
|
+
async def disengage_axes(self, which: List[Axis]) -> None:
|
|
211
|
+
"""Disengage some axes."""
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
async def engage_axes(self, which: List[Axis]) -> None:
|
|
215
|
+
"""Engage some axes."""
|
|
216
|
+
...
|
|
217
|
+
|
|
218
|
+
async def retract(self, mount: MountArgType, margin: float = 10) -> None:
|
|
219
|
+
"""Pull the specified mount up to its home position.
|
|
220
|
+
|
|
221
|
+
Works regardless of critical point or home status.
|
|
222
|
+
"""
|
|
223
|
+
...
|
|
224
|
+
|
|
225
|
+
async def retract_axis(self, axis: Axis) -> None:
|
|
226
|
+
"""Retract the specified axis to its home position."""
|
|
227
|
+
...
|
|
228
|
+
|
|
229
|
+
def is_movement_execution_taskified(self) -> bool:
|
|
230
|
+
"""Get whether move functions are being executed inside cancellable tasks."""
|
|
231
|
+
...
|
|
232
|
+
|
|
233
|
+
def should_taskify_movement_execution(self, taskify: bool) -> None:
|
|
234
|
+
"""Specify whether move functions should be executed inside cancellable tasks."""
|
|
235
|
+
...
|
|
236
|
+
|
|
237
|
+
async def cancel_execution_and_running_tasks(self) -> None:
|
|
238
|
+
"""Cancel all tasks and set execution manager state to Cancelled."""
|
|
239
|
+
...
|
|
240
|
+
|
|
241
|
+
async def prepare_for_mount_movement(self, mount: MountArgType) -> None:
|
|
242
|
+
"""Retract the other mount if necessary."""
|
|
243
|
+
...
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from typing import Protocol, Sequence
|
|
2
|
+
|
|
3
|
+
from ..types import Axis
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class PositionEstimator(Protocol):
|
|
7
|
+
"""Position-control extensions for harwdare with encoders."""
|
|
8
|
+
|
|
9
|
+
async def update_axis_position_estimations(self, axes: Sequence[Axis]) -> None:
|
|
10
|
+
"""Update the specified axes' position estimators from their encoders.
|
|
11
|
+
|
|
12
|
+
This will allow these axes to make a non-home move even if they do not currently have
|
|
13
|
+
a position estimation (unless there is no tracked position from the encoders, as would be
|
|
14
|
+
true immediately after boot).
|
|
15
|
+
|
|
16
|
+
Axis encoders have less precision than their position estimators. Calling this function will
|
|
17
|
+
cause absolute position drift. After this function is called, the axis should be homed before
|
|
18
|
+
it is relied upon for accurate motion.
|
|
19
|
+
|
|
20
|
+
This function updates only the requested axes. If other axes have bad position estimation,
|
|
21
|
+
moves that require those axes or attempts to get the position of those axes will still fail.
|
|
22
|
+
Axes that are not currently available (like a plunger for a pipette that is not connected)
|
|
23
|
+
will be ignored.
|
|
24
|
+
"""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
def motor_status_ok(self, axis: Axis) -> bool:
|
|
28
|
+
"""Return whether an axis' position estimator is healthy.
|
|
29
|
+
|
|
30
|
+
The position estimator is healthy if the axis has
|
|
31
|
+
1) been homed
|
|
32
|
+
2) not suffered a loss-of-positioning (from a cancel or stall, for instance) since being homed
|
|
33
|
+
|
|
34
|
+
If this function returns false, getting the position of this axis or asking it to move will fail.
|
|
35
|
+
"""
|
|
36
|
+
...
|
|
37
|
+
|
|
38
|
+
def encoder_status_ok(self, axis: Axis) -> bool:
|
|
39
|
+
"""Return whether an axis' position encoder tracking is healthy.
|
|
40
|
+
|
|
41
|
+
The encoder status is healthy if the axis has been homed since booting up.
|
|
42
|
+
|
|
43
|
+
If this function returns false, updating the estimator from the encoder will fail.
|
|
44
|
+
"""
|
|
45
|
+
...
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Types that are common across protocols."""
|
|
2
|
+
|
|
3
|
+
from typing import TypeVar, Union, Type
|
|
4
|
+
from opentrons.hardware_control.types import OT3Mount
|
|
5
|
+
from opentrons.types import Mount
|
|
6
|
+
from opentrons.config.types import RobotConfig, OT3Config
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class OT2RobotType:
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class FlexRobotType:
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
CalibrationType = TypeVar("CalibrationType")
|
|
18
|
+
|
|
19
|
+
MountArgType = TypeVar(
|
|
20
|
+
"MountArgType", Mount, Union[OT3Mount, Mount], contravariant=True
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
ConfigType = TypeVar("ConfigType", RobotConfig, OT3Config)
|
|
24
|
+
|
|
25
|
+
ProtocolRobotType = TypeVar(
|
|
26
|
+
"ProtocolRobotType", Type[FlexRobotType], Type[OT2RobotType], covariant=True
|
|
27
|
+
)
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
from functools import lru_cache
|
|
2
|
+
import logging
|
|
3
|
+
import numpy as np
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Optional, List, Any, cast
|
|
7
|
+
from numpy.typing import NDArray
|
|
8
|
+
|
|
9
|
+
from opentrons import config
|
|
10
|
+
|
|
11
|
+
from opentrons.config.robot_configs import (
|
|
12
|
+
get_legacy_gantry_calibration,
|
|
13
|
+
default_ot2_deck_calibration,
|
|
14
|
+
)
|
|
15
|
+
from opentrons.calibration_storage import (
|
|
16
|
+
types,
|
|
17
|
+
save_robot_deck_attitude,
|
|
18
|
+
get_robot_deck_attitude,
|
|
19
|
+
)
|
|
20
|
+
from opentrons.util import linal
|
|
21
|
+
|
|
22
|
+
from .util import DeckTransformState
|
|
23
|
+
|
|
24
|
+
log = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class DeckCalibration:
|
|
29
|
+
attitude: types.AttitudeMatrix
|
|
30
|
+
source: types.SourceType
|
|
31
|
+
status: types.CalibrationStatus
|
|
32
|
+
belt_attitude: Optional[types.AttitudeMatrix] = None
|
|
33
|
+
last_modified: Optional[datetime] = None
|
|
34
|
+
pipette_calibrated_with: Optional[str] = None
|
|
35
|
+
tiprack: Optional[str] = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class RobotCalibration:
|
|
40
|
+
deck_calibration: DeckCalibration
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def validate_attitude_deck_calibration(
|
|
44
|
+
deck_cal: DeckCalibration,
|
|
45
|
+
) -> DeckTransformState:
|
|
46
|
+
"""
|
|
47
|
+
This function determines whether the deck calibration is valid
|
|
48
|
+
or not based on the following use-cases:
|
|
49
|
+
|
|
50
|
+
TODO(lc, 8/10/2020): As with the OT2, expand on this method, or create
|
|
51
|
+
another method to diagnose bad instrument offset data
|
|
52
|
+
"""
|
|
53
|
+
curr_cal: linal.DoubleMatrix = np.array(deck_cal.attitude)
|
|
54
|
+
row, _ = curr_cal.shape
|
|
55
|
+
rank: int = np.linalg.matrix_rank(curr_cal)
|
|
56
|
+
if row != rank:
|
|
57
|
+
# Check that the matrix is non-singular
|
|
58
|
+
return DeckTransformState.SINGULARITY
|
|
59
|
+
elif not deck_cal.last_modified:
|
|
60
|
+
# Check that the matrix is not an identity
|
|
61
|
+
return DeckTransformState.IDENTITY
|
|
62
|
+
else:
|
|
63
|
+
# Transform as it stands is sufficient.
|
|
64
|
+
return DeckTransformState.OK
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def validate_gantry_calibration(gantry_cal: List[List[float]]) -> DeckTransformState:
|
|
68
|
+
"""
|
|
69
|
+
This function determines whether the gantry calibration is valid
|
|
70
|
+
or not based on the following use-cases:
|
|
71
|
+
"""
|
|
72
|
+
curr_cal: linal.DoubleMatrix = np.array(gantry_cal)
|
|
73
|
+
row, _ = curr_cal.shape
|
|
74
|
+
|
|
75
|
+
rank: int = np.linalg.matrix_rank(curr_cal)
|
|
76
|
+
|
|
77
|
+
id_matrix = linal.identity_deck_transform()
|
|
78
|
+
|
|
79
|
+
z = abs(curr_cal[2][-1])
|
|
80
|
+
|
|
81
|
+
outofrange = z < 16 or z > 34
|
|
82
|
+
if row != rank:
|
|
83
|
+
# Check that the matrix is non-singular
|
|
84
|
+
return DeckTransformState.SINGULARITY
|
|
85
|
+
elif np.array_equal(curr_cal, id_matrix):
|
|
86
|
+
# Check that the matrix is not an identity
|
|
87
|
+
return DeckTransformState.IDENTITY
|
|
88
|
+
elif outofrange:
|
|
89
|
+
# Check that the matrix is not out of range.
|
|
90
|
+
return DeckTransformState.BAD_CALIBRATION
|
|
91
|
+
else:
|
|
92
|
+
# Transform as it stands is sufficient.
|
|
93
|
+
return DeckTransformState.OK
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def migrate_affine_xy_to_attitude(
|
|
97
|
+
gantry_cal: List[List[float]],
|
|
98
|
+
) -> types.AttitudeMatrix:
|
|
99
|
+
masked_transform: NDArray[np.bool_] = np.array(
|
|
100
|
+
[
|
|
101
|
+
[True, True, True, False],
|
|
102
|
+
[True, True, True, False],
|
|
103
|
+
[False, False, False, False],
|
|
104
|
+
[False, False, False, False],
|
|
105
|
+
]
|
|
106
|
+
)
|
|
107
|
+
masked_array: np.ma.MaskedArray[
|
|
108
|
+
Any, np.dtype[np.float64]
|
|
109
|
+
] = np.ma.masked_array( # type: ignore
|
|
110
|
+
gantry_cal, ~masked_transform
|
|
111
|
+
)
|
|
112
|
+
attitude_array: linal.DoubleMatrix = np.zeros((3, 3))
|
|
113
|
+
np.put(attitude_array, [0, 1, 2], masked_array[0].compressed())
|
|
114
|
+
np.put(attitude_array, [3, 4, 5], masked_array[1].compressed())
|
|
115
|
+
np.put(attitude_array, 8, 1)
|
|
116
|
+
return cast(List[List[float]], attitude_array.tolist())
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def save_attitude_matrix(
|
|
120
|
+
expected: linal.SolvePoints,
|
|
121
|
+
actual: linal.SolvePoints,
|
|
122
|
+
pipette_id: str,
|
|
123
|
+
tiprack_hash: str,
|
|
124
|
+
) -> None:
|
|
125
|
+
attitude = linal.solve_attitude(expected, actual)
|
|
126
|
+
save_robot_deck_attitude(
|
|
127
|
+
attitude,
|
|
128
|
+
pipette_id,
|
|
129
|
+
tiprack_hash,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def load_attitude_matrix() -> DeckCalibration:
|
|
134
|
+
calibration_data = get_robot_deck_attitude()
|
|
135
|
+
gantry_cal = get_legacy_gantry_calibration()
|
|
136
|
+
if not calibration_data and gantry_cal:
|
|
137
|
+
if validate_gantry_calibration(gantry_cal) == DeckTransformState.OK:
|
|
138
|
+
log.debug(
|
|
139
|
+
"Attitude deck calibration matrix not found. Migrating "
|
|
140
|
+
"existing affine deck calibration matrix to {}".format(
|
|
141
|
+
config.get_opentrons_path("robot_calibration_dir")
|
|
142
|
+
)
|
|
143
|
+
)
|
|
144
|
+
attitude = migrate_affine_xy_to_attitude(gantry_cal)
|
|
145
|
+
save_robot_deck_attitude(
|
|
146
|
+
transform=attitude,
|
|
147
|
+
pip_id=None,
|
|
148
|
+
lw_hash=None,
|
|
149
|
+
source=types.SourceType.legacy,
|
|
150
|
+
)
|
|
151
|
+
calibration_data = get_robot_deck_attitude()
|
|
152
|
+
|
|
153
|
+
if calibration_data:
|
|
154
|
+
return DeckCalibration(
|
|
155
|
+
attitude=calibration_data.attitude,
|
|
156
|
+
source=calibration_data.source,
|
|
157
|
+
status=types.CalibrationStatus(**calibration_data.status.model_dump()),
|
|
158
|
+
last_modified=calibration_data.last_modified,
|
|
159
|
+
pipette_calibrated_with=calibration_data.pipette_calibrated_with,
|
|
160
|
+
tiprack=calibration_data.tiprack,
|
|
161
|
+
)
|
|
162
|
+
else:
|
|
163
|
+
# load default if deck calibration data do not exist
|
|
164
|
+
return DeckCalibration(
|
|
165
|
+
attitude=default_ot2_deck_calibration(),
|
|
166
|
+
source=types.SourceType.default,
|
|
167
|
+
status=types.CalibrationStatus(),
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def load() -> RobotCalibration:
|
|
172
|
+
return RobotCalibration(deck_calibration=load_attitude_matrix())
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class RobotCalibrationProvider:
|
|
176
|
+
def __init__(self) -> None:
|
|
177
|
+
self._robot_calibration = load()
|
|
178
|
+
|
|
179
|
+
@lru_cache(1)
|
|
180
|
+
def _validate(self) -> DeckTransformState:
|
|
181
|
+
return validate_attitude_deck_calibration(
|
|
182
|
+
self._robot_calibration.deck_calibration
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
@property
|
|
186
|
+
def robot_calibration(self) -> RobotCalibration:
|
|
187
|
+
return self._robot_calibration
|
|
188
|
+
|
|
189
|
+
def reset_robot_calibration(self) -> None:
|
|
190
|
+
self._validate.cache_clear()
|
|
191
|
+
self._robot_calibration = load()
|
|
192
|
+
|
|
193
|
+
def reset_deck_calibration(self) -> None:
|
|
194
|
+
self._robot_calibration = load()
|
|
195
|
+
|
|
196
|
+
def load_deck_calibration(self) -> None:
|
|
197
|
+
self._robot_calibration = load()
|
|
198
|
+
|
|
199
|
+
def set_robot_calibration(self, robot_calibration: RobotCalibration) -> None:
|
|
200
|
+
self._validate.cache_clear()
|
|
201
|
+
self._robot_calibration = robot_calibration
|
|
202
|
+
|
|
203
|
+
def validate_calibration(self) -> DeckTransformState:
|
|
204
|
+
"""
|
|
205
|
+
The lru cache decorator is currently not supported by the
|
|
206
|
+
ThreadManager. To work around this, we need to wrap the
|
|
207
|
+
actual function around a dummy outer function.
|
|
208
|
+
|
|
209
|
+
Once decorators are more fully supported, we can remove this.
|
|
210
|
+
"""
|
|
211
|
+
return self._validate()
|
|
212
|
+
|
|
213
|
+
def build_temporary_identity_calibration(self) -> RobotCalibration:
|
|
214
|
+
"""
|
|
215
|
+
Get a temporary identity deck cal suitable for use during
|
|
216
|
+
calibration
|
|
217
|
+
"""
|
|
218
|
+
return RobotCalibration(
|
|
219
|
+
deck_calibration=DeckCalibration(
|
|
220
|
+
attitude=default_ot2_deck_calibration(),
|
|
221
|
+
source=types.SourceType.default,
|
|
222
|
+
status=types.CalibrationStatus(),
|
|
223
|
+
)
|
|
224
|
+
)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Hardware Control Scripts
|
|
2
|
+
|
|
3
|
+
## Repl Script
|
|
4
|
+
|
|
5
|
+
### Overview
|
|
6
|
+
|
|
7
|
+
This script gives you access to a hardware controller object in a python shell.
|
|
8
|
+
|
|
9
|
+
### Running on an OT-3
|
|
10
|
+
|
|
11
|
+
The script is installed to path by using the `make push-ot3` command. When you are ssh-ed in the robot, you can run `ot3repl` from anywhere.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Running on a computer
|
|
15
|
+
|
|
16
|
+
Please review [the setup for a simulated CAN connection](https://github.com/Opentrons/opentrons/tree/edge/hardware#can-bus-simulation) to see how to run OT-3 simulators on your computer. Once you have a simulated CAN connection and firmware, you can run the following:
|
|
17
|
+
|
|
18
|
+
`OPENTRONS_SIMULATION=true OT_API_FF_enableOT3HardwareController=true OT3_CAN_DRIVER_INTERFACE=opentrons_sock pipenv run python -m opentrons.hardware_control.scripts.repl`
|
|
19
|
+
|
|
20
|
+
## Gripper Script
|
|
21
|
+
|
|
22
|
+
### Overview
|
|
23
|
+
|
|
24
|
+
Gripper test script only for the OT-3.
|
|
25
|
+
|
|
26
|
+
### Running on an OT-3
|
|
27
|
+
|
|
28
|
+
Install the script using `make push-ot3` command and run `ot3gripper` after you ssh-ed into the updated robot.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Scripts for the hardware controller."""
|