From 8bf0952d0fb74b4f6e6e39869da71eaed083ef2a Mon Sep 17 00:00:00 2001 From: user2684 <user2684@users.noreply.github.com> Date: Sat, 29 Jul 2017 16:16:35 +0200 Subject: [PATCH] Added capability to reboot by setting reboot pin (#133) --- NodeManager.cpp | 32 ++++++++++++++++++++++++++------ NodeManager.h | 3 +++ README.md | 29 +++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/NodeManager.cpp b/NodeManager.cpp index 888f26f..47ce6d4 100755 --- a/NodeManager.cpp +++ b/NodeManager.cpp @@ -3220,6 +3220,15 @@ void NodeManager::before() { Serial.print(F("NodeManager v")); Serial.println(VERSION); #endif + // setup the reboot pin if needed + if (_reboot_pin > -1) { + #if DEBUG == 1 + Serial.print("REB P="); + Serial.println(_reboot_pin); + #endif + pinMode(_reboot_pin, OUTPUT); + digitalWrite(_reboot_pin, HIGH); + } // print out MySensors' library capabilities #if DEBUG == 1 Serial.print(F("LIB R=")); @@ -3476,6 +3485,7 @@ void NodeManager::process(Request & request) { case 27: saveToMemory(0,request.getValueInt()); break; case 28: setInterruptMinDelta(request.getValueInt()); break; case 30: setSleepOrWait(request.getValueInt()); break; + case 31: setRebootPin(request.getValueInt()); break; default: return; } _send(_msg.set(function)); @@ -3519,12 +3529,17 @@ void NodeManager::reboot() { #if DEBUG == 1 Serial.println(F("REBOOT")); #endif - // Software reboot with watchdog timer. Enter Watchdog Configuration mode: - WDTCSR |= (1<<WDCE) | (1<<WDE); - // Reset enable - WDTCSR= (1<<WDE); - // Infinite loop until watchdog reset after 16 ms - while(true){} + if (_reboot_pin > -1) { + // reboot the board through the reboot pin which is connected to RST by setting it to low + digitalWrite(_reboot_pin, LOW); + } else { + // Software reboot with watchdog timer. Enter Watchdog Configuration mode: + WDTCSR |= (1<<WDCE) | (1<<WDE); + // Reset enable + WDTCSR= (1<<WDE); + // Infinite loop until watchdog reset after 16 ms + while(true){} + } } // send NodeManager's the version back to the controller @@ -3635,6 +3650,11 @@ void NodeManager::setSleepOrWait(bool value) { _sleep_or_wait = value; } +// set which pin is connected to RST of the board to reboot the board when requested. If not set the software reboot is used instead (default: -1) +void NodeManager::setRebootPin(int value) { + _reboot_pin = value; +} + // sleep if the node is a battery powered or wait if it is not for the given number of milliseconds void NodeManager::sleepOrWait(long value) { // if the node is sleeping, sleep-or-wait is enabled and we need to sleep for a decent amount of time, call sleep() otherwise wait() diff --git a/NodeManager.h b/NodeManager.h index 6cde1c3..e9c3f3b 100755 --- a/NodeManager.h +++ b/NodeManager.h @@ -1433,6 +1433,8 @@ class NodeManager { void setSleepOrWait(bool value); // sleep if the node is a battery powered or wait if it is not for the given number of milliseconds void sleepOrWait(long value); + // [31] set which pin is connected to RST of the board to reboot the board when requested. If not set the software reboot is used instead (default: -1) + void setRebootPin(int value); // hook into the main sketch functions void before(); void presentation(); @@ -1484,6 +1486,7 @@ class NodeManager { int _is_metric = 1; int _report_interval_seconds = 10*60; bool _sleep_or_wait = true; + int _reboot_pin = -1; void _loadConfig(); void _saveConfig(); }; diff --git a/README.md b/README.md index 277c26a..2b27720 100755 --- a/README.md +++ b/README.md @@ -56,17 +56,21 @@ Since NodeManager has to communicate with the MySensors gateway on your behalf, #define MY_BAUD_RATE 9600 //#define MY_DEBUG //#define MY_NODE_ID 100 +//#define MY_SMART_SLEEP_WAIT_DURATION_MS 500 // NRF24 radio settings #define MY_RADIO_NRF24 //#define MY_RF24_ENABLE_ENCRYPTION //#define MY_RF24_CHANNEL 76 //#define MY_RF24_PA_LEVEL RF24_PA_HIGH +//#define MY_DEBUG_VERBOSE_RF24 +//#define MY_RF24_DATARATE RF24_250KBPS // RFM69 radio settings //#define MY_RADIO_RFM69 //#define MY_RFM69_FREQUENCY RF69_868MHZ //#define MY_IS_RFM69HW +//#define MY_DEBUG_VERBOSE_RFM69 //#define MY_RFM69_NEW_DRIVER //#define MY_RFM69_ENABLE_ENCRYPTION //#define MY_RFM69_NETWORKID 100 @@ -74,6 +78,25 @@ Since NodeManager has to communicate with the MySensors gateway on your behalf, //#define MY_RF69_IRQ_NUM MY_RF69_IRQ_PIN //#define MY_RF69_SPI_CS D2 +// RS485 serial transport settings +//#define MY_RS485 +//#define MY_RS485_BAUD_RATE 9600 +//#define MY_RS485_DE_PIN 2 +//#define MY_RS485_MAX_MESSAGE_LENGTH 40 +//#define MY_RS485_HWSERIAL Serial1 + +// Message signing settings +//#define MY_SIGNING_SOFT +//#define MY_SIGNING_SOFT_RANDOMSEED_PIN 7 +//#define MY_SIGNING_REQUEST_SIGNATURES +//#define MY_SIGNING_ATSHA204 + +// OTA Firmware update settings +//#define MY_OTA_FIRMWARE_FEATURE +//#define OTA_WAIT_PERIOD 300 +//#define FIRMWARE_MAX_REQUESTS 2 +//#define MY_OTA_RETRY 2 + /********************************** * MySensors gateway configuration */ @@ -88,8 +111,8 @@ Since NodeManager has to communicate with the MySensors gateway on your behalf, // ESP8266 gateway settings //#define MY_GATEWAY_ESP8266 -//#define MY_ESP8266_SSID "MySSID" -//#define MY_ESP8266_PASSWORD "MyVerySecretPassword" +//#define MY_ESP8266_SSID "" +//#define MY_ESP8266_PASSWORD "" // Gateway networking settings //#define MY_IP_ADDRESS 192,168,178,87 @@ -317,6 +340,8 @@ The next step is to configure NodeManager with settings which will instruct how void setReportIntervalSeconds(int value); // [30] if set and when the board is battery powered, sleep() is always called instead of wait() (default: true) void setSleepOrWait(bool value); + // [31] set which pin is connected to RST of the board to reboot the board when requested. If not set the software reboot is used instead (default: -1) + void setRebootPin(int value); // sleep if the node is a battery powered or wait if it is not for the given number of milliseconds void sleepOrWait(long value); ~~~ -- GitLab