@@ -46,6 +46,8 @@ static const uint8_t DMX_LABEL = 6;
4646static const uint8_t START_OF_MESSAGE = 0x7e ;
4747static const uint8_t END_OF_MESSAGE = 0xe7 ;
4848static const unsigned char ENDPOINT = 0x02 ;
49+ static const uint8_t MK2_SET_BAUD_RATE = 0x03 ;
50+ static const unsigned int MK2_TIMEOUT_MS = 500 ;
4951enum { EUROLITE_PRO_FRAME_SIZE = 518 };
5052
5153/*
@@ -149,7 +151,7 @@ bool EuroliteProThreadedSender::TransmitBuffer(libusb_device_handle *handle,
149151 // not sure if this is fatal or not
150152 OLA_WARN << " EurolitePro driver failed to transfer all data" ;
151153 }
152- return r == 0 ;
154+ return ( r == 0 ) ;
153155}
154156
155157// SynchronousEurolitePro
@@ -158,8 +160,9 @@ bool EuroliteProThreadedSender::TransmitBuffer(libusb_device_handle *handle,
158160SynchronousEurolitePro::SynchronousEurolitePro (
159161 LibUsbAdaptor *adaptor,
160162 libusb_device *usb_device,
161- const string &serial)
162- : EurolitePro(adaptor, usb_device, serial) {
163+ const string &serial,
164+ bool is_mk2)
165+ : EurolitePro(adaptor, usb_device, serial, is_mk2) {
163166}
164167
165168bool SynchronousEurolitePro::Init () {
@@ -176,6 +179,26 @@ bool SynchronousEurolitePro::Init() {
176179 return false ;
177180 }
178181
182+ // USB-DMX512-PRO MK2: set baudrate to 250000
183+ if (m_is_mk2) {
184+ uint16_t divisor = 3000000 / 250000 ;
185+ uint16_t value = divisor; // divisor & 0xFFFF
186+ uint16_t index = (divisor >> 8 ) & 0xFF00 ;
187+ int err = m_adaptor->ControlTransfer (
188+ usb_handle,
189+ LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE |
190+ LIBUSB_ENDPOINT_OUT, // bmRequestType
191+ MK2_SET_BAUD_RATE, // bRequest
192+ value, // wValue
193+ index, // wIndex
194+ NULL , // data
195+ 0 , // wLength
196+ MK2_TIMEOUT_MS); // timeout
197+ if (err) {
198+ return false ;
199+ }
200+ }
201+
179202 std::auto_ptr<EuroliteProThreadedSender> sender (
180203 new EuroliteProThreadedSender (m_adaptor, m_usb_device, usb_handle));
181204 if (!sender->Start ()) {
@@ -194,8 +217,10 @@ bool SynchronousEurolitePro::SendDMX(const DmxBuffer &buffer) {
194217class EuroliteProAsyncUsbSender : public AsyncUsbSender {
195218 public:
196219 EuroliteProAsyncUsbSender (LibUsbAdaptor *adaptor,
197- libusb_device *usb_device)
198- : AsyncUsbSender(adaptor, usb_device) {
220+ libusb_device *usb_device,
221+ bool is_mk2)
222+ : AsyncUsbSender(adaptor, usb_device),
223+ m_is_mk2 (is_mk2) {
199224 }
200225
201226 ~EuroliteProAsyncUsbSender () {
@@ -211,7 +236,31 @@ class EuroliteProAsyncUsbSender : public AsyncUsbSender {
211236 libusb_device_handle *usb_handle;
212237 bool ok = m_adaptor->OpenDeviceAndClaimInterface (
213238 m_usb_device, interface_number, &usb_handle);
214- return ok ? usb_handle : NULL ;
239+ if (!ok) {
240+ return NULL ;
241+ }
242+
243+ // USB-DMX512-PRO MK2: set baudrate to 250000
244+ if (m_is_mk2) {
245+ uint16_t divisor = 3000000 / 250000 ;
246+ uint16_t value = divisor; // divisor & 0xFFFF
247+ uint16_t index = (divisor >> 8 ) & 0xFF00 ;
248+ int err = m_adaptor->ControlTransfer (
249+ usb_handle,
250+ LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE |
251+ LIBUSB_ENDPOINT_OUT, // bmRequestType
252+ MK2_SET_BAUD_RATE, // bRequest
253+ value, // wValue
254+ index, // wIndex
255+ NULL , // data
256+ 0 , // wLength
257+ MK2_TIMEOUT_MS); // timeout
258+ if (err) {
259+ return NULL ;
260+ }
261+ }
262+
263+ return usb_handle;
215264 }
216265
217266 bool PerformTransfer (const DmxBuffer &buffer) {
@@ -223,6 +272,7 @@ class EuroliteProAsyncUsbSender : public AsyncUsbSender {
223272
224273 private:
225274 uint8_t m_tx_frame[EUROLITE_PRO_FRAME_SIZE];
275+ bool m_is_mk2;
226276
227277 DISALLOW_COPY_AND_ASSIGN (EuroliteProAsyncUsbSender);
228278};
@@ -233,9 +283,12 @@ class EuroliteProAsyncUsbSender : public AsyncUsbSender {
233283AsynchronousEurolitePro::AsynchronousEurolitePro (
234284 LibUsbAdaptor *adaptor,
235285 libusb_device *usb_device,
236- const string &serial)
237- : EurolitePro(adaptor, usb_device, serial) {
238- m_sender.reset (new EuroliteProAsyncUsbSender (m_adaptor, usb_device));
286+ const string &serial,
287+ bool is_mk2)
288+ : EurolitePro(adaptor, usb_device, serial, is_mk2) {
289+ m_sender.reset (new EuroliteProAsyncUsbSender (m_adaptor,
290+ usb_device,
291+ m_is_mk2));
239292}
240293
241294bool AsynchronousEurolitePro::Init () {
0 commit comments