Fix compile issue with rules and startup procedure of deepsleep (#20122)

* Fix compile issue with rules and startup procedure of deepsleep

* fix

* fix inc with old functionality

fix a side effect with the old behavior
This commit is contained in:
stefanbode 2023-11-29 15:36:43 +01:00 committed by GitHub
parent 59c22b6353
commit 47bc321ebb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 4 deletions

View File

@ -52,6 +52,9 @@ uint8_t deepsleep_flag = 0;
bool DeepSleepEnabled(void) bool DeepSleepEnabled(void)
{ {
if (GetRule(0) == "Wakeup" && bitRead(Settings->rule_enabled | Settings->rule_once, 0)) {
return true;
}
if ((Settings->deepsleep < 10) || (Settings->deepsleep > DEEPSLEEP_MAX)) { if ((Settings->deepsleep < 10) || (Settings->deepsleep > DEEPSLEEP_MAX)) {
Settings->deepsleep = 0; // Issue #6961 Settings->deepsleep = 0; // Issue #6961
return false; // Disabled return false; // Disabled
@ -133,7 +136,7 @@ void DeepSleepCalculate()
// default add to the next wakeup. May be overwritten by "Wakeup" rule // default add to the next wakeup. May be overwritten by "Wakeup" rule
RtcSettings.nextwakeup += Settings->deepsleep; RtcSettings.nextwakeup += Settings->deepsleep;
#if defined(USE_RULES) || defined(USE_SCRIPT) #if defined(USE_RULES)
if (RtcTime.valid) { if (RtcTime.valid) {
if (!RtcTime.hour && !RtcTime.minute && !RtcTime.second) { TimerSetRandomWindows(); } // Midnight if (!RtcTime.hour && !RtcTime.minute && !RtcTime.second) { TimerSetRandomWindows(); } // Midnight
if (Settings->flag3.timers_enable) { if (Settings->flag3.timers_enable) {
@ -144,7 +147,7 @@ void DeepSleepCalculate()
// day_bitarray>0 otherwhise no weekday selected // day_bitarray>0 otherwhise no weekday selected
// rule keyword "Wakeup" // rule keyword "Wakeup"
// Timer action: rule // Timer action: rule
if (xtimer.arm && day_bitarray && GetRule(0) == "Wakeup" && bitRead(Settings->rule_enabled, 0) && POWER_BLINK == xtimer.power) { if (xtimer.arm && day_bitarray && GetRule(0) == "Wakeup" && bitRead(Settings->rule_enabled | Settings->rule_once, 0) && POWER_BLINK == xtimer.power) {
#ifdef USE_SUNRISE #ifdef USE_SUNRISE
if ((1 == xtimer.mode) || (2 == xtimer.mode)) { // Sunrise or Sunset if ((1 == xtimer.mode) || (2 == xtimer.mode)) { // Sunrise or Sunset
ApplyTimerOffsets(&xtimer); ApplyTimerOffsets(&xtimer);
@ -159,6 +162,8 @@ void DeepSleepCalculate()
// we found a timer 604800 == seconds in one week // we found a timer 604800 == seconds in one week
if (secondsToTarget < 604800) { if (secondsToTarget < 604800) {
Settings->deepsleep = secondsToTarget; Settings->deepsleep = secondsToTarget;
// check if rule ist just once
bitWrite(Settings->rule_once, 0, 0);
SettingsSaveAll(); SettingsSaveAll();
AddLog(LOG_LEVEL_DEBUG, PSTR("DSL: Wakeup: %ld [s]"), secondsToTarget); AddLog(LOG_LEVEL_DEBUG, PSTR("DSL: Wakeup: %ld [s]"), secondsToTarget);
RtcSettings.nextwakeup = LocalTime() + secondsToTarget - (LocalTime() % 60); RtcSettings.nextwakeup = LocalTime() + secondsToTarget - (LocalTime() % 60);
@ -245,8 +250,20 @@ void DeepSleepEverySecond(void)
AddLog(LOG_LEVEL_ERROR, PSTR("Error Wifi no connect %d [s]. Deepsleep"), DEEPSLEEP_NETWORK_TIMEOUT); AddLog(LOG_LEVEL_ERROR, PSTR("Error Wifi no connect %d [s]. Deepsleep"), DEEPSLEEP_NETWORK_TIMEOUT);
deepsleep_flag = DEEPSLEEP_START_COUNTDOWN; // Start deepsleep in 4 seconds deepsleep_flag = DEEPSLEEP_START_COUNTDOWN; // Start deepsleep in 4 seconds
} }
#if defined(USE_RULES)
if (!deepsleep_flag) { return; } if (!deepsleep_flag) {
if (Settings->flag3.timers_enable && GetRule(0) == "Wakeup"
&& bitRead(Settings->rule_enabled | Settings->rule_once, 0) ) {
deepsleep_flag = 60;
}
return;
}
if (GetRule(0) == "Wakeup" && ( !Settings->flag3.timers_enable || !bitRead(Settings->rule_enabled | Settings->rule_once, 0) )) {
deepsleep_flag = 0;
Settings->deepsleep = 0;
return;
}
#endif
deepsleep_flag--; deepsleep_flag--;
AddLog(LOG_LEVEL_ERROR, PSTR("DSL: Countdown: %d"),deepsleep_flag); AddLog(LOG_LEVEL_ERROR, PSTR("DSL: Countdown: %d"),deepsleep_flag);
if (DeepSleepEnabled()) { if (DeepSleepEnabled()) {