Update rssi from strength signal of connman 37/243237/4 submit/tizen/20200909.082135
authorhyunuk.tak <hyunuk.tak@samsung.com>
Fri, 4 Sep 2020 06:57:33 +0000 (15:57 +0900)
committerhyunuk.tak <hyunuk.tak@samsung.com>
Wed, 9 Sep 2020 07:45:16 +0000 (16:45 +0900)
Change-Id: I6001209db19f69a5af4000e947d879d20a8b684f
Signed-off-by: hyunuk.tak <hyunuk.tak@samsung.com>
include/wifi-indicator.h
include/wifi-state.h
src/signal-handler.c
src/wifi-indicator.c
src/wifi-power.c
src/wifi-state.c

index 53355f5..9ecc549 100755 (executable)
 extern "C" {
 #endif
 
-int netconfig_wifi_get_rssi(void);
-unsigned int netconfig_wifi_get_freq(void);
-int netconfig_wifi_rssi_level(const int rssi_dbm);
+void netconfig_wifi_indicator_update(const char *interface_name,
+               const char *path, int rssi_dbm);
 
-void netconfig_wifi_indicator_start(const char *interface_name);
+void netconfig_wifi_indicator_start(const char *interface_name, const char *profile_path);
 void netconfig_wifi_indicator_stop(const char *interface_name);
 
 #ifdef __cplusplus
index 9f74014..9a2da28 100755 (executable)
@@ -81,7 +81,8 @@ gboolean wifi_state_is_bss_found(void);
 gboolean wifi_state_update_device_list(void);
 GSList *wifi_state_get_device_list(void);
 
-void wifi_state_set_service_state(const char *interface_name, wifi_service_state_e new_state);
+void wifi_state_set_service_state(const char *interface_name,
+               const char *service, wifi_service_state_e new_state);
 wifi_service_state_e wifi_state_get_service_state(const char *interface_name);
 
 void wifi_state_set_technology_state(const char *interface_name, wifi_tech_state_e new_state);
index 30a549b..bd7004b 100755 (executable)
@@ -32,6 +32,7 @@
 #include "wifi-agent.h"
 #include "wifi-power.h"
 #include "wifi-state.h"
+#include "wifi-indicator.h"
 #include "wifi-scan.h"
 #include "wifi-bssid-scan.h"
 #include "wifi-background-scan.h"
@@ -404,6 +405,7 @@ static void _service_signal_cb(GDBusConnection *conn,
        struct sock_data *sd = NULL;
        gchar *pf = NULL;
        int idx = 0;
+       unsigned char strength = 0;
        const char *interface_name = NULL;
 
        if (path == NULL || param == NULL)
@@ -435,14 +437,14 @@ static void _service_signal_cb(GDBusConnection *conn,
                        if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
                                netconfig_update_default_profile();
 
-                               wifi_state_set_service_state(interface_name, NETCONFIG_WIFI_CONNECTED);
+                               wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_CONNECTED);
 
                        } else if (g_strcmp0(property, "failure") == 0 ||
                                g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) {
                                if (g_strcmp0(property, "failure") == 0)
-                                       wifi_state_set_service_state(interface_name, NETCONFIG_WIFI_FAILURE);
+                                       wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_FAILURE);
                                else
-                                       wifi_state_set_service_state(interface_name, NETCONFIG_WIFI_IDLE);
+                                       wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_IDLE);
 
                                if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
                                        g_free(property);
@@ -453,9 +455,9 @@ static void _service_signal_cb(GDBusConnection *conn,
 
                        } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) {
                                if (g_strcmp0(property, "association") == 0)
-                                       wifi_state_set_service_state(interface_name, NETCONFIG_WIFI_ASSOCIATION);
+                                       wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_ASSOCIATION);
                                else
-                                       wifi_state_set_service_state(interface_name, NETCONFIG_WIFI_CONFIGURATION);
+                                       wifi_state_set_service_state(interface_name, path, NETCONFIG_WIFI_CONFIGURATION);
 
                                if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
                                        g_free(property);
