Hi Aleksander,

2017-06-16 10:39 GMT+02:00 Aleksander Morgado <aleksan...@aleksander.es>:
> Hey Daniele,
>
> On Fri, Jun 16, 2017 at 10:11 AM, Daniele Palmas <dnl...@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
>

Sorry, I missed that :-( I will write a new patch.

Thanks,
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
>
>
>
> --
> Aleksander
> https://aleksander.es
_______________________________________________
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel

Reply via email to