mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-15 12:25:20 +03:00
Revise PID/Rate profile names to use get/set and eliminate extra PG's
Removes the custom CLI commands to update or display the PID and Rate profile names. Moves the storage into the pidProfile and controlRateProfile PG's. Names can now be set with: set profile_name = NAME set rate_profile_name = NAME Also added profile name display to the profile and rate CMS menus.
This commit is contained in:
parent
67d1f720ff
commit
f5bc673ada
11 changed files with 57 additions and 116 deletions
|
@ -671,58 +671,9 @@ static const char *dumpPgValue(const clivalue_t *value, dumpFlags_t dumpMask, co
|
|||
return headingStr;
|
||||
}
|
||||
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
static void printRateProfileName(uint8_t dumpMask, const profileName_t *rateProfileNameConfig)
|
||||
{
|
||||
const bool equalsDefault = strlen(rateProfileNameConfig->name) == 0;
|
||||
cliDumpPrintLinef(dumpMask, equalsDefault, "rateprofile_name %s", equalsDefault ? emptyName : rateProfileNameConfig->name);
|
||||
}
|
||||
|
||||
static void cliRateProfileName(char *cmdline)
|
||||
{
|
||||
const unsigned int len = strlen(cmdline);
|
||||
uint8_t profileIndex = getCurrentControlRateProfileIndex();
|
||||
if (len > 0) {
|
||||
memset(rateProfileNameMutable()->profile[profileIndex].name, 0, ARRAYLEN(rateProfileNameMutable()->profile[profileIndex].name));
|
||||
if (strncmp(cmdline, emptyName, len)) {
|
||||
strncpy(rateProfileNameMutable()->profile[profileIndex].name, cmdline, MIN(len, MAX_PROFILE_NAME_LENGTH));
|
||||
}
|
||||
}
|
||||
printRateProfileName(DUMP_MASTER, &rateProfileName()->profile[profileIndex]);
|
||||
}
|
||||
|
||||
static void printPidProfileName(uint8_t dumpMask, const profileName_t *pidProfileNameConfig)
|
||||
{
|
||||
const bool equalsDefault = strlen(pidProfileNameConfig->name) == 0;
|
||||
cliDumpPrintLinef(dumpMask, equalsDefault, "profile_name %s", equalsDefault ? emptyName : pidProfileNameConfig->name);
|
||||
}
|
||||
|
||||
static void cliPidProfileName(char *cmdline)
|
||||
{
|
||||
const unsigned int len = strlen(cmdline);
|
||||
uint8_t profileIndex = getCurrentPidProfileIndex();
|
||||
if (len > 0) {
|
||||
memset(pidProfileNameMutable()->profile[profileIndex].name, 0, ARRAYLEN(pidProfileNameMutable()->profile[profileIndex].name));
|
||||
if (strncmp(cmdline, emptyName, len)) {
|
||||
strncpy(pidProfileNameMutable()->profile[profileIndex].name, cmdline, MIN(len, MAX_PROFILE_NAME_LENGTH));
|
||||
}
|
||||
}
|
||||
printPidProfileName(DUMP_MASTER, &pidProfileName()->profile[profileIndex]);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void dumpAllValues(uint16_t valueSection, dumpFlags_t dumpMask, const char *headingStr)
|
||||
{
|
||||
headingStr = cliPrintSectionHeading(dumpMask, false, headingStr);
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
if (valueSection == PROFILE_VALUE) {
|
||||
printPidProfileName(DUMP_MASTER, &pidProfileName()->profile[getPidProfileIndexToUse()]);
|
||||
}
|
||||
|
||||
if (valueSection == PROFILE_RATE_VALUE) {
|
||||
printRateProfileName(DUMP_MASTER, &rateProfileName()->profile[getRateProfileIndexToUse()]);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (uint32_t i = 0; i < valueTableEntryCount; i++) {
|
||||
const clivalue_t *value = &valueTable[i];
|
||||
|
@ -5864,13 +5815,7 @@ const clicmd_t cmdTable[] = {
|
|||
CLI_COMMAND_DEF("play_sound", NULL, "[<index>]", cliPlaySound),
|
||||
#endif
|
||||
CLI_COMMAND_DEF("profile", "change profile", "[<index>]", cliProfile),
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
CLI_COMMAND_DEF("profile_name", "name of pid profile", NULL, cliPidProfileName),
|
||||
#endif
|
||||
CLI_COMMAND_DEF("rateprofile", "change rate profile", "[<index>]", cliRateProfile),
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
CLI_COMMAND_DEF("rateprofile_name", "name of rate profile", NULL, cliRateProfileName),
|
||||
#endif
|
||||
#ifdef USE_RC_SMOOTHING_FILTER
|
||||
CLI_COMMAND_DEF("rc_smoothing_info", "show rc_smoothing operational settings", NULL, cliRcSmoothing),
|
||||
#endif // USE_RC_SMOOTHING_FILTER
|
||||
|
|
|
@ -619,8 +619,6 @@ const clivalue_t valueTable[] = {
|
|||
#ifdef USE_DYN_LPF
|
||||
{ "dyn_lpf_gyro_min_hz", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_GYRO_CONFIG, offsetof(gyroConfig_t, dyn_lpf_gyro_min_hz) },
|
||||
{ "dyn_lpf_gyro_max_hz", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_GYRO_CONFIG, offsetof(gyroConfig_t, dyn_lpf_gyro_max_hz) },
|
||||
{ "dyn_lpf_dterm_min_hz", VAR_UINT16 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_PID_PROFILE, offsetof(pidProfile_t, dyn_lpf_dterm_min_hz) },
|
||||
{ "dyn_lpf_dterm_max_hz", VAR_UINT16 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_PID_PROFILE, offsetof(pidProfile_t, dyn_lpf_dterm_max_hz) },
|
||||
#endif
|
||||
{ "gyro_filter_debug_axis", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_GYRO_FILTER_DEBUG }, PG_GYRO_CONFIG, offsetof(gyroConfig_t, gyro_filter_debug_axis) },
|
||||
|
||||
|
@ -837,6 +835,9 @@ const clivalue_t valueTable[] = {
|
|||
#endif
|
||||
|
||||
// PG_CONTROLRATE_PROFILES
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
{ "rateprofile_name", VAR_UINT8 | PROFILE_RATE_VALUE | MODE_STRING, .config.string = { 1, MAX_RATE_PROFILE_NAME_LENGTH, STRING_FLAGS_NONE }, PG_CONTROL_RATE_PROFILES, offsetof(controlRateConfig_t, profileName) },
|
||||
#endif
|
||||
{ "thr_mid", VAR_UINT8 | PROFILE_RATE_VALUE, .config.minmaxUnsigned = { 0, 100 }, PG_CONTROL_RATE_PROFILES, offsetof(controlRateConfig_t, thrMid8) },
|
||||
{ "thr_expo", VAR_UINT8 | PROFILE_RATE_VALUE, .config.minmaxUnsigned = { 0, 100 }, PG_CONTROL_RATE_PROFILES, offsetof(controlRateConfig_t, thrExpo8) },
|
||||
{ "rates_type", VAR_UINT8 | PROFILE_RATE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_RATES_TYPE }, PG_CONTROL_RATE_PROFILES, offsetof(controlRateConfig_t, rates_type) },
|
||||
|
@ -925,6 +926,13 @@ const clivalue_t valueTable[] = {
|
|||
#endif
|
||||
|
||||
// PG_PID_PROFILE
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
{ "profile_name", VAR_UINT8 | PROFILE_VALUE | MODE_STRING, .config.string = { 1, MAX_PROFILE_NAME_LENGTH, STRING_FLAGS_NONE }, PG_PID_PROFILE, offsetof(pidProfile_t, profileName) },
|
||||
#endif
|
||||
#ifdef USE_DYN_LPF
|
||||
{ "dyn_lpf_dterm_min_hz", VAR_UINT16 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_PID_PROFILE, offsetof(pidProfile_t, dyn_lpf_dterm_min_hz) },
|
||||
{ "dyn_lpf_dterm_max_hz", VAR_UINT16 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_PID_PROFILE, offsetof(pidProfile_t, dyn_lpf_dterm_max_hz) },
|
||||
#endif
|
||||
{ "dterm_lowpass_type", VAR_UINT8 | PROFILE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_DTERM_LOWPASS_TYPE }, PG_PID_PROFILE, offsetof(pidProfile_t, dterm_filter_type) },
|
||||
{ "dterm_lowpass_hz", VAR_INT16 | PROFILE_VALUE, .config.minmax = { 0, 16000 }, PG_PID_PROFILE, offsetof(pidProfile_t, dterm_lowpass_hz) },
|
||||
{ "dterm_lowpass2_type", VAR_UINT8 | PROFILE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_DTERM_LOWPASS_TYPE }, PG_PID_PROFILE, offsetof(pidProfile_t, dterm_filter2_type) },
|
||||
|
|
|
@ -62,13 +62,13 @@
|
|||
//
|
||||
static uint8_t tmpPidProfileIndex;
|
||||
static uint8_t pidProfileIndex;
|
||||
static char pidProfileIndexString[] = " p";
|
||||
static char pidProfileIndexString[MAX_PROFILE_NAME_LENGTH + 5];
|
||||
static uint8_t tempPid[3][3];
|
||||
static uint16_t tempPidF[3];
|
||||
|
||||
static uint8_t tmpRateProfileIndex;
|
||||
static uint8_t rateProfileIndex;
|
||||
static char rateProfileIndexString[] = " p-r";
|
||||
static char rateProfileIndexString[MAX_RATE_PROFILE_NAME_LENGTH + 5];
|
||||
static controlRateConfig_t rateProfile;
|
||||
|
||||
static const char * const osdTableThrottleLimitType[] = {
|
||||
|
@ -81,6 +81,29 @@ static const char * const osdTableDynNotchRangeType[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static void setProfileIndexString(char *profileString, int profileIndex, char *profileName)
|
||||
{
|
||||
int charIndex = 0;
|
||||
profileString[charIndex++] = '1' + profileIndex;
|
||||
|
||||
#ifdef USE_PROFILE_NAMES
|
||||
const int profileNameLen = strlen(profileName);
|
||||
|
||||
if (profileNameLen > 0) {
|
||||
profileString[charIndex++] = ' ';
|
||||
profileString[charIndex++] = '(';
|
||||
for (int i = 0; i < profileNameLen; i++) {
|
||||
profileString[charIndex++] = toupper(profileName[i]);
|
||||
}
|
||||
profileString[charIndex++] = ')';
|
||||
}
|
||||
#else
|
||||
UNUSED(profileName);
|
||||
#endif
|
||||
|
||||
profileString[charIndex] = '\0';
|
||||
}
|
||||
|
||||
static long cmsx_menuImu_onEnter(void)
|
||||
{
|
||||
pidProfileIndex = getCurrentPidProfileIndex();
|
||||
|
@ -140,7 +163,7 @@ static long cmsx_PidRead(void)
|
|||
|
||||
static long cmsx_PidOnEnter(void)
|
||||
{
|
||||
pidProfileIndexString[1] = '0' + tmpPidProfileIndex;
|
||||
setProfileIndexString(pidProfileIndexString, pidProfileIndex, currentPidProfile->profileName);
|
||||
cmsx_PidRead();
|
||||
|
||||
return 0;
|
||||
|
@ -217,8 +240,7 @@ static long cmsx_RateProfileWriteback(const OSD_Entry *self)
|
|||
|
||||
static long cmsx_RateProfileOnEnter(void)
|
||||
{
|
||||
rateProfileIndexString[1] = '0' + tmpPidProfileIndex;
|
||||
rateProfileIndexString[3] = '0' + tmpRateProfileIndex;
|
||||
setProfileIndexString(rateProfileIndexString, rateProfileIndex, controlRateProfilesMutable(rateProfileIndex)->profileName);
|
||||
cmsx_RateProfileRead();
|
||||
|
||||
return 0;
|
||||
|
@ -337,7 +359,7 @@ static uint8_t cmsx_d_min_advance;
|
|||
|
||||
static long cmsx_profileOtherOnEnter(void)
|
||||
{
|
||||
pidProfileIndexString[1] = '0' + tmpPidProfileIndex;
|
||||
setProfileIndexString(pidProfileIndexString, pidProfileIndex, currentPidProfile->profileName);
|
||||
|
||||
const pidProfile_t *pidProfile = pidProfiles(pidProfileIndex);
|
||||
|
||||
|
|
|
@ -87,10 +87,6 @@ PG_RESET_TEMPLATE(pilotConfig_t, pilotConfig,
|
|||
.displayName = { 0 },
|
||||
);
|
||||
|
||||
PG_REGISTER_WITH_RESET_FN(rateProfileNameConfig_t, rateProfileName, PG_RATE_PROFILE_NAMES_CONFIG, 1);
|
||||
|
||||
PG_REGISTER_WITH_RESET_FN(pidProfileNameConfig_t, pidProfileName, PG_PID_PROFILE_NAMES_CONFIG, 1);
|
||||
|
||||
PG_REGISTER_WITH_RESET_TEMPLATE(systemConfig_t, systemConfig, PG_SYSTEM_CONFIG, 2);
|
||||
|
||||
PG_RESET_TEMPLATE(systemConfig_t, systemConfig,
|
||||
|
@ -126,22 +122,6 @@ uint16_t getCurrentMinthrottle(void)
|
|||
return motorConfig()->minthrottle;
|
||||
}
|
||||
|
||||
void pgResetFn_rateProfileName(rateProfileNameConfig_t *rateProfileName)
|
||||
{
|
||||
|
||||
for (int i = 0; i < CONTROL_RATE_PROFILE_COUNT; i++) {
|
||||
tfp_sprintf(rateProfileName->profile[i].name, "RATE %u", i+1, MAX_PROFILE_NAME_LENGTH);
|
||||
}
|
||||
}
|
||||
|
||||
void pgResetFn_pidProfileName(pidProfileNameConfig_t *pidProfileName)
|
||||
{
|
||||
|
||||
for (int i = 0; i < PID_PROFILE_COUNT; i++) {
|
||||
tfp_sprintf(pidProfileName->profile[i].name, "PID %u", i+1, MAX_PROFILE_NAME_LENGTH);
|
||||
}
|
||||
}
|
||||
|
||||
void resetConfigs(void)
|
||||
{
|
||||
pgResetAll();
|
||||
|
|
|
@ -36,22 +36,6 @@ typedef struct pilotConfig_s {
|
|||
|
||||
PG_DECLARE(pilotConfig_t, pilotConfig);
|
||||
|
||||
typedef struct profileName_s {
|
||||
char name[MAX_PROFILE_NAME_LENGTH + 1];
|
||||
} profileName_t;
|
||||
|
||||
typedef struct rateProfileNameConfig_s {
|
||||
profileName_t profile[CONTROL_RATE_PROFILE_COUNT];
|
||||
} rateProfileNameConfig_t;
|
||||
|
||||
PG_DECLARE(rateProfileNameConfig_t, rateProfileName);
|
||||
|
||||
typedef struct pidProfileNameConfig_s {
|
||||
profileName_t profile[PID_PROFILE_COUNT];
|
||||
} pidProfileNameConfig_t;
|
||||
|
||||
PG_DECLARE(pidProfileNameConfig_t, pidProfileName);
|
||||
|
||||
typedef struct systemConfig_s {
|
||||
uint8_t pidProfileIndex;
|
||||
uint8_t activeRateProfile;
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
controlRateConfig_t *currentControlRateProfile;
|
||||
|
||||
PG_REGISTER_ARRAY_WITH_RESET_FN(controlRateConfig_t, CONTROL_RATE_PROFILE_COUNT, controlRateProfiles, PG_CONTROL_RATE_PROFILES, 1);
|
||||
PG_REGISTER_ARRAY_WITH_RESET_FN(controlRateConfig_t, CONTROL_RATE_PROFILE_COUNT, controlRateProfiles, PG_CONTROL_RATE_PROFILES, 2);
|
||||
|
||||
void pgResetFn_controlRateProfiles(controlRateConfig_t *controlRateConfig)
|
||||
{
|
||||
|
@ -63,6 +63,7 @@ void pgResetFn_controlRateProfiles(controlRateConfig_t *controlRateConfig)
|
|||
.rate_limit[FD_PITCH] = CONTROL_RATE_CONFIG_RATE_LIMIT_MAX,
|
||||
.rate_limit[FD_YAW] = CONTROL_RATE_CONFIG_RATE_LIMIT_MAX,
|
||||
.tpaMode = TPA_MODE_D,
|
||||
.profileName = { 0 },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,12 +36,13 @@ typedef enum {
|
|||
THROTTLE_LIMIT_TYPE_COUNT // must be the last entry
|
||||
} throttleLimitType_e;
|
||||
|
||||
|
||||
typedef enum {
|
||||
TPA_MODE_PD,
|
||||
TPA_MODE_D
|
||||
} tpaMode_e;
|
||||
|
||||
#define MAX_RATE_PROFILE_NAME_LENGTH 8u
|
||||
|
||||
typedef struct controlRateConfig_s {
|
||||
uint8_t thrMid8;
|
||||
uint8_t thrExpo8;
|
||||
|
@ -55,6 +56,7 @@ typedef struct controlRateConfig_s {
|
|||
uint8_t throttle_limit_percent; // Sets the maximum pilot commanded throttle limit
|
||||
uint16_t rate_limit[3]; // Sets the maximum rate for the axes
|
||||
uint8_t tpaMode; // Controls which PID terms TPA effects
|
||||
char profileName[MAX_RATE_PROFILE_NAME_LENGTH + 1]; // Descriptive name for rate profile
|
||||
} controlRateConfig_t;
|
||||
|
||||
PG_DECLARE_ARRAY(controlRateConfig_t, CONTROL_RATE_PROFILE_COUNT, controlRateProfiles);
|
||||
|
|
|
@ -128,7 +128,7 @@ static FAST_RAM_ZERO_INIT float airmodeThrottleOffsetLimit;
|
|||
|
||||
#define LAUNCH_CONTROL_YAW_ITERM_LIMIT 50 // yaw iterm windup limit when launch mode is "FULL" (all axes)
|
||||
|
||||
PG_REGISTER_ARRAY_WITH_RESET_FN(pidProfile_t, PID_PROFILE_COUNT, pidProfiles, PG_PID_PROFILE, 10);
|
||||
PG_REGISTER_ARRAY_WITH_RESET_FN(pidProfile_t, PID_PROFILE_COUNT, pidProfiles, PG_PID_PROFILE, 11);
|
||||
|
||||
void resetPidProfile(pidProfile_t *pidProfile)
|
||||
{
|
||||
|
@ -204,6 +204,7 @@ void resetPidProfile(pidProfile_t *pidProfile)
|
|||
.motor_output_limit = 100,
|
||||
.auto_profile_cell_count = AUTO_PROFILE_CELL_COUNT_STAY,
|
||||
.transient_throttle_limit = 15,
|
||||
.profileName = { 0 },
|
||||
);
|
||||
#ifndef USE_D_MIN
|
||||
pidProfile->pid[PID_ROLL].D = 30;
|
||||
|
|
|
@ -100,6 +100,8 @@ typedef enum {
|
|||
ITERM_RELAX_SETPOINT
|
||||
} itermRelaxType_e;
|
||||
|
||||
#define MAX_PROFILE_NAME_LENGTH 8u
|
||||
|
||||
typedef struct pidProfile_s {
|
||||
uint16_t yaw_lowpass_hz; // Additional yaw filter when yaw axis too noisy
|
||||
uint16_t dterm_lowpass_hz; // Delta Filter in hz
|
||||
|
@ -168,6 +170,7 @@ typedef struct pidProfile_s {
|
|||
uint8_t motor_output_limit; // Upper limit of the motor output (percent)
|
||||
int8_t auto_profile_cell_count; // Cell count for this profile to be used with if auto PID profile switching is used
|
||||
uint8_t transient_throttle_limit; // Maximum DC component of throttle change to mix into throttle to prevent airmode mirroring noise
|
||||
char profileName[MAX_PROFILE_NAME_LENGTH + 1]; // Descriptive name for profile
|
||||
} pidProfile_t;
|
||||
|
||||
PG_DECLARE_ARRAY(pidProfile_t, PID_PROFILE_COUNT, pidProfiles);
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
#include "drivers/vtx_common.h"
|
||||
|
||||
#include "fc/config.h"
|
||||
#include "fc/controlrate_profile.h"
|
||||
#include "fc/core.h"
|
||||
#include "fc/rc_adjustments.h"
|
||||
#include "fc/rc_controls.h"
|
||||
|
@ -650,15 +651,13 @@ static void osdElementDisplayName(osdElementParms_t *element)
|
|||
#ifdef USE_PROFILE_NAMES
|
||||
static void osdElementRateProfileName(osdElementParms_t *element)
|
||||
{
|
||||
uint8_t rateProfileIndex = getCurrentControlRateProfileIndex();
|
||||
|
||||
if (strlen(rateProfileName()->profile[rateProfileIndex].name) == 0) {
|
||||
tfp_sprintf(element->buff, "RATE_%u", rateProfileIndex);
|
||||
if (strlen(currentControlRateProfile->profileName) == 0) {
|
||||
tfp_sprintf(element->buff, "RATE_%u", getCurrentControlRateProfileIndex() + 1);
|
||||
} else {
|
||||
unsigned i;
|
||||
for (i = 0; i < MAX_PROFILE_NAME_LENGTH; i++) {
|
||||
if (rateProfileName()->profile[rateProfileIndex].name[i]) {
|
||||
element->buff[i] = toupper((unsigned char)rateProfileName()->profile[rateProfileIndex].name[i]);
|
||||
if (currentControlRateProfile->profileName[i]) {
|
||||
element->buff[i] = toupper((unsigned char)currentControlRateProfile->profileName[i]);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
@ -669,15 +668,13 @@ static void osdElementRateProfileName(osdElementParms_t *element)
|
|||
|
||||
static void osdElementPidProfileName(osdElementParms_t *element)
|
||||
{
|
||||
uint8_t pidProfileIndex = getCurrentPidProfileIndex();
|
||||
|
||||
if (strlen(pidProfileName()->profile[pidProfileIndex].name) == 0) {
|
||||
tfp_sprintf(element->buff, "PID_%u", pidProfileIndex);
|
||||
if (strlen(currentPidProfile->profileName) == 0) {
|
||||
tfp_sprintf(element->buff, "PID_%u", getCurrentPidProfileIndex() + 1);
|
||||
} else {
|
||||
unsigned i;
|
||||
for (i = 0; i < MAX_PROFILE_NAME_LENGTH; i++) {
|
||||
if (pidProfileName()->profile[pidProfileIndex].name[i]) {
|
||||
element->buff[i] = toupper((unsigned char)pidProfileName()->profile[pidProfileIndex].name[i]);
|
||||
if (currentPidProfile->profileName[i]) {
|
||||
element->buff[i] = toupper((unsigned char)currentPidProfile->profileName[i]);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -81,8 +81,6 @@
|
|||
#define PG_GPS_RESCUE 55 // struct OK
|
||||
#define PG_POSITION 56
|
||||
#define PG_VTX_IO_CONFIG 57
|
||||
#define PG_RATE_PROFILE_NAMES_CONFIG 58
|
||||
#define PG_PID_PROFILE_NAMES_CONFIG 59
|
||||
|
||||
// Driver configuration
|
||||
#define PG_DRIVER_PWM_RX_CONFIG 100 // does not exist in betaflight
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue