code wiki / (root) / nx_toner_track.nx

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}