Cover both dose models explicitly now that density is the default

grblHAL-glowforge 03d70e0, pinned here, makes density the shipped model
and $35 the density floor at 10. Every analog session in the stream
harness now selects its model rather than inheriting it: without that the
flip would have quietly turned them into density runs and taken the
analog fallback's coverage with them. laser.power-floor carries the new
floor and its PWMSAR minimum, and its description no longer describes
$35 as a duty floor.

All ten stream sessions pass on the new defaults, with the analog duties
shifting exactly as the floor predicts - min_value 12, gradient 0.115 -
along with both C harnesses and the lifecycle harness.

Recorded in BRINGUP and the campaign log, including what the defaults
rest on and what they do not: the seven ladders ran at F300 and F100 at
constant power, so production feeds, M4 into corners and the raster path
remain unproven on hardware.
This commit is contained in:
ScottW514
2026-08-17 22:03:56 -04:00
parent 1e855ab212
commit 0c2dd37b2f
5 changed files with 74 additions and 36 deletions
+11 -8
View File
@@ -26,10 +26,13 @@ _LASER_COVERS = [("grblhal-glowforge", "src/**"), ("kernel-module-glowforge", "*
("forgectrl", "src/status.c"), ("forgectrl", "src/main.c")]
# boards/glowforge.h: DEFAULT_SPINDLE_PWM_MIN_VALUE against the hardware's
# 127-count PWM period. The tube's measured lasing threshold is PWMSAR 20.
POWER_FLOOR_PCT = 16.0
# 127-count PWM period. Under the shipped FIRE-density dose model this is
# a density floor: the bottom of the S range maps onto it, measured as
# the lowest level that still marks. (Under the analog fallback the same
# setting is a duty floor and wants ~16, the duty this tube lases at.)
POWER_FLOOR_PCT = 10.0
PWM_PERIOD = 127
PWMSAR_FLOOR_MIN = 20
PWMSAR_FLOOR_MIN = 12
ARM_CUE = ("LIVE FIRE. Eye protection on, exhaust running, fire watch and extinguisher in reach, "
"scrap under the head with room to move (%s), lid closed. When the job starts the "
@@ -228,11 +231,11 @@ def wait_disarm(ctx, timeout):
@test("laser.power-floor", title="The shipped duty floor holds commanded power above the lasing threshold",
subsystem="laser", kind="auto", est_min=1,
covers=[("grblhal-glowforge", "src/**")],
description="The tube lases only above ~16 % duty, so $35 must floor every nonzero S there: "
"unfloored, M4's velocity-scaled power falls into the dead band at every corner "
"and reversal and marks nothing. Reads $$ and checks the floor is the "
description="$35 floors the bottom of the laser's output range, and unfloored the low end "
"of S asks for pulses too far apart for the discharge to re-strike - a "
"commanded 1 % would emit nothing. Reads $$ and checks the floor is the "
"commissioned percent, that $31 is 0 (the floor, not $31, sets the bottom of "
"the range), and that the floor lands at or above PWMSAR 20. Reports the "
"the range), and that it lands at or above the measured minimum. Reports the "
"stored setting, which is the one in force after any controller start.")
def power_floor(ctx):
ev = ctx.evidence
@@ -263,7 +266,7 @@ def power_floor(ctx):
"controller restart, since the spindle mapping is precomputed at start",
floor_pct, POWER_FLOOR_PCT)
ctx.check(counts >= PWMSAR_FLOOR_MIN,
"the floor lands at PWMSAR %d, below the %d the tube needs to lase",
"the floor lands at PWMSAR %d, below the %d the tube needs",
counts, PWMSAR_FLOOR_MIN)
ctx.check(rpm_min == 0, "$31 is %s, not 0: the bottom of the S range is no longer the floor",
rpm_min)