Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions pylabrobot/hamilton/star/driver/features/head.py
Original file line number Diff line number Diff line change
Expand Up @@ -1156,13 +1156,20 @@ async def move_to_xy_position(
if minimum_traverse_height_start is None:
await self.move_to_safe_z(speed=z_speed, acceleration=z_acceleration)
else:
tips = await self.request_tip_presence()
stop_disc = minimum_traverse_height_start
if await self.request_tip_presence():
if tips:
stop_disc += await self.request_tip_overhang()
if await self.request_z_position() < stop_disc:
await self.move_stop_disc_to_z_position(
stop_disc, speed=z_speed, acceleration=z_acceleration
)
# With tips, the move names the tip bottom, so a refusal says what the caller asked for.
if tips:
await self.move_tool_bottom_to_z_position(
minimum_traverse_height_start, speed=z_speed, acceleration=z_acceleration
)
else:
await self.move_stop_disc_to_z_position(
stop_disc, speed=z_speed, acceleration=z_acceleration
)
if self.arm is not None and self.arm.pipettes is not None:
await self.arm.pipettes.move_to_safe_z()
await asyncio.gather(
Expand Down
2 changes: 1 addition & 1 deletion pylabrobot/hamilton/star/driver/features/head96.py
Original file line number Diff line number Diff line change
Expand Up @@ -2891,7 +2891,7 @@ def get_following(height: float) -> float:
if not await self.request_tip_presence():
raise RuntimeError("the head reports no tips; pick up tips first")
await self.move_to_xy_position(
a1.x, a1.y, minimum_traverse_height_start=minimum_traverse_height_start, z_speed=descent_speed
a1.x, a1.y, minimum_traverse_height_start=minimum_traverse_height_start
)

async def strokes() -> None:
Expand Down
10 changes: 10 additions & 0 deletions pylabrobot/hamilton/star/driver/features/head_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,16 @@ async def test_every_drive_setting_reaches_its_move(self):
a1.y, speed=100.0, acceleration=200.0, current_limit=10
)

async def test_an_unreachable_traverse_height_is_refused_as_a_tip_bottom(self):
a1 = self.head._get_target(self.plate, None)[1]
with self.assertRaisesRegex(ValueError, "the tool bottom reaches .* not 1000.0"):
await self.head.move_to_xy_position(a1.x, a1.y, minimum_traverse_height_start=1000.0)

async def test_mix_rises_at_the_drive_default_not_its_descent_speed(self):
with patch.object(self.head, "move_to_safe_z", AsyncMock()) as raised:
await self.head.mix(self.plate, Mix(volume=50.0, repetitions=1, flow_rate=100.0))
self.assertEqual(raised.await_args_list[0].kwargs, {"speed": None, "acceleration": None})

async def test_an_unreachable_y_is_refused_before_the_head_is_raised(self):
a1 = self.head._get_target(self.plate, None)[1]
top = self.head.configuration.z_range[1] - await self.head.request_tip_overhang()
Expand Down
Loading