chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / tty.c
index 1ac8c87467fc03e3b1c78f361f48413d6397a361..3b8f731b61e079e9ff4fef09f29d582ced9768c7 100644 (file)
--- 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++;
     }