# HG changeset patch # User ideenmodellierer # Date 1581887092 -3600 # Node ID b1091e183d52842517eb261db69406ad74ae2581 # Parent 514e6269256f2523de843e74b046f84f3e4bc0a6 Activated ringbuffer for settings: In previous versions the settings have always been writte to the ring start address causing additional ~200ms for sector erase. The settings are now continously written (~8ms). At shutdown the settings are written to ring start for compability reasons. In case of a reset the SW will scan the ringbuffer for the latest available block and restore it. diff -r 514e6269256f -r b1091e183d52 Discovery/Src/base.c --- a/Discovery/Src/base.c Sat Feb 15 20:50:58 2020 +0100 +++ b/Discovery/Src/base.c Sun Feb 16 22:04:52 2020 +0100 @@ -455,7 +455,7 @@ if( settingsGetPointer()->debugModeOnStart ) { settingsGetPointer()->debugModeOnStart = 0; - ext_flash_write_settings(); + ext_flash_write_settings(0); setDebugMode(); openInfo( StIDEBUG ); } @@ -481,14 +481,14 @@ { createDiveSettings(); updateMenu(); - ext_flash_write_settings(); + ext_flash_write_settings(0); } /* check if tasks depending on global state are pending */ get_globalStateList(&status); if(status.base == BaseHome) { - tMenuEdit_writeSettingsToFlash(); // takes 900 ms!! + tMenuEdit_writeSettingsToFlash(); } DataEX_merge_devicedata(); /* data is exchanged at startup and every 10 minutes => check if something changed */ @@ -920,6 +920,7 @@ // ext_flash_erase_firmware_if_not_empty(); GFX_logoAutoOff(); ext_flash_write_devicedata(true); /* write data at default position */ + ext_flash_write_settings(true); /* write data at default position */ set_globalState(StStop); } diff -r 514e6269256f -r b1091e183d52 Discovery/Src/externLogbookFlash.c --- a/Discovery/Src/externLogbookFlash.c Sat Feb 15 20:50:58 2020 +0100 +++ b/Discovery/Src/externLogbookFlash.c Sun Feb 16 22:04:52 2020 +0100 @@ -126,7 +126,7 @@ static uint32_t actualPointerDevicedata = DDSTART; static uint32_t actualPointerDevicedata_Read = DDSTART; static uint32_t actualPointerVPM = 0; -static uint32_t actualPointerSettings = 0; +static uint32_t actualPointerSettings = SETTINGSSTART; static uint32_t actualPointerFirmware = 0; static uint32_t actualPointerFirmware2 = 0; @@ -522,7 +522,7 @@ return; } #else -void ext_flash_write_settings(void) +void ext_flash_write_settings(uint8_t resetRing) { uint8_t *pData; const uint16_t length = sizeof(SSettings); @@ -540,7 +540,11 @@ pData = (uint8_t *)settingsGetPointer(); - actualPointerSettings = SETTINGSSTART; + /* Reset the Ring to the start address if requested (e.g. because we write the default block during shutdown) */ + if((resetRing) || ((actualPointerSettings + length) >= SETTINGSSTOP)) + { + actualPointerSettings = SETTINGSSTART; + } length_lo = (uint8_t)(length & 0xFF); length_hi = (uint8_t)(length >> 8); @@ -577,23 +581,36 @@ ext_flash_read_block(&length_lo, EF_SETTINGS); ext_flash_read_block(&length_hi, EF_SETTINGS); - lengthOnEEPROM = length_hi * 256; - lengthOnEEPROM += length_lo; - if(lengthOnEEPROM <= lengthStandardNow) + while ((length_lo != 0xFF) && (length_hi != 0xFF)) /* get the latest stored setting block */ { - ext_flash_read_block_multi(&header, 4, EF_SETTINGS); - if((header <= pSettings->header) && (header >= pSettings->updateSettingsAllowedFromHeader)) + lengthOnEEPROM = length_hi * 256; + lengthOnEEPROM += length_lo; + if(lengthOnEEPROM <= lengthStandardNow) { - returnValue = HAL_OK; - pSettings->header = header; - pData = (uint8_t *)pSettings + 4; /* header */ - for(uint16_t i = 0; i < (lengthOnEEPROM-4); i++) - ext_flash_read_block(&pData[i], EF_SETTINGS); + ext_flash_read_block_multi(&header, 4, EF_SETTINGS); + if((header <= pSettings->header) && (header >= pSettings->updateSettingsAllowedFromHeader)) + { + returnValue = HAL_OK; + pSettings->header = header; + pData = (uint8_t *)pSettings + 4; /* header */ + for(uint16_t i = 0; i < (lengthOnEEPROM-4); i++) + ext_flash_read_block(&pData[i], EF_SETTINGS); + } + else + { + returnValue = HAL_ERROR; + } } - else - { - returnValue = HAL_ERROR; - } + ext_flash_read_block(&length_lo, EF_SETTINGS); + ext_flash_read_block(&length_hi, EF_SETTINGS); + } + ext_flash_decf_address_ring(EF_SETTINGS); /* set pointer back to empty address */ + ext_flash_decf_address_ring(EF_SETTINGS); + ext_flash_read_block_stop(); + + if(actualAddress > actualPointerSettings) /* the write pointer has not yet been set up probably */ + { + actualPointerSettings = actualAddress; } ext_flash_read_block_stop(); return returnValue; diff -r 514e6269256f -r b1091e183d52 Discovery/Src/logbook.c --- a/Discovery/Src/logbook.c Sat Feb 15 20:50:58 2020 +0100 +++ b/Discovery/Src/logbook.c Sun Feb 16 22:04:52 2020 +0100 @@ -1187,7 +1187,7 @@ { pSettings->logbookOffset++; } - ext_flash_write_settings(); + ext_flash_write_settings(0); ext_flash_disable_protection_for_logbook(); ext_flash_CloseSector(); /* this is just a repair function which invalidates a not used sector in case a log maintenance was called before dive */ diff -r 514e6269256f -r b1091e183d52 Discovery/Src/tMenuEdit.c --- a/Discovery/Src/tMenuEdit.c Sat Feb 15 20:50:58 2020 +0100 +++ b/Discovery/Src/tMenuEdit.c Sun Feb 16 22:04:52 2020 +0100 @@ -272,7 +272,7 @@ if(WriteSettings) { GFX_logoAutoOff(); - ext_flash_write_settings(); + ext_flash_write_settings(0); WriteSettings = 0; } }