From bc4007ac67ae21648eb79a84a1556d7448f99121 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 29 Nov 2017 17:59:26 +0100 Subject: [PATCH] Add Karatelight support (#487) * Add Karatelight support * Add Karatelight Schema * Actually use the new schema file * Put karate device to USB group in webinterface --- assets/webconfig/js/content_leds.js | 2 +- libsrc/leddevice/LedDeviceSchemas.qrc | 1 + .../leddevice/dev_serial/LedDeviceKarate.cpp | 59 +++++++++++++++++++ libsrc/leddevice/dev_serial/LedDeviceKarate.h | 36 +++++++++++ libsrc/leddevice/schemas/schema-karate.json | 36 +++++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 libsrc/leddevice/dev_serial/LedDeviceKarate.cpp create mode 100644 libsrc/leddevice/dev_serial/LedDeviceKarate.h create mode 100644 libsrc/leddevice/schemas/schema-karate.json diff --git a/assets/webconfig/js/content_leds.js b/assets/webconfig/js/content_leds.js index b85ace9b..575c76e7 100644 --- a/assets/webconfig/js/content_leds.js +++ b/assets/webconfig/js/content_leds.js @@ -474,7 +474,7 @@ $(document).ready(function() { devRPiPWM = ['ws281x']; devRPiGPIO = ['piblaster']; devNET = ['atmoorb', 'fadecandy', 'philipshue', 'tinkerforge', 'tpm2net', 'udpe131', 'udpartnet', 'udph801', 'udpraw']; - devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2']; + devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2', 'karate']; var optArr = [[]]; optArr[1]=[]; diff --git a/libsrc/leddevice/LedDeviceSchemas.qrc b/libsrc/leddevice/LedDeviceSchemas.qrc index 896c4463..bd7afbae 100644 --- a/libsrc/leddevice/LedDeviceSchemas.qrc +++ b/libsrc/leddevice/LedDeviceSchemas.qrc @@ -30,5 +30,6 @@ schemas/schema-ws2801.json schemas/schema-ws2812spi.json schemas/schema-ws281x.json + schemas/schema-karate.json diff --git a/libsrc/leddevice/dev_serial/LedDeviceKarate.cpp b/libsrc/leddevice/dev_serial/LedDeviceKarate.cpp new file mode 100644 index 00000000..da5ec096 --- /dev/null +++ b/libsrc/leddevice/dev_serial/LedDeviceKarate.cpp @@ -0,0 +1,59 @@ +// hyperion local includes +#include "LedDeviceKarate.h" + +LedDeviceKarate::LedDeviceKarate(const QJsonObject &deviceConfig) + : ProviderRs232() +{ + _deviceReady = init(deviceConfig); + connect(this,SIGNAL(receivedData(QByteArray)),this,SLOT(receivedData(QByteArray))); +} + +LedDevice* LedDeviceKarate::construct(const QJsonObject &deviceConfig) +{ + return new LedDeviceKarate(deviceConfig); +} + +bool LedDeviceKarate::init(const QJsonObject &deviceConfig) +{ + ProviderRs232::init(deviceConfig); + + if (_ledCount != 16) + { + Error( _log, "%d channels configured. This should always be 16!", _ledCount); + return 0; + } + + _ledBuffer.resize(4 + _ledCount * 3); // 4-byte header, 3 RGB values + _ledBuffer[0] = 0xAA; // Startbyte + _ledBuffer[1] = 0x12; // Send all Channels in Batch + _ledBuffer[2] = 0x00; // Checksum + _ledBuffer[3] = _ledCount * 3; // Number of Databytes send + + Debug( _log, "Karatelight header for %d leds: 0x%02x 0x%02x 0x%02x 0x%02x", _ledCount, + _ledBuffer[0], _ledBuffer[1], _ledBuffer[2], _ledBuffer[3] ); + return true; +} + +int LedDeviceKarate::write(const std::vector &ledValues) +{ + for (signed iLed=0; iLed<_ledCount; iLed++) + { + + const ColorRgb& rgb = ledValues[iLed]; + _ledBuffer[iLed*3+4] = rgb.green; + _ledBuffer[iLed*3+5] = rgb.blue; + _ledBuffer[iLed*3+6] = rgb.red; + } + + // Calc Checksum + _ledBuffer[2] = _ledBuffer[0] ^ _ledBuffer[1]; + for (unsigned int i = 3; i < _ledBuffer.size(); i++) + _ledBuffer[2] ^= _ledBuffer[i]; + + return writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} + +void LedDeviceKarate::receivedData(QByteArray data) +{ + Debug(_log, ">>received %d bytes data %s", data.size(),data.data()); +} diff --git a/libsrc/leddevice/dev_serial/LedDeviceKarate.h b/libsrc/leddevice/dev_serial/LedDeviceKarate.h new file mode 100644 index 00000000..7be619e3 --- /dev/null +++ b/libsrc/leddevice/dev_serial/LedDeviceKarate.h @@ -0,0 +1,36 @@ +#pragma once + +// hyperion incluse +#include "ProviderRs232.h" + +/// +/// Implementation of the LedDevice interface for writing to serial device using tpm2 protocol. +/// +class LedDeviceKarate : public ProviderRs232 +{ + Q_OBJECT +public: + /// + /// Constructs specific LedDevice + /// + /// @param deviceConfig json device config + /// + LedDeviceKarate(const QJsonObject &deviceConfig); + + /// constructs leddevice + static LedDevice* construct(const QJsonObject &deviceConfig); + + virtual bool init(const QJsonObject &deviceConfig); + +public slots: + void receivedData(QByteArray data); + +private: + /// + /// 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); +}; diff --git a/libsrc/leddevice/schemas/schema-karate.json b/libsrc/leddevice/schemas/schema-karate.json new file mode 100644 index 00000000..eff50244 --- /dev/null +++ b/libsrc/leddevice/schemas/schema-karate.json @@ -0,0 +1,36 @@ +{ + "type":"object", + "required":true, + "properties":{ + "output": { + "type": "string", + "title":"edt_dev_spec_outputPath_title", + "default":"/dev/ttyACM0", + "propertyOrder" : 1 + }, + "rate": { + "type": "integer", + "title":"edt_dev_spec_baudrate_title", + "default": 1000000, + "propertyOrder" : 2 + }, + "delayAfterConnect": { + "type": "integer", + "title":"edt_dev_spec_delayAfterConnect_title", + "default": 1500, + "append" : "ms", + "propertyOrder" : 3 + }, + "latchTime": { + "type": "integer", + "title":"edt_dev_spec_latchtime_title", + "default": 15, + "append" : "edt_append_ms", + "minimum": 1, + "maximum": 1000, + "access" : "expert", + "propertyOrder" : 4 + } + }, + "additionalProperties": true +}