diff options
author | reinelt <> | 2004-01-22 07:57:45 +0000 |
---|---|---|
committer | reinelt <> | 2004-01-22 07:57:45 +0000 |
commit | ecaaaf0860a2df36c6d39ee4dd2b121e7e1a6c5a (patch) | |
tree | 13a5b0ebc7c53e2f7214969f601e62161020a899 | |
parent | 7c735f931f35ab3f94075cd57af42ad73eb5f72e (diff) | |
download | lcd4linux-ecaaaf0860a2df36c6d39ee4dd2b121e7e1a6c5a.tar.gz |
[lcd4linux @ 2004-01-22 07:57:45 by reinelt]
several bugs fixed where segfaulting on layout>display
Crystalfontz driver optimized, 632 display already works
-rw-r--r-- | cfg.c | 8 | ||||
-rw-r--r-- | drv_Crystalfontz.c | 19 | ||||
-rw-r--r-- | drv_HD44780.c | 13 | ||||
-rw-r--r-- | drv_MatrixOrbital.c | 13 | ||||
-rw-r--r-- | drv_generic_text.c | 89 | ||||
-rw-r--r-- | drv_generic_text.h | 8 | ||||
-rw-r--r-- | hash.c | 9 | ||||
-rw-r--r-- | lcd4linux.conf.sample | 32 | ||||
-rw-r--r-- | widget_text.c | 8 |
9 files changed, 141 insertions, 58 deletions
@@ -1,4 +1,4 @@ -/* $Id: cfg.c,v 1.29 2004/01/18 06:54:08 reinelt Exp $^ +/* $Id: cfg.c,v 1.30 2004/01/22 07:57:45 reinelt Exp $^ * * config file stuff * @@ -23,6 +23,10 @@ * * * $Log: cfg.c,v $ + * Revision 1.30 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.29 2004/01/18 06:54:08 reinelt * bug in expr.c fixed (thanks to Xavier) * some progress with /proc/stat parsing @@ -289,7 +293,7 @@ static int validchars (char *string) // first and following chars if ((*c>='A' && *c<='Z') || (*c>='a' && *c<='z') || (*c=='_')) continue; // only following chars - if ((c>string) && ((*c>='0' && *c<='9') || (*c=='.'))) continue; + if ((c>string) && ((*c>='0' && *c<='9') || (*c=='.') || (*c=='-'))) continue; return 0; } return 1; diff --git a/drv_Crystalfontz.c b/drv_Crystalfontz.c index 5c3bf1b..bff3ccd 100644 --- a/drv_Crystalfontz.c +++ b/drv_Crystalfontz.c @@ -1,4 +1,4 @@ -/* $Id: drv_Crystalfontz.c,v 1.1 2004/01/21 12:36:19 reinelt Exp $ +/* $Id: drv_Crystalfontz.c,v 1.2 2004/01/22 07:57:45 reinelt Exp $ * * new style driver for Crystalfontz display modules * @@ -23,6 +23,10 @@ * * * $Log: drv_Crystalfontz.c,v $ + * Revision 1.2 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.1 2004/01/21 12:36:19 reinelt * Crystalfontz NextGeneration driver added * @@ -107,7 +111,8 @@ static void drv_CF_define_char (int ascii, char *buffer) { char cmd[2]="\031n"; // set custom char bitmap - cmd[1]=(char)ascii; + // user-defineable chars start at 128, but are defined at 0 + cmd[1]=(char)(ascii-CHAR0); drv_generic_serial_write (cmd, 2); drv_generic_serial_write (buffer, 8); } @@ -234,9 +239,10 @@ int drv_CF_init (char *section) WIDGET_CLASS wc; int ret; - XRES=5; - YRES=8; - CHARS=8; + XRES=6; // pixel width of one char + YRES=8; // pixel height of one char + CHARS=8; // number of user-defineable chars + CHAR0=128; // ascii of first user-defineable chars // start display if ((ret=drv_CF_start (section))!=0) @@ -251,8 +257,7 @@ int drv_CF_init (char *section) return ret; // add fixed chars to the bar driver - drv_generic_text_bar_add_segment ( 0, 0,255, 32); // ASCII 32 = blank - drv_generic_text_bar_add_segment (255,255,255,255); // ASCII 255 = block + drv_generic_text_bar_add_segment (0, 0, 255, 32); // ASCII 32 = blank // register text widget wc=Widget_Text; diff --git a/drv_HD44780.c b/drv_HD44780.c index 8432057..3201a55 100644 --- a/drv_HD44780.c +++ b/drv_HD44780.c @@ -1,4 +1,4 @@ -/* $Id: drv_HD44780.c,v 1.2 2004/01/21 06:39:27 reinelt Exp $ +/* $Id: drv_HD44780.c,v 1.3 2004/01/22 07:57:45 reinelt Exp $ * * new style driver for HD44780-based displays * @@ -29,6 +29,10 @@ * * * $Log: drv_HD44780.c,v $ + * Revision 1.3 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.2 2004/01/21 06:39:27 reinelt * HD44780 missed the "clear display' sequence * asc255bug handling added @@ -434,9 +438,10 @@ int drv_HD_init (char *section) int asc255bug; int ret; - XRES=5; - YRES=8; - CHARS=8; + XRES=5; // pixel width of one char + YRES=8; // pixel height of one char + CHARS=8; // number of user-defineable chars + CHAR0=0; // ascii of first user-defineable chars // start display if ((ret=drv_HD_start (section))!=0) diff --git a/drv_MatrixOrbital.c b/drv_MatrixOrbital.c index 3a20bfb..d7adab1 100644 --- a/drv_MatrixOrbital.c +++ b/drv_MatrixOrbital.c @@ -1,4 +1,4 @@ -/* $Id: drv_MatrixOrbital.c,v 1.15 2004/01/21 12:36:19 reinelt Exp $ +/* $Id: drv_MatrixOrbital.c,v 1.16 2004/01/22 07:57:45 reinelt Exp $ * * new style driver for Matrix Orbital serial display modules * @@ -23,6 +23,10 @@ * * * $Log: drv_MatrixOrbital.c,v $ + * Revision 1.16 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.15 2004/01/21 12:36:19 reinelt * Crystalfontz NextGeneration driver added * @@ -448,9 +452,10 @@ int drv_MO_init (char *section) WIDGET_CLASS wc; int ret; - XRES=5; - YRES=8; - CHARS=8; + XRES=5; // pixel width of one char + YRES=8; // pixel height of one char + CHARS=8; // number of user-defineable chars + CHAR0=0; // ascii of first user-defineable chars // start display if ((ret=drv_MO_start (section))!=0) diff --git a/drv_generic_text.c b/drv_generic_text.c index 0ba2f10..87e22ae 100644 --- a/drv_generic_text.c +++ b/drv_generic_text.c @@ -1,4 +1,4 @@ -/* $Id: drv_generic_text.c,v 1.3 2004/01/20 14:25:12 reinelt Exp $ +/* $Id: drv_generic_text.c,v 1.4 2004/01/22 07:57:45 reinelt Exp $ * * generic driver helper for text-based displays * @@ -23,6 +23,10 @@ * * * $Log: drv_generic_text.c,v $ + * Revision 1.4 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.3 2004/01/20 14:25:12 reinelt * some reorganization * moved drv_generic to drv_generic_serial @@ -84,11 +88,11 @@ static char *Driver; int DROWS, DCOLS; // display size int LROWS, LCOLS; // layout size int XRES, YRES; // pixels of one char cell -int CHARS; // number of user-defineable characters +int CHARS, CHAR0; // number of user-defineable characters, ASCII of first char char *LayoutFB = NULL; char *DisplayFB = NULL; -static BAR *Bar = NULL; +static BAR *Bar = NULL; static int nSegment=0; static int fSegment=0; @@ -103,15 +107,17 @@ static SEGMENT Segment[128]; void drv_generic_text_resizeFB (int rows, int cols) { char *newFB; - int row, col; + BAR *newBar; + int i, row, col; - // Fixme: resize Bar FB too!!!! - - // Layout FB is large enough if (rows<=LROWS && cols<=LCOLS) return; + // get maximum values + if (rows<LROWS) rows=LROWS; + if (cols<LCOLS) cols=LCOLS; + // allocate new Layout FB newFB=malloc(cols*rows*sizeof(char)); memset (newFB, ' ', rows*cols*sizeof(char)); @@ -125,8 +131,32 @@ void drv_generic_text_resizeFB (int rows, int cols) } free (LayoutFB); } - LayoutFB = newFB; + + + // resize Bar buffer + if (Bar) { + + newBar=malloc (rows*cols*sizeof(BAR)); + + for (i=0; i<rows*cols; i++) { + newBar[i].val1 = -1; + newBar[i].val2 = -1; + newBar[i].dir = 0; + newBar[i].segment = -1; + } + + // transfer contents + for (row=0; row<LROWS; row++) { + for (col=0; col<LCOLS; col++) { + newBar[row*cols+col]=Bar[row*LCOLS+col]; + } + } + + free (Bar); + Bar=newBar; + } + LCOLS = cols; LROWS = rows; } @@ -148,7 +178,7 @@ int drv_generic_text_draw_text (WIDGET *W, int goto_len, end=col+len; // maybe grow layout framebuffer - drv_generic_text_resizeFB (row, col+len-1); + drv_generic_text_resizeFB (row+1, col+len); fb1 = LayoutFB + row*LCOLS; fb2 = DisplayFB + row*DCOLS; @@ -156,24 +186,26 @@ int drv_generic_text_draw_text (WIDGET *W, int goto_len, // transfer new text into layout buffer memcpy (fb1+col, txt, len); - for (; col<=end; col++) { - int pos1, pos2, equal; - if (fb1[col]==fb2[col]) continue; - drv_goto (row, col); - for (pos1=col, pos2=pos1, col++, equal=0; col<=end; col++) { - if (fb1[col]==fb2[col]) { - // If we find just one equal byte, we don't break, because this - // would require a goto, which takes several bytes, too. - if (++equal>goto_len) break; - } else { - pos2=col; - equal=0; + if (row<DROWS) { + for (; col<=end && col<DCOLS; col++) { + int pos1, pos2, equal; + if (fb1[col]==fb2[col]) continue; + drv_goto (row, col); + for (pos1=col, pos2=pos1, col++, equal=0; col<=end && col<DCOLS; col++) { + if (fb1[col]==fb2[col]) { + // If we find just one equal byte, we don't break, because this + // would require a goto, which takes several bytes, too. + if (++equal>goto_len) break; + } else { + pos2=col; + equal=0; + } } + memcpy (fb2+pos1, fb1+pos1, pos2-pos1+1); + drv_write (fb2+pos1, pos2-pos1+1); } - memcpy (fb2+pos1, fb1+pos1, pos2-pos1+1); - drv_write (fb2+pos1, pos2-pos1+1); } - + return 0; } @@ -202,7 +234,7 @@ static void drv_generic_text_bar_clear(void) static void drv_generic_text_bar_create_bar (int row, int col, DIRECTION dir, int len, int val1, int val2) { int rev=0; - + switch (dir) { case DIR_WEST: val1 = len-val1; @@ -441,7 +473,7 @@ static void drv_generic_text_bar_define_chars (void(*defchar)(int ascii, char *m } break; } - defchar(c, buffer); + defchar(CHAR0+c, buffer); } } @@ -464,9 +496,9 @@ int drv_generic_text_draw_bar (WIDGET *W, int goto_len, // maybe grow layout framebuffer // bars *always* grow heading North or East! if (dir & (DIR_EAST|DIR_WEST)) { - drv_generic_text_resizeFB (row, col+len-1); + drv_generic_text_resizeFB (row+1, col+len); } else { - drv_generic_text_resizeFB (row, col); + drv_generic_text_resizeFB (row+1, col+1); } res = dir & (DIR_EAST|DIR_WEST)?XRES:YRES; @@ -504,6 +536,7 @@ int drv_generic_text_draw_bar (WIDGET *W, int goto_len, if (s==-1) continue; c=Segment[s].ascii; if (c==-1) continue; + if (s>=fSegment) c+=CHAR0; // ascii offset for user-defineable chars if(c==LayoutFB[n]) continue; LayoutFB[n]=c; } diff --git a/drv_generic_text.h b/drv_generic_text.h index f742427..e1468f5 100644 --- a/drv_generic_text.h +++ b/drv_generic_text.h @@ -1,4 +1,4 @@ -/* $Id: drv_generic_text.h,v 1.1 2004/01/20 05:36:59 reinelt Exp $ +/* $Id: drv_generic_text.h,v 1.2 2004/01/22 07:57:45 reinelt Exp $ * * generic driver helper for text-based displays * @@ -23,6 +23,10 @@ * * * $Log: drv_generic_text.h,v $ + * Revision 1.2 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.1 2004/01/20 05:36:59 reinelt * moved text-display-specific stuff to drv_generic_text * moved all the bar stuff from drv_generic_bar to generic_text @@ -48,7 +52,7 @@ extern int DROWS, DCOLS; // display size extern int LROWS, LCOLS; // layout size extern int XRES, YRES; // pixels of one char cell -extern int CHARS; // number of user-defineable characters +extern int CHARS, CHAR0; // number of user-defineable characters, ASCII of first char extern char *LayoutFB; @@ -1,4 +1,4 @@ -/* $Id: hash.c,v 1.8 2004/01/21 14:29:03 reinelt Exp $ +/* $Id: hash.c,v 1.9 2004/01/22 07:57:45 reinelt Exp $ * * hashes (associative arrays) * @@ -23,6 +23,10 @@ * * * $Log: hash.c,v $ + * Revision 1.9 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.8 2004/01/21 14:29:03 reinelt * new helper 'hash_get_regex' which delivers the sum over regex matched items * new function 'disk()' which uses this regex matching @@ -299,7 +303,6 @@ double hash_get_regex (HASH *Hash, char *key, int delay) regex_t preg; int i, err; - debug ("Michi: regex=<%s>", key); err=regcomp(&preg, key, REG_ICASE|REG_NOSUB); if (err!=0) { char buffer[32]; @@ -312,9 +315,7 @@ double hash_get_regex (HASH *Hash, char *key, int delay) hash_lookup(Hash, "", 1); for (i=0;i<Hash->nItems; i++) { - debug ("Michi: Testing <%s>", Hash->Items[i].key); if (regexec(&preg, Hash->Items[i].key, 0, NULL, 0)==0) { - debug ("Michi: MATCHED <%s>", Hash->Items[i].key); sum+=hash_get_delta(Hash, Hash->Items[i].key, delay); } } diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index 5e08557..d228c3e 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -8,7 +8,14 @@ Display LK204 { } -Display myHD44780 { +Display CF632 { + Driver 'Crystalfontz' + Model '632' + Port '/dev/tts/0' + Speed 19200 +} + +Display HD44780-20x4 { Driver 'HD44780' Port '/dev/parports/0' # Port '0x378' @@ -27,8 +34,9 @@ Display myHD44780 { Widget OS { class 'Text' expression '*** '.uname('sysname').' '.uname('release').' ***' - width 20 - align 'C' + width 16 + align 'M' + speed 100 update tick } @@ -111,9 +119,23 @@ Layout Default { } } +Layout L16x2 { + Row1 { + Col1 'Busy' + Col11 'BusyBar' + } + Row2 { + Col1 'Load' + Col11 'LoadBar' + } +} + +#Display 'LK204' +#Display 'HD44780-20x4' +Display 'CF632' -Display 'myHD44780' -Layout 'Default' +#Layout 'Default' +Layout 'L16x2' Variables { tick 500 diff --git a/widget_text.c b/widget_text.c index aa30eec..f20105c 100644 --- a/widget_text.c +++ b/widget_text.c @@ -1,4 +1,4 @@ -/* $Id: widget_text.c,v 1.7 2004/01/20 04:51:39 reinelt Exp $ +/* $Id: widget_text.c,v 1.8 2004/01/22 07:57:45 reinelt Exp $ * * simple text widget handling * @@ -21,6 +21,10 @@ * * * $Log: widget_text.c,v $ + * Revision 1.8 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.7 2004/01/20 04:51:39 reinelt * moved generic stuff from drv_MatrixOrbital to drv_generic * implemented new-stylish bars which are nearly finished @@ -178,7 +182,7 @@ void widget_text_update (void *Self) int update; // evaluate prefix - if (T->prefix!=NULL && strlen(T->prefix)>0) { + if (T->prefix!=NULL && *(T->prefix)!='\0') { Eval(T->prefix, &result); preval=strdup(R2S(&result)); DelResult (&result); |