view serial/xmit.c @ 81:8c23d2a9c013

doc/GrcardSIM2-programming: update for fcsim1-program
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 09 Apr 2021 08:35:54 +0000
parents 5ee00413b8af
children
line wrap: on
line source

/*
 * This module implements the function for sending byte strings
 * to the SIM and collecting the UART echo.
 */

#include <sys/types.h>
#include <sys/time.h>
#include <sys/errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>

extern int target_fd;
extern int inverse_coding;

send_bytes_to_sim(data, nbytes)
	u_char *data;
	unsigned nbytes;
{
	u_char buf1[255], buf2[255];
	fd_set fds;
	struct timeval tv;
	unsigned rcvd;
	int cc;

	bcopy(data, buf1, nbytes);
	if (inverse_coding)
		invert_bytes(buf1, nbytes);
	write(target_fd, buf1, nbytes);
	for (rcvd = 0; rcvd < nbytes; ) {
		FD_ZERO(&fds);
		FD_SET(target_fd, &fds);
		tv.tv_sec = 1;
		tv.tv_usec = 0;
		cc = select(target_fd+1, &fds, NULL, NULL, &tv);
		if (cc < 0) {
			if (errno == EINTR)
				continue;
			perror("select");
			return(-1);
		}
		if (cc < 1) {
			fprintf(stderr,
			"error: timeout waiting for echo of Tx bytes\n");
			return(-1);
		}
		cc = read(target_fd, buf2 + rcvd, nbytes - rcvd);
		if (cc <= 0) {
			perror("read after successful select");
			return(-1);
		}
		rcvd += cc;
	}
	if (bcmp(buf1, buf2, nbytes)) {
		fprintf(stderr, "error: UART echo mismatch\n");
		return(-1);
	} else
		return(0);
}