1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-25 17:25:18 +03:00

Remove Stage1 failsafe; Deprecate FEATURE_FAILSAFE

This commit is contained in:
Konstantin Sharlaimov (DigitalEntity) 2017-01-24 21:42:54 +10:00
parent 2725e6a9fc
commit 4f1ba1e431
12 changed files with 26 additions and 235 deletions

View file

@ -61,7 +61,7 @@
#define PG_MODE_ACTIVATION_PROFILE 41 #define PG_MODE_ACTIVATION_PROFILE 41
//#define PG_SERVO_PROFILE 42 //#define PG_SERVO_PROFILE 42
#define PG_SERVO_PARAMS 42 #define PG_SERVO_PARAMS 42
#define PG_RX_FAILSAFE_CHANNEL_CONFIG 43 //#define PG_RX_FAILSAFE_CHANNEL_CONFIG 43
#define PG_RX_CHANNEL_RANGE_CONFIG 44 #define PG_RX_CHANNEL_RANGE_CONFIG 44
//#define PG_MODE_COLOR_CONFIG 45 //#define PG_MODE_COLOR_CONFIG 45
//#define PG_SPECIAL_COLOR_CONFIG 46 //#define PG_SPECIAL_COLOR_CONFIG 46

View file

@ -89,7 +89,7 @@
PG_REGISTER_WITH_RESET_TEMPLATE(featureConfig_t, featureConfig, PG_FEATURE_CONFIG, 0); PG_REGISTER_WITH_RESET_TEMPLATE(featureConfig_t, featureConfig, PG_FEATURE_CONFIG, 0);
PG_RESET_TEMPLATE(featureConfig_t, featureConfig, PG_RESET_TEMPLATE(featureConfig_t, featureConfig,
.enabledFeatures = DEFAULT_FEATURES | DEFAULT_RX_FEATURE | FEATURE_FAILSAFE .enabledFeatures = DEFAULT_FEATURES | DEFAULT_RX_FEATURE
); );
PG_REGISTER_WITH_RESET_TEMPLATE(systemConfig_t, systemConfig, PG_SYSTEM_CONFIG, 0); PG_REGISTER_WITH_RESET_TEMPLATE(systemConfig_t, systemConfig, PG_SYSTEM_CONFIG, 0);

View file

@ -49,7 +49,7 @@ typedef enum {
FEATURE_SERVO_TILT = 1 << 5, FEATURE_SERVO_TILT = 1 << 5,
FEATURE_SOFTSERIAL = 1 << 6, FEATURE_SOFTSERIAL = 1 << 6,
FEATURE_GPS = 1 << 7, FEATURE_GPS = 1 << 7,
FEATURE_FAILSAFE = 1 << 8, FEATURE_UNUSED_3 = 1 << 8, // was FAILSAFE
FEATURE_SONAR = 1 << 9, FEATURE_SONAR = 1 << 9,
FEATURE_TELEMETRY = 1 << 10, FEATURE_TELEMETRY = 1 << 10,
FEATURE_CURRENT_METER = 1 << 11, FEATURE_CURRENT_METER = 1 << 11,

View file

@ -325,9 +325,7 @@ static void initActiveBoxIds(void)
} }
#endif #endif
if (feature(FEATURE_FAILSAFE)){ activeBoxIds[activeBoxIdCount++] = BOXFAILSAFE;
activeBoxIds[activeBoxIdCount++] = BOXFAILSAFE;
}
} }
#define IS_ENABLED(mask) (mask == 0 ? 0 : 1) #define IS_ENABLED(mask) (mask == 0 ? 0 : 1)
@ -904,13 +902,6 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn
sbufWriteU8(dst, failsafeConfig()->failsafe_recovery_delay); sbufWriteU8(dst, failsafeConfig()->failsafe_recovery_delay);
break; break;
case MSP_RXFAIL_CONFIG:
for (int i = 0; i < rxRuntimeConfig.channelCount; i++) {
sbufWriteU8(dst, rxFailsafeChannelConfigs(i)->mode);
sbufWriteU16(dst, RXFAIL_STEP_TO_CHANNEL_VALUE(rxFailsafeChannelConfigs(i)->step));
}
break;
case MSP_RSSI_CONFIG: case MSP_RSSI_CONFIG:
sbufWriteU8(dst, rxConfig()->rssi_channel); sbufWriteU8(dst, rxConfig()->rssi_channel);
break; break;
@ -1886,16 +1877,6 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src)
} }
break; break;
case MSP_SET_RXFAIL_CONFIG:
i = sbufReadU8(src);
if (i < MAX_SUPPORTED_RC_CHANNEL_COUNT) {
rxFailsafeChannelConfigsMutable(i)->mode = sbufReadU8(src);
rxFailsafeChannelConfigsMutable(i)->step = CHANNEL_VALUE_TO_RXFAIL_STEP(sbufReadU16(src));
} else {
return MSP_RESULT_ERROR;
}
break;
case MSP_SET_RSSI_CONFIG: case MSP_SET_RSSI_CONFIG:
rxConfigMutable()->rssi_channel = sbufReadU8(src); rxConfigMutable()->rssi_channel = sbufReadU8(src);
break; break;

