]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2005-05-06 06:37:34 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Fri, 6 May 2005 06:37:34 +0000 (06:37 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Fri, 6 May 2005 06:37:34 +0000 (06:37 +0000)
hollow bar patch from geronet

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@545 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

drv_generic_text.c
widget_bar.c
widget_bar.h

index b1f667525acd3e74ed271dde446357c2af445f7e..36309f46f83cfcc8fdac09bcf562494a291b67b2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_text.c,v 1.25 2005/02/24 07:06:48 reinelt Exp $
+/* $Id: drv_generic_text.c,v 1.26 2005/05/06 06:37:34 reinelt Exp $
  *
  * generic driver helper for text-based displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_text.c,v $
+ * Revision 1.26  2005/05/06 06:37:34  reinelt
+ * hollow bar patch from geronet
+ *
  * Revision 1.25  2005/02/24 07:06:48  reinelt
  * SimpleLCD driver added
  *
@@ -213,6 +216,7 @@ typedef struct {
   int val1;
   int val2;
   DIRECTION dir;
+  STYLE style;
   int segment;
   int invalid;
 } BAR;
@@ -221,6 +225,7 @@ typedef struct {
   int val1;
   int val2;
   DIRECTION dir;
+  STYLE style;
   int used;
   int ascii;
 } SEGMENT;
@@ -554,6 +559,7 @@ static void drv_generic_text_bar_clear(void)
     BarFB[i].val1    = -1;
     BarFB[i].val2    = -1;
     BarFB[i].dir     =  0;
+    BarFB[i].style = 0;
     BarFB[i].segment = -1;
     BarFB[i].invalid =  0;
   }
@@ -589,6 +595,10 @@ void drv_generic_text_bar_add_segment(const int val1, const int val2, const DIRE
   Segment[fSegment].val1  = val1;
   Segment[fSegment].val2  = val2;
   Segment[fSegment].dir   = dir;
+  if (val1 == 0 && val2 == 0)
+    Segment[fSegment].style = 0;
+  else
+    Segment[fSegment].style = 255;
   Segment[fSegment].used  = 0;
   Segment[fSegment].ascii = ascii;
   
@@ -597,20 +607,25 @@ void drv_generic_text_bar_add_segment(const int val1, const int val2, const DIRE
 }
 
 
-static void drv_generic_text_bar_create_bar (int row, int col, const DIRECTION dir, int len, int val1, int val2)
+static void drv_generic_text_bar_create_bar (int row, int col, const DIRECTION dir, STYLE style, int len, int val1, int val2)
 {
-  int rev = 0;
+  int rev = 0, max;
+  if (style)
+    BarFB[row * LCOLS + col].style = STYLE_FIRST;
 
   switch (dir) {
   case DIR_WEST:
-    val1 = len-val1;
-    val2 = len-val2;
+      max = len * XRES;
+      val1 = max - val1;
+      val2 = max - val2;
     rev  = 1;
     
   case DIR_EAST:
     while (len > 0 && col < LCOLS) {
       BarFB[row*LCOLS+col].dir = dir;
       BarFB[row*LCOLS+col].segment = -1;
+      if (style && BarFB[row * LCOLS + col].style == 0)
+               BarFB[row * LCOLS + col].style = STYLE_HOLLOW;
       if (val1 >= XRES) {
        BarFB[row*LCOLS+col].val1 = rev ? 0 : XRES;
        val1 -= XRES;
@@ -628,11 +643,14 @@ static void drv_generic_text_bar_create_bar (int row, int col, const DIRECTION d
       len--;
       col++;
     }
+    if (style)
+       BarFB[row * LCOLS + col - 1].style = STYLE_LAST;
     break;
     
   case DIR_SOUTH:
-    val1 = len-val1;
-    val2 = len-val2;
+    max = len * YRES;
+    val1 = max - val1;
+    val2 = max - val2;
     rev  = 1;
     
   case DIR_NORTH:
@@ -681,17 +699,44 @@ static void drv_generic_text_bar_create_segments (void)
     if (BarFB[n].dir == 0) continue;
     res = BarFB[n].dir & (DIR_EAST|DIR_WEST) ? XRES:YRES;
     for (i = 0; i < nSegment; i++) {
-      if (Segment[i].dir & BarFB[n].dir) {
-       l1 = Segment[i].val1; if (l1 > res) l1=res;
-       l2 = Segment[i].val2; if (l2 > res) l2=res;
-       if (l1 == BarFB[n].val1 && l2 == BarFB[n].val2) break;
-      }
-    }
+           l1 = Segment[i].val1;
+           if (l1 > res)
+               l1 = res;
+           l2 = Segment[i].val2;
+           if (l2 > res)
+               l2 = res;
+
+           /* same value */
+           if (l1 == BarFB[n].val1 && l2 == BarFB[n].val2) {
+               /* empty block, only style is interesting */
+               if (l1 == 0 && l2 == 0 && Segment[i].style == BarFB[n].style)
+                   break;
+               /* full block, style doesn't matter */
+               if (l1 == res && l2 == res)
+                   break;
+               /* half upper block */
+               if (l1 == res && l2 == 0 && Segment[i].style == BarFB[n].style)
+                   break;
+               /* half lower block */
+               if (l1 == 0 && l2 == res && Segment[i].style == BarFB[n].style)
+                   break;
+               /* same style, same direction */
+               if (Segment[i].style == BarFB[n].style && Segment[i].dir & BarFB[n].dir)
+                   break;
+               /* hollow style, val(1,2) == 1, like '[' */
+/*                        if (l1 == 1 && l2 == 1 && Segment[i].style == STYLE_FIRST && BarFB[n].style == STYLE_HOLLOW)
+                                             break;
+*//* hollow style, val(1,2) == 1, like ']' */
+/*                        if (l1 == 1 && l2 == 1 && Segment[i].style == STYLE_LAST && BarFB[n].style == STYLE_HOLLOW)
+                              break;
+*/ }
+       }
     if (i == nSegment) {
       nSegment++;
       Segment[i].val1  = BarFB[n].val1;
       Segment[i].val2  = BarFB[n].val2;
       Segment[i].dir   = BarFB[n].dir;
+      Segment[i].style = BarFB[n].style;
       Segment[i].used  =  0;
       Segment[i].ascii = -1;
     }
