android/gatt: Fix scan handling

Android has its own ScanQueue which is used for tracking scanning
clients which means we do not have to have this logic internally.

Android will call Scan Off only when his scanQueue is empty.
This commit is contained in:
Lukasz Rymanowski 2014-03-23 21:20:08 +01:00 committed by Szymon Janc
parent f438cac1b4
commit 0a783f1163

View File

@ -71,9 +71,9 @@ struct gatt_device {
static struct ipc *hal_ipc = NULL;
static bdaddr_t adapter_addr;
static bool scanning = false;
static struct queue *gatt_clients = NULL;
static struct queue *scan_clients = NULL;
static struct queue *conn_list = NULL; /* Connected devices */
static struct queue *conn_wait_queue = NULL; /* Devs waiting to connect */
@ -192,13 +192,6 @@ static void handle_client_unregister(const void *buf, uint16_t len)
goto failed;
}
queue_remove_if(scan_clients, match_by_value,
INT_TO_PTR(cmd->client_if));
/* If there is no client interesting in scan, just stop it */
if (queue_isempty(scan_clients))
bt_le_discovery_stop(NULL);
free(cl);
status = HAL_STATUS_SUCCESS;
@ -350,7 +343,7 @@ static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
struct hal_ev_gatt_client_scan_result *ev = (void *) buf;
char bda[18];
if (queue_isempty(scan_clients))
if (!scanning)
goto connect;
ba2str(addr, bda);
@ -541,51 +534,43 @@ static void handle_client_scan(const void *buf, uint16_t len)
const struct hal_cmd_gatt_client_scan *cmd = buf;
uint8_t status;
void *registered;
void *l;
DBG("new state %d", cmd->start);
registered = queue_find(gatt_clients, match_client_by_id,
INT_TO_PTR(cmd->client_if));
if (!registered) {
error("gatt: Client not registered");
status = HAL_STATUS_FAILED;
goto reply;
}
/* Turn off scan */
if (!cmd->start) {
if (registered)
queue_remove_if(scan_clients, match_by_value,
INT_TO_PTR(cmd->client_if));
DBG("Stopping LE SCAN");
if (queue_isempty(scan_clients)) {
DBG("Stopping LE SCAN");
if (scanning) {
bt_le_discovery_stop(NULL);
scanning = false;
}
status = HAL_STATUS_SUCCESS;
goto reply;
}
/* If device already do scan, reply with success and avoid to add it
* again to the list
*/
l = queue_find(scan_clients, match_by_value,
INT_TO_PTR(cmd->client_if));
if (l) {
/* Reply success if we already do scan */
if (scanning) {
status = HAL_STATUS_SUCCESS;
goto reply;
}
/* Turn on scan */
if (!bt_le_discovery_start(le_device_found_handler)) {
error("gatt: LE scan switch failed");
status = HAL_STATUS_FAILED;
goto reply;
}
/* Add scan client to the list if its registered */
if (registered && !queue_push_tail(scan_clients,
INT_TO_PTR(cmd->client_if))) {
error("gatt: Cannot push scan client");
status = HAL_STATUS_FAILED;
goto reply;
}
scanning = true;
status = HAL_STATUS_SUCCESS;
reply:
@ -724,12 +709,10 @@ static void handle_client_connect(const void *buf, uint16_t len)
}
/* Start le scan if not started */
if (queue_isempty(scan_clients)) {
if (!bt_le_discovery_start(le_device_found_handler)) {
error("gatt: Could not start scan");
status = HAL_STATUS_FAILED;
goto reply;
}
if (!scanning && !bt_le_discovery_start(le_device_found_handler)) {
error("gatt: Could not start scan");
status = HAL_STATUS_FAILED;
goto reply;
}
if (!queue_push_tail(conn_wait_queue, dev)) {
@ -1226,13 +1209,6 @@ bool bt_gatt_register(struct ipc *ipc, const bdaddr_t *addr)
return false;
}
scan_clients = queue_new();
if (!scan_clients) {
error("gatt: Cannot allocate scan_clients");
queue_destroy(gatt_clients, NULL);
return false;
}
return true;
}