Smart sleep

Add “Smart sleep” variants of all sleep methods that allows nodes to
receive buffered messages/commands from controller that was issued while
node was sleeping.. When calling the smartSleep() variant, the node
immediately sends a heartbeat mesage when waking up (informing
controller that node is awake). Before going back to sleep it waits
MY_SMART_SLEEP_WAIT_DURATION to process any incoming buffered messages
from the controller. NOTE: Controller must support this feature.
This commit is contained in:
Henrik Ekblad
2015-11-28 22:45:52 +01:00
parent 98554aba99
commit 7e3f5d2d54
5 changed files with 38 additions and 11 deletions
+7
View File
@@ -74,6 +74,13 @@
// Enables repeater functionality (relays messages from other nodes) // Enables repeater functionality (relays messages from other nodes)
// #define MY_REPEATER_FEATURE // #define MY_REPEATER_FEATURE
// The wait period before going to sleep when using smartSleep-functions
// This period has to be long enough for controller to be able to send out
// potential buffered messages.
#ifndef MY_SMART_SLEEP_WAIT_DURATION
#define MY_SMART_SLEEP_WAIT_DURATION 500
#endif
/********************************** /**********************************
* Over the air firmware updates * Over the air firmware updates
***********************************/ ***********************************/
+4 -4
View File
@@ -41,7 +41,7 @@
#elif defined(MY_RS485) #elif defined(MY_RS485)
#define MY_CAP_RADIO "S" #define MY_CAP_RADIO "S"
#else #else
#define MY_CAP_RADIO "?" #define MY_CAP_RADIO "-"
#endif #endif
#if defined(MY_GATEWAY_FEATURE) #if defined(MY_GATEWAY_FEATURE)
@@ -59,7 +59,7 @@
#elif defined(ARDUINO_ARCH_AVR) #elif defined(ARDUINO_ARCH_AVR)
#define MY_CAP_ARCH "A" #define MY_CAP_ARCH "A"
#else #else
#define MY_CAP_ARCH "?" #define MY_CAP_ARCH "-"
#endif #endif
#if defined(MY_SIGNING_ATSHA204) #if defined(MY_SIGNING_ATSHA204)
@@ -67,10 +67,10 @@
#elif defined(MY_SIGNING_SOFT) #elif defined(MY_SIGNING_SOFT)
#define MY_CAP_SIGN "S" #define MY_CAP_SIGN "S"
#else #else
#define MY_CAP_SIGN "?" #define MY_CAP_SIGN "-"
#endif #endif
#define MY_CAPABILIIES MY_CAP_RESET MY_CAP_OTA_FW MY_CAP_TYPE MY_CAP_ARCH MY_CAP_SIGN #define MY_CAPABILIIES MY_CAP_RESET MY_CAP_RADIO MY_CAP_OTA_FW MY_CAP_TYPE MY_CAP_ARCH MY_CAP_SIGN
#endif /* MyGatewayTransportEthernet_h */ #endif /* MyGatewayTransportEthernet_h */
+19 -1
View File
@@ -334,6 +334,12 @@ void sleep(unsigned long ms) {
#endif #endif
} }
void smartSleep(unsigned long ms) {
wait(MY_SMART_SLEEP_WAIT_DURATION);
sleep(ms);
sendHeartbeat();
}
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { bool 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) {
@@ -350,6 +356,13 @@ bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
#endif #endif
} }
bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
wait(MY_SMART_SLEEP_WAIT_DURATION);
bool ret = sleep(interrupt, mode, ms);
sendHeartbeat();
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) {
@@ -366,6 +379,11 @@ int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode
#endif #endif
} }
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);
sendHeartbeat();
return ret;
}
+3 -4
View File
@@ -23,10 +23,6 @@
#include "Version.h" // Auto generated by bot #include "Version.h" // Auto generated by bot
#include "MyConfig.h" #include "MyConfig.h"
#ifdef MY_SIGNING_FEATURE
#include "MySigning.h"
#include "MySigningNone.h"
#endif
#include "MyMessage.h" #include "MyMessage.h"
#ifdef MY_OTA_FIRMWARE_FEATURE #ifdef MY_OTA_FIRMWARE_FEATURE
#include "drivers/SPIFlash/SPIFlash.h" #include "drivers/SPIFlash/SPIFlash.h"
@@ -184,6 +180,7 @@ void wait(unsigned long ms);
* @param ms Number of milliseconds to sleep. * @param ms Number of milliseconds to sleep.
*/ */
void sleep(unsigned long ms); void sleep(unsigned long ms);
void 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.
@@ -195,6 +192,7 @@ void sleep(unsigned long ms);
* @return true if wake up was triggered by pin change and false means timer woke it up. * @return true if wake up was triggered by pin change and false means timer woke it up.
*/ */
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0); bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
bool 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.
@@ -208,6 +206,7 @@ bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
* @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 and negative if timer woke it up.
*/ */
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);
/****** PRIVATE ********/ /****** PRIVATE ********/
+4 -1
View File
@@ -7,7 +7,6 @@ MySensor KEYWORD1
####################################### #######################################
# Methods and Functions (KEYWORD2) # Methods and Functions (KEYWORD2)
####################################### #######################################
setIncomingCallback KEYWORD2
present KEYWORD2 present KEYWORD2
send KEYWORD2 send KEYWORD2
sendSketchInfo KEYWORD2 sendSketchInfo KEYWORD2
@@ -24,6 +23,8 @@ receiveTime KEYWORD2
loop KEYWORD2 loop KEYWORD2
setup KEYWORD2 setup KEYWORD2
presentation KEYWORD2 presentation KEYWORD2
sleep KEYWORD2
smartSleep KEYWORD2
###################################### ######################################
# Constants (LITERAL1) # Constants (LITERAL1)
@@ -107,3 +108,5 @@ MY_MQTT_CLIENT_ID LITERAL1
MY_GATEWAY_MQTT_CLIENT LITERAL1 MY_GATEWAY_MQTT_CLIENT LITERAL1
MY_DISABLE_REMOTE_RESET LITERAL1 MY_DISABLE_REMOTE_RESET LITERAL1
MY_RS485_DE_PIN LITERAL1 MY_RS485_DE_PIN LITERAL1
MY_SIGNING_REQUEST_SIGNATURES LITERAL1
MY_SMART_SLEEP_WAIT_DURATION LITERAL1