mirror of
https://gitlab.dit.htwk-leipzig.de/phillip.kuehne/dezibot.git
synced 2025-05-22 20:41:47 +02:00
245 lines
7.6 KiB
C++
245 lines
7.6 KiB
C++
#include "MultiColorLight.h"
|
|
|
|
MultiColorLight::MultiColorLight()
|
|
: rgbLeds(ledAmount, ledPin) {
|
|
|
|
};
|
|
|
|
void MultiColorLight::begin(void) {
|
|
if (!Power::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::LED_RGB_TOP_LEFT,
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_BASE,
|
|
MULTI_COLOR_LIGHT_MAX_EXECUTION_DELAY_MS, NULL) &&
|
|
Power::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::LED_RGB_TOP_RIGHT,
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_BASE,
|
|
MULTI_COLOR_LIGHT_MAX_EXECUTION_DELAY_MS, NULL) &&
|
|
Power::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::LED_RGB_BOTTOM,
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_BASE,
|
|
MULTI_COLOR_LIGHT_MAX_EXECUTION_DELAY_MS, NULL)) {
|
|
ESP_LOGE(TAG, "Could not get power for MultiColorLight");
|
|
Serial.println("Could not get power for MultiColorLight");
|
|
}
|
|
rgbLeds.begin();
|
|
this->turnOffLed();
|
|
};
|
|
|
|
void MultiColorLight::setLed(uint8_t index, uint32_t color) {
|
|
if (index > ledAmount - 1) {
|
|
// TODO: logging
|
|
}
|
|
uint32_t normalizedColor = normalizeColor(color);
|
|
float totalConsumption = modelCurrentConsumption(normalizedColor);
|
|
switch (index) {
|
|
case 0:
|
|
if (!Power::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::LED_RGB_TOP_RIGHT,
|
|
totalConsumption, MULTI_COLOR_LIGHT_MAX_EXECUTION_DELAY_MS, NULL)) {
|
|
ESP_LOGW(TAG,
|
|
"Power to set LED RGB TOP RIGHT to color 0x%.8X not granted in "
|
|
"time. Skipping.",
|
|
normalizedColor);
|
|
return;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (!Power::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::LED_RGB_TOP_LEFT, totalConsumption,
|
|
MULTI_COLOR_LIGHT_MAX_EXECUTION_DELAY_MS, NULL)) {
|
|
ESP_LOGW(TAG,
|
|
"Power to set LED RGB TOP LEFT to color 0x%.8X not granted in "
|
|
"time. Skipping.",
|
|
normalizedColor);
|
|
return;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!Power::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::LED_RGB_BOTTOM, totalConsumption,
|
|
MULTI_COLOR_LIGHT_MAX_EXECUTION_DELAY_MS, NULL)) {
|
|
ESP_LOGW(TAG,
|
|
"Power to set LED RGB BOTTOM to color 0x%.8X not granted in "
|
|
"time. Skipping.",
|
|
normalizedColor);
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
rgbLeds.setPixelColor(index, normalizedColor);
|
|
rgbLeds.show();
|
|
};
|
|
|
|
void MultiColorLight::setLed(leds leds, uint32_t color) {
|
|
switch (leds) {
|
|
case TOP_LEFT:
|
|
MultiColorLight::setLed(1, color);
|
|
break;
|
|
case TOP_RIGHT:
|
|
MultiColorLight::setLed(0, color);
|
|
break;
|
|
case BOTTOM:
|
|
MultiColorLight::setLed(2, color);
|
|
break;
|
|
case TOP:
|
|
for (int index = 0; index < 2; index++) {
|
|
MultiColorLight::setLed(index, color);
|
|
}
|
|
break;
|
|
case ALL:
|
|
for (int index = 0; index < ledAmount; index++) {
|
|
MultiColorLight::setLed(index, color);
|
|
}
|
|
break;
|
|
default:
|
|
// TODO logging
|
|
break;
|
|
}
|
|
};
|
|
|
|
void MultiColorLight::setLed(leds leds, uint8_t red, uint8_t green,
|
|
uint8_t blue) {
|
|
MultiColorLight::setLed(leds, MultiColorLight::color(red, green, blue));
|
|
};
|
|
|
|
void MultiColorLight::setTopLeds(uint32_t color) {
|
|
MultiColorLight::setLed(TOP, color);
|
|
};
|
|
|
|
void MultiColorLight::setTopLeds(uint8_t red, uint8_t green, uint8_t blue) {
|
|
MultiColorLight::setTopLeds(MultiColorLight::color(red, green, blue));
|
|
};
|
|
|
|
void MultiColorLight::blink(uint16_t amount, uint32_t color, leds leds,
|
|
uint32_t interval) {
|
|
for (uint16_t index = 0; index < amount; index++) {
|
|
MultiColorLight::setLed(leds, color);
|
|
vTaskDelay(interval);
|
|
MultiColorLight::turnOffLed(leds);
|
|
vTaskDelay(interval);
|
|
}
|
|
};
|
|
|
|
void MultiColorLight::turnOffLed(leds leds) {
|
|
switch (leds) {
|
|
case TOP_LEFT:
|
|
MultiColorLight::setLed(1, 0);
|
|
break;
|
|
case TOP_RIGHT:
|
|
MultiColorLight::setLed(0, 0);
|
|
break;
|
|
case BOTTOM:
|
|
MultiColorLight::setLed(2, 0);
|
|
break;
|
|
case TOP:
|
|
for (int index = 0; index < 2; index++) {
|
|
MultiColorLight::setLed(index, 0);
|
|
}
|
|
break;
|
|
case ALL:
|
|
for (int index = 0; index < 3; index++) {
|
|
MultiColorLight::setLed(index, 0);
|
|
}
|
|
break;
|
|
default:
|
|
// TODO logging
|
|
break;
|
|
}
|
|
};
|
|
|
|
uint32_t MultiColorLight::color(uint8_t r, uint8_t g, uint8_t b) {
|
|
return rgbLeds.Color(r, g, b);
|
|
};
|
|
|
|
// PRIVATE
|
|
uint32_t MultiColorLight::normalizeColor(uint32_t color,
|
|
uint8_t maxBrightness) {
|
|
uint8_t red = (color & 0x00FF0000) >> 16;
|
|
uint8_t green = (color & 0x0000FF00) >> 8;
|
|
uint8_t blue = (color & 0x000000FF);
|
|
if (red > maxBrightness) {
|
|
red = maxBrightness;
|
|
}
|
|
if (green > maxBrightness - 70) {
|
|
green = maxBrightness - 70;
|
|
}
|
|
if (blue > maxBrightness - 50) {
|
|
blue = maxBrightness - 50;
|
|
}
|
|
return MultiColorLight::color(red, green, blue);
|
|
};
|
|
|
|
float MultiColorLight::modelCurrentConsumption(uint32_t color) {
|
|
uint32_t normalizedColor = normalizeColor(color);
|
|
uint16_t colorComponentRed = (normalizedColor & 0x00FF0000) >> 16;
|
|
uint16_t colorComponentGreen = (normalizedColor & 0x0000FF00) >> 8;
|
|
uint16_t colorComponentBlue = (normalizedColor & 0x000000FF);
|
|
float redChannelConsumption =
|
|
(colorComponentRed / 255.0) *
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_CHAN_T_ON;
|
|
float greenChannelConsumption =
|
|
(colorComponentGreen / 255.0) *
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_CHAN_T_ON;
|
|
float blueChannelConsumption =
|
|
(colorComponentBlue / 255.0) *
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_CHAN_T_ON;
|
|
return redChannelConsumption + greenChannelConsumption +
|
|
blueChannelConsumption +
|
|
PowerParameters::CurrentConsumptions::CURRENT_LED_RGB_BASE;
|
|
};
|
|
|
|
float MultiColorLight::modelCurrentConsumption(uint8_t red, uint8_t green,
|
|
uint8_t blue) {
|
|
return modelCurrentConsumption(MultiColorLight::color(red, green, blue));
|
|
};
|
|
|
|
float MultiColorLight::modelChargeConsumption(uint8_t index, uint32_t color,
|
|
uint16_t durationMs) {
|
|
if (index > ledAmount - 1) {
|
|
// TODO: logging
|
|
}
|
|
uint32_t normalizedColor = normalizeColor(color);
|
|
float ledConsumption = modelCurrentConsumption(normalizedColor);
|
|
return ledConsumption * durationMs * 10e6;
|
|
};
|
|
|
|
float MultiColorLight::modelChargeConsumption(leds leds, uint32_t color,
|
|
uint16_t durationMs) {
|
|
float ledsConsumption = 0;
|
|
switch (leds) {
|
|
case TOP_LEFT:
|
|
ledsConsumption =
|
|
MultiColorLight::modelChargeConsumption(1, color, durationMs);
|
|
break;
|
|
case TOP_RIGHT:
|
|
ledsConsumption =
|
|
MultiColorLight::modelChargeConsumption(0, color, durationMs);
|
|
break;
|
|
case BOTTOM:
|
|
ledsConsumption =
|
|
MultiColorLight::modelChargeConsumption(2, color, durationMs);
|
|
break;
|
|
case TOP:
|
|
for (int index = 0; index < 2; index++) {
|
|
ledsConsumption +=
|
|
MultiColorLight::modelChargeConsumption(index, color, durationMs);
|
|
}
|
|
break;
|
|
case ALL:
|
|
for (int index = 0; index < ledAmount; index++) {
|
|
ledsConsumption +=
|
|
MultiColorLight::modelChargeConsumption(index, color, durationMs);
|
|
}
|
|
break;
|
|
default:
|
|
// TODO logging
|
|
break;
|
|
}
|
|
};
|
|
|
|
float MultiColorLight::modelChargeConsumption(leds leds, uint8_t red,
|
|
uint8_t green, uint8_t blue,
|
|
uint16_t durationMs) {
|
|
return MultiColorLight::modelChargeConsumption(
|
|
leds, MultiColorLight::color(red, green, blue), durationMs);
|
|
}; |