// Compact the storage by removing invalid entries AJ_Status _AJ_CompactNVStorage() { uint16_t capacity = 0; uint16_t id = 0; uint16_t* data = (uint16_t*)(AJ_NVRAM_BASE_ADDRESS + SENTINEL_OFFSET); uint8_t* writePtr = (uint8_t*)data; uint16_t entrySize = 0; uint16_t garbage = 0; //AJ_NVRAM_Layout_Print(); while ((uint8_t*)data < (uint8_t*)AJ_NVRAM_END_ADDRESS && *data != INVALID_DATA) { id = *data; capacity = *(data + 1); entrySize = ENTRY_HEADER_SIZE + capacity; if (id != INVALID_ID) { _AJ_NV_Write(writePtr, data, entrySize); writePtr += entrySize; } else { garbage += entrySize; } data += entrySize >> 1; } memset(writePtr, INVALID_DATA_BYTE, garbage); _AJ_StoreNVToFile(); //AJ_NVRAM_Layout_Print(); return AJ_OK; }
void _AJ_NVRAM_Clear() { //Erase the first sector starting at the base address int i; uint8_t* eraseSectorAddr = AJ_NVRAM_BASE_ADDRESS; AJ_NV_EraseSector(eraseSectorAddr); // Write the sentinel string _AJ_NV_Write(AJ_NVRAM_BASE_ADDRESS, "AJNV", 4); eraseSectorAddr += AJ_NVRAM_SECTOR_SIZE; while (eraseSectorAddr < AJ_NVRAM_END_ADDRESS) { AJ_NV_EraseSector(eraseSectorAddr); eraseSectorAddr += AJ_NVRAM_SECTOR_SIZE; } }
// Compact the storage by removing invalid entries AJ_Status _AJ_CompactNVStorage() { uint16_t capacity = 0; uint16_t id = 0; uint16_t* data = (uint16_t*)(AJ_NVRAM_BASE_ADDRESS + SENTINEL_OFFSET); uint16_t entrySize = 0; uint16_t offset = 0; uint16_t copyBytes = 0; uint8_t* buf = (uint8_t*)AJ_NVRAM_COMPACTION_BUF; uint8_t* eraseSectorAddr = AJ_NVRAM_BASE_ADDRESS; // copy sentinel AJ_NV_EraseSector(AJ_NVRAM_COMPACTION_BUF); _AJ_NV_Write(AJ_NVRAM_COMPACTION_BUF, "AJNV", SENTINEL_OFFSET); offset += SENTINEL_OFFSET; extern void AJ_NVRAM_Layout_Print(); //AJ_NVRAM_Layout_Print(); while ((uint8_t*)data < (uint8_t*)AJ_NVRAM_END_ADDRESS && (*data != INVALID_DATA)) { id = *data; capacity = *(data + 1); entrySize = ENTRY_HEADER_SIZE + capacity; if (id != INVALID_ID) { if (offset + entrySize >= AJ_NVRAM_SECTOR_SIZE) { uint16_t leftOver = 0; copyBytes = AJ_NVRAM_SECTOR_SIZE - offset; leftOver = entrySize - copyBytes; _AJ_NV_Write(buf + offset, data, copyBytes); AJ_NV_EraseSector(eraseSectorAddr); _AJ_NV_Write(eraseSectorAddr, buf, AJ_NVRAM_SECTOR_SIZE); AJ_NV_EraseSector(AJ_NVRAM_COMPACTION_BUF); eraseSectorAddr += AJ_NVRAM_SECTOR_SIZE; offset = 0; if (leftOver > 0) { _AJ_NV_Write((uint8_t*)data + copyBytes, buf + offset, leftOver); offset = leftOver; } } else { _AJ_NV_Write(buf + offset, data, entrySize); offset += entrySize; } } data += entrySize >> 1; } if (offset > 0) { AJ_NV_EraseSector(eraseSectorAddr); _AJ_NV_Write(eraseSectorAddr, buf, offset); eraseSectorAddr += AJ_NVRAM_SECTOR_SIZE; } while (eraseSectorAddr < AJ_NVRAM_END_ADDRESS) { AJ_NV_EraseSector(eraseSectorAddr); eraseSectorAddr += AJ_NVRAM_SECTOR_SIZE; } //AJ_NVRAM_Layout_Print(); return AJ_OK; }