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,592 @@
|
|
|
1
|
+
"""Legacy Protocol API module implementation logic."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import TYPE_CHECKING, List, Optional, cast
|
|
7
|
+
|
|
8
|
+
from opentrons.drivers.types import (
|
|
9
|
+
HeaterShakerLabwareLatchStatus,
|
|
10
|
+
ThermocyclerLidStatus,
|
|
11
|
+
)
|
|
12
|
+
from opentrons.hardware_control import SynchronousAdapter, modules as hw_modules
|
|
13
|
+
from opentrons.hardware_control.types import Axis
|
|
14
|
+
from opentrons.hardware_control.modules.types import (
|
|
15
|
+
ModuleModel,
|
|
16
|
+
TemperatureStatus,
|
|
17
|
+
MagneticStatus,
|
|
18
|
+
SpeedStatus,
|
|
19
|
+
MagneticModuleModel,
|
|
20
|
+
ThermocyclerStep,
|
|
21
|
+
)
|
|
22
|
+
from opentrons.types import DeckSlotName, Location
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
from ..module import (
|
|
26
|
+
AbstractModuleCore,
|
|
27
|
+
AbstractTemperatureModuleCore,
|
|
28
|
+
AbstractMagneticModuleCore,
|
|
29
|
+
AbstractThermocyclerCore,
|
|
30
|
+
AbstractHeaterShakerCore,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
from .legacy_labware_core import LegacyLabwareCore
|
|
34
|
+
from .module_geometry import ModuleGeometry, ThermocyclerGeometry, HeaterShakerGeometry
|
|
35
|
+
from ...labware import Labware
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from .legacy_protocol_core import LegacyProtocolCore
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
_log = logging.getLogger(__name__)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class NoTargetTemperatureSetError(RuntimeError):
|
|
45
|
+
"""An error raised when awaiting temperature when no target was set."""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class CannotPerformModuleAction(RuntimeError):
|
|
49
|
+
"""An error raised when attempting to execute an invalid module action."""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class LegacyModuleCore(AbstractModuleCore[LegacyLabwareCore]):
|
|
53
|
+
"""Legacy ModuleCore implementation for pre-ProtocolEngine protocols."""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
sync_module_hardware: SynchronousAdapter[hw_modules.AbstractModule],
|
|
58
|
+
requested_model: ModuleModel,
|
|
59
|
+
geometry: ModuleGeometry,
|
|
60
|
+
protocol_core: LegacyProtocolCore,
|
|
61
|
+
) -> None:
|
|
62
|
+
self._sync_module_hardware = sync_module_hardware
|
|
63
|
+
self._requested_model = requested_model
|
|
64
|
+
self._geometry = geometry
|
|
65
|
+
self._protocol_core = protocol_core
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def geometry(self) -> ModuleGeometry:
|
|
69
|
+
return self._geometry
|
|
70
|
+
|
|
71
|
+
def get_model(self) -> ModuleModel:
|
|
72
|
+
"""Get the module's model identifier."""
|
|
73
|
+
return self._geometry.model
|
|
74
|
+
|
|
75
|
+
def get_requested_model(self) -> ModuleModel:
|
|
76
|
+
"""Get the model identifier the module was requested as.
|
|
77
|
+
|
|
78
|
+
This may differ from the actual model returned by `get_model`.
|
|
79
|
+
"""
|
|
80
|
+
return self._requested_model
|
|
81
|
+
|
|
82
|
+
def get_serial_number(self) -> str:
|
|
83
|
+
"""Get the module's unique hardware serial number."""
|
|
84
|
+
device_info = self._sync_module_hardware.device_info
|
|
85
|
+
return cast(str, device_info["serial"])
|
|
86
|
+
|
|
87
|
+
def get_deck_slot(self) -> DeckSlotName:
|
|
88
|
+
"""Get the module's deck slot."""
|
|
89
|
+
return DeckSlotName.from_primitive(self._geometry.parent) # type: ignore[arg-type]
|
|
90
|
+
|
|
91
|
+
def get_deck_slot_id(self) -> str:
|
|
92
|
+
return self.get_deck_slot().id
|
|
93
|
+
|
|
94
|
+
def get_display_name(self) -> str:
|
|
95
|
+
"""Get the module's display name."""
|
|
96
|
+
return self._geometry.display_name
|
|
97
|
+
|
|
98
|
+
def add_labware_core(self, labware_core: LegacyLabwareCore) -> Labware:
|
|
99
|
+
"""Add a labware to the module."""
|
|
100
|
+
labware = self.geometry.add_labware(
|
|
101
|
+
Labware(
|
|
102
|
+
core=labware_core,
|
|
103
|
+
api_version=self._protocol_core.api_version,
|
|
104
|
+
protocol_core=None, # type: ignore[arg-type]
|
|
105
|
+
core_map=None, # type: ignore[arg-type]
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
self._protocol_core.get_deck().recalculate_high_z()
|
|
109
|
+
return labware
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class LegacyTemperatureModuleCore(
|
|
113
|
+
LegacyModuleCore, AbstractTemperatureModuleCore[LegacyLabwareCore]
|
|
114
|
+
):
|
|
115
|
+
"""Legacy core control implementation for an attached Temperature Module."""
|
|
116
|
+
|
|
117
|
+
_sync_module_hardware: SynchronousAdapter[hw_modules.TempDeck]
|
|
118
|
+
|
|
119
|
+
def set_target_temperature(self, celsius: float) -> None:
|
|
120
|
+
"""Set the Temperature Module's target temperature in °C."""
|
|
121
|
+
self._sync_module_hardware.start_set_temperature(celsius)
|
|
122
|
+
|
|
123
|
+
def wait_for_target_temperature(self, celsius: Optional[float] = None) -> None:
|
|
124
|
+
"""Wait until the module's target temperature is reached.
|
|
125
|
+
|
|
126
|
+
Specifying a value for ``celsius`` that is different than
|
|
127
|
+
the module's current target temperature may behave unpredictably.
|
|
128
|
+
"""
|
|
129
|
+
self._sync_module_hardware.await_temperature(celsius)
|
|
130
|
+
|
|
131
|
+
def deactivate(self) -> None:
|
|
132
|
+
"""Deactivate the Temperature Module."""
|
|
133
|
+
self._sync_module_hardware.deactivate()
|
|
134
|
+
|
|
135
|
+
def get_current_temperature(self) -> float:
|
|
136
|
+
"""Get the module's current temperature in °C."""
|
|
137
|
+
return self._sync_module_hardware.temperature # type: ignore[no-any-return]
|
|
138
|
+
|
|
139
|
+
def get_target_temperature(self) -> Optional[float]:
|
|
140
|
+
"""Get the module's target temperature in °C, if set."""
|
|
141
|
+
return self._sync_module_hardware.target # type: ignore[no-any-return]
|
|
142
|
+
|
|
143
|
+
def get_status(self) -> TemperatureStatus:
|
|
144
|
+
"""Get the module's current temperature status."""
|
|
145
|
+
return self._sync_module_hardware.status # type: ignore[no-any-return]
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class LegacyMagneticModuleCore(
|
|
149
|
+
LegacyModuleCore, AbstractMagneticModuleCore[LegacyLabwareCore]
|
|
150
|
+
):
|
|
151
|
+
"""Core control interface for an attached Magnetic Module."""
|
|
152
|
+
|
|
153
|
+
_sync_module_hardware: SynchronousAdapter[hw_modules.MagDeck]
|
|
154
|
+
|
|
155
|
+
def engage(
|
|
156
|
+
self,
|
|
157
|
+
height_from_base: Optional[float] = None,
|
|
158
|
+
height_from_home: Optional[float] = None,
|
|
159
|
+
) -> None:
|
|
160
|
+
"""Raise the module's magnets.
|
|
161
|
+
|
|
162
|
+
Only one of `height_from_base` or `height_from_home` may be specified.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
height_from_base: Distance from labware base to raise the magnets.
|
|
166
|
+
height_from_home: Distance from motor home position to raise the magnets.
|
|
167
|
+
"""
|
|
168
|
+
# TODO(mc, 2022-09-23): update when HW API uses real millimeters
|
|
169
|
+
# https://opentrons.atlassian.net/browse/RET-1242
|
|
170
|
+
if height_from_base is not None:
|
|
171
|
+
self._sync_module_hardware.engage(height_from_base=height_from_base)
|
|
172
|
+
else:
|
|
173
|
+
assert height_from_home is not None, "Engage height must be specified"
|
|
174
|
+
self._sync_module_hardware.engage(height=height_from_home)
|
|
175
|
+
|
|
176
|
+
def engage_to_labware(
|
|
177
|
+
self,
|
|
178
|
+
offset: float = 0,
|
|
179
|
+
preserve_half_mm: bool = False,
|
|
180
|
+
) -> None:
|
|
181
|
+
"""Raise the module's magnets up to its loaded labware.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
offset: Offset from the labware's default engage height.
|
|
185
|
+
preserve_half_mm: Preserve any values that may accidentally be in half-mm,
|
|
186
|
+
passing them directly onwards to the hardware control API.
|
|
187
|
+
|
|
188
|
+
Raises:
|
|
189
|
+
ValueError: Labware is not loaded or has no default engage height.
|
|
190
|
+
"""
|
|
191
|
+
labware = self._geometry.labware
|
|
192
|
+
|
|
193
|
+
if labware is None:
|
|
194
|
+
raise ValueError(
|
|
195
|
+
"No labware loaded in Magnetic Module;"
|
|
196
|
+
" you must specify an engage height explicitly"
|
|
197
|
+
" using `height_from_base` or `height`"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
labware_core = cast(LegacyLabwareCore, labware._core)
|
|
201
|
+
engage_height = labware_core.get_default_magnet_engage_height(preserve_half_mm)
|
|
202
|
+
|
|
203
|
+
if engage_height is None:
|
|
204
|
+
raise ValueError(
|
|
205
|
+
f"Currently loaded labware {labware} does not have"
|
|
206
|
+
" a default engage height; specify engage height explicitly"
|
|
207
|
+
" using `height_from_base` or `height`"
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
if (
|
|
211
|
+
self._geometry.model == MagneticModuleModel.MAGNETIC_V1
|
|
212
|
+
and not preserve_half_mm
|
|
213
|
+
):
|
|
214
|
+
engage_height *= 2
|
|
215
|
+
|
|
216
|
+
# TODO(mc, 2022-09-23): use real millimeters instead of model-dependent mm
|
|
217
|
+
# https://opentrons.atlassian.net/browse/RET-1242
|
|
218
|
+
# TODO(mc, 2022-09-23): use `height_from_base` to match JSONv5
|
|
219
|
+
# https://opentrons.atlassian.net/browse/RSS-110
|
|
220
|
+
self._sync_module_hardware.engage(height=engage_height + offset)
|
|
221
|
+
|
|
222
|
+
def disengage(self) -> None:
|
|
223
|
+
"""Lower the magnets back into the module."""
|
|
224
|
+
self._sync_module_hardware.deactivate()
|
|
225
|
+
|
|
226
|
+
def get_status(self) -> MagneticStatus:
|
|
227
|
+
"""Get the module's current magnet status."""
|
|
228
|
+
return self._sync_module_hardware.status # type: ignore[no-any-return]
|
|
229
|
+
|
|
230
|
+
def add_labware_core(self, labware_core: LegacyLabwareCore) -> Labware:
|
|
231
|
+
"""Add a labware to the module."""
|
|
232
|
+
labware = super().add_labware_core(labware_core)
|
|
233
|
+
if labware_core.get_default_magnet_engage_height() is None:
|
|
234
|
+
name = labware_core.get_name()
|
|
235
|
+
_log.warning(
|
|
236
|
+
f"The labware definition for {name} does not define a"
|
|
237
|
+
" default engagement height for use with the Magnetic Module;"
|
|
238
|
+
" you must specify a height explicitly when calling engage()."
|
|
239
|
+
)
|
|
240
|
+
return labware
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class LegacyThermocyclerCore(
|
|
244
|
+
LegacyModuleCore, AbstractThermocyclerCore[LegacyLabwareCore]
|
|
245
|
+
):
|
|
246
|
+
"""Core control interface for an attached Thermocycler Module."""
|
|
247
|
+
|
|
248
|
+
_sync_module_hardware: SynchronousAdapter[hw_modules.Thermocycler]
|
|
249
|
+
_geometry: ThermocyclerGeometry
|
|
250
|
+
|
|
251
|
+
def open_lid(self) -> ThermocyclerLidStatus:
|
|
252
|
+
"""Open the thermocycler's lid."""
|
|
253
|
+
self._prepare_for_lid_move()
|
|
254
|
+
self._geometry.lid_status = self._sync_module_hardware.open()
|
|
255
|
+
return self._geometry.lid_status
|
|
256
|
+
|
|
257
|
+
def close_lid(self) -> ThermocyclerLidStatus:
|
|
258
|
+
"""Close the thermocycler's lid."""
|
|
259
|
+
self._prepare_for_lid_move()
|
|
260
|
+
self._geometry.lid_status = self._sync_module_hardware.close()
|
|
261
|
+
return self._geometry.lid_status
|
|
262
|
+
|
|
263
|
+
def set_target_block_temperature(
|
|
264
|
+
self,
|
|
265
|
+
celsius: float,
|
|
266
|
+
hold_time_seconds: Optional[float] = None,
|
|
267
|
+
block_max_volume: Optional[float] = None,
|
|
268
|
+
) -> None:
|
|
269
|
+
"""Set the target temperature for the well block, in °C."""
|
|
270
|
+
self._sync_module_hardware.set_target_block_temperature(
|
|
271
|
+
celsius=celsius,
|
|
272
|
+
hold_time_seconds=hold_time_seconds,
|
|
273
|
+
volume=block_max_volume,
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
def wait_for_block_temperature(self) -> None:
|
|
277
|
+
"""Wait for target block temperature to be reached."""
|
|
278
|
+
self._sync_module_hardware.wait_for_block_target()
|
|
279
|
+
|
|
280
|
+
def set_target_lid_temperature(self, celsius: float) -> None:
|
|
281
|
+
"""Set the target temperature for the heated lid, in °C."""
|
|
282
|
+
self._sync_module_hardware.set_target_lid_temperature(celsius=celsius)
|
|
283
|
+
|
|
284
|
+
def wait_for_lid_temperature(self) -> None:
|
|
285
|
+
"""Wait for target lid temperature to be reached."""
|
|
286
|
+
self._sync_module_hardware.wait_for_lid_target()
|
|
287
|
+
|
|
288
|
+
def execute_profile(
|
|
289
|
+
self,
|
|
290
|
+
steps: List[ThermocyclerStep],
|
|
291
|
+
repetitions: int,
|
|
292
|
+
block_max_volume: Optional[float] = None,
|
|
293
|
+
) -> None:
|
|
294
|
+
"""Execute a Thermocycler Profile."""
|
|
295
|
+
self._sync_module_hardware.cycle_temperatures(
|
|
296
|
+
steps=steps, repetitions=repetitions, volume=block_max_volume
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
def deactivate_lid(self) -> None:
|
|
300
|
+
"""Turn off the heated lid."""
|
|
301
|
+
self._sync_module_hardware.deactivate_lid()
|
|
302
|
+
|
|
303
|
+
def deactivate_block(self) -> None:
|
|
304
|
+
"""Turn off the well block temperature controller"""
|
|
305
|
+
self._sync_module_hardware.deactivate_block()
|
|
306
|
+
|
|
307
|
+
def deactivate(self) -> None:
|
|
308
|
+
"""Turn off the well block temperature controller, and heated lid"""
|
|
309
|
+
self._sync_module_hardware.deactivate()
|
|
310
|
+
|
|
311
|
+
def get_lid_position(self) -> Optional[ThermocyclerLidStatus]:
|
|
312
|
+
"""Get the thermocycler's lid position."""
|
|
313
|
+
return self._sync_module_hardware.lid_status # type: ignore[no-any-return]
|
|
314
|
+
|
|
315
|
+
def get_block_temperature_status(self) -> TemperatureStatus:
|
|
316
|
+
"""Get the thermocycler's block temperature status."""
|
|
317
|
+
return self._sync_module_hardware.status # type: ignore[no-any-return]
|
|
318
|
+
|
|
319
|
+
def get_lid_temperature_status(self) -> Optional[TemperatureStatus]:
|
|
320
|
+
"""Get the thermocycler's lid temperature status."""
|
|
321
|
+
return self._sync_module_hardware.lid_temp_status # type: ignore[no-any-return]
|
|
322
|
+
|
|
323
|
+
def get_block_temperature(self) -> Optional[float]:
|
|
324
|
+
"""Get the thermocycler's current block temperature in °C."""
|
|
325
|
+
return self._sync_module_hardware.temperature # type: ignore[no-any-return]
|
|
326
|
+
|
|
327
|
+
def get_block_target_temperature(self) -> Optional[float]:
|
|
328
|
+
"""Get the thermocycler's target block temperature in °C."""
|
|
329
|
+
return self._sync_module_hardware.target # type: ignore[no-any-return]
|
|
330
|
+
|
|
331
|
+
def get_lid_temperature(self) -> Optional[float]:
|
|
332
|
+
"""Get the thermocycler's current lid temperature in °C."""
|
|
333
|
+
return self._sync_module_hardware.lid_temp # type: ignore[no-any-return]
|
|
334
|
+
|
|
335
|
+
def get_lid_target_temperature(self) -> Optional[float]:
|
|
336
|
+
"""Get the thermocycler's target lid temperature in °C."""
|
|
337
|
+
return self._sync_module_hardware.lid_target # type: ignore[no-any-return]
|
|
338
|
+
|
|
339
|
+
def get_ramp_rate(self) -> Optional[float]:
|
|
340
|
+
"""Get the thermocycler's current ramp rate in °C/sec."""
|
|
341
|
+
return self._sync_module_hardware.ramp_rate # type: ignore[no-any-return]
|
|
342
|
+
|
|
343
|
+
def get_hold_time(self) -> Optional[float]:
|
|
344
|
+
"""Get the remaining hold time in seconds."""
|
|
345
|
+
return self._sync_module_hardware.hold_time # type: ignore[no-any-return]
|
|
346
|
+
|
|
347
|
+
def get_total_cycle_count(self) -> Optional[int]:
|
|
348
|
+
"""Get number of repetitions for current set cycle."""
|
|
349
|
+
return self._sync_module_hardware.total_cycle_count # type: ignore[no-any-return]
|
|
350
|
+
|
|
351
|
+
def get_current_cycle_index(self) -> Optional[int]:
|
|
352
|
+
"""Get index of the current set cycle repetition."""
|
|
353
|
+
return self._sync_module_hardware.current_cycle_index # type: ignore[no-any-return]
|
|
354
|
+
|
|
355
|
+
def get_total_step_count(self) -> Optional[int]:
|
|
356
|
+
"""Get number of steps within the current cycle."""
|
|
357
|
+
return self._sync_module_hardware.total_step_count # type: ignore[no-any-return]
|
|
358
|
+
|
|
359
|
+
def get_current_step_index(self) -> Optional[int]:
|
|
360
|
+
"""Get the index of the current step within the current cycle."""
|
|
361
|
+
return self._sync_module_hardware.current_step_index # type: ignore[no-any-return]
|
|
362
|
+
|
|
363
|
+
def flag_unsafe_move(self, to_loc: Location, from_loc: Location) -> None:
|
|
364
|
+
"""Check if a movement may interfere with this Thermocycler.
|
|
365
|
+
|
|
366
|
+
Args:
|
|
367
|
+
to_loc: Movement destination.
|
|
368
|
+
from_loc: Movement origin.
|
|
369
|
+
|
|
370
|
+
Raises:
|
|
371
|
+
RuntimeError: The movement is unsafe.
|
|
372
|
+
"""
|
|
373
|
+
self._geometry.flag_unsafe_move(to_loc, from_loc, self.get_lid_position())
|
|
374
|
+
|
|
375
|
+
def _prepare_for_lid_move(self) -> None:
|
|
376
|
+
loaded_instruments = [
|
|
377
|
+
instr
|
|
378
|
+
for mount, instr in self._protocol_core.get_loaded_instruments().items()
|
|
379
|
+
if instr is not None
|
|
380
|
+
]
|
|
381
|
+
try:
|
|
382
|
+
instr_core = loaded_instruments[0]
|
|
383
|
+
except IndexError:
|
|
384
|
+
_log.warning(
|
|
385
|
+
"Cannot assure a safe gantry position to avoid colliding"
|
|
386
|
+
" with the lid of the Thermocycler Module."
|
|
387
|
+
)
|
|
388
|
+
else:
|
|
389
|
+
protocol_core = self._protocol_core
|
|
390
|
+
hardware = protocol_core.get_hardware()
|
|
391
|
+
hardware.retract(instr_core.get_mount())
|
|
392
|
+
high_point = hardware.current_position(instr_core.get_mount())
|
|
393
|
+
trash_top = protocol_core.fixed_trash.get_well_core("A1").get_top(
|
|
394
|
+
z_offset=0
|
|
395
|
+
)
|
|
396
|
+
safe_point = trash_top._replace(
|
|
397
|
+
z=high_point[Axis.by_mount(instr_core.get_mount())]
|
|
398
|
+
)
|
|
399
|
+
instr_core.move_to(
|
|
400
|
+
location=Location(safe_point, None),
|
|
401
|
+
well_core=None,
|
|
402
|
+
force_direct=True,
|
|
403
|
+
minimum_z_height=None,
|
|
404
|
+
speed=None,
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
class LegacyHeaterShakerCore(
|
|
409
|
+
LegacyModuleCore, AbstractHeaterShakerCore[LegacyLabwareCore]
|
|
410
|
+
):
|
|
411
|
+
"""Core control interface for an attached Heater-Shaker Module."""
|
|
412
|
+
|
|
413
|
+
_sync_module_hardware: SynchronousAdapter[hw_modules.HeaterShaker]
|
|
414
|
+
_geometry: HeaterShakerGeometry
|
|
415
|
+
|
|
416
|
+
def set_target_temperature(self, celsius: float) -> None:
|
|
417
|
+
"""Set the labware plate's target temperature in °C."""
|
|
418
|
+
self._sync_module_hardware.start_set_temperature(celsius)
|
|
419
|
+
|
|
420
|
+
def wait_for_target_temperature(self) -> None:
|
|
421
|
+
"""Wait for the labware plate's target temperature to be reached."""
|
|
422
|
+
target_temperature = self.get_target_temperature()
|
|
423
|
+
|
|
424
|
+
if target_temperature is None:
|
|
425
|
+
raise NoTargetTemperatureSetError(
|
|
426
|
+
"Heater-Shaker Module does not have a target temperature set."
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
self._sync_module_hardware.await_temperature(target_temperature)
|
|
430
|
+
|
|
431
|
+
def set_and_wait_for_shake_speed(self, rpm: int) -> None:
|
|
432
|
+
"""Set the shaker's target shake speed and wait for it to spin up."""
|
|
433
|
+
if (
|
|
434
|
+
self.get_labware_latch_status()
|
|
435
|
+
== HeaterShakerLabwareLatchStatus.IDLE_CLOSED
|
|
436
|
+
):
|
|
437
|
+
self._prepare_for_shake()
|
|
438
|
+
self._sync_module_hardware.set_speed(rpm=rpm)
|
|
439
|
+
else:
|
|
440
|
+
# TODO: Figure out whether to issue close latch behind the scenes instead
|
|
441
|
+
raise CannotPerformModuleAction(
|
|
442
|
+
"Cannot start shaking unless labware latch is closed."
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
def open_labware_latch(self) -> None:
|
|
446
|
+
"""Open the labware latch."""
|
|
447
|
+
if self.get_speed_status() != SpeedStatus.IDLE:
|
|
448
|
+
# TODO: What to do when speed status is ERROR?
|
|
449
|
+
raise CannotPerformModuleAction(
|
|
450
|
+
"""Cannot open labware latch while module is shaking."""
|
|
451
|
+
)
|
|
452
|
+
self._prepare_for_latch_open()
|
|
453
|
+
self._sync_module_hardware.open_labware_latch()
|
|
454
|
+
|
|
455
|
+
def close_labware_latch(self) -> None:
|
|
456
|
+
"""Close the labware latch."""
|
|
457
|
+
self._sync_module_hardware.close_labware_latch()
|
|
458
|
+
|
|
459
|
+
def deactivate_shaker(self) -> None:
|
|
460
|
+
"""Stop shaking."""
|
|
461
|
+
self._sync_module_hardware.deactivate_shaker()
|
|
462
|
+
|
|
463
|
+
def deactivate_heater(self) -> None:
|
|
464
|
+
"""Stop heating."""
|
|
465
|
+
self._sync_module_hardware.deactivate_heater()
|
|
466
|
+
|
|
467
|
+
def get_current_temperature(self) -> float:
|
|
468
|
+
"""Get the labware plate's current temperature in °C."""
|
|
469
|
+
return self._sync_module_hardware.temperature # type: ignore[no-any-return]
|
|
470
|
+
|
|
471
|
+
def get_target_temperature(self) -> Optional[float]:
|
|
472
|
+
"""Get the labware plate's target temperature in °C, if set."""
|
|
473
|
+
return self._sync_module_hardware.target_temperature # type: ignore[no-any-return]
|
|
474
|
+
|
|
475
|
+
def get_current_speed(self) -> int:
|
|
476
|
+
"""Get the shaker's current speed in RPM."""
|
|
477
|
+
return self._sync_module_hardware.speed # type: ignore[no-any-return]
|
|
478
|
+
|
|
479
|
+
def get_target_speed(self) -> Optional[int]:
|
|
480
|
+
"""Get the shaker's target speed in RPM, if set."""
|
|
481
|
+
return self._sync_module_hardware.target_speed # type: ignore[no-any-return]
|
|
482
|
+
|
|
483
|
+
def get_temperature_status(self) -> TemperatureStatus:
|
|
484
|
+
"""Get the module's heater status."""
|
|
485
|
+
return self._sync_module_hardware.temperature_status # type: ignore[no-any-return]
|
|
486
|
+
|
|
487
|
+
def get_speed_status(self) -> SpeedStatus:
|
|
488
|
+
"""Get the module's heater status."""
|
|
489
|
+
return self._sync_module_hardware.speed_status # type: ignore[no-any-return]
|
|
490
|
+
|
|
491
|
+
def get_labware_latch_status(self) -> HeaterShakerLabwareLatchStatus:
|
|
492
|
+
"""Get the module's labware latch status."""
|
|
493
|
+
return self._sync_module_hardware.labware_latch_status # type: ignore[no-any-return]
|
|
494
|
+
|
|
495
|
+
def flag_unsafe_move(self, to_loc: Location, is_multichannel: bool) -> None:
|
|
496
|
+
"""Check if a movement may interfere with this Heater-Shaker.
|
|
497
|
+
|
|
498
|
+
Args:
|
|
499
|
+
to_loc: Movement destination.
|
|
500
|
+
is_multichannel: If the pipette is a multi-channel pipette,
|
|
501
|
+
which has more movement restrictions than a single-channel.
|
|
502
|
+
|
|
503
|
+
Raises:
|
|
504
|
+
TypeError: `to_loc` is an invalid destination.
|
|
505
|
+
RuntimeError: The movement is unsafe.
|
|
506
|
+
"""
|
|
507
|
+
destination_slot = to_loc.labware.first_parent()
|
|
508
|
+
if destination_slot is None:
|
|
509
|
+
_log.warning(
|
|
510
|
+
"Pipette movement destination has no slot associated with it. Cannot"
|
|
511
|
+
" determine whether movement will safely avoid colliding with the Heater-Shaker."
|
|
512
|
+
)
|
|
513
|
+
return
|
|
514
|
+
|
|
515
|
+
is_labware_latch_closed = (
|
|
516
|
+
self.get_labware_latch_status()
|
|
517
|
+
== HeaterShakerLabwareLatchStatus.IDLE_CLOSED
|
|
518
|
+
)
|
|
519
|
+
is_plate_shaking = self.get_speed_status() != SpeedStatus.IDLE
|
|
520
|
+
|
|
521
|
+
to_labware_like = to_loc.labware
|
|
522
|
+
is_tiprack: bool
|
|
523
|
+
if (
|
|
524
|
+
to_labware_like.is_labware
|
|
525
|
+
): # Do we consider this a valid location for move_to?
|
|
526
|
+
is_tiprack = to_labware_like.as_labware().is_tiprack
|
|
527
|
+
elif to_labware_like.parent.is_labware:
|
|
528
|
+
is_tiprack = to_labware_like.parent.as_labware().is_tiprack
|
|
529
|
+
else:
|
|
530
|
+
raise TypeError(
|
|
531
|
+
"Invalid destination location type. "
|
|
532
|
+
"Cannot determine pipette movement safety."
|
|
533
|
+
)
|
|
534
|
+
|
|
535
|
+
self._geometry.flag_unsafe_move(
|
|
536
|
+
to_slot=int(destination_slot),
|
|
537
|
+
is_tiprack=is_tiprack,
|
|
538
|
+
is_using_multichannel=is_multichannel,
|
|
539
|
+
is_plate_shaking=is_plate_shaking,
|
|
540
|
+
is_labware_latch_closed=is_labware_latch_closed,
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
def _prepare_for_shake(self) -> None:
|
|
544
|
+
"""
|
|
545
|
+
Before shaking, retracts pipettes if they're parked over a slot
|
|
546
|
+
adjacent to the heater-shaker.
|
|
547
|
+
"""
|
|
548
|
+
protocol_core = self._protocol_core
|
|
549
|
+
if self._geometry.is_pipette_blocking_shake_movement(
|
|
550
|
+
pipette_location=protocol_core.get_last_location()
|
|
551
|
+
):
|
|
552
|
+
hardware = protocol_core.get_hardware()
|
|
553
|
+
hardware.home(axes=[axis for axis in Axis.ot2_mount_axes()])
|
|
554
|
+
protocol_core.set_last_location(None)
|
|
555
|
+
|
|
556
|
+
def _prepare_for_latch_open(self) -> None:
|
|
557
|
+
"""
|
|
558
|
+
Before opening latch, retracts pipettes if they're parked over a slot
|
|
559
|
+
east/ west of the heater-shaker.
|
|
560
|
+
"""
|
|
561
|
+
protocol_core = self._protocol_core
|
|
562
|
+
if self._geometry.is_pipette_blocking_latch_movement(
|
|
563
|
+
pipette_location=protocol_core.get_last_location()
|
|
564
|
+
):
|
|
565
|
+
hardware = protocol_core.get_hardware()
|
|
566
|
+
hardware.home(axes=[axis for axis in Axis.ot2_mount_axes()])
|
|
567
|
+
protocol_core.set_last_location(None)
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
def create_module_core(
|
|
571
|
+
module_hardware_api: hw_modules.AbstractModule,
|
|
572
|
+
requested_model: ModuleModel,
|
|
573
|
+
geometry: ModuleGeometry,
|
|
574
|
+
protocol_core: LegacyProtocolCore,
|
|
575
|
+
) -> LegacyModuleCore:
|
|
576
|
+
core_cls = LegacyModuleCore
|
|
577
|
+
|
|
578
|
+
if isinstance(module_hardware_api, hw_modules.TempDeck):
|
|
579
|
+
core_cls = LegacyTemperatureModuleCore
|
|
580
|
+
elif isinstance(module_hardware_api, hw_modules.MagDeck):
|
|
581
|
+
core_cls = LegacyMagneticModuleCore
|
|
582
|
+
elif isinstance(module_hardware_api, hw_modules.Thermocycler):
|
|
583
|
+
core_cls = LegacyThermocyclerCore
|
|
584
|
+
elif isinstance(module_hardware_api, hw_modules.HeaterShaker):
|
|
585
|
+
core_cls = LegacyHeaterShakerCore
|
|
586
|
+
|
|
587
|
+
return core_cls(
|
|
588
|
+
sync_module_hardware=SynchronousAdapter(module_hardware_api),
|
|
589
|
+
requested_model=requested_model,
|
|
590
|
+
geometry=geometry,
|
|
591
|
+
protocol_core=protocol_core,
|
|
592
|
+
)
|