fix(sacn): sequence handling on priority change and start_slot clamp
This commit is contained in:
+18
-2
@@ -27,7 +27,15 @@ void nl_dmx_init(const nl_board_t *board)
|
||||
s_last_ms = 0;
|
||||
}
|
||||
|
||||
void nl_dmx_configure(const nl_dmx_cfg_t *cfg) { s_cfg = *cfg; }
|
||||
void nl_dmx_configure(const nl_dmx_cfg_t *cfg)
|
||||
{
|
||||
s_cfg = *cfg;
|
||||
/* Sicherheitsnetz: start_slot=0 wuerde unten vor den Puffer lesen. Die REST-Schicht
|
||||
* validiert 1..512, aber dieses Modul soll dafuer nicht auf einen Aufrufer angewiesen
|
||||
* sein, den es nicht sehen kann. */
|
||||
if (s_cfg.start_slot < 1u)
|
||||
s_cfg.start_slot = 1u;
|
||||
}
|
||||
|
||||
bool nl_dmx_active(void) { return s_override; }
|
||||
|
||||
@@ -73,11 +81,19 @@ void nl_dmx_feed(const nl_e131_packet_t *p, uint32_t now_ms)
|
||||
if (s_streaming) {
|
||||
if (p->priority < s_prio)
|
||||
return;
|
||||
{
|
||||
if (p->priority == s_prio) {
|
||||
/* E1.31-2018 Section 6.7.2: verwerfen, wenn die Differenz <= 0 und > -20 ist.
|
||||
* Das Fenster ist bei -20 exklusiv - eine Sequenznummer genau 20 hinter der
|
||||
* zuletzt angenommenen gilt bereits wieder als neu und wird angenommen. Nicht
|
||||
* "korrigieren": ein Reviewer hat genau das schon einmal versucht. */
|
||||
int8_t d = (int8_t)(p->sequence - s_seq);
|
||||
if (d <= 0 && d > -NL_DMX_SEQ_WINDOW)
|
||||
return; /* veraltet oder Wiederholung */
|
||||
}
|
||||
/* p->priority > s_prio: eine neue, hoeherpriore Quelle loest die laufende ab. Sie
|
||||
* fuehrt ihre eigene Sequenzzaehlung - ein Abgleich gegen s_seq der abgeloesten
|
||||
* Quelle waere Zufall und koennte die neue Quelle bis zu NL_DMX_SEQ_WINDOW Pakete
|
||||
* lang verwerfen. Also: wie das erste Paket eines frischen Streams behandeln. */
|
||||
}
|
||||
s_prio = p->priority;
|
||||
s_seq = p->sequence;
|
||||
|
||||
Reference in New Issue
Block a user