opentrons 8.6.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +501 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +183 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +215 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1115 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +396 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1025 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3212 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1425 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +349 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +58 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1158 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2359 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1459 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1500 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +308 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +303 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +848 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0a1.dist-info/METADATA +37 -0
- opentrons-8.6.0a1.dist-info/RECORD +600 -0
- opentrons-8.6.0a1.dist-info/WHEEL +4 -0
- opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,871 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from functools import lru_cache
|
|
6
|
+
from typing import (
|
|
7
|
+
TYPE_CHECKING,
|
|
8
|
+
Any,
|
|
9
|
+
Dict,
|
|
10
|
+
Mapping,
|
|
11
|
+
Tuple,
|
|
12
|
+
Union,
|
|
13
|
+
Optional,
|
|
14
|
+
NamedTuple,
|
|
15
|
+
cast,
|
|
16
|
+
List,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from opentrons.config import CONFIG
|
|
20
|
+
from opentrons_shared_data.robot.types import RobotTypeEnum
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
log = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
SettingsMap = Dict[str, Optional[bool]]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SettingException(Exception):
|
|
32
|
+
def __init__(self, message: str, error: str) -> None:
|
|
33
|
+
super(Exception, self).__init__(message)
|
|
34
|
+
self.error = error
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SettingsData(NamedTuple):
|
|
38
|
+
settings_map: SettingsMap
|
|
39
|
+
version: int
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class SettingDefinition:
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
_id: str,
|
|
46
|
+
title: str,
|
|
47
|
+
description: str,
|
|
48
|
+
robot_type: List[RobotTypeEnum],
|
|
49
|
+
old_id: Optional[str] = None,
|
|
50
|
+
restart_required: bool = False,
|
|
51
|
+
show_if: Optional[Tuple[str, bool]] = None,
|
|
52
|
+
internal_only: bool = False,
|
|
53
|
+
default_true_on_robot_types: Optional[List[RobotTypeEnum]] = None,
|
|
54
|
+
):
|
|
55
|
+
self.id = _id
|
|
56
|
+
#: The id of the setting for programmatic access through
|
|
57
|
+
#: get_adv_setting
|
|
58
|
+
self.old_id = old_id
|
|
59
|
+
#: the old id before migration, if any
|
|
60
|
+
self.title = title
|
|
61
|
+
#: User facing title
|
|
62
|
+
self.description = description
|
|
63
|
+
#: User facing description
|
|
64
|
+
self.restart_required = restart_required
|
|
65
|
+
#: True if the user must restart
|
|
66
|
+
self.show_if = show_if
|
|
67
|
+
#: A tuple of (other setting id, setting value) that must match reality
|
|
68
|
+
#: to show this setting in http endpoints
|
|
69
|
+
self.robot_type = robot_type
|
|
70
|
+
#: A list of RobotTypeEnums that are compatible with this feature flag.
|
|
71
|
+
self.internal_only = internal_only
|
|
72
|
+
#: A flag determining whether this setting is user-facing.
|
|
73
|
+
self.default_true_on_robot_types = default_true_on_robot_types or []
|
|
74
|
+
#: Robot types for which null/unset means the setting is activated
|
|
75
|
+
|
|
76
|
+
def __repr__(self) -> str:
|
|
77
|
+
return "{}: {}".format(self.__class__, self.id)
|
|
78
|
+
|
|
79
|
+
def should_show(self) -> bool:
|
|
80
|
+
"""
|
|
81
|
+
Use show_if attribute to determine if setting should be presented
|
|
82
|
+
to users
|
|
83
|
+
"""
|
|
84
|
+
if not self.show_if:
|
|
85
|
+
return True
|
|
86
|
+
return (
|
|
87
|
+
get_setting_with_env_overload(self.show_if[0], self.robot_type[0])
|
|
88
|
+
== self.show_if[1]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
async def on_change(self, value: Optional[bool]) -> None:
|
|
92
|
+
"""
|
|
93
|
+
An opportunity for side effects as a result of change a setting
|
|
94
|
+
value
|
|
95
|
+
"""
|
|
96
|
+
if self.restart_required:
|
|
97
|
+
set_restart_required()
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class Setting(NamedTuple):
|
|
101
|
+
value: Optional[bool]
|
|
102
|
+
definition: SettingDefinition
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# If you add or remove any settings here BE SURE TO ADD A MIGRATION below.
|
|
106
|
+
# You will also need to update the migration tests in:
|
|
107
|
+
# api/tests/opentrons/config/test_advanced_settings_migration.py
|
|
108
|
+
settings = [
|
|
109
|
+
SettingDefinition(
|
|
110
|
+
_id="shortFixedTrash",
|
|
111
|
+
old_id="short-fixed-trash",
|
|
112
|
+
title="Short (55mm) fixed trash",
|
|
113
|
+
description="Trash box is 55mm tall (rather than the 77mm default)",
|
|
114
|
+
robot_type=[RobotTypeEnum.OT2],
|
|
115
|
+
),
|
|
116
|
+
SettingDefinition(
|
|
117
|
+
_id="deckCalibrationDots",
|
|
118
|
+
old_id="dots-deck-type",
|
|
119
|
+
title="Deck calibration to dots",
|
|
120
|
+
description="Perform deck calibration to dots rather than crosses, for"
|
|
121
|
+
" robots that do not have crosses etched on the deck",
|
|
122
|
+
robot_type=[RobotTypeEnum.OT2],
|
|
123
|
+
),
|
|
124
|
+
SettingDefinition(
|
|
125
|
+
_id="disableHomeOnBoot",
|
|
126
|
+
old_id="disable-home-on-boot",
|
|
127
|
+
title="Disable home on boot",
|
|
128
|
+
description="Prevent robot from homing motors on boot",
|
|
129
|
+
robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX],
|
|
130
|
+
),
|
|
131
|
+
SettingDefinition(
|
|
132
|
+
_id="useOldAspirationFunctions",
|
|
133
|
+
title="Use older aspirate behavior",
|
|
134
|
+
description="Aspirate with the less accurate volumetric calibrations"
|
|
135
|
+
" that were used before version 3.7.0. Use this if you"
|
|
136
|
+
" need consistency with pre-v3.7.0 results. This only"
|
|
137
|
+
" affects GEN1 P10S, P10M, P50S, P50M, and P300S pipettes.",
|
|
138
|
+
robot_type=[RobotTypeEnum.OT2],
|
|
139
|
+
),
|
|
140
|
+
SettingDefinition(
|
|
141
|
+
_id="enableDoorSafetySwitch",
|
|
142
|
+
title="Enable robot door safety switch",
|
|
143
|
+
description="Automatically pause protocols when robot door opens. "
|
|
144
|
+
"Opening the robot door during a run will "
|
|
145
|
+
"pause your robot only after it has completed its "
|
|
146
|
+
"current motion.",
|
|
147
|
+
robot_type=[RobotTypeEnum.OT2],
|
|
148
|
+
default_true_on_robot_types=[RobotTypeEnum.FLEX],
|
|
149
|
+
),
|
|
150
|
+
SettingDefinition(
|
|
151
|
+
_id="enableOT3HardwareController",
|
|
152
|
+
title="Enable experimental OT-3 hardware controller",
|
|
153
|
+
description=(
|
|
154
|
+
"Do not enable. This is an Opentrons-internal setting to test "
|
|
155
|
+
"new hardware."
|
|
156
|
+
),
|
|
157
|
+
restart_required=True,
|
|
158
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
159
|
+
internal_only=True,
|
|
160
|
+
),
|
|
161
|
+
SettingDefinition(
|
|
162
|
+
_id="rearPanelIntegration",
|
|
163
|
+
title="Enable robots with the new usb connected rear-panel board.",
|
|
164
|
+
description="This is an Opentrons-internal setting to test new rear-panel.",
|
|
165
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
166
|
+
internal_only=True,
|
|
167
|
+
),
|
|
168
|
+
SettingDefinition(
|
|
169
|
+
_id="disableStallDetection",
|
|
170
|
+
title="Disable stall detection on the Flex.",
|
|
171
|
+
description="This is an Opentrons-internal setting for hardware-testing.",
|
|
172
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
173
|
+
),
|
|
174
|
+
SettingDefinition(
|
|
175
|
+
_id="disableStatusBar",
|
|
176
|
+
title="Disable the LED status bar on the Flex.",
|
|
177
|
+
description="This setting disables the LED status bar on the Flex.",
|
|
178
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
179
|
+
),
|
|
180
|
+
SettingDefinition(
|
|
181
|
+
_id="estopNotRequired",
|
|
182
|
+
title="If enabled, the Flex gantry can move with no estop attached.",
|
|
183
|
+
description="This setting allows the gantry on the Flex to move with no estop attached.",
|
|
184
|
+
show_if=(
|
|
185
|
+
"estopNotRequired",
|
|
186
|
+
True,
|
|
187
|
+
), # Configured so this only shows if it has been set by a user
|
|
188
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
189
|
+
internal_only=True,
|
|
190
|
+
),
|
|
191
|
+
SettingDefinition(
|
|
192
|
+
_id="disableOverpressureDetection",
|
|
193
|
+
title="Disable Flex pipette pressure sensing.",
|
|
194
|
+
description="When this setting is on, Flex will continue its activities regardless of pressure changes inside the pipette. Do not turn this setting on unless you are intentionally causing pressures over 8 kPa inside the pipette air channel.",
|
|
195
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
196
|
+
),
|
|
197
|
+
SettingDefinition(
|
|
198
|
+
_id="enableErrorRecoveryExperiments",
|
|
199
|
+
title="Enable error recovery experiments",
|
|
200
|
+
description=(
|
|
201
|
+
"Do not enable."
|
|
202
|
+
" This is an Opentrons internal setting to enable additional,"
|
|
203
|
+
" in-development error recovery features."
|
|
204
|
+
),
|
|
205
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
206
|
+
internal_only=True,
|
|
207
|
+
),
|
|
208
|
+
SettingDefinition(
|
|
209
|
+
_id="enableOEMMode",
|
|
210
|
+
title="Enable OEM Mode",
|
|
211
|
+
description="This setting anonymizes Opentrons branding in the ODD app.",
|
|
212
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
213
|
+
),
|
|
214
|
+
SettingDefinition(
|
|
215
|
+
_id="enablePerformanceMetrics",
|
|
216
|
+
title="Enable performance metrics",
|
|
217
|
+
description=(
|
|
218
|
+
"Do not enable."
|
|
219
|
+
" This is an Opentrons internal setting to collect performance metrics."
|
|
220
|
+
" Do not turn this on unless you are playing with the performance metrics system."
|
|
221
|
+
),
|
|
222
|
+
robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX],
|
|
223
|
+
internal_only=True,
|
|
224
|
+
),
|
|
225
|
+
SettingDefinition(
|
|
226
|
+
_id="disableFlexStackerLabwareDetection",
|
|
227
|
+
title="Disable Flex Stacker's labware detection features",
|
|
228
|
+
description=(
|
|
229
|
+
"Flex Stackers will ignore labware's presence in the hopper and on the shuttle. Protocol runs will no longer raise the following recoverable errors: Hopper Empty, Shuttle Empty and Shuttle Occupied."
|
|
230
|
+
),
|
|
231
|
+
robot_type=[RobotTypeEnum.FLEX],
|
|
232
|
+
),
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
settings_by_id: Dict[str, SettingDefinition] = {s.id: s for s in settings}
|
|
237
|
+
settings_by_old_id: Dict[str, SettingDefinition] = {
|
|
238
|
+
s.old_id: s for s in settings if s.old_id
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def get_setting_definition(setting_id: str) -> Optional[SettingDefinition]:
|
|
243
|
+
clean = _clean_id(setting_id)
|
|
244
|
+
for setting in settings:
|
|
245
|
+
if setting.id == clean:
|
|
246
|
+
return setting
|
|
247
|
+
return None
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def get_adv_setting(setting: str, robot_type: RobotTypeEnum) -> Optional[Setting]:
|
|
251
|
+
setting = _clean_id(setting)
|
|
252
|
+
s = get_all_adv_settings(robot_type, include_internal=True)
|
|
253
|
+
return s.get(setting, None)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _filtered_key(
|
|
257
|
+
definition: SettingDefinition,
|
|
258
|
+
robot_type: RobotTypeEnum,
|
|
259
|
+
include_internal: bool,
|
|
260
|
+
) -> bool:
|
|
261
|
+
if include_internal:
|
|
262
|
+
return robot_type in definition.robot_type
|
|
263
|
+
else:
|
|
264
|
+
return robot_type in definition.robot_type and not definition.internal_only
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@lru_cache(maxsize=1)
|
|
268
|
+
def get_all_adv_settings(
|
|
269
|
+
robot_type: RobotTypeEnum, include_internal: bool = False
|
|
270
|
+
) -> Dict[str, Setting]:
|
|
271
|
+
"""Get all the advanced setting values and definitions"""
|
|
272
|
+
settings_file = CONFIG["feature_flags_file"]
|
|
273
|
+
|
|
274
|
+
values, _ = _read_settings_file(settings_file)
|
|
275
|
+
|
|
276
|
+
return {
|
|
277
|
+
key: Setting(value=value, definition=settings_by_id[key])
|
|
278
|
+
for key, value in values.items()
|
|
279
|
+
if key in settings_by_id
|
|
280
|
+
and _filtered_key(settings_by_id[key], robot_type, include_internal)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
async def set_adv_setting(_id: str, value: Optional[bool]) -> None:
|
|
285
|
+
_id = _clean_id(_id)
|
|
286
|
+
settings_file = CONFIG["feature_flags_file"]
|
|
287
|
+
setting_data = _read_settings_file(settings_file)
|
|
288
|
+
if _id not in setting_data.settings_map:
|
|
289
|
+
raise ValueError(f"{_id} is not recognized")
|
|
290
|
+
# Side effecting
|
|
291
|
+
await settings_by_id[_id].on_change(value)
|
|
292
|
+
|
|
293
|
+
setting_data.settings_map[_id] = value
|
|
294
|
+
_write_settings_file(setting_data.settings_map, setting_data.version, settings_file)
|
|
295
|
+
# Clear the lru cache
|
|
296
|
+
get_all_adv_settings.cache_clear()
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def _clean_id(_id: str) -> str:
|
|
300
|
+
if _id in settings_by_old_id.keys():
|
|
301
|
+
_id = settings_by_old_id[_id].id
|
|
302
|
+
return _id
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def _read_json_file(path: Union[str, "Path"]) -> Dict[str, Any]:
|
|
306
|
+
try:
|
|
307
|
+
with open(path, "r") as fd:
|
|
308
|
+
data = json.load(fd)
|
|
309
|
+
except FileNotFoundError:
|
|
310
|
+
data = {}
|
|
311
|
+
except json.JSONDecodeError as e:
|
|
312
|
+
sys.stderr.write(f"Could not load advanced settings file {path}: {e}\n")
|
|
313
|
+
data = {}
|
|
314
|
+
return cast(Dict[str, Any], data)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def _read_settings_file(settings_file: "Path") -> SettingsData:
|
|
318
|
+
"""
|
|
319
|
+
Read the settings file, which is a json object with settings IDs as keys
|
|
320
|
+
and boolean values. For each key, look up the `Settings` object with that
|
|
321
|
+
key. If the key is one of the old IDs (kebab case), replace it with the
|
|
322
|
+
new ID and rewrite the settings file
|
|
323
|
+
|
|
324
|
+
:param settings_file: the path to the settings file
|
|
325
|
+
:return: a dict with all new settings IDs as the keys, and boolean values
|
|
326
|
+
(the values stored in the settings file, or `False` if the key was not
|
|
327
|
+
found). Along with the version.
|
|
328
|
+
"""
|
|
329
|
+
# Read settings from persistent file
|
|
330
|
+
data = _read_json_file(settings_file)
|
|
331
|
+
settings, version = _migrate(data)
|
|
332
|
+
settings = _ensure(settings)
|
|
333
|
+
|
|
334
|
+
if data.get("_version") != version:
|
|
335
|
+
_write_settings_file(settings, version, settings_file)
|
|
336
|
+
|
|
337
|
+
return SettingsData(settings_map=settings, version=version)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def _write_settings_file(
|
|
341
|
+
data: Mapping[str, Any],
|
|
342
|
+
version: int,
|
|
343
|
+
settings_file: "Path",
|
|
344
|
+
) -> None:
|
|
345
|
+
try:
|
|
346
|
+
with settings_file.open("w") as fd:
|
|
347
|
+
json.dump({**data, "_version": version}, fd)
|
|
348
|
+
fd.flush()
|
|
349
|
+
os.fsync(fd.fileno())
|
|
350
|
+
except OSError:
|
|
351
|
+
log.exception(f"Failed to write advanced settings file to {settings_file}")
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def _migrate0to1(previous: Mapping[str, Any]) -> SettingsMap:
|
|
355
|
+
"""
|
|
356
|
+
Migrate to version 1 of the feature flags file. Replaces old IDs with new
|
|
357
|
+
IDs and sets any False values to None
|
|
358
|
+
"""
|
|
359
|
+
next: SettingsMap = {}
|
|
360
|
+
|
|
361
|
+
for s in settings:
|
|
362
|
+
id = s.id
|
|
363
|
+
old_id = s.old_id
|
|
364
|
+
|
|
365
|
+
if previous.get(id) is True:
|
|
366
|
+
next[id] = True
|
|
367
|
+
elif old_id and previous.get(old_id) is True:
|
|
368
|
+
next[id] = True
|
|
369
|
+
else:
|
|
370
|
+
next[id] = None
|
|
371
|
+
|
|
372
|
+
return next
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def _migrate1to2(previous: SettingsMap) -> SettingsMap:
|
|
376
|
+
"""
|
|
377
|
+
Migration to version 2 of the feature flags file. Adds the
|
|
378
|
+
disableLogAggregation config element.
|
|
379
|
+
"""
|
|
380
|
+
newmap = {k: v for k, v in previous.items()}
|
|
381
|
+
newmap["disableLogAggregation"] = None
|
|
382
|
+
return newmap
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def _migrate2to3(previous: SettingsMap) -> SettingsMap:
|
|
386
|
+
"""
|
|
387
|
+
Migration to version 3 of the feature flags file. Adds the
|
|
388
|
+
enableApi1BackCompat config element.
|
|
389
|
+
"""
|
|
390
|
+
newmap = {k: v for k, v in previous.items()}
|
|
391
|
+
newmap["enableApi1BackCompat"] = None
|
|
392
|
+
newmap["useProtocolApi2"] = None
|
|
393
|
+
return newmap
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def _migrate3to4(previous: SettingsMap) -> SettingsMap:
|
|
397
|
+
"""
|
|
398
|
+
Migration to version 4 of the feature flags file. Adds the
|
|
399
|
+
useV1HttpApi config element.
|
|
400
|
+
"""
|
|
401
|
+
newmap = {k: v for k, v in previous.items()}
|
|
402
|
+
newmap["useV1HttpApi"] = None
|
|
403
|
+
return newmap
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def _migrate4to5(previous: SettingsMap) -> SettingsMap:
|
|
407
|
+
"""
|
|
408
|
+
Migration to version 5 of the feature flags file. Adds the
|
|
409
|
+
enableDoorSafetyFeature config element.
|
|
410
|
+
"""
|
|
411
|
+
newmap = {k: v for k, v in previous.items()}
|
|
412
|
+
newmap["enableDoorSafetySwitch"] = None
|
|
413
|
+
return newmap
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
def _migrate5to6(previous: SettingsMap) -> SettingsMap:
|
|
417
|
+
"""
|
|
418
|
+
Migration to version 6 of the feature flags file. Adds the
|
|
419
|
+
enableTipLengthCalibration config element.
|
|
420
|
+
"""
|
|
421
|
+
newmap = {k: v for k, v in previous.items()}
|
|
422
|
+
newmap["enableTipLengthCalibration"] = None
|
|
423
|
+
return newmap
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def _migrate6to7(previous: SettingsMap) -> SettingsMap:
|
|
427
|
+
"""
|
|
428
|
+
Migration to version 7 of the feature flags file. Adds the
|
|
429
|
+
enableHttpProtocolSessions config element.
|
|
430
|
+
"""
|
|
431
|
+
newmap = {k: v for k, v in previous.items()}
|
|
432
|
+
newmap["enableHttpProtocolSessions"] = None
|
|
433
|
+
return newmap
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def _migrate7to8(previous: SettingsMap) -> SettingsMap:
|
|
437
|
+
"""
|
|
438
|
+
Migration to version 8 of the feature flags file. Adds the
|
|
439
|
+
enableFastProtocolUpload config element.
|
|
440
|
+
"""
|
|
441
|
+
newmap = {k: v for k, v in previous.items()}
|
|
442
|
+
newmap["enableFastProtocolUpload"] = None
|
|
443
|
+
return newmap
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def _migrate8to9(previous: SettingsMap) -> SettingsMap:
|
|
447
|
+
"""Migrate to version 9 of the feature flags file.
|
|
448
|
+
|
|
449
|
+
- Adds the enableProtocolEngine config element.
|
|
450
|
+
"""
|
|
451
|
+
newmap = {k: v for k, v in previous.items()}
|
|
452
|
+
newmap["enableProtocolEngine"] = None
|
|
453
|
+
return newmap
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
def _migrate9to10(previous: SettingsMap) -> SettingsMap:
|
|
457
|
+
"""Migrate to version 10 of the feature flags file.
|
|
458
|
+
|
|
459
|
+
- Removes deprecated useProtocolApi2 option
|
|
460
|
+
- Removes deprecated enableApi1BackCompat option
|
|
461
|
+
- Removed deprecated useV1HttpApi option
|
|
462
|
+
- Removes deprecated enableTipLengthCalibration option
|
|
463
|
+
- Removes deprecated enableFastProtocolUpload option
|
|
464
|
+
- Adds disableFastProtocolUpload option
|
|
465
|
+
"""
|
|
466
|
+
removals = [
|
|
467
|
+
"useProtocolApi2",
|
|
468
|
+
"enableApi1BackCompat",
|
|
469
|
+
"useV1HttpApi",
|
|
470
|
+
"enableTipLengthCalibration",
|
|
471
|
+
"enableFastProtocolUpload",
|
|
472
|
+
]
|
|
473
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
474
|
+
newmap["disableFastProtocolUpload"] = None
|
|
475
|
+
return newmap
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def _migrate10to11(previous: SettingsMap) -> SettingsMap:
|
|
479
|
+
"""Migrate to version 11 of the feature flags file.
|
|
480
|
+
|
|
481
|
+
- Removes deprecated enableProtocolEngine option
|
|
482
|
+
"""
|
|
483
|
+
removals = ["enableProtocolEngine"]
|
|
484
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
485
|
+
return newmap
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def _migrate11to12(previous: SettingsMap) -> SettingsMap:
|
|
489
|
+
"""Migrate to version 12 of the feature flags file.
|
|
490
|
+
|
|
491
|
+
- Adds the enableOT3HardwareController config element.
|
|
492
|
+
"""
|
|
493
|
+
newmap = {k: v for k, v in previous.items()}
|
|
494
|
+
newmap["enableOT3HardwareController"] = None
|
|
495
|
+
return newmap
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def _migrate12to13(previous: SettingsMap) -> SettingsMap:
|
|
499
|
+
"""Migrate to version 13 of the feature flags file.
|
|
500
|
+
|
|
501
|
+
- Removes deprecated calibrateToBottom option
|
|
502
|
+
"""
|
|
503
|
+
removals = ["calibrateToBottom"]
|
|
504
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
505
|
+
return newmap
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
def _migrate13to14(previous: SettingsMap) -> SettingsMap:
|
|
509
|
+
"""Migrate to version 14 of the feature flags file.
|
|
510
|
+
|
|
511
|
+
- Removes deprecated enableHttpProtocolSessions option
|
|
512
|
+
"""
|
|
513
|
+
removals = ["enableHttpProtocolSessions"]
|
|
514
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
515
|
+
return newmap
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def _migrate14to15(previous: SettingsMap) -> SettingsMap:
|
|
519
|
+
"""Migrate to version 15 of the feature flags file.
|
|
520
|
+
|
|
521
|
+
- adds enableHeaterShakerPAPI option
|
|
522
|
+
"""
|
|
523
|
+
newmap = {k: v for k, v in previous.items()}
|
|
524
|
+
newmap["enableHeaterShakerPAPI"] = None
|
|
525
|
+
return newmap
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def _migrate15to16(previous: SettingsMap) -> SettingsMap:
|
|
529
|
+
"""Migrate to version 16 of the feature flags file.
|
|
530
|
+
|
|
531
|
+
- Removes deprecated enableHeaterShakerPAPI option
|
|
532
|
+
"""
|
|
533
|
+
removals = ["enableHeaterShakerPAPI"]
|
|
534
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
535
|
+
return newmap
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
def _migrate16to17(previous: SettingsMap) -> SettingsMap:
|
|
539
|
+
"""Migrate to version 17 of the advanced settings file.
|
|
540
|
+
|
|
541
|
+
- Adds enableProtocolEnginePAPICore option
|
|
542
|
+
"""
|
|
543
|
+
newmap = {k: v for k, v in previous.items()}
|
|
544
|
+
newmap["enableProtocolEnginePAPICore"] = None
|
|
545
|
+
return newmap
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def _migrate17to18(previous: SettingsMap) -> SettingsMap:
|
|
549
|
+
"""Migrate to version 18 of the advanced settings file.
|
|
550
|
+
|
|
551
|
+
- Adds enableLoadLiquid option
|
|
552
|
+
"""
|
|
553
|
+
newmap = {k: v for k, v in previous.items()}
|
|
554
|
+
newmap["enableLoadLiquid"] = None
|
|
555
|
+
return newmap
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def _migrate18to19(previous: SettingsMap) -> SettingsMap:
|
|
559
|
+
"""Migrate to version 19 of the feature flags file.
|
|
560
|
+
|
|
561
|
+
- Removes deprecated enableLoadLiquid option
|
|
562
|
+
"""
|
|
563
|
+
removals = ["enableLoadLiquid"]
|
|
564
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
565
|
+
return newmap
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
def _migrate19to20(previous: SettingsMap) -> SettingsMap:
|
|
569
|
+
"""Migrate to version 20 of the feature flags file.
|
|
570
|
+
|
|
571
|
+
- Adds the enableOT3FirmwareUpdates config element.
|
|
572
|
+
"""
|
|
573
|
+
newmap = {k: v for k, v in previous.items()}
|
|
574
|
+
newmap["enableOT3FirmwareUpdates"] = None
|
|
575
|
+
return newmap
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
def _migrate20to21(previous: SettingsMap) -> SettingsMap:
|
|
579
|
+
"""Migrate to version 21 of the feature flags file.
|
|
580
|
+
|
|
581
|
+
- Removes deprecated enableProtocolEnginePAPICore option
|
|
582
|
+
"""
|
|
583
|
+
removals = ["enableProtocolEnginePAPICore"]
|
|
584
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
585
|
+
return newmap
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
def _migrate21to22(previous: SettingsMap) -> SettingsMap:
|
|
589
|
+
"""Migrate to version 22 of the feature flags file.
|
|
590
|
+
|
|
591
|
+
- Removes deprecated enableOT3FirmwareUpdates option
|
|
592
|
+
"""
|
|
593
|
+
removals = ["enableOT3FirmwareUpdates"]
|
|
594
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
595
|
+
return newmap
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def _migrate22to23(previous: SettingsMap) -> SettingsMap:
|
|
599
|
+
"""Migrate to version 23 of the feature flags file.
|
|
600
|
+
|
|
601
|
+
- Adds the rearPanelIntegration config element.
|
|
602
|
+
"""
|
|
603
|
+
newmap = {k: v for k, v in previous.items()}
|
|
604
|
+
newmap["rearPanelIntegration"] = None
|
|
605
|
+
return newmap
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
def _migrate23to24(previous: SettingsMap) -> SettingsMap:
|
|
609
|
+
"""Migrate to version 24 of the feature flags file.
|
|
610
|
+
|
|
611
|
+
- flips the rearPanelIntegration config element default to true.
|
|
612
|
+
"""
|
|
613
|
+
newmap = {k: v for k, v in previous.items()}
|
|
614
|
+
newmap["rearPanelIntegration"] = True
|
|
615
|
+
return newmap
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
def _migrate24to25(previous: SettingsMap) -> SettingsMap:
|
|
619
|
+
"""Migrate to version 25 of the feature flags file.
|
|
620
|
+
|
|
621
|
+
- Adds the disableStallDetection config element.
|
|
622
|
+
"""
|
|
623
|
+
newmap = {k: v for k, v in previous.items()}
|
|
624
|
+
newmap["disableStallDetection"] = None
|
|
625
|
+
return newmap
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
def _migrate25to26(previous: SettingsMap) -> SettingsMap:
|
|
629
|
+
"""Migrate to version 26 of the feature flags file.
|
|
630
|
+
|
|
631
|
+
- Adds the disableStatusBar config element.
|
|
632
|
+
"""
|
|
633
|
+
newmap = {k: v for k, v in previous.items()}
|
|
634
|
+
newmap["disableStatusBar"] = None
|
|
635
|
+
return newmap
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
def _migrate26to27(previous: SettingsMap) -> SettingsMap:
|
|
639
|
+
"""Migrate to version 27 of the feature flags file.
|
|
640
|
+
|
|
641
|
+
- Adds the disableOverpressureDetection config element.
|
|
642
|
+
"""
|
|
643
|
+
newmap = {k: v for k, v in previous.items()}
|
|
644
|
+
newmap["disableOverpressureDetection"] = None
|
|
645
|
+
return newmap
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
def _migrate27to28(previous: SettingsMap) -> SettingsMap:
|
|
649
|
+
"""Migrate to version 28 of the feature flags file.
|
|
650
|
+
|
|
651
|
+
- Adds the disableTipPresenceDetection config element.
|
|
652
|
+
"""
|
|
653
|
+
newmap = {k: v for k, v in previous.items()}
|
|
654
|
+
newmap["disableTipPresenceDetection"] = None
|
|
655
|
+
return newmap
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
def _migrate28to29(previous: SettingsMap) -> SettingsMap:
|
|
659
|
+
"""Migrate to version 29 of the feature flags file.
|
|
660
|
+
|
|
661
|
+
- Adds the estopNotRequired config element.
|
|
662
|
+
"""
|
|
663
|
+
newmap = {k: v for k, v in previous.items()}
|
|
664
|
+
newmap["estopNotRequired"] = None
|
|
665
|
+
return newmap
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
def _migrate29to30(previous: SettingsMap) -> SettingsMap:
|
|
669
|
+
"""Migrate to version 30 of the feature flags file.
|
|
670
|
+
|
|
671
|
+
- Removes the disableTipPresenceDetection flag.
|
|
672
|
+
"""
|
|
673
|
+
return {k: v for k, v in previous.items() if "disableTipPresenceDetection" != k}
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
def _migrate30to31(previous: SettingsMap) -> SettingsMap:
|
|
677
|
+
"""Migrate to version 31 of the feature flags file.
|
|
678
|
+
|
|
679
|
+
- Adds the enableErrorRecoveryExperiments config element.
|
|
680
|
+
"""
|
|
681
|
+
newmap = {k: v for k, v in previous.items()}
|
|
682
|
+
newmap["enableErrorRecoveryExperiments"] = None
|
|
683
|
+
return newmap
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
def _migrate31to32(previous: SettingsMap) -> SettingsMap:
|
|
687
|
+
"""Migrate to version 32 of the feature flags file.
|
|
688
|
+
|
|
689
|
+
- Adds the enableOEMMode config element.
|
|
690
|
+
"""
|
|
691
|
+
newmap = {k: v for k, v in previous.items()}
|
|
692
|
+
newmap["enableOEMMode"] = None
|
|
693
|
+
return newmap
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
def _migrate32to33(previous: SettingsMap) -> SettingsMap:
|
|
697
|
+
"""Migrate to version 33 of the feature flags file.
|
|
698
|
+
|
|
699
|
+
- Adds the enablePerformanceMetrics config element.
|
|
700
|
+
"""
|
|
701
|
+
newmap = {k: v for k, v in previous.items()}
|
|
702
|
+
newmap["enablePerformanceMetrics"] = None
|
|
703
|
+
return newmap
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
def _migrate33to34(previous: SettingsMap) -> SettingsMap:
|
|
707
|
+
"""Migrate to version 34 of the feature flags file.
|
|
708
|
+
|
|
709
|
+
- Removes disableFastProtocolUpload
|
|
710
|
+
"""
|
|
711
|
+
removals = ["disableFastProtocolUpload"]
|
|
712
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
713
|
+
return newmap
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
def _migrate34to35(previous: SettingsMap) -> SettingsMap:
|
|
717
|
+
"""Migrate to version 35 of the feature flags file.
|
|
718
|
+
|
|
719
|
+
- Removes disableLogAggregation
|
|
720
|
+
"""
|
|
721
|
+
removals = ["disableLogAggregation"]
|
|
722
|
+
newmap = {k: v for k, v in previous.items() if k not in removals}
|
|
723
|
+
return newmap
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
def _migrate35to36(previous: SettingsMap) -> SettingsMap:
|
|
727
|
+
"""Migrate to version 36 of the feature flags file.
|
|
728
|
+
|
|
729
|
+
- Adds the allowLiquidClasses config element.
|
|
730
|
+
"""
|
|
731
|
+
newmap = {k: v for k, v in previous.items()}
|
|
732
|
+
newmap["allowLiquidClasses"] = None
|
|
733
|
+
return newmap
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
def _migrate36to37(previous: SettingsMap) -> SettingsMap:
|
|
737
|
+
"""Migrate to version 37 of the feature flags file.
|
|
738
|
+
|
|
739
|
+
- Removes the allowLiquidClasses flag.
|
|
740
|
+
"""
|
|
741
|
+
return {k: v for k, v in previous.items() if "allowLiquidClasses" != k}
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
def _migrate37to38(previous: SettingsMap) -> SettingsMap:
|
|
745
|
+
"""Migrate to version 36 of the feature flags file.
|
|
746
|
+
|
|
747
|
+
- Adds the disableFlexStackerLabwareDetection config element.
|
|
748
|
+
"""
|
|
749
|
+
newmap = {k: v for k, v in previous.items()}
|
|
750
|
+
newmap["disableFlexStackerLabwareDetection"] = None
|
|
751
|
+
return newmap
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
_MIGRATIONS = [
|
|
755
|
+
_migrate0to1,
|
|
756
|
+
_migrate1to2,
|
|
757
|
+
_migrate2to3,
|
|
758
|
+
_migrate3to4,
|
|
759
|
+
_migrate4to5,
|
|
760
|
+
_migrate5to6,
|
|
761
|
+
_migrate6to7,
|
|
762
|
+
_migrate7to8,
|
|
763
|
+
_migrate8to9,
|
|
764
|
+
_migrate9to10,
|
|
765
|
+
_migrate10to11,
|
|
766
|
+
_migrate11to12,
|
|
767
|
+
_migrate12to13,
|
|
768
|
+
_migrate13to14,
|
|
769
|
+
_migrate14to15,
|
|
770
|
+
_migrate15to16,
|
|
771
|
+
_migrate16to17,
|
|
772
|
+
_migrate17to18,
|
|
773
|
+
_migrate18to19,
|
|
774
|
+
_migrate19to20,
|
|
775
|
+
_migrate20to21,
|
|
776
|
+
_migrate21to22,
|
|
777
|
+
_migrate22to23,
|
|
778
|
+
_migrate23to24,
|
|
779
|
+
_migrate24to25,
|
|
780
|
+
_migrate25to26,
|
|
781
|
+
_migrate26to27,
|
|
782
|
+
_migrate27to28,
|
|
783
|
+
_migrate28to29,
|
|
784
|
+
_migrate29to30,
|
|
785
|
+
_migrate30to31,
|
|
786
|
+
_migrate31to32,
|
|
787
|
+
_migrate32to33,
|
|
788
|
+
_migrate33to34,
|
|
789
|
+
_migrate34to35,
|
|
790
|
+
_migrate35to36,
|
|
791
|
+
_migrate36to37,
|
|
792
|
+
_migrate37to38,
|
|
793
|
+
]
|
|
794
|
+
"""
|
|
795
|
+
List of all migrations to apply, indexed by (version - 1). See _migrate below
|
|
796
|
+
for how the migration functions are applied. Each migration function should
|
|
797
|
+
return a new dictionary (rather than modify their input)
|
|
798
|
+
"""
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
def _migrate(data: Mapping[str, Any]) -> SettingsData:
|
|
802
|
+
"""
|
|
803
|
+
Check the version integer of the JSON file data a run any necessary
|
|
804
|
+
migrations to get us to the latest file format. Returns dictionary of
|
|
805
|
+
settings and version migrated to
|
|
806
|
+
"""
|
|
807
|
+
next = dict(data)
|
|
808
|
+
version = next.pop("_version", 0)
|
|
809
|
+
target_version = len(_MIGRATIONS)
|
|
810
|
+
migrations = _MIGRATIONS[version:]
|
|
811
|
+
|
|
812
|
+
if len(migrations) > 0:
|
|
813
|
+
log.info(
|
|
814
|
+
"Migrating advanced settings from version {} to {}".format(
|
|
815
|
+
version, target_version
|
|
816
|
+
)
|
|
817
|
+
)
|
|
818
|
+
|
|
819
|
+
for m in migrations:
|
|
820
|
+
next = m(next)
|
|
821
|
+
|
|
822
|
+
return SettingsData(settings_map=next, version=target_version)
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
def _ensure(data: Mapping[str, Any]) -> SettingsMap:
|
|
826
|
+
"""Ensure config data is valid, regardless of version.
|
|
827
|
+
|
|
828
|
+
Even after migration, we may have an invalid file. For instance,
|
|
829
|
+
the user may have _downgraded_. Make sure all required keys are present,
|
|
830
|
+
regardless of config version.
|
|
831
|
+
"""
|
|
832
|
+
newdata = {k: v for k, v in data.items()}
|
|
833
|
+
for s in settings:
|
|
834
|
+
if s.id not in newdata:
|
|
835
|
+
newdata[s.id] = None
|
|
836
|
+
return newdata
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
def get_setting_with_env_overload(setting_name: str, robot_type: RobotTypeEnum) -> bool:
|
|
840
|
+
env_name = "OT_API_FF_" + setting_name
|
|
841
|
+
defn = get_setting_definition(setting_name)
|
|
842
|
+
if env_name in os.environ:
|
|
843
|
+
return os.environ[env_name].lower() in {"1", "true", "on"}
|
|
844
|
+
else:
|
|
845
|
+
s = get_adv_setting(setting_name, robot_type)
|
|
846
|
+
if s is not None:
|
|
847
|
+
return s.value is True
|
|
848
|
+
if defn is None:
|
|
849
|
+
return False
|
|
850
|
+
if robot_type in defn.default_true_on_robot_types:
|
|
851
|
+
return True
|
|
852
|
+
return False
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
_SETTINGS_RESTART_REQUIRED = False
|
|
856
|
+
# This is a bit of global state that indicates whether a setting has changed
|
|
857
|
+
# that requires a restart. It's OK for this to be global because the behavior
|
|
858
|
+
# it's catching is global - changing the kind of setting that requires a
|
|
859
|
+
# a restart anywhere, even if you theoretically have two servers running in
|
|
860
|
+
# the same process, will require _all_ of them to be restarted.
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
def is_restart_required() -> bool:
|
|
864
|
+
return _SETTINGS_RESTART_REQUIRED
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
def set_restart_required() -> bool:
|
|
868
|
+
"""Set the restart required flag."""
|
|
869
|
+
global _SETTINGS_RESTART_REQUIRED
|
|
870
|
+
_SETTINGS_RESTART_REQUIRED = True
|
|
871
|
+
return _SETTINGS_RESTART_REQUIRED
|