FreeCalypso > hg > freecalypso-sw
diff rvinterf/lowlevel/packetrx.c @ 173:f42854da4563
rvinterf: beginning of refactoring
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 22 Nov 2013 05:56:07 +0000 |
parents | |
children | 3256dc6e84ae |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/lowlevel/packetrx.c Fri Nov 22 05:56:07 2013 +0000 @@ -0,0 +1,88 @@ +/* + * 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]); +}