You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.7 KiB
107 lines
2.7 KiB
#pragma once |
|
|
|
#include <AP_Common/AP_Common.h> |
|
#include <AP_HAL/AP_HAL.h> |
|
#include <AP_Logger/AP_Logger.h> |
|
|
|
/* |
|
transmitter tuning library. Meant to be subclassed per vehicle type |
|
*/ |
|
class AP_Tuning |
|
{ |
|
public: |
|
struct tuning_set { |
|
uint8_t set; |
|
uint8_t num_parms; |
|
const uint8_t *parms; |
|
}; |
|
|
|
struct tuning_name { |
|
uint8_t parm; |
|
const char *name; |
|
}; |
|
|
|
// constructor |
|
AP_Tuning(const struct tuning_set *sets, const struct tuning_name *names) : |
|
tuning_sets(sets), |
|
tuning_names(names) { |
|
AP_Param::setup_object_defaults(this, var_info); |
|
} |
|
|
|
// var_info for holding Parameter information |
|
static const struct AP_Param::GroupInfo var_info[]; |
|
|
|
// update function called on new radio frames |
|
void check_input(uint8_t flightmode); |
|
|
|
// base parameter number for tuning sets of parameters in one flight |
|
const uint8_t set_base = 100; |
|
|
|
private: |
|
AP_Int8 channel; |
|
AP_Int16 channel_min; |
|
AP_Int16 channel_max; |
|
AP_Int8 selector; |
|
AP_Float range; |
|
AP_Int8 mode_revert; |
|
AP_Float error_threshold; |
|
|
|
// when selector was triggered |
|
uint32_t selector_start_ms; |
|
|
|
// are we waiting for channel mid-point? |
|
bool mid_point_wait; |
|
|
|
// last input from tuning channel |
|
float last_channel_value; |
|
|
|
// mid-value for current parameter |
|
float center_value; |
|
|
|
uint32_t last_check_ms; |
|
|
|
void Log_Write_Parameter_Tuning(float value); |
|
|
|
// the parameter we are tuning |
|
uint8_t current_parm; |
|
|
|
// current index into the parameter set |
|
uint8_t current_parm_index; |
|
|
|
// current parameter set |
|
uint8_t current_set; |
|
|
|
// true if tune has changed |
|
bool changed:1; |
|
|
|
// mask of params in set that need reverting |
|
uint32_t need_revert; |
|
|
|
// last flight mode we were tuning in |
|
uint8_t last_flightmode; |
|
|
|
// last time we reported controller error |
|
uint32_t last_controller_error_ms; |
|
|
|
const tuning_set *tuning_sets; |
|
const tuning_name *tuning_names; |
|
|
|
void check_selector_switch(void); |
|
void re_center(void); |
|
void next_parameter(void); |
|
void save_parameters(void); |
|
void revert_parameters(void); |
|
const char *get_tuning_name(uint8_t parm); |
|
void check_controller_error(void); |
|
|
|
protected: |
|
// virtual functions that must be implemented in vehicle subclass |
|
virtual AP_Float *get_param_pointer(uint8_t parm) = 0; |
|
virtual void save_value(uint8_t parm) = 0; |
|
virtual void reload_value(uint8_t parm) = 0; |
|
virtual void set_value(uint8_t parm, float value) = 0; |
|
virtual float controller_error(uint8_t parm) = 0; |
|
|
|
// parmset is in vehicle subclass var table |
|
AP_Int16 parmset; |
|
};
|
|
|