diff uptools/atcmd/smsend_cmgw.c @ 362:89fe66cb60f6

fcup-smsend program put together, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 05 Mar 2018 01:47:18 +0000
parents
children dc2fd8e6f42c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uptools/atcmd/smsend_cmgw.c	Mon Mar 05 01:47:18 2018 +0000
@@ -0,0 +1,84 @@
+/*
+ * The handling of +CMGW responses and send-after-write for fcup-smsend
+ * family is implemented here.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "../../rvinterf/include/exitcodes.h"
+#include "resp_parse.h"
+
+extern char at_response[];
+extern int sms_write_mode;
+
+struct saw_rec {
+	unsigned	msgid;
+	struct saw_rec	*next;
+};
+
+struct saw_rec *sendafterwr_head, **sendafterwr_tail = &sendafterwr_head;
+
+add_sendafterwr_record(msgid)
+	unsigned msgid;
+{
+	struct saw_rec *rec;
+
+	rec = malloc(sizeof(struct saw_rec));
+	if (!rec) {
+		perror("malloc for send-after-write record");
+		exit(ERROR_UNIX);
+	}
+	rec->msgid = msgid;
+	rec->next = 0;
+	*sendafterwr_tail = rec;
+	sendafterwr_tail = &rec->next;
+}
+
+cmgw_callback()
+{
+	struct resp_field fields[1];
+	int cc;
+
+	/* skip empty lines */
+	if (!at_response[1])
+		return;
+	/* if not empty, it MUST be +CMGW */
+	if (strncmp(at_response+1, "+CMGW: ", 7)) {
+		fprintf(stderr, "error: response from target is not +CMGW\n");
+		exit(ERROR_TARGET);
+	}
+	if (sms_write_mode == 2) {
+		puts(at_response+1);
+		return;
+	}
+	if (parse_structured_response(at_response+8, fields, 1) != 1) {
+malformed:	fprintf(stderr, "error: malformed +CMGW response\n");
+		exit(ERROR_TARGET);
+	}
+	if (fields[0].type != RESP_FIELD_NUMBER)
+		goto malformed;
+	add_sendafterwr_record(fields[0].num);
+}
+
+sendafterwr_process()
+{
+	struct saw_rec *rec;
+	char cmss_cmd[32];
+
+	if (!sendafterwr_head) {
+		fprintf(stderr,
+			"error: no +CMGW response received from target\n");
+		exit(ERROR_TARGET);
+	}
+	if (sendafterwr_head->next)
+		atinterf_exec_cmd_needok("AT+CMMS=1", 0, 0);
+	for (rec = sendafterwr_head; rec; rec = rec->next) {
+		sprintf(cmss_cmd, "AT+CMSS=%u", rec->msgid);
+		atinterf_exec_cmd_needok(cmss_cmd, 0, 0);
+	}
+	if (sendafterwr_head->next)
+		atinterf_exec_cmd_needok("AT+CMMS=0", 0, 0);
+}