view uptools/atcmd/smwrite.c @ 505:7bf0d909c87e

fc-loadtool flash ID check: change of reset after the check logic This change only affects those flash configurations that have ID checks enabled. The logic for resetting the flash after the ID check has been changed as follows: 1) If the check fails, we return without attempting to reset the flash. 2) If the check is successful, we reset the flash using the configured method (could be AMD or Intel or Intel W30) instead of always doing an AMD flash reset as the original code did.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 27 May 2019 19:58:01 +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);
}