diff --git a/libsrc/leddevice/CMakeLists.txt b/libsrc/leddevice/CMakeLists.txt index 16463fb5..d6d4682c 100755 --- a/libsrc/leddevice/CMakeLists.txt +++ b/libsrc/leddevice/CMakeLists.txt @@ -18,6 +18,8 @@ SET(Leddevice_QT_HEADERS ${CURRENT_SOURCE_DIR}/LedDeviceAdalightApa102.h ${CURRENT_SOURCE_DIR}/LedDeviceAmbiLed.h ${CURRENT_SOURCE_DIR}/LedDevicePhilipsHue.h + ${CURRENT_SOURCE_DIR}/LedHIDDevice.h + ${CURRENT_SOURCE_DIR}/LedDeviceRawHID.h ) SET(Leddevice_HEADERS @@ -39,10 +41,12 @@ SET(Leddevice_SOURCES ${CURRENT_SOURCE_DIR}/LedDeviceFactory.cpp ${CURRENT_SOURCE_DIR}/LedRs232Device.cpp + ${CURRENT_SOURCE_DIR}/LedHIDDevice.cpp ${CURRENT_SOURCE_DIR}/LedDeviceAdalight.cpp ${CURRENT_SOURCE_DIR}/LedDeviceAdalightApa102.cpp ${CURRENT_SOURCE_DIR}/LedDeviceAmbiLed.cpp + ${CURRENT_SOURCE_DIR}/LedDeviceRawHID.cpp ${CURRENT_SOURCE_DIR}/LedDeviceLightpack.cpp ${CURRENT_SOURCE_DIR}/LedDeviceMultiLightpack.cpp ${CURRENT_SOURCE_DIR}/LedDevicePaintpack.cpp diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp index ce8cb835..d5d40611 100755 --- a/libsrc/leddevice/LedDeviceFactory.cpp +++ b/libsrc/leddevice/LedDeviceFactory.cpp @@ -23,6 +23,7 @@ #include "LedDeviceAdalight.h" #include "LedDeviceAmbiLed.h" +#include "LedDeviceRawHID.h" #include "LedDeviceLightpack.h" #include "LedDeviceMultiLightpack.h" #include "LedDevicePaintpack.h" @@ -147,6 +148,21 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) device = deviceTinkerforge; } #endif + else if (type == "rawhid") + { + const int delay_ms = deviceConfig["delayAfterConnect"].asInt(); + auto VendorIdString = deviceConfig.get("VID", "0x2341").asString(); + auto ProductIdString = deviceConfig.get("PID", "0x8036").asString(); + + // Convert HEX values to integer + auto VendorId = std::stoul(VendorIdString, nullptr, 16); + auto ProductId = std::stoul(ProductIdString, nullptr, 16); + + LedDeviceRawHID* deviceHID = new LedDeviceRawHID(VendorId, ProductId, delay_ms); + deviceHID->open(); + + device = deviceHID; + } else if (type == "lightpack") { const std::string output = deviceConfig.get("output", "").asString(); diff --git a/libsrc/leddevice/LedDeviceRawHID.cpp b/libsrc/leddevice/LedDeviceRawHID.cpp new file mode 100644 index 00000000..18d678c3 --- /dev/null +++ b/libsrc/leddevice/LedDeviceRawHID.cpp @@ -0,0 +1,57 @@ + +// STL includes +#include +#include +#include + +// Linux includes +#include +#include + +// hyperion local includes +#include "LedDeviceRawHID.h" + +// Use feature report HID device +LedDeviceRawHID::LedDeviceRawHID(const unsigned short VendorId, const unsigned short ProductId, int delayAfterConnect_ms) : + LedHIDDevice(VendorId, ProductId, delayAfterConnect_ms, true), + _ledBuffer(0), + _timer() +{ + // setup the timer + _timer.setSingleShot(false); + _timer.setInterval(5000); + connect(&_timer, SIGNAL(timeout()), this, SLOT(rewriteLeds())); + + // start the timer + _timer.start(); +} + +int LedDeviceRawHID::write(const std::vector & ledValues) +{ + // Resize buffer if required + if (_ledBuffer.size() < ledValues.size() * 3) { + _ledBuffer.resize(3 * ledValues.size()); + } + + // restart the timer + _timer.start(); + + // write data + memcpy(_ledBuffer.data(), ledValues.data(), ledValues.size() * 3); + return writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} + +int LedDeviceRawHID::switchOff() +{ + // restart the timer + _timer.start(); + + // write data + std::fill(_ledBuffer.begin(), _ledBuffer.end(), uint8_t(0)); + return writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} + +void LedDeviceRawHID::rewriteLeds() +{ + writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} diff --git a/libsrc/leddevice/LedDeviceRawHID.h b/libsrc/leddevice/LedDeviceRawHID.h new file mode 100644 index 00000000..6e23fe02 --- /dev/null +++ b/libsrc/leddevice/LedDeviceRawHID.h @@ -0,0 +1,48 @@ +#pragma once + +// STL includes +#include + +// Qt includes +#include + +// hyperion include +#include "LedHIDDevice.h" + +/// +/// Implementation of the LedDevice interface for writing to an RawHID led device. +/// +class LedDeviceRawHID : public LedHIDDevice +{ + Q_OBJECT + +public: + /// + /// Constructs the LedDevice for attached RawHID device + /// + LedDeviceRawHID(const unsigned short VendorId, const unsigned short ProductId, int delayAfterConnect_ms); + + /// + /// Writes the led color values to the led-device + /// + /// @param ledValues The color-value per led + /// @return Zero on succes else negative + /// + virtual int write(const std::vector & ledValues); + + /// Switch the leds off + virtual int switchOff(); + +private slots: + /// Write the last data to the leds again + void rewriteLeds(); + +private: + /// The buffer containing the packed RGB values + std::vector _ledBuffer; + + /// Timer object which makes sure that led data is written at a minimum rate + /// The RawHID device will switch off when it does not receive data at least + /// every 15 seconds + QTimer _timer; +};