diff --git a/leigh-modcon-controller/src/sacn.c b/leigh-modcon-controller/src/sacn.c index dbc3bea197c1fc7a182be036be5c7cefd99bb5f0..1ab4f0db1fe55df92a964b09e5f907ebf543a234 100644 --- a/leigh-modcon-controller/src/sacn.c +++ b/leigh-modcon-controller/src/sacn.c @@ -6,11 +6,49 @@ static const char *TAG = "sacn"; static void sacnFpkt_handler(const char *buf, size_t buf_len); +typedef union { + struct { + struct { /* ACN Root Layer: 38 bytes */ + uint16_t preamble_size; /* Preamble Size */ + uint16_t postamble_size; /* Post-amble Size */ + uint8_t acn_pid[12]; /* ACN Packet Identifier */ + uint16_t flength; /* Flags (high 4 bits) & Length (low 12 bits) */ + uint32_t vector; /* Layer Vector */ + uint8_t cid[16]; /* Component Identifier (UUID) */ + } __attribute__((packed)) root; + + struct { /* Framing Layer: 77 bytes */ + uint16_t flength; /* Flags (high 4 bits) & Length (low 12 bits) */ + uint32_t vector; /* Layer Vector */ + uint8_t source_name[64]; /* User Assigned Name of Source (UTF-8) */ + uint8_t priority; /* Packet Priority (0-200, default 100) */ + uint16_t reserved; /* Reserved (should be always 0) */ + uint8_t seq_number; /* Sequence Number (detect duplicates or out of order packets) */ + uint8_t options; /* Options Flags (bit 7: preview data, bit 6: stream terminated) */ + uint16_t universe; /* DMX Universe Number */ + } __attribute__((packed)) frame; + + struct { /* Device Management Protocol (DMP) Layer: 523 bytes */ + uint16_t flength; /* Flags (high 4 bits) / Length (low 12 bits) */ + uint8_t vector; /* Layer Vector */ + uint8_t type; /* Address Type & Data Type */ + uint16_t first_addr; /* First Property Address */ + uint16_t addr_inc; /* Address Increment */ + uint16_t prop_val_cnt; /* Property Value Count (1 + number of slots) */ + uint8_t prop_val[513]; /* Property Values (DMX start code + slots data) */ + } __attribute__((packed)) dmp; + } __attribute__((packed)); + + uint8_t raw[638]; /* raw buffer view: 638 bytes */ +} e131_packet_t; + + void sacnFtask(void *pvParameters) { netFmc_listener(sacnFpkt_handler); } static void sacnFpkt_handler(const char *buf, size_t buf_len) { - ESP_LOGI(TAG, "sACN packet received."); - // Handle sACN packet here + const e131_packet_t *pkt = (const e131_packet_t *)buf; + ESP_LOGI(TAG, "sACN packet received. [universe: %u] [priority: %u] [src: %s]", + pkt->frame.universe, pkt->frame.priority, pkt->frame.source_name); } \ No newline at end of file