summaryrefslogtreecommitdiffstats
path: root/drivers/atmodem/network-registration.c
diff options
context:
space:
mode:
authorBernhard Guillon <Bernhard.Guillon@hale.at>2011-06-08 17:18:34 +0200
committerDenis Kenzior <denkenz@gmail.com>2011-06-06 17:50:03 -0500
commit128f96d097f894e15ee4f0c27459b8071f313724 (patch)
treef0a1756e829b3a363d931888eb63e17c9df20b01 /drivers/atmodem/network-registration.c
parenta805d955b3c4eb15eaacaf789d1054cdca095ccd (diff)
downloadofono-128f96d097f894e15ee4f0c27459b8071f313724.tar.bz2
network-registration.c: add telit support
*add support for CIND=? tokens like ("signal",(0-7,99)) *add telit quirk for token encapsulation e.g. (("one",(0-7,99)),("two",(0-7,99)))
Diffstat (limited to 'drivers/atmodem/network-registration.c')
-rw-r--r--drivers/atmodem/network-registration.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/atmodem/network-registration.c b/drivers/atmodem/network-registration.c
index b3aa511c..149637ef 100644
--- a/drivers/atmodem/network-registration.c
+++ b/drivers/atmodem/network-registration.c
@@ -56,6 +56,7 @@ struct netreg_data {
int signal_index; /* If strength is reported via CIND */
int signal_min; /* min strength reported via CIND */
int signal_max; /* max strength reported via CIND */
+ int signal_invalid; /* invalid strength reported via CIND */
int tech;
struct ofono_network_time time;
guint nitz_timeout;
@@ -666,7 +667,11 @@ static void ciev_notify(GAtResult *result, gpointer user_data)
if (!g_at_result_iter_next_number(&iter, &strength))
return;
- strength = (strength * 100) / (nd->signal_max - nd->signal_min);
+ if (strength == nd->signal_invalid)
+ strength = -1;
+ else
+ strength = (strength * 100) / (nd->signal_max - nd->signal_min);
+
ofono_netreg_strength_notify(netreg, strength);
}
@@ -798,7 +803,10 @@ static void cind_cb(gboolean ok, GAtResult *result, gpointer user_data)
g_at_result_iter_next_number(&iter, &strength);
- strength = (strength * 100) / (nd->signal_max - nd->signal_min);
+ if (strength == nd->signal_invalid)
+ strength = -1;
+ else
+ strength = (strength * 100) / (nd->signal_max - nd->signal_min);
cb(&error, strength, cbd->data);
}
@@ -1133,7 +1141,9 @@ static void cind_support_cb(gboolean ok, GAtResult *result, gpointer user_data)
GAtResultIter iter;
const char *str;
int index;
- int min, max;
+ int min = 0;
+ int max = 0;
+ int tmp_min, tmp_max, invalid;
if (!ok)
goto error;
@@ -1144,15 +1154,30 @@ static void cind_support_cb(gboolean ok, GAtResult *result, gpointer user_data)
index = 1;
+ /*
+ * Telit encapsulates the CIND=? tokens with braces
+ * so we need to skip them
+ */
+ if (nd->vendor == OFONO_VENDOR_TELIT)
+ g_at_result_iter_open_list(&iter);
+
while (g_at_result_iter_open_list(&iter)) {
+ /* Reset invalid default value for every token */
+ invalid = 99;
+
if (!g_at_result_iter_next_string(&iter, &str))
goto error;
if (!g_at_result_iter_open_list(&iter))
goto error;
- while (g_at_result_iter_next_range(&iter, &min, &max))
- ;
+ while (g_at_result_iter_next_range(&iter, &tmp_min, &tmp_max)) {
+ if (tmp_min != tmp_max) {
+ min = tmp_min;
+ max = tmp_max;
+ } else
+ invalid = tmp_min;
+ }
if (!g_at_result_iter_close_list(&iter))
goto error;
@@ -1164,11 +1189,15 @@ static void cind_support_cb(gboolean ok, GAtResult *result, gpointer user_data)
nd->signal_index = index;
nd->signal_min = min;
nd->signal_max = max;
+ nd->signal_invalid = invalid;
}
index += 1;
}
+ if (nd->vendor == OFONO_VENDOR_TELIT)
+ g_at_result_iter_close_list(&iter);
+
if (nd->signal_index == 0)
goto error;