From 0dcacede815f8dc31adfc87496f17a806cdc5bd7 Mon Sep 17 00:00:00 2001 From: redpanther Date: Mon, 4 Jan 2016 12:06:56 +0100 Subject: [PATCH] add fadecandy led device Former-commit-id: 4076e6ec2860ceaa53fdd07c47c40e45f2329de9 --- libsrc/leddevice/LedDeviceFadeCandy.cpp | 89 +++++++++++++++++++++++++ libsrc/leddevice/LedDeviceFadeCandy.h | 55 +++++++++++++++ 2 files changed, 144 insertions(+) create mode 100755 libsrc/leddevice/LedDeviceFadeCandy.cpp create mode 100755 libsrc/leddevice/LedDeviceFadeCandy.h diff --git a/libsrc/leddevice/LedDeviceFadeCandy.cpp b/libsrc/leddevice/LedDeviceFadeCandy.cpp new file mode 100755 index 00000000..ec6da6a2 --- /dev/null +++ b/libsrc/leddevice/LedDeviceFadeCandy.cpp @@ -0,0 +1,89 @@ + +// Local-Hyperion includes +#include "LedDeviceFadeCandy.h" +#include +#include +#include + +static const unsigned MAX_NUM_LEDS = 512; + +/* OPC broadcast channel */ +static const unsigned OPC_BROADCAST = 0; + +/* OPC command codes */ +static const unsigned OPC_SET_PIXELS = 0; + +LedDeviceFadeCandy::LedDeviceFadeCandy(const std::string& host, const uint16_t port) + : _host(host), _port(port) +{ + _opc_data.resize(4); + _opc_data[0] = OPC_BROADCAST; + _opc_data[1] = OPC_SET_PIXELS; + _opc_data[2] = 0; + _opc_data[3] = 0; + + qDebug("connect to %s %i",_host.c_str(),_port); +} + +LedDeviceFadeCandy::~LedDeviceFadeCandy() +{ + _client.close(); +} + +bool LedDeviceFadeCandy::isConnected() +{ + return _client.state() == QAbstractSocket::ConnectedState; +} + +bool LedDeviceFadeCandy::tryConnect() +{ + if ( _client.state() == QAbstractSocket::UnconnectedState ) { + qDebug("connecting"); + QHostAddress addr(_host.c_str()); + _client.connectToHost(addr, _port); + if (_client.waitForConnected(1000)) + qDebug("connected"); + } + + return isConnected(); +} + + +int LedDeviceFadeCandy::write(const std::vector & ledValues) +{ + ssize_t nrLedValues = ledValues.size(); + ssize_t led_data_size = nrLedValues*3; // 3 color bytes + ssize_t opc_data_size = led_data_size +4; // + 4 byte header + + if (nrLedValues > MAX_NUM_LEDS) + { + std::cerr << "Invalid attempt to write led values. Not more than " << MAX_NUM_LEDS << " leds are allowed." << std::endl; + return -1; + } + + if ( opc_data_size != _opc_data.size()) + _opc_data.resize(opc_data_size); + + _opc_data[2] = led_data_size >> 8; + _opc_data[3] = led_data_size & 0xff; + + if ( isConnected() || tryConnect() ) { + u_int16_t idx = 4; + for (const ColorRgb& color : ledValues) + { + _opc_data[idx] = unsigned(color.red); + _opc_data[idx+1] = unsigned(color.green); + _opc_data[idx+2] = unsigned(color.blue); + idx += 3; + } + _client.write(_opc_data, opc_data_size); + } + + return 0; +} + + +int LedDeviceFadeCandy::switchOff() +{ + return 0; +} diff --git a/libsrc/leddevice/LedDeviceFadeCandy.h b/libsrc/leddevice/LedDeviceFadeCandy.h new file mode 100755 index 00000000..0973368b --- /dev/null +++ b/libsrc/leddevice/LedDeviceFadeCandy.h @@ -0,0 +1,55 @@ +#pragma once + +// STL includes0 +#include +#include +#include +#include +#include +#include + +// Leddevice includes +#include + + +/// +/// Implementation of the LedDevice that write the led-colors to an +/// ASCII-textfile('/home/pi/LedDevice.out') +/// +class LedDeviceFadeCandy : public QObject,public LedDevice +{ + Q_OBJECT +public: + /// + /// Constructs the test-device, which opens an output stream to the file + /// + LedDeviceFadeCandy(const std::string& host, const uint16_t port); + + /// + /// Destructor of this test-device + /// + virtual ~LedDeviceFadeCandy(); + + /// + /// Writes the given led-color values to the output stream + /// + /// @param ledValues The color-value per led + /// + /// @return Zero on success else negative + /// + virtual int write(const std::vector & ledValues); + + /// Switch the leds off + virtual int switchOff(); + + bool tryConnect(); + bool isConnected(); + +//public slots: + +private: + QTcpSocket _client; + const std::string _host; + const uint16_t _port; + QByteArray _opc_data; +};