Merge pull request #305 from bobbycar-graz/ledstrip-animations

Ledstrip animations
This commit is contained in:
Ruben Marcher
2022-04-22 23:16:59 +02:00
committed by GitHub
2 changed files with 85 additions and 5 deletions

View File

@@ -3,6 +3,7 @@
// 3rdparty lib includes // 3rdparty lib includes
#include <cpputils.h> #include <cpputils.h>
#include <espchrono.h> #include <espchrono.h>
#include <math.h>
// local includes // local includes
#include "globals.h" #include "globals.h"
@@ -16,6 +17,7 @@ using namespace std::chrono_literals;
std::vector<CRGB> leds; std::vector<CRGB> leds;
uint8_t gHue = 0; uint8_t gHue = 0;
float gLedPosition = 0; // yes, this is intendet as a float value! Do NOT change!
uint16_t blinkAnimation = LEDSTRIP_OVERWRITE_NONE; uint16_t blinkAnimation = LEDSTRIP_OVERWRITE_NONE;
@@ -175,7 +177,7 @@ void updateLedStrip()
} }
} }
if (have_disabled_beeper == false && (!(cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) || !configs.ledstrip.enableBeepWhenBlink.value)) if (!have_disabled_beeper && (!(cpputils::is_in(blinkAnimation, LEDSTRIP_OVERWRITE_BLINKLEFT, LEDSTRIP_OVERWRITE_BLINKRIGHT, LEDSTRIP_OVERWRITE_BLINKBOTH)) || !configs.ledstrip.enableBeepWhenBlink.value))
{ {
for (Controller &controller : controllers) for (Controller &controller : controllers)
controller.command.buzzer.freq = 0; controller.command.buzzer.freq = 0;
@@ -225,6 +227,8 @@ void showAnimation()
case LedstripAnimation::BetterRainbow: showBetterRainbow(); break; case LedstripAnimation::BetterRainbow: showBetterRainbow(); break;
case LedstripAnimation::SpeedSync: showSpeedSyncAnimation(); break; case LedstripAnimation::SpeedSync: showSpeedSyncAnimation(); break;
case LedstripAnimation::CustomColor: showCustomColor(); break; case LedstripAnimation::CustomColor: showCustomColor(); break;
case LedstripAnimation::SnakeAnimation: showSnakeAnimation(); break;
case LedstripAnimation::GasOMeter: showGasOMeterAnimation(); break;
default: showDefaultLedstrip(); default: showDefaultLedstrip();
} }
} }
@@ -282,12 +286,15 @@ void fill_rainbow_invert_at( struct CRGB * pFirstLED, int numToFill, int invertA
hsv.hue = initialhue; hsv.hue = initialhue;
hsv.val = 255; hsv.val = 255;
hsv.sat = 240; hsv.sat = 240;
for( int i = 0; i < numToFill; i++) { for (int i = 0; i < numToFill; i++) {
hsv.hue = huecalc; hsv.hue = huecalc;
pFirstLED[i] = hsv; pFirstLED[i] = hsv;
if(i>invertAtLed){ if (i>invertAtLed)
{
huecalc -= deltahue; huecalc -= deltahue;
}else{ }
else
{
huecalc += deltahue; huecalc += deltahue;
} }
} }
@@ -324,6 +331,74 @@ void showDefaultLedstrip()
} }
} }
void showSnakeAnimation()
{
const float leds_per_cycle = (1. / std::max<int16_t>(1, configs.ledstrip.animationMultiplier.value)) * (avgSpeedKmh + 1); // yes, this is intendet as a float value! Do NOT change!
fadeToBlackBy(&*std::begin(leds), leds.size(), floor(20*leds_per_cycle));
if (gLedPosition >= leds.size())
{
gLedPosition = 0;
}
if (gHue == 255) {
gHue = 0;
}
for(int16_t i = floor(gLedPosition); i < floor(gLedPosition + leds_per_cycle); i++)
{
leds[i] |= CHSV(gHue, 255, 255);
uint8_t snake_2_pos = floor(leds.size() / 2) + i;
if (snake_2_pos > leds.size())
{
snake_2_pos -= leds.size();
}
leds[snake_2_pos] |= CHSV(gHue, 255, 255);
}
gLedPosition += leds_per_cycle;
gHue += 5;
}
void showGasOMeterAnimation()
{
if (const auto avgVoltage = controllers.getAvgVoltage(); avgVoltage)
{
auto watt = sumCurrent * *avgVoltage;
auto w_per_kmh = watt / std::abs(avgSpeedKmh);
CRGB color = 0;
if (isinf(w_per_kmh) || isnan(w_per_kmh))
{
color = 0;
}
else if (w_per_kmh <= -40)
{
color = CRGB(255, 0, 255);
}
else if (w_per_kmh < -20)
{
color = CRGB(255, 0, cpputils::mapValueClamped<float>(w_per_kmh, -40, -20, 255., 0.));
}
else if (w_per_kmh < 0)
{
color = CRGB(255, cpputils::mapValueClamped<float>(w_per_kmh, -20, 0, 0., 255.), 0);
}
else if (w_per_kmh < 20)
{
color = CRGB(cpputils::mapValueClamped<float>(w_per_kmh, 0, 20, 255., 0.), 255, 0);
}
else if (w_per_kmh < 40)
{
color = CRGB(0, cpputils::mapValueClamped<float>(w_per_kmh, 20, 40, 255., 0.), cpputils::mapValueClamped<float>(w_per_kmh, 20, 40, 0., 255.));
}
else
{
color = CRGB(0, 0, 255);
}
std::fill(std::begin(leds), std::end(leds), color);
}
}
void showCustomColor() void showCustomColor()
{ {
const auto eighth_length = leds.size() / 8; const auto eighth_length = leds.size() / 8;

View File

@@ -20,7 +20,9 @@ DECLARE_BOBBYTYPESAFE_ENUM(OtaAnimationModes, : uint8_t, OtaAnimationModesValues
x(DefaultRainbow) \ x(DefaultRainbow) \
x(BetterRainbow) \ x(BetterRainbow) \
x(SpeedSync) \ x(SpeedSync) \
x(CustomColor) x(CustomColor) \
x(SnakeAnimation) \
x(GasOMeter)
DECLARE_BOBBYTYPESAFE_ENUM(LedstripAnimation, : uint8_t, LedstripAnimationValues) DECLARE_BOBBYTYPESAFE_ENUM(LedstripAnimation, : uint8_t, LedstripAnimationValues)
enum Bobbycar_Side enum Bobbycar_Side
@@ -37,6 +39,7 @@ enum Bobbycar_Side
extern std::vector<CRGB> leds; extern std::vector<CRGB> leds;
extern uint8_t gHue; extern uint8_t gHue;
extern float gLedPosition; // yes, this is intendet as a float value! Do NOT change!
extern uint16_t blinkAnimation; extern uint16_t blinkAnimation;
@@ -45,6 +48,8 @@ void showAnimation();
void showBetterRainbow(); void showBetterRainbow();
void showSpeedSyncAnimation(); void showSpeedSyncAnimation();
void showCustomColor(); void showCustomColor();
void showSnakeAnimation();
void showGasOMeterAnimation();
void showOtaAnimation(); void showOtaAnimation();
void initLedStrip(); void initLedStrip();