diff options
author | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2004-11-28 15:50:24 +0000 |
---|---|---|
committer | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2004-11-28 15:50:24 +0000 |
commit | b1946ed6796f73cbcff9f131337f2fc0f41205a5 (patch) | |
tree | f6ef63bb4cef935ac61b802535c1a858d5c6f44b | |
parent | 32a05394fc247a61c8927d66a8aea714bbdf1e42 (diff) | |
download | lcd4linux-b1946ed6796f73cbcff9f131337f2fc0f41205a5.tar.gz |
[lcd4linux @ 2004-11-28 15:50:24 by reinelt]
Cwlinux fixes (invalidation of user-defined chars)
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@495 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
-rw-r--r-- | drv_Cwlinux.c | 54 | ||||
-rw-r--r-- | drv_generic_text.c | 402 | ||||
-rw-r--r-- | drv_generic_text.h | 8 | ||||
-rw-r--r-- | lcd4linux.conf.sample | 8 | ||||
-rw-r--r-- | widget_icon.c | 10 |
5 files changed, 265 insertions, 217 deletions
diff --git a/drv_Cwlinux.c b/drv_Cwlinux.c index ccfd667..c533b3f 100644 --- a/drv_Cwlinux.c +++ b/drv_Cwlinux.c @@ -1,4 +1,4 @@ -/* $Id: drv_Cwlinux.c,v 1.19 2004/06/26 12:04:59 reinelt Exp $ +/* $Id: drv_Cwlinux.c,v 1.20 2004/11/28 15:50:24 reinelt Exp $ * * new style driver for Cwlinux display modules * @@ -23,6 +23,9 @@ * * * $Log: drv_Cwlinux.c,v $ + * Revision 1.20 2004/11/28 15:50:24 reinelt + * Cwlinux fixes (invalidation of user-defined chars) + * * Revision 1.19 2004/06/26 12:04:59 reinelt * * uh-oh... the last CVS log message messed up things a lot... @@ -160,6 +163,7 @@ typedef struct { int protocol; } MODEL; + /* Fixme: number of gpo's should be verified */ static MODEL Models[] = { @@ -173,15 +177,21 @@ static MODEL Models[] = { /*** hardware dependant functions ***/ /****************************************/ +static void drv_CW_send (const char *string, const int len) +{ + drv_generic_serial_write (string, len); + usleep (20); +} + + static void drv_CW_write (const int row, const int col, const char *data, const int len) { char cmd[6]="\376Gxy\375"; cmd[2]=(char)col; cmd[3]=(char)row; - drv_generic_serial_write (cmd, 5); - - drv_generic_serial_write (data, len); + drv_CW_send (cmd, 5); + drv_CW_send (data, len); } @@ -195,8 +205,7 @@ static void drv_CW1602_defchar (const int ascii, const unsigned char *buffer) for (i=0; i<8; i++) { cmd[3+i] = buffer[i] & 0x1f; } - drv_generic_serial_write(cmd,12); - usleep(20); /* delay for cw1602 to settle the character defined! */ + drv_CW_send(cmd,12); } @@ -218,22 +227,20 @@ static void drv_CW12232_defchar (const int ascii, const unsigned char *buffer) } } } - drv_generic_serial_write (cmd, 10); + drv_CW_send (cmd, 10); } static void drv_CW_clear (void) { -#if 0 - drv_generic_serial_write("\376X\375",3); /* Clear Display */ +#if 1 + drv_CW_send("\376X\375",3); /* Clear Display */ + usleep(500000); #else /* for some mysterious reason, we have to sleep after */ /* the command _and_ after the CMD_END... */ - usleep(20); - drv_generic_serial_write("\376X",2); /* Clear Display */ - usleep(20); - drv_generic_serial_write("\375",1); /* Command End */ - usleep(20); + drv_CW_send("\376X",2); /* Clear Display */ + drv_CW_send("\375",1); /* Command End */ #endif } @@ -253,16 +260,16 @@ static int drv_CW_brightness (int brightness) switch (Brightness) { case 0: /* backlight off */ - drv_generic_serial_write ("\376F\375", 3); + drv_CW_send ("\376F\375", 3); break; case 8: /* backlight on */ - drv_generic_serial_write ("\376B\375", 3); + drv_CW_send ("\376B\375", 3); break; default: /* backlight level */ cmd[2] = (char)Brightness; - drv_generic_serial_write (cmd, 4); + drv_CW_send (cmd, 4); break; } @@ -318,10 +325,10 @@ static int drv_CW_start (const char *section) drv_CW_clear(); - drv_generic_serial_write ("\376D\375", 3); /* auto line wrap off */ - drv_generic_serial_write ("\376R\375", 3); /* auto scroll off */ - drv_generic_serial_write ("\376K\375", 3); /* underline cursor off */ - drv_generic_serial_write ("\376B\375", 3); /* backlight on */ + drv_CW_send ("\376D\375", 3); /* auto line wrap off */ + drv_CW_send ("\376R\375", 3); /* auto scroll off */ + drv_CW_send ("\376K\375", 3); /* underline cursor off */ + drv_CW_send ("\376B\375", 3); /* backlight on */ /* set brightness */ if (cfg_number(section, "Brightness", 0, 0, 8, &i) > 0) { @@ -394,7 +401,8 @@ int drv_CW_init (const char *section, const int quiet) YRES = 8; /* pixel height of one char */ CHARS = 16; /* number of user-defineable characters */ CHAR0 = 1; /* ASCII of first user-defineable char */ - GOTO_COST = 3; /* number of bytes a goto command requires */ + GOTO_COST = 3; /* number of bytes a goto command requires */ + INVALIDATE = 1; /* re-defined chars must be re-sent to the display */ /* start display */ if ((ret=drv_CW_start (section))!=0) @@ -464,7 +472,7 @@ int drv_CW_quit (const int quiet) { info("%s: shutting down.", Name); drv_generic_text_quit(); - /* clear *both* displays */ + /* clear display */ drv_CW_clear(); /* say goodbye... */ diff --git a/drv_generic_text.c b/drv_generic_text.c index 336c782..db1e03e 100644 --- a/drv_generic_text.c +++ b/drv_generic_text.c @@ -1,4 +1,4 @@ -/* $Id: drv_generic_text.c,v 1.21 2004/06/26 12:04:59 reinelt Exp $ +/* $Id: drv_generic_text.c,v 1.22 2004/11/28 15:50:24 reinelt Exp $ * * generic driver helper for text-based displays * @@ -23,6 +23,9 @@ * * * $Log: drv_generic_text.c,v $ + * Revision 1.22 2004/11/28 15:50:24 reinelt + * Cwlinux fixes (invalidation of user-defined chars) + * * Revision 1.21 2004/06/26 12:04:59 reinelt * * uh-oh... the last CVS log message messed up things a lot... @@ -125,9 +128,10 @@ * extern int DROWS, DCOLS; display size * extern int LROWS, LCOLS; layout size * extern int XRES, YRES; pixel width/height of one char - * extern int GOTO_COST; number of bytes a goto command requires * extern int CHARS, CHAR0; number of user-defineable characters, ASCII of first char * extern int ICONS; number of user-defineable characters reserved for icons + * extern int GOTO_COST; number of bytes a goto command requires + * extern int INVALIDATE; re-send a modified userdefined char? * * * these functions must be implemented by the real driver: @@ -200,6 +204,7 @@ typedef struct { int val2; DIRECTION dir; int segment; + int invalid; } BAR; typedef struct { @@ -214,12 +219,18 @@ static char *Section=NULL; static char *Driver=NULL; -int DROWS, DCOLS; /* display size */ -int LROWS, LCOLS; /* layout size */ -int XRES, YRES; /* pixels of one char cell */ -int GOTO_COST; /* number of bytes a goto command requires */ -int CHARS, CHAR0; /* number of user-defineable characters, ASCII of first char */ -int ICONS; /* number of user-defineable characters reserved for icons */ +int DROWS = 20; /* display size: rows */ +int DCOLS = 4; /* display size: columns */ +int LROWS = 20; /* layout size: rows */ +int LCOLS = 4; /* layout size: columns */ +int XRES = 6; /* pixels of one char cell */ +int YRES = 8; /* pixels of one char cell */ +int CHARS = 0; /* number of user-defineable characters */ +int CHAR0 = 0; /* ASCII of first user-defineable char */ +int ICONS = 0; /* number of user-defineable characters reserved for icons */ + +int GOTO_COST = 0; /* number of bytes a goto command requires */ +int INVALIDATE = 0; /* re-send a modified userdefined char? */ static char *LayoutFB = NULL; @@ -245,22 +256,22 @@ static void drv_generic_text_resizeFB (int rows, int cols) int i, row, col; /* Layout FB is large enough */ - if (rows<=LROWS && cols<=LCOLS) + if (rows <= LROWS && cols <= LCOLS) return; /* get maximum values */ - if (rows<LROWS) rows=LROWS; - if (cols<LCOLS) cols=LCOLS; + 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)); + newFB = malloc(cols * rows * sizeof(char)); + memset (newFB, ' ', rows * cols * sizeof(char)); /* transfer contents */ - if (LayoutFB!=NULL) { - for (row=0; row<LROWS; row++) { - for (col=0; col<LCOLS; col++) { - newFB[row*cols+col]=LayoutFB[row*LCOLS+col]; + if (LayoutFB != NULL) { + for (row = 0; row < LROWS; row++) { + for (col = 0; col < LCOLS; col++) { + newFB[row * cols + col] = LayoutFB[row * LCOLS + col]; } } free (LayoutFB); @@ -271,28 +282,29 @@ static void drv_generic_text_resizeFB (int rows, int cols) /* resize Bar buffer */ if (BarFB) { - newBar=malloc (rows*cols*sizeof(BAR)); + newBar = malloc (rows * cols * sizeof(BAR)); - for (i=0; i<rows*cols; i++) { + for (i = 0; i < rows * cols; i++) { newBar[i].val1 = -1; newBar[i].val2 = -1; newBar[i].dir = 0; newBar[i].segment = -1; + newBar[i].invalid = 0; } /* transfer contents */ - for (row=0; row<LROWS; row++) { - for (col=0; col<LCOLS; col++) { - newBar[row*cols+col]=BarFB[row*LCOLS+col]; + for (row = 0; row < LROWS; row++) { + for (col = 0; col < LCOLS; col++) { + newBar[row * cols + col] = BarFB[row * LCOLS + col]; } } free (BarFB); - BarFB=newBar; + BarFB = newBar; } - LCOLS = cols; - LROWS = rows; + LCOLS = cols; + LROWS = rows; } @@ -307,17 +319,17 @@ int drv_generic_text_init (const char *section, const char *driver) Driver = (char*)driver; /* init display framebuffer */ - DisplayFB = (char*)malloc(DCOLS*DROWS*sizeof(char)); - memset (DisplayFB, ' ', DROWS*DCOLS*sizeof(char)); + DisplayFB = (char*)malloc(DCOLS * DROWS * sizeof(char)); + memset (DisplayFB, ' ', DROWS * DCOLS * sizeof(char)); /* init layout framebuffer */ LROWS = 0; LCOLS = 0; - LayoutFB=NULL; + LayoutFB = NULL; drv_generic_text_resizeFB (DROWS, DCOLS); /* sanity check */ - if (LayoutFB==NULL || DisplayFB==NULL) { + if (LayoutFB == NULL || DisplayFB == NULL) { error ("%s: framebuffer could not be allocated: malloc() failed", Driver); return -1; } @@ -348,7 +360,7 @@ int drv_generic_text_greet (const char *msg1, const char *msg2) for (i = 0; line1[i]; i++) { if (strlen(line1[i]) <= (unsigned)DCOLS) { - drv_generic_text_real_write (0, (DCOLS-strlen(line1[i]))/2, line1[i], strlen(line1[i])); + drv_generic_text_real_write (0, (DCOLS - strlen(line1[i])) / 2, line1[i], strlen(line1[i])); flag = 1; break; } @@ -357,7 +369,7 @@ int drv_generic_text_greet (const char *msg1, const char *msg2) if (DROWS >= 2) { for (i = 0; line2[i]; i++) { if (strlen(line2[i]) <= (unsigned)DCOLS) { - drv_generic_text_real_write (1, (DCOLS-strlen(line2[i]))/2, line2[i], strlen(line2[i])); + drv_generic_text_real_write (1, (DCOLS - strlen(line2[i])) / 2, line2[i], strlen(line2[i])); flag = 1; break; } @@ -367,7 +379,7 @@ int drv_generic_text_greet (const char *msg1, const char *msg2) if (msg1 && DROWS >= 3) { int len = strlen(msg1); if ( len <= DCOLS) { - drv_generic_text_real_write (2, (DCOLS-len)/2, msg1, len); + drv_generic_text_real_write (2, (DCOLS-len) / 2, msg1, len); flag = 1; } } @@ -375,7 +387,7 @@ int drv_generic_text_greet (const char *msg1, const char *msg2) if (msg2 && DROWS >= 4) { int len = strlen(msg2); if ( len <= DCOLS) { - drv_generic_text_real_write (3, (DCOLS-len)/2, msg2, len); + drv_generic_text_real_write (3, (DCOLS-len) / 2, msg2, len); flag = 1; } } @@ -386,15 +398,15 @@ int drv_generic_text_greet (const char *msg1, const char *msg2) int drv_generic_text_draw (WIDGET *W) { - WIDGET_TEXT *Text=W->data; + WIDGET_TEXT *Text = W->data; char *txt, *fb1, *fb2; int row, col, col0, len, end; - row=W->row; - col=W->col; - txt=Text->buffer; - len=strlen(txt); - end=col+len; + row = W->row; + col = W->col; + txt = Text->buffer; + len = strlen(txt); + end = col + len; /* maybe grow layout framebuffer */ drv_generic_text_resizeFB (row+1, col+len); @@ -403,21 +415,21 @@ int drv_generic_text_draw (WIDGET *W) fb2 = DisplayFB + row*DCOLS; /* transfer new text into layout buffer */ - memcpy (fb1+col, txt, len); + memcpy (fb1 + col, txt, len); if (row<DROWS) { - for (; col<=end && col<DCOLS; col++) { + for (; col <= end && col < DCOLS; col++) { int pos1, pos2, equal; - if (fb1[col]==fb2[col]) continue; + if (fb1[col] == fb2[col]) continue; col0 = col; - for (pos1=col, pos2=pos1, col++, equal=0; col<=end && col<DCOLS; col++) { - if (fb1[col]==fb2[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_COST) break; + if (++equal > GOTO_COST) break; } else { - pos2=col; - equal=0; + pos2 = col; + equal = 0; } } memcpy ( fb2+pos1, fb1+pos1, pos2-pos1+1); @@ -433,17 +445,17 @@ int drv_generic_text_quit (void) { if (LayoutFB) { free(LayoutFB); - LayoutFB=NULL; + LayoutFB = NULL; } if (DisplayFB) { free(DisplayFB); - DisplayFB=NULL; + DisplayFB = NULL; } if (BarFB) { free (BarFB); - BarFB=NULL; + BarFB = NULL; } widget_unregister(); @@ -457,7 +469,7 @@ int drv_generic_text_quit (void) { int drv_generic_text_icon_init (void) { - if (cfg_number(Section, "Icons", 0, 0, CHARS, &ICONS)<0) return -1; + if (cfg_number(Section, "Icons", 0, 0, CHARS, &ICONS) < 0) return -1; if (ICONS>0) { info ("%s: reserving %d of %d user-defined characters for icons", Driver, ICONS, CHARS); } @@ -467,9 +479,11 @@ int drv_generic_text_icon_init (void) int drv_generic_text_icon_draw (WIDGET *W) { - static int icon_counter=0; + static int icon_counter = 0; WIDGET_ICON *Icon = W->data; int row, col; + int l_idx, d_idx; + int invalidate = 0; unsigned char ascii; row = W->row; @@ -479,34 +493,40 @@ int drv_generic_text_icon_draw (WIDGET *W) drv_generic_text_resizeFB (row+1, col+1); /* icon deactivated? */ - if (Icon->ascii==-2) return 0; + if (Icon->ascii == -2) return 0; /* ASCII already assigned? */ - if (Icon->ascii==-1) { - if (icon_counter>=ICONS) { + if (Icon->ascii == -1) { + if (icon_counter >= ICONS) { error ("cannot process icon '%s': out of icons", W->name); - Icon->ascii=-2; + Icon->ascii = -2; return -1; } icon_counter++; - Icon->ascii=CHAR0+CHARS-icon_counter; + Icon->ascii = CHAR0 + CHARS - icon_counter; } /* maybe redefine icon */ - if (Icon->curmap!=Icon->prvmap) { - drv_generic_text_real_defchar(Icon->ascii, Icon->bitmap+YRES*Icon->curmap); + if (Icon->curmap != Icon->prvmap && Icon->visible) { + Icon->prvmap = Icon->curmap; + drv_generic_text_real_defchar(Icon->ascii, Icon->bitmap + YRES * Icon->curmap); + invalidate = INVALIDATE; } /* use blank if invisible */ - ascii=Icon->visible?Icon->ascii:' '; + ascii = Icon->visible ? Icon->ascii : ' '; + /* index into the two framebuffers */ + l_idx = row * LCOLS + col; + d_idx = row * DCOLS + col; + /* transfer icon into layout buffer */ - LayoutFB[row*LCOLS+col]=ascii; + LayoutFB[l_idx] = ascii; /* maybe send icon to the display */ - if (row < DROWS && col < DCOLS && DisplayFB[row*DCOLS+col] != ascii) { - DisplayFB[row*DCOLS+col]=ascii; - drv_generic_text_real_write (row, col, DisplayFB+row*DCOLS+col, 1); + if (row < DROWS && col < DCOLS && (DisplayFB[d_idx] != ascii || invalidate)) { + DisplayFB[d_idx] = ascii; + drv_generic_text_real_write (row, col, DisplayFB + d_idx, 1); } return 0; @@ -522,14 +542,15 @@ static void drv_generic_text_bar_clear(void) { int i; - for (i=0; i<LROWS*LCOLS; i++) { + for (i = 0; i < LROWS*LCOLS; i++) { BarFB[i].val1 = -1; BarFB[i].val2 = -1; BarFB[i].dir = 0; BarFB[i].segment = -1; + BarFB[i].invalid = 0; } - for (i=0; i<nSegment;i++) { + for (i = 0; i < nSegment; i++) { Segment[i].used = 0; } } @@ -539,15 +560,15 @@ int drv_generic_text_bar_init (const int single_segments) { if (BarFB) free (BarFB); - if ((BarFB=malloc (LROWS*LCOLS*sizeof(BAR)))==NULL) { + if ((BarFB = malloc (LROWS * LCOLS * sizeof(BAR))) == NULL) { error ("bar buffer allocation failed: out of memory"); return -1; } Single_Segments = single_segments; - nSegment=0; - fSegment=0; + nSegment = 0; + fSegment = 0; drv_generic_text_bar_clear(); @@ -557,20 +578,20 @@ int drv_generic_text_bar_init (const int single_segments) void drv_generic_text_bar_add_segment(const int val1, const int val2, const DIRECTION dir, const int ascii) { - Segment[fSegment].val1=val1; - Segment[fSegment].val2=val2; - Segment[fSegment].dir=dir; - Segment[fSegment].used=0; - Segment[fSegment].ascii=ascii; + Segment[fSegment].val1 = val1; + Segment[fSegment].val2 = val2; + Segment[fSegment].dir = dir; + Segment[fSegment].used = 0; + Segment[fSegment].ascii = ascii; fSegment++; - nSegment=fSegment; + nSegment = fSegment; } static void drv_generic_text_bar_create_bar (int row, int col, const DIRECTION dir, int len, int val1, int val2) { - int rev=0; + int rev = 0; switch (dir) { case DIR_WEST: @@ -580,20 +601,20 @@ static void drv_generic_text_bar_create_bar (int row, int col, const DIRECTION d case DIR_EAST: while (len > 0 && col < LCOLS) { - BarFB[row*LCOLS+col].dir=dir; - BarFB[row*LCOLS+col].segment=-1; + BarFB[row*LCOLS+col].dir = dir; + BarFB[row*LCOLS+col].segment = -1; if (val1 >= XRES) { - BarFB[row*LCOLS+col].val1 = rev?0:XRES; + BarFB[row*LCOLS+col].val1 = rev ? 0 : XRES; val1 -= XRES; } else { - BarFB[row*LCOLS+col].val1 = rev?XRES-val1:val1; + BarFB[row*LCOLS+col].val1 = rev ? XRES-val1 : val1; val1 = 0; } if (val2 >= XRES) { - BarFB[row*LCOLS+col].val2 = rev?0:XRES; + BarFB[row*LCOLS+col].val2 = rev ? 0 : XRES; val2 -= XRES; } else { - BarFB[row*LCOLS+col].val2 = rev?XRES-val2:val2; + BarFB[row*LCOLS+col].val2 = rev ? XRES-val2 : val2; val2 = 0; } len--; @@ -608,27 +629,26 @@ static void drv_generic_text_bar_create_bar (int row, int col, const DIRECTION d case DIR_NORTH: while (len > 0 && row < LROWS) { - BarFB[row*LCOLS+col].dir=dir; - BarFB[row*LCOLS+col].segment=-1; + BarFB[row*LCOLS+col].dir = dir; + BarFB[row*LCOLS+col].segment = -1; if (val1 >= YRES) { - BarFB[row*LCOLS+col].val1 = rev?0:YRES; + BarFB[row*LCOLS+col].val1 = rev ? 0 : YRES; val1 -= YRES; } else { - BarFB[row*LCOLS+col].val1 = rev?YRES-val1:val1; + BarFB[row*LCOLS+col].val1 = rev ? YRES-val1 : val1; val1 = 0; } if (val2 >= YRES) { - BarFB[row*LCOLS+col].val2 = rev?0:YRES; + BarFB[row*LCOLS+col].val2 = rev ? 0 : YRES; val2 -= YRES; } else { - BarFB[row*LCOLS+col].val2 = rev?YRES-val2:val2; + BarFB[row*LCOLS+col].val2 = rev ? YRES - val2 : val2; val2 = 0; } len--; row++; } break; - } } @@ -639,35 +659,35 @@ static void drv_generic_text_bar_create_segments (void) int res, l1, l2; /* find first unused segment */ - for (i=fSegment; i<nSegment && Segment[i].used; i++); + for (i = fSegment; i < nSegment && Segment[i].used; i++); /* pack unused segments */ - for (j=i+1; j<nSegment; j++) { + for (j = i+1; j < nSegment; j++) { if (Segment[j].used) - Segment[i++]=Segment[j]; + Segment[i++] = Segment[j]; } - nSegment=i; + nSegment = i; /* create needed segments */ - for (n=0; n<LROWS*LCOLS; n++) { - if (BarFB[n].dir==0) continue; - res=BarFB[n].dir & (DIR_EAST|DIR_WEST) ? XRES:YRES; - for (i=0; i<nSegment; i++) { + for (n = 0; n < LROWS*LCOLS; n++) { + 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; + 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; } } - if (i==nSegment) { + if (i == nSegment) { nSegment++; - Segment[i].val1=BarFB[n].val1; - Segment[i].val2=BarFB[n].val2; - Segment[i].dir=BarFB[n].dir; - Segment[i].used=0; - Segment[i].ascii=-1; + Segment[i].val1 = BarFB[n].val1; + Segment[i].val2 = BarFB[n].val2; + Segment[i].dir = BarFB[n].dir; + Segment[i].used = 0; + Segment[i].ascii = -1; } - BarFB[n].segment=i; + BarFB[n].segment = i; } } @@ -677,25 +697,25 @@ static int drv_generic_text_bar_segment_error (const int i, const int j) int res; int i1, i2, j1, j2; - if (i==j) return 65535; + if (i == j) return 65535; if (!(Segment[i].dir & Segment[j].dir)) return 65535; res = Segment[i].dir&(DIR_EAST|DIR_WEST) ? XRES:YRES; - i1=Segment[i].val1; if (i1>res) i1=res; - i2=Segment[i].val2; if (i2>res) i2=res; - j1=Segment[j].val1; if (j1>res) j1=res; - j2=Segment[j].val2; if (j2>res) j2=res; + i1 = Segment[i].val1; if (i1 > res) i1 = res; + i2 = Segment[i].val2; if (i2 > res) i2 = res; + j1 = Segment[j].val1; if (j1 > res) j1 = res; + j2 = Segment[j].val2; if (j2 > res) j2 = res; - if (i1==0 && j1!=0) return 65535; - if (i2==0 && j2!=0) return 65535; - if (i1==res && j1<res) return 65535; - if (i2==res && j2<res) return 65535; - if (i1==1 && j1!=1 && i2 > 0) return 65535; - if (i2==1 && j2!=1 && j1 > 0) return 65535; - if (i1==i2 && j1!=j2) return 65535; + if (i1 == 0 && j1 != 0) return 65535; + if (i2 == 0 && j2 != 0) return 65535; + if (i1 == res && j1 < res) return 65535; + if (i2 == res && j2 < res) return 65535; + if (i1 == 1 && j1 != 1 && i2 > 0) return 65535; + if (i2 == 1 && j2 != 1 && j1 > 0) return 65535; + if (i1 == i2 && j1 != j2) return 65535; - return (i1-j1)*(i1-j1)+(i2-j2)*(i2-j2); + return (i1-j1)*(i1-j1) + (i2-j2)*(i2-j2); } @@ -710,30 +730,30 @@ static void drv_generic_text_bar_pack_segments (void) return; } - for (i=0; i<nSegment; i++) { - for (j=0; j<nSegment; j++) { - error[i][j]=drv_generic_text_bar_segment_error(i,j); + for (i = 0; i < nSegment; i++) { + for (j = 0; j < nSegment; j++) { + error[i][j] = drv_generic_text_bar_segment_error(i, j); } } - while (nSegment>fSegment+CHARS-ICONS) { + while (nSegment > fSegment + CHARS - ICONS) { - min=65535; - pack_i=-1; - pack_j=-1; - for (i=fSegment; i<nSegment; i++) { + min = 65535; + pack_i = -1; + pack_j = -1; + for (i = fSegment; i < nSegment; i++) { if (pass1 && Segment[i].used) continue; - for (j=0; j<nSegment; j++) { - if (error[i][j]<min) { - min=error[i][j]; - pack_i=i; - pack_j=j; + for (j = 0; j < nSegment; j++) { + if (error[i][j] < min) { + min = error[i][j]; + pack_i = i; + pack_j = j; } } } - if (pack_i==-1) { + if (pack_i == -1) { if (pass1) { - pass1=0; + pass1 = 0; continue; } else { error ("unable to compact bar characters"); @@ -741,7 +761,7 @@ static void drv_generic_text_bar_pack_segments (void) error ("Segment[0].val1=%d val2=%d", Segment[0].val1, Segment[0].val2); error ("Segment[1].val1=%d val2=%d", Segment[1].val1, Segment[1].val2); error ("Segment[2].val1=%d val2=%d", Segment[2].val1, Segment[2].val2); - nSegment=CHARS-ICONS; + nSegment = CHARS - ICONS; break; } } @@ -754,16 +774,16 @@ static void drv_generic_text_bar_pack_segments (void) #endif nSegment--; - Segment[pack_i]=Segment[nSegment]; + Segment[pack_i] = Segment[nSegment]; - for (i=0; i<nSegment; i++) { - error[pack_i][i]=error[nSegment][i]; - error[i][pack_i]=error[i][nSegment]; + for (i = 0; i < nSegment; i++) { + error[pack_i][i] = error[nSegment][i]; + error[i][pack_i] = error[i][nSegment]; } - for (n=0; n<LROWS*LCOLS; n++) { - if (BarFB[n].segment==pack_i) BarFB[n].segment=pack_j; - if (BarFB[n].segment==nSegment) BarFB[n].segment=pack_i; + for (n = 0; n < LROWS * LCOLS; n++) { + if (BarFB[n].segment == pack_i) BarFB[n].segment = pack_j; + if (BarFB[n].segment == nSegment) BarFB[n].segment = pack_i; } } } @@ -774,47 +794,56 @@ static void drv_generic_text_bar_define_chars(void) int c, i, j; unsigned char buffer[8]; - for (i=fSegment; i<nSegment; i++) { + for (i = fSegment; i < nSegment; i++) { if (Segment[i].used) continue; - if (Segment[i].ascii!=-1) continue; - for (c=0; c<CHARS-ICONS; c++) { - for (j=fSegment; j<nSegment; j++) { - if (Segment[j].ascii==c) break; + if (Segment[i].ascii != -1) continue; + for (c = 0; c < CHARS - ICONS; c++) { + for (j = fSegment; j < nSegment; j++) { + if (Segment[j].ascii == c) break; } - if (j==nSegment) break; + if (j == nSegment) break; } - Segment[i].ascii=c; + 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; + for (j = 0; j < 4; j++) { + buffer[j ] = (1<<Segment[i].val1)-1; + buffer[j+4] = (1<<Segment[i].val2)-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); + for (j = 0; j < 4; j++) { + buffer[j ] = 255<<(XRES-Segment[i].val1); + buffer[j+4] = 255<<(XRES-Segment[i].val2); } break; case DIR_NORTH: - for (j=0; j<Segment[i].val1; j++) { - buffer[7-j]=(1<<XRES)-1; + for (j = 0; j < Segment[i].val1; j++) { + buffer[7-j] = (1<<XRES)-1; } - for (; j<YRES; j++) { - buffer[7-j]=0; + for (; j < YRES; j++) { + buffer[7-j] = 0; } break; case DIR_SOUTH: - for (j=0; j<Segment[i].val1; j++) { - buffer[j]=(1<<XRES)-1; + for (j = 0; j < Segment[i].val1; j++) { + buffer[j] = (1<<XRES)-1; } - for (; j<YRES; j++) { - buffer[j]=0; + for (; j < YRES; j++) { + buffer[j] = 0; } break; } drv_generic_text_real_defchar(CHAR0+c, buffer); + + /* maybe invalidate framebuffer */ + if (INVALIDATE) { + for (j = 0; j < LROWS*LCOLS; j++) { + if (BarFB[j].segment == i) { + BarFB[j].invalid = 1; + } + } + } } } @@ -861,40 +890,47 @@ int drv_generic_text_bar_draw (WIDGET *W) drv_generic_text_bar_define_chars(); /* reset usage flags */ - for (s=0; s<nSegment; s++) { - Segment[s].used=0; + for (s = 0; s < nSegment; s++) { + Segment[s].used = 0; } /* set usage flags */ - for (n=0; n<LROWS*LCOLS; n++) { - if ((s=BarFB[n].segment)!=-1) Segment[s].used=1; + for (n = 0; n < LROWS*LCOLS; n++) { + if ((s = BarFB[n].segment) != -1) Segment[s].used = 1; } /* transfer bars into layout buffer */ - for (n=0; n<LCOLS*LROWS; n++) { - s=BarFB[n].segment; - 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; + for (row = 0; row < LROWS; row++) { + for (col = 0; col < LCOLS; col++) { + n = row*LCOLS+col; + s = BarFB[n].segment; + if (s == -1) continue; + c = Segment[s].ascii; + if (c == -1) continue; + if (s >= fSegment) c += CHAR0; /* ascii offset for user-defineable chars */ + LayoutFB[n] = c; + /* maybe invalidate display framebuffer */ + if (BarFB[n].invalid) { + BarFB[n].invalid = 0; + DisplayFB[row*DCOLS+col] = ~LayoutFB[n]; + } + } } /* transfer differences to the display */ - for (row=0; row<DROWS; row++) { - for (col=0; col<DCOLS; col++) { + for (row = 0; row < DROWS; row++) { + for (col = 0; col < DCOLS; col++) { int pos1, pos2, equal; - if (LayoutFB[row*LCOLS+col]==DisplayFB[row*DCOLS+col]) continue; + if (LayoutFB[row*LCOLS+col] == DisplayFB[row*DCOLS+col]) continue; col0 = col; - for (pos1=col, pos2=pos1, col++, equal=0; col<DCOLS; col++) { - if (LayoutFB[row*LCOLS+col]==DisplayFB[row*DCOLS+col]) { + for (pos1 = col, pos2 = pos1, col++, equal = 0; col < DCOLS; col++) { + if (LayoutFB[row*LCOLS+col] == DisplayFB[row*DCOLS+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_COST) break; + if (++equal > GOTO_COST) break; } else { - pos2=col; - equal=0; + pos2 = col; + equal = 0; } } memcpy ( DisplayFB+row*DCOLS+pos1, LayoutFB+row*LCOLS+pos1, pos2-pos1+1); diff --git a/drv_generic_text.h b/drv_generic_text.h index f45f055..572ea9f 100644 --- a/drv_generic_text.h +++ b/drv_generic_text.h @@ -1,4 +1,4 @@ -/* $Id: drv_generic_text.h,v 1.15 2004/06/26 12:04:59 reinelt Exp $ +/* $Id: drv_generic_text.h,v 1.16 2004/11/28 15:50:24 reinelt Exp $ * * generic driver helper for text-based displays * @@ -23,6 +23,9 @@ * * * $Log: drv_generic_text.h,v $ + * Revision 1.16 2004/11/28 15:50:24 reinelt + * Cwlinux fixes (invalidation of user-defined chars) + * * Revision 1.15 2004/06/26 12:04:59 reinelt * * uh-oh... the last CVS log message messed up things a lot... @@ -100,9 +103,10 @@ extern int DROWS, DCOLS; /* display size */ extern int LROWS, LCOLS; /* layout size */ extern int XRES, YRES; /* pixel width/height of one char */ -extern int GOTO_COST; /* number of bytes a goto command requires */ extern int CHARS, CHAR0; /* number of user-defineable characters, ASCII of first char */ extern int ICONS; /* number of user-defineable characters reserved for icons */ +extern int GOTO_COST; /* number of bytes a goto command requires */ +extern int INVALIDATE; /* re-send a modified userdefined char? */ /* these functions must be implemented by the real driver */ void (*drv_generic_text_real_write)(const int row, const int col, const char *data, const int len); diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index 06e84f6..09ea972 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -32,16 +32,16 @@ Display CF631 { Port '/dev/tts/USB0' Speed 115200 Contrast 95 - Backlight 100 + Backlight 255 Icons 1 } Display CF632 { - Icons 7 Driver 'Crystalfontz' Model '632' Port '/dev/tts/0' Speed 19200 + Icons 1 } Display CF633 { @@ -687,14 +687,14 @@ Layout testMySQL { #Display 'SC1602D' #Display 'LCM-162' #Display 'CF631' -#Display 'CF632' +Display 'CF632' #Display 'CF633' #Display 'Curses' #Display 'M50530-24x8' #Display 'CT20x4' #Display 'T6963-240x64' #Display 'XWindow' -Display 'USBLCD' +#Display 'USBLCD' #Display 'BWCT' #Display 'Image' diff --git a/widget_icon.c b/widget_icon.c index 294a95e..f858ae5 100644 --- a/widget_icon.c +++ b/widget_icon.c @@ -1,4 +1,4 @@ -/* $Id: widget_icon.c,v 1.14 2004/06/26 12:05:00 reinelt Exp $ +/* $Id: widget_icon.c,v 1.15 2004/11/28 15:50:24 reinelt Exp $ * * icon widget handling * @@ -21,6 +21,9 @@ * * * $Log: widget_icon.c,v $ + * Revision 1.15 2004/11/28 15:50:24 reinelt + * Cwlinux fixes (invalidation of user-defined chars) + * * Revision 1.14 2004/06/26 12:05:00 reinelt * * uh-oh... the last CVS log message messed up things a lot... @@ -181,15 +184,12 @@ void widget_icon_update (void *Self) /* rotate icon bitmap */ Icon->curmap++; if (Icon->curmap >= Icon->maxmap) - Icon->curmap=0; + Icon->curmap = 0; /* finally, draw it! */ if (W->class->draw) W->class->draw(W); - /* store currently visible bitmap */ - Icon->prvmap=Icon->curmap; - /* add a new one-shot timer */ timer_add (widget_icon_update, Self, Icon->speed, 1); |