sierra: implement GSM mode preference handling
This commit is contained in:
@@ -49,6 +49,136 @@ mm_modem_sierra_gsm_new (const char *device,
|
||||
NULL));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
get_allowed_mode_done (MMAtSerialPort *port,
|
||||
GString *response,
|
||||
GError *error,
|
||||
gpointer user_data)
|
||||
{
|
||||
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
|
||||
GRegex *r = NULL;
|
||||
GMatchInfo *match_info;
|
||||
|
||||
info->error = mm_modem_check_removed (info->modem, error);
|
||||
if (info->error)
|
||||
goto done;
|
||||
|
||||
/* Example response: !SELRAT: 03, UMTS 3G Preferred */
|
||||
r = g_regex_new ("!SELRAT:\\s*(\\d+).*$", 0, 0, NULL);
|
||||
if (!r) {
|
||||
info->error = g_error_new_literal (MM_MODEM_ERROR,
|
||||
MM_MODEM_ERROR_GENERAL,
|
||||
"Failed to parse the allowed mode response");
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (g_regex_match_full (r, response->str, response->len, 0, 0, &match_info, &info->error)) {
|
||||
MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY;
|
||||
char *str;
|
||||
|
||||
str = g_match_info_fetch (match_info, 1);
|
||||
switch (atoi (str)) {
|
||||
case 0:
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_ANY;
|
||||
break;
|
||||
case 1:
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY;
|
||||
break;
|
||||
case 2:
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY;
|
||||
break;
|
||||
case 3:
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED;
|
||||
break;
|
||||
case 4:
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED;
|
||||
break;
|
||||
default:
|
||||
info->error = g_error_new (MM_MODEM_ERROR,
|
||||
MM_MODEM_ERROR_GENERAL,
|
||||
"Failed to parse the allowed mode response: '%s'",
|
||||
response->str);
|
||||
break;
|
||||
}
|
||||
g_free (str);
|
||||
|
||||
mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL);
|
||||
}
|
||||
|
||||
done:
|
||||
if (r)
|
||||
g_regex_unref (r);
|
||||
mm_callback_info_schedule (info);
|
||||
}
|
||||
|
||||
static void
|
||||
get_allowed_mode (MMGenericGsm *gsm,
|
||||
MMModemUIntFn callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
MMCallbackInfo *info;
|
||||
MMAtSerialPort *primary;
|
||||
|
||||
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
|
||||
primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
|
||||
g_assert (primary);
|
||||
mm_at_serial_port_queue_command (primary, "!SELRAT?", 3, get_allowed_mode_done, info);
|
||||
}
|
||||
|
||||
static void
|
||||
set_allowed_mode_done (MMAtSerialPort *port,
|
||||
GString *response,
|
||||
GError *error,
|
||||
gpointer user_data)
|
||||
{
|
||||
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
|
||||
|
||||
if (error)
|
||||
info->error = g_error_copy (error);
|
||||
|
||||
mm_callback_info_schedule (info);
|
||||
}
|
||||
|
||||
static void
|
||||
set_allowed_mode (MMGenericGsm *gsm,
|
||||
MMModemGsmAllowedMode mode,
|
||||
MMModemFn callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
MMCallbackInfo *info;
|
||||
MMAtSerialPort *primary;
|
||||
char *command;
|
||||
int idx = 0;
|
||||
|
||||
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
|
||||
|
||||
switch (mode) {
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
|
||||
idx = 2;
|
||||
break;
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY:
|
||||
idx = 1;
|
||||
break;
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED:
|
||||
idx = 4;
|
||||
break;
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED:
|
||||
idx = 3;
|
||||
break;
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_ANY:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
command = g_strdup_printf ("!SELRAT=%d", idx);
|
||||
primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
|
||||
g_assert (primary);
|
||||
mm_at_serial_port_queue_command (primary, command, 3, set_allowed_mode_done, info);
|
||||
g_free (command);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Modem class override functions */
|
||||
/*****************************************************************************/
|
||||
@@ -159,5 +289,7 @@ mm_modem_sierra_gsm_class_init (MMModemSierraGsmClass *klass)
|
||||
|
||||
object_class->dispose = dispose;
|
||||
gsm_class->do_enable_power_up_done = real_do_enable_power_up_done;
|
||||
gsm_class->set_allowed_mode = set_allowed_mode;
|
||||
gsm_class->get_allowed_mode = get_allowed_mode;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user