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:
+25
-29
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user