@@ -20,6 +20,7 @@ mod flash;
2020mod snapshot;
2121mod proof;
2222mod transport;
23+ mod wal;
2324
2425use cortex_m_rt:: entry;
2526use embedded_alloc:: Heap ;
@@ -54,6 +55,15 @@ const D: usize = 16;
5455const MAX_NODES : usize = 1000 ;
5556const MAX_EDGES : usize = 2048 ;
5657
58+ #[ derive( PartialEq ) ]
59+ enum BootMode {
60+ SelfTest ,
61+ WalReplay ,
62+ }
63+
64+ // Set Firmware Mode here
65+ const MODE : BootMode = BootMode :: WalReplay ;
66+
5767// --- 2. Entry Point ---
5868#[ entry]
5969fn main ( ) -> ! {
@@ -66,24 +76,60 @@ fn main() -> ! {
6676 // B. Initialize Kernel
6777 let mut state = KernelState :: < MAX_RECORDS , D , MAX_NODES , MAX_EDGES > :: new ( ) ;
6878
69- // C. Deterministic Test Vector
70- // Q16.16 values:
71- // 1.0 -> 65536
72- // 0.5 -> 32768
73- // -1.0 -> -65536
74- let mut vector = FxpVector :: < D > :: new_zeros ( ) ;
75- vector. data [ 0 ] = FxpScalar ( 65536 ) ; // 1.0
76- vector. data [ 1 ] = FxpScalar ( 0 ) ; // 0.0
77- vector. data [ 2 ] = FxpScalar ( -65536 ) ; // -1.0
78- vector. data [ 3 ] = FxpScalar ( 32768 ) ; // 0.5
79-
80- // D. Apply Command (Insert)
81- let id = RecordId ( 0 ) ;
82- let cmd = Command :: InsertRecord { id, vector } ;
83-
84- match state. apply ( & cmd) {
85- Ok ( _) => { }
86- Err ( _) => cortex_m:: asm:: bkpt ( ) ,
79+ if MODE == BootMode :: SelfTest {
80+ // C. Deterministic Test Vector (Manual)
81+ // Q16.16 values: 1.0 -> 65536, 0.5 -> 32768, -1.0 -> -65536
82+ let mut vector = FxpVector :: < D > :: new_zeros ( ) ;
83+ vector. data [ 0 ] = FxpScalar ( 65536 ) ; // 1.0
84+ vector. data [ 1 ] = FxpScalar ( 0 ) ; // 0.0
85+ vector. data [ 2 ] = FxpScalar ( -65536 ) ; // -1.0
86+ vector. data [ 3 ] = FxpScalar ( 32768 ) ; // 0.5
87+
88+ let id = RecordId ( 0 ) ;
89+ let cmd = Command :: InsertRecord { id, vector } ;
90+
91+ match state. apply ( & cmd) {
92+ Ok ( _) => { }
93+ Err ( _) => cortex_m:: asm:: bkpt ( ) ,
94+ }
95+ } else {
96+ // Mode B: WAL Replay
97+ // In production: Read from UART buffer.
98+ // In simulation: Use a hardcoded buffer representing the same command.
99+ // Validates `wal.rs` logic.
100+
101+ // Construct WAL Packet:
102+ // Opcode (0x00) | ID (0) | Dim (16) | [1.0, 0.0, -1.0, 0.5 ...]
103+ // 1 + 4 + 2 + (16 * 4) = 7 + 64 = 71 bytes.
104+ let mut wal_data: [ u8 ; 71 ] = [ 0 ; 71 ] ;
105+ let mut idx = 0 ;
106+
107+ // Opcode
108+ wal_data[ idx] = 0x00 ; idx += 1 ;
109+ // ID (0)
110+ wal_data[ idx..idx+4 ] . copy_from_slice ( & 0u32 . to_le_bytes ( ) ) ; idx += 4 ;
111+ // Dim (16)
112+ wal_data[ idx..idx+2 ] . copy_from_slice ( & ( D as u16 ) . to_le_bytes ( ) ) ; idx += 2 ;
113+
114+ // Data
115+ // 0: 65536
116+ wal_data[ idx..idx+4 ] . copy_from_slice ( & 65536i32 . to_le_bytes ( ) ) ; idx += 4 ;
117+ // 1: 0
118+ wal_data[ idx..idx+4 ] . copy_from_slice ( & 0i32 . to_le_bytes ( ) ) ; idx += 4 ;
119+ // 2: -65536
120+ wal_data[ idx..idx+4 ] . copy_from_slice ( & ( -65536i32 ) . to_le_bytes ( ) ) ; idx += 4 ;
121+ // 3: 32768
122+ wal_data[ idx..idx+4 ] . copy_from_slice ( & 32768i32 . to_le_bytes ( ) ) ; idx += 4 ;
123+
124+ // Remaining 12 are 0 (already 0 init)
125+
126+ match wal:: apply_wal_log ( & mut state, & wal_data) {
127+ Ok ( _) => { } ,
128+ Err ( _) => {
129+ transport:: export_error ( b"WAL_FAIL" ) ;
130+ cortex_m:: asm:: bkpt ( ) ;
131+ } ,
132+ }
87133 }
88134
89135 // -----------------------------------------------------------------------
0 commit comments