r3943 - in trunk/src/target/gsm: include/gsmd src/gsmd src/libgsmd src/util

erin_yueh at sita.openmoko.org erin_yueh at sita.openmoko.org
Thu Jan 24 16:20:52 CET 2008


Author: erin_yueh
Date: 2008-01-24 16:20:40 +0100 (Thu, 24 Jan 2008)
New Revision: 3943

Modified:
   trunk/src/target/gsm/include/gsmd/usock.h
   trunk/src/target/gsm/src/gsmd/usock.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_network.c
   trunk/src/target/gsm/src/util/shell.c
Log:
gsmd: query network registration status (Erin Yueh)


Modified: trunk/src/target/gsm/include/gsmd/usock.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/usock.h	2008-01-24 14:26:24 UTC (rev 3942)
+++ trunk/src/target/gsm/include/gsmd/usock.h	2008-01-24 15:20:40 UTC (rev 3943)
@@ -162,6 +162,7 @@
 	GSMD_NETWORK_PREF_DEL   = 12,
 	GSMD_NETWORK_PREF_ADD   = 13,
 	GSMD_NETWORK_PREF_SPACE = 14,
+	GSMD_NETWORK_QUERY_REG = 15,
 };
 
 enum gsmd_msg_sms {

Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c	2008-01-24 14:26:24 UTC (rev 3942)
+++ trunk/src/target/gsm/src/gsmd/usock.c	2008-01-24 15:20:40 UTC (rev 3943)
@@ -664,6 +664,33 @@
 	return 0; 
 }
 
+static int network_query_reg_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	struct gsmd_user *gu = ctx;
+	struct gsm_extrsp *er;
+	enum gsmd_netreg_state state;
+
+	DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp);
+
+	if (strncmp(resp, "+CREG: ", 7))
+		return -EINVAL;
+	resp += 7;
+	er = extrsp_parse(gsmd_tallocs, resp);
+	if(!er)
+		return -ENOMEM;
+	//extrsp_dump(er);
+	/* +CREG: <n>,<stat>[,<lac>,<ci>] */
+	if((er->num_tokens == 4 || er->num_tokens == 2 ) &&
+			er->tokens[0].type == GSMD_ECMD_RTT_NUMERIC &&
+			er->tokens[1].type == GSMD_ECMD_RTT_NUMERIC ) {
+				state = er->tokens[1].u.numeric;
+	}
+
+	talloc_free(er);
+	return gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_QUERY_REG,
+		cmd->id, sizeof(state), &state);
+}
+
 static int network_vmail_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
 	struct gsmd_user *gu = ctx;
@@ -735,6 +762,8 @@
 			cmd->id, sizeof(gsq), &gsq);
 }
 
+
+
 static int network_oper_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
 	struct gsmd_user *gu = ctx;
@@ -1004,6 +1033,9 @@
 	case GSMD_NETWORK_DEREGISTER:
 		cmd = atcmd_fill("AT+COPS=2", 9+1, &null_cmd_cb, gu, 0, NULL);
 		break;
+	case GSMD_NETWORK_QUERY_REG:
+		cmd = atcmd_fill("AT+CREG?", 8+1, &network_query_reg_cb, gu, 0, NULL);
+		break;
 	case GSMD_NETWORK_VMAIL_GET:
 		cmd = atcmd_fill("AT+CSVM?", 8+1, &network_vmail_cb, gu, 0, NULL);
 		break;

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_network.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_network.c	2008-01-24 14:26:24 UTC (rev 3942)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_network.c	2008-01-24 15:20:40 UTC (rev 3943)
@@ -81,6 +81,11 @@
 	return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_DEREGISTER);
 }
 
+int lgsm_netreg_query(struct lgsm_handle *lh)
+{
+	return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_QUERY_REG);
+}
+
 int lgsm_signal_quality(struct lgsm_handle *lh)
 {
 	return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_SIGQ_GET);

Modified: trunk/src/target/gsm/src/util/shell.c
===================================================================
--- trunk/src/target/gsm/src/util/shell.c	2008-01-24 14:26:24 UTC (rev 3942)
+++ trunk/src/target/gsm/src/util/shell.c	2008-01-24 15:20:40 UTC (rev 3943)
@@ -291,6 +291,7 @@
 		((void *) gmh + sizeof(*gmh));
 	const struct gsmd_voicemail *vmail = (struct gsmd_voicemail *)
 		((void *) gmh + sizeof(*gmh));
+	enum gsmd_netreg_state state = *(enum gsmd_netreg_state *) gmh->data;
 	int result = *(int *) gmh->data;
 	static const char *oper_stat[] = {
 		[GSMD_OPER_UNKNOWN] = "of unknown status",
@@ -361,6 +362,28 @@
 			printf ("voicemail number is %s \n",vmail->addr.number);
 		pending_responses --;
 		break;
+	case GSMD_NETWORK_QUERY_REG:
+		switch (state) {
+			case GSMD_NETREG_UNREG:
+				printf("not searching for network \n");
+				break;
+			case GSMD_NETREG_REG_HOME:
+				printf("registered (home network) \n");
+				break;
+			case GSMD_NETREG_UNREG_BUSY:
+				printf("searching for network \n");
+				break;
+			case GSMD_NETREG_DENIED:
+				printf("registration denied \n");
+				break;
+			case GSMD_NETREG_REG_ROAMING:
+				printf("registered (roaming) \n");
+				break;
+			default:
+				break;
+		}
+		pending_responses --;
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -648,6 +671,10 @@
 				printf("Signal strength\n");
 				lgsm_signal_quality(lgsmh);
 				pending_responses ++;
+			} else if (!strcmp(buf, "nr")) {
+				printf("Query network registration\n");
+				lgsm_netreg_query(lgsmh);
+				pending_responses ++;
 			} else if (!strcmp(buf, "q")) {
 				exit(0);
 			} else if (buf[0] == 'S' ) {





More information about the commitlog mailing list