summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-04-01 22:29:30 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-04-01 22:32:58 -0500
commita182034336431c564111c4bccb90ce1e4365c25e (patch)
tree02332504db2238f56153611862c23bba338714a3
parentaadc1d884db7b8a56fe7f22f0e715517f5c98d38 (diff)
downloadofono-a182034336431c564111c4bccb90ce1e4365c25e.tar.bz2
Fix: Stop infinite attempts to register
Sometimes if the modem firmware is particularly nutty we will see frequent cell-reselections at startup, resulting in us attempting to register multiple times. Try to stop this behavior by keeping track of what state we're in and hoping the hardware is at least somewhat sane.
-rw-r--r--gatchat/gsmdial.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/gatchat/gsmdial.c b/gatchat/gsmdial.c
index 0a833c3b..4feac3b3 100644
--- a/gatchat/gsmdial.c
+++ b/gatchat/gsmdial.c
@@ -64,6 +64,7 @@ static GMainLoop *event_loop;
enum state {
STATE_NONE = 0,
STATE_REGISTERING,
+ STATE_ATTACHING,
STATE_ACTIVATING
};
@@ -321,7 +322,7 @@ static void cgreg_notify(GAtResult *result, gpointer user_data)
{
int status, lac, ci, tech;
- if (state != STATE_REGISTERING)
+ if (state != STATE_ATTACHING)
return;
if (at_util_parse_reg_unsolicited(result, "+CGREG:", &status,
@@ -345,8 +346,11 @@ static void cgreg_cb(gboolean ok, GAtResult *result, gpointer user_data)
&lac, &ci, &tech) == FALSE)
return;
- if (status != 1 && status != 5)
+ if (status != 1 && status != 5) {
+ g_at_chat_register(control, "+CGREG:",
+ cgreg_notify, FALSE, NULL, NULL);
return;
+ }
setup_context(status);
}
@@ -362,6 +366,7 @@ static void attached_cb(gboolean ok, GAtResult *result, gpointer user_data)
static void activate_gprs(int status)
{
+ state = STATE_ATTACHING;
g_print("Registered to network, roaming=%s\n",
status == 5 ? "true" : "false");
@@ -398,8 +403,11 @@ static void creg_cb(gboolean ok, GAtResult *result, gpointer user_data)
&lac, &ci, &tech) == FALSE)
return;
- if (status != 1 && status != 5)
+ if (status != 1 && status != 5) {
+ g_at_chat_register(control, "+CREG:",
+ creg_notify, FALSE, NULL, NULL);
return;
+ }
activate_gprs(status);
}
@@ -425,11 +433,6 @@ static void start_dial(gboolean ok, GAtResult *result, gpointer user_data)
exit(1);
}
- g_at_chat_register(control, "+CREG:",
- creg_notify, FALSE, NULL, NULL);
- g_at_chat_register(control, "+CGREG:",
- cgreg_notify, FALSE, NULL, NULL);
-
g_at_chat_send(control, "AT+CREG=2", none_prefix, NULL, NULL, NULL);
g_at_chat_send(control, "AT+CGREG=2", none_prefix, NULL, NULL, NULL);