/*
* $Log$
+ * Revision 1.19 2008/02/28 16:57:52 james
+ * *** empty log message ***
+ *
+ * Revision 1.18 2008/02/28 16:37:16 james
+ * *** empty log message ***
+ *
+ * Revision 1.17 2008/02/28 15:37:06 james
+ * *** empty log message ***
+ *
+ * Revision 1.16 2008/02/28 12:12:25 james
+ * *** empty log message ***
+ *
+ * Revision 1.15 2008/02/28 00:10:44 james
+ * *** empty log message ***
+ *
+ * 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 ***
+ *
+ * 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 ***
*
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;
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;
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)
{
t->hanging_up = 1;
gettimeofday (&t->hangup_clock, NULL);
+
+}
+
+void tty_length(TTY *t,int l)
+{
+t->displayed_length=l;
+}
+
+void
+tty_winch (TTY * t, CRT_Pos size)
+{
+ struct winsize sz = { 0 };
+
+ sz.ws_col = size.x;
+ sz.ws_row = size.y;
+
+ ioctl (t->wfd, TIOCSWINSZ, &sz);
+}
+
+
+
#if 0
- fprintf (stderr, "-DTR\n");
+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)
+
+static void
+tty_bit_analyse (Context * c, int err, int ch)
+{
+ 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)
+ {
+ p->biterrs++;
+ gettimeofday (&p->lasterr, NULL);
+ }
+
+ if (p->biterrs)
+ {
+ 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]);
+ }
+
}
+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;
+}
-#if 0
-int
-tty_post_select (Context * c, fd_set * rfds, fd_set * wfds)
+void
+tty_analyse (Context * c)
{
+ TTY_Parser *p = c->tp;
+ struct timeval now, dif;
+ int i, j, max;
- if (FD_ISSET (c->t->rfd, rfds))
+ if (!p->biterrs)
{
- if (vt102_dispatch (&c))
- return -1;
+ p->guessed_baud = 0;
+ return;
}
- return 0;
+
+ gettimeofday (&now, NULL);
+
+ timersub (&now, &p->lasterr, &dif);
+
+ if (dif.tv_sec > 10)
+ {
+ tty_parse_reset (c);
+ return;
+ }
+
+
+ max = -1;
+ j = 0;
+ for (i = 0; i < TTY_BITFREQ_LEN; ++i)
+ {
+ if (p->bitfreq[i] > max)
+ {
+ max = p->bitfreq[i];
+ j = 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;
+
+ }
+
+ 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);
+ }
+
}
-#endif
+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;
+
+ p = c->tp;
+
+ while (len--)
+ {
+
+ if (p->in_dle)
+ {
+ p->in_dle = 0;
+ switch (*buf)
+ {
+ case DLE:
+ tty_bit_analyse (c, 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", __FILE__,
+ __LINE__, *buf);
+ }
+ }
+ else if (p->in_errmark)
+ {
+ p->in_errmark = 0;
+
+ log_f (c->l, "<tty reports error: \\377 \\000 \\%03o>",
+ __FILE__, __LINE__, *buf);
+
+ tty_bit_analyse (c, 1, *buf);
+
+ tty_analyse (c);
+
+ utf8_parse (c, *buf);
+
+ utf8_parse (c, SYM_CHAR_RESET);
+
+ }
+ else if (*buf == DLE)
+ {
+ p->in_dle = 1;
+
+ }
+ else
+ {
+ tty_bit_analyse (c, 0, *buf);
+
+ tty_analyse (c);
+
+ utf8_parse (c, *buf);
+
+ }
+ buf++;
+ }
+}