# HG changeset patch # User ideenmodellierer # Date 1585083551 -3600 # Node ID b90ddf57f7f1447fa4c79fe2f7c6c65388cf6fad # Parent c2e02b87774fe3bea8fa3fbacf4ff809bc6fa597 Added compile variant enabling the reset of profile sample information: In case the sample ring has an overrun prior to the header ring then header will point to no longer available sample locations causing problems when the no longer existing samples are read. To avoid this also in earlier versions a variant has been added which enables the user to reset the invalid sample information by selecting the problematic dive in the infolog menu and pressing the middle button. Added function which confirms consistency of dive log settings: Meaning last dive and dive header are valid at startup. Repair and find lastDiveID are only called in case a inconsistency is detected diff -r c2e02b87774f -r b90ddf57f7f1 Discovery/Src/externLogbookFlash.c --- a/Discovery/Src/externLogbookFlash.c Tue Mar 24 21:49:52 2020 +0100 +++ b/Discovery/Src/externLogbookFlash.c Tue Mar 24 21:59:11 2020 +0100 @@ -1353,6 +1353,40 @@ } */ +uint8_t ext_dive_log_consistent(void) +{ + uint8_t ret = 0; + uint8_t header1, header2; + uint8_t id; + convert_Type dataStart; + + SSettings *settings = settingsGetPointer(); + id = settings->lastDiveLogId; + + actualAddress = HEADERSTART + (0x800 * id); + ext_flash_read_block_start(); + ext_flash_read_block(&header1, EF_HEADER); + ext_flash_read_block(&header2, EF_HEADER); + dataStart.u8bit.byteHigh = 0; + ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); + ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); + ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); + ext_flash_read_block_stop(); + if((header1 == 0xFA) && (header2 == 0xFA)) /* Header is indicating the start of a dive */ + { + actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; + ext_flash_read_block_start(); + ext_flash_read_block(&header1, EF_HEADER); + ext_flash_read_block(&header2, EF_HEADER); + ext_flash_read_block_stop(); + if((header1 == 0xFA) && (header2 == 0xFA)) /* Secondary header was written at the end of a dive */ + { + ret = 1; /* => lastDiveLogID points to a valid dive entry */ + } + } + return ret; +} + // =============================================================================== // ext_flash_repair_dive_log /// @brief This function @@ -1361,6 +1395,7 @@ /// and /// lastDiveLogId /// + void ext_flash_repair_dive_log(void) { uint8_t header1, header2; @@ -2240,6 +2275,67 @@ return startedSectors; } +/* In case of a sample ring overrun the headers of the dive which will no longer have sample data needs to be updated */ +void ext_flash_invalidate_sample_index(uint32_t sectorStart) +{ + uint8_t emptySamples[] = {0,0,0, 0,0,0, 0,0,0}; /* entry of start, stop and length */ + uint8_t diveidx; + + uint8_t header1, header2; + + SSettings *settings = settingsGetPointer(); + diveidx = settings->lastDiveLogId + 1; + convert_Type dataStart, dataEnd; + + uint32_t HeaderAddrBackup = actualPointerHeader; + + while(diveidx != settings->lastDiveLogId) + { + actualAddress = HEADERSTART + (0x800 * diveidx) + HEADER2OFFSET; + ext_flash_read_block_start(); + ext_flash_read_block(&header1, EF_HEADER); + ext_flash_read_block(&header2, EF_HEADER); + dataStart.u8bit.byteHigh = 0; + ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); + ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); + ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); + dataEnd.u8bit.byteHigh = 0; + ext_flash_read_block(&dataEnd.u8bit.byteLow, EF_HEADER); + ext_flash_read_block(&dataEnd.u8bit.byteMidLow, EF_HEADER); + ext_flash_read_block(&dataEnd.u8bit.byteMidHigh, EF_HEADER); + ext_flash_read_block_stop(); + + if((header1 == 0xFA) && (header2 == 0xFA)) /* Dive ID is in use */ + { + if(((dataStart.u32bit >= sectorStart) && (dataStart.u32bit <= sectorStart+0xFFFF)) /* Sample start is within erased sector */ + || ((dataEnd.u32bit >= sectorStart) && (dataEnd.u32bit <= sectorStart+0xFFFF))) /* End of sample data is within erased sector */ + { + actualAddress = HEADERSTART + (0x800 * diveidx) + HEADER2OFFSET; + ext_flash_incf_address(EF_HEADER); /* skip header bytes */ + ext_flash_incf_address(EF_HEADER); + actualPointerHeader = actualAddress; + ef_write_block(emptySamples,9,EF_HEADER,1); /* clear start, stop and length data */ + actualPointerHeader = HeaderAddrBackup; + } +#if 0 + else /* no sample part within erased sector => stop search */ + { + break; + } +#endif + } +#if 0 + else /* ID not in use => stop search */ + { + break; + } +#endif + diveidx++; + } +} + + + /* uint8_t ext_flash_erase_firmware_if_not_empty(void) { diff -r c2e02b87774f -r b90ddf57f7f1 Discovery/Src/tInfoLog.c --- a/Discovery/Src/tInfoLog.c Tue Mar 24 21:49:52 2020 +0100 +++ b/Discovery/Src/tInfoLog.c Tue Mar 24 21:59:11 2020 +0100 @@ -36,6 +36,8 @@ #include "tInfo.h" #include "tMenu.h" #include "unit.h" +#include "externLogbookFlash.h" +#include "configuration.h" /* Exported variables --------------------------------------------------------*/ @@ -64,6 +66,7 @@ void stepBackInfo(void); void stepForwardInfo(void); void showLogExit(void); +void resetDiveProfile(void); /* Exported functions --------------------------------------------------------*/ void tInfoLog_init(void) @@ -176,6 +179,9 @@ switch(sendAction) { case ACTION_BUTTON_ENTER: +#ifdef ENABLE_PROFILE_RESET + resetDiveProfile(); +#endif break; case ACTION_BUTTON_NEXT: showNextLogPage(); @@ -429,4 +435,21 @@ show_logbook_test(0, stepBack); } +#ifdef ENABLE_PROFILE_RESET +void resetDiveProfile() +{ + uint8_t stepBack; + SLogbookHeader logbookHeader; + convert_Type dataStart; + stepBack = (6 * (infolog.page - 1)) + infolog.line - 1; /* calculate current dive ID */ + logbook_getHeader(stepBack ,&logbookHeader); + dataStart.u8bit.byteHigh = 0; + dataStart.u8bit.byteLow = logbookHeader.pBeginProfileData[0]; + dataStart.u8bit.byteMidLow = logbookHeader.pBeginProfileData[1]; + dataStart.u8bit.byteMidHigh = logbookHeader.pBeginProfileData[2]; + + dataStart.u32bit &= 0xFFFF0000; /* set to sector start */ + ext_flash_invalidate_sample_index(dataStart.u32bit); +} +#endif