From fe79f32c0cb8508c376f11e547acf12703a521d3 Mon Sep 17 00:00:00 2001 From: Deokhyun Kim Date: Tue, 28 Jul 2020 14:05:25 +0900 Subject: [PATCH] Restart BLE scan even if it's not stopped intentionally. In case gatt is connected by local api or remote request, BLE scan is stopped unexpectedly & does not update it to api layer. BLE scan should be restarted internally, in case of unexpected stop. Change-Id: I8d7de20f37faacdfdebb16c87a6691fcb5af30a8 Signed-off-by: Deokhyun Kim Signed-off-by: Wootak Jung --- bt-oal/bluez_hal/src/bt-hal-event-receiver.c | 22 ---- bt-oal/oal-gatt.c | 4 +- .../services/adapter/bt-service-core-adapter-le.c | 119 ++++++++++++++++++--- bt-service/services/gatt/bt-service-gatt.c | 4 + .../services/include/bt-service-core-adapter-le.h | 4 + 5 files changed, 113 insertions(+), 40 deletions(-) diff --git a/bt-oal/bluez_hal/src/bt-hal-event-receiver.c b/bt-oal/bluez_hal/src/bt-hal-event-receiver.c index 037b04f..e88a1f6 100644 --- a/bt-oal/bluez_hal/src/bt-hal-event-receiver.c +++ b/bt-oal/bluez_hal/src/bt-hal-event-receiver.c @@ -412,8 +412,6 @@ static void __bt_hal_adapter_property_changed_event(GVariant *msg) } } else if (!g_strcmp0(key, "LEDiscovering")) { - GVariant *result; - is_le_discovering = g_variant_get_boolean(value); DBG("##LE Discovering = [%d]", is_le_discovering); @@ -425,26 +423,6 @@ static void __bt_hal_adapter_property_changed_event(GVariant *msg) continue; } - adapter_proxy = _bt_hal_get_adapter_proxy(); - if (adapter_proxy == NULL) { - ERR("adapter_proxy == NULL"); - continue; - } - - /* Need to stop searching */ - result = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery", - NULL, G_DBUS_CALL_FLAGS_NONE, - DBUS_TIMEOUT, NULL, &err); - if (!result) { - ERR("Error occured in Proxy call"); - if (err) { - ERR("(Error: %s)", err->message); - g_clear_error(&err); - } - } else { - g_variant_unref(result); - } - /* Send LE discovering finished event */ size += __bt_insert_hal_properties(buf + size, HAL_PROP_ADAPTER_LE_DISCOVERY_STOPPED, 0, NULL); diff --git a/bt-oal/oal-gatt.c b/bt-oal/oal-gatt.c index f5c11c2..f99fe74 100644 --- a/bt-oal/oal-gatt.c +++ b/bt-oal/oal-gatt.c @@ -1712,7 +1712,7 @@ oal_status_t gattc_stop_le_discovery(int client_id) int ret = OAL_STATUS_SUCCESS; - API_TRACE("Scan is stopped"); + API_TRACE("BTGATT CLIENT SCAN STOP"); CHECK_OAL_GATT_ENABLED(); CHECK_CLIENT_REGISTRATION(client_id); ret = gatt_api->client->scan(client_id, 0); @@ -1727,7 +1727,7 @@ oal_status_t gattc_set_le_scan_param(int scan_type, int itv, int win) { int ret; - API_TRACE("Scan is stopped"); + API_TRACE("GATT client set le scan param"); CHECK_OAL_GATT_ENABLED(); #ifdef TIZEN_BT_HAL diff --git a/bt-service/services/adapter/bt-service-core-adapter-le.c b/bt-service/services/adapter/bt-service-core-adapter-le.c index c7e5d1b..0b6039a 100644 --- a/bt-service/services/adapter/bt-service-core-adapter-le.c +++ b/bt-service/services/adapter/bt-service-core-adapter-le.c @@ -103,7 +103,9 @@ typedef struct { static GSList *scanner_list = NULL; static gboolean is_le_set_scan_parameter = FALSE; static gboolean is_le_scanning = FALSE; +static gboolean is_le_scan_hold = FALSE; static gboolean scan_filter_enabled = FALSE; +static gboolean scan_stop_requested = FALSE; static bluetooth_le_scan_params_t le_scan_params = { BT_LE_ACTIVE_SCAN, 0, 0 }; @@ -142,6 +144,15 @@ bt_le_status_t _bt_adapter_get_le_status(void) return adapter_le_state; } +void _bt_set_le_scan_stop_requested(gboolean request) +{ + scan_stop_requested = request; +} + +gboolean _bt_is_le_scan_stop_requested(void) +{ + return scan_stop_requested; +} /* Internal functions of core adapter service */ static void __bt_le_handle_pending_requests(int service_function, void *user_data, unsigned int size) @@ -1028,6 +1039,16 @@ static void __bt_le_event_handler(int event_type, gpointer event_data) break; } + if (_bt_is_le_scan_stop_requested() == FALSE) { + int ret = gattc_start_le_discovery(g_gatt_client_id); + if (OAL_STATUS_SUCCESS != ret) + BT_ERR("gattc_start_le_discovery failed"); + break; + } + + _bt_set_le_scan_stop_requested(FALSE); + if (is_le_scan_hold == TRUE) + break; __bt_set_le_scan_status(FALSE); _bt_disable_all_scanner_status(); __bt_adapter_le_handle_pending_request_info( @@ -1805,8 +1826,6 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params) return _bt_convert_oal_status_to_bt_error(ret); } - is_le_set_scan_parameter = TRUE; - BT_INFO("Set scan parameters inteval %f, win %f, type %d", itv * BT_SCAN_INTERVAL_SPLIT, win * BT_SCAN_INTERVAL_SPLIT, params->type); @@ -2035,13 +2054,12 @@ int _bt_start_le_scan(const char *sender, uid_t uid, pid_t pid) } else { if (is_le_set_scan_parameter == FALSE) { /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */ - bluetooth_le_scan_params_t scan_params; - scan_params.type = BT_LE_ACTIVE_SCAN; - scan_params.interval = 5120; - scan_params.window = 512; - _bt_set_scan_parameters(&scan_params); - } else - _bt_set_scan_parameters(&le_scan_params); + le_scan_params.type = BT_LE_ACTIVE_SCAN; + le_scan_params.interval = 5120; + le_scan_params.window = 512; + is_le_set_scan_parameter = TRUE; + } + _bt_set_scan_parameters(&le_scan_params); /* Enable scan filter if filter is exisiting */ if (scanner->filter_list == NULL) { @@ -2060,10 +2078,16 @@ int _bt_start_le_scan(const char *sender, uid_t uid, pid_t pid) if (OAL_STATUS_SUCCESS != ret) { BT_ERR("gattc_start_le_discovery failed"); - return _bt_convert_oal_status_to_bt_error(ret); + goto fail; } return BLUETOOTH_ERROR_NONE; + +fail: + _bt_unregister_all_scan_filters(sender); + scanner_list = g_slist_remove(scanner_list, scanner); + __bt_free_le_scanner(scanner); + return BLUETOOTH_ERROR_INTERNAL; } int _bt_stop_le_scan(const char *sender) @@ -2097,12 +2121,20 @@ int _bt_stop_le_scan(const char *sender) g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value); result = BLUETOOTH_ERROR_NONE; } else { - BT_INFO("Just stop LE scan"); - ret = gattc_stop_le_discovery(g_gatt_client_id); - - if (OAL_STATUS_SUCCESS != ret) { - BT_ERR("gattc_start_le_discovery failed"); - result = _bt_convert_oal_status_to_bt_error(ret); + if (is_le_scan_hold == TRUE) { + BT_INFO("Just remove LE scan hold info"); + _bt_set_le_scan_stop_requested(FALSE); + is_le_scan_hold = FALSE; + result = BLUETOOTH_ERROR_INTERNAL; + } else { + BT_INFO("Just stop LE scan"); + ret = gattc_stop_le_discovery(g_gatt_client_id); + if (OAL_STATUS_SUCCESS == ret) { + _bt_set_le_scan_stop_requested(TRUE); + } else { + BT_ERR("gattc_stop_le_discovery failed"); + result = BLUETOOTH_ERROR_INTERNAL; + } } // TODO: Disable scan filter @@ -2121,6 +2153,61 @@ int _bt_stop_le_scan(const char *sender) return result; } +void _bt_hold_le_scan(void) +{ + int ret; + + if (_bt_is_le_scanning() == FALSE) + return; + + BT_INFO("Hold le scan"); + + ret = gattc_stop_le_discovery(g_gatt_client_id); + if (OAL_STATUS_SUCCESS == ret) { + _bt_set_le_scan_stop_requested(TRUE); + is_le_scan_hold = TRUE; + } else + BT_ERR("gattc_stop_le_discovery failed"); + + if (scan_filter_enabled == TRUE) { + ret = gattc_disable_scan_filter(0); + if (ret != OAL_STATUS_SUCCESS) + BT_ERR("gattc_disable_scan_filter failed"); + } +} + +void _bt_restart_le_scan(void) +{ + int ret; + + if (is_le_scan_hold == FALSE) + return; + is_le_scan_hold = FALSE; + if (_bt_is_le_scanning() == FALSE) + return; + + BT_INFO("Restart le scan"); + + if (is_le_set_scan_parameter == FALSE) { + /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */ + le_scan_params.type = BT_LE_ACTIVE_SCAN; + le_scan_params.interval = 5120; + le_scan_params.window = 512; + is_le_set_scan_parameter = TRUE; + } + _bt_set_scan_parameters(&le_scan_params); + + if (scan_filter_enabled == TRUE) { + ret = gattc_enable_scan_filter(0); + if (ret != OAL_STATUS_SUCCESS) + BT_ERR("gattc_enable_scan_filter failed"); + } + + ret = gattc_start_le_discovery(g_gatt_client_id); + if (OAL_STATUS_SUCCESS != ret) + BT_ERR("gattc_start_le_discovery failed"); +} + static void _bt_disable_all_scanner_status(void) { GSList *l; diff --git a/bt-service/services/gatt/bt-service-gatt.c b/bt-service/services/gatt/bt-service-gatt.c index ad1e65c..be34125 100644 --- a/bt-service/services/gatt/bt-service-gatt.c +++ b/bt-service/services/gatt/bt-service-gatt.c @@ -3078,6 +3078,8 @@ static void __bt_handle_client_connected(event_gattc_conn_t *event_data) outgoing_gatt_conn_list = g_slist_remove(outgoing_gatt_conn_list, out_conn_info); g_free(out_conn_info->addr); g_free(out_conn_info); + + _bt_restart_le_scan(); } g_free(address); } @@ -4179,6 +4181,7 @@ int _bt_connect_le_device(bluetooth_device_address_t *address, } /* TODO Check Requirement of holding Advertisement before initiating LE connect */ + _bt_hold_le_scan(); /* Check if app sent 0 client id for connection, in such case, use default gatt client ID */ if (client_id == 0) { @@ -4193,6 +4196,7 @@ int _bt_connect_le_device(bluetooth_device_address_t *address, if (ret != OAL_STATUS_SUCCESS) { BT_ERR("gattc_connect is failed. ret: %d", ret); g_free(addr); + _bt_restart_le_scan(); return _bt_convert_oal_status_to_bt_error(ret); } diff --git a/bt-service/services/include/bt-service-core-adapter-le.h b/bt-service/services/include/bt-service-core-adapter-le.h index fb37f5d..5d345c5 100644 --- a/bt-service/services/include/bt-service-core-adapter-le.h +++ b/bt-service/services/include/bt-service-core-adapter-le.h @@ -86,6 +86,10 @@ int _bt_start_le_scan(const char *sender, uid_t uid, pid_t pid); int _bt_stop_le_scan(const char *sender); +void _bt_hold_le_scan(void); + +void _bt_restart_le_scan(void); + int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params); int _bt_prepare_scan_parameters(bluetooth_le_scan_params_t *params, int scan_type); -- 2.7.4