From 667353b64b552aff9e785a20ee915fb343a0dac9 Mon Sep 17 00:00:00 2001 From: staffcvs <> Date: Sat, 23 Feb 2008 13:05:58 +0000 Subject: *** empty log message *** --- src/tty.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 20 deletions(-) (limited to 'src/tty.c') diff --git a/src/tty.c b/src/tty.c index 3b8f731..3171c6c 100644 --- a/src/tty.c +++ b/src/tty.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.14 2008/02/23 13:05:58 staffcvs + * *** empty log message *** + * * Revision 1.13 2008/02/23 11:48:37 james * *** empty log message *** * @@ -258,6 +261,18 @@ tty_get_status (TTY * t, TTY_Status * s) return 0; } +int +tty_get_baud (TTY * t) +{ + struct termios tios = { 0 }; + + if (tcgetattr (t->rfd, &tios)) + return; + + return speed_t_to_baud (cfgetispeed (&tios)); +} + + void tty_set_baud (TTY * t, int rate) { @@ -348,10 +363,22 @@ typedef struct while (0) static void -tty_bit_analyse (TTY_Parser * p, int err, int ch) +tty_bit_analyse (Context * c, int err, int ch) { - int c = 128; + int d; int zc = 0, oc = 0; + TTY_Parser *p = c->tp; + + + bit (p, 0, zc, oc); + + for (d = 1; d < 0x100; d <<= 1) + { + bit (p, ch & d, zc, oc); + } + bit (p, 1, zc, oc); + + if (err) { @@ -359,14 +386,18 @@ tty_bit_analyse (TTY_Parser * p, int err, int ch) gettimeofday (&p->lasterr, NULL); } - bit (p, 0, zc, oc); - - while (c) + if (p->biterrs) { - bit (p, ch & c, zc, oc); - c >>= 1; + log_f (c->l, + "", + ch & 0x01 ? 1 : 0, ch & 0x02 ? 1 : 0, ch & 0x04 ? 1 : 0, + ch & 0x08 ? 1 : 0, ch & 0x10 ? 1 : 0, ch & 0x20 ? 1 : 0, + ch & 0x40 ? 1 : 0, ch & 0x80 ? 1 : 0, p->bitfreq[0], + p->bitfreq[1], p->bitfreq[2], p->bitfreq[3], p->bitfreq[4], + p->bitfreq[5], p->bitfreq[6], p->bitfreq[7], p->bitfreq[8], + p->bitfreq[9]); } - bit (p, 1, zc, oc); + } void @@ -379,11 +410,11 @@ tty_parse_reset (Context * c) } void -analyse (Context * c) +tty_analyse (Context * c) { TTY_Parser *p = c->tp; struct timeval now, dif; - int i; + int i, j, max; if (!p->biterrs) { @@ -401,18 +432,48 @@ analyse (Context * c) return; } -#define TTY_BITFREQ_LEN 10 - for (i = 0; i < TTY_BITFREQ_LEN && (!p->bitfreq[i]); ++i); + max = -1; + j = 0; + for (i = 0; i < TTY_BITFREQ_LEN; ++i) + { + if (p->bitfreq[i] > max) + { + max = p->bitfreq[i]; + j = i; + } + } - if (!i) + if (c->t) + i = tty_get_baud (c->t); + else + i = -1; + + if (j == 1) { /*Closest bit edge is one bit, so the baud rate is too low */ p->guessed_baud = -1; } + else + { + if (i > 0) + p->guessed_baud = i / j; + else + p->guessed_baud = 0; + + } - p->guessed_baud = i; + if (p->guessed_baud == -1) + { + log_f (c->l, "", + p->biterrs, i); + } + else + { + log_f (c->l, "", + p->biterrs, i, p->guessed_baud); + } } @@ -444,7 +505,7 @@ tty_parse (Context * c, uint8_t * buf, int len) switch (*buf) { case DLE: - tty_bit_analyse (p, 0, *buf); + tty_bit_analyse (c, 0, *buf); utf8_parse (c, *buf); break; case 0: @@ -458,13 +519,13 @@ tty_parse (Context * c, uint8_t * buf, int len) else if (p->in_errmark) { p->in_errmark = 0; + log_f (c->l, "%s:%d tty reports error: \\377 \\000 \\%03o", __FILE__, __LINE__, *buf); + tty_bit_analyse (c, 1, *buf); - tty_bit_analyse (p, 1, *buf); - - analyse (c); + tty_analyse (c); utf8_parse (c, *buf); @@ -478,9 +539,9 @@ tty_parse (Context * c, uint8_t * buf, int len) } else { - tty_bit_analyse (p, 0, *buf); + tty_bit_analyse (c, 0, *buf); - analyse (c); + tty_analyse (c); utf8_parse (c, *buf); -- cgit v1.2.3