summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2016-10-05 13:59:37 +0200
committerDan Williams <dcbw@redhat.com>2016-12-06 11:50:53 -0600
commitd1020ea5b80ccc5b77661334302d1c069e9b26a6 (patch)
treedf69b8f54c755ff1ecc9e341fa18864b0aaa6eff
parentf7e7ea5b6fb26201268b362062774ba4664706d3 (diff)
downloadModemManager-dcbw/mm-1-6-signal.tar.gz
broadband-modem: implement the Signal interfacedcbw/mm-1-6-signal
Provide a generic +CESQ based implementation for the extended Signal interface, applicable to all AT-based modems. We explicitly disable this check in MBIM modems. (cherry picked from commit 90943177ed7913ee506fb9e5d37bb693d38b54f6)
-rw-r--r--src/mm-broadband-modem-mbim.c18
-rw-r--r--src/mm-broadband-modem.c69
2 files changed, 84 insertions, 3 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index dfd652f47..4e63b19ca 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -36,20 +36,23 @@
#include "mm-iface-modem.h"
#include "mm-iface-modem-3gpp.h"
#include "mm-iface-modem-messaging.h"
+#include "mm-iface-modem-signal.h"
#include "mm-sms-part-3gpp.h"
#if defined WITH_QMI
# include <libqmi-glib.h>
#endif
-static void iface_modem_init (MMIfaceModem *iface);
-static void iface_modem_3gpp_init (MMIfaceModem3gpp *iface);
+static void iface_modem_init (MMIfaceModem *iface);
+static void iface_modem_3gpp_init (MMIfaceModem3gpp *iface);
static void iface_modem_messaging_init (MMIfaceModemMessaging *iface);
+static void iface_modem_signal_init (MMIfaceModemSignal *iface);
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemMbim, mm_broadband_modem_mbim, MM_TYPE_BROADBAND_MODEM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init)
- G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_MESSAGING, iface_modem_messaging_init))
+ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_MESSAGING, iface_modem_messaging_init)
+ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_SIGNAL, iface_modem_signal_init))
typedef enum {
PROCESS_NOTIFICATION_FLAG_NONE = 0,
@@ -3307,6 +3310,15 @@ iface_modem_messaging_init (MMIfaceModemMessaging *iface)
}
static void
+iface_modem_signal_init (MMIfaceModemSignal *iface)
+{
+ iface->check_support = NULL;
+ iface->check_support_finish = NULL;
+ iface->load_values = NULL;
+ iface->load_values_finish = NULL;
+}
+
+static void
mm_broadband_modem_mbim_class_init (MMBroadbandModemMbimClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index de5ddec46..fa962406f 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -8047,6 +8047,71 @@ modem_time_check_support (MMIfaceModemTime *self,
}
/*****************************************************************************/
+/* Check support (Signal interface) */
+
+static gboolean
+modem_signal_check_support_finish (MMIfaceModemSignal *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return !!mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
+}
+
+static void
+modem_signal_check_support (MMIfaceModemSignal *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CESQ=?",
+ 3,
+ TRUE,
+ callback,
+ user_data);
+}
+
+/*****************************************************************************/
+/* Load extended signal information (Signal interface) */
+
+static gboolean
+modem_signal_load_values_finish (MMIfaceModemSignal *self,
+ GAsyncResult *res,
+ MMSignal **cdma,
+ MMSignal **evdo,
+ MMSignal **gsm,
+ MMSignal **umts,
+ MMSignal **lte,
+ GError **error)
+{
+ const gchar *response;
+
+ response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
+ if (!response || !mm_3gpp_cesq_response_to_signal_info (response, gsm, umts, lte, error))
+ return FALSE;
+
+ /* No 3GPP2 support */
+ if (cdma)
+ *cdma = NULL;
+ if (evdo)
+ *evdo = NULL;
+ return TRUE;
+}
+
+static void
+modem_signal_load_values (MMIfaceModemSignal *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CESQ",
+ 3,
+ TRUE,
+ callback,
+ user_data);
+}
+
+/*****************************************************************************/
static const gchar *primary_init_sequence[] = {
/* Ensure echo is off */
@@ -10513,6 +10578,10 @@ iface_modem_time_init (MMIfaceModemTime *iface)
static void
iface_modem_signal_init (MMIfaceModemSignal *iface)
{
+ iface->check_support = modem_signal_check_support;
+ iface->check_support_finish = modem_signal_check_support_finish;
+ iface->load_values = modem_signal_load_values;
+ iface->load_values_finish = modem_signal_load_values_finish;
}
static void