feat(api): system/info sagt, ob der sACN-Empfaenger laeuft
Ein toter Empfangs-Task war von aussen nicht von "es sendet gerade niemand" zu unterscheiden: beides meldete nur active=false. "multicast" half nicht weiter - es zeigt den gemerkten Erfolg des LETZTEN Beitritts und bleibt true, auch wenn der Socket laengst zu ist. Genau dieser Fall trat am Montana-Black-Shield auf (2026-09-26, direkt nach Migration und Onboarding) und hat eine halbe Stunde Suche gekostet, an deren Ende die Ursache immer noch offen war. nl_sacn_running() gab es da schon, es wurde nur nirgends ausgeliefert. Zwei Tests: der bestehende prueft running=true mit, ein neuer haelt den toten Task fest.
This commit is contained in:
@@ -275,6 +275,12 @@ static void handle_info(const nl_api_ctx_t *ctx, nl_api_response_t *resp)
|
||||
* der Abnahme nicht zu unterscheiden, ob die Lampe nicht beitritt oder das WLAN die
|
||||
* Gruppe nicht weiterreicht - Unicast laeuft in beiden Faellen. */
|
||||
cJSON_AddBoolToObject(sa, "multicast", in.sacn_joined);
|
||||
/* Ob der Empfangs-Task ueberhaupt laeuft. Ohne dieses Feld war ein toter Task von
|
||||
* "es sendet gerade niemand" nicht zu unterscheiden - beides meldete nur
|
||||
* active=false, und "multicast" bleibt vom letzten gelungenen Beitritt true, auch
|
||||
* wenn der Socket laengst zu ist. Das hat beim Montana-Black-Shield eine halbe
|
||||
* Stunde Suche gekostet. */
|
||||
cJSON_AddBoolToObject(sa, "running", in.sacn_running);
|
||||
}
|
||||
reply_json(resp, 200, o);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ typedef struct {
|
||||
const char *last_ota_error; /* NULL until OTA exists */
|
||||
bool sacn_active; /* true, solange die Lampe ferngesteuert wird */
|
||||
bool sacn_joined; /* Multicast-Gruppe des Universe beigetreten */
|
||||
bool sacn_running; /* Empfangs-Task lebt und haelt einen Socket */
|
||||
} nl_sys_info_t;
|
||||
|
||||
/* Everything the API needs from the application; implemented by src/sys/nl_app_api.c. */
|
||||
|
||||
@@ -97,6 +97,7 @@ static void get_info(nl_sys_info_t *out)
|
||||
nl_app_unlock();
|
||||
/* Ausserhalb der Sperre: nl_sacn haelt den Wert selbst, nl_dmx ist nicht beteiligt. */
|
||||
out->sacn_joined = nl_sacn_joined();
|
||||
out->sacn_running = nl_sacn_running();
|
||||
nl_wifi_status(&w);
|
||||
out->wifi_mode = w.mode;
|
||||
memcpy(out->ssid, w.ssid, sizeof out->ssid);
|
||||
|
||||
Reference in New Issue
Block a user