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,49 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class SmoothieError(Exception):
|
|
5
|
+
def __init__(
|
|
6
|
+
self, ret_code: Optional[str] = None, command: Optional[str] = None
|
|
7
|
+
) -> None:
|
|
8
|
+
self.ret_code = ret_code or ""
|
|
9
|
+
self.command = command
|
|
10
|
+
super().__init__()
|
|
11
|
+
|
|
12
|
+
def __repr__(self) -> str:
|
|
13
|
+
return f"<SmoothieError: {self.ret_code} from {self.command}>"
|
|
14
|
+
|
|
15
|
+
def __str__(self) -> str:
|
|
16
|
+
return f"SmoothieError: {self.command} returned {self.ret_code}"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SmoothieAlarm(Exception):
|
|
20
|
+
def __init__(
|
|
21
|
+
self, ret_code: Optional[str] = None, command: Optional[str] = None
|
|
22
|
+
) -> None:
|
|
23
|
+
self.ret_code = ret_code
|
|
24
|
+
self.command = command
|
|
25
|
+
super().__init__()
|
|
26
|
+
|
|
27
|
+
def __repr__(self) -> str:
|
|
28
|
+
return f"<SmoothieAlarm: {self.ret_code} from {self.command}>"
|
|
29
|
+
|
|
30
|
+
def __str__(self) -> str:
|
|
31
|
+
return f"SmoothieAlarm: {self.command} returned {self.ret_code}"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TipProbeError(SmoothieAlarm):
|
|
35
|
+
def __init__(
|
|
36
|
+
self, ret_code: Optional[str] = None, command: Optional[str] = None
|
|
37
|
+
) -> None:
|
|
38
|
+
self.ret_code = ret_code
|
|
39
|
+
self.command = command
|
|
40
|
+
super().__init__(ret_code, command)
|
|
41
|
+
|
|
42
|
+
def __repr__(self) -> str:
|
|
43
|
+
return f"<TipProbeError: {self.ret_code} from {self.command}"
|
|
44
|
+
|
|
45
|
+
def __str__(self) -> str:
|
|
46
|
+
return (
|
|
47
|
+
"Tip probe could not complete: the switch was never touched. "
|
|
48
|
+
"This may be because there is no tip on the pipette."
|
|
49
|
+
)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Dict
|
|
3
|
+
|
|
4
|
+
from opentrons.drivers.smoothie_drivers.constants import AXES, GCODE_ROUNDING_PRECISION
|
|
5
|
+
from opentrons.drivers.utils import (
|
|
6
|
+
parse_key_values,
|
|
7
|
+
parse_number,
|
|
8
|
+
parse_optional_number,
|
|
9
|
+
ParseError,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
log = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def parse_position_response(raw_axis_values: str) -> Dict[str, float]:
|
|
17
|
+
"""
|
|
18
|
+
Parse position response.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
raw_axis_values: a string containing axis:value
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
dictionary of axis to position.
|
|
25
|
+
"""
|
|
26
|
+
parsed_values = parse_key_values(raw_axis_values)
|
|
27
|
+
if len(parsed_values) < 6:
|
|
28
|
+
raise ParseError(
|
|
29
|
+
error_message="Unexpected response in _parse_position_response",
|
|
30
|
+
parse_source=raw_axis_values,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
data = {
|
|
34
|
+
k.title(): parse_number(v, GCODE_ROUNDING_PRECISION)
|
|
35
|
+
for k, v in parsed_values.items()
|
|
36
|
+
}
|
|
37
|
+
return data
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def parse_instrument_data(smoothie_response: str) -> Dict[str, bytearray]:
|
|
41
|
+
"""
|
|
42
|
+
Parse instrument data.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
smoothie_response: A string containing a mount prefix (L or R) followed by :
|
|
46
|
+
and a hex string.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
mapping of the mount prefix to the hex string.
|
|
50
|
+
"""
|
|
51
|
+
try:
|
|
52
|
+
items = smoothie_response.split("\n")[0].strip().split(":")
|
|
53
|
+
mount = items[0]
|
|
54
|
+
if mount not in {"L", "R"}:
|
|
55
|
+
raise ParseError(
|
|
56
|
+
error_message=f"Invalid mount '{mount}'", parse_source=smoothie_response
|
|
57
|
+
)
|
|
58
|
+
# data received from Smoothieware is stringified HEX values
|
|
59
|
+
# because of how Smoothieware handles GCODE messages
|
|
60
|
+
data = bytearray.fromhex(items[1])
|
|
61
|
+
except (ValueError, IndexError, TypeError, AttributeError):
|
|
62
|
+
raise ParseError(
|
|
63
|
+
error_message="Unexpected argument to parse_instrument_data",
|
|
64
|
+
parse_source=smoothie_response,
|
|
65
|
+
)
|
|
66
|
+
return {mount: data}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def byte_array_to_ascii_string(byte_array: bytearray) -> str:
|
|
70
|
+
"""
|
|
71
|
+
Convert byte array to ascii string.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
byte_array: a byte array
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
String
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
# remove trailing null characters
|
|
81
|
+
try:
|
|
82
|
+
for c in [b"\x00", b"\xFF"]:
|
|
83
|
+
if c in byte_array:
|
|
84
|
+
byte_array = byte_array[: byte_array.index(c)]
|
|
85
|
+
res = byte_array.decode()
|
|
86
|
+
except (ValueError, TypeError, AttributeError):
|
|
87
|
+
log.exception("Unexpected argument to _byte_array_to_ascii_string:")
|
|
88
|
+
raise ParseError(
|
|
89
|
+
error_message="Unexpected argument to byte_array_to_ascii_string",
|
|
90
|
+
parse_source=byte_array.decode(),
|
|
91
|
+
)
|
|
92
|
+
return res
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def parse_switch_values(raw_switch_values: str) -> Dict[str, bool]:
|
|
96
|
+
if not raw_switch_values or not isinstance(raw_switch_values, str):
|
|
97
|
+
raise ParseError(
|
|
98
|
+
error_message="Unexpected argument to parse_switch_values",
|
|
99
|
+
parse_source=raw_switch_values,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# probe has a space after it's ":" for some reason
|
|
103
|
+
if "Probe: " in raw_switch_values:
|
|
104
|
+
raw_switch_values = raw_switch_values.replace("Probe: ", "Probe:")
|
|
105
|
+
|
|
106
|
+
parsed_values = parse_key_values(raw_switch_values)
|
|
107
|
+
res = {
|
|
108
|
+
k.title(): bool(parse_optional_number(v, rounding_val=GCODE_ROUNDING_PRECISION))
|
|
109
|
+
for (k, v) in parsed_values.items()
|
|
110
|
+
if any(n in k for n in ["max", "Probe"])
|
|
111
|
+
}
|
|
112
|
+
# remove the extra "_max" character from each axis key in the dict
|
|
113
|
+
res = {key.split("_")[0]: val for key, val in res.items()}
|
|
114
|
+
if len((list(AXES) + ["Probe"]) & res.keys()) != 7:
|
|
115
|
+
raise ParseError(
|
|
116
|
+
error_message="Unexpected argument to parse_switch_values",
|
|
117
|
+
parse_source=raw_switch_values,
|
|
118
|
+
)
|
|
119
|
+
return res
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def parse_homing_status_values(raw_homing_status_values: str) -> Dict[str, bool]:
|
|
123
|
+
"""
|
|
124
|
+
Parse the Smoothieware response to a G28.6 command (homing-status)
|
|
125
|
+
A "1" means it has been homed, and "0" means it has not been homed
|
|
126
|
+
|
|
127
|
+
Example response after homing just X axis:
|
|
128
|
+
"X:1 Y:0 Z:0 A:0 B:0 C:0"
|
|
129
|
+
|
|
130
|
+
returns: dict
|
|
131
|
+
Key is axis, value is True if the axis needs to be homed
|
|
132
|
+
"""
|
|
133
|
+
parsed_values = parse_key_values(raw_homing_status_values)
|
|
134
|
+
res = {
|
|
135
|
+
k.title(): bool(parse_number(v, GCODE_ROUNDING_PRECISION))
|
|
136
|
+
for k, v in parsed_values.items()
|
|
137
|
+
}
|
|
138
|
+
if len(list(AXES) & res.keys()) != 6:
|
|
139
|
+
raise ParseError(
|
|
140
|
+
error_message="Unexpected argument to parse_homing_status_values",
|
|
141
|
+
parse_source=raw_homing_status_values,
|
|
142
|
+
)
|
|
143
|
+
return res
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
from typing import Optional, Dict, Union
|
|
2
|
+
|
|
3
|
+
from opentrons.drivers.smoothie_drivers.constants import (
|
|
4
|
+
HOMED_POSITION,
|
|
5
|
+
Y_BOUND_OVERRIDE,
|
|
6
|
+
DISABLE_AXES,
|
|
7
|
+
AXES,
|
|
8
|
+
)
|
|
9
|
+
from opentrons.drivers.types import MoveSplits
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SimulatingDriver:
|
|
13
|
+
def __init__(self) -> None:
|
|
14
|
+
self._steps_per_mm: Dict[str, float] = {}
|
|
15
|
+
self._homed_flags: Dict[str, bool] = {}
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def homed_flags(self) -> Dict[str, bool]:
|
|
19
|
+
return self._homed_flags
|
|
20
|
+
|
|
21
|
+
async def home(self, axis: str = AXES, disabled: str = DISABLE_AXES) -> None:
|
|
22
|
+
for ax in axis:
|
|
23
|
+
self._homed_flags[ax] = True
|
|
24
|
+
|
|
25
|
+
async def _smoothie_reset(self) -> None:
|
|
26
|
+
self._homed_flags.clear()
|
|
27
|
+
|
|
28
|
+
async def read_pipette_id(self, mount: str) -> Optional[str]:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
async def read_pipette_model(self, mount: str) -> Optional[str]:
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
async def write_pipette_id(self, mount: str, data_string: str) -> None:
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
async def write_pipette_model(self, mount: str, data_string: str) -> None:
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
# def _send_command(self, command, timeout=None):
|
|
41
|
+
# pass
|
|
42
|
+
|
|
43
|
+
def turn_on_blue_button_light(self) -> None:
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
def turn_on_red_button_light(self) -> None:
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
async def update_pipette_config(
|
|
50
|
+
self, axis: str, data: Dict[str, float]
|
|
51
|
+
) -> Dict[str, Dict[str, float]]:
|
|
52
|
+
"""
|
|
53
|
+
Updates the following configs for a given pipette mount based on
|
|
54
|
+
the detected pipette type:
|
|
55
|
+
- homing positions M365.0
|
|
56
|
+
- Max Travel M365.1
|
|
57
|
+
- endstop debounce M365.2 (NOT for zprobe debounce)
|
|
58
|
+
- retract from endstop distance M365.3
|
|
59
|
+
"""
|
|
60
|
+
return {}
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def current(self) -> Dict[str, float]:
|
|
64
|
+
return {}
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def speed(self) -> None:
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def steps_per_mm(self) -> Dict[str, float]:
|
|
72
|
+
return self._steps_per_mm
|
|
73
|
+
|
|
74
|
+
# @steps_per_mm.setter
|
|
75
|
+
# def steps_per_mm(self, axis, mm):
|
|
76
|
+
# # Keep track of any updates to the steps per mm per axis
|
|
77
|
+
# self._steps_per_mm[axis] = mm
|
|
78
|
+
|
|
79
|
+
async def update_steps_per_mm(self, data: Union[Dict[str, float], str]) -> None:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
def configure_splits_for(self, config: MoveSplits) -> None:
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
def set_dwelling_current(self, settings: Dict[str, float]) -> None:
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
def set_acceleration(self, settings: Dict[str, float]) -> None:
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def homed_position(self) -> Dict[str, float]:
|
|
93
|
+
return HOMED_POSITION.copy()
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def axis_bounds(self) -> Dict[str, float]:
|
|
97
|
+
position = HOMED_POSITION.copy()
|
|
98
|
+
position["Y"] = Y_BOUND_OVERRIDE
|
|
99
|
+
return position
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Dict, cast
|
|
3
|
+
|
|
4
|
+
from opentrons.config.types import AxisDict
|
|
5
|
+
|
|
6
|
+
AxisSettingType = Dict[str, float]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class AxisCurrentSettings:
|
|
11
|
+
now: AxisSettingType
|
|
12
|
+
saved: AxisSettingType
|
|
13
|
+
|
|
14
|
+
def __init__(self, val: AxisDict) -> None:
|
|
15
|
+
self.now = cast(AxisSettingType, val.copy())
|
|
16
|
+
self.saved = cast(AxisSettingType, val.copy())
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Dict
|
|
3
|
+
|
|
4
|
+
from opentrons.drivers.types import Temperature
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AbstractTempDeckDriver(ABC):
|
|
8
|
+
@abstractmethod
|
|
9
|
+
async def connect(self) -> None:
|
|
10
|
+
...
|
|
11
|
+
|
|
12
|
+
@abstractmethod
|
|
13
|
+
async def disconnect(self) -> None:
|
|
14
|
+
...
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
async def is_connected(self) -> bool:
|
|
18
|
+
...
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
async def deactivate(self) -> None:
|
|
22
|
+
...
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
async def set_temperature(self, celsius: float) -> None:
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
async def get_temperature(self) -> Temperature:
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
@abstractmethod
|
|
33
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
34
|
+
"""
|
|
35
|
+
Queries Temp-Deck for its build version, model, and serial number
|
|
36
|
+
|
|
37
|
+
returns: dict
|
|
38
|
+
Where keys are the strings 'version', 'model', and 'serial',
|
|
39
|
+
and each value is a string identifier
|
|
40
|
+
|
|
41
|
+
{
|
|
42
|
+
'serial': '1aa11bb22',
|
|
43
|
+
'model': '1aa11bb22',
|
|
44
|
+
'version': '1aa11bb22'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
Example input from Temp-Deck's serial response:
|
|
48
|
+
"serial:aa11bb22 model:aa11bb22 version:aa11bb22"
|
|
49
|
+
"""
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
@abstractmethod
|
|
53
|
+
async def enter_programming_mode(self) -> None:
|
|
54
|
+
...
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""
|
|
2
|
+
- Driver is responsible for providing an interface for the temp-deck
|
|
3
|
+
- Driver is the only system component that knows about the temp-deck's GCODES
|
|
4
|
+
or how the temp-deck communications
|
|
5
|
+
|
|
6
|
+
- Driver is NOT responsible interpreting the temperatures or 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.types import Temperature
|
|
19
|
+
from opentrons.drivers.command_builder import CommandBuilder
|
|
20
|
+
from opentrons.drivers.asyncio.communication import SerialConnection, UnhandledGcode
|
|
21
|
+
from opentrons.drivers.temp_deck.abstract import AbstractTempDeckDriver
|
|
22
|
+
|
|
23
|
+
log = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
DEFAULT_TEMP_DECK_TIMEOUT = 1
|
|
26
|
+
|
|
27
|
+
DEFAULT_COMMAND_RETRIES = 3
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class GCODE(str, Enum):
|
|
31
|
+
GET_TEMP = "M105"
|
|
32
|
+
SET_TEMP = "M104"
|
|
33
|
+
DEVICE_INFO = "M115"
|
|
34
|
+
GET_RESET_REASON = "M114"
|
|
35
|
+
DISENGAGE = "M18"
|
|
36
|
+
PROGRAMMING_MODE = "dfu"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
TEMP_DECK_BAUDRATE = 115200
|
|
40
|
+
|
|
41
|
+
TEMP_DECK_COMMAND_TERMINATOR = "\r\n\r\n"
|
|
42
|
+
TEMP_DECK_ACK = "ok\r\nok\r\n"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class TempDeckError(Exception):
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TempDeckDriver(AbstractTempDeckDriver):
|
|
50
|
+
@classmethod
|
|
51
|
+
async def create(
|
|
52
|
+
cls, port: str, loop: Optional[asyncio.AbstractEventLoop] = None
|
|
53
|
+
) -> TempDeckDriver:
|
|
54
|
+
"""
|
|
55
|
+
Create a temp deck driver.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
port: port or url of temp deck
|
|
59
|
+
loop: optional event loop
|
|
60
|
+
|
|
61
|
+
Returns: driver
|
|
62
|
+
"""
|
|
63
|
+
connection = await SerialConnection.create(
|
|
64
|
+
port=port,
|
|
65
|
+
baud_rate=TEMP_DECK_BAUDRATE,
|
|
66
|
+
timeout=DEFAULT_TEMP_DECK_TIMEOUT,
|
|
67
|
+
ack=TEMP_DECK_ACK,
|
|
68
|
+
loop=loop,
|
|
69
|
+
reset_buffer_before_write=False,
|
|
70
|
+
)
|
|
71
|
+
return cls(connection=connection)
|
|
72
|
+
|
|
73
|
+
def __init__(self, connection: SerialConnection) -> None:
|
|
74
|
+
"""
|
|
75
|
+
Construct a temp deck driver
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
connection: Connection to the temp deck
|
|
79
|
+
"""
|
|
80
|
+
self._connection = connection
|
|
81
|
+
|
|
82
|
+
async def connect(self) -> None:
|
|
83
|
+
"""Connect to the temp deck."""
|
|
84
|
+
await self._connection.open()
|
|
85
|
+
|
|
86
|
+
async def disconnect(self) -> None:
|
|
87
|
+
"""Disconnect from temp deck"""
|
|
88
|
+
await self._connection.close()
|
|
89
|
+
|
|
90
|
+
async def is_connected(self) -> bool:
|
|
91
|
+
"""Check connected state"""
|
|
92
|
+
return await self._connection.is_open()
|
|
93
|
+
|
|
94
|
+
async def deactivate(self) -> None:
|
|
95
|
+
"""
|
|
96
|
+
Send disengage command to temp deck
|
|
97
|
+
|
|
98
|
+
Returns: None
|
|
99
|
+
"""
|
|
100
|
+
c = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
101
|
+
gcode=GCODE.DISENGAGE
|
|
102
|
+
)
|
|
103
|
+
await self._send_command(command=c)
|
|
104
|
+
|
|
105
|
+
async def set_temperature(self, celsius: float) -> None:
|
|
106
|
+
"""
|
|
107
|
+
Send a set temperate command to temp deck
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
celsius: the target temperature
|
|
111
|
+
|
|
112
|
+
Returns: None
|
|
113
|
+
"""
|
|
114
|
+
c = (
|
|
115
|
+
CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR)
|
|
116
|
+
.add_gcode(gcode=GCODE.SET_TEMP)
|
|
117
|
+
.add_float(
|
|
118
|
+
prefix="S",
|
|
119
|
+
value=celsius,
|
|
120
|
+
precision=utils.TEMPDECK_GCODE_ROUNDING_PRECISION,
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
await self._send_command(command=c)
|
|
124
|
+
|
|
125
|
+
async def get_temperature(self) -> Temperature:
|
|
126
|
+
"""
|
|
127
|
+
Send a get temperature command to the temp deck.
|
|
128
|
+
|
|
129
|
+
Returns: Temperature object
|
|
130
|
+
|
|
131
|
+
"""
|
|
132
|
+
c = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
133
|
+
gcode=GCODE.GET_TEMP
|
|
134
|
+
)
|
|
135
|
+
response = await self._send_command(command=c)
|
|
136
|
+
return utils.parse_temperature_response(
|
|
137
|
+
temperature_string=response,
|
|
138
|
+
rounding_val=utils.TEMPDECK_GCODE_ROUNDING_PRECISION,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
142
|
+
"""
|
|
143
|
+
Queries Temp-Deck for its build version, model, and serial number
|
|
144
|
+
|
|
145
|
+
returns: dict
|
|
146
|
+
Where keys are the strings 'version', 'model', and 'serial',
|
|
147
|
+
and each value is a string identifier
|
|
148
|
+
|
|
149
|
+
{
|
|
150
|
+
'serial': '1aa11bb22',
|
|
151
|
+
'model': '1aa11bb22',
|
|
152
|
+
'version': '1aa11bb22'
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
Example input from Temp-Deck's serial response:
|
|
156
|
+
"serial:aa11bb22 model:aa11bb22 version:aa11bb22"
|
|
157
|
+
"""
|
|
158
|
+
device_info = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
159
|
+
gcode=GCODE.DEVICE_INFO
|
|
160
|
+
)
|
|
161
|
+
response = await self._send_command(command=device_info)
|
|
162
|
+
|
|
163
|
+
reset_reason = CommandBuilder(
|
|
164
|
+
terminator=TEMP_DECK_COMMAND_TERMINATOR
|
|
165
|
+
).add_gcode(gcode=GCODE.GET_RESET_REASON)
|
|
166
|
+
try:
|
|
167
|
+
await self._send_command(command=reset_reason)
|
|
168
|
+
except UnhandledGcode:
|
|
169
|
+
pass
|
|
170
|
+
|
|
171
|
+
return utils.parse_device_information(device_info_string=response)
|
|
172
|
+
|
|
173
|
+
async def enter_programming_mode(self) -> None:
|
|
174
|
+
"""
|
|
175
|
+
Send command to enter programming mode.
|
|
176
|
+
|
|
177
|
+
Returns: None
|
|
178
|
+
"""
|
|
179
|
+
c = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
|
|
180
|
+
gcode=GCODE.PROGRAMMING_MODE
|
|
181
|
+
)
|
|
182
|
+
await self._send_command(command=c)
|
|
183
|
+
|
|
184
|
+
async def _send_command(self, command: CommandBuilder) -> str:
|
|
185
|
+
"""
|
|
186
|
+
Send the command
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
command: command to send
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
command response
|
|
193
|
+
"""
|
|
194
|
+
response = await self._connection.send_command(
|
|
195
|
+
command=command, retries=DEFAULT_COMMAND_RETRIES
|
|
196
|
+
)
|
|
197
|
+
return response
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from typing import Optional, Dict
|
|
2
|
+
|
|
3
|
+
from opentrons.util.async_helpers import ensure_yield
|
|
4
|
+
from opentrons.drivers.types import Temperature
|
|
5
|
+
from opentrons.drivers.temp_deck.abstract import AbstractTempDeckDriver
|
|
6
|
+
|
|
7
|
+
TEMP_DECK_MODELS = {
|
|
8
|
+
"temperatureModuleV1": "temp_deck_v1.1",
|
|
9
|
+
"temperatureModuleV2": "temp_deck_v20",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SimulatingDriver(AbstractTempDeckDriver):
|
|
14
|
+
def __init__(
|
|
15
|
+
self, sim_model: Optional[str] = None, serial_number: Optional[str] = None
|
|
16
|
+
):
|
|
17
|
+
self._temp = Temperature(target=None, current=0)
|
|
18
|
+
self._port: Optional[str] = None
|
|
19
|
+
self._model = TEMP_DECK_MODELS[sim_model] if sim_model else "temp_deck_v1.1"
|
|
20
|
+
self._serial_number = serial_number
|
|
21
|
+
|
|
22
|
+
@ensure_yield
|
|
23
|
+
async def set_temperature(self, celsius: float) -> None:
|
|
24
|
+
self._temp.target = celsius
|
|
25
|
+
self._temp.current = self._temp.target
|
|
26
|
+
|
|
27
|
+
@ensure_yield
|
|
28
|
+
async def get_temperature(self) -> Temperature:
|
|
29
|
+
return self._temp
|
|
30
|
+
|
|
31
|
+
@ensure_yield
|
|
32
|
+
async def deactivate(self) -> None:
|
|
33
|
+
self._temp = Temperature(target=None, current=23)
|
|
34
|
+
|
|
35
|
+
@ensure_yield
|
|
36
|
+
async def connect(self) -> None:
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
@ensure_yield
|
|
40
|
+
async def is_connected(self) -> bool:
|
|
41
|
+
return True
|
|
42
|
+
|
|
43
|
+
@ensure_yield
|
|
44
|
+
async def disconnect(self) -> None:
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
@ensure_yield
|
|
48
|
+
async def enter_programming_mode(self) -> None:
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
@ensure_yield
|
|
52
|
+
async def get_device_info(self) -> Dict[str, str]:
|
|
53
|
+
return {
|
|
54
|
+
"serial": self._serial_number if self._serial_number else "dummySerialTD",
|
|
55
|
+
"model": self._model,
|
|
56
|
+
"version": "dummyVersionTD",
|
|
57
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from .driver import ThermocyclerDriver, ThermocyclerDriverV2, ThermocyclerDriverFactory
|
|
2
|
+
from .simulator import SimulatingDriver
|
|
3
|
+
from .abstract import AbstractThermocyclerDriver
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"ThermocyclerDriver",
|
|
8
|
+
"ThermocyclerDriverV2",
|
|
9
|
+
"ThermocyclerDriverFactory",
|
|
10
|
+
"SimulatingDriver",
|
|
11
|
+
"AbstractThermocyclerDriver",
|
|
12
|
+
]
|