diff options
author | Tambet Ingo <tambet@gmail.com> | 2008-09-11 11:22:04 +0300 |
---|---|---|
committer | Tambet Ingo <tambet@gmail.com> | 2008-09-11 11:22:04 +0300 |
commit | 55bc5300db97295ed2ac23b0c82f7132435b6604 (patch) | |
tree | 381e84513d83dfc2139583604e3985acefe1bc6e /src | |
parent | 40e4d2fed0bdaeb7602a9b18ac74c116d4b18fc7 (diff) |
Cache signal quality after successful registration.
If trying to get signal quality when connected, use the cached value.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 88589ef7..541c9a57 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -19,12 +19,15 @@ typedef struct { char *oper_code; char *oper_name; MMModemGsmNetworkRegStatus reg_status; + guint32 signal_quality; guint32 cid; - guint32 pending_id; } MMGenericGsmPrivate; static void get_registration_status (MMSerial *serial, MMCallbackInfo *info); static void real_register (MMSerial *serial, const char *network_id, MMCallbackInfo *info); +static void get_signal_quality (MMModemGsmNetwork *modem, + MMModemUIntFn callback, + gpointer user_data); MMModem * mm_generic_gsm_new (const char *serial_device, const char *driver) @@ -306,7 +309,7 @@ get_reg_code_done (MMSerial *serial, MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (serial); g_free (priv->oper_code); - priv->oper_name = oper; + priv->oper_code = oper; } } } @@ -415,6 +418,7 @@ get_reg_status_done (MMSerial *serial, /* Done */ mm_serial_queue_command (serial, "+COPS=3,2;+COPS?", 3, get_reg_code_done, NULL); mm_serial_queue_command (serial, "+COPS=3,0;+COPS?", 3, get_reg_name_done, NULL); + get_signal_quality (MM_MODEM_GSM_NETWORK (serial), NULL, NULL); done = TRUE; break; case MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE: @@ -770,7 +774,8 @@ get_signal_quality_done (MMSerial *serial, if (quality != 99) /* Normalize the quality */ quality = quality * 100 / 31; - + + MM_GENERIC_GSM_GET_PRIVATE (serial)->signal_quality = quality; mm_callback_info_set_result (info, GUINT_TO_POINTER (quality), NULL); } else info->error = g_error_new (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, @@ -787,6 +792,12 @@ get_signal_quality (MMModemGsmNetwork *modem, { MMCallbackInfo *info; + if (mm_serial_is_connected (MM_SERIAL (modem))) { + g_message ("Returning saved signal quality %d", MM_GENERIC_GSM_GET_PRIVATE (modem)->signal_quality); + callback (MM_MODEM (modem), MM_GENERIC_GSM_GET_PRIVATE (modem)->signal_quality, NULL, user_data); + return; + } + info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); mm_serial_queue_command (MM_SERIAL (modem), "+CSQ", 3, get_signal_quality_done, info); } @@ -872,11 +883,6 @@ finalize (GObject *object) { MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (object); - if (priv->pending_id) { - g_source_remove (priv->pending_id); - priv->pending_id = 0; - } - g_free (priv->driver); g_free (priv->oper_code); g_free (priv->oper_name); |