From aa8701ef87d768b41ddcc50e473792bceba67fce Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Thu, 22 May 2025 00:12:24 +0200 Subject: [PATCH] Fix inevitable timer overflow (#14374) * Fix beacon timer overflow * fix possible overflow in rc_stats * fix possible overflow in mixer.c * fix possible overflow in osd.c * Update src/main/osd/osd_warnings.c Co-authored-by: Petr Ledvina * Update src/main/osd/osd_warnings.c Co-authored-by: Petr Ledvina * Update src/main/rx/rc_stats.c Co-authored-by: Petr Ledvina * fix typo * Update src/main/osd/osd.c Co-authored-by: Petr Ledvina --------- Co-authored-by: Petr Ledvina --- src/main/flight/mixer.c | 2 +- src/main/osd/osd.c | 2 +- src/main/osd/osd_warnings.c | 10 ++++------ src/main/rx/rc_stats.c | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/flight/mixer.c b/src/main/flight/mixer.c index 97dabc3bc8..a2d5bc8b98 100644 --- a/src/main/flight/mixer.c +++ b/src/main/flight/mixer.c @@ -219,7 +219,7 @@ static void calculateThrottleAndCurrentMotorEndpoints(timeUs_t currentTimeUs) throttle = 0; currentThrottleInputRange = rcCommandThrottleRange3dHigh; } - if (currentTimeUs - reversalTimeUs < 250000) { + if (cmpTimeUs(currentTimeUs, reversalTimeUs) < 250000) { // keep iterm zero for 250ms after motor reversal pidResetIterm(); } diff --git a/src/main/osd/osd.c b/src/main/osd/osd.c index 0b2cbaef24..6825191585 100644 --- a/src/main/osd/osd.c +++ b/src/main/osd/osd.c @@ -1243,7 +1243,7 @@ STATIC_UNIT_TESTED bool osdProcessStats1(timeUs_t currentTimeUs) if (ARMING_FLAG(ARMED)) { osdUpdateStats(); - timeUs_t deltaT = currentTimeUs - lastTimeUs; + int deltaT = cmpTimeUs(currentTimeUs, lastTimeUs); osdFlyTime += deltaT; stats.armed_time += deltaT; #ifdef USE_LAUNCH_CONTROL diff --git a/src/main/osd/osd_warnings.c b/src/main/osd/osd_warnings.c index 4fac86d0f2..7390d94a02 100644 --- a/src/main/osd/osd_warnings.c +++ b/src/main/osd/osd_warnings.c @@ -115,12 +115,10 @@ void renderOsdWarning(char *warningText, bool *blinking, uint8_t *displayAttr) #ifdef USE_DSHOT if (isTryingToArm() && !ARMING_FLAG(ARMED)) { - int armingDelayTime = (getLastDshotBeaconCommandTimeUs() + DSHOT_BEACON_GUARD_DELAY_US - currentTimeUs) / 1e5; - if (armingDelayTime < 0) { - armingDelayTime = 0; - } - if (armingDelayTime >= (DSHOT_BEACON_GUARD_DELAY_US / 1e5 - 5)) { - tfp_sprintf(warningText, " BEACON ON"); // Display this message for the first 0.5 seconds + const int beaconGuard = cmpTimeUs(currentTimeUs, getLastDshotBeaconCommandTimeUs()); + const int armingDelayTime = MAX(DSHOT_BEACON_GUARD_DELAY_US - beaconGuard, 0) / 100000; // time remaining until BEACON_GUARD_DELAY, in tenths of second + if (beaconGuard < 500 * 1000) { // first 0.5s since beacon + tfp_sprintf(warningText, " BEACON ON"); } else { tfp_sprintf(warningText, "ARM IN %d.%d", armingDelayTime / 10, armingDelayTime % 10); } diff --git a/src/main/rx/rc_stats.c b/src/main/rx/rc_stats.c index bf0ecf415f..13b943da69 100644 --- a/src/main/rx/rc_stats.c +++ b/src/main/rx/rc_stats.c @@ -44,7 +44,7 @@ int8_t previousThrottlePercent = 0; void rcStatsUpdate(timeUs_t currentTimeUs) { - uint32_t deltaT = currentTimeUs - previousTimeUs; + uint32_t deltaT = cmpTimeUs(currentTimeUs, previousTimeUs); previousTimeUs = currentTimeUs; const int8_t throttlePercent = calculateThrottlePercent();