From 1fb2f6be0b1c24e494992f914cb5bd91412fa0d1 Mon Sep 17 00:00:00 2001 From: Rick van Hattem Date: Wed, 21 Sep 2016 23:03:01 +0200 Subject: [PATCH] initial version of h801 led device --- libsrc/leddevice/CMakeLists.txt | 2 + libsrc/leddevice/LedDeviceFactory.cpp | 4 +- libsrc/leddevice/LedDeviceSchemas.qrc | 1 + libsrc/leddevice/LedDeviceUdpH801.cpp | 67 +++++++++++++++++++++++ libsrc/leddevice/LedDeviceUdpH801.h | 59 ++++++++++++++++++++ libsrc/leddevice/schemas/schema-h801.json | 27 +++++++++ 6 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 libsrc/leddevice/LedDeviceUdpH801.cpp create mode 100644 libsrc/leddevice/LedDeviceUdpH801.h create mode 100644 libsrc/leddevice/schemas/schema-h801.json diff --git a/libsrc/leddevice/CMakeLists.txt b/libsrc/leddevice/CMakeLists.txt index 4ff82221..a0b1c329 100755 --- a/libsrc/leddevice/CMakeLists.txt +++ b/libsrc/leddevice/CMakeLists.txt @@ -35,6 +35,7 @@ SET(Leddevice_HEADERS ${CURRENT_SOURCE_DIR}/LedDeviceSedu.h ${CURRENT_SOURCE_DIR}/LedDeviceFile.h ${CURRENT_SOURCE_DIR}/LedDeviceUdpRaw.h + ${CURRENT_SOURCE_DIR}/LedDeviceUdpH801.h ${CURRENT_SOURCE_DIR}/LedDeviceUdpE131.h ${CURRENT_SOURCE_DIR}/ProviderUdp.h ${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.h @@ -62,6 +63,7 @@ SET(Leddevice_SOURCES ${CURRENT_SOURCE_DIR}/LedDeviceFile.cpp ${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.cpp ${CURRENT_SOURCE_DIR}/LedDeviceUdpRaw.cpp + ${CURRENT_SOURCE_DIR}/LedDeviceUdpH801.cpp ${CURRENT_SOURCE_DIR}/LedDeviceUdpE131.cpp ${CURRENT_SOURCE_DIR}/ProviderUdp.cpp ${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.cpp diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp index 5a6984e6..586c8b81 100755 --- a/libsrc/leddevice/LedDeviceFactory.cpp +++ b/libsrc/leddevice/LedDeviceFactory.cpp @@ -46,6 +46,7 @@ #include "LedDeviceAtmo.h" #include "LedDeviceAdalightApa102.h" #include "LedDeviceAtmoOrb.h" +#include "LedDeviceUdpH801.h" #ifdef ENABLE_WS2812BPWM #include "LedDeviceWS2812b.h" @@ -101,7 +102,8 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) #endif LedDevice::addToDeviceMap("philipshue", LedDevicePhilipsHue::construct); LedDevice::addToDeviceMap("atmoorb", LedDeviceAtmoOrb::construct); - + LedDevice::addToDeviceMap("h801", LedDeviceUdpH801::construct); + // direct usb LedDevice::addToDeviceMap("hyperion-usbasp", LedDeviceHyperionUsbasp::construct); LedDevice::addToDeviceMap("rawhid", LedDeviceRawHID::construct); diff --git a/libsrc/leddevice/LedDeviceSchemas.qrc b/libsrc/leddevice/LedDeviceSchemas.qrc index e35a8789..ce04eb2d 100644 --- a/libsrc/leddevice/LedDeviceSchemas.qrc +++ b/libsrc/leddevice/LedDeviceSchemas.qrc @@ -27,5 +27,6 @@ schemas/schema-ws2801.json schemas/schema-ws2812spi.json schemas/schema-ws281x.json + schemas/schema-h801.json diff --git a/libsrc/leddevice/LedDeviceUdpH801.cpp b/libsrc/leddevice/LedDeviceUdpH801.cpp new file mode 100644 index 00000000..b6c9c2b1 --- /dev/null +++ b/libsrc/leddevice/LedDeviceUdpH801.cpp @@ -0,0 +1,67 @@ +// STL includes +#include +#include +#include + +#include + +// hyperion local includes +#include "LedDeviceUdpH801.h" + +LedDeviceUdpH801::LedDeviceUdpH801(const Json::Value &deviceConfig) : ProviderUdp(deviceConfig) +{ + setConfig(deviceConfig); +} + +bool LedDeviceUdpH801::setConfig(const Json::Value &deviceConfig) +{ + /* The H801 port is fixed */ + _port = 30977; + /* 10ms seems to be a safe default for the wait time */ + _LatchTime_ns = deviceConfig.get("latchtime", 10000000).asInt(); + + _ids.clear(); + for (Json::Value::ArrayIndex i = 0; i < deviceConfig["lightIds"].size(); i++) { + QString id(deviceConfig["lightIds"][i].asCString()); + _ids.push_back(id.toInt(nullptr, 16)); + } + + _message = QByteArray(_prefix_size + _colors + _id_size * _ids.size() + _suffix_size, 0x00); + _message[0] = 0xFB; + _message[1] = 0xEB; + + for(int i=0; i<_ids.length(); i++){ + _message[_prefix_size + _colors + i * _id_size + 0] = (_ids[i] >> 0x00) & 0xFF; + _message[_prefix_size + _colors + i * _id_size + 1] = (_ids[i] >> 0x08) & 0xFF; + _message[_prefix_size + _colors + i * _id_size + 2] = (_ids[i] >> 0x10) & 0xFF; + } + + Debug( _log, "H801 using %s:%d", _address.toString().toStdString().c_str() , _port ); + + return true; +} + +LedDevice* LedDeviceUdpH801::construct(const Json::Value &deviceConfig) +{ + return new LedDeviceUdpH801(deviceConfig); +} + +int LedDeviceUdpH801::write(const std::vector &ledValues) +{ + ColorRgb color = ledValues[0]; + _message[_prefix_size + 0] = color.red; + _message[_prefix_size + 1] = color.green; + _message[_prefix_size + 2] = color.blue; + + writeBytes(_message.size(), reinterpret_cast(_message.data())); +} + +int LedDeviceUdpH801::switchOff() +{ + return write(std::vector(_ledCount, ColorRgb{0,0,0})); +} + +LedDeviceUdpH801::~LedDeviceUdpH801() +{ + ProviderUdp::~ProviderUdp(); +} diff --git a/libsrc/leddevice/LedDeviceUdpH801.h b/libsrc/leddevice/LedDeviceUdpH801.h new file mode 100644 index 00000000..56ec8fc4 --- /dev/null +++ b/libsrc/leddevice/LedDeviceUdpH801.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include +#include + +// STL includes +#include + +// hyperion includes +#include "ProviderUdp.h" + +/// +/// Implementation of the LedDevice interface for sending led colors via udp. +/// +class LedDeviceUdpH801 : public ProviderUdp +{ +protected: + QList _ids; + QByteArray _message; + const int _prefix_size = 2; + const int _colors = 5; + const int _id_size = 3; + const int _suffix_size = 1; + +public: + /// + /// Constructs specific LedDevice + /// + /// @param deviceConfig json device config + /// + LedDeviceUdpH801(const Json::Value &deviceConfig); + + /// + /// Destructor of the LedDevice; closes the output device if it is open + /// + virtual ~LedDeviceUdpH801(); + + /// + /// Sets configuration + /// + /// @param deviceConfig the json device config + /// @return true if success + bool setConfig(const Json::Value &deviceConfig); + + /// constructs leddevice + static LedDevice* construct(const Json::Value &deviceConfig); + + /// + /// 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(); +}; diff --git a/libsrc/leddevice/schemas/schema-h801.json b/libsrc/leddevice/schemas/schema-h801.json new file mode 100644 index 00000000..95c574ee --- /dev/null +++ b/libsrc/leddevice/schemas/schema-h801.json @@ -0,0 +1,27 @@ +{ + "type":"object", + "required":true, + "properties":{ + "host" : { + "type": "string", + "title":"Target IP", + "default": "255.255.255.255", + "propertyOrder" : 1 + }, + "port" : { + "type": "integer", + "title":"Port", + "default": 30977, + "propertyOrder" : 2 + }, + "lightIds": { + "type": "array", + "title":"Light ids", + "items" : { + "type" : "string" + }, + "propertyOrder" : 3 + } + }, + "additionalProperties": true +}