};
typedef struct {
+ int adv_inst_max;
+ int rpa_offloading;
+ int max_filter;
+ int le_2m_phy;
+ int le_coded_phy;
+} bt_adapter_le_feature_info_t;
+
+/* Set Default values */
+static bt_adapter_le_feature_info_t le_feature_info = {1, 0, 0, 0, 0};
+
+typedef struct {
int adv_handle;
char *sender;
int data_len;
GSList *scanner_list = NULL;
static gboolean is_le_set_scan_parameter = FALSE;
static gboolean is_le_scanning = FALSE;
+
+static int g_gatt_client_id = 0;
+
/******************************************* LE Scan *********************************************/
void _bt_adapter_set_le_status(bt_le_status_t status)
invocation_info_t *req_info = NULL;
BT_DBG("+");
- for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
+ for (l = _bt_get_invocation_list(); l != NULL; ) {
req_info = l->data;
+ l = g_slist_next(l);
if (req_info == NULL || req_info->service_function != service_function)
continue;
/* Get sender and adv handle for the server instance */
_bt_get_adv_handle_from_instance(data->server_inst, &adv_handle);
- if (adv_handle > 0) {
/* Check if pending Adv Data set or Scan response data set request is pending*/
for (l = adv_data_pending_list; l != NULL; l = l->next) {
info = l->data;
(void*)info, sizeof(bt_pending_adv_data_set_t));
}
goto data_free;
- }
}
}
}
}
case OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED: {
BT_INFO("OAL Event: Server Instance Registered");
- event_gatts_register_t* event = g_memdup(event_data, sizeof(event_gatts_register_t));
- /* GATT Server Registered event is handled in MAIN thread context */
- __bt_le_handle_server_instance_registered(event);
+ __bt_le_handle_server_instance_registered((event_gatts_register_t *)event_data);
break;
}
case OAL_EVENT_BLE_ADVERTISING_STARTED: {
}
case OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE: {
BT_INFO("OAL Event: Advertising Enabled");
- event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
- sizeof(event_ble_multiadv_status));
- __bt_le_multi_advertising_enabled(event);
+ __bt_le_multi_advertising_enabled((event_ble_multiadv_status *)event_data);
break;
}
case OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE: {
BT_INFO("OAL Event: Advertising Disabled");
- event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
- sizeof(event_ble_multiadv_status));
- __bt_le_multi_advertising_disabled(event);
+ __bt_le_multi_advertising_disabled((event_ble_multiadv_status *)event_data);
break;
}
case OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA: {
BT_INFO("OAL Event: Advertising Data set successfully");
- event_ble_multiadv_status* event = (event_ble_multiadv_status*)g_memdup(event_data,
- sizeof(event_ble_multiadv_status));
- __bt_le_multi_advertising_set_data(event);
+ __bt_le_multi_advertising_set_data((event_ble_multiadv_status *)event_data);
break;
}
case OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE: {
__bt_le_handle_device_found(scan_result);
break;
}
+ case OAL_EVENT_GATTC_REGISTRATION: {
+ event_gattc_register_t *gattc_event = event_data;
+ char uuid_str[BLUETOOTH_UUID_STRING_MAX];
+ char *default_uuid_string;
+
+ default_uuid_string = _bt_gatt_get_default_gatt_client_uuid();
+ _bt_uuid_to_string((service_uuid_t*)&(gattc_event->client_uuid), uuid_str);
+ BT_INFO("default UUID [%s] current registered uuid [%s]",
+ default_uuid_string, uuid_str);
+ if (g_strcmp0(uuid_str, default_uuid_string)) {
+ BT_INFO("This is not the default GATT client that is registered");
+
+ g_free(default_uuid_string);
+ break;
+ }
+ BT_INFO("GATT CLient instance registered is default client: ID [%d]",
+ gattc_event->client_if);
+ g_free(default_uuid_string);
+
+ g_gatt_client_id = gattc_event->client_if;
+ break;
+ }
+ case OAL_EVENT_BLE_LOCAL_FEATURES: {
+ event_adapter_le_features_t *le_features = event_data;
+
+ le_feature_info.le_2m_phy = le_features->le_2m_phy_support;
+ le_feature_info.le_coded_phy = le_features->le_coded_phy_support;
+
+ BT_INFO("Adapter LE 2M PHY Support [%s]", le_feature_info.le_2m_phy ? "TRUE" : "FALSE");
+ BT_INFO("Adapter LE CODED PHY Support [%s]", le_feature_info.le_coded_phy ? "TRUE" : "FALSE");
+
+ break;
+ }
default:
break;
}
}
_bt_get_previous_adv_data(adv, length, server_instance);
- BT_DBG("ADV Data length [%d] Server Instance [%d] Adv handle [%d]", length, server_instance, adv_handle);
+ BT_DBG("ADV Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
return BLUETOOTH_ERROR_NONE;
}
}
_bt_get_previous_scan_rsp_data(response, length, server_instance);
- BT_DBG("SCAN RSP Data length [%d] Server Instance [%d] Adv handle [%d]", length, server_instance, adv_handle);
+ BT_DBG("SCAN RSP Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
return BLUETOOTH_ERROR_NONE;
}
BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
param);
}
+
+ g_free(old_mdata);
}
/* Time to update new ADV data completely in Table */
BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
param);
}
+
+ g_free(old_mdata);
}
/* Time to update new Scan Response data completely in Table */
gboolean __send_le_scan_reply(gpointer data)
{
- int value = (int)data;
+ int value = (intptr_t)data;
if (0 == value) {
BT_DBG("Send reply to BT_STOP_LE_DISCOVERY");
int value = 1;
BT_INFO("LE Full Scan is already on progress");
- g_idle_add(__send_le_scan_reply, (void *)value);
+ g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
goto done;
}
}
BT_INFO("Start LE Full Scan");
- ret = gattc_start_le_discovery();
+ ret = gattc_start_le_discovery(g_gatt_client_id);
+
if (OAL_STATUS_SUCCESS != ret) {
BT_ERR("gattc_start_le_discovery failed");
return BLUETOOTH_ERROR_INTERNAL;
if (next_scanning == TRUE) {
int value = 0;
- g_idle_add(__send_le_scan_reply, (void *)value);
+ g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
return BLUETOOTH_ERROR_NONE;
} else {
BT_INFO("Just stop LE scan");
}
- ret = gattc_stop_le_discovery();
+ ret = gattc_stop_le_discovery(g_gatt_client_id);
+
if (OAL_STATUS_SUCCESS != ret) {
BT_ERR("gattc_start_le_discovery failed");
return BLUETOOTH_ERROR_INTERNAL;
le_deinit();
}
+int _bt_is_advertising(void)
+{
+ int ret = is_advertising();
+
+ if (ret == BLUETOOTH_ERROR_NONE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+gboolean _bt_is_le_2m_phy_supported(void)
+{
+ if (le_feature_info.le_2m_phy)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+gboolean _bt_is_le_coded_phy_supported(void)
+{
+ if (le_feature_info.le_coded_phy)
+ return TRUE;
+ else
+ return FALSE;
+}
+
/*************************************** LE Scan APIs *********************************************/