diff --git a/src/drivers/wsled.c b/src/drivers/wsled.c index 01224b9..fbee956 100644 --- a/src/drivers/wsled.c +++ b/src/drivers/wsled.c @@ -9,10 +9,7 @@ extern "C" { #endif static uint16_t* dmaBuffer; -static CRGB* wsledPixels; // delete -static uint32_t resetDelay; // delete -static size_t dmaBufferSize; // delete -static WsledType type; // delete +static size_t dmaBufferSize; static spi_settings_t spiSettings = { .host = SPI2_HOST, @@ -40,31 +37,30 @@ static const uint16_t timingBits[16] = { 0x1111, 0x7111, 0x1711, 0x7711, 0x1171, 0x7171, 0x1771, 0x7771, 0x1117, 0x7117, 0x1717, 0x7717, 0x1177, 0x7177, 0x1777, 0x7777}; +static inline uint32_t resetDelay(const wsled_t* dev) { + return (dev->type == WS2812B) ? WSLED_12_RESET_TIME : WSLED_15_RESET_TIME; +} + esp_err_t wsledInit(const wsled_t* dev) { ESP_LOGI(__FILE__, "Initializing wsled device..."); - type = dev->type; - resetDelay = (dev->type == WS2812B) ? WSLED_12_RESET_TIME : WSLED_15_RESET_TIME; - ESP_LOGI(__FILE__, "mallocing the wsledPixel buffer with size %u bytes", sizeof(CRGB) * dev->numLeds); // 12 bytes for each led + bytes for initial zero and reset state - dmaBufferSize = dev->numLeds * 12 + (resetDelay + 1) * 2; + dmaBufferSize = dev->numLeds * 12 + (resetDelay(dev) + 1) * 2; spiSettings.buscfg.mosi_io_num = dev->pin; spiSettings.buscfg.max_transfer_sz = dmaBufferSize; ESP_LOGI(__FILE__, "Initializing spi interface..."); if (ESP_OK != spi_bus_initialize(spiSettings.host, &spiSettings.buscfg, spiSettings.dma_chan)) { - free(wsledPixels); ESP_LOGI(__FILE__, "SPI initialization failed"); return -1; } ESP_LOGI(__FILE__, "Adding spi bus device..."); if (ESP_OK != spi_bus_add_device(spiSettings.host, &spiSettings.devcfg, &spiSettings.spi)) { - free(wsledPixels); ESP_LOGI(__FILE__, "Failed to add spi bus device"); return -1; } @@ -72,14 +68,13 @@ esp_err_t wsledInit(const wsled_t* dev) { ESP_LOGI(__FILE__, "heap_caps_malloc() with dmaBufferSize=%u...", dmaBufferSize); dmaBuffer = heap_caps_malloc(dmaBufferSize, MALLOC_CAP_DMA); if (NULL == dmaBuffer) { - free(wsledPixels); ESP_LOGI(__FILE__, "Failed to heap_caps_malloc"); return -1; } return ESP_OK; } -esp_err_t wsledUpdate(const CRGB* pixels, size_t ledCount) { +esp_err_t wsledUpdate(const wsled_t* dev, const CRGB* pixels, size_t ledCount) { uint32_t n = 0; @@ -90,8 +85,8 @@ esp_err_t wsledUpdate(const CRGB* pixels, size_t ledCount) { CRGB currentPixel = pixels[i]; - uint8_t b0 = (type == WS2812B) ? currentPixel.g : currentPixel.r; - uint8_t b1 = (type == WS2812B) ? currentPixel.r : currentPixel.g; + uint8_t b0 = (dev->type == WS2812B) ? currentPixel.g : currentPixel.r; + uint8_t b1 = (dev->type == WS2812B) ? currentPixel.r : currentPixel.g; uint8_t b2 = currentPixel.b; // Green @@ -109,7 +104,7 @@ esp_err_t wsledUpdate(const CRGB* pixels, size_t ledCount) { } // reset pulse - for (int i = 0; i < resetDelay; i++) { + for (int i = 0; i < resetDelay(dev); i++) { dmaBuffer[n++] = 0; } diff --git a/src/drivers/wsled.h b/src/drivers/wsled.h index 01921ce..c786908 100644 --- a/src/drivers/wsled.h +++ b/src/drivers/wsled.h @@ -6,7 +6,7 @@ #include #include -#define WSLED_12_RESET_TIME 30 +#define WSLED_12_RESET_TIME 5 #define WSLED_15_RESET_TIME 30 #ifdef __cplusplus @@ -41,7 +41,8 @@ typedef struct { // initializes the wsled device provided the device settings esp_err_t wsledInit(const wsled_t* dev); -esp_err_t wsledUpdate(const CRGB* pixels, size_t ledCount); +// outputs the pixel data in pixels to the device +esp_err_t wsledUpdate(const wsled_t* dev, const CRGB* pixels, size_t ledCount); #ifdef __cplusplus } diff --git a/src/tasks/DemoTask.cpp b/src/tasks/DemoTask.cpp index ca1cdd0..c6b0211 100644 --- a/src/tasks/DemoTask.cpp +++ b/src/tasks/DemoTask.cpp @@ -7,6 +7,8 @@ #include "wsled/WsledInterface.hpp" #include "shared/pins.h" +#define NUM_LEDS 4 + DemoTask::DemoTask() { } @@ -20,7 +22,7 @@ void DemoTask::run() { SsdInterface ssd(&ssdDev, ssdDigits); // wsled device - wsled_t wsledDev = { gpio_ws2812b, WS2812B, 0 /* fixed */}; + wsled_t wsledDev = { gpio_ws2812b, WS2812B, NUM_LEDS}; WsledInterface wsled(&wsledDev); uint32_t delay = 500; // ms @@ -31,12 +33,8 @@ void DemoTask::run() { digit++; if(digit >= 16) digit = 0; - wsled.fill(CRGB{100, 20, 20}); - wsled.flush(); - - vTaskDelay(delay / portTICK_PERIOD_MS); - - wsled.fill(CRGB{20, 20, 100}); + CRGB color = (digit % 2) ? CRGB{100, 20, 20} : CRGB{20, 20, 100}; + wsled.fill(color); wsled.flush(); vTaskDelay(delay / portTICK_PERIOD_MS); diff --git a/src/wsled/WsledInterface.cpp b/src/wsled/WsledInterface.cpp index ad845bc..bb2851b 100644 --- a/src/wsled/WsledInterface.cpp +++ b/src/wsled/WsledInterface.cpp @@ -1,10 +1,16 @@ #include "WsledInterface.hpp" -WsledInterface::WsledInterface(const wsled_t* device) { +WsledInterface::WsledInterface(const wsled_t* device) : device_(device), numLeds_(device->numLeds) { (void)wsledInit(device); + leds_.resize(numLeds_); + + // turn all leds off + (void)fill(CRGB(0, 0, 0)); + (void)flush(); + } STATUS WsledInterface::writePixel(CRGB pixel, size_t index) { @@ -23,7 +29,7 @@ STATUS WsledInterface::get(CRGB* pixel, size_t index) { STATUS WsledInterface::flush() { - wsledUpdate(leds_, numLeds_); + wsledUpdate(device_, leds_.data(), numLeds_); return OKAY; } diff --git a/src/wsled/WsledInterface.hpp b/src/wsled/WsledInterface.hpp index 6ce3fd2..ade4e86 100644 --- a/src/wsled/WsledInterface.hpp +++ b/src/wsled/WsledInterface.hpp @@ -2,6 +2,7 @@ #pragma once #include "stdint.h" +#include #include "drivers/wsled.h" #include "shared/common.h" @@ -39,9 +40,8 @@ public: private: const wsled_t* device_; + size_t numLeds_; - static constexpr size_t numLeds_ = 4; - - CRGB leds_[numLeds_]; + std::vector leds_; };