@@ -618,6 +620,10 @@ static void _service_signal_cb(GDBusConnection *conn,
                        goto done;
 
                __netconfig_extract_ipv6_signal_data(variant, path);
+       } else if (g_strcmp0(sigvalue, "Strength") == 0) {
+               strength = g_variant_get_byte(variant);
+
+               netconfig_wifi_indicator_update(interface_name, path, strength - 120);
        } else if (g_strcmp0(sigvalue, "Error") == 0) {
                g_variant_get(variant, "s", &property);
                INFO("[%s] Property : %s", sigvalue, property);
index 681ee67..5b0810a 100755 (executable)
@@ -40,7 +40,7 @@
 #define VCONFKEY_WIFI_SNR_MIN  -89
 
 #if !defined TIZEN_WEARABLE
-#define WIFI_INDICATOR_INTERVAL        1
+#define WIFI_INDICATOR_INTERVAL        2
 #else
 #define WIFI_INDICATOR_INTERVAL        10
 #endif
 
 typedef struct {
        char *interface_name;
+       char *default_path;
        int last_snr_level;
 } rssi_data_s;
 
-static int netconfig_wifi_rssi = VCONFKEY_WIFI_SNR_MIN;
-static guint32 netconfig_wifi_freq = 0;
-static guint netconfig_wifi_indicator_timer = 0;
 static GSList *g_rssi_list = NULL;
+static guint netconfig_wifi_statistics_timer = 0;
 
 static rssi_data_s *__create_rssi_data(const char *interface_name)
 {
@@ -95,6 +94,16 @@ static rssi_data_s *__get_rssi_data(const char *interface_name)
        return rssi_data;
 }
 
+static void __set_rssi_data_default_path(const char *interface_name,
+               const char *path)
+{
+       rssi_data_s *rssi_data = __get_rssi_data(interface_name);
+       if (rssi_data == NULL)
+               return;
+
+       rssi_data->default_path = g_strdup(path);
+}
+
 static void __destroy_rssi_data(const char *interface_name)
 {
        rssi_data_s *rssi_data = __get_rssi_data(interface_name);
@@ -104,70 +113,10 @@ static void __destroy_rssi_data(const char *interface_name)
 
        g_rssi_list = g_slist_remove(g_rssi_list, rssi_data);
        g_free(rssi_data->interface_name);
+       g_free(rssi_data->default_path);
        g_free(rssi_data);
 }
 
-int netconfig_wifi_get_rssi(void)
-{
-       return netconfig_wifi_rssi;
-}
-
-unsigned int netconfig_wifi_get_freq(void)
-{
-       return netconfig_wifi_freq;
-}
-
-static int __netconfig_wifi_update_and_get_rssi(const char *interface_name)
-{
-       char *if_path = NULL;
-       GVariant *message = NULL;
-       GVariant *value = NULL;
-       gchar *key;
-       GVariantIter *iter;
-       GVariant *variant;
-       gint32 key_value;
-       int rssi_dbm = VCONFKEY_WIFI_SNR_MIN;
-
-       if_path = netconfig_wifi_get_supplicant_interface_path(interface_name);
-       if (if_path == NULL) {
-               ERR("Fail to get wpa_supplicant DBus path");
-               return 0;
-       }
-
-       message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE, if_path,
-                       SUPPLICANT_INTERFACE ".Interface", "SignalPoll", NULL);
-       if (message == NULL) {
-               ERR("Fail to get SignalPoll from wpa_supplicant");
-               g_free(if_path);
-               return 0;
-       }
-
-       g_variant_get(message, "(v)", &value);
-
-       g_variant_get(value, "a{sv}", &iter);
-       while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
-
-               if (g_strcmp0(key, "rssi") == 0) {
-                       key_value = g_variant_get_int32(variant);
-                       rssi_dbm = (int)key_value;
-                       /* DBG("Currently signal dbm value [%d]", rssi_dbm); */
-               } else if (g_strcmp0(key, "frequency") == 0) {
-                       netconfig_wifi_freq = g_variant_get_uint32(variant);
-                       /* DBG("Currently frequency [%u]", netconfig_wifi_freq); */
-               }
-       }
-
-       g_variant_iter_free(iter);
-
-       g_variant_unref(message);
-
-       g_free(if_path);
-
-       netconfig_wifi_rssi = rssi_dbm;
-
-       return rssi_dbm;
-}
-
 static int __netconfig_wifi_convert_dbm_to_level_24(int rssi_dbm)
 {
        int rssi_level = 0;
@@ -222,7 +171,7 @@ static int __netconfig_wifi_convert_dbm_to_level_50(int rssi_dbm)
        return rssi_level;
 }
 
