mirror of
https://github.com/ALLFATHER-BV/wadamesh.git
synced 2026-09-22 18:07:15 +00:00
The declination model landed as 4.7 KB of constants pasted into a Lua app,
generated by a script that lived in out/ -- which is gitignored, holds firmware
bins, and is where the app's own "Regenerate:" comment pointed. So the pointer
dangled for anyone who cloned the repo, and nobody but me could answer the
first fair question a reviewer would ask about that block of magic numbers:
where did it come from, and how do I know it is right.
scripts/wmm/ WMM.COF + NOAA's 100 official test values (both upstream
and unmodified), the float64 reference, the generator,
verify.py, and a README covering provenance, regeneration
and how to move to WMM2030.
scripts/lua-harness/ the host harness, with run.sh so it is one command.
Neither goes in test/: that is PlatformIO's directory and a harness with a
main.c would be swept into `pio test`. scripts/ already holds this repo's dev
tooling, test_companion_serial.py included.
The block in the app is now genuinely generated rather than hand-pasted:
scripts/wmm/gen_lua.py --update <app> rewrite it
scripts/wmm/gen_lua.py --check <app> fail, with a diff, if it drifted
--check catches coefficients updated without regenerating, or a block edited by
hand. The generator owns the `local declination / do ... end` wrapper too, and
that is the point: the tables are named G/H/GD/HD, gpscompass uses a global H
for the screen height, and an unscoped `local H` silently ate it. Hand-wrapping
is how that happened, so hand-wrapping is now not a step.
Verification, all reproducible from a clean clone:
scripts/wmm/verify.py 100 NOAA values, worst D error 0.005 deg
scripts/lua-harness/run.sh 10 scenarios, incl. the generated Lua in
the device's own LUA_32BITS interpreter --
0.0002 deg vs NOAA, worst tick 12k of 100k
Also refreshes the LUA_APPS.md paragraph, which still advertised the O and F
keys that were removed and quoted harness numbers from before tilt
compensation.
20 lines
944 B
Python
Executable File
20 lines
944 B
Python
Executable File
#!/usr/bin/env python3
|
|
"""Verify the float64 reference WMM against NOAA's official WMM2025_TestValues.txt."""
|
|
import sys, os
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
from wmm import load_cof, wmm
|
|
d = os.path.dirname(os.path.abspath(__file__))
|
|
m = load_cof(os.path.join(d, "WMM.COF"))
|
|
worst = {k: 0.0 for k in ("D","I","H","X","Y","Z","F")}
|
|
n = 0
|
|
for line in open(os.path.join(d, "WMM2025_TestValues.txt")):
|
|
if line.startswith("#") or not line.strip(): continue
|
|
t = line.split(); n += 1
|
|
got = wmm(m, float(t[2]), float(t[3]), float(t[1]), float(t[0]))
|
|
exp = dict(D=float(t[4]), I=float(t[5]), H=float(t[6]), X=float(t[7]),
|
|
Y=float(t[8]), Z=float(t[9]), F=float(t[10]))
|
|
for k in worst: worst[k] = max(worst[k], abs(got[k] - exp[k]))
|
|
print(f"{n} official NOAA test values; max abs error:")
|
|
for k, v in worst.items(): print(f" {k}: {v:.3g}")
|
|
print("PASS" if worst["D"] < 0.006 else "FAIL")
|