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.

Parents Reply Children
No Data
Related