diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index d47dc57..d264281 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -40,9 +40,7 @@ #include "TrackManager.h" #include "DCCTimer.h" #include "EXRAIL2.h" -#ifdef HAS_AVR_WDT -#include -#endif + // These keywords are used in the <1> command. The number is what you get if you use the keyword as a parameter. @@ -902,23 +900,9 @@ bool DCCEXParser::parseD(Print *stream, int16_t params, int16_t p[]) return true; case HASH_KEYWORD_RESET: - { -#ifdef HAS_AVR_WDT - wdt_enable( WDTO_15MS); // set Arduino watchdog timer for 15ms - delay(50); // wait for the prescaller time to expire -#else -#if defined(ARDUINO_ARCH_ESP32) - ESP.restart(); -#endif -#if defined(ARDUINO_ARCH_SAMD) - // Disable all interrupts and reset uC - __disable_irq(); - NVIC_SystemReset(); - while(true) {}; -#endif -#endif - break; // and if we didnt restart - } + DCCTimer::reset(); + break; // and if we didnt restart + #ifndef DISABLE_EEPROM case HASH_KEYWORD_EEPROM: // diff --git a/DCCTimer.h b/DCCTimer.h index abb9491..caffcd8 100644 --- a/DCCTimer.h +++ b/DCCTimer.h @@ -78,7 +78,8 @@ static void inline updateMinimumFreeMemoryISR(unsigned char extraBytes=0) { } static int getMinimumFreeMemory(); - + static void reset(); + private: static int freeMemory(); static volatile int minimum_free_memory; diff --git a/DCCTimerAVR.cpp b/DCCTimerAVR.cpp index b6a5161..f5a3562 100644 --- a/DCCTimerAVR.cpp +++ b/DCCTimerAVR.cpp @@ -28,6 +28,7 @@ #ifdef ARDUINO_ARCH_AVR #include +#include #include "DCCTimer.h" INTERRUPT_CALLBACK interruptHandler=0; @@ -114,4 +115,9 @@ int DCCTimer::freeMemory() { return __brkval ? &top - __brkval : &top - __malloc_heap_start; } +void DCCTimer::reset() { + wdt_enable( WDTO_15MS); // set Arduino watchdog timer for 15ms + delay(50); // wait for the prescaller time to expire + +} #endif diff --git a/DCCTimerESP.cpp b/DCCTimerESP.cpp index d80b0fe..0f83ef2 100644 --- a/DCCTimerESP.cpp +++ b/DCCTimerESP.cpp @@ -125,5 +125,9 @@ int DCCTimer::getMinimumFreeMemory() { int DCCTimer::freeMemory() { return ESP.getFreeHeap(); } + +void DCCTimmer:: reset() { + ESP.restart(); +} #endif diff --git a/DCCTimerMEGAAVR.cpp b/DCCTimerMEGAAVR.cpp index ce32ec5..be9248e 100644 --- a/DCCTimerMEGAAVR.cpp +++ b/DCCTimerMEGAAVR.cpp @@ -118,4 +118,11 @@ int DCCTimer::freeMemory() { return __brkval ? &top - __brkval : &top - __malloc_heap_start; } +void DCCTimer::reset() { + CPU_CCP=0xD8; + WDT.CTRLA=0x4; + while(true){} +} + + #endif diff --git a/DCCTimerSAMD.cpp b/DCCTimerSAMD.cpp index b03962b..e42d94c 100644 --- a/DCCTimerSAMD.cpp +++ b/DCCTimerSAMD.cpp @@ -167,4 +167,10 @@ int DCCTimer::freeMemory() { return (int)(&top - reinterpret_cast(sbrk(0))); } +void DCCTimer::reset() { + __disable_irq(); + NVIC_SystemReset(); + while(true) {}; +} + #endif \ No newline at end of file diff --git a/DCCTimerTEENSY.cpp b/DCCTimerTEENSY.cpp index a75fe3a..dc682df 100644 --- a/DCCTimerTEENSY.cpp +++ b/DCCTimerTEENSY.cpp @@ -123,4 +123,9 @@ static inline int freeMemory() { } #endif +void DCCTimer::reset() { + // found at https://forum.pjrc.com/threads/59935-Reboot-Teensy-programmatically + SCB_AIRCR = 0x05FA0004; +} + #endif diff --git a/defines.h b/defines.h index f61411e..a51f41f 100644 --- a/defines.h +++ b/defines.h @@ -41,7 +41,6 @@ // figure out if we have enough memory for advanced features // so define HAS_ENOUGH_MEMORY until proved otherwise. #define HAS_ENOUGH_MEMORY -#define HAS_AVR_WDT #if defined(ARDUINO_AVR_UNO) #define ARDUINO_TYPE "UNO" @@ -68,13 +67,10 @@ #define ARDUINO_TYPE "TEENSY41" #elif defined(ARDUINO_ARCH_ESP8266) #define ARDUINO_TYPE "ESP8266" -#undef HAS_AVR_WDT #elif defined(ARDUINO_ARCH_ESP32) #define ARDUINO_TYPE "ESP32" -#undef HAS_AVR_WDT #elif defined(ARDUINO_ARCH_SAMD) #define ARDUINO_TYPE "SAMD21" -#undef HAS_AVR_WDT // SAMD support for I2C is awaiting development #ifndef DISABLE_EEPROM #define DISABLE_EEPROM @@ -87,7 +83,6 @@ /* TODO when ready #elif defined(ARDUINO_ARCH_RP2040) #define ARDUINO_TYPE "RP2040" -#undef HAS_AVR_WDT */ #else