diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2016-10-05 13:59:37 +0200 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2016-12-06 11:50:53 -0600 |
commit | d1020ea5b80ccc5b77661334302d1c069e9b26a6 (patch) | |
tree | df69b8f54c755ff1ecc9e341fa18864b0aaa6eff | |
parent | f7e7ea5b6fb26201268b362062774ba4664706d3 (diff) | |
download | ModemManager-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.c | 18 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 69 |
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 |