[PATCH 1/1] helpers: extend +WS46=? response parser to support ranges

Aleksander Morgado aleksander at aleksander.es
Fri Jun 16 08:39:18 UTC 2017


Hey Daniele,

On Fri, Jun 16, 2017 at 10:11 AM, Daniele Palmas <dnlplm at gmail.com> wrote:
> 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


How about using this method instead? It already supports parsing lists
of numbers, including intervals:
   GArray *mm_parse_uint_list (const gchar  *str, GError **error)

See:
   https://cgit.freedesktop.org/ModemManager/ModemManager/tree/src/mm-modem-helpers.c#n139

> ---
>  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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel



-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list