FreeCalypso > hg > freecalypso-tools
view uptools/atcmd/smwrite.c @ 978:a400bb4a1620
fc-loadtool flash lock-state: no global bits in second bank
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 01 Dec 2023 08:05:31 +0000 |
parents | dc2fd8e6f42c |
children |
line wrap: on
line source
/* * This program is a debug and development aid - it uses the AT+CMGW command * in PDU mode to write messages into SIM or ME SMS storage, simulating * arbitrary received or sent messages. This trick may come in useful * in the development and testing of SMS handling in phone handset UI firmware. */ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include "../../rvinterf/include/exitcodes.h" extern char at_response[]; char input_line[176*2+2]; int lineno; process_cmdline(argc, argv) char **argv; { int c; extern int optind; while ((c = getopt(argc, argv, "B:np:RX:")) != EOF) if (!atinterf_cmdline_opt(c)) { /* error msg already printed */ exit(ERROR_USAGE); } if (argc != optind) { fprintf(stderr, "usage: %s [options]\n", argv[0]); exit(ERROR_USAGE); } return(0); } get_input_line() { char *nl; if (!fgets(input_line, sizeof input_line, stdin)) return(0); lineno++; nl = index(input_line, '\n'); if (!nl) { fprintf(stderr, "input line %d: too long or unterminated\n", lineno); exit(ERROR_USAGE); } *nl = '\0'; return(1); } get_input_line_noeof() { int rc; rc = get_input_line(); if (!rc) { fprintf(stderr, "error: premature EOF in input\n"); exit(ERROR_USAGE); } } cmgw_callback() { /* skip empty lines */ if (at_response[1]) puts(at_response+1); } process_record() { int msgstat; u_char pdubin[176]; int cc, scalen; char send_cmd[32]; if (!get_input_line()) return(0); if (!strcmp(input_line, "Received unread message:")) msgstat = 0; else if (!strcmp(input_line, "Received message:")) msgstat = 1; else if (!strcmp(input_line, "Stored unsent message:")) msgstat = 2; else if (!strcmp(input_line, "Sent message:")) msgstat = 3; else { fprintf(stderr, "input line %d: expected beginning of message record\n", lineno); exit(ERROR_USAGE); } for (;;) { get_input_line_noeof(); if (!isupper(input_line[0])) break; if (!index(input_line, ':')) break; } 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); } scalen = pdubin[0] + 1; if (cc < scalen + 1) goto inv; /* good to go */ sprintf(send_cmd, "AT+CMGW=%u,%d", cc - scalen, msgstat); atinterf_exec_cmd_needok(send_cmd, input_line, cmgw_callback); /* expect blank line after each PDU */ get_input_line_noeof(); if (input_line[0]) { fprintf(stderr, "input line %d: expected blank line after PDU\n", lineno); exit(ERROR_USAGE); } return(1); } main(argc, argv) char **argv; { process_cmdline(argc, argv); atinterf_init(); /* enable verbose error messages */ atinterf_exec_cmd_needok("AT+CMEE=2", (char *) 0, (void *) 0); /* set PDU mode */ atinterf_exec_cmd_needok("AT+CMGF=0", (char *) 0, (void *) 0); /* process stdin */ while (process_record()) ; exit(0); }