Fix watchdog code in repeater

This commit is contained in:
Quency-D 2026-02-09 11:43:41 +08:00
parent 9df34e09d0
commit 53ff4ed57f
3 changed files with 29 additions and 6 deletions

View file

@ -29,6 +29,10 @@ void setup() {
board.begin(); board.begin();
#ifdef HAS_EX_WATCHDOG
ex_watchdog.begin();
#endif
#if defined(MESH_DEBUG) && defined(NRF52_PLATFORM) #if defined(MESH_DEBUG) && defined(NRF52_PLATFORM)
// give some extra time for serial to settle so // give some extra time for serial to settle so
// boot debug messages can be seen on terminal // boot debug messages can be seen on terminal
@ -134,11 +138,24 @@ void loop() {
#endif #endif
rtc_clock.tick(); rtc_clock.tick();
#ifdef HAS_EX_WATCHDOG
ex_watchdog.loop();
#endif
if (the_mesh.getNodePrefs()->powersaving_enabled && !the_mesh.hasPendingWork()) { if (the_mesh.getNodePrefs()->powersaving_enabled && !the_mesh.hasPendingWork()) {
#if defined(NRF52_PLATFORM) #if defined(NRF52_PLATFORM)
#ifdef HAS_EX_WATCHDOG
uint32_t sleep_interval = ex_watchdog.getIntervalMs()/1000;
board.sleep((sleep_interval > 1800) ? 1800 : sleep_interval); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
#else
board.sleep(1800); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
#endif
board.sleep(1800); // nrf ignores seconds param, sleeps whenever possible board.sleep(1800); // nrf ignores seconds param, sleeps whenever possible
#else #else
if (the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) { // To check if it is time to sleep if (the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) { // To check if it is time to sleep
#ifdef HAS_EX_WATCHDOG
uint32_t sleep_interval = ex_watchdog.getIntervalMs()/1000;
board.sleep((sleep_interval > 1800) ? 1800 : sleep_interval); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
#else
board.sleep(1800); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet board.sleep(1800); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
#endif #endif
lastActive = millis(); lastActive = millis();
@ -146,6 +163,6 @@ void loop() {
} else { } else {
nextSleepinSecs += 5; // When there is pending work, to work another 5s nextSleepinSecs += 5; // When there is pending work, to work another 5s
} }
#endif #endif
} }
} }

View file

@ -1,8 +1,9 @@
#pragma once #pragma once
class ExWatchdogManager { class ExWatchdogManager {
public: protected:
unsigned long next_feed_watchdog; unsigned long next_feed_watchdog;
public:
ExWatchdogManager() { next_feed_watchdog = 0; } ExWatchdogManager() { next_feed_watchdog = 0; }
virtual bool begin() { return false; } virtual bool begin() { return false; }
virtual void loop() { } virtual void loop() { }

View file

@ -141,11 +141,16 @@ void SolarExWatchdog::loop() {
} }
unsigned long SolarExWatchdog::getIntervalMs() const { unsigned long SolarExWatchdog::getIntervalMs() const {
return next_feed_watchdog - millis(); unsigned long interval_ms = 0;
interval_ms = next_feed_watchdog - millis();
if(interval_ms > EX_WATCHDOG_TIMEOUT_MS) {
interval_ms = EX_WATCHDOG_TIMEOUT_MS;
}
return interval_ms;
} }
void SolarExWatchdog::feed() { void SolarExWatchdog::feed() {
digitalWrite(EX_WATCHDOG_DONE_PIN, HIGH); digitalWrite(EX_WATCHDOG_DONE_PIN, HIGH);
delay(1); delay(1);
digitalWrite(EX_WATCHDOG_DONE_PIN, LOW); digitalWrite(EX_WATCHDOG_DONE_PIN, LOW);
} }