aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-07-12 07:22:46 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-08-06 20:07:22 +0200
commit98f28db6e3bae0c38bc6e0679317fb38eb6d9ece (patch)
tree8a57c2d9ffef4488b77ada50ab873e8fd71fd022 /plugins
parent008beeedccf201c2e4f4438c26525bf9af71935d (diff)
huawei: setup handlers for unsolicited messages
Initially all disabled.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/huawei/mm-broadband-modem-huawei.c132
-rw-r--r--plugins/huawei/mm-broadband-modem-huawei.h2
2 files changed, 134 insertions, 0 deletions
diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c
index 893d4b08..2f4e49e6 100644
--- a/plugins/huawei/mm-broadband-modem-huawei.c
+++ b/plugins/huawei/mm-broadband-modem-huawei.c
@@ -31,6 +31,104 @@
G_DEFINE_TYPE (MMBroadbandModemHuawei, mm_broadband_modem_huawei, MM_TYPE_BROADBAND_MODEM);
+struct _MMBroadbandModemHuaweiPrivate {
+ /* Regex for signal quality related notifications */
+ GRegex *rssi_regex;
+
+ /* Regex for access-technology related notifications */
+ GRegex *mode_regex;
+
+ /* Regex for connection status related notifications */
+ GRegex *dsflowrpt_regex;
+
+ /* Regex to ignore */
+ GRegex *boot_regex;
+};
+
+/*****************************************************************************/
+
+static void
+huawei_signal_changed (MMAtSerialPort *port,
+ GMatchInfo *match_info,
+ MMBroadbandModemHuawei *self)
+{
+}
+
+static void
+huawei_mode_changed (MMAtSerialPort *port,
+ GMatchInfo *match_info,
+ MMBroadbandModemHuawei *self)
+{
+}
+
+static void
+huawei_status_changed (MMAtSerialPort *port,
+ GMatchInfo *match_info,
+ MMBroadbandModemHuawei *self)
+{
+}
+
+static void
+set_3gpp_unsolicited_events_handlers (MMBroadbandModemHuawei *self,
+ gboolean enable)
+{
+ MMAtSerialPort *ports[2];
+ guint i;
+
+ ports[0] = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
+ ports[1] = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self));
+
+ /* Enable/disable unsolicited events in given port */
+ for (i = 0; i < 2; i++) {
+ if (!ports[i])
+ continue;
+
+ /* Signal quality related */
+ mm_at_serial_port_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->rssi_regex,
+ enable ? (MMAtSerialUnsolicitedMsgFn)huawei_signal_changed : NULL,
+ enable ? self : NULL,
+ NULL);
+
+ /* Access technology related */
+ mm_at_serial_port_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->mode_regex,
+ enable ? (MMAtSerialUnsolicitedMsgFn)huawei_mode_changed : NULL,
+ enable ? self : NULL,
+ NULL);
+
+ /* Connection status related */
+ mm_at_serial_port_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->dsflowrpt_regex,
+ enable ? (MMAtSerialUnsolicitedMsgFn)huawei_status_changed : NULL,
+ enable ? self : NULL,
+ NULL);
+
+ /* Other unsolicited events to always ignore */
+ if (!enable)
+ mm_at_serial_port_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->boot_regex,
+ NULL, NULL, NULL);
+ }
+}
+
+/*****************************************************************************/
+/* Setup ports (Broadband modem class) */
+
+static void
+setup_ports (MMBroadbandModem *self)
+{
+ /* Call parent's setup ports first always */
+ MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_huawei_parent_class)->setup_ports (self);
+
+ /* Now reset the unsolicited messages we'll handle when enabled */
+ set_3gpp_unsolicited_events_handlers (MM_BROADBAND_MODEM_HUAWEI (self), FALSE);
+}
+
/*****************************************************************************/
MMBroadbandModemHuawei *
@@ -52,9 +150,43 @@ mm_broadband_modem_huawei_new (const gchar *device,
static void
mm_broadband_modem_huawei_init (MMBroadbandModemHuawei *self)
{
+ /* Initialize private data */
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
+ MM_TYPE_BROADBAND_MODEM_HUAWEI,
+ MMBroadbandModemHuaweiPrivate);
+ /* Prepare regular expressions to setup */
+ self->priv->rssi_regex = g_regex_new ("\\r\\n\\^RSSI:(\\d+)\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->mode_regex = g_regex_new ("\\r\\n\\^MODE:(\\d),(\\d)\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->dsflowrpt_regex = g_regex_new ("\\r\\n\\^DSFLOWRPT:(.+)\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->boot_regex = g_regex_new ("\\r\\n\\^BOOT:.+\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+}
+
+static void
+finalize (GObject *object)
+{
+ MMBroadbandModemHuawei *self = MM_BROADBAND_MODEM_HUAWEI (object);
+
+ g_regex_unref (self->priv->rssi_regex);
+ g_regex_unref (self->priv->mode_regex);
+ g_regex_unref (self->priv->dsflowrpt_regex);
+ g_regex_unref (self->priv->boot_regex);
+
+ G_OBJECT_CLASS (mm_broadband_modem_huawei_parent_class)->finalize (object);
}
static void
mm_broadband_modem_huawei_class_init (MMBroadbandModemHuaweiClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
+
+ g_type_class_add_private (object_class, sizeof (MMBroadbandModemHuaweiPrivate));
+
+ object_class->finalize = finalize;
+
+ broadband_modem_class->setup_ports = setup_ports;
}
diff --git a/plugins/huawei/mm-broadband-modem-huawei.h b/plugins/huawei/mm-broadband-modem-huawei.h
index a5499424..e459b929 100644
--- a/plugins/huawei/mm-broadband-modem-huawei.h
+++ b/plugins/huawei/mm-broadband-modem-huawei.h
@@ -29,9 +29,11 @@
typedef struct _MMBroadbandModemHuawei MMBroadbandModemHuawei;
typedef struct _MMBroadbandModemHuaweiClass MMBroadbandModemHuaweiClass;
+typedef struct _MMBroadbandModemHuaweiPrivate MMBroadbandModemHuaweiPrivate;
struct _MMBroadbandModemHuawei {
MMBroadbandModem parent;
+ MMBroadbandModemHuaweiPrivate *priv;
};
struct _MMBroadbandModemHuaweiClass{