upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/main/config.c
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-05-18 22:49:34 +0530
committerYour Name <you@example.com>2026-05-18 22:49:34 +0530
commiteb2ae72d91a4b2ec0333a2e6d18eeeeee6b60464 (patch)
treeeff643bcd00ed44b5d7fd93084be1391970d6bd4 /main/config.c
parent910fe47b2ed1284d93ff4d274f5c2341cb0d2d0b (diff)
feat: add WiFi setup state machine + config_add_wifi with unit tests
Diffstat (limited to 'main/config.c')
-rw-r--r--main/config.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/main/config.c b/main/config.c
index 6753f40..32ae30e 100644
--- a/main/config.c
+++ b/main/config.c
@@ -320,3 +320,60 @@ void tollgate_config_derive_unique(tollgate_config_t *cfg)
320 ESP_LOGI(TAG, "Unique config derived from nsec: SSID='%s', AP_IP=%s", 320 ESP_LOGI(TAG, "Unique config derived from nsec: SSID='%s', AP_IP=%s",
321 cfg->ap_ssid, cfg->ap_ip_str); 321 cfg->ap_ssid, cfg->ap_ip_str);
322} 322}
323
324esp_err_t tollgate_config_add_wifi(const char *ssid, const char *password) {
325 if (!ssid || !password) return ESP_ERR_INVALID_ARG;
326 if (g_config.network_count >= TOLLGATE_MAX_WIFI_NETWORKS) return ESP_ERR_NO_MEM;
327
328 strncpy(g_config.networks[g_config.network_count].ssid, ssid,
329 sizeof(g_config.networks[g_config.network_count].ssid) - 1);
330 strncpy(g_config.networks[g_config.network_count].password, password,
331 sizeof(g_config.networks[g_config.network_count].password) - 1);
332 g_config.network_count++;
333
334 cJSON *root = cJSON_CreateObject();
335 cJSON *nsec = cJSON_CreateString(g_config.nsec);
336 cJSON_AddItemToObject(root, "nsec", nsec);
337
338 cJSON *networks = cJSON_CreateArray();
339 for (int i = 0; i < g_config.network_count; i++) {
340 cJSON *net = cJSON_CreateObject();
341 cJSON_AddStringToObject(net, "ssid", g_config.networks[i].ssid);
342 cJSON_AddStringToObject(net, "password", g_config.networks[i].password);
343 cJSON_AddItemToArray(networks, net);
344 }
345 cJSON_AddItemToObject(root, "wifi_networks", networks);
346
347 if (g_config.ap_password[0])
348 cJSON_AddStringToObject(root, "ap_password", g_config.ap_password);
349 cJSON_AddStringToObject(root, "mint_url", g_config.mint_url);
350 cJSON_AddNumberToObject(root, "price_per_step", g_config.price_per_step);
351 cJSON_AddNumberToObject(root, "step_size_ms", g_config.step_size_ms);
352
353 if (g_config.metric[0])
354 cJSON_AddStringToObject(root, "metric", g_config.metric);
355
356 cJSON_AddStringToObject(root, "nostr_geohash", g_config.nostr_geohash);
357
358 cJSON *relays = cJSON_CreateArray();
359 for (int i = 0; i < g_config.nostr_relay_count; i++) {
360 cJSON_AddItemToArray(relays, cJSON_CreateString(g_config.nostr_relays[i]));
361 }
362 cJSON_AddItemToObject(root, "nostr_relays", relays);
363 cJSON_AddNumberToObject(root, "nostr_publish_interval_s", g_config.nostr_publish_interval_s);
364
365 char *json_str = cJSON_Print(root);
366 cJSON_Delete(root);
367
368 FILE *f = fopen("/spiffs/config.json", "w");
369 if (!f) {
370 free(json_str);
371 return ESP_FAIL;
372 }
373 fputs(json_str, f);
374 fclose(f);
375 free(json_str);
376
377 ESP_LOGI(TAG, "Added WiFi network '%s' to config (total: %d)", ssid, g_config.network_count);
378 return ESP_OK;
379}