-int netconfig_wifi_rssi_level(const int rssi_dbm)
+static int __netconfig_wifi_get_rssi_level(const int rssi_dbm)
 {
        int snr_level = 0;
        int freq = 0;
@@ -239,7 +188,7 @@ int netconfig_wifi_rssi_level(const int rssi_dbm)
 }
 
 static void __netconfig_wifi_set_rssi_level(const char *interface_name,
-               const int snr_level)
+               const char *path, const int snr_level)
 {
        rssi_data_s *rssi_data = NULL;
        const char *default_ifname = NULL;
@@ -249,15 +198,17 @@ static void __netconfig_wifi_set_rssi_level(const char *interface_name,
                return;
 
        if (snr_level != rssi_data->last_snr_level) {
-               wifi_emit_rssi_changed((Wifi *)get_wifi_object(), interface_name, snr_level);
-
                default_ifname = netconfig_get_default_ifname();
                if (g_strcmp0(default_ifname, interface_name) == 0)
                        netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, snr_level);
 
-               netconfig_battery_update_wifi_rssi(snr_level);
+               if (g_strcmp0(rssi_data->default_path, path) == 0) {
+                       wifi_emit_rssi_changed((Wifi *)get_wifi_object(), interface_name, snr_level);
+
+                       netconfig_battery_update_wifi_rssi(snr_level);
 
-               rssi_data->last_snr_level = snr_level;
+                       rssi_data->last_snr_level = snr_level;
+               }
        }
 }
 
@@ -339,7 +290,7 @@ static void __netconfig_wifi_data_activity_booster(int level)
        old_level = level;
 }
 
-static void __netconfig_wifi_update_indicator(void)
+static void __netconfig_wifi_get_statistics(void)
 {
        static int last_transfer_state = 0;
        static guint64 netconfig_wifi_tx_bytes = 0;
@@ -404,10 +355,8 @@ static void __netconfig_wifi_update_indicator(void)
        }
 }
 
-static gboolean __wifi_indicator_monitor(gpointer data)
+static gboolean __netconfig_wifi_update_statistics(gpointer data)
 {
-       int rssi_dbm = 0;
-       int snr_level = 0;
        int pm_state = VCONFKEY_PM_STATE_NORMAL;
        char *interface_name = data;
 
@@ -421,16 +370,28 @@ static gboolean __wifi_indicator_monitor(gpointer data)
        if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
                return TRUE;
 
-       rssi_dbm = __netconfig_wifi_update_and_get_rssi(interface_name);
-       snr_level = netconfig_wifi_rssi_level(rssi_dbm);
-       __netconfig_wifi_set_rssi_level(interface_name, snr_level);
-
-       __netconfig_wifi_update_indicator();
+       __netconfig_wifi_get_statistics();
 
        return TRUE;
 }
 
