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,86 @@
|
|
|
1
|
+
from opentrons.config import advanced_settings as advs
|
|
2
|
+
from opentrons_shared_data.robot.types import RobotTypeEnum
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def short_fixed_trash() -> bool:
|
|
6
|
+
return advs.get_setting_with_env_overload("shortFixedTrash", RobotTypeEnum.OT2)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def dots_deck_type() -> bool:
|
|
10
|
+
return advs.get_setting_with_env_overload("deckCalibrationDots", RobotTypeEnum.OT2)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def disable_home_on_boot() -> bool:
|
|
14
|
+
return advs.get_setting_with_env_overload("disableHomeOnBoot", RobotTypeEnum.OT2)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def use_old_aspiration_functions() -> bool:
|
|
18
|
+
return advs.get_setting_with_env_overload(
|
|
19
|
+
"useOldAspirationFunctions", RobotTypeEnum.OT2
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def enable_door_safety_switch(robot_type: RobotTypeEnum) -> bool:
|
|
24
|
+
return advs.get_setting_with_env_overload("enableDoorSafetySwitch", robot_type)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def enable_ot3_hardware_controller() -> bool:
|
|
28
|
+
"""Get whether to use the OT-3 hardware controller."""
|
|
29
|
+
|
|
30
|
+
return advs.get_setting_with_env_overload(
|
|
31
|
+
"enableOT3HardwareController", RobotTypeEnum.FLEX
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def rear_panel_integration() -> bool:
|
|
36
|
+
"""Whether to enable usb connected rear_panel for the OT-3."""
|
|
37
|
+
|
|
38
|
+
return advs.get_setting_with_env_overload(
|
|
39
|
+
"rearPanelIntegration", RobotTypeEnum.FLEX
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def stall_detection_enabled() -> bool:
|
|
44
|
+
return not advs.get_setting_with_env_overload(
|
|
45
|
+
"disableStallDetection", RobotTypeEnum.FLEX
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def overpressure_detection_enabled() -> bool:
|
|
50
|
+
return not advs.get_setting_with_env_overload(
|
|
51
|
+
"disableOverpressureDetection", RobotTypeEnum.FLEX
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def status_bar_enabled() -> bool:
|
|
56
|
+
"""Whether the status bar is enabled."""
|
|
57
|
+
return not advs.get_setting_with_env_overload(
|
|
58
|
+
"disableStatusBar", RobotTypeEnum.FLEX
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def require_estop() -> bool:
|
|
63
|
+
"""Whether the OT3 should allow gantry movements with no Estop plugged in."""
|
|
64
|
+
return not advs.get_setting_with_env_overload(
|
|
65
|
+
"estopNotRequired", RobotTypeEnum.FLEX
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def enable_error_recovery_experiments() -> bool:
|
|
70
|
+
return advs.get_setting_with_env_overload(
|
|
71
|
+
"enableErrorRecoveryExperiments", RobotTypeEnum.FLEX
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def enable_performance_metrics(robot_type: RobotTypeEnum) -> bool:
|
|
76
|
+
return advs.get_setting_with_env_overload("enablePerformanceMetrics", robot_type)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def oem_mode_enabled() -> bool:
|
|
80
|
+
return advs.get_setting_with_env_overload("enableOEMMode", RobotTypeEnum.FLEX)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def flex_stacker_tof_sensors_disabled() -> bool:
|
|
84
|
+
return advs.get_setting_with_env_overload(
|
|
85
|
+
"disableFlexStackerLabwareDetection", RobotTypeEnum.FLEX
|
|
86
|
+
)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from opentrons_shared_data.gripper import (
|
|
5
|
+
load_definition,
|
|
6
|
+
GripperModel,
|
|
7
|
+
GripperDefinition,
|
|
8
|
+
GripForceProfile,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
log = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
DEFAULT_GRIPPER_CALIBRATION_OFFSET = [0.0, 0.0, 0.0]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def info_num_to_model(num: str) -> GripperModel:
|
|
17
|
+
"""Returns a GripperModel from a string in the format X.Y.
|
|
18
|
+
where X is the major model and Y is the minor model
|
|
19
|
+
"""
|
|
20
|
+
major_model = num[0]
|
|
21
|
+
minor_model = num[2]
|
|
22
|
+
# we provisioned the some EVT grippers as 01 and some as 10
|
|
23
|
+
# DVT will now be 1.1
|
|
24
|
+
# PVT will now be 1.2
|
|
25
|
+
model_map = {
|
|
26
|
+
"0": {"0": GripperModel.v1, "1": GripperModel.v1},
|
|
27
|
+
"1": {
|
|
28
|
+
"0": GripperModel.v1,
|
|
29
|
+
"1": GripperModel.v1_1,
|
|
30
|
+
"2": GripperModel.v1_2,
|
|
31
|
+
"3": GripperModel.v1_3,
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
return model_map[major_model][minor_model]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def load(gripper_model: GripperModel) -> GripperDefinition:
|
|
38
|
+
return load_definition(gripper_model)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def duty_cycle_by_force(newton: float, profile: GripForceProfile) -> float:
|
|
42
|
+
"""
|
|
43
|
+
Takes a force in newton and a sequence representing the polymomial
|
|
44
|
+
equation of the gripper's force function in terms of duty cycle, where the
|
|
45
|
+
integer represent the degree of the indeterminate (duty cycle), and
|
|
46
|
+
the float representing its constant coefficient.
|
|
47
|
+
|
|
48
|
+
The values come from shared-data/gripper/definitions/{schemaVersion}/{model}.json.
|
|
49
|
+
|
|
50
|
+
:return: the duty-cycle value for the specified force
|
|
51
|
+
"""
|
|
52
|
+
if profile.min <= newton <= profile.max:
|
|
53
|
+
return sum(ele[1] * (newton ** ele[0]) for ele in profile.polynomial)
|
|
54
|
+
else:
|
|
55
|
+
raise ValueError("Gripper force out of bounds")
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import shutil
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import NamedTuple, Dict, Set
|
|
7
|
+
|
|
8
|
+
from opentrons_shared_data.robot.types import RobotTypeEnum
|
|
9
|
+
from opentrons.config import IS_ROBOT
|
|
10
|
+
from opentrons.calibration_storage import (
|
|
11
|
+
delete_robot_deck_attitude,
|
|
12
|
+
gripper_offset,
|
|
13
|
+
ot2,
|
|
14
|
+
ot3,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
DATA_BOOT_D = Path("/data/boot.d")
|
|
19
|
+
AUTHORIZED_KEYS = Path(os.path.expanduser("~/.ssh/authorized_keys"))
|
|
20
|
+
|
|
21
|
+
log = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class UnrecognizedOption(Exception):
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CommonResetOption(NamedTuple):
|
|
29
|
+
name: str
|
|
30
|
+
description: str
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ResetOptionId(str, Enum):
|
|
34
|
+
"""The available reset options"""
|
|
35
|
+
|
|
36
|
+
boot_scripts = "bootScripts"
|
|
37
|
+
deck_calibration = "deckCalibration"
|
|
38
|
+
deck_configuration = "deckConfiguration"
|
|
39
|
+
pipette_offset = "pipetteOffsetCalibrations"
|
|
40
|
+
gripper_offset = "gripperOffsetCalibrations"
|
|
41
|
+
tip_length_calibrations = "tipLengthCalibrations"
|
|
42
|
+
runs_history = "runsHistory"
|
|
43
|
+
on_device_display = "onDeviceDisplay"
|
|
44
|
+
module_calibration = "moduleCalibration"
|
|
45
|
+
authorized_keys = "authorizedKeys"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
_OT_2_RESET_OPTIONS = [
|
|
49
|
+
ResetOptionId.boot_scripts,
|
|
50
|
+
ResetOptionId.deck_calibration,
|
|
51
|
+
ResetOptionId.pipette_offset,
|
|
52
|
+
ResetOptionId.tip_length_calibrations,
|
|
53
|
+
ResetOptionId.runs_history,
|
|
54
|
+
ResetOptionId.deck_configuration,
|
|
55
|
+
ResetOptionId.authorized_keys,
|
|
56
|
+
]
|
|
57
|
+
_FLEX_RESET_OPTIONS = [
|
|
58
|
+
ResetOptionId.boot_scripts,
|
|
59
|
+
ResetOptionId.pipette_offset,
|
|
60
|
+
ResetOptionId.gripper_offset,
|
|
61
|
+
ResetOptionId.runs_history,
|
|
62
|
+
ResetOptionId.on_device_display,
|
|
63
|
+
ResetOptionId.deck_configuration,
|
|
64
|
+
ResetOptionId.module_calibration,
|
|
65
|
+
ResetOptionId.authorized_keys,
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
_settings_reset_options = {
|
|
69
|
+
ResetOptionId.boot_scripts: CommonResetOption(
|
|
70
|
+
name="Boot Scripts", description="Clear custom boot scripts"
|
|
71
|
+
),
|
|
72
|
+
ResetOptionId.deck_calibration: CommonResetOption(
|
|
73
|
+
name="Deck Calibration",
|
|
74
|
+
description="Clear deck calibration (will also clear pipette offset)",
|
|
75
|
+
),
|
|
76
|
+
ResetOptionId.pipette_offset: CommonResetOption(
|
|
77
|
+
name="Pipette Offset Calibrations",
|
|
78
|
+
description="Clear pipette offset calibrations",
|
|
79
|
+
),
|
|
80
|
+
ResetOptionId.gripper_offset: CommonResetOption(
|
|
81
|
+
name="Gripper Offset Calibrations",
|
|
82
|
+
description="Clear gripper offset calibrations",
|
|
83
|
+
),
|
|
84
|
+
ResetOptionId.tip_length_calibrations: CommonResetOption(
|
|
85
|
+
name="Tip Length Calibrations",
|
|
86
|
+
description="Clear tip length calibrations (will also clear pipette offset)",
|
|
87
|
+
),
|
|
88
|
+
# TODO(mm, 2022-05-23): runs_history, on_device_display, and deck_configuration are
|
|
89
|
+
# robot-server things, and are not concepts known to this package (the `opentrons` library).
|
|
90
|
+
# This option is defined here only as a convenience for robot-server.
|
|
91
|
+
# Find a way to split things up and define this in robot-server instead.
|
|
92
|
+
ResetOptionId.runs_history: CommonResetOption(
|
|
93
|
+
name="Clear Robot Server Data",
|
|
94
|
+
description=(
|
|
95
|
+
"Erase everything stored by the robot server. This is *not* everything stored"
|
|
96
|
+
" on the robot. It currently includes runs, protocols, labware offsets, and more,"
|
|
97
|
+
" and the exact list may change over time. This is exposed for troubleshooting"
|
|
98
|
+
" and system recovery. The name `runsHistory` is a misnomer, for historical reasons."
|
|
99
|
+
),
|
|
100
|
+
),
|
|
101
|
+
ResetOptionId.on_device_display: CommonResetOption(
|
|
102
|
+
name="On-Device Display Configuration",
|
|
103
|
+
description="Clear the configuration of the on-device display (touchscreen)",
|
|
104
|
+
),
|
|
105
|
+
ResetOptionId.deck_configuration: CommonResetOption(
|
|
106
|
+
name="Deck Configuration",
|
|
107
|
+
description="Clear deck configuration",
|
|
108
|
+
),
|
|
109
|
+
ResetOptionId.module_calibration: CommonResetOption(
|
|
110
|
+
name="Module Calibrations", description="Clear module offset calibrations"
|
|
111
|
+
),
|
|
112
|
+
ResetOptionId.authorized_keys: CommonResetOption(
|
|
113
|
+
name="SSH Authorized Keys", description="Clear the ssh authorized keys"
|
|
114
|
+
),
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def reset_options(robot_type: RobotTypeEnum) -> Dict[ResetOptionId, CommonResetOption]:
|
|
119
|
+
reset_options_for_robot_type = (
|
|
120
|
+
_OT_2_RESET_OPTIONS if robot_type is RobotTypeEnum.OT2 else _FLEX_RESET_OPTIONS
|
|
121
|
+
)
|
|
122
|
+
return {
|
|
123
|
+
key: _settings_reset_options[key]
|
|
124
|
+
for key in _settings_reset_options
|
|
125
|
+
if key in reset_options_for_robot_type
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def reset(options: Set[ResetOptionId], robot_type: RobotTypeEnum) -> None:
|
|
130
|
+
"""
|
|
131
|
+
Execute a reset of the requested parts of the user configuration.
|
|
132
|
+
|
|
133
|
+
:param options: the parts to reset
|
|
134
|
+
"""
|
|
135
|
+
log.info("Reset requested for %s", options)
|
|
136
|
+
|
|
137
|
+
if ResetOptionId.boot_scripts in options:
|
|
138
|
+
reset_boot_scripts()
|
|
139
|
+
|
|
140
|
+
if ResetOptionId.deck_calibration in options:
|
|
141
|
+
reset_deck_calibration(robot_type)
|
|
142
|
+
|
|
143
|
+
if ResetOptionId.pipette_offset in options:
|
|
144
|
+
reset_pipette_offset(robot_type)
|
|
145
|
+
|
|
146
|
+
if ResetOptionId.tip_length_calibrations in options:
|
|
147
|
+
reset_tip_length_calibrations(robot_type)
|
|
148
|
+
|
|
149
|
+
if ResetOptionId.gripper_offset in options:
|
|
150
|
+
reset_gripper_offset()
|
|
151
|
+
|
|
152
|
+
if ResetOptionId.module_calibration in options:
|
|
153
|
+
reset_module_calibration()
|
|
154
|
+
|
|
155
|
+
if ResetOptionId.authorized_keys in options:
|
|
156
|
+
reset_authorized_keys()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def reset_boot_scripts() -> None:
|
|
160
|
+
if IS_ROBOT:
|
|
161
|
+
if os.path.exists(DATA_BOOT_D):
|
|
162
|
+
shutil.rmtree(DATA_BOOT_D)
|
|
163
|
+
else:
|
|
164
|
+
log.debug(f"Not on pi, not removing {DATA_BOOT_D}")
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def reset_deck_calibration(robot_type: RobotTypeEnum) -> None:
|
|
168
|
+
delete_robot_deck_attitude()
|
|
169
|
+
ot2.clear_pipette_offset_calibrations() if robot_type is RobotTypeEnum.OT2 else ot3.clear_pipette_offset_calibrations()
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def reset_pipette_offset(robot_type: RobotTypeEnum) -> None:
|
|
173
|
+
ot2.clear_pipette_offset_calibrations() if robot_type is RobotTypeEnum.OT2 else ot3.clear_pipette_offset_calibrations()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def reset_gripper_offset() -> None:
|
|
177
|
+
gripper_offset.clear_gripper_calibration_offsets()
|
|
178
|
+
gripper_offset.clear_gripper_jaw_width_data()
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def reset_tip_length_calibrations(robot_type: RobotTypeEnum) -> None:
|
|
182
|
+
if robot_type is RobotTypeEnum.OT2:
|
|
183
|
+
ot2.clear_tip_length_calibration()
|
|
184
|
+
ot2.clear_pipette_offset_calibrations()
|
|
185
|
+
else:
|
|
186
|
+
raise UnrecognizedOption("Tip Length calibration not supported on Flex")
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def reset_module_calibration() -> None:
|
|
190
|
+
try:
|
|
191
|
+
from opentrons.calibration_storage.ot3.module_offset import (
|
|
192
|
+
clear_module_offset_calibrations,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
clear_module_offset_calibrations()
|
|
196
|
+
except ImportError:
|
|
197
|
+
log.warning("Tried to clear module offset calibrations on an OT-2")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def reset_authorized_keys() -> None:
|
|
201
|
+
if IS_ROBOT and os.path.exists(AUTHORIZED_KEYS):
|
|
202
|
+
with open(AUTHORIZED_KEYS, "w") as fh:
|
|
203
|
+
fh.write("")
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from typing import Any, Dict, List, Union, Optional, cast
|
|
7
|
+
from typing_extensions import Literal
|
|
8
|
+
|
|
9
|
+
from . import CONFIG, defaults_ot3, defaults_ot2, gripper_config, feature_flags as ff
|
|
10
|
+
from opentrons.hardware_control.types import BoardRevision
|
|
11
|
+
from .types import CurrentDict, RobotConfig, AxisDict, OT3Config
|
|
12
|
+
|
|
13
|
+
log = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def current_for_revision(
|
|
17
|
+
current_dict: CurrentDict, revision: BoardRevision
|
|
18
|
+
) -> AxisDict:
|
|
19
|
+
"""Pull the appropriate current value for the specified revision."""
|
|
20
|
+
if revision == BoardRevision.UNKNOWN:
|
|
21
|
+
return current_dict.get("2.1", current_dict["default"])
|
|
22
|
+
elif revision.real_name() in current_dict:
|
|
23
|
+
return current_dict[revision.real_name()] # type: ignore
|
|
24
|
+
else:
|
|
25
|
+
return current_dict["default"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def build_config(robot_settings: Dict[str, Any]) -> Union[RobotConfig, OT3Config]:
|
|
29
|
+
"""Build the appropriate config object for the machine.
|
|
30
|
+
|
|
31
|
+
Which config object should be used will be detected from the specified config
|
|
32
|
+
object.
|
|
33
|
+
"""
|
|
34
|
+
default_robot_model: Union[Literal["OT-3 Standard"], Literal["OT-2 Standard"]] = (
|
|
35
|
+
"OT-3 Standard" if ff.enable_ot3_hardware_controller() else "OT-2 Standard"
|
|
36
|
+
)
|
|
37
|
+
robot_model = robot_settings.get("model", default_robot_model)
|
|
38
|
+
if robot_model == "OT-3 Standard":
|
|
39
|
+
return build_config_ot3(robot_settings)
|
|
40
|
+
else:
|
|
41
|
+
return build_config_ot2(robot_settings)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def build_config_ot2(robot_settings: Dict[str, Any]) -> RobotConfig:
|
|
45
|
+
"""Build an OT2 config object with default values for unspecified elements."""
|
|
46
|
+
return defaults_ot2.build_with_defaults(robot_settings)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def build_config_ot3(robot_settings: Dict[str, Any]) -> OT3Config:
|
|
50
|
+
"""Build an OT3 config object with default values for unspecified elements."""
|
|
51
|
+
return defaults_ot3.build_with_defaults(robot_settings)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def config_to_save(config: Union[RobotConfig, OT3Config]) -> Dict[str, Any]:
|
|
55
|
+
"""Turn the config into a serializable dictionary."""
|
|
56
|
+
if config.model == "OT-2 Standard":
|
|
57
|
+
return defaults_ot2.serialize(config)
|
|
58
|
+
else:
|
|
59
|
+
return defaults_ot3.serialize(config)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _load_file() -> Dict[str, Any]:
|
|
63
|
+
settings_file = CONFIG["robot_settings_file"]
|
|
64
|
+
log.debug("Loading robot settings from {}".format(settings_file))
|
|
65
|
+
return _load_json(settings_file) or {}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def load() -> Union[RobotConfig, OT3Config]:
|
|
69
|
+
"""Load the appropriate config, if it exists, or build defaults."""
|
|
70
|
+
return build_config(_load_file())
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def load_ot2() -> RobotConfig:
|
|
74
|
+
"""Load an OT2 config, or build defaults."""
|
|
75
|
+
return build_config_ot2(_load_file())
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def load_ot3() -> OT3Config:
|
|
79
|
+
"""Load an OT3 config, or build defaults."""
|
|
80
|
+
return build_config_ot3(_load_file())
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def save_robot_settings(
|
|
84
|
+
config: Union[RobotConfig, OT3Config],
|
|
85
|
+
rs_filename: Optional[str] = None,
|
|
86
|
+
tag: Optional[str] = None,
|
|
87
|
+
) -> Dict[str, Any]:
|
|
88
|
+
"""Save the specified config to disk as a JSON file."""
|
|
89
|
+
config_dict = config_to_save(config)
|
|
90
|
+
config_json = json_to_save(config_dict)
|
|
91
|
+
|
|
92
|
+
# Save everything else in a different file
|
|
93
|
+
filename = rs_filename or CONFIG["robot_settings_file"]
|
|
94
|
+
if tag:
|
|
95
|
+
root, ext = os.path.splitext(filename)
|
|
96
|
+
filename = "{}-{}{}".format(root, tag, ext)
|
|
97
|
+
_save_config_data(config_json, filename=filename)
|
|
98
|
+
|
|
99
|
+
return config_dict
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def json_to_save(config: Dict[str, Any]) -> str:
|
|
103
|
+
"""Build a JSON object of the config, ready to store on disk."""
|
|
104
|
+
return json.dumps(config, sort_keys=True, indent=4)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def backup_configuration(
|
|
108
|
+
config: Union[RobotConfig, OT3Config], tag: Optional[str] = None
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Save a backup, tagged by timestamp, of the config."""
|
|
111
|
+
import time
|
|
112
|
+
|
|
113
|
+
if not tag:
|
|
114
|
+
tag = str(int(time.time() * 1000))
|
|
115
|
+
save_robot_settings(config, tag=tag)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def get_legacy_gantry_calibration() -> Optional[List[List[float]]]:
|
|
119
|
+
"""
|
|
120
|
+
Returns the legacy gantry calibration if exists.
|
|
121
|
+
|
|
122
|
+
This should happen only if the new deck calibration file does not exist.
|
|
123
|
+
The legacy calibration should then be migrated to the new format.
|
|
124
|
+
"""
|
|
125
|
+
gantry_cal = _load_json(CONFIG["deck_calibration_file"])
|
|
126
|
+
if "gantry_calibration" in gantry_cal:
|
|
127
|
+
return gantry_cal["gantry_calibration"] # type: ignore[no-any-return]
|
|
128
|
+
else:
|
|
129
|
+
return None
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def clear() -> None:
|
|
133
|
+
_clear_file(CONFIG["robot_settings_file"])
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _clear_file(filename: Union[str, Path]) -> None:
|
|
137
|
+
log.debug("Deleting {}".format(filename))
|
|
138
|
+
if os.path.exists(filename):
|
|
139
|
+
os.remove(filename)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# TODO: move to util (write a default load, save JSON function)
|
|
143
|
+
def _load_json(filename: Union[str, Path]) -> Dict[str, Any]:
|
|
144
|
+
try:
|
|
145
|
+
with open(filename, "r") as file:
|
|
146
|
+
res = json.load(file)
|
|
147
|
+
except FileNotFoundError:
|
|
148
|
+
log.warning("{0} not found. Loading defaults".format(filename))
|
|
149
|
+
res = {}
|
|
150
|
+
except json.decoder.JSONDecodeError:
|
|
151
|
+
log.warning("{0} is corrupt. Loading defaults".format(filename), exc_info=True)
|
|
152
|
+
res = {}
|
|
153
|
+
return cast(Dict[str, Any], res)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _save_config_data(data: str, filename: Union[str, Path]) -> None:
|
|
157
|
+
try:
|
|
158
|
+
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
|
159
|
+
with open(filename, "w") as file:
|
|
160
|
+
file.write(data)
|
|
161
|
+
file.flush()
|
|
162
|
+
os.fsync(file.fileno())
|
|
163
|
+
except OSError:
|
|
164
|
+
log.exception("Write failed with exception:")
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def default_ot2_deck_calibration() -> List[List[float]]:
|
|
168
|
+
return defaults_ot2.DEFAULT_DECK_CALIBRATION_V2
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def default_ot3_deck_calibration() -> List[List[float]]:
|
|
172
|
+
return defaults_ot3.DEFAULT_BELT_ATTITUDE
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def default_pipette_offset() -> List[float]:
|
|
176
|
+
if ff.enable_ot3_hardware_controller():
|
|
177
|
+
return defaults_ot3.DEFAULT_PIPETTE_OFFSET
|
|
178
|
+
else:
|
|
179
|
+
return defaults_ot2.DEFAULT_PIPETTE_OFFSET
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def default_gripper_calibration_offset() -> List[float]:
|
|
183
|
+
return gripper_config.DEFAULT_GRIPPER_CALIBRATION_OFFSET
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def default_module_calibration_offset() -> List[float]:
|
|
187
|
+
return defaults_ot3.DEFAULT_MODULE_OFFSET
|