From fc338d9b30500f311d9555545477e4ba1775b403 Mon Sep 17 00:00:00 2001 From: james <> Date: Sat, 23 Feb 2008 11:49:23 +0000 Subject: *** empty log message *** --- src/tty.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 8 deletions(-) (limited to 'src/tty.c') diff --git a/src/tty.c b/src/tty.c index 1ac8c87..3b8f731 100644 --- a/src/tty.c +++ b/src/tty.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.13 2008/02/23 11:48:37 james + * *** empty log message *** + * * Revision 1.12 2008/02/22 23:39:27 james * *** empty log message *** * @@ -344,29 +347,93 @@ typedef struct } \ while (0) -void -tty_stats (TTY_Parser * p, int err, int ch) +static void +tty_bit_analyse (TTY_Parser * p, int err, int ch) { int c = 128; int zc = 0, oc = 0; if (err) - p->biterrs++; + { + p->biterrs++; + gettimeofday (&p->lasterr, NULL); + } bit (p, 0, zc, oc); while (c) { - bit (p,ch & c,zc,oc); + bit (p, ch & c, zc, oc); c >>= 1; } bit (p, 1, zc, oc); } +void +tty_parse_reset (Context * c) +{ + TTY_Parser *p = c->tp; + memset (p->bitfreq, 0, sizeof (p->bitfreq)); + p->biterrs = 0; + p->guessed_baud = 0; +} + +void +analyse (Context * c) +{ + TTY_Parser *p = c->tp; + struct timeval now, dif; + int i; + + if (!p->biterrs) + { + p->guessed_baud = 0; + return; + } + + gettimeofday (&now, NULL); + + timersub (&now, &p->lasterr, &dif); + + if (dif.tv_sec > 10) + { + tty_parse_reset (c); + return; + } + +#define TTY_BITFREQ_LEN 10 + + for (i = 0; i < TTY_BITFREQ_LEN && (!p->bitfreq[i]); ++i); + + if (!i) + { + /*Closest bit edge is one bit, so the baud rate is too low */ + p->guessed_baud = -1; + + } + + p->guessed_baud = i; + +} + +TTY_Parser * +tty_parser_new (void) +{ + TTY_Parser *p; + + p = (TTY_Parser *) malloc (sizeof (TTY_Parser)); + + memset (p, 0, sizeof (TTY_Parser)); + + return p; +} + void tty_parse (Context * c, uint8_t * buf, int len) { - TTY_Parser *p = &c->t->parser; + TTY_Parser *p; + + p = c->tp; while (len--) { @@ -384,21 +451,39 @@ tty_parse (Context * c, uint8_t * buf, int len) p->in_errmark = 1; break; default: - log_f (c->l, "%s:%d DLE parsing error: \\377 \\%03o", *buf); + log_f (c->l, "%s:%d DLE parsing error: \\377 \\%03o", __FILE__, + __LINE__, *buf); } } else if (p->in_errmark) { p->in_errmark = 0; - log_f (c->l, "%s:%d tty reports error: \\377 \\000 \\%03o", *buf); - utf8_parse (c, *buf); + log_f (c->l, "%s:%d tty reports error: \\377 \\000 \\%03o", + __FILE__, __LINE__, *buf); + + tty_bit_analyse (p, 1, *buf); + + analyse (c); + + utf8_parse (c, *buf); + utf8_parse (c, SYM_CHAR_RESET); + + } + else if (*buf == DLE) + { + p->in_dle = 1; + } else { tty_bit_analyse (p, 0, *buf); + + analyse (c); + utf8_parse (c, *buf); + } buf++; } -- cgit v1.2.3