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}