This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Saving & Reading a structure using FDS (Flash Data Storage) SDK15.3

I am trying to save and read a structure using FDS, how do I go about it?

I have the structure:

typedef struct
{
    uint16_t total_runhours_flash;
    float total_energy_consumed_flash;
}energy_struct;

energy_struct energy_variables;

Is this correct by populating the record as such?:

fds_record_t record;
fds_record_desc_t record_desc;

record.file_id = FILE_ID;
record.key = ENERGY_KEY;
record.data.p_data = &energy_variables;
record.data.length_words = sizeof(energy_variables);

fds_record_desc_t desc = {0};

rc = fds_record_update(&desc, &record);
APP_ERROR_CHECK(rc);

And to read is the main problem, I can't seem to match the types in which it would load data from the structure: (This is giving error)

energy_variables = (struct energy_struct *) config.p_data;

Parents Reply Children
  • In the last snip I am trying to read the structure I saved into a structure variable of the same kind but I dont believe it is working, maybe my data types are out of place?

  • So from the FDS example I kind of figured it out.

    The write function would be like:

    fds_record_t record;
    fds_record_desc_t record_desc;
    
    record.file_id = FILE_ID;
    record.key = ENERGY_KEY;
    record.data.p_data = &energy_variables;
    record.data.length_words = ( sizeof(energy_variables) + 3 ) / sizeof(uint32_t);
    
    fds_record_desc_t desc = {0};
    
    rc = fds_record_update(&desc, &record);
    APP_ERROR_CHECK(rc);

    And for reading:

    rc = fds_record_open(&desc, &config);
    APP_ERROR_CHECK(rc);
    
    memcpy(&energy_variables, config.p_data, sizeof(energy_struct));

  • I am facing another problem with another structure saving. The structure I have is: 

    typedef struct
    {
        uint8_t led_blink; //was bool
        uint8_t initial_adv_disable; //was bool
        uint8_t enable_ibeacon_Packet; //was bool
        uint8_t enable_cbeacon1_Health_Packet; //was bool
        uint8_t enable_cbeacon2_Proximity_Packet;  //was bool
        uint8_t enable_ibeacon_SOS_Packet; //was bool
        uint8_t enable_Mems; //was bool
    }beacon_packet_struct;

    My custom function for saving is:

    int fds_write_struct(uint16_t file_id, uint16_t flash_key)
    {
        ret_code_t ret;
    
        fds_record_t        record;
        fds_record_desc_t   record_desc;
    
        fds_record_desc_t desc = {0};
        fds_find_token_t  tok  = {0};
    
    	if (flash_key == BEACON_STATE_KEY)
        {
    
            record.file_id              = FILE_ID;
            record.key                  = BEACON_STATE_KEY;
            record.data.p_data          = &beacon_flags;  //&beacon_flags;
            record.data.length_words    = ( sizeof(beacon_packet_struct) + 3 ) / sizeof(uint32_t);
          
            ret_code_t rc = fds_record_find(FILE_ID, BEACON_STATE_KEY , &desc, &tok);  //Search for record. Update if found else write a new one
    
            if (rc == FDS_SUCCESS)
            {   
                NRF_LOG_INFO("Similar BEACON STATE Variables Record was found thus it is being updated");
                rc = fds_record_update(&desc, &record);
                APP_ERROR_CHECK(rc);
            }
            else
            {
                ret_code_t ret = fds_record_write(&record_desc, &record);
                APP_ERROR_CHECK(ret);
                NRF_LOG_INFO("First time writing BEACON STATE record");
            }
    
            return 1;
        }
    	
    }

    I call the function using below:

    fds_write_struct(FILE_ID,BEACON_STATE_KEY);

    But I get error 0x03 at:

    ret_code_t ret = fds_record_write(&record_desc, &record);
    APP_ERROR_CHECK(ret);

    Suggestion would be greatly appreciated Slight smile

Related