<div dir="ltr">Hello guys,<div>any news about this patch? Is there something I need to fix?<br><br>Thanks,<br>Carlo</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 28 Jan 2016 at 17:30 <<a href="mailto:c.lobrano@gmail.com">c.lobrano@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Carlo Lobrano <<a href="mailto:c.lobrano@gmail.com" target="_blank">c.lobrano@gmail.com</a>><br>
<br>
---<br>
 plugins/telit/mm-broadband-modem-telit.c          | 78 +++++++++++++-----<br>
 plugins/telit/mm-modem-helpers-telit.c            | 97 +++++++++++++++--------<br>
 plugins/telit/mm-modem-helpers-telit.h            | 21 +++--<br>
 plugins/telit/tests/test-mm-modem-helpers-telit.c | 89 +++++++++++++++++++--<br>
 4 files changed, 220 insertions(+), 65 deletions(-)<br>
<br>
diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c<br>
index 77b1800..bb2c3ce 100644<br>
--- a/plugins/telit/mm-broadband-modem-telit.c<br>
+++ b/plugins/telit/mm-broadband-modem-telit.c<br>
@@ -41,28 +41,30 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemTelit, mm_broadband_modem_telit, MM_TYPE<br>
                         G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init));<br>
<br>
 /*****************************************************************************/<br>
-/* Load supported bands (Modem interface) */<br>
+/* Load current bands (Modem interface) */<br>
+<br>
 typedef struct {<br>
     MMIfaceModem *self;<br>
     GSimpleAsyncResult *result;<br>
     gboolean mm_modem_is_2g;<br>
     gboolean mm_modem_is_3g;<br>
     gboolean mm_modem_is_4g;<br>
-} LoadSupportedBandsContext;<br>
+    LoadBandsType band_type;<br>
+} LoadBandsContext;<br>
<br>
 static void<br>
-load_supported_bands_context_complete_and_free (LoadSupportedBandsContext *ctx)<br>
+load_supported_bands_context_complete_and_free (LoadBandsContext *ctx)<br>
 {<br>
     g_simple_async_result_complete (ctx->result);<br>
     g_object_unref (ctx->result);<br>
     g_object_unref (ctx->self);<br>
-    g_slice_free (LoadSupportedBandsContext, ctx);<br>
+    g_slice_free (LoadBandsContext, ctx);<br>
 }<br>
<br>
 static GArray *<br>
-modem_load_supported_bands_finish (MMIfaceModem *self,<br>
-                                   GAsyncResult *res,<br>
-                                   GError **error)<br>
+modem_load_bands_finish (MMIfaceModem *self,<br>
+                         GAsyncResult *res,<br>
+                         GError **error)<br>
 {<br>
     if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))<br>
         return NULL;<br>
@@ -72,9 +74,9 @@ modem_load_supported_bands_finish (MMIfaceModem *self,<br>
 }<br>
<br>
 static void<br>
