r3390 - trunk/src/target/gsm/src/gsmd

tick at sita.openmoko.org tick at sita.openmoko.org
Mon Nov 12 10:38:09 CET 2007


Author: tick
Date: 2007-11-12 10:38:04 +0100 (Mon, 12 Nov 2007)
New Revision: 3390

Modified:
   trunk/src/target/gsm/src/gsmd/atcmd.c
   trunk/src/target/gsm/src/gsmd/unsolicited.c
Log:
keeping track of current registration state internally in gsmd. Without this the"gsmd->dev_state.registered" variable had bogus values. (Andrew)


Modified: trunk/src/target/gsm/src/gsmd/atcmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/atcmd.c	2007-11-12 09:31:54 UTC (rev 3389)
+++ trunk/src/target/gsm/src/gsmd/atcmd.c	2007-11-12 09:38:04 UTC (rev 3390)
@@ -668,7 +668,7 @@
         }
         
         llist_add(&cmd->list, &g->pending_atcmds);
-        return atcmd_done(g, cur, "OK");
+        return atcmd_done(g, cur, "ERROR");
 }
 
 void atcmd_drain(int fd)

Modified: trunk/src/target/gsm/src/gsmd/unsolicited.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/unsolicited.c	2007-11-12 09:31:54 UTC (rev 3389)
+++ trunk/src/target/gsm/src/gsmd/unsolicited.c	2007-11-12 09:38:04 UTC (rev 3390)
@@ -145,9 +145,31 @@
 		      struct gsmd *gsmd)
 {
 	const char *comma = strchr(param, ',');
-	struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_NETREG,
-					     sizeof(struct gsmd_evt_auxdata));
+	struct gsmd_ucmd *ucmd;
 	struct gsmd_evt_auxdata *aux;
+	int prev_registered = gsmd->dev_state.registered;
+	int state;
+	char *end;
+
+	state = strtol(param, &end, 10);
+	if (!(end > param)) {
+		gsmd_log(GSMD_ERROR, "Bad +CREG format, not updating state\n");
+		return -EINVAL;
+	}
+
+	/* Update our knowledge about our state */
+	gsmd->dev_state.registered =
+		(state == GSMD_NETREG_REG_HOME ||
+		 state == GSMD_NETREG_REG_ROAMING);
+
+	/* Intialise things that depend on network registration */
+	if (gsmd->dev_state.registered && !prev_registered) {
+		sms_cb_network_init(gsmd);
+	}
+
+	/* Notify clients */
+	ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_NETREG,
+			sizeof(struct gsmd_evt_auxdata));
 	if (!ucmd)
 		return -ENOMEM;
 	aux = (struct gsmd_evt_auxdata *) ucmd->buf;
@@ -163,13 +185,8 @@
 	} else
 		aux->u.netreg.lac = aux->u.netreg.ci = 0;
 
-	/* Intialise things that depend on network registration */
-	if (aux->u.netreg.state == GSMD_NETREG_REG_HOME ||
-			aux->u.netreg.state == GSMD_NETREG_REG_ROAMING) {
-		sms_cb_network_init(gsmd);
-	}
+	return usock_evt_send(gsmd, ucmd, GSMD_EVT_NETREG);
 
-	return usock_evt_send(gsmd, ucmd, GSMD_EVT_NETREG);
 }
 
 /* Chapter 7.11, call waiting */





More information about the commitlog mailing list