mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-09-14 15:16:40 +00:00
Fix external watchdog timing around sleep
This commit is contained in:
@@ -164,16 +164,17 @@ void loop() {
|
||||
if (the_mesh.getNodePrefs()->powersaving_enabled && !the_mesh.hasPendingWork()) {
|
||||
#if defined(NRF52_PLATFORM)
|
||||
#ifdef HAS_EXTERNAL_WATCHDOG
|
||||
uint32_t sleep_interval = external_watchdog.getIntervalMs()/1000;
|
||||
board.sleep((sleep_interval > 1800) ? 1800 : sleep_interval); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
|
||||
external_watchdog.feed();
|
||||
uint32_t sleep_interval = external_watchdog.getIntervalMs() / 1000;
|
||||
board.sleep((sleep_interval > 1800) ? 1800 : sleep_interval); // nrf ignores seconds param, sleeps whenever possible
|
||||
#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
|
||||
#endif
|
||||
#else
|
||||
if (the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) { // To check if it is time to sleep
|
||||
#ifdef HAS_EXTERNAL_WATCHDOG
|
||||
uint32_t sleep_interval = external_watchdog.getIntervalMs()/1000;
|
||||
external_watchdog.feed();
|
||||
uint32_t sleep_interval = external_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
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
class ExternalWatchdogManager {
|
||||
protected:
|
||||
unsigned long next_feed_watchdog;
|
||||
unsigned long last_feed_watchdog;
|
||||
public:
|
||||
ExternalWatchdogManager() { next_feed_watchdog = 0; }
|
||||
ExternalWatchdogManager() { last_feed_watchdog = 0; }
|
||||
virtual bool begin() { return false; }
|
||||
virtual void loop() { }
|
||||
virtual unsigned long getIntervalMs() const { return 0; }
|
||||
|
||||
@@ -17,7 +17,7 @@ build_flags = ${nrf52_base.build_flags}
|
||||
-D HAS_EXTERNAL_WATCHDOG
|
||||
-D EXTERNAL_WATCHDOG_DONE_PIN=9
|
||||
-D EXTERNAL_WATCHDOG_WAKE_PIN=10
|
||||
-D EXTERNAL_WATCHDOG_TIMEOUT_MS=480000 ;(6*60*1000) ; 6 minute watchdog
|
||||
-D EXTERNAL_WATCHDOG_FEED_INTERVAL_MS=480000 ; 8 minute feed interval, safely inside the hardware watchdog timeout
|
||||
|
||||
build_src_filter = ${nrf52_base.build_src_filter}
|
||||
+<helpers/*.cpp>
|
||||
@@ -97,4 +97,4 @@ build_src_filter = ${Heltec_mesh_solar.build_src_filter}
|
||||
+<../examples/companion_radio/*.cpp>
|
||||
lib_deps =
|
||||
${Heltec_mesh_solar.lib_deps}
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
densaugeo/base64 @ ~1.4.0
|
||||
|
||||
@@ -124,7 +124,7 @@ bool SolarSensorManager::setSettingValue(const char* name, const char* value) {
|
||||
}
|
||||
|
||||
bool SolarExternalWatchdog::begin() {
|
||||
next_feed_watchdog = 0;
|
||||
last_feed_watchdog = 0;
|
||||
pinMode(EXTERNAL_WATCHDOG_WAKE_PIN, INPUT);
|
||||
pinMode(EXTERNAL_WATCHDOG_DONE_PIN, OUTPUT);
|
||||
delay(1);
|
||||
@@ -134,23 +134,22 @@ bool SolarExternalWatchdog::begin() {
|
||||
return true;
|
||||
}
|
||||
void SolarExternalWatchdog::loop() {
|
||||
if (millis() > next_feed_watchdog) {
|
||||
if (millis() - last_feed_watchdog >= EXTERNAL_WATCHDOG_FEED_INTERVAL_MS) {
|
||||
feed();
|
||||
next_feed_watchdog = millis() + EXTERNAL_WATCHDOG_TIMEOUT_MS;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long SolarExternalWatchdog::getIntervalMs() const {
|
||||
unsigned long interval_ms = 0;
|
||||
interval_ms = next_feed_watchdog - millis();
|
||||
if(interval_ms > EXTERNAL_WATCHDOG_TIMEOUT_MS) {
|
||||
interval_ms = EXTERNAL_WATCHDOG_TIMEOUT_MS;
|
||||
unsigned long elapsed_ms = millis() - last_feed_watchdog;
|
||||
if (elapsed_ms >= EXTERNAL_WATCHDOG_FEED_INTERVAL_MS) {
|
||||
return 0;
|
||||
}
|
||||
return interval_ms;
|
||||
return EXTERNAL_WATCHDOG_FEED_INTERVAL_MS - elapsed_ms;
|
||||
}
|
||||
|
||||
void SolarExternalWatchdog::feed() {
|
||||
digitalWrite(EXTERNAL_WATCHDOG_DONE_PIN, HIGH);
|
||||
delay(1);
|
||||
digitalWrite(EXTERNAL_WATCHDOG_DONE_PIN, LOW);
|
||||
last_feed_watchdog = millis();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user