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 };
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)
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(
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);
} 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) {
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)
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
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;