From 7e3f5d2d5410117367dbb52b5c1e578f40b2e590 Mon Sep 17 00:00:00 2001 From: Henrik Ekblad Date: Sat, 28 Nov 2015 22:45:52 +0100 Subject: [PATCH] Smart sleep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- libraries/MySensors/MyConfig.h | 7 +++++++ libraries/MySensors/core/MyCapabilities.h | 8 ++++---- libraries/MySensors/core/MySensorCore.cpp | 20 +++++++++++++++++++- libraries/MySensors/core/MySensorCore.h | 7 +++---- libraries/MySensors/keywords.txt | 7 +++++-- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libraries/MySensors/MyConfig.h b/libraries/MySensors/MyConfig.h index 3e12d2a..3749295 100644 --- a/libraries/MySensors/MyConfig.h +++ b/libraries/MySensors/MyConfig.h @@ -74,6 +74,13 @@ // Enables repeater functionality (relays messages from other nodes) // #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 ***********************************/ diff --git a/libraries/MySensors/core/MyCapabilities.h b/libraries/MySensors/core/MyCapabilities.h index 80454b9..6910d3b 100644 --- a/libraries/MySensors/core/MyCapabilities.h +++ b/libraries/MySensors/core/MyCapabilities.h @@ -41,7 +41,7 @@ #elif defined(MY_RS485) #define MY_CAP_RADIO "S" #else - #define MY_CAP_RADIO "?" + #define MY_CAP_RADIO "-" #endif #if defined(MY_GATEWAY_FEATURE) @@ -59,7 +59,7 @@ #elif defined(ARDUINO_ARCH_AVR) #define MY_CAP_ARCH "A" #else - #define MY_CAP_ARCH "?" + #define MY_CAP_ARCH "-" #endif #if defined(MY_SIGNING_ATSHA204) @@ -67,10 +67,10 @@ #elif defined(MY_SIGNING_SOFT) #define MY_CAP_SIGN "S" #else - #define MY_CAP_SIGN "?" + #define MY_CAP_SIGN "-" #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 */ diff --git a/libraries/MySensors/core/MySensorCore.cpp b/libraries/MySensors/core/MySensorCore.cpp index a68d296..79f1444 100644 --- a/libraries/MySensors/core/MySensorCore.cpp +++ b/libraries/MySensors/core/MySensorCore.cpp @@ -334,6 +334,12 @@ void sleep(unsigned long ms) { #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) { #if defined(MY_OTA_FIRMWARE_FEATURE) if (_fwUpdateOngoing) { @@ -350,6 +356,13 @@ bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { #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) { #if defined(MY_OTA_FIRMWARE_FEATURE) if (_fwUpdateOngoing) { @@ -366,6 +379,11 @@ int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode #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; +} diff --git a/libraries/MySensors/core/MySensorCore.h b/libraries/MySensors/core/MySensorCore.h index 5a3ade6..00bc966 100644 --- a/libraries/MySensors/core/MySensorCore.h +++ b/libraries/MySensors/core/MySensorCore.h @@ -23,10 +23,6 @@ #include "Version.h" // Auto generated by bot #include "MyConfig.h" -#ifdef MY_SIGNING_FEATURE -#include "MySigning.h" -#include "MySigningNone.h" -#endif #include "MyMessage.h" #ifdef MY_OTA_FIRMWARE_FEATURE #include "drivers/SPIFlash/SPIFlash.h" @@ -184,6 +180,7 @@ void wait(unsigned long ms); * @param ms Number of milliseconds to sleep. */ void sleep(unsigned long ms); +void smartSleep(unsigned long ms); /** * 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. */ 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. @@ -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. */ 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 ********/ diff --git a/libraries/MySensors/keywords.txt b/libraries/MySensors/keywords.txt index 52f9daf..7df3813 100644 --- a/libraries/MySensors/keywords.txt +++ b/libraries/MySensors/keywords.txt @@ -7,7 +7,6 @@ MySensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### -setIncomingCallback KEYWORD2 present KEYWORD2 send KEYWORD2 sendSketchInfo KEYWORD2 @@ -24,6 +23,8 @@ receiveTime KEYWORD2 loop KEYWORD2 setup KEYWORD2 presentation KEYWORD2 +sleep KEYWORD2 +smartSleep KEYWORD2 ###################################### # Constants (LITERAL1) @@ -106,4 +107,6 @@ MY_MQTT_PUBLISH_TOPIC_PREFIX LITERAL1 MY_MQTT_CLIENT_ID LITERAL1 MY_GATEWAY_MQTT_CLIENT LITERAL1 MY_DISABLE_REMOTE_RESET LITERAL1 -MY_RS485_DE_PIN LITERAL1 \ No newline at end of file +MY_RS485_DE_PIN LITERAL1 +MY_SIGNING_REQUEST_SIGNATURES LITERAL1 +MY_SMART_SLEEP_WAIT_DURATION LITERAL1 \ No newline at end of file