view rvinterf/old/before-rvinterf/packetrx.c @ 964:373af5f74e39
rvinterf: all retired stuff gathered under old
author |
Mychaela Falconia <falcon@ivan.Harhan.ORG> |
date |
Fri, 06 Nov 2015 23:22:47 +0000 (2015-11-06) |
parents |
rvinterf/old/packetrx.c@f42854da4563 |
children |
|
line source
/*
* This module handles the lowest level of serial packet Rx
*/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "pktmux.h"
extern int target_fd;
#define MAXPKT 512
u_char rxpkt[MAXPKT];
size_t rxpkt_len;
extern char pr_item[];
static int in_pkt, dle_state, toobig;
static void
process_inbyte(inb)
{
if (!in_pkt) {
if (inb != STX || dle_state) {
rxpkt_len++;
dle_state = (inb == DLE);
return;
}
if (rxpkt_len) {
sprintf(pr_item,
"Warning: Rx %u byte%s outside of a packet",
(unsigned)rxpkt_len, rxpkt_len != 1 ? "s" : "");
print_item();
rxpkt_len = 0;
}
in_pkt = 1;
toobig = 0;
return;
}
if (dle_state) {
dle_state = 0;
if (inb != STX && inb != DLE) {
sprintf(pr_item,
"Rx framing error: %02X after DLE\n", inb);
print_item();
in_pkt = 0;
rxpkt_len = 0;
return;
}
goto data;
}
if (inb == DLE) {
dle_state = 1;
return;
} else if (inb == STX) {
if (!rxpkt_len)
return;
in_pkt = 0;
handle_rx_packet();
rxpkt_len = 0;
return;
}
data: if (rxpkt_len >= MAXPKT) {
if (!toobig) {
sprintf(pr_item, "Error: Rx packet too big!\n");
print_item();
toobig = 1;
}
return;
}
rxpkt[rxpkt_len++] = inb;
}
void
process_serial_rx()
{
u_char rdbuf[512];
int cc, i;
cc = read(target_fd, rdbuf, sizeof rdbuf);
if (cc <= 0) {
perror("Error/EOF reading from target");
exit(1);
}
for (i = 0; i < cc; i++)
process_inbyte(rdbuf[i]);
}