aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--FAQ10
-rw-r--r--Makefile.am1
-rw-r--r--Makefile.in8
-rw-r--r--MatrixOrbital.c9
-rw-r--r--README.MatrixOrbital15
-rw-r--r--Skeleton.c10
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--filter.c15
-rw-r--r--lcd4linux.c378
-rw-r--r--lcd4linux.conf.sample12
-rw-r--r--processor.c393
-rw-r--r--processor.h36
13 files changed, 525 insertions, 366 deletions
diff --git a/FAQ b/FAQ
new file mode 100644
index 0000000..cdd72a7
--- /dev/null
+++ b/FAQ
@@ -0,0 +1,10 @@
+#
+# $Id: FAQ,v 1.1 2000/03/22 07:33:50 reinelt Exp $
+#
+
+lcd4linux Frequently Asked Questions
+
+Q: Where can I buy LCD's from Matrox Orbital in Germany or Austria?
+
+A: Germany: Elektronikladen (http://www.elektronikladen.de/seriallcd.html)
+ Austria: MEGATON (http://www.elektronikladen.de/ela-oesterreich.html) \ No newline at end of file
diff --git a/Makefile.am b/Makefile.am
index 8500ce5..86e6be1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -10,6 +10,7 @@ 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 \
diff --git a/Makefile.in b/Makefile.in
index 508d87f..9231301 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -68,7 +68,7 @@ CLEANFILES = *~
AM_CFLAGS = -Wall
bin_PROGRAMS = lcd4linux
-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 Skeleton.c MatrixOrbital.c
+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 Skeleton.c MatrixOrbital.c
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
@@ -80,8 +80,8 @@ DEFS = @DEFS@ -I. -I$(srcdir)
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
-lcd4linux_OBJECTS = lcd4linux.o cfg.o parser.o system.o isdn.o filter.o \
-display.o Skeleton.o MatrixOrbital.o
+lcd4linux_OBJECTS = lcd4linux.o cfg.o parser.o processor.o system.o \
+isdn.o filter.o display.o Skeleton.o MatrixOrbital.o
lcd4linux_LDADD = $(LDADD)
lcd4linux_DEPENDENCIES =
lcd4linux_LDFLAGS =
@@ -99,7 +99,7 @@ TAR = tar
GZIP_ENV = --best
DEP_FILES = .deps/MatrixOrbital.P .deps/Skeleton.P .deps/cfg.P \
.deps/display.P .deps/filter.P .deps/isdn.P .deps/lcd4linux.P \
-.deps/parser.P .deps/system.P
+.deps/parser.P .deps/processor.P .deps/system.P
SOURCES = $(lcd4linux_SOURCES)
OBJECTS = $(lcd4linux_OBJECTS)
diff --git a/MatrixOrbital.c b/MatrixOrbital.c
index 3ecefe4..e461858 100644
--- a/MatrixOrbital.c
+++ b/MatrixOrbital.c
@@ -1,4 +1,4 @@
-/* $Id: MatrixOrbital.c,v 1.8 2000/03/19 08:41:28 reinelt Exp $
+/* $Id: MatrixOrbital.c,v 1.9 2000/03/22 07:33:50 reinelt Exp $
*
* driver for Matrix Orbital serial display modules
*
@@ -20,6 +20,11 @@
*
*
* $Log: MatrixOrbital.c,v $
+ * Revision 1.9 2000/03/22 07:33:50 reinelt
+ *
+ * FAQ added
+ * new modules 'processor.c' contains all data processing
+ *
* Revision 1.8 2000/03/19 08:41:28 reinelt
*
* documentation available! README, README.MatrixOrbital, README.Drivers
@@ -96,7 +101,7 @@ static char Txt[4][40];
static BAR Bar[4][40];
static int nSegment=2;
-static SEGMENT Segment[256] = {{ len1:0, len2:0, type:255, used:0, ascii:32 },
+static SEGMENT Segment[128] = {{ len1:0, len2:0, type:255, used:0, ascii:32 },
{ len1:255, len2:255, type:255, used:0, ascii:255 }};
diff --git a/README.MatrixOrbital b/README.MatrixOrbital
index 1138b49..a8e889c 100644
--- a/README.MatrixOrbital
+++ b/README.MatrixOrbital
@@ -1,5 +1,5 @@
#
-# $Id: README.MatrixOrbital,v 1.1 2000/03/19 08:41:28 reinelt Exp $
+# $Id: README.MatrixOrbital,v 1.2 2000/03/22 07:33:50 reinelt Exp $
#
This is the README file for the MatrixOrbital display driver for lcd4linux
@@ -38,3 +38,16 @@ fails, this characters will be redefined, too.
The displays have a GPO (general purpose output), where you can connect a LED or something.
The driver supports controlling this GPO, but this function is unused by now.
+
+
+Configuration:
+
+The driver needs/supports the following entries in lcd4linux.conf:
+
+Display: a valid Matrix Orbital Display name (e.g. "LCD2041")
+Port: serial device the display is attached to (e.g. /dev/ttyS2)
+Speed: the baud rate from the display (configured via jumpers) must match
+ this value. Possible values are 1200, 2400, 9600 and 19200
+Contrast: sets the LCD display contrast to a level between 0 (light)
+ and 256 (dark). Default value: 160
+
diff --git a/Skeleton.c b/Skeleton.c
index 6522f34..566ce42 100644
--- a/Skeleton.c
+++ b/Skeleton.c
@@ -1,4 +1,4 @@
-/* $Id: Skeleton.c,v 1.1 2000/03/19 08:41:28 reinelt Exp $
+/* $Id: Skeleton.c,v 1.2 2000/03/22 07:33:50 reinelt Exp $
*
* skeleton driver for new display modules
*
@@ -20,6 +20,11 @@
*
*
* $Log: Skeleton.c,v $
+ * Revision 1.2 2000/03/22 07:33:50 reinelt
+ *
+ * FAQ added
+ * new modules 'processor.c' contains all data processing
+ *
* Revision 1.1 2000/03/19 08:41:28 reinelt
*
* documentation available! README, README.MatrixOrbital, README.Drivers
@@ -52,6 +57,9 @@ int Skel_init (DISPLAY *Self)
{
Display=*Self;
+ fprintf (stderr, "Skeleton: This driver does not drive anything!");
+ return -1;
+
Skel_clear();
return 0;
}
diff --git a/configure b/configure
index 89cc8de..e5fbb4b 100755
--- a/configure
+++ b/configure
@@ -691,7 +691,7 @@ fi
PACKAGE=lcd4linux
-VERSION=0.92
+VERSION=0.94
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 b195cb6..b960e10 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.92)
+AM_INIT_AUTOMAKE(lcd4linux, 0.94)
dnl Checks for programs.
AC_PROG_CC
diff --git a/filter.c b/filter.c
index 74ae3fd..1fbf9c2 100644
--- a/filter.c
+++ b/filter.c
@@ -1,4 +1,4 @@
-/* $Id: filter.c,v 1.2 2000/03/06 06:04:06 reinelt Exp $
+/* $Id: filter.c,v 1.3 2000/03/22 07:33:50 reinelt Exp $
*
* smooth and damp functions
*
@@ -20,11 +20,15 @@
*
*
* $Log: filter.c,v $
+ * Revision 1.3 2000/03/22 07:33:50 reinelt
+ *
+ * FAQ added
+ * new modules 'processor.c' contains all data processing
+ *
* Revision 1.2 2000/03/06 06:04:06 reinelt
*
* minor cleanups
*
- *
*/
/*
@@ -37,7 +41,6 @@
*
* damp (name, value)
* damps a value with exp(-t/tau)
- * uses global variable "tau"
*
*/
@@ -47,10 +50,10 @@
#include <math.h>
#include <sys/time.h>
+#include "cfg.h"
#include "filter.h"
extern int tick;
-extern int tau;
#define SLOTS 64
#define SECONDS(x) (x.tv_sec+x.tv_usec/1000000.0)
@@ -116,12 +119,16 @@ double smooth(char *name, int period, double value)
double damp(char *name, double value)
{
+ static int tau=-1;
static FILTER *Filter=NULL;
static int nFilter=0;
struct timeval now;
double max;
int i, j;
+ if (tau==-1)
+ tau=atoi(cfg_get("tau"));
+
if (tau==0.0)
return value;
diff --git a/lcd4linux.c b/lcd4linux.c
index f065022..cdd0370 100644
--- a/lcd4linux.c
+++ b/lcd4linux.c
@@ -1,4 +1,4 @@
-/* $Id: lcd4linux.c,v 1.7 2000/03/19 08:41:28 reinelt Exp $
+/* $Id: lcd4linux.c,v 1.8 2000/03/22 07:33:50 reinelt Exp $
*
* LCD4Linux
*
@@ -20,6 +20,11 @@
*
*
* $Log: lcd4linux.c,v $
+ * Revision 1.8 2000/03/22 07:33:50 reinelt
+ *
+ * FAQ added
+ * new modules 'processor.c' contains all data processing
+ *
* Revision 1.7 2000/03/19 08:41:28 reinelt
*
* documentation available! README, README.MatrixOrbital, README.Drivers
@@ -56,350 +61,49 @@
#include <stdlib.h>
#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
#include <unistd.h>
#include "cfg.h"
#include "display.h"
-#include "parser.h"
-#include "system.h"
-#include "isdn.h"
-
-#define ROWS 16
-
-double overload;
-int tick, tack, tau;
-int rows, cols, xres, yres, supported_bars;
+#include "processor.h"
-int token_usage[256]={0,};
-
-struct { int total, used, free, shared, buffer, cache, avail; } ram;
-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;
-struct { double val, min, max; } sensor[SENSORS];
+int tick, tack;
static void usage(void)
{
- printf ("LCD4Linux V" VERSION " (c) 2000 Michael Reinelt <reinelt@eunet.at>");
- printf ("usage: lcd4linux [config file]\n");
-}
-
-static void collect_data (void)
-{
- int i;
-
- if (token_usage[C_MEM]) {
- Ram (&ram.total, &ram.free, &ram.shared, &ram.buffer, &ram.cache);
- ram.used=ram.total-ram.free;
- ram.avail=ram.free+ram.buffer+ram.cache;
- }
-
- if (token_usage[C_LOAD]) {
- Load (&load.load1, &load.load2, &load.load3);
- }
-
- if (token_usage[C_CPU]) {
- Busy (&busy.user, &busy.nice, &busy.system, &busy.idle);
- }
-
- if (token_usage[C_DISK]) {
- 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;
- }
-
- if (token_usage[C_NET]) {
- 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;
- }
-
- if (token_usage[C_ISDN]) {
- 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;
- }
-
- for (i=1; i<SENSORS; i++) {
- if (token_usage[T_SENSOR_1+i-1]) {
- Sensor (i, &sensor[i].val, &sensor[i].min, &sensor[i].max);
- }
- }
+ printf ("LCD4Linux V" VERSION " (c) 2000 Michael Reinelt <reinelt@eunet.at>\n");
+ printf ("usage: lcd4linux [-h] [-l] [-f config-file]\n");
}
-static double query (int token)
-{
- switch (token) {
-
- case T_MEM_TOTAL:
- return ram.total;
- case T_MEM_USED:
- return ram.used;
- case T_MEM_FREE:
- return ram.free;
- case T_MEM_SHARED:
- return ram.shared;
- case T_MEM_BUFFER:
- return ram.buffer;
- case T_MEM_CACHE:
- return ram.cache;
- case T_MEM_AVAIL:
- return ram.avail;
-
- 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 sensor[token-T_SENSOR_1+1].val;
- }
- return 0.0;
-}
-
-static double query_bar (int token)
-{
- int i;
- double value=query(token);
-
- switch (token) {
-
- case T_MEM_TOTAL:
- case T_MEM_USED:
- case T_MEM_FREE:
- case T_MEM_SHARED:
- case T_MEM_BUFFER:
- case T_MEM_CACHE:
- case T_MEM_AVAIL:
- return value/ram.total;
-
- 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;
-
- 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:
- i=token-T_SENSOR_1+1;
- return (value-sensor[i].min)/(sensor[i].max-sensor[i].min);
- }
- return value;
-}
-
-void print_token (int token, char **p)
-{
- 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_MEM_TOTAL:
- case T_MEM_USED:
- case T_MEM_FREE:
- case T_MEM_SHARED:
- case T_MEM_BUFFER:
- case T_MEM_CACHE:
- case T_MEM_AVAIL:
- *p+=sprintf (*p, "%6.0f", query(token));
- break;
- case T_LOAD_1:
- case T_LOAD_2:
- case T_LOAD_3:
- 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:
- 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);
- }
- 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;
- case T_ISDN_IN:
- case T_ISDN_OUT:
- case T_ISDN_MAX:
- case T_ISDN_TOTAL:
- if (isdn.usage)
- *p+=sprintf (*p, "%4.0f", query(token));
- else
- *p+=sprintf (*p, "----");
- break;
- default:
- *p+=sprintf (*p, "%4.0f", query(token));
- }
-}
-
-char *process_row (int r, char *s)
-{
- static char buffer[256];
- char *p=buffer;
-
- do {
- if (*s=='%') {
- print_token (*(unsigned char*)++s, &p);
-
- } else if (*s=='$') {
- int i;
- int type=*++s;
- int len=*++s;
- double val1=query_bar(*(unsigned char*)++s);
- double val2=val1;
- if (type & (BAR_H2 | BAR_V2))
- val2=query_bar(*(unsigned char*)++s);
- if (type & BAR_H)
- lcd_bar (type, r, p-buffer+1, len*xres, val1*len*xres, val2*len*xres);
- else
- lcd_bar (type, r, p-buffer+1, len*yres, val1*len*yres, val2*len*yres);
-
- if (type & BAR_H) {
- for (i=0; i<len && p-buffer<cols; i++)
- *p++='\t';
- } else {
- *p++='\t';
- }
-
- } else {
- *p++=*s;
- }
-
- } while (*s++);
-
- return buffer;
-}
-
-
void main (int argc, char *argv[])
{
char *cfg="/etc/lcd4linux.conf";
char *display;
- char *row[ROWS];
- int i, smooth;
-
- if (argc>2) {
- usage();
- exit (2);
+ int c, smooth;
+
+ while ((c=getopt (argc, argv, "hlf:"))!=EOF) {
+ switch (c) {
+ case 'h':
+ usage();
+ exit(0);
+ case 'l':
+ usage();
+ exit(0);
+ case 'f':
+ cfg=optarg;
+ break;
+ default:
+ exit(2);
+ }
}
- if (argc==2) {
- cfg=argv[1];
+
+ if (optind < argc) {
+ fprintf (stderr, "%s: illegal option %s\n", argv[0], argv[optind]);
+ exit(2);
}
+ // set default values
+
cfg_set ("row1", "*** %o %v ***");
cfg_set ("row2", "%p CPU %r MB RAM");
cfg_set ("row3", "Busy %cu%% $r10cu");
@@ -423,19 +127,11 @@ void main (int argc, char *argv[])
if (lcd_init(display)==-1) {
exit (1);
}
- lcd_query (&rows, &cols, &xres, &yres, &supported_bars);
tick=atoi(cfg_get("tick"));
tack=atoi(cfg_get("tack"));
- tau=atoi(cfg_get("tau"));
- 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), supported_bars, token_usage));
- }
+ process_init();
lcd_clear();
lcd_put (1, 1, "** LCD4Linux V" VERSION " **");
@@ -447,13 +143,7 @@ void main (int argc, char *argv[])
smooth=0;
while (1) {
- 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();
+ process (smooth);
smooth+=tick;
if (smooth>tack) smooth=0;
usleep(tick*1000);
diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample
index 688cc23..783ea8b 100644
--- a/lcd4linux.conf.sample
+++ b/lcd4linux.conf.sample
@@ -8,15 +8,11 @@ Contrast 160
#Row3 "Busy %cu%% $r10cs+cb"
#Row4 "Load %l1%L$r10l1"
-#Row1 "Load %l1%L$r10cs+cb"
-#Row2 "Disk %dm $R10dr+dw"
-#Row3 "Net %nm $R10nr+nw"
-#Row4 "ISDN %im $r10ii+io"
-
Row1 "Load %l1%L$r10cs+cb"
-Row2 "Temp %s2\337$r10s1+s2"
-Row3 "Disk %dm $R10dr+dw"
-Row4 "Net %nm $R10nr+nw"
+Row2 "Disk %dm $R10dr+dw"
+Row3 "Net %nm $R10nr+nw"
+Row4 "ISDN %im $r10ii+io"
+Row5 "Temp %s2\337$r10s1+s2"
#Row1 "$u3l1$u3cb$u3cs $u3mu$u3ma$u3ms $u3dr$u3dw $u3nr$u3nw $u3ii$u3io"
#Row2 " "
diff --git a/processor.c b/processor.c
new file mode 100644
index 0000000..6c95208
--- /dev/null
+++ b/processor.c
@@ -0,0 +1,393 @@
+/* $Id: processor.c,v 1.1 2000/03/22 07:33:50 reinelt Exp $
+ *
+ * main data processing
+ *
+ * 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: processor.c,v $
+ * Revision 1.1 2000/03/22 07:33:50 reinelt
+ *
+ * FAQ added
+ * new modules 'processor.c' contains all data processing
+ *
+ */
+
+/*
+ * exported functions:
+ *
+ * void process_init (void);
+ * does all necessary initializations
+ *
+ * void process (int smooth);
+ * processes a whole screen
+ * bars will always be processed
+ * texts only if smooth=0
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "cfg.h"
+#include "system.h"
+#include "isdn.h"
+#include "parser.h"
+#include "display.h"
+#include "processor.h"
+
+
+#define ROWS 16
+
+char *row[ROWS];
+int rows, cols, xres, yres, supported_bars;
+int token_usage[256]={0,};
+
+struct { int total, used, free, shared, buffer, cache, avail; } ram;
+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;
+struct { double val, min, max; } sensor[SENSORS];
+
+
+static double query (int token)
+{
+ switch (token) {
+
+ case T_MEM_TOTAL:
+ return ram.total;
+ case T_MEM_USED:
+ return ram.used;
+ case T_MEM_FREE:
+ return ram.free;
+ case T_MEM_SHARED:
+ return ram.shared;
+ case T_MEM_BUFFER:
+ return ram.buffer;
+ case T_MEM_CACHE:
+ return ram.cache;
+ case T_MEM_AVAIL:
+ return ram.avail;
+
+ 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 sensor[token-T_SENSOR_1+1].val;
+ }
+ return 0.0;
+}
+
+static double query_bar (int token)
+{
+ int i;
+ double value=query(token);
+
+ switch (token) {
+
+ case T_MEM_TOTAL:
+ case T_MEM_USED:
+ case T_MEM_FREE:
+ case T_MEM_SHARED:
+ case T_MEM_BUFFER:
+ case T_MEM_CACHE:
+ case T_MEM_AVAIL:
+ return value/ram.total;
+
+ 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;
+
+ 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:
+ i=token-T_SENSOR_1+1;
+ return (value-sensor[i].min)/(sensor[i].max-sensor[i].min);
+ }
+ return value;
+}
+
+static void print_token (int token, char **p)
+{
+ 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_MEM_TOTAL:
+ case T_MEM_USED:
+ case T_MEM_FREE:
+ case T_MEM_SHARED:
+ case T_MEM_BUFFER:
+ case T_MEM_CACHE:
+ case T_MEM_AVAIL:
+ *p+=sprintf (*p, "%6.0f", query(token));
+ break;
+ case T_LOAD_1:
+ case T_LOAD_2:
+ case T_LOAD_3:
+ 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:
+ 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);
+ }
+ 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;
+ case T_ISDN_IN:
+ case T_ISDN_OUT:
+ case T_ISDN_MAX:
+ case T_ISDN_TOTAL:
+ if (isdn.usage)
+ *p+=sprintf (*p, "%4.0f", query(token));
+ else
+ *p+=sprintf (*p, "----");
+ break;
+ default:
+ *p+=sprintf (*p, "%4.0f", query(token));
+ }
+}
+
+static void collect_data (void)
+{
+ int i;
+
+ if (token_usage[C_MEM]) {
+ Ram (&ram.total, &ram.free, &ram.shared, &ram.buffer, &ram.cache);
+ ram.used=ram.total-ram.free;
+ ram.avail=ram.free+ram.buffer+ram.cache;
+ }
+
+ if (token_usage[C_LOAD]) {
+ Load (&load.load1, &load.load2, &load.load3);
+ }
+
+ if (token_usage[C_CPU]) {
+ Busy (&busy.user, &busy.nice, &busy.system, &busy.idle);
+ }
+
+ if (token_usage[C_DISK]) {
+ 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;
+ }
+
+ if (token_usage[C_NET]) {
+ 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;
+ }
+
+ if (token_usage[C_ISDN]) {
+ 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;
+ }
+
+ for (i=1; i<SENSORS; i++) {
+ if (token_usage[T_SENSOR_1+i-1]) {
+ Sensor (i, &sensor[i].val, &sensor[i].min, &sensor[i].max);
+ }
+ }
+}
+
+static char *process_row (int r)
+{
+ static char buffer[256];
+ char *s=row[r];
+ char *p=buffer;
+
+ do {
+ if (*s=='%') {
+ print_token (*(unsigned char*)++s, &p);
+
+ } else if (*s=='$') {
+ int i;
+ int type=*++s;
+ int len=*++s;
+ double val1=query_bar(*(unsigned char*)++s);
+ double val2=val1;
+ if (type & (BAR_H2 | BAR_V2))
+ val2=query_bar(*(unsigned char*)++s);
+ if (type & BAR_H)
+ lcd_bar (type, r, p-buffer+1, len*xres, val1*len*xres, val2*len*xres);
+ else
+ lcd_bar (type, r, p-buffer+1, len*yres, val1*len*yres, val2*len*yres);
+
+ if (type & BAR_H) {
+ for (i=0; i<len && p-buffer<cols; i++)
+ *p++='\t';
+ } else {
+ *p++='\t';
+ }
+
+ } else {
+ *p++=*s;
+ }
+
+ } while (*s++);
+
+ return buffer;
+}
+
+void process_init (void)
+{
+ int i;
+ char buffer[8];
+
+ load.overload=atof(cfg_get("overload"));
+ lcd_query (&rows, &cols, &xres, &yres, &supported_bars);
+
+ for (i=1; i<=rows; i++) {
+ snprintf (buffer, sizeof(buffer), "row%d", i);
+ row[i]=strdup(parse(cfg_get(buffer), supported_bars, token_usage));
+ }
+}
+
+void process (int smooth)
+{
+ int i;
+ char *txt;
+
+ collect_data();
+ for (i=1; i<=rows; i++) {
+ txt=process_row (i);
+ if (smooth==0)
+ lcd_put (i, 1, txt);
+ }
+ lcd_flush();
+}
diff --git a/processor.h b/processor.h
new file mode 100644
index 0000000..eb489a4
--- /dev/null
+++ b/processor.h
@@ -0,0 +1,36 @@
+/* $Id: processor.h,v 1.1 2000/03/22 07:33:50 reinelt Exp $
+ *
+ * main data processing
+ *
+ * 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: processor.h,v $
+ * Revision 1.1 2000/03/22 07:33:50 reinelt
+ *
+ * FAQ added
+ * new modules 'processor.c' contains all data processing
+ *
+ */
+
+#ifndef _PROCESSOR_H_
+#define _PROCESSOR_H_
+
+void process_init (void);
+void process (int smooth);
+
+#endif