From 85e3d9d4c69b2891af1523b19da2d9d9704334d6 Mon Sep 17 00:00:00 2001 From: "injun.yang" Date: Mon, 4 Mar 2019 11:36:51 +0900 Subject: [PATCH] Fix : LE scanning malfunction [Model] All [BinType] AP [Customer] OPEN [Issue#] N/A [Request] Internal [Occurrence Version] N/A [Problem] APIs execute successfully without any errors, but LE scanning is not working [Cause & Measure] Before scan stopping is completed, application request LE scan again. After receive LEDiscoveryFinished event, trigger LE scanning again. [Checking Method] Call bt_adapter_le_start_scan() just after calling bt_adapter_le_stop_scan() [Team] IoT Hub [Developer] Injun Yang [Solution company] Samsung [Change Type] Specification change Change-Id: I4927f5ba75451bc6f3fb87d758d2f141cc0c2b8d Signed-off-by: injun.yang Signed-off-by: DoHyun Pyun --- bt-api/bt-adapter-le.c | 2 +- .../services/adapter/bt-service-core-adapter-le.c | 36 ++++++++++++++++++++-- bt-service/bt-service-adapter-le.c | 36 +++++++++++++++++----- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/bt-api/bt-adapter-le.c b/bt-api/bt-adapter-le.c index 8554da0..48c1e51 100644 --- a/bt-api/bt-adapter-le.c +++ b/bt-api/bt-adapter-le.c @@ -82,7 +82,7 @@ BT_EXPORT_API int bluetooth_disable_adapter_le(void) void _bt_set_le_scan_status(gboolean mode) { - BT_DBG("set LE scan mode : %d", mode); + BT_DBG("set LE scan mode : %d -> %d", is_le_scanning, mode); is_le_scanning = mode; } diff --git a/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c b/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c index 5818f2d..66ecf4a 100644 --- a/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c +++ b/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c @@ -91,6 +91,7 @@ typedef struct { char *sender; GSList *filter_list; gboolean is_scanning; + gboolean stop_pending; } bt_adapter_le_scanner_t; GSList *scanner_list = NULL; @@ -1483,6 +1484,14 @@ gboolean __send_le_scan_reply(gpointer data) return FALSE; } +static gboolean __start_le_scan_timeout(gpointer user_data) +{ + char *sender = (char *)user_data; + _bt_start_le_scan(sender); + + return FALSE; +} + int _bt_start_le_scan(const char *sender) { bt_adapter_le_scanner_t *scanner; @@ -1497,6 +1506,12 @@ int _bt_start_le_scan(const char *sender) scanner_list = g_slist_append(scanner_list, scanner); } + if (scanner->stop_pending == TRUE) { + BT_DBG("Waiting LEDiscoveryFinished"); + g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender); + return BLUETOOTH_ERROR_NONE; + } + if (scanner->is_scanning) { BT_ERR("BT is already in LE scanning"); return BLUETOOTH_ERROR_IN_PROGRESS; @@ -1535,16 +1550,18 @@ done: int _bt_stop_le_scan(const char *sender) { + bt_adapter_le_scanner_t *scan_sender; bt_adapter_le_scanner_t *scanner; gboolean next_scanning = FALSE; GSList *l; int ret; - scanner = __bt_find_scanner_from_list(sender); - if (scanner == NULL || scanner->is_scanning == FALSE) + scan_sender = __bt_find_scanner_from_list(sender); + if (scan_sender == NULL || scan_sender->is_scanning == FALSE) return BLUETOOTH_ERROR_NOT_IN_OPERATION; - scanner->is_scanning = FALSE; + scan_sender->is_scanning = FALSE; + scan_sender->stop_pending = TRUE; for (l = scanner_list; l != NULL; l = g_slist_next(l)) { scanner = l->data; @@ -1565,6 +1582,7 @@ int _bt_stop_le_scan(const char *sender) if (OAL_STATUS_SUCCESS != ret) { BT_ERR("gattc_start_le_discovery failed"); + scan_sender->stop_pending = FALSE; return BLUETOOTH_ERROR_INTERNAL; } @@ -1572,6 +1590,18 @@ int _bt_stop_le_scan(const char *sender) return BLUETOOTH_ERROR_NONE; } +void _bt_disable_all_scanner_status(void) +{ + GSList *l; + bt_adapter_le_scanner_t *scanner; + + for (l = scanner_list; l != NULL; l = g_slist_next(l)) { + scanner = l->data; + scanner->is_scanning = FALSE; + scanner->stop_pending = FALSE; + } +} + void _bt_check_le_scanner_app_termination(const char *sender) { bt_adapter_le_scanner_t *scanner; diff --git a/bt-service/bt-service-adapter-le.c b/bt-service/bt-service-adapter-le.c index d85f6bb..ff39a67 100644 --- a/bt-service/bt-service-adapter-le.c +++ b/bt-service/bt-service-adapter-le.c @@ -59,6 +59,7 @@ typedef struct { char *sender; GSList *filter_list; gboolean is_scanning; + gboolean stop_pending; } bt_adapter_le_scanner_t; static bluetooth_advertising_params_t adv_params = { @@ -1371,6 +1372,15 @@ int _bt_unregister_all_scan_filters(const char *sender) return BLUETOOTH_ERROR_NONE; } +static gboolean __start_le_scan_timeout(gpointer user_data) +{ + char *sender = (char *)user_data; + _bt_start_le_scan(sender); + + return FALSE; +} + + int _bt_start_le_scan(const char *sender) { GDBusProxy *proxy; @@ -1384,6 +1394,12 @@ int _bt_start_le_scan(const char *sender) scanner_list = g_slist_append(scanner_list, scanner); } + if (scanner->stop_pending == TRUE) { + BT_DBG("Waiting LEDiscoveryFinished"); + g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender); + return BLUETOOTH_ERROR_NONE; + } + if (scanner->is_scanning == TRUE) { BT_ERR("BT is already in LE scanning"); return BLUETOOTH_ERROR_IN_PROGRESS; @@ -1401,7 +1417,7 @@ int _bt_start_le_scan(const char *sender) G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error) { - BT_ERR("scan_filter_clear Fail: %s", error->message); + BT_ERR("scan_filter_enable Fail: %s", error->message); g_clear_error(&error); } @@ -1435,7 +1451,7 @@ int _bt_start_le_scan(const char *sender) G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error) { - BT_ERR("scan_filter_clear Fail: %s", error->message); + BT_ERR("scan_filter_enable Fail: %s", error->message); g_clear_error(&error); } @@ -1466,15 +1482,17 @@ int _bt_stop_le_scan(const char *sender) GDBusProxy *proxy; GError *error = NULL; GVariant *ret; - bt_adapter_le_scanner_t *scanner = __bt_find_scanner_from_list(sender); + bt_adapter_le_scanner_t *scan_sender = __bt_find_scanner_from_list(sender); + bt_adapter_le_scanner_t *scanner; GSList *l; gboolean next_scanning = FALSE; gboolean need_scan_filter = TRUE; - if (scanner == NULL || scanner->is_scanning == FALSE) + if (scan_sender == NULL || scan_sender->is_scanning == FALSE) return BLUETOOTH_ERROR_NOT_IN_OPERATION; - scanner->is_scanning = FALSE; + scan_sender->is_scanning = FALSE; + scan_sender->stop_pending = TRUE; for (l = scanner_list; l != NULL; l = g_slist_next(l)) { scanner = l->data; @@ -1496,7 +1514,7 @@ int _bt_stop_le_scan(const char *sender) -1, NULL, &error); if (error) { - BT_ERR("scan_filter_clear Fail: %s", error->message); + BT_ERR("scan_filter_enable Fail: %s", error->message); g_clear_error(&error); } @@ -1505,6 +1523,8 @@ int _bt_stop_le_scan(const char *sender) BT_INFO("Enable LE Scan Filter"); scan_filter_enabled = TRUE; } + BT_INFO("next_scanning exists. Keep the LE scanning"); + scan_sender->stop_pending = FALSE; return BLUETOOTH_ERROR_NONE; } else { if (scan_filter_enabled == TRUE) { @@ -1514,7 +1534,7 @@ int _bt_stop_le_scan(const char *sender) -1, NULL, &error); if (error) { - BT_ERR("scan_filter_clear Fail: %s", error->message); + BT_ERR("scan_filter_enable Fail: %s", error->message); g_clear_error(&error); } @@ -1549,6 +1569,7 @@ void _bt_disable_all_scanner_status(void) for (l = scanner_list; l != NULL; l = g_slist_next(l)) { scanner = l->data; scanner->is_scanning = FALSE; + scanner->stop_pending = FALSE; } } @@ -1574,6 +1595,7 @@ static void __bt_free_le_scanner(void) void _bt_set_le_scan_status(gboolean mode) { + BT_DBG("set is_le_scanning : %d -> %d", is_le_scanning, mode); is_le_scanning = mode; } -- 2.7.4