123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- #pragma once
- #include <AP_Common/AP_Common.h>
- #include <AP_Param/AP_Param.h>
- #include <AP_RCMapper/AP_RCMapper.h>
- #include <AP_Common/Bitmask.h>
- #include <AP_Volz_Protocol/AP_Volz_Protocol.h>
- #include <AP_RobotisServo/AP_RobotisServo.h>
- #include <AP_SBusOut/AP_SBusOut.h>
- #include <AP_BLHeli/AP_BLHeli.h>
- #define NUM_SERVO_CHANNELS 16
- class SRV_Channels;
- class SRV_Channel {
- public:
- friend class SRV_Channels;
-
- SRV_Channel(void);
- static const struct AP_Param::GroupInfo var_info[];
- typedef enum
- {
- k_none = 0,
- k_manual = 1,
- k_flap = 2,
- k_flap_auto = 3,
- k_aileron = 4,
- k_unused1 = 5,
- k_mount_pan = 6,
- k_mount_tilt = 7,
- k_mount_roll = 8,
- k_mount_open = 9,
- k_cam_trigger = 10,
- k_egg_drop = 11,
- k_mount2_pan = 12,
- k_mount2_tilt = 13,
- k_mount2_roll = 14,
- k_mount2_open = 15,
- k_dspoilerLeft1 = 16,
- k_dspoilerRight1 = 17,
- k_aileron_with_input = 18,
- k_elevator = 19,
- k_elevator_with_input = 20,
- k_rudder = 21,
- k_sprayer_pump = 22,
- k_sprayer_spinner = 23,
- k_flaperon_left = 24,
- k_flaperon_right = 25,
- k_steering = 26,
- k_parachute_release = 27,
- k_gripper = 28,
- k_landing_gear_control = 29,
- k_engine_run_enable = 30,
- k_heli_rsc = 31,
- k_heli_tail_rsc = 32,
- k_motor1 = 33,
- k_motor2 = 34,
- k_motor3 = 35,
- k_motor4 = 36,
- k_motor5 = 37,
- k_motor6 = 38,
- k_motor7 = 39,
- k_motor8 = 40,
- k_motor_tilt = 41,
- k_rcin1 = 51,
- k_rcin2 = 52,
- k_rcin3 = 53,
- k_rcin4 = 54,
- k_rcin5 = 55,
- k_rcin6 = 56,
- k_rcin7 = 57,
- k_rcin8 = 58,
- k_rcin9 = 59,
- k_rcin10 = 60,
- k_rcin11 = 61,
- k_rcin12 = 62,
- k_rcin13 = 63,
- k_rcin14 = 64,
- k_rcin15 = 65,
- k_rcin16 = 66,
- k_ignition = 67,
- k_choke = 68,
- k_starter = 69,
- k_throttle = 70,
- k_tracker_yaw = 71,
- k_tracker_pitch = 72,
- k_throttleLeft = 73,
- k_throttleRight = 74,
- k_tiltMotorLeft = 75,
- k_tiltMotorRight = 76,
- k_elevon_left = 77,
- k_elevon_right = 78,
- k_vtail_left = 79,
- k_vtail_right = 80,
- k_boost_throttle = 81,
- k_motor9 = 82,
- k_motor10 = 83,
- k_motor11 = 84,
- k_motor12 = 85,
- k_dspoilerLeft2 = 86,
- k_dspoilerRight2 = 87,
- k_winch = 88,
- k_mainsail_sheet = 89,
- k_cam_iso = 90,
- k_cam_aperture = 91,
- k_cam_focus = 92,
- k_cam_shutter_speed = 93,
- k_scripting1 = 94,
- k_scripting2 = 95,
- k_scripting3 = 96,
- k_scripting4 = 97,
- k_scripting5 = 98,
- k_scripting6 = 99,
- k_scripting7 = 100,
- k_scripting8 = 101,
- k_scripting9 = 102,
- k_scripting10 = 103,
- k_scripting11 = 104,
- k_scripting12 = 105,
- k_scripting13 = 106,
- k_scripting14 = 107,
- k_scripting15 = 108,
- k_scripting16 = 109,
- k_LED_neopixel1 = 120,
- k_LED_neopixel2 = 121,
- k_LED_neopixel3 = 122,
- k_LED_neopixel4 = 123,
- k_nr_aux_servo_functions
- } Aux_servo_function_t;
-
- enum LimitValue {
- SRV_CHANNEL_LIMIT_TRIM,
- SRV_CHANNEL_LIMIT_MIN,
- SRV_CHANNEL_LIMIT_MAX,
- SRV_CHANNEL_LIMIT_ZERO_PWM
- };
-
- void set_output_pwm(uint16_t pwm);
-
- uint16_t get_output_pwm(void) const { return output_pwm; }
-
- void set_angle(int16_t angle);
-
- void set_range(uint16_t high);
-
- bool get_reversed(void) const {
- return reversed?true:false;
- }
-
- void set_output_min(uint16_t pwm) {
- servo_min.set(pwm);
- }
- void set_output_max(uint16_t pwm) {
- servo_max.set(pwm);
- }
-
- uint16_t get_output_min(void) const {
- return servo_min;
- }
- uint16_t get_output_max(void) const {
- return servo_max;
- }
- uint16_t get_trim(void) const {
- return servo_trim;
- }
-
- static bool is_motor(SRV_Channel::Aux_servo_function_t function);
-
- static bool should_e_stop(SRV_Channel::Aux_servo_function_t function);
-
- SRV_Channel::Aux_servo_function_t get_function(void) const {
- return (SRV_Channel::Aux_servo_function_t)function.get();
- }
-
- void function_set_and_save(SRV_Channel::Aux_servo_function_t f) {
- function.set_and_save(int8_t(f));
- }
-
- void reversed_set_and_save_ifchanged(bool r) {
- reversed.set_and_save_ifchanged(r?1:0);
- }
-
-
-
-
- bool function_configured(void) const {
- return function.configured();
- }
-
-
- void ignore_small_rcin_changes() { ign_small_rcin_changes = true; }
- private:
- AP_Int16 servo_min;
- AP_Int16 servo_max;
- AP_Int16 servo_trim;
-
- AP_Int8 reversed;
- AP_Int8 function;
-
- uint16_t output_pwm;
-
- bool type_angle:1;
-
- bool type_setup:1;
-
- uint8_t ch_num;
-
- uint16_t high_out;
-
- uint16_t pwm_from_range(int16_t scaled_value) const;
-
- uint16_t pwm_from_angle(int16_t scaled_value) const;
-
- void calc_pwm(int16_t output_scaled);
-
- void output_ch(void);
-
- void aux_servo_function_setup(void);
-
- uint16_t get_limit_pwm(LimitValue limit) const;
-
- float get_output_norm(void);
-
- typedef uint16_t servo_mask_t;
-
-
- static servo_mask_t have_pwm_mask;
-
- int16_t previous_radio_in;
-
-
- bool ign_small_rcin_changes;
- };
- class SRV_Channels {
- public:
- friend class SRV_Channel;
-
- SRV_Channels(void);
- static const struct AP_Param::GroupInfo var_info[];
-
- static void set_default_function(uint8_t chan, SRV_Channel::Aux_servo_function_t function);
-
- static void set_output_pwm(SRV_Channel::Aux_servo_function_t function, uint16_t value);
-
- static void set_output_pwm_first(SRV_Channel::Aux_servo_function_t function, uint16_t value);
-
- static void set_output_pwm_chan(uint8_t chan, uint16_t value);
-
-
- static void set_output_scaled(SRV_Channel::Aux_servo_function_t function, int16_t value);
-
- static int16_t get_output_scaled(SRV_Channel::Aux_servo_function_t function);
-
- static bool get_output_pwm(SRV_Channel::Aux_servo_function_t function, uint16_t &value);
-
-
- static float get_output_norm(SRV_Channel::Aux_servo_function_t function);
-
- static uint16_t get_output_channel_mask(SRV_Channel::Aux_servo_function_t function);
-
-
- static void limit_slew_rate(SRV_Channel::Aux_servo_function_t function, float slew_rate, float dt);
-
- static void output_ch_all(void);
-
- void set_esc_scaling_for(SRV_Channel::Aux_servo_function_t function);
-
- bool auto_trim_enabled(void) const { return auto_trim; }
-
- void adjust_trim(SRV_Channel::Aux_servo_function_t function, float v);
-
- static void set_output_min_max(SRV_Channel::Aux_servo_function_t function, uint16_t min_pwm, uint16_t max_pwm);
-
-
- void save_trim(void);
-
- void set_reversible_throttle(void) {
- flags.k_throttle_reversible = true;
- }
-
- static void setup_failsafe_trim_all_non_motors(void);
-
- static void set_output_pwm_trimmed(SRV_Channel::Aux_servo_function_t function, int16_t value);
-
- static void set_trim_to_servo_out_for(SRV_Channel::Aux_servo_function_t function);
-
- static void set_trim_to_min_for(SRV_Channel::Aux_servo_function_t function);
-
- static void set_trim_to_pwm_for(SRV_Channel::Aux_servo_function_t function, int16_t pwm);
-
- static void set_output_to_min(SRV_Channel::Aux_servo_function_t function);
-
- static void set_output_to_max(SRV_Channel::Aux_servo_function_t function);
-
- static void set_output_to_trim(SRV_Channel::Aux_servo_function_t function);
-
- static void copy_radio_in_out(SRV_Channel::Aux_servo_function_t function, bool do_input_output=false);
-
- static void copy_radio_in_out_mask(uint16_t mask);
-
-
- static void set_failsafe_pwm(SRV_Channel::Aux_servo_function_t function, uint16_t pwm);
-
- static void set_failsafe_limit(SRV_Channel::Aux_servo_function_t function, SRV_Channel::LimitValue limit);
-
- static void set_safety_limit(SRV_Channel::Aux_servo_function_t function, SRV_Channel::LimitValue limit);
-
- static void set_output_limit(SRV_Channel::Aux_servo_function_t function, SRV_Channel::LimitValue limit);
-
- static bool function_assigned(SRV_Channel::Aux_servo_function_t function);
-
- static void move_servo(SRV_Channel::Aux_servo_function_t function,
- int16_t value, int16_t angle_min, int16_t angle_max);
-
- static void enable_aux_servos(void);
-
- static void enable_by_mask(uint16_t mask);
-
- static SRV_Channel::Aux_servo_function_t channel_function(uint8_t channel);
-
- static void update_aux_servo_function(void);
-
- static bool set_aux_channel_default(SRV_Channel::Aux_servo_function_t function, uint8_t channel);
-
- static bool find_channel(SRV_Channel::Aux_servo_function_t function, uint8_t &chan);
-
- static SRV_Channel *get_channel_for(SRV_Channel::Aux_servo_function_t function, int8_t default_chan=-1);
-
- static void set_angle(SRV_Channel::Aux_servo_function_t function, uint16_t angle);
-
- static void set_range(SRV_Channel::Aux_servo_function_t function, uint16_t range);
-
- static void set_rc_frequency(SRV_Channel::Aux_servo_function_t function, uint16_t frequency);
-
- void disable_passthrough(bool disable) {
- disabled_passthrough = disable;
- }
-
- static void constrain_pwm(SRV_Channel::Aux_servo_function_t function);
-
- static void calc_pwm(void);
- static SRV_Channel *srv_channel(uint8_t i) {
- return i<NUM_SERVO_CHANNELS?&channels[i]:nullptr;
- }
-
- static bool upgrade_parameters(const uint8_t old_keys[14], uint16_t aux_channel_mask, RCMapper *rcmap);
- static void upgrade_motors_servo(uint8_t ap_motors_key, uint8_t ap_motors_idx, uint8_t new_channel);
-
- static SRV_Channel::Aux_servo_function_t get_motor_function(uint8_t channel) {
- if (channel < 8) {
- return SRV_Channel::Aux_servo_function_t(SRV_Channel::k_motor1+channel);
- }
- return SRV_Channel::Aux_servo_function_t((SRV_Channel::k_motor9+(channel-8)));
- }
-
- static void cork();
- static void push();
-
- static void set_disabled_channel_mask(uint16_t mask) { disabled_mask = mask; }
-
- static void set_reversible_mask(uint16_t mask) {
- reversible_mask |= mask;
- }
-
- static void set_digital_mask(uint16_t mask) {
- digital_mask |= mask;
- }
-
- static void set_emergency_stop(bool state) {
- emergency_stop = state;
- }
-
- static bool get_emergency_stop() { return emergency_stop;}
- private:
- struct {
- bool k_throttle_reversible:1;
- } flags;
- static bool disabled_passthrough;
- SRV_Channel::servo_mask_t trimmed_mask;
- static Bitmask<SRV_Channel::k_nr_aux_servo_functions> function_mask;
- static bool initialised;
-
- static SRV_Channel *channels;
- static SRV_Channels *_singleton;
-
- AP_Volz_Protocol volz;
- static AP_Volz_Protocol *volz_ptr;
-
- AP_SBusOut sbus;
- static AP_SBusOut *sbus_ptr;
-
- AP_RobotisServo robotis;
- static AP_RobotisServo *robotis_ptr;
-
- #if HAL_SUPPORT_RCOUT_SERIAL
-
- AP_BLHeli blheli;
- static AP_BLHeli *blheli_ptr;
- #endif
- static uint16_t disabled_mask;
-
-
- static uint16_t digital_mask;
-
-
- static uint16_t reversible_mask;
- SRV_Channel obj_channels[NUM_SERVO_CHANNELS];
- static struct srv_function {
-
- SRV_Channel::servo_mask_t channel_mask;
-
- int16_t output_scaled;
- } functions[SRV_Channel::k_nr_aux_servo_functions];
- AP_Int8 auto_trim;
- AP_Int16 default_rate;
-
- static bool passthrough_disabled(void) {
- return disabled_passthrough;
- }
- static bool emergency_stop;
- };
|