瀏覽代碼

Convert RGB drawing buffer to WS2812 frame buffer

main_ledos
PaulStoffregen 7 年之前
父節點
當前提交
254be49085
共有 2 個文件被更改,包括 41 次插入20 次删除
  1. +35
    -12
      WS2812Serial.cpp
  2. +6
    -8
      WS2812Serial.h

+ 35
- 12
WS2812Serial.cpp 查看文件

@@ -22,17 +22,7 @@ void WS2812Serial::begin()
UART0_C3 = UART_C3_TXINV;
UART0_C5 = UART_C5_TDMAS;

frameBuffer[0] = 0xDB;
frameBuffer[1] = 0xDA;
frameBuffer[2] = 0xDB;

dma->sourceBuffer(frameBuffer, 3);
dma->destination(UART0_D);
dma->transferSize(1);
dma->transferCount(3);
dma->disableOnCompletion();

dma->triggerAtHardwareEvent(DMAMUX_SOURCE_UART0_TX);
memset(drawBuffer, 0, numled * 3);
}

void WS2812Serial::show()
@@ -42,9 +32,42 @@ void WS2812Serial::show()
//UART0_D = 0xDA;
//UART0_D = 0xDB;
const uint8_t *p = drawBuffer;
const uint8_t *end = p + (numled * 3);
uint8_t *fb = frameBuffer;
while (p < end) {
uint8_t b = *p++;
uint8_t g = *p++;
uint8_t r = *p++;
uint32_t n=0;
switch (config) {
case WS2812_RGB: n = (r << 16) | (g << 8) | b; break;
case WS2812_RBG: n = (r << 16) | (b << 8) | g; break;
case WS2812_GRB: n = (g << 16) | (r << 8) | b; break;
case WS2812_GBR: n = (g << 16) | (b << 8) | r; break;
case WS2812_BRG: n = (b << 16) | (r << 8) | g; break;
case WS2812_BGR: n = (b << 16) | (g << 8) | r; break;
}
//Serial.printf("n = %06X\n", n);
const uint8_t *stop = fb + 8;
do {
uint8_t x = 0x92;
if (!(n & 0x00800000)) x |= 0x01;
if (!(n & 0x00400000)) x |= 0x04;
if (!(n & 0x00200000)) x |= 0x20;
n <<= 3;
*fb++ = x;
} while (fb < stop);
}

dma->sourceBuffer(frameBuffer, numled * 8);
dma->destination(UART0_D);
dma->transferSize(1);
dma->transferCount(numled * 8);
dma->disableOnCompletion();
dma->triggerAtHardwareEvent(DMAMUX_SOURCE_UART0_TX);
dma->enable();
UART0_C2 = UART_C2_TE | UART_C2_TIE;

}



+ 6
- 8
WS2812Serial.h 查看文件

@@ -23,16 +23,16 @@ public:
void setPixel(uint32_t num, int color) {
if (num >= numled) return;
num *= 3;
frameBuffer[num+0] = color;
frameBuffer[num+1] = color >> 8;
frameBuffer[num+2] = color >> 16;
drawBuffer[num+0] = color & 255;
drawBuffer[num+1] = (color >> 8) & 255;
drawBuffer[num+2] = (color >> 16) & 255;
}
void setPixel(uint32_t num, uint8_t red, uint8_t green, uint8_t blue) {
if (num >= numled) return;
num *= 3;
frameBuffer[num+0] = blue;
frameBuffer[num+1] = green;
frameBuffer[num+2] = red;
drawBuffer[num+0] = blue;
drawBuffer[num+1] = green;
drawBuffer[num+2] = red;
}
void show();
bool busy();
@@ -44,10 +44,8 @@ private:
const uint8_t config;
uint8_t *frameBuffer;
uint8_t *drawBuffer;
//HardwareSerial &serial;
KINETISK_UART_t *uart;
DMAChannel *dma = nullptr;

};

#endif

Loading…
取消
儲存