aboutsummaryrefslogtreecommitdiffstats
path: root/src/tty.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tty.c')
-rw-r--r--src/tty.c101
1 files changed, 81 insertions, 20 deletions
diff --git a/src/tty.c b/src/tty.c
index 3b8f731..3171c6c 100644
--- a/src/tty.c
+++ b/src/tty.c
@@ -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);