Hello,
I have multiple records that I want to update during the runtime of the program.
What is working:
1. I can write in memory for the first time initial values.
2. I can update all records and it works.
3. I can load all records and it works.
Problem:
When I update for the first time one of the records. All other records points the same "default" location, like they are de-referenced.
However if I update each record one time, it work fine forever.
#define FILE_ID 0x1111
#define REC_KEY 0x1908
#define TOTAL_RECORDS 3
static fds_record_desc_t m_record_desc[TOTAL_RECORDS];
static fds_record_t m_record[TOTAL_RECORDS];
ret_code_t ndef_file_load(uint8_t * p_buff, uint32_t size, uint8_t id)
{
ret_code_t err_code;
fds_find_token_t ftok;
fds_flash_record_t flash_record;
// Always clear token before running new file/record search.
memset(&ftok, 0x00, sizeof(fds_find_token_t));
// Search for NDEF message in FLASH.
err_code = fds_record_find(FILE_ID, REC_KEY+id, &m_record_desc[id], &ftok);
// If there is no record with given key and file ID,
// create default message and store in FLASH.
if (err_code == NRF_SUCCESS)
{
NRF_LOG_INFO("Found NDEF file record for id %d", id);
// Open record for read.
err_code = fds_record_open(&m_record_desc[id], &flash_record);
VERIFY_SUCCESS(err_code);
// Access the record through the flash_record structure.
memcpy(p_buff,
flash_record.p_data,
flash_record.p_header->length_words * sizeof(uint32_t));
// Print file length and raw message data.
NRF_LOG_DEBUG("NDEF file data length: %u bytes.",
flash_record.p_header->length_words * sizeof(uint32_t));
NRF_LOG_HEXDUMP_DEBUG(p_buff, flash_record.p_header->length_words * sizeof(uint32_t));
// Close the record when done.
err_code = fds_record_close(&m_record_desc[id]);
}
else if (err_code == FDS_ERR_NOT_FOUND)
{
NRF_LOG_INFO("NDEF file record not found, default NDEF file created.", err_code);
// Create default NDEF message.
ndef_file_default_message(p_buff, size, id);
// Create record with default NDEF message.
err_code = ndef_record_create(p_buff, size, id);
}
return err_code;
}
static void ndef_file_default_message(uint8_t * p_buff, uint32_t p_size, uint8_t id)
{
for(int i=0; i<p_size; i++)
{
p_buff[i] = 0xFF;
}
}
static void ndef_file_prepare_record(uint8_t const * p_buff, uint32_t size, uint8_t id)
{
// Set up record.
m_record[id].file_id = FILE_ID;
m_record[id].key = REC_KEY + id;
m_record[id].data.p_data = p_buff;
m_record[id].data.length_words = BYTES_TO_WORDS(size); // Align data length to 4 bytes.
}
static ret_code_t ndef_record_create(uint8_t const * p_buff, uint32_t size, uint8_t id)
{
ret_code_t err_code;
// Prepare record structure.
ndef_file_prepare_record(p_buff, size, id);
err_code = fds_record_write(&m_record_desc[id], &m_record[id]);
VERIFY_SUCCESS(err_code);
return err_code;
}
ret_code_t ndef_file_update(uint8_t const * p_buff, uint32_t size, uint8_t id)
{
ret_code_t err_code;
// Prepare record structure.
ndef_file_prepare_record(p_buff, size, id);
// Update FLASH file with new NDEF message.
err_code = fds_record_update(&m_record_desc[id], &m_record[id]);
VERIFY_SUCCESS(err_code);
return err_code;
}
Records are stored in a static fds_record_t array and they got their own individual key.
Any idea on the direction to explore ?
Thanks