ledstick-rs/src/effects/bass_sparks.rs
2025-03-21 22:27:53 +01:00

70 lines
2.1 KiB
Rust

use embassy_sync::blocking_mutex::raw::NoopRawMutex;
use embassy_time::{Duration, Ticker};
use crate::audio_process::{AudioStats, DspBuffer};
use crate::effects::led_effect::{LedColors, LedData, LedEffect, Rgbv};
use crate::helpers::random_at_most;
use crate::triple_buffer::{Receiver, Sender};
use crate::LED_COUNT;
pub struct LedEffectBassSparks {
bass_color: Rgbv,
}
impl Default for LedEffectBassSparks {
fn default() -> Self {
Self {
bass_color: Rgbv::black(0),
}
}
}
impl LedEffect for LedEffectBassSparks {
fn render(
&mut self,
_: bool,
_: &DspBuffer,
stats: &AudioStats,
leds: &mut LedColors,
) -> Duration {
if stats.floating_max > 10100000 && (stats.current_powers[0] > 1.25 * stats.avg_powers[0]) {
self.bass_color = Rgbv::new(127, 0, 255, 4)
}
leds.fill(self.bass_color);
self.bass_color.decrease(10, 15, 20, 0);
if stats.floating_max > 10100000
&& (stats.current_powers[1] > 1.35 * stats.avg_powers[1])
&& (stats.current_powers[2] > 1.35 * stats.avg_powers[2])
{
for _ in 0..20 {
let led_index = random_at_most(LED_COUNT as u32 - 1) as usize;
leds[led_index] = Rgbv::white(31);
}
}
Duration::from_hz(50)
}
async fn process_led_effect(
&mut self,
mut input: Receiver<'static, NoopRawMutex, (DspBuffer, AudioStats)>,
mut output: Sender<'static, NoopRawMutex, LedData>,
) {
let mut set_interval = Duration::from_hz(100);
let mut ticker = Ticker::every(set_interval);
loop {
let ((fft, stats), was_new) = input.receive_cached().await;
let leds = output.send().await;
let interval = self.render(was_new, fft, stats, &mut leds.leds);
output.send_done();
if set_interval != interval {
set_interval = interval;
ticker = Ticker::every(set_interval);
}
ticker.next().await;
}
}
}