broadband-modem: try +CSQ? if +CSQ fails

As done in the generic CDMA implementation
This commit is contained in:
Aleksander Morgado
2011-12-31 15:41:19 +01:00
parent d5af2286e2
commit edc1174068

View File

@@ -841,14 +841,15 @@ load_signal_quality_finish (MMIfaceModem *self,
} }
static void static void
load_signal_quality_csf_ready (MMBroadbandModem *self, load_signal_quality_csq_ready (MMBroadbandModem *self,
GAsyncResult *res, GAsyncResult *res,
GSimpleAsyncResult *simple) GSimpleAsyncResult *simple)
{ {
GError *error = NULL; 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) { if (error) {
g_simple_async_result_take_error (simple, error); g_simple_async_result_take_error (simple, error);
g_simple_async_result_complete (simple); g_simple_async_result_complete (simple);
@@ -856,13 +857,14 @@ load_signal_quality_csf_ready (MMBroadbandModem *self,
return; return;
} }
if (result && result_str = g_variant_get_string (result, NULL);
!strncmp (result, "+CSQ: ", 6)) { if (result_str &&
!strncmp (result_str, "+CSQ: ", 6)) {
/* Got valid reply */ /* Got valid reply */
int quality; int quality;
int ber; int ber;
if (sscanf (result + 6, "%d, %d", &quality, &ber)) { if (sscanf (result_str + 6, "%d, %d", &quality, &ber)) {
/* 99 means unknown */ /* 99 means unknown */
if (quality == 99) { if (quality == 99) {
g_simple_async_result_take_error ( g_simple_async_result_take_error (
@@ -890,16 +892,27 @@ load_signal_quality_csf_ready (MMBroadbandModem *self,
g_object_unref (simple); 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 static void
load_signal_quality_csf (MMBroadbandModem *self, load_signal_quality_csq (MMBroadbandModem *self,
GSimpleAsyncResult *result) GSimpleAsyncResult *result)
{ {
mm_base_modem_at_command (MM_BASE_MODEM (self), mm_base_modem_at_sequence (
"+CSQ", MM_BASE_MODEM (self),
3, signal_quality_csq,
FALSE, NULL, /* response_processor_context */
NULL, /* response_processor_context_free */
NULL, /* cancellable */ NULL, /* cancellable */
(GAsyncReadyCallback)load_signal_quality_csf_ready, (GAsyncReadyCallback)load_signal_quality_csq_ready,
result); result);
} }
@@ -977,7 +990,7 @@ load_signal_quality (MMIfaceModem *self,
if (MM_BROADBAND_MODEM (self)->priv->cind_supported) if (MM_BROADBAND_MODEM (self)->priv->cind_supported)
load_signal_quality_cind (MM_BROADBAND_MODEM (self), result); load_signal_quality_cind (MM_BROADBAND_MODEM (self), result);
else else
load_signal_quality_csf (MM_BROADBAND_MODEM (self), result); load_signal_quality_csq (MM_BROADBAND_MODEM (self), result);
} }
/*****************************************************************************/ /*****************************************************************************/