diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index f02007682..da2381e8e 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1117,6 +1117,7 @@ Function,+,furi_hal_bt_serial_set_rpc_status,void,FuriHalBtSerialRpcStatus 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_custom_adv_data,void,"const uint8_t*, size_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[( 18 + 1 )]" Function,+,furi_hal_bt_set_profile_mac_addr,void,"FuriHalBtProfile, const uint8_t[( 6 )]" @@ -1704,6 +1705,7 @@ Function,-,gammaf_r,float,"float, int*" Function,-,gap_get_remote_conn_rssi,uint32_t,int8_t* Function,-,gap_get_state,GapState, Function,-,gap_init,_Bool,"GapConfig*, GapEventCallback, void*" +Function,-,gap_set_custom_adv_data,void,"size_t, const uint8_t*" Function,-,gap_start_advertising,void, Function,-,gap_stop_advertising,void, Function,-,gap_thread_stop,void, diff --git a/firmware/targets/f7/ble_glue/gap.c b/firmware/targets/f7/ble_glue/gap.c index 6a675f5c4..041fb0fdb 100644 --- a/firmware/targets/f7/ble_glue/gap.c +++ b/firmware/targets/f7/ble_glue/gap.c @@ -37,6 +37,9 @@ typedef struct { FuriThread* thread; FuriMessageQueue* command_queue; bool enable_adv; + + size_t custom_adv_len; + const uint8_t* custom_adv_data; } Gap; typedef enum { @@ -431,20 +434,28 @@ static void gap_advertise_start(GapState new_state) { } } // Configure advertising - status = aci_gap_set_discoverable( - ADV_IND, - min_interval, - max_interval, - CFG_IDENTITY_ADDRESS, - 0, - strlen(gap->service.adv_name), - (uint8_t*)gap->service.adv_name, - gap->service.adv_svc_uuid_len, - gap->service.adv_svc_uuid, - 0, - 0); + if(gap->custom_adv_data) { + status = aci_gap_set_discoverable( + ADV_IND, min_interval, max_interval, CFG_IDENTITY_ADDRESS, 0, 0, NULL, 0, NULL, 0, 0); + status = aci_gap_update_adv_data(gap->custom_adv_len, gap->custom_adv_data); + } else { + status = aci_gap_set_discoverable( + ADV_IND, + min_interval, + max_interval, + CFG_IDENTITY_ADDRESS, + 0, + strlen(gap->service.adv_name), + (uint8_t*)gap->service.adv_name, + gap->service.adv_svc_uuid_len, + gap->service.adv_svc_uuid, + 0, + 0); + } if(status) { FURI_LOG_E(TAG, "set_discoverable failed %d", status); + } else { + FURI_LOG_D(TAG, "set_discoverable success"); } gap->state = new_state; GapEvent event = {.type = GapEventTypeStartAdvertising}; @@ -560,6 +571,11 @@ uint32_t gap_get_remote_conn_rssi(int8_t* rssi) { return 0; } +void gap_set_custom_adv_data(size_t adv_len, const uint8_t* adv_data) { + gap->custom_adv_len = adv_len; + gap->custom_adv_data = adv_data; +} + GapState gap_get_state() { GapState state; if(gap) { diff --git a/firmware/targets/f7/ble_glue/gap.h b/firmware/targets/f7/ble_glue/gap.h index 7b317e06c..721b4c778 100644 --- a/firmware/targets/f7/ble_glue/gap.h +++ b/firmware/targets/f7/ble_glue/gap.h @@ -83,6 +83,8 @@ void gap_thread_stop(); uint32_t gap_get_remote_conn_rssi(int8_t* rssi); +void gap_set_custom_adv_data(size_t adv_len, const uint8_t* adv_data); + #ifdef __cplusplus } #endif diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 51866e402..83505fdb5 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -483,6 +483,12 @@ uint32_t furi_hal_bt_get_conn_rssi(uint8_t* rssi) { return since; } +void furi_hal_bt_set_custom_adv_data(const uint8_t* adv_data, size_t adv_len) { + gap_set_custom_adv_data(adv_len, adv_data); + furi_hal_bt_stop_advertising(); + furi_hal_bt_start_advertising(); +} + void furi_hal_bt_reverse_mac_addr(uint8_t mac_addr[GAP_MAC_ADDR_SIZE]) { uint8_t tmp; for(size_t i = 0; i < GAP_MAC_ADDR_SIZE / 2; i++) { diff --git a/firmware/targets/furi_hal_include/furi_hal_bt.h b/firmware/targets/furi_hal_include/furi_hal_bt.h index 21df2cf92..ed7519b39 100644 --- a/firmware/targets/furi_hal_include/furi_hal_bt.h +++ b/firmware/targets/furi_hal_include/furi_hal_bt.h @@ -251,6 +251,8 @@ const uint8_t* furi_hal_bt_get_profile_mac_addr(FuriHalBtProfile profile); uint32_t furi_hal_bt_get_conn_rssi(uint8_t* rssi); +void furi_hal_bt_set_custom_adv_data(const uint8_t* adv_data, size_t adv_len); + void furi_hal_bt_set_profile_pairing_method(FuriHalBtProfile profile, GapPairing pairing_method); GapPairing furi_hal_bt_get_profile_pairing_method(FuriHalBtProfile profile);