broadband-modem: try +CSQ? if +CSQ fails
As done in the generic CDMA implementation
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
Reference in New Issue
Block a user