Die Lampe trat seit jeher der falschen Gruppe bei. Aus Universe 1 wurde 239.255.239.255 statt 239.255.0.1, und damit lauschte sie auf einer Adresse, auf die niemand sendet: Multicast kam nie an, Unicast lief, und der Beitritt meldete trotzdem Erfolg - er gelang ja, nur eben fuer die falsche Gruppe. Ursache ist ein nicht geklammertes Makro im SDK: #define htonl(n) (((n & 0xff) << 24) | ((n & 0xff00) << 8) | ...) Stand die Adressrechnung direkt im Aufruf, traf die Maske nach der Textersetzung nur den letzten Term, weil & staerker bindet als |. Nachgerechnet ergibt das fuer Universe 1 exakt die 0xefffefff, die am EVK auf der seriellen Konsole stand. Die Rechnung liegt jetzt in nl_e131_group_addr() - im reinen, host-testbaren Teil, mit Testfaellen fuer beide Byte-Haelften. Der Aufrufer reicht eine Variable an htonl(), keinen Ausdruck mehr. Gefunden am EVK ueber die serielle Konsole, nachdem vier Netz-Konfigurationen und fuenf andere Theorien nichts ergeben hatten.
33 lines
1.3 KiB
C
33 lines
1.3 KiB
C
#ifndef NL_E131_H
|
|
#define NL_E131_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#define NL_E131_PORT 5568u
|
|
#define NL_E131_MAX_PACKET 640u /* ein volles Paket ist 638 Byte; 640 laesst Luft zum Erkennen
|
|
* ueberlanger Datagramme, ohne den Puffer unnoetig aufzublaehen */
|
|
#define NL_E131_MIN_PACKET 126u
|
|
|
|
typedef struct {
|
|
uint16_t universe;
|
|
uint8_t priority;
|
|
uint8_t sequence;
|
|
bool terminated; /* Options-Bit "stream terminated" */
|
|
uint16_t slot_count; /* Nutzdaten ohne Start-Code, 0..512 */
|
|
const uint8_t *slots; /* zeigt in den uebergebenen Puffer, wird nicht kopiert */
|
|
} nl_e131_packet_t;
|
|
|
|
/* true = gueltiges DMX-Datenpaket (Start-Code 0, kein Preview). Alles andere: false.
|
|
* `out` wird nur bei true beschrieben. */
|
|
bool nl_e131_parse(const uint8_t *buf, size_t len, nl_e131_packet_t *out);
|
|
|
|
/* Die Multicast-Gruppe eines Universe nach E1.31 Anhang A: 239.255.<hi>.<lo>, als Zahl in
|
|
* HOST-Byte-Reihenfolge. Steht hier und nicht im Empfangs-Task, damit sie im Host-Test
|
|
* nachgerechnet werden kann - der Wert war schon einmal falsch, und man sieht es einer
|
|
* Lampe nicht an: sie tritt dann sauber einer Gruppe bei, auf die niemand sendet. */
|
|
uint32_t nl_e131_group_addr(uint16_t universe);
|
|
|
|
#endif
|