1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-22 23:56: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 "DCCTimer.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.
@ -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 <X> if we didnt restart
}
DCCTimer::reset();
break; // and <X> if we didnt restart
#ifndef DISABLE_EEPROM
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 void reset();
private:
static int freeMemory();

View File

@ -28,6 +28,7 @@
#ifdef ARDUINO_ARCH_AVR
#include <avr/boot.h>
#include <avr/wdt.h>
#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

View File

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

View File

@ -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

View File

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

View File

@ -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

View File

@ -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