diff --git a/CommandStation-EX.ino b/CommandStation-EX.ino index aceedef..39aeefc 100644 --- a/CommandStation-EX.ino +++ b/CommandStation-EX.ino @@ -12,7 +12,6 @@ #include "config.h" #include "DCCEX.h" - //////////////////////////////////////////////////////////////// // // Enables an I2C 2x24 or 4x24 LCD Screen @@ -32,7 +31,6 @@ DCCEXParser serialParser; void setup() { - //////////////////////////////////////////// // // More display stuff. Need to put this in a .h file and make diff --git a/DCC.cpp b/DCC.cpp index 0c8c322..ca563ac 100644 --- a/DCC.cpp +++ b/DCC.cpp @@ -20,10 +20,10 @@ #include "DCC.h" #include "DCCWaveform.h" #include "DIAG.h" +#include "EEStore.h" #include "GITHUB_SHA.h" #include "version.h" - // This module is responsible for converting API calls into // messages to be sent to the waveform generator. // It has no visibility of the hardware, timers, interrupts @@ -48,6 +48,11 @@ __FlashStringHelper* DCC::shieldName=NULL; void DCC::begin(const __FlashStringHelper* motorShieldName, MotorDriver * mainDriver, MotorDriver* progDriver, byte timerNumber) { shieldName=(__FlashStringHelper*)motorShieldName; DIAG(F("\n"), F(VERSION), F(ARDUINO_TYPE), shieldName, F(GITHUB_SHA)); + + // Load stuff from EEprom + (void)EEPROM; // tell compiler not to warn this is unused + EEStore::init(); + DCCWaveform::begin(mainDriver,progDriver, timerNumber); } diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 8a96e23..2b62dc2 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -46,6 +46,7 @@ const int HASH_KEYWORD_ON = 2657; const int HASH_KEYWORD_DCC = 6436; const int HASH_KEYWORD_SLOW = -17209; const int HASH_KEYWORD_PROGBOOST = -6353; +const int HASH_KEYWORD_EEPROM = -7168; int DCCEXParser::stashP[MAX_PARAMS]; bool DCCEXParser::stashBusy; @@ -168,9 +169,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 @@ -608,6 +609,11 @@ bool DCCEXParser::parseD(Print *stream, int params, int p[]) DCC::setProgTrackBoost(true); return true; + case HASH_KEYWORD_EEPROM: + if (params >= 1) + EEStore::dump(p[1]); + return true; + default: // invalid/unknown break; } diff --git a/EEStore.cpp b/EEStore.cpp index f52d1a1..a3d2d55 100644 --- a/EEStore.cpp +++ b/EEStore.cpp @@ -2,7 +2,7 @@ #include "Turnouts.h" #include "Sensors.h" #include "Outputs.h" - +#include "DIAG.h" #if defined(ARDUINO_ARCH_SAMD) ExternalEEPROM EEPROM; @@ -72,5 +72,15 @@ int EEStore::pointer(){ } /////////////////////////////////////////////////////////////////////////////// +void EEStore::dump(int num) { + byte b; + DIAG(F("\nAddr 0x char\n")); + 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