X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftty.c;h=3b8f731b61e079e9ff4fef09f29d582ced9768c7;hb=5cded6a34ead3205baf1a45ed5adbee24ebec685;hp=1ac8c87467fc03e3b1c78f361f48413d6397a361;hpb=11313f344099e326aaf010fb9781b921df3b1967;p=sympathy.git 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++; }