diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-31 15:41:19 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:43 +0100 |
commit | edc117406888f489d4ebd29b6d08ea67d60bb99c (patch) | |
tree | cdce7acedff69fa8b4a7b2d7e440f4be6e1cd43c /src | |
parent | d5af2286e2ecd18e653ea63c601d7528af56a45c (diff) |
broadband-modem: try +CSQ? if +CSQ fails
As done in the generic CDMA implementation
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 920326d3..4445fe78 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -841,14 +841,15 @@ load_signal_quality_finish (MMIfaceModem *self, } static void -load_signal_quality_csf_ready (MMBroadbandModem *self, +load_signal_quality_csq_ready (MMBroadbandModem *self, GAsyncResult *res, GSimpleAsyncResult *simple) { GError *error = NULL; - const gchar *result; + GVariant *result; + const gchar *result_str; - result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error); + result = mm_base_modem_at_sequence_finish (MM_BASE_MODEM (self), res, NULL, &error); if (error) { g_simple_async_result_take_error (simple, error); g_simple_async_result_complete (simple); @@ -856,13 +857,14 @@ load_signal_quality_csf_ready (MMBroadbandModem *self, return; } - if (result && - !strncmp (result, "+CSQ: ", 6)) { + result_str = g_variant_get_string (result, NULL); + if (result_str && + !strncmp (result_str, "+CSQ: ", 6)) { /* Got valid reply */ int quality; int ber; - if (sscanf (result + 6, "%d, %d", &quality, &ber)) { + if (sscanf (result_str + 6, "%d, %d", &quality, &ber)) { /* 99 means unknown */ if (quality == 99) { g_simple_async_result_take_error ( @@ -890,17 +892,28 @@ load_signal_quality_csf_ready (MMBroadbandModem *self, g_object_unref (simple); } +/* Some modems want +CSQ, others want +CSQ?, and some of both types + * will return ERROR if they don't get the command they want. So + * try the other command if the first one fails. + */ +static const MMBaseModemAtCommand signal_quality_csq[] = { + { "+CSQ", 3, TRUE, mm_base_modem_response_processor_string }, + { "+CSQ?", 3, TRUE, mm_base_modem_response_processor_string }, + { NULL } +}; + static void -load_signal_quality_csf (MMBroadbandModem *self, +load_signal_quality_csq (MMBroadbandModem *self, GSimpleAsyncResult *result) { - mm_base_modem_at_command (MM_BASE_MODEM (self), - "+CSQ", - 3, - FALSE, - NULL, /* cancellable */ - (GAsyncReadyCallback)load_signal_quality_csf_ready, - result); + mm_base_modem_at_sequence ( + MM_BASE_MODEM (self), + signal_quality_csq, + NULL, /* response_processor_context */ + NULL, /* response_processor_context_free */ + NULL, /* cancellable */ + (GAsyncReadyCallback)load_signal_quality_csq_ready, + result); } static void @@ -977,7 +990,7 @@ load_signal_quality (MMIfaceModem *self, if (MM_BROADBAND_MODEM (self)->priv->cind_supported) load_signal_quality_cind (MM_BROADBAND_MODEM (self), result); else - load_signal_quality_csf (MM_BROADBAND_MODEM (self), result); + load_signal_quality_csq (MM_BROADBAND_MODEM (self), result); } /*****************************************************************************/ |