Register the changed callback of RSSI level 50/32350/2
authorChengyi Zhao <chengyi1.zhao@archermind.com>
Wed, 17 Dec 2014 07:27:03 +0000 (15:27 +0800)
committerChengyi Zhao <chengyi1.zhao@archermind.com>
Tue, 23 Dec 2014 01:57:24 +0000 (09:57 +0800)
Only registered the changed callback of RSSI level for
the first connected wifi service.

Change-Id: I8cf6dd27485926db551378efe01cfa56f0a10ec1
Signed-off-by: Chengyi Zhao <chengyi1.zhao@archermind.com>
src/include/wifi-internal.h
src/wifi-internal.c
src/wifi.c

index 185a23c77f523a74dac8491bbde777048fbccffd..ce4597d2ff4a4b1f5181dd0bebb47ccff619b294 100644 (file)
@@ -101,6 +101,9 @@ int _wifi_unset_background_scan_cb(void);
 int _wifi_set_connection_state_cb(
                wifi_connection_state_changed_cb callback, void *user_data);
 int _wifi_unset_connection_state_cb();
+int _wifi_set_rssi_level_changed_cb(wifi_rssi_level_changed_cb callback,
+                                                       void *user_data);
+int _wifi_unset_rssi_level_changed_cb();
 
 wifi_connection_state_e _wifi_convert_to_ap_state(
                                        net_state_type_t state);
index d0f690f179d8f21a098bfd5e37d15ee58982abd4..873c39754f220d95389ff1f251ed4b3c4d19add7 100755 (executable)
@@ -68,10 +68,14 @@ struct _wifi_cb_s {
        void *connected_user_data;
        wifi_disconnected_cb disconnected_cb;
        void *disconnected_user_data;
+       wifi_rssi_level_changed_cb rssi_level_changed_cb;
+       void *rssi_level_changed_user_data;
 };
 
 static struct _wifi_cb_s wifi_callbacks = {0,};
 
+static char last_connected_bssid[NET_MAX_MAC_ADDR_LEN + 1] = {0};
+
 /*For connection which CAPI send some message to WiNet daemon*/
 static net_wifi_connection_info_t net_wifi_conn_info;
 
@@ -289,6 +293,115 @@ static void connman_service_disconnect_cb(enum connman_lib_err result,
        __libnet_disconnected_cb(_wifi_connman_lib_error2wifi_error(result));
 }
 
