From 0b976813422d4be7779a23dddeab00423822f9cf Mon Sep 17 00:00:00 2001 From: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> Date: Fri, 6 Oct 2023 14:09:59 -0400 Subject: [PATCH] feat(api): check for tip presence on 96 channel pipette (#13703) --- .../instruments/ot3/pipette.py | 4 ++ api/src/opentrons/hardware_control/ot3api.py | 40 ++++++++++++++++++- .../backends/test_ot3_utils.py | 2 +- .../2/general/eight_channel/p10/1_0.json | 3 +- .../2/general/eight_channel/p10/1_3.json | 3 +- .../2/general/eight_channel/p10/1_4.json | 3 +- .../2/general/eight_channel/p10/1_5.json | 3 +- .../2/general/eight_channel/p10/1_6.json | 3 +- .../2/general/eight_channel/p1000/1_0.json | 3 +- .../2/general/eight_channel/p1000/3_0.json | 3 +- .../2/general/eight_channel/p1000/3_3.json | 3 +- .../2/general/eight_channel/p1000/3_4.json | 3 +- .../2/general/eight_channel/p1000/3_5.json | 3 +- .../2/general/eight_channel/p20/2_0.json | 3 +- .../2/general/eight_channel/p20/2_1.json | 3 +- .../2/general/eight_channel/p300/1_0.json | 3 +- .../2/general/eight_channel/p300/1_3.json | 3 +- .../2/general/eight_channel/p300/1_4.json | 3 +- .../2/general/eight_channel/p300/1_5.json | 3 +- .../2/general/eight_channel/p300/2_0.json | 3 +- .../2/general/eight_channel/p300/2_1.json | 3 +- .../2/general/eight_channel/p50/1_0.json | 3 +- .../2/general/eight_channel/p50/1_3.json | 3 +- .../2/general/eight_channel/p50/1_4.json | 3 +- .../2/general/eight_channel/p50/1_5.json | 3 +- .../2/general/eight_channel/p50/3_0.json | 3 +- .../2/general/eight_channel/p50/3_3.json | 3 +- .../2/general/eight_channel/p50/3_4.json | 3 +- .../2/general/eight_channel/p50/3_5.json | 3 +- .../general/ninety_six_channel/p1000/1_0.json | 3 +- .../general/ninety_six_channel/p1000/3_0.json | 3 +- .../general/ninety_six_channel/p1000/3_3.json | 3 +- .../general/ninety_six_channel/p1000/3_4.json | 3 +- .../general/ninety_six_channel/p1000/3_5.json | 3 +- .../2/general/single_channel/p10/1_0.json | 3 +- .../2/general/single_channel/p10/1_3.json | 3 +- .../2/general/single_channel/p10/1_4.json | 3 +- .../2/general/single_channel/p10/1_5.json | 3 +- .../2/general/single_channel/p1000/1_0.json | 3 +- .../2/general/single_channel/p1000/1_3.json | 3 +- .../2/general/single_channel/p1000/1_4.json | 3 +- .../2/general/single_channel/p1000/1_5.json | 3 +- .../2/general/single_channel/p1000/2_0.json | 3 +- .../2/general/single_channel/p1000/2_1.json | 3 +- .../2/general/single_channel/p1000/2_2.json | 3 +- .../2/general/single_channel/p1000/3_0.json | 3 +- .../2/general/single_channel/p1000/3_3.json | 3 +- .../2/general/single_channel/p1000/3_4.json | 3 +- .../2/general/single_channel/p1000/3_5.json | 3 +- .../2/general/single_channel/p20/2_0.json | 3 +- .../2/general/single_channel/p20/2_1.json | 3 +- .../2/general/single_channel/p20/2_2.json | 3 +- .../2/general/single_channel/p300/1_0.json | 3 +- .../2/general/single_channel/p300/1_3.json | 3 +- .../2/general/single_channel/p300/1_4.json | 3 +- .../2/general/single_channel/p300/1_5.json | 3 +- .../2/general/single_channel/p300/2_0.json | 3 +- .../2/general/single_channel/p300/2_1.json | 3 +- .../2/general/single_channel/p50/1_0.json | 3 +- .../2/general/single_channel/p50/1_3.json | 3 +- .../2/general/single_channel/p50/1_4.json | 3 +- .../2/general/single_channel/p50/1_5.json | 3 +- .../2/general/single_channel/p50/3_0.json | 3 +- .../2/general/single_channel/p50/3_3.json | 3 +- .../2/general/single_channel/p50/3_4.json | 3 +- .../2/general/single_channel/p50/3_5.json | 3 +- .../pipette/pipette_definition.py | 5 +++ .../scripts/update_configuration_files.py | 2 - 68 files changed, 175 insertions(+), 67 deletions(-) diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py index 57b131ecc41..6a7639157e4 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py @@ -509,6 +509,10 @@ def remove_tip(self) -> None: def has_tip(self) -> bool: return self._has_tip + @property + def tip_presence_check_dist_mm(self) -> float: + return self._config.tip_presence_check_distance_mm + # Cache max is chosen somewhat arbitrarily. With a float is input we don't # want this to unbounded. @functools.lru_cache(maxsize=100) diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index 99a423c918d..d41ce92efa8 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -34,7 +34,9 @@ pipette_load_name_conversions as pipette_load_name, ) from opentrons_shared_data.robot.dev_types import RobotType -from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError +from opentrons_shared_data.errors.exceptions import ( + StallOrCollisionDetectedError, +) from opentrons import types as top_types from opentrons.config import robot_configs, feature_flags as ff @@ -1895,6 +1897,42 @@ async def blow_out( blowout_spec.instr.set_current_volume(0) blowout_spec.instr.ready_to_aspirate = False + async def get_tip_presence_status(self, mount: OT3Mount) -> bool: + """ + Check tip presence status. If a high throughput pipette is present, + move the tip motors down before checking the sensor status. + """ + checked_mount = OT3Mount.from_mount(mount) + high_throughput = self._gantry_load == GantryLoad.HIGH_THROUGHPUT + if high_throughput: + # check if we're already at the tip_presence_check position, if we are dont move + + instrument = self._pipette_handler.get_pipette(checked_mount) + tip_presence_check_target = instrument.tip_presence_check_dist_mm + + # if position is not known, home gear motors before any potential movement + if self._backend.gear_motor_position is None: + await self.home_gear_motors() + + tip_motor_pos_float = axis_convert(self._backend.gear_motor_position, 0.0)[ + Axis.of_main_tool_actuator(checked_mount) + ] + + # only move tip motors if they are not already below the sensor + if tip_motor_pos_float < tip_presence_check_target: + clamp_moves = self._build_moves( + {Axis.Q: tip_motor_pos_float}, {Axis.Q: tip_presence_check_target} + ) + await self._backend.tip_action(moves=clamp_moves[0]) + tip_status = await self._backend.get_tip_present_state( + mount=checked_mount, expect_multiple_responses=high_throughput + ) + + if high_throughput: + # return tip motors to neutral position + await self.home_gear_motors() + return tip_status + async def _force_pick_up_tip( self, mount: OT3Mount, pipette_spec: PickUpTipSpec ) -> None: diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py b/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py index 800c6e72d08..9cf0de99f44 100644 --- a/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py @@ -72,7 +72,7 @@ def test_filter_zero_duration_step() -> None: Axis.P_R: 0, } moves = [Move.build_dummy([Axis.X, Axis.Y, Axis.Z_L, Axis.Z_R, Axis.P_L])] - for block in (moves[0].blocks[0], moves[0].blocks[1]): + for block in moves[0].blocks: block.distance = f64(25.0) block.time = f64(1.0) block.initial_speed = f64(25.0) diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json index 44e1bf84760..4f353672189 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json index b71b9f112e2..9090efaccb2 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json index 7884060abb7..d7967eb7f8e 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json index e8447efdce0..9974fe1c989 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json index e8447efdce0..9974fe1c989 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json index 2da0be49f08..f8c2397938d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json @@ -51,5 +51,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json index 502ada5dd9b..325e06edfc3 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json @@ -51,5 +51,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json index 502ada5dd9b..325e06edfc3 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json @@ -51,5 +51,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json index f8e508bdfd7..74ab62080fe 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json @@ -51,5 +51,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json index f8e508bdfd7..74ab62080fe 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json @@ -51,5 +51,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json index c02138a297e..5ff09279c1d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json index c02138a297e..5ff09279c1d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json index 23354433c5f..fc8202bb490 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json index 66ba1354970..158246e8859 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json index 66ba1354970..158246e8859 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json index f2813129e2e..707f591d644 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json index c8b47ddd04c..faf79930bbf 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json index c8b47ddd04c..faf79930bbf 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json index 04979895755..3db295cf144 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json index 9b4d07690a7..a930751ec6c 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json index 4ec2c916d3e..187dc21b9b0 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json index 744cd90444e..c2249446a6b 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json index 4f4ace328ab..a6dceda8f18 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json @@ -57,5 +57,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json index 4f4ace328ab..a6dceda8f18 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json @@ -57,5 +57,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json index 8ebb55ff42f..c7b005e1049 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json @@ -57,5 +57,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json index 8ebb55ff42f..c7b005e1049 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json @@ -57,5 +57,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json index 7d972aa3b17..d9c3d8d7d49 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json @@ -52,5 +52,6 @@ "plungerHomingConfigurations": { "current": 2.0, "speed": 5 - } + }, + "tipPresenceCheckDistanceMM": "8.0" } diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json index c18e9fded71..31694ec9441 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json @@ -52,5 +52,6 @@ "plungerHomingConfigurations": { "current": 2.0, "speed": 5 - } + }, + "tipPresenceCheckDistanceMM": "8.0" } diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json index c18e9fded71..31694ec9441 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json @@ -52,5 +52,6 @@ "plungerHomingConfigurations": { "current": 2.0, "speed": 5 - } + }, + "tipPresenceCheckDistanceMM": "8.0" } diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json index bac55b3996f..7edce03d6c8 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json @@ -52,5 +52,6 @@ "plungerHomingConfigurations": { "current": 0.8, "speed": 5 - } + }, + "tipPresenceCheckDistanceMM": "8.0" } diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json index bac55b3996f..7edce03d6c8 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json @@ -52,5 +52,6 @@ "plungerHomingConfigurations": { "current": 0.8, "speed": 5 - } + }, + "tipPresenceCheckDistanceMM": "8.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json index 8cc699533ec..87bc9d96d64 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json index 1e6765e00b4..6ffa340a8b3 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json index a044395382c..abd69fc06d4 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json index a044395382c..abd69fc06d4 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json index c5e73bc3e7e..fdd7421a49d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json index 38a62cda856..bf9dbf3c137 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json index 38a62cda856..bf9dbf3c137 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json index a2fc3c6edc2..cc2384deda6 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.5, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json index 3c1777feffe..1faf7ce5e5f 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json index 7609ef93972..0600d164c98 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json index 7609ef93972..0600d164c98 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json index 972a8516216..1aa35765c0b 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json @@ -50,5 +50,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json index 972a8516216..1aa35765c0b 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json @@ -50,5 +50,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json index 98c7d9707e0..9f88a64897d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json @@ -50,5 +50,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json index 98c7d9707e0..9f88a64897d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json @@ -50,5 +50,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json index 7d8dc7fa606..26e9a9c8f3f 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json index a7a3649cdea..2a14e95d535 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json index a7a3649cdea..2a14e95d535 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json index 4f174a5eb8c..32b3a0c76cc 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json index 8e7663ad458..eb334ea9835 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json index 5bc84742f62..72c24e1ebdf 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json index 5bc84742f62..72c24e1ebdf 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json index 5a9dae759b4..0d0e56e1368 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json index 3686e581240..961c04a067d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json index a23409dfdf9..b413e7fc45f 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json index 34329f19cbd..a355b7fa796 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json index a6e1872d352..291b79b5751 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json @@ -45,5 +45,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json index 7a4f2053d1d..96f0051da60 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json @@ -47,5 +47,6 @@ "plungerHomingConfigurations": { "current": 0.3, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json index 32b0e88ab38..7381b5fe52c 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json @@ -56,5 +56,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json index 32b0e88ab38..7381b5fe52c 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json @@ -56,5 +56,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json index 470c9a9985c..7c606e35508 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json @@ -56,5 +56,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json index 470c9a9985c..7c606e35508 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json @@ -56,5 +56,6 @@ "plungerHomingConfigurations": { "current": 1.0, "speed": 30 - } + }, + "tipPresenceCheckDistanceMM": "0.0" } diff --git a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py index 4214f376396..5a92f884ed9 100644 --- a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py +++ b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py @@ -246,6 +246,11 @@ class PipettePhysicalPropertiesDefinition(BaseModel): quirks: List[pip_types.Quirks] = Field( ..., description="The list of quirks available for the loaded configuration" ) + tip_presence_check_distance_mm: float = Field( + default=0, + description="The distance the high throughput tip motors will travel to check tip status.", + alias="tipPresenceCheckDistanceMM", + ) @validator("pipette_type", pre=True) def convert_pipette_model_string(cls, v: str) -> pip_types.PipetteModelType: diff --git a/shared-data/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py b/shared-data/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py index eaf2665af9b..16c434d9897 100644 --- a/shared-data/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py +++ b/shared-data/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py @@ -145,7 +145,6 @@ def update( Recursively update the given dictionary to ensure no data is lost when updating. """ next_key = next(iter_of_configs, None) - breakpoint() if next_key and isinstance(dict_to_update[next_key], dict): dict_to_update[next_key] = update( dict_to_update.get(next_key, {}), iter_of_configs, value_to_update @@ -160,7 +159,6 @@ def build_nozzle_map( ) -> Dict[str, List[float]]: Y_OFFSET = 9 X_OFFSET = -9 - breakpoint() if channels == PipetteChannelType.SINGLE_CHANNEL: return {"A1": nozzle_offset} elif channels == PipetteChannelType.EIGHT_CHANNEL: