view rvinterf/lowlevel/packettx.c @ 854:74331b35b1da

ringtools/examples/ring.pwt: PWT equivalent of ring.buz
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 09 Nov 2021 16:39:52 +0000
parents e7502631a0f9
children
line wrap: on
line source

/*
 * This module handles the lowest level of serial packet Tx
 */

#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include "../include/pktmux.h"
#include "../include/limits.h"

extern int target_fd;
extern int wakeup_after_sec;

static u_char wakeup_shot[64];
static struct timeval last_tx;

send_pkt_to_target(pkt, pktlen)
	u_char *pkt;
{
	u_char buf[MAX_PKT_TO_TARGET*2+2];
	u_char *cp, *dp, *endp;
	int c;
	struct timeval curtime, timediff;

	gettimeofday(&curtime, 0);
	if (wakeup_after_sec) {
		timersub(&curtime, &last_tx, &timediff);
		if (timediff.tv_sec >= wakeup_after_sec) {
			write(target_fd, wakeup_shot, sizeof wakeup_shot);
			usleep(100000);
		}
	}
	endp = pkt + pktlen;
	dp = buf;
	*dp++ = STX;
	for (cp = pkt; cp < endp; cp++) {
		c = *cp;
		if (c == STX || c == DLE)
			*dp++ = DLE;
		*dp++ = c;
	}
	*dp++ = STX;
	write(target_fd, buf, dp - buf);
	bcopy(&curtime, &last_tx, sizeof(struct timeval));
}