# HG changeset patch # User Mychaela Falconia # Date 1520566180 0 # Node ID 3eb92855f7b96594a601d4b1954d59fb06a91e2d # Parent f8c693d169785fafb907223f97a286e4e806a7ab fcup-smsendpdu program written, compiles diff -r f8c693d16978 -r 3eb92855f7b9 .hgignore --- a/.hgignore Fri Mar 09 02:56:09 2018 +0000 +++ b/.hgignore Fri Mar 09 03:29:40 2018 +0000 @@ -64,5 +64,6 @@ ^uptools/atcmd/fcup-smdump$ ^uptools/atcmd/fcup-smsend$ ^uptools/atcmd/fcup-smsendmult$ +^uptools/atcmd/fcup-smsendpdu$ ^uptools/atinterf/fcup-atinterf$ ^uptools/sms-pdu-decode/sms-pdu-decode$ diff -r f8c693d16978 -r 3eb92855f7b9 uptools/atcmd/Makefile --- a/uptools/atcmd/Makefile Fri Mar 09 02:56:09 2018 +0000 +++ b/uptools/atcmd/Makefile Fri Mar 09 03:29:40 2018 +0000 @@ -1,6 +1,6 @@ CC= gcc CFLAGS= -O2 -PROGS= fcup-at fcup-smdump fcup-smsend fcup-smsendmult +PROGS= fcup-at fcup-smdump fcup-smsend fcup-smsendmult fcup-smsendpdu INSTBIN=/opt/freecalypso/bin LIBCODING= ../libcoding/libcoding.a @@ -16,6 +16,9 @@ SMSENDM_OBJS= atinterf.o resp_parse.o smsend_cmgw.o smsend_multmain.o \ smsend_pdugen.o smsend_pduout.o smsend_text.o ${LIBCODING} +SMSENDP_OBJS= atinterf.o resp_parse.o smsend_cmgw.o smsend_pduin.o \ + smsend_pduout.o ${LIBCODING} + all: ${PROGS} fcup-at: ${ATCMD_OBJS} @@ -30,6 +33,9 @@ fcup-smsendmult: ${SMSENDM_OBJS} ${CC} ${CFLAGS} -o $@ ${SMSENDM_OBJS} +fcup-smsendpdu: ${SMSENDP_OBJS} + ${CC} ${CFLAGS} -o $@ ${SMSENDP_OBJS} + install: ${PROGS} mkdir -p ${INSTBIN} install -c ${PROGS} ${INSTBIN} diff -r f8c693d16978 -r 3eb92855f7b9 uptools/atcmd/smsend_pduin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uptools/atcmd/smsend_pduin.c Fri Mar 09 03:29:40 2018 +0000 @@ -0,0 +1,116 @@ +/* + * This is the main module for the fcup-smsendpdu utility. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "../../rvinterf/include/exitcodes.h" + +int sms_write_mode; +char input_line[176*2+2]; +int lineno; +int initdone, cmms_done; + +process_cmdline(argc, argv) + char **argv; +{ + int c; + extern int optind; + + while ((c = getopt(argc, argv, "B:np:RwWX:")) != EOF) { + if (atinterf_cmdline_opt(c)) + continue; + switch (c) { + case 'w': + sms_write_mode = 1; + continue; + case 'W': + sms_write_mode = 2; + continue; + default: + /* error msg already printed */ + exit(ERROR_USAGE); + } + } + if (argc != optind) { + fprintf(stderr, "usage: %s [options]\n", argv[0]); + exit(ERROR_USAGE); + } + return(0); +} + +more_input() +{ + int c; + + c = getc(stdin); + if (c == EOF) + return(0); + ungetc(c, stdin); + return(1); +} + +init_send_process() +{ + if (initdone) + return(0); + atinterf_init(); + /* enable verbose error messages */ + atinterf_exec_cmd_needok("AT+CMEE=2", 0, 0); + /* set PDU mode */ + prep_for_pdu_mode(); + if (sms_write_mode == 0 && more_input()) { + atinterf_exec_cmd_needok("AT+CMMS=1", 0, 0); + cmms_done = 1; + } + initdone = 1; + return(1); +} + +process_line() +{ + char *cp; + u_char pdubin[176]; + int cc, scalen; + + cp = index(input_line, '\n'); + if (!cp) { + fprintf(stderr, "input line %d: too long or unterminated\n", + lineno); + exit(ERROR_USAGE); + } + *cp = '\0'; + cc = decode_hex_line(input_line, pdubin, sizeof pdubin); + if (cc < 1) { +inv: fprintf(stderr, "input line %d: not a valid PDU\n", lineno); + exit(ERROR_USAGE); + } + if (pdubin[0] == 1 || pdubin[0] > 11) + goto inv; + scalen = pdubin[0] + 1; + if (cc < scalen + 1) + goto inv; + /* good to go */ + init_send_process(); + send_pdu_out(input_line, cc - scalen); +} + +main(argc, argv) + char **argv; +{ + process_cmdline(argc, argv); + for (lineno = 1; fgets(input_line, sizeof input_line, stdin); lineno++) + process_line(); + if (!initdone) + exit(0); + if (cmms_done) + atinterf_exec_cmd_needok("AT+CMMS=0", 0, 0); + if (sms_write_mode == 1) + sendafterwr_process(); + exit(0); +}