1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-30 03:26:13 +01:00

DCCTimer::reset

Moves CPU dependent reset code into correct place.
This commit is contained in:
Asbelos 2022-07-08 15:01:40 +01:00
parent 090acdae44
commit 9768083bfe
8 changed files with 34 additions and 26 deletions

View File

@ -40,9 +40,7 @@
#include "TrackManager.h" #include "TrackManager.h"
#include "DCCTimer.h" #include "DCCTimer.h"
#include "EXRAIL2.h" #include "EXRAIL2.h"
#ifdef HAS_AVR_WDT
#include <avr/wdt.h>
#endif
// These keywords are used in the <1> command. The number is what you get if you use the keyword as a parameter. // 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; return true;
case HASH_KEYWORD_RESET: case HASH_KEYWORD_RESET:
{ DCCTimer::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 <X> if we didnt restart break; // and <X> if we didnt restart
}
#ifndef DISABLE_EEPROM #ifndef DISABLE_EEPROM
case HASH_KEYWORD_EEPROM: // <D EEPROM NumEntries> case HASH_KEYWORD_EEPROM: // <D EEPROM NumEntries>

View File

@ -78,6 +78,7 @@ static void inline updateMinimumFreeMemoryISR(unsigned char extraBytes=0) {
} }
static int getMinimumFreeMemory(); static int getMinimumFreeMemory();
static void reset();
private: private:
static int freeMemory(); static int freeMemory();

View File

@ -28,6 +28,7 @@
#ifdef ARDUINO_ARCH_AVR #ifdef ARDUINO_ARCH_AVR
#include <avr/boot.h> #include <avr/boot.h>
#include <avr/wdt.h>
#include "DCCTimer.h" #include "DCCTimer.h"
INTERRUPT_CALLBACK interruptHandler=0; INTERRUPT_CALLBACK interruptHandler=0;
@ -114,4 +115,9 @@ int DCCTimer::freeMemory() {
return __brkval ? &top - __brkval : &top - __malloc_heap_start; 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 #endif

View File

@ -125,5 +125,9 @@ int DCCTimer::getMinimumFreeMemory() {
int DCCTimer::freeMemory() { int DCCTimer::freeMemory() {
return ESP.getFreeHeap(); return ESP.getFreeHeap();
} }
void DCCTimmer:: reset() {
ESP.restart();
}
#endif #endif

View File

@ -118,4 +118,11 @@ int DCCTimer::freeMemory() {
return __brkval ? &top - __brkval : &top - __malloc_heap_start; return __brkval ? &top - __brkval : &top - __malloc_heap_start;
} }
void DCCTimer::reset() {
CPU_CCP=0xD8;
WDT.CTRLA=0x4;
while(true){}
}
#endif #endif

View File

@ -167,4 +167,10 @@ int DCCTimer::freeMemory() {
return (int)(&top - reinterpret_cast<char *>(sbrk(0))); return (int)(&top - reinterpret_cast<char *>(sbrk(0)));
} }
void DCCTimer::reset() {
__disable_irq();
NVIC_SystemReset();
while(true) {};
}
#endif #endif

View File

@ -123,4 +123,9 @@ static inline int freeMemory() {
} }
#endif #endif
void DCCTimer::reset() {
// found at https://forum.pjrc.com/threads/59935-Reboot-Teensy-programmatically
SCB_AIRCR = 0x05FA0004;
}
#endif #endif

View File

@ -41,7 +41,6 @@
// figure out if we have enough memory for advanced features // figure out if we have enough memory for advanced features
// so define HAS_ENOUGH_MEMORY until proved otherwise. // so define HAS_ENOUGH_MEMORY until proved otherwise.
#define HAS_ENOUGH_MEMORY #define HAS_ENOUGH_MEMORY
#define HAS_AVR_WDT
#if defined(ARDUINO_AVR_UNO) #if defined(ARDUINO_AVR_UNO)
#define ARDUINO_TYPE "UNO" #define ARDUINO_TYPE "UNO"
@ -68,13 +67,10 @@
#define ARDUINO_TYPE "TEENSY41" #define ARDUINO_TYPE "TEENSY41"
#elif defined(ARDUINO_ARCH_ESP8266) #elif defined(ARDUINO_ARCH_ESP8266)
#define ARDUINO_TYPE "ESP8266" #define ARDUINO_TYPE "ESP8266"
#undef HAS_AVR_WDT
#elif defined(ARDUINO_ARCH_ESP32) #elif defined(ARDUINO_ARCH_ESP32)
#define ARDUINO_TYPE "ESP32" #define ARDUINO_TYPE "ESP32"
#undef HAS_AVR_WDT
#elif defined(ARDUINO_ARCH_SAMD) #elif defined(ARDUINO_ARCH_SAMD)
#define ARDUINO_TYPE "SAMD21" #define ARDUINO_TYPE "SAMD21"
#undef HAS_AVR_WDT
// SAMD support for I2C is awaiting development // SAMD support for I2C is awaiting development
#ifndef DISABLE_EEPROM #ifndef DISABLE_EEPROM
#define DISABLE_EEPROM #define DISABLE_EEPROM
@ -87,7 +83,6 @@
/* TODO when ready /* TODO when ready
#elif defined(ARDUINO_ARCH_RP2040) #elif defined(ARDUINO_ARCH_RP2040)
#define ARDUINO_TYPE "RP2040" #define ARDUINO_TYPE "RP2040"
#undef HAS_AVR_WDT
*/ */
#else #else