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

fds_record_update problem

HI

my Version: SDK15.3,ble_app_template,custom board with nrf52832

I'm trying to load device name from fds when initial,

my goal is sending message to my board to change the device name ,and use fds_record_update to update the name in fds

It works few hours ago,but is not working now

I think maybe something interrupt the fds_record_update or something weird happened

PS. I didnt initial FDS,because it seems that peer_manager_init() in ble_app_template has already do that for you ,so i dont have a fds_evt_handler

PS 2. I follow the tutorial:https://devzone.nordicsemi.com/nordic/short-range-guides/b/bluetooth-low-energy/posts/ble-services-a-beginners-tutorial

         so I wrote our_fds.h,our_fds.c independently for using them in our_service.c!

below is fds.c

//FDS
#include "our_fds.h"
#include <stdint.h>
#include <string.h>
#include "fds.h"
#include "app_error.h"
#include "SEGGER_RTT.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "nrf_delay.h"

ret_code_t kls_fds_write(uint16_t write_file_id, uint16_t write_record_key , uint8_t write_data[])
{		
        SEGGER_RTT_printf(0, "file_id: %x, record_key: %x,write data: %s\n",write_file_id,write_record_key,write_data);
//        SEGGER_RTT_printf(0, "strlen(write_data) = %d ,sizeof(write_data) = %d\n",strlen(write_data),sizeof(write_data));
//                uint8_t m_deadbeef[20] = {0};
//		memcpy(m_deadbeef, write_data, strlen(write_data));
//                SEGGER_RTT_printf(0, "deadbeef = %s\n",m_deadbeef);
		
		fds_record_t        record;
		fds_record_desc_t   record_desc={0};
	
		// Set up record.
		record.file_id                  = write_file_id;
		record.key              	= write_record_key;
		record.data.p_data       	= &write_data;//m_deadbeef;
		record.data.length_words   	= strlen(write_data);//strlen(write_data)/sizeof(uint8_t);
				
                ret_code_t ret = fds_record_write(&record_desc, &record);
		if (ret != FDS_SUCCESS)
		{
				return ret;
		}
                 NRF_LOG_INFO("Writing Record ID = %d \r\n",record_desc.record_id);
		return NRF_SUCCESS;
	
}

ret_code_t kls_fds_update(uint16_t write_file_id, uint16_t write_record_key , uint8_t write_data[])
{		
        SEGGER_RTT_printf(0, "file_id: %x, record_key: %x,update data: %s\n",write_file_id,write_record_key,write_data);
        for(int i=0;i<strlen(write_data)+1;i++)SEGGER_RTT_printf(0, "%x /",write_data[i]);
        SEGGER_RTT_printf(0, "\n");
        fds_record_t        record;
        fds_record_desc_t   record_desc={0};
        fds_find_token_t    ftok ={0};//Important, make sure you zero init the ftok token
        uint8_t *data;
        uint32_t err_code;

        // Set up record.
        record.file_id                  = write_file_id;
        record.key              	= write_record_key;
        record.data.p_data       	= &write_data;
        record.data.length_words   	= strlen(write_data);
        

        int find_count=0;
        while(fds_record_find(write_file_id, write_record_key, &record_desc, &ftok) == FDS_SUCCESS)
        {
            
            ret_code_t ret = fds_record_update(&record_desc, &record);
            if (ret != FDS_SUCCESS)
            {
                            return ret;
            }
            SEGGER_RTT_printf(0, " find_count:%d /",find_count);
            find_count++;
        }
        return NRF_SUCCESS;
        SEGGER_RTT_printf(0, "read fail\n");

                
	
}
	
ret_code_t kls_fds_read(uint16_t read_file_id, uint16_t relevant_record_key , uint8_t read_data[])
{	
		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
		uint8_t *data;
		uint32_t err_code;
		SEGGER_RTT_printf(0, "file_id: %x, record_key: %x\n",read_file_id,relevant_record_key);
                SEGGER_RTT_printf(0, "Start searching... \r\n",record_desc.record_id);
		
                // Loop until all records with the given key and file ID have been found.
		int find_count=0;
                while (fds_record_find(read_file_id, relevant_record_key, &record_desc, &ftok) == FDS_SUCCESS)
		{
				SEGGER_RTT_printf(0, " %d /",find_count);
                                err_code = fds_record_open(&record_desc, &flash_record);
				if ( err_code != FDS_SUCCESS)
				{
					return err_code;		
				}
				
//				NRF_LOG_INFO("Found Record ID = %d\r\n",record_desc.record_id);
                                SEGGER_RTT_printf(0, "Found Record ID = %d\r\n",record_desc.record_id);

				data = (uint8_t *) flash_record.p_data;
				for (uint8_t i=0;i<flash_record.p_header->length_words;i++)
				{
					read_data[i] = data[i];
                                        SEGGER_RTT_printf(0, "%x / ",data[i]);
				}
                                SEGGER_RTT_printf(0, " \n");
			
		
				// Access the record through the flash_record structure.
				// Close the record when done.
				err_code = fds_record_close(&record_desc);
				if (err_code != FDS_SUCCESS)
				{
					return err_code;	
				}
		}
		return NRF_SUCCESS;	
}



