From 107e9d1d6261aae9297758f2d8f3e802bc286c07 Mon Sep 17 00:00:00 2001 From: Neil McKechnie <75813993+Neil-McK@users.noreply.github.com> Date: Fri, 7 May 2021 00:12:33 +0100 Subject: [PATCH] Fix turnout handling of EEPROM (#147) On activation, Turnout code was saving entire EEPROM twice, even if EEPROM save was switched off with the command. It's now been changed so that only the tStatus byte is updated, and only if the turnout has previously been saved into EEPROM. --- Turnouts.cpp | 7 +++++-- Turnouts.h | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Turnouts.cpp b/Turnouts.cpp index a5900b4..677e746 100644 --- a/Turnouts.cpp +++ b/Turnouts.cpp @@ -39,7 +39,6 @@ bool Turnout::activate(int n,bool state){ Turnout * tt=get(n); if (tt==NULL) return false; tt->activate(state); - EEStore::store(); turnoutlistHash++; return true; } @@ -68,7 +67,9 @@ void Turnout::activate(bool state) { PWMServoDriver::setServo(data.tStatus & STATUS_PWMPIN, (data.inactiveAngle+(state?data.moveAngle:0))); else DCC::setAccessory(data.address,data.subAddress, state); - EEStore::store(); + // Save state if stored in EEPROM + if (EEStore::eeStore->data.nTurnouts > 0 && num > 0) + EEPROM.put(num, data.tStatus); } /////////////////////////////////////////////////////////////////////////////// @@ -107,6 +108,7 @@ void Turnout::load(){ if (data.tStatus & STATUS_PWM) tt=create(data.id,data.tStatus & STATUS_PWMPIN, data.inactiveAngle,data.moveAngle); else tt=create(data.id,data.address,data.subAddress); tt->data.tStatus=data.tStatus; + tt->num=EEStore::pointer()+offsetof(TurnoutData,tStatus); // Save pointer to status byte within EEPROM EEStore::advance(sizeof(tt->data)); #ifdef EESTOREDEBUG tt->print(tt); @@ -126,6 +128,7 @@ void Turnout::store(){ #ifdef EESTOREDEBUG tt->print(tt); #endif + tt->num=EEStore::pointer()+offsetof(TurnoutData,tStatus); // Save pointer to tstatus byte within EEPROM EEPROM.put(EEStore::pointer(),tt->data); EEStore::advance(sizeof(tt->data)); tt=tt->nextTurnout; diff --git a/Turnouts.h b/Turnouts.h index d04c664..db97590 100644 --- a/Turnouts.h +++ b/Turnouts.h @@ -54,6 +54,8 @@ class Turnout { #ifdef EESTOREDEBUG void print(Turnout *tt); #endif +private: + int num; // EEPROM address of tStatus in TurnoutData struct, or zero if not stored. }; // Turnout #endif