From 8a84748a8344cfff3a64dfffd40205b126e37e4e Mon Sep 17 00:00:00 2001 From: ruv Date: Mon, 16 Mar 2026 15:12:45 -0400 Subject: [PATCH] fix(firmware): use NVS node_id instead of Kconfig constant (#279) CONFIG_CSI_NODE_ID (compile-time, always 1) was hardcoded in 6 places: CSI frame serialization, compressed frames, vitals packets, WASM output packets, and display UI. NVS provisioning wrote the correct node_id but it was never used at runtime. Fixed all occurrences to use g_nvs_config.node_id: - csi_collector.c: frame header + log message - edge_processing.c: compressed frame + vitals packet - wasm_runtime.c: WASM output packet - display_ui.c: system info display This means --node-id 0/1/2 provisioning now actually works for multi-node mesh deployments. Closes #279 Co-Authored-By: claude-flow --- firmware/esp32-csi-node/main/csi_collector.c | 6 +++--- firmware/esp32-csi-node/main/display_ui.c | 9 ++++----- firmware/esp32-csi-node/main/edge_processing.c | 16 ++++++---------- firmware/esp32-csi-node/main/wasm_runtime.c | 9 ++++----- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/firmware/esp32-csi-node/main/csi_collector.c b/firmware/esp32-csi-node/main/csi_collector.c index a63450dc..e13fabca 100644 --- a/firmware/esp32-csi-node/main/csi_collector.c +++ b/firmware/esp32-csi-node/main/csi_collector.c @@ -117,8 +117,8 @@ size_t csi_serialize_frame(const wifi_csi_info_t *info, uint8_t *buf, size_t buf uint32_t magic = CSI_MAGIC; memcpy(&buf[0], &magic, 4); - /* Node ID */ - buf[4] = (uint8_t)CONFIG_CSI_NODE_ID; + /* Node ID (from NVS runtime config, not compile-time Kconfig) */ + buf[4] = g_nvs_config.node_id; /* Number of antennas */ buf[5] = n_antennas; @@ -273,7 +273,7 @@ void csi_collector_init(void) } ESP_LOGI(TAG, "CSI collection initialized (node_id=%d, channel=%u)", - CONFIG_CSI_NODE_ID, (unsigned)csi_channel); + g_nvs_config.node_id, (unsigned)csi_channel); } /* ---- ADR-029: Channel hopping ---- */ diff --git a/firmware/esp32-csi-node/main/display_ui.c b/firmware/esp32-csi-node/main/display_ui.c index 810e17e8..1ffd9e29 100644 --- a/firmware/esp32-csi-node/main/display_ui.c +++ b/firmware/esp32-csi-node/main/display_ui.c @@ -7,8 +7,11 @@ */ #include "display_ui.h" +#include "nvs_config.h" #include "sdkconfig.h" +extern nvs_config_t g_nvs_config; + #if CONFIG_DISPLAY_ENABLE #include @@ -347,11 +350,7 @@ void display_ui_update(void) { char buf[48]; -#ifdef CONFIG_CSI_NODE_ID - snprintf(buf, sizeof(buf), "Node: %d", CONFIG_CSI_NODE_ID); -#else - snprintf(buf, sizeof(buf), "Node: --"); -#endif + snprintf(buf, sizeof(buf), "Node: %d", g_nvs_config.node_id); lv_label_set_text(s_sys_node, buf); snprintf(buf, sizeof(buf), "Heap: %lu KB free", diff --git a/firmware/esp32-csi-node/main/edge_processing.c b/firmware/esp32-csi-node/main/edge_processing.c index 130b5b59..0911f383 100644 --- a/firmware/esp32-csi-node/main/edge_processing.c +++ b/firmware/esp32-csi-node/main/edge_processing.c @@ -18,7 +18,11 @@ */ #include "edge_processing.h" +#include "nvs_config.h" #include "mmwave_sensor.h" + +/* Runtime config — declared in main.c, loaded from NVS at boot. */ +extern nvs_config_t g_nvs_config; #include "wasm_runtime.h" #include "stream_sender.h" @@ -426,11 +430,7 @@ static void send_compressed_frame(const uint8_t *iq_data, uint16_t iq_len, uint32_t magic = EDGE_COMPRESSED_MAGIC; memcpy(&pkt[0], &magic, 4); -#ifdef CONFIG_CSI_NODE_ID - pkt[4] = (uint8_t)CONFIG_CSI_NODE_ID; -#else - pkt[4] = 0; -#endif + pkt[4] = g_nvs_config.node_id; pkt[5] = channel; memcpy(&pkt[6], &iq_len, 2); memcpy(&pkt[8], &comp_len, 2); @@ -548,11 +548,7 @@ static void send_vitals_packet(void) memset(&pkt, 0, sizeof(pkt)); pkt.magic = EDGE_VITALS_MAGIC; -#ifdef CONFIG_CSI_NODE_ID - pkt.node_id = (uint8_t)CONFIG_CSI_NODE_ID; -#else - pkt.node_id = 0; -#endif + pkt.node_id = g_nvs_config.node_id; pkt.flags = 0; if (s_presence_detected) pkt.flags |= 0x01; diff --git a/firmware/esp32-csi-node/main/wasm_runtime.c b/firmware/esp32-csi-node/main/wasm_runtime.c index f4e667c3..d63aaa49 100644 --- a/firmware/esp32-csi-node/main/wasm_runtime.c +++ b/firmware/esp32-csi-node/main/wasm_runtime.c @@ -12,6 +12,9 @@ #include "sdkconfig.h" #include "wasm_runtime.h" +#include "nvs_config.h" + +extern nvs_config_t g_nvs_config; #if defined(CONFIG_WASM_ENABLE) && defined(WASM3_AVAILABLE) @@ -380,11 +383,7 @@ static void send_wasm_output(uint8_t slot_id) memset(&pkt, 0, sizeof(pkt)); pkt.magic = WASM_OUTPUT_MAGIC; -#ifdef CONFIG_CSI_NODE_ID - pkt.node_id = (uint8_t)CONFIG_CSI_NODE_ID; -#else - pkt.node_id = 0; -#endif + pkt.node_id = g_nvs_config.node_id; pkt.module_id = slot_id; pkt.event_count = n_filtered;