From: Bernhard Guillon <bernhard.guil...@hale.at>

*UC864 has a incompatible CIND
*use specific constants for a KISS callback function
*add a Telit specific check for "not measurable" strength

Co-authored-by: Christopher Vogl <christopher.v...@hale.at>
Signed-off-by: Bernhard Guillon <bernhard.guil...@hale.at>
---
 drivers/atmodem/network-registration.c |   38 +++++++++++++++++++++++++++++--
 1 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/drivers/atmodem/network-registration.c 
b/drivers/atmodem/network-registration.c
index b3aa511..616faa2 100644
--- a/drivers/atmodem/network-registration.c
+++ b/drivers/atmodem/network-registration.c
@@ -48,6 +48,10 @@ static const char *cops_prefix[] = { "+COPS:", NULL };
 static const char *csq_prefix[] = { "+CSQ:", NULL };
 static const char *cind_prefix[] = { "+CIND:", NULL };
 static const char *option_tech_prefix[] = { "_OCTI:", "_OUWCTI:", NULL };
+static const int telit_signal_not_measurable = 99;
+static const int telit_signal_index = 9;
+static const int telit_signal_min = 0;
+static const int telit_signal_max = 5;
 
 struct netreg_data {
        GAtChat *chat;
@@ -666,7 +670,16 @@ 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);
+       switch (nd->vendor) {
+               case OFONO_VENDOR_TELIT:
+                       if (strength == telit_signal_not_measurable)
+                               strength = 0;
+                       else
+                               strength = (strength * 100) / (nd->signal_max - 
nd->signal_min);
+                       break;
+               default:
+                       strength = (strength * 100) / (nd->signal_max - 
nd->signal_min);
+       }
        ofono_netreg_strength_notify(netreg, strength);
 }
 
@@ -798,8 +811,16 @@ 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);
-
+       switch (nd->vendor) {
+               case OFONO_VENDOR_TELIT:
+                       if (strength == telit_signal_not_measurable)
+                               strength = 0;
+                       else
+                               strength = (strength * 100) / (nd->signal_max - 
nd->signal_min);
+                       break;
+               default:
+                       strength = (strength * 100) / (nd->signal_max - 
nd->signal_min);
+       }
        cb(&error, strength, cbd->data);
 }
 
@@ -1302,6 +1323,17 @@ static void at_creg_set_cb(gboolean ok, GAtResult 
*result, gpointer user_data)
        case OFONO_VENDOR_NOKIA:
                /* Signal strength reporting via CIND is not supported */
                break;
+       case OFONO_VENDOR_TELIT:
+               // FIXME: We use RSSI instead of signal.
+               // FIXME: Consider reading signal index from modem.
+               nd->signal_index = telit_signal_index;
+               nd->signal_min = telit_signal_min;
+               nd->signal_max = telit_signal_max;
+               g_at_chat_send(nd->chat, "AT+CIND=1", cind_prefix,
+                                                               NULL, NULL, 
NULL);
+               g_at_chat_register(nd->chat, "+CIEV:",
+                                               ciev_notify, FALSE, netreg, 
NULL);
+               break;
        default:
                g_at_chat_send(nd->chat, "AT+CIND=?", cind_prefix,
                                cind_support_cb, netreg, NULL);
-- 
1.7.0.4



--
Scanned by MailScanner.

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to