code wiki / _hdl_build / nx_print_material.nx
nx_print_material.nx source
↩ module page · 115 lines · 5622 B
1// nx_print_material.nx -- LIB: the MULTI-MATERIAL 3D-printing ladder registry (FLAGGED workstream
2// project-nishi-3d-printing-multimaterial-2026-06-23). One sovereign seg-store catalog of print materials
3// across the family ladder FILAMENT -> PASTE/CONCRETE -> METAL; each material carries process params + a
4// capability STATUS (SHIPPING/MODELED/FUTURE) + EVIDENCE (the organ that actually prints it). Cardinal 26
5// (never brick): this is DATA only -- it emits no firmware; shipping materials' evidence is a G-code emitter
6// (file-only, brick-safe). Schema: print:mat:<id> -> name <t> family <t> process <t> nozzle_um <t> layer_um
7// <t> temp_c <t> status <t> evidence; print:matids / print:families = indexes. license_tier: ORIGINAL
8import "nx_food_science.nx"
9import "nx_seg_store.nx"
10import "nx_syscalls.nx"
11
12const PRINT_PREFIX: *u8 = "knowledge/store/print-"
13
14func pm_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } if b[i] != (0 as u8) { return 0 } return 1 }
15
16func pm_mat_key(id: *u8, out: *u8) -> i64 {
17 var o: i64 = 0
18 o = as_append(out, o, "print:mat:" as *u8)
19 o = as_append(out, o, id)
20 out[o] = 0 as u8
21 return o
22}
23func pm_get(prefix: *u8, id: *u8, ptr: *i64, len: *i64) -> i64 {
24 let key: *u8 = sys_mmap(80)
25 pm_mat_key(id, key)
26 return ss_get(prefix, key, ptr, len)
27}
28func pm_field_str(prefix: *u8, id: *u8, f: i64, out: *u8) -> i64 {
29 let pq: *i64 = sys_mmap(16) as *i64
30 let lq: *i64 = sys_mmap(16) as *i64
31 if pm_get(prefix, id, pq, lq) != 1 { out[0] = 0 as u8; return 0 }
32 return fd_field(pq[0] as *u8, lq[0], f, out)
33}
34func pm_field_int(prefix: *u8, id: *u8, f: i64) -> i64 {
35 let buf: *u8 = sys_mmap(32)
36 if pm_field_str(prefix, id, f, buf) == 0 { return 0 - 1 }
37 return fd_atoi(buf, as_len(buf))
38}
39// 1 if material `id` has status `status`
40func pm_status_is(prefix: *u8, id: *u8, status: *u8) -> i64 {
41 let buf: *u8 = sys_mmap(32)
42 pm_field_str(prefix, id, 6, buf)
43 return pm_streq(buf, status)
44}
45// walk print:matids -> outids (ptrs to copies); returns count
46func pm_list(prefix: *u8, outids: *i64) -> i64 {
47 let pq: *i64 = sys_mmap(16) as *i64
48 let lq: *i64 = sys_mmap(16) as *i64
49 if ss_get(prefix, "print:matids" as *u8, pq, lq) != 1 { return 0 }
50 let buf: *u8 = pq[0] as *u8
51 let len: i64 = lq[0]
52 var c: i64 = 0
53 var i: i64 = 0
54 var ls: i64 = 0
55 while i <= len {
56 var sep: i64 = 0
57 if i == len { sep = 1 } else { if buf[i] == (9 as u8) { sep = 1 } }
58 if sep == 1 {
59 let tl: i64 = i - ls
60 if tl > 0 {
61 let tok: *u8 = sys_mmap(48)
62 var t: i64 = 0
63 while t < tl { tok[t] = buf[ls + t]; t = t + 1 } tok[tl] = 0 as u8
64 outids[c] = tok as i64; c = c + 1
65 }
66 ls = i + 1
67 }
68 i = i + 1
69 }
70 return c
71}
72// 1 if a Nishi organ source <basename>.nx exists under runtime/ or runtime/_hdl_build/
73func pm_organ_exists(basename: *u8) -> i64 {
74 let p: *u8 = sys_mmap(256)
75 var o: i64 = 0
76 o = as_append(p, o, "runtime/" as *u8); o = as_append(p, o, basename); o = as_append(p, o, ".nx" as *u8); p[o] = 0 as u8
77 let fd: i64 = sys_openat_rd(p)
78 if fd >= 0 { sys_close(fd); return 1 }
79 o = 0
80 o = as_append(p, o, "runtime/_hdl_build/" as *u8); o = as_append(p, o, basename); o = as_append(p, o, ".nx" as *u8); p[o] = 0 as u8
81 let fd2: i64 = sys_openat_rd(p)
82 if fd2 >= 0 { sys_close(fd2); return 1 }
83 return 0
84}
85
86func pm_seed(prefix: *u8) -> i64 {
87 let keys: *i64 = sys_mmap(8 * 16) as *i64
88 let vals: *i64 = sys_mmap(8 * 16) as *i64
89 var n: i64 = 0
90 keys[n] = "print:families" as *u8 as i64; vals[n] = "FILAMENT\tPASTE\tMETAL" as *u8 as i64; n = n + 1
91 keys[n] = "print:matids" as *u8 as i64; vals[n] = "pla\tpetg\tabs\tconcrete\tclay\tsteel_waam\tsteel_dmls" as *u8 as i64; n = n + 1
92 // FILAMENT (FDM) -- SHIPPING via the existing pipeline; evidence = a real G-code organ
93 keys[n] = "print:mat:pla" as *u8 as i64; vals[n] = "PLA\tFILAMENT\tFDM\t400\t200\t210\tSHIPPING\tnx_gcode_emit" as *u8 as i64; n = n + 1
94 keys[n] = "print:mat:petg" as *u8 as i64; vals[n] = "PETG\tFILAMENT\tFDM\t400\t200\t240\tSHIPPING\tnx_gcode_extrude" as *u8 as i64; n = n + 1
95 keys[n] = "print:mat:abs" as *u8 as i64; vals[n] = "ABS\tFILAMENT\tFDM\t400\t200\t250\tSHIPPING\tnx_klipper_gcode_validator" as *u8 as i64; n = n + 1
96 // PASTE/CONCRETE -- MODELED; evidence = the R-ECO design that DEMANDS concrete printing (the cistern)
97 keys[n] = "print:mat:concrete" as *u8 as i64; vals[n] = "Concrete\tPASTE\tCONSTRUCTION\t25000\t10000\t0\tMODELED\tnx_ecodesign" as *u8 as i64; n = n + 1
98 keys[n] = "print:mat:clay" as *u8 as i64; vals[n] = "Clay\tPASTE\tCONSTRUCTION\t8000\t4000\t0\tMODELED\tnx_ecodesign" as *u8 as i64; n = n + 1
99 // METAL -- FUTURE (honest: not built)
100 keys[n] = "print:mat:steel_waam" as *u8 as i64; vals[n] = "Steel-WAAM\tMETAL\tWAAM\t1200\t1000\t1500\tFUTURE\tfuture" as *u8 as i64; n = n + 1
101 keys[n] = "print:mat:steel_dmls" as *u8 as i64; vals[n] = "Steel-DMLS\tMETAL\tDMLS\t100\t40\t1400\tFUTURE\tfuture" as *u8 as i64; n = n + 1
102
103 let w: *i64 = ss_begin()
104 var tw: i64 = 0
105 var i: i64 = 0
106 while i < n {
107 let k: *u8 = keys[i] as *u8
108 let v: *u8 = vals[i] as *u8
109 let vl: i64 = as_len(v)
110 if fd_streq_store(prefix, k, v, vl) == 0 { ss_add(w, 1, k, v, vl); tw = tw + 1 }
111 i = i + 1
112 }
113 if tw > 0 { let seg: i64 = fd_seg_next(prefix); ss_commit(prefix, w, seg) }
114 return tw
115}