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.