mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-16 08:42:28 +00:00
add helper hci_le_advertisements_set_params function to avoid call to sm from hci, gap ddvertisement control complete
This commit is contained in:
parent
9cc64000ad
commit
45c102fdda
11
ble/gap_le.h
11
ble/gap_le.h
@ -76,15 +76,16 @@ gap_random_address_type_t gap_random_address_get_mode(void);
|
|||||||
* @param supervision_timeout (unit: 10ms)
|
* @param supervision_timeout (unit: 10ms)
|
||||||
* @returns 0 if ok
|
* @returns 0 if ok
|
||||||
*/
|
*/
|
||||||
void gap_update_connection_parameters(hci_con_handle_t con_handle, uint16_t conn_interval_min,
|
int gap_update_connection_parameters(hci_con_handle_t con_handle, uint16_t conn_interval_min,
|
||||||
uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout);
|
uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set Advertisement Data
|
* @brief Set Advertisement Data
|
||||||
* @param advertisement date (31 octets)
|
* @param advertising_data_length
|
||||||
|
* @param advertising_data (max 31 octets)
|
||||||
* @note data is not copied, pointer has to stay valid
|
* @note data is not copied, pointer has to stay valid
|
||||||
*/
|
*/
|
||||||
void gap_advertisements_set_data(uint8_t * adv_data);
|
void gap_advertisements_set_data(uint8_t advertising_data_length, uint8_t * advertising_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set Advertisement Paramters
|
* @brief Set Advertisement Paramters
|
||||||
|
20
ble/sm.c
20
ble/sm.c
@ -350,6 +350,7 @@ static void gap_random_address_update_stop(void){
|
|||||||
run_loop_remove_timer(&gap_random_address_update_timer);
|
run_loop_remove_timer(&gap_random_address_update_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void sm_random_start(sm_connection_t * sm_conn){
|
static void sm_random_start(sm_connection_t * sm_conn){
|
||||||
sm_random_connection_source = sm_conn;
|
sm_random_connection_source = sm_conn;
|
||||||
hci_send_cmd(&hci_le_rand);
|
hci_send_cmd(&hci_le_rand);
|
||||||
@ -2203,3 +2204,22 @@ void gap_random_address_set_update_period(int period_ms){
|
|||||||
gap_random_address_update_stop();
|
gap_random_address_update_stop();
|
||||||
gap_random_address_update_start();
|
gap_random_address_update_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set Advertisement Paramters
|
||||||
|
* @param adv_int_min
|
||||||
|
* @param adv_int_max
|
||||||
|
* @param adv_type
|
||||||
|
* @param direct_address_type
|
||||||
|
* @param direct_address
|
||||||
|
* @param channel_map
|
||||||
|
* @param filter_policy
|
||||||
|
*
|
||||||
|
* @note own_address_type is used from gap_random_address_set_mode
|
||||||
|
*/
|
||||||
|
void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
|
||||||
|
uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy){
|
||||||
|
hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type, gap_random_adress_type,
|
||||||
|
direct_address_typ, direct_address, channel_map, filter_policy);
|
||||||
|
}
|
||||||
|
|
||||||
|
100
src/hci.c
100
src/hci.c
@ -47,6 +47,10 @@
|
|||||||
#include "hci.h"
|
#include "hci.h"
|
||||||
#include "gap.h"
|
#include "gap.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_BLE
|
||||||
|
#include "gap_le.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -2091,8 +2095,8 @@ void hci_run(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_BLE
|
#ifdef HAVE_BLE
|
||||||
// handle le scan
|
|
||||||
if (hci_stack->state == HCI_STATE_WORKING){
|
if (hci_stack->state == HCI_STATE_WORKING){
|
||||||
|
// handle le scan
|
||||||
switch(hci_stack->le_scanning_state){
|
switch(hci_stack->le_scanning_state){
|
||||||
case LE_START_SCAN:
|
case LE_START_SCAN:
|
||||||
hci_stack->le_scanning_state = LE_SCANNING;
|
hci_stack->le_scanning_state = LE_SCANNING;
|
||||||
@ -2113,6 +2117,36 @@ void hci_run(void){
|
|||||||
hci_send_cmd(&hci_le_set_scan_parameters, scan_type, hci_stack->le_scan_interval, hci_stack->le_scan_window, hci_stack->adv_addr_type, 0);
|
hci_send_cmd(&hci_le_set_scan_parameters, scan_type, hci_stack->le_scan_interval, hci_stack->le_scan_window, hci_stack->adv_addr_type, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// le advertisement control
|
||||||
|
if (hci_stack->le_advertisements_todo & LE_ADVERTISEMENT_TASKS_DISABLE){
|
||||||
|
hci_stack->le_advertisements_todo &= ~LE_ADVERTISEMENT_TASKS_DISABLE;
|
||||||
|
hci_send_cmd(&hci_le_set_advertise_enable, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (hci_stack->le_advertisements_todo & LE_ADVERTISEMENT_TASKS_SET_PARAMS){
|
||||||
|
hci_stack->le_advertisements_todo &= ~LE_ADVERTISEMENT_TASKS_SET_PARAMS;
|
||||||
|
hci_send_cmd(&hci_le_set_advertising_parameters,
|
||||||
|
hci_stack->le_advertisements_interval_min,
|
||||||
|
hci_stack->le_advertisements_interval_max,
|
||||||
|
hci_stack->le_advertisements_type,
|
||||||
|
hci_stack->le_advertisements_own_address_type,
|
||||||
|
hci_stack->le_advertisements_direct_address_type,
|
||||||
|
hci_stack->le_advertisements_direct_address,
|
||||||
|
hci_stack->le_advertisements_channel_map,
|
||||||
|
hci_stack->le_advertisements_filter_policy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (hci_stack->le_advertisements_todo & LE_ADVERTISEMENT_TASKS_SET_DATA){
|
||||||
|
hci_stack->le_advertisements_todo &= ~LE_ADVERTISEMENT_TASKS_SET_DATA;
|
||||||
|
hci_send_cmd(&hci_le_set_advertising_data, hci_stack->le_advertisements_data_len,
|
||||||
|
hci_stack->le_advertisements_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (hci_stack->le_advertisements_todo & LE_ADVERTISEMENT_TASKS_ENABLE){
|
||||||
|
hci_stack->le_advertisements_todo &= ~LE_ADVERTISEMENT_TASKS_ENABLE;
|
||||||
|
hci_send_cmd(&hci_le_set_advertise_enable, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2926,6 +2960,70 @@ int gap_update_connection_parameters(hci_con_handle_t con_handle, uint16_t conn_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set Advertisement Data
|
||||||
|
* @param advertising_data_length
|
||||||
|
* @param advertising_data (max 31 octets)
|
||||||
|
* @note data is not copied, pointer has to stay valid
|
||||||
|
*/
|
||||||
|
void gap_advertisements_set_data(uint8_t advertising_data_length, uint8_t * advertising_data){
|
||||||
|
hci_stack->le_advertisements_data_len = advertising_data_length;
|
||||||
|
hci_stack->le_advertisements_data = advertising_data;
|
||||||
|
hci_stack->le_advertisements_todo |= LE_ADVERTISEMENT_TASKS_SET_DATA;
|
||||||
|
// disable advertisements before setting data
|
||||||
|
if (hci_stack->le_advertisements_enabled){
|
||||||
|
hci_stack->le_advertisements_todo |= LE_ADVERTISEMENT_TASKS_DISABLE | LE_ADVERTISEMENT_TASKS_ENABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set Advertisement Parameters
|
||||||
|
* @param adv_int_min
|
||||||
|
* @param adv_int_max
|
||||||
|
* @param adv_type
|
||||||
|
* @param own_address_type
|
||||||
|
* @param direct_address_type
|
||||||
|
* @param direct_address
|
||||||
|
* @param channel_map
|
||||||
|
* @param filter_policy
|
||||||
|
*
|
||||||
|
* @note internal use. use gap_advertisements_set_params from gap_le.h instead.
|
||||||
|
*/
|
||||||
|
void hci_le_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
|
||||||
|
uint8_t own_address_type, uint8_t direct_address_typ, bd_addr_t direct_address,
|
||||||
|
uint8_t channel_map, uint8_t filter_policy) {
|
||||||
|
|
||||||
|
hci_stack->le_advertisements_interval_min = adv_int_min;
|
||||||
|
hci_stack->le_advertisements_interval_max = adv_int_max;
|
||||||
|
hci_stack->le_advertisements_type = adv_type;
|
||||||
|
hci_stack->le_advertisements_own_address_type = own_address_type;
|
||||||
|
hci_stack->le_advertisements_direct_address_type = direct_address_typ;
|
||||||
|
hci_stack->le_advertisements_channel_map = channel_map;
|
||||||
|
hci_stack->le_advertisements_filter_policy = filter_policy;
|
||||||
|
memcpy(hci_stack->le_advertisements_direct_address, direct_address, 6);
|
||||||
|
|
||||||
|
hci_stack->le_advertisements_todo |= LE_ADVERTISEMENT_TASKS_SET_PARAMS;
|
||||||
|
// disable advertisements before changing params
|
||||||
|
if (hci_stack->le_advertisements_enabled){
|
||||||
|
hci_stack->le_advertisements_todo |= LE_ADVERTISEMENT_TASKS_DISABLE | LE_ADVERTISEMENT_TASKS_ENABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable/Disable Advertisements
|
||||||
|
* @param enabled
|
||||||
|
*/
|
||||||
|
void gap_advertisements_enable(int enabled){
|
||||||
|
hci_stack->le_advertisements_enabled = enabled;
|
||||||
|
if (enabled && !hci_stack->le_advertisements_active){
|
||||||
|
hci_stack->le_advertisements_todo |= LE_ADVERTISEMENT_TASKS_ENABLE;
|
||||||
|
}
|
||||||
|
if (!enabled && hci_stack->le_advertisements_active){
|
||||||
|
hci_stack->le_advertisements_todo |= LE_ADVERTISEMENT_TASKS_DISABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
le_command_status_t gap_disconnect(hci_con_handle_t handle){
|
le_command_status_t gap_disconnect(hci_con_handle_t handle){
|
||||||
hci_connection_t * conn = hci_connection_for_handle(handle);
|
hci_connection_t * conn = hci_connection_for_handle(handle);
|
||||||
if (!conn){
|
if (!conn){
|
||||||
|
37
src/hci.h
37
src/hci.h
@ -587,6 +587,12 @@ typedef enum hci_init_state{
|
|||||||
|
|
||||||
} hci_substate_t;
|
} hci_substate_t;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
LE_ADVERTISEMENT_TASKS_DISABLE = 1 << 0,
|
||||||
|
LE_ADVERTISEMENT_TASKS_SET_DATA = 1 << 1,
|
||||||
|
LE_ADVERTISEMENT_TASKS_SET_PARAMS = 1 << 2,
|
||||||
|
LE_ADVERTISEMENT_TASKS_ENABLE = 1 << 0,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* main data structure
|
* main data structure
|
||||||
@ -682,7 +688,21 @@ typedef struct {
|
|||||||
|
|
||||||
le_connection_parameter_range_t le_connection_parameter_range;
|
le_connection_parameter_range_t le_connection_parameter_range;
|
||||||
|
|
||||||
|
uint8_t * le_advertisements_data;
|
||||||
|
uint8_t le_advertisements_data_len;
|
||||||
|
|
||||||
uint8_t le_advertisements_active;
|
uint8_t le_advertisements_active;
|
||||||
|
uint8_t le_advertisements_enabled;
|
||||||
|
uint8_t le_advertisements_todo;
|
||||||
|
|
||||||
|
uint16_t le_advertisements_interval_min;
|
||||||
|
uint16_t le_advertisements_interval_max;
|
||||||
|
uint8_t le_advertisements_type;
|
||||||
|
uint8_t le_advertisements_own_address_type;
|
||||||
|
uint8_t le_advertisements_direct_address_type;
|
||||||
|
uint8_t le_advertisements_channel_map;
|
||||||
|
uint8_t le_advertisements_filter_policy;
|
||||||
|
bd_addr_t le_advertisements_direct_address;
|
||||||
|
|
||||||
// custom BD ADDR
|
// custom BD ADDR
|
||||||
bd_addr_t custom_bd_addr;
|
bd_addr_t custom_bd_addr;
|
||||||
@ -874,6 +894,23 @@ void hci_set_hardware_error_callback(void (*fn)(void));
|
|||||||
|
|
||||||
/* API_END */
|
/* API_END */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set Advertisement Parameters
|
||||||
|
* @param adv_int_min
|
||||||
|
* @param adv_int_max
|
||||||
|
* @param adv_type
|
||||||
|
* @param own_address_type
|
||||||
|
* @param direct_address_type
|
||||||
|
* @param direct_address
|
||||||
|
* @param channel_map
|
||||||
|
* @param filter_policy
|
||||||
|
*
|
||||||
|
* @note internal use. use gap_advertisements_set_params from gap_le.h instead.
|
||||||
|
*/
|
||||||
|
void hci_le_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
|
||||||
|
uint8_t own_address_type, uint8_t direct_address_typ, bd_addr_t direct_address,
|
||||||
|
uint8_t channel_map, uint8_t filter_policy);
|
||||||
|
|
||||||
#if defined __cplusplus
|
#if defined __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user