aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-02-14 15:18:13 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:15:07 +0100
commit1bcecc9e1d9f990a881c339e34c0f06c39378c8a (patch)
tree9b70a80ae93548de9f6aa5d4a2b77092a96bbcc1
parent50c5d69be647e9db6aa0ae4546d2f74ab7f08701 (diff)
iridium: use +CSQF to get signal quality
-rw-r--r--plugins/mm-broadband-modem-iridium.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/plugins/mm-broadband-modem-iridium.c b/plugins/mm-broadband-modem-iridium.c
index 1a9753f2..4b3f3cf4 100644
--- a/plugins/mm-broadband-modem-iridium.c
+++ b/plugins/mm-broadband-modem-iridium.c
@@ -30,6 +30,7 @@
#include "mm-iface-modem-messaging.h"
#include "mm-broadband-modem-iridium.h"
#include "mm-sim-iridium.h"
+#include "mm-modem-helpers.h"
static void iface_modem_init (MMIfaceModem *iface);
@@ -37,6 +38,56 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemIridium, mm_broadband_modem_iridium, MM_
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init));
/*****************************************************************************/
+/* Signal quality (Modem interface) */
+
+static guint
+load_signal_quality_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ gint quality = 0;
+ const gchar *result;
+
+ result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
+ if (!result)
+ return 0;
+
+ /* Skip possible whitespaces after '+CSQF:' and before the response */
+ result = mm_strip_tag (result, "+CSQF:");
+ while (*result == ' ')
+ result++;
+
+ if (sscanf (result, "%d", &quality))
+ /* Normalize the quality. <rssi> is NOT given in dBs,
+ * given as a relative value between 0 and 5 */
+ quality = CLAMP (quality, 0, 5) * 100 / 5;
+ else
+ g_set_error (error,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Could not parse signal quality results");
+
+ return quality;
+}
+
+static void
+load_signal_quality (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ /* The iridium modem may have a huge delay to get signal quality if we pass
+ * AT+CSQ, so we'll default to use AT+CSQF, which is a fast version that
+ * returns right away the last signal quality value retrieved */
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CSQF",
+ 3,
+ FALSE,
+ NULL, /* cancellable */
+ callback,
+ user_data);
+}
+
+/*****************************************************************************/
/* Flow control (Modem interface) */
static gboolean
@@ -149,6 +200,10 @@ iface_modem_init (MMIfaceModem *iface)
iface->create_sim = create_sim;
iface->create_sim_finish = create_sim_finish;
+ /* CSQF-based signal quality */
+ iface->load_signal_quality = load_signal_quality;
+ iface->load_signal_quality_finish = load_signal_quality_finish;
+
/* RTS/CTS flow control */
iface->setup_flow_control = setup_flow_control;
iface->setup_flow_control_finish = setup_flow_control_finish;