-void netconfig_wifi_indicator_start(const char *interface_name)
+void netconfig_wifi_indicator_update(const char *interface_name,
+               const char *path, int rssi_dbm)
+{
+       int pm_state = VCONFKEY_PM_STATE_NORMAL;
+       int snr_level = 0;
+
+       /* In case of LCD off, we don't need to update Wi-Fi indicator */
+       netconfig_vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
+       if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
+               return;
+
+       snr_level = __netconfig_wifi_get_rssi_level(rssi_dbm);
+       __netconfig_wifi_set_rssi_level(interface_name, path, snr_level);
+}
+
+void netconfig_wifi_indicator_start(const char *interface_name,
+               const char *profile_path)
 {
        const char *default_ifname = NULL;
 
@@ -438,16 +399,19 @@ void netconfig_wifi_indicator_start(const char *interface_name)
 
        __create_rssi_data(interface_name);
 
-       wifi_emit_rssi_changed((Wifi *)get_wifi_object(),
-                       interface_name, VCONFKEY_WIFI_STRENGTH_MAX);
+       if (profile_path)
+               __set_rssi_data_default_path(interface_name, profile_path);
 
        default_ifname = netconfig_get_default_ifname();
        if (g_strcmp0(default_ifname, interface_name) == 0)
                netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, VCONFKEY_WIFI_STRENGTH_MAX);
 
+       wifi_emit_rssi_changed((Wifi *)get_wifi_object(),
+               interface_name, VCONFKEY_WIFI_STRENGTH_MAX);
+
        netconfig_start_timer_seconds(WIFI_INDICATOR_INTERVAL,
-               __wifi_indicator_monitor, g_strdup(interface_name),
-               &netconfig_wifi_indicator_timer);
+               __netconfig_wifi_update_statistics, g_strdup(interface_name),
+               &netconfig_wifi_statistics_timer);
 
        netconfig_battery_update_wifi_rssi(VCONFKEY_WIFI_STRENGTH_MAX);
 }
@@ -456,10 +420,7 @@ void netconfig_wifi_indicator_stop(const char *interface_name)
 {
        INFO("Stop Wi-Fi indicator");
 
-       netconfig_stop_timer(&netconfig_wifi_indicator_timer);
-
-       netconfig_wifi_rssi = VCONFKEY_WIFI_SNR_MIN;
-       netconfig_wifi_freq = 0;
+       netconfig_stop_timer(&netconfig_wifi_statistics_timer);
 
        __destroy_rssi_data(interface_name);
 }
index 8294eaf..1d3368b 100755 (executable)
@@ -206,7 +206,7 @@ static int _remove_driver_and_supplicant(const char *interface_name)
        wifi_state_set_technology_state(interface_name, NETCONFIG_WIFI_TECH_OFF);
 
        // reset service state
-       wifi_state_set_service_state(interface_name, NETCONFIG_WIFI_IDLE);
+       wifi_state_set_service_state(interface_name, NULL, NETCONFIG_WIFI_IDLE);
 
        if (wifi_firmware_recovery_mode == TRUE) {
                if (wifi_power_on(interface_name) < 0)
index bfcc389..74d0830 100755 (executable)
@@ -713,7 +713,8 @@ static gboolean __state_update_device_list(gpointer data)
        return FALSE;
 }
 
-void wifi_state_set_service_state(const char *interface_name, wifi_service_state_e new_state)
+void wifi_state_set_service_state(const char *interface_name,
+               const char *service, wifi_service_state_e new_state)
 {
        static gboolean dhcp_stage = FALSE;
        wifi_device_data_s *device_data = NULL;
@@ -751,7 +752,7 @@ void wifi_state_set_service_state(const char *interface_name, wifi_service_state
 
                __set_wifi_connected_essid();
 
-               netconfig_wifi_indicator_start(interface_name);
+               netconfig_wifi_indicator_start(interface_name, service);
        } else if (old_state == NETCONFIG_WIFI_CONNECTED) {
                netconfig_send_notification_to_net_popup(NETCONFIG_DEL_PORTAL_NOTI, NULL);