From d4635bba4ebaeccfbaa8b312751911ca849118fd Mon Sep 17 00:00:00 2001 From: penfold42 Date: Mon, 11 Jul 2016 01:07:19 +1000 Subject: [PATCH] Sk6812rgbwfix (#95) * sk6812rgbw bug fix and rename device to sk6812rgbw-spi * Added white_algorithm support to sk6812rgbw-spi device type --- libsrc/leddevice/LedDeviceFactory.cpp | 5 +++-- libsrc/leddevice/LedDeviceSk6812SPI.cpp | 20 +++++++++++--------- libsrc/leddevice/LedDeviceSk6812SPI.h | 8 +++++--- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp index b1fd683d..9c1a259a 100755 --- a/libsrc/leddevice/LedDeviceFactory.cpp +++ b/libsrc/leddevice/LedDeviceFactory.cpp @@ -147,12 +147,13 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) device = deviceWs2812SPI; } - else if (type == "sk6812spi") + else if (type == "sk6812rgbw-spi") { const std::string output = deviceConfig["output"].asString(); const unsigned rate = deviceConfig.get("rate",2857143).asInt(); + const std::string& whiteAlgorithm = deviceConfig.get("white_algorithm","").asString(); - LedDeviceSk6812SPI* deviceSk6812SPI = new LedDeviceSk6812SPI(output, rate); + LedDeviceSk6812SPI* deviceSk6812SPI = new LedDeviceSk6812SPI(output, rate, whiteAlgorithm); deviceSk6812SPI->open(); device = deviceSk6812SPI; diff --git a/libsrc/leddevice/LedDeviceSk6812SPI.cpp b/libsrc/leddevice/LedDeviceSk6812SPI.cpp index 42002580..0e53e860 100644 --- a/libsrc/leddevice/LedDeviceSk6812SPI.cpp +++ b/libsrc/leddevice/LedDeviceSk6812SPI.cpp @@ -11,9 +11,10 @@ // hyperion local includes #include "LedDeviceSk6812SPI.h" -LedDeviceSk6812SPI::LedDeviceSk6812SPI(const std::string& outputDevice, const unsigned baudrate) : +LedDeviceSk6812SPI::LedDeviceSk6812SPI(const std::string& outputDevice, const unsigned baudrate, const std::string& whiteAlgorithm) : LedSpiDevice(outputDevice, baudrate, 0), mLedCount(0), + _whiteAlgorithm(whiteAlgorithm), bitpair_to_byte { 0b10001000, 0b10001100, @@ -22,7 +23,7 @@ LedDeviceSk6812SPI::LedDeviceSk6812SPI(const std::string& outputDevice, const un } { - // empty + Debug( _log, "whiteAlgorithm : %s", whiteAlgorithm.c_str()); } int LedDeviceSk6812SPI::write(const std::vector &ledValues) @@ -30,7 +31,7 @@ int LedDeviceSk6812SPI::write(const std::vector &ledValues) mLedCount = ledValues.size(); // 4 colours, 4 spi bytes per colour + 3 frame end latch bytes -#define COLOURS_PER_LED 3 +#define COLOURS_PER_LED 4 #define SPI_BYTES_PER_COLOUR 4 #define SPI_BYTES_PER_LED COLOURS_PER_LED * SPI_BYTES_PER_COLOUR @@ -40,13 +41,14 @@ int LedDeviceSk6812SPI::write(const std::vector &ledValues) } unsigned spi_ptr = 0; - for (unsigned i=0; i< mLedCount; ++i) { - uint8_t white = 0; + + for (const ColorRgb& color : ledValues) { + Rgb_to_Rgbw(color, &_temp_rgbw, _whiteAlgorithm); uint32_t colorBits = - ((unsigned int)ledValues[i].red << 24) | - ((unsigned int)ledValues[i].green << 16) | - ((unsigned int)ledValues[i].blue << 8) | - white; + ((uint32_t)_temp_rgbw.red << 24) + + ((uint32_t)_temp_rgbw.green << 16) + + ((uint32_t)_temp_rgbw.blue << 8) + + _temp_rgbw.white; for (int j=SPI_BYTES_PER_LED - 1; j>=0; j--) { _spiBuffer[spi_ptr+j] = bitpair_to_byte[ colorBits & 0x3 ]; diff --git a/libsrc/leddevice/LedDeviceSk6812SPI.h b/libsrc/leddevice/LedDeviceSk6812SPI.h index fc7ea01f..1b7df8b7 100644 --- a/libsrc/leddevice/LedDeviceSk6812SPI.h +++ b/libsrc/leddevice/LedDeviceSk6812SPI.h @@ -19,8 +19,8 @@ public: /// @param baudrate The used baudrate for writing to the output device /// - LedDeviceSk6812SPI(const std::string& outputDevice, - const unsigned baudrate); + LedDeviceSk6812SPI(const std::string& outputDevice, const unsigned baudrate, + const std::string& whiteAlgorithm); /// /// Writes the led color values to the led-device @@ -39,5 +39,7 @@ private: size_t mLedCount; std::vector _spiBuffer; - uint8_t bitpair_to_byte[4]; + std::string _whiteAlgorithm; + uint8_t bitpair_to_byte[4]; + ColorRgbw _temp_rgbw; };