@@ -124,13 +124,13 @@ extern "C" uint32_t _SPIFFS_end;
124
124
125
125
#define SPIFFS_END ((uint32_t )&_SPIFFS_end - 0x40200000 ) / SPI_FLASH_SEC_SIZE
126
126
127
- // Version 3.x config
128
- #define CFG_LOCATION_3 SPIFFS_END - 4
129
-
130
127
// Version 4.2 config = eeprom area
131
128
#define CFG_LOCATION SPIFFS_END // No need for SPIFFS as it uses EEPROM area
129
+ // Version 5.2 allow for more flash space
130
+ #define CFG_ROTATES 8 // Number of additional flash sectors used (handles uploads)
132
131
133
132
uint32_t _cfgHash = 0 ;
133
+ uint32_t _cfgLocation = CFG_LOCATION;
134
134
135
135
/* *******************************************************************************************/
136
136
/*
@@ -192,18 +192,38 @@ uint32_t getHash()
192
192
* Config Save - Save parameters to Flash ONLY if any parameter has changed
193
193
\*********************************************************************************************/
194
194
195
- void CFG_Save ()
195
+ void CFG_Save (byte force )
196
196
{
197
197
char log[LOGSZ];
198
198
199
199
#ifndef BE_MINIMAL
200
- if (getHash () != _cfgHash) {
201
- noInterrupts ();
200
+ if ((getHash () != _cfgHash) || force) {
201
+ if (sysCfg.flag .stop_flash_rotate ) {
202
+ _cfgLocation = CFG_LOCATION;
203
+ } else {
204
+ if (force) {
205
+ _cfgLocation = CFG_LOCATION;
206
+ } else {
207
+ _cfgLocation--;
208
+ if (_cfgLocation <= (CFG_LOCATION - CFG_ROTATES)) {
209
+ _cfgLocation = CFG_LOCATION;
210
+ }
211
+ }
212
+ }
202
213
sysCfg.saveFlag ++;
203
- spi_flash_erase_sector (CFG_LOCATION);
204
- spi_flash_write (CFG_LOCATION * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof (SYSCFG));
214
+ noInterrupts ();
215
+ spi_flash_erase_sector (_cfgLocation);
216
+ spi_flash_write (_cfgLocation * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof (SYSCFG));
205
217
interrupts ();
206
- snprintf_P (log, sizeof (log), PSTR (" Config: Saved configuration (%d bytes) to flash at %X and count %d" ), sizeof (SYSCFG), CFG_LOCATION, sysCfg.saveFlag );
218
+ if (!sysCfg.flag .stop_flash_rotate && force) {
219
+ for (byte i = 1 ; i < CFG_ROTATES; i++) {
220
+ noInterrupts ();
221
+ spi_flash_erase_sector (_cfgLocation -i); // Delete previous configurations by resetting to 0xFF
222
+ interrupts ();
223
+ delay (1 );
224
+ }
225
+ }
226
+ snprintf_P (log, sizeof (log), PSTR (" Cnfg: %s (%d bytes) to flash at %X and count %d" ), (force) ? " Backup" : " Save" , sizeof (SYSCFG), _cfgLocation, sysCfg.saveFlag );
207
227
addLog (LOG_LEVEL_DEBUG, log);
208
228
_cfgHash = getHash ();
209
229
}
@@ -220,28 +240,26 @@ void CFG_Load()
220
240
unsigned long saveFlag;
221
241
} _sysCfgH;
222
242
223
- noInterrupts ();
224
- spi_flash_read (CFG_LOCATION * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof (SYSCFG));
225
- interrupts ();
226
- snprintf_P (log, sizeof (log), PSTR (" Config: Loaded configuration from flash at %X and count %d" ), CFG_LOCATION, sysCfg.saveFlag );
227
- addLog (LOG_LEVEL_DEBUG, log);
243
+ _cfgLocation = CFG_LOCATION +1 ;
244
+ for (byte i = 0 ; i < CFG_ROTATES; i++) {
245
+ _cfgLocation--;
246
+ noInterrupts ();
247
+ spi_flash_read (_cfgLocation * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof (SYSCFG));
248
+ spi_flash_read ((_cfgLocation -1 ) * SPI_FLASH_SEC_SIZE, (uint32*)&_sysCfgH, sizeof (SYSCFGH));
249
+ interrupts ();
228
250
229
- if (sysCfg.cfg_holder != CFG_HOLDER) {
230
- if ((sysCfg.version < 0x04020000 ) || (sysCfg.version > 0x06000000 )) {
231
- noInterrupts ();
232
- spi_flash_read ((CFG_LOCATION_3) * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof (SYSCFG));
233
- spi_flash_read ((CFG_LOCATION_3 + 1 ) * SPI_FLASH_SEC_SIZE, (uint32*)&_sysCfgH, sizeof (SYSCFGH));
234
- if (sysCfg.saveFlag < _sysCfgH.saveFlag )
235
- spi_flash_read ((CFG_LOCATION_3 + 1 ) * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof (SYSCFG));
236
- interrupts ();
237
- if (sysCfg.cfg_holder != CFG_HOLDER) {
238
- CFG_Default ();
239
- } else {
240
- sysCfg.saveFlag = 0 ;
241
- }
242
- } else {
243
- CFG_Default ();
251
+ // snprintf_P(log, sizeof(log), PSTR("Cnfg: Check at %X with count %d and holder %X"), _cfgLocation -1, _sysCfgH.saveFlag, _sysCfgH.cfg_holder);
252
+ // addLog(LOG_LEVEL_DEBUG, log);
253
+
254
+ if (sysCfg.flag .stop_flash_rotate || (sysCfg.cfg_holder != _sysCfgH.cfg_holder ) || (sysCfg.saveFlag > _sysCfgH.saveFlag )) {
255
+ break ;
244
256
}
257
+ delay (1 );
258
+ }
259
+ snprintf_P (log, sizeof (log), PSTR (" Cnfg: Load from flash at %X and count %d" ), _cfgLocation, sysCfg.saveFlag );
260
+ addLog (LOG_LEVEL_DEBUG, log);
261
+ if (sysCfg.cfg_holder != CFG_HOLDER) {
262
+ CFG_Default ();
245
263
}
246
264
_cfgHash = getHash ();
247
265
@@ -257,7 +275,7 @@ void CFG_Erase()
257
275
uint32_t _sectorEnd = ESP.getFlashChipRealSize () / SPI_FLASH_SEC_SIZE;
258
276
boolean _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level);
259
277
260
- snprintf_P (log, sizeof (log), PSTR (" Config: Erasing %d flash sectors" ), _sectorEnd - _sectorStart);
278
+ snprintf_P (log, sizeof (log), PSTR (" Cnfg: Erase %d flash sectors" ), _sectorEnd - _sectorStart);
261
279
addLog (LOG_LEVEL_DEBUG, log);
262
280
263
281
for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) {
@@ -325,10 +343,10 @@ void CFG_Dump(uint16_t srow, uint16_t mrow)
325
343
326
344
void CFG_Default ()
327
345
{
328
- addLog_P (LOG_LEVEL_NONE, PSTR (" Config : Use default configuration " ));
346
+ addLog_P (LOG_LEVEL_NONE, PSTR (" Cnfg : Use defaults " ));
329
347
CFG_DefaultSet1 ();
330
348
CFG_DefaultSet2 ();
331
- CFG_Save ();
349
+ CFG_Save (1 );
332
350
}
333
351
334
352
void CFG_DefaultSet1 ()
@@ -460,6 +478,9 @@ void CFG_DefaultSet2()
460
478
// 5.1.7
461
479
sysCfg.param [P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time
462
480
481
+ // 5.2.0
482
+ sysCfg.param [P_MAX_POWER_RETRY] = MAX_POWER_RETRY;
483
+
463
484
}
464
485
465
486
/* *******************************************************************************************/
@@ -657,6 +678,9 @@ void CFG_Delta()
657
678
if (sysCfg.version < 0x05010700 ) {
658
679
sysCfg.param [P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time
659
680
}
681
+ if (sysCfg.version < 0x05020000 ) {
682
+ sysCfg.param [P_MAX_POWER_RETRY] = MAX_POWER_RETRY;
683
+ }
660
684
661
685
sysCfg.version = VERSION;
662
686
}
0 commit comments