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

Data not updated to fds with GATT

I am new to GATT services and characteristics. I have written one custom service with two characteristics for my custom board. I have used nrf 52832 with sdk 15.2.0 and referred following link https://github.com/bjornspockeli/custom_ble_service_example to build cutsom service.  I want to store values enter through gatt charcteristics to fds. The snippet of code as follows

// ble_custom.c
uint8_t tempnum1[2] = {0};
uint8_t tempnum2[2] = {0};

static void on_write(ble_cus_t * p_cus, ble_evt_t const * p_ble_evt)
{
    ble_gatts_evt_write_t const * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;
    uint32_t err_code;
																												
    // Custom Value Characteristic Written to.
    if (p_evt_write->handle == p_cus->custom_value_handles_1.value_handle)
    {
      
			memset(tempnum1, 0, sizeof(tempnum1));
			tempnum1[0] = p_evt_write->data[0]  ;
			tempnum2[1] = p_evt_write->data[1] ;
			
			err_code = fds_update(tempnum1,sizeof(tempnum1),FILE_ID,REC_KEY);
			APP_ERROR_CHECK(err_code);
		     
    }
		 if (p_evt_write->handle == p_cus->custom_value_handles_2.value_handle)
    {
      
			memset(tempnum2, 0, sizeof(tempnum2));
			tempnum2[0] = p_evt_write->data[0]  ;
			tempnum2[1] = p_evt_write->data[1] ;
					
			err_code = fds_update(tempnum2,sizeof(tempnum1),FILE_ID2,REC_KEY2);
			APP_ERROR_CHECK(err_code);
		     
    }
}

In main after disconnecting event  I read data. The snippet of code as follows.

// main.c

uin8_t num1[2]={0};
uint8_t num2[2] = {0};
//Read data from FDS
void read_data_from_fds()
{ 	ret_code_t err_code;
	err_code = load_from_fds(num1,sizeof(num1),FILE_ID,REC_KEY);
	APP_ERROR_CHECK(err_code);
	err_code = load_from_fds(num2,sizeof(num2),FILE_ID2,REC_KEY2);
	APP_ERROR_CHECK(err_code);
	
}
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ret_code_t err_code;

    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
            
            m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
            err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
            APP_ERROR_CHECK(err_code);
            
            break;

        case BLE_GAP_EVT_DISCONNECTED:
					
						read_data_from_fds();
						
            advertising_start();						          
            break;
        }

The snippet of fds as follows

//fds.c
ret_code_t fds_update(uint8_t const * p_buff, uint32_t size,uint16_t fileid,uint16_t recKey)
{
    ret_code_t err_code;
		fds_find_token_t   ftok;
		static uint8_t m_deadbeef[2] = {0};

    // Always clear token before running new file/record search.
    memset(&ftok, 0x00, sizeof(fds_find_token_t));
		
		 // Search for data in FLASH.
    err_code = fds_record_find(fileid, recKey, &m_record_desc, &ftok);

    // If there is no record with given key and file ID,
    // create default message and store in FLASH.
    if (err_code == FDS_SUCCESS)
    {
   
    // Prepare record structure.
			prepare_record(p_buff, size,fileid,recKey);
	
    // Update FLASH file with new message.
			err_code = fds_record_update(&m_record_desc, &m_record);
			if (err_code == FDS_ERR_NO_SPACE_IN_FLASH)
			{
                 err_code = fds_gc();
			}
		}
    return err_code;
}


static ret_code_t fds_create(uint8_t const	* p_buff, uint32_t size,uint16_t fileid,uint16_t recKey)
{
    ret_code_t err_code;

    // Prepare record structure.
    prepare_record(p_buff, size,fileid,recKey);

    // Create FLASH file with data
    err_code = fds_record_write(&m_record_desc, &m_record);
    if (err_code == FDS_ERR_NO_SPACE_IN_FLASH)
    {
        
	       err_code = fds_gc();
    }

    return err_code;
}

ret_code_t load_from_fds(uint8_t * p_buff, uint32_t  p_size,uint16_t fileid,uint16_t recKey)
{
	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  data in FLASH.
    err_code = fds_record_find(fileid, recKey, &m_record_desc, &ftok);

    // If there is no record with given key and file ID,
    // create default message and store in FLASH.
    if (err_code == FDS_SUCCESS)
    {
       
        // Open record for read.
        err_code = fds_record_open(&m_record_desc, &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));

      
     

        // Close the record when done.
        err_code = fds_record_close(&m_record_desc);
    }
		
    else if (err_code == FDS_ERR_NOT_FOUND)
    {
		    // Create default data
	
		// Create record with default data message.
        err_code = fds_create(p_buff,p_size,fileid,recKey);
	 
		} 
    
		
    return err_code;
}
.

Whenever I used service with one characteristics it updates data correctly for both characteristics.. But when I have used service with 2 characteristics then first characteristics data is updated  to fds correctly but for second characteristics GATT event is disconnected and data is not updated to fds.

Related