From 13beb51e2607236341ddb66a7014c19d952e6371 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Sun, 16 Aug 2026 13:35:20 -0400 Subject: [PATCH] forgetest: kernel.k1-k2 leaves the position counters where it found them K2 streamed 1000 masked +X steps; the counters advanced although nothing moved, and forgectrl's position display carried the offset. The stream now runs 1000 out and 1000 back, and the counters returning to start is a check. Bench-proven 2026-08-16: (0,0,0) before and after. --- forgetest/forgetest/suite/kernel.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/forgetest/forgetest/suite/kernel.py b/forgetest/forgetest/suite/kernel.py index e9d5d28..cd9c60d 100644 --- a/forgetest/forgetest/suite/kernel.py +++ b/forgetest/forgetest/suite/kernel.py @@ -33,7 +33,8 @@ LATCH_BIT = 1 << 3 TICK_HZ = 10000 FIRE = b"\x10" PAD = b"\x00" -XSTEP = b"\x01" +XSTEP = b"\x01" # +X (DIR clear) +XSTEP_BACK = b"\x03" # -X (DIR set) POWER0 = bytes([0x80]) # power byte, duty 0 _KERNEL_COVERS = [("kernel-module-glowforge", "**"), ("linux-fslc", "**")] @@ -251,7 +252,9 @@ def k1_k2(ctx): ctx.log("K1 PASS: decelerating tail %.4f s, no burst, no fault", dt) # ---- K2 - step_sec = (XSTEP + PAD * 4) * 1000 # 1000 X steps at 2 kHz (masked) + # 1000 X steps out and 1000 back at 2 kHz (masked by motor_lock): + # the position counters end where they started + step_sec = (XSTEP + PAD * 4) * 1000 + (XSTEP_BACK + PAD * 4) * 1000 stream = (POWER0 + PAD * TICK_HZ + step_sec + PAD * (TICK_HZ // 2) + FIRE * (2 * TICK_HZ) + PAD * TICK_HZ) ctx.log("K2: %d bytes = %.1f s; latch stays LOCKED; waypoint +200; motor_lock=15", @@ -283,9 +286,8 @@ def k1_k2(ctx): "underruns": rd("cnc/underruns"), "faults": rd("cnc/faults")} ctx.log("K2 done: state=%s pos before=%s after=%s", state, pos_before, pos_after) ctx.check(not hits, "K2: laser asserted with the latch locked: %s", hits[:10]) - if pos_before[:3] == pos_after[:3]: - ctx.log("K2 NOTE: position did not advance under motor_lock (waypoint completion " - "unconfirmed by the counter on this board)") + ctx.check(pos_before[:3] == pos_after[:3], + "K2: position counters did not return to start (%s -> %s)", pos_before[:3], pos_after[:3]) ctx.log("K2 PASS: FIRE window replayed after the resume waypoint with " "laser_enable/laser_on at 0 throughout")