-load_supported_bands_ready (MMBaseModem *self,<br>
-                            GAsyncResult *res,<br>
-                            LoadSupportedBandsContext *ctx)<br>
+load_bands_ready (MMBaseModem *self,<br>
+                  GAsyncResult *res,<br>
+                  LoadBandsContext *ctx)<br>
 {<br>
     const gchar *response;<br>
     GError *error = NULL;<br>
@@ -84,12 +86,13 @@ load_supported_bands_ready (MMBaseModem *self,<br>
<br>
     if (!response)<br>
         g_simple_async_result_take_error (ctx->result, error);<br>
-    else if (!mm_telit_parse_supported_bands_response (response,<br>
-                                                       ctx->mm_modem_is_2g,<br>
-                                                       ctx->mm_modem_is_3g,<br>
-                                                       ctx->mm_modem_is_4g,<br>
-                                                       &bands,<br>
-                                                       &error))<br>
+    else if (!mm_telit_parse_bnd_response (response,<br>
+                                           ctx->mm_modem_is_2g,<br>
+                                           ctx->mm_modem_is_3g,<br>
+                                           ctx->mm_modem_is_4g,<br>
+                                           ctx->band_type,<br>
+                                           &bands,<br>
+                                           &error))<br>
         g_simple_async_result_take_error (ctx->result, error);<br>
     else<br>
         g_simple_async_result_set_op_res_gpointer (ctx->result, bands, (GDestroyNotify)g_array_unref);<br>
@@ -98,18 +101,51 @@ load_supported_bands_ready (MMBaseModem *self,<br>
 }<br>
<br>
 static void<br>
+modem_load_current_bands (MMIfaceModem *self,<br>
+                          GAsyncReadyCallback callback,<br>
+                          gpointer user_data)<br>
+{<br>
+    LoadBandsContext *ctx;<br>
+<br>
+    ctx = g_slice_new0 (LoadBandsContext);<br>
+<br>
+    ctx->self = g_object_ref (self);<br>
+    ctx->mm_modem_is_2g = mm_iface_modem_is_2g (ctx->self);<br>
+    ctx->mm_modem_is_3g = mm_iface_modem_is_3g (ctx->self);<br>
+    ctx->mm_modem_is_4g = mm_iface_modem_is_4g (ctx->self);<br>
+    ctx->band_type = LOAD_CURRENT_BANDS;<br>
+<br>
+    ctx->result = g_simple_async_result_new (G_OBJECT (self),<br>
+                                             callback,<br>
+                                             user_data,<br>
+                                             modem_load_current_bands);<br>
+<br>
+    mm_base_modem_at_command (MM_BASE_MODEM (self),<br>
+                              "#BND?",<br>
+                              3,<br>
+                              FALSE,<br>
+                              (GAsyncReadyCallback) load_bands_ready,<br>
+                              ctx);<br>
+}<br>
+<br>
+<br>
+/*****************************************************************************/<br>
+/* Load supported bands (Modem interface) */<br>
+<br>
+static void<br>
 modem_load_supported_bands (MMIfaceModem *self,<br>
                             GAsyncReadyCallback callback,<br>
                             gpointer user_data)<br>
 {<br>
-    LoadSupportedBandsContext *ctx;<br>
+    LoadBandsContext *ctx;<br>
<br>
-    ctx = g_slice_new0 (LoadSupportedBandsContext);<br>
+    ctx = g_slice_new0 (LoadBandsContext);<br>
<br>
     ctx->self = g_object_ref (self);<br>
     ctx->mm_modem_is_2g = mm_iface_modem_is_2g (ctx->self);<br>
     ctx->mm_modem_is_3g = mm_iface_modem_is_3g (ctx->self);<br>
     ctx->mm_modem_is_4g = mm_iface_modem_is_4g (ctx->self);<br>
+    ctx->band_type = LOAD_SUPPORTED_BANDS;<br>
<br>
     ctx->result = g_simple_async_result_new (G_OBJECT (self),<br>
                                              callback,<br>
@@ -120,7 +156,7 @@ modem_load_supported_bands (MMIfaceModem *self,<br>
                               "#BND=?",<br>
                               3,<br>
                               FALSE,<br>
-                              (GAsyncReadyCallback) load_supported_bands_ready,<br>
+                              (GAsyncReadyCallback) load_bands_ready,<br>
                               ctx);<br>
 }<br>
<br>
@@ -601,8 +637,10 @@ mm_broadband_modem_telit_init (MMBroadbandModemTelit *self)<br>
 static void<br>
 iface_modem_init (MMIfaceModem *iface)<br>
 {<br>
+    iface->load_current_bands = modem_load_current_bands;<br>
+    iface->load_current_bands_finish = modem_load_bands_finish;<br>
     iface->load_supported_bands = modem_load_supported_bands;<br>
-    iface->load_supported_bands_finish = modem_load_supported_bands_finish;<br>
+    iface->load_supported_bands_finish = modem_load_bands_finish;<br>
     iface->load_unlock_retries_finish = modem_load_unlock_retries_finish;<br>
     iface->load_unlock_retries = modem_load_unlock_retries;<br>
     iface->reset = modem_reset;<br>
diff --git a/plugins/telit/mm-modem-helpers-telit.c b/plugins/telit/mm-modem-helpers-telit.c<br>
index 91609f2..0bd44b8 100644<br>
--- a/plugins/telit/mm-modem-helpers-telit.c<br>
+++ b/plugins/telit/mm-modem-helpers-telit.c<br>
@@ -77,12 +77,16 @@ mm_telit_parse_csim_response (const guint step,<br>
     return retries;<br>
 }<br>
<br>
+#define SUPP_BAND_RESPONSE_REGEX          "#BND:\\s*\\((?P<Bands2G>.*)\\),\\s*\\((?P<Bands3G>.*)\\)"<br>
+#define SUPP_BAND_4G_MODEM_RESPONSE_REGEX "#BND:\\s*\\((?P<Bands2G>.*)\\),\\s*\\((?P<Bands3G>.*)\\),\\s*\\((?P<Bands4G>\\d+-\\d+)\\)"<br>
+#define CURR_BAND_RESPONSE_REGEX          "#BND:\\s*(?P<Bands2G>\\d+),\\s*(?P<Bands3G>\\d+)"<br>
+#define CURR_BAND_4G_MODEM_RESPONSE_REGEX "#BND:\\s*(?P<Bands2G>\\d+),\\s*(?P<Bands3G>\\d+),\\s*(?P<Bands4G>\\d+)"<br>
+<br>
 /*****************************************************************************/<br>
-/* #BND=? response parser<br>
+/* #BND response parser<br>
  *<br>
- * Example:<br>
- *  AT#BND=?<br>
- *      #BND: <2G band flags>,<3G band flags>[, <4G band flags>]<br>
+ * AT#BND=?<br>
+ *      #BND: <2G band flags range>,<3G band flags range>[, <4G band flags range>]<br>
  *<br>
  *  where "band flags" is a list of numbers definining the supported bands.<br>
  *  Note that the one Telit band flag may represent more than one MM band.<br>
@@ -113,29 +117,55 @@ mm_telit_parse_csim_response (const guint step,<br>
  *      (2-4106)<br>
  *       2 = 2^1 --> lower supported band B2<br>
  *       4106 = 2^1 + 2^3 + 2^12 --> the supported bands are B2, B4, B13<br>
+ *<br>
+ *<br>
+ * AT#BND?<br>
+ *      #BND: <2G band flags>,<3G band flags>[, <4G band flags>]<br>
+ *<br>
+ *  where "band flags" is a number definining the current bands.<br>
+ *  Note that the one Telit band flag may represent more than one MM band.<br>
+ *<br>
+ *  e.g.<br>
+ *<br>
+ *  #BND: 0,4<br>
+ *<br>
+ *  0 = 2G band flag 0 is EGSM + DCS<br>
+ *  4 = 3G band flag 4 is U1900 + U850<br>
+ *<br>
  */<br>
-<br>
-#define SUPP_BAND_RESPONSE_REGEX          "#BND:\\s*\\((?P<Bands2G>.*)\\),\\s*\\((?P<Bands3G>.*)\\)"<br>
-#define SUPP_BAND_4G_MODEM_RESPONSE_REGEX "#BND:\\s*\\((?P<Bands2G>.*)\\),\\s*\\((?P<Bands3G>.*)\\),\\s*\\((?P<Bands4G>\\d+-\\d+)\\)"<br>
-<br>
 gboolean<br>
-mm_telit_parse_supported_bands_response (const gchar *response,<br>
-                                         const gboolean modem_is_2g,<br>
-                                         const gboolean modem_is_3g,<br>
-                                         const gboolean modem_is_4g,<br>
-                                         GArray **supported_bands,<br>
-                                         GError **error)<br>
+mm_telit_parse_bnd_response (const gchar *response,<br>
+                             const gboolean modem_is_2g,<br>
+                             const gboolean modem_is_3g,<br>
+                             const gboolean modem_is_4g,<br>
+                             const LoadBandsType band_type,<br>
+                             GArray **supported_bands,<br>
+                             GError **error)<br>
 {<br>
     GArray *bands = NULL;<br>
     GMatchInfo *match_info = NULL;<br>
     GRegex *r = NULL;<br>
     gboolean ret = FALSE;<br>
<br>
-    /* Parse #BND=? response */<br>
-    if (modem_is_4g)<br>
-        r = g_regex_new (SUPP_BAND_4G_MODEM_RESPONSE_REGEX, G_REGEX_RAW, 0, NULL);<br>
-    else<br>
-        r = g_regex_new (SUPP_BAND_RESPONSE_REGEX, G_REGEX_RAW, 0, NULL);<br>
+    switch (band_type) {<br>
+        case LOAD_SUPPORTED_BANDS:<br>
+            /* Parse #BND=? response */<br>
+            if (modem_is_4g)<br>
+                r = g_regex_new (SUPP_BAND_4G_MODEM_RESPONSE_REGEX, G_REGEX_RAW, 0, NULL);<br>
+            else<br>
+                r = g_regex_new (SUPP_BAND_RESPONSE_REGEX, G_REGEX_RAW, 0, NULL);<br>
+            break;<br>
+        case LOAD_CURRENT_BANDS:<br>
+            /* Parse #BND? response */<br>
+            if (modem_is_4g)<br>
+                r = g_regex_new (CURR_BAND_4G_MODEM_RESPONSE_REGEX, G_REGEX_RAW, 0, NULL);<br>
+            else<br>
+                r = g_regex_new (CURR_BAND_RESPONSE_REGEX, G_REGEX_RAW, 0, NULL);<br>
+            break;<br>
+        default:<br>
+            break;<br>
+    }<br>
+<br>
<br>
     if (!g_regex_match (r, response, 0, &match_info)) {<br>
         g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,<br>
@@ -310,7 +340,7 @@ mm_telit_get_4g_mm_bands(GMatchInfo *match_info,<br>
     gboolean ret = TRUE;<br>
     gchar *match_str = NULL;<br>
     guint i;<br>
-    guint max_value;<br>
+    guint value;<br>
     gchar **tokens;<br>
<br>
     match_str = g_match_info_fetch_named (match_info, "Bands4G");<br>
@@ -322,25 +352,28 @@ mm_telit_get_4g_mm_bands(GMatchInfo *match_info,<br>
         goto end;<br>
     }<br>
<br>
-    tokens = g_strsplit (match_str, "-", -1);<br>
-    if (tokens == NULL) {<br>
-        g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,<br>
-                     "Could not get 4G band ranges from string '%s'",<br>
-                     match_str);<br>
-        ret = FALSE;<br>
-        goto end;<br>
+    if (strstr(match_str, "-")) {<br>
+        tokens = g_strsplit (match_str, "-", -1);<br>
+        if (tokens == NULL) {<br>
+            g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,<br>
+                         "Could not get 4G band ranges from string '%s'",<br>
+                         match_str);<br>
+            ret = FALSE;<br>
+            goto end;<br>
+        }<br>
+        sscanf (tokens[1], "%d", &value);<br>
+    } else {<br>
+        sscanf (match_str, "%d", &value);<br>
     }<br>
<br>
-    sscanf (tokens[1], "%d", &max_value);<br>
<br>
-    for (i = 0; max_value > 0; i++) {<br>
-        if (max_value % 2 != 0) {<br>
+    for (i = 0; value > 0; i++) {<br>
+        if (value % 2 != 0) {<br>
             band = MM_MODEM_BAND_EUTRAN_I + i;<br>
             g_array_append_val (*bands, band);<br>
         }<br>
-        max_value = max_value >> 1;<br>
+        value = value >> 1;<br>
     }<br>
-<br>
 end:<br>
     if (match_str != NULL)<br>
         g_free (match_str);<br>
diff --git a/plugins/telit/mm-modem-helpers-telit.h b/plugins/telit/mm-modem-helpers-telit.h<br>
index d0d74b5..affdf76 100644<br>
--- a/plugins/telit/mm-modem-helpers-telit.h<br>
+++ b/plugins/telit/mm-modem-helpers-telit.h<br>
@@ -65,14 +65,21 @@ gint mm_telit_parse_csim_response (const guint step,<br>
                                    const gchar *response,<br>
                                    GError **error);<br>
<br>
-/* #BND=? response parser */<br>
+typedef enum {<br>
+    LOAD_SUPPORTED_BANDS,<br>
+    LOAD_CURRENT_BANDS<br>
+} LoadBandsType;<br>
+<br>
+/* #BND response parser */<br>
 gboolean<br>
-mm_telit_parse_supported_bands_response (const gchar *response,<br>
-                                         const gboolean modem_is_2g,<br>
-                                         const gboolean modem_is_3g,<br>
-                                         const gboolean modem_is_4g,<br>
-                                         GArray **supported_bands,<br>
-                                         GError **error);<br>
+mm_telit_parse_bnd_response (const gchar *response,<br>
+                             const gboolean modem_is_2g,<br>
+                             const gboolean modem_is_3g,<br>
+                             const gboolean modem_is_4g,<br>
+                             const LoadBandsType band_type,<br>
+                             GArray **supported_bands,<br>
+                             GError **error);<br>
+<br>
<br>
 gboolean mm_telit_bands_contains (GArray *mm_bands, const MMModemBand mm_band);<br>
<br>
diff --git a/plugins/telit/tests/test-mm-modem-helpers-telit.c b/plugins/telit/tests/test-mm-modem-helpers-telit.c<br>
index 857b93f..cac10fb 100644<br>
--- a/plugins/telit/tests/test-mm-modem-helpers-telit.c<br>
+++ b/plugins/telit/tests/test-mm-modem-helpers-telit.c<br>
@@ -213,12 +213,13 @@ test_parse_supported_bands_response (void) {<br>
     GArray* bands = NULL;<br>
<br>
     for (i = 0; supported_band_mapping_tests[i].response != NULL; i++) {<br>
-        res = mm_telit_parse_supported_bands_response (supported_band_mapping_tests[i].response,<br>
-                                                       supported_band_mapping_tests[i].modem_is_2g,<br>
-                                                       supported_band_mapping_tests[i].modem_is_3g,<br>
-                                                       supported_band_mapping_tests[i].modem_is_4g,<br>
-                                                       &bands,<br>
-                                                       &error);<br>
+        res = mm_telit_parse_bnd_response (supported_band_mapping_tests[i].response,<br>
+                                           supported_band_mapping_tests[i].modem_is_2g,<br>
+                                           supported_band_mapping_tests[i].modem_is_3g,<br>
+                                           supported_band_mapping_tests[i].modem_is_4g,<br>
+                                           LOAD_SUPPORTED_BANDS,<br>
+                                           &bands,<br>
+                                           &error);<br>
         g_assert_no_error (error);<br>
         g_assert_true (res);<br>
<br>
@@ -239,6 +240,81 @@ test_parse_supported_bands_response (void) {<br>
     }<br>
 }<br>
<br>
+<br>
+static BNDResponseTest current_band_mapping_tests [] = {<br>
+    { "#BND: 0,5", TRUE, TRUE, FALSE, 3, { MM_MODEM_BAND_EGSM,<br>
+                                           MM_MODEM_BAND_DCS,<br>
+                                           MM_MODEM_BAND_U900<br>
+                                         }<br>
+    },<br>
+    { "#BND: 1,3", TRUE, TRUE, FALSE, 5, { MM_MODEM_BAND_EGSM,<br>
+                                           MM_MODEM_BAND_PCS,<br>
+                                           MM_MODEM_BAND_U2100,<br>
+                                           MM_MODEM_BAND_U1900,<br>
+                                           MM_MODEM_BAND_U850,<br>
+                                         }<br>
+    },<br>
+    { "#BND: 2,7", TRUE, TRUE, FALSE, 3, { MM_MODEM_BAND_DCS,<br>
+                                           MM_MODEM_BAND_G850,<br>
+                                           MM_MODEM_BAND_U17IV<br>
+                                         },<br>
+    },<br>
+    { "#BND: 3,0,1", TRUE, TRUE, TRUE, 4, { MM_MODEM_BAND_PCS,<br>
+                                            MM_MODEM_BAND_G850,<br>
+                                            MM_MODEM_BAND_U2100,<br>
+                                            MM_MODEM_BAND_EUTRAN_I<br>
+                                          }<br>
+    },<br>
+    { "#BND: 0,0,3", TRUE, FALSE, TRUE, 4, { MM_MODEM_BAND_EGSM,<br>
+                                            MM_MODEM_BAND_DCS,<br>
+                                            MM_MODEM_BAND_EUTRAN_I,<br>
+                                            MM_MODEM_BAND_EUTRAN_II<br>
+                                          }<br>
+    },<br>
+    { "#BND: 0,0,3", FALSE, FALSE, TRUE, 2, { MM_MODEM_BAND_EUTRAN_I,<br>
+                                              MM_MODEM_BAND_EUTRAN_II<br>
+                                            }<br>
+    },<br>
+    { NULL, FALSE, FALSE, FALSE, 0, {}},<br>
+};<br>
+<br>
+static void<br>
+test_parse_current_bands_response (void) {<br>
+    GError* error = NULL;<br>
+    gboolean res = FALSE;<br>
+    guint i, j;<br>
+    GArray* bands = NULL;<br>
+<br>
+    for (i = 0; current_band_mapping_tests[i].response != NULL; i++) {<br>
+        res = mm_telit_parse_bnd_response (current_band_mapping_tests[i].response,<br>
+                                           current_band_mapping_tests[i].modem_is_2g,<br>
+                                           current_band_mapping_tests[i].modem_is_3g,<br>
+                                           current_band_mapping_tests[i].modem_is_4g,<br>
+                                           LOAD_CURRENT_BANDS,<br>
+                                           &bands,<br>
+                                           &error);<br>
+        g_assert_no_error (error);<br>
+        g_assert_true (res);<br>
+<br>
+<br>
+        for (j = 0; j < current_band_mapping_tests[i].mm_bands_len; j++) {<br>
+            MMModemBand ref;<br>
+            MMModemBand cur;<br>
+<br>
+            ref = current_band_mapping_tests[i].mm_bands[j];<br>
+            cur = g_array_index (bands, MMModemBand, j);<br>
+            g_assert_cmpint (cur, ==, ref);<br>
+        }<br>
+<br>
+        g_assert_cmpint (bands->len, ==, current_band_mapping_tests[i].mm_bands_len);<br>
+<br>
+        g_array_free (bands, FALSE);<br>
+        bands = NULL;<br>
+    }<br>
+}<br>
+<br>
+<br>
+<br>
 int main (int argc, char **argv)<br>
 {<br>
     setlocale (LC_ALL, "");<br>
@@ -250,5 +326,6 @@ int main (int argc, char **argv)<br>
     g_test_add_func ("/MM/telit/bands/supported/bands_contains", test_mm_bands_contains);<br>
     g_test_add_func ("/MM/telit/bands/supported/parse_band_flag", test_parse_band_flag_str);<br>
     g_test_add_func ("/MM/telit/bands/supported/parse_bands_response", test_parse_supported_bands_response);<br>
+    g_test_add_func ("/MM/telit/bands/current/parse_bands_response", test_parse_current_bands_response);<br>
     return g_test_run ();<br>
 }<br>
--<br>
2.1.4<br>
<br>
</blockquote></div>