From f10fe39b9a574aebfdd8dae56a22d79a76c0542c Mon Sep 17 00:00:00 2001 From: aleigh Date: Tue, 26 Apr 2022 15:55:26 -0700 Subject: [PATCH] leigh-modcon-controller: Working sACN decoding --- leigh-modcon-controller/src/sacn.c | 42 ++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/leigh-modcon-controller/src/sacn.c b/leigh-modcon-controller/src/sacn.c index dbc3bea19..1ab4f0db1 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 -- GitLab