Restart BLE scan even if it's not stopped intentionally. 50/241950/1
authorDeokhyun Kim <dukan.kim@samsung.com>
Tue, 28 Jul 2020 05:05:25 +0000 (14:05 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Fri, 21 Aug 2020 05:27:36 +0000 (14:27 +0900)
 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 <dukan.kim@samsung.com>
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
bt-oal/bluez_hal/src/bt-hal-event-receiver.c
bt-oal/oal-gatt.c
bt-service/services/adapter/bt-service-core-adapter-le.c
bt-service/services/gatt/bt-service-gatt.c
bt-service/services/include/bt-service-core-adapter-le.h

index 037b04f..e88a1f6 100644 (file)
@@ -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);
index f5c11c2..f99fe74 100644 (file)
@@ -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
index c7e5d1b..0b6039a 100644 (file)
@@ -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;
index ad1e65c..be34125 100644 (file)
@@ -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);
        }
 
index fb37f5d..5d345c5 100644 (file)
@@ -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);