diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5499eb90..ff31c86d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,8 +15,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Also allow an 8-LED configuration when using Karatelight
+- Fix Lightpack issue (#1015)
+
### Removed
+- Replace Multi-Lightpack by multi-instance Lightpack configuration
+
## [2.0.0-alpha.8](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.8) - 2020-09-14
### Added
- Add XCB grabber, a faster and safer alternative for X11 grabbing (#912)
diff --git a/assets/webconfig/js/content_leds.js b/assets/webconfig/js/content_leds.js
index 21b7f32f..f516623d 100644
--- a/assets/webconfig/js/content_leds.js
+++ b/assets/webconfig/js/content_leds.js
@@ -572,7 +572,7 @@ $(document).ready(function() {
var devRPiPWM = ['ws281x'];
var devRPiGPIO = ['piblaster'];
var devNET = ['atmoorb', 'fadecandy', 'philipshue', 'nanoleaf', 'tinkerforge', 'tpm2net', 'udpe131', 'udpartnet', 'udph801', 'udpraw', 'wled', 'yeelight'];
- var devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2', 'karate'];
+ var devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2', 'karate'];
var optArr = [[]];
optArr[1]=[];
diff --git a/libsrc/leddevice/LedDeviceSchemas.qrc b/libsrc/leddevice/LedDeviceSchemas.qrc
index 8977d9ca..5722e62a 100644
--- a/libsrc/leddevice/LedDeviceSchemas.qrc
+++ b/libsrc/leddevice/LedDeviceSchemas.qrc
@@ -11,7 +11,6 @@
schemas/schema-lightpack.json
schemas/schema-lpd6803.json
schemas/schema-lpd8806.json
- schemas/schema-multilightpack.json
schemas/schema-p9813.json
schemas/schema-paintpack.json
schemas/schema-philipshue.json
diff --git a/libsrc/leddevice/dev_hid/LedDeviceLightpack.cpp b/libsrc/leddevice/dev_hid/LedDeviceLightpack.cpp
index e8fec221..bf8c217b 100644
--- a/libsrc/leddevice/dev_hid/LedDeviceLightpack.cpp
+++ b/libsrc/leddevice/dev_hid/LedDeviceLightpack.cpp
@@ -35,6 +35,7 @@ enum DATA_VERSION_INDEXES{
LedDeviceLightpack::LedDeviceLightpack(const QJsonObject &deviceConfig)
: LedDevice(deviceConfig)
, _libusbContext(nullptr)
+ , _device(nullptr)
, _deviceHandle(nullptr)
, _busNumber(-1)
, _addressNumber(-1)
@@ -80,17 +81,28 @@ bool LedDeviceLightpack::init(const QJsonObject &deviceConfig)
else
{
Debug(_log, "USB context initialized");
- //libusb_set_debug(_libusbContext, 3);
+
+ if ( _log->getMinLevel() == Logger::LogLevel::DEBUG )
+ {
+ int logLevel = LIBUSB_LOG_LEVEL_INFO;
+ #if LIBUSB_API_VERSION >= 0x01000106
+ libusb_set_option(_libusbContext, LIBUSB_OPTION_LOG_LEVEL, logLevel);
+ #else
+ libusb_set_debug(_libusbContext, logLevel);
+ #endif
+ }
// retrieve the list of USB devices
libusb_device ** deviceList;
ssize_t deviceCount = libusb_get_device_list(_libusbContext, &deviceList);
+ bool deviceFound = true;
// iterate the list of devices
for (ssize_t i = 0 ; i < deviceCount; ++i)
{
// try to open and initialize the device
- if (testAndOpen(deviceList[i], _serialNumber) == 0)
+ deviceFound = searchDevice(deviceList[i], _serialNumber);
+ if ( deviceFound )
{
_device = deviceList[i];
// a device was successfully opened. break from list
@@ -101,7 +113,7 @@ bool LedDeviceLightpack::init(const QJsonObject &deviceConfig)
// free the device list
libusb_free_device_list(deviceList, 1);
- if (_deviceHandle == nullptr)
+ if (!deviceFound)
{
QString errortext;
if (_serialNumber.isEmpty())
@@ -110,12 +122,16 @@ bool LedDeviceLightpack::init(const QJsonObject &deviceConfig)
}
else
{
- errortext = QString ("No Lightpack device has been found with serial %1").arg( _serialNumber);
+ errortext = QString ("No Lightpack device found with serial %1").arg( _serialNumber);
}
this->setInError( errortext );
}
else
{
+ // set the led buffer size (command + 6 bytes per led)
+ _ledBuffer = std::vector(1 + _hwLedCount * 6, 0);
+ _ledBuffer[0] = CMD_UPDATE_LEDS;
+
isInitOK = true;
}
}
@@ -128,18 +144,29 @@ int LedDeviceLightpack::open()
int retval = -1;
_isDeviceReady = false;
- if ( libusb_open(_device, &_deviceHandle) != LIBUSB_SUCCESS )
+ if ( _device != nullptr)
{
- QString errortext = QString ("Failed to open [%1]").arg(_serialNumber);
- this->setInError(errortext);
- }
- else
- {
- // Everything is OK -> enable device
- _isDeviceReady = true;
- retval = 0;
- }
+ openDevice(_device, &_deviceHandle);
+ if ( _deviceHandle == nullptr )
+ {
+ QString errortext = QString ("Failed to open device with serial [%1]").arg(_serialNumber);
+ this->setInError(errortext);
+ retval = -1;
+ }
+ else
+ {
+ disableSmoothing();
+ {
+ // Everything is OK
+ _isDeviceReady = true;
+ _isOpen = true;
+
+ Info(_log, "Lightpack device successfully opened");
+ retval = 0;
+ }
+ }
+ }
return retval;
}
@@ -147,75 +174,64 @@ int LedDeviceLightpack::close()
{
int retval = 0;
_isDeviceReady = false;
+ _isOpen = false;
- // LedDevice specific closing activities
- if (_deviceHandle != nullptr)
+ if ( _deviceHandle != nullptr)
{
- _isOpen = false;
- libusb_release_interface(_deviceHandle, LIGHTPACK_INTERFACE);
- libusb_attach_kernel_driver(_deviceHandle, LIGHTPACK_INTERFACE);
- libusb_close(_deviceHandle);
-
+ closeDevice(_deviceHandle);
_deviceHandle = nullptr;
}
+
return retval;
}
-int LedDeviceLightpack::testAndOpen(libusb_device * device, const QString & requestedSerialNumber)
+bool LedDeviceLightpack::searchDevice(libusb_device * device, const QString & requestedSerialNumber)
{
+ bool lightPackFound = false;
+
libusb_device_descriptor deviceDescriptor;
int error = libusb_get_device_descriptor(device, &deviceDescriptor);
if (error != LIBUSB_SUCCESS)
{
Error(_log, "Error while retrieving device descriptor(%d): %s", error, libusb_error_name(error));
- return -1;
+ return false;
}
+ #define UNO_VENDOR_ID 0x2341
+ #define UNO_PRODUCT_ID 0x43
+
if ((deviceDescriptor.idVendor == USB_VENDOR_ID && deviceDescriptor.idProduct == USB_PRODUCT_ID) ||
- (deviceDescriptor.idVendor == USB_OLD_VENDOR_ID && deviceDescriptor.idProduct == USB_OLD_PRODUCT_ID))
+ (deviceDescriptor.idVendor == USB_OLD_VENDOR_ID && deviceDescriptor.idProduct == USB_OLD_PRODUCT_ID))
{
Info(_log, "Found a Lightpack device. Retrieving more information...");
+ Debug(_log, "vendorIdentifier : %s", QSTRING_CSTR(QString("0x%1").arg(static_cast(deviceDescriptor.idVendor),0,16)));
+ Debug(_log, "productIdentifier: %s", QSTRING_CSTR(QString("0x%1").arg(static_cast(deviceDescriptor.idProduct),0,16)));
+ Debug(_log, "release_number : %s", QSTRING_CSTR(QString("0x%1").arg(static_cast(deviceDescriptor.bcdDevice),0,16)));
+ Debug(_log, "manufacturer : %s", QSTRING_CSTR(getProperty(device, deviceDescriptor.iManufacturer)));
+
// get the hardware address
int busNumber = libusb_get_bus_number(device);
int addressNumber = libusb_get_device_address(device);
// get the serial number
- QString serialNumber;
- if (deviceDescriptor.iSerialNumber != 0)
- {
- // TODO: Check, if exceptions via try/catch need to be replaced in Qt environment
- try
- {
- serialNumber = LedDeviceLightpack::getString(device, deviceDescriptor.iSerialNumber);
- }
- catch (int e)
- {
- Error(_log, "unable to retrieve serial number from Lightpack device(%d): %s", e, libusb_error_name(e));
- serialNumber = "";
- }
- }
-
+ QString serialNumber = LedDeviceLightpack::getProperty(device, deviceDescriptor.iSerialNumber);
Debug(_log,"Lightpack device found: bus=%d address=%d serial=%s", busNumber, addressNumber, QSTRING_CSTR(serialNumber));
// check if this is the device we are looking for
if (requestedSerialNumber.isEmpty() || requestedSerialNumber == serialNumber)
{
- // This is it!
- // TODO: Check, if exceptions via try/catch need to be replaced in Qt environment
- try
+ libusb_device_handle * deviceHandle;
+ if ( openDevice(device, &deviceHandle ) == 0 )
{
- _deviceHandle = openDevice(device);
_serialNumber = serialNumber;
_busNumber = busNumber;
_addressNumber = addressNumber;
- Info(_log, "Lightpack device successfully opened");
-
// get the firmware version
uint8_t buffer[256];
error = libusb_control_transfer(
- _deviceHandle,
+ deviceHandle,
static_cast( LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE),
0x01,
0x0100,
@@ -231,13 +247,12 @@ int LedDeviceLightpack::testAndOpen(libusb_device * device, const QString & requ
_firmwareVersion.minorVersion = buffer[INDEX_FW_VER_MINOR];
}
+ #if 0
// FOR TESTING PURPOSE: FORCE MAJOR VERSION TO 6
_firmwareVersion.majorVersion = 6;
+ #endif
- // disable smoothing of the chosen device
- disableSmoothing();
-
- // determine the number of leds
+ // determine the number of LEDs
if (_firmwareVersion.majorVersion == 4)
{
_hwLedCount = 8;
@@ -257,24 +272,20 @@ int LedDeviceLightpack::testAndOpen(libusb_device * device, const QString & requ
{
_bitsPerChannel = 8;
}
+ closeDevice(deviceHandle);
- // set the led buffer size (command + 6 bytes per led)
- _ledBuffer = std::vector(1 + _hwLedCount * 6, 0);
- _ledBuffer[0] = CMD_UPDATE_LEDS;
+ Debug(_log, "Lightpack device found: bus=%d address=%d serial=%s version=%d.%d.", _busNumber, _addressNumber, QSTRING_CSTR(_serialNumber), _firmwareVersion.majorVersion, _firmwareVersion.minorVersion );
+ lightPackFound = true;
- // return success
- Debug(_log, "Lightpack device opened: bus=%d address=%d serial=%s version=%d.%d.", _busNumber, _addressNumber, QSTRING_CSTR(_serialNumber), _firmwareVersion.majorVersion, _firmwareVersion.minorVersion );
- return 0;
}
- catch(int e)
+ else
{
- _deviceHandle = nullptr;
- Warning(_log, "Unable to open Lightpack device. Searching for other device(%d): %s", e, libusb_error_name(e));
+ Warning(_log, "Unable to open Lightpack device. Searching for other device");
}
}
}
- return -1;
+ return lightPackFound;
}
int LedDeviceLightpack::write(const std::vector &ledValues)
@@ -322,24 +333,23 @@ const QString &LedDeviceLightpack::getSerialNumber() const
int LedDeviceLightpack::writeBytes(uint8_t *data, int size)
{
-// std::cout << "Writing " << size << " bytes: ";
-// for (int i = 0; i < size ; ++i) printf("%02x ", data[i]);
-// std::cout << std::endl;
+ int rc = 0;
+ //Debug( _log, "[%s]", QSTRING_CSTR(uint8_t_to_hex_string(data, size, 32)) );
int error = libusb_control_transfer(_deviceHandle,
- static_cast( LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE ),
- 0x09,
- (2 << 8),
- 0x00,
- data, size, 1000);
+ static_cast( LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE ),
+ 0x09,
+ (2 << 8),
+ 0x00,
+ data, size, 1000);
- if (error == size)
+ if (error != size)
{
- return 0;
+ rc = -1;
+ Error(_log, "Unable to write %d bytes to Lightpack device(%d): %s", size, error, libusb_error_name(error));
}
- Error(_log, "Unable to write %d bytes to Lightpack device(%d): %s", size, error, libusb_error_name(error));
- return error;
+ return rc;
}
int LedDeviceLightpack::disableSmoothing()
@@ -354,15 +364,16 @@ int LedDeviceLightpack::disableSmoothing()
return rc;
}
-libusb_device_handle * LedDeviceLightpack::openDevice(libusb_device *device)
+int LedDeviceLightpack::openDevice(libusb_device *device, libusb_device_handle ** deviceHandle)
{
+ int rc = 0;
+
libusb_device_handle * handle = nullptr;
- Logger * log = Logger::getInstance("LedDevice");
int error = libusb_open(device, &handle);
if (error != LIBUSB_SUCCESS)
{
- Error(log, "unable to open device(%d): %s", error, libusb_error_name(error));
- throw error;
+ Error(_log, "unable to open device(%d): %s", error, libusb_error_name(error));
+ rc = -1;
}
// detach kernel driver if it is active
@@ -371,42 +382,65 @@ libusb_device_handle * LedDeviceLightpack::openDevice(libusb_device *device)
error = libusb_detach_kernel_driver(handle, LIGHTPACK_INTERFACE);
if (error != LIBUSB_SUCCESS)
{
- Error(log, "unable to detach kernel driver(%d): %s", error, libusb_error_name(error));
+ Error(_log, "unable to detach kernel driver(%d): %s", error, libusb_error_name(error));
libusb_close(handle);
- throw error;
+ rc = -1;
}
}
error = libusb_claim_interface(handle, LIGHTPACK_INTERFACE);
if (error != LIBUSB_SUCCESS)
{
- Error(log, "unable to claim interface(%d): %s", error, libusb_error_name(error));
+ Error(_log, "unable to claim interface(%d): %s", error, libusb_error_name(error));
libusb_attach_kernel_driver(handle, LIGHTPACK_INTERFACE);
libusb_close(handle);
- throw error;
+ rc = -1;
}
- return handle;
+ *deviceHandle = handle;
+ return rc;
}
-QString LedDeviceLightpack::getString(libusb_device * device, int stringDescriptorIndex)
+int LedDeviceLightpack::closeDevice(libusb_device_handle * deviceHandle)
{
- libusb_device_handle * handle = nullptr;
+ int rc = 0;
- int error = libusb_open(device, &handle);
+ int error = libusb_release_interface(deviceHandle, LIGHTPACK_INTERFACE);
if (error != LIBUSB_SUCCESS)
{
- throw error;
+ Debug(_log, "Error while releasing interface (%d): %s", error, libusb_error_name(error));
+ rc = -1;
}
- char buffer[256];
- error = libusb_get_string_descriptor_ascii(handle, stringDescriptorIndex, reinterpret_cast(buffer), sizeof(buffer));
- if (error <= 0)
+ error = libusb_attach_kernel_driver(deviceHandle, LIGHTPACK_INTERFACE);
+ if (error != LIBUSB_SUCCESS)
{
- libusb_close(handle);
- throw error;
+ Debug(_log, "Error while attaching kernel driver (%d): %s", error, libusb_error_name(error));
+ rc = -1;
}
- libusb_close(handle);
- return QString(QByteArray(buffer, error));
+ libusb_close(deviceHandle);
+
+ return rc;
+}
+
+QString LedDeviceLightpack::getProperty(libusb_device * device, int stringDescriptorIndex)
+{
+ QString value;
+
+ if ( stringDescriptorIndex != 0 )
+ {
+ libusb_device_handle * handle = nullptr;
+ if ( libusb_open(device, &handle) == LIBUSB_SUCCESS )
+ {
+ char buffer[256];
+ int error = libusb_get_string_descriptor_ascii(handle, stringDescriptorIndex, reinterpret_cast(buffer), sizeof(buffer));
+ if (error > 0)
+ {
+ value = QString(QByteArray(buffer, error));
+ }
+ libusb_close(handle);
+ }
+ }
+ return value;
}
diff --git a/libsrc/leddevice/dev_hid/LedDeviceLightpack.h b/libsrc/leddevice/dev_hid/LedDeviceLightpack.h
index 1e6a03f5..957550c5 100644
--- a/libsrc/leddevice/dev_hid/LedDeviceLightpack.h
+++ b/libsrc/leddevice/dev_hid/LedDeviceLightpack.h
@@ -105,11 +105,12 @@ protected:
private:
///
- /// Test if the device is a (or the) lightpack we are looking for
+ /// Search for a LightPack Device (first one found or matching a given serial number)
///
- /// @return Zero on succes else negative
+ /// @param[in] requestedSerialNumber serial number of Lightpack to be search
+ /// @return True on Lightpack found
///
- int testAndOpen(libusb_device * device, const QString & requestedSerialNumber);
+ bool searchDevice(libusb_device * device, const QString & requestedSerialNumber);
/// write bytes to the device
int writeBytes(uint8_t *data, int size);
@@ -123,8 +124,11 @@ private:
int minorVersion;
};
- static libusb_device_handle * openDevice(libusb_device * device);
- static QString getString(libusb_device * device, int stringDescriptorIndex);
+
+ int openDevice(libusb_device *device, libusb_device_handle ** deviceHandle);
+ int closeDevice(libusb_device_handle * deviceHandle);
+
+ QString getProperty(libusb_device * device, int stringDescriptorIndex);
/// libusb context
libusb_context * _libusbContext;
diff --git a/libsrc/leddevice/dev_hid/LedDeviceMultiLightpack.cpp b/libsrc/leddevice/dev_hid/LedDeviceMultiLightpack.cpp
deleted file mode 100644
index 7ddc1092..00000000
--- a/libsrc/leddevice/dev_hid/LedDeviceMultiLightpack.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-// stl includes
-#include
-#include
-#include
-
-// Local Hyperion includes
-#include "LedDeviceMultiLightpack.h"
-
-// from USB_ID.h (http://code.google.com/p/light-pack/source/browse/CommonHeaders/USB_ID.h)
-#define USB_OLD_VENDOR_ID 0x03EB
-#define USB_OLD_PRODUCT_ID 0x204F
-#define USB_VENDOR_ID 0x1D50
-#define USB_PRODUCT_ID 0x6022
-
-bool compareLightpacks(LedDeviceLightpack * lhs, LedDeviceLightpack * rhs)
-{
- return lhs->getSerialNumber() < rhs->getSerialNumber();
-}
-
-LedDeviceMultiLightpack::LedDeviceMultiLightpack(const QJsonObject &deviceConfig)
- : LedDevice(deviceConfig)
- , _lightpacks()
-{
-}
-
-LedDeviceMultiLightpack::~LedDeviceMultiLightpack()
-{
- for (LedDeviceLightpack * device : _lightpacks)
- {
- delete device;
- }
-}
-
-LedDevice* LedDeviceMultiLightpack::construct(const QJsonObject &deviceConfig)
-{
- return new LedDeviceMultiLightpack(deviceConfig);
-}
-
-bool LedDeviceMultiLightpack::init(const QJsonObject &deviceConfig)
-{
- bool isInitOK = false;
-
- // Initialise sub-class
- if ( LedDevice::init(deviceConfig) )
- {
- // retrieve a list with Lightpack serials
- QStringList serialList = getLightpackSerials();
-
- // sort the list of Lightpacks based on the serial to get a fixed order
- std::sort(_lightpacks.begin(), _lightpacks.end(), compareLightpacks);
-
- // open each Lightpack device
- for (auto serial : serialList)
- {
- QJsonObject devConfig;
- devConfig["serial"] = serial;
- devConfig["latchTime"] = deviceConfig["latchTime"];
- devConfig["rewriteTime"] = deviceConfig["rewriteTime"];
-
- LedDeviceLightpack * device = new LedDeviceLightpack(devConfig);
-
- device->start();
- if (device->open() == 0)
- {
- _lightpacks.push_back(device);
- }
- else
- {
- Error(_log, "Error while creating Lightpack device with serial %s", QSTRING_CSTR(serial));
- delete device;
- }
- }
-
- if (_lightpacks.empty())
- {
- //Warning(_log, "No Lightpack devices were found");
- QString errortext = QString ("No Lightpack devices were found");
- this->setInError(errortext);
- isInitOK = false;
- }
- else
- {
- Info(_log, "%d Lightpack devices were found", _lightpacks.size());
- isInitOK = true;
- }
- }
- return isInitOK;
-}
-
-int LedDeviceMultiLightpack::open()
-{
- int retval = -1;
- _isDeviceReady = false;
-
- int lightsInError = 0;
- // open each Lightpack device
- for (LedDeviceLightpack * device : _lightpacks)
- {
- if (device->open() < 0)
- {
- Error( _log, "Failed to open [%s]", QSTRING_CSTR(device->getSerialNumber()) );
- ++lightsInError;
- }
- }
-
- if ( lightsInError < static_cast(_lightpacks.size()) )
- {
- // Everything is OK -> enable device
- _isDeviceReady = true;
- retval = 0;
- }
- else
- {
- this->setInError( "All Lightpacks failed to be opened!" );
- }
- return retval;
-}
-
-int LedDeviceMultiLightpack::close()
-{
- _isDeviceReady = false;
-
- for (LedDeviceLightpack * device : _lightpacks)
- {
- device->close();
- }
- return 0;
-}
-
-int LedDeviceMultiLightpack::write(const std::vector &ledValues)
-{
- const ColorRgb * data = ledValues.data();
- int size = ledValues.size();
-
- for (LedDeviceLightpack * device : _lightpacks)
- {
- int count = qMin(static_cast( device->getLedCount()), size);
-
- if (count > 0)
- {
- if ( device->isOpen() )
- {
- device->write(data, count);
- }
-
- data += count;
- size -= count;
- }
- else
- {
- Warning(_log, "Unable to write data to Lightpack device: no more led data available");
- }
- }
-
- return 0;
-}
-
-bool LedDeviceMultiLightpack::powerOff()
-{
- for (LedDeviceLightpack * device : _lightpacks)
- {
- if ( device->isOpen() )
- {
- device->powerOff();
- }
- }
- return true;
-}
-
-QStringList LedDeviceMultiLightpack::getLightpackSerials()
-{
- QStringList serialList;
- Logger * log = Logger::getInstance("LedDevice");
- Debug(log, "Getting list of Lightpack serials");
-
- // initialize the USB context
- libusb_context * libusbContext;
- int error = libusb_init(&libusbContext);
- if (error != LIBUSB_SUCCESS)
- {
- Error(log,"Error while initializing USB context(%d): %s", error, libusb_error_name(error));
- libusbContext = nullptr;
- return serialList;
- }
- //libusb_set_debug(_libusbContext, 3);
- Info(log, "USB context initialized in multi Lightpack device");
-
- // retrieve the list of USB devices
- libusb_device ** deviceList;
- ssize_t deviceCount = libusb_get_device_list(libusbContext, &deviceList);
-
- // iterate the list of devices
- for (ssize_t i = 0 ; i < deviceCount; ++i)
- {
- libusb_device_descriptor deviceDescriptor;
- error = libusb_get_device_descriptor(deviceList[i], &deviceDescriptor);
- if (error != LIBUSB_SUCCESS)
- {
- Error(log, "Error while retrieving device descriptor(%d): %s", error, libusb_error_name(error));
- continue;
- }
-
- if ((deviceDescriptor.idVendor == USB_VENDOR_ID && deviceDescriptor.idProduct == USB_PRODUCT_ID) ||
- (deviceDescriptor.idVendor == USB_OLD_VENDOR_ID && deviceDescriptor.idProduct == USB_OLD_PRODUCT_ID))
- {
- Info(log, "Found a Lightpack device. Retrieving serial...");
-
- // get the serial number
- QString serialNumber;
- if (deviceDescriptor.iSerialNumber != 0)
- {
- // TODO: Check, if exceptions via try/catch need to be replaced in Qt environment
- try
- {
- serialNumber = LedDeviceMultiLightpack::getString(deviceList[i], deviceDescriptor.iSerialNumber);
- }
- catch (int e)
- {
- Error(log,"Unable to retrieve serial number(%d): %s", e, libusb_error_name(e));
- continue;
- }
- }
-
- Info(log, "Lightpack device found with serial %s", QSTRING_CSTR(serialNumber));
- serialList.append(serialNumber);
- }
- }
-
- // free the device list
- libusb_free_device_list(deviceList, 1);
- libusb_exit(libusbContext);
-
- return serialList;
-}
-
-QString LedDeviceMultiLightpack::getString(libusb_device * device, int stringDescriptorIndex)
-{
- libusb_device_handle * handle = nullptr;
-
- int error = libusb_open(device, &handle);
- if (error != LIBUSB_SUCCESS)
- {
- throw error;
- }
-
- char buffer[256];
- error = libusb_get_string_descriptor_ascii(handle, stringDescriptorIndex, reinterpret_cast(buffer), sizeof(buffer));
- if (error <= 0)
- {
- libusb_close(handle);
- throw error;
- }
-
- libusb_close(handle);
- return QString(QByteArray(buffer, error));
-}
diff --git a/libsrc/leddevice/dev_hid/LedDeviceMultiLightpack.h b/libsrc/leddevice/dev_hid/LedDeviceMultiLightpack.h
deleted file mode 100644
index 6ad69d56..00000000
--- a/libsrc/leddevice/dev_hid/LedDeviceMultiLightpack.h
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef LEDEVICEMULTILIGHTPACK_H
-#define LEDEVICEMULTILIGHTPACK_H
-
-// stl includes
-#include
-#include
-#include
-#include
-
-// libusb include
-#include
-
-// Hyperion includes
-#include
-#include "LedDeviceLightpack.h"
-
-///
-/// LedDevice implementation for multiple lightpack devices
-///
-class LedDeviceMultiLightpack : public LedDevice
-{
-public:
-
- ///
- /// @brief Constructs a LedDevice of multiple Lightpack LED-devices
- ///
- /// @param deviceConfig Device's configuration as JSON-Object
- ///
- explicit LedDeviceMultiLightpack(const QJsonObject &deviceConfig);
-
- ///
- /// @brief Destructor of the LedDevice
- ///
- ~LedDeviceMultiLightpack() override;
-
- ///
- /// @brief Constructs the LED-device
- ///
- /// @param[in] deviceConfig Device's configuration as JSON-Object
- /// @return LedDevice constructed
- ///
- static LedDevice* construct(const QJsonObject &deviceConfig);
-
-protected:
-
- ///
- /// @brief Initialise the device's configuration
- ///
- /// @param[in] deviceConfig the JSON device configuration
- /// @return True, if success
- ///
- bool init(const QJsonObject &deviceConfig) override;
-
- ///
- /// @brief Opens the output device.
- ///
- /// @return Zero on success (i.e. device is ready), else negative
- ///
- int open() override;
-
- ///
- /// @brief Closes the output device.
- ///
- /// @return Zero on success (i.e. device is closed), else negative
- ///
- int close() override;
-
- ///
- /// @brief Power-/turn off the Nanoleaf device.
- ///
- /// @return True if success
- ///
- bool powerOff() override;
-
- ///
- /// @brief Writes the RGB-Color values to the LEDs.
- ///
- /// @param[in] ledValues The RGB-color per LED
- /// @return Zero on success, else negative
- ///
- int write(const std::vector & ledValues) override;
-
-private:
-
- static QStringList getLightpackSerials();
- static QString getString(libusb_device * device, int stringDescriptorIndex);
-
- /// buffer for led data
- std::vector _lightpacks;
-};
-
-#endif // LEDEVICEMULTILIGHTPACK_H
diff --git a/libsrc/leddevice/schemas/schema-multilightpack.json b/libsrc/leddevice/schemas/schema-multilightpack.json
deleted file mode 100644
index babbb985..00000000
--- a/libsrc/leddevice/schemas/schema-multilightpack.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "type":"object",
- "required":true,
- "properties":{
- "latchTime": {
- "type": "integer",
- "title":"edt_dev_spec_latchtime_title",
- "default": 11,
- "append" : "edt_append_ms",
- "minimum": 0,
- "maximum": 1000,
- "access" : "expert",
- "propertyOrder" : 1
- },
- "rewriteTime": {
- "type": "integer",
- "title":"edt_dev_general_rewriteTime_title",
- "default": 1000,
- "append" : "edt_append_ms",
- "minimum": 0,
- "access" : "expert",
- "propertyOrder" : 2
- }
- },
- "additionalProperties": true
-}