From 029a61812e82b58803c618ed53df42180106412f Mon Sep 17 00:00:00 2001 From: james <> Date: Fri, 22 Feb 2008 23:39:30 +0000 Subject: *** empty log message *** --- src/tty.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 88 insertions(+), 19 deletions(-) (limited to 'src/tty.c') diff --git a/src/tty.c b/src/tty.c index 1765878..1ac8c87 100644 --- a/src/tty.c +++ b/src/tty.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.12 2008/02/22 23:39:27 james + * *** empty log message *** + * * Revision 1.11 2008/02/20 18:31:53 james * *** empty log message *** * @@ -226,10 +229,6 @@ tty_pre_select (TTY * t, fd_set * rfds, fd_set * wfds) timersub (&now, &t->hangup_clock, &dif); if (dif.tv_sec) { -#if 0 - fprintf (stderr, "+DTR\n"); -#endif - line = TIOCM_DTR; ioctl (t->rfd, TIOCMBIS, &line); t->hanging_up = 0; @@ -247,11 +246,6 @@ tty_get_status (TTY * t, TTY_Status * s) s->lines = 0; ioctl (t->rfd, TIOCMGET, &s->lines); -#if 0 - if (t->hanging_up) - fprintf (stderr, "s->lines & TIOCM_DTR=%x\n", s->lines & TIOCM_DTR); -#endif - if (tcgetattr (t->rfd, &s->termios)) return -1; @@ -313,24 +307,99 @@ tty_hangup (TTY * t) t->hanging_up = 1; gettimeofday (&t->hangup_clock, NULL); -#if 0 - fprintf (stderr, "-DTR\n"); -#endif } #if 0 -int -tty_post_select (Context * c, fd_set * rfds, fd_set * wfds) +typedef struct +{ + int in_dle; + int in_errmark; + + int bit_edge_frequency[8]; + int errs; +} +#endif + +#define DLE 0377 + +#define bit(p,b,z,o) \ + do { \ + if ((b && z)) { \ + p->bitfreq[z]++; \ + z = 0; \ + } \ + \ + if ((!b && o)) \ + { \ + p->bitfreq[z]++; \ + o = 0; \ + } \ + \ + if (b) \ + o++; \ + else \ + z++; \ + } \ + while (0) + +void +tty_stats (TTY_Parser * p, int err, int ch) { + int c = 128; + int zc = 0, oc = 0; + + if (err) + p->biterrs++; + + bit (p, 0, zc, oc); - if (FD_ISSET (c->t->rfd, rfds)) + while (c) { - if (vt102_dispatch (&c)) - return -1; + bit (p,ch & c,zc,oc); + c >>= 1; } - return 0; + bit (p, 1, zc, oc); } -#endif +void +tty_parse (Context * c, uint8_t * buf, int len) +{ + TTY_Parser *p = &c->t->parser; + + while (len--) + { + + if (p->in_dle) + { + p->in_dle = 0; + switch (*buf) + { + case DLE: + tty_bit_analyse (p, 0, *buf); + utf8_parse (c, *buf); + break; + case 0: + p->in_errmark = 1; + break; + default: + log_f (c->l, "%s:%d DLE parsing error: \\377 \\%03o", *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); + tty_bit_analyse (p, 1, *buf); + utf8_parse (c, SYM_CHAR_RESET); + } + else + { + tty_bit_analyse (p, 0, *buf); + utf8_parse (c, *buf); + } + buf++; + } +} -- cgit v1.2.3