diff --git a/libsrc/leddevice/LedDeviceAmbiLed.cpp b/libsrc/leddevice/LedDeviceAmbiLed.cpp new file mode 100644 index 00000000..755d146c --- /dev/null +++ b/libsrc/leddevice/LedDeviceAmbiLed.cpp @@ -0,0 +1,52 @@ +// STL includes +#include +#include +#include + +// hyperion local includes +#include "LedDeviceAmbiLed.h" + +LedDeviceAmbiLed::LedDeviceAmbiLed(const std::string& outputDevice, const unsigned baudrate, int delayAfterConnect_ms) : + LedRs232Device(outputDevice, baudrate, delayAfterConnect_ms), + _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 LedDeviceAmbiLed::write(const std::vector & ledValues) +{ + if (_ledBuffer.size() == 0) + { + _ledBuffer.resize(1 + 3*ledValues.size()); + _ledBuffer[3*ledValues.size()] = 255; + } + + // restart the timer + _timer.start(); + + // write data + memcpy( _ledBuffer.data(), ledValues.data(), ledValues.size() * 3); + return writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} + +int LedDeviceAmbiLed::switchOff() +{ + // restart the timer + _timer.start(); + + // write data + memset(_ledBuffer.data(), 0, _ledBuffer.size()-6); + return writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} + +void LedDeviceAmbiLed::rewriteLeds() +{ + writeBytes(_ledBuffer.size(), _ledBuffer.data()); +} diff --git a/libsrc/leddevice/LedDeviceAmbiLed.h b/libsrc/leddevice/LedDeviceAmbiLed.h new file mode 100644 index 00000000..6a99e071 --- /dev/null +++ b/libsrc/leddevice/LedDeviceAmbiLed.h @@ -0,0 +1,51 @@ +#pragma once + +// STL includes +#include + +// Qt includes +#include + +// hyperion incluse +#include "LedRs232Device.h" + +/// +/// Implementation of the LedDevice interface for writing to an Adalight led device. +/// +class LedDeviceAmbiLed : public LedRs232Device +{ + Q_OBJECT + +public: + /// + /// Constructs the LedDevice for attached Adalight device + /// + /// @param outputDevice The name of the output device (eg '/dev/ttyS0') + /// @param baudrate The used baudrate for writing to the output device + /// + LedDeviceAmbiLed(const std::string& outputDevice, const unsigned baudrate, 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 Adalight device will switch off when it does not receive data at least + /// every 15 seconds + QTimer _timer; +}; diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp index 3208b393..9e547920 100755 --- a/libsrc/leddevice/LedDeviceFactory.cpp +++ b/libsrc/leddevice/LedDeviceFactory.cpp @@ -22,6 +22,7 @@ #endif #include "LedDeviceAdalight.h" +#include "LedDeviceAmbiLed.h" #include "LedDeviceLightpack.h" #include "LedDeviceMultiLightpack.h" #include "LedDevicePaintpack.h" @@ -56,6 +57,17 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) device = deviceAdalight; } + else if (type == "ambiled") + { + const std::string output = deviceConfig["output"].asString(); + const unsigned rate = deviceConfig["rate"].asInt(); + const int delay_ms = deviceConfig["delayAfterConnect"].asInt(); + + LedDeviceAmbiLed* deviceAmbiLed = new LedDeviceAmbiLed(output, rate, delay_ms); + deviceAmbiLed->open(); + + device = deviceAmbiLed; + } #ifdef ENABLE_SPIDEV else if (type == "lpd6803" || type == "ldp6803") {