From fd6d24750623d8663fababe251a3463178e002b9 Mon Sep 17 00:00:00 2001 From: "T. van der Zwan" Date: Sat, 18 Jan 2014 22:49:32 +0000 Subject: [PATCH] Slight style changes to the pull of the P9813 device Former-commit-id: 77892a5cfbcc4793061d518a761931be26ef842b --- libsrc/leddevice/CMakeLists.txt | 4 +-- libsrc/leddevice/LedDeviceFactory.cpp | 2 +- libsrc/leddevice/LedDeviceP9813.cpp | 46 +++++++++++++-------------- libsrc/leddevice/LedDeviceP9813.h | 14 ++++++-- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/libsrc/leddevice/CMakeLists.txt b/libsrc/leddevice/CMakeLists.txt index 63159184..6bfc2fe8 100644 --- a/libsrc/leddevice/CMakeLists.txt +++ b/libsrc/leddevice/CMakeLists.txt @@ -54,16 +54,16 @@ if(ENABLE_SPIDEV) ${CURRENT_SOURCE_DIR}/LedSpiDevice.h ${CURRENT_SOURCE_DIR}/LedDeviceLpd6803.h ${CURRENT_SOURCE_DIR}/LedDeviceLpd8806.h - ${CURRENT_SOURCE_DIR}/LedDeviceWs2801.h ${CURRENT_SOURCE_DIR}/LedDeviceP9813.h + ${CURRENT_SOURCE_DIR}/LedDeviceWs2801.h ) SET(Leddevice_SOURCES ${Leddevice_SOURCES} ${CURRENT_SOURCE_DIR}/LedSpiDevice.cpp ${CURRENT_SOURCE_DIR}/LedDeviceLpd6803.cpp ${CURRENT_SOURCE_DIR}/LedDeviceLpd8806.cpp - ${CURRENT_SOURCE_DIR}/LedDeviceWs2801.cpp ${CURRENT_SOURCE_DIR}/LedDeviceP9813.cpp + ${CURRENT_SOURCE_DIR}/LedDeviceWs2801.cpp ) endif(ENABLE_SPIDEV) diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp index 3b7ce9fd..d86c5b74 100644 --- a/libsrc/leddevice/LedDeviceFactory.cpp +++ b/libsrc/leddevice/LedDeviceFactory.cpp @@ -9,8 +9,8 @@ #ifdef ENABLE_SPIDEV #include "LedDeviceLpd6803.h" #include "LedDeviceLpd8806.h" - #include "LedDeviceWs2801.h" #include "LedDeviceP9813.h" + #include "LedDeviceWs2801.h" #endif #include "LedDeviceAdalight.h" diff --git a/libsrc/leddevice/LedDeviceP9813.cpp b/libsrc/leddevice/LedDeviceP9813.cpp index 6b0654ef..752fc949 100644 --- a/libsrc/leddevice/LedDeviceP9813.cpp +++ b/libsrc/leddevice/LedDeviceP9813.cpp @@ -13,44 +13,44 @@ LedDeviceP9813::LedDeviceP9813(const std::string& outputDevice, const unsigned baudrate) : LedSpiDevice(outputDevice, baudrate, 0), - mLedCount(0) + _ledCount(0) { // empty } int LedDeviceP9813::write(const std::vector &ledValues) { - mLedCount = ledValues.size(); + if (_ledCount != ledValues.size()) + { + _ledBuf.resize(ledValues.size() * 4 + 8, 0x00); + _ledCount = ledValues.size(); + } - const unsigned dataLen = ledValues.size() * 4 + 8; - uint8_t data[dataLen]; + uint8_t * dataPtr = _ledBuf.data(); + for (const ColorRgb & color : ledValues) + { + *dataPtr++ = calculateChecksum(color); + *dataPtr++ = color.blue; + *dataPtr++ = color.green; + *dataPtr++ = color.red; + } - memset(data, 0x00, dataLen); - - int j = 4; - for (unsigned i = 0; i < mLedCount; i++){ - data[j++] = calculateChecksum(ledValues[i]); - data[j++] = ledValues[i].blue; - data[j++] = ledValues[i].green; - data[j++] = ledValues[i].red; - } - - return writeBytes(dataLen, data); + return writeBytes(_ledBuf.size(), _ledBuf.data()); } int LedDeviceP9813::switchOff() { - return write(std::vector(mLedCount, ColorRgb{0,0,0})); + return write(std::vector(_ledCount, ColorRgb{0,0,0})); } -const uint8_t LedDeviceP9813::calculateChecksum(const ColorRgb color) +uint8_t LedDeviceP9813::calculateChecksum(const ColorRgb & color) const { - uint8_t res = 0; + uint8_t res = 0; - res |= (uint8_t)0x03 << 6; - res |= (uint8_t)(~(color.blue >> 6) & 0x03) << 4; - res |= (uint8_t)(~(color.green >> 6) & 0x03) << 2; - res |= (uint8_t)(~(color.red >> 6) & 0x03); + res |= (uint8_t)0x03 << 6; + res |= (uint8_t)(~(color.blue >> 6) & 0x03) << 4; + res |= (uint8_t)(~(color.green >> 6) & 0x03) << 2; + res |= (uint8_t)(~(color.red >> 6) & 0x03); - return res; + return res; } diff --git a/libsrc/leddevice/LedDeviceP9813.h b/libsrc/leddevice/LedDeviceP9813.h index a76df140..ae70619f 100644 --- a/libsrc/leddevice/LedDeviceP9813.h +++ b/libsrc/leddevice/LedDeviceP9813.h @@ -35,6 +35,16 @@ public: private: /// the number of leds - size_t mLedCount; - const uint8_t calculateChecksum(const ColorRgb color); + size_t _ledCount; + + /// Buffer for writing/written led data + std::vector _ledBuf; + + /// + /// Calculates the required checksum for one led + /// + /// @param color The color of the led + /// @return The checksum for the led + /// + uint8_t calculateChecksum(const ColorRgb & color) const; };