From d8134396763fbf4ace33e6adfc98ebcb9ce3d49f Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Mon, 19 Aug 2002 07:36:29 +0000 Subject: [lcd4linux @ 2002-08-19 07:36:29 by reinelt] finished bar.c, USBLCD is the first driver that uses the generic bar functions --- BeckmannEgle.c | 21 +--- HD44780.c | 21 +--- M50530.c | 21 +--- MatrixOrbital.c | 21 +--- USBLCD.c | 352 +++++++++------------------------------------------- bar.c | 374 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- bar.h | 30 ++++- 7 files changed, 481 insertions(+), 359 deletions(-) diff --git a/BeckmannEgle.c b/BeckmannEgle.c index 2607397..0e744ce 100644 --- a/BeckmannEgle.c +++ b/BeckmannEgle.c @@ -1,4 +1,4 @@ -/* $Id: BeckmannEgle.c,v 1.7 2002/08/19 04:41:20 reinelt Exp $ +/* $Id: BeckmannEgle.c,v 1.8 2002/08/19 07:36:29 reinelt Exp $ * * driver for Beckmann+Egle mini terminals * @@ -20,6 +20,10 @@ * * * $Log: BeckmannEgle.c,v $ + * Revision 1.8 2002/08/19 07:36:29 reinelt + * + * finished bar.c, USBLCD is the first driver that uses the generic bar functions + * * Revision 1.7 2002/08/19 04:41:20 reinelt * introduced bar.c, moved bar stuff from display.h to bar.h * @@ -88,21 +92,6 @@ typedef struct { int type; } MODEL; -typedef struct { - int len1; - int len2; - int type; - int segment; -} BAR; - -typedef struct { - int len1; - int len2; - int type; - int used; - int ascii; -} SEGMENT; - static LCD Lcd; static char *Port=NULL; static int Device=-1; diff --git a/HD44780.c b/HD44780.c index 48aefb0..97f4cea 100644 --- a/HD44780.c +++ b/HD44780.c @@ -1,4 +1,4 @@ -/* $Id: HD44780.c,v 1.23 2002/08/19 04:41:20 reinelt Exp $ +/* $Id: HD44780.c,v 1.24 2002/08/19 07:36:29 reinelt Exp $ * * driver for display modules based on the HD44780 chip * @@ -20,6 +20,10 @@ * * * $Log: HD44780.c,v $ + * Revision 1.24 2002/08/19 07:36:29 reinelt + * + * finished bar.c, USBLCD is the first driver that uses the generic bar functions + * * Revision 1.23 2002/08/19 04:41:20 reinelt * introduced bar.c, moved bar stuff from display.h to bar.h * @@ -179,21 +183,6 @@ #define CHARS 8 #define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 ) -typedef struct { - int len1; - int len2; - int type; - int segment; -} BAR; - -typedef struct { - int len1; - int len2; - int type; - int used; - int ascii; -} SEGMENT; - static LCD Lcd; diff --git a/M50530.c b/M50530.c index 1928cc3..b6cad32 100644 --- a/M50530.c +++ b/M50530.c @@ -1,4 +1,4 @@ -/* $Id: M50530.c,v 1.3 2002/08/19 04:41:20 reinelt Exp $ +/* $Id: M50530.c,v 1.4 2002/08/19 07:36:29 reinelt Exp $ * * driver for display modules based on the M50530 chip * @@ -20,6 +20,10 @@ * * * $Log: M50530.c,v $ + * Revision 1.4 2002/08/19 07:36:29 reinelt + * + * finished bar.c, USBLCD is the first driver that uses the generic bar functions + * * Revision 1.3 2002/08/19 04:41:20 reinelt * introduced bar.c, moved bar stuff from display.h to bar.h * @@ -72,21 +76,6 @@ #define CHARS 8 #define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 ) -typedef struct { - int len1; - int len2; - int type; - int segment; -} BAR; - -typedef struct { - int len1; - int len2; - int type; - int used; - int ascii; -} SEGMENT; - static LCD Lcd; diff --git a/MatrixOrbital.c b/MatrixOrbital.c index 1b3f443..b9c9876 100644 --- a/MatrixOrbital.c +++ b/MatrixOrbital.c @@ -1,4 +1,4 @@ -/* $Id: MatrixOrbital.c,v 1.23 2002/08/19 04:41:20 reinelt Exp $ +/* $Id: MatrixOrbital.c,v 1.24 2002/08/19 07:36:29 reinelt Exp $ * * driver for Matrix Orbital serial display modules * @@ -20,6 +20,10 @@ * * * $Log: MatrixOrbital.c,v $ + * Revision 1.24 2002/08/19 07:36:29 reinelt + * + * finished bar.c, USBLCD is the first driver that uses the generic bar functions + * * Revision 1.23 2002/08/19 04:41:20 reinelt * introduced bar.c, moved bar stuff from display.h to bar.h * @@ -149,21 +153,6 @@ #define CHARS 8 #define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 ) -typedef struct { - int len1; - int len2; - int type; - int segment; -} BAR; - -typedef struct { - int len1; - int len2; - int type; - int used; - int ascii; -} SEGMENT; - static LCD Lcd; static char *Port=NULL; static speed_t Speed; diff --git a/USBLCD.c b/USBLCD.c index 4702590..85c05db 100644 --- a/USBLCD.c +++ b/USBLCD.c @@ -1,4 +1,4 @@ -/* $Id: USBLCD.c,v 1.4 2002/08/19 04:41:20 reinelt Exp $ +/* $Id: USBLCD.c,v 1.5 2002/08/19 07:36:29 reinelt Exp $ * * Driver for USBLCD ( see http://www.usblcd.de ) * This Driver is based on HD44780.c @@ -22,6 +22,10 @@ * * * $Log: USBLCD.c,v $ + * Revision 1.5 2002/08/19 07:36:29 reinelt + * + * finished bar.c, USBLCD is the first driver that uses the generic bar functions + * * Revision 1.4 2002/08/19 04:41:20 reinelt * introduced bar.c, moved bar stuff from display.h to bar.h * @@ -74,50 +78,26 @@ #define XRES 5 #define YRES 8 #define CHARS 8 -#define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 ) - -typedef struct { - int len1; - int len2; - int type; - int segment; -} BAR; - -typedef struct { - int len1; - int len2; - int type; - int used; - int ascii; -} SEGMENT; static LCD Lcd; int usblcd_file; static char *Port=NULL; - - static char Txt[4][40]; -static BAR Bar[4][40]; - -static int nSegment=2; -static SEGMENT Segment[128] = {{ len1:0, len2:0, type:255, used:0, ascii:32 }, - { len1:255, len2:255, type:255, used:0, ascii:255 }}; - static unsigned char Buffer[1024]; static unsigned char *BufPtr; static void USBLCD_send () { - struct timeval now, end; - gettimeofday (&now, NULL); + // struct timeval now, end; + // gettimeofday (&now, NULL); write(usblcd_file,Buffer,BufPtr-Buffer); - gettimeofday (&end, NULL); - debug ("send %d: %d usec (%d usec/byte)", BufPtr-Buffer, 1000000*(end.tv_sec-now.tv_sec)+end.tv_usec-now.tv_usec, (1000000*(end.tv_sec-now.tv_sec)+end.tv_usec-now.tv_usec)/(BufPtr-Buffer)); + // gettimeofday (&end, NULL); + // debug ("send %d: %d usec (%d usec/byte)", BufPtr-Buffer, 1000000*(end.tv_sec-now.tv_sec)+end.tv_usec-now.tv_usec, (1000000*(end.tv_sec-now.tv_sec)+end.tv_usec-now.tv_usec)/(BufPtr-Buffer)); BufPtr=Buffer; @@ -149,45 +129,39 @@ static int USBLCD_open (void) error ("USBLCD: open(%s) failed: %s", Port, strerror(errno)); return -1; } - + memset(buf,0,sizeof(buf)); - - if( ioctl(usblcd_file,GET_DRV_VERSION, buf)!=0) { + if (ioctl(usblcd_file,GET_DRV_VERSION, buf)!=0) { error ("USBLCD: ioctl() failed, could not get Driver Version!"); return -2; - } ; - + } debug("Driver Version: %s",buf); - if( sscanf(buf,"USBLCD Driver Version %d.%d",&major,&minor)!=2) { + if (sscanf(buf,"USBLCD Driver Version %d.%d",&major,&minor)!=2) { error("USBLCD: could not read Driver Version!"); return -4; - }; - - if(major!=1) { + } + if (major!=1) { error("USBLCD: Driver Version not supported!"); return -4; } memset(buf,0,sizeof(buf)); - - if( ioctl(usblcd_file,GET_HARD_VERSION, buf)!=0) { + if (ioctl(usblcd_file,GET_HARD_VERSION, buf)!=0) { error ("USBLCD: ioctl() failed, could not get Hardware Version!"); return -3; - } ; - + } debug("Hardware Version: %s",buf); - if( sscanf(buf,"%d.%d",&major,&minor)!=2) { + if (sscanf(buf,"%d.%d",&major,&minor)!=2) { error("USBLCD: could not read Hardware Version!"); return -4; }; - - if(major!=1) { + if (major!=1) { error("USBLCD: Hardware Version not supported!"); return -4; } - + BufPtr=Buffer; USBLCD_command (0x29); // 8 Bit mode, 1/16 duty cycle, 5x8 font @@ -198,172 +172,12 @@ static int USBLCD_open (void) return 0; } -static void USBLCD_process_bars (void) -{ - int row, col; - int i, j; - - for (i=2; i=RES && Segment[j].len1=RES && Segment[j].len2RES) i1=RES; - i2=Segment[i].len2; if (i2>RES) i2=RES; - j1=Segment[j].len1; if (j1>RES) i1=RES; - j2=Segment[j].len2; if (j2>RES) i2=RES; - - return (i1-i2)*(i1-i2)+(j1-j2)*(j1-j2); + USBLCD_command (0x40|8*ascii); + USBLCD_write (buffer, 8); } -static void USBLCD_compact_bars (void) -{ - int i, j, r, c, min; - int pack_i, pack_j; - int pass1=1; - int deviation[nSegment][nSegment]; - - if (nSegment>CHARS+2) { - - for (i=2; iCHARS+2) { - min=65535; - pack_i=-1; - pack_j=-1; - for (i=2; imax) len1=max; - - if (len2<1) len2=1; - else if (len2>max) len2=max; - - switch (type) { - case BAR_L: - len1=max-len1; - len2=max-len2; - rev=1; - - case BAR_R: - while (max>0 && col<=Lcd.cols) { - Bar[row][col].type=type; - Bar[row][col].segment=-1; - if (len1>=XRES) { - Bar[row][col].len1=rev?0:XRES; - len1-=XRES; - } else { - Bar[row][col].len1=rev?XRES-len1:len1; - len1=0; - } - if (len2>=XRES) { - Bar[row][col].len2=rev?0:XRES; - len2-=XRES; - } else { - Bar[row][col].len2=rev?XRES-len2:len2; - len2=0; - } - max-=XRES; - col++; - } - break; - - case BAR_U: - len1=max-len1; - len2=max-len2; - rev=1; - - case BAR_D: - while (max>0 && row<=Lcd.rows) { - Bar[row][col].type=type; - Bar[row][col].segment=-1; - if (len1>=YRES) { - Bar[row][col].len1=rev?0:YRES; - len1-=YRES; - } else { - Bar[row][col].len1=rev?YRES-len1:len1; - len1=0; - } - if (len2>=YRES) { - Bar[row][col].len2=rev?0:YRES; - len2-=YRES; - } else { - Bar[row][col].len2=rev?YRES-len2:len2; - len2=0; - } - max-=YRES; - row++; - } - break; - - } - return 0; + return bar_draw (type, row, col, max, len1, len2); } + int USBLCD_flush (void) { char buffer[256]; char *p; - int s, row, col; - - USBLCD_process_bars(); - USBLCD_compact_bars(); - USBLCD_define_chars(); + int c, row, col; - for (s=0; s + #include "bar.h" #include "debug.h" + +static int ROWS=0; +static int COLS=0; +static int XRES=0; +static int YRES=0; +static int CHARS=0; + +static int nSegment=0; +static int fSegment=0; +static SEGMENT Segment[128]; + +static BAR *Bar=NULL; + + +int bar_init (int rows, int cols, int xres, int yres, int chars) +{ + if (rows<1 || cols<1) + return -1; + + ROWS=rows; + COLS=cols; + XRES=xres; + YRES=yres; + CHARS=chars; + + if (Bar) { + free (Bar); + } + + if ((Bar=malloc (ROWS*COLS*sizeof(BAR)))==NULL) { + return -1; + } + + bar_clear(); + + nSegment=0; + fSegment=0; + + return 0; +} + + +void bar_clear(void) +{ + int n; + + for (n=0; nmax) len1=max; + + if (len2<1) len2=1; + else if (len2>max) len2=max; + + switch (type) { + case BAR_L: + len1=max-len1; + len2=max-len2; + rev=1; + + case BAR_R: + while (max>0 && col=XRES) { + Bar[row*COLS+col].len1=rev?0:XRES; + len1-=XRES; + } else { + Bar[row*COLS+col].len1=rev?XRES-len1:len1; + len1=0; + } + if (len2>=XRES) { + Bar[row*COLS+col].len2=rev?0:XRES; + len2-=XRES; + } else { + Bar[row*COLS+col].len2=rev?XRES-len2:len2; + len2=0; + } + max-=XRES; + col++; + } + break; + + case BAR_U: + len1=max-len1; + len2=max-len2; + rev=1; + + case BAR_D: + while (max>0 && row=YRES) { + Bar[row*COLS+col].len1=rev?0:YRES; + len1-=YRES; + } else { + Bar[row*COLS+col].len1=rev?YRES-len1:len1; + len1=0; + } + if (len2>=YRES) { + Bar[row*COLS+col].len2=rev?0:YRES; + len2-=YRES; + } else { + Bar[row*COLS+col].len2=rev?YRES-len2:len2; + len2=0; + } + max-=YRES; + row++; + } + break; + + } + return 0; +} + + +static void create_segments (void) +{ + int i, j, n; + + /* find first unused segment */ + for (i=fSegment; i=RES && Segment[j].len1=RES && Segment[j].len2RES) i1=RES; + i2=Segment[i].len2; if (i2>RES) i2=RES; + j1=Segment[j].len1; if (j1>RES) i1=RES; + j2=Segment[j].len2; if (j2>RES) i2=RES; + + return (i1-i2)*(i1-i2)+(j1-j2)*(j1-j2); +} + + +static void pack_segments (void) +{ + int i, j, n, min; + int pack_i, pack_j; + int pass1=1; + int deviation[nSegment][nSegment]; + + if (nSegment<=fSegment+CHARS) { + return; + } + + for (i=0; ifSegment+CHARS) { + min=65535; + pack_i=-1; + pack_j=-1; + for (i=fSegment; i