simplify driver to be stateless
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "stdint.h"
|
||||
#include <vector>
|
||||
|
||||
#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<CRGB> leds_;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user