#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#define VCONFKEY_WIFI_SNR_MIN -89
-#define NETCONFIG_WIFI_INDICATOR_INTERVAL 1
+#if !defined TIZEN_WEARABLE
+#define WIFI_INDICATOR_INTERVAL 1
+#else
+#define WIFI_INDICATOR_INTERVAL 10
+#endif
#if defined TIZEN_WEARABLE
#define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1 (19200 * 1024)
static int __netconfig_wifi_update_and_get_rssi(void)
{
- FILE *fp;
- char buf[512];
- char *p_ifname = NULL, *p_entry = NULL;
+ 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;
- fp = fopen(NETCONFIG_PROCWIRELESS, "r");
- if (fp == NULL) {
- ERR("Failed to open %s", NETCONFIG_PROCWIRELESS);
- return rssi_dbm;
+ if_path = netconfig_wifi_get_supplicant_interface();
+ if (if_path == NULL) {
+ ERR("Fail to get wpa_supplicant DBus path");
+ return 0;
}
- /* skip the first and second line */
- if (fgets(buf, sizeof(buf), fp) == NULL ||
- fgets(buf, sizeof(buf), fp) == NULL)
- goto endline;
-
- while (fgets(buf, sizeof(buf), fp)) {
- unsigned int status;
- int link, noise;
- /* No need to read */
- /*
- unsigned long nwid, crypt, frag, retry, misc, missed;
- */
-
- p_ifname = buf;
- while (*p_ifname == ' ') p_ifname++;
- p_entry = strchr(p_ifname, ':');
- if (p_entry == NULL)
- goto endline;
- *p_entry++ = '\0';
-
- if (g_strcmp0(p_ifname, WIFI_IFNAME) != 0)
- continue;
-
- /* read wireless status */
- p_entry = strtok(p_entry, " ."); // status "%x"
- if (p_entry != NULL)
- sscanf(p_entry, "%x", &status);
- p_entry = strtok(NULL, " ."); // Quality link "%d"
- if (p_entry != NULL)
- sscanf(p_entry, "%d", &link);
- p_entry = strtok(NULL, " ."); // Quality level "%d"
- if (p_entry != NULL)
- sscanf(p_entry, "%d", &rssi_dbm);
- p_entry = strtok(NULL, " ."); // Quality noise "%d"
- if (p_entry != NULL)
- sscanf(p_entry, "%d", &noise);
-
- /* No need to read */
- /*
- p_entry = strtok(NULL, " ."); // Discarded nwid "%lu"
- sscanf(p_entry, "%lu", &nwid);
- p_entry = strtok(NULL, " ."); // Discarded crypt "%lu"
- sscanf(p_entry, "%lu", &crypt);
- p_entry = strtok(NULL, " ."); // Discarded frag "%lu"
- sscanf(p_entry, "%lu", &frag);
- p_entry = strtok(NULL, " ."); // Discarded retry "%lu"
- sscanf(p_entry, "%lu", &retry);
- p_entry = strtok(NULL, " ."); // Discarded misc "%lu"
- sscanf(p_entry, "%lu", &misc);
- p_entry = strtok(NULL, " ."); // Discarded missed "%lu"
- sscanf(p_entry, "%lu", &missed);
- */
+ 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;
+ }
- break;
+ g_variant_get(message, "(v)", &value);
+
+ g_variant_get(value, "a{sv}", &iter);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ key_value = g_variant_get_int32(variant);
+
+ if (g_strcmp0(key, "rssi") == 0) {
+ rssi_dbm = (int)key_value;
+ DBG("Currently signal dbm value [%d]", rssi_dbm);
+ g_variant_unref(variant);
+ g_free(key);
+ break;
+ }
}
-endline:
- fclose(fp);
+ g_variant_iter_free(iter);
+
+ if (value)
+ g_variant_unref(value);
+
+ g_variant_unref(message);
+
+ g_free(if_path);
+
netconfig_wifi_rssi = rssi_dbm;
return rssi_dbm;
}
-int netconfig_wifi_rssi_level(const int rssi_dbm)
+static int __netconfig_wifi_convert_dbm_to_level_24(int rssi_dbm)
{
- int snr_level = 0;
+ int rssi_level = 0;
- /* Wi-Fi Signal Strength Display
+ /* Wi-Fi Signal Strength Display (for 2.4G (dB))
*
- * Excellent : -63 ~
- * Good: -74 ~ -64
- * Weak: -82 ~ -75
- * Very weak: ~ -83
+ * Excellent : ~ -63
+ * Good : -64 ~ -74
+ * Weak : -75 ~ -82
+ * Very weak : -83 ~ -88
+ * No signal : -89 ~
*/
+
if (rssi_dbm >= -63)
- snr_level = 4;
+ rssi_level = 4;
else if (rssi_dbm >= -74)
- snr_level = 3;
+ rssi_level = 3;
else if (rssi_dbm >= -82)
- snr_level = 2;
+ rssi_level = 2;
+ else if (rssi_dbm >= -88)
+ rssi_level = 1;
+ else
+ rssi_level = 0;
+
+ return rssi_level;
+}
+
+static int __netconfig_wifi_convert_dbm_to_level_50(int rssi_dbm)
+{
+ int rssi_level = 0;
+
+ /* Wi-Fi Signal Strength Display (for 5G (dB))
+ *
+ * Excellent : ~ -72
+ * Good : -73 ~ -78
+ * Weak : -79 ~ -83
+ * Very weak : -84 ~ -88
+ * No signal : -89 ~
+ */
+
+ if (rssi_dbm >= -72)
+ rssi_level = 4;
+ else if (rssi_dbm >= -78)
+ rssi_level = 3;
+ else if (rssi_dbm >= -83)
+ rssi_level = 2;
+ else if (rssi_dbm >= -88)
+ rssi_level = 1;
else
- snr_level = 1;
+ rssi_level = 0;
+
+ return rssi_level;
+}
+
+int netconfig_wifi_rssi_level(const int rssi_dbm)
+{
+ int snr_level = 0;
+ int freq = 0;
+ int ret = 0;
+
+ ret = netconfig_vconf_get_int("memory/private/wifi/frequency", &freq);
+
+ if (!ret && freq > 4900)
+ snr_level = __netconfig_wifi_convert_dbm_to_level_50(rssi_dbm);
+ else
+ snr_level = __netconfig_wifi_convert_dbm_to_level_24(rssi_dbm);
return snr_level;
}
if (level > 0) {
/* enable booster */
- switch(level) {
+ switch (level) {
case 1:
params = g_variant_new("(ii)", level1, lock);
break;
if (old_level == 0 || old_level == level)
return;
- switch(old_level) {
+ switch (old_level) {
case 1:
params = g_variant_new("(ii)", level1, unlock);
break;
}
if (transfer_state != last_transfer_state) {
- netconfig_set_vconf_int(VCONFKEY_WIFI_TRANSFER_STATE,
- transfer_state);
+ netconfig_set_vconf_int(VCONFKEY_WIFI_TRANSFER_STATE, transfer_state);
last_transfer_state = transfer_state;
}
}
}
-static gboolean __netconfig_wifi_indicator_monitor(gpointer data)
+static gboolean __wifi_indicator_monitor(gpointer data)
{
int rssi_dbm = 0;
int snr_level = 0;
int pm_state = VCONFKEY_PM_STATE_NORMAL;
- if (netconfig_wifi_state_get_service_state() != NETCONFIG_WIFI_CONNECTED)
+ if (wifi_state_get_service_state() != NETCONFIG_WIFI_CONNECTED)
return FALSE;
/* In case of LCD off, we don't need to update Wi-Fi indicator */
- vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
+ 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);
+ /* INFO("%d dbm", rssi_dbm); */
snr_level = netconfig_wifi_rssi_level(rssi_dbm);
__netconfig_wifi_set_rssi_level(snr_level);
INFO("Start Wi-Fi indicator");
netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, VCONFKEY_WIFI_STRENGTH_MAX);
-
- netconfig_start_timer_seconds(
- NETCONFIG_WIFI_INDICATOR_INTERVAL,
- __netconfig_wifi_indicator_monitor,
- NULL,
- &netconfig_wifi_indicator_timer);
+ netconfig_start_timer_seconds(WIFI_INDICATOR_INTERVAL, __wifi_indicator_monitor, NULL, &netconfig_wifi_indicator_timer);
}
void netconfig_wifi_indicator_stop(void)