fix(sacn): ein nicht gestarteter Empfangs-Task darf die Lampe nicht unbrauchbar machen
nl_sacn_beat ist ein Pflichtterm in der Wachhund-Bedingung. Schlug tls_os_task_create() fehl, bewegte sich der Herzschlag nie, der Wachhund wurde nie gefuettert und die Lampe setzte sich alle 20 s zurueck - ohne Weg hinein. Ein Zusatzdienst muss zu "kein sACN" degradieren, nicht zu "keine Lampe". nl_sacn_running() meldet den Fehlschlag, app_main merkt ihn sich einmal als sacn_required, und eine Zeile auf der Konsole macht ihn sichtbar.
This commit is contained in:
+8
-2
@@ -164,6 +164,7 @@ static void app_task(void *arg)
|
||||
nl_light_state_t last, initial, pending;
|
||||
bool have_last, after_ota;
|
||||
bool light_alive = false, net_alive = false, http_alive = false, sacn_alive = false;
|
||||
bool sacn_required;
|
||||
uint8_t boots;
|
||||
uint32_t boot_ms, light_seen, net_seen, http_seen, sacn_seen;
|
||||
|
||||
@@ -243,6 +244,10 @@ static void app_task(void *arg)
|
||||
nl_sacn_apply_settings(&sacn_boot);
|
||||
}
|
||||
nl_sacn_start();
|
||||
/* Nur ein tatsaechlich gestarteter Task darf den Wachhund mitbestimmen: ohne Task
|
||||
* bewegt sich nl_sacn_beat nie, die Bedingung waere nie erfuellt und die Lampe liefe
|
||||
* in eine endlose Reset-Schleife. Ein Zusatzdienst faellt dann eben aus. */
|
||||
sacn_required = nl_sacn_running();
|
||||
|
||||
light_seen = s_light_beat;
|
||||
net_seen = nl_net_beat;
|
||||
@@ -278,7 +283,8 @@ static void app_task(void *arg)
|
||||
|
||||
/* Feed the watchdog only once the light, network, HTTP and sACN tasks have each
|
||||
* made progress since the last feed - a single stuck task (e.g. nl_app_lock() held
|
||||
* forever) must still starve the watchdog, not just the light task. */
|
||||
* forever) must still starve the watchdog, not just the light task. Ausnahme: der
|
||||
* sACN-Task, wenn er gar nicht erst angelegt werden konnte (sacn_required). */
|
||||
if (s_light_beat != light_seen) {
|
||||
light_seen = s_light_beat;
|
||||
light_alive = true;
|
||||
@@ -295,7 +301,7 @@ static void app_task(void *arg)
|
||||
sacn_seen = nl_sacn_beat;
|
||||
sacn_alive = true;
|
||||
}
|
||||
if (light_alive && net_alive && http_alive && sacn_alive) {
|
||||
if (light_alive && net_alive && http_alive && (sacn_alive || !sacn_required)) {
|
||||
light_alive = net_alive = http_alive = sacn_alive = false;
|
||||
tls_watchdog_clr();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user