23#ifndef PROTOCORE_DMX_H
24#define PROTOCORE_DMX_H
33#define DMX_MAX_CHANNELS 512u
34#define DMX_SC_DIMMER 0x00u
37#define RDM_SUB_SC 0x01u
38#define RDM_OVERHEAD 26u
41#define RDM_CC_DISCOVERY 0x10u
42#define RDM_CC_DISCOVERY_RESPONSE 0x11u
43#define RDM_CC_GET 0x20u
44#define RDM_CC_GET_RESPONSE 0x21u
45#define RDM_CC_SET 0x30u
46#define RDM_CC_SET_RESPONSE 0x31u
49#define RDM_RESPONSE_ACK 0x00u
50#define RDM_RESPONSE_ACK_TIMER 0x01u
51#define RDM_RESPONSE_NACK_REASON 0x02u
52#define RDM_RESPONSE_ACK_OVERFLOW 0x03u
55#define RDM_PID_DISC_UNIQUE_BRANCH 0x0001u
56#define RDM_PID_DISC_MUTE 0x0002u
57#define RDM_PID_DISC_UN_MUTE 0x0003u
58#define RDM_PID_SUPPORTED_PARAMETERS 0x0050u
59#define RDM_PID_DEVICE_INFO 0x0060u
60#define RDM_PID_DMX_START_ADDRESS 0x00F0u
61#define RDM_PID_IDENTIFY_DEVICE 0x1000u
69size_t pc_dmx_build(uint8_t *buf,
size_t cap, uint8_t start_code,
const uint8_t *channels, uint16_t n);
75uint8_t pc_dmx_get_channel(
const uint8_t *buf,
size_t len, uint16_t ch);
95uint64_t pc_rdm_uid(uint16_t manufacturer, uint32_t device);
98uint16_t pc_rdm_checksum(
const uint8_t *buf,
size_t len);
104size_t pc_rdm_build(uint8_t *buf,
size_t cap,
const RdmPacket *p,
const uint8_t *pdata, uint8_t pdl);
110bool pc_rdm_parse(
const uint8_t *buf,
size_t len, RdmPacket *out,
size_t *consumed);
120bool pc_rdm_decode_disc_response(
const uint8_t *buf,
size_t len, uint64_t *uid);
129size_t pc_rdm_build_disc_response(uint8_t *buf,
size_t cap, uint64_t uid, uint8_t preamble_len);
131#define PC_RDM_DEVICE_INFO_PDL 19
139 uint16_t device_model_id;
140 uint16_t product_category;
141 uint32_t software_version_id;
142 uint16_t dmx_footprint;
143 uint8_t current_personality;
144 uint8_t personality_count;
145 uint16_t dmx_start_address;
146 uint16_t sub_device_count;
147 uint8_t sensor_count;
157size_t pc_rdm_build_device_info(uint8_t *pdata,
size_t cap,
const RdmDeviceInfo *info);
164bool pc_rdm_parse_device_info(
const uint8_t *pdata, uint8_t pdl, RdmDeviceInfo *out);
User-facing configuration for ProtoCore.