mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-27 16:51:12 -07:00
forgetest: the lid lamp idles at forgectrl's lid_lamp_idle; the liveness test masks and restarts
The lid lamp now has a resting policy in forgectrl (lid_lamp_idle, default 236, asserted at start and at every spawn), so the baseline expects it there instead of preserving whatever level a boot left, and forgectrl.settings-bounds proves it: resting at the setting, 256 / -1 / 'bright' refused, a new level applied to the lamp at once, the cleared key back to the default. Clearing a key goes through the query-string form (an empty JSON value reads as no setting). motion.liveness-probe adds the regression the bench needed: with every axis masked (cnc/motor_lock=15, as a bench tool may leave it) forgectrl is restarted and its fresh probe must read MOTION OK on the first try - the probe unmasks the axes itself - and the controller comes up with the mask cleared. Bench 2026-08-16: MOTION OK at p2p 2047/1341 against the 800 threshold, no ladder. The baseline's settle no longer counts 'probe verified, spawn pending' as settled (the post pass ran between the probe's own writes and the controller's init writes and mis-flagged motor_lock/step_freq): it waits for the controller to be running, with a bounded allowance for a respawn backoff.
This commit is contained in:
@@ -105,31 +105,26 @@ class BaselineTests(unittest.TestCase):
|
||||
self._sync_leds()
|
||||
self.assertEqual(baseline.read_led("button_led_2"), "0")
|
||||
|
||||
def test_preserved_lamp_and_position(self):
|
||||
def test_preserved_position(self):
|
||||
b = self.bl()
|
||||
self._attr("pic/lid_led", "132")
|
||||
cap = b.capture()
|
||||
self.assertEqual(cap["sysfs"]["pic/lid_led"], "132")
|
||||
self.assertEqual(cap["position"], [0, 0, 0])
|
||||
# the run turned the lamp off and shifted the counters
|
||||
self._attr("pic/lid_led", "0")
|
||||
# the run shifted the counters
|
||||
self._pos(1000, 0, 0)
|
||||
left = b.enforce("post", captured=cap)
|
||||
items = {x.item: x for x in left}
|
||||
self.assertEqual(set(items), {"pic/lid_led", "position"})
|
||||
self.assertEqual(items["pic/lid_led"].action, "restored")
|
||||
self.assertEqual(self._read("pic/lid_led"), "132")
|
||||
self.assertEqual(set(items), {"position"})
|
||||
# no GRBL controller on the host: the head cannot be jogged back
|
||||
self.assertTrue(items["position"].action.startswith("unrestorable"), items["position"].action)
|
||||
self.assertEqual(items["position"].found, [1000, 0, 0])
|
||||
|
||||
def test_session_resting_lamp_from_boot_reference(self):
|
||||
# the pre pass hands the lamp back to the boot level
|
||||
def test_lamp_needs_forgectrl(self):
|
||||
# the lamp's idle level comes from forgectrl's settings: without the
|
||||
# daemon there is nothing to compare against
|
||||
self._attr("pic/lid_led", "77")
|
||||
session = {"sysfs": {"pic/lid_led": "0"}}
|
||||
left = self.bl().enforce("pre", captured=session)
|
||||
self.assertEqual([(x.item, x.action) for x in left], [("pic/lid_led", "restored")])
|
||||
self.assertEqual(self._read("pic/lid_led"), "0")
|
||||
left = self.bl().enforce("pre", captured=None)
|
||||
self.assertEqual(left, [])
|
||||
self.assertEqual(self._read("pic/lid_led"), "77")
|
||||
|
||||
def test_no_sysfs_means_skip(self):
|
||||
os.environ["GF_SYSFS_ROOT"] = os.path.join(self.tmp, "nope") + os.sep
|
||||
|
||||
Reference in New Issue
Block a user