Merge pull request #299 from tekka007/smartsleepfix

Fixing smartsleep, define return value for sleep()
This commit is contained in:
tekka007
2015-12-16 11:54:29 +01:00
6 changed files with 91 additions and 65 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ void hwWriteConfig(int adr, uint8_t value);
uint8_t hwReadConfig(int adr); uint8_t hwReadConfig(int adr);
*/ */
void hwSleep(unsigned long ms); int8_t hwSleep(unsigned long ms);
int8_t hwSleep(uint8_t interrupt, uint8_t mode, 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); int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms);
#ifdef MY_DEBUG #ifdef MY_DEBUG
+3 -2
View File
@@ -94,8 +94,9 @@ void hwInternalSleep(unsigned long ms) {
if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15Ms); ms -= 15; } if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15Ms); ms -= 15; }
} }
void hwSleep(unsigned long ms) { int8_t hwSleep(unsigned long ms) {
hwInternalSleep(ms); hwInternalSleep(ms);
return -1;
} }
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
@@ -120,7 +121,7 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo
detachInterrupt(interrupt1); detachInterrupt(interrupt1);
if (interrupt2!=0xFF) detachInterrupt(interrupt2); if (interrupt2!=0xFF) detachInterrupt(interrupt2);
// default: no interrupt triggered // default: no interrupt triggered, timer wake up
int8_t retVal = -1; int8_t retVal = -1;
if (pinIntTrigger == 1) { if (pinIntTrigger == 1) {
+4 -3
View File
@@ -92,18 +92,19 @@ void hwWriteConfig(int adr, uint8_t value)
void hwSleep(unsigned long ms) { int8_t hwSleep(unsigned long ms) {
// TODO: Not supported! // TODO: Not supported!
return -2;
} }
int8_t 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! // TODO: Not supported!
return false; return -2;
} }
int8_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! // TODO: Not supported!
return 0; return -2;
} }
#ifdef MY_DEBUG #ifdef MY_DEBUG
+13 -12
View File
@@ -111,27 +111,28 @@ void hwReboot() {
// TODO: Not supported! // TODO: Not supported!
} }
void hwSleep(unsigned long ms) { int8_t hwSleep(unsigned long ms) {
// TODO: Not supported! // TODO: Not supported!
ms = ms + 1; (void)ms;
return -2;
} }
int8_t 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! // TODO: Not supported!
interrupt = interrupt; (void)interrupt;
mode = mode; (void)mode;
ms = ms; (void)ms;
return false; return -2;
} }
int8_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! // TODO: Not supported!
interrupt1 = interrupt1; (void)interrupt1;
mode1 = mode1; (void)mode1;
interrupt2 = interrupt2; (void)interrupt2;
mode2 = mode2; (void)mode2;
ms = ms; (void)ms;
return 0; return -2;
} }
#ifdef MY_DEBUG #ifdef MY_DEBUG
+47 -25
View File
@@ -315,72 +315,94 @@ void wait(unsigned long ms) {
} }
} }
void sleep(unsigned long ms) { int8_t sleep(unsigned long ms) {
#if defined(MY_OTA_FIRMWARE_FEATURE) #if defined(MY_OTA_FIRMWARE_FEATURE)
if (_fwUpdateOngoing) { if (_fwUpdateOngoing) {
// Do not sleep node while fw update is ongoing // Do not sleep node while fw update is ongoing
_process(); wait(ms);
return; return -1;
} else { }
#endif #endif
// if repeater, do not sleep
#if defined(MY_REPEATER_FEATURE)
wait(ms);
return -1;
#else
#if defined(MY_RADIO_FEATURE) #if defined(MY_RADIO_FEATURE)
transportPowerDown(); transportPowerDown();
#endif #endif
hwSleep(ms); return hwSleep(ms);
#if defined(MY_OTA_FIRMWARE_FEATURE)
}
#endif #endif
} }
void smartSleep(unsigned long ms) { int8_t smartSleep(unsigned long ms) {
wait(MY_SMART_SLEEP_WAIT_DURATION); int8_t ret = sleep(ms);
sleep(ms); // notifiy controller about wake up
sendHeartbeat(); sendHeartbeat();
// listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION);
return ret;
} }
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
#if defined(MY_OTA_FIRMWARE_FEATURE) #if defined(MY_OTA_FIRMWARE_FEATURE)
if (_fwUpdateOngoing) { if (_fwUpdateOngoing) {
// Do not sleep node while fw update is ongoing // not supported
return false; return -2;
} else { }
#endif #endif
#if defined(MY_REPEATER_FEATURE)
// not supported
(void)interrupt;
(void)mode;
(void)ms;
return -2;
#else
#if defined(MY_RADIO_FEATURE) #if defined(MY_RADIO_FEATURE)
transportPowerDown(); transportPowerDown();
#endif #endif
return hwSleep(interrupt, mode, ms); return hwSleep(interrupt, mode, ms);
#if defined(MY_OTA_FIRMWARE_FEATURE)
}
#endif #endif
} }
bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
wait(MY_SMART_SLEEP_WAIT_DURATION); int8_t ret = sleep(interrupt, mode, ms);
bool ret = sleep(interrupt, mode, ms); // notifiy controller about wake up
sendHeartbeat(); sendHeartbeat();
// listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION);
return ret; return ret;
} }
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
#if defined(MY_OTA_FIRMWARE_FEATURE) #if defined(MY_OTA_FIRMWARE_FEATURE)
if (_fwUpdateOngoing) { if (_fwUpdateOngoing) {
// Do not sleep node while fw update is ongoing // not supported
return -1; return -2;
} else { }
#endif #endif
#if defined(MY_REPEATER_FEATURE)
// not supported
(void)interrupt1;
(void)mode1;
(void)interrupt2;
(void)mode2;
(void)ms;
return -2;
#else
#if defined(MY_RADIO_FEATURE) #if defined(MY_RADIO_FEATURE)
transportPowerDown(); transportPowerDown();
#endif #endif
return hwSleep(interrupt1, mode1, interrupt2, mode2, ms); return hwSleep(interrupt1, mode1, interrupt2, mode2, ms);
#if defined(MY_OTA_FIRMWARE_FEATURE)
}
#endif #endif
} }
int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
wait(MY_SMART_SLEEP_WAIT_DURATION);
int8_t ret = sleep(interrupt1, mode1, interrupt2, mode2, ms); int8_t ret = sleep(interrupt1, mode1, interrupt2, mode2, ms);
// notifiy controller about wake up
sendHeartbeat(); sendHeartbeat();
// listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION);
return ret; return ret;
} }
+7 -6
View File
@@ -178,9 +178,10 @@ void wait(unsigned long ms);
/** /**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer. * Sleep (PowerDownMode) the MCU and radio. Wake up on timer.
* @param ms Number of milliseconds to sleep. * @param ms Number of milliseconds to sleep.
* @return -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
*/ */
void sleep(unsigned long ms); int8_t sleep(unsigned long ms);
void smartSleep(unsigned long ms); int8_t smartSleep(unsigned long ms);
/** /**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change. * Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change.
@@ -189,10 +190,10 @@ void smartSleep(unsigned long ms);
* @param interrupt Interrupt that should trigger the wakeup * @param interrupt Interrupt that should trigger the wakeup
* @param mode RISING, FALLING, CHANGE * @param mode RISING, FALLING, CHANGE
* @param ms Number of milliseconds to sleep or 0 to sleep forever * @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return true if wake up was triggered by pin change and false means timer woke it up. * @return Interrupt number wake up was triggered by pin change, -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
*/ */
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0); int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0); int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
/** /**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change for two separate interrupts. * Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change for two separate interrupts.
@@ -203,7 +204,7 @@ bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
* @param interrupt2 Second interrupt that should trigger the wakeup * @param interrupt2 Second interrupt that should trigger the wakeup
* @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE) * @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE)
* @param ms Number of milliseconds to sleep or 0 to sleep forever * @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return Interrupt number wake up was triggered by pin change and negative if timer woke it up. * @return Interrupt number wake up was triggered by pin change, -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
*/ */
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0); int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0);
int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0); int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0);