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;
{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"},
#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,
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 *********************************************/
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;
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) {
}
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;
}
/* 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");
}
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;
}
}
}
+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;
void _bt_service_le_deinit(void)
{
le_deinit();
+ __bt_free_le_scanner();
}
int _bt_is_advertising(void)
}
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
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:
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);
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);
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: {
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:
#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;
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;
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;
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),
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;
}
/* 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");
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;
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)
{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"},
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);
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
*/
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.
*
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,