api+gsm: clean up AllowedMode values
Instead of trying to stuff everything into the mode bitfield it turns out it's just easier, clearer, and simpler to use different values for each of the following: 1) the device's supported access technologies and allowed modes 2) the device's current access technology 3) the device's allowed mode preference Since none of the AccessTechnology or AllowedMode stuff has hit a release yet, let's make sure we're doing it the right way early on.
This commit is contained in:
@@ -68,24 +68,24 @@ parse_syscfg (MMModemHuaweiGsm *self,
|
||||
guint32 *band,
|
||||
int *unknown1,
|
||||
int *unknown2,
|
||||
MMModemGsmMode *out_mode)
|
||||
MMModemGsmAllowedMode *out_mode)
|
||||
{
|
||||
if (reply == NULL || strncmp (reply, "^SYSCFG:", 8))
|
||||
return FALSE;
|
||||
|
||||
if (sscanf (reply + 8, "%d,%d,%x,%d,%d", mode_a, mode_b, band, unknown1, unknown2)) {
|
||||
MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self);
|
||||
MMModemGsmMode new_mode = MM_MODEM_GSM_MODE_ANY;
|
||||
MMModemGsmAllowedMode new_mode = MM_MODEM_GSM_ALLOWED_MODE_ANY;
|
||||
|
||||
/* Network mode */
|
||||
if (*mode_a == 2 && *mode_b == 1)
|
||||
new_mode = MM_MODEM_GSM_MODE_2G_PREFERRED;
|
||||
new_mode = MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED;
|
||||
else if (*mode_a == 2 && *mode_b == 2)
|
||||
new_mode = MM_MODEM_GSM_MODE_3G_PREFERRED;
|
||||
new_mode = MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED;
|
||||
else if (*mode_a == 13 && *mode_b == 1)
|
||||
new_mode = MM_MODEM_GSM_MODE_2G_ONLY;
|
||||
new_mode = MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY;
|
||||
else if (*mode_a == 14 && *mode_b == 2)
|
||||
new_mode = MM_MODEM_GSM_MODE_3G_ONLY;
|
||||
new_mode = MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY;
|
||||
|
||||
if (out_mode)
|
||||
*out_mode = new_mode;
|
||||
@@ -134,26 +134,28 @@ set_allowed_mode_get_done (MMSerialPort *port,
|
||||
guint32 band;
|
||||
|
||||
if (parse_syscfg (MM_MODEM_HUAWEI_GSM (info->modem), response->str, &a, &b, &band, &u1, &u2, NULL)) {
|
||||
MMModemGsmAllowedMode mode;
|
||||
char *command;
|
||||
|
||||
switch (GPOINTER_TO_UINT (mm_callback_info_get_data (info, "mode"))) {
|
||||
case MM_MODEM_GSM_MODE_ANY:
|
||||
mode = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "mode"));
|
||||
switch (mode) {
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_ANY:
|
||||
a = 2;
|
||||
b = 0;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_2G_ONLY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
|
||||
a = 13;
|
||||
b = 1;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_3G_ONLY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY:
|
||||
a = 14;
|
||||
b = 2;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_2G_PREFERRED:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED:
|
||||
a = 2;
|
||||
b = 1;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_3G_PREFERRED:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED:
|
||||
a = 2;
|
||||
b = 2;
|
||||
break;
|
||||
@@ -170,7 +172,7 @@ set_allowed_mode_get_done (MMSerialPort *port,
|
||||
|
||||
static void
|
||||
set_allowed_mode (MMGenericGsm *gsm,
|
||||
MMModemGsmMode mode,
|
||||
MMModemGsmAllowedMode mode,
|
||||
MMModemFn callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
@@ -179,28 +181,14 @@ set_allowed_mode (MMGenericGsm *gsm,
|
||||
|
||||
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
|
||||
|
||||
switch (mode) {
|
||||
case MM_MODEM_GSM_MODE_ANY:
|
||||
case MM_MODEM_GSM_MODE_2G_PREFERRED:
|
||||
case MM_MODEM_GSM_MODE_3G_PREFERRED:
|
||||
case MM_MODEM_GSM_MODE_2G_ONLY:
|
||||
case MM_MODEM_GSM_MODE_3G_ONLY:
|
||||
/* Allowed values */
|
||||
mm_callback_info_set_data (info, "mode", GUINT_TO_POINTER (mode), NULL);
|
||||
primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (gsm), MM_PORT_TYPE_PRIMARY);
|
||||
g_assert (primary);
|
||||
mm_callback_info_set_data (info, "mode", GUINT_TO_POINTER (mode), NULL);
|
||||
primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (gsm), MM_PORT_TYPE_PRIMARY);
|
||||
g_assert (primary);
|
||||
|
||||
/* Get current configuration first so we don't change band and other
|
||||
* stuff when updating the mode.
|
||||
*/
|
||||
mm_serial_port_queue_command (primary, "AT^SYSCFG?", 3, set_allowed_mode_get_done, info);
|
||||
return;
|
||||
default:
|
||||
info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, "Unsupported allowed mode.");
|
||||
break;
|
||||
}
|
||||
|
||||
mm_callback_info_schedule (info);
|
||||
/* Get current configuration first so we don't change band and other
|
||||
* stuff when updating the mode.
|
||||
*/
|
||||
mm_serial_port_queue_command (primary, "AT^SYSCFG?", 3, set_allowed_mode_get_done, info);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -213,7 +201,7 @@ get_allowed_mode_done (MMSerialPort *port,
|
||||
MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (info->modem);
|
||||
int mode_a, mode_b, u1, u2;
|
||||
guint32 band;
|
||||
MMModemGsmMode mode = MM_MODEM_GSM_MODE_ANY;
|
||||
MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY;
|
||||
|
||||
if (error)
|
||||
info->error = g_error_copy (error);
|
||||
|
||||
+27
-12
@@ -165,16 +165,16 @@ do_register (MMModemGsmNetwork *modem,
|
||||
}
|
||||
|
||||
static int
|
||||
mbm_parse_network_mode (MMModemGsmMode network_mode)
|
||||
mbm_parse_allowed_mode (MMModemGsmAllowedMode network_mode)
|
||||
{
|
||||
switch (network_mode) {
|
||||
case MM_MODEM_GSM_MODE_ANY:
|
||||
case MM_MODEM_GSM_MODE_3G_PREFERRED:
|
||||
case MM_MODEM_GSM_MODE_2G_PREFERRED:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_ANY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED:
|
||||
return MBM_NETWORK_MODE_ANY;
|
||||
case MM_MODEM_GSM_MODE_2G_ONLY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
|
||||
return MBM_NETWORK_MODE_2G;
|
||||
case MM_MODEM_GSM_MODE_3G_ONLY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY:
|
||||
return MBM_NETWORK_MODE_3G;
|
||||
default:
|
||||
return MBM_NETWORK_MODE_ANY;
|
||||
@@ -197,7 +197,7 @@ mbm_set_allowed_mode_done (MMSerialPort *port,
|
||||
|
||||
static void
|
||||
set_allowed_mode (MMGenericGsm *gsm,
|
||||
MMModemGsmMode mode,
|
||||
MMModemGsmAllowedMode mode,
|
||||
MMModemFn callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
@@ -209,7 +209,7 @@ set_allowed_mode (MMGenericGsm *gsm,
|
||||
primary = mm_generic_gsm_get_port (gsm, MM_PORT_TYPE_PRIMARY);
|
||||
g_assert (primary);
|
||||
|
||||
command = g_strdup_printf ("+CFUN=%d", mbm_parse_network_mode (mode));
|
||||
command = g_strdup_printf ("+CFUN=%d", mbm_parse_allowed_mode (mode));
|
||||
mm_serial_port_queue_command (primary, command, 3, mbm_set_allowed_mode_done, info);
|
||||
g_free (command);
|
||||
}
|
||||
@@ -278,14 +278,14 @@ get_allowed_mode_done (MMSerialPort *port,
|
||||
if (error)
|
||||
info->error = g_error_copy (error);
|
||||
else if (!g_str_has_prefix (response->str, "CFUN: ")) {
|
||||
MMModemGsmMode mode = MM_MODEM_GSM_MODE_ANY;
|
||||
MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY;
|
||||
int a;
|
||||
|
||||
a = atoi (response->str + 6);
|
||||
if (a == MBM_NETWORK_MODE_2G)
|
||||
mode = MM_MODEM_GSM_MODE_2G_ONLY;
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY;
|
||||
else if (a == MBM_NETWORK_MODE_3G)
|
||||
mode = MM_MODEM_GSM_MODE_3G_ONLY;
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY;
|
||||
|
||||
mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL);
|
||||
parsed = TRUE;
|
||||
@@ -331,7 +331,22 @@ simple_connect (MMModemSimple *simple,
|
||||
priv->password = mbm_simple_get_string_property (properties, "password", &info->error);
|
||||
|
||||
network_mode = mbm_simple_get_uint_property (properties, "network_mode", &info->error);
|
||||
priv->network_mode = mbm_parse_network_mode (network_mode);
|
||||
switch (network_mode) {
|
||||
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_ANY:
|
||||
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_PREFERRED:
|
||||
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_PREFERRED:
|
||||
priv->network_mode = MBM_NETWORK_MODE_ANY;
|
||||
break;
|
||||
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_ONLY:
|
||||
priv->network_mode = MBM_NETWORK_MODE_2G;
|
||||
break;
|
||||
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_ONLY:
|
||||
priv->network_mode = MBM_NETWORK_MODE_3G;
|
||||
break;
|
||||
default:
|
||||
priv->network_mode = MBM_NETWORK_MODE_ANY;
|
||||
break;
|
||||
}
|
||||
|
||||
parent_iface = g_type_interface_peek_parent (MM_MODEM_SIMPLE_GET_INTERFACE (simple));
|
||||
parent_iface->connect (MM_MODEM_SIMPLE (simple), properties, callback, info);
|
||||
|
||||
+11
-11
@@ -101,20 +101,20 @@ get_allowed_mode_done (MMSerialPort *port,
|
||||
int a, b;
|
||||
|
||||
if (sscanf (response->str + 8, "%d,%d", &a, &b)) {
|
||||
MMModemGsmMode mode = MM_MODEM_GSM_MODE_ANY;
|
||||
MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY;
|
||||
|
||||
switch (a) {
|
||||
case 0:
|
||||
mode = MM_MODEM_GSM_MODE_2G_ONLY;
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY;
|
||||
break;
|
||||
case 1:
|
||||
mode = MM_MODEM_GSM_MODE_3G_ONLY;
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY;
|
||||
break;
|
||||
case 2:
|
||||
mode = MM_MODEM_GSM_MODE_2G_PREFERRED;
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED;
|
||||
break;
|
||||
case 3:
|
||||
mode = MM_MODEM_GSM_MODE_3G_PREFERRED;
|
||||
mode = MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -162,7 +162,7 @@ set_allowed_mode_done (MMSerialPort *port,
|
||||
|
||||
static void
|
||||
set_allowed_mode (MMGenericGsm *gsm,
|
||||
MMModemGsmMode mode,
|
||||
MMModemGsmAllowedMode mode,
|
||||
MMModemFn callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
@@ -174,19 +174,19 @@ set_allowed_mode (MMGenericGsm *gsm,
|
||||
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
|
||||
|
||||
switch (mode) {
|
||||
case MM_MODEM_GSM_MODE_2G_ONLY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
|
||||
i = 0;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_3G_ONLY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY:
|
||||
i = 1;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_2G_PREFERRED:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED:
|
||||
i = 2;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_3G_PREFERRED:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED:
|
||||
i = 3;
|
||||
break;
|
||||
case MM_MODEM_GSM_MODE_ANY:
|
||||
case MM_MODEM_GSM_ALLOWED_MODE_ANY:
|
||||
default:
|
||||
i = 5;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user