pcaffardi/patch-1

Former-commit-id: 4a6737d50727518ae44f494be46a7c9c2fb54513
This commit is contained in:
wisc 2016-02-07 14:52:44 +01:00
commit 543042b870

View File

@ -1,4 +1,3 @@
// STL includes // STL includes
#include <cstring> #include <cstring>
#include <cstdio> #include <cstdio>
@ -19,26 +18,45 @@ LedDeviceAPA102::LedDeviceAPA102(const std::string& outputDevice, const unsigned
// empty // empty
} }
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define APA102_START_FRAME_BYTES 4
#define APA102_LED_BYTES 4
#define APA102_END_FRAME_BITS_MIN 32
#define APA102_END_FRAME_BITS(leds) MAX((((leds-1)/2)+1),APA102_END_FRAME_BITS_MIN)
#define APA102_END_FRAME_BYTES(leds) (((APA102_END_FRAME_BITS(leds)-1)/8)+1)
#define APA102_LED_HEADER 0xe0
#define APA102_LED_MAX_INTENSITY 0x1f
int LedDeviceAPA102::write(const std::vector<ColorRgb> &ledValues) int LedDeviceAPA102::write(const std::vector<ColorRgb> &ledValues)
{ {
const unsigned int startFrameSize = 4; const unsigned int startFrameSize = APA102_START_FRAME_BYTES;
const unsigned int endFrameSize = std::max<unsigned int>(((ledValues.size() + 15) / 16), 4); const unsigned int ledsCount = ledValues.size() ;
const unsigned int mLedCount = (ledValues.size() * 4) + startFrameSize + endFrameSize; const unsigned int ledsSize = ledsCount * APA102_LED_BYTES ;
if(_ledBuffer.size() != mLedCount){ const unsigned int endFrameBits = APA102_END_FRAME_BITS(ledsCount) ;
_ledBuffer.resize(mLedCount, 0xFF); const unsigned int endFrameSize = APA102_END_FRAME_BYTES(ledsCount) ;
_ledBuffer[0] = 0x00; const unsigned int transferSize = startFrameSize + ledsSize + endFrameSize ;
_ledBuffer[1] = 0x00;
_ledBuffer[2] = 0x00; if(_ledBuffer.size() != transferSize){
_ledBuffer[3] = 0x00; _ledBuffer.resize(transferSize, 0x00);
}
unsigned idx = 0, i;
for (i=0; i<APA102_START_FRAME_BYTES; i++) {
_ledBuffer[idx++] = 0x00 ;
} }
for (unsigned iLed=1; iLed<=ledValues.size(); ++iLed) { for (i=0; i<ledsCount; i++) {
const ColorRgb& rgb = ledValues[iLed-1]; const ColorRgb& rgb = ledValues[i];
_ledBuffer[iLed*4] = 0xFF;
_ledBuffer[iLed*4+1] = rgb.red; _ledBuffer[idx++] = APA102_LED_HEADER + APA102_LED_MAX_INTENSITY;
_ledBuffer[iLed*4+2] = rgb.green; _ledBuffer[idx++] = rgb.red;
_ledBuffer[iLed*4+3] = rgb.blue; _ledBuffer[idx++] = rgb.green;
_ledBuffer[idx++] = rgb.blue;
} }
for(i=0; i<endFrameSize; i++)
_ledBuffer[idx++] = 0x00 ;
return writeBytes(_ledBuffer.size(), _ledBuffer.data()); return writeBytes(_ledBuffer.size(), _ledBuffer.data());
} }
@ -46,4 +64,4 @@ int LedDeviceAPA102::write(const std::vector<ColorRgb> &ledValues)
int LedDeviceAPA102::switchOff() int LedDeviceAPA102::switchOff()
{ {
return write(std::vector<ColorRgb>(_ledBuffer.size(), ColorRgb{0,0,0})); return write(std::vector<ColorRgb>(_ledBuffer.size(), ColorRgb{0,0,0}));
} }