use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal};
use motor_mixers::{MixerConfig, MotorConfig, MotorMixer, MotorMixerMessage};
#[cfg(feature = "rpm_filters")]
use motor_mixers::{RpmNotchFilterBank, RpmNotchFilterBankConfig};
pub static MOTOR_MIXER_SIGNAL: Signal<CriticalSectionRawMutex, MotorMixerMessage> = Signal::new();
#[allow(unused)]
#[rustfmt::skip]
pub struct MotorMixerContext {
pub motor_mixer: MotorMixer,
#[cfg(feature = "rpm_filters")] rpm_notch_filters: RpmNotchFilterBank,
#[cfg(feature = "rpm_filters")] rpm_filter_iteration_count: usize,
}
impl MotorMixerContext {
#[cfg(feature = "rpm_filters")]
pub fn new(
mixer_config: MixerConfig,
motor_config: MotorConfig,
rpm_notch_filter_config: RpmNotchFilterBankConfig,
looptime_seconds: f32,
) -> Self {
let rpm_notch_filters = RpmNotchFilterBank::new(rpm_notch_filter_config, looptime_seconds);
let rpm_filter_iteration_count = 8;
Self { motor_mixer: MotorMixer::new(mixer_config, motor_config), rpm_notch_filters, rpm_filter_iteration_count }
}
#[cfg(not(feature = "rpm_filters"))]
pub fn new(mixer_config: MixerConfig, motor_config: MotorConfig) -> Self {
Self { motor_mixer: MotorMixer::new(mixer_config, motor_config) }
}
}
#[embassy_executor::task]
pub async fn motor_mixer_task(ctx: &'static mut MotorMixerContext) {
loop {
let motor_mixer_message = MOTOR_MIXER_SIGNAL.wait().await;
ctx.motor_mixer.output_to_motors(motor_mixer_message);
#[cfg(feature = "rpm_filters")]
{
if let Some(frequencies) = ctx.motor_mixer.motor_frequencies() {
ctx.rpm_notch_filters.start_updating_filter_frequencies(frequencies);
}
for _ in 0..ctx.rpm_filter_iteration_count {
ctx.rpm_notch_filters.update_filter_frequencies_step();
}
}
}
}