changeset 368:3cc79e260066

fcup-smsend: implemented concat SMS sending with user-given refno
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Mar 2018 16:28:26 +0000
parents ed1ecc249eb3
children 06cf82710cca
files uptools/atcmd/smsend_main.c
diffstat 1 files changed, 36 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/uptools/atcmd/smsend_main.c	Thu Mar 08 07:27:45 2018 +0000
+++ b/uptools/atcmd/smsend_main.c	Thu Mar 08 16:28:26 2018 +0000
@@ -17,19 +17,22 @@
 char msgtext[MAX_MSG_CHARS*2+2];
 u_char msgtext_gsm7[MAX_MSG_CHARS];
 unsigned msgtext_gsmlen;
+u_char concat_refno;
 
 process_cmdline(argc, argv)
 	char **argv;
 {
 	int c;
 	extern int optind;
+	extern char *optarg;
 
-	while ((c = getopt(argc, argv, "B:cnp:RtuwWX:")) != EOF) {
+	while ((c = getopt(argc, argv, "B:C:np:RtuwWX:")) != EOF) {
 		if (atinterf_cmdline_opt(c))
 			continue;
 		switch (c) {
-		case 'c':
+		case 'C':
 			concat_enable = 1;
+			concat_refno = strtoul(optarg, 0, 0);
 			continue;
 		case 't':
 			text_mode = 1;
@@ -49,7 +52,8 @@
 		}
 	}
 	if (concat_enable && text_mode) {
-		fprintf(stderr, "%s error: -c and -t are mutually exclusive\n",
+		fprintf(stderr,
+			"%s error: cannot send concat SMS in text mode\n",
 			argv[0]);
 		exit(ERROR_USAGE);
 	}
@@ -129,6 +133,9 @@
 	char **argv;
 {
 	int rc;
+	unsigned nparts, n;
+	u_char udh[5];
+	unsigned pos, remain, chunk;
 
 	if (!process_cmdline(argc, argv))
 		read_msgtext_from_stdin();
@@ -176,7 +183,30 @@
 	}
 	if (!concat_enable)
 		goto too_long_for_one_sms;
-
-	fprintf(stderr, "concat SMS not yet implemented\n");
-	exit(ERROR_BUG);
+	nparts = (msgtext_gsmlen + 152) / 153;
+	udh[0] = 0x00;
+	udh[1] = 0x03;
+	udh[2] = concat_refno;
+	udh[3] = nparts;
+	common_init();
+	prep_for_pdu_mode();
+	if (sms_write_mode == 0)
+		atinterf_exec_cmd_needok("AT+CMMS=1", 0, 0);
+	pos = 0;
+	remain = msgtext_gsmlen;
+	for (n = 1; n <= nparts; n++) {
+		udh[4] = n;
+		chunk = 153;
+		if (chunk > remain)
+			chunk = remain;
+		send_in_pdu_mode(dest_addr, msgtext_gsm7 + pos, chunk, udh, 5);
+		pos += chunk;
+		remain -= chunk;
+	}
+	if (sms_write_mode == 0)
+		atinterf_exec_cmd_needok("AT+CMMS=0", 0, 0);
+	if (sms_write_mode == 1)
+		sendafterwr_process();
+	printf("Message sent as %u SMS segments\n", nparts);
+	exit(0);
 }