opentrons 8.6.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +501 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +183 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +215 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1115 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +396 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1025 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3212 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1425 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +349 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +58 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1158 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2359 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1459 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1500 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +308 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +303 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +848 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0a1.dist-info/METADATA +37 -0
- opentrons-8.6.0a1.dist-info/RECORD +600 -0
- opentrons-8.6.0a1.dist-info/WHEEL +4 -0
- opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from typing import Dict, Optional
|
|
2
|
+
from opentrons.util.async_helpers import ensure_yield
|
|
3
|
+
from opentrons.drivers.heater_shaker.abstract import AbstractHeaterShakerDriver
|
|
4
|
+
from opentrons.drivers.types import Temperature, RPM, HeaterShakerLabwareLatchStatus
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SimulatingDriver(AbstractHeaterShakerDriver):
|
|
8
|
+
DEFAULT_TEMP = 23
|
|
9
|
+
|
|
10
|
+
def __init__(self, serial_number: Optional[str] = None) -> None:
|
|
11
|
+
self._labware_latch_state = HeaterShakerLabwareLatchStatus.IDLE_UNKNOWN
|
|
12
|
+
self._current_temperature = self.DEFAULT_TEMP
|
|
13
|
+
self._temperature = Temperature(current=self.DEFAULT_TEMP, target=None)
|
|
14
|
+
self._rpm = RPM(current=0, target=None)
|
|
15
|
+
self._homing_status = True
|
|
16
|
+
self._serial_number = serial_number
|
|
17
|
+
|
|
18
|
+
@ensure_yield
|
|
19
|
+
async def connect(self) -> None:
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
@ensure_yield
|
|
23
|
+
async def disconnect(self) -> None:
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
@ensure_yield
|
|
27
|
+
async def is_connected(self) -> bool:
|
|
28
|
+
return True
|
|
29
|
+
|
|
30
|
+
@ensure_yield
|
|
31
|
+
async def open_labware_latch(self) -> None:
|
|
32
|
+
self._labware_latch_state = HeaterShakerLabwareLatchStatus.IDLE_OPEN
|
|
33
|
+
|
|
34
|
+
@ensure_yield
|
|
35
|
+
async def close_labware_latch(self) -> None:
|
|
36
|
+
self._labware_latch_state = HeaterShakerLabwareLatchStatus.IDLE_CLOSED
|
|
37
|
+
|
|
38
|
+
@ensure_yield
|
|
39
|
+
async def get_labware_latch_status(self) -> HeaterShakerLabwareLatchStatus:
|
|
40
|
+
return self._labware_latch_state
|
|
41
|
+
|
|
42
|
+
@ensure_yield
|
|
43
|
+
async def set_temperature(self, temperature: float) -> None:
|
|
44
|
+
self._temperature.current = temperature
|
|
45
|
+
self._temperature.target = temperature if temperature != 0.0 else None
|
|
46
|
+
|
|
47
|
+
@ensure_yield
|
|
48
|
+
async def get_temperature(self) -> Temperature:
|
|
49
|
+
return self._temperature
|
|
50
|
+
|
|
51
|
+
@ensure_yield
|
|
52
|
+
async def set_rpm(self, rpm: int) -> None:
|
|
53
|
+
self._rpm.target = rpm if rpm != 0 else None
|
|
54
|
+
self._rpm.current = rpm
|
|
55
|
+
self._homing_status = False
|
|
56
|
+
|
|
57
|
+
@ensure_yield
|
|
58
|
+
async def get_rpm(self) -> RPM:
|
|
59
|
+
return self._rpm
|
|
60
|
+
|
|
61
|
+
@ensure_yield
|
|
62
|
+
async def home(self) -> None:
|
|
63
|
+
self._rpm.target = None
|
|
64
|
+
self._rpm.current = 0
|
|
65
|
+
self._homing_status = True
|
|
66
|
+
|
|
67
|
+
@ensure_yield
|
|
68
|
+
async def deactivate_heater(self) -> None:
|
|
69
|
+
self._temperature.target = None
|
|
70
|
+
self._temperature.current = 23
|
|
71
|
+
|
|
72
|
+
@ensure_yield
|
|
73
|
+
async def deactivate_shaker(self) -> None:
|
|
74
|
+
self._rpm.target = 0
|
|
75
|
+
self._rpm.current = 0
|
|
76
|
+
|
|
77
|
+
@ensure_yield
|
|
78
|
+
async def deactivate(self) -> None:
|
|
79
|
+
self._temperature.target = None
|
|
80
|
+
self._temperature.current = 23
|
|
81
|
+
self._rpm.target = 0
|
|
82
|
+
self._rpm.current = 0
|
|
83
|
+
|
|
84
|
+
@ensure_yield
|
|
85
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
86
|
+
return {
|
|
87
|
+
"serial": self._serial_number if self._serial_number else "dummySerialHS",
|
|
88
|
+
"model": "dummyModelHS",
|
|
89
|
+
"version": "dummyVersionHS",
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@ensure_yield
|
|
93
|
+
async def enter_programming_mode(self) -> None:
|
|
94
|
+
pass
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Dict
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class AbstractMagDeckDriver(ABC):
|
|
6
|
+
@abstractmethod
|
|
7
|
+
async def connect(self) -> None:
|
|
8
|
+
...
|
|
9
|
+
|
|
10
|
+
@abstractmethod
|
|
11
|
+
async def disconnect(self) -> None:
|
|
12
|
+
...
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
async def is_connected(self) -> bool:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
async def home(self) -> None:
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
async def probe_plate(self) -> None:
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
async def get_plate_height(self) -> float:
|
|
28
|
+
...
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
async def get_mag_position(self) -> float:
|
|
32
|
+
...
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
async def move(self, position_mm: float) -> None:
|
|
36
|
+
...
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
async def enter_programming_mode(self) -> None:
|
|
44
|
+
...
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"""
|
|
2
|
+
- This driver is responsible for providing an interface for the mag deck
|
|
3
|
+
- The driver is the only system component that knows about the mag-deck's
|
|
4
|
+
GCODES or how the mag-deck communicates
|
|
5
|
+
|
|
6
|
+
- The driver is NOT responsible for interpreting deck states in any way
|
|
7
|
+
or knowing anything about what the device is being used for
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import logging
|
|
14
|
+
from typing import Dict, Optional
|
|
15
|
+
from enum import Enum
|
|
16
|
+
|
|
17
|
+
from opentrons.drivers import utils
|
|
18
|
+
from opentrons.drivers.command_builder import CommandBuilder
|
|
19
|
+
from opentrons.drivers.asyncio.communication import SerialConnection
|
|
20
|
+
from .abstract import AbstractMagDeckDriver
|
|
21
|
+
|
|
22
|
+
log = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
DEFAULT_MAG_DECK_TIMEOUT = 10 # Quite large to account for probe time
|
|
25
|
+
|
|
26
|
+
DEFAULT_COMMAND_RETRIES = 3
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class GCODE(str, Enum):
|
|
30
|
+
HOME = "G28.2"
|
|
31
|
+
PROBE_PLATE = "G38.2"
|
|
32
|
+
GET_PLATE_HEIGHT = "M836"
|
|
33
|
+
GET_CURRENT_POSITION = "M114.2"
|
|
34
|
+
MOVE = "G0"
|
|
35
|
+
DEVICE_INFO = "M115"
|
|
36
|
+
PROGRAMMING_MODE = "dfu"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
MAG_DECK_BAUDRATE = 115200
|
|
40
|
+
|
|
41
|
+
MAG_DECK_COMMAND_TERMINATOR = "\r\n\r\n"
|
|
42
|
+
MAG_DECK_ACK = "ok\r\nok\r\n"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Number of digits after the decimal point for millimeter values
|
|
46
|
+
# being sent to/from magnetic module
|
|
47
|
+
GCODE_ROUNDING_PRECISION = 3
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class MagDeckError(Exception):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class MagDeckDriver(AbstractMagDeckDriver):
|
|
55
|
+
@classmethod
|
|
56
|
+
async def create(
|
|
57
|
+
cls, port: str, loop: Optional[asyncio.AbstractEventLoop] = None
|
|
58
|
+
) -> MagDeckDriver:
|
|
59
|
+
"""
|
|
60
|
+
Create a mag deck driver.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
port: port or url of magdeck
|
|
64
|
+
loop: optional event loop
|
|
65
|
+
|
|
66
|
+
Returns: driver
|
|
67
|
+
"""
|
|
68
|
+
connection = await SerialConnection.create(
|
|
69
|
+
port=port,
|
|
70
|
+
baud_rate=MAG_DECK_BAUDRATE,
|
|
71
|
+
timeout=DEFAULT_MAG_DECK_TIMEOUT,
|
|
72
|
+
ack=MAG_DECK_ACK,
|
|
73
|
+
loop=loop,
|
|
74
|
+
reset_buffer_before_write=False,
|
|
75
|
+
)
|
|
76
|
+
return cls(connection=connection)
|
|
77
|
+
|
|
78
|
+
def __init__(self, connection: SerialConnection):
|
|
79
|
+
"""
|
|
80
|
+
Constructor
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
connection: connection to magdeck.
|
|
84
|
+
"""
|
|
85
|
+
self._connection = connection
|
|
86
|
+
|
|
87
|
+
async def connect(self) -> None:
|
|
88
|
+
"""Connect to device"""
|
|
89
|
+
await self._connection.open()
|
|
90
|
+
|
|
91
|
+
async def disconnect(self) -> None:
|
|
92
|
+
"""Disconnect from device"""
|
|
93
|
+
await self._connection.close()
|
|
94
|
+
|
|
95
|
+
async def is_connected(self) -> bool:
|
|
96
|
+
"""Check if connected."""
|
|
97
|
+
return await self._connection.is_open()
|
|
98
|
+
|
|
99
|
+
async def home(self) -> None:
|
|
100
|
+
"""Homes the magnet"""
|
|
101
|
+
c = CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
102
|
+
gcode=GCODE.HOME
|
|
103
|
+
)
|
|
104
|
+
await self._send_command(c)
|
|
105
|
+
|
|
106
|
+
async def probe_plate(self) -> None:
|
|
107
|
+
"""
|
|
108
|
+
Probes for the deck plate and calculates the plate distance
|
|
109
|
+
from home.
|
|
110
|
+
To be used for calibrating MagDeck
|
|
111
|
+
"""
|
|
112
|
+
c = CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
113
|
+
gcode=GCODE.PROBE_PLATE
|
|
114
|
+
)
|
|
115
|
+
await self._send_command(c)
|
|
116
|
+
|
|
117
|
+
async def get_plate_height(self) -> float:
|
|
118
|
+
"""
|
|
119
|
+
Default plate_height for the device is 30;
|
|
120
|
+
calculated as MAX_TRAVEL_DISTANCE(45mm) - 15mm
|
|
121
|
+
"""
|
|
122
|
+
c = CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
123
|
+
gcode=GCODE.GET_PLATE_HEIGHT
|
|
124
|
+
)
|
|
125
|
+
response = await self._send_command(c)
|
|
126
|
+
data = utils.parse_key_values(response)
|
|
127
|
+
return utils.parse_number(str(data.get("height")), GCODE_ROUNDING_PRECISION)
|
|
128
|
+
|
|
129
|
+
async def get_mag_position(self) -> float:
|
|
130
|
+
"""
|
|
131
|
+
Default mag_position for the device is 0.0
|
|
132
|
+
i.e. it boots with the current position as 0.0
|
|
133
|
+
"""
|
|
134
|
+
c = CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
135
|
+
gcode=GCODE.GET_CURRENT_POSITION
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
response = await self._send_command(c)
|
|
139
|
+
data = utils.parse_key_values(response)
|
|
140
|
+
return utils.parse_number(str(data.get("Z")), GCODE_ROUNDING_PRECISION)
|
|
141
|
+
|
|
142
|
+
async def move(self, position: float) -> None:
|
|
143
|
+
"""
|
|
144
|
+
Move the magnets along Z axis where the home position is 0.0;
|
|
145
|
+
position-> a point along Z. Does not self-check if the position
|
|
146
|
+
is outside of the deck's linear range
|
|
147
|
+
|
|
148
|
+
The units of position depend on the module model.
|
|
149
|
+
For GEN1, it's half millimeters ("short millimeters").
|
|
150
|
+
For GEN2, it's millimeters.
|
|
151
|
+
"""
|
|
152
|
+
c = (
|
|
153
|
+
CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR)
|
|
154
|
+
.add_gcode(gcode=GCODE.MOVE)
|
|
155
|
+
.add_float(prefix="Z", value=position, precision=GCODE_ROUNDING_PRECISION)
|
|
156
|
+
)
|
|
157
|
+
await self._send_command(c)
|
|
158
|
+
|
|
159
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
160
|
+
"""
|
|
161
|
+
Queries Mag-Deck for it's build version, model, and serial number
|
|
162
|
+
|
|
163
|
+
Returns: dict
|
|
164
|
+
Where keys are the strings 'version', 'model', and 'serial',
|
|
165
|
+
and each value is a string identifier
|
|
166
|
+
|
|
167
|
+
{
|
|
168
|
+
'serial': '1aa11bb22',
|
|
169
|
+
'model': '1aa11bb22',
|
|
170
|
+
'version': '1aa11bb22'
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
Example input from Mag-Deck's serial response:
|
|
174
|
+
"serial:aa11bb22 model:aa11bb22 version:aa11bb22"
|
|
175
|
+
"""
|
|
176
|
+
c = CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
177
|
+
gcode=GCODE.DEVICE_INFO
|
|
178
|
+
)
|
|
179
|
+
response = await self._send_command(c)
|
|
180
|
+
return utils.parse_device_information(device_info_string=response)
|
|
181
|
+
|
|
182
|
+
async def enter_programming_mode(self) -> None:
|
|
183
|
+
"""
|
|
184
|
+
Enters and stays in DFU mode for 8 seconds.
|
|
185
|
+
The module resets upon exiting the mode
|
|
186
|
+
which causes the robot to lose serial connection to it.
|
|
187
|
+
The connection can be restored by performing a .disconnect()
|
|
188
|
+
followed by a .connect() to the same symlink node
|
|
189
|
+
"""
|
|
190
|
+
c = CommandBuilder(terminator=MAG_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
191
|
+
gcode=GCODE.PROGRAMMING_MODE
|
|
192
|
+
)
|
|
193
|
+
await self._send_command(c)
|
|
194
|
+
|
|
195
|
+
async def _send_command(self, command: CommandBuilder) -> str:
|
|
196
|
+
"""
|
|
197
|
+
Send the command
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
command: command to send
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
command response
|
|
204
|
+
"""
|
|
205
|
+
response = await self._connection.send_command(
|
|
206
|
+
command=command, retries=DEFAULT_COMMAND_RETRIES
|
|
207
|
+
)
|
|
208
|
+
return response
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from typing import Dict, Optional
|
|
2
|
+
|
|
3
|
+
from .abstract import AbstractMagDeckDriver
|
|
4
|
+
from opentrons.util.async_helpers import ensure_yield
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
MAG_DECK_MODELS = {
|
|
8
|
+
"magneticModuleV1": "mag_deck_v1.1",
|
|
9
|
+
"magneticModuleV2": "mag_deck_v20",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SimulatingDriver(AbstractMagDeckDriver):
|
|
14
|
+
def __init__(
|
|
15
|
+
self, sim_model: Optional[str] = None, serial_number: Optional[str] = None
|
|
16
|
+
) -> None:
|
|
17
|
+
self._height = 0.0
|
|
18
|
+
self._model = MAG_DECK_MODELS[sim_model] if sim_model else "mag_deck_v1.1"
|
|
19
|
+
self._serial_number = serial_number
|
|
20
|
+
|
|
21
|
+
@ensure_yield
|
|
22
|
+
async def probe_plate(self) -> None:
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
@ensure_yield
|
|
26
|
+
async def home(self) -> None:
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
@ensure_yield
|
|
30
|
+
async def move(self, location: float) -> None:
|
|
31
|
+
self._height = location
|
|
32
|
+
|
|
33
|
+
@ensure_yield
|
|
34
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
35
|
+
return {
|
|
36
|
+
"serial": self._serial_number if self._serial_number else "dummySerialMD",
|
|
37
|
+
"model": self._model,
|
|
38
|
+
"version": "dummyVersionMD",
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@ensure_yield
|
|
42
|
+
async def connect(self) -> None:
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
@ensure_yield
|
|
46
|
+
async def disconnect(self) -> None:
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
@ensure_yield
|
|
50
|
+
async def enter_programming_mode(self) -> None:
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
@ensure_yield
|
|
54
|
+
async def is_connected(self) -> bool:
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
@ensure_yield
|
|
58
|
+
async def get_plate_height(self) -> float:
|
|
59
|
+
return self._height
|
|
60
|
+
|
|
61
|
+
@ensure_yield
|
|
62
|
+
async def get_mag_position(self) -> float:
|
|
63
|
+
return self._height
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from .dev_types import GPIODriverLike
|
|
6
|
+
|
|
7
|
+
MODULE_LOG = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RevisionPinsError(Exception):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def build_gpio_chardev(chip_name: str) -> "GPIODriverLike":
|
|
15
|
+
try:
|
|
16
|
+
from .gpio import GPIOCharDev
|
|
17
|
+
|
|
18
|
+
return GPIOCharDev(chip_name)
|
|
19
|
+
except (ImportError, OSError):
|
|
20
|
+
MODULE_LOG.warning(
|
|
21
|
+
"Failed to initialize character device, will not "
|
|
22
|
+
"be able to control gpios (lights, button, smoothie"
|
|
23
|
+
"kill, smoothie reset). Only one connection can be"
|
|
24
|
+
" made to the gpios at a time. "
|
|
25
|
+
"If you need to control gpios, first stop the robot "
|
|
26
|
+
"server with systemctl stop opentrons-robot-server. "
|
|
27
|
+
"Until you restart the server with systemctl start "
|
|
28
|
+
"opentrons-robot-server, you will be unable to "
|
|
29
|
+
"control the robot using the Opentrons app."
|
|
30
|
+
)
|
|
31
|
+
from .gpio_simulator import SimulatingGPIOCharDev
|
|
32
|
+
|
|
33
|
+
return SimulatingGPIOCharDev(chip_name)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from typing import Callable, Dict, Tuple
|
|
3
|
+
from typing_extensions import Protocol
|
|
4
|
+
from opentrons.hardware_control.types import BoardRevision, DoorState
|
|
5
|
+
from .types import GPIOPin
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class GPIODriverLike(Protocol):
|
|
9
|
+
"""Interface for the GPIO drivers"""
|
|
10
|
+
|
|
11
|
+
def __init__(self, chip_name: str) -> None:
|
|
12
|
+
...
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def chip(self) -> str:
|
|
16
|
+
...
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def lines(self) -> Dict[str, int]:
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def board_rev(self) -> BoardRevision:
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@board_rev.setter
|
|
27
|
+
def board_rev(self, boardrev: BoardRevision) -> None:
|
|
28
|
+
...
|
|
29
|
+
|
|
30
|
+
async def setup(self) -> None:
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
def config_by_board_rev(self) -> None:
|
|
34
|
+
...
|
|
35
|
+
|
|
36
|
+
def set_high(self, output_pin: GPIOPin) -> None:
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
def set_low(self, output_pin: GPIOPin) -> None:
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
def set_button_light(
|
|
43
|
+
self, red: bool = False, green: bool = False, blue: bool = False
|
|
44
|
+
) -> None:
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
def set_rail_lights(self, on: bool = True) -> None:
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
def set_reset_pin(self, on: bool = True) -> None:
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
def set_isp_pin(self, on: bool = True) -> None:
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
def set_halt_pin(self, on: bool = True) -> None:
|
|
57
|
+
...
|
|
58
|
+
|
|
59
|
+
def get_button_light(self) -> Tuple[bool, bool, bool]:
|
|
60
|
+
...
|
|
61
|
+
|
|
62
|
+
def get_rail_lights(self) -> bool:
|
|
63
|
+
...
|
|
64
|
+
|
|
65
|
+
def read_button(self) -> bool:
|
|
66
|
+
...
|
|
67
|
+
|
|
68
|
+
def read_window_switches(self) -> bool:
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
def read_top_window_switch(self) -> bool:
|
|
72
|
+
...
|
|
73
|
+
|
|
74
|
+
def read_front_door_switch(self) -> bool:
|
|
75
|
+
...
|
|
76
|
+
|
|
77
|
+
def read_revision_bits(self) -> Tuple[bool, bool]:
|
|
78
|
+
...
|
|
79
|
+
|
|
80
|
+
def get_door_state(self) -> DoorState:
|
|
81
|
+
...
|
|
82
|
+
|
|
83
|
+
def start_door_switch_watcher(
|
|
84
|
+
self,
|
|
85
|
+
loop: asyncio.AbstractEventLoop,
|
|
86
|
+
update_door_state: Callable[[DoorState], None],
|
|
87
|
+
) -> None:
|
|
88
|
+
...
|
|
89
|
+
|
|
90
|
+
def release_line(self, pin: GPIOPin) -> None:
|
|
91
|
+
...
|
|
92
|
+
|
|
93
|
+
def stop_door_switch_watcher(self, loop: asyncio.AbstractEventLoop) -> None:
|
|
94
|
+
...
|