Support LE passive scan 44/213844/1
authorinjun.yang <injun.yang@samsung.com>
Thu, 22 Aug 2019 10:07:46 +0000 (19:07 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 16 Sep 2019 00:05:18 +0000 (09:05 +0900)
[Model] All
[BinType] AP
[Customer] OPEN

[Issue#] N/A
[Request] Internal
[Occurrence Version] N/A

[Problem] n/a
[Cause & Measure] Support LE passive scan
[Checking Method] set scan type > scan

[Team] Convergence BT
[Developer] Injun Yang
[Solution company] Samsung
[Change Type] Specification change

Change-Id: I77477742886f96523dd8a44471dfc86c6fd0870b
Signed-off-by: injun.yang <injun.yang@samsung.com>
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
bt-api/bt-adapter-le.c
bt-api/bt-common.c
bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/include/bt-service-core-adapter-le.h
bt-service/bt-request-handler.c
bt-service/bt-service-adapter-le.c
bt-service/bt-service-common.c
bt-service/include/bt-service-adapter-le.h
include/bluetooth-api.h
include/bt-internal-types.h

index 45fab9c..96af979 100644 (file)
@@ -458,6 +458,25 @@ BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *para
        return result;
 }
 
+BT_EXPORT_API int bluetooth_set_scan_type(bluetooth_le_scan_type_t scan_type)
+{
+       int result;
+
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, &scan_type, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_TYPE,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
 {
        int result;
index 6636577..bfeb4dd 100644 (file)
@@ -474,6 +474,7 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_GET_ADVERTISING_DATA, "BT_GET_ADVERTISING_DATA"},
                {BT_SET_ADVERTISING_DATA, "BT_SET_ADVERTISING_DATA"},
                {BT_SET_SCAN_PARAMETERS, "BT_SET_SCAN_PARAMETERS"},
+               {BT_SET_SCAN_TYPE, "BT_SET_SCAN_TYPE"},
                {BT_GET_SCAN_RESPONSE_DATA, "BT_GET_SCAN_RESPONSE_DATA"},
                {BT_SET_SCAN_RESPONSE_DATA, "BT_SET_SCAN_RESPONSE_DATA"},
                {BT_IS_ADVERTISING, "BT_IS_ADVERTISING"},
index f8cc07b..1e638a3 100644 (file)
@@ -45,6 +45,7 @@
 #define BT_ADV_DEFAULT_TIMEOUT 0
 #define BT_ADV_DEFAULT_TX_POWER 4
 #define BT_ADV_DEFAULT_CHANNEL_MAP 0
+#define BT_SCAN_INTERVAL_SPLIT 0.625
 
 static const char BASE_UUID_CONVERTED[BT_UUID_128] = {
        0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
@@ -98,6 +99,8 @@ GSList *scanner_list = NULL;
 static gboolean is_le_set_scan_parameter = FALSE;
 static gboolean is_le_scanning = FALSE;
 
+static bluetooth_le_scan_params_t le_scan_params = { BT_LE_ACTIVE_SCAN, 0, 0 };
+
 static int g_gatt_client_id = 0;
 
 /******************************************* LE Scan *********************************************/
@@ -1440,6 +1443,8 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
                return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
        }
 
+       BT_DBG("inteval %f, win %f, type %d", params->interval, params->window, params->type);
+
        if (params->interval < BT_LE_SCAN_INTERVAL_MIN ||
                        params->interval > BT_LE_SCAN_INTERVAL_MAX)
                return BLUETOOTH_ERROR_INVALID_PARAM;
@@ -1451,8 +1456,8 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
        if (params->window > params->interval)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
-       itv = params->interval / BT_ADV_INTERVAL_SPLIT;
-       win = params->window / BT_ADV_INTERVAL_SPLIT;
+       itv = params->interval / BT_SCAN_INTERVAL_SPLIT;
+       win = params->window / BT_SCAN_INTERVAL_SPLIT;
 
        ret = gattc_set_le_scan_param(params->type, itv, win);
        if (OAL_STATUS_SUCCESS != ret) {
@@ -1461,7 +1466,47 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
        }
 
        is_le_set_scan_parameter = TRUE;
-       BT_INFO("Set scan parameters");
+
+       BT_INFO("Set scan parameters inteval %f, win %f, type %d",
+                       itv * BT_SCAN_INTERVAL_SPLIT, win * BT_SCAN_INTERVAL_SPLIT, params->type);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_prepare_scan_parameters(bluetooth_le_scan_params_t *params, int scan_type)
+{
+       if (_bt_adapter_get_status() != BT_ACTIVATED &&
+               _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
+               return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+       }
+
+       if (params)
+               BT_DBG("inteval %f, win %f", params->interval, params->window);
+       else
+               BT_DBG("type %d", scan_type);
+
+       if (params) {
+               if (params->interval < BT_LE_SCAN_INTERVAL_MIN || params->interval > BT_LE_SCAN_INTERVAL_MAX)
+                       return BLUETOOTH_ERROR_INVALID_PARAM;
+
+               if (params->window < BT_LE_SCAN_WINDOW_MIN || params->window > BT_LE_SCAN_WINDOW_MAX)
+                       return BLUETOOTH_ERROR_INVALID_PARAM;
+
+               if (params->window > params->interval)
+                       return BLUETOOTH_ERROR_INVALID_PARAM;
+
+               le_scan_params.interval = params->interval;
+               le_scan_params.window = params->window;
+       } else {
+               le_scan_params.type = scan_type;
+               if (le_scan_params.interval == 0) {
+                       /* Set default scan interval same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
+                       le_scan_params.interval = 5120;
+                       le_scan_params.window = 512;
+               }
+       }
+
+       is_le_set_scan_parameter = TRUE;
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1531,9 +1576,11 @@ int _bt_start_le_scan(const char *sender)
 
                /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
                scan_params.type = 0x01;
-               scan_params.interval = 5000;
-               scan_params.window = 500;
+               scan_params.interval = 5120;
+               scan_params.window = 512;
                _bt_set_scan_parameters(&scan_params);
+       } else {
+               _bt_set_scan_parameters(&le_scan_params);
        }
 
        BT_INFO("Start LE Full Scan");
@@ -1588,6 +1635,11 @@ int _bt_stop_le_scan(const char *sender)
        }
 
        is_le_set_scan_parameter = FALSE;
+
+       le_scan_params.type = BT_LE_ACTIVE_SCAN;
+       le_scan_params.interval = 0;
+       le_scan_params.window = 0;
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -1603,6 +1655,28 @@ void _bt_disable_all_scanner_status(void)
        }
 }
 
+static void __bt_free_le_scanner(void)
+{
+       GSList *l;
+       bt_adapter_le_scanner_t *scanner;
+
+       for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
+               scanner = l->data;
+               g_free(scanner->sender);
+               g_slist_free_full(scanner->filter_list, g_free);
+               g_free(scanner);
+       }
+
+       g_slist_free(scanner_list);
+       scanner_list = NULL;
+
+       is_le_scanning = FALSE;
+       is_le_set_scan_parameter = FALSE;
+       le_scan_params.type = BT_LE_ACTIVE_SCAN;
+       le_scan_params.interval = 0;
+       le_scan_params.window = 0;
+}
+
 void _bt_check_le_scanner_app_termination(const char *sender)
 {
        bt_adapter_le_scanner_t *scanner;
@@ -1629,6 +1703,7 @@ int _bt_service_le_init(void)
 void _bt_service_le_deinit(void)
 {
        le_deinit();
+       __bt_free_le_scanner();
 }
 
 int _bt_is_advertising(void)
index dc1fe9f..a557ecb 100644 (file)
@@ -2848,13 +2848,22 @@ normal:
        }
        case BT_SET_SCAN_PARAMETERS: {
                bluetooth_le_scan_params_t scan_params;
-
                __bt_service_get_parameters(in_param1, &scan_params,
                                sizeof(bluetooth_le_scan_params_t));
+
                BT_DBG("bluetooth_le_scan_params_t [%f %f %d]",
                                scan_params.interval, scan_params.window,
                                scan_params.type);
-               result = _bt_set_scan_parameters(&scan_params);
+
+               result = _bt_prepare_scan_parameters(&scan_params, 0);
+               break;
+       }
+       case BT_SET_SCAN_TYPE: {
+               int scan_type = 0;
+               __bt_service_get_parameters(in_param1, &scan_type, sizeof(int));
+
+               BT_DBG("bluetooth_le_scan_type [%d]", scan_type);
+               result = _bt_prepare_scan_parameters(NULL, scan_type);
                break;
        }
 #ifdef TIZEN_FEATURE_BT_PAN_NAP
@@ -3589,6 +3598,7 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_START_LE_DISCOVERY:
        case BT_STOP_LE_DISCOVERY:
        case BT_SET_SCAN_PARAMETERS:
+       case BT_SET_SCAN_TYPE:
 
        case BT_BOND_DEVICE:
        case BT_CANCEL_BONDING:
index 8b03a07..0bfa5d0 100644 (file)
@@ -43,6 +43,11 @@ typedef enum {
        BT_LE_DEACTIVATING,
 } bt_le_status_t;
 
+typedef enum {
+       BT_LE_PASSIVE_SCAN = 0x00,
+       BT_LE_ACTIVE_SCAN
+} bt_le_scan_type_t;
+
 int _bt_enable_adapter_le(void);
 
 int _bt_disable_adapter_le(void);
@@ -70,6 +75,8 @@ int _bt_stop_le_scan(const char *sender);
 
 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);
+
 gboolean _bt_is_le_scanning(void);
 
 void _bt_check_le_scanner_app_termination(const char *sender);
index 84d2370..d684c48 100644 (file)
@@ -702,7 +702,15 @@ int __bt_bluez_request(int function_name,
                                scan_params.interval, scan_params.window,
                                scan_params.type);
 
-               result = _bt_set_scan_parameters(&scan_params);
+               result = _bt_prepare_scan_parameters(&scan_params, 0);
+               break;
+       }
+       case BT_SET_SCAN_TYPE: {
+               int scan_type = 0;
+               __bt_service_get_parameters(in_param1, &scan_type, sizeof(int));
+
+               BT_DBG("bluetooth_le_scan_type [%d]", scan_type);
+               result = _bt_prepare_scan_parameters(NULL, scan_type);
                break;
        }
        case BT_LE_CONN_UPDATE: {
@@ -2700,6 +2708,7 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_START_LE_DISCOVERY:
        case BT_STOP_LE_DISCOVERY:
        case BT_SET_SCAN_PARAMETERS:
+       case BT_SET_SCAN_TYPE:
 
        case BT_BOND_DEVICE:
        case BT_CANCEL_BONDING:
index 5d15fd7..304987e 100644 (file)
@@ -41,6 +41,8 @@
 #define BT_ADV_FILTER_POLICY_DEFAULT   0x00
 #define BT_ADV_TYPE_DEFAULT    0x00
 #define BT_ADV_FILTER_POLICY_ALLOW_SCAN_CONN_WL_ONLY   0x03
+#define BT_SCAN_INTERVAL_SPLIT 0.625
+
 
 typedef struct {
        int adv_inst_max;
@@ -79,7 +81,8 @@ GSList *scanner_list = NULL;
 static gboolean is_le_set_scan_parameter = FALSE;
 static gboolean is_le_scanning = FALSE;
 static gboolean scan_filter_enabled = FALSE;
-static bt_le_scan_type_t le_scan_type = BT_LE_PASSIVE_SCAN;
+static bt_le_scan_type_t le_scan_type = BT_LE_ACTIVE_SCAN;
+static bluetooth_le_scan_params_t le_scan_params = { BT_LE_ACTIVE_SCAN, 0, 0 };
 
 static GSList *gatt_client_senders = NULL;
 
@@ -865,6 +868,8 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
        proxy = _bt_get_adapter_proxy();
        retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
 
+       BT_DBG("inteval %f, win %f, type %d", params->interval, params->window, params->type);
+
        if (params->interval < BT_LE_SCAN_INTERVAL_MIN || params->interval > BT_LE_SCAN_INTERVAL_MAX)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
@@ -874,8 +879,8 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
        if (params->window > params->interval)
                return BLUETOOTH_ERROR_INVALID_PARAM;
 
-       itv = params->interval / BT_ADV_INTERVAL_SPLIT;
-       win = params->window / BT_ADV_INTERVAL_SPLIT;
+       itv = params->interval / BT_SCAN_INTERVAL_SPLIT;
+       win = params->window / BT_SCAN_INTERVAL_SPLIT;
 
        ret = g_dbus_proxy_call_sync(proxy, "SetScanParameters",
                        g_variant_new("(uuu)", params->type, itv, win),
@@ -894,7 +899,46 @@ int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
 
        if (ret)
                g_variant_unref(ret);
-       BT_INFO("Set scan parameters");
+       BT_INFO("Set scan parameters inteval %f, win %f, type %d",
+                       itv * BT_SCAN_INTERVAL_SPLIT, win * BT_SCAN_INTERVAL_SPLIT, params->type);
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_prepare_scan_parameters(bluetooth_le_scan_params_t *params, int scan_type)
+{
+       if (_bt_adapter_get_status() != BT_ACTIVATED &&
+               _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
+               return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+       }
+
+       if (params)
+               BT_DBG("inteval %f, win %f", params->interval, params->window);
+       else
+               BT_DBG("type %d", scan_type);
+
+       if (params) {
+               if (params->interval < BT_LE_SCAN_INTERVAL_MIN || params->interval > BT_LE_SCAN_INTERVAL_MAX)
+                       return BLUETOOTH_ERROR_INVALID_PARAM;
+
+               if (params->window < BT_LE_SCAN_WINDOW_MIN || params->window > BT_LE_SCAN_WINDOW_MAX)
+                       return BLUETOOTH_ERROR_INVALID_PARAM;
+
+               if (params->window > params->interval)
+                       return BLUETOOTH_ERROR_INVALID_PARAM;
+
+               le_scan_params.interval = params->interval;
+               le_scan_params.window = params->window;
+       } else {
+               le_scan_params.type = scan_type;
+               if (le_scan_params.interval == 0) {
+                       /* Set default scan interval same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
+                       le_scan_params.interval = 5120;
+                       le_scan_params.window = 512;
+               }
+       }
+
+       is_le_set_scan_parameter = TRUE;
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -1443,10 +1487,11 @@ int _bt_start_le_scan(const char *sender)
                        /* 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 = 5000;
-                       scan_params.window = 500;
+                       scan_params.interval = 5120;
+                       scan_params.window = 512;
                        _bt_set_scan_parameters(&scan_params);
-               }
+               } else
+                       _bt_set_scan_parameters(&le_scan_params);
 
                if (scanner->filter_list == NULL) {
                        BT_INFO("Start LE Full Scan");
@@ -1567,6 +1612,9 @@ int _bt_stop_le_scan(const char *sender)
 
        scan_filter_enabled = FALSE;
        is_le_set_scan_parameter = FALSE;
+       le_scan_params.type = BT_LE_ACTIVE_SCAN;
+       le_scan_params.interval = 0;
+       le_scan_params.window = 0;
        if (ret)
                g_variant_unref(ret);
        return BLUETOOTH_ERROR_NONE;
@@ -1602,6 +1650,9 @@ static void __bt_free_le_scanner(void)
        scan_filter_enabled = FALSE;
        is_le_scanning = FALSE;
        is_le_set_scan_parameter = FALSE;
+       le_scan_params.type = BT_LE_ACTIVE_SCAN;
+       le_scan_params.interval = 0;
+       le_scan_params.window = 0;
 }
 
 void _bt_set_le_scan_status(gboolean mode)
index 5575ed9..10a335d 100644 (file)
@@ -1158,6 +1158,7 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_GET_ADVERTISING_DATA, "BT_GET_ADVERTISING_DATA"},
                {BT_SET_ADVERTISING_DATA, "BT_SET_ADVERTISING_DATA"},
                {BT_SET_SCAN_PARAMETERS, "BT_SET_SCAN_PARAMETERS"},
+               {BT_SET_SCAN_TYPE, "BT_SET_SCAN_TYPE"},
                {BT_GET_SCAN_RESPONSE_DATA, "BT_GET_SCAN_RESPONSE_DATA"},
                {BT_SET_SCAN_RESPONSE_DATA, "BT_SET_SCAN_RESPONSE_DATA"},
                {BT_IS_ADVERTISING, "BT_IS_ADVERTISING"},
index 3260303..3b44d90 100644 (file)
@@ -96,6 +96,8 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle, bluetooth_sca
 
 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);
+
 gboolean _bt_is_scan_filter_supported(void);
 
 int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id);
index f7cca5f..31acaa9 100644 (file)
@@ -597,6 +597,14 @@ typedef struct {
        float window;  /**< LE scan window */
 } bluetooth_le_scan_params_t;
 
+/**
+* LE Scan type
+*/
+typedef enum {
+       BLUETOOTH_LE_PASSIVE_SCAN = 0x00,
+       BLUETOOTH_LE_ACTIVE_SCAN
+} bluetooth_le_scan_type_t;
+
 /*
        LE Connection Update
  */
@@ -6234,6 +6242,26 @@ int bluetooth_set_scan_response_data(int handle, const bluetooth_scan_resp_data_
 int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params);
 
 /**
+ * @fn intbluetooth_set_scan_type(bluetooth_le_scan_type_t scan_type);
+ *ss
+ * @brief Set scan type
+ *
+ * This function is used to set LE scan type
+ *
+ * This function is a synchronous call.
+ *
+ * @return     BLUETOOTH_ERROR_NONE - Success \n
+ *             BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *             BLUETOOTH_ERROR_INTERNAL - Internal IPC error \n
+ *
+ * @exception  None
+ * @param[in]  scan_type - LE scan type
+ *
+ * @remark     None
+ */
+int bluetooth_set_scan_type(bluetooth_le_scan_type_t scan_type);
+
+/**
  * @fn int bluetooth_is_advertising(void)
  * @brief Check for the advertising is in-progress or not.
  *
index 2a47799..f55bca9 100644 (file)
@@ -203,6 +203,7 @@ typedef enum {
        BT_GET_PROFILE_CONNECTED_DEVICES,
        BT_ENABLE_FORCE_HCI_DUMP,
        BT_SET_PASSKEY_NOTIFICATION,
+       BT_SET_SCAN_TYPE,
        BT_BOND_DEVICE = BT_FUNC_DEVICE_BASE,
        BT_BOND_DEVICE_BY_TYPE,
        BT_CANCEL_BONDING,