mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-28 01:01:12 -07:00
Audit follow-through: runbook, bench tools, recipes, release tooling
BRINGUP describes the present: the 54-test catalog and its seven-test always core, the tier counts, the shipped low-temperature gates, the density floor ($35 = 10), the two local core commits, the ffboot env write, the aa-offset route, the current bench image, and the bench measurements the audit asks for (pooled into the next session). The workstation shell notes and every em dash are gone. forgetest: the takeover waits for the cloud client too (found by its command line); the unauthenticated /boot probe names the endpoint's parameter; the UI prose is American English. Recipes: forgetest fetches its package directory and init script only and drops __pycache__ at unpack; the dev image no longer re-adds forgectrl; the release image's remove list drops the gfui-client the BSP no longer has; the platform identity strips the kernel's local-version hash from the modules directory name, so a re-patched kernel keeps its fingerprints. grblhal restart is stop then start. release.sh --dev packs the dev image. fixture.sh refuses a readable env file. Bench tools: the live-fire drills measure the lid-IR baseline before every run and point at the fire-watch thresholds the engine reads; one thermistor conversion (gfbench.degc) serves every drill; the six dated measurement records leave the tool directory; feeder.c names the two sysfs writes its caller makes. Host tests: forgetest 258 pass; the coverage lint reports no uncovered path across 54 tests. Acceptance: forgectrl.auth covers the /boot probe; update.* cover ffboot and the manifest identity; the runbook and bench-tool changes have no catalog consequence.
This commit is contained in:
@@ -46,15 +46,15 @@ page's takeover does that; from a host, stop them first.
|
||||
| `offset_probe.py` | Coolant-sensor offset probe (board; forgectrl idle; dark, no press): switches one actuator at a time (exhaust at 100/50/25 %, intakes, air assist, purge, heater, pump, TEC, lid lamp, then all run fans) with both thermistors sampled at 25 Hz and scores the common-mode step at every edge and the level toggling inside every dwell; `offset_probe.py ladder` runs the air-assist duty ladder alone. Every value is restored on exit. JSON record in the bench data directory. |
|
||||
| `flow_warm_validate.py` | Runs the real check from a heater-warmed baseline (board or host; forgectrl and controller stopped; `flow_warm_validate.py [cycles_per_case]`; results/log in the bench data directory; exit 1 if any run is misclassified). Note the ceiling: 100 % duty pushes the downstream sensor past 50 °C in 30 s while the bulk barely moves, so warm-loop validation above ~23 °C needs the laser, not the heater. |
|
||||
| `flow_recheck_char.py` | Characterizes short in-run re-checks and the differential metric (board or host; forgectrl and controller stopped; `flow_recheck_char.py [heater_pct] [window_s]`); shows why over-temp cannot see a stopped pump and why passive warming trends are ambiguous. |
|
||||
| `flow_confirm_drill.py` | Coolant flow suspicion/confirmation drill (runs on the board): one continuous M8 session walks the verdict state machine through real pump-off transients — verified → SUSPECT (+ immediate re-check) → cleared → SUSPECT → FAULT (consecutive) → recovered — printing PASS/FAIL per transition. Leaves the machine idle (M9, pump on, heater off). |
|
||||
| `flow_confirm_drill.py` | Coolant flow suspicion/confirmation drill (runs on the board): one continuous M8 session walks the verdict state machine through real pump-off transients - verified → SUSPECT (+ immediate re-check) → cleared → SUSPECT → FAULT (consecutive) → recovered - printing PASS/FAIL per transition. Leaves the machine idle (M9, pump on, heater off). |
|
||||
| `flow_escalate_drill.py` | Coolant starved-re-check escalation drill (runs on the board, controller running): sets the engine's confirmation budget `cool_confirm_max_s` to a short value through forgectrl's settings (`flow_escalate_drill.py [budget_s]`, default 60, the setting's minimum) and restores it after; with the pump off the job-start check reads SUSPECT, the stagnant loop cannot pass the settle gate inside the budget, and the engine must escalate to FAULT. PASS/FAIL (exit status), leaves the machine idle. |
|
||||
| `flow_sampler.py` | Board-side coolant sampler used by the flow tools (`flow_sampler.py <duration_s> <interval_s>`, prints `elapsed,raw_down,raw_up`); run on the board (dev image: `/usr/share/forgetest/bench/`) so cadence does not depend on ssh latency. |
|
||||
| `temp_calibrate.py` | Coolant temperature spot-check helper (board or host): `watch [seconds]` / `point <measured_C> [note]` / `fit` — pairs a measured temperature with averaged raw ADC readings and fits a per-machine line to sanity-check the factory curve against a thermometer. Points accumulate in `temp_calibration.json` in the bench data directory. |
|
||||
| `temp_calibrate.py` | Coolant temperature spot-check helper (board or host): `watch [seconds]` / `point <measured_C> [note]` / `fit` - pairs a measured temperature with averaged raw ADC readings and fits a per-machine line to sanity-check the factory curve against a thermometer. Points accumulate in `temp_calibration.json` in the bench data directory. |
|
||||
| `build-glowforge.sh` | Cross-compiles **grblHAL-glowforge** (the canonical driver repo) in the Yocto build environment, borrowing the recipe toolchain. Run: `bash <path>/build-glowforge.sh` (from Windows, launch it through the WSL distro from PowerShell; Git Bash mangles /mnt/c paths). Env: `FF_SRC_TOP`, `FF_BUILD_TOP`. This is the production controller build. |
|
||||
| `build-forgectrl.sh` | Cross-compiles **forgectrl** (the canonical control-daemon repo) the same way, borrowing the toolchain from the forgectrl recipe workdir (regenerate with `bitbake forgectrl` after a clean). |
|
||||
| `accel_fast.py` | Direct-I2C sampler for the two head-bus LIS2HH12s (runs on the board; unbinds/rebinds st-accel around the capture, 800 Hz ODR, ~270 Hz per device polled): optional mid-capture jogs via local grblHAL TCP. CSV to /tmp/accel.csv. The head accel is i2c-3 0x1e. |
|
||||
| `bump_seek.py` | Accelerometer bump-seek homing prototype (runs on the board): creeps toward a rail in bounded jog segments via grblHAL TCP, learns the moving-noise baseline per segment, detects the contact jolt (~530 Hz sampling, 2-sample confirm), jog-cancels (0x85) and backs off. CSV to /tmp/bump.csv. |
|
||||
| `accel_crash_probe.py` | Head-accel crash-detector de-risk drill (runs on the board; BRINGUP item 6): arms the head LIS2HH12's on-chip interrupt generator (IG_CFG1/IG_THS/IG_DUR1) and polls the latched IG_SRC1 for a strike, reporting the axes and raw magnitude. `coexist` (default) reaches the IG registers with I2C_SLAVE_FORCE while st_accel stays bound, so it proves whether the detector can be forgectrl-only with the liveness path untouched; `unbind` frees the device (stop the controller and forgectrl first). Touches only the IG registers, no full-scale change, no emission, no commanded motion by default (provoke a trip by hand or with one `--jog`). CSV to /tmp/accel_crash.csv. |
|
||||
| `accel_crash_probe.py` | Head-accel crash-detector de-risk drill (runs on the board; the head crash detector): arms the head LIS2HH12's on-chip interrupt generator (IG_CFG1/IG_THS/IG_DUR1) and polls the latched IG_SRC1 for a strike, reporting the axes and raw magnitude. `coexist` (default) reaches the IG registers with I2C_SLAVE_FORCE while st_accel stays bound, so it proves whether the detector can be forgectrl-only with the liveness path untouched; `unbind` frees the device (stop the controller and forgectrl first). Touches only the IG registers, no full-scale change, no emission, no commanded motion by default (provoke a trip by hand or with one `--jog`). CSV to /tmp/accel_crash.csv. |
|
||||
| `build-feeder.sh` | Cross-compiles `feeder.c` the same way. |
|
||||
| `puls_profile.py` | Decodes factory `.puls` streams (raw or GF1-headered) into velocity/accel profiles: peak speeds, ramp-slope fits, per-move segments, Z cadence. Runs anywhere (stdlib only). Source of the factory-true grblHAL defaults: 700/590 mm/s² accel, 200 mm/s max rate, 28160 Hz travel tick. |
|
||||
| `cp_watchdog_timing.py` | HV charge-pump watchdog one-shot timing (runs on the board): latches every CHG_PUMP feed pulse in GPIO3's edge detector (pin 24 only, IMR untouched, ICR2 restored on exit) and polls the `!Q` (`charge_pump_alive`) and `!HV_ENABLE` (`hv_enable`) pads through /dev/mem in a tight loop while it commands short local jogs; prints per-run t_w (last pulse → Q fall), Q → HV_ENABLE delay, priming latency and the feed period, with the loop's worst gap as the resolution. Motion only, laser locked, no other Grbl client attached. |
|
||||
@@ -80,7 +80,7 @@ forgectrl's cooling engine refuses to let the laser fire unless a
|
||||
heater-based flow check passes: with the pump commanded on, the loop heater
|
||||
runs at `COOL_FLOW_HEATER_PCT` (40 %) for `COOL_FLOW_CHECK_S` (50 s) and the
|
||||
downstream sensor's rise over its settled baseline must stay below
|
||||
`COOL_FLOW_RISE_C` (14.4 °C) — a stopped pump lets the heater's output pool
|
||||
`COOL_FLOW_RISE_C` (14.4 °C) - a stopped pump lets the heater's output pool
|
||||
at the downstream sensor instead of being carried away. The three constants
|
||||
live in `forgectrl/src/cool.h` and are the compiled defaults behind the
|
||||
`cool_flow_*` settings.
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
*
|
||||
* Streams NOP (0x00) pulse bytes to /dev/glowforge, pacing by wall clock to
|
||||
* hold a bounded queue depth (like a real grblHAL backend would),
|
||||
* with the deadman flock held. Motors must be locked and the laser latch
|
||||
* locked by the caller (bench_phase6.sh does this).
|
||||
* with the deadman flock held. The caller locks the motors and the laser
|
||||
* latch first: write 1 to /sys/glowforge/cnc/motor_lock and 1 to
|
||||
* /sys/glowforge/cnc/laser_latch, and read both back before starting.
|
||||
*
|
||||
* Reports: feed statistics, worst scheduling stall, ENOMEM count, and the
|
||||
* final driver state (expect "running" throughout, "underrun" only after
|
||||
|
||||
@@ -62,9 +62,7 @@ def temps():
|
||||
adc_f = 1024.0 * 1.3
|
||||
rinf = 10000.0 * math.exp(-3380.0 / 298.15)
|
||||
|
||||
def degc(raw):
|
||||
r = 10000.0 / (adc_f / float(raw) - 1.0)
|
||||
return 3380.0 / math.log(r / rinf) - 273.15
|
||||
from gfbench import degc
|
||||
with open('/sys/glowforge/pic/water_temp_1') as f:
|
||||
d = degc(f.read())
|
||||
with open('/sys/glowforge/pic/water_temp_2') as f:
|
||||
|
||||
@@ -1,205 +0,0 @@
|
||||
=== flow matrix started 2026-08-02 20:20:59
|
||||
duties=[10, 15, 20, 30, 40, 50] repeats=5 run=75s durations=[15, 20, 25, 30, 40, 50, 60, 75]
|
||||
controller stopped for the experiment
|
||||
initial settle (180 s with fans)...
|
||||
baseline: down=22.62 up=22.46 (target for every run: <= 22.96)
|
||||
[ 1/60] rep1 duty 10% FLOW start=22.77 down_rise@30s=3.93
|
||||
elapsed 0.1 h
|
||||
[ 2/60] rep1 duty 10% NO-FLOW start=22.38 down_rise@30s=3.10
|
||||
elapsed 0.1 h
|
||||
[ 3/60] rep1 duty 15% FLOW start=22.85 down_rise@30s=4.73
|
||||
elapsed 0.1 h
|
||||
[ 4/60] rep1 duty 15% NO-FLOW start=22.38 down_rise@30s=3.45
|
||||
elapsed 0.2 h
|
||||
[ 5/60] rep1 duty 20% FLOW start=22.77 down_rise@30s=3.64
|
||||
elapsed 0.2 h
|
||||
[ 6/60] rep1 duty 20% NO-FLOW start=22.46 down_rise@30s=6.82
|
||||
elapsed 0.2 h
|
||||
[ 7/60] rep1 duty 30% FLOW start=22.23 down_rise@30s=8.41
|
||||
elapsed 0.2 h
|
||||
[ 8/60] rep1 duty 30% NO-FLOW start=22.30 down_rise@30s=11.03
|
||||
elapsed 0.3 h
|
||||
[ 9/60] rep1 duty 40% FLOW start=22.93 down_rise@30s=11.46
|
||||
elapsed 0.3 h
|
||||
[10/60] rep1 duty 40% NO-FLOW start=22.46 down_rise@30s=15.27
|
||||
elapsed 0.3 h
|
||||
[11/60] rep1 duty 50% FLOW start=22.23 down_rise@30s=14.75
|
||||
elapsed 0.3 h
|
||||
[12/60] rep1 duty 50% NO-FLOW start=22.54 down_rise@30s=18.74
|
||||
elapsed 0.4 h
|
||||
[13/60] rep2 duty 10% FLOW start=21.84 down_rise@30s=3.14
|
||||
elapsed 0.4 h
|
||||
[14/60] rep2 duty 10% NO-FLOW start=22.30 down_rise@30s=2.29
|
||||
elapsed 0.4 h
|
||||
[15/60] rep2 duty 15% FLOW start=22.15 down_rise@30s=3.46
|
||||
elapsed 0.5 h
|
||||
[16/60] rep2 duty 15% NO-FLOW start=22.77 down_rise@30s=4.08
|
||||
elapsed 0.5 h
|
||||
[17/60] rep2 duty 20% FLOW start=22.15 down_rise@30s=4.69
|
||||
elapsed 0.5 h
|
||||
[18/60] rep2 duty 20% NO-FLOW start=22.77 down_rise@30s=5.51
|
||||
elapsed 0.5 h
|
||||
[19/60] rep2 duty 30% FLOW start=21.99 down_rise@30s=7.17
|
||||
elapsed 0.6 h
|
||||
[20/60] rep2 duty 30% NO-FLOW start=22.93 down_rise@30s=7.10
|
||||
elapsed 0.6 h
|
||||
[21/60] rep2 duty 40% FLOW start=22.62 down_rise@30s=8.82
|
||||
elapsed 0.6 h
|
||||
[22/60] rep2 duty 40% NO-FLOW start=22.62 down_rise@30s=13.46
|
||||
elapsed 0.6 h
|
||||
[23/60] rep2 duty 50% FLOW start=22.30 down_rise@30s=12.66
|
||||
elapsed 0.7 h
|
||||
[24/60] rep2 duty 50% NO-FLOW start=22.54 down_rise@30s=18.18
|
||||
elapsed 0.7 h
|
||||
[25/60] rep3 duty 10% FLOW start=22.07 down_rise@30s=2.43
|
||||
elapsed 0.7 h
|
||||
[26/60] rep3 duty 10% NO-FLOW start=22.07 down_rise@30s=3.40
|
||||
elapsed 0.7 h
|
||||
[27/60] rep3 duty 15% FLOW start=22.62 down_rise@30s=4.40
|
||||
elapsed 0.8 h
|
||||
[28/60] rep3 duty 15% NO-FLOW start=21.76 down_rise@30s=4.62
|
||||
elapsed 0.8 h
|
||||
[29/60] rep3 duty 20% FLOW start=22.85 down_rise@30s=4.35
|
||||
elapsed 0.8 h
|
||||
[30/60] rep3 duty 20% NO-FLOW start=21.68 down_rise@30s=4.79
|
||||
elapsed 0.8 h
|
||||
[31/60] rep3 duty 30% FLOW start=22.30 down_rise@30s=9.11
|
||||
elapsed 0.9 h
|
||||
[32/60] rep3 duty 30% NO-FLOW start=22.15 down_rise@30s=7.28
|
||||
elapsed 0.9 h
|
||||
[33/60] rep3 duty 40% FLOW start=21.91 down_rise@30s=10.00
|
||||
elapsed 0.9 h
|
||||
[34/60] rep3 duty 40% NO-FLOW start=22.85 down_rise@30s=14.55
|
||||
elapsed 0.9 h
|
||||
[35/60] rep3 duty 50% FLOW start=22.62 down_rise@30s=12.71
|
||||
elapsed 1.0 h
|
||||
[36/60] rep3 duty 50% NO-FLOW start=22.62 down_rise@30s=18.19
|
||||
elapsed 1.0 h
|
||||
[37/60] rep4 duty 10% FLOW start=22.54 down_rise@30s=2.75
|
||||
elapsed 1.0 h
|
||||
[38/60] rep4 duty 10% NO-FLOW start=20.75 down_rise@30s=2.92
|
||||
elapsed 1.1 h
|
||||
[39/60] rep4 duty 15% FLOW start=22.15 down_rise@30s=4.17
|
||||
elapsed 1.1 h
|
||||
[40/60] rep4 duty 15% NO-FLOW start=22.62 down_rise@30s=4.71
|
||||
elapsed 1.1 h
|
||||
[41/60] rep4 duty 20% FLOW start=21.37 down_rise@30s=5.48
|
||||
elapsed 1.1 h
|
||||
[42/60] rep4 duty 20% NO-FLOW start=22.23 down_rise@30s=4.77
|
||||
elapsed 1.2 h
|
||||
[43/60] rep4 duty 30% FLOW start=22.46 down_rise@30s=6.41
|
||||
elapsed 1.2 h
|
||||
[44/60] rep4 duty 30% NO-FLOW start=22.62 down_rise@30s=6.84
|
||||
elapsed 1.2 h
|
||||
[45/60] rep4 duty 40% FLOW start=22.54 down_rise@30s=10.50
|
||||
elapsed 1.2 h
|
||||
[46/60] rep4 duty 40% NO-FLOW start=22.69 down_rise@30s=14.56
|
||||
elapsed 1.3 h
|
||||
[47/60] rep4 duty 50% FLOW start=22.38 down_rise@30s=13.75
|
||||
elapsed 1.3 h
|
||||
[48/60] rep4 duty 50% NO-FLOW start=22.23 down_rise@30s=18.61
|
||||
elapsed 1.3 h
|
||||
[49/60] rep5 duty 10% FLOW start=22.38 down_rise@30s=2.67
|
||||
elapsed 1.3 h
|
||||
[50/60] rep5 duty 10% NO-FLOW start=22.07 down_rise@30s=4.10
|
||||
elapsed 1.4 h
|
||||
[51/60] rep5 duty 15% FLOW start=21.45 down_rise@30s=3.94
|
||||
elapsed 1.4 h
|
||||
[52/60] rep5 duty 15% NO-FLOW start=22.15 down_rise@30s=3.19
|
||||
elapsed 1.4 h
|
||||
[53/60] rep5 duty 20% FLOW start=21.91 down_rise@30s=4.26
|
||||
elapsed 1.4 h
|
||||
[54/60] rep5 duty 20% NO-FLOW start=22.46 down_rise@30s=5.25
|
||||
elapsed 1.5 h
|
||||
[55/60] rep5 duty 30% FLOW start=22.23 down_rise@30s=7.34
|
||||
elapsed 1.5 h
|
||||
[56/60] rep5 duty 30% NO-FLOW start=22.77 down_rise@30s=11.06
|
||||
elapsed 1.5 h
|
||||
[57/60] rep5 duty 40% FLOW start=22.93 down_rise@30s=9.65
|
||||
elapsed 1.5 h
|
||||
[58/60] rep5 duty 40% NO-FLOW start=22.38 down_rise@30s=13.48
|
||||
elapsed 1.6 h
|
||||
[59/60] rep5 duty 50% FLOW start=22.38 down_rise@30s=12.59
|
||||
elapsed 1.6 h
|
||||
[60/60] rep5 duty 50% NO-FLOW start=21.68 down_rise@30s=20.05
|
||||
elapsed 1.6 h
|
||||
|
||||
=== COST: bulk (upstream) rise during a check, flow case, degrees C
|
||||
duty 15s 20s 25s 30s 40s 50s 60s 75s
|
||||
10% 0.34 0.62 0.67 0.33 0.30 0.58 0.09 0.34
|
||||
15% 0.03 0.76 0.50 0.67 0.53 0.69 0.39 0.64
|
||||
20% -0.08 -0.17 0.23 0.09 0.19 0.23 0.02 0.50
|
||||
30% 0.79 0.73 1.39 0.83 1.11 1.17 1.42 1.22
|
||||
40% 0.55 0.36 1.05 1.06 0.95 0.76 1.25 1.53
|
||||
50% 1.26 1.83 1.72 1.59 2.03 2.03 2.19 2.69
|
||||
|
||||
=== PRECISION: downstream-rise discrimination (flow vs no-flow)
|
||||
duty dur flow mean+-sd noflow mean+-sd sep worst d-prime
|
||||
10% 15s 2.68+-0.45 2.03+-0.71 -0.65 -2.20 -1.1
|
||||
10% 20s 2.90+-0.69 2.81+-0.37 -0.09 -1.65 -0.2
|
||||
10% 25s 2.76+-0.69 3.10+-0.60 0.33 -1.80 0.5
|
||||
10% 30s 2.98+-0.59 3.16+-0.66 0.18 -1.64 0.3
|
||||
10% 40s 2.90+-0.86 3.30+-0.42 0.40 -1.08 0.6
|
||||
10% 50s 3.05+-0.85 3.88+-0.44 0.83 -1.09 1.2
|
||||
10% 60s 2.37+-0.54 3.61+-0.54 1.24 -0.21 2.3
|
||||
10% 75s 2.60+-0.83 4.12+-0.54 1.52 -0.36 2.2
|
||||
15% 15s 2.93+-0.63 2.93+-0.36 -0.01 -1.21 -0.0
|
||||
15% 20s 3.97+-0.33 3.54+-0.35 -0.42 -1.31 -1.2
|
||||
15% 25s 3.89+-0.86 3.95+-0.45 0.06 -1.46 0.1
|
||||
15% 30s 4.14+-0.48 4.01+-0.68 -0.13 -1.55 -0.2
|
||||
15% 40s 4.11+-0.79 4.43+-0.65 0.32 -1.54 0.4
|
||||
15% 50s 4.17+-0.78 5.01+-0.34 0.83 -0.24 1.4
|
||||
15% 60s 4.17+-0.52 5.09+-0.48 0.92 -0.21 1.8
|
||||
15% 75s 4.21+-0.41 5.75+-0.45 1.54 +0.37 3.6
|
||||
20% 15s 3.84+-0.78 3.57+-0.83 -0.27 -2.08 -0.3
|
||||
20% 20s 4.18+-0.53 4.14+-0.83 -0.03 -1.36 -0.0
|
||||
20% 25s 4.71+-0.92 4.90+-1.03 0.19 -1.91 0.2
|
||||
20% 30s 4.48+-0.67 5.43+-0.84 0.95 -0.71 1.2
|
||||
20% 40s 4.84+-0.58 5.79+-1.16 0.96 -0.61 1.0
|
||||
20% 50s 4.98+-0.39 6.41+-0.79 1.43 +0.22 2.3
|
||||
20% 60s 4.53+-0.66 6.67+-1.39 2.14 -0.44 2.0
|
||||
20% 75s 4.95+-0.65 7.34+-1.02 2.39 +0.64 2.8
|
||||
30% 15s 6.32+-0.81 5.63+-1.72 -0.69 -3.43 -0.5
|
||||
30% 20s 7.13+-1.31 6.86+-2.24 -0.27 -3.67 -0.1
|
||||
30% 25s 7.65+-0.92 7.73+-1.93 0.08 -2.63 0.1
|
||||
30% 30s 7.69+-1.07 8.66+-2.18 0.97 -2.27 0.6
|
||||
30% 40s 7.69+-0.90 9.96+-2.65 2.27 -1.00 1.1
|
||||
30% 50s 8.15+-0.75 10.24+-2.37 2.09 -0.93 1.2
|
||||
30% 60s 8.20+-0.70 10.77+-2.34 2.57 -0.35 1.5
|
||||
30% 75s 8.27+-1.28 10.86+-2.26 2.59 -0.82 1.4
|
||||
40% 15s 8.06+-0.87 10.14+-0.65 2.08 +0.37 2.7
|
||||
40% 20s 8.93+-1.07 12.07+-0.48 3.13 +1.06 3.8
|
||||
40% 25s 9.61+-1.22 13.47+-0.98 3.86 +0.96 3.5
|
||||
40% 30s 10.09+-0.98 14.26+-0.78 4.18 +2.00 4.7
|
||||
40% 40s 10.29+-1.41 16.01+-0.88 5.72 +2.77 4.9
|
||||
40% 50s 10.14+-0.87 16.95+-0.74 6.81 +4.58 8.4
|
||||
40% 60s 10.71+-1.22 17.27+-0.96 6.56 +3.72 6.0
|
||||
40% 75s 10.46+-1.22 17.88+-0.77 7.42 +5.38 7.2
|
||||
50% 15s 10.73+-0.65 13.02+-0.71 2.29 +0.22 3.3
|
||||
50% 20s 12.71+-0.89 15.58+-0.85 2.87 +0.55 3.3
|
||||
50% 25s 12.71+-0.96 17.10+-0.78 4.39 +1.66 5.0
|
||||
50% 30s 13.29+-0.95 18.75+-0.76 5.46 +3.43 6.4
|
||||
50% 40s 14.04+-0.80 20.38+-1.16 6.34 +3.48 6.3
|
||||
50% 50s 14.38+-0.57 21.61+-0.93 7.23 +5.08 9.4
|
||||
50% 60s 14.24+-0.48 22.14+-1.02 7.90 +5.94 9.9
|
||||
50% 75s 14.18+-0.78 23.17+-1.10 8.99 +6.51 9.4
|
||||
|
||||
=== RANKED by d-prime (separation in pooled standard deviations)
|
||||
rank duty dur d-prime worst-margin bulk-cost threshold
|
||||
1 50% 60s 9.9 +5.94 2.19 18.19
|
||||
2 50% 75s 9.4 +6.51 2.69 18.68
|
||||
3 50% 50s 9.4 +5.08 2.03 18.00
|
||||
4 40% 50s 8.4 +4.58 0.76 13.54
|
||||
5 40% 75s 7.2 +5.38 1.53 14.17
|
||||
6 50% 30s 6.4 +3.43 1.59 16.02
|
||||
7 50% 40s 6.3 +3.48 2.03 17.21
|
||||
8 40% 60s 6.0 +3.72 1.25 13.99
|
||||
9 50% 25s 5.0 +1.66 1.72 14.91
|
||||
10 40% 40s 4.9 +2.77 0.95 13.15
|
||||
11 40% 30s 4.7 +2.00 1.06 12.18
|
||||
12 40% 20s 3.8 +1.06 0.36 10.50
|
||||
|
||||
(worst-margin = min(no-flow) - max(flow); positive means every
|
||||
observed no-flow run exceeded every observed flow run.
|
||||
bulk-cost = degrees C added to the loop per check.)
|
||||
controller restarted; total elapsed 1.63 h
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,96 +0,0 @@
|
||||
=== warm-baseline validation 2026-08-02 22:43:41 duty=40% window=50s threshold=13.7
|
||||
cycle 1/3 FLOW
|
||||
warmed to down=21.84 up=21.91 in 1.3 min
|
||||
base_up=22.07 down_rise=12.18 -> ok CORRECT (peak down 34.4 C)
|
||||
cycle 1/3 NO-FLOW
|
||||
warmed to down=22.46 up=21.84 in 1.0 min
|
||||
base_up=21.84 down_rise=18.16 -> FAULT CORRECT (peak down 40.4 C)
|
||||
cycle 2/3 FLOW
|
||||
warmed to down=21.84 up=22.07 in 1.0 min
|
||||
base_up=21.29 down_rise=12.75 -> ok CORRECT (peak down 34.5 C)
|
||||
cycle 2/3 NO-FLOW
|
||||
warmed to down=22.07 up=21.91 in 1.0 min
|
||||
base_up=21.45 down_rise=18.15 -> FAULT CORRECT (peak down 40.5 C)
|
||||
cycle 3/3 FLOW
|
||||
warmed to down=22.07 up=21.91 in 1.0 min
|
||||
base_up=21.60 down_rise=10.95 -> ok CORRECT (peak down 34.3 C)
|
||||
cycle 3/3 NO-FLOW
|
||||
warmed to down=22.30 up=22.30 in 1.0 min
|
||||
base_up=21.76 down_rise=17.85 -> FAULT CORRECT (peak down 40.4 C)
|
||||
|
||||
=== warm-baseline results (baselines 21.3 - 22.1 C)
|
||||
flow n=3 mean 11.96 sd 0.92 max 12.75
|
||||
no-flow n=3 mean 18.06 sd 0.17 min 17.85
|
||||
worst-case margin: +5.11 C threshold 13.7 sits +0.95 above flow max, +4.15 below no-flow min
|
||||
misclassified: 0 of 6
|
||||
controller restarted
|
||||
=== warm-baseline validation 2026-08-02 22:56:44 duty=40% window=50s threshold=13.7
|
||||
cycle 1/3 FLOW
|
||||
warmed to down=22.30 up=22.07 in 1.3 min
|
||||
base_up=22.23 down_rise=12.62 -> ok CORRECT (peak down 34.0 C)
|
||||
cycle 1/3 NO-FLOW
|
||||
warmed to down=22.23 up=21.84 in 1.0 min
|
||||
base_up=21.76 down_rise=18.71 -> FAULT CORRECT (peak down 40.6 C)
|
||||
cycle 2/3 FLOW
|
||||
warmed to down=22.30 up=22.07 in 1.0 min
|
||||
base_up=21.76 down_rise=11.03 -> ok CORRECT (peak down 34.3 C)
|
||||
cycle 2/3 NO-FLOW
|
||||
warmed to down=22.15 up=21.84 in 1.0 min
|
||||
base_up=21.37 down_rise=18.26 -> FAULT CORRECT (peak down 40.1 C)
|
||||
cycle 3/3 FLOW
|
||||
warmed to down=22.54 up=22.15 in 1.0 min
|
||||
base_up=21.99 down_rise=11.08 -> ok CORRECT (peak down 34.3 C)
|
||||
cycle 3/3 NO-FLOW
|
||||
warmed to down=22.07 up=21.84 in 1.0 min
|
||||
base_up=21.91 down_rise=18.42 -> FAULT CORRECT (peak down 40.5 C)
|
||||
|
||||
=== warm-baseline results (baselines 21.4 - 22.2 C)
|
||||
flow n=3 mean 11.58 sd 0.91 max 12.62
|
||||
no-flow n=3 mean 18.46 sd 0.23 min 18.26
|
||||
worst-case margin: +5.63 C threshold 13.7 sits +1.08 above flow max, +4.56 below no-flow min
|
||||
misclassified: 0 of 6
|
||||
controller restarted
|
||||
=== warm-baseline validation 2026-08-02 23:10:04 duty=40% window=50s threshold=13.7
|
||||
cycle 1/2 FLOW
|
||||
warm abort: downstream 51.95 at 0.5 min
|
||||
warmed to down=22.15 up=21.84 in 1.3 min
|
||||
=== warm-baseline validation 2026-08-02 23:11:51 duty=40% window=50s threshold=13.7
|
||||
cycle 1/2 FLOW
|
||||
base_up=22.23 down_rise=15.53 -> FAULT *** WRONG *** (peak down 37.7 C)
|
||||
cycle 1/2 NO-FLOW
|
||||
warm abort: downstream 49.34 at 0.3 min
|
||||
warm target reached: up=25.84 at 0.8 min
|
||||
warmed to down=21.84 up=21.60 in 1.0 min
|
||||
warmed to down=22.15 up=22.07 in 1.6 min
|
||||
base_up=21.37 down_rise=10.69 -> ok *** WRONG *** (peak down 34.1 C)
|
||||
cycle 2/2 FLOW
|
||||
base_up=20.91 down_rise=11.48 -> ok CORRECT (peak down 34.4 C)
|
||||
cycle 1/2 NO-FLOW
|
||||
warming: 0.8 min down=37.53 up=23.71
|
||||
warming: 0.8 min down=38.17 up=24.65
|
||||
warming: 1.8 min down=37.80 up=23.94
|
||||
warming: 1.8 min down=37.99 up=24.50
|
||||
(warming plateaued at 24.18 C after 2.6 min)
|
||||
warming: 2.9 min down=26.56 up=23.47
|
||||
(warming plateaued at 23.47 C after 2.9 min)
|
||||
warmed to down=21.68 up=21.60 in 3.4 min
|
||||
warmed to down=28.57 up=21.84 in 3.6 min
|
||||
base_up=21.37 down_rise=12.18 -> ok *** WRONG *** (peak down 34.1 C)
|
||||
cycle 2/2 FLOW
|
||||
base_up=21.91 down_rise=3.76 -> ok CORRECT (peak down 35.8 C)
|
||||
cycle 2/2 NO-FLOW
|
||||
warm abort: downstream 48.90 at 0.3 min
|
||||
warm target reached: up=25.68 at 0.5 min
|
||||
warmed to down=22.23 up=21.84 in 1.0 min
|
||||
warmed to down=21.29 up=21.68 in 1.3 min
|
||||
base_up=21.45 down_rise=11.58 -> ok *** WRONG *** (peak down 34.4 C)
|
||||
base_up=21.06 down_rise=11.30 -> ok CORRECT (peak down 34.2 C)
|
||||
cycle 2/2 NO-FLOW
|
||||
|
||||
=== warm-baseline results (baselines 21.4 - 22.2 C)
|
||||
flow n=2 mean 9.65 sd 8.32 max 15.53
|
||||
no-flow n=2 mean 11.13 sd 0.63 min 10.69
|
||||
worst-case margin: -4.84 C threshold 13.7 sits -1.83 above flow max, -3.01 below no-flow min
|
||||
misclassified: 3 of 4
|
||||
controller restarted
|
||||
warming: 0.8 min down=37.71 up=24.50
|
||||
@@ -1,32 +0,0 @@
|
||||
[
|
||||
{
|
||||
"flow": true,
|
||||
"base_up": 20.90741361785507,
|
||||
"base_down": 21.837331209719537,
|
||||
"down_rise": 11.480714695811116,
|
||||
"up_rise": 2.254025184475836,
|
||||
"peak_down": 34.43702357179029,
|
||||
"t": 49.15,
|
||||
"cycle": 0
|
||||
},
|
||||
{
|
||||
"flow": false,
|
||||
"base_up": 21.371932016053336,
|
||||
"base_down": 21.914988917022924,
|
||||
"down_rise": 12.176080123337613,
|
||||
"up_rise": 1.5552007482007184,
|
||||
"peak_down": 34.09106904036054,
|
||||
"t": 49.17,
|
||||
"cycle": 0
|
||||
},
|
||||
{
|
||||
"flow": true,
|
||||
"base_up": 21.06216007856807,
|
||||
"base_down": 21.75970016295645,
|
||||
"down_rise": 11.302272149723365,
|
||||
"up_rise": 2.6471638813487743,
|
||||
"peak_down": 34.1774170676689,
|
||||
"t": 49.16,
|
||||
"cycle": 1
|
||||
}
|
||||
]
|
||||
@@ -1,601 +0,0 @@
|
||||
t_s,lid_ir_1,lid_ir_2,lid_ir_3,lid_ir_4,hv_current,water_1,water_2,pwr_temp,laser_on_sampled
|
||||
4665.89,37,37,40,40,0,672,669,586,0
|
||||
4666.45,37,36,40,40,0,674,674,586,0
|
||||
4667.01,37,36,40,40,0,668,673,586,0
|
||||
4667.57,37,36,39,40,0,667,669,593,0
|
||||
4668.14,36,36,39,40,0,667,674,592,0
|
||||
4668.70,38,36,39,40,0,668,674,593,0
|
||||
4669.27,37,35,38,41,0,665,669,591,0
|
||||
4669.83,39,37,39,39,0,667,666,592,0
|
||||
4670.40,38,36,40,40,0,674,667,589,0
|
||||
4670.96,37,36,38,41,0,668,667,593,0
|
||||
4671.52,37,37,41,40,0,671,674,590,0
|
||||
4672.09,38,36,41,40,0,671,666,589,0
|
||||
4672.65,37,36,40,40,0,669,666,590,0
|
||||
4673.22,37,36,38,41,0,669,676,593,0
|
||||
4673.78,38,37,40,41,0,675,674,590,0
|
||||
4674.35,36,38,40,40,0,669,667,590,0
|
||||
4674.91,37,36,39,40,0,663,667,590,0
|
||||
4675.48,38,38,39,40,0,667,666,592,0
|
||||
4676.05,38,36,40,40,0,666,670,587,0
|
||||
4676.62,38,36,38,39,0,672,667,586,0
|
||||
4677.18,38,36,38,40,0,670,667,589,0
|
||||
4677.75,37,36,39,40,0,666,664,592,0
|
||||
4678.31,36,37,40,39,0,665,672,593,0
|
||||
4678.88,37,36,40,40,0,667,669,593,0
|
||||
4679.44,37,36,40,40,0,674,678,591,0
|
||||
4680.01,37,36,40,39,0,667,665,587,0
|
||||
4680.57,37,36,39,38,0,676,677,587,0
|
||||
4681.14,37,35,40,40,0,675,670,587,0
|
||||
4681.70,38,37,39,41,0,672,671,593,0
|
||||
4682.27,36,36,39,40,0,675,671,592,0
|
||||
4682.84,38,37,38,41,0,675,667,592,0
|
||||
4683.40,37,36,38,40,0,667,666,593,0
|
||||
4683.97,36,36,40,40,0,668,666,591,0
|
||||
4684.53,37,36,39,40,0,669,669,594,0
|
||||
4685.10,38,36,40,40,0,674,667,592,0
|
||||
4685.66,37,36,39,39,0,673,669,586,0
|
||||
4686.23,37,37,40,40,0,668,667,586,0
|
||||
4686.79,36,36,39,39,0,668,666,593,0
|
||||
4687.36,37,37,39,40,0,673,666,586,0
|
||||
4687.92,37,36,40,41,0,666,669,593,0
|
||||
4688.49,37,37,39,40,0,674,666,587,0
|
||||
4689.06,36,36,39,41,0,666,674,586,0
|
||||
4689.63,37,37,40,40,0,673,675,588,0
|
||||
4690.19,37,36,40,40,0,662,674,593,0
|
||||
4690.76,38,35,39,40,0,673,673,586,0
|
||||
4691.32,37,37,40,41,0,671,671,593,0
|
||||
4691.89,38,36,40,40,0,673,665,592,0
|
||||
4692.45,37,36,40,40,0,674,672,591,0
|
||||
4693.02,37,36,40,40,0,675,677,587,0
|
||||
4693.58,38,37,40,40,0,677,668,592,0
|
||||
4694.15,37,36,40,39,0,667,675,587,0
|
||||
4694.71,37,36,40,39,0,676,675,593,0
|
||||
4695.27,37,37,40,40,0,666,671,588,0
|
||||
4695.84,38,36,40,40,0,674,673,587,0
|
||||
4696.40,37,36,40,40,0,670,672,590,0
|
||||
4696.97,37,36,38,40,0,669,674,588,0
|
||||
4697.53,37,37,39,40,0,676,674,589,0
|
||||
4698.10,38,36,40,39,0,677,669,591,0
|
||||
4698.67,37,38,39,38,0,673,676,593,0
|
||||
4699.23,38,36,39,40,0,670,675,587,0
|
||||
4699.80,38,36,40,40,0,675,671,588,0
|
||||
4700.37,38,36,40,40,0,673,668,583,0
|
||||
4700.93,37,37,39,39,0,671,670,591,0
|
||||
4701.50,37,35,41,39,0,675,674,587,0
|
||||
4702.06,37,37,39,40,0,668,675,588,0
|
||||
4702.63,37,36,39,40,0,669,666,591,0
|
||||
4703.19,37,37,39,41,0,667,666,588,0
|
||||
4703.75,36,36,39,40,0,672,667,588,0
|
||||
4704.32,37,36,40,38,0,671,673,587,0
|
||||
4704.88,37,36,39,40,0,676,673,586,0
|
||||
4705.44,38,36,38,40,0,676,667,586,0
|
||||
4706.01,37,36,40,40,0,670,669,587,0
|
||||
4706.58,36,36,40,39,0,677,673,586,0
|
||||
4707.15,37,37,40,41,0,674,670,589,0
|
||||
4707.72,37,36,40,41,0,672,668,593,0
|
||||
4708.28,38,37,39,40,0,669,665,591,0
|
||||
4708.85,37,35,40,41,0,667,672,586,0
|
||||
4709.41,37,36,40,41,0,671,674,586,0
|
||||
4709.98,37,37,40,40,0,675,667,587,0
|
||||
4710.54,37,37,39,41,0,666,667,590,0
|
||||
4711.11,38,37,40,40,0,667,666,591,0
|
||||
4711.67,37,36,38,40,0,670,668,586,0
|
||||
4712.23,37,36,38,41,0,667,667,593,0
|
||||
4712.80,38,36,39,41,0,666,673,592,0
|
||||
4713.36,37,37,39,40,0,675,669,592,0
|
||||
4713.93,37,36,40,39,0,671,672,589,0
|
||||
4714.49,38,37,41,40,0,672,666,587,0
|
||||
4715.05,37,36,38,39,0,666,672,586,0
|
||||
4715.62,37,36,40,39,0,667,671,592,0
|
||||
4716.18,39,36,40,40,0,665,665,590,0
|
||||
4716.75,38,37,40,41,0,673,665,589,0
|
||||
4717.31,36,36,39,40,0,678,673,593,0
|
||||
4717.87,37,36,39,39,0,674,665,589,0
|
||||
4718.44,38,37,40,42,0,668,669,593,0
|
||||
4719.00,38,36,40,40,0,671,674,586,0
|
||||
4719.57,37,36,39,40,0,668,667,592,0
|
||||
4720.13,37,36,40,40,0,673,668,590,0
|
||||
4720.69,38,37,40,40,0,674,667,592,0
|
||||
4721.26,37,36,41,40,0,664,672,591,0
|
||||
4721.83,37,37,39,40,0,671,669,588,0
|
||||
4722.40,36,37,40,39,0,665,666,587,0
|
||||
4722.96,38,37,39,40,0,676,675,586,0
|
||||
4723.53,37,37,40,41,0,672,667,591,0
|
||||
4724.10,38,36,39,40,0,669,668,594,0
|
||||
4724.66,37,37,39,41,0,666,671,586,0
|
||||
4725.23,37,37,40,40,0,673,674,586,0
|
||||
4725.79,38,37,39,41,0,676,674,591,0
|
||||
4726.36,37,37,40,41,0,675,670,586,0
|
||||
4726.92,37,36,38,40,0,675,669,592,0
|
||||
4727.49,37,37,39,40,0,673,676,590,0
|
||||
4728.05,38,36,40,39,0,669,669,588,0
|
||||
4728.62,37,36,40,40,0,676,674,586,0
|
||||
4729.19,37,36,40,40,0,666,674,586,0
|
||||
4729.75,37,36,38,41,0,667,674,587,0
|
||||
4730.32,37,36,39,39,0,669,670,590,0
|
||||
4730.89,38,36,39,41,0,668,666,594,0
|
||||
4731.45,38,37,40,40,0,673,672,587,0
|
||||
4732.02,38,36,39,40,0,674,665,587,0
|
||||
4732.58,37,35,39,41,0,676,672,588,0
|
||||
4733.14,38,35,39,40,0,677,669,589,0
|
||||
4733.71,38,36,40,40,0,674,667,592,0
|
||||
4734.27,36,36,39,39,0,673,666,593,0
|
||||
4734.84,37,36,38,39,0,667,669,587,0
|
||||
4735.40,38,37,39,40,0,669,666,593,0
|
||||
4735.96,38,36,40,40,0,668,674,587,0
|
||||
4736.53,37,36,38,40,0,667,675,587,0
|
||||
4737.09,38,37,40,40,0,674,668,586,0
|
||||
4737.66,38,36,39,41,0,667,673,588,0
|
||||
4738.22,37,37,40,40,0,674,672,593,0
|
||||
4738.78,37,36,39,40,0,670,667,587,0
|
||||
4739.35,36,36,39,40,0,668,669,593,0
|
||||
4739.92,37,37,40,40,0,667,671,591,0
|
||||
4740.48,37,37,39,39,0,668,674,590,0
|
||||
4741.05,37,36,39,39,0,668,666,586,0
|
||||
4741.62,37,36,40,40,0,674,675,592,0
|
||||
4742.18,37,36,39,39,0,670,676,586,0
|
||||
4742.75,38,36,39,40,0,669,666,591,0
|
||||
4743.32,37,36,40,40,0,675,674,587,0
|
||||
4743.88,36,37,40,40,0,672,665,587,0
|
||||
4744.45,37,36,39,40,0,674,671,592,0
|
||||
4745.01,37,36,39,40,0,674,669,588,0
|
||||
4745.58,37,36,39,40,0,675,665,587,0
|
||||
4746.15,38,36,40,40,0,673,667,587,0
|
||||
4746.72,37,35,41,40,0,667,665,590,0
|
||||
4747.28,37,37,40,41,0,668,674,594,0
|
||||
4747.85,38,36,39,41,0,668,674,588,0
|
||||
4748.42,38,36,39,41,0,667,668,587,0
|
||||
4748.99,36,37,39,39,0,674,674,586,0
|
||||
4749.56,37,36,39,41,0,674,670,593,0
|
||||
4750.12,37,36,40,40,0,675,672,592,0
|
||||
4750.69,37,37,39,39,0,670,668,589,0
|
||||
4751.25,38,37,39,40,0,672,670,590,0
|
||||
4751.82,37,36,41,39,0,667,666,591,0
|
||||
4752.38,38,37,39,40,0,669,666,587,0
|
||||
4752.95,37,36,39,40,0,669,666,593,0
|
||||
4753.51,38,36,39,40,0,676,669,592,0
|
||||
4754.08,37,37,39,40,0,668,667,587,0
|
||||
4754.65,38,35,38,40,0,667,670,594,0
|
||||
4755.22,37,36,39,39,0,677,673,587,0
|
||||
4755.79,38,36,39,40,0,672,666,587,0
|
||||
4756.35,37,36,39,41,0,670,671,587,0
|
||||
4756.92,38,36,39,41,0,675,669,593,0
|
||||
4757.48,37,36,39,39,0,675,674,588,0
|
||||
4758.05,37,36,39,40,0,672,674,593,0
|
||||
4758.61,37,36,39,40,0,674,665,586,0
|
||||
4759.18,37,37,39,39,0,673,669,588,0
|
||||
4759.75,37,35,39,40,0,674,669,585,0
|
||||
4760.32,37,37,40,39,0,671,673,587,0
|
||||
4760.88,38,37,39,40,0,674,673,592,0
|
||||
4761.45,38,36,39,40,0,673,673,591,0
|
||||
4762.01,37,36,39,41,0,674,673,592,0
|
||||
4762.58,37,36,39,41,0,666,672,589,0
|
||||
4763.14,39,37,39,40,0,665,669,593,0
|
||||
4763.70,37,36,40,40,0,673,675,587,0
|
||||
4764.27,36,36,39,40,0,668,670,585,0
|
||||
4764.83,37,36,39,40,0,668,675,587,0
|
||||
4765.40,37,37,40,40,0,667,664,592,0
|
||||
4765.97,38,37,40,40,0,670,676,593,0
|
||||
4766.54,37,36,39,41,0,665,670,593,0
|
||||
4767.10,37,36,39,40,0,675,665,587,0
|
||||
4767.67,37,37,40,40,0,668,666,591,0
|
||||
4768.23,37,36,40,40,0,668,670,592,0
|
||||
4768.80,37,36,40,39,0,665,671,589,0
|
||||
4769.36,37,36,40,40,0,673,671,586,0
|
||||
4769.93,38,36,39,39,0,676,667,585,0
|
||||
4770.49,38,36,39,40,0,672,668,586,0
|
||||
4771.06,38,37,39,41,0,667,674,593,0
|
||||
4771.62,37,37,38,40,0,668,668,587,0
|
||||
4772.19,37,36,40,40,0,669,667,586,0
|
||||
4772.76,37,36,41,40,0,674,666,588,0
|
||||
4773.33,38,37,39,40,0,666,673,586,0
|
||||
4773.89,37,36,39,40,0,674,671,591,0
|
||||
4774.46,37,36,39,40,0,676,671,587,0
|
||||
4775.03,37,37,40,39,0,669,673,592,0
|
||||
4775.59,37,37,39,39,0,674,669,587,0
|
||||
4776.16,38,36,40,40,0,673,672,591,0
|
||||
4776.72,37,37,40,40,0,674,667,587,0
|
||||
4777.29,37,36,40,40,0,670,676,592,0
|
||||
4777.85,38,37,40,41,0,667,670,592,0
|
||||
4778.42,38,37,39,40,0,669,665,586,0
|
||||
4778.99,38,37,39,40,0,669,670,594,0
|
||||
4779.56,38,37,39,40,0,670,673,593,0
|
||||
4780.12,38,37,38,40,0,667,675,587,0
|
||||
4780.68,37,36,41,40,0,666,668,592,0
|
||||
4781.25,37,37,40,40,0,666,666,591,0
|
||||
4781.82,37,36,40,41,0,665,667,592,0
|
||||
4782.39,38,37,39,41,0,667,673,587,0
|
||||
4782.96,37,36,40,40,0,666,667,591,0
|
||||
4783.52,38,36,40,40,0,674,675,593,0
|
||||
4784.09,38,36,39,41,0,662,673,586,0
|
||||
4784.65,37,36,40,41,0,676,671,587,0
|
||||
4785.22,37,38,40,40,0,669,666,591,0
|
||||
4785.78,37,37,39,40,0,668,668,592,0
|
||||
4786.35,37,36,40,40,0,676,673,590,0
|
||||
4786.91,37,36,40,40,0,669,675,592,0
|
||||
4787.48,37,37,40,40,0,668,667,587,0
|
||||
4788.04,37,37,41,39,0,676,674,586,0
|
||||
4788.60,37,36,39,40,0,669,672,588,0
|
||||
4789.17,38,37,40,40,0,667,674,592,0
|
||||
4789.74,38,37,40,40,0,674,676,592,0
|
||||
4790.30,37,36,39,41,0,662,669,592,0
|
||||
4790.87,38,36,39,40,0,666,666,588,0
|
||||
4791.44,37,37,40,40,0,675,675,590,0
|
||||
4792.01,37,36,40,40,0,668,668,587,0
|
||||
4792.57,37,36,40,40,0,672,667,587,0
|
||||
4793.14,37,36,39,40,0,673,669,593,0
|
||||
4793.70,37,36,41,41,0,666,669,588,0
|
||||
4794.27,37,37,40,40,0,676,673,588,0
|
||||
4794.83,37,36,38,40,0,671,674,588,0
|
||||
4795.40,36,36,40,40,0,671,667,588,0
|
||||
4795.97,37,36,39,39,0,672,670,586,0
|
||||
4796.54,37,36,39,40,0,667,667,587,0
|
||||
4797.10,37,35,40,40,0,675,673,586,0
|
||||
4797.67,37,37,40,40,0,670,669,592,0
|
||||
4798.24,37,36,40,40,0,669,671,588,0
|
||||
4798.81,37,37,40,39,0,675,674,592,0
|
||||
4799.37,37,37,38,40,0,670,669,591,0
|
||||
4799.94,37,36,39,40,0,674,673,593,0
|
||||
4800.51,36,36,40,40,0,674,672,587,0
|
||||
4801.07,37,36,40,40,0,673,673,589,0
|
||||
4801.64,37,36,40,40,0,671,667,587,0
|
||||
4802.20,37,35,39,41,0,670,668,586,0
|
||||
4802.77,37,36,40,39,0,674,667,588,0
|
||||
4803.33,37,37,40,39,0,670,678,589,0
|
||||
4803.91,37,35,40,40,0,671,675,592,0
|
||||
4804.47,38,36,40,41,0,666,675,592,0
|
||||
4805.04,37,36,39,40,0,668,672,593,0
|
||||
4805.60,38,36,40,40,0,676,670,588,0
|
||||
4806.17,38,36,38,39,0,670,677,590,0
|
||||
4806.74,37,37,39,40,0,675,671,587,0
|
||||
4807.30,37,36,40,40,0,672,668,587,0
|
||||
4807.87,38,37,39,40,0,667,668,591,0
|
||||
4808.43,37,36,40,39,0,666,666,586,0
|
||||
4809.00,37,36,41,39,0,673,667,591,0
|
||||
4809.56,36,37,38,40,0,675,668,586,0
|
||||
4810.13,36,36,40,40,0,672,669,592,0
|
||||
4810.70,38,36,40,39,0,673,667,592,0
|
||||
4811.27,38,36,40,41,0,672,673,587,0
|
||||
4811.83,37,36,40,40,0,668,667,586,0
|
||||
4812.40,37,37,39,39,0,666,669,586,0
|
||||
4812.96,37,36,40,41,0,671,667,589,0
|
||||
4813.52,37,37,39,40,0,674,673,587,0
|
||||
4814.09,38,36,39,40,0,668,671,592,0
|
||||
4814.65,37,36,39,38,0,669,669,594,0
|
||||
4815.22,37,36,39,40,0,667,669,587,0
|
||||
4815.78,37,36,39,40,0,671,674,591,0
|
||||
4816.35,37,37,40,39,0,666,663,589,0
|
||||
4816.92,37,37,40,40,0,672,668,588,0
|
||||
4817.49,37,37,39,39,0,675,671,589,0
|
||||
4818.05,38,37,40,41,0,675,666,592,0
|
||||
4818.62,38,37,40,40,0,666,666,591,0
|
||||
4819.18,37,37,39,40,0,671,667,591,0
|
||||
4819.75,37,36,39,40,0,673,669,591,0
|
||||
4820.32,37,37,39,40,0,674,674,587,0
|
||||
4820.88,37,37,40,40,0,675,666,585,0
|
||||
4821.45,36,36,40,41,0,667,675,593,0
|
||||
4822.02,38,37,39,39,0,668,675,591,0
|
||||
4822.58,36,37,41,40,0,667,672,590,0
|
||||
4823.15,37,36,38,40,0,676,671,589,0
|
||||
4823.72,37,37,39,41,0,673,671,587,0
|
||||
4824.28,38,36,40,41,0,666,670,592,0
|
||||
4824.85,37,36,40,40,0,666,672,590,0
|
||||
4825.41,37,36,40,41,0,674,674,586,0
|
||||
4825.99,38,36,40,41,0,675,671,593,0
|
||||
4826.55,37,36,38,40,0,673,670,588,0
|
||||
4827.12,37,37,39,39,0,668,665,587,0
|
||||
4827.68,38,37,40,41,0,666,666,587,0
|
||||
4828.25,37,36,39,39,0,673,668,585,0
|
||||
4828.81,38,36,40,40,0,668,666,588,0
|
||||
4829.38,37,37,39,40,0,668,675,592,0
|
||||
4829.95,37,37,40,39,0,665,667,589,0
|
||||
4830.51,36,37,39,40,0,669,675,593,0
|
||||
4831.08,38,36,40,40,0,667,669,586,0
|
||||
4831.65,37,36,40,40,0,677,668,592,0
|
||||
4832.21,37,38,39,40,0,668,667,589,0
|
||||
4832.78,37,37,40,41,0,665,675,589,0
|
||||
4833.34,37,36,39,40,0,676,673,586,0
|
||||
4833.91,37,37,38,40,0,666,667,587,0
|
||||
4834.49,37,37,40,39,0,673,668,587,0
|
||||
4835.05,36,37,40,39,0,667,667,586,0
|
||||
4835.62,37,37,40,40,0,671,667,587,0
|
||||
4836.18,38,36,39,40,0,673,674,588,0
|
||||
4836.75,37,37,39,39,0,668,669,589,0
|
||||
4837.31,38,37,39,40,0,672,667,589,0
|
||||
4837.88,37,37,39,40,0,670,674,592,0
|
||||
4838.45,37,36,40,41,0,667,674,593,0
|
||||
4839.02,38,35,39,40,0,671,666,586,0
|
||||
4839.59,38,37,40,40,0,670,669,591,0
|
||||
4840.15,38,36,40,40,0,673,674,594,0
|
||||
4840.72,37,35,39,41,0,666,667,588,0
|
||||
4841.28,37,36,39,40,0,667,666,593,0
|
||||
4841.85,37,36,39,39,0,674,671,588,0
|
||||
4842.41,37,37,38,40,0,672,671,587,0
|
||||
4842.98,38,36,41,41,0,674,666,587,0
|
||||
4843.54,37,37,40,40,0,667,668,587,0
|
||||
4844.10,38,36,39,41,0,673,675,588,0
|
||||
4844.67,37,36,38,40,0,671,669,592,0
|
||||
4845.23,38,37,39,40,0,676,665,587,0
|
||||
4845.80,38,37,40,40,0,674,675,590,0
|
||||
4846.36,37,37,40,40,0,671,672,586,0
|
||||
4846.94,38,36,40,40,0,674,676,587,0
|
||||
4847.50,38,38,40,40,0,679,673,589,0
|
||||
4848.07,38,36,40,41,0,671,666,592,0
|
||||
4848.64,36,37,40,40,0,668,665,590,0
|
||||
4849.20,37,36,40,40,0,670,668,586,0
|
||||
4849.77,37,35,40,40,0,669,670,588,0
|
||||
4850.33,37,37,39,39,0,666,666,594,0
|
||||
4850.90,37,36,40,39,0,672,672,586,0
|
||||
4851.47,37,36,39,39,0,675,675,593,0
|
||||
4852.04,37,36,40,40,0,669,671,592,0
|
||||
4852.61,38,37,39,40,0,669,676,593,0
|
||||
4853.18,38,36,40,40,0,671,671,586,0
|
||||
4853.75,37,36,40,40,0,675,670,589,0
|
||||
4854.32,38,37,39,40,0,675,668,589,0
|
||||
4854.88,38,36,39,40,0,668,667,592,0
|
||||
4855.45,37,36,40,40,0,674,668,591,0
|
||||
4856.01,37,36,39,40,0,675,667,587,0
|
||||
4856.58,36,37,40,39,0,665,667,588,0
|
||||
4857.14,38,37,40,40,0,669,665,586,0
|
||||
4857.71,37,36,39,40,0,675,667,587,0
|
||||
4858.27,37,36,40,40,0,673,672,590,0
|
||||
4858.84,38,36,39,40,0,677,674,587,0
|
||||
4859.41,37,36,41,39,0,668,675,587,0
|
||||
4859.98,37,36,39,39,0,676,670,586,0
|
||||
4860.54,37,36,40,40,0,676,666,588,0
|
||||
4861.11,37,36,39,40,0,676,673,591,0
|
||||
4861.67,38,36,39,40,0,669,671,589,0
|
||||
4862.24,37,36,40,39,0,676,675,589,0
|
||||
4862.80,37,36,39,40,0,669,668,593,0
|
||||
4863.37,38,36,40,41,0,673,674,588,0
|
||||
4863.93,38,36,40,40,0,668,669,589,0
|
||||
4864.50,38,36,40,40,0,669,674,594,0
|
||||
4865.06,37,36,40,40,0,673,665,594,0
|
||||
4865.63,37,37,39,40,0,674,675,594,0
|
||||
4866.20,38,36,40,40,0,673,667,594,0
|
||||
4866.76,37,36,39,40,0,669,668,586,0
|
||||
4867.33,37,37,38,39,0,665,666,586,0
|
||||
4867.90,37,36,39,39,0,667,669,592,0
|
||||
4868.46,37,37,40,39,0,668,677,589,0
|
||||
4869.03,37,37,39,40,0,674,675,587,0
|
||||
4869.60,37,36,39,39,0,674,669,593,0
|
||||
4870.17,38,37,39,40,0,676,673,587,0
|
||||
4870.73,37,37,40,40,0,676,667,587,0
|
||||
4871.30,38,37,39,40,0,669,674,588,0
|
||||
4871.86,38,36,40,40,0,663,666,592,0
|
||||
4872.43,38,37,39,40,0,670,670,594,0
|
||||
4873.00,38,36,40,40,0,668,666,590,0
|
||||
4873.56,37,35,39,40,0,667,674,591,0
|
||||
4874.12,37,36,40,39,0,675,666,587,0
|
||||
4874.70,37,37,40,39,0,674,673,592,0
|
||||
4875.26,36,36,39,40,0,668,677,588,0
|
||||
4875.83,38,36,39,41,0,673,667,593,0
|
||||
4876.40,36,36,39,40,0,671,669,593,0
|
||||
4876.96,37,36,40,40,0,669,672,588,0
|
||||
4877.53,36,37,39,40,0,666,667,594,0
|
||||
4878.10,38,35,39,40,0,667,667,586,0
|
||||
4878.67,38,36,38,40,0,676,674,587,0
|
||||
4879.24,37,36,39,40,0,667,676,588,0
|
||||
4879.80,37,36,40,39,0,675,673,594,0
|
||||
4880.36,38,35,40,40,0,676,668,592,0
|
||||
4880.93,38,37,39,41,0,665,671,588,0
|
||||
4881.49,36,35,38,41,0,667,673,594,0
|
||||
4882.06,38,36,39,40,0,664,667,592,0
|
||||
4882.62,37,36,40,41,0,671,674,593,0
|
||||
4883.19,37,37,38,41,0,672,667,587,0
|
||||
4883.75,37,37,40,40,0,670,673,592,0
|
||||
4884.31,37,37,40,40,0,672,669,586,0
|
||||
4884.88,38,36,39,40,0,674,674,593,0
|
||||
4885.44,38,37,40,40,0,667,674,588,0
|
||||
4886.01,38,36,39,41,0,669,669,593,0
|
||||
4886.57,37,36,40,41,0,667,674,586,0
|
||||
4887.14,38,36,38,41,0,674,674,588,0
|
||||
4887.71,38,37,39,41,0,672,668,592,0
|
||||
4888.28,39,38,39,40,0,667,668,591,0
|
||||
4888.84,37,37,39,38,0,669,672,592,0
|
||||
4889.41,36,36,40,39,0,669,667,591,0
|
||||
4889.97,38,36,39,40,0,674,677,593,0
|
||||
4890.54,37,37,40,39,0,674,670,586,0
|
||||
4891.10,37,36,39,41,0,667,675,591,0
|
||||
4891.67,37,36,39,41,0,668,666,593,0
|
||||
4892.23,37,37,39,40,0,674,670,588,0
|
||||
4892.80,38,37,39,41,0,675,671,591,0
|
||||
4893.36,38,37,39,41,0,667,670,592,0
|
||||
4893.92,37,36,39,39,0,670,673,592,0
|
||||
4894.49,37,36,40,40,0,669,667,593,0
|
||||
4895.05,37,36,38,40,0,674,674,588,0
|
||||
4895.62,37,36,41,39,0,674,675,587,0
|
||||
4896.19,38,36,40,40,0,674,667,588,0
|
||||
4896.76,37,37,40,41,0,666,667,591,0
|
||||
4897.33,37,35,39,40,0,676,678,592,0
|
||||
4897.89,37,36,40,39,0,669,672,588,0
|
||||
4898.46,37,37,40,40,0,669,666,587,0
|
||||
4899.02,37,36,41,40,0,673,666,586,0
|
||||
4899.58,36,35,39,39,0,665,674,592,0
|
||||
4900.15,37,37,40,40,0,670,667,586,0
|
||||
4900.71,37,36,40,41,0,666,664,589,0
|
||||
4901.28,37,36,40,40,0,674,674,594,0
|
||||
4901.85,37,36,40,40,0,669,671,592,0
|
||||
4902.42,37,36,40,40,0,668,667,592,0
|
||||
4902.98,38,36,39,39,0,673,667,592,0
|
||||
4903.55,38,37,38,40,0,674,674,588,0
|
||||
4904.12,39,37,40,41,0,669,665,587,0
|
||||
4904.68,37,36,40,41,0,666,673,592,0
|
||||
4905.25,38,37,39,39,0,664,675,591,0
|
||||
4905.81,37,36,39,40,0,669,667,587,0
|
||||
4906.38,37,35,40,39,0,675,671,593,0
|
||||
4906.94,37,37,39,40,0,674,674,591,0
|
||||
4907.51,38,37,39,39,0,669,665,592,0
|
||||
4908.07,37,37,40,40,0,669,666,586,0
|
||||
4908.64,38,37,40,39,0,676,669,589,0
|
||||
4909.21,38,36,39,40,0,666,668,593,0
|
||||
4909.78,38,36,40,40,0,670,671,592,0
|
||||
4910.34,38,36,39,39,0,665,670,588,0
|
||||
4910.91,38,36,39,40,0,672,669,593,0
|
||||
4911.47,37,36,40,39,0,669,665,587,0
|
||||
4912.03,38,36,40,40,0,669,673,589,0
|
||||
4912.60,37,37,39,40,0,674,673,587,0
|
||||
4913.17,36,37,39,40,0,673,675,587,0
|
||||
4913.73,37,38,39,40,0,674,674,594,0
|
||||
4914.30,36,37,38,40,0,668,674,592,0
|
||||
4914.87,38,37,39,40,0,670,666,591,0
|
||||
4915.44,37,36,40,40,0,672,675,589,0
|
||||
4916.00,37,37,39,41,0,666,666,588,0
|
||||
4916.56,37,36,38,39,0,667,666,588,0
|
||||
4917.13,37,37,39,40,0,672,672,586,0
|
||||
4917.70,37,37,40,40,0,668,665,587,0
|
||||
4918.26,37,37,39,40,0,674,674,586,0
|
||||
4918.82,38,35,40,40,0,675,675,588,0
|
||||
4919.39,37,36,39,41,0,670,674,590,0
|
||||
4919.95,37,37,40,41,0,676,673,594,0
|
||||
4920.52,38,36,39,41,0,672,669,593,0
|
||||
4921.08,37,35,40,40,0,669,667,586,0
|
||||
4921.65,39,37,39,40,0,671,673,590,0
|
||||
4922.21,37,36,38,40,0,669,676,593,0
|
||||
4922.78,37,36,40,40,0,670,666,586,0
|
||||
4923.35,37,36,40,40,0,669,669,586,0
|
||||
4923.92,37,37,40,41,0,674,674,588,0
|
||||
4924.49,37,36,40,40,0,666,673,593,0
|
||||
4925.05,38,37,40,39,0,674,675,586,0
|
||||
4925.62,37,38,38,40,0,673,674,593,0
|
||||
4926.19,38,36,39,40,0,675,674,588,0
|
||||
4926.76,37,36,40,40,0,672,674,587,0
|
||||
4927.32,37,36,39,40,0,669,676,593,0
|
||||
4927.89,38,36,40,40,0,670,671,588,0
|
||||
4928.45,37,36,40,40,0,675,668,588,0
|
||||
4929.02,38,38,40,40,0,669,673,588,0
|
||||
4929.58,37,36,39,39,0,670,674,592,0
|
||||
4930.15,37,37,39,38,0,668,668,586,0
|
||||
4930.71,37,37,39,40,0,672,667,587,0
|
||||
4931.28,37,37,40,40,0,673,667,589,0
|
||||
4931.84,37,36,39,41,0,673,671,587,0
|
||||
4932.41,38,37,38,41,0,675,669,594,0
|
||||
4932.98,38,37,39,40,0,668,667,594,0
|
||||
4933.55,38,37,40,41,0,673,667,588,0
|
||||
4934.11,37,36,40,41,0,666,670,591,0
|
||||
4934.68,38,36,40,40,0,674,674,585,0
|
||||
4935.24,37,36,40,40,0,674,668,591,0
|
||||
4935.81,37,36,40,40,0,676,674,587,0
|
||||
4936.37,37,37,40,40,0,668,673,587,0
|
||||
4936.94,38,35,39,40,0,673,675,588,0
|
||||
4937.50,37,36,40,40,0,668,668,593,0
|
||||
4938.07,37,35,40,40,0,668,671,588,0
|
||||
4938.64,38,36,40,40,0,675,667,594,0
|
||||
4939.21,37,35,40,40,0,673,669,593,0
|
||||
4939.77,37,36,39,40,0,671,672,592,0
|
||||
4940.34,37,35,40,41,0,673,673,588,0
|
||||
4940.90,37,36,40,39,0,667,673,589,0
|
||||
4941.47,38,36,39,39,0,667,675,588,0
|
||||
4942.03,38,37,39,40,0,674,670,587,0
|
||||
4942.60,37,36,39,41,0,675,674,590,0
|
||||
4943.16,37,37,40,41,0,671,664,587,0
|
||||
4943.73,37,36,38,40,0,666,669,588,0
|
||||
4944.30,37,36,40,40,0,667,667,585,0
|
||||
4944.87,37,36,40,40,0,669,667,588,0
|
||||
4945.43,37,37,40,40,0,673,675,590,0
|
||||
4946.00,36,36,39,40,0,676,668,594,0
|
||||
4946.56,36,36,39,40,0,668,670,592,0
|
||||
4947.13,39,37,39,40,0,674,669,588,0
|
||||
4947.69,37,35,39,39,0,676,669,593,0
|
||||
4948.26,37,36,40,39,0,676,673,587,0
|
||||
4948.82,38,36,40,40,0,668,671,592,0
|
||||
4949.39,37,36,39,40,0,669,668,593,0
|
||||
4949.96,38,37,38,40,0,666,674,587,0
|
||||
4950.53,37,36,40,40,0,670,666,586,0
|
||||
4951.09,37,36,40,40,0,673,674,587,0
|
||||
4951.66,37,36,40,40,0,666,665,591,0
|
||||
4952.22,36,36,39,40,0,676,676,589,0
|
||||
4952.79,37,37,40,40,0,670,669,593,0
|
||||
4953.35,37,36,40,40,0,678,672,592,0
|
||||
4953.92,37,37,39,40,0,669,674,587,0
|
||||
4954.48,38,36,39,40,0,667,666,592,0
|
||||
4955.06,37,37,39,40,0,674,676,587,0
|
||||
4955.62,38,36,40,40,0,668,669,593,0
|
||||
4956.19,38,36,39,40,0,667,666,588,0
|
||||
4956.76,37,36,40,40,0,667,672,592,0
|
||||
4957.32,37,35,40,40,0,666,672,594,0
|
||||
4957.88,37,36,40,40,0,674,674,590,0
|
||||
4958.45,37,37,40,40,0,669,664,586,0
|
||||
4959.01,38,36,39,40,0,674,667,587,0
|
||||
4959.58,38,37,40,40,0,673,673,593,0
|
||||
4960.15,37,36,40,41,0,669,674,587,0
|
||||
4960.72,37,36,41,40,0,674,675,592,0
|
||||
4961.29,38,36,39,40,0,671,673,588,0
|
||||
4961.85,36,36,40,40,0,670,665,594,0
|
||||
4962.42,37,36,39,41,0,669,667,589,0
|
||||
4962.98,37,36,39,38,0,669,674,593,0
|
||||
4963.55,37,37,39,40,0,669,667,591,0
|
||||
4964.11,38,35,41,41,0,671,669,594,0
|
||||
4964.68,37,36,40,39,0,674,668,588,0
|
||||
4965.24,37,36,40,40,0,675,673,593,0
|
||||
4965.81,38,36,39,40,0,671,676,594,0
|
||||
4966.38,38,37,39,40,0,674,669,586,0
|
||||
4966.94,36,36,40,40,0,675,674,594,0
|
||||
4967.51,37,36,40,39,0,666,666,589,0
|
||||
4968.07,37,35,40,41,0,669,674,592,0
|
||||
4968.64,37,36,40,40,0,669,668,587,0
|
||||
4969.21,39,36,38,40,0,667,674,595,0
|
||||
4969.77,37,36,40,40,0,665,675,586,0
|
||||
4970.33,38,37,40,40,0,669,669,588,0
|
||||
4970.90,38,36,40,40,0,668,666,588,0
|
||||
4971.46,37,36,39,40,0,668,667,593,0
|
||||
4972.03,37,37,39,40,0,672,671,594,0
|
||||
4972.59,37,36,40,40,0,674,669,594,0
|
||||
4973.16,38,37,39,40,0,668,669,594,0
|
||||
4973.72,37,37,39,40,0,677,671,590,0
|
||||
4974.28,38,37,40,40,0,673,673,588,0
|
||||
4974.85,37,36,39,42,0,675,675,592,0
|
||||
4975.41,37,37,40,40,0,671,670,591,0
|
||||
4975.98,37,36,39,40,0,669,667,589,0
|
||||
4976.54,37,36,38,40,0,667,672,587,0
|
||||
4977.10,37,37,41,40,0,671,675,587,0
|
||||
4977.67,37,35,38,41,0,671,668,593,0
|
||||
4978.23,36,36,40,40,0,676,673,592,0
|
||||
4978.80,38,36,40,39,0,667,677,588,0
|
||||
4979.36,38,37,40,40,0,672,673,587,0
|
||||
4979.92,38,36,40,41,0,669,670,588,0
|
||||
4980.49,37,35,40,40,0,670,669,593,0
|
||||
4981.05,37,37,39,40,0,671,672,593,0
|
||||
4981.62,37,37,40,40,0,669,672,589,0
|
||||
4982.19,38,36,39,40,0,669,673,591,0
|
||||
4982.76,38,36,40,39,0,666,674,593,0
|
||||
4983.33,39,36,39,39,0,671,671,593,0
|
||||
4983.89,37,37,40,40,0,669,668,593,0
|
||||
4984.46,37,36,39,40,0,669,668,592,0
|
||||
4985.03,37,37,40,40,0,670,664,592,0
|
||||
4985.60,37,36,39,39,0,676,673,589,0
|
||||
4986.17,38,37,40,40,0,668,668,586,0
|
||||
4986.73,37,36,38,39,0,666,671,591,0
|
||||
4987.30,37,36,39,40,0,673,666,587,0
|
||||
4987.86,38,36,40,40,0,667,667,587,0
|
||||
4988.43,37,36,38,40,0,668,676,592,0
|
||||
4989.00,37,37,39,40,0,675,673,589,0
|
||||
4989.57,36,37,39,40,0,674,667,593,0
|
||||
4990.13,37,36,40,40,0,661,674,594,0
|
||||
4990.70,38,37,39,39,0,670,675,590,0
|
||||
4991.26,38,36,39,40,0,669,668,594,0
|
||||
4991.83,37,36,40,39,0,668,668,587,0
|
||||
4992.39,37,37,39,41,0,668,672,587,0
|
||||
4992.96,38,37,40,40,0,676,665,594,0
|
||||
4993.52,36,36,39,41,0,669,671,594,0
|
||||
4994.08,38,37,39,40,0,676,666,588,0
|
||||
4994.65,37,36,39,40,0,668,666,591,0
|
||||
4995.21,38,35,39,40,0,674,665,590,0
|
||||
4995.78,38,36,40,40,0,670,667,589,0
|
||||
4996.35,37,36,40,41,0,666,672,588,0
|
||||
4996.92,38,36,40,40,0,676,673,589,0
|
||||
4997.48,38,35,38,39,0,675,666,589,0
|
||||
4998.05,38,36,40,41,0,672,670,588,0
|
||||
4998.61,37,37,40,40,0,676,677,593,0
|
||||
4999.18,37,38,40,40,0,669,671,593,0
|
||||
4999.75,38,36,38,40,0,673,667,586,0
|
||||
5000.31,36,36,39,41,0,668,666,590,0
|
||||
5000.88,37,35,40,40,0,669,673,584,0
|
||||
5001.45,38,36,40,40,0,666,666,594,0
|
||||
5002.02,37,36,40,40,0,666,672,589,0
|
||||
5002.59,37,36,38,40,0,667,666,587,0
|
||||
5003.15,37,36,40,39,0,675,672,586,0
|
||||
5003.72,37,36,38,41,0,677,670,590,0
|
||||
5004.29,38,36,39,40,0,674,669,594,0
|
||||
5004.86,37,36,40,41,0,675,674,592,0
|
||||
|
@@ -28,8 +28,9 @@ Drills (pass a name):
|
||||
(default 300) on scrap, sampled like `witness`. Prints the
|
||||
per-channel peak delta over the ambient baseline and the
|
||||
engine's own "run telemetry" line is the record. Run it
|
||||
>= 3 times on representative material; the highest peak
|
||||
delta sizes cool_fire_ir_delta.
|
||||
>= 3 times on representative material; the highest peaks
|
||||
are what the engine's cool_fire_q1/q2 alert and critical
|
||||
thresholds (absolute counts) must sit above.
|
||||
ircut [S] [F] e.g. ircut 1000 300
|
||||
pthresh Laser power-threshold ladder: one line per power level on
|
||||
scrap, climbing from 2 % to 30 % of full, at constant power
|
||||
@@ -196,8 +197,29 @@ def panel_token():
|
||||
except OSError:
|
||||
return ''
|
||||
|
||||
# Ambient lid-IR baseline (2026-08-14, lid closed, idle): per-channel means.
|
||||
IR_BASELINE = [37.3, 36.3, 39.5, 40.0]
|
||||
|
||||
def sample_ir_baseline(seconds=3.0):
|
||||
"""Per-channel lid-IR means at idle, lid closed, taken before the job:
|
||||
the baseline this run is judged against (never a stored one)."""
|
||||
acc = [0.0, 0.0, 0.0, 0.0]
|
||||
n = 0
|
||||
t_end = time.time() + seconds
|
||||
while time.time() < t_end:
|
||||
s = sample_forgectrl()
|
||||
if s and s['ir'] and len(s['ir']) == 4:
|
||||
for i in range(4):
|
||||
acc[i] += s['ir'][i]
|
||||
n += 1
|
||||
time.sleep(0.25)
|
||||
if not n:
|
||||
return None
|
||||
return [round(a / n, 1) for a in acc]
|
||||
|
||||
|
||||
def ir_delta(peak, base):
|
||||
if base is None:
|
||||
return ['n/a'] * 4
|
||||
return [round(peak[i] - base[i], 1) for i in range(4)]
|
||||
|
||||
|
||||
def get_json(path):
|
||||
@@ -394,6 +416,7 @@ def drill_witness(g):
|
||||
'G90',
|
||||
'M2', # program end: X-3 job-based disarm trigger
|
||||
]
|
||||
ir_base = sample_ir_baseline()
|
||||
samples = run_and_sample(g, job)
|
||||
# Analysis.
|
||||
emis = [s['emission'] for s in samples if s['emission'] is not None]
|
||||
@@ -415,8 +438,7 @@ def drill_witness(g):
|
||||
print('pgood_samples during job: peak=%s (>=128 = power-good)'
|
||||
% (max(pgood_vals) if pgood_vals else '-'))
|
||||
print('lid_ir peak=%s vs baseline=%s delta=%s'
|
||||
% (ir_peak, IR_BASELINE,
|
||||
[round(ir_peak[i] - IR_BASELINE[i], 1) for i in range(4)]))
|
||||
% (ir_peak, ir_base, ir_delta(ir_peak, ir_base)))
|
||||
print('hv_current range: %s..%s' % (min(hv_vals) if hv_vals else '-',
|
||||
max(hv_vals) if hv_vals else '-'))
|
||||
print('armed observed during job: %s' % armed_seen)
|
||||
@@ -436,10 +458,11 @@ def drill_witness(g):
|
||||
% (round(disarm_dt, 1) if disarm_dt is not None else '>75 (REVIEW)'))
|
||||
ok = peak_emis > 0 and end_emis == 0
|
||||
print('WITNESS emission %s' % ('PASS' if ok else 'REVIEW - see values above'))
|
||||
# Emit the recommended cool_fire_ir_delta floor.
|
||||
worst = max(ir_peak[i] - IR_BASELINE[i] for i in range(4))
|
||||
print('suggest cool_fire_ir_delta >= max(15, %.0f) once several jobs '
|
||||
'confirm the peak delta' % (2 * worst if worst > 0 else 15))
|
||||
# The engine's fire watch trips on absolute lid-IR counts, per quartile
|
||||
# pair (cool_fire_q1_alert / _critical, cool_fire_q2_alert / _critical):
|
||||
# the peaks above are what those thresholds must clear on a clean job.
|
||||
print('fire-watch thresholds must sit above these peaks: %s '
|
||||
'(cool_fire_q1_* for channels 1-2, cool_fire_q2_* for 3-4)' % ir_peak)
|
||||
return samples
|
||||
|
||||
|
||||
@@ -502,6 +525,7 @@ def drill_ircut(g):
|
||||
'G1 X-30 F%d' % feed, 'G1 Y-30 F%d' % feed,
|
||||
'M5', 'G90', 'M2',
|
||||
]
|
||||
ir_base = sample_ir_baseline()
|
||||
samples = run_and_sample(g, job, overall_timeout=400)
|
||||
ir_peak = [0, 0, 0, 0]
|
||||
ir_min = [10 ** 6] * 4
|
||||
@@ -522,14 +546,13 @@ def drill_ircut(g):
|
||||
print('\n--- results ---')
|
||||
print('samples: %d emission peak=%s fire_watch states=%s'
|
||||
% (len(samples), max(emis) if emis else '-', sorted(fw)))
|
||||
delta = [round(ir_peak[i] - IR_BASELINE[i], 1) for i in range(4)]
|
||||
delta = ir_delta(ir_peak, ir_base)
|
||||
print('lid_ir min=%s peak=%s baseline=%s peak delta=%s'
|
||||
% (ir_min, ir_peak, IR_BASELINE, delta))
|
||||
% (ir_min, ir_peak, ir_base, delta))
|
||||
print('hv_current range: %s..%s' % (min(hv_vals) if hv_vals else '-',
|
||||
max(hv_vals) if hv_vals else '-'))
|
||||
worst = max(delta)
|
||||
print('worst peak delta this job: %s counts -> cool_fire_ir_delta must sit '
|
||||
'above the worst across ALL jobs (>= 2x it, never < 15)' % worst)
|
||||
print('worst peaks this job: %s counts -> the cool_fire_q1/q2 alert '
|
||||
'thresholds must sit above the worst across ALL jobs' % ir_peak)
|
||||
print('the engine logged its own "run telemetry: lid IR ..." line for this job')
|
||||
return samples
|
||||
|
||||
@@ -961,20 +984,7 @@ def _linfit(xs, ys):
|
||||
return a, b, r2
|
||||
|
||||
|
||||
def _degc(raw):
|
||||
"""The factory coolant conversion when gfbench is importable (on the
|
||||
board, or with GF_HOST set), else None and the raw count is quoted.
|
||||
The helper lives beside this file in the repo and under the bench
|
||||
directory on the dev image; a copy staged elsewhere still finds it."""
|
||||
for d in (os.path.dirname(os.path.abspath(__file__)),
|
||||
'/usr/share/forgetest/bench'):
|
||||
if d not in sys.path:
|
||||
sys.path.append(d)
|
||||
try:
|
||||
from gfbench import degc
|
||||
except (ImportError, SystemExit):
|
||||
return None
|
||||
return degc(raw)
|
||||
from gfbench import degc as _degc
|
||||
|
||||
|
||||
def pcurve_levels(g, pcts):
|
||||
|
||||
@@ -43,11 +43,7 @@ ADC_F = 1024.0 * 1.3
|
||||
RINF = 10000.0 * math.exp(-3380.0 / 298.15)
|
||||
|
||||
|
||||
def degc(raw):
|
||||
if raw is None or raw <= 0 or raw >= ADC_F:
|
||||
return float('nan')
|
||||
r = 10000.0 / (ADC_F / raw - 1.0)
|
||||
return 3380.0 / math.log(r / RINF) - 273.15
|
||||
from gfbench import degc
|
||||
|
||||
|
||||
def rd(path):
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"points": [
|
||||
{
|
||||
"measured_c": 25.67,
|
||||
"raw1": 672.4,
|
||||
"raw2": 672.6,
|
||||
"note": "IR on reservoir+hoses 78.2F, ambient 78.0F, idle 1h, pump on, heater off",
|
||||
"when": "2026-08-02 18:13:41"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user