below: ble_our_service_on_ble_evt  in  our_service.c  to get message from nrf_connect

our_ble_event=0xDD;in line34 will trigger ble_event_scan_timer_handler in main

if(p_ble_evt->evt.gatts_evt.params.write.handle==p_our_service->other_char_handles.value_handle) //other_char_handles
            {
              SEGGER_RTT_printf(0, "uuid = %x\n",p_ble_evt->evt.gatts_evt.params.write.uuid);
              int z = strlen(p_ble_evt->evt.gatts_evt.params.write.data);
              uint8_t temp[z];
              
              SEGGER_RTT_printf(0, "data = ");
              for(int x=0;x<z;x++){
                SEGGER_RTT_printf(0, "%x ",p_ble_evt->evt.gatts_evt.params.write.data[x]);
                temp[x]=p_ble_evt->evt.gatts_evt.params.write.data[x];
              }
              SEGGER_RTT_printf(0, "\n");
              if(temp[0]==0xEE && temp[1]==0x88){
              //do 1.update time    EE 88 20 02 26 09 15 59
                  SEGGER_RTT_printf(0, "update time!\n");
                  DS3231_set_data(temp[2],temp[3],temp[4]);
                  DS3231_set_time(temp[5],temp[6],temp[7]);
              
              }
              if(temp[0]==0xcc && temp[1]==0xcc){
              //do 2.show time by notification
                  uint8_t rrrrdata[20];
                  kls_fds_read(0xAB11, 0xAB11 , rrrrdata);
              }
              if(temp[0]==0xDD && temp[1]==0xDD){
                  
                  memcpy(our_device_name_data, temp+3, z-3);
                  SEGGER_RTT_printf(0, "data lenth = %d ,new device name data = " ,temp[2]);
                  for(int x=0;x<temp[2];x++)
                  SEGGER_RTT_printf(0, "%x ",our_device_name_data[x]);
                  SEGGER_RTT_printf(0, "\n");
                  our_device_name_data[temp[2]]='\0';
                  SEGGER_RTT_printf(0, "new device name char = %s\n ",our_device_name_data);
                  our_ble_event=0xDD;

              //do 3.change device name
                  
              }

            }

below:ble_event_scan_timer_handler in main 

static void ble_event_scan_timer_handler(void * p_context)
{
    switch(our_ble_event)
    {

          case 0xDD:
              our_ble_event = 0;
              SEGGER_RTT_printf(0, "In ble_event_scan_timer_handler\n");
              app_timer_start(change_device_name_timer_id, APP_TIMER_TICKS(20), NULL);
              break;
          case 0xAA:
              break;
          default:
            // No implementation needed.
            break;   
    
    
    }
}

below:change_device_name_timer_handler  will trigger by ble_event_scan_timer_handler when get 0xdd 0xdd from bletooth

static void change_device_name_timer_handler(void * p_context)
{     
      SEGGER_RTT_printf(0, "change device name!\n");
      uint8_t str1[] = "GT06_";
      int len = strlen(str1) + strlen(our_device_name_data) + 1;
      uint8_t concated[len];
      memset(concated, '\0', len);
      strcat(concated, str1);
      strcat(concated, our_device_name_data);
      SEGGER_RTT_printf(0, "len = %d ,name = %s\n",len,concated);
      
      ble_gap_conn_sec_mode_t sec_mode;
      BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
      sd_ble_gap_device_name_set(&sec_mode,(const uint8_t *)concated,strlen(concated));
      
      uint16_t m_adv_current_slave_link_conn_handle_saved = m_advertising.current_slave_link_conn_handle;
      advertising_init();
      m_advertising.current_slave_link_conn_handle = m_adv_current_slave_link_conn_handle_saved;

      SEGGER_RTT_printf(0, "update device name\n");
      APP_ERROR_CHECK(kls_fds_update(0xAB11 , 0xAB11 , concated));
      SEGGER_RTT_printf(0, "update done\n");

}

massage from bluetooth is data in log

DD DD is id

4 is lenth

41 42 43 44 is ABCD

and I concade it to GT06_ABCD

no error from fds_record_update

below:kls_fds_read

Any help is appreciated. Thanks.

Parents Reply Children
No Data
Related