AIvoices/firmware-arduino/src/LEDHandler.cpp
engineeringvolkan@hotmail.com b81d14e006 Naming convention fixed
2025-08-20 16:40:57 +01:00

313 lines
No EOL
7.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "LEDHandler.h"
int brightness = 0;
int fadeAmount = 5;
static unsigned long lastToggle = 0;
static bool ledState = false;
void setLEDColor(uint8_t r, uint8_t g, uint8_t b)
{
analogWrite(RED_LED_PIN, r);
analogWrite(GREEN_LED_PIN, g);
analogWrite(BLUE_LED_PIN, b);
}
enum class StaticColor : uint8_t
{
RED,
GREEN,
BLUE,
YELLOW,
MAGENTA,
CYAN,
};
struct RGB {
bool red;
bool green;
bool blue;
};
void setStaticColor(StaticColor color)
{
RGB colorMap;
switch (color)
{
case StaticColor::RED:
colorMap = {LOW, HIGH, HIGH};
break;
case StaticColor::GREEN:
colorMap = {HIGH, LOW, HIGH};
break;
case StaticColor::BLUE:
colorMap = {HIGH, HIGH, LOW};
break;
case StaticColor::YELLOW:
colorMap = {LOW, LOW, HIGH};
break;
case StaticColor::MAGENTA:
colorMap = {LOW, HIGH, LOW};
break;
case StaticColor::CYAN:
colorMap = {HIGH, LOW, LOW};
break;
default:
colorMap = {HIGH, HIGH, HIGH};
break;
}
digitalWrite(RED_LED_PIN, colorMap.red);
digitalWrite(GREEN_LED_PIN, colorMap.green);
digitalWrite(BLUE_LED_PIN, colorMap.blue);
}
void loopCyanPinkYellow()
{
// Cyan (Green + Blue)
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, HIGH);
delay(500);
// Pink (Red + Blue)
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, HIGH);
delay(500);
// Yellow (Red + Green)
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, LOW);
delay(500);
}
void pulseWhite()
{
setLEDColor(brightness, brightness, brightness);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) // Changed from 255 to 128
{
fadeAmount = -fadeAmount;
}
}
void pulseMagenta()
{
setLEDColor(brightness, 0, brightness);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) // Changed from 255 to 128
{
fadeAmount = -fadeAmount;
}
}
void pulseYellow()
{
setLEDColor(brightness, brightness, 0);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) // Changed from 255 to 128
{
fadeAmount = -fadeAmount;
}
}
void pulseBlue()
{
setLEDColor(0, 0, brightness);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) // Changed from 255 to 128
{
fadeAmount = -fadeAmount;
}
}
void blinkWhite()
{
int out = ledState ? HIGH : LOW;
digitalWrite(RED_LED_PIN, out);
digitalWrite(GREEN_LED_PIN, out);
digitalWrite(BLUE_LED_PIN, out);
}
void blinkGreen()
{
int out = ledState ? HIGH : LOW;
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, out);
}
void blinkYellow()
{
int out = ledState ? HIGH : LOW;
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, out);
digitalWrite(GREEN_LED_PIN, out);
}
void turnOffLED()
{
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
}
void turnOnLED()
{
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, HIGH);
}
void setupRGBLED()
{
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
turnOffLED(); // Turn off the LED initially
}
void blinkCyanPulse()
{
analogWrite(GREEN_LED_PIN, brightness);
analogWrite(BLUE_LED_PIN, brightness);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255)
{
fadeAmount = -fadeAmount;
}
}
void blinkBlue()
{
int out = ledState ? HIGH : LOW;
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, out);
}
void staticYellow()
{
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, HIGH);
}
static const uint8_t colorSequence[][3] = {
{0, 255, 255}, // Cyan (R=0, G=255, B=255)
{255, 0, 255}, // Pink (R=255, G=0, B=255)
{255, 255, 0}, // Yellow (R=255, G=255, B=0)
};
static const int NUM_COLORS = sizeof(colorSequence) / sizeof(colorSequence[0]);
void loopCyanPinkYellowPulse(unsigned long currentTime)
{
// Duration of each color fade
const unsigned long transitionDuration = 1000; // 500 ms per fade
// colorIndex = which color in colorSequence were currently *starting* from
static int colorIndex = 0;
// We'll store the "start color" and "end color" for the current fade
static uint8_t startColor[3];
static uint8_t endColor[3];
// The timestamp at which the current fade *started*
static unsigned long transitionStartTime = 0;
// A flag so we can initialize the first fade
static bool initialized = false;
if (!initialized)
{
// On the very first call, set the starting color to colorSequence[0]
// and the endColor to the next color in the array
memcpy(startColor, colorSequence[colorIndex], 3);
int nextIndex = (colorIndex + 1) % NUM_COLORS;
memcpy(endColor, colorSequence[nextIndex], 3);
transitionStartTime = currentTime;
initialized = true;
}
// How long has this transition been running?
unsigned long elapsed = currentTime - transitionStartTime;
float t = (float)elapsed / (float)transitionDuration;
if (t > 1.0f)
{
t = 1.0f; // clamp
}
// Interpolate each channel: R, G, B
uint8_t r = startColor[0] + (endColor[0] - startColor[0]) * t;
uint8_t g = startColor[1] + (endColor[1] - startColor[1]) * t;
uint8_t b = startColor[2] + (endColor[2] - startColor[2]) * t;
// Write these values to your LED pins
analogWrite(RED_LED_PIN, r);
analogWrite(GREEN_LED_PIN, g);
analogWrite(BLUE_LED_PIN, b);
// Check if this transition has finished
if (elapsed >= transitionDuration)
{
// Move to next color in the sequence
colorIndex = (colorIndex + 1) % NUM_COLORS;
memcpy(startColor, endColor, 3); // old 'end' becomes new 'start'
int nextIndex = (colorIndex + 1) % NUM_COLORS;
memcpy(endColor, colorSequence[nextIndex], 3);
transitionStartTime = currentTime; // reset the clock for the next fade
}
}
void ledTask(void *parameter)
{
setupRGBLED();
unsigned long currentTime = 0;
while (1)
{
currentTime += 20; // Track time based on vTaskDelay
// Toggle LED state every 200ms for blinking functions
if (currentTime - lastToggle >= 200)
{
ledState = !ledState;
lastToggle = currentTime;
}
switch (deviceState)
{
case IDLE:
setStaticColor(StaticColor::GREEN);
break;
case SOFT_AP:
setStaticColor(StaticColor::MAGENTA);
break;
case PROCESSING:
setStaticColor(StaticColor::RED);
break;
case SPEAKING:
setStaticColor(StaticColor::BLUE);
break;
case LISTENING:
setStaticColor(StaticColor::YELLOW);
break;
case OTA:
setStaticColor(StaticColor::CYAN);
break;
default:
setStaticColor(StaticColor::GREEN); // LED on
break;
}
// Delay for smoother LED transitions
vTaskDelay(20 / portTICK_PERIOD_MS); // Approximate the delay from the original `pulsateLED()`
}
}