diff --git a/libsrc/leddevice/LedDeviceFadeCandy.cpp b/libsrc/leddevice/LedDeviceFadeCandy.cpp index a0d2e32d..e8c178d1 100755 --- a/libsrc/leddevice/LedDeviceFadeCandy.cpp +++ b/libsrc/leddevice/LedDeviceFadeCandy.cpp @@ -1,87 +1,93 @@ - -// Local-Hyperion includes #include "LedDeviceFadeCandy.h" -#include -#include -#include -static const unsigned MAX_NUM_LEDS = 512; +static const unsigned MAX_NUM_LEDS = 512; +static const unsigned OPC_BROADCAST = 0; // OPC broadcast channel +static const unsigned OPC_SET_PIXELS = 0; // OPC command codes +static const unsigned OPC_HEADER_SIZE = 4; // OPC header size -/* 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) +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; + _opc_data.resize( OPC_HEADER_SIZE ); + _opc_data[0] = OPC_BROADCAST; + _opc_data[1] = OPC_SET_PIXELS; + _opc_data[2] = 0; + _opc_data[3] = 0; } + LedDeviceFadeCandy::~LedDeviceFadeCandy() { - _client.close(); + _client.close(); } + bool LedDeviceFadeCandy::isConnected() { - return _client.state() == QAbstractSocket::ConnectedState; + return _client.state() == QAbstractSocket::ConnectedState; } + bool LedDeviceFadeCandy::tryConnect() { - if ( _client.state() == QAbstractSocket::UnconnectedState ) { - qDebug("connecting to %s %i",_host.c_str(),_port); - QHostAddress addr(_host.c_str()); - _client.connectToHost(addr, _port); - if (_client.waitForConnected(1000)) - qDebug("connected"); - } + if ( _client.state() == QAbstractSocket::UnconnectedState ) { + qDebug("connecting to %s %i",_host.c_str(),_port); - return isConnected(); + _client.connectToHost( _host.c_str(), _port); + if ( _client.waitForConnected(1000) ) + qDebug("connected"); + } + + return isConnected(); } -int LedDeviceFadeCandy::write(const std::vector & ledValues) +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 + ssize_t nrLedValues = ledValues.size(); + ssize_t led_data_size = nrLedValues * 3; // 3 color bytes + ssize_t opc_data_size = led_data_size + OPC_HEADER_SIZE; - 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 (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); + 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; + _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); - } + uint idx = OPC_HEADER_SIZE; + 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; + } - return 0; + return ( transferData()<0 ? -1 : 0 ); +} + + +int LedDeviceFadeCandy::transferData() +{ + if ( isConnected() || tryConnect() ) + return _client.write( _opc_data, _opc_data.size() ); + + return -2; } int LedDeviceFadeCandy::switchOff() { - return 0; + for ( int idx=OPC_HEADER_SIZE; idx < _opc_data.size(); idx++ ) + _opc_data[idx] = 0; + + return ( transferData()<0 ? -1 : 0 ); } + diff --git a/libsrc/leddevice/LedDeviceFadeCandy.h b/libsrc/leddevice/LedDeviceFadeCandy.h index 0973368b..0b894e88 100755 --- a/libsrc/leddevice/LedDeviceFadeCandy.h +++ b/libsrc/leddevice/LedDeviceFadeCandy.h @@ -1,55 +1,70 @@ #pragma once -// STL includes0 +// STL/Qt includes #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') +/// Implementation of the LedDevice interface for sending to +/// fadecandy/opc-server via network by using the 'open pixel control' protocol. /// -class LedDeviceFadeCandy : public QObject,public LedDevice +class LedDeviceFadeCandy : public QObject, public LedDevice { - Q_OBJECT + Q_OBJECT + public: /// - /// Constructs the test-device, which opens an output stream to the file + /// Constructs the LedDevice for fadecandy/opc server + /// + /// @param host The ip address/host name of fadecandy/opc server + /// @param port The port to use (fadecandy default is 7890) /// LedDeviceFadeCandy(const std::string& host, const uint16_t port); /// - /// Destructor of this test-device + /// Destructor of the LedDevice; closes the tcp client /// virtual ~LedDeviceFadeCandy(); /// - /// Writes the given led-color values to the output stream + /// Writes the led color values to the led-device /// /// @param ledValues The color-value per led - /// - /// @return Zero on success else negative + /// @return Zero on succes 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; + QTcpSocket _client; + const std::string _host; + const uint16_t _port; + QByteArray _opc_data; + + /// try to establish connection to opc server, if not connected yet + /// + /// @return true if connection is established + /// + bool tryConnect(); + + /// return the conenction state + /// + /// @return True if connection established + /// + bool isConnected(); + + + /// transfer current opc_data buffer to opc server + /// + /// @return amount of transfered bytes. -1 error while transfering, -2 error while connecting + /// + int transferData(); + };