feat(firmware): add mmWave and Swarm Bridge status to LED indicators

- Added LED_STATE_MMWAVE_ERROR, LED_STATE_SWARM_ERROR, and LED_STATE_SWARM_ACTIVE.
- Integrated mmWave initialization health check into LED status.
- Added Swarm Bridge registration, heartbeat, and ingest feedback (Magenta pulse).
- Improved overall system status robustness by skipping errors for unconfigured features.
This commit is contained in:
Mathew Saju 2026-03-23 11:32:54 +05:30
parent f9a08d8aa5
commit 068679ceaa
4 changed files with 51 additions and 4 deletions

View File

@ -81,6 +81,40 @@ static void led_task(void *arg)
led_strip_refresh(s_led_strip);
vTaskDelay(pdMS_TO_TICKS(500));
break;
case LED_STATE_MMWAVE_ERROR:
/* Slow Blinking Yellow */
toggle = !toggle;
if (toggle) {
led_strip_set_pixel(s_led_strip, 0, 100, 100, 0);
} else {
led_strip_clear(s_led_strip);
}
led_strip_refresh(s_led_strip);
vTaskDelay(pdMS_TO_TICKS(1000));
break;
case LED_STATE_SWARM_ERROR:
/* Slow Blinking Magenta */
toggle = !toggle;
if (toggle) {
led_strip_set_pixel(s_led_strip, 0, 100, 0, 100);
} else {
led_strip_clear(s_led_strip);
}
led_strip_refresh(s_led_strip);
vTaskDelay(pdMS_TO_TICKS(1000));
break;
case LED_STATE_SWARM_ACTIVE:
/* Quick Blip Magenta */
led_strip_set_pixel(s_led_strip, 0, 100, 0, 100);
led_strip_refresh(s_led_strip);
vTaskDelay(pdMS_TO_TICKS(100));
led_strip_clear(s_led_strip);
led_strip_refresh(s_led_strip);
s_current_state = LED_STATE_CONNECTED;
break;
}
}
}

View File

@ -17,6 +17,9 @@ typedef enum {
LED_STATE_CONNECTED,
LED_STATE_WIFI_ERROR,
LED_STATE_MOCK_MODE,
LED_STATE_MMWAVE_ERROR,
LED_STATE_SWARM_ERROR,
LED_STATE_SWARM_ACTIVE,
} led_indicator_state_t;
/**

View File

@ -291,8 +291,11 @@ void app_main(void)
ESP_LOGI(TAG, "mmWave sensor: %s (caps=0x%04x)",
mmwave_type_name(mw.type), mw.capabilities);
}
} else {
} else if (mmwave_ret == ESP_ERR_NOT_FOUND) {
ESP_LOGI(TAG, "No mmWave sensor detected (CSI-only mode)");
} else {
ESP_LOGE(TAG, "mmWave sensor init error: %s", esp_err_to_name(mmwave_ret));
led_indicator_set_state(LED_STATE_MMWAVE_ERROR);
}
/* ADR-066: Initialize swarm bridge to Cognitum Seed (if configured). */

View File

@ -19,6 +19,7 @@
#include "esp_app_desc.h"
#include "esp_netif.h"
#include "esp_http_client.h"
#include "led_indicator.h"
static const char *TAG = "swarm";
@ -233,6 +234,7 @@ static void swarm_task(void *arg)
/* Get firmware version string. */
const esp_app_desc_t *app = esp_app_get_description();
const char *fw_ver = app ? app->version : "unknown";
ESP_LOGI(TAG, "Firmware version: %s", fw_ver);
/* Get local IP. */
char ip_str[16];
@ -251,8 +253,10 @@ static void swarm_task(void *arg)
if (swarm_post_json(client, json, len) == ESP_OK) {
s_cnt_regs++;
ESP_LOGI(TAG, "registered node %u with seed (id=%lu)", s_node_id, (unsigned long)reg_id);
led_indicator_set_state(LED_STATE_SWARM_ACTIVE);
} else {
ESP_LOGW(TAG, "registration failed — will retry on next heartbeat");
led_indicator_set_state(LED_STATE_SWARM_ERROR);
}
}
@ -278,15 +282,12 @@ static void swarm_task(void *arg)
xSemaphoreGive(s_mutex);
uint32_t uptime_s = (uint32_t)(esp_timer_get_time() / 1000000ULL);
uint32_t free_heap = esp_get_free_heap_size();
uint32_t ts = (uint32_t)(esp_timer_get_time() / 1000ULL);
/* ---- Heartbeat ---- */
if ((now - last_heartbeat) >= pdMS_TO_TICKS(s_cfg.heartbeat_sec * 1000U)) {
last_heartbeat = now;
bool presence = vit_valid && (vit.flags & 0x01);
/* Heartbeat ID: node_id * 1000000 + 100000 + ts_sec */
uint32_t hb_id = (uint32_t)s_node_id * 1000000U + 100000U + (uptime_s % 100000U);
char json[SWARM_JSON_BUF];
@ -297,6 +298,9 @@ static void swarm_task(void *arg)
if (swarm_post_json(client, json, len) == ESP_OK) {
s_cnt_heartbeats++;
led_indicator_set_state(LED_STATE_SWARM_ACTIVE);
} else {
led_indicator_set_state(LED_STATE_SWARM_ERROR);
}
}
@ -316,6 +320,9 @@ static void swarm_task(void *arg)
if (swarm_post_json(client, json, len) == ESP_OK) {
s_cnt_ingests++;
led_indicator_set_state(LED_STATE_SWARM_ACTIVE);
} else {
led_indicator_set_state(LED_STATE_SWARM_ERROR);
}
}
}