+static void __libnet_rssi_level_changed_cb(struct connman_service *service,
+                                                               void *user_data)
+{
+       /*
+        * The correction factor of 'strength' is based on
+        * the implementation method of ConnMan,
+        * 'strength' has been added 120 in ConnMan.
+        */
+       const int CORRECTION_FACTOR = 120;
+
+       wifi_rssi_level_e rssi_level;
+       unsigned char strength = connman_service_get_strength(service);
+
+       /*
+        * Wi-Fi Signal Strength Display (dB)
+        *
+        * Excellent :  -63 ~
+        * Good:        -74 ~ -64
+        * Weak:        -82 ~ -75
+        * Very weak:   ~ -83
+        */
+       if (strength >= -63 + CORRECTION_FACTOR)
+               rssi_level = WIFI_RSSI_LEVEL_4;
+       else if (strength >= -74 + CORRECTION_FACTOR)
+               rssi_level = WIFI_RSSI_LEVEL_3;
+       else if (strength >= -82 + CORRECTION_FACTOR)
+               rssi_level = WIFI_RSSI_LEVEL_2;
+       else
+               rssi_level = WIFI_RSSI_LEVEL_1;
+
+       wifi_callbacks.rssi_level_changed_cb(rssi_level,
+                               wifi_callbacks.rssi_level_changed_user_data);
+}
+
+static int __libnet_get_connected_wifi_service(GList *services_list,
+                               struct connman_service **connected_service)
+{
+       GList *iter;
+       struct connman_service *service;
+       const char *type;
+       net_state_type_t profile_state;
+
+       for (iter = services_list; iter != NULL; iter = iter->next) {
+               service = (struct connman_service *)(iter->data);
+               type = connman_service_get_type(service);
+               if (g_strcmp0(type, "wifi") == 0) {
+                       profile_state = _wifi_get_service_state_type(
+                                               connman_service_get_state(
+                                                               service));
+                       if ((profile_state == NET_STATE_TYPE_READY ||
+                               profile_state == NET_STATE_TYPE_ONLINE)) {
+                               *connected_service = service;
+
+                               return WIFI_ERROR_NONE;
+                       }
+
+                       break;
+               }
+       }
+
+       return WIFI_ERROR_NO_CONNECTION;
+}
+
+static void __libnet_unset_connected_rssi_level_changed_cb()
+{
+       if (strlen(last_connected_bssid) == 0)
+               return;
+
+       struct connman_service *service = connman_get_service(
+                                                       last_connected_bssid);
+       if (!service)
+               return;
+
+       connman_service_unset_property_changed_cb(service,
+                                                       SERVICE_PROP_STRENGTH);
+}
+
+static void __libnet_set_connected_rssi_level_changed_cb(
+                               struct connman_service *connected_service)
+{
+       const char *bssid;
+
+       bssid = connman_service_get_bssid(connected_service);
+       if (g_strcmp0(bssid, last_connected_bssid) != 0) {
+               __libnet_unset_connected_rssi_level_changed_cb();
+
+               connman_service_set_property_changed_cb(connected_service,
+                                               SERVICE_PROP_STRENGTH,
+                                               __libnet_rssi_level_changed_cb,
+                                               NULL);
+               memset(last_connected_bssid, 0, NET_MAX_MAC_ADDR_LEN + 1);
+               g_strlcpy(last_connected_bssid, bssid,
+                                               NET_MAX_MAC_ADDR_LEN + 1);
+       }
+}
+
+static void __libnet_register_connected_rssi_monitor(GList *all_services_list)
+{
+       int rv;
+       struct connman_service *connected_service;
+
+       rv = __libnet_get_connected_wifi_service(all_services_list,
+                                                       &connected_service);
+       if (rv != WIFI_ERROR_NONE)
+               return;
+
+       __libnet_set_connected_rssi_level_changed_cb(connected_service);
+}
+
 static int __net_dbus_set_agent_passphrase(const char *path,
                                                 const char *passphrase)
 {
@@ -557,6 +670,12 @@ static void service_changed_callback(struct connman_manager *manager,
 
        if (wifi_callbacks.connection_state_cb)
                register_all_serivces_monitor();
+
+       /*
+        * Monitor RSSI of default service;
+        */
+       if (wifi_callbacks.rssi_level_changed_cb)
+               __libnet_register_connected_rssi_monitor(all_services_list);
 }
 
 static void technology_powered_changed(
@@ -1102,6 +1221,39 @@ int _wifi_unset_connection_state_cb()
        return WIFI_ERROR_NONE;
 }
 
+int _wifi_set_rssi_level_changed_cb(wifi_rssi_level_changed_cb callback,
+                                                               void *user_data)
+{
+       GList *services_list;
+
+       if (wifi_callbacks.rssi_level_changed_cb != NULL)
+               return WIFI_ERROR_INVALID_OPERATION;
+
+       wifi_callbacks.rssi_level_changed_cb = callback;
+       wifi_callbacks.rssi_level_changed_user_data = user_data;
+
+       services_list = connman_get_services();
+       if (services_list == NULL)
+               return WIFI_ERROR_NO_CONNECTION;
+
+       __libnet_register_connected_rssi_monitor(services_list);
+
+       return WIFI_ERROR_NONE;
+}
+
+int _wifi_unset_rssi_level_changed_cb()
+{
+       if (wifi_callbacks.rssi_level_changed_cb == NULL)
+               return WIFI_ERROR_INVALID_OPERATION;
+
+       wifi_callbacks.rssi_level_changed_cb = NULL;
+       wifi_callbacks.rssi_level_changed_user_data = NULL;
+
+       __libnet_unset_connected_rssi_level_changed_cb();
+
+       return WIFI_ERROR_NONE;
+}
+
 struct connman_service *_wifi_get_service_h(wifi_ap_h ap_h)
 {
        struct connman_service *service =
index 118324452d5a027ec7ba386e7f34504ed482c1ee..05073777988a5517b97080707d0f082750a298ca 100755 (executable)
 #include "wifi-internal.h"
 
 static bool is_init = false;
-static wifi_rssi_level_changed_cb rssi_level_changed_cb = NULL;
-static void *rssi_level_changed_user_data = NULL;
-
-static void __rssi_level_changed_cb(keynode_t *node, void *user_data)
-{
-       int rssi_level = vconf_keynode_get_int(node);
-       rssi_level_changed_cb(rssi_level, rssi_level_changed_user_data);
-}
 
 EXPORT_API int wifi_initialize(void)
 {
@@ -400,28 +392,15 @@ EXPORT_API int wifi_set_rssi_level_changed_cb(
                return WIFI_ERROR_INVALID_PARAMETER;
        }
 
-       if (rssi_level_changed_cb == NULL)
-               vconf_notify_key_changed(VCONFKEY_WIFI_STRENGTH,
-                                       __rssi_level_changed_cb, NULL);
-       else
+       if (is_init == false) {
+               WIFI_LOG(WIFI_ERROR, "Not initialized\n");
                return WIFI_ERROR_INVALID_OPERATION;
+       }
 
-       rssi_level_changed_cb = callback;
-       rssi_level_changed_user_data = user_data;
-
-       return WIFI_ERROR_NONE;
+       return _wifi_set_rssi_level_changed_cb(callback, user_data);
 }
 
 EXPORT_API int wifi_unset_rssi_level_changed_cb(void)
 {
-       if (rssi_level_changed_cb != NULL)
-               vconf_ignore_key_changed(VCONFKEY_WIFI_STRENGTH,
-                                               __rssi_level_changed_cb);
-       else
-               return WIFI_ERROR_INVALID_OPERATION;
-
-       rssi_level_changed_cb = NULL;
-       rssi_level_changed_user_data = NULL;
-
-       return WIFI_ERROR_NONE;
+       return _wifi_unset_rssi_level_changed_cb();
 }