132 lines
3.2 KiB
C++
132 lines
3.2 KiB
C++
|
|
// === ledcontrol.cpp ===
|
|
#include "ledcontrol.h"
|
|
#include <Adafruit_NeoPixel.h>
|
|
#include "globals.h"
|
|
|
|
static Adafruit_NeoPixel leds(1, GPIO_LED, NEO_RGB + NEO_KHZ800);
|
|
|
|
static uint32_t basicColor = 0x000000;
|
|
static LedPattern basicPattern = LED_PATTERN_ON;
|
|
|
|
static uint32_t overrideColor = 0;
|
|
static LedPattern overridePattern = LED_PATTERN_ON;
|
|
static uint32_t overrideEndTime = 0;
|
|
static bool overrideActive = false;
|
|
|
|
void LEDControl_Init(uint8_t pin)
|
|
{
|
|
leds.begin();
|
|
leds.setBrightness(LubeConfig.LED_Max_Brightness);
|
|
leds.setPixelColor(0, 0);
|
|
leds.show();
|
|
}
|
|
|
|
void LEDControl_SetBasic(uint32_t color, LedPattern pattern)
|
|
{
|
|
basicColor = color;
|
|
basicPattern = pattern;
|
|
}
|
|
|
|
void LEDControl_SetOverride(uint32_t color, LedPattern pattern, uint32_t durationMs)
|
|
{
|
|
overrideColor = color;
|
|
overridePattern = pattern;
|
|
overrideEndTime = millis() + durationMs;
|
|
overrideActive = true;
|
|
if (durationMs == 0)
|
|
overrideEndTime = 0xFFFFFFFF; // Kein Timeout
|
|
}
|
|
|
|
void LEDControl_ClearOverride()
|
|
{
|
|
overrideActive = false;
|
|
overrideEndTime = 0;
|
|
}
|
|
|
|
void LEDControl_Update()
|
|
{
|
|
uint32_t now = millis();
|
|
uint32_t color = basicColor;
|
|
LedPattern pattern = basicPattern;
|
|
|
|
// Check override
|
|
if (overrideActive)
|
|
{
|
|
if (overrideEndTime != 0xFFFFFFFF && now >= overrideEndTime)
|
|
{
|
|
LEDControl_ClearOverride();
|
|
}
|
|
else
|
|
{
|
|
color = overrideColor;
|
|
pattern = overridePattern;
|
|
}
|
|
}
|
|
|
|
uint8_t brightness = LubeConfig.LED_Min_Brightness;
|
|
bool on = true;
|
|
|
|
switch (pattern)
|
|
{
|
|
case LED_PATTERN_ON:
|
|
brightness = LubeConfig.LED_Max_Brightness;
|
|
break;
|
|
|
|
case LED_PATTERN_FLASH:
|
|
on = (now % 1000) < 100;
|
|
brightness = LubeConfig.LED_Max_Brightness;
|
|
break;
|
|
|
|
case LED_PATTERN_FLASH_FAST:
|
|
on = (now % 500) < 50;
|
|
brightness = LubeConfig.LED_Max_Brightness;
|
|
break;
|
|
|
|
case LED_PATTERN_BLINK:
|
|
on = (now % 1000) < 500;
|
|
brightness = on ? LubeConfig.LED_Max_Brightness : 0;
|
|
break;
|
|
|
|
case LED_PATTERN_BLINK_FAST:
|
|
on = (now % 400) < 200;
|
|
brightness = on ? LubeConfig.LED_Max_Brightness : 0;
|
|
break;
|
|
|
|
case LED_PATTERN_BREATH:
|
|
{
|
|
uint32_t t = now % 2000;
|
|
if (t < 600)
|
|
{
|
|
// Schnell hochdimmen (600 ms)
|
|
brightness = map(t, 0, 600, LubeConfig.LED_Min_Brightness, LubeConfig.LED_Max_Brightness);
|
|
}
|
|
else
|
|
{
|
|
// Langsam runterdimmen (1400 ms)
|
|
brightness = map(t, 600, 2000, LubeConfig.LED_Max_Brightness, LubeConfig.LED_Min_Brightness);
|
|
}
|
|
break;
|
|
}
|
|
case LED_PATTERN_BREATH_REVERSE:
|
|
{
|
|
uint32_t t = now % 2000;
|
|
if (t < 1400)
|
|
{
|
|
// Langsam hochdimmen (1400 ms)
|
|
brightness = map(t, 0, 1400, LubeConfig.LED_Min_Brightness, LubeConfig.LED_Max_Brightness);
|
|
}
|
|
else
|
|
{
|
|
// Schnell runterdimmen (600 ms)
|
|
brightness = map(t, 1400, 2000, LubeConfig.LED_Max_Brightness, LubeConfig.LED_Min_Brightness);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
leds.setBrightness(brightness);
|
|
leds.setPixelColor(0, on ? color : 0);
|
|
leds.show();
|
|
}
|