From: Bernhard Guillon <[email protected]>

*add support for CIND=? tokens like ("signal",(0-7,99))
*add support for token encapsulation e.g.
    (("one",(0-7,99)),("two",(0-7,99)))
---
 drivers/atmodem/network-registration.c |   51 ++++++++++++++++++++++++++++---
 1 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/drivers/atmodem/network-registration.c 
b/drivers/atmodem/network-registration.c
index b3aa511..18f2299 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,10 @@ 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 +802,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 +1140,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;
@@ -1145,14 +1154,45 @@ static void cind_support_cb(gboolean ok, GAtResult 
*result, gpointer user_data)
        index = 1;
 
        while (g_at_result_iter_open_list(&iter)) {
+               /*
+                * Some modems encapsulate the result list in braces
+                * So we just skip the opening brace in this case.
+                * We do not need to care about the closing one.
+                */
+               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)) {
+                       /*
+                        * This part of code makes havy use of the 
implementation
+                        * details of g_at_result_iter_next_range()
+                        * We currently support this token type ("signal",(0-5))
+                        * While tokens like this ("call",(0,1))
+                        * will be parsed to the end to get to the next token.
+                        * With the same idea we can support tokens like
+                        * ("signal",(0-7,99)) it is unlikely that a valid
+                        * token is "signal",(0-0) so if both values are the
+                        * same we know we are at the 99 case of (0-7,99)
+                        * This implementation only works because of how the 
+                        * g_at_result_iter_next_range() function is implemented
+                        * if it changes this code will break.
+                        */
+                       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,6 +1204,7 @@ 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;
-- 
1.7.0.4



--
Scanned by MailScanner.

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to