diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-07-12 07:22:46 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-06 20:07:22 +0200 |
commit | 98f28db6e3bae0c38bc6e0679317fb38eb6d9ece (patch) | |
tree | 8a57c2d9ffef4488b77ada50ab873e8fd71fd022 | |
parent | 008beeedccf201c2e4f4438c26525bf9af71935d (diff) |
huawei: setup handlers for unsolicited messages
Initially all disabled.
-rw-r--r-- | plugins/huawei/mm-broadband-modem-huawei.c | 132 | ||||
-rw-r--r-- | plugins/huawei/mm-broadband-modem-huawei.h | 2 |
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{ |