diff options
Diffstat (limited to 'src/tty.c')
-rw-r--r-- | src/tty.c | 101 |
1 files changed, 81 insertions, 20 deletions
@@ -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, + "<tty_bit_analyse: 0%d%d%d%d%d%d%d%d1 [%d,%d,%d,%d,%d,%d,%d,%d,%d,%d]>", + 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, "<tty_analyse: %6d errors, current rate %db is too low>", + p->biterrs, i); + } + else + { + log_f (c->l, "<tty_analyse: %6d errors, current rate %db, suggest %db>", + 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); |