70 lines
2.1 KiB
Rust
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;
|
|
}
|
|
}
|
|
}
|