aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/fibocom/mm-broadband-modem-fibocom.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/plugins/fibocom/mm-broadband-modem-fibocom.c b/plugins/fibocom/mm-broadband-modem-fibocom.c
index 41ab2eb8..9a819432 100644
--- a/plugins/fibocom/mm-broadband-modem-fibocom.c
+++ b/plugins/fibocom/mm-broadband-modem-fibocom.c
@@ -34,7 +34,8 @@ typedef enum {
} FeatureSupport;
struct _MMBroadbandModemFibocomPrivate {
- FeatureSupport gtrndis_support;
+ FeatureSupport gtrndis_support;
+ GRegex *sim_ready_regex;
};
/*****************************************************************************/
@@ -188,6 +189,31 @@ modem_reset (MMIfaceModem *self,
/*****************************************************************************/
+static void
+setup_ports (MMBroadbandModem *_self)
+{
+ MMBroadbandModemFibocom *self = (MM_BROADBAND_MODEM_FIBOCOM (_self));
+ MMPortSerialAt *ports[2];
+ guint i;
+
+ /* Call parent's setup ports first always */
+ MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_fibocom_parent_class)->setup_ports (_self);
+
+ ports[0] = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
+ ports[1] = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self));
+
+ for (i = 0; i < G_N_ELEMENTS (ports); i++) {
+ if (!ports[i])
+ continue;
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->sim_ready_regex,
+ NULL, NULL, NULL);
+ }
+}
+
+/*****************************************************************************/
+
MMBroadbandModemFibocom *
mm_broadband_modem_fibocom_new (const gchar *device,
const gchar **drivers,
@@ -214,6 +240,19 @@ mm_broadband_modem_fibocom_init (MMBroadbandModemFibocom *self)
MMBroadbandModemFibocomPrivate);
self->priv->gtrndis_support = FEATURE_SUPPORT_UNKNOWN;
+
+ self->priv->sim_ready_regex = g_regex_new ("\\r\\n\\+SIM READY\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+}
+
+static void
+finalize (GObject *object)
+{
+ MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (object);
+
+ g_regex_unref (self->priv->sim_ready_regex);
+
+ G_OBJECT_CLASS (mm_broadband_modem_fibocom_parent_class)->finalize (object);
}
static void
@@ -228,6 +267,13 @@ iface_modem_init (MMIfaceModem *iface)
static void
mm_broadband_modem_fibocom_class_init (MMBroadbandModemFibocomClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
+
g_type_class_add_private (G_OBJECT_CLASS (klass),
sizeof (MMBroadbandModemFibocomPrivate));
+
+ /* Virtual methods */
+ object_class->finalize = finalize;
+ broadband_modem_class->setup_ports = setup_ports;
}