Skip to main content

veloxity_core/
mixer.rs

1use crate::{
2    math::FlightFloat,
3    params::{ParamId, Params},
4    state_machine::StateManager,
5};
6
7pub mod matrix;
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum MixerOutputType {
10    Aux,
11    Motor,
12    Servo,
13    Gpio,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub enum MixerStatus {
18    Healthy,
19    InvalidMixer,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq)]
23pub struct MixerRun<A> {
24    pub commands: A,
25    pub status: MixerStatus,
26}
27
28pub struct MixerCtx<'a, R: FlightFloat> {
29    pub state: &'a StateManager,
30    pub params: &'a Params,
31    pub rc_override: u16,
32    pub air_density: R,
33    pub battery_voltage: Option<R>,
34}
35
36pub trait Mixer<R: FlightFloat> {
37    type MixerInput;
38    type ActuatorCommands: AsRef<[R]>;
39    fn mix(
40        &mut self,
41        controls: &Self::MixerInput,
42        ctx: MixerCtx<'_, R>,
43    ) -> MixerRun<Self::ActuatorCommands>;
44
45    fn output_types(&self) -> &[MixerOutputType] {
46        &[]
47    }
48
49    fn default_pwm_rates(&self) -> &[R] {
50        &[]
51    }
52
53    fn on_param_changed(&mut self, _params: &Params, _id: ParamId) -> Option<MixerStatus> {
54        None
55    }
56
57    fn refresh_params(&mut self, _params: &Params) -> Option<MixerStatus> {
58        None
59    }
60}