initial version of h801 led device

This commit is contained in:
Rick van Hattem 2016-09-21 23:03:01 +02:00
parent eeb9b0f7da
commit 1fb2f6be0b
6 changed files with 159 additions and 1 deletions

View File

@ -35,6 +35,7 @@ SET(Leddevice_HEADERS
${CURRENT_SOURCE_DIR}/LedDeviceSedu.h
${CURRENT_SOURCE_DIR}/LedDeviceFile.h
${CURRENT_SOURCE_DIR}/LedDeviceUdpRaw.h
${CURRENT_SOURCE_DIR}/LedDeviceUdpH801.h
${CURRENT_SOURCE_DIR}/LedDeviceUdpE131.h
${CURRENT_SOURCE_DIR}/ProviderUdp.h
${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.h
@ -62,6 +63,7 @@ SET(Leddevice_SOURCES
${CURRENT_SOURCE_DIR}/LedDeviceFile.cpp
${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.cpp
${CURRENT_SOURCE_DIR}/LedDeviceUdpRaw.cpp
${CURRENT_SOURCE_DIR}/LedDeviceUdpH801.cpp
${CURRENT_SOURCE_DIR}/LedDeviceUdpE131.cpp
${CURRENT_SOURCE_DIR}/ProviderUdp.cpp
${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.cpp

View File

@ -46,6 +46,7 @@
#include "LedDeviceAtmo.h"
#include "LedDeviceAdalightApa102.h"
#include "LedDeviceAtmoOrb.h"
#include "LedDeviceUdpH801.h"
#ifdef ENABLE_WS2812BPWM
#include "LedDeviceWS2812b.h"
@ -101,7 +102,8 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
#endif
LedDevice::addToDeviceMap("philipshue", LedDevicePhilipsHue::construct);
LedDevice::addToDeviceMap("atmoorb", LedDeviceAtmoOrb::construct);
LedDevice::addToDeviceMap("h801", LedDeviceUdpH801::construct);
// direct usb
LedDevice::addToDeviceMap("hyperion-usbasp", LedDeviceHyperionUsbasp::construct);
LedDevice::addToDeviceMap("rawhid", LedDeviceRawHID::construct);

View File

@ -27,5 +27,6 @@
<file alias="schema-ws2801">schemas/schema-ws2801.json</file>
<file alias="schema-ws2812spi">schemas/schema-ws2812spi.json</file>
<file alias="schema-ws281x">schemas/schema-ws281x.json</file>
<file alias="schema-h801">schemas/schema-h801.json</file>
</qresource>
</RCC>

View File

@ -0,0 +1,67 @@
// STL includes
#include <cstring>
#include <cstdio>
#include <iostream>
#include <QHostInfo>
// hyperion local includes
#include "LedDeviceUdpH801.h"
LedDeviceUdpH801::LedDeviceUdpH801(const Json::Value &deviceConfig) : ProviderUdp(deviceConfig)
{
setConfig(deviceConfig);
}
bool LedDeviceUdpH801::setConfig(const Json::Value &deviceConfig)
{
/* The H801 port is fixed */
_port = 30977;
/* 10ms seems to be a safe default for the wait time */
_LatchTime_ns = deviceConfig.get("latchtime", 10000000).asInt();
_ids.clear();
for (Json::Value::ArrayIndex i = 0; i < deviceConfig["lightIds"].size(); i++) {
QString id(deviceConfig["lightIds"][i].asCString());
_ids.push_back(id.toInt(nullptr, 16));
}
_message = QByteArray(_prefix_size + _colors + _id_size * _ids.size() + _suffix_size, 0x00);
_message[0] = 0xFB;
_message[1] = 0xEB;
for(int i=0; i<_ids.length(); i++){
_message[_prefix_size + _colors + i * _id_size + 0] = (_ids[i] >> 0x00) & 0xFF;
_message[_prefix_size + _colors + i * _id_size + 1] = (_ids[i] >> 0x08) & 0xFF;
_message[_prefix_size + _colors + i * _id_size + 2] = (_ids[i] >> 0x10) & 0xFF;
}
Debug( _log, "H801 using %s:%d", _address.toString().toStdString().c_str() , _port );
return true;
}
LedDevice* LedDeviceUdpH801::construct(const Json::Value &deviceConfig)
{
return new LedDeviceUdpH801(deviceConfig);
}
int LedDeviceUdpH801::write(const std::vector<ColorRgb> &ledValues)
{
ColorRgb color = ledValues[0];
_message[_prefix_size + 0] = color.red;
_message[_prefix_size + 1] = color.green;
_message[_prefix_size + 2] = color.blue;
writeBytes(_message.size(), reinterpret_cast<const uint8_t*>(_message.data()));
}
int LedDeviceUdpH801::switchOff()
{
return write(std::vector<ColorRgb>(_ledCount, ColorRgb{0,0,0}));
}
LedDeviceUdpH801::~LedDeviceUdpH801()
{
ProviderUdp::~ProviderUdp();
}

View File

@ -0,0 +1,59 @@
#pragma once
#include <QtCore>
#include <QByteArray>
#include <QUdpSocket>
// STL includes
#include <string>
// hyperion includes
#include "ProviderUdp.h"
///
/// Implementation of the LedDevice interface for sending led colors via udp.
///
class LedDeviceUdpH801 : public ProviderUdp
{
protected:
QList<int> _ids;
QByteArray _message;
const int _prefix_size = 2;
const int _colors = 5;
const int _id_size = 3;
const int _suffix_size = 1;
public:
///
/// Constructs specific LedDevice
///
/// @param deviceConfig json device config
///
LedDeviceUdpH801(const Json::Value &deviceConfig);
///
/// Destructor of the LedDevice; closes the output device if it is open
///
virtual ~LedDeviceUdpH801();
///
/// Sets configuration
///
/// @param deviceConfig the json device config
/// @return true if success
bool setConfig(const Json::Value &deviceConfig);
/// constructs leddevice
static LedDevice* construct(const Json::Value &deviceConfig);
///
/// 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<ColorRgb> &ledValues);
/// Switch the leds off
virtual int switchOff();
};

View File

@ -0,0 +1,27 @@
{
"type":"object",
"required":true,
"properties":{
"host" : {
"type": "string",
"title":"Target IP",
"default": "255.255.255.255",
"propertyOrder" : 1
},
"port" : {
"type": "integer",
"title":"Port",
"default": 30977,
"propertyOrder" : 2
},
"lightIds": {
"type": "array",
"title":"Light ids",
"items" : {
"type" : "string"
},
"propertyOrder" : 3
}
},
"additionalProperties": true
}