Hi,
when using the following codes, I have some errors related with the ID of record, please help to let me know the solution,
The errors are NRF_ERROR_INVALID_PARAM or NRF_ERROR_INVALID_FLAGS, it can be done well for some time, but after 20 minutes(repeating the write and read), the problem is happened and then can't be done as to writing and reading,
thankful for your support in advance,
thanks. firstly, in Main Routine,
if(password[0] == 250)
password[0] = 0;
password[0]++;
err_code = yps_storage_password_write(password[0]);
APP_ERROR_CHECK(err_code);
uint8_t yps_password[YPS_PASSWORD_LENGTH];
err_code = yps_storage_password_read(yps_password);
APP_ERROR_CHECK(err_code);
printf("yps_password = %d \r\n", yps_password[0]);
yps_storage_password_delete();
and the codes of fds,
#include <string.h>
#include "hal_fds_module.h"
#include "fds.h"
#include "app_error.h"
#include "app_util.h"
#include "app_util_bds.h"
static volatile bool m_fds_evt_init = false;
static void yps_storage_fds_evt_handler(fds_evt_t const * const p_fds_evt)
{
// printf("yps_storage_fds_evt_handler %x\r\n", p_fds_evt->id);
switch (p_fds_evt->id)
{
case FDS_EVT_INIT:
// printf("FDS_EVT_INIT %x\r\n", p_fds_evt->result);
//
if (p_fds_evt->result != FDS_SUCCESS)
printf("FDS_EVT_INIT Initialization failed\r\n");
else
m_fds_evt_init = true;
break;
case FDS_EVT_WRITE:
// printf("FDS_EVT_WRITE %x\r\n", p_fds_evt->result);
//
// if (p_fds_evt->result == FDS_SUCCESS)
// {
// printf("FDS_EVT_WRITE FDS_SUCCESS\r\n");
// } else {
// printf("FDS_EVT_WRITE Failed!!!\r\n");
// }
break;
case FDS_EVT_UPDATE:
// printf("FDS_EVT_UPDATE %x\r\n",p_fds_evt->result);
break;
case FDS_EVT_DEL_RECORD:
// printf("FDS_EVT_DEL_RECORD %x\r\n", p_fds_evt->result);
break;
case FDS_EVT_DEL_FILE:
// printf("FDS_EVT_DEL_FILE %x\r\n",p_fds_evt->result);
break;
case FDS_EVT_GC:
// printf("FDS_EVT_GC %x\r\n", p_fds_evt->result);
break;
default:
break;
}
}
ret_code_t yps_storage_init(void) {
ret_code_t ret = fds_register(yps_storage_fds_evt_handler);
if (ret != FDS_SUCCESS) {
return ret;
}
ret = fds_init();
if (ret != FDS_SUCCESS) {
return ret;
}
fds_stat_t stat = {0};
ret = fds_stat(&stat);//love_0123
APP_ERROR_CHECK(ret);
return NRF_SUCCESS;
}
bool yps_storage_find(uint16_t file_id, uint16_t key, fds_record_desc_t * p_desc) {
ret_code_t ret;
fds_find_token_t ftok = {0}; //Important, make sure you zero init the ftok token
memset(&ftok, 0x00, sizeof(fds_find_token_t));
ret = fds_record_find(file_id, key, p_desc, &ftok);
// APP_ERROR_CHECK(ret);
if (ret == FDS_SUCCESS) {
// printf("fds_record_find Record ID = %d\r\n", p_desc->record_id);
return true;
}
// printf("yps_storage_find not found 0x%x 0x%x\r\n", file_id, key);
return false;
}
ret_code_t yps_storage_write(uint16_t file_id, uint16_t key, uint8_t p_data, uint16_t length_bytes) {
fds_record_desc_t record_desc = {0};
ret_code_t ret;
fds_record_t const rec =
{
.file_id = file_id,
.key = key,
.data.p_data = &p_data,
.data.length_words = BYTES_TO_WORDS(length_bytes)
};
if(yps_storage_find(file_id, key, &record_desc))
{
// update
ret = fds_record_update(&record_desc, &rec);
// printf("fds_record_update : %x %d \r\n", ret, record_desc.record_id);
}
else
{
// new
ret = fds_record_write(&record_desc, &rec);
// printf("fds_record_write : %x %d \r\n", ret, record_desc.record_id);
}
return ret;
}
ret_code_t yps_storage_read(uint16_t file_id, uint16_t key, uint8_t * p_data) {
ret_code_t ret;
fds_flash_record_t flash_record;
fds_record_desc_t record_desc = {0};
fds_find_token_t ftok = {0}; //Important, make sure you zero init the ftok token
ret = fds_record_find(file_id, key, &record_desc, &ftok);
APP_ERROR_CHECK(ret);
if (ret != FDS_SUCCESS)
return ret;
ret = fds_record_open(&record_desc, &flash_record);
APP_ERROR_CHECK(ret);
if (ret != FDS_SUCCESS)
return ret;
// Access the record through the flash_record structure.
// printf("Reading Record ID = %d\r\n",record_desc.record_id);
memcpy(p_data, flash_record.p_data, (flash_record.p_header->length_words * BYTES_PER_WORD));
// Close the record when done.
ret = fds_record_close(&record_desc);
APP_ERROR_CHECK(ret);
if (ret != FDS_SUCCESS)
return ret;
return ret;
}
ret_code_t yps_storage_find_and_delete(uint16_t file_id, uint16_t key)
{
ret_code_t ret;
fds_record_desc_t record_desc;
fds_find_token_t ftok = {0};
// Loop and find records with same ID and rec key and mark them as deleted.
while (fds_record_find(file_id, key, &record_desc, &ftok) == FDS_SUCCESS)
{
ret = fds_record_delete(&record_desc);
printf("Deleted record ID: %d 0x%x\r\n",record_desc.record_id, (unsigned int) ret);
}
// call the garbage collector to empty them, don't need to do this all the time, this is just for demonstration
// ret = fds_gc();
//
// if (ret != FDS_SUCCESS)
// {
// return ret;
// }
return NRF_SUCCESS;
}
ret_code_t yps_storage_id_write(uint8_t p_id) {
return yps_storage_write(FILE_ID, REC_KEY_ID, p_id, YPS_ID_LENGTH);
}
ret_code_t yps_storage_password_write(uint8_t p_password) {
return yps_storage_write(FILE_ID, REC_KEY_PASSWORD, p_password, YPS_PASSWORD_LENGTH);
}
ret_code_t yps_storage_id_read(uint8_t * p_id) {
ret_code_t ret = yps_storage_read(FILE_ID, REC_KEY_ID, p_id);
return ret;
}
ret_code_t yps_storage_password_read(uint8_t * p_password) {
ret_code_t ret = yps_storage_read(FILE_ID, REC_KEY_PASSWORD, p_password);
return ret;
}
ret_code_t yps_storage_id_delete(void) {
return yps_storage_find_and_delete(FILE_ID, REC_KEY_ID);
}
ret_code_t yps_storage_password_delete(void) {
return yps_storage_find_and_delete(FILE_ID, REC_KEY_PASSWORD);
}
bool get_fds_evt_init(void) {
return m_fds_evt_init;
}