134 float negative_scale;
135 float positive_scale;
155 #define MIXER_SIMPLE_SIZE(_icount) (sizeof(struct mixer_simple_s) + (_icount) * sizeof(struct mixer_control_s)) 165 enum class Airmode : int32_t {
183 typedef int (* ControlCallback)(uintptr_t handle,
184 uint8_t control_group,
185 uint8_t control_index,
193 Mixer(ControlCallback control_cb, uintptr_t cb_handle);
203 virtual unsigned mix(
float *outputs,
unsigned space) = 0;
210 virtual uint16_t get_saturation_status(
void) = 0;
218 virtual void groups_required(uint32_t &groups) = 0;
233 virtual unsigned set_trim(
float trim) = 0;
240 virtual unsigned get_trim(
float *trim) = 0;
247 virtual void set_thrust_factor(
float val) {}
258 ControlCallback _control_cb;
259 uintptr_t _cb_handle;
268 float get_control(uint8_t group, uint8_t index);
294 static const char *findtag(
const char *buf,
unsigned &buflen,
char tag);
302 static char findnexttag(
const char *buf,
unsigned buflen);
311 static const char *skipline(
const char *buf,
unsigned &buflen);
316 static bool string_well_formed(
const char *buf,
unsigned &buflen);
332 MixerGroup(ControlCallback control_cb, uintptr_t cb_handle);
335 unsigned mix(
float *outputs,
unsigned space)
override;
336 uint16_t get_saturation_status(
void)
override;
337 void groups_required(uint32_t &groups)
override;
344 void add_mixer(
Mixer *mixer);
411 int load_from_buf(
const char *buf,
unsigned &buflen);
423 void set_max_delta_out_once(
float delta_out_max)
override;
429 unsigned set_trims(int16_t *v,
unsigned n);
436 unsigned get_trims(int16_t *values);
448 void set_thrust_factor(
float val)
override;
450 void set_airmode(Airmode airmode)
override;
484 static NullMixer *from_text(
const char *buf,
unsigned &buflen);
486 unsigned mix(
float *outputs,
unsigned space)
override;
487 uint16_t get_saturation_status(
void)
override;
488 void groups_required(uint32_t &groups)
override;
556 uint16_t mid, uint16_t max);
558 unsigned mix(
float *outputs,
unsigned space)
override;
559 uint16_t get_saturation_status(
void)
override;
560 void groups_required(uint32_t &groups)
override;
572 unsigned set_trim(
float trim)
override;
574 unsigned get_trim(
float *trim)
override;
581 static int parse_output_scaler(
const char *buf,
unsigned &buflen,
mixer_scaler_s &scaler);
582 static int parse_control_scaler(
const char *buf,
585 uint8_t &control_group,
586 uint8_t &control_index);
598 typedef unsigned int MultirotorGeometryUnderlyingType;
599 enum class MultirotorGeometry : MultirotorGeometryUnderlyingType;
639 MultirotorGeometry geometry,
656 unsigned rotor_count);
679 unsigned mix(
float *outputs,
unsigned space)
override;
680 uint16_t get_saturation_status(
void)
override;
681 void groups_required(uint32_t &groups)
override;
712 void set_airmode(Airmode airmode)
override;
717 uint16_t motor_pos : 1;
718 uint16_t motor_neg : 1;
719 uint16_t roll_pos : 1;
720 uint16_t roll_neg : 1;
721 uint16_t pitch_pos : 1;
722 uint16_t pitch_neg : 1;
723 uint16_t yaw_pos : 1;
724 uint16_t yaw_neg : 1;
725 uint16_t thrust_pos : 1;
726 uint16_t thrust_neg : 1;
739 float compute_desaturation_gain(
const float *desaturation_vector,
const float *outputs,
saturation_status &sat_status,
740 float min_output,
float max_output)
const;
760 void minimize_saturation(
const float *desaturation_vector,
float *outputs,
saturation_status &sat_status,
761 float min_output = 0.f,
float max_output = 1.f,
bool reduce_only =
false)
const;
770 inline void mix_airmode_rp(
float roll,
float pitch,
float yaw,
float thrust,
float *outputs);
778 inline void mix_airmode_rpy(
float roll,
float pitch,
float yaw,
float thrust,
float *outputs);
788 inline void mix_airmode_disabled(
float roll,
float pitch,
float yaw,
float thrust,
float *outputs);
800 inline void mix_yaw(
float yaw,
float *outputs);
802 void update_saturation_status(
unsigned index,
bool clipping_high,
bool clipping_low_roll_pitch,
bool clipping_low_yaw);
808 float _delta_out_max;
809 float _thrust_factor;
815 unsigned _rotor_count;
816 const Rotor *_rotors;
818 float *_outputs_prev =
nullptr;
819 float *_tmp_array =
nullptr;
836 #define HELI_CURVES_NR_POINTS 5 841 float throttle_curve[HELI_CURVES_NR_POINTS];
842 float pitch_curve[HELI_CURVES_NR_POINTS];
887 unsigned mix(
float *outputs,
unsigned space)
override;
888 void groups_required(uint32_t &groups)
override;
unsigned get_trim(float *trim) override
Get trim offset for this mixer.
Definition: mixer.h:438
simple mixer
Definition: mixer.h:149
Abstract class defining a mixer mixing zero or more inputs to one or more outputs.
Definition: mixer.h:162
float roll_scale
scales roll for this rotor
Definition: mixer.h:615
void set_thrust_factor(float val) override
Sets the thrust factor used to calculate mapping from desired thrust to pwm.
Definition: mixer.h:710
float yaw_scale
scales yaw for this rotor
Definition: mixer.h:617
void set_max_delta_out_once(float delta_out_max) override
Update slew rate parameter.
Definition: mixer.h:693
Simple summing mixer.
Definition: mixer.h:506
virtual void set_airmode(Airmode airmode)
Set airmode.
Definition: mixer.h:254
unsigned set_trim(float trim) override
Set trim offset for this mixer.
Definition: mixer.h:892
Group of mixers, built up from single mixers and processed in order when mixing.
Definition: mixer.h:329
unsigned get_trim(float *trim) override
Get trim offset for this mixer.
Definition: mixer.h:700
uint16_t get_saturation_status(void) override
Get the saturation status.
Definition: mixer.h:890
Mixer * _next
next mixer in a list
Definition: mixer.h:172
virtual void set_max_delta_out_once(float delta_out_max)
Empty method, only implemented for MultirotorMixer and MixerGroup class.
Definition: mixer.h:226
void reset(enum BMP280_BUS busid)
Reset the driver.
Definition: bmp280.cpp:743
Definition: blocks.cpp:46
uint8_t control_count
number of inputs
Definition: mixer.h:840
Multi-rotor mixer for pre-defined vehicle geometries.
Definition: mixer.h:607
float pitch_scale
scales pitch for this rotor
Definition: mixer.h:616
Generic helicopter mixer for helicopters with swash plate.
Definition: mixer.h:852
simple channel scaler
Definition: mixer.h:133
mixer input
Definition: mixer.h:142
helicopter swash plate mixer
Definition: mixer.h:839
uint8_t control_count
number of inputs
Definition: mixer.h:150
unsigned get_trim(float *trim) override
Get trim offset for this mixer.
Definition: mixer.h:494
unsigned set_trim(float trim) override
Set trim offset for this mixer.
Definition: mixer.h:695
helicopter swash servo mixer
Definition: mixer.h:827
Precalculated rotor mix.
Definition: mixer.h:614
uint8_t control_index
index within the control group
Definition: mixer.h:144
uint8_t control_group
group from which the input reads
Definition: mixer.h:143
int(* ControlCallback)(uintptr_t handle, uint8_t control_group, uint8_t control_index, float &control)
Fetch a control value.
Definition: mixer.h:183
float thrust_scale
scales thrust for this rotor
Definition: mixer.h:618
unsigned set_trim(float trim) override
Set trim offset for this mixer.
Definition: mixer.h:489
unsigned set_trim(float trim) override
Set trim offset for this mixer.
Definition: mixer.h:431
Null mixer; returns zero.
Definition: mixer.h:465
unsigned get_trim(float *trim) override
Get trim offset for this mixer.
Definition: mixer.h:897