21 #ifndef PLUGINS_USBPRO_DMXTRIWIDGET_H_
22 #define PLUGINS_USBPRO_DMXTRIWIDGET_H_
32 #include "ola/thread/SchedulerInterface.h"
33 #include "plugins/usbpro/BaseUsbProWidget.h"
54 void UseRawRDM(
bool use_raw_rdm) { m_use_raw_rdm = use_raw_rdm; }
66 SINGLE_TX_COMMAND_ID = 0x21,
67 DISCOVER_AUTO_COMMAND_ID = 0x33,
68 DISCOVER_STATUS_COMMAND_ID = 0x34,
69 REMOTE_UID_COMMAND_ID = 0x35,
70 RAW_RDM_COMMAND_ID = 0x37,
71 REMOTE_GET_COMMAND_ID = 0x38,
72 REMOTE_SET_COMMAND_ID = 0x39,
73 QUEUED_GET_COMMAND_ID = 0x3a,
74 SET_FILTER_COMMAND_ID = 0x3d,
76 RESERVED_COMMAND_ID = 0xff,
81 DISCOVER_AUTO_REQUIRED,
82 DISCOVER_STATUS_REQUIRED,
87 std::map<const ola::rdm::UID, uint8_t> m_uid_index_map;
89 uint16_t m_last_esta_id;
96 ola::thread::timeout_id m_disc_stat_timeout_id;
98 TriDiscoveryState m_discovery_state;
105 uint8_t m_transaction_number;
107 uint8_t m_last_command, m_expected_command;
109 void SendDMXBuffer();
110 void SendQueuedRDMCommand();
112 bool CheckDiscoveryStatus();
113 void HandleMessage(uint8_t label,
115 unsigned int length);
116 void SendDiscoveryStart();
117 void SendDiscoveryStat();
120 void SendRawRDMRequest();
121 void DispatchRequest();
122 void DispatchQueuedGet();
123 void StopDiscovery();
125 void HandleSingleTXResponse(uint8_t return_code);
126 void HandleDiscoveryAutoResponse(uint8_t return_code,
128 unsigned int length);
129 void HandleDiscoverStatResponse(uint8_t return_code,
131 unsigned int length);
132 void HandleRemoteUIDResponse(uint8_t return_code,
134 unsigned int length);
135 void HandleRawRDMResponse(uint8_t return_code,
137 unsigned int length);
138 void HandleRemoteRDMResponse(uint8_t return_code,
140 unsigned int length);
141 void HandleQueuedGetResponse(uint8_t return_code,
143 unsigned int length);
144 void HandleGenericRDMResponse(uint8_t return_code,
147 unsigned int length);
148 void HandleSetFilterResponse(uint8_t return_code,
150 unsigned int length);
151 bool PendingTransaction()
const;
152 void MaybeSendNextRequest();
153 void HandleRDMError(ola::rdm::rdm_response_code error_code);
154 bool SendCommandToTRI(uint8_t label,
const uint8_t *data,
155 unsigned int length);
156 bool TriToOlaReturnCode(uint8_t return_code,
157 ola::rdm::rdm_response_code *code);
158 bool ReturnCodeToNackReason(uint8_t return_code,
159 ola::rdm::rdm_nack_reason *reason);
164 EC_UNKNOWN_COMMAND = 2,
165 EC_INVALID_OPTION = 3,
167 EC_DATA_TOO_LONG = 5,
171 EC_DATA_CHECKSUM = 0x0a,
172 EC_INCOMPATIBLE = 0x0b,
173 EC_RESPONSE_TIME = 0x10,
174 EC_RESPONSE_WAIT = 0x11,
175 EC_RESPONSE_MORE = 0x12,
176 EC_RESPONSE_TRANSACTION = 0x13,
177 EC_RESPONSE_SUB_DEVICE = 0x14,
178 EC_RESPONSE_FORMAT = 0x15,
179 EC_RESPONSE_CHECKSUM = 0x16,
180 EC_RESPONSE_NONE = 0x18,
181 EC_RESPONSE_IDENTITY = 0x1a,
182 EC_RESPONSE_MUTE = 0x1b,
183 EC_RESPONSE_DISCOVERY = 0x1c,
184 EC_RESPONSE_UNEXPECTED = 0x1d,
185 EC_UNKNOWN_PID = 0x20,
186 EC_FORMAT_ERROR = 0x21,
187 EC_HARDWARE_FAULT = 0x22,
188 EC_PROXY_REJECT = 0x23,
189 EC_WRITE_PROTECT = 0x24,
190 EC_UNSUPPORTED_COMMAND_CLASS = 0x25,
191 EC_OUT_OF_RANGE = 0x26,
192 EC_BUFFER_FULL = 0x27,
193 EC_FRAME_OVERFLOW = 0x28,
194 EC_SUBDEVICE_UNKNOWN = 0x29,
195 EC_PROXY_BUFFER_FULL = 0x2a,
196 } dmx_tri_error_codes;
198 static const unsigned int DATA_OFFSET = 2;
199 static const uint8_t EXTENDED_COMMAND_LABEL = 88;
202 static const unsigned int RDM_STATUS_INTERVAL_MS = 100;
214 unsigned int queue_size = 20,
215 bool use_raw_rdm =
false);
217 void UseRawRDM(
bool use_raw_rdm) { m_impl->UseRawRDM(use_raw_rdm); }
219 void Stop() { m_impl->
Stop(); }
221 bool SendDMX(
const DmxBuffer &buffer)
const {
222 return m_impl->
SendDMX(buffer);
239 return m_impl->GetDescriptor();
245 DmxTriWidgetImpl *m_impl;
248 void ResumeRDMCommands() {
255 #endif // PLUGINS_USBPRO_DMXTRIWIDGET_H_