aboutsummaryrefslogtreecommitdiffstats
path: root/src/tty.c
diff options
context:
space:
mode:
authorjames <>2008-02-23 11:49:23 +0000
committerjames <>2008-02-23 11:49:23 +0000
commitfc338d9b30500f311d9555545477e4ba1775b403 (patch)
treea860ad9af01332c74527e49bac77662af3e99f3b /src/tty.c
parent029a61812e82b58803c618ed53df42180106412f (diff)
downloadsympathy-fc338d9b30500f311d9555545477e4ba1775b403.tar.gz
sympathy-fc338d9b30500f311d9555545477e4ba1775b403.tar.bz2
sympathy-fc338d9b30500f311d9555545477e4ba1775b403.zip
*** empty log message ***
Diffstat (limited to 'src/tty.c')
-rw-r--r--src/tty.c101
1 files changed, 93 insertions, 8 deletions
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++;
}