Skip to content

Commit 9814d2b

Browse files
authored
fix(server): correct RSSI byte offset in frame parser (#332)
The server parsed rssi from buf[14] and noise_floor from buf[15], but the firmware (csi_collector.c) packs them at buf[16] and buf[17]: Firmware: n_subcarriers=u16(6-7) freq=u32(8-11) seq=u32(12-15) rssi=i8(16) Server: n_subcarriers=u8(6) freq=u16(8-9) seq=u32(10-13) rssi=i8(14) ← WRONG This caused RSSI to read the high byte of the sequence counter instead of the actual signed RSSI value, producing positive values (e.g., +9) instead of the correct negative values (e.g., -46 dBm). Added inline documentation of the frame layout matching csi_collector.c. Closes #332
1 parent 7f02c87 commit 9814d2b

1 file changed

Lines changed: 17 additions & 5 deletions

File tree

  • rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/src

rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/src/main.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -565,13 +565,25 @@ fn parse_esp32_frame(buf: &[u8]) -> Option<Esp32Frame> {
565565
return None;
566566
}
567567

568+
// Frame layout (must match firmware csi_collector.c):
569+
// [0..3] magic (u32 LE)
570+
// [4] node_id (u8)
571+
// [5] n_antennas (u8)
572+
// [6..7] n_subcarriers (u16 LE)
573+
// [8..11] freq_mhz (u32 LE)
574+
// [12..15] sequence (u32 LE)
575+
// [16] rssi (i8)
576+
// [17] noise_floor (i8)
577+
// [18..19] reserved
578+
// [20..] I/Q data
568579
let node_id = buf[4];
569580
let n_antennas = buf[5];
570-
let n_subcarriers = buf[6];
571-
let freq_mhz = u16::from_le_bytes([buf[8], buf[9]]);
572-
let sequence = u32::from_le_bytes([buf[10], buf[11], buf[12], buf[13]]);
573-
let rssi = buf[14] as i8;
574-
let noise_floor = buf[15] as i8;
581+
let n_subcarriers_u16 = u16::from_le_bytes([buf[6], buf[7]]);
582+
let n_subcarriers = n_subcarriers_u16 as u8; // truncate to u8 for Esp32Frame compat
583+
let freq_mhz = u16::from_le_bytes([buf[8], buf[9]]); // low 16 bits of u32
584+
let sequence = u32::from_le_bytes([buf[12], buf[13], buf[14], buf[15]]);
585+
let rssi = buf[16] as i8; // #332: was buf[14], 2 bytes off
586+
let noise_floor = buf[17] as i8; // #332: was buf[15], 2 bytes off
575587

576588
let iq_start = 20;
577589
let n_pairs = n_antennas as usize * n_subcarriers as usize;

0 commit comments

Comments
 (0)