Example #1
0
// 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;

}