more on build

This commit is contained in:
Bob 2025-12-11 17:00:32 -08:00
parent 62b26be138
commit 2b6de3424d
2 changed files with 122 additions and 60 deletions

View File

@ -14,26 +14,28 @@
#include "esp_check.h" #include "esp_check.h"
#include "wifi_cfg.h" #include "wifi_cfg.h"
#include "cmd_transport.h" // Now uses the transport component #include "cmd_transport.h"
// GUARDED INCLUDE
#ifdef CONFIG_ESP_WIFI_CSI_ENABLED #ifdef CONFIG_ESP_WIFI_CSI_ENABLED
#include "csi_manager.h" // For CSI enable/disable #include "csi_manager.h"
#endif #endif
static const char *TAG = "wifi_cfg"; static const char *TAG = "wifi_cfg";
static esp_netif_t *sta_netif = NULL; static esp_netif_t *sta_netif = NULL;
static bool cfg_dhcp = true; static bool cfg_dhcp = true;
// --- Helper Functions (Preserved) --- // --- NVS Helper ---
static esp_err_t nvs_set_str2(nvs_handle_t h, const char *key, const char *val){ static esp_err_t nvs_set_str2(nvs_handle_t h, const char *key, const char *val){
return val ? nvs_set_str(h, key, val) : nvs_erase_key(h, key); return val ? nvs_set_str(h, key, val) : nvs_erase_key(h, key);
} }
static void save_cfg(const char* ssid, const char* pass, const char* ip, const char* mask, const char* gw, bool dhcp, const char* band, const char* bw, const char* powersave, const char* mode, uint8_t mon_ch){ // --- NVS Save Functions ---
// 1. Save Network Settings (Namespace: "netcfg")
static void save_net_cfg(const char* ssid, const char* pass, const char* ip, const char* mask, const char* gw, bool dhcp, const char* band, const char* bw, const char* powersave, const char* mode, uint8_t mon_ch){
nvs_handle_t h; nvs_handle_t h;
if (nvs_open("netcfg", NVS_READWRITE, &h) != ESP_OK) return; if (nvs_open("netcfg", NVS_READWRITE, &h) != ESP_OK) return;
if (ssid) nvs_set_str2(h, "ssid", ssid); if (ssid) nvs_set_str2(h, "ssid", ssid);
if (pass) nvs_set_str2(h, "pass", pass); if (pass) nvs_set_str2(h, "pass", pass);
if (ip) nvs_set_str2(h, "ip", ip); if (ip) nvs_set_str2(h, "ip", ip);
@ -45,12 +47,35 @@ static void save_cfg(const char* ssid, const char* pass, const char* ip, const c
if (mode) nvs_set_str2(h, "mode", mode); if (mode) nvs_set_str2(h, "mode", mode);
nvs_set_u8(h, "mon_ch", mon_ch); nvs_set_u8(h, "mon_ch", mon_ch);
nvs_set_u8(h, "dhcp", dhcp ? 1 : 0); nvs_set_u8(h, "dhcp", dhcp ? 1 : 0);
nvs_commit(h); nvs_commit(h);
nvs_close(h); nvs_close(h);
cfg_dhcp = dhcp; cfg_dhcp = dhcp;
ESP_LOGI(TAG, "Config saved to NVS: SSID=%s Mode=%s MonCh=%d", ssid?ssid:"", mode?mode:"STA", mon_ch); ESP_LOGI(TAG, "Net Config Saved: SSID=%s IP=%s DHCP=%d", ssid?ssid:"", ip?ip:"", dhcp);
} }
// 2. Save Iperf Settings (Namespace: "storage") -> Matches iperf.c keys
static void save_iperf_cfg(const char* dst_ip, const char* role, const char* proto, uint32_t period, uint32_t burst, uint32_t len, uint32_t port, bool enable){
nvs_handle_t h;
if (nvs_open("storage", NVS_READWRITE, &h) != ESP_OK) return;
// Note: Keys must match what iperf.c reads (NVS_KEY_IPERF_DST_IP etc)
if (dst_ip && dst_ip[0]) nvs_set_str(h, "iperf_dst_ip", dst_ip);
if (role && role[0]) nvs_set_str(h, "iperf_role", role);
if (proto && proto[0]) nvs_set_str(h, "iperf_proto", proto);
nvs_set_u32(h, "iperf_period", period);
nvs_set_u32(h, "iperf_burst", burst);
nvs_set_u32(h, "iperf_len", len);
nvs_set_u32(h, "iperf_port", port);
nvs_set_u8(h, "iperf_enabled", enable ? 1 : 0);
nvs_commit(h);
nvs_close(h);
ESP_LOGI(TAG, "Iperf Config Saved: Target=%s Role=%s Period=%lu", dst_ip?dst_ip:"", role?role:"", (unsigned long)period);
}
// --- Load Logic (Network Only - Iperf loads itself) ---
static bool load_cfg(char* ssid, size_t ssz, char* pass, size_t psz, static bool load_cfg(char* ssid, size_t ssz, char* pass, size_t psz,
char* ip, size_t isz, char* mask, size_t msz, char* gw, size_t gsz, char* ip, size_t isz, char* mask, size_t msz, char* gw, size_t gsz,
char* band, size_t bsz, char* bw, size_t bwsz, char* powersave, size_t pssz, char* band, size_t bsz, char* bw, size_t bwsz, char* powersave, size_t pssz,
@ -163,7 +188,6 @@ bool wifi_cfg_apply_from_nvs(void) {
esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_set_mode(WIFI_MODE_STA);
// Protocol selection
#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6 #if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6
wifi_protocols_t protocols = { wifi_protocols_t protocols = {
.ghz_2g = WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N, .ghz_2g = WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N,
@ -179,7 +203,6 @@ bool wifi_cfg_apply_from_nvs(void) {
if (!dhcp && ip[0]) apply_ip_static(ip, mask, gw); if (!dhcp && ip[0]) apply_ip_static(ip, mask, gw);
else if (sta_netif) esp_netif_dhcpc_start(sta_netif); else if (sta_netif) esp_netif_dhcpc_start(sta_netif);
// Bandwidth selection
#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6 #if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6
wifi_bandwidths_t bandwidths = {.ghz_2g = WIFI_BW_HT20, .ghz_5g = WIFI_BW_HT20}; wifi_bandwidths_t bandwidths = {.ghz_2g = WIFI_BW_HT20, .ghz_5g = WIFI_BW_HT20};
if (strcmp(bw, "VHT80") == 0) { bandwidths.ghz_2g = WIFI_BW_HT40; bandwidths.ghz_5g = WIFI_BW80; } if (strcmp(bw, "VHT80") == 0) { bandwidths.ghz_2g = WIFI_BW_HT40; bandwidths.ghz_5g = WIFI_BW80; }
@ -193,7 +216,6 @@ bool wifi_cfg_apply_from_nvs(void) {
esp_wifi_start(); esp_wifi_start();
// Power Save
wifi_ps_type_t ps_mode = WIFI_PS_NONE; wifi_ps_type_t ps_mode = WIFI_PS_NONE;
if (strcmp(powersave, "MIN") == 0) ps_mode = WIFI_PS_MIN_MODEM; if (strcmp(powersave, "MIN") == 0) ps_mode = WIFI_PS_MIN_MODEM;
else if (strcmp(powersave, "MAX") == 0) ps_mode = WIFI_PS_MAX_MODEM; else if (strcmp(powersave, "MAX") == 0) ps_mode = WIFI_PS_MAX_MODEM;
@ -203,86 +225,126 @@ bool wifi_cfg_apply_from_nvs(void) {
return true; return true;
} }
// --- Command Listener Logic --- // --- Parsing State ---
typedef struct {
// Network
char ssid[64];
char pass[64];
char ip[32];
char mask[32];
char gw[32];
char band[16];
char bw[16];
char powersave[16];
char mode[16];
uint8_t mon_ch;
bool dhcp;
bool csi_enable;
static void on_cfg_line(const char *line, char *ssid, char *pass, char *ip, char *mask, char *gw, char *band, char *bw, char *powersave, char *mode, uint8_t *mon_ch, bool *dhcp, bool *csi_enable){ // Iperf
if (strncmp(line, "SSID:",5)==0){ strncpy(ssid, line+5, 63); ssid[63]=0; return; } char iperf_dest[32];
if (strncmp(line, "PASS:",5)==0){ strncpy(pass, line+5, 63); pass[63]=0; return; } char iperf_role[16];
if (strncmp(line, "IP:",3)==0){ strncpy(ip, line+3, 31); ip[31]=0; return; } char iperf_proto[8];
if (strncmp(line, "MASK:",5)==0){ strncpy(mask, line+5, 31); mask[31]=0; return; } uint32_t iperf_period_us;
if (strncmp(line, "GW:",3)==0){ strncpy(gw, line+3, 31); gw[31]=0; return; } uint32_t iperf_burst;
if (strncmp(line, "BAND:",5)==0){ strncpy(band, line+5, 15); band[15]=0; return; } uint32_t iperf_len;
if (strncmp(line, "BW:",3)==0){ strncpy(bw, line+3, 15); bw[15]=0; return; } uint32_t iperf_port;
if (strncmp(line, "POWERSAVE:",10)==0){ strncpy(powersave, line+10, 15); powersave[15]=0; return; } bool iperf_enable;
if (strncmp(line, "MODE:",5)==0){ strncpy(mode, line+5, 15); mode[15]=0; return; } } cfg_state_t;
if (strncmp(line, "MON_CH:",7)==0){ *mon_ch = atoi(line+7); return; }
if (strncmp(line, "DHCP:",5)==0){ *dhcp = atoi(line+5) ? true:false; return; } static void on_cfg_line(const char *line, cfg_state_t *s){
// Network Parsing
if (strncmp(line, "SSID:",5)==0){ strncpy(s->ssid, line+5, 63); s->ssid[63]=0; return; }
if (strncmp(line, "PASS:",5)==0){ strncpy(s->pass, line+5, 63); s->pass[63]=0; return; }
if (strncmp(line, "IP:",3)==0){ strncpy(s->ip, line+3, 31); s->ip[31]=0; return; }
if (strncmp(line, "MASK:",5)==0){ strncpy(s->mask, line+5, 31); s->mask[31]=0; return; }
if (strncmp(line, "GW:",3)==0){ strncpy(s->gw, line+3, 31); s->gw[31]=0; return; }
if (strncmp(line, "BAND:",5)==0){ strncpy(s->band, line+5, 15); s->band[15]=0; return; }
if (strncmp(line, "BW:",3)==0){ strncpy(s->bw, line+3, 15); s->bw[15]=0; return; }
if (strncmp(line, "POWERSAVE:",10)==0){ strncpy(s->powersave, line+10, 15); s->powersave[15]=0; return; }
if (strncmp(line, "MODE:",5)==0){ strncpy(s->mode, line+5, 15); s->mode[15]=0; return; }
if (strncmp(line, "MON_CH:",7)==0){ s->mon_ch = atoi(line+7); return; }
if (strncmp(line, "DHCP:",5)==0){ s->dhcp = atoi(line+5) ? true:false; return; }
// Iperf Parsing (Matches Python Script Keys)
// Support both DEST and DST to be safe
if (strncmp(line, "IPERF_DEST_IP:", 14) == 0) { strncpy(s->iperf_dest, line+14, 31); s->iperf_dest[31]=0; return; }
if (strncmp(line, "IPERF_DST_IP:", 13) == 0) { strncpy(s->iperf_dest, line+13, 31); s->iperf_dest[31]=0; return; }
if (strncmp(line, "IPERF_ROLE:", 11) == 0) { strncpy(s->iperf_role, line+11, 15); s->iperf_role[15]=0; return; }
if (strncmp(line, "IPERF_PROTO:", 12) == 0) { strncpy(s->iperf_proto, line+12, 7); s->iperf_proto[7]=0; return; }
if (strncmp(line, "IPERF_PERIOD_US:", 16) == 0) { s->iperf_period_us = atoi(line+16); return; }
if (strncmp(line, "IPERF_BURST:", 12) == 0) { s->iperf_burst = atoi(line+12); return; }
if (strncmp(line, "IPERF_LEN:", 10) == 0) { s->iperf_len = atoi(line+10); return; }
if (strncmp(line, "IPERF_PORT:", 11) == 0) { s->iperf_port = atoi(line+11); return; }
if (strncmp(line, "IPERF_ENABLED:", 14) == 0) { s->iperf_enable = atoi(line+14) ? true:false; return; }
// GUARDED CSI PARSING
#ifdef CONFIG_ESP_WIFI_CSI_ENABLED #ifdef CONFIG_ESP_WIFI_CSI_ENABLED
if (strncmp(line, "CSI:",4)==0){ *csi_enable = atoi(line+4) ? true:false; return; } if (strncmp(line, "CSI:",4)==0){ s->csi_enable = atoi(line+4) ? true:false; return; }
#endif #endif
} }
static bool wifi_cfg_cmd_handler(const char *line, cmd_reply_func_t reply_func, void *reply_ctx) { static bool wifi_cfg_cmd_handler(const char *line, cmd_reply_func_t reply_func, void *reply_ctx) {
static bool in_cfg = false; static bool in_cfg = false;
static char ssid[64]={0}, pass[64]={0}, ip[32]={0}, mask[32]={0}, gw[32]={0}; static cfg_state_t s;
static char band[16]={0}, bw[16]={0}, powersave[16]={0}, mode[16]={0};
static uint8_t mon_ch = 36;
static bool dhcp = true;
static bool csi_enable = false;
if (!in_cfg) { if (!in_cfg) {
if (strcmp(line, "CFG") == 0) { if (strcmp(line, "CFG") == 0) {
in_cfg = true; in_cfg = true;
// Reset buffers // Clear all buffers
ssid[0]=0; pass[0]=0; ip[0]=0; mask[0]=0; gw[0]=0; memset(&s, 0, sizeof(s));
band[0]=0; bw[0]=0; powersave[0]=0; mode[0]=0; // Set Defaults
mon_ch = 36; dhcp = true; csi_enable = false; s.mon_ch = 36;
return true; // Handled s.dhcp = true;
s.csi_enable = false;
s.iperf_period_us = 10000;
s.iperf_burst = 1;
s.iperf_len = 1470;
s.iperf_port = 5001;
s.iperf_enable = true;
strcpy(s.iperf_dest, "192.168.1.50");
strcpy(s.iperf_role, "CLIENT");
strcpy(s.iperf_proto, "UDP");
return true;
} }
return false; // Not handled return false;
} }
// Inside CFG block
if (strcmp(line, "END") == 0) { if (strcmp(line, "END") == 0) {
// Apply Defaults // Apply Network Defaults if missing
if (!band[0]) strcpy(band, "2.4G"); if (!s.band[0]) strcpy(s.band, "2.4G");
if (!bw[0]) strcpy(bw, "HT20"); if (!s.bw[0]) strcpy(s.bw, "HT20");
if (!powersave[0]) strcpy(powersave, "NONE"); if (!s.powersave[0]) strcpy(s.powersave, "NONE");
if (!mode[0]) strcpy(mode, "STA"); if (!s.mode[0]) strcpy(s.mode, "STA");
save_cfg(ssid, pass, ip, mask, gw, dhcp, band, bw, powersave, mode, mon_ch); // 1. Save Network
save_net_cfg(s.ssid, s.pass, s.ip, s.mask, s.gw, s.dhcp, s.band, s.bw, s.powersave, s.mode, s.mon_ch);
// GUARDED SAVE LOGIC // 2. Save Iperf
save_iperf_cfg(s.iperf_dest, s.iperf_role, s.iperf_proto, s.iperf_period_us, s.iperf_burst, s.iperf_len, s.iperf_port, s.iperf_enable);
// 3. Save CSI
#ifdef CONFIG_ESP_WIFI_CSI_ENABLED #ifdef CONFIG_ESP_WIFI_CSI_ENABLED
// Save CSI enable state csi_mgr_save_enable_state(s.csi_enable);
esp_err_t err = csi_mgr_save_enable_state(csi_enable);
if (err == ESP_OK) {
printf("CSI enable state saved: %s\n", csi_enable ? "ENABLED" : "DISABLED");
} else {
printf("Failed to save CSI state: %s\n", esp_err_to_name(err));
}
#endif #endif
if (reply_func) reply_func("OK\n", reply_ctx); if (reply_func) reply_func("Config saved. Reconnecting...\n", reply_ctx);
// Apply changes immediately
wifi_cfg_apply_from_nvs(); wifi_cfg_apply_from_nvs();
in_cfg = false; in_cfg = false;
return true; return true;
} }
on_cfg_line(line, ssid, pass, ip, mask, gw, band, bw, powersave, mode, &mon_ch, &dhcp, &csi_enable); on_cfg_line(line, &s);
return true; return true;
} }
void wifi_cfg_init(void){ void wifi_cfg_init(void){
nvs_flash_init(); nvs_flash_init();
// Init the shared transport (starts UART/USB tasks)
cmd_transport_init(); cmd_transport_init();
// Register our callback to catch "CFG" blocks
cmd_transport_register_listener(wifi_cfg_cmd_handler); cmd_transport_register_listener(wifi_cfg_cmd_handler);
} }

View File

@ -330,7 +330,7 @@ class UnifiedDeployWorker:
f"IPERF_PERIOD_US:{period_us}", f"IPERF_PERIOD_US:{period_us}",
f"IPERF_ROLE:{role_str}", f"IPERF_ROLE:{role_str}",
f"IPERF_PROTO:{self.args.iperf_proto}", f"IPERF_PROTO:{self.args.iperf_proto}",
f"IPERF_DEST_IP:{self.args.iperf_dest_ip}", f"IPERF_DST_IP:{self.args.iperf_dest_ip}",
f"IPERF_PORT:{self.args.iperf_port}", f"IPERF_PORT:{self.args.iperf_port}",
f"IPERF_BURST:{self.args.iperf_burst}", f"IPERF_BURST:{self.args.iperf_burst}",
f"IPERF_LEN:{self.args.iperf_len}", f"IPERF_LEN:{self.args.iperf_len}",
@ -338,13 +338,13 @@ class UnifiedDeployWorker:
"END" "END"
] ]
# CHANGED: Send line-by-line with a small delay to prevent UART FIFO overflow # CHANGED: Send line-by-line with a delay to prevent UART FIFO overflow
for line in config_lines: for line in config_lines:
cmd = line + "\r\n" cmd = line + "\r\n"
writer.write(cmd.encode('utf-8')) writer.write(cmd.encode('utf-8'))
await writer.drain() await writer.drain()
# 50ms delay allows the ESP32 (running at 115200 baud) to process the line # 50ms delay allows the ESP32 (running at 115200 baud) to process the line
await asyncio.sleep(0.05) await asyncio.sleep(0.1)
async def _verify_configuration(self, reader): async def _verify_configuration(self, reader):
timeout = time.time() + 15 timeout = time.time() + 15