From: Mariem Cherif <mariem.che...@ardia.com.tn>

---
 drivers/atmodem/network-registration.c | 45 ++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/drivers/atmodem/network-registration.c 
b/drivers/atmodem/network-registration.c
index a5e2af3..aec9c2d 100644
--- a/drivers/atmodem/network-registration.c
+++ b/drivers/atmodem/network-registration.c
@@ -48,6 +48,7 @@ static const char *cops_prefix[] = { "+COPS:", NULL };
 static const char *csq_prefix[] = { "+CSQ:", NULL };
 static const char *cind_prefix[] = { "+CIND:", NULL };
 static const char *cmer_prefix[] = { "+CMER:", NULL };
+static const char *smoni_prefix[] = { "^SMONI:", "", NULL };
 static const char *zpas_prefix[] = { "+ZPAS:", NULL };
 static const char *option_tech_prefix[] = { "_OCTI:", "_OUWCTI:", NULL };
 
@@ -178,6 +179,32 @@ static int option_parse_tech(GAtResult *result)
        return tech;
 }
 
+static int cinterion_parse_tech(GAtResult *result)
+{
+       int tech = -1;
+       GAtResultIter iter;
+       GSList *l;
+       g_at_result_iter_init(&iter, result);
+       l = result->lines;
+       if (strstr(l->data, "^SMONI: ") != NULL) {
+               gchar **body = g_strsplit(l->data, "^SMONI: ", 2);
+               if (*body != NULL) {
+                       gchar **data = g_strsplit(body[1], ",", 20);
+                       if (*data != NULL) {
+                               if (g_strcmp0(data[0], "2G") == 0) {
+                                       tech = ACCESS_TECHNOLOGY_GSM;
+                               } else if (g_strcmp0 (data[0], "3G") == 0) {
+                                       tech = ACCESS_TECHNOLOGY_UTRAN;
+                               } else if (g_strcmp0 (data[0], "4G") == 0) {
+                                       tech = ACCESS_TECHNOLOGY_EUTRAN;
+                               }
+                       }
+                       g_strfreev(body);
+               }
+       }
+       return tech;
+}
+
 static void at_creg_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
        struct cb_data *cbd = user_data;
@@ -205,6 +232,18 @@ static void at_creg_cb(gboolean ok, GAtResult *result, 
gpointer user_data)
        cb(&error, status, lac, ci, tech, cbd->data);
 }
 
+static void cinterion_query_tech_cb(gboolean ok, GAtResult *result,
+                                              gpointer user_data)
+{
+       struct tech_query *tq = user_data;
+       int tech;
+
+       tech = cinterion_parse_tech(result);
+
+       ofono_netreg_status_notify(tq->netreg,
+                       tq->status, tq->lac, tq->ci, tech);
+}
+
 static void zte_tech_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
        struct cb_data *cbd = user_data;
@@ -1518,6 +1557,12 @@ static void creg_notify(GAtResult *result, gpointer 
user_data)
                                        option_query_tech_cb, tq, g_free) > 0)
                        return;
                break;
+    case OFONO_VENDOR_CINTERION:
+              if (g_at_chat_send(nd->chat, "AT^SMONI",
+                                      smoni_prefix,
+                                      cinterion_query_tech_cb, tq, g_free) > 0)
+                      return;
+              break;
        }
 
        g_free(tq);
-- 
1.9.1

_______________________________________________
ofono mailing list
ofono@ofono.org
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to