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,612 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Dict, List, Optional, Set, Union, cast, Tuple
|
|
3
|
+
|
|
4
|
+
from opentrons_shared_data.deck.types import DeckDefinitionV5, SlotDefV3
|
|
5
|
+
from opentrons_shared_data.labware.types import LabwareDefinition
|
|
6
|
+
from opentrons_shared_data.pipette.types import PipetteNameType
|
|
7
|
+
from opentrons_shared_data.robot.types import RobotType
|
|
8
|
+
|
|
9
|
+
from opentrons.types import (
|
|
10
|
+
DeckSlotName,
|
|
11
|
+
StagingSlotName,
|
|
12
|
+
Location,
|
|
13
|
+
Mount,
|
|
14
|
+
Point,
|
|
15
|
+
)
|
|
16
|
+
from opentrons.util.broker import Broker
|
|
17
|
+
from opentrons.hardware_control import SyncHardwareAPI
|
|
18
|
+
from opentrons.hardware_control.modules import AbstractModule, ModuleModel, ModuleType
|
|
19
|
+
from opentrons.hardware_control.types import DoorState, PauseType
|
|
20
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
21
|
+
from opentrons.protocols.api_support.util import AxisMaxSpeeds, APIVersionError
|
|
22
|
+
from opentrons.protocols import labware as labware_definition
|
|
23
|
+
|
|
24
|
+
from ...labware import Labware
|
|
25
|
+
from ...disposal_locations import TrashBin, WasteChute
|
|
26
|
+
from ..._liquid import Liquid, LiquidClass
|
|
27
|
+
from ..._types import OffDeckType
|
|
28
|
+
from ..protocol import AbstractProtocol
|
|
29
|
+
from ..labware import LabwareLoadParams
|
|
30
|
+
|
|
31
|
+
from . import legacy_module_core, module_geometry
|
|
32
|
+
from .deck import Deck
|
|
33
|
+
from .legacy_instrument_core import LegacyInstrumentCore
|
|
34
|
+
from .labware_offset_provider import AbstractLabwareOffsetProvider
|
|
35
|
+
from .legacy_labware_core import LegacyLabwareCore
|
|
36
|
+
from .load_info import LoadInfo, InstrumentLoadInfo, LabwareLoadInfo, ModuleLoadInfo
|
|
37
|
+
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class LegacyProtocolCore(
|
|
42
|
+
AbstractProtocol[
|
|
43
|
+
LegacyInstrumentCore,
|
|
44
|
+
LegacyLabwareCore,
|
|
45
|
+
legacy_module_core.LegacyModuleCore,
|
|
46
|
+
]
|
|
47
|
+
):
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
sync_hardware: SyncHardwareAPI,
|
|
51
|
+
api_version: APIVersion,
|
|
52
|
+
labware_offset_provider: AbstractLabwareOffsetProvider,
|
|
53
|
+
deck_layout: Deck,
|
|
54
|
+
equipment_broker: Optional[Broker[LoadInfo]] = None,
|
|
55
|
+
bundled_labware: Optional[Dict[str, LabwareDefinition]] = None,
|
|
56
|
+
extra_labware: Optional[Dict[str, LabwareDefinition]] = None,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Build a :py:class:`.LegacyProtocolCore`.
|
|
59
|
+
|
|
60
|
+
:param api_version: The API version to use. If this is ``None``, uses
|
|
61
|
+
the max supported version.
|
|
62
|
+
:param hardware: The hardware control API to use.
|
|
63
|
+
:param bundled_labware: A dict mapping labware URIs to definitions.
|
|
64
|
+
This is used when executing bundled protocols,
|
|
65
|
+
and if specified will be the only allowed
|
|
66
|
+
source for labware definitions, excluding the
|
|
67
|
+
built in definitions and anything in
|
|
68
|
+
``extra_labware``.
|
|
69
|
+
:param bundled_data: A dict mapping filenames to the contents of data
|
|
70
|
+
files. Can be used by the protocol, since it is
|
|
71
|
+
exposed as
|
|
72
|
+
:py:attr:`.ProtocolContext.bundled_data`
|
|
73
|
+
:param extra_labware: A dict mapping labware URIs to definitions. These
|
|
74
|
+
URIs are searched during :py:meth:`.load_labware`
|
|
75
|
+
in addition to the system definitions (if
|
|
76
|
+
``bundled_labware`` was not specified). Used to
|
|
77
|
+
provide custom labware definitions.
|
|
78
|
+
"""
|
|
79
|
+
self._sync_hardware = sync_hardware
|
|
80
|
+
self._api_version = api_version
|
|
81
|
+
self._labware_offset_provider = labware_offset_provider
|
|
82
|
+
self._deck_layout = deck_layout
|
|
83
|
+
self._equipment_broker = equipment_broker or Broker()
|
|
84
|
+
|
|
85
|
+
self._instruments: Dict[Mount, Optional[LegacyInstrumentCore]] = {
|
|
86
|
+
mount: None for mount in Mount.ot2_mounts() # Legacy core works only on OT2
|
|
87
|
+
}
|
|
88
|
+
self._bundled_labware = bundled_labware
|
|
89
|
+
self._extra_labware = extra_labware or {}
|
|
90
|
+
self._default_max_speeds = AxisMaxSpeeds(robot_type=self.robot_type)
|
|
91
|
+
self._last_location: Optional[Location] = None
|
|
92
|
+
self._last_mount: Optional[Mount] = None
|
|
93
|
+
self._loaded_modules: Set["AbstractModule"] = set()
|
|
94
|
+
self._module_cores: List[legacy_module_core.LegacyModuleCore] = []
|
|
95
|
+
self._labware_cores: List[LegacyLabwareCore] = [self.fixed_trash]
|
|
96
|
+
self._disposal_locations: List[Union[Labware, TrashBin, WasteChute]] = []
|
|
97
|
+
self._liquid_presence_detection = False
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def api_version(self) -> APIVersion:
|
|
101
|
+
"""Get the API version the protocol is adhering to."""
|
|
102
|
+
return self._api_version
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def robot_type(self) -> RobotType:
|
|
106
|
+
return "OT-2 Standard"
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def equipment_broker(self) -> Broker[LoadInfo]:
|
|
110
|
+
"""A message broker to to publish equipment load events.
|
|
111
|
+
|
|
112
|
+
Subscribers to this broker will be notified with information about every
|
|
113
|
+
successful labware load, instrument load, or module load.
|
|
114
|
+
|
|
115
|
+
Only this interface is allowed to publish to this broker.
|
|
116
|
+
Calling code may only subscribe or unsubscribe.
|
|
117
|
+
"""
|
|
118
|
+
return self._equipment_broker
|
|
119
|
+
|
|
120
|
+
def get_bundled_labware(self) -> Optional[Dict[str, LabwareDefinition]]:
|
|
121
|
+
"""Bundled labware definition."""
|
|
122
|
+
# TODO AL 20201110 - This should be removed along with the bundling
|
|
123
|
+
# feature as we move to HTTP based protocol execution.
|
|
124
|
+
return self._bundled_labware
|
|
125
|
+
|
|
126
|
+
def get_extra_labware(self) -> Optional[Dict[str, LabwareDefinition]]:
|
|
127
|
+
"""Extra labware definitions."""
|
|
128
|
+
return self._extra_labware
|
|
129
|
+
|
|
130
|
+
def get_max_speeds(self) -> AxisMaxSpeeds:
|
|
131
|
+
"""Get the maximum axis speeds."""
|
|
132
|
+
return self._default_max_speeds
|
|
133
|
+
|
|
134
|
+
def get_hardware(self) -> SyncHardwareAPI:
|
|
135
|
+
"""Access to the synchronous hardware API."""
|
|
136
|
+
return self._sync_hardware
|
|
137
|
+
|
|
138
|
+
def is_simulating(self) -> bool:
|
|
139
|
+
"""Returns true if hardware is being simulated."""
|
|
140
|
+
return self._sync_hardware.is_simulator # type: ignore[no-any-return]
|
|
141
|
+
|
|
142
|
+
def append_disposal_location(
|
|
143
|
+
self,
|
|
144
|
+
disposal_location: Union[Labware, TrashBin, WasteChute],
|
|
145
|
+
) -> None:
|
|
146
|
+
if isinstance(disposal_location, (TrashBin, WasteChute)):
|
|
147
|
+
raise APIVersionError(
|
|
148
|
+
api_element="Trash Bin and Waste Chute Disposal locations"
|
|
149
|
+
)
|
|
150
|
+
self._disposal_locations.append(disposal_location)
|
|
151
|
+
|
|
152
|
+
def add_labware_definition(
|
|
153
|
+
self,
|
|
154
|
+
definition: LabwareDefinition,
|
|
155
|
+
) -> LabwareLoadParams:
|
|
156
|
+
"""Add a labware definition to the set of loadable definitions."""
|
|
157
|
+
load_params = LabwareLoadParams(
|
|
158
|
+
namespace=definition["namespace"],
|
|
159
|
+
load_name=definition["parameters"]["loadName"],
|
|
160
|
+
version=definition["version"],
|
|
161
|
+
)
|
|
162
|
+
self._extra_labware = self._extra_labware.copy()
|
|
163
|
+
self._extra_labware[load_params.as_uri()] = definition
|
|
164
|
+
return load_params
|
|
165
|
+
|
|
166
|
+
def load_labware(
|
|
167
|
+
self,
|
|
168
|
+
load_name: str,
|
|
169
|
+
location: Union[
|
|
170
|
+
DeckSlotName,
|
|
171
|
+
LegacyLabwareCore,
|
|
172
|
+
legacy_module_core.LegacyModuleCore,
|
|
173
|
+
StagingSlotName,
|
|
174
|
+
OffDeckType,
|
|
175
|
+
],
|
|
176
|
+
label: Optional[str],
|
|
177
|
+
namespace: Optional[str],
|
|
178
|
+
version: Optional[int],
|
|
179
|
+
) -> LegacyLabwareCore:
|
|
180
|
+
"""Load a labware using its identifying parameters."""
|
|
181
|
+
if isinstance(location, OffDeckType):
|
|
182
|
+
raise APIVersionError(
|
|
183
|
+
api_element="Loading a labware off deck", until_version="2.15"
|
|
184
|
+
)
|
|
185
|
+
elif isinstance(location, LegacyLabwareCore):
|
|
186
|
+
raise APIVersionError(
|
|
187
|
+
api_element="Loading a labware onto another labware or adapter",
|
|
188
|
+
until_version="2.15",
|
|
189
|
+
)
|
|
190
|
+
elif isinstance(location, StagingSlotName):
|
|
191
|
+
raise APIVersionError(
|
|
192
|
+
api_element="Using a staging deck slot", until_version="2.16"
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
deck_slot = (
|
|
196
|
+
location if isinstance(location, DeckSlotName) else location.get_deck_slot()
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
parent = (
|
|
200
|
+
self.get_deck().position_for(location.value)
|
|
201
|
+
if isinstance(location, DeckSlotName)
|
|
202
|
+
else location.geometry.location
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
labware_def = labware_definition.get_labware_definition(
|
|
206
|
+
load_name,
|
|
207
|
+
namespace,
|
|
208
|
+
version,
|
|
209
|
+
bundled_defs=self._bundled_labware,
|
|
210
|
+
extra_defs=self._extra_labware,
|
|
211
|
+
)
|
|
212
|
+
# For type checking. This should always pass because
|
|
213
|
+
# opentrons.protocol_api.core.legacy should only load labware with schema 2.
|
|
214
|
+
assert labware_def["schemaVersion"] == 2
|
|
215
|
+
|
|
216
|
+
labware_core = LegacyLabwareCore(
|
|
217
|
+
definition=labware_def,
|
|
218
|
+
parent=parent,
|
|
219
|
+
label=label,
|
|
220
|
+
)
|
|
221
|
+
labware_load_params = labware_core.get_load_params()
|
|
222
|
+
labware_offset = self._labware_offset_provider.find(
|
|
223
|
+
load_params=labware_load_params,
|
|
224
|
+
deck_slot=deck_slot,
|
|
225
|
+
requested_module_model=(
|
|
226
|
+
location.get_requested_model()
|
|
227
|
+
if isinstance(location, legacy_module_core.LegacyModuleCore)
|
|
228
|
+
else None
|
|
229
|
+
),
|
|
230
|
+
)
|
|
231
|
+
labware_core.set_calibration(labware_offset.delta)
|
|
232
|
+
|
|
233
|
+
self._labware_cores.append(labware_core)
|
|
234
|
+
if isinstance(location, DeckSlotName):
|
|
235
|
+
# This assignment will raise if the new item conflicts with something else
|
|
236
|
+
# on the deck--for example, if something tall is placed next to a
|
|
237
|
+
# Heater-Shaker.
|
|
238
|
+
#
|
|
239
|
+
# It's a latent bug that we only do this conflict checking when loading
|
|
240
|
+
# directly into a deck slot. We should also do conflict checking when
|
|
241
|
+
# labware is loaded atop a module, because that affects the module's
|
|
242
|
+
# maximum height.
|
|
243
|
+
#
|
|
244
|
+
# In practice, I don't think this matters now (2023-02-22) because of the
|
|
245
|
+
# exact conflict checks that we perform. Wherever we have a constraint on
|
|
246
|
+
# maximum height, we also happen to have a constraint disallowing modules
|
|
247
|
+
# in the first place.
|
|
248
|
+
self._deck_layout[location.value] = labware_core
|
|
249
|
+
|
|
250
|
+
self._equipment_broker.publish(
|
|
251
|
+
LabwareLoadInfo(
|
|
252
|
+
labware_definition=labware_core.get_definition(),
|
|
253
|
+
labware_namespace=labware_load_params.namespace,
|
|
254
|
+
labware_load_name=labware_load_params.load_name,
|
|
255
|
+
labware_version=labware_load_params.version,
|
|
256
|
+
deck_slot=deck_slot,
|
|
257
|
+
on_module=isinstance(location, legacy_module_core.LegacyModuleCore),
|
|
258
|
+
offset_id=labware_offset.offset_id,
|
|
259
|
+
labware_display_name=labware_core.get_user_display_name(),
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
return labware_core
|
|
264
|
+
|
|
265
|
+
def load_adapter(
|
|
266
|
+
self,
|
|
267
|
+
load_name: str,
|
|
268
|
+
location: Union[
|
|
269
|
+
DeckSlotName,
|
|
270
|
+
StagingSlotName,
|
|
271
|
+
legacy_module_core.LegacyModuleCore,
|
|
272
|
+
OffDeckType,
|
|
273
|
+
],
|
|
274
|
+
namespace: Optional[str],
|
|
275
|
+
version: Optional[int],
|
|
276
|
+
) -> LegacyLabwareCore:
|
|
277
|
+
"""Load an adapter using its identifying parameters"""
|
|
278
|
+
raise APIVersionError(api_element="Loading adapter")
|
|
279
|
+
|
|
280
|
+
def load_lid(
|
|
281
|
+
self,
|
|
282
|
+
load_name: str,
|
|
283
|
+
location: LegacyLabwareCore,
|
|
284
|
+
namespace: Optional[str],
|
|
285
|
+
version: Optional[int],
|
|
286
|
+
) -> LegacyLabwareCore:
|
|
287
|
+
"""Load an individual lid labware using its identifying parameters. Must be loaded on a labware."""
|
|
288
|
+
raise APIVersionError(api_element="Loading lid")
|
|
289
|
+
|
|
290
|
+
def load_robot(self) -> None: # type: ignore
|
|
291
|
+
"""Load an adapter using its identifying parameters"""
|
|
292
|
+
raise APIVersionError(api_element="Loading robot")
|
|
293
|
+
|
|
294
|
+
def move_labware(
|
|
295
|
+
self,
|
|
296
|
+
labware_core: LegacyLabwareCore,
|
|
297
|
+
new_location: Union[
|
|
298
|
+
DeckSlotName,
|
|
299
|
+
StagingSlotName,
|
|
300
|
+
LegacyLabwareCore,
|
|
301
|
+
legacy_module_core.LegacyModuleCore,
|
|
302
|
+
OffDeckType,
|
|
303
|
+
WasteChute,
|
|
304
|
+
TrashBin,
|
|
305
|
+
],
|
|
306
|
+
use_gripper: bool,
|
|
307
|
+
pause_for_manual_move: bool,
|
|
308
|
+
pick_up_offset: Optional[Tuple[float, float, float]],
|
|
309
|
+
drop_offset: Optional[Tuple[float, float, float]],
|
|
310
|
+
) -> None:
|
|
311
|
+
"""Move labware to new location."""
|
|
312
|
+
raise APIVersionError(api_element="Labware movement")
|
|
313
|
+
|
|
314
|
+
def move_lid(
|
|
315
|
+
self,
|
|
316
|
+
source_location: Union[DeckSlotName, StagingSlotName, LegacyLabwareCore],
|
|
317
|
+
new_location: Union[
|
|
318
|
+
DeckSlotName,
|
|
319
|
+
StagingSlotName,
|
|
320
|
+
LegacyLabwareCore,
|
|
321
|
+
OffDeckType,
|
|
322
|
+
WasteChute,
|
|
323
|
+
TrashBin,
|
|
324
|
+
],
|
|
325
|
+
use_gripper: bool,
|
|
326
|
+
pause_for_manual_move: bool,
|
|
327
|
+
pick_up_offset: Optional[Tuple[float, float, float]],
|
|
328
|
+
drop_offset: Optional[Tuple[float, float, float]],
|
|
329
|
+
) -> LegacyLabwareCore | None:
|
|
330
|
+
"""Move lid to new location."""
|
|
331
|
+
raise APIVersionError(api_element="Lid movement")
|
|
332
|
+
|
|
333
|
+
def load_module(
|
|
334
|
+
self,
|
|
335
|
+
model: ModuleModel,
|
|
336
|
+
deck_slot: Optional[DeckSlotName],
|
|
337
|
+
configuration: Optional[str],
|
|
338
|
+
) -> legacy_module_core.LegacyModuleCore:
|
|
339
|
+
"""Load a module."""
|
|
340
|
+
resolved_type = ModuleType.from_model(model)
|
|
341
|
+
resolved_location = self._deck_layout.resolve_module_location(
|
|
342
|
+
resolved_type, (None if deck_slot is None else deck_slot.id)
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
selected_hardware = None
|
|
346
|
+
selected_definition = None
|
|
347
|
+
|
|
348
|
+
for module_hardware in self._sync_hardware.attached_modules:
|
|
349
|
+
if module_hardware not in self._loaded_modules:
|
|
350
|
+
definition = module_geometry.load_definition(module_hardware.model())
|
|
351
|
+
compatible = module_geometry.models_compatible(model, definition)
|
|
352
|
+
|
|
353
|
+
if compatible:
|
|
354
|
+
self._loaded_modules.add(module_hardware)
|
|
355
|
+
selected_hardware = module_hardware
|
|
356
|
+
selected_definition = definition
|
|
357
|
+
break
|
|
358
|
+
|
|
359
|
+
if selected_hardware is None and self.is_simulating():
|
|
360
|
+
selected_hardware = self._sync_hardware.create_simulating_module(model)
|
|
361
|
+
selected_definition = module_geometry.load_definition(model)
|
|
362
|
+
|
|
363
|
+
if selected_hardware is None or selected_definition is None:
|
|
364
|
+
raise RuntimeError(f"Could not find specified module: {model.value}")
|
|
365
|
+
|
|
366
|
+
# Load geometry to match the hardware module that we found connected.
|
|
367
|
+
geometry = module_geometry.create_geometry(
|
|
368
|
+
definition=selected_definition,
|
|
369
|
+
parent=self._deck_layout.position_for(resolved_location),
|
|
370
|
+
configuration=configuration,
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
module_core = legacy_module_core.create_module_core(
|
|
374
|
+
module_hardware_api=selected_hardware,
|
|
375
|
+
requested_model=model,
|
|
376
|
+
geometry=geometry,
|
|
377
|
+
protocol_core=self,
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
self._deck_layout[resolved_location] = geometry
|
|
381
|
+
self._module_cores.append(module_core)
|
|
382
|
+
|
|
383
|
+
self.equipment_broker.publish(
|
|
384
|
+
ModuleLoadInfo(
|
|
385
|
+
requested_model=model,
|
|
386
|
+
loaded_model=module_core.get_model(),
|
|
387
|
+
module_serial=module_core.get_serial_number(),
|
|
388
|
+
deck_slot=module_core.get_deck_slot(),
|
|
389
|
+
configuration=configuration,
|
|
390
|
+
)
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
return module_core
|
|
394
|
+
|
|
395
|
+
def load_instrument(
|
|
396
|
+
self,
|
|
397
|
+
instrument_name: PipetteNameType,
|
|
398
|
+
mount: Mount,
|
|
399
|
+
liquid_presence_detection: bool = False,
|
|
400
|
+
) -> LegacyInstrumentCore:
|
|
401
|
+
"""Load an instrument."""
|
|
402
|
+
attached = {
|
|
403
|
+
att_mount: instr.get("name", None)
|
|
404
|
+
for att_mount, instr in self._sync_hardware.attached_instruments.items()
|
|
405
|
+
if instr
|
|
406
|
+
}
|
|
407
|
+
attached[mount] = instrument_name.value
|
|
408
|
+
self._sync_hardware.cache_instruments(attached)
|
|
409
|
+
# If the cache call didn’t raise, the instrument is attached
|
|
410
|
+
new_instr = LegacyInstrumentCore(
|
|
411
|
+
api_version=self._api_version,
|
|
412
|
+
protocol_interface=self,
|
|
413
|
+
mount=mount,
|
|
414
|
+
instrument_name=instrument_name.value,
|
|
415
|
+
default_speed=400.0, # TODO(mm, 2022-11-10): Deduplicate with engine core.
|
|
416
|
+
)
|
|
417
|
+
self._instruments[mount] = new_instr
|
|
418
|
+
logger.info("Instrument {} loaded".format(new_instr))
|
|
419
|
+
|
|
420
|
+
pipette_dict = self._sync_hardware.get_attached_instrument(mount)
|
|
421
|
+
self._equipment_broker.publish(
|
|
422
|
+
InstrumentLoadInfo(
|
|
423
|
+
instrument_load_name=instrument_name.value,
|
|
424
|
+
mount=mount,
|
|
425
|
+
pipette_dict=pipette_dict,
|
|
426
|
+
)
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
return new_instr
|
|
430
|
+
|
|
431
|
+
def load_trash_bin(self, slot_name: DeckSlotName, area_name: str) -> TrashBin:
|
|
432
|
+
raise APIVersionError(api_element="Loading deck configured trash bin")
|
|
433
|
+
|
|
434
|
+
def load_ot2_fixed_trash_bin(self) -> None:
|
|
435
|
+
raise APIVersionError(
|
|
436
|
+
api_element="Loading deck configured OT-2 fixed trash bin"
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
def load_waste_chute(self) -> WasteChute:
|
|
440
|
+
raise APIVersionError(api_element="Loading waste chute")
|
|
441
|
+
|
|
442
|
+
def get_loaded_instruments(
|
|
443
|
+
self,
|
|
444
|
+
) -> Dict[Mount, Optional[LegacyInstrumentCore]]:
|
|
445
|
+
"""Get a mapping of mount to instrument."""
|
|
446
|
+
return self._instruments
|
|
447
|
+
|
|
448
|
+
def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]:
|
|
449
|
+
"""Get valid disposal locations."""
|
|
450
|
+
return self._disposal_locations
|
|
451
|
+
|
|
452
|
+
def pause(self, msg: Optional[str]) -> None:
|
|
453
|
+
"""Pause the protocol."""
|
|
454
|
+
self._sync_hardware.pause(PauseType.PAUSE)
|
|
455
|
+
|
|
456
|
+
def resume(self) -> None:
|
|
457
|
+
"""Result the protocol."""
|
|
458
|
+
self._sync_hardware.resume(PauseType.PAUSE)
|
|
459
|
+
|
|
460
|
+
def comment(self, msg: str) -> None:
|
|
461
|
+
"""Add comment to run log."""
|
|
462
|
+
pass
|
|
463
|
+
|
|
464
|
+
def delay(self, seconds: float, msg: Optional[str]) -> None:
|
|
465
|
+
"""Delay execution for x seconds."""
|
|
466
|
+
self._sync_hardware.delay(seconds)
|
|
467
|
+
|
|
468
|
+
def home(self) -> None:
|
|
469
|
+
"""Home the robot."""
|
|
470
|
+
self.set_last_location(None)
|
|
471
|
+
self._sync_hardware.home()
|
|
472
|
+
|
|
473
|
+
def get_deck(self) -> Deck:
|
|
474
|
+
"""Get the deck layout."""
|
|
475
|
+
return self._deck_layout
|
|
476
|
+
|
|
477
|
+
@property
|
|
478
|
+
def fixed_trash(self) -> LegacyLabwareCore:
|
|
479
|
+
"""The trash fixed to slot 12 of the robot deck."""
|
|
480
|
+
trash = self._deck_layout["12"]
|
|
481
|
+
|
|
482
|
+
if isinstance(trash, LegacyLabwareCore):
|
|
483
|
+
return trash
|
|
484
|
+
if isinstance(trash, Labware):
|
|
485
|
+
return cast(LegacyLabwareCore, trash._core)
|
|
486
|
+
|
|
487
|
+
raise RuntimeError("Robot must have a trash container in 12")
|
|
488
|
+
|
|
489
|
+
def set_rail_lights(self, on: bool) -> None:
|
|
490
|
+
"""Set the rail light state."""
|
|
491
|
+
self._sync_hardware.set_lights(rails=on)
|
|
492
|
+
|
|
493
|
+
def get_rail_lights_on(self) -> bool:
|
|
494
|
+
"""Get the rail light state."""
|
|
495
|
+
return self._sync_hardware.get_lights()["rails"] # type: ignore[no-any-return]
|
|
496
|
+
|
|
497
|
+
def door_closed(self) -> bool:
|
|
498
|
+
"""Check if door is closed."""
|
|
499
|
+
return DoorState.CLOSED == self._sync_hardware.door_state # type: ignore[no-any-return]
|
|
500
|
+
|
|
501
|
+
def get_last_location(
|
|
502
|
+
self,
|
|
503
|
+
mount: Optional[Mount] = None,
|
|
504
|
+
) -> Optional[Location]:
|
|
505
|
+
"""Get the most recent moved to location."""
|
|
506
|
+
if mount is None or mount == self._last_mount:
|
|
507
|
+
return self._last_location
|
|
508
|
+
|
|
509
|
+
return None
|
|
510
|
+
|
|
511
|
+
def set_last_location(
|
|
512
|
+
self,
|
|
513
|
+
location: Optional[Location],
|
|
514
|
+
mount: Optional[Mount] = None,
|
|
515
|
+
) -> None:
|
|
516
|
+
"""Set the most recent moved to location."""
|
|
517
|
+
self._last_location = location
|
|
518
|
+
self._last_mount = mount
|
|
519
|
+
|
|
520
|
+
def load_lid_stack(
|
|
521
|
+
self,
|
|
522
|
+
load_name: str,
|
|
523
|
+
location: Union[DeckSlotName, StagingSlotName, LegacyLabwareCore],
|
|
524
|
+
quantity: int,
|
|
525
|
+
namespace: Optional[str],
|
|
526
|
+
version: Optional[int],
|
|
527
|
+
) -> LegacyLabwareCore:
|
|
528
|
+
"""Load a Stack of Lids to a given location, creating a Lid Stack."""
|
|
529
|
+
raise APIVersionError(api_element="Lid stack")
|
|
530
|
+
|
|
531
|
+
def load_labware_to_flex_stacker_hopper(
|
|
532
|
+
self,
|
|
533
|
+
module_core: legacy_module_core.LegacyModuleCore,
|
|
534
|
+
load_name: str,
|
|
535
|
+
quantity: int,
|
|
536
|
+
label: Optional[str],
|
|
537
|
+
namespace: Optional[str],
|
|
538
|
+
version: Optional[int],
|
|
539
|
+
lid: Optional[str],
|
|
540
|
+
) -> None:
|
|
541
|
+
"""Load labware to a Flex stacker hopper."""
|
|
542
|
+
raise APIVersionError(api_element="Flex stacker")
|
|
543
|
+
|
|
544
|
+
def get_module_cores(self) -> List[legacy_module_core.LegacyModuleCore]:
|
|
545
|
+
"""Get loaded module cores."""
|
|
546
|
+
return self._module_cores
|
|
547
|
+
|
|
548
|
+
def get_labware_cores(self) -> List[LegacyLabwareCore]:
|
|
549
|
+
"""Get all loaded labware cores."""
|
|
550
|
+
return self._labware_cores
|
|
551
|
+
|
|
552
|
+
def get_labware_on_module(
|
|
553
|
+
self, module_core: legacy_module_core.LegacyModuleCore
|
|
554
|
+
) -> Optional[LegacyLabwareCore]:
|
|
555
|
+
"""Get the item on top of a given module, if any."""
|
|
556
|
+
labware = module_core.geometry.labware
|
|
557
|
+
return cast(LegacyLabwareCore, labware._core) if labware is not None else None
|
|
558
|
+
|
|
559
|
+
def get_labware_on_labware(
|
|
560
|
+
self, labware_core: LegacyLabwareCore
|
|
561
|
+
) -> Optional[LegacyLabwareCore]:
|
|
562
|
+
assert False, "get_labware_on_labware only supported on engine core"
|
|
563
|
+
|
|
564
|
+
def get_deck_definition(self) -> DeckDefinitionV5:
|
|
565
|
+
"""Get the geometry definition of the robot's deck."""
|
|
566
|
+
assert False, "get_deck_definition only supported on engine core"
|
|
567
|
+
|
|
568
|
+
def get_slot_definition(
|
|
569
|
+
self, slot: Union[DeckSlotName, StagingSlotName]
|
|
570
|
+
) -> SlotDefV3:
|
|
571
|
+
"""Get the slot definition from the robot's deck."""
|
|
572
|
+
assert False, "get_slot_definition only supported on engine core"
|
|
573
|
+
|
|
574
|
+
def get_slot_definitions(self) -> Dict[str, SlotDefV3]:
|
|
575
|
+
"""Get all standard slot definitions available in the deck definition."""
|
|
576
|
+
assert False, "get_slot_definitions only supported on engine core"
|
|
577
|
+
|
|
578
|
+
def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]:
|
|
579
|
+
"""Get all staging slot definitions available in the deck definition."""
|
|
580
|
+
assert False, "get_staging_slot_definitions only supported on engine core"
|
|
581
|
+
|
|
582
|
+
def get_slot_item(
|
|
583
|
+
self, slot_name: Union[DeckSlotName, StagingSlotName]
|
|
584
|
+
) -> Union[LegacyLabwareCore, legacy_module_core.LegacyModuleCore, None]:
|
|
585
|
+
"""Get the contents of a given slot, if any."""
|
|
586
|
+
assert False, "get_slot_item only supported on engine core"
|
|
587
|
+
|
|
588
|
+
def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point:
|
|
589
|
+
"""Get the absolute coordinate of a slot's center."""
|
|
590
|
+
assert False, "get_slot_center only supported on engine core."
|
|
591
|
+
|
|
592
|
+
def get_highest_z(self) -> float:
|
|
593
|
+
"""Get the highest Z point of all deck items."""
|
|
594
|
+
assert False, "get_highest_z only supported on engine core"
|
|
595
|
+
|
|
596
|
+
def define_liquid(
|
|
597
|
+
self, name: str, description: Optional[str], display_color: Optional[str]
|
|
598
|
+
) -> Liquid:
|
|
599
|
+
"""Define a liquid to load into a well."""
|
|
600
|
+
assert False, "define_liquid only supported on engine core"
|
|
601
|
+
|
|
602
|
+
def get_liquid_class(self, name: str, version: int) -> LiquidClass:
|
|
603
|
+
"""Get an instance of a built-in liquid class."""
|
|
604
|
+
assert False, "define_liquid_class is only supported on engine core"
|
|
605
|
+
|
|
606
|
+
def get_labware_location(
|
|
607
|
+
self, labware_core: LegacyLabwareCore
|
|
608
|
+
) -> Union[
|
|
609
|
+
str, LegacyLabwareCore, legacy_module_core.LegacyModuleCore, OffDeckType
|
|
610
|
+
]:
|
|
611
|
+
"""Get labware parent location."""
|
|
612
|
+
assert False, "get_labware_location only supported on engine core"
|