X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fwifi-indicator.c;h=06ac9dad6890d6989a483eb93e8cb627d45bfeaf;hb=7ab0b0af10623241f16c7a8e962d55ebdcd817f6;hp=4bc18c6e442f42dfc3430976487adc7fed8281d8;hpb=20f3d7a917eb859fd71450a6b01bc25b911d218e;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/wifi-indicator.c b/src/wifi-indicator.c index 4bc18c6..06ac9da 100755 --- a/src/wifi-indicator.c +++ b/src/wifi-indicator.c @@ -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 @@ -56,69 +56,65 @@ #endif #define NETCONFIG_PROCWIRELESS "/proc/net/wireless" -static int netconfig_wifi_rssi = VCONFKEY_WIFI_SNR_MIN; -static guint32 netconfig_wifi_freq = 0; -static guint netconfig_wifi_indicator_timer = 0; +typedef struct { + char *interface_name; + char *default_path; + int last_snr_level; +} rssi_data_s; -int netconfig_wifi_get_rssi(void) -{ - return netconfig_wifi_rssi; -} +static GSList *g_rssi_list = NULL; +static guint netconfig_wifi_statistics_timer = 0; -unsigned int netconfig_wifi_get_freq(void) +static rssi_data_s *__create_rssi_data(const char *interface_name) { - return netconfig_wifi_freq; -} - -static int __netconfig_wifi_update_and_get_rssi(void) -{ - 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(); - if (if_path == NULL) { - ERR("Fail to get wpa_supplicant DBus path"); - return 0; + rssi_data_s *rssi_data = g_try_malloc0(sizeof(rssi_data_s)); + if (!rssi_data) { + ERR("Memory allocation failed"); + return NULL; } - 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; - } + rssi_data->interface_name = g_strdup(interface_name); + + g_rssi_list = g_slist_append(g_rssi_list, rssi_data); - g_variant_get(message, "(v)", &value); + return rssi_data; +} - g_variant_get(value, "a{sv}", &iter); - while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) { +static rssi_data_s *__get_rssi_data(const char *interface_name) +{ + GSList *list; + rssi_data_s *rssi_data = NULL; - 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); - } + for (list = g_rssi_list; list; list = list->next) { + rssi_data = list->data; + if (g_strcmp0(rssi_data->interface_name, interface_name) == 0) + return rssi_data; } - g_variant_iter_free(iter); + 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; - g_variant_unref(message); + rssi_data->default_path = g_strdup(path); +} - g_free(if_path); +static void __destroy_rssi_data(const char *interface_name) +{ + rssi_data_s *rssi_data = __get_rssi_data(interface_name); - netconfig_wifi_rssi = rssi_dbm; + if (!rssi_data) + return; - return rssi_dbm; + 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); } static int __netconfig_wifi_convert_dbm_to_level_24(int rssi_dbm) @@ -154,18 +150,18 @@ static int __netconfig_wifi_convert_dbm_to_level_50(int rssi_dbm) /* Wi-Fi Signal Strength Display (for 5G (dB)) * - * Excellent : ~ -72 - * Good : -73 ~ -78 - * Weak : -79 ~ -83 - * Very weak : -84 ~ -88 + * Excellent : ~ -67 + * Good : -68 ~ -76 + * Weak : -77 ~ -82 + * Very weak : -83 ~ -88 * No signal : -89 ~ */ - if (rssi_dbm >= -72) + if (rssi_dbm >= -67) rssi_level = 4; - else if (rssi_dbm >= -78) + else if (rssi_dbm >= -76) rssi_level = 3; - else if (rssi_dbm >= -83) + else if (rssi_dbm >= -82) rssi_level = 2; else if (rssi_dbm >= -88) rssi_level = 1; @@ -175,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; @@ -191,13 +187,28 @@ int netconfig_wifi_rssi_level(const int rssi_dbm) return snr_level; } -static void __netconfig_wifi_set_rssi_level(const int snr_level) +static void __netconfig_wifi_set_rssi_level(const char *interface_name, + const char *path, const int snr_level) { - static int last_snr_level = 0; + rssi_data_s *rssi_data = NULL; + const char *default_ifname = NULL; + + rssi_data = __get_rssi_data(interface_name); + if (rssi_data == NULL) + return; - if (snr_level != last_snr_level) { - netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, snr_level); - last_snr_level = snr_level; + if (snr_level != rssi_data->last_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, FALSE); + + 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; + } } } @@ -240,6 +251,7 @@ static void __netconfig_wifi_data_activity_booster(int level) "org.tizen.system.deviced.PmQos", "WifiThroughput", params, + NULL, NULL); if (reply != TRUE) return; @@ -270,6 +282,7 @@ static void __netconfig_wifi_data_activity_booster(int level) "org.tizen.system.deviced.PmQos", "WifiThroughput", params, + NULL, NULL); if (reply != TRUE) return; @@ -277,110 +290,145 @@ 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; - static guint64 netconfig_wifi_rx_bytes = 0; static int booster_tic = 0; static int old_level = 0; int booster_level = 0; - guint64 tx, rx, tx_diff, rx_diff; + guint64 tx, rx; int transfer_state; - if (netconfig_wifi_get_bytes_statistics(&tx, &rx) == TRUE) { - tx_diff = tx - netconfig_wifi_tx_bytes; - rx_diff = rx - netconfig_wifi_rx_bytes; - - if (tx_diff > 0) { - if (rx_diff > 0) - transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_TXRX; - else - transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_TX; - } else { - if (rx_diff > 0) - transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_RX; - else - transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_NONE; - } + if (netconfig_wifi_get_bytes_statistics(&tx, &rx, TRUE)) + netconfig_wifi_set_bytes_pkt_vconf(tx, rx, FALSE); + + netconfig_wifi_get_bytes_default_iface(&tx, &rx); + + if (tx > 0) { + if (rx > 0) + transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_TXRX; + else + transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_TX; + } else { + if (rx > 0) + transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_RX; + else + transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_NONE; + } - if (transfer_state != last_transfer_state) { - netconfig_set_vconf_int(VCONFKEY_WIFI_TRANSFER_STATE, transfer_state); - last_transfer_state = transfer_state; - } + if (transfer_state != last_transfer_state) { + netconfig_set_vconf_int(VCONFKEY_WIFI_TRANSFER_STATE, transfer_state, FALSE); + last_transfer_state = transfer_state; + } - /* NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER */ - if (tx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1 || - rx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1) - booster_level = 1; - else if (tx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2 || - rx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2) - booster_level = 2; - else if (tx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3 || - rx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3) - booster_level = 3; - - if (old_level == booster_level) { - if (--booster_tic <= 0) { - __netconfig_wifi_data_activity_booster(booster_level); - - booster_tic = 2; - } - } else { + /* NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER */ + if (tx >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1 || + rx >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1) + booster_level = 1; + else if (tx >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2 || + rx >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2) + booster_level = 2; + else if (tx >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3 || + rx >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3) + booster_level = 3; + + if (old_level == booster_level) { + if (--booster_tic <= 0) { __netconfig_wifi_data_activity_booster(booster_level); - if (booster_level > 0) - booster_tic = 2; - else - booster_tic = 0; + booster_tic = 2; } + } else { + __netconfig_wifi_data_activity_booster(booster_level); - old_level = booster_level; - - netconfig_wifi_tx_bytes = tx; - netconfig_wifi_rx_bytes = rx; + if (booster_level > 0) + booster_tic = 2; + else + booster_tic = 0; } + + old_level = booster_level; } -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; - if (wifi_state_get_service_state() != NETCONFIG_WIFI_CONNECTED) + if (wifi_state_get_service_state(interface_name) != NETCONFIG_WIFI_CONNECTED) { + g_free(interface_name); return FALSE; + } /* 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 TRUE; - rssi_dbm = __netconfig_wifi_update_and_get_rssi(); - /* INFO("%d dbm", rssi_dbm); */ - snr_level = netconfig_wifi_rssi_level(rssi_dbm); - __netconfig_wifi_set_rssi_level(snr_level); - - __netconfig_wifi_update_indicator(); + __netconfig_wifi_get_statistics(); return TRUE; } -void netconfig_wifi_indicator_start(void) +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; + INFO("Start Wi-Fi indicator"); - netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, VCONFKEY_WIFI_STRENGTH_MAX); - __wifi_indicator_monitor(&netconfig_wifi_indicator_timer); - netconfig_start_timer_seconds(WIFI_INDICATOR_INTERVAL, __wifi_indicator_monitor, NULL, &netconfig_wifi_indicator_timer); + __create_rssi_data(interface_name); + + 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, FALSE); + + wifi_emit_rssi_changed((Wifi *)get_wifi_object(), + interface_name, VCONFKEY_WIFI_STRENGTH_MAX); + + if (netconfig_wifi_statistics_timer == 0) { + netconfig_wifi_reset_last_bytes(); + netconfig_start_timer_seconds(WIFI_INDICATOR_INTERVAL, + __netconfig_wifi_update_statistics, g_strdup(interface_name), + &netconfig_wifi_statistics_timer); + } + + netconfig_battery_update_wifi_rssi(VCONFKEY_WIFI_STRENGTH_MAX); } -void netconfig_wifi_indicator_stop(void) +void netconfig_wifi_indicator_stop(const char *interface_name) { + int wifi_state = 0; + guint64 tx, rx; + INFO("Stop Wi-Fi indicator"); - netconfig_stop_timer(&netconfig_wifi_indicator_timer); + netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state); + + if (wifi_state != VCONFKEY_WIFI_CONNECTED) { + if (netconfig_wifi_get_bytes_statistics(&tx, &rx, TRUE)) + netconfig_wifi_set_bytes_pkt_vconf(tx, rx, FALSE); + + netconfig_stop_timer(&netconfig_wifi_statistics_timer); + } - netconfig_wifi_rssi = VCONFKEY_WIFI_SNR_MIN; - netconfig_wifi_freq = 0; + __destroy_rssi_data(interface_name); }