99#include " ScrollChoiceMenuItem.h"
1010#include " MenuIterator.h"
1111
12+ bool tcMenuUseSizedEeprom = false ;
1213
13- void saveRecursively (EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
14+ uint16_t saveRecursively (EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
15+ uint16_t lastItemSaved = 0 ;
1416 while (nextMenuItem) {
1517 if (nextMenuItem->getMenuType () == MENUTYPE_SUB_VALUE) {
16- saveRecursively (eeprom, ((SubMenuItem *) nextMenuItem)->getChild ());
18+ lastItemSaved = max (lastItemSaved, saveRecursively (eeprom, ((SubMenuItem *) nextMenuItem)->getChild () ));
1719 } else {
1820 saveMenuItem (eeprom, nextMenuItem);
21+ if (nextMenuItem->getEepromPosition () != 0xFFFF ) {
22+ lastItemSaved = max (lastItemSaved, nextMenuItem->getEepromPosition ());
23+ }
1924 }
2025 nextMenuItem = nextMenuItem->getNext ();
2126 }
27+ return lastItemSaved;
2228}
2329
2430void saveMenuItem (EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
@@ -76,7 +82,10 @@ void saveMenuItem(EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
7682void saveMenuStructure (EepromAbstraction* eeprom, uint16_t magicKey) {
7783 serlogF2 (SER_TCMENU_INFO, " Save to EEPROM with key " , magicKey);
7884 eeprom->write16 (0 , magicKey);
79- saveRecursively (eeprom, menuMgr.getRoot ());
85+ uint16_t maxPos = saveRecursively (eeprom, menuMgr.getRoot ());
86+ if (tcMenuUseSizedEeprom) {
87+ eeprom->write16 (2 , maxPos);
88+ }
8089}
8190
8291void loadSingleItem (EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
@@ -137,23 +146,29 @@ void loadSingleItem(EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
137146 }
138147}
139148
140- void loadRecursively (EepromAbstraction* eeprom, MenuItem* nextMenuItem) {
149+ void loadRecursively (EepromAbstraction* eeprom, MenuItem* nextMenuItem, uint16_t maxLoadPosition ) {
141150 while (nextMenuItem) {
142151 if (nextMenuItem->getMenuType () == MENUTYPE_SUB_VALUE) {
143- loadRecursively (eeprom, ((SubMenuItem*)nextMenuItem)->getChild ());
152+ loadRecursively (eeprom, ((SubMenuItem*)nextMenuItem)->getChild (), maxLoadPosition );
144153 }
145154 else {
146- loadSingleItem (eeprom, nextMenuItem);
155+ uint16_t romLoc = nextMenuItem->getEepromPosition ();
156+ if (romLoc <= maxLoadPosition) {
157+ loadSingleItem (eeprom, nextMenuItem);
158+ } else if (romLoc != 0xFFFF ) {
159+ serlogF4 (SER_TCMENU_DEBUG, " MenuItem EEPROM load skipped " , romLoc, maxLoadPosition, nextMenuItem->getId ());
160+ }
147161 }
148162 nextMenuItem = nextMenuItem->getNext ();
149163 }
150164}
151165
152166bool loadMenuStructure (EepromAbstraction* eeprom, uint16_t magicKey) {
153167 if (eeprom->read16 (0 ) == magicKey) {
168+ uint16_t maxEntry = (tcMenuUseSizedEeprom) ? eeprom->read16 (2 ) : 0xFFFE ;
154169 serlogFHex (SER_TCMENU_INFO, " Load from EEPROM key found " , magicKey);
155170 MenuItem* nextMenuItem = menuMgr.getRoot ();
156- loadRecursively (eeprom, nextMenuItem);
171+ loadRecursively (eeprom, nextMenuItem, maxEntry );
157172 return true ;
158173 }
159174 else {
@@ -163,7 +178,7 @@ bool loadMenuStructure(EepromAbstraction* eeprom, uint16_t magicKey) {
163178}
164179
165180bool loadMenuItem (EepromAbstraction* eeprom, MenuItem* theItem, uint16_t magicKey) {
166- if (eeprom->read16 (0 ) == magicKey) {
181+ if (eeprom->read16 (0 ) == magicKey && (!tcMenuUseSizedEeprom || eeprom-> read16 ( 2 ) <= theItem-> getEepromPosition ()) ) {
167182 loadSingleItem (eeprom, theItem);
168183 return true ;
169184 }
@@ -178,4 +193,8 @@ void triggerAllChangedCallbacks() {
178193 item->triggerCallback ();
179194 }
180195 });
181- }
196+ }
197+
198+ void setSizeBasedEEPROMStorageEnabled (bool ena) {
199+ tcMenuUseSizedEeprom = ena;
200+ }
0 commit comments