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

laforge at gta01.hmw-consulting.de laforge at gta01.hmw-consulting.de
Mon Oct 23 23:55:41 CEST 2006


Author: laforge
Date: 2006-10-23 21:55:39 +0000 (Mon, 23 Oct 2006)
New Revision: 115

Added:
   trunk/src/target/gsm/src/util/atcmd.c
   trunk/src/target/gsm/src/util/atcmd.h
   trunk/src/target/gsm/src/util/shell.h
Modified:
   trunk/src/target/gsm/include/gsmd/usock.h
   trunk/src/target/gsm/include/libgsmd/misc.h
   trunk/src/target/gsm/src/gsmd/atcmd.c
   trunk/src/target/gsm/src/gsmd/gsmd.c
   trunk/src/target/gsm/src/gsmd/usock.c
   trunk/src/target/gsm/src/libgsmd/Makefile.am
   trunk/src/target/gsm/src/util/Makefile.am
   trunk/src/target/gsm/src/util/event.c
   trunk/src/target/gsm/src/util/libgsmd-tool.c
   trunk/src/target/gsm/src/util/pin.c
   trunk/src/target/gsm/src/util/shell.c
Log:
first working revision of gsmd, libgsmd and libgsmd-tool


Modified: trunk/src/target/gsm/include/gsmd/usock.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/usock.h	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/include/gsmd/usock.h	2006-10-23 21:55:39 UTC (rev 115)
@@ -46,6 +46,15 @@
 	GSMD_PIN_INPUT		= 1,
 };
 
+enum gsmd_msg_phone {
+	GSMD_PHONE_POWERUP	= 1,
+	GSMD_PHONE_POWERDOWN	= 2,
+};
+
+enum gsmd_msg_network {
+	GSMD_NETWORK_REGISTER	= 1,
+};
+
 /* Length from 3GPP TS 04.08, Clause 10.5.4.7 */
 
 #define GSMD_ADDR_MAXLEN	32

Modified: trunk/src/target/gsm/include/libgsmd/misc.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/misc.h	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/include/libgsmd/misc.h	2006-10-23 21:55:39 UTC (rev 115)
@@ -8,6 +8,8 @@
 
 #include <libgsmd/libgsmd.h>
 
+extern int lgsm_phone_power(struct lgsm_handle *lh, int power);
+
 enum lgsm_netreg_state {
 	LGSM_NETREG_ST_NOTREG		= 0,
 	LGSM_NETREG_ST_REG_HOME		= 1,
@@ -21,6 +23,8 @@
 extern int lgsm_get_netreg_state(struct lgsm_handle *lh,
 				 enum lgsm_netreg_state *state);
 
+extern int lgsm_netreg_register(struct lgsm_handle *lh, int oper);
+
 enum lgsm_info_type {
 	LGSM_INFO_TYPE_NONE		= 0,
 	LGSM_INFO_TYPE_MANUF		= 1,

Modified: trunk/src/target/gsm/src/gsmd/atcmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/atcmd.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/gsmd/atcmd.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -156,6 +156,11 @@
 
 	DEBUGP("buf=`%s'(%d)\n", buf, len);
 	
+	if (!strcmp(buf, "AT-Command Interpreter ready")) {
+		gsmd_initsettings(g);
+		return 0;
+	}
+
 	/* responses come in order, so first response has to be for first
 	 * command we sent, i.e. first entry in list */
 	cmd = llist_entry(g->busy_atcmds.next, struct gsmd_atcmd, list);
@@ -248,13 +253,15 @@
 
 		/* FIXME: handling of those special commands in response to
 		 * ATD / ATA */
-		if (!strncmp(buf, "NO CARRIER", 10)) {
+		if (!strncmp(buf, "NO CARRIER", 11)) {
 			/* Part of Case 'D' */
+			final = 1;
 			goto final_cb;
 		}
 
 		if (!strncmp(buf, "BUSY", 4)) {
 			/* Part of Case 'D' */
+			final = 1;
 			goto final_cb;
 		}
 	}
@@ -388,6 +395,8 @@
 /* submit an atcmd in the global queue of pending atcmds */
 int atcmd_submit(struct gsmd *g, struct gsmd_atcmd *cmd)
 {
+	DEBUGP("submitting command `%s'\n", cmd->buf);
+
 	llist_add_tail(&cmd->list, &g->pending_atcmds);
 	g->gfd_uart.when |= GSMD_FD_WRITE;
 

Modified: trunk/src/target/gsm/src/gsmd/gsmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/gsmd.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/gsmd/gsmd.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -26,32 +26,24 @@
 	return 0;
 }
 
-static int gsmd_test(struct gsmd *gsmd)
+static int gsmd_simplecmd(struct gsmd *gsmd, char *cmdtxt)
 {
 	struct gsmd_atcmd *cmd;
-	cmd = atcmd_fill("AT+CRC?", 255, &gsmd_test_atcb, NULL, 0);
+	cmd = atcmd_fill(cmdtxt, strlen(cmdtxt)+1, &gsmd_test_atcb, NULL, 0);
+	if (!cmd)
+		return -ENOMEM;
+	
 	return atcmd_submit(gsmd, cmd);
 }
 
-static int atcmd_test(struct gsmd *gsmd)
+int gsmd_initsettings(struct gsmd *gsmd)
 {
-	struct gsmd_atcmd *cmd;
-	cmd = atcmd_fill("ATE0", 255, &gsmd_test_atcb, NULL, 0);
-	return atcmd_submit(gsmd, cmd);
-}
-
-static int gsmd_initsettings(struct gsmd *gsmd)
-{
 	int rc;
-	struct gsmd_atcmd *cmd;
+	
+	rc |= gsmd_simplecmd(gsmd, "ATE0V1");
+	rc |= gsmd_simplecmd(gsmd, "AT+CRC=1;+CREG=2;+CMEE=1;+CLIP=1;+COLP=1;+CTZR=1;+CFUN=1");
 
-	cmd = atcmd_fill("ATV1", 255, &gsmd_test_atcb, NULL, 0);
-	rc = atcmd_submit(gsmd, cmd);
-	if (rc < 0)
-		return rc;
-
-	cmd = atcmd_fill("+CRC=1;+CREG=2;+CMEE=2;+CLIP=1;+COLP=1;+CTZR=1", 255, &gsmd_test_atcb, NULL, 0);
-	return atcmd_submit(gsmd, cmd);
+	return rc;
 }
 
 struct bdrt {
@@ -207,8 +199,6 @@
 		setsid();
 	}
 
-	atcmd_test(&g);
-	gsmd_test(&g);
 	gsmd_initsettings(&g);
 
 	while (1) {

Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/gsmd/usock.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -88,7 +88,7 @@
 	case GSMD_VOICECALL_DIAL:
 		if (len < sizeof(*gph) + sizeof(*ga))
 			return -EINVAL;
-		ga = (struct gsmd_addr *) (void *)gph + sizeof(*gph);
+		ga = (struct gsmd_addr *) ((void *)gph + sizeof(*gph));
 		ga->number[GSMD_ADDR_MAXLEN] = '\0';
 		cmd = atcmd_fill("ATD", 5 + strlen(ga->number),
 				 &usock_cmd_cb, gu, gph->id);
@@ -145,11 +145,57 @@
 	return atcmd_submit(gu->gsmd, cmd);
 }
 
+static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
+			   int len)
+{
+	struct gsmd_atcmd *cmd;
+
+	switch (gph->msg_subtype) {
+	case GSMD_PHONE_POWERUP:
+		cmd = atcmd_fill("AT+CFUN=1", 9+1,
+				 &null_cmd_cb, gu, 0);
+		break;
+
+	case GSMD_PHONE_POWERDOWN:
+		cmd = atcmd_fill("AT+CFUN=0", 9+1,
+				 &null_cmd_cb, gu, 0);
+		break;
+	default:
+		return -EINVAL;
+	}
+	if (!cmd)
+		return -ENOMEM;
+
+	return atcmd_submit(gu->gsmd, cmd);
+}
+
+static int usock_rcv_network(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
+			     int len)
+{
+	struct gsmd_atcmd *cmd;
+
+	switch (gph->msg_subtype) {
+	case GSMD_NETWORK_REGISTER:
+		cmd = atcmd_fill("AT+COPS", 9+1,
+				 &null_cmd_cb, gu, 0);
+		break;
+	default:
+		return -EINVAL;
+	}
+	if (!cmd)
+		return -ENOMEM;
+
+	return atcmd_submit(gu->gsmd, cmd);
+}
+
+
 static usock_msg_handler *pcmd_type_handlers[__NUM_GSMD_MSGS] = {
 	[GSMD_MSG_PASSTHROUGH]	= &usock_rcv_passthrough,
 	[GSMD_MSG_EVENT]	= &usock_rcv_event,
 	[GSMD_MSG_VOICECALL]	= &usock_rcv_voicecall,
 	[GSMD_MSG_PIN]		= &usock_rcv_pin,
+	[GSMD_MSG_PHONE]	= &usock_rcv_phone,
+	[GSMD_MSG_NETWORK]	= &usock_rcv_network,
 };
 
 static int usock_rcv_pcmd(struct gsmd_user *gu, char *buf, int len)

Modified: trunk/src/target/gsm/src/libgsmd/Makefile.am
===================================================================
--- trunk/src/target/gsm/src/libgsmd/Makefile.am	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/libgsmd/Makefile.am	2006-10-23 21:55:39 UTC (rev 115)
@@ -5,5 +5,5 @@
 lib_LTLIBRARIES = libgsmd.la
 
 libgsmd_la_LDFLAGS = -Wc,-nostartfiles -version-info $(LIBVERSION)
-libgsmd_la_SOURCES = libgsmd.c libgsmd_input.c libgsmd_voicecall.c libgsmd_passthrough.c libgsmd_event.c
+libgsmd_la_SOURCES = libgsmd.c libgsmd_input.c libgsmd_voicecall.c libgsmd_passthrough.c libgsmd_event.c libgsmd_phone.c libgsmd_network.c
 

Modified: trunk/src/target/gsm/src/util/Makefile.am
===================================================================
--- trunk/src/target/gsm/src/util/Makefile.am	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/Makefile.am	2006-10-23 21:55:39 UTC (rev 115)
@@ -3,7 +3,7 @@
 
 bin_PROGRAMS = libgsmd-tool
 
-libgsmd_tool_SOURCES = libgsmd-tool.c shell.c event.c pin.c
+libgsmd_tool_SOURCES = libgsmd-tool.c shell.c event.c pin.c atcmd.c
 libgsmd_tool_LDADD = ../libgsmd/libgsmd.la
 libgsmd_tool_LDFLAGS = -dynamic
 

Added: trunk/src/target/gsm/src/util/atcmd.c
===================================================================
--- trunk/src/target/gsm/src/util/atcmd.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/atcmd.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <libgsmd/libgsmd.h>
+
+#define STDIN_BUF_SIZE	1024
+
+/* this is the handler for receiving passthrough responses */
+static int pt_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
+{
+	char *payload = (char *)gmh + sizeof(*gmh);
+	printf("RSTR=`%s'\n", payload);
+}
+
+int atcmd_main(struct lgsm_handle *lgsmh)
+{
+	int rc;
+	char buf[STDIN_BUF_SIZE+1];
+	char rbuf[STDIN_BUF_SIZE+1];
+	int rlen = sizeof(rbuf);
+	fd_set readset;
+
+	lgsm_register_handler(lgsmh, GSMD_MSG_PASSTHROUGH, &pt_msghandler);
+
+	FD_ZERO(&readset);
+
+	while (1) {
+		fd_set readset;
+		int gsm_fd = lgsm_fd(lgsmh);
+		FD_SET(0, &readset);
+		FD_SET(gsm_fd, &readset);
+
+		rc = select(gsm_fd+1, &readset, NULL, NULL, NULL);
+		if (rc <= 0)	
+			break;
+		if (FD_ISSET(gsm_fd, &readset)) {
+			/* we've received something on the gsmd socket, pass it
+			 * on to the library */
+			rc = read(gsm_fd, buf, sizeof(buf));
+			if (rc <= 0) {
+				printf("ERROR reding from gsm_fd\n");
+				break;
+			}
+			rc = lgsm_handle_packet(lgsmh, buf, rc);
+		}
+		if (FD_ISSET(0, &readset)) {
+			/* we've received something on stdin.  send it as passthrough
+			 * to gsmd */
+			rc = fscanf(stdin, "%s", buf);
+			if (rc == EOF) {
+				printf("EOF\n");
+				return -1;
+			}
+			if (rc <= 0) {
+				printf("NULL\n");
+				continue;
+			}
+			printf("STR=`%s'\n", buf);
+		}
+		/* this is a synchronous call for a passthrough command */
+		lgsm_passthrough(lgsmh, buf, rbuf, &rlen);
+		printf("RSTR=`%s'\n", rbuf);
+	}
+}

Added: trunk/src/target/gsm/src/util/atcmd.h
===================================================================
--- trunk/src/target/gsm/src/util/atcmd.h	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/atcmd.h	2006-10-23 21:55:39 UTC (rev 115)
@@ -0,0 +1,2 @@
+
+extern int atcmd_main(struct lgsm_handle *lgsmh);

Modified: trunk/src/target/gsm/src/util/event.c
===================================================================
--- trunk/src/target/gsm/src/util/event.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/event.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -20,8 +20,33 @@
 
 static int netreg_handler(struct lgsm_handle *lh, int evt, struct gsmd_evt_auxdata *aux)
 {
-	printf("EVENT: Netreg\n");
+	printf("EVENT: Netreg ");
 
+	switch (aux->u.netreg.state) {
+	case 0:
+		printf("not searching for network ");
+		break;
+	case 1:
+		printf("registered (home network) ");
+		break;
+	case 2:
+		printf("searching for network ");
+		break;
+	case 3:
+		printf("registration denied ");
+		break;
+	case 5:
+		printf("registered (roaming) ");
+		break;
+	}
+
+	if (aux->u.netreg.lac)
+		printf("LocationAreaCode=0x%04X ", aux->u.netreg.lac);
+	if (aux->u.netreg.ci)
+		printf("CellID=0x%04X ", aux->u.netreg.ci);
+	
+	printf("\n");
+
 	return 0;
 }
 

Modified: trunk/src/target/gsm/src/util/libgsmd-tool.c
===================================================================
--- trunk/src/target/gsm/src/util/libgsmd-tool.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/libgsmd-tool.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -10,6 +10,8 @@
 
 #include "pin.h"
 #include "event.h"
+#include "shell.h"
+#include "atcmd.h"
 
 #ifndef ARRAY_SIZE
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
@@ -22,12 +24,14 @@
 	MODE_NONE,
 	MODE_SHELL,
 	MODE_EVENTLOG,
+	MODE_ATCMD,
 };
 
 static char *modes[] = {
 	[MODE_NONE]	= "",
 	[MODE_SHELL]	= "shell",
 	[MODE_EVENTLOG]	= "eventlog",
+	[MODE_ATCMD]	= "atcmd",
 };
 
 static int parse_mode(char *modestr)
@@ -56,7 +60,9 @@
 	printf("Usage:\n"
 		"\t-h\t--help\tPrint this Help message\n"
 		"\t-V\t--version\tPrint version number\n"
-		"\t-v\t--verbose\tBe more verbose\n");
+		"\t-v\t--verbose\tBe more verbose\n"
+		"\t-m\t--mode\tSet mode {passthrough,atcmd}\n"
+		);
 }
 
 int main(int argc, char **argv)
@@ -107,6 +113,9 @@
 	event_init(lgsmh);
 
 	switch (mode) {
+	case MODE_ATCMD:
+		atcmd_main(lgsmh);
+		break;
 	case MODE_SHELL:
 		shell_main(lgsmh);
 		break;

Modified: trunk/src/target/gsm/src/util/pin.c
===================================================================
--- trunk/src/target/gsm/src/util/pin.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/pin.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -22,7 +22,7 @@
 	} else {
 		do {
 			printf("Please enter PIN: ");
-			rc = fscanf(stdin, "%32s\n", &pinbuf);
+			rc = fscanf(stdin, "%32s", &pinbuf);
 		} while (rc < 1);
 
 		return lgsm_pin(lh, pinbuf);

Modified: trunk/src/target/gsm/src/util/shell.c
===================================================================
--- trunk/src/target/gsm/src/util/shell.c	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/shell.c	2006-10-23 21:55:39 UTC (rev 115)
@@ -4,6 +4,8 @@
 #include <unistd.h>
 
 #include <libgsmd/libgsmd.h>
+#include <libgsmd/voicecall.h>
+#include <libgsmd/misc.h>
 
 #define STDIN_BUF_SIZE	1024
 
@@ -14,6 +16,17 @@
 	printf("RSTR=`%s'\n", payload);
 }
 
+static int shell_help(void)
+{
+	printf( "\tA\tAnswer incoming call\n"
+		"\tD\tDial outgoing number\n"
+		"\tH\tHangup call\n"
+		"\tO\tPower On\n"
+		"\to\tPower Off\n"
+		"\tR\tRegister Netowrk\n"
+		);
+}
+
 int shell_main(struct lgsm_handle *lgsmh)
 {
 	int rc;
@@ -48,6 +61,7 @@
 		if (FD_ISSET(0, &readset)) {
 			/* we've received something on stdin.  send it as passthrough
 			 * to gsmd */
+			printf("# ");
 			rc = fscanf(stdin, "%s", buf);
 			if (rc == EOF) {
 				printf("EOF\n");
@@ -57,10 +71,32 @@
 				printf("NULL\n");
 				continue;
 			}
-			printf("STR=`%s'\n", buf);
+			if (!strcmp(buf, "h")) {
+				shell_help();
+			} else if (!strcmp(buf, "?")) {
+				shell_help();
+			} else if (!strcmp(buf, "H")) {
+				printf("Hangup\n");
+				lgsm_voice_hangup(lgsmh);
+			} else if (buf[0] == 'D') {
+				struct lgsm_addr addr;
+				printf("Dial %s\n", buf+1);
+				addr.type = 129;
+				strncpy(addr.addr, buf+1, sizeof(addr.addr)-1);
+				addr.addr[sizeof(addr.addr)-1] = '\0';
+				lgsm_voice_out_init(lgsmh, &addr);
+			} else if (!strcmp(buf, "A")) {
+				printf("Answer\n");
+				lgsm_voice_in_accept(lgsmh);
+			} else if (!strcmp(buf, "O")) {
+				lgsm_phone_power(lgsmh, 1);
+			} else if (!strcmp(buf, "o")) {
+				lgsm_phone_power(lgsmh, 0);
+			} else if (!strcmp(buf, "R")) {
+				lgsm_netreg_register(lgsmh, 0);
+			} else {
+				printf("Unknown command `%s'\n", buf);
+			}
 		}
-		/* this is a synchronous call for a passthrough command */
-		lgsm_passthrough(lgsmh, buf, rbuf, &rlen);
-		printf("RSTR=`%s'\n", rbuf);
 	}
 }

Added: trunk/src/target/gsm/src/util/shell.h
===================================================================
--- trunk/src/target/gsm/src/util/shell.h	2006-10-23 20:28:37 UTC (rev 114)
+++ trunk/src/target/gsm/src/util/shell.h	2006-10-23 21:55:39 UTC (rev 115)
@@ -0,0 +1,2 @@
+
+extern int shell_main(struct lgsm_handle *lgsmh);





More information about the commitlog mailing list