mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Added Ws2812b specific device
Former-commit-id: 675c8f578de42d12e25162065c0d0381ad0e08f6
This commit is contained in:
@@ -26,6 +26,7 @@ SET(Leddevice_HEADERS
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceSedu.h
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceWs2801.h
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceWs2811.h
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceWs2812b.h
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceLpd6803.h
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceLpd8806.h
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceLightpack.h
|
||||
@@ -42,6 +43,7 @@ SET(Leddevice_SOURCES
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceTest.cpp
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceWs2801.cpp
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceWs2811.cpp
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceWs2812b.cpp
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceLpd6803.cpp
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceLpd8806.cpp
|
||||
${CURRENT_SOURCE_DIR}/LedDeviceAdalight.cpp
|
||||
|
@@ -9,6 +9,7 @@
|
||||
#include "LedDeviceTest.h"
|
||||
#include "LedDeviceWs2801.h"
|
||||
#include "LedDeviceWs2811.h"
|
||||
#include "LedDeviceWs2812b.h"
|
||||
#include "LedDeviceAdalight.h"
|
||||
#include "LedDevicePaintpack.h"
|
||||
#include "LedDeviceLightpack.h"
|
||||
@@ -32,6 +33,13 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
||||
|
||||
device = deviceWs2801;
|
||||
}
|
||||
else if (type == "ws2812b")
|
||||
{
|
||||
LedDeviceWs2812b * deviceWs2812b = new LedDeviceWs2812b();
|
||||
deviceWs2812b->open();
|
||||
|
||||
device = deviceWs2812b;
|
||||
}
|
||||
// else if (type == "ws2811")
|
||||
// {
|
||||
// const std::string output = deviceConfig["output"].asString();
|
||||
|
88
libsrc/leddevice/LedDeviceWs2812b.cpp
Normal file
88
libsrc/leddevice/LedDeviceWs2812b.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
|
||||
// Local Hyperion-Leddevice includes
|
||||
#include "LedDeviceWs2812b.h"
|
||||
|
||||
LedDeviceWs2812b::LedDeviceWs2812b() :
|
||||
LedRs232Device("/dev/ttyAMA0", 4000000)
|
||||
{
|
||||
fillTable();
|
||||
}
|
||||
|
||||
int LedDeviceWs2812b::write(const std::vector<ColorRgb> & ledValues)
|
||||
{
|
||||
// Ensure the size of the led-buffer
|
||||
if (_ledBuffer.size() != ledValues.size()*3)
|
||||
{
|
||||
_ledBuffer.resize(ledValues.size()*3);
|
||||
}
|
||||
|
||||
// Translate the channel of each color to a signal
|
||||
auto bufIt = _ledBuffer.begin();
|
||||
for (const ColorRgb& color : ledValues)
|
||||
{
|
||||
*bufIt++ = _byte2signalTable[color.red];
|
||||
*bufIt++ = _byte2signalTable[color.green];
|
||||
*bufIt++ = _byte2signalTable[color.blue];
|
||||
}
|
||||
|
||||
return writeBytes(_ledBuffer.size()*sizeof(ByteSignal), reinterpret_cast<uint8_t *>(_ledBuffer.data()));
|
||||
}
|
||||
|
||||
int LedDeviceWs2812b::switchOff()
|
||||
{
|
||||
// Set all bytes in the signal buffer to zero
|
||||
for (ByteSignal & signal : _ledBuffer)
|
||||
{
|
||||
signal = _byte2signalTable[0];
|
||||
}
|
||||
|
||||
return writeBytes(_ledBuffer.size()*sizeof(ByteSignal), reinterpret_cast<uint8_t *>(_ledBuffer.data()));
|
||||
}
|
||||
|
||||
void LedDeviceWs2812b::fillTable()
|
||||
{
|
||||
_byte2signalTable.clear();
|
||||
for (int byte=0; byte<256; ++byte)
|
||||
{
|
||||
const ByteSignal signal = byte2Signal(uint8_t(byte));
|
||||
_byte2signalTable.push_back(signal);
|
||||
}
|
||||
}
|
||||
|
||||
LedDeviceWs2812b::ByteSignal LedDeviceWs2812b::byte2Signal(const uint8_t byte) const
|
||||
{
|
||||
ByteSignal result;
|
||||
result.bit_12 = bits2Signal(byte & 0x80, byte & 0x40);
|
||||
result.bit_34 = bits2Signal(byte & 0x20, byte & 0x10);
|
||||
result.bit_56 = bits2Signal(byte & 0x08, byte & 0x04);
|
||||
result.bit_78 = bits2Signal(byte & 0x02, byte & 0x01);
|
||||
return result;
|
||||
}
|
||||
|
||||
uint8_t LedDeviceWs2812b::bits2Signal(const bool bit1, const bool bit2) const
|
||||
{
|
||||
if (bit1)
|
||||
{
|
||||
if (bit2)
|
||||
{
|
||||
return 0x8C;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0xCC;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bit2)
|
||||
{
|
||||
return 0x8E;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0xCE;
|
||||
}
|
||||
}
|
||||
|
||||
return 0x00;
|
||||
}
|
34
libsrc/leddevice/LedDeviceWs2812b.h
Normal file
34
libsrc/leddevice/LedDeviceWs2812b.h
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
// Hyperion leddevice includes
|
||||
#include "LedRs232Device.h"
|
||||
|
||||
class LedDeviceWs2812b : public LedRs232Device
|
||||
{
|
||||
public:
|
||||
LedDeviceWs2812b();
|
||||
|
||||
virtual int write(const std::vector<ColorRgb> & ledValues);
|
||||
|
||||
virtual int switchOff();
|
||||
|
||||
private:
|
||||
|
||||
struct ByteSignal
|
||||
{
|
||||
uint8_t bit_12;
|
||||
uint8_t bit_34;
|
||||
uint8_t bit_56;
|
||||
uint8_t bit_78;
|
||||
};
|
||||
std::vector<ByteSignal> _byte2signalTable;
|
||||
|
||||
void fillTable();
|
||||
|
||||
ByteSignal byte2Signal(const uint8_t byte) const;
|
||||
|
||||
uint8_t bits2Signal(const bool bit1, const bool bit2) const;
|
||||
|
||||
std::vector<ByteSignal> _ledBuffer;
|
||||
};
|
@@ -58,6 +58,7 @@ int LedRs232Device::writeBytes(const unsigned size, const uint8_t * data)
|
||||
try
|
||||
{
|
||||
_rs232Port.write(data, size);
|
||||
_rs232Port.flush();
|
||||
}
|
||||
catch (const serial::SerialException & serialExc)
|
||||
{
|
||||
@@ -77,6 +78,7 @@ int LedRs232Device::writeBytes(const unsigned size, const uint8_t * data)
|
||||
{
|
||||
_rs232Port.open();
|
||||
_rs232Port.write(data, size);
|
||||
_rs232Port.flush();
|
||||
}
|
||||
catch (const std::exception & e)
|
||||
{
|
||||
|
Reference in New Issue
Block a user