diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mm-modem-huawei-gsm.c | 39 | ||||
-rw-r--r-- | plugins/mm-modem-mbm.c | 131 | ||||
-rw-r--r-- | plugins/mm-modem-novatel-gsm.c | 16 | ||||
-rw-r--r-- | plugins/mm-modem-zte.c | 37 |
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 */ |