Telit LTE modems could reply to +WS46=? with:

+WS46: (12,22,25,28-31)

This patch extends +WS46=? response parser to support ranges.
---
Hi,

current mm log is

Jun 15 15:04:04 L2122 ModemManager[831]: <debug> (ttyACM0): --> 'AT+WS46=?<CR>'
Jun 15 15:04:04 L2122 ModemManager[831]: <debug> (ttyACM0): <-- '<CR><LF>'
Jun 15 15:04:04 L2122 ModemManager[831]: <debug> (ttyACM0): <-- '+WS46: 
(12,22,25,28-31)<CR><LF><CR><LF>OK<CR><LF>'
Jun 15 15:04:04 L2122 ModemManager[831]: Invalid +WS46 mode reported: 28-31

Daniele
---
 src/mm-modem-helpers.c         | 58 +++++++++++++++++++++++++++++++-----------
 src/tests/test-modem-helpers.c | 33 ++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 15 deletions(-)

diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
index 73822e1..dbd3cf8 100644
--- a/src/mm-modem-helpers.c
+++ b/src/mm-modem-helpers.c
@@ -920,29 +920,57 @@ mm_3gpp_parse_ws46_test_response (const gchar  *response,
     for (i = 0; split && split[i]; i++) {
         guint val;
         guint j;
+        guint k;
+        GArray *range_values = NULL;
+
+        range_values = g_array_new (FALSE, FALSE, sizeof (guint));
 
         if (!mm_get_uint_from_str (split[i], &val)) {
-            g_warning ("Invalid +WS46 mode reported: %s", split[i]);
-            continue;
+            gchar **split_range;
+            guint range_start;
+            guint range_end;
+
+            split_range = g_strsplit (split[i], "-", -1);
+
+            if (!split_range ||
+                !mm_get_uint_from_str (split_range[0], &range_start) ||
+                !mm_get_uint_from_str (split_range[1], &range_end)) {
+                g_warning ("Invalid +WS46 mode reported: %s", split[i]);
+                g_strfreev (split_range);
+                g_array_free (range_values, TRUE);
+                continue;
+            }
+
+            for (k = range_start; k <= range_end; k++)
+                g_array_append_val (range_values, k);
+            g_strfreev (split_range);
+        } else {
+            g_array_append_val (range_values, val);
         }
 
-        for (j = 0; j < G_N_ELEMENTS (ws46_modes); j++) {
-            if (ws46_modes[j].ws46 == val) {
-                if (val != 25) {
-                    if (ws46_modes[j].mode & MM_MODEM_MODE_4G)
-                        supported_4g = TRUE;
-                    if (ws46_modes[j].mode & MM_MODEM_MODE_3G)
-                        supported_3g = TRUE;
-                    if (ws46_modes[j].mode & MM_MODEM_MODE_2G)
-                        supported_2g = TRUE;
+        for (k = 0; k < range_values->len; k++) {
+            val = g_array_index (range_values, guint, k);
+
+            for (j = 0; j < G_N_ELEMENTS (ws46_modes); j++) {
+                if (ws46_modes[j].ws46 == val) {
+                    if (val != 25) {
+                        if (ws46_modes[j].mode & MM_MODEM_MODE_4G)
+                            supported_4g = TRUE;
+                        if (ws46_modes[j].mode & MM_MODEM_MODE_3G)
+                            supported_3g = TRUE;
+                        if (ws46_modes[j].mode & MM_MODEM_MODE_2G)
+                            supported_2g = TRUE;
+                    }
+                    g_array_append_val (modes, ws46_modes[j].mode);
+                    break;
                 }
-                g_array_append_val (modes, ws46_modes[j].mode);
-                break;
             }
+
+            if (j == G_N_ELEMENTS (ws46_modes))
+                g_warning ("Unknown +WS46 mode reported: %s", split[i]);
         }
 
-        if (j == G_N_ELEMENTS (ws46_modes))
-            g_warning ("Unknown +WS46 mode reported: %s", split[i]);
+        g_array_free (range_values, TRUE);
     }
 
     g_strfreev (split);
diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c
index 5928412..feb4fae 100644
--- a/src/tests/test-modem-helpers.c
+++ b/src/tests/test-modem-helpers.c
@@ -215,6 +215,37 @@ test_ws46_response_telit_le866 (void)
     test_ws46_response (str, expected, G_N_ELEMENTS (expected));
 }
 
+static void
+test_ws46_response_range_1 (void)
+{
+    static const MMModemMode expected[] = {
+        MM_MODEM_MODE_4G,
+        MM_MODEM_MODE_2G | MM_MODEM_MODE_3G,
+        MM_MODEM_MODE_2G | MM_MODEM_MODE_4G,
+        MM_MODEM_MODE_3G | MM_MODEM_MODE_4G,
+    };
+    const gchar *str = "+WS46: (28-31)";
+
+    test_ws46_response (str, expected, G_N_ELEMENTS (expected));
+}
+
+static void
+test_ws46_response_range_2 (void)
+{
+    static const MMModemMode expected[] = {
+        MM_MODEM_MODE_2G,
+        MM_MODEM_MODE_3G,
+        MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G,
+        MM_MODEM_MODE_4G,
+        MM_MODEM_MODE_2G | MM_MODEM_MODE_3G,
+        MM_MODEM_MODE_2G | MM_MODEM_MODE_4G,
+        MM_MODEM_MODE_3G | MM_MODEM_MODE_4G,
+    };
+    const gchar *str = "+WS46: (12,22,25,28-31)";
+
+    test_ws46_response (str, expected, G_N_ELEMENTS (expected));
+}
+
 /*****************************************************************************/
 /* Test CMGL responses */
 
@@ -3715,6 +3746,8 @@ int main (int argc, char **argv)
     g_test_suite_add (suite, TESTCASE (test_ws46_response_generic_2g3g_v2, 
NULL));
     g_test_suite_add (suite, TESTCASE (test_ws46_response_cinterion, NULL));
     g_test_suite_add (suite, TESTCASE (test_ws46_response_telit_le866, NULL));
+    g_test_suite_add (suite, TESTCASE (test_ws46_response_range_1, NULL));
+    g_test_suite_add (suite, TESTCASE (test_ws46_response_range_2, NULL));
 
     g_test_suite_add (suite, TESTCASE (test_cops_response_tm506, NULL));
     g_test_suite_add (suite, TESTCASE (test_cops_response_gt3gplus, NULL));
-- 
2.7.4

_______________________________________________
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel

Reply via email to