From 3485182945cfe4e188b791a1860201ece55da24f Mon Sep 17 00:00:00 2001 From: tekka007 Date: Mon, 7 Dec 2015 22:28:28 +0100 Subject: [PATCH] intermediate 20151207 --- libraries/MySensors/core/MyHw.h | 4 +- libraries/MySensors/core/MyHwATMega328.cpp | 92 +++++++++------------- libraries/MySensors/core/MyHwESP8266.cpp | 4 +- 3 files changed, 41 insertions(+), 59 deletions(-) diff --git a/libraries/MySensors/core/MyHw.h b/libraries/MySensors/core/MyHw.h index 5b1f27a..c93ea41 100644 --- a/libraries/MySensors/core/MyHw.h +++ b/libraries/MySensors/core/MyHw.h @@ -43,8 +43,8 @@ uint8_t hwReadConfig(int adr); */ void hwSleep(unsigned long ms); -bool hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms); -uint8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms); +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms); +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms); #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ); #endif diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index f856953..d718737 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -22,6 +22,7 @@ #include "MyHwATMega328.h" int8_t pinIntTrigger = 0; + void wakeUp() //place to send the interrupts { pinIntTrigger = 1; @@ -44,36 +45,28 @@ ISR (WDT_vect) void hwPowerDown(period_t period) { + // disable ADC for power saving ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { + // change WDT to waiting period wdt_enable(period); + // enable WDT interrupt before system reset WDTCSR |= (1 << WDIE); } - #if defined __AVR_ATmega328P__ - do { - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - cli(); - sleep_enable(); - sleep_bod_disable(); - sei(); - sleep_cpu(); - sleep_disable(); - sei(); - } while (0); - #else - do { - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - cli(); - sleep_enable(); - sei(); - sleep_cpu(); - sleep_disable(); - sei(); - } while (0); - #endif - + // maximum power saving + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + cli(); + sleep_enable(); +#if defined __AVR_ATmega328P__ + sleep_bod_disable(); +#endif + sei(); + // sleep until WDT or ext. interrupt + sleep_cpu(); + sleep_disable(); + // enable ADC ADCSRA |= (1 << ADEN); } @@ -99,50 +92,39 @@ void hwSleep(unsigned long ms) { hwInternalSleep(ms); } -bool hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { - // Let serial prints finish (debug, log etc) - bool pinTriggeredWakeup = true; - attachInterrupt(interrupt, wakeUp, mode); - if (ms>0) { - pinIntTrigger = 0; - hwInternalSleep(ms); - if (0 == pinIntTrigger) { - pinTriggeredWakeup = false; - } - } else { - #ifndef MY_DISABLED_SERIAL - Serial.flush(); - #endif - hwPowerDown(SLEEP_FOREVER); - } - detachInterrupt(interrupt); - return pinTriggeredWakeup; +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { + return hwSleep(interrupt,mode,0xFF,0x00,ms); } -uint8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { - int8_t retVal = 1; +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { + // no interrupt triggered + int8_t retVal = -1; + // reset interrupt trigger + pinIntTrigger = 0; + // attach interrupts attachInterrupt(interrupt1, wakeUp, mode1); - attachInterrupt(interrupt2, wakeUp2, mode2); + if (interrupt2!=0xFF) attachInterrupt(interrupt2, wakeUp2, mode2); + if (ms>0) { - pinIntTrigger = 0; + // sleep for defined time hwInternalSleep(ms); - if (0 == pinIntTrigger) { - retVal = -1; - } } else { - #ifndef MY_DISABLED_SERIAL - Serial.flush(); - #endif - hwPowerDown(SLEEP_FOREVER); + // sleep until ext interrupt triggered + hwPowerDown(SLEEP_FOREVER); } + detachInterrupt(interrupt1); - detachInterrupt(interrupt2); + if (interrupt2!=0xFF) detachInterrupt(interrupt2); - if (1 == pinIntTrigger) { + if (pinIntTrigger == 0) { + // no interrupt triggered + retVal = -1; + } else if (pinIntTrigger == 1) { retVal = (int8_t)interrupt1; - } else if (2 == pinIntTrigger) { + } else if (pinIntTrigger == 2) { retVal = (int8_t)interrupt2; } + return retVal; } diff --git a/libraries/MySensors/core/MyHwESP8266.cpp b/libraries/MySensors/core/MyHwESP8266.cpp index d834582..f2e6879 100644 --- a/libraries/MySensors/core/MyHwESP8266.cpp +++ b/libraries/MySensors/core/MyHwESP8266.cpp @@ -96,12 +96,12 @@ void hwSleep(unsigned long ms) { // TODO: Not supported! } -bool hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { // TODO: Not supported! return false; } -uint8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { // TODO: Not supported! return 0; }