diff options
Diffstat (limited to 'src/gsmd')
| -rw-r--r-- | src/gsmd/atcmd.c | 11 | ||||
| -rw-r--r-- | src/gsmd/gsmd.c | 30 | ||||
| -rw-r--r-- | src/gsmd/usock.c | 48 | 
3 files changed, 67 insertions, 22 deletions
diff --git a/src/gsmd/atcmd.c b/src/gsmd/atcmd.c index 2647192..53120f4 100644 --- a/src/gsmd/atcmd.c +++ b/src/gsmd/atcmd.c @@ -156,6 +156,11 @@ static int ml_parse(const char *buf, int len, void *ctx)  	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 @@ static int ml_parse(const char *buf, int len, void *ctx)  		/* 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 @@ struct gsmd_atcmd *atcmd_fill(const char *cmd, int rlen,  /* 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; diff --git a/src/gsmd/gsmd.c b/src/gsmd/gsmd.c index c8a3b3f..9595d4b 100644 --- a/src/gsmd/gsmd.c +++ b/src/gsmd/gsmd.c @@ -26,32 +26,24 @@ static int gsmd_test_atcb(struct gsmd_atcmd *cmd, void *ctx, char *resp)  	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); -	return atcmd_submit(gsmd, cmd); -} - -static int atcmd_test(struct gsmd *gsmd) -{ -	struct gsmd_atcmd *cmd; -	cmd = atcmd_fill("ATE0", 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 gsmd_initsettings(struct gsmd *gsmd) +int gsmd_initsettings(struct gsmd *gsmd)  {  	int rc; -	struct gsmd_atcmd *cmd; - -	cmd = atcmd_fill("ATV1", 255, &gsmd_test_atcb, NULL, 0); -	rc = atcmd_submit(gsmd, cmd); -	if (rc < 0) -		return rc; +	 +	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("+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 @@ int main(int argc, char **argv)  		setsid();  	} -	atcmd_test(&g); -	gsmd_test(&g);  	gsmd_initsettings(&g);  	while (1) { diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c index 93e9751..76be1aa 100644 --- a/src/gsmd/usock.c +++ b/src/gsmd/usock.c @@ -88,7 +88,7 @@ static int usock_rcv_voicecall(struct gsmd_user *gu, struct gsmd_msg_hdr *gph,  	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 @@ static int usock_rcv_pin(struct gsmd_user *gu, struct gsmd_msg_hdr *gph,  	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)  | 
