From 75d7547f1163497ab5ee65aa1de8ffa50cd014d3 Mon Sep 17 00:00:00 2001 From: Harald Barth Date: Sat, 3 Oct 2020 14:07:25 +0200 Subject: [PATCH] Turnouts stored to EEPROM without trashing other stuff --- CommandStation-EX.ino | 10 ++++++-- DCCEXParser.cpp | 2 +- EEStore.cpp | 15 +++++++++++- EEStore.h | 3 +++ Turnouts.cpp | 53 +++++++++++++++++++++++++++++++++++-------- Turnouts.h | 3 +++ 6 files changed, 72 insertions(+), 14 deletions(-) diff --git a/CommandStation-EX.ino b/CommandStation-EX.ino index 5f1f87e..8dd29ba 100644 --- a/CommandStation-EX.ino +++ b/CommandStation-EX.ino @@ -11,7 +11,7 @@ #include "config.h" #include "DCCEX.h" - +#include "EEStore.h" //////////////////////////////////////////////////////////////// // @@ -32,7 +32,6 @@ DCCEXParser serialParser; void setup() { - //////////////////////////////////////////// // // More display stuff. Need to put this in a .h file and make @@ -69,6 +68,13 @@ void setup() // This is normally Serial but uses SerialUSB on a SAMD processor Serial.begin(115200); + // Responsibility 1b ;-) Load stuff from EEprom + (void)EEPROM; // tell compiler not to warn this is unused + EEStore::init(); +#ifdef EESTOREDEBUG + EEStore::dump(128); +#endif + // Start the WiFi interface on a MEGA, Uno cannot currently handle WiFi // NOTE: References to Serial1 are for the serial port used to connect // your wifi chip/shield. diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 8a96e23..5761845 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -168,9 +168,9 @@ void DCCEXParser::setAtCommandCallback(AT_COMMAND_CALLBACK callback) // See documentation on DCC class for info on this section void DCCEXParser::parse(Print *stream, byte *com, bool blocking) { + (void)EEPROM; // tell compiler not to warn this is unused if (Diag::CMD) DIAG(F("\nPARSING:%s\n"), com); - (void)EEPROM; // tell compiler not to warn thi is unused int p[MAX_PARAMS]; while (com[0] == '<' || com[0] == ' ') com++; // strip off any number of < or spaces diff --git a/EEStore.cpp b/EEStore.cpp index f52d1a1..f7bf061 100644 --- a/EEStore.cpp +++ b/EEStore.cpp @@ -2,7 +2,9 @@ #include "Turnouts.h" #include "Sensors.h" #include "Outputs.h" - +#ifdef EESTOREDEBUG +#include "DIAG.h" +#endif #if defined(ARDUINO_ARCH_SAMD) ExternalEEPROM EEPROM; @@ -72,5 +74,16 @@ int EEStore::pointer(){ } /////////////////////////////////////////////////////////////////////////////// +#ifdef EESTOREDEBUG +void EEStore::dump(int num) { + byte b; + for (int n=0 ; nactivate(state); - if(n>0) EEPROM.put(n,tt->data.tStatus); + EEStore::store(); turnoutlistHash++; return true; } - bool Turnout::isActive(int n){ +bool Turnout::isActive(int n){ Turnout * tt=get(n); if (tt==NULL) return false; return tt->data.tStatus & STATUS_ACTIVE; } // activate is virtual here so that it can be overridden by a non-DCC turnout mechanism - void Turnout::activate(bool state) { - if (state) data.tStatus|=STATUS_ACTIVE; - else data.tStatus &= ~STATUS_ACTIVE; - if (data.tStatus & STATUS_PWM) PWMServoDriver::setServo(data.tStatus & STATUS_PWMPIN, (data.inactiveAngle+(state?data.moveAngle:0))); - else DCC::setAccessory(data.address,data.subAddress, state); +void Turnout::activate(bool state) { +#ifdef EESTOREDEBUG + DIAG(F("\nTurnout::activate(%d)\n"),state); +#endif + if (state) + data.tStatus|=STATUS_ACTIVE; + else + data.tStatus &= ~STATUS_ACTIVE; + if (data.tStatus & STATUS_PWM) + PWMServoDriver::setServo(data.tStatus & STATUS_PWMPIN, (data.inactiveAngle+(state?data.moveAngle:0))); + else + DCC::setAccessory(data.address,data.subAddress, state); + EEStore::store(); } /////////////////////////////////////////////////////////////////////////////// @@ -81,6 +96,9 @@ void Turnout::load(){ else tt=create(data.id,data.address,data.subAddress); tt->data.tStatus=data.tStatus; EEStore::advance(sizeof(tt->data)); +#ifdef EESTOREDEBUG + tt->print(tt); +#endif } } @@ -93,6 +111,9 @@ void Turnout::store(){ EEStore::eeStore->data.nTurnouts=0; while(tt!=NULL){ +#ifdef EESTOREDEBUG + tt->print(tt); +#endif EEPROM.put(EEStore::pointer(),tt->data); EEStore::advance(sizeof(tt->data)); tt=tt->nextTurnout; @@ -129,7 +150,19 @@ Turnout *Turnout::create(int id){ turnoutlistHash++; return tt; } - /////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// +// print debug info about the state of a turnout +// +#ifdef EESTOREDEBUG +void Turnout::print(Turnout *tt) { + if (tt->data.tStatus & STATUS_PWM ) + DIAG(F("Turnout %d ZeroAngle %d MoveAngle %d Status %d\n"),tt->data.id, tt->data.inactiveAngle, tt->data.moveAngle,tt->data.tStatus & STATUS_ACTIVE); + else + DIAG(F("Turnout %d Addr %d Subaddr %d Status %d\n"),tt->data.id, tt->data.address, tt->data.subAddress,tt->data.tStatus & STATUS_ACTIVE); +} +#endif Turnout *Turnout::firstTurnout=NULL; int Turnout::turnoutlistHash=0; //bump on every change so clients know when to refresh their lists diff --git a/Turnouts.h b/Turnouts.h index 5c9b590..2aff97d 100644 --- a/Turnouts.h +++ b/Turnouts.h @@ -49,6 +49,9 @@ class Turnout { static Turnout *create(int id , byte pin , int activeAngle, int inactiveAngle); static Turnout *create(int id); void activate(bool state); +#ifdef EESTOREDEBUG + void print(Turnout *tt); +#endif }; // Turnout #endif