mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-26 01:35:35 +03:00
[GHST] Add recovery packet counter to make sure signal is more or less reliable when clearing failsafe
This commit is contained in:
parent
54de3ee801
commit
098c2f6f33
1 changed files with 15 additions and 6 deletions
|
@ -60,7 +60,9 @@
|
||||||
|
|
||||||
// At max frame rate 222Hz we should expect to see each of 3 RC frames at least every 13.5ms
|
// At max frame rate 222Hz we should expect to see each of 3 RC frames at least every 13.5ms
|
||||||
// Set the individual frame timeout high-enough to tolerate 2 on-wire frames being lost + some jitter
|
// Set the individual frame timeout high-enough to tolerate 2 on-wire frames being lost + some jitter
|
||||||
|
// As a recovery condition we would expect at least 3 packets arriving on time
|
||||||
#define GHST_RC_FRAME_TIMEOUT_MS 45
|
#define GHST_RC_FRAME_TIMEOUT_MS 45
|
||||||
|
#define GHST_RC_FRAME_COUNT_THRESHOLD 4 // should correspond to ~50-60ms in the best case
|
||||||
|
|
||||||
#define GHST_PAYLOAD_OFFSET offsetof(ghstFrameDef_t, type)
|
#define GHST_PAYLOAD_OFFSET offsetof(ghstFrameDef_t, type)
|
||||||
|
|
||||||
|
@ -75,7 +77,7 @@ STATIC_UNIT_TESTED uint32_t ghstChannelData[GHST_MAX_NUM_CHANNELS];
|
||||||
|
|
||||||
|
|
||||||
typedef struct ghstFailsafeTracker_s {
|
typedef struct ghstFailsafeTracker_s {
|
||||||
bool wasEverSeen;
|
unsigned onTimePacketCounter;
|
||||||
timeMs_t lastSeenMs;
|
timeMs_t lastSeenMs;
|
||||||
} ghstFailsafeTracker_t;
|
} ghstFailsafeTracker_t;
|
||||||
|
|
||||||
|
@ -191,10 +193,12 @@ static void ghstIdle(void)
|
||||||
static void ghstUpdateFailsafe(unsigned pktIdx)
|
static void ghstUpdateFailsafe(unsigned pktIdx)
|
||||||
{
|
{
|
||||||
// pktIdx is an offset of RC channel packet,
|
// pktIdx is an offset of RC channel packet,
|
||||||
// as we expect RC frame types 0x10 - 0x1f, we can have up to 16 possible packets arriving periodically
|
|
||||||
// We'll track arrival time of each of the frame types we ever saw arriving from this receiver
|
// We'll track arrival time of each of the frame types we ever saw arriving from this receiver
|
||||||
if (pktIdx < GHST_UL_RC_CHANS_FRAME_COUNT) {
|
if (pktIdx < GHST_UL_RC_CHANS_FRAME_COUNT) {
|
||||||
ghstFsTracker[pktIdx].wasEverSeen = true;
|
if (ghstFsTracker[pktIdx].onTimePacketCounter < GHST_RC_FRAME_COUNT_THRESHOLD) {
|
||||||
|
ghstFsTracker[pktIdx].onTimePacketCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
ghstFsTracker[pktIdx].lastSeenMs = millis(); // don't need microsecond resolution here
|
ghstFsTracker[pktIdx].lastSeenMs = millis(); // don't need microsecond resolution here
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -211,11 +215,16 @@ static bool ghstDetectFailsafe(void)
|
||||||
// as a failsafe condition
|
// as a failsafe condition
|
||||||
|
|
||||||
for (pktIdx = 0; pktIdx < GHST_UL_RC_CHANS_FRAME_COUNT; pktIdx++) {
|
for (pktIdx = 0; pktIdx < GHST_UL_RC_CHANS_FRAME_COUNT; pktIdx++) {
|
||||||
if (!ghstFsTracker[pktIdx].wasEverSeen) {
|
// Packet timeout. We didn't receive the packet containing the channel data within GHST_RC_FRAME_TIMEOUT_MS
|
||||||
continue;
|
// This is a consistent signal loss, reset the recovery packet counter and report signal loss condition
|
||||||
|
if ((currentTimeMs - ghstFsTracker[pktIdx].lastSeenMs) >= GHST_RC_FRAME_TIMEOUT_MS) {
|
||||||
|
ghstFsTracker[pktIdx].onTimePacketCounter = 0;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((currentTimeMs - ghstFsTracker[pktIdx].lastSeenMs) >= GHST_RC_FRAME_TIMEOUT_MS) {
|
// Not having at least GHST_RC_FRAME_COUNT_THRESHOLD packets without timeouts is likely caused by intermittent signal
|
||||||
|
// Stick to reporting signal loss
|
||||||
|
if (ghstFsTracker[pktIdx].onTimePacketCounter < GHST_RC_FRAME_COUNT_THRESHOLD) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue