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