diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2006-10-12 07:50:13 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2006-10-12 07:50:13 +0000 |
commit | 3ec96c0b0cd8d78ebede255583a918145a0eeaa0 (patch) | |
tree | 255d2642b27cae59ad7a1819fded54311a5ed3ed | |
parent | 48d9984c99f55dc249050f56aa1c01ad56dac82d (diff) |
Sort discovered devices list based on their RSSI
-rw-r--r-- | hcid/dbus-adapter.c | 2 | ||||
-rw-r--r-- | hcid/dbus.c | 26 | ||||
-rw-r--r-- | hcid/dbus.h | 3 |
3 files changed, 24 insertions, 7 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index c19d5607..baf5edf4 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -1417,7 +1417,7 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB /* put the request name in the queue to resolve name */ str2ba(peer_addr, &peer_bdaddr); - disc_device_append(&adapter->disc_devices, &peer_bdaddr, NAME_REQUIRED); + disc_device_add(&adapter->disc_devices, &peer_bdaddr, 0, NAME_REQUIRED); /* * if there is a discover process running, just queue the request. diff --git a/hcid/dbus.c b/hcid/dbus.c index 89de4054..ba47af48 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -104,8 +104,7 @@ int disc_device_find(const struct discovered_dev_info *d1, const struct discover return ret; } - /* if not any */ - if (d2->name_status) { + if (d2->name_status != NAME_ANY) { ret = (d1->name_status - d2->name_status); if (ret) return ret; @@ -114,7 +113,18 @@ int disc_device_find(const struct discovered_dev_info *d1, const struct discover return 0; } -int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status) +int dev_rssi_cmp(struct discovered_dev_info *d1, struct discovered_dev_info *d2) +{ + int rssi1, rssi2; + + rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi; + rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi; + + return rssi1 - rssi2; +} + +int disc_device_add(struct slist **list, bdaddr_t *bdaddr, int8_t rssi, + name_status_t name_status) { struct discovered_dev_info *dev, match; struct slist *l; @@ -129,12 +139,17 @@ int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name /* device found, update the attributes */ dev = l->data; + dev->rssi = rssi; + /* Get remote name can be received while inquiring. * Keep in mind that multiple inquiry result events can * be received from the same remote device. */ if (name_status != NAME_NOT_REQUIRED) dev->name_status = name_status; + + *list = slist_sort(*list, (cmp_func_t) dev_rssi_cmp); + return -EALREADY; } @@ -144,9 +159,10 @@ int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name memset(dev, 0, sizeof(*dev)); bacpy(&dev->bdaddr, bdaddr); + dev->rssi = rssi; dev->name_status = name_status; - *list = slist_append(*list, dev); + *list = slist_insert_sorted(*list, dev, (cmp_func_t) dev_rssi_cmp); return 0; } @@ -1381,7 +1397,7 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i } /* add in the list to track name sent/pending */ - disc_device_append(&adapter->disc_devices, peer, name_status); + disc_device_add(&adapter->disc_devices, peer, rssi, name_status); done: bt_free(local_addr); diff --git a/hcid/dbus.h b/hcid/dbus.h index 2d6dda62..954e7ab5 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -81,6 +81,7 @@ typedef enum { struct discovered_dev_info { bdaddr_t bdaddr; + int8_t rssi; name_status_t name_status; }; @@ -253,7 +254,7 @@ int active_conn_find_by_bdaddr(const void *data, const void *user_data); void bonding_request_free(struct bonding_request_info *dev); int pin_req_cmp(const void *p1, const void *p2); int disc_device_find(const struct discovered_dev_info *d1, const struct discovered_dev_info *d2); -int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status); +int disc_device_add(struct slist **list, bdaddr_t *bdaddr, int8_t rssi, name_status_t name_status); int disc_device_req_name(struct adapter *dbus_data); int discoverable_timeout_handler(void *data); |