char *sender;
GSList *filter_list;
gboolean is_scanning;
+ gboolean stop_pending;
} bt_adapter_le_scanner_t;
static bluetooth_advertising_params_t adv_params = {
return i;
}
- if (le_feature_info.adv_inst_max <= 2)
- i = 0;
- else if (le_feature_info.adv_inst_max > 2 && use_reserved_slot == TRUE)
+ if (le_feature_info.adv_inst_max <= 1)
i = 0;
+ else if (use_reserved_slot == TRUE)
+ i = 1;
else
i = 2;
gboolean status = FALSE;
int i;
+ if (le_adv_slot == NULL)
+ return FALSE;
+
for (i = 0; i < le_feature_info.adv_inst_max; i++) {
if (le_adv_slot[i].is_advertising == TRUE)
status = TRUE;
&error);
if (error) {
+ BT_INFO("SetAdvertising %d, slot_id %d", enable, slot_id);
BT_ERR("SetAdvertising Fail: %s", error->message);
g_clear_error(&error);
return BLUETOOTH_ERROR_INTERNAL;
params->type == BLUETOOTH_ADV_NON_CONNECTABLE)
return BLUETOOTH_ERROR_NOT_SUPPORT;
+ if (params->tx_power_level > 1 ||
+ params->tx_power_level < -127)
+ return BLUETOOTH_ERROR_INVALID_PARAM;
+
min = params->interval_min / BT_ADV_INTERVAL_SPLIT;
max = params->interval_max / BT_ADV_INTERVAL_SPLIT;
ret = g_dbus_proxy_call_sync(proxy, "SetAdvertisingParameters",
- g_variant_new("(uuuui)", min, max,
+ g_variant_new("(uuuuii)", min, max,
params->filter_policy, params->type,
- slot_id), G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
+ params->tx_power_level, slot_id),
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
if (error) {
BT_ERR("SetAdvertisingParameters Fail: %s", error->message);
adv_params.interval_max = params->interval_max;
adv_params.filter_policy = params->filter_policy;
adv_params.type = params->type;
+ adv_params.tx_power_level = params->tx_power_level;
if (ret)
g_variant_unref(ret);
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;
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;
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);
}
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);
}
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;
-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);
}
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) {
-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);
}
ret = g_dbus_proxy_call_sync(proxy, "StopLEDiscovery",
NULL, G_DBUS_CALL_FLAGS_NONE,
-1, NULL, &error);
+ if (error) {
+ BT_ERR("StopLEDiscovery Fail: %s", error->message);
+ g_clear_error(&error);
+ }
+
if (ret == NULL) {
BT_ERR("LE Scan stop failed");
return BLUETOOTH_ERROR_INTERNAL;
for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
scanner = l->data;
scanner->is_scanning = FALSE;
+ scanner->stop_pending = FALSE;
}
}
void _bt_set_le_scan_status(gboolean mode)
{
+ BT_DBG("set is_le_scanning : %d -> %d", is_le_scanning, mode);
is_le_scanning = mode;
}