aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/mm-modem-huawei-gsm.c39
-rw-r--r--plugins/mm-modem-mbm.c131
-rw-r--r--plugins/mm-modem-novatel-gsm.c16
-rw-r--r--plugins/mm-modem-zte.c37
4 files changed, 119 insertions, 104 deletions
diff --git a/plugins/mm-modem-huawei-gsm.c b/plugins/mm-modem-huawei-gsm.c
index 78424863..b2677414 100644
--- a/plugins/mm-modem-huawei-gsm.c
+++ b/plugins/mm-modem-huawei-gsm.c
@@ -40,7 +40,6 @@ G_DEFINE_TYPE_EXTENDED (MMModemHuaweiGsm, mm_modem_huawei_gsm, MM_TYPE_GENERIC_G
typedef struct {
/* Cached state */
- guint signal_quality;
MMModemGsmBand band;
} MMModemHuaweiGsmPrivate;
@@ -369,29 +368,6 @@ get_band (MMModemGsmNetwork *modem,
}
}
-static void
-get_signal_quality (MMModemGsmNetwork *modem,
- MMModemUIntFn callback,
- gpointer user_data)
-{
- MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (modem);
-
- if (priv->signal_quality) {
- /* have cached signal quality (from an unsolicited message). Use that */
- MMCallbackInfo *info;
-
- info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data);
- mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->signal_quality), NULL);
- mm_callback_info_schedule (info);
- } else {
- /* Use the generic implementation */
- MMModemGsmNetwork *parent_gsm_network_iface;
-
- parent_gsm_network_iface = g_type_interface_peek_parent (MM_MODEM_GSM_NETWORK_GET_INTERFACE (modem));
- parent_gsm_network_iface->get_signal_quality (modem, callback, user_data);
- }
-}
-
/* Unsolicited message handlers */
static void
@@ -400,24 +376,22 @@ handle_signal_quality_change (MMAtSerialPort *port,
gpointer user_data)
{
MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (user_data);
- MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self);
char *str;
- int quality;
+ int quality = 0;
str = g_match_info_fetch (match_info, 1);
quality = atoi (str);
g_free (str);
- if (quality == 99)
+ if (quality == 99) {
/* 99 means unknown */
quality = 0;
- else
+ } else {
/* Normalize the quality */
- quality = quality * 100 / 31;
+ quality = CLAMP (quality, 0, 31) * 100 / 31;
+ }
- g_debug ("Signal quality: %d", quality);
- priv->signal_quality = (guint32) quality;
- mm_modem_gsm_network_signal_quality (MM_MODEM_GSM_NETWORK (self), (guint32) quality);
+ mm_generic_gsm_update_signal_quality (MM_GENERIC_GSM (self), (guint32) quality);
}
static void
@@ -568,7 +542,6 @@ modem_gsm_network_init (MMModemGsmNetwork *class)
{
class->set_band = set_band;
class->get_band = get_band;
- class->get_signal_quality = get_signal_quality;
}
static void
diff --git a/plugins/mm-modem-mbm.c b/plugins/mm-modem-mbm.c
index f0e764aa..afc060ed 100644
--- a/plugins/mm-modem-mbm.c
+++ b/plugins/mm-modem-mbm.c
@@ -52,11 +52,6 @@ G_DEFINE_TYPE_EXTENDED (MMModemMbm, mm_modem_mbm, MM_TYPE_GENERIC_GSM, 0,
#define MBM_NETWORK_MODE_2G 5
#define MBM_NETWORK_MODE_3G 6
-#define MBM_ERINFO_2G_GPRS 1
-#define MBM_ERINFO_2G_EGPRS 2
-#define MBM_ERINFO_3G_UMTS 1
-#define MBM_ERINFO_3G_HSDPA 2
-
typedef struct {
guint reg_id;
gboolean have_emrdy;
@@ -129,9 +124,6 @@ register_done (gpointer user_data)
primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY);
g_assert (primary);
- mm_at_serial_port_queue_command (primary, "+CREG=1", 3, NULL, NULL);
- mm_at_serial_port_queue_command (primary, "+CMER=3,0,0,1", 3, NULL, NULL);
-
parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GSM_NETWORK_GET_INTERFACE (self));
parent_modem_iface->do_register (MM_MODEM_GSM_NETWORK (self),
reg_data->network_id,
@@ -214,57 +206,47 @@ set_allowed_mode (MMGenericGsm *gsm,
g_free (command);
}
-#if 0
static void
-get_network_mode_done (MMAtSerialPort *port,
- GString *response,
- GError *error,
- gpointer user_data)
+mbm_erinfo_received (MMAtSerialPort *port,
+ GMatchInfo *info,
+ gpointer user_data)
{
- MMCallbackInfo *info = (MMCallbackInfo *) user_data;
- char *erinfo;
- int mode = 0, gsm = 0, umts = 0;
- gboolean parsed = FALSE;
-
- if (error) {
- info->error = g_error_copy (error);
- goto done;
- }
-
- erinfo = strstr (response->str, "*ERINFO:");
- if (!erinfo)
- goto done;
-
- if (sscanf (erinfo + 8, "%d,%d,%d", &mode, &gsm, &umts) != 3)
- goto done;
-
- if (gsm || umts) {
- MMModemGsmMode mm_mode = MM_MODEM_GSM_MODE_ANY;
-
- if (gsm == MBM_ERINFO_2G_GPRS)
- mm_mode = MM_MODEM_GSM_MODE_GPRS;
- else if (gsm == MBM_ERINFO_2G_EGPRS)
- mm_mode = MM_MODEM_GSM_MODE_EDGE;
- else if (umts == MBM_ERINFO_3G_UMTS)
- mm_mode = MM_MODEM_GSM_MODE_UMTS;
- else if (umts == MBM_ERINFO_3G_HSDPA)
- mm_mode = MM_MODEM_GSM_MODE_HSDPA;
- else
- g_debug ("%s unknown network mode %d,%d", __FUNCTION__, gsm, umts);
-
- mm_callback_info_set_result (info, GUINT_TO_POINTER (mm_mode), NULL);
- parsed = TRUE;
+ MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
+ char *str;
+
+ str = g_match_info_fetch (info, 2);
+ if (str) {
+ switch (atoi (str)) {
+ case 1:
+ act = MM_MODEM_GSM_ACCESS_TECH_GPRS;
+ break;
+ case 2:
+ act = MM_MODEM_GSM_ACCESS_TECH_EDGE;
+ break;
+ default:
+ break;
+ }
}
-
-done:
- if (!error && !parsed) {
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
- "Could not parse network mode results");
+ g_free (str);
+
+ /* 3G modes take precedence */
+ str = g_match_info_fetch (info, 3);
+ if (str) {
+ switch (atoi (str)) {
+ case 1:
+ act = MM_MODEM_GSM_ACCESS_TECH_UMTS;
+ break;
+ case 2:
+ act = MM_MODEM_GSM_ACCESS_TECH_HSDPA;
+ break;
+ default:
+ break;
+ }
}
+ g_free (str);
- mm_callback_info_schedule (info);
+ mm_generic_gsm_update_access_technology (MM_GENERIC_GSM (user_data), act);
}
-#endif
static void
get_allowed_mode_done (MMAtSerialPort *port,
@@ -364,6 +346,10 @@ mbm_enable_done (MMAtSerialPort *port,
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ /* Start unsolicited signal strength and access technology responses */
+ mm_at_serial_port_queue_command (port, "+CMER=3,0,0,1", 3, NULL, NULL);
+ mm_at_serial_port_queue_command (port, "*ERINFO=1", 3, NULL, NULL);
+
mm_generic_gsm_enable_complete (MM_GENERIC_GSM (info->modem), error, info);
}
@@ -456,10 +442,10 @@ typedef struct {
} DisableInfo;
static void
-disable_creg_cmer_done (MMAtSerialPort *port,
- GString *response,
- GError *error,
- gpointer user_data)
+disable_unsolicited_done (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
{
MMModem *parent_modem_iface;
@@ -486,8 +472,8 @@ disable (MMModem *modem,
primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
g_assert (primary);
- /* Turn off unsolicited +CIEV signal strength indicator */
- mm_at_serial_port_queue_command (primary, "+CREG=0;+CMER=0", 5, disable_creg_cmer_done, info);
+ /* Turn off unsolicited responses */
+ mm_at_serial_port_queue_command (primary, "+CMER=0;*ERINFO=0", 5, disable_unsolicited_done, info);
}
static void
@@ -551,18 +537,20 @@ mbm_ciev_received (MMAtSerialPort *port,
gpointer user_data)
{
int quality = 0, ind = 0;
- const char *str;
+ char *str;
str = g_match_info_fetch (info, 1);
if (str)
ind = atoi (str);
+ g_free (str);
if (ind == MBM_SIGNAL_INDICATOR) {
str = g_match_info_fetch (info, 2);
if (str) {
quality = atoi (str);
- mm_modem_gsm_network_signal_quality (MM_MODEM_GSM_NETWORK (user_data), quality * 20);
+ mm_generic_gsm_update_signal_quality (MM_GENERIC_GSM (user_data), quality * 20);
}
+ g_free (str);
}
}
@@ -592,11 +580,12 @@ mbm_e2nap_received (MMAtSerialPort *port,
gpointer user_data)
{
int state = 0;
- const char *str;
+ char *str;
str = g_match_info_fetch (info, 1);
if (str)
state = atoi (str);
+ g_free (str);
if (MBM_E2NAP_DISCONNECTED == state) {
g_debug ("%s: disconnected", __func__);
@@ -791,17 +780,19 @@ grab_port (MMModem *modem,
}
port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error);
- if (port && MM_IS_AT_SERIAL_PORT (port) && (ptype == MM_PORT_TYPE_PRIMARY)) {
+ if (port && MM_IS_AT_SERIAL_PORT (port)) {
GRegex *regex;
+ if (ptype == MM_PORT_TYPE_PRIMARY) {
+ regex = g_regex_new ("\\r\\n\\*E2NAP: (\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_e2nap_received, modem, NULL);
+ g_regex_unref (regex);
+ }
+
regex = g_regex_new ("\\r\\n\\*EMRDY: \\d\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_emrdy_received, modem, NULL);
g_regex_unref (regex);
- regex = g_regex_new ("\\r\\n\\*E2NAP: (\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
- mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_e2nap_received, modem, NULL);
- g_regex_unref (regex);
-
regex = g_regex_new ("\\r\\n\\+PACSP(\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_pacsp_received, modem, NULL);
g_regex_unref (regex);
@@ -812,12 +803,16 @@ grab_port (MMModem *modem,
/* also consume unsolicited mbm messages we are not interested in them - see LP: #416418 */
regex = g_regex_new ("\\R\\*ESTKSMENU:.*\\R", G_REGEX_RAW | G_REGEX_OPTIMIZE | G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, G_REGEX_MATCH_NEWLINE_CRLF, NULL);
- mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, modem, NULL);
+ mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL);
g_regex_unref (regex);
regex = g_regex_new ("\\r\\n\\*EMWI: (\\d),(\\d).*\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL);
g_regex_unref (regex);
+
+ regex = g_regex_new ("\\r\\n\\*ERINFO:\\s*(\\d),(\\d),(\\d).*\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_erinfo_received, modem, NULL);
+ g_regex_unref (regex);
}
return TRUE;
diff --git a/plugins/mm-modem-novatel-gsm.c b/plugins/mm-modem-novatel-gsm.c
index 61f933ac..72c929d3 100644
--- a/plugins/mm-modem-novatel-gsm.c
+++ b/plugins/mm-modem-novatel-gsm.c
@@ -49,12 +49,26 @@ mm_modem_novatel_gsm_new (const char *device,
/*****************************************************************************/
static void
+dmat_callback2 (MMAtSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ mm_serial_port_close (MM_SERIAL_PORT (port));
+}
+
+static void
dmat_callback (MMAtSerialPort *port,
GString *response,
GError *error,
gpointer user_data)
{
- mm_serial_port_close (MM_SERIAL_PORT (port));
+ if (error) {
+ /* Try it again */
+ if (mm_serial_port_open (MM_SERIAL_PORT (port), NULL))
+ mm_at_serial_port_queue_command (port, "$NWDMAT=1", 2, dmat_callback2, NULL);
+ } else
+ mm_serial_port_close (MM_SERIAL_PORT (port));
}
static gboolean
diff --git a/plugins/mm-modem-zte.c b/plugins/mm-modem-zte.c
index d4418000..a4abe47b 100644
--- a/plugins/mm-modem-zte.c
+++ b/plugins/mm-modem-zte.c
@@ -52,6 +52,39 @@ mm_modem_zte_new (const char *device,
NULL));
}
+static void
+zte_access_tech_changed (MMAtSerialPort *port,
+ GMatchInfo *info,
+ gpointer user_data)
+{
+ MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
+ char *str;
+
+ str = g_match_info_fetch (info, 1);
+ if (str) {
+ /* Better technologies are listed first since modem sometimes says
+ * stuff like "GPRS/EDGE" and that should be handled as EDGE.
+ */
+ if (strstr (str, "HSPA"))
+ act = MM_MODEM_GSM_ACCESS_TECH_HSPA;
+ else if (strstr (str, "HSUPA"))
+ act = MM_MODEM_GSM_ACCESS_TECH_HSUPA;
+ else if (strstr (str, "HSDPA"))
+ act = MM_MODEM_GSM_ACCESS_TECH_HSDPA;
+ else if (strstr (str, "UMTS"))
+ act = MM_MODEM_GSM_ACCESS_TECH_UMTS;
+ else if (strstr (str, "EDGE"))
+ act = MM_MODEM_GSM_ACCESS_TECH_EDGE;
+ else if (strstr (str, "GPRS"))
+ act = MM_MODEM_GSM_ACCESS_TECH_GPRS;
+ else if (strstr (str, "GSM"))
+ act = MM_MODEM_GSM_ACCESS_TECH_GSM;
+ }
+ g_free (str);
+
+ mm_generic_gsm_update_access_technology (MM_GENERIC_GSM (user_data), act);
+}
+
/*****************************************************************************/
/* Modem class override functions */
/*****************************************************************************/
@@ -223,8 +256,8 @@ grab_port (MMModem *modem,
g_regex_unref (regex);
/* Current network and service domain */
- regex = g_regex_new ("\\r\\n\\+ZPASR: (.*)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
- mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL);
+ regex = g_regex_new ("\\r\\n\\+ZPASR:\\s*(.*)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, zte_access_tech_changed, modem, NULL);
g_regex_unref (regex);
/* SIM request to Build Main Menu */