Fix smartsleep (#535)

* Make smartSleep send heartbeat before sleeping

Sending the heartbeat (and waiting) after waking up would delay
processing inputs. For example, a switch could be back to the
open state before the wait is over.

* Fix typos in comments in smartSleep methods
This commit is contained in:
Martin Hjelmare
2016-08-02 22:21:14 +02:00
committed by Olivier
parent 99973a346e
commit b293f47a7f
+25 -29
View File
@@ -65,7 +65,7 @@ void _infiniteLoop() {
} }
void _begin() { void _begin() {
#if !defined(MY_DISABLED_SERIAL) #if !defined(MY_DISABLED_SERIAL)
hwInit(); hwInit();
#endif #endif
@@ -73,7 +73,7 @@ void _begin() {
debug(PSTR("MCO:BGN:INIT " MY_NODE_TYPE ",CP=" MY_CAPABILITIES ",VER=" MYSENSORS_LIBRARY_VERSION "\n")); debug(PSTR("MCO:BGN:INIT " MY_NODE_TYPE ",CP=" MY_CAPABILITIES ",VER=" MYSENSORS_LIBRARY_VERSION "\n"));
// Call before() in sketch (if it exists) // Call before() in sketch (if it exists)
if (before) if (before)
before(); before();
#if defined(MY_LEDS_BLINKING_FEATURE) #if defined(MY_LEDS_BLINKING_FEATURE)
@@ -85,7 +85,7 @@ void _begin() {
// Read latest received controller configuration from EEPROM // Read latest received controller configuration from EEPROM
// Note: _cc.isMetric is bool, hence empty EEPROM (=0xFF) evaluates to true (default) // Note: _cc.isMetric is bool, hence empty EEPROM (=0xFF) evaluates to true (default)
hwReadConfigBlock((void*)&_cc, (void*)EEPROM_CONTROLLER_CONFIG_ADDRESS, sizeof(ControllerConfig)); hwReadConfigBlock((void*)&_cc, (void*)EEPROM_CONTROLLER_CONFIG_ADDRESS, sizeof(ControllerConfig));
#if defined(MY_OTA_FIRMWARE_FEATURE) #if defined(MY_OTA_FIRMWARE_FEATURE)
// Read firmware config from EEPROM, i.e. type, version, CRC, blocks // Read firmware config from EEPROM, i.e. type, version, CRC, blocks
readFirmwareSettings(); readFirmwareSettings();
@@ -104,7 +104,7 @@ void _begin() {
} }
#endif #endif
#ifdef MY_NODE_LOCK_FEATURE #ifdef MY_NODE_LOCK_FEATURE
// Check if node has been locked down // Check if node has been locked down
@@ -131,7 +131,7 @@ void _begin() {
hwWriteConfig(EEPROM_NODE_LOCK_COUNTER, MY_NODE_LOCK_COUNTER_MAX); hwWriteConfig(EEPROM_NODE_LOCK_COUNTER, MY_NODE_LOCK_COUNTER_MAX);
} }
#endif #endif
#if defined(MY_GATEWAY_FEATURE) #if defined(MY_GATEWAY_FEATURE)
#if defined(MY_INCLUSION_BUTTON_FEATURE) #if defined(MY_INCLUSION_BUTTON_FEATURE)
inclusionInit(); inclusionInit();
@@ -144,12 +144,12 @@ void _begin() {
// Nothing more we can do // Nothing more we can do
_infiniteLoop(); _infiniteLoop();
} }
#endif #endif
#if !defined(MY_GATEWAY_FEATURE) #if !defined(MY_GATEWAY_FEATURE)
presentNode(); presentNode();
#endif #endif
// register node // register node
_registerNode(); _registerNode();
@@ -173,7 +173,7 @@ void _registerNode() {
_sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_REGISTRATION_REQUEST, false).set(MY_CORE_VERSION)); _sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_REGISTRATION_REQUEST, false).set(MY_CORE_VERSION));
} while (!wait(2000, C_INTERNAL, I_REGISTRATION_RESPONSE) && counter--); } while (!wait(2000, C_INTERNAL, I_REGISTRATION_RESPONSE) && counter--);
#else #else
_nodeRegistered = true; _nodeRegistered = true;
debug(PSTR("MCO:REG:NOT NEEDED\n")); debug(PSTR("MCO:REG:NOT NEEDED\n"));
#endif #endif
@@ -190,11 +190,11 @@ void presentNode() {
present(NODE_SENSOR_ID, S_ARDUINO_NODE); present(NODE_SENSOR_ID, S_ARDUINO_NODE);
#endif #endif
#else #else
#if defined(MY_OTA_FIRMWARE_FEATURE) #if defined(MY_OTA_FIRMWARE_FEATURE)
presentBootloaderInformation(); presentBootloaderInformation();
#endif #endif
// Send signing preferences for this node to the GW // Send signing preferences for this node to the GW
signerPresentation(_msgTmp, GATEWAY_ADDRESS); signerPresentation(_msgTmp, GATEWAY_ADDRESS);
@@ -204,16 +204,16 @@ void presentNode() {
#else #else
present(NODE_SENSOR_ID, S_ARDUINO_NODE); present(NODE_SENSOR_ID, S_ARDUINO_NODE);
#endif #endif
// Send a configuration exchange request to controller // Send a configuration exchange request to controller
// Node sends parent node. Controller answers with latest node configuration // Node sends parent node. Controller answers with latest node configuration
_sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_CONFIG, false).set(_nc.parentNodeId)); _sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_CONFIG, false).set(_nc.parentNodeId));
// Wait configuration reply. // Wait configuration reply.
wait(2000, C_INTERNAL, I_CONFIG); wait(2000, C_INTERNAL, I_CONFIG);
#endif #endif
if (presentation) if (presentation)
presentation(); presentation();
@@ -257,7 +257,7 @@ bool send(MyMessage &message, bool enableAck) {
mSetRequestAck(message, enableAck); mSetRequestAck(message, enableAck);
#if defined(MY_REGISTRATION_FEATURE) && !defined(MY_GATEWAY_FEATURE) #if defined(MY_REGISTRATION_FEATURE) && !defined(MY_GATEWAY_FEATURE)
if (_nodeRegistered) { if (_nodeRegistered) {
return _sendRoute(message); return _sendRoute(message);
} }
else { else {
@@ -379,17 +379,17 @@ bool _processInternalMessages() {
#endif #endif
} }
else return false; else return false;
} }
else { else {
// sender is a node // sender is a node
if (type == I_REGISTRATION_REQUEST) { if (type == I_REGISTRATION_REQUEST) {
#if defined(MY_GATEWAY_FEATURE) #if defined(MY_GATEWAY_FEATURE)
// register request are exclusively handled by GW/Controller // register request are exclusively handled by GW/Controller
// !!! eventually define if AUTO ACK or register request forwarded to controller // !!! eventually define if AUTO ACK or register request forwarded to controller
#if !defined(MY_REGISTRATION_CONTROLLER) #if !defined(MY_REGISTRATION_CONTROLLER)
// auto register if version compatible // auto register if version compatible
bool approveRegistration = true; bool approveRegistration = true;
#if defined(MY_CORE_COMPATIBILITY_CHECK) #if defined(MY_CORE_COMPATIBILITY_CHECK)
approveRegistration = (_msg.getByte() >= MY_CORE_MIN_VERSION); approveRegistration = (_msg.getByte() >= MY_CORE_MIN_VERSION);
#endif #endif
@@ -397,7 +397,7 @@ bool _processInternalMessages() {
#else #else
return false; // processing of this request via controller return false; // processing of this request via controller
#endif #endif
#endif #endif
} }
else return false; else return false;
} }
@@ -463,12 +463,11 @@ int8_t sleep(unsigned long ms) {
} }
int8_t smartSleep(unsigned long ms) { int8_t smartSleep(unsigned long ms) {
int8_t ret = sleep(ms); // notify controller about going to sleep
// notifiy controller about wake up
sendHeartbeat(); sendHeartbeat();
// listen for incoming messages // listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION); wait(MY_SMART_SLEEP_WAIT_DURATION);
return ret; return sleep(ms);
} }
int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
@@ -496,12 +495,11 @@ int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
} }
int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
int8_t ret = sleep(interrupt, mode, ms); // notify controller about going to sleep
// notifiy controller about wake up
sendHeartbeat(); sendHeartbeat();
// listen for incoming messages // listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION); wait(MY_SMART_SLEEP_WAIT_DURATION);
return ret; return sleep(interrupt, mode, ms);
} }
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) {
@@ -531,12 +529,11 @@ int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode
} }
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) {
int8_t ret = sleep(interrupt1, mode1, interrupt2, mode2, ms); // notify controller about going to sleep
// notifiy controller about wake up
sendHeartbeat(); sendHeartbeat();
// listen for incoming messages // listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION); wait(MY_SMART_SLEEP_WAIT_DURATION);
return ret; return sleep(interrupt1, mode1, interrupt2, mode2, ms);
} }
#ifdef MY_NODE_LOCK_FEATURE #ifdef MY_NODE_LOCK_FEATURE
@@ -559,4 +556,3 @@ void nodeLock(const char* str) {
} }
} }
#endif #endif