Adds BLE adv name & mac changing effective

This commit is contained in:
yocvito
2023-01-25 19:00:41 +01:00
44 changed files with 2070 additions and 59 deletions
+11 -18
View File
@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,12.3,,
Version,v,12.7,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_vcp.h,,
@@ -571,9 +571,13 @@ Function,+,ble_glue_wait_for_c2_start,_Bool,int32_t
Function,-,bsearch,void*,"const void*, const void*, size_t, size_t, __compar_fn_t"
Function,+,bt_disconnect,void,Bt*
Function,+,bt_forget_bonded_devices,void,Bt*
Function,?,bt_get_profile_adv_name,const char*,Bt*
Function,?,bt_get_profile_mac_address,const uint8_t*,Bt*
Function,+,bt_keys_storage_set_default_path,void,Bt*
Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*"
Function,+,bt_set_profile,_Bool,"Bt*, BtProfile"
Function,?,bt_set_profile,_Bool,"Bt*, BtProfile"
Function,?,bt_set_profile_adv_name,void,"Bt*, const char*, ..."
Function,?,bt_set_profile_mac_address,void,"Bt*, const uint8_t[6]"
Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*"
Function,+,buffered_file_stream_alloc,Stream*,Storage*
Function,+,buffered_file_stream_close,_Bool,Stream*
@@ -603,15 +607,7 @@ Function,+,byte_input_set_result_callback,void,"ByteInput*, ByteInputCallback, B
Function,-,bzero,void,"void*, size_t"
Function,-,calloc,void*,"size_t, size_t"
Function,+,canvas_clear,void,Canvas*
<<<<<<< HEAD
Function,+,canvas_commit,void,Canvas*
=======
<<<<<<< HEAD
Function,-,canvas_commit,void,Canvas*
=======
Function,+,canvas_commit,void,Canvas*
>>>>>>> b11b9f1b3 (Gui: Direct Draw API (#2215))
>>>>>>> e04f2b4ce (api_symbols)
Function,+,canvas_current_font_height,uint8_t,Canvas*
Function,+,canvas_draw_bitmap,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, const uint8_t*"
Function,+,canvas_draw_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
@@ -640,15 +636,7 @@ Function,+,canvas_glyph_width,uint8_t,"Canvas*, char"
Function,+,canvas_height,uint8_t,Canvas*
Function,-,canvas_init,Canvas*,
Function,+,canvas_invert_color,void,Canvas*
<<<<<<< HEAD
Function,+,canvas_reset,void,Canvas*
=======
<<<<<<< HEAD
Function,-,canvas_reset,void,Canvas*
=======
Function,+,canvas_reset,void,Canvas*
>>>>>>> b11b9f1b3 (Gui: Direct Draw API (#2215))
>>>>>>> e04f2b4ce (api_symbols)
Function,+,canvas_set_bitmap_mode,void,"Canvas*, _Bool"
Function,+,canvas_set_color,void,"Canvas*, Color"
Function,+,canvas_set_font,void,"Canvas*, Font"
@@ -1012,12 +1000,15 @@ Function,+,furi_hal_bt_clear_white_list,_Bool,
Function,+,furi_hal_bt_dump_state,void,FuriString*
Function,+,furi_hal_bt_ensure_c2_mode,_Bool,BleGlueC2Mode
Function,+,furi_hal_bt_get_key_storage_buff,void,"uint8_t**, uint16_t*"
Function,?,furi_hal_bt_get_profile_adv_name,const char*,FuriHalBtProfile
Function,?,furi_hal_bt_get_profile_mac_addr,const uint8_t*,FuriHalBtProfile
Function,+,furi_hal_bt_get_radio_stack,FuriHalBtStack,
Function,+,furi_hal_bt_get_rssi,float,
Function,+,furi_hal_bt_get_transmitted_packets,uint32_t,
Function,+,furi_hal_bt_hid_consumer_key_press,_Bool,uint16_t
Function,+,furi_hal_bt_hid_consumer_key_release,_Bool,uint16_t
Function,+,furi_hal_bt_hid_consumer_key_release_all,_Bool,
Function,?,furi_hal_bt_hid_kb_free_slots,_Bool,uint8_t
Function,+,furi_hal_bt_hid_kb_press,_Bool,uint16_t
Function,+,furi_hal_bt_hid_kb_release,_Bool,uint16_t
Function,+,furi_hal_bt_hid_kb_release_all,_Bool,
@@ -1044,6 +1035,8 @@ Function,+,furi_hal_bt_serial_start,void,
Function,+,furi_hal_bt_serial_stop,void,
Function,+,furi_hal_bt_serial_tx,_Bool,"uint8_t*, uint16_t"
Function,+,furi_hal_bt_set_key_storage_change_callback,void,"BleGlueKeyStorageChangedCallback, void*"
Function,?,furi_hal_bt_set_profile_adv_name,void,"FuriHalBtProfile, const char[( 1 + 8 + ( 8 + 1 ) )]"
Function,?,furi_hal_bt_set_profile_mac_addr,void,"FuriHalBtProfile, const uint8_t[( 6 )]"
Function,+,furi_hal_bt_start_advertising,void,
Function,+,furi_hal_bt_start_app,_Bool,"FuriHalBtProfile, GapEventCallback, void*"
Function,+,furi_hal_bt_start_packet_rx,void,"uint8_t, uint8_t"
1 entry status name type params
2 Version + v 12.3 12.7
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/cli/cli.h
5 Header + applications/services/cli/cli_vcp.h
571 Function - bsearch void* const void*, const void*, size_t, size_t, __compar_fn_t
572 Function + bt_disconnect void Bt*
573 Function + bt_forget_bonded_devices void Bt*
574 Function ? bt_get_profile_adv_name const char* Bt*
575 Function ? bt_get_profile_mac_address const uint8_t* Bt*
576 Function + bt_keys_storage_set_default_path void Bt*
577 Function + bt_keys_storage_set_storage_path void Bt*, const char*
578 Function + ? bt_set_profile _Bool Bt*, BtProfile
579 Function ? bt_set_profile_adv_name void Bt*, const char*, ...
580 Function ? bt_set_profile_mac_address void Bt*, const uint8_t[6]
581 Function + bt_set_status_changed_callback void Bt*, BtStatusChangedCallback, void*
582 Function + buffered_file_stream_alloc Stream* Storage*
583 Function + buffered_file_stream_close _Bool Stream*
607 Function - bzero void void*, size_t
608 Function - calloc void* size_t, size_t
609 Function + canvas_clear void Canvas*
<<<<<<< HEAD
Function + canvas_commit void Canvas*
=======
<<<<<<< HEAD
610 Function - canvas_commit void Canvas*
=======
Function + canvas_commit void Canvas*
>>>>>>> b11b9f1b3 (Gui: Direct Draw API (#2215))
>>>>>>> e04f2b4ce (api_symbols)
611 Function + canvas_current_font_height uint8_t Canvas*
612 Function + canvas_draw_bitmap void Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, const uint8_t*
613 Function + canvas_draw_box void Canvas*, uint8_t, uint8_t, uint8_t, uint8_t
636 Function + canvas_height uint8_t Canvas*
637 Function - canvas_init Canvas*
638 Function + canvas_invert_color void Canvas*
<<<<<<< HEAD
Function + canvas_reset void Canvas*
=======
<<<<<<< HEAD
639 Function - canvas_reset void Canvas*
=======
Function + canvas_reset void Canvas*
>>>>>>> b11b9f1b3 (Gui: Direct Draw API (#2215))
>>>>>>> e04f2b4ce (api_symbols)
640 Function + canvas_set_bitmap_mode void Canvas*, _Bool
641 Function + canvas_set_color void Canvas*, Color
642 Function + canvas_set_font void Canvas*, Font
1000 Function + furi_hal_bt_dump_state void FuriString*
1001 Function + furi_hal_bt_ensure_c2_mode _Bool BleGlueC2Mode
1002 Function + furi_hal_bt_get_key_storage_buff void uint8_t**, uint16_t*
1003 Function ? furi_hal_bt_get_profile_adv_name const char* FuriHalBtProfile
1004 Function ? furi_hal_bt_get_profile_mac_addr const uint8_t* FuriHalBtProfile
1005 Function + furi_hal_bt_get_radio_stack FuriHalBtStack
1006 Function + furi_hal_bt_get_rssi float
1007 Function + furi_hal_bt_get_transmitted_packets uint32_t
1008 Function + furi_hal_bt_hid_consumer_key_press _Bool uint16_t
1009 Function + furi_hal_bt_hid_consumer_key_release _Bool uint16_t
1010 Function + furi_hal_bt_hid_consumer_key_release_all _Bool
1011 Function ? furi_hal_bt_hid_kb_free_slots _Bool uint8_t
1012 Function + furi_hal_bt_hid_kb_press _Bool uint16_t
1013 Function + furi_hal_bt_hid_kb_release _Bool uint16_t
1014 Function + furi_hal_bt_hid_kb_release_all _Bool
1035 Function + furi_hal_bt_serial_stop void
1036 Function + furi_hal_bt_serial_tx _Bool uint8_t*, uint16_t
1037 Function + furi_hal_bt_set_key_storage_change_callback void BleGlueKeyStorageChangedCallback, void*
1038 Function ? furi_hal_bt_set_profile_adv_name void FuriHalBtProfile, const char[( 1 + 8 + ( 8 + 1 ) )]
1039 Function ? furi_hal_bt_set_profile_mac_addr void FuriHalBtProfile, const uint8_t[( 6 )]
1040 Function + furi_hal_bt_start_advertising void
1041 Function + furi_hal_bt_start_app _Bool FuriHalBtProfile, GapEventCallback, void*
1042 Function + furi_hal_bt_start_packet_rx void uint8_t, uint8_t
+6 -2
View File
@@ -313,7 +313,7 @@ static void gap_init_svc(Gap* gap) {
// Initialize GATT interface
aci_gatt_init();
// Initialize GAP interface
// Skip fist symbol AD_TYPE_COMPLETE_LOCAL_NAME
// Skip first symbol AD_TYPE_COMPLETE_LOCAL_NAME
char* name = gap->service.adv_name + 1;
aci_gap_init(
GAP_PERIPHERAL_ROLE,
@@ -362,7 +362,7 @@ static void gap_init_svc(Gap* gap) {
keypress_supported,
CFG_ENCRYPTION_KEY_SIZE_MIN,
CFG_ENCRYPTION_KEY_SIZE_MAX,
CFG_USED_FIXED_PIN,
CFG_USED_FIXED_PIN, // 0x0 for no pin
0,
PUBLIC_ADDR);
// Configure whitelist
@@ -482,6 +482,10 @@ bool gap_init(GapConfig* config, GapEventCallback on_event_cb, void* context) {
gap->advertise_timer = furi_timer_alloc(gap_advetise_timer_callback, FuriTimerTypeOnce, NULL);
// Initialization of GATT & GAP layer
gap->service.adv_name = config->adv_name;
FURI_LOG_I(TAG, "Advertising name: %s", &(gap->service.adv_name[1]));
FURI_LOG_I(TAG, "MAC @ : %02X:%02X:%02X:%02X:%02X:%02X",
config->mac_address[0], config->mac_address[1], config->mac_address[2],
config->mac_address[3], config->mac_address[4], config->mac_address[5]);
gap_init_svc(gap);
// Initialization of the BLE Services
SVCCTL_Init();
+70 -36
View File
@@ -54,27 +54,25 @@ FuriHalBtProfileConfig profile_config[FuriHalBtProfileNumber] = {
},
},
},
[FuriHalBtProfileHidKeyboard] =
{
.start = furi_hal_bt_hid_start,
.stop = furi_hal_bt_hid_stop,
.config =
{
.adv_service_uuid = HUMAN_INTERFACE_DEVICE_SERVICE_UUID,
.appearance_char = GAP_APPEARANCE_KEYBOARD,
.bonding_mode = true,
.pairing_method = GapPairingPinCodeVerifyYesNo,
.mac_address = FURI_HAL_BT_DEFAULT_MAC_ADDR,
.conn_param =
{
.conn_int_min = 0x18, // 30 ms
.conn_int_max = 0x24, // 45 ms
.slave_latency = 0,
.supervisor_timeout = 0,
},
},
},
};
[FuriHalBtProfileHidKeyboard] = {
.start = furi_hal_bt_hid_start,
.stop = furi_hal_bt_hid_stop,
.config =
{
.adv_service_uuid = HUMAN_INTERFACE_DEVICE_SERVICE_UUID,
.appearance_char = GAP_APPEARANCE_KEYBOARD,
.bonding_mode = true,
.pairing_method = GapPairingPinCodeVerifyYesNo,
.mac_address = FURI_HAL_BT_DEFAULT_MAC_ADDR,
.conn_param =
{
.conn_int_min = 0x18, // 30 ms
.conn_int_max = 0x24, // 45 ms
.slave_latency = 0,
.supervisor_timeout = 0,
},
},
}};
FuriHalBtProfileConfig* current_profile = NULL;
void furi_hal_bt_init() {
@@ -201,26 +199,33 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb,
FURI_LOG_E(TAG, "Can't start Ble App - unsupported radio stack");
break;
}
// Set mac address
memcpy(
profile_config[profile].config.mac_address,
furi_hal_version_get_ble_mac(),
sizeof(profile_config[profile].config.mac_address));
// Set advertise name
strlcpy(
profile_config[profile].config.adv_name,
furi_hal_version_get_ble_local_device_name_ptr(),
FURI_HAL_VERSION_DEVICE_NAME_LENGTH);
// Configure GAP
GapConfig* config = &profile_config[profile].config;
if (strlen(&(profile_config[profile].config.adv_name[1])) == 0) {
// Set advertise name
strlcpy(
profile_config[profile].config.adv_name,
furi_hal_version_get_ble_local_device_name_ptr(),
FURI_HAL_VERSION_DEVICE_NAME_LENGTH);
}
// Configure GAP
if(profile == FuriHalBtProfileSerial) {
// Set mac address
memcpy(
profile_config[profile].config.mac_address,
furi_hal_version_get_ble_mac(),
sizeof(profile_config[profile].config.mac_address));
config->adv_service_uuid |= furi_hal_version_get_hw_color();
} else if(profile == FuriHalBtProfileHidKeyboard) {
// Change MAC address for HID profile
config->mac_address[2]++;
// Change name Flipper -> Flipper Remote
const char* clicker_str = "Flipper Remote";
memcpy(&config->adv_name[1], clicker_str, strlen(clicker_str));
uint8_t default_mac[GAP_MAC_ADDR_SIZE] = FURI_HAL_BT_DEFAULT_MAC_ADDR;
if(memcmp(config->mac_address, default_mac, 6) == 0) {
config->mac_address[2]++;
}
// Change name Flipper -> Control
if(strlen(&config->adv_name[1]) == 0) {
const char* clicker_str = "Control";
memcpy(&config->adv_name[1], clicker_str, strlen(clicker_str));
}
}
if(!gap_init(config, event_cb, context)) {
gap_thread_stop();
@@ -444,3 +449,32 @@ bool furi_hal_bt_ensure_c2_mode(BleGlueC2Mode mode) {
FURI_LOG_E(TAG, "Failed to switch C2 mode: %d", fw_start_res);
return false;
}
void furi_hal_bt_set_profile_adv_name(FuriHalBtProfile profile, const char name[FURI_HAL_VERSION_DEVICE_NAME_LENGTH]) {
furi_assert(profile < FuriHalBtProfileNumber);
furi_assert(name);
memcpy(&(profile_config[profile].config.adv_name[1]),
name, FURI_HAL_VERSION_DEVICE_NAME_LENGTH);
}
const char* furi_hal_bt_get_profile_adv_name(FuriHalBtProfile profile) {
furi_assert(profile < FuriHalBtProfileNumber);
return &(profile_config[profile].config.adv_name[1]);
}
void furi_hal_bt_set_profile_mac_addr(
FuriHalBtProfile profile,
const uint8_t mac_addr[GAP_MAC_ADDR_SIZE]) {
furi_assert(profile < FuriHalBtProfileNumber);
furi_assert(mac_addr);
memcpy(profile_config[profile].config.mac_address, mac_addr, GAP_MAC_ADDR_SIZE);
}
const uint8_t* furi_hal_bt_get_profile_mac_addr(FuriHalBtProfile profile) {
furi_assert(profile < FuriHalBtProfileNumber);
return profile_config[profile].config.mac_address;
}
+16 -2
View File
@@ -138,10 +138,11 @@ void furi_hal_bt_hid_start() {
if(!hid_svc_is_started()) {
hid_svc_start();
}
// Configure HID Keyboard
kb_report = malloc(sizeof(FuriHalBtHidKbReport));
mouse_report = malloc(sizeof(FuriHalBtHidMouseReport));
consumer_report = malloc(sizeof(FuriHalBtHidConsumerReport));
// Configure Report Map characteristic
hid_svc_update_report_map(
furi_hal_bt_hid_report_map_data, sizeof(furi_hal_bt_hid_report_map_data));
@@ -180,17 +181,30 @@ void furi_hal_bt_hid_stop() {
bool furi_hal_bt_hid_kb_press(uint16_t button) {
furi_assert(kb_report);
for(uint8_t i = 0; i < FURI_HAL_BT_HID_KB_MAX_KEYS; i++) {
uint8_t i;
for(i = 0; i < FURI_HAL_BT_HID_KB_MAX_KEYS; i++) {
if(kb_report->key[i] == 0) {
kb_report->key[i] = button & 0xFF;
break;
}
}
if(i == FURI_HAL_BT_HID_KB_MAX_KEYS) {
return false;
}
kb_report->mods |= (button >> 8);
return hid_svc_update_input_report(
ReportNumberKeyboard, (uint8_t*)kb_report, sizeof(FuriHalBtHidKbReport));
}
bool furi_hal_bt_hid_kb_free_slots(uint8_t n_empty_slots) {
furi_assert(kb_report);
for(uint8_t i = 0; n_empty_slots > 0 && i < FURI_HAL_BT_HID_KB_MAX_KEYS; i++) {
if(kb_report->key[i] == 0)
n_empty_slots--;
}
return (n_empty_slots == 0);
}
bool furi_hal_bt_hid_kb_release(uint16_t button) {
furi_assert(kb_report);
for(uint8_t i = 0; i < FURI_HAL_BT_HID_KB_MAX_KEYS; i++) {
@@ -224,6 +224,14 @@ uint32_t furi_hal_bt_get_transmitted_packets();
*/
bool furi_hal_bt_ensure_c2_mode(BleGlueC2Mode mode);
void furi_hal_bt_set_profile_adv_name(FuriHalBtProfile profile, const char name[FURI_HAL_VERSION_DEVICE_NAME_LENGTH]);
const char *furi_hal_bt_get_profile_adv_name(FuriHalBtProfile profile);
void furi_hal_bt_set_profile_mac_addr(FuriHalBtProfile profile, const uint8_t mac_addr[GAP_MAC_ADDR_SIZE]);
const uint8_t *furi_hal_bt_get_profile_mac_addr(FuriHalBtProfile profile);
#ifdef __cplusplus
}
#endif
@@ -86,6 +86,15 @@ bool furi_hal_bt_hid_consumer_key_release(uint16_t button);
*/
bool furi_hal_bt_hid_consumer_key_release_all();
/**
* @brief Check if keyboard buffer has free slots
*
* @param n_emptry_slots number of empty slots in buffer to consider buffer is not full
*
* @return true if there is enough free slots in buffer
*/
bool furi_hal_bt_hid_kb_free_slots(uint8_t n_empty_slots);
#ifdef __cplusplus
}
#endif