nx_battery_safety_test.nx source
↩ module page · 60 lines · 2739 B
1// nx_battery_safety_test.nx -- smoke for nx_battery_safety.
2
3import "nx_syscalls.nx"
4import "nx_intent.nx"
5import "nx_battery_safety.nx"
6
7func main() -> i64 {
8 if NX_BC_N_KINDS != 5 { return 1 }
9 if nx_bc_kind_is_valid(NX_BC_CHARGE) != 1 { return 2 }
10 if nx_bc_kind_is_valid(5) != 0 { return 3 }
11
12 // Construct envelope: 2A max charge, 5A max discharge, 60C ceiling, 3.0-4.2V
13 let env: *NxBatterySafetyEnvelope = nx_battery_safety_envelope_new(
14 1, 2000, 5000, 60000, 3000, 4200)
15 let log: *NxBatteryCommandLog = nx_battery_command_log_new(8)
16
17 // Within-envelope charge -- OK
18 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
19 NX_BC_CHARGE, 1500, 3700, log, 1000) != NX_BS_OK { return 4 }
20
21 // Over rate ceiling -- REFUSED
22 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
23 NX_BC_CHARGE, 3000, 3700, log, 2000) != NX_BS_REFUSED_RATE_CEILING { return 5 }
24
25 // Over discharge ceiling
26 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
27 NX_BC_DISCHARGE, 6000, 3700, log, 3000) != NX_BS_REFUSED_RATE_CEILING { return 6 }
28
29 // Voltage envelope violation
30 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
31 NX_BC_CHARGE, 1000, 4500, log, 4000) != NX_BS_REFUSED_VOLTAGE_CEILING { return 7 }
32 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
33 NX_BC_CHARGE, 1000, 2500, log, 4100) != NX_BS_REFUSED_VOLTAGE_CEILING { return 8 }
34
35 // Bad intent for offensive-pattern op
36 if nx_battery_validate_command(env, NX_INTENT_CREATIVE,
37 NX_BC_CHARGE, 1000, 3700, log, 5000) != NX_BS_REFUSED_BAD_INTENT { return 9 }
38
39 // Thermal-runaway pattern: 3 rising thermal commands in window
40 nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
41 NX_BC_THERMAL_TARGET, 30000, 0, log, 6000)
42 nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
43 NX_BC_THERMAL_TARGET, 40000, 0, log, 6100)
44 nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
45 NX_BC_THERMAL_TARGET, 50000, 0, log, 6200)
46 // 4th rising-thermal within window -> REFUSED_THERMAL_RUNAWAY
47 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
48 NX_BC_THERMAL_TARGET, 55000, 0, log, 6300) != NX_BS_REFUSED_THERMAL_RUNAWAY { return 10 }
49
50 // Thermal ceiling (over max) refused
51 if nx_battery_validate_command(env, NX_INTENT_DEFENSIVE,
52 NX_BC_THERMAL_TARGET, 70000, 0, log, 9000) != NX_BS_REFUSED_THERMAL_CEILING { return 11 }
53
54 // Ceiling getters
55 if nx_battery_envelope_ceiling(env, NX_BC_CHARGE) != 2000 { return 12 }
56 if nx_battery_envelope_ceiling(env, NX_BC_DISCHARGE) != 5000 { return 13 }
57 if nx_battery_envelope_ceiling(env, NX_BC_THERMAL_TARGET) != 60000 { return 14 }
58
59 return 0
60}