diff options
| author | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2000-03-13 15:58:24 +0000 | 
|---|---|---|
| committer | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2000-03-13 15:58:24 +0000 | 
| commit | 1f0791dbac416903409b420ce5bdd73a1944c3d4 (patch) | |
| tree | c72c000f26428a310cd2778e7c301ca24e026e09 | |
| parent | 713dd4045fdc6312cb80a4aee9b17a3dd5cc1368 (diff) | |
| download | lcd4linux-1f0791dbac416903409b420ce5bdd73a1944c3d4.tar.gz | |
[lcd4linux @ 2000-03-13 15:58:24 by reinelt]
release 0.9
moved row parsing to parser.c
all basic work finished
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@10 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
| -rw-r--r-- | Makefile.am | 12 | ||||
| -rw-r--r-- | Makefile.in | 13 | ||||
| -rw-r--r-- | MatrixOrbital.c | 127 | ||||
| -rwxr-xr-x | configure | 2 | ||||
| -rw-r--r-- | configure.in | 2 | ||||
| -rw-r--r-- | display.c | 15 | ||||
| -rw-r--r-- | display.h | 23 | ||||
| -rw-r--r-- | isdn.c | 10 | ||||
| -rw-r--r-- | isdn.h | 10 | ||||
| -rw-r--r-- | lcd4linux.c | 565 | ||||
| -rw-r--r-- | lcd4linux.conf.sample | 14 | ||||
| -rw-r--r-- | lcd4linux.h | 0 | ||||
| -rw-r--r-- | parser.c | 208 | ||||
| -rw-r--r-- | parser.h | 48 | 
14 files changed, 629 insertions, 420 deletions
diff --git a/Makefile.am b/Makefile.am index f75d8b5..38b15bf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,9 +3,17 @@  AUTOMAKE_OPTIONS = foreign  CLEANFILES = *~ -CFLAGS = -Wall -O2 +AM_CFLAGS = -Wall  bin_PROGRAMS = lcd4linux -lcd4linux_SOURCES = lcd4linux.c cfg.c display.c filter.c system.c isdn.c MatrixOrbital.c +lcd4linux_SOURCES = \ +	lcd4linux.c \ +	cfg.c cfg.h \ +	parser.c parser.h \ +	system.c system.h \ +	isdn.c isdn.h \ +	filter.c filter.h \ +	display.c display.h \ +	MatrixOrbital.c diff --git a/Makefile.in b/Makefile.in index 080f5bb..a500dd9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -65,10 +65,11 @@ VERSION = @VERSION@  AUTOMAKE_OPTIONS = foreign  CLEANFILES = *~ -CFLAGS = -Wall -O2 +AM_CFLAGS = -Wall  bin_PROGRAMS = lcd4linux -lcd4linux_SOURCES = lcd4linux.c cfg.c display.c filter.c system.c isdn.c MatrixOrbital.c +lcd4linux_SOURCES =  	lcd4linux.c 	cfg.c cfg.h 	parser.c parser.h 	system.c system.h 	isdn.c isdn.h 	filter.c filter.h 	display.c display.h 	MatrixOrbital.c +  ACLOCAL_M4 = $(top_srcdir)/aclocal.m4  mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs  CONFIG_CLEAN_FILES =  @@ -79,11 +80,12 @@ DEFS = @DEFS@ -I. -I$(srcdir)  CPPFLAGS = @CPPFLAGS@  LDFLAGS = @LDFLAGS@  LIBS = @LIBS@ -lcd4linux_OBJECTS =  lcd4linux.o cfg.o display.o filter.o system.o \ -isdn.o MatrixOrbital.o +lcd4linux_OBJECTS =  lcd4linux.o cfg.o parser.o system.o isdn.o filter.o \ +display.o MatrixOrbital.o  lcd4linux_LDADD = $(LDADD)  lcd4linux_DEPENDENCIES =   lcd4linux_LDFLAGS =  +CFLAGS = @CFLAGS@  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)  CCLD = $(CC)  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ @@ -96,7 +98,8 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)  TAR = tar  GZIP_ENV = --best  DEP_FILES =  .deps/MatrixOrbital.P .deps/cfg.P .deps/display.P \ -.deps/filter.P .deps/isdn.P .deps/lcd4linux.P .deps/system.P +.deps/filter.P .deps/isdn.P .deps/lcd4linux.P .deps/parser.P \ +.deps/system.P  SOURCES = $(lcd4linux_SOURCES)  OBJECTS = $(lcd4linux_OBJECTS) diff --git a/MatrixOrbital.c b/MatrixOrbital.c index f59a81e..510ae26 100644 --- a/MatrixOrbital.c +++ b/MatrixOrbital.c @@ -1,4 +1,4 @@ -/* $Id: MatrixOrbital.c,v 1.4 2000/03/10 17:36:02 reinelt Exp $ +/* $Id: MatrixOrbital.c,v 1.5 2000/03/13 15:58:24 reinelt Exp $   *   *  driver for Matrix Orbital serial display modules   * @@ -20,6 +20,12 @@   *   *   * $Log: MatrixOrbital.c,v $ + * Revision 1.5  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + *   * Revision 1.4  2000/03/10 17:36:02  reinelt   *   * first unstable but running release @@ -46,12 +52,16 @@  #include "cfg.h"  #include "display.h" +#define SPEED 19200  #define XRES 5  #define YRES 8  #define CHARS 8 +#define BARS ( BAR_L | BAR_R | BAR_H2 ) +// Fixme: BAR_U, BAR_D  static DISPLAY Display;  static char *Port=NULL; +static speed_t Speed;  static int Device=-1;  typedef struct { @@ -92,7 +102,7 @@ static int MO_open (void)      return -1;    }    cfmakeraw(&portset); -  cfsetospeed(&portset, B19200); +  cfsetospeed(&portset, Speed);    if (tcsetattr(fd, TCSANOW, &portset)==-1) {      fprintf (stderr, "MatrixOrbital: tcsetattr(%s) failed: %s\n", Port, strerror(errno));      return -1; @@ -117,7 +127,7 @@ static int MO_contrast (void)    char buffer[4];    int  contrast; -  contrast=atoi(cfg_get("contrast")); +  contrast=atoi(cfg_get("Contrast"));    if (contrast==0) contrast=160;    snprintf (buffer, 4, "\376P%c", contrast);    MO_write (buffer, 3); @@ -222,10 +232,9 @@ static void MO_compact_bars (void)  static void MO_define_chars (void)  { -  int i, j, c; +  int c, i, j;    char buffer[12]="\376N"; -  char Pixel[] = {0, 16, 24, 28, 30, 31}; -   +    for (i=2; i<nSegment; i++) {      if (Segment[i].used) continue;      if (Segment[i].ascii!=-1) continue; @@ -237,14 +246,22 @@ static void MO_define_chars (void)      }      Segment[i].ascii=c;      buffer[2]=c; -    buffer[3]=Pixel[Segment[i].len1]; -    buffer[4]=Pixel[Segment[i].len1]; -    buffer[5]=Pixel[Segment[i].len1]; -    buffer[6]=Pixel[Segment[i].len1]; -    buffer[7]=Pixel[Segment[i].len2]; -    buffer[8]=Pixel[Segment[i].len2]; -    buffer[9]=Pixel[Segment[i].len2]; -    buffer[10]=Pixel[Segment[i].len2]; +    switch (Segment[i].type & (BAR_L | BAR_R | BAR_U | BAR_D)) { +    case BAR_L: +      for (j=0; j<4; j++) { +	char Pixel[] = { 0, 1, 3, 7, 15, 31 }; +	buffer[j+3]=Pixel[Segment[i].len1]; +	buffer[j+7]=Pixel[Segment[i].len2]; +      } +      break; +    case BAR_R: +      for (j=0; j<4; j++) { +	char Pixel[] = { 0, 16, 24, 28, 30, 31 }; +	buffer[j+3]=Pixel[Segment[i].len1]; +	buffer[j+7]=Pixel[Segment[i].len2]; +      } +      break; +    }      MO_write (buffer, 11);    }  } @@ -269,6 +286,7 @@ int MO_clear (void)  int MO_init (DISPLAY *Self)  {    char *port; +  char *speed;    Display=*Self; @@ -277,13 +295,34 @@ int MO_init (DISPLAY *Self)      Port=NULL;    } -  port=cfg_get ("port"); +  port=cfg_get ("Port");    if (port==NULL || *port=='\0') { -    fprintf (stderr, "MatrixOrbital: no 'port' entry in %s\n", cfg_file()); +    fprintf (stderr, "MatrixOrbital: no 'Port' entry in %s\n", cfg_file());      return -1;    }    Port=strdup(port); +  speed=cfg_get("Speed"); +  if (speed==NULL) speed="19200"; +   +  switch (atoi(speed)) { +  case 1200: +    Speed=B1200; +    break; +  case 2400: +    Speed=B2400; +    break; +  case 9600: +    Speed=B9600; +    break; +  case 19200: +    Speed=B19200; +    break; +  default: +    fprintf (stderr, "MatrixOrbital: unsupported speed '%s' in %s\n", speed, cfg_file()); +    return -1; +  }     +    Device=MO_open();    if (Device==-1) return -1; @@ -313,31 +352,49 @@ int MO_put (int row, int col, char *text)  int MO_bar (int type, int row, int col, int max, int len1, int len2)  { +  int rev=0; +      if (len1<1) len1=1;    else if (len1>max) len1=max;    if (len2<1) len2=1;    else if (len2>max) len2=max; -  while (max>0 && col<=Display.cols) { -    Bar[row][col].type=type; -    Bar[row][col].segment=-1; -    if (len1>=XRES) { -      Bar[row][col].len1=XRES; -      len1-=XRES; -    } else { -      Bar[row][col].len1=len1; -      len1=0; -    } -    if (len2>=XRES) { -      Bar[row][col].len2=XRES; -      len2-=XRES; -    } else { -      Bar[row][col].len2=len2; -      len2=0; +  switch (type & (BAR_L | BAR_R | BAR_U | BAR_D)) { +  case BAR_L: +    len1=max-len1; +    len2=max-len2; +    rev=1; +     +  case BAR_R: +    while (max>0 && col<=Display.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++;      } -    max-=XRES; -    col++; +    break; + +  case BAR_U: +    break; + +  case BAR_D: +    break; +    }    return 0;  } @@ -379,8 +436,6 @@ int MO_flush (void)  } -#define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_S ) -  DISPLAY MatrixOrbital[] = {    { "LCD0821", 2,  8, XRES, YRES, BARS, MO_init, MO_clear, MO_put, MO_bar, MO_flush },    { "LCD1621", 2, 16, XRES, YRES, BARS, MO_init, MO_clear, MO_put, MO_bar, MO_flush }, @@ -691,7 +691,7 @@ fi  PACKAGE=lcd4linux -VERSION=0.8 +VERSION=0.9  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 9c7ea3c..487344a 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.8) +AM_INIT_AUTOMAKE(lcd4linux, 0.9)  dnl Checks for programs.  AC_PROG_CC @@ -1,4 +1,4 @@ -/* $Id: display.c,v 1.4 2000/03/10 17:36:02 reinelt Exp $ +/* $Id: display.c,v 1.5 2000/03/13 15:58:24 reinelt Exp $   *   * framework for device drivers   * @@ -20,6 +20,12 @@   *   *   * $Log: display.c,v $ + * Revision 1.5  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + *   * Revision 1.4  2000/03/10 17:36:02  reinelt   *   * first unstable but running release @@ -59,6 +65,7 @@  #include <stdlib.h>  #include <stdio.h> +#include <math.h>  #include "cfg.h"  #include "display.h" @@ -118,6 +125,12 @@ int lcd_bar (int type, int row, int col, int max, int len1, int len2)  {    if (row<1 || row>Display->rows) return -1;    if (col<1 || col>Display->cols) return -1; +  if (!(type & (BAR_H2 | BAR_V2))) len2=len1; +  if (type & BAR_LOG) { +    type &= ~BAR_LOG; +    len1=(double)max*log(len1+1)/log(max);  +    len2=(double)max*log(len2+1)/log(max);  +  }    return Display->bar(type, row-1, col-1, max, len1, len2);  } @@ -1,4 +1,4 @@ -/* $Id: display.h,v 1.5 2000/03/10 17:36:02 reinelt Exp $ +/* $Id: display.h,v 1.6 2000/03/13 15:58:24 reinelt Exp $   *   * framework for device drivers   * @@ -20,6 +20,12 @@   *   *   * $Log: display.h,v $ + * Revision 1.6  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + *   * Revision 1.5  2000/03/10 17:36:02  reinelt   *   * first unstable but running release @@ -40,11 +46,16 @@  #ifndef _DISPLAY_H_  #define _DISPLAY_H_ -#define BAR_L 1 -#define BAR_R 2 -#define BAR_U 4 -#define BAR_D 8 -#define BAR_S 16 +#define BAR_L   (1<<0) +#define BAR_R   (1<<1) +#define BAR_U   (1<<2) +#define BAR_D   (1<<3) +#define BAR_H2  (1<<4) +#define BAR_V2  (1<<5) +#define BAR_LOG (1<<6) + +#define BAR_H (BAR_L | BAR_R) +#define BAR_V (BAR_U | BAR_D)  typedef struct DISPLAY {    char name[16]; @@ -1,4 +1,4 @@ -/* $Id: isdn.c,v 1.4 2000/03/10 17:36:02 reinelt Exp $ +/* $Id: isdn.c,v 1.5 2000/03/13 15:58:24 reinelt Exp $   *   * ISDN specific functions   * @@ -20,6 +20,12 @@   *   *   * $Log: isdn.c,v $ + * Revision 1.5  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + *   * Revision 1.4  2000/03/10 17:36:02  reinelt   *   * first unstable but running release @@ -32,7 +38,6 @@   *   * minor cleanups   * - *   */  /*  @@ -56,7 +61,6 @@  #include "isdn.h"  #include "filter.h" -#include "lcd4linux.h"  typedef struct {    unsigned long in; @@ -1,4 +1,4 @@ -/* $Id: isdn.h,v 1.4 2000/03/10 17:36:02 reinelt Exp $ +/* $Id: isdn.h,v 1.5 2000/03/13 15:58:24 reinelt Exp $   *   * ISDN specific functions   * @@ -20,6 +20,12 @@   *   *   * $Log: isdn.h,v $ + * Revision 1.5  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + *   * Revision 1.4  2000/03/10 17:36:02  reinelt   *   * first unstable but running release @@ -37,6 +43,6 @@  #ifndef _ISDN_H_  #define _ISDN_H_ -int Isdn (int *rx, int *tx,int *usage); +int Isdn (int *rx, int *tx, int *usage);  #endif diff --git a/lcd4linux.c b/lcd4linux.c index dc43064..383dc45 100644 --- a/lcd4linux.c +++ b/lcd4linux.c @@ -1,4 +1,4 @@ -/* $Id: lcd4linux.c,v 1.2 2000/03/10 17:36:02 reinelt Exp $ +/* $Id: lcd4linux.c,v 1.3 2000/03/13 15:58:24 reinelt Exp $   *   * LCD4Linux   * @@ -20,6 +20,12 @@   *   *   * $Log: lcd4linux.c,v $ + * Revision 1.3  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + *   * Revision 1.2  2000/03/10 17:36:02  reinelt   *   * first unstable but running release @@ -32,10 +38,10 @@  #include <string.h>  #include <ctype.h>  #include <unistd.h> -#include <math.h>  #include "cfg.h"  #include "display.h" +#include "parser.h"  #include "system.h"  #include "isdn.h" @@ -43,380 +49,214 @@  double overload;  int tick, tack, tau; -int rows, cols, xres, yres, bars; -char *row[ROWS]; +int rows, cols, xres, yres, supported_bars; -void usage(void) +struct { double load1, load2, load3, overload; } load; +struct { double user, nice, system, idle; } busy; +struct { int read, write, total, max, peak; } disk; +struct { int rx, tx, total, max, peak; } net; +struct { int usage, in, out, total, max, peak; } isdn; + +static void usage(void)  { -  printf ("LCD4Linux " VERSION " (c) 2000 Michael Reinelt <reinelt@eunet.at>"); -  printf ("usage: lcd4linux [configuration]\n"); +  printf ("LCD4Linux V" VERSION " (c) 2000 Michael Reinelt <reinelt@eunet.at>"); +  printf ("usage: lcd4linux [config file]\n");  } -int bar_type (char tag) +static void collect_data (void)   { -  switch (tag) { -  case 'l': -    return BAR_L; -  case 'r': -    return BAR_R; -  case 'u': -    return BAR_U; -  case 'd': -    return BAR_D; -  default: -    return 0; -  } +  Busy (&busy.user, &busy.nice, &busy.system, &busy.idle); +  Load (&load.load1, &load.load2, &load.load3); + +  Disk (&disk.read, &disk.write); +  disk.total=disk.read+disk.write; +  disk.max=disk.read>disk.write?disk.read:disk.write; +  if (disk.max>disk.peak) disk.peak=disk.max; + +  Net (&net.rx, &net.tx); +  net.total=net.rx+net.tx; +  net.max=net.rx>net.tx?net.rx:net.tx; +  if (net.max>net.peak) net.peak=net.max; + +  Isdn (&isdn.in, &isdn.out, &isdn.usage); +  isdn.total=isdn.in+isdn.out; +  isdn.max=isdn.in>isdn.out?isdn.in:isdn.out; +  if (isdn.max>isdn.peak) isdn.peak=isdn.max;  } -int strpos (char *s, int c) +static double query (int token)  { -  int i; -  char *p; -  for (p=s, i=0; *p; p++, i++) { -    if (*p==c) return i; +  switch (token) { +     +  case T_LOAD_1: +    return load.load1; +  case T_LOAD_2: +    return load.load2; +  case T_LOAD_3: +    return load.load3; +     +  case T_CPU_USER: +    return busy.user; +  case T_CPU_NICE: +    return busy.nice; +  case T_CPU_SYSTEM: +    return busy.system; +  case T_CPU_BUSY: +    return 1.0-busy.idle; +  case T_CPU_IDLE: +    return busy.idle; +     +  case T_DISK_READ: +    return disk.read; +  case T_DISK_WRITE: +    return disk.write; +  case T_DISK_TOTAL: +    return disk.total; +  case T_DISK_MAX: +    return disk.max; +     +  case T_NET_RX: +    return net.rx; +  case T_NET_TX: +    return net.tx; +  case T_NET_TOTAL: +    return net.total; +  case T_NET_MAX: +    return net.max; +     +  case T_ISDN_IN: +    return isdn.in; +  case T_ISDN_OUT: +    return isdn.out; +  case T_ISDN_TOTAL: +    return isdn.total; +  case T_ISDN_MAX: +    return isdn.max; + +  case T_SENSOR_1: +  case T_SENSOR_2: +  case T_SENSOR_3: +  case T_SENSOR_4: +  case T_SENSOR_5: +  case T_SENSOR_6: +  case T_SENSOR_7: +  case T_SENSOR_8: +  case T_SENSOR_9:    } -  return -1; +  return 0.0;  } + +static double query_bar (int token) +{ +  double value=query(token); -int print4f (char *p, double val) +  switch (token) { +  case T_LOAD_1: +  case T_LOAD_2: +  case T_LOAD_3: +    return value/load.overload; +     +  case T_DISK_READ: +  case T_DISK_WRITE: +  case T_DISK_MAX: +    return value/disk.peak; +  case T_DISK_TOTAL: +    return value/disk.peak/2.0; +     +  case T_NET_RX: +  case T_NET_TX: +  case T_NET_MAX: +    return value/net.peak; +  case T_NET_TOTAL: +    return value/net.peak/2.0; +     +  case T_ISDN_IN: +  case T_ISDN_OUT: +  case T_ISDN_MAX: +    return value/isdn.peak; +  case T_ISDN_TOTAL: +    return value/isdn.peak/2.0; + +  } +  return value; +} + +void print_token (int token, char **p)  { -  if (val<10.0) { -    return sprintf (p, "%4.2f", val); -  } else if (val<100.0) { -    return sprintf (p, "%4.1f", val); -  } else { -    return sprintf (p, "%4.0f", val); +  double val; +   +  switch (token) { +  case T_PERCENT: +    *(*p)++='%'; +    break; +  case T_DOLLAR: +    *(*p)++='$'; +    break; +  case T_OS: +    *p+=sprintf (*p, "%s", System()); +    break; +  case T_RELEASE: +    *p+=sprintf (*p, "%s", Release()); +    break; +  case T_CPU: +    *p+=sprintf (*p, "%s", Processor()); +    break; +  case T_RAM: +    *p+=sprintf (*p, "%d", Memory()); +    break; +  case T_OVERLOAD: +    *(*p)++=load.load1>load.overload?'!':' '; +    break; +  case T_CPU_USER: +  case T_CPU_NICE: +  case T_CPU_SYSTEM: +  case T_CPU_BUSY: +  case T_CPU_IDLE: +    *p+=sprintf (*p, "%3.0f", 100.0*query(token)); +    break; +  default: +    val=query(token); +    if (val<10.0) { +      *p+=sprintf (*p, "%4.2f", val); +    } else if (val<100.0) { +      *p+=sprintf (*p, "%4.1f", val); +    } else { +      *p+=sprintf (*p, "%4.0f", val); +    }    }  } -char *parse (char *string) +char *process_row (int r, char *s)  { -  int pos;    static char buffer[256]; -  char *s=string;    char *p=buffer; - +      do {      if (*s=='%') { -      if (strchr("orpmlLcdDnNiIs%", *++s)==NULL) { -	fprintf (stderr, "WARNING: unknown format <%%%c> in <%s>\n", *s, string); -	continue; -      }  -      *p='%'; -      *(p+1)=*s; -      switch (*s) { -      case 'l': -	pos=strpos("123", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown Load tag <%%l%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+2)=pos+1; -	p+=3; -	break; -      case 'c': -	pos=strpos("unsi", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown CPU tag <%%c%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+2)=pos+1; -	p+=3; -	break; -      case 'd': -	pos=strpos("rwtm", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown disk tag <%%d%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+2)=pos+1; -	p+=3; -	break; -      case 'n': -	pos=strpos("iotm", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown net tag <%%n%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+2)=pos+1; -	p+=3; -	break; -      case 'i': -	pos=strpos("iotm", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown ISDN tag <%%i%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+2)=pos+1; -	p+=3; -	break; -      case 's': -	pos=strpos("123456789", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown sensor <%%s%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+2)=pos+1; -	p+=3; -	break; -      default: -	p+=2; -      } -       +      print_token (*(unsigned char*)++s, &p); +	      } else if (*s=='$') { -      char dir; -      int type; -      int len=0; -      dir=*++s; -      if (dir=='$') { -	*p++='$'; -	*p++='$'; -	continue; -      } -      if (strchr("lrud", tolower(dir))==NULL) { -	fprintf (stderr, "invalid bar direction '%c' in <%s>\n", dir, string); -	continue; -      } -      type=bar_type(tolower(dir)); -      if (type==0) { -	fprintf (stderr, "driver does not support bar type '%c'\n", dir); -	continue; -      } -      if (isdigit(*++s)) len=strtol(s, &s, 10); -      if (len<1 || len>255) { -	fprintf (stderr, "invalid bar length in <%s>\n", string); -	continue; -      } -      *p='$'; -      *(p+1)=isupper(dir)?-type:type; -      *(p+2)=len; -      *(p+3)=*s; -      switch (*s) { -      case 'l': -	pos=strpos("123", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown Load tag <$l%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+4)=pos+1; -	p+=5; -	break; -      case 'c': -	pos=strpos("unsi", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown CPU tag <$d%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+4)=pos+1; -	p+=5; -	break; -      case 'd': -	pos=strpos("rwm", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown disk tag <$d%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+4)=pos+1; -	p+=5; -	break; -      case 'n': -	pos=strpos("iom", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown net tag <$n%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+4)=pos+1; -	p+=5; -	break; -      case 'i': -	pos=strpos("iom", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown ISDN tag <$i%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+4)=pos+1; -	p+=5; -	break; -      case 's': -	pos=strpos("123456789", *++s); -	if (pos<0) { -	  fprintf (stderr, "WARNING: unknown sensor <$s%c> in <%s>\n", *s, string); -	  continue; -	}  -	*(p+4)=pos+1; -	p+=5; -	break; -      default: -	fprintf (stderr, "WARNING: unknown bar format <$%c> in <%s>\n", *s, string); -	p+=4; -      } -       -    } else if (*s=='\\') { -      unsigned int c=0; int n; -      if (*(s+1)=='\\') { -	*p++='\\'; -	s+=2; -      } else { -	sscanf (s+1, "%3o%n", &c, &n); -	if (c==0 || c>255) { -	  fprintf (stderr, "WARNING: illegal '\\' in <%s> <%s>\n", string, s); -	  continue; -	} -	*p++=c; -	s+=n; -      } -       +      int i; +      int type=*++s; +      int len=*++s; +      double val1=query_bar(*(unsigned char*)++s); +      double val2; +      if (type & (BAR_H2 | BAR_V2)) +	val2=query_bar(*(unsigned char*)++s); +      else +	val2=val1; +      lcd_bar (type, r, p-buffer+1, len*xres, val1*len*xres, val2*len*xres); +	 +      for (i=0; i<len && p-buffer<cols; i++) +	*p++='\t'; +	      } else {        *p++=*s;      } -  } while (*s++); -   -  return buffer; -} - - -void draw (int smooth) -{ -  double load[3]; -  double busy[4]; -  int disk[4]; static int disk_peak=1; -  int net[4]; static int net_peak=1; -  int isdn[4]; int isdn_usage; static int isdn_peak=1; -  char buffer[256]; -  double val; -  int i, r; -   -  Busy (&busy[0], &busy[1], &busy[2], &busy[3]); -  Load (&load[0], &load[1], &load[2]); - -  Disk (&disk[0], &disk[1]); -  disk[2]=disk[0]+disk[1]; -  disk[3]=disk[0]>disk[1]?disk[0]:disk[1]; -  if (disk[3]>disk_peak) disk_peak=disk[3]; - -  Net (&net[0], &net[1]); -  net[2]=net[0]+net[1]; -  net[3]=net[0]>net[1]?net[0]:net[1]; -  if (net[3]>net_peak) net_peak=net[3]; - -  Isdn (&isdn[0], &isdn[1], &isdn_usage); -  isdn[2]=isdn[0]+isdn[1]; -  isdn[3]=isdn[0]>isdn[1]?isdn[0]:isdn[1]; -  if (isdn[3]>isdn_peak) isdn_peak=isdn[3]; -   -  for (r=1; r<=rows; r++) { -    char *s=row[r]; -    char *p=buffer; -    do { -      if (*s=='%') { -	switch (*++s) { -	case '%': -	  *p++='%'; -	  break; -	case 'o': -	  p+=sprintf (p, "%s", System()); -	  break; -	case 'r': -	  p+=sprintf (p, "%s", Release()); -	  break; -	case 'p': -	  p+=sprintf (p, "%s", Processor()); -	  break; -	case 'm': -	  p+=sprintf (p, "%d", Memory()); -	  break; -	case 'l': -	  p+=print4f (p, load[*++s-1]); -	  break; -	case 'L': -	  *p++=load[0]>overload?'!':' '; -	  break; -	case 'c': -	  p+=sprintf (p, "%3.0f", 100.0*busy[*++s-1]); -	  break; -	case 'd': -	  p+=print4f (p, disk[*++s-1]); -	  break; -	case 'D': -	  if (disk[0]+disk[1]==0) -	    *p++=' '; -	  else -	    *p++=disk[0]>disk[1]?'\176':'\177'; -	  break; -	case 'n': -	  p+=print4f (p, net[*++s-1]/1024.0); -	  break; -	case 'N': -	  if (net[0]+net[1]==0) -	    *p++=' '; -	  else -	    *p++=net[0]>net[1]?'\176':'\177'; -	  break; -	case 'i': -	  if (isdn_usage) { -	    p+=print4f (p, isdn[*++s-1]/1024.0); -	  } else { -	    p+=sprintf (p, "----"); -	    s++; -	  } -	  break; -	case 'I': -	  if (isdn[0]+isdn[1]==0) -	    *p++=' '; -	  else -	    *p++=isdn[0]>isdn[1]?'\176':'\177'; -	  break; -	} -	 -      } else if (*s=='$') { -	int dir, len; -	if ((dir=*++s)=='$') { -	  *p++='$'; -	  continue; -	} -	len=*++s; -	switch (*++s) { -	case 'l': -	  val=load[*++s-1]/overload; -	  break; -	case  'c': -	  val=busy[*++s-1]; -	  break; -	case 'd': -	  val=disk[*++s-1]/disk_peak; -	  break; -	case 'n': -	  val=net[*++s-1]/net_peak; -	  break; -	case 'i': -	  val=isdn[*++s-1]/8000.0; -	  break; -	default: -	  val=0.0; -	} - -	if (dir>0) { -	  int bar=val*len*xres; -	  lcd_bar (dir, r, p-buffer+1, len*xres, bar, bar); -	} else { -	  double bar=len*xres*log(val*len*xres+1)/log(len*xres);  -	  lcd_bar (-dir, r, p-buffer+1, len*xres, bar, bar); -	} -	 -	for (i=0; i<len && p-buffer<cols; i++) -	  *p++='\t'; -	 -      } else { -	*p++=*s; -      } -    } while (*s++); +  } while (*s++);  -    if (smooth==0) { -      lcd_put (r, 1, buffer); -    } -  } -  lcd_flush(); +  return buffer;  } @@ -424,8 +264,8 @@ void main (int argc, char *argv[])  {    char *cfg="/etc/lcd4linux.conf";    char *display; -  int i; -  int smooth; +  char *row[ROWS]; +  int i, smooth;    if (argc>2) {      usage(); @@ -458,31 +298,38 @@ void main (int argc, char *argv[])    if (lcd_init(display)==-1) {      exit (1);    } -  lcd_query (&rows, &cols, &xres, &yres, &bars); +  lcd_query (&rows, &cols, &xres, &yres, &supported_bars);    tick=atoi(cfg_get("tick"));    tack=atoi(cfg_get("tack"));    tau=atoi(cfg_get("tau")); -  overload=atof(cfg_get("overload")); + +  load.overload=atof(cfg_get("overload"));    for (i=1; i<=rows; i++) {      char buffer[8];      snprintf (buffer, sizeof(buffer), "row%d", i); -    row[i]=strdup(parse(cfg_get(buffer))); +    row[i]=strdup(parse(cfg_get(buffer), supported_bars));    }    lcd_clear(); -  lcd_put (1,     1, "** LCD4Linux V" VERSION " **"); -  lcd_put (rows-1,1, "(c) 2000 M. Reinelt"); +  lcd_put (1, 1, "** LCD4Linux V" VERSION " **"); +  lcd_put (2, 1, " (c) 2000 M.Reinelt");    lcd_flush(); -  sleep (2); +  sleep (3);    lcd_clear();    smooth=0;    while (1) { -    draw(smooth); +    collect_data(); +    for (i=1; i<=rows; i++) { +      row[0]=process_row (i, row[i]); +      if (smooth==0) +	lcd_put (i, 1, row[0]); +    } +    lcd_flush();      smooth+=tick;      if (smooth>tack) smooth=0;      usleep(1000*tick); diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index 990a2d5..4970c9b 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -1,11 +1,17 @@  Display LCD2041  Port /dev/ttyS2 +Speed 19200  Contrast 160 -Row1 "*** %o %r ***" -Row2 "%p CPU  %m MB RAM" -Row3 "Busy %cu%% $r10cu" -Row4 "L$$D %l1%L$r10l1" +#Row1 "*** %o %r ***" +#Row2 "%p CPU  %m MB RAM" +#Row3 "Busy %cu%% $r10cs" +#Row4 "Load %l1%L$r10l1" + +Row1 "Busy %cb%% $r10cs+cb" +Row2 "Disk %dm $R10dr+dw" +Row3 "Net  %nm $R10nr+nw" +Row4 "ISDN %im $r10ii+io"  Tick 100  Tack 400 diff --git a/lcd4linux.h b/lcd4linux.h deleted file mode 100644 index e69de29..0000000 --- a/lcd4linux.h +++ /dev/null diff --git a/parser.c b/parser.c new file mode 100644 index 0000000..a3ebddb --- /dev/null +++ b/parser.c @@ -0,0 +1,208 @@ +/* $Id: parser.c,v 1.1 2000/03/13 15:58:24 reinelt Exp $ + * + * row definition parser + * + * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at) + * + * 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 + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: parser.c,v $ + * Revision 1.1  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + * + */ + +/*  + * exported functions: + * + * char *parse (char *string, int supported_bars) + *    converts a row definition from the config file + *    into the internal form using tokens + */ + +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> +#include <string.h> + +#include "display.h" +#include "parser.h" + +typedef struct { +  char *symbol; +  TOKEN token; +  int bar; +} SYMTAB; + +static SYMTAB Symtab[] = {{ "%",  T_PERCENT, 0 }, +			  { "$",  T_DOLLAR, 0 }, +			  { "o",  T_OS, 0 }, +			  { "r",  T_RELEASE, 0 }, +			  { "p",  T_CPU, 0 }, +			  { "m",  T_RAM, 0 }, +			  { "l1", T_LOAD_1, 1 }, +			  { "l2", T_LOAD_2, 1 }, +			  { "l3", T_LOAD_3, 1 }, +			  { "L",  T_OVERLOAD, 0 }, +			  { "cu", T_CPU_USER, 1 }, +			  { "cn", T_CPU_NICE, 1 }, +			  { "cs", T_CPU_SYSTEM, 1 }, +			  { "cb", T_CPU_BUSY, 1 }, +			  { "ci", T_CPU_IDLE, 1 }, +			  { "dr", T_DISK_READ, 1 }, +			  { "dw", T_DISK_WRITE, 1 }, +			  { "dt", T_DISK_TOTAL, 1 }, +			  { "dm", T_DISK_MAX, 1 }, +			  { "nr", T_NET_RX, 1 }, +			  { "nw", T_NET_TX, 1 }, +			  { "nt", T_NET_TOTAL, 1 }, +			  { "nm", T_NET_MAX, 1 }, +			  { "ii", T_ISDN_IN, 1 }, +			  { "io", T_ISDN_OUT, 1 }, +			  { "it", T_ISDN_TOTAL, 1 }, +			  { "im", T_ISDN_MAX, 1 }, +			  { "s1", T_SENSOR_1, 1 }, +			  { "s1", T_SENSOR_2, 1 }, +			  { "s2", T_SENSOR_3, 1 }, +			  { "s3", T_SENSOR_4, 1 }, +			  { "s4", T_SENSOR_5, 1 }, +			  { "s5", T_SENSOR_6, 1 }, +			  { "s6", T_SENSOR_7, 1 }, +			  { "s7", T_SENSOR_8, 1 }, +			  { "s8", T_SENSOR_9, 1 }, +			  { "",   -1 }}; + + +static int bar_type (char tag) +{ +  switch (tag) { +  case 'l': +    return BAR_L; +  case 'r': +    return BAR_R; +  case 'u': +    return BAR_U; +  case 'd': +    return BAR_D; +  default: +    return 0; +  } +} + +static TOKEN get_token (char *s, char **p, int bar) +{ +  int i; +  for (i=0; Symtab[i].token!=-1; i++) { +    int l=strlen(Symtab[i].symbol); +    if (bar && !Symtab[i].bar) continue; +    if (strncmp(Symtab[i].symbol, s, l)==0) { +      *p=s+l; +      return Symtab[i].token; +    } +  } +  return -1; +} + +char *parse (char *string, int supported_bars) +{ +  static char buffer[256]; +  char *s=string; +  char *p=buffer; +  int token, token2, type, len; + +  do { +    switch (*s) { + +    case '%': +      if ((token=get_token (s+1, &s, 0))==-1) { +	s++; +	fprintf (stderr, "WARNING: unknown token <%%%c> in <%s>\n", *s, string); +      } else { +	*p++='%'; +	*p++=token; +      } +      break; +       +    case '$': +      type=bar_type(tolower(*++s)); +      if (type==0) { +	fprintf (stderr, "WARNING: invalid bar type <$%c> in <%s>\n", *s, string); +	break; +      } +      if (!(type & supported_bars)) { +	fprintf (stderr, "WARNING: driver does not support bar type '%c'\n", *s); +	break; +      } +      if (isupper(*s)) type |= BAR_LOG; +      len=strtol(++s, &s, 10); +      if (len<1 || len>127) { +	fprintf (stderr, "WARNING: invalid bar length in <%s>\n", string); +	break; +      } +      if ((token=get_token (s, &s, 0))==-1) { +	fprintf (stderr, "WARNING: unknown token <$%c> in <%s>\n", *s, string); +	break; +      } +      token2=-1; +      if (*s=='+') { +	if ((type & BAR_H) && (supported_bars & BAR_H2)) { +	  type |= BAR_H2; +	} else if ((type & BAR_V) && (supported_bars & BAR_V2)) { +	  type |= BAR_V2; +	} else { +	  fprintf (stderr, "WARNING: driver does not support double bars\n"); +	  break; +	} +	if ((token2=get_token (s+1, &s, 0))==-1) { +	  fprintf (stderr, "WARNING: unknown token <$%c> in <%s>\n", *s, string); +	  break; +	} +      } +      *p++='$'; +      *p++=type; +      *p++=len; +      *p++=token; +      if (token2!=-1) *p++=token2; +      break; +       +    case '\\': +      if (*(s+1)=='\\') { +	*p++='\\'; +	s++; +      } else { +	unsigned int c=0; int n; +	sscanf (s+1, "%3o%n", &c, &n); +	if (c==0 || c>255) { +	  fprintf (stderr, "WARNING: illegal '\\' in <%s>\n", string); +	} else { +	  *p++=c; +	  s+=n; +	} +      } +      break; +       +    default: +      *p++=*s++; +    } +     +  } while (*s); +   +  return buffer; +} + diff --git a/parser.h b/parser.h new file mode 100644 index 0000000..959eb4d --- /dev/null +++ b/parser.h @@ -0,0 +1,48 @@ +/* $Id: parser.h,v 1.1 2000/03/13 15:58:24 reinelt Exp $ + * + * row definition parser + * + * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at) + * + * 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 + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: parser.h,v $ + * Revision 1.1  2000/03/13 15:58:24  reinelt + * + * release 0.9 + * moved row parsing to parser.c + * all basic work finished + * + */ + +#ifndef _PARSER_H_ +#define _PARSER_H_ + +typedef enum { +  T_PERCENT=128, T_DOLLAR, +  T_OS, T_RELEASE, T_CPU, T_RAM, +  T_LOAD_1, T_LOAD_2, T_LOAD_3, T_OVERLOAD,  +  T_CPU_USER, T_CPU_NICE, T_CPU_SYSTEM, T_CPU_BUSY, T_CPU_IDLE, +  T_DISK_READ, T_DISK_WRITE, T_DISK_TOTAL, T_DISK_MAX, +  T_NET_RX, T_NET_TX, T_NET_TOTAL, T_NET_MAX, +  T_ISDN_IN, T_ISDN_OUT, T_ISDN_TOTAL, T_ISDN_MAX, +  T_SENSOR_1, T_SENSOR_2, T_SENSOR_3, T_SENSOR_4, T_SENSOR_5,  +  T_SENSOR_6, T_SENSOR_7, T_SENSOR_8, T_SENSOR_9, +} TOKEN; + +char *parse (char *string, int supported_bars); + +#endif  | 