View file

@ -302,15 +302,13 @@ void processRx(timeUs_t currentTimeUs)
updateRSSI(currentTimeUs); updateRSSI(currentTimeUs);
if (feature(FEATURE_FAILSAFE)) { // Update failsafe monitoring system
if (currentTimeUs > FAILSAFE_POWER_ON_DELAY_US && !failsafeIsMonitoring()) {
if (currentTimeUs > FAILSAFE_POWER_ON_DELAY_US && !failsafeIsMonitoring()) { failsafeStartMonitoring();
failsafeStartMonitoring();
}
failsafeUpdateState();
} }
failsafeUpdateState();
const throttleStatus_e throttleStatus = calculateThrottleStatus(flight3DConfig()->deadband3d_throttle); const throttleStatus_e throttleStatus = calculateThrottleStatus(flight3DConfig()->deadband3d_throttle);
// When armed and motors aren't spinning, do beeps and then disarm // When armed and motors aren't spinning, do beeps and then disarm
@ -368,7 +366,7 @@ void processRx(timeUs_t currentTimeUs)
bool canUseHorizonMode = true; bool canUseHorizonMode = true;
if ((IS_RC_MODE_ACTIVE(BOXANGLE) || (feature(FEATURE_FAILSAFE) && failsafeIsActive()) || naivationRequiresAngleMode()) && sensors(SENSOR_ACC)) { if ((IS_RC_MODE_ACTIVE(BOXANGLE) || failsafeIsActive() || naivationRequiresAngleMode()) && sensors(SENSOR_ACC)) {
// bumpless transfer to Level mode // bumpless transfer to Level mode
canUseHorizonMode = false; canUseHorizonMode = false;

View file

@ -164,7 +164,7 @@ void processRcStickPositions(throttleStatus_e throttleStatus, bool disarm_kill_s
// Disarming via ARM BOX // Disarming via ARM BOX
// Don't disarm via switch if failsafe is active or receiver doesn't receive data - we can't trust receiver // Don't disarm via switch if failsafe is active or receiver doesn't receive data - we can't trust receiver
// and can't afford to risk disarming in the air // and can't afford to risk disarming in the air
if (ARMING_FLAG(ARMED) && !(IS_RC_MODE_ACTIVE(BOXFAILSAFE) && feature(FEATURE_FAILSAFE)) && rxIsReceivingSignal() && !failsafeIsActive()) { if (ARMING_FLAG(ARMED) && !IS_RC_MODE_ACTIVE(BOXFAILSAFE) && rxIsReceivingSignal() && !failsafeIsActive()) {
rcDisarmTicks++; rcDisarmTicks++;
if (rcDisarmTicks > 3) { // Wait for at least 3 RX ticks (60ms @ 50Hz RX) if (rcDisarmTicks > 3) { // Wait for at least 3 RX ticks (60ms @ 50Hz RX)
if (disarm_kill_switch) { if (disarm_kill_switch) {

View file

@ -147,21 +147,13 @@ static const char * const mixerNames[] = {
// sync this with features_e // sync this with features_e
static const char * const featureNames[] = { static const char * const featureNames[] = {
"RX_PPM", "VBAT", "UNUSED_1", "RX_SERIAL", "MOTOR_STOP", "RX_PPM", "VBAT", "UNUSED_1", "RX_SERIAL", "MOTOR_STOP",
"SERVO_TILT", "SOFTSERIAL", "GPS", "FAILSAFE", "SERVO_TILT", "SOFTSERIAL", "GPS", "UNUSED_3",
"SONAR", "TELEMETRY", "CURRENT_METER", "3D", "RX_PARALLEL_PWM", "SONAR", "TELEMETRY", "CURRENT_METER", "3D", "RX_PARALLEL_PWM",
"RX_MSP", "RSSI_ADC", "LED_STRIP", "DASHBOARD", "UNUSED_2", "RX_MSP", "RSSI_ADC", "LED_STRIP", "DASHBOARD", "UNUSED_2",
"BLACKBOX", "CHANNEL_FORWARDING", "TRANSPONDER", "AIRMODE", "BLACKBOX", "CHANNEL_FORWARDING", "TRANSPONDER", "AIRMODE",
"SUPEREXPO", "VTX", "RX_SPI", "SOFTSPI", "PWM_SERVO_DRIVER", "PWM_OUTPUT_ENABLE", "OSD", NULL "SUPEREXPO", "VTX", "RX_SPI", "SOFTSPI", "PWM_SERVO_DRIVER", "PWM_OUTPUT_ENABLE", "OSD", NULL
}; };
// sync this with rxFailsafeChannelMode_e
static const char rxFailsafeModeCharacters[] = "ahs";
static const rxFailsafeChannelMode_e rxFailsafeModesTable[RX_FAILSAFE_TYPE_COUNT][RX_FAILSAFE_MODE_COUNT] = {
{ RX_FAILSAFE_MODE_AUTO, RX_FAILSAFE_MODE_HOLD, RX_FAILSAFE_MODE_INVALID },
{ RX_FAILSAFE_MODE_INVALID, RX_FAILSAFE_MODE_HOLD, RX_FAILSAFE_MODE_SET }
};
/* Sensor names (used in lookup tables for *_hardware settings and in status command output) */ /* Sensor names (used in lookup tables for *_hardware settings and in status command output) */
// sync with gyroSensor_e // sync with gyroSensor_e
static const char * const gyroNames[] = { "NONE", "AUTO", "MPU6050", "L3G4200D", "MPU3050", "L3GD20", "MPU6000", "MPU6500", "FAKE"}; static const char * const gyroNames[] = { "NONE", "AUTO", "MPU6050", "L3G4200D", "MPU3050", "L3GD20", "MPU6000", "MPU6500", "FAKE"};
@ -897,7 +889,6 @@ static rxConfig_t rxConfigCopy;
#ifdef BLACKBOX #ifdef BLACKBOX
static blackboxConfig_t blackboxConfigCopy; static blackboxConfig_t blackboxConfigCopy;
#endif #endif
static rxFailsafeChannelConfig_t rxFailsafeChannelConfigsCopy[MAX_SUPPORTED_RC_CHANNEL_COUNT];
static rxChannelRangeConfig_t rxChannelRangeConfigsCopy[NON_AUX_CHANNEL_COUNT]; static rxChannelRangeConfig_t rxChannelRangeConfigsCopy[NON_AUX_CHANNEL_COUNT];
static motorConfig_t motorConfigCopy; static motorConfig_t motorConfigCopy;
static failsafeConfig_t failsafeConfigCopy; static failsafeConfig_t failsafeConfigCopy;
@ -1261,10 +1252,6 @@ static const cliCurrentAndDefaultConfig_t *getCurrentAndDefaultConfigs(pgn_t pgn
ret.currentConfig = &pidProfileCopy[getConfigProfile()]; ret.currentConfig = &pidProfileCopy[getConfigProfile()];
ret.defaultConfig = pidProfile(); ret.defaultConfig = pidProfile();
break; break;
case PG_RX_FAILSAFE_CHANNEL_CONFIG:
ret.currentConfig = &rxFailsafeChannelConfigsCopy[0];
ret.defaultConfig = rxFailsafeChannelConfigs(0);
break;
case PG_RX_CHANNEL_RANGE_CONFIG: case PG_RX_CHANNEL_RANGE_CONFIG:
ret.currentConfig = &rxChannelRangeConfigsCopy[0]; ret.currentConfig = &rxChannelRangeConfigsCopy[0];
ret.defaultConfig = rxChannelRangeConfigs(0); ret.defaultConfig = rxChannelRangeConfigs(0);
@ -1478,133 +1465,6 @@ static bool isEmpty(const char *string)
return (string == NULL || *string == '\0') ? true : false; return (string == NULL || *string == '\0') ? true : false;
} }
static void printRxFailsafe(uint8_t dumpMask, const rxFailsafeChannelConfig_t *rxFailsafeChannelConfigs, const rxFailsafeChannelConfig_t *defaultRxFailsafeChannelConfigs)
{
// print out rxConfig failsafe settings
for (uint32_t channel = 0; channel < MAX_SUPPORTED_RC_CHANNEL_COUNT; channel++) {
const rxFailsafeChannelConfig_t *channelFailsafeConfig = &rxFailsafeChannelConfigs[channel];
const rxFailsafeChannelConfig_t *channelFailsafeConfigDefault;
bool equalsDefault = true;
if (defaultRxFailsafeChannelConfigs) {
channelFailsafeConfigDefault = &defaultRxFailsafeChannelConfigs[channel];
equalsDefault = (channelFailsafeConfig->mode == channelFailsafeConfigDefault->mode)
&& (channelFailsafeConfig->step == channelFailsafeConfigDefault->step);
}
const bool requireValue = channelFailsafeConfig->mode == RX_FAILSAFE_MODE_SET;
if (requireValue) {
const char *format = "rxfail %u %c %d\r\n";
if (defaultRxFailsafeChannelConfigs) {
cliDefaultPrintf(dumpMask, equalsDefault, format,
channel,
rxFailsafeModeCharacters[channelFailsafeConfigDefault->mode],
RXFAIL_STEP_TO_CHANNEL_VALUE(channelFailsafeConfigDefault->step)
);
}
cliDumpPrintf(dumpMask, equalsDefault, format,
channel,
rxFailsafeModeCharacters[channelFailsafeConfig->mode],
RXFAIL_STEP_TO_CHANNEL_VALUE(channelFailsafeConfig->step)
);
} else {
const char *format = "rxfail %u %c\r\n";
if (defaultRxFailsafeChannelConfigs) {
cliDefaultPrintf(dumpMask, equalsDefault, format,
channel,
rxFailsafeModeCharacters[channelFailsafeConfigDefault->mode]
);
}
cliDumpPrintf(dumpMask, equalsDefault, format,
channel,
rxFailsafeModeCharacters[channelFailsafeConfig->mode]
);
}
}
}
static void cliRxFailsafe(char *cmdline)
{
uint8_t channel;
char buf[3];
if (isEmpty(cmdline)) {
// print out rxConfig failsafe settings
for (channel = 0; channel < MAX_SUPPORTED_RC_CHANNEL_COUNT; channel++) {
cliRxFailsafe(itoa(channel, buf, 10));
}
} else {
const char *ptr = cmdline;
channel = atoi(ptr++);
if ((channel < MAX_SUPPORTED_RC_CHANNEL_COUNT)) {
// const cast
rxFailsafeChannelConfig_t *channelFailsafeConfig = rxFailsafeChannelConfigsMutable(channel);
const rxFailsafeChannelType_e type = (channel < NON_AUX_CHANNEL_COUNT) ? RX_FAILSAFE_TYPE_FLIGHT : RX_FAILSAFE_TYPE_AUX;
rxFailsafeChannelMode_e mode = channelFailsafeConfig->mode;
bool requireValue = channelFailsafeConfig->mode == RX_FAILSAFE_MODE_SET;
ptr = nextArg(ptr);
if (ptr) {
const char *p = strchr(rxFailsafeModeCharacters, *(ptr));
if (p) {
const uint8_t requestedMode = p - rxFailsafeModeCharacters;
mode = rxFailsafeModesTable[type][requestedMode];
} else {
mode = RX_FAILSAFE_MODE_INVALID;
}
if (mode == RX_FAILSAFE_MODE_INVALID) {
cliShowParseError();
return;
}
requireValue = mode == RX_FAILSAFE_MODE_SET;
ptr = nextArg(ptr);
if (ptr) {
if (!requireValue) {
cliShowParseError();
return;
}
uint16_t value = atoi(ptr);
value = CHANNEL_VALUE_TO_RXFAIL_STEP(value);
if (value > MAX_RXFAIL_RANGE_STEP) {
cliPrint("Value out of range\r\n");
return;
}
channelFailsafeConfig->step = value;
} else if (requireValue) {
cliShowParseError();
return;
}
channelFailsafeConfig->mode = mode;
}
char modeCharacter = rxFailsafeModeCharacters[channelFailsafeConfig->mode];
// triple use of cliPrintf below
// 1. acknowledge interpretation on command,
// 2. query current setting on single item,
// 3. recursive use for full list.
if (requireValue) {
cliPrintf("rxfail %u %c %d\r\n",
channel,
modeCharacter,
RXFAIL_STEP_TO_CHANNEL_VALUE(channelFailsafeConfig->step)
);
} else {
cliPrintf("rxfail %u %c\r\n",
channel,
modeCharacter
);
}
} else {
cliShowArgumentRangeError("channel", 0, MAX_SUPPORTED_RC_CHANNEL_COUNT - 1);
}
}
}
#if defined(USE_ASSERT) #if defined(USE_ASSERT)
static void cliAssert(char *cmdline) static void cliAssert(char *cmdline)
{ {
@ -3548,9 +3408,6 @@ static void printConfig(const char *cmdline, bool doDiff)
cliPrintHashLine("rxrange"); cliPrintHashLine("rxrange");
printRxRange(dumpMask, rxChannelRangeConfigsCopy, rxChannelRangeConfigs(0)); printRxRange(dumpMask, rxChannelRangeConfigsCopy, rxChannelRangeConfigs(0));
cliPrintHashLine("rxfail");
printRxFailsafe(dumpMask, rxFailsafeChannelConfigsCopy, rxFailsafeChannelConfigs(0));
cliPrintHashLine("master"); cliPrintHashLine("master");
dumpAllValues(MASTER_VALUE, dumpMask); dumpAllValues(MASTER_VALUE, dumpMask);
@ -3680,7 +3537,6 @@ const clicmd_t cmdTable[] = {
CLI_COMMAND_DEF("resource", "view currently used resources", NULL, cliResource), CLI_COMMAND_DEF("resource", "view currently used resources", NULL, cliResource),
#endif #endif
CLI_COMMAND_DEF("rxrange", "configure rx channel ranges", NULL, cliRxRange), CLI_COMMAND_DEF("rxrange", "configure rx channel ranges", NULL, cliRxRange),
CLI_COMMAND_DEF("rxfail", "show/set rx failsafe settings", NULL, cliRxFailsafe),
CLI_COMMAND_DEF("save", "save and reboot", NULL, cliSave), CLI_COMMAND_DEF("save", "save and reboot", NULL, cliSave),
CLI_COMMAND_DEF("serial", "configure serial ports", NULL, cliSerial), CLI_COMMAND_DEF("serial", "configure serial ports", NULL, cliSerial),
#ifdef USE_SERVOS #ifdef USE_SERVOS

View file

@ -538,7 +538,7 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer)
warningFlags = 0; warningFlags = 0;
if (feature(FEATURE_VBAT) && getBatteryState() != BATTERY_OK) if (feature(FEATURE_VBAT) && getBatteryState() != BATTERY_OK)
warningFlags |= 1 << WARNING_LOW_BATTERY; warningFlags |= 1 << WARNING_LOW_BATTERY;
if (feature(FEATURE_FAILSAFE) && failsafeIsActive()) if (failsafeIsActive())
warningFlags |= 1 << WARNING_FAILSAFE; warningFlags |= 1 << WARNING_FAILSAFE;
if (!ARMING_FLAG(ARMED) && !ARMING_FLAG(OK_TO_ARM)) if (!ARMING_FLAG(ARMED) && !ARMING_FLAG(OK_TO_ARM))
warningFlags |= 1 << WARNING_ARMING_DISABLED; warningFlags |= 1 << WARNING_ARMING_DISABLED;

View file

@ -189,8 +189,9 @@
#define MSP_FAILSAFE_CONFIG 75 //out message Returns FC Fail-Safe settings #define MSP_FAILSAFE_CONFIG 75 //out message Returns FC Fail-Safe settings
#define MSP_SET_FAILSAFE_CONFIG 76 //in message Sets FC Fail-Safe settings #define MSP_SET_FAILSAFE_CONFIG 76 //in message Sets FC Fail-Safe settings
#define MSP_RXFAIL_CONFIG 77 //out message Returns RXFAIL settings // DEPRECATED
#define MSP_SET_RXFAIL_CONFIG 78 //in message Sets RXFAIL settings //#define MSP_RXFAIL_CONFIG 77 //out message Returns RXFAIL settings
//#define MSP_SET_RXFAIL_CONFIG 78 //in message Sets RXFAIL settings
#define MSP_SDCARD_SUMMARY 79 //out message Get the state of the SD card #define MSP_SDCARD_SUMMARY 79 //out message Get the state of the SD card

View file

@ -143,21 +143,6 @@ void pgResetFn_rxChannelRangeConfigs(rxChannelRangeConfig_t *rxChannelRangeConfi
} }
} }
PG_REGISTER_ARRAY_WITH_RESET_FN(rxFailsafeChannelConfig_t, MAX_SUPPORTED_RC_CHANNEL_COUNT, rxFailsafeChannelConfigs, PG_RX_FAILSAFE_CHANNEL_CONFIG, 0);
void pgResetFn_rxFailsafeChannelConfigs(rxFailsafeChannelConfig_t *rxFailsafeChannelConfigs)
{
for (int i = 0; i < MAX_SUPPORTED_RC_CHANNEL_COUNT; i++) {
if (i== THROTTLE) {
rxFailsafeChannelConfigs[i].mode = RX_FAILSAFE_MODE_HOLD;
rxFailsafeChannelConfigs[i].step = CHANNEL_VALUE_TO_RXFAIL_STEP(RX_MIN_USEX);
} else {
rxFailsafeChannelConfigs[i].mode = (i < NON_AUX_CHANNEL_COUNT) ? RX_FAILSAFE_MODE_AUTO : RX_FAILSAFE_MODE_HOLD;
rxFailsafeChannelConfigs[i].step = CHANNEL_VALUE_TO_RXFAIL_STEP(RX_MIDRC);
}
}
}
static uint16_t nullReadRawRC(const rxRuntimeConfig_t *rxRuntimeConfig, uint8_t channel) static uint16_t nullReadRawRC(const rxRuntimeConfig_t *rxRuntimeConfig, uint8_t channel)
{ {
UNUSED(rxRuntimeConfig); UNUSED(rxRuntimeConfig);
@ -423,30 +408,23 @@ static uint16_t calculateNonDataDrivenChannel(uint8_t chan, uint16_t sample)
return rcDataMean[chan] / PPM_AND_PWM_SAMPLE_COUNT; return rcDataMean[chan] / PPM_AND_PWM_SAMPLE_COUNT;
} }
static uint16_t getRxfailValue(uint8_t channel) static uint16_t getRxNosignalValue(uint8_t channel)
{ {
switch(rxFailsafeChannelConfigs(channel)->mode) { switch (channel) {
case RX_FAILSAFE_MODE_AUTO:
switch (channel) {
case ROLL: case ROLL:
case PITCH: case PITCH:
case YAW: case YAW:
return rxConfig()->midrc; return rxConfig()->midrc;
case THROTTLE: case THROTTLE:
if (feature(FEATURE_3D)) if (feature(FEATURE_3D))
return rxConfig()->midrc; return rxConfig()->midrc;
else else
return rxConfig()->rx_min_usec; //return rxConfig()->rx_min_usec;
} return rcData[channel];
/* no break */
default: default:
case RX_FAILSAFE_MODE_INVALID: return rcData[channel];
case RX_FAILSAFE_MODE_HOLD:
return rcData[channel];
case RX_FAILSAFE_MODE_SET:
return RXFAIL_STEP_TO_CHANNEL_VALUE(rxFailsafeChannelConfigs(channel)->step);
} }
} }
@ -514,7 +492,7 @@ static void detectAndApplySignalLossBehaviour(void)
if (currentMilliTime < rcInvalidPulsPeriod[channel]) { if (currentMilliTime < rcInvalidPulsPeriod[channel]) {
sample = rcData[channel]; // hold channel for MAX_INVALID_PULS_TIME sample = rcData[channel]; // hold channel for MAX_INVALID_PULS_TIME
} else { } else {
sample = getRxfailValue(channel); // after that apply rxfail value sample = getRxNosignalValue(channel); // after that apply rxfail value
rxUpdateFlightChannelStatus(channel, validPulse); rxUpdateFlightChannelStatus(channel, validPulse);
} }
} else { } else {
@ -530,14 +508,14 @@ static void detectAndApplySignalLossBehaviour(void)
rxFlightChannelsValid = rxHaveValidFlightChannels(); rxFlightChannelsValid = rxHaveValidFlightChannels();
if ((rxFlightChannelsValid) && !(IS_RC_MODE_ACTIVE(BOXFAILSAFE) && feature(FEATURE_FAILSAFE))) { if (rxFlightChannelsValid && !IS_RC_MODE_ACTIVE(BOXFAILSAFE)) {
failsafeOnValidDataReceived(); failsafeOnValidDataReceived();
} else { } else {
rxIsInFailsafeMode = rxIsInFailsafeModeNotDataDriven = true; rxIsInFailsafeMode = rxIsInFailsafeModeNotDataDriven = true;
failsafeOnValidDataFailed(); failsafeOnValidDataFailed();
for (int channel = 0; channel < rxRuntimeConfig.channelCount; channel++) { for (int channel = 0; channel < rxRuntimeConfig.channelCount; channel++) {
rcData[channel] = getRxfailValue(channel); rcData[channel] = getRxNosignalValue(channel);
} }
} }

View file

@ -85,28 +85,6 @@ extern int16_t rcData[MAX_SUPPORTED_RC_CHANNEL_COUNT]; // interval [1000;2
#define RSSI_SCALE_MAX 255 #define RSSI_SCALE_MAX 255
#define RSSI_SCALE_DEFAULT 30 #define RSSI_SCALE_DEFAULT 30
typedef enum {
RX_FAILSAFE_MODE_AUTO = 0,
RX_FAILSAFE_MODE_HOLD,
RX_FAILSAFE_MODE_SET,
RX_FAILSAFE_MODE_INVALID
} rxFailsafeChannelMode_e;
#define RX_FAILSAFE_MODE_COUNT 3
typedef enum {
RX_FAILSAFE_TYPE_FLIGHT = 0,
RX_FAILSAFE_TYPE_AUX
} rxFailsafeChannelType_e;
#define RX_FAILSAFE_TYPE_COUNT 2
typedef struct rxFailsafeChannelConfig_s {
uint8_t mode; // See rxFailsafeChannelMode_e
uint8_t step;
} rxFailsafeChannelConfig_t;
PG_DECLARE_ARRAY(rxFailsafeChannelConfig_t, MAX_SUPPORTED_RC_CHANNEL_COUNT, rxFailsafeChannelConfigs);
typedef struct rxChannelRangeConfig_s { typedef struct rxChannelRangeConfig_s {
uint16_t min; uint16_t min;
uint16_t max; uint16_t max;

View file

@ -45,7 +45,6 @@ void targetConfiguration(void)
featureSet(FEATURE_VBAT); featureSet(FEATURE_VBAT);
featureSet(FEATURE_LED_STRIP); featureSet(FEATURE_LED_STRIP);
featureSet(FEATURE_FAILSAFE);
serialConfigMutable()->portConfigs[0].functionMask = FUNCTION_MSP; serialConfigMutable()->portConfigs[0].functionMask = FUNCTION_MSP;
if (featureConfigured(FEATURE_RX_SERIAL)) { if (featureConfigured(FEATURE_RX_SERIAL)) {