nx_toner_track.nx source
↩ module page · 74 lines · 3388 B
1// nx_toner_track.nx -- REAL toner reading from the page we actually printed. Decodes the URF artifact back
2// to its bitmap, measures true ink coverage, records it in the persistent ledger, and reports real toner
3// remaining -- the printer's lying gauge ignored entirely. READ+record only (a data file) -> never-brick.
4// license_tier: ORIGINAL ; genealogy_id: project-printer-management-ipp-sclass-2026-06-20
5
6import "nx_syscalls.nx"
7import "nx_pwg_rle.nx"
8import "nx_toner_meter.nx"
9import "nx_toner_ledger.nx"
10import "nx_toner_store.nx"
11const K_MAGIC_10000: i64 = 10000
12
13func p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
14func pn(v: i64) -> i64 {
15 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
16 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
17 let t: *u8 = sys_mmap(24); var k: i64 = 0
18 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
19 let b: *u8 = sys_mmap(24); var i: i64 = 0
20 while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
21 sys_write(1, b, k); return 0
22}
23// print v as N.NN given v in hundredths-of-percent-ish (caller passes whole + 2-digit frac)
24func p2(whole: i64, frac2: i64) -> i64 {
25 pn(whole); p(".")
26 if frac2 < 10 { p("0") }
27 pn(frac2); return 0
28}
29func be32(d: *u8, o: i64) -> i64 {
30 return ((d[o] as i64) << 24) | ((d[o + 1] as i64) << 16) | ((d[o + 2] as i64) << 8) | (d[o + 3] as i64)
31}
32
33func main() -> i64 {
34 let LEDGER: *u8 = "knowledge/fetched/toner_ledger.bin\x00"
35 let URF: *u8 = "knowledge/fetched/nishi_test.urf\x00"
36
37 // decode the printed page back to a bitmap
38 let lenp: *i64 = sys_mmap(8) as *i64
39 let doc: *u8 = sys_read_file(URF, lenp)
40 if doc == (0 as *u8) { p("no nishi_test.urf (run nx_urf_make)\n"); sys_exit(1); return 1 }
41 let doclen: i64 = lenp[0]
42 let width: i64 = be32(doc, 24)
43 let height: i64 = be32(doc, 28)
44 let npix: i64 = width * height
45 p("printed page "); pn(width); p("x"); pn(height); p(" ("); pn(npix); p(" px)\n")
46 let bm: *u8 = sys_mmap(npix)
47 let px: i64 = nx_rle_decode(((doc as i64) + 44) as *u8, doclen - 44, width, height, 1, bm, npix)
48 if px != npix { p("decode mismatch\n"); sys_exit(2); return 2 }
49
50 let cov: i64 = nx_toner_coverage_ppm(bm, npix)
51 p("MEASURED ink coverage = ")
52 p2(cov / K_MAGIC_10000, (cov % K_MAGIC_10000) / 100); p("% ("); pn(cov); p(" ppm; ISO std page = 5.00%)\n")
53
54 // load or initialize the ledger (default: a fresh TN-630 -- operator declares the cart at install)
55 let y: *i64 = sys_mmap(8) as *i64
56 let c: *i64 = sys_mmap(8) as *i64
57 if nx_tstore_load(LEDGER, y, c) == 0 {
58 y[0] = NX_TONER_YIELD_TN630
59 c[0] = 0
60 p("(initialized fresh ledger: TN-630, 1200-page yield)\n")
61 }
62 // record this page
63 c[0] = nx_ledger_add(c[0], cov)
64 nx_tstore_save(LEDGER, y[0], c[0])
65
66 let bp: i64 = nx_ledger_remaining_bp(y[0], c[0])
67 let pages: i64 = nx_ledger_remaining_pages(y[0], c[0])
68 let used: i64 = nx_ledger_used_pages(c[0])
69 p("=== REAL TONER (measured, not the printer's gauge) ===\n")
70 p(" remaining: "); p2(bp / 100, bp % 100); p("%\n")
71 p(" pages left at this rate: ~"); pn(pages); p(" (used so far: "); pn(used); p(" std-page-equiv)\n")
72 p(" printer's gauge says: 0% / Replace Toner <-- the bullshit we ignore\n")
73 sys_exit(0); return 0
74}