From bf336ed4eeb6ade0e5c963b76683df3d1fd1fd7b Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Tue, 28 Mar 2000 07:22:15 +0000 Subject: [lcd4linux @ 2000-03-28 07:22:15 by reinelt] version 0.95 released X11 driver up and running minor bugs fixed --- Makefile.am | 4 +- Makefile.in | 3 +- Raster.c | 11 +- XWindow.c | 554 +++++++++++++++++++++++++++++++++++--------------- cfg.c | 15 +- configure | 2 +- configure.in | 2 +- lcd4linux.conf.sample | 24 ++- system.c | 18 +- 9 files changed, 447 insertions(+), 186 deletions(-) diff --git a/Makefile.am b/Makefile.am index 1d50bf1..f7702e2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,6 +4,8 @@ AUTOMAKE_OPTIONS = foreign CLEANFILES = *~ AM_CFLAGS = -Wall +LDFLAGS = -L/usr/X11R6/lib +LDADD = -lX11 bin_PROGRAMS = lcd4linux lcd4linux_SOURCES = \ @@ -21,5 +23,3 @@ lcd4linux_SOURCES = \ MatrixOrbital.c \ Raster.c \ XWindow.c - - diff --git a/Makefile.in b/Makefile.in index c6949c3..03de66d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -66,6 +66,8 @@ AUTOMAKE_OPTIONS = foreign CLEANFILES = *~ AM_CFLAGS = -Wall +LDFLAGS = -L/usr/X11R6/lib +LDADD = -lX11 bin_PROGRAMS = lcd4linux lcd4linux_SOURCES = lcd4linux.c cfg.c cfg.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h filter.c filter.h display.c display.h pixmap.c pixmap.h fontmap.c fontmap.h Skeleton.c MatrixOrbital.c Raster.c XWindow.c @@ -78,7 +80,6 @@ PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ lcd4linux_OBJECTS = lcd4linux.o cfg.o parser.o processor.o system.o \ isdn.o filter.o display.o pixmap.o fontmap.o Skeleton.o MatrixOrbital.o \ diff --git a/Raster.c b/Raster.c index 22b8819..f0a25ea 100644 --- a/Raster.c +++ b/Raster.c @@ -1,4 +1,4 @@ -/* $Id: Raster.c,v 1.7 2000/03/26 20:00:44 reinelt Exp $ +/* $Id: Raster.c,v 1.8 2000/03/28 07:22:15 reinelt Exp $ * * driver for raster formats * @@ -20,6 +20,12 @@ * * * $Log: Raster.c,v $ + * Revision 1.8 2000/03/28 07:22:15 reinelt + * + * version 0.95 released + * X11 driver up and running + * minor bugs fixed + * * Revision 1.7 2000/03/26 20:00:44 reinelt * * README.Raster added @@ -67,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -219,7 +226,7 @@ int Raster_init (LCD *Self) return -1; } - if (sscanf(s=cfg_get("gap")?:"3x3", "%dx%d", &rgap, &cgap)!=2 || rgap<0 || cgap<0) { + if (sscanf(s=cfg_get("gap")?:"3x3", "%dx%d", &cgap, &rgap)!=2 || cgap<0 || rgap<0) { fprintf (stderr, "Raster: bad gap '%s'\n", s); return -1; } diff --git a/XWindow.c b/XWindow.c index b87dcd1..ab86857 100644 --- a/XWindow.c +++ b/XWindow.c @@ -1,8 +1,8 @@ -/* $Id: XWindow.c,v 1.6 2000/03/26 19:03:52 reinelt Exp $ +/* $Id: XWindow.c,v 1.7 2000/03/28 07:22:15 reinelt Exp $ * - * driver for X11 + * X11 Driver for LCD4Linux * - * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at) + * (c) 2000 Herbert Rosmanith * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,36 +20,11 @@ * * * $Log: XWindow.c,v $ - * Revision 1.6 2000/03/26 19:03:52 reinelt + * Revision 1.7 2000/03/28 07:22:15 reinelt * - * more Pixmap renaming - * quoting of '#' in config file - * - * Revision 1.5 2000/03/26 18:46:28 reinelt - * - * bug in pixmap.c that leaded to empty bars fixed - * name conflicts with X11 resolved - * - * Revision 1.4 2000/03/25 05:50:43 reinelt - * - * memory leak in Raster_flush closed - * driver family logic changed - * - * Revision 1.3 2000/03/24 11:36:56 reinelt - * - * new syntax for raster configuration - * changed XRES and YRES to be configurable - * PPM driver works nice - * - * Revision 1.2 2000/03/23 07:24:48 reinelt - * - * PPM driver up and running (but slow!) - * - * Revision 1.1 2000/03/22 15:36:21 reinelt - * - * added '-l' switch (list drivers) - * generic pixmap driver added - * X11 Framework done + * version 0.95 released + * X11 driver up and running + * minor bugs fixed * */ @@ -61,145 +36,402 @@ * */ -#include -#include -#include -#include "cfg.h" -#include "display.h" -#include "pixmap.h" +/* + * + * Sun Mar 26 15:28:23 MET 2000 various rewrites + * Sat Mar 25 23:58:19 MET 2000 use generic pixmap driver + * Thu Mar 23 01:05:07 MET 2000 multithreading, synchronization + * Tue Mar 21 22:22:03 MET 2000 initial coding + * + */ -#define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 | BAR_V2 ) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -static int pixel=-1; -static int pgap=0; -static int rgap=0; -static int cgap=0; -static int border=0; +#include "cfg.h" +#include "display.h" +#include "pixmap.h" -static int foreground=0; -static int halfground=0; -static int background=0; +#define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 | BAR_V2 ) static LCD Lcd; +Display *dp; +int sc; +Window w,rw; +Visual *vi; +int dd; +Colormap cm; +GC gc,gcb,gch; +XColor co[3]; +XColor db; +Pixmap pmback; + +unsigned char *BackupLCDpixmap; +char *rgbfg,*rgbbg,*rgbhg; +int pixel=-1; /*pointsize in pixel*/ +int pgap=0; /*gap between points */ +int rgap=0; /*row gap between lines*/ +int cgap=0; /*column gap between characters*/ +int border=0; /*window border*/ +int rows=-1,cols=-1; /*rows+cols without background*/ +int xres=-1,yres=-1; /*xres+yres (same as self->...)*/ +int dimx,dimy; /*total window dimension in pixel*/ +int boxw,boxh; /*box width, box height*/ +void async_update(); /*PROTO*/ +pid_t async_updater_pid=1; +int semid=-1; +int shmid=-1; + +void acquire_lock() { +struct sembuf sembuf; + sembuf.sem_num=0; + sembuf.sem_op=-1; + sembuf.sem_flg=0; + semop(semid,&sembuf,1); /* get mutex */ +} + +void release_lock() { +struct sembuf sembuf; + sembuf.sem_num=0; + sembuf.sem_op=1; + sembuf.sem_flg=0; + semop(semid,&sembuf,1); /* free mutex */ +} + +void semcleanup() { +union semun arg; + if (semid>-1) semctl(semid,0,IPC_RMID,arg); +} + +void shmcleanup() { + if (shmid>-1) shmctl(shmid,IPC_RMID,NULL); +} + +void quit(int nsig) { + printf("pid%d got signal %d\n",getpid(),nsig); + semcleanup(); + shmcleanup(); + exit(0); +} + +void quit_updater() { + if (async_updater_pid>1) + kill(async_updater_pid,15); +} + +void init_signals() { +unsigned int oksig=(1<>16; - G[0]=0xff&background>>8; - B[0]=0xff&background; - - R[1]=0xff&halfground>>16; - G[1]=0xff&halfground>>8; - B[1]=0xff&halfground; - - R[2]=0xff&foreground>>16; - G[2]=0xff&foreground>>8; - B[2]=0xff&foreground; - - for (row=0; rowrows=rows; - Self->cols=cols; - Self->xres=xres; - Self->yres=yres; - Lcd=*Self; - - pix_clear(); - return 0; -} - -int X_put (int row, int col, char *text) -{ - return pix_put (row, col, text); -} +int init_shm(int nbytes,unsigned char **buf) { -int X_bar (int type, int row, int col, int max, int len1, int len2) -{ - return pix_bar (type, row, col, max, len1, len2); + shmid=shmget(IPC_PRIVATE,nbytes,SHM_R|SHM_W); + if (shmid==-1) { + perror("X11: shmget() failed"); + return -1; + } + *buf=shmat(shmid,NULL,0); + if (*buf==NULL) { + perror("X11: shmat() failed"); + return -1; + } + return 0; } +int init_thread(int bufsiz) { +union semun semun; + + semid=semget(IPC_PRIVATE,1,0); + if (semid==-1) { + perror("X11: semget() failed"); + return -1; + } + semun.val=1; + semctl(semid,0,SETVAL,semun); + + switch(async_updater_pid=fork()) { + case -1: + perror("X11: fork() failed"); + return -1; + case 0: + async_update(); + /*notreached*/ + break; + default: + break; + } + atexit(quit_updater); + return 0; +} + +int init_x(int rows,int cols,int xres,int yres) { +XSetWindowAttributes wa; +XSizeHints size_hints; +XColor co_dummy; +XEvent ev; + + if ((dp=XOpenDisplay(NULL))==NULL) { + fprintf(stderr,"can't open display\n"); + return -1; + } + sc=DefaultScreen(dp); + gc=DefaultGC(dp,sc); + vi=DefaultVisual(dp,sc); + dd=DefaultDepth(dp,sc); + rw=DefaultRootWindow(dp); + cm=DefaultColormap(dp,sc); + + if (XAllocNamedColor(dp,cm,rgbfg,&co[0],&co_dummy)==False) { + fprintf(stderr,"can't alloc foreground color '%s'\n", + rgbfg); + return -1; + } + if (XAllocNamedColor(dp,cm,rgbbg,&co[1],&co_dummy)==False) { + fprintf(stderr,"can't alloc background color '%s'\n", + rgbbg); + return -1; + } + if (XAllocNamedColor(dp,cm,rgbhg,&co[2],&co_dummy)==False) { + fprintf(stderr,"can't alloc halfground color '%s'\n", + rgbhg); + return -1; + } + if (XAllocNamedColor(dp,cm,"#e0e0e0",&db,&co_dummy)==False) { + fprintf(stderr,"can't alloc db color '%s'\n", + "#0000ff"); + return -1; + } + boxw=xres*(pixel+pgap)+cgap; + boxh=yres*(pixel+pgap)+rgap; + dimx=(cols-1)*cgap+cols*xres*(pixel+pgap); + dimy=(rows-1)*rgap+rows*yres*(pixel+pgap); + wa.event_mask=ExposureMask|ButtonPressMask|ButtonReleaseMask; + w=XCreateWindow(dp,rw,0,0,dimx+2*border,dimy+2*border,0,0, + InputOutput,vi,CWEventMask,&wa); + pmback=XCreatePixmap(dp,w,dimx,dimy,dd); + size_hints.min_width=size_hints.max_width=dimx+2*border; + size_hints.min_height=size_hints.max_height=dimy+2*border; + size_hints.flags=PPosition|PSize|PMinSize|PMaxSize; + XSetWMProperties(dp,w,NULL,NULL,NULL,0,&size_hints,NULL,NULL); + XSetForeground(dp,gc,co[0].pixel); + XSetBackground(dp,gc,co[1].pixel); + gcb=XCreateGC(dp,w,0,NULL); + XSetForeground(dp,gcb,co[1].pixel); + XSetBackground(dp,gcb,co[0].pixel); + gch=XCreateGC(dp,w,0,NULL); + XSetForeground(dp,gch,co[2].pixel); + XSetBackground(dp,gch,co[0].pixel); + XFillRectangle(dp,pmback,gcb,0,0,dimx,dimy); + XSetWindowBackground(dp,w,co[1].pixel); + XClearWindow(dp,w); + XStoreName(dp,w,"XLCD4Linux"); + XMapWindow(dp,w); + XFlush(dp); + for(;;) { + XNextEvent(dp,&ev); + if (ev.type==Expose && ev.xexpose.count==0) + break; + } + XChangeWindowAttributes(dp,w,0,NULL); + return 0; +} + +int xlcdinit(LCD *Self) { +char *s; + + if (sscanf(s=cfg_get("size")?:"20x4","%dx%d",&cols,&rows)!=2 + || rows<1 || cols<1) { + fprintf(stderr,"X11: bad size '%s'\n",s); + return -1; + } + if (sscanf(s=cfg_get("font")?:"5x8","%dx%d",&xres,&yres)!=2 + || xres<5 || yres>10) { + fprintf(stderr,"X11: bad font '%s'\n",s); + return -1; + } + if (sscanf(s=cfg_get("pixel")?:"4+1","%d+%d",&pixel,&pgap)!=2 + || pixel<1 || pgap<0) { + fprintf(stderr,"X11: bad pixel '%s'\n",s); + return -1; + } + if (sscanf(s=cfg_get("gap")?:"3x3","%dx%d",&cgap,&rgap)!=2 + || cgap<0 || rgap<0) { + fprintf(stderr,"X11: bad gap '%s'\n",s); + return -1; + } + border=atoi(cfg_get("border")?:"0"); + rgbfg=cfg_get("foreground")?:"#000000"; + rgbbg=cfg_get("background")?:"#64b17a"; + rgbhg=cfg_get("halfground")?:"#44915a"; + + if (pix_init(rows,cols,xres,yres)==-1) return -1; + if (init_x(rows,cols,xres,yres)==-1) return -1; + init_signals(); + if (init_shm(rows*cols*xres*yres,&BackupLCDpixmap)==-1) return -1; + memset(BackupLCDpixmap,0xff,rows*yres*cols*xres); + if (init_thread(rows*cols*xres*yres)==-1) return -1; + Self->rows=rows; + Self->cols=cols; + Self->xres=xres; + Self->yres=yres; + Lcd=*Self; + + pix_clear(); + return 0; +} + +int xlcdclear() { + return pix_clear(); +} + +int xlcdput(int row,int col,char *text) { + return pix_put(row,col,text); +} + +int xlcdbar(int type, int row, int col, int max, int len1, int len2) { + return pix_bar(type,row,col,max,len1,len2); +} + +int xlcdflush() { +int dirty; +int i,j,pos; +int x,y; + + acquire_lock(); + dirty=pos=0; + y=border; + for(i=0;ipxnr*(pixel+pgap)+(pxnr/xres)*cgap; + * f^-1: pxnr -> f^-1(bitpos) = see paper + */ + x-=border; + y-=border; + if (x>=dimx || y>=dimy || x+width<0 || y+height<0) { + // printf("border only\n"); + return; /*border doesnt need update*/ + } + if (x<0) x=0; + if (y<0) y=0; + if (x+width>dimx) width=dimx-x; + if (y+height>dimy) height=dimy-y; + /* + * now we have to find out where the box starts + * with respects to the LCDpixmap coordinates + */ + /* upper left corner */ + xfrom=xres*(x/boxw); /*start at col.no*/ + i=(x%boxw); /*pixelpos rel. char*/ + if (i>xres*(pixel+pgap)) /*in cgap zone*/ + xfrom+=xres; + else { + xfrom+=i/(pixel+pgap); /*character element*/ + if (i%(pixel+pgap)>=pixel) /*in pgap zone*/ + xfrom++; + } + yfrom=yres*(y/boxh); /*start at row.no*/ + i=(y%boxh); /*pixelpos rel. char*/ + if (i>yres*(pixel+pgap)) /*in rgap zone*/ + yfrom+=yres; + else { + yfrom+=i/(pixel+pgap); /*character element*/ + if (i%(pixel+pgap)>=pixel) /*in pgag zone*/ + yfrom++; + } + /*lower right corner*/ + x+=width-1; + y+=height-1; + xto=xres*(x/boxw)+(x%boxw)/(pixel+pgap); + yto=yres*(y/boxh)+(y%boxh)/(pixel+pgap); + + pos=yfrom*xres*cols+xfrom; + wy=border+yfrom*(pixel+pgap)+rgap*(yfrom/yres); + wx=border+xfrom*(pixel+pgap)+cgap*(xfrom/xres); + wpos=pos; + for(i=yfrom;i<=yto;i++) { + dx=wx; + for(j=xfrom;j<=xto;j++) { + XFillRectangle(dp,w, + BackupLCDpixmap[wpos++]?gc:gch, + dx,wy, + pixel,pixel); + dx+=pixel+pgap; + if ((j+1)%xres==0) dx+=cgap; + } + wy+=pixel+pgap; + if ((i+1)%yres==0) wy+=rgap; + pos+=xres*cols; + wpos=pos; + } +} + +void async_update() { +XEvent ev; + + for(;;) { + XWindowEvent(dp,w, + ExposureMask, + &ev); + if (ev.type==Expose) { + acquire_lock(); + update(ev.xexpose.x,ev.xexpose.y, + ev.xexpose.width,ev.xexpose.height); + release_lock(); + } + } +} LCD XWindow[] = { - { "X11", 0, 0, 0, 0, BARS, X_init, X_clear, X_put, X_bar, X_flush }, - { NULL } + { "X11", 0, 0, 0, 0, BARS, xlcdinit, xlcdclear, xlcdput, xlcdbar, xlcdflush }, + { NULL } }; diff --git a/cfg.c b/cfg.c index fcb9651..7a9fa14 100644 --- a/cfg.c +++ b/cfg.c @@ -1,4 +1,4 @@ -/* $Id: cfg.c,v 1.4 2000/03/26 20:00:44 reinelt Exp $ +/* $Id: cfg.c,v 1.5 2000/03/28 07:22:15 reinelt Exp $ * * config file stuff * @@ -20,6 +20,12 @@ * * * $Log: cfg.c,v $ + * Revision 1.5 2000/03/28 07:22:15 reinelt + * + * version 0.95 released + * X11 driver up and running + * minor bugs fixed + * * Revision 1.4 2000/03/26 20:00:44 reinelt * * README.Raster added @@ -72,6 +78,7 @@ #include #include #include +#include #include "cfg.h" @@ -108,7 +115,11 @@ static char *dequote (char *string) char *p=string; do { - if (*s!='\\') *p++=*s; + if (*s=='\\' && *(s+1)=='#') { + *p++=*++s; + } else { + *p++=*s; + } } while (*s++); return string; diff --git a/configure b/configure index e5fbb4b..f69cf9e 100755 --- a/configure +++ b/configure @@ -691,7 +691,7 @@ fi PACKAGE=lcd4linux -VERSION=0.94 +VERSION=0.95 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } diff --git a/configure.in b/configure.in index b960e10..6e03db7 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(lcd4linux.c) -AM_INIT_AUTOMAKE(lcd4linux, 0.94) +AM_INIT_AUTOMAKE(lcd4linux, 0.95) dnl Checks for programs. AC_PROG_CC diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index 631abdd..9b00f86 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -3,18 +3,26 @@ #Speed 19200 #Contrast 160 -#Display xlcd -Display PPM -size 20x4 +#Display PPM +#size 20x4 +#font 5x8 +#pixel 3+0 +#gap 3x3 +#border 10 +#foreground \#102000 +#halfground \#70c000 +#background \#80d000 + +Display X11 +size 20x5 font 5x8 -pixel 3+0 -gap 3x3 -border 5 +pixel 2+0 +gap 2x2 +border 3 foreground \#102000 halfground \#70c000 background \#80d000 - #Row1 "*** %o %v ***" #Row2 "%p CPU %r MB RAM" #Row3 "Busy %cb%% $r10cs+cb" @@ -24,7 +32,7 @@ Row1 "Load %l1%L$r10cs+cb" Row2 "Disk %dm $R10dr+dw" Row3 "Net %nm $R10nr+nw" Row4 "ISDN %im $r10ii+io" -Row5 "Temp %s2\337$r10s1+s2" +Row5 "Temp %s2°$r10s1+s2" #Row1 "$u3l1$u3cb$u3cs $u3mu$u3ma$u3ms $u3dr$u3dw $u3nr$u3nw $u3ii$u3io" #Row2 " " diff --git a/system.c b/system.c index b8c71b6..e2f979c 100644 --- a/system.c +++ b/system.c @@ -1,4 +1,4 @@ -/* $Id: system.c,v 1.8 2000/03/23 07:24:48 reinelt Exp $ +/* $Id: system.c,v 1.9 2000/03/28 07:22:15 reinelt Exp $ * * system status retreivement * @@ -20,6 +20,12 @@ * * * $Log: system.c,v $ + * Revision 1.9 2000/03/28 07:22:15 reinelt + * + * version 0.95 released + * X11 driver up and running + * minor bugs fixed + * * Revision 1.8 2000/03/23 07:24:48 reinelt * * PPM driver up and running (but slow!) @@ -102,21 +108,17 @@ #include #include #include +#include #include #include #include #include -#include +#include #include "system.h" #include "cfg.h" #include "filter.h" -#ifdef USE_SYSINFO -#include -#include -#endif - static int parse_meminfo (char *tag, char *buffer) { char *p; @@ -479,7 +481,7 @@ int Sensor (int index, double *val, double *min, double *max) { char buffer[32]; double value; - static int fd[SENSORS]={[0 ... SENSORS]=-2,}; + static int fd[SENSORS]={[0 ... SENSORS-1]=-2,}; static char *sensor[SENSORS]={NULL,}; static double val_buf[SENSORS]={0.0,}; static double min_buf[SENSORS]={0.0,}; -- cgit v1.2.3