chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / tty.c
index 3b8f731b61e079e9ff4fef09f29d582ced9768c7..df7c13fbe3b0ba7dfe2c5db03ca03100de6b1658 100644 (file)
--- a/src/tty.c
+++ b/src/tty.c
@@ -10,6 +10,24 @@ static char rcsid[] = "$Id$";
 
 /*
  * $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 ***
  *
@@ -258,6 +276,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)
 {
@@ -313,6 +343,23 @@ tty_hangup (TTY * t)
 
 }
 
+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
 typedef struct
@@ -348,10 +395,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 +418,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 +442,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 +464,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 (c->t)
+    i = tty_get_baud (c->t);
+  else
+    i = -1;
 
-  if (!i)
+  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 +537,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 +551,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);
 
+          log_f (c->l, "<tty reports error: \\377 \\000 \\%03o>",
+                 __FILE__, __LINE__, *buf);
 
-          tty_bit_analyse (p, 1, *buf);
+          tty_bit_analyse (c, 1, *buf);
 
-          analyse (c);
+          tty_analyse (c);
 
           utf8_parse (c, *buf);
 
@@ -478,9 +571,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);