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