146 lines
4.4 KiB
C++
146 lines
4.4 KiB
C++
/// © MiroZ 2024
|
|
|
|
#include "Settings.h"
|
|
#include "app_config.h"
|
|
|
|
#include "Led.h"
|
|
|
|
#if 0
|
|
static const uint8_t led_sin_256[] = {
|
|
0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 6, 6, 8, 9, 10, 11, 12, 14, 15, 17, 18, 20, 22, 23, 25, 27, 29, 31, 33, 35, 38,
|
|
40, 42, 45, 47, 49, 52, 54, 57, 60, 62, 65, 68, 71, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 113, 116,
|
|
119, 122, 125, 128, 131, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186,
|
|
189, 191, 194, 197, 199, 202, 204, 207, 209, 212, 214, 216, 218, 221, 223, 225, 227, 229, 231, 232, 234, 236, 238,
|
|
239, 241, 242, 243, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 254, 254, 253, 253, 252, 252, 251, 250, 249, 248, 247, 246, 245, 243, 242, 241, 239, 238, 236, 234, 232, 231,
|
|
229, 227, 225, 223, 221, 218, 216, 214, 212, 209, 207, 204, 202, 199, 197, 194, 191, 189, 186, 183, 180, 177, 174,
|
|
171, 168, 165, 162, 159, 156, 153, 150, 147, 144, 141, 138, 135, 131, 128, 125, 122, 119, 116, 113, 109, 106, 103,
|
|
100, 97, 94, 91, 88, 85, 82, 79, 76, 73, 71, 68, 65, 62, 60, 57, 54, 52, 49, 47, 45, 42, 40, 38, 35, 33, 31, 29, 27,
|
|
25, 23, 22, 20, 18, 17, 15, 14, 12, 11, 10, 9, 8, 6, 6, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0
|
|
};
|
|
|
|
static const uint8_t led_sin_127[] = {
|
|
0, 0, 1, 1, 2, 4, 6, 8, 10, 12, 15, 18, 22, 25, 29, 34, 38, 42, 47, 52, 57, 63, 68, 74, 80, 86, 92, 98, 104, 110, 116,
|
|
123, 129, 135, 142, 148, 154, 160, 166, 172, 178, 184, 189, 195, 200, 205, 210, 215, 219, 224, 228, 231, 235, 238,
|
|
241, 244, 246, 248, 250, 252, 253, 254, 255, 255, 255, 255, 254, 253, 252, 250, 248, 246, 244, 241, 238, 235, 231,
|
|
228, 224, 219, 215, 210, 205, 200, 195, 189, 184, 178, 172, 166, 160, 154, 148, 142, 135, 129, 123, 116, 110, 104,
|
|
98, 92, 86, 80, 74, 68, 63, 57, 52, 47, 42, 38, 34, 29, 25, 22, 18, 15, 12, 10, 8, 6, 4, 2, 1, 1, 0, 0
|
|
};
|
|
#endif
|
|
|
|
static const uint8_t led_sin_64[]{
|
|
0, 1, 2, 5, 10, 15, 21, 29, 37, 47, 57, 67, 79, 90, 103, 115, 127, 140, 152, 165, 176, 188, 198, 208, 218, 226, 234,
|
|
240, 245, 250, 253, 254, 255, 254, 253, 250, 245, 240, 234, 226, 218, 208, 198, 188, 176, 165, 152, 140, 128, 115,
|
|
103, 90, 79, 67, 57, 47, 37, 29, 21, 15, 10, 5, 2, 1, 0
|
|
};
|
|
|
|
void Led::steady(uint8_t r, uint8_t g, uint8_t b, uint8_t d)
|
|
{
|
|
int r_s, g_s, b_s;
|
|
uint32_t val = m_strip->getPixelColor(0);
|
|
b_s = val & 0xff;
|
|
g_s = (val>>8) & 0xff;
|
|
r_s = (val>>16) & 0xff;
|
|
|
|
for(int n=0; n<17; n++)
|
|
{
|
|
int r_ = r_s + ((int)r-r_s)*n/16;
|
|
int g_ = g_s + ((int)g-g_s)*n/16;
|
|
int b_ = b_s + ((int)b-b_s)*n/16;
|
|
m_strip->setPixelColor(0, r_, g_, b_);
|
|
m_strip->show();
|
|
delay(d);
|
|
}
|
|
}
|
|
|
|
void Led::run()
|
|
{
|
|
struct LED_QUEUE msg;
|
|
|
|
while(true)
|
|
{
|
|
xQueueReceive(m_queue, &msg, portMAX_DELAY);
|
|
|
|
if(msg.program == PROGRAM::STEADY)
|
|
{
|
|
steady(msg.r, msg.g, msg.b, 30);
|
|
}
|
|
else if(msg.program == PROGRAM::PULSATING)
|
|
{
|
|
// turn off
|
|
steady(0, 0, 0, 5);
|
|
|
|
while(true)
|
|
{
|
|
for(int n=0; n<sizeof(led_sin_64); n++)
|
|
{
|
|
uint8_t m = led_sin_64[n];
|
|
m_strip->setPixelColor(0, msg.r*m/255, msg.g*m/255, msg.b*m/255);
|
|
m_strip->show();
|
|
delay(30);
|
|
}
|
|
|
|
if(xQueueReceive(m_queue, &msg, 0))
|
|
{
|
|
if(msg.program == PROGRAM::STEADY)
|
|
{
|
|
steady(msg.r, msg.g, msg.b, 30);
|
|
break;
|
|
}
|
|
}
|
|
|
|
delay(60);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Led::Led(uint32_t pin)
|
|
{
|
|
ESP_LOGW("led", "Starting led...");
|
|
|
|
m_strip = new Adafruit_NeoPixel(1, pin, NEO_GRB + NEO_KHZ800);
|
|
|
|
m_strip->begin();
|
|
m_strip->setPixelColor(0, 0, 0, 0);
|
|
m_strip->show();
|
|
|
|
m_brightness = SETTINGS.led.brightness;
|
|
assert(m_queue = xQueueCreate(5, sizeof(struct LED_QUEUE)));
|
|
|
|
// create the led task
|
|
m_task = TaskMgr::getInstance().createTask(std::bind(&Led::run, this),
|
|
LED_TASK_NAME, LED_TASK_STACK_SIZE, LED_TASK_PRIORITY, LED_TASK_CORE);
|
|
}
|
|
|
|
Led::~Led()
|
|
{
|
|
vTaskSuspend(m_task);
|
|
vTaskDelete(m_task);
|
|
delete m_strip;
|
|
}
|
|
|
|
/// @brief Sets led strip color
|
|
/// @param r red value 0-255
|
|
/// @param g green value 0-255
|
|
/// @param b blue value 0-255
|
|
void Led::setColor(uint8_t r, uint8_t g, uint8_t b)
|
|
{
|
|
struct LED_QUEUE msg;
|
|
msg.program = PROGRAM::STEADY;
|
|
msg.r = scale(r); msg.g = scale(g); msg.b = scale(b);
|
|
xQueueSend(m_queue, &msg, 1000);
|
|
}
|
|
|
|
void Led::setPulse(uint8_t r, uint8_t g, uint8_t b)
|
|
{
|
|
struct LED_QUEUE msg;
|
|
msg.program = PROGRAM::PULSATING;
|
|
msg.r = scale(r); msg.g = scale(g); msg.b = scale(b);
|
|
xQueueSend(m_queue, &msg, 1000);
|
|
}
|
|
|
|
void Led::setBrightness(uint8_t brightness)
|
|
{
|
|
m_brightness = brightness;
|
|
} |