aboutsummaryrefslogtreecommitdiffstats
path: root/src/tty.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tty.c')
-rw-r--r--src/tty.c107
1 files changed, 88 insertions, 19 deletions
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++;
+ }
+}