@@ -707,7 +752,8 @@ static int drv_generic_text_bar_segment_error (const int i, const int j)
   
   if (i == j) return 65535;
   if (!(Segment[i].dir & Segment[j].dir)) return 65535;
-  
+  if (Segment[i].style != Segment[j].style) return 65535;
+
   res = Segment[i].dir&(DIR_EAST|DIR_WEST) ? XRES:YRES;
   
   i1 = Segment[i].val1; if (i1 > res) i1 = res;
@@ -814,17 +860,29 @@ static void drv_generic_text_bar_define_chars(void)
     Segment[i].ascii = c;
     switch (Segment[i].dir) {
     case DIR_WEST:
-      for (j = 0; j < 4; j++) {
-       buffer[j  ] = (1<<Segment[i].val1)-1;
-       buffer[j+4] = (1<<Segment[i].val2)-1;
-      }
+           if (Segment[i].style) {
+               buffer[0] = 255;
+               buffer[7] = 255;
+               if (Segment[i].style & (STYLE_FIRST | STYLE_LAST))
+                   for (j = 1; j < 7; j++) {
+                       buffer[j] |= Segment[i].style & STYLE_FIRST ? 16 : 1;
+                   }
+           }
       break;
     case DIR_EAST:
-      for (j = 0; j < 4; j++) {
-       buffer[j  ] = 255<<(XRES-Segment[i].val1);
-       buffer[j+4] = 255<<(XRES-Segment[i].val2);
-      }
-      break;
+           for (j = 0; j < 4; j++) {
+               buffer[j] = 255 << (XRES - Segment[i].val1);
+               buffer[j + 4] = 255 << (XRES - Segment[i].val2);
+           }
+           if (Segment[i].style) {
+               buffer[0] = 255;
+               buffer[7] = 255;
+               if (Segment[i].style & (STYLE_FIRST | STYLE_LAST))
+                   for (j = 1; j < 7; j++) {
+                       buffer[j] |= Segment[i].style & STYLE_FIRST ? 16 : 1;
+                   }
+           }
+          break;
     case DIR_NORTH:
       for (j = 0; j < Segment[i].val1; j++) {
        buffer[7-j] = (1<<XRES)-1;
@@ -862,10 +920,12 @@ int drv_generic_text_bar_draw (WIDGET *W)
   int row, col, col0, len, res, max, val1, val2;
   int c, n, s;
   DIRECTION dir;
-  
+  STYLE style;
+
   row = W->row;
   col = W->col;
   dir = Bar->direction;
+  style = Bar->style;
   len = Bar->length;
 
   /* maybe grow layout framebuffer */
@@ -890,7 +950,7 @@ int drv_generic_text_bar_draw (WIDGET *W)
   if (Single_Segments) val2 = val1;
   
   /* create this bar */
-  drv_generic_text_bar_create_bar (row, col, dir, len, val1, val2);
+  drv_generic_text_bar_create_bar (row, col, dir, style, len, val1, val2);
 
   /* process all bars */
   drv_generic_text_bar_create_segments ();
@@ -949,5 +1009,3 @@ int drv_generic_text_bar_draw (WIDGET *W)
   return 0;
 
 }
-
-
index 6e0f54c749cd502f203801d3987ad7ec31cd191c..7cb8956ae5a75eb5a9e4d1e5f63fbc09d6ed5ce5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: widget_bar.c,v 1.14 2005/01/18 06:30:24 reinelt Exp $
+/* $Id: widget_bar.c,v 1.15 2005/05/06 06:37:34 reinelt Exp $
  *
  * bar widget handling
  *
@@ -21,6 +21,9 @@
  *
  *
  * $Log: widget_bar.c,v $
+ * Revision 1.15  2005/05/06 06:37:34  reinelt
+ * hollow bar patch from geronet
+ *
  * Revision 1.14  2005/01/18 06:30:24  reinelt
  * added (C) to all copyright statements
  *
@@ -235,6 +238,23 @@ int widget_bar_init (WIDGET *Self)
   }
   free (c);
   
+   /* style: none (default), hollow */
+   c = cfg_get (section, "style", "0");
+   switch (toupper (*c))
+   {
+    case 'H':
+      Bar->style = STYLE_HOLLOW;
+      if (!(Bar->direction & (DIR_EAST | DIR_WEST)))
+      {
+          error ("widget %s with style \"hollow\" not implemented", Self->name);
+          Bar->style = 0;
+      }
+      break;
+    default:
+      Bar->style = 0;
+   }
+   free (c);
+
   /* update interval (msec), default 1 sec */
   cfg_number (section, "update", 1000, 10, -1, &(Bar->update));
   
@@ -274,5 +294,3 @@ WIDGET_CLASS Widget_Bar = {
   draw:   NULL,
   quit:   widget_bar_quit,
 };
-
-
index 804738eb75e8657238aa0e8436935fb182c435f8..6cb31c6f7ca6c328346b568c843ad6ed6379fea8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: widget_bar.h,v 1.6 2005/01/18 06:30:24 reinelt Exp $
+/* $Id: widget_bar.h,v 1.7 2005/05/06 06:37:34 reinelt Exp $
  *
  * bar widget handling
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: widget_bar.h,v $
+ * Revision 1.7  2005/05/06 06:37:34  reinelt
+ * hollow bar patch from geronet
+ *
  * Revision 1.6  2005/01/18 06:30:24  reinelt
  * added (C) to all copyright statements
  *
@@ -56,6 +59,7 @@
 #define _WIDGET_BAR_H_
 
 typedef enum { DIR_EAST=1, DIR_WEST=2, DIR_NORTH=4, DIR_SOUTH=8 } DIRECTION;
+typedef enum { STYLE_HOLLOW = 1, STYLE_FIRST = 2, STYLE_LAST = 4 } STYLE;
 
 typedef struct WIDGET_BAR {
   char      *expression1;  /* expression that delivers the value */
@@ -67,6 +71,7 @@ typedef struct WIDGET_BAR {
   void      *tree_min;     /* pre-compiled expression that delivers the minimum value */
   void      *tree_max;     /* pre-compiled expression that delivers the maximum value */
   DIRECTION  direction;    /* bar direction */
+  STYLE style;         /* bar style (hollow) */
   int        length;       /* bar length */
   int        update;       /* update interval (msec) */
   double     val1;         /* bar value, 0.0 ... 1.0 */