Hi List,

R3943 is committed for query network registration status. 
R3963 is committed for removing unable handle packet 2 error. Thanks for atul 
raut!
R3964 is committed for disable COLP and avoid cme error 512. Thanks for Sean 
Chiang!
R3965 is committed for query network registration status 2nd try.

Regards,
Erin

Index: src/libgsmd/libgsmd.c
===================================================================
--- src/libgsmd/libgsmd.c	(revision 3962)
+++ src/libgsmd/libgsmd.c	(working copy)
@@ -36,7 +36,7 @@
 
 #include "lgsm_internals.h"
 
-#if 0
+
 static int lgsm_get_packet(struct lgsm_handle *lh)
 {
 	static char buf[GSMD_MSGSIZE_MAX];
@@ -58,8 +58,8 @@
 
 	return 0;
 }
-#endif
 
+
 static int lgsm_open_backend(struct lgsm_handle *lh, const char *device)
 {
 	int rc;
Index: src/gsmd/gsmd.c
===================================================================
--- src/gsmd/gsmd.c	(revision 3962)
+++ src/gsmd/gsmd.c	(working copy)
@@ -182,7 +182,8 @@
 	/* use +CLIP: to indicate CLIP */
 	rc |= gsmd_simplecmd(gsmd, "AT+CLIP=1");
 	/* use +COLP: to indicate COLP */
-	rc |= gsmd_simplecmd(gsmd, "AT+COLP=1");
+	/* set it 0 to disable subscriber info and avoid cme err 512 */
+	rc |= gsmd_simplecmd(gsmd, "AT+COLP=0");
 	/* use +CCWA: to indicate waiting call */
 	rc |= gsmd_simplecmd(gsmd, "AT+CCWA=1,1");
 	/* configure message format as PDU mode*/
Index: include/gsmd/usock.h
===================================================================
--- include/gsmd/usock.h	(revision 3962)
+++ include/gsmd/usock.h	(working copy)
@@ -162,7 +162,7 @@
 	GSMD_NETWORK_PREF_DEL   = 12,
 	GSMD_NETWORK_PREF_ADD   = 13,
 	GSMD_NETWORK_PREF_SPACE = 14,
-	GSMD_NETWORK_QUERY_REG = 15,
+	GSMD_NETWORK_QUERY_REG  = 15,
 };
 
 enum gsmd_msg_sms {
Index: src/gsmd/usock.c
===================================================================
--- src/gsmd/usock.c	(revision 3962)
+++ src/gsmd/usock.c	(working copy)
@@ -674,7 +674,7 @@
 
 	if (strncmp(resp, "+CREG: ", 7))
 		return -EINVAL;
-	resp += 7;
+
 	er = extrsp_parse(gsmd_tallocs, resp);
 	if(!er)
 		return -ENOMEM;
Index: include/gsmd/usock.h
===================================================================
--- include/gsmd/usock.h	(revision 3937)
+++ include/gsmd/usock.h	(working copy)
@@ -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 {
Index: src/libgsmd/libgsmd_network.c
===================================================================
--- src/libgsmd/libgsmd_network.c	(revision 3937)
+++ src/libgsmd/libgsmd_network.c	(working copy)
@@ -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);
Index: src/gsmd/usock.c
===================================================================
--- src/gsmd/usock.c	(revision 3937)
+++ src/gsmd/usock.c	(working copy)
@@ -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;
Index: src/util/shell.c
===================================================================
--- src/util/shell.c	(revision 3937)
+++ src/util/shell.c	(working copy)
@@ -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' ) {

Reply via email to