forked from buddhabrot/fusion-zauberstab
add torch animation
Signed-off-by: Thomas Schmid <tom@lfence.de>
This commit is contained in:
parent
b95863aeff
commit
ab208b015c
@ -23,3 +23,9 @@ struct FFTTestApp: public App {
|
|||||||
void deinit();
|
void deinit();
|
||||||
void loop();
|
void loop();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FackelApp: public App {
|
||||||
|
void init();
|
||||||
|
void deinit();
|
||||||
|
void loop();
|
||||||
|
};
|
146
firmware/src/applications/fackel.cpp
Normal file
146
firmware/src/applications/fackel.cpp
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
#include "app.h"
|
||||||
|
#include "pt1.h"
|
||||||
|
#include "zauberstab.h"
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
static unsigned long last_sample_time;
|
||||||
|
static unsigned long sample_counter;
|
||||||
|
static float rms_avg;
|
||||||
|
|
||||||
|
static uint8_t energy[NUM_LEDS];
|
||||||
|
static uint8_t spark_energy[NUM_LEDS];
|
||||||
|
|
||||||
|
Pt1<float> energy_pt1{1.f, 1.f};
|
||||||
|
CRGB palette[128];
|
||||||
|
|
||||||
|
static void hsl_to_rgb(uint32_t hue, uint32_t sat, uint32_t lum, uint8_t *r, uint8_t *g, uint8_t *b)
|
||||||
|
{
|
||||||
|
uint32_t v;
|
||||||
|
|
||||||
|
v = (lum < 128) ? (lum * (256 + sat)) >> 8 : (((lum + sat) << 8) - lum * sat) >> 8;
|
||||||
|
|
||||||
|
if (v <= 0)
|
||||||
|
{
|
||||||
|
*r = *g = *b = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int32_t m;
|
||||||
|
int32_t sextant;
|
||||||
|
int32_t fract, vsf, mid1, mid2;
|
||||||
|
|
||||||
|
m = lum + lum - v;
|
||||||
|
hue *= 6;
|
||||||
|
sextant = hue >> 8;
|
||||||
|
fract = hue - (sextant << 8);
|
||||||
|
vsf = v * fract * (v - m) / v >> 8;
|
||||||
|
mid1 = m + vsf;
|
||||||
|
mid2 = v - vsf;
|
||||||
|
switch (sextant)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
*r = v;
|
||||||
|
*g = mid1;
|
||||||
|
*b = m;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
*r = mid2;
|
||||||
|
*g = v;
|
||||||
|
*b = m;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
*r = m;
|
||||||
|
*g = v;
|
||||||
|
*b = mid1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
*r = m;
|
||||||
|
*g = mid2;
|
||||||
|
*b = v;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
*r = mid1;
|
||||||
|
*g = m;
|
||||||
|
*b = v;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
*r = v;
|
||||||
|
*g = m;
|
||||||
|
*b = mid2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_engery(uint8_t *energy, size_t s)
|
||||||
|
{
|
||||||
|
for (int i = s; i >= 2; i--)
|
||||||
|
{
|
||||||
|
energy[i] = (uint8_t)((float)(energy[i - 1] + energy[i - 2]) * 0.485f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FackelApp::init()
|
||||||
|
{
|
||||||
|
memset(&energy, 0, NUM_LEDS);
|
||||||
|
memset(&spark_energy, 0, NUM_LEDS);
|
||||||
|
|
||||||
|
// generate palette
|
||||||
|
for (int i = 0; i < 128; i++)
|
||||||
|
{
|
||||||
|
uint8_t r, g, b;
|
||||||
|
hsl_to_rgb(i / 5, 255, i * 2 > 128 ? 128 : i * 2, &r, &g, &b);
|
||||||
|
g = g == 1 ? 0 : g;
|
||||||
|
b = b == 1 ? 0 : b;
|
||||||
|
palette[i].r = r;
|
||||||
|
palette[i].g = g;
|
||||||
|
palette[i].b = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FackelApp::deinit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FackelApp::loop()
|
||||||
|
{
|
||||||
|
if (micros() - last_sample_time >= 500)
|
||||||
|
{
|
||||||
|
last_sample_time = micros();
|
||||||
|
int32_t sample = get_sample();
|
||||||
|
float in = sample * sample;
|
||||||
|
sample_counter++;
|
||||||
|
rms_avg += (in - rms_avg) / (sample_counter + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
EVERY_N_MILLISECONDS(10)
|
||||||
|
{
|
||||||
|
float e_f = energy_pt1.update(rms_avg, 0.01f);
|
||||||
|
|
||||||
|
if (rms_avg > 1.15 * e_f)
|
||||||
|
{
|
||||||
|
energy[0] = 128;
|
||||||
|
energy[1] = 128;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
energy[0] = 50;
|
||||||
|
energy[1] = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
rms_avg = 0.0f;
|
||||||
|
sample_counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
EVERY_N_MILLISECONDS(45)
|
||||||
|
{
|
||||||
|
update_engery(energy, NUM_LEDS);
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM_LEDS; i++)
|
||||||
|
{
|
||||||
|
leds[i] = palette[energy[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
FastLED.show();
|
||||||
|
}
|
||||||
|
}
|
@ -1,18 +1,28 @@
|
|||||||
|
#include "app.h"
|
||||||
|
#include "driver/adc.h"
|
||||||
#include "zauberstab.h"
|
#include "zauberstab.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "app.h"
|
|
||||||
|
|
||||||
struct BeatDetectApp beat_detect_app{};
|
struct BeatDetectApp beat_detect_app
|
||||||
struct VuMeterApp vu_meter_app {};
|
{
|
||||||
struct FFTTestApp fft_test_app {};
|
};
|
||||||
|
struct VuMeterApp vu_meter_app
|
||||||
|
{
|
||||||
|
};
|
||||||
|
struct FFTTestApp fft_test_app
|
||||||
|
{
|
||||||
|
};
|
||||||
|
struct FackelApp fackel_app
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
std::vector<std::reference_wrapper<App>> apps = {
|
std::vector<std::reference_wrapper<App>> apps = {
|
||||||
std::ref<App>(beat_detect_app),
|
std::ref<App>(beat_detect_app),
|
||||||
std::ref<App>(vu_meter_app),
|
std::ref<App>(vu_meter_app),
|
||||||
std::ref<App>(fft_test_app),
|
std::ref<App>(fft_test_app),
|
||||||
};
|
std::ref<App>(fackel_app)};
|
||||||
|
|
||||||
unsigned int current_app = 0;
|
unsigned int current_app = 3;
|
||||||
unsigned int next_app;
|
unsigned int next_app;
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
@ -26,7 +36,14 @@ void setup()
|
|||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
if (next_app != current_app) {
|
/* EVERY_N_SECONDS(30)
|
||||||
|
{
|
||||||
|
next_app++;
|
||||||
|
next_app = next_app % apps.size();
|
||||||
|
} */
|
||||||
|
|
||||||
|
if (next_app != current_app)
|
||||||
|
{
|
||||||
apps[current_app].get().deinit();
|
apps[current_app].get().deinit();
|
||||||
apps[next_app].get().init();
|
apps[next_app].get().init();
|
||||||
current_app = next_app;
|
current_app = next_app;
|
||||||
|
Loading…
Reference in New Issue
Block a user