diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index db6ed423..87fadab7 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -16,13 +16,15 @@ /// APA102, WS2801, P9813, LPD6803, LPD8806, ---------PWM---------, WS2812b (just RPi1), WS281X (RPi1, RPi2, RPi3), --------OTHER--------, PhilipsHUE, AtmoOrb, PiBlaster, Tinkerforge, FadeCandy, RawHID (USB), UDP, SEDU, TPM2, USBASP-WS2801, USBASP-WS2812, ------3rd PARTY------, Adalight, AdalightAPA102, Atmo, Lightpack, Multi-Lightpack, Paintpack, Test (file), None) /// * [device type specific configuration] /// * 'colorOrder' : The order of the color bytes ('rgb', 'rbg', 'bgr', etc.). + /// * 'rewriteTime': in ms. Data is resend to leds, if no new data is available in thistime. 0 means no refresh "device" : { "name" : "MyHyperionConfig", "type" : "file", "output" : "/dev/null", "rate" : 1000000, - "colorOrder" : "rgb" + "colorOrder" : "rgb", + "rewriteTime": 0 }, /// Color manipulation configuration used to tune the output colors to specific surroundings. diff --git a/config/hyperion.config.json.default b/config/hyperion.config.json.default index 11ff20e5..129dc5ea 100644 --- a/config/hyperion.config.json.default +++ b/config/hyperion.config.json.default @@ -10,7 +10,8 @@ "type" : "file", "output" : "/dev/null", "rate" : 1000000, - "colorOrder" : "rgb" + "colorOrder" : "rgb", + "rewriteTime": 0 }, "color" : diff --git a/include/leddevice/LedDevice.h b/include/leddevice/LedDevice.h index d8ecf557..522cd629 100644 --- a/include/leddevice/LedDevice.h +++ b/include/leddevice/LedDevice.h @@ -68,6 +68,7 @@ protected: /// @return Zero on success else negative /// virtual int write(const std::vector& ledValues) = 0; + virtual bool init(const QJsonObject &deviceConfig); /// The common Logger instance for all LedDevices Logger * _log; @@ -86,8 +87,9 @@ protected: /// Timer object which makes sure that led data is written at a minimum rate /// e.g. Adalight device will switch off when it does not receive data at least every 15 seconds - QTimer _refresh_timer; - + QTimer _refresh_timer; + unsigned int _refresh_timer_interval; + protected slots: /// Write the last data to the leds again int rewriteLeds(); diff --git a/libsrc/hyperion/hyperion.schema.json b/libsrc/hyperion/hyperion.schema.json index 1b1524f7..665c45b3 100644 --- a/libsrc/hyperion/hyperion.schema.json +++ b/libsrc/hyperion/hyperion.schema.json @@ -24,7 +24,7 @@ "type" : "object", "title" : "LED Device General", "required" : true, - "defaultProperties": ["name","ledCount","colorOrder"], + "defaultProperties": ["name","ledCount","colorOrder","rewriteTime"], "properties" : { "name" : @@ -52,6 +52,14 @@ "title" : "RGB byte order", "enum" : ["rgb", "bgr", "rbg", "brg", "gbr", "grb"], "propertyOrder" : 3 + }, + "rewriteTime": { + "type": "integer", + "title":"Refresh time", + "default": 5000, + "append" : "ms", + "minimum": 0, + "propertOrder" : 4 } }, "additionalProperties" : true diff --git a/libsrc/leddevice/LedDevice.cpp b/libsrc/leddevice/LedDevice.cpp index 410b326e..6cfb9bc0 100644 --- a/libsrc/leddevice/LedDevice.cpp +++ b/libsrc/leddevice/LedDevice.cpp @@ -18,6 +18,7 @@ LedDevice::LedDevice() , _ledBuffer(0) , _deviceReady(true) , _refresh_timer() + , _refresh_timer_interval(0) { LedDevice::getLedDeviceSchemas(); @@ -49,6 +50,12 @@ void LedDevice::setActiveDevice(std::string dev) _activeDevice = dev; } +bool LedDevice::init(const QJsonObject &deviceConfig) +{ + _refresh_timer.setInterval( deviceConfig["rewriteTime"].toInt(_refresh_timer_interval) ); + return true; +} + QJsonObject LedDevice::getLedDeviceSchemas() { // make sure the resources are loaded (they may be left out after static linking) diff --git a/libsrc/leddevice/LedDeviceFile.cpp b/libsrc/leddevice/LedDeviceFile.cpp index b80109bf..0f8f11b7 100644 --- a/libsrc/leddevice/LedDeviceFile.cpp +++ b/libsrc/leddevice/LedDeviceFile.cpp @@ -21,7 +21,10 @@ bool LedDeviceFile::init(const QJsonObject &deviceConfig) { _ofs.close(); } - + + _refresh_timer_interval = 0; + LedDevice::init(deviceConfig); + std::string fileName = deviceConfig["output"].toString("/dev/null").toStdString(); _ofs.open( fileName.c_str() ); diff --git a/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp b/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp index 08155ee1..542c7b7d 100644 --- a/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp +++ b/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp @@ -39,6 +39,8 @@ LedDeviceHyperionUsbasp::~LedDeviceHyperionUsbasp() bool LedDeviceHyperionUsbasp::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); + std::string ledType = deviceConfig["output"].toString("ws2801").toStdString(); if (ledType != "ws2801" && ledType != "ws2812") { diff --git a/libsrc/leddevice/LedDeviceLightpack.cpp b/libsrc/leddevice/LedDeviceLightpack.cpp index 018e08d8..cba6f4fc 100644 --- a/libsrc/leddevice/LedDeviceLightpack.cpp +++ b/libsrc/leddevice/LedDeviceLightpack.cpp @@ -71,6 +71,7 @@ LedDeviceLightpack::~LedDeviceLightpack() bool LedDeviceLightpack::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); _serialNumber = deviceConfig["output"].toString("").toStdString(); return true; diff --git a/libsrc/leddevice/LedDeviceMultiLightpack.cpp b/libsrc/leddevice/LedDeviceMultiLightpack.cpp index cf211c88..bb96553c 100644 --- a/libsrc/leddevice/LedDeviceMultiLightpack.cpp +++ b/libsrc/leddevice/LedDeviceMultiLightpack.cpp @@ -17,10 +17,11 @@ bool compareLightpacks(LedDeviceLightpack * lhs, LedDeviceLightpack * rhs) return lhs->getSerialNumber() < rhs->getSerialNumber(); } -LedDeviceMultiLightpack::LedDeviceMultiLightpack(const QJsonObject &) +LedDeviceMultiLightpack::LedDeviceMultiLightpack(const QJsonObject &deviceConfig) : LedDevice() , _lightpacks() { + LedDevice::init(deviceConfig); } LedDeviceMultiLightpack::~LedDeviceMultiLightpack() diff --git a/libsrc/leddevice/LedDevicePhilipsHue.cpp b/libsrc/leddevice/LedDevicePhilipsHue.cpp index a2b308b0..4f3df391 100755 --- a/libsrc/leddevice/LedDevicePhilipsHue.cpp +++ b/libsrc/leddevice/LedDevicePhilipsHue.cpp @@ -179,6 +179,8 @@ LedDevicePhilipsHue::~LedDevicePhilipsHue() bool LedDevicePhilipsHue::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); + host = deviceConfig["output"].toString().toStdString().c_str(); username = deviceConfig["username"].toString("newdeveloper").toStdString().c_str(); switchOffOnBlack = deviceConfig["switchOffOnBlack"].toBool(true); diff --git a/libsrc/leddevice/LedDevicePiBlaster.cpp b/libsrc/leddevice/LedDevicePiBlaster.cpp index 402d7ecd..dca25f9b 100644 --- a/libsrc/leddevice/LedDevicePiBlaster.cpp +++ b/libsrc/leddevice/LedDevicePiBlaster.cpp @@ -42,7 +42,9 @@ LedDevicePiBlaster::~LedDevicePiBlaster() bool LedDevicePiBlaster::init(const QJsonObject &deviceConfig) { - _deviceName = deviceConfig["output"].toString("").toStdString(); + LedDevice::init(deviceConfig); + + _deviceName = deviceConfig["output"].toString("/dev/pi-blaster").toStdString(); QJsonArray gpioMapping = deviceConfig["gpiomap"].toArray(); if (gpioMapping.isEmpty()) diff --git a/libsrc/leddevice/LedDeviceRawHID.cpp b/libsrc/leddevice/LedDeviceRawHID.cpp index e1d48771..a8cf153a 100644 --- a/libsrc/leddevice/LedDeviceRawHID.cpp +++ b/libsrc/leddevice/LedDeviceRawHID.cpp @@ -3,19 +3,10 @@ // Use feature report HID device LedDeviceRawHID::LedDeviceRawHID(const QJsonObject &deviceConfig) : ProviderHID() - , _timer() { ProviderHID::init(deviceConfig); _useFeature = true; _ledBuffer.resize(_ledRGBCount); - - // setup the timer - _timer.setSingleShot(false); - _timer.setInterval(5000); - connect(&_timer, SIGNAL(timeout()), this, SLOT(rewriteLeds())); - - // start the timer - _timer.start(); } LedDevice* LedDeviceRawHID::construct(const QJsonObject &deviceConfig) @@ -25,9 +16,6 @@ LedDevice* LedDeviceRawHID::construct(const QJsonObject &deviceConfig) int LedDeviceRawHID::write(const std::vector & ledValues) { - // restart the timer - _timer.start(); - // write data memcpy(_ledBuffer.data(), ledValues.data(), _ledRGBCount); return writeBytes(_ledBuffer.size(), _ledBuffer.data()); diff --git a/libsrc/leddevice/LedDeviceRawHID.h b/libsrc/leddevice/LedDeviceRawHID.h index f6c31582..f545f8cf 100644 --- a/libsrc/leddevice/LedDeviceRawHID.h +++ b/libsrc/leddevice/LedDeviceRawHID.h @@ -36,9 +36,4 @@ private: /// @return Zero on succes else negative /// virtual int write(const std::vector & ledValues); - - /// 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; }; diff --git a/libsrc/leddevice/LedDeviceSchemas.qrc b/libsrc/leddevice/LedDeviceSchemas.qrc index efff45fd..57274af9 100644 --- a/libsrc/leddevice/LedDeviceSchemas.qrc +++ b/libsrc/leddevice/LedDeviceSchemas.qrc @@ -2,31 +2,31 @@ schemas/schema-adalight.json schemas/schema-apa102.json - schemas/schema-atmo.json schemas/schema-atmoorb.json - schemas/schema-e131.json + schemas/schema-atmo.json + schemas/schema-dmx.json schemas/schema-fadecandy.json schemas/schema-file.json - schemas/schema-hyperion-usbasp.json + schemas/schema-hyperionusbasp.json schemas/schema-lightpack.json schemas/schema-lpd6803.json schemas/schema-lpd8806.json - schemas/schema-multi-lightpack.json + schemas/schema-multilightpack.json schemas/schema-p9813.json schemas/schema-paintpack.json schemas/schema-philipshue.json schemas/schema-piblaster.json schemas/schema-rawhid.json schemas/schema-sedu.json - schemas/schema-dmx.json schemas/schema-sk6812spi.json schemas/schema-tinkerforge.json schemas/schema-tpm2net.json - schemas/schema-tpm2.json + schemas/schema-tpm2.json + schemas/schema-e131.json + schemas/schema-h801.json schemas/schema-udpraw.json schemas/schema-ws2801.json schemas/schema-ws2812spi.json schemas/schema-ws281x.json - schemas/schema-h801.json diff --git a/libsrc/leddevice/LedDeviceTinkerforge.cpp b/libsrc/leddevice/LedDeviceTinkerforge.cpp index b251c620..70e94e1f 100644 --- a/libsrc/leddevice/LedDeviceTinkerforge.cpp +++ b/libsrc/leddevice/LedDeviceTinkerforge.cpp @@ -33,6 +33,8 @@ LedDeviceTinkerforge::~LedDeviceTinkerforge() bool LedDeviceTinkerforge::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); + _host = deviceConfig["output"].toString("127.0.0.1").toStdString(); _port = deviceConfig["port"].toInt(4223); _uid = deviceConfig["uid"].toString().toStdString(); diff --git a/libsrc/leddevice/LedDeviceWS281x.cpp b/libsrc/leddevice/LedDeviceWS281x.cpp index 2e9ae0ca..2ac10a08 100644 --- a/libsrc/leddevice/LedDeviceWS281x.cpp +++ b/libsrc/leddevice/LedDeviceWS281x.cpp @@ -18,6 +18,8 @@ LedDeviceWS281x::~LedDeviceWS281x() bool LedDeviceWS281x::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); + std::string whiteAlgorithm = deviceConfig["white_algorithm"].toString("white_off").toStdString(); _whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm); Debug( _log, "whiteAlgorithm : %s", whiteAlgorithm.c_str()); diff --git a/libsrc/leddevice/ProviderHID.cpp b/libsrc/leddevice/ProviderHID.cpp index 97b97781..76be0e70 100644 --- a/libsrc/leddevice/ProviderHID.cpp +++ b/libsrc/leddevice/ProviderHID.cpp @@ -29,6 +29,8 @@ ProviderHID::~ProviderHID() bool ProviderHID::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); + _delayAfterConnect_ms = deviceConfig["delayAfterConnect"].toInt(0); auto VendorIdString = deviceConfig["VID"].toString("0x2341").toStdString(); auto ProductIdString = deviceConfig["PID"].toString("0x8036").toStdString(); diff --git a/libsrc/leddevice/ProviderRs232.cpp b/libsrc/leddevice/ProviderRs232.cpp index 3351d713..654dbdc3 100644 --- a/libsrc/leddevice/ProviderRs232.cpp +++ b/libsrc/leddevice/ProviderRs232.cpp @@ -26,10 +26,12 @@ ProviderRs232::ProviderRs232() bool ProviderRs232::init(const QJsonObject &deviceConfig) { closeDevice(); + + LedDevice::init(deviceConfig); + _deviceName = deviceConfig["output"].toString().toStdString(); _baudRate_Hz = deviceConfig["rate"].toInt(); _delayAfterConnect_ms = deviceConfig["delayAfterConnect"].toInt(250); - _refresh_timer.setInterval( deviceConfig["rewriteTime"].toInt(5000) ); return true; } diff --git a/libsrc/leddevice/ProviderSpi.cpp b/libsrc/leddevice/ProviderSpi.cpp index 2047c5ba..7f4eccbb 100644 --- a/libsrc/leddevice/ProviderSpi.cpp +++ b/libsrc/leddevice/ProviderSpi.cpp @@ -33,12 +33,14 @@ ProviderSpi::~ProviderSpi() bool ProviderSpi::init(const QJsonObject &deviceConfig) { + LedDevice::init(deviceConfig); + _deviceName = deviceConfig["output"].toString(QString::fromStdString(_deviceName)).toStdString(); _baudRate_Hz = deviceConfig["rate"].toInt(_baudRate_Hz); _latchTime_ns = deviceConfig["latchtime"].toInt(_latchTime_ns); _spiMode = deviceConfig["spimode"].toInt(_spiMode); _spiDataInvert = deviceConfig["invert"].toBool(_spiDataInvert); - + return true; } diff --git a/libsrc/leddevice/ProviderUdp.cpp b/libsrc/leddevice/ProviderUdp.cpp index 878821f1..59ca7f28 100644 --- a/libsrc/leddevice/ProviderUdp.cpp +++ b/libsrc/leddevice/ProviderUdp.cpp @@ -30,6 +30,8 @@ ProviderUdp::~ProviderUdp() bool ProviderUdp::init(const QJsonObject &deviceConfig, std::string defaultHost) { + LedDevice::init(deviceConfig); + QString host = deviceConfig["host"].toString(QString::fromStdString(defaultHost)); if (_address.setAddress(host) ) diff --git a/libsrc/leddevice/schemas/schema-adalight.json b/libsrc/leddevice/schemas/schema-adalight.json index cbfd3745..adcd77ea 100644 --- a/libsrc/leddevice/schemas/schema-adalight.json +++ b/libsrc/leddevice/schemas/schema-adalight.json @@ -5,6 +5,7 @@ "output": { "type": "string", "title":"Output path", + "default":"/dev/ttyACM0", "propertyOrder" : 1 }, "rate": { @@ -20,19 +21,12 @@ "append" : "ms", "propertyOrder" : 3 }, - "rewriteTime": { - "type": "integer", - "title":"refresh time", - "default": 5000, - "append" : "ms", - "propertyOrder" : 4 - }, "lightberry_apa102_mode": { "type": "boolean", "format": "checkbox", "title":"LightBerry APA102 Mode", "default": false, - "propertyOrder" : 5 + "propertyOrder" : 4 } }, "additionalProperties": true diff --git a/libsrc/leddevice/schemas/schema-atmo.json b/libsrc/leddevice/schemas/schema-atmo.json index 339c5230..8dacc228 100644 --- a/libsrc/leddevice/schemas/schema-atmo.json +++ b/libsrc/leddevice/schemas/schema-atmo.json @@ -19,13 +19,6 @@ "default": 250, "append" : "ms", "propertyOrder" : 3 - }, - "rewriteTime": { - "type": "integer", - "title":"refresh time", - "default": 5000, - "append" : "ms", - "propertyOrder" : 4 } }, "additionalProperties": true diff --git a/libsrc/leddevice/schemas/schema-hyperion-usbasp.json b/libsrc/leddevice/schemas/schema-hyperionusbasp.json similarity index 100% rename from libsrc/leddevice/schemas/schema-hyperion-usbasp.json rename to libsrc/leddevice/schemas/schema-hyperionusbasp.json diff --git a/libsrc/leddevice/schemas/schema-multi-lightpack.json b/libsrc/leddevice/schemas/schema-multilightpack.json similarity index 57% rename from libsrc/leddevice/schemas/schema-multi-lightpack.json rename to libsrc/leddevice/schemas/schema-multilightpack.json index 4834bff2..0bce7984 100644 --- a/libsrc/leddevice/schemas/schema-multi-lightpack.json +++ b/libsrc/leddevice/schemas/schema-multilightpack.json @@ -2,10 +2,6 @@ "type":"object", "required":true, "properties":{ - "output": { - "type": "string", - "title":"Serial number" - } }, "additionalProperties": true } diff --git a/libsrc/leddevice/schemas/schema-piblaster.json b/libsrc/leddevice/schemas/schema-piblaster.json index 0bce7984..81ec1287 100644 --- a/libsrc/leddevice/schemas/schema-piblaster.json +++ b/libsrc/leddevice/schemas/schema-piblaster.json @@ -2,6 +2,52 @@ "type":"object", "required":true, "properties":{ + "output": { + "type": "string", + "title":"Pi-Blaster FiFo", + "default" : "/dev/pi-blaster", + "propertyOrder" : 1 + }, + "gpiomap": { + "type": "array", + "title":"GPIO Map", + "propertyOrder" : 2, + "minimum" : 1, + "maximum" : 27, + "items" : { + "type" : "object", + "required" : true, + "properties" : + { + "gpio" : + { + "type" : "integer", + "title" : "GPIO BCMxx", + "minimum" : 0, + "maximum" : 27, + "required" : true, + "propertyOrder" : 1 + }, + "ledindex" : + { + "type" : "integer", + "title" : "LED index", + "minimum" : 0, + "required" : true, + "propertyOrder" : 2 + }, + "ledcolor" : + { + "type" : "string", + "title" : "Color component", + "enum" : ["r","g","b","w"], + "required" : true, + "propertyOrder" : 3 + } + } + }, + "propertyOrder" : 3 + } }, "additionalProperties": true } diff --git a/libsrc/leddevice/schemas/schema-sedu.json b/libsrc/leddevice/schemas/schema-sedu.json index f559ca99..4755a475 100644 --- a/libsrc/leddevice/schemas/schema-sedu.json +++ b/libsrc/leddevice/schemas/schema-sedu.json @@ -18,13 +18,6 @@ "title":"Delay after connect", "default": 250, "propertyOrder" : 3 - }, - "rewriteTime": { - "type": "integer", - "title":"refresh time", - "default": 5000, - "append" : "ms", - "propertyOrder" : 4 } }, "additionalProperties": true diff --git a/libsrc/leddevice/schemas/schema-tpm2.json b/libsrc/leddevice/schemas/schema-tpm2.json index f559ca99..4755a475 100644 --- a/libsrc/leddevice/schemas/schema-tpm2.json +++ b/libsrc/leddevice/schemas/schema-tpm2.json @@ -18,13 +18,6 @@ "title":"Delay after connect", "default": 250, "propertyOrder" : 3 - }, - "rewriteTime": { - "type": "integer", - "title":"refresh time", - "default": 5000, - "append" : "ms", - "propertyOrder" : 4 } }, "additionalProperties": true diff --git a/libsrc/leddevice/schemas/schema-ws2801.json b/libsrc/leddevice/schemas/schema-ws2801.json index 3ba66ef1..80cf6b1e 100644 --- a/libsrc/leddevice/schemas/schema-ws2801.json +++ b/libsrc/leddevice/schemas/schema-ws2801.json @@ -16,7 +16,7 @@ }, "latchtime": { "type": "integer", - "title":"Latchtime", + "title":"Latch time", "default": 500000, "append" : "ns", "propertyOrder" : 3