FreeCalypso > hg > freecalypso-tools
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); +}