-/* $Id: Crystalfontz.c,v 1.13 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: Crystalfontz.c,v 1.14 2003/09/09 06:54:43 reinelt Exp $
*
* driver for display modules from Crystalfontz
*
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: Crystalfontz.c,v $
+ * Revision 1.14 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.13 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
char buffer[3];
int backlight;
- backlight=atoi(cfg_get("Backlight","0"));
+ if (cfg_number("Backlight", 0, 0, 100, &backlight)<0) return -1;
snprintf (buffer, 3, "\016%c", backlight);
CF_write (buffer, 2);
return 0;
char buffer[3];
int contrast;
- contrast=atoi(cfg_get("Contrast","50"));
+ if (cfg_number("Contrast", 50, 0, 100, &contrast)<0) return -1;
snprintf (buffer, 3, "\017%c", contrast);
CF_write (buffer, 2);
return 0;
static int CF_init (LCD *Self)
{
char *port;
- char *speed;
+ int speed;
Lcd=*Self;
}
Port=strdup(port);
- speed=cfg_get("Speed","19200");
- switch (atoi(speed)) {
+ if (cfg_number("Speed", 19200, 1200,19200, &speed)<0) return -1;
+
+ switch (speed) {
case 1200:
Speed=B1200;
break;
Speed=B19200;
break;
default:
- error ("Crystalfontz: unsupported speed '%s' in %s", speed, cfg_source());
+ error ("Crystalfontz: unsupported speed '%d' in %s", speed, cfg_source());
return -1;
}
- debug ("using port %s at %d baud", Port, atoi(speed));
+ debug ("using port %s at %d baud", Port, speed);
Device=CF_open();
if (Device==-1) return -1;
-/* $Id: Cwlinux.c,v 1.12 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: Cwlinux.c,v 1.13 2003/09/09 06:54:43 reinelt Exp $
*
* driver for Cwlinux serial display modules
*
*
*
* $Log: Cwlinux.c,v $
+ * Revision 1.13 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.12 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
{
int level;
char cmd[5]="\376A_\375";
-
- level=atoi(cfg_get("Brightness","8"));
- if (level<0) level=0;
- if (level>8) level=8;
+
+ if (cfg_number("Brightness", 8, 0, 8, &level)<0) return;
switch (level) {
case 0:
int CW_init(LCD * Self)
{
char *port;
- char *speed;
+ int speed;
// char buffer[16];
Lcd = *Self;
}
Port = strdup(port);
- speed = cfg_get("Speed","19200");
-
- switch (atoi(speed)) {
+ if (cfg_number("Speed", 19200, 9600,19200, &speed)<0) return -1;
+ switch (speed) {
case 9600:
Speed = B9600;
break;
Speed = B19200;
break;
default:
- error("Cwlinux: unsupported speed '%s' in %s", speed, cfg_source());
+ error("Cwlinux: unsupported speed '%d' in %s", speed, cfg_source());
return -1;
}
- debug("using port %s at %d baud", Port, atoi(speed));
+ debug("using port %s at %d baud", Port, speed);
Device = CW_open();
if (Device == -1)
-/* $Id: HD44780.c,v 1.36 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: HD44780.c,v 1.37 2003/09/09 06:54:43 reinelt Exp $
*
* driver for display modules based on the HD44780 chip
*
*
*
* $Log: HD44780.c,v $
+ * Revision 1.37 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.36 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
int HD_init (LCD *Self)
{
int rows=-1, cols=-1, gpos=-1;
- char *s, *e;
+ char *s;
s=cfg_get("Size",NULL);
if (s==NULL || *s=='\0') {
error ("HD44780: bad size '%s'",s);
return -1;
}
-
- s=cfg_get ("GPOs",NULL);
- if (s==NULL) {
- gpos=0;
- }
- else {
- gpos=strtol(s, &e, 0);
- if (*e!='\0' || gpos<0 || gpos>8) {
- error ("HD44780: bad GPOs '%s' in %s", s, cfg_source());
- return -1;
- }
- }
- s=cfg_get("Controllers", "1");
- Controllers=strtol(s, &e, 0);
- if (*e!='\0' || Controllers<1 || Controllers>2) {
- error ("HD44780: bad Controllers '%s' in %s, should be '1' or '2'", s, cfg_source());
- return -1;
- }
+ if (cfg_number("GPOs", 0, 0, 8, &gpos)<0) return -1;
+ info ("HD44780: controlling %d GPO's", gpos);
+
+ if (cfg_number("Controllers", 1, 1, 2, &Controllers)<0) return -1;
info ("wiring: using display with %d controllers", Controllers);
// current controller
Controller=1;
-
+
Self->rows=rows;
Self->cols=cols;
Self->gpos=gpos;
error ("HD44780: framebuffer could not be allocated: malloc() failed");
return -1;
}
-
- s=cfg_get("Bits", "8");
- Bits=strtol(s, &e, 0);
- if (*e!='\0' || (Bits!=4 && Bits!=8)) {
+
+ if (cfg_number("Bits", 8, 4, 8, &Bits)<0) return -1;
+ if (Bits!=4 && Bits!=8) {
error ("HD44780: bad Bits '%s' in %s, should be '4' or '8'", s, cfg_source());
return -1;
}
info ("wiring: using %d bit mode", Bits);
-
+
if (Bits==8) {
if ((SIGNAL_RS = parport_wire_ctrl ("RS", "AUTOFD"))==0xff) return -1;
if ((SIGNAL_RW = parport_wire_ctrl ("RW", "GND") )==0xff) return -1;
-/* $Id: M50530.c,v 1.12 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: M50530.c,v 1.13 2003/09/09 06:54:43 reinelt Exp $
*
* driver for display modules based on the M50530 chip
*
*
*
* $Log: M50530.c,v $
+ * Revision 1.13 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.12 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
int M5_init (LCD *Self)
{
int rows=-1, cols=-1, gpos=-1;
- char *s, *e;
+ char *s;
s=cfg_get("Size",NULL);
if (s==NULL || *s=='\0') {
return -1;
}
- s=cfg_get ("GPOs",NULL);
- if (s==NULL) {
- gpos=0;
- } else {
- gpos=strtol(s, &e, 0);
- if (*e!='\0' || gpos<0 || gpos>8) {
- error ("M50530: bad GPOs '%s' in %s", s, cfg_source());
- return -1;
- }
- }
+ if (cfg_number("GPOs", 0, 0, 8, &gpos)<0) return -1;
Self->rows=rows;
Self->cols=cols;
-/* $Id: MatrixOrbital.c,v 1.36 2003/09/09 05:30:33 reinelt Exp $
+/* $Id: MatrixOrbital.c,v 1.37 2003/09/09 06:54:43 reinelt Exp $
*
* driver for Matrix Orbital serial display modules
*
*
*
* $Log: MatrixOrbital.c,v $
+ * Revision 1.37 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.36 2003/09/09 05:30:33 reinelt
* even more icons stuff
*
char buffer[4];
int contrast;
- contrast=atoi(cfg_get("Contrast","160"));
+ if (cfg_number("Contrast", 160, 0, 255, &contrast)<0) return -1;
snprintf (buffer, 4, "\376P%c", contrast);
MO_write (buffer, 3);
return 0;
static int MO_init (LCD *Self, int protocol)
{
char *port;
- char *s, *e;
+ int speed;
Lcd=*Self;
}
Port=strdup(port);
- s=cfg_get("Speed","19200");
-
- switch (atoi(s)) {
+ if (cfg_number("Speed", 19200, 1200,19200, &speed)<0) return -1;
+ switch (speed) {
case 1200:
Speed=B1200;
break;
Speed=B19200;
break;
default:
- error ("MatrixOrbital: unsupported speed '%s' in %s", s, cfg_source());
+ error ("MatrixOrbital: unsupported speed '%d' in %s", speed, cfg_source());
return -1;
}
-
- debug ("using port %s at %d baud", Port, atoi(s));
-
+
+ debug ("using port %s at %d baud", Port, speed);
+
Device=MO_open();
if (Device==-1) return -1;
- s=cfg_get("Icons", "0");
- Icons=strtol(s, &e, 0);
- if (*e!='\0' || Icons<0 || Icons>8) {
- error ("MatrixOrbital: bad Icons '%s' in %s, must be between 0 and 8", s, cfg_source());
- return -1;
- }
+ if (cfg_number("Icons", 0, 0, 8, &Icons)<0) return -1;
if (Icons>0) {
info ("reserving %d of %d user-defined characters for icons", Icons, CHARS);
icon_init(Lcd.rows, Lcd.cols, XRES, YRES, CHARS, Icons, MO_define_char);
Self->icons=Icons;
Lcd.icons=Icons;
}
-
+
bar_init(Lcd.rows, Lcd.cols, XRES, YRES, CHARS-Icons);
bar_add_segment( 0, 0,255, 32); // ASCII 32 = blank
bar_add_segment(255,255,255,255); // ASCII 255 = block
-/* $Id: PalmPilot.c,v 1.11 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: PalmPilot.c,v 1.12 2003/09/09 06:54:43 reinelt Exp $
*
* driver for 3Com Palm Pilot
*
*
*
* $Log: PalmPilot.c,v $
+ * Revision 1.12 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.11 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
int Palm_init (LCD *Self)
{
- char *port, *speed, *s;
+ char *port, *s;
+ int speed;
int rows=-1, cols=-1;
int xres=1, yres=-1;
}
Port=strdup(port);
- speed=cfg_get("Speed","19200");
+ if (cfg_number("Speed", 19200, 1200,19200, &speed)<0) return -1;
- switch (atoi(speed)) {
+ switch (speed) {
case 1200:
Speed=B1200;
break;
Speed=B19200;
break;
default:
- error ("PalmPilot: unsupported speed '%s' in %s", speed, cfg_source());
+ error ("PalmPilot: unsupported speed '%d' in %s", speed, cfg_source());
return -1;
}
- debug ("using port %s at %d baud", Port, atoi(speed));
+ debug ("using port %s at %d baud", Port, speed);
if (sscanf(s=cfg_get("size","20x4"), "%dx%d", &cols, &rows)!=2 || rows<1 || cols<1) {
error ("PalmPilot: bad size '%s'", s);
if (rgap<0) rgap=pixel+pgap;
if (cgap<0) cgap=pixel+pgap;
- border=atoi(cfg_get("border","0"));
+ if (cfg_number("border", 0, 0, 1000000, &border)<0) return -1;
if (pix_init (rows, cols, xres, yres)!=0) {
error ("PalmPilot: pix_init(%d, %d, %d, %d) failed", rows, cols, xres, yres);
-/* $Id: Raster.c,v 1.25 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: Raster.c,v 1.26 2003/09/09 06:54:43 reinelt Exp $
*
* driver for raster formats
*
*
*
* $Log: Raster.c,v $
+ * Revision 1.26 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.25 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
if (rgap<0) rgap=pixel+pgap;
if (cgap<0) cgap=pixel+pgap;
- border=atoi(cfg_get("border","0"));
+ if (cfg_number("border", 0, 0, 1000000, &border)<0) return -1;
if (sscanf(s=cfg_get("foreground","#102000"), "#%x", &foreground)!=1) {
error ("Raster: bad foreground color '%s'", s);
-/* $Id: USBLCD.c,v 1.13 2003/09/09 05:30:34 reinelt Exp $
+/* $Id: USBLCD.c,v 1.14 2003/09/09 06:54:43 reinelt Exp $
*
* Driver for USBLCD ( see http://www.usblcd.de )
* This Driver is based on HD44780.c
*
*
* $Log: USBLCD.c,v $
+ * Revision 1.14 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.13 2003/09/09 05:30:34 reinelt
* even more icons stuff
*
int USBLCD_init (LCD *Self)
{
int rows=-1, cols=-1 ;
- char *port, *s, *e;
+ char *port, *s;
if (Port) {
free(Port);
if (USBLCD_open()!=0)
return -1;
- s=cfg_get("Icons", "0");
- Icons=strtol(s, &e, 0);
- if (*e!='\0' || Icons<0 || Icons>8) {
- debug ("Icons=%d e=<%s>", Icons, e);
- error ("USBLCD: bad Icons '%s' in %s, must be between 0 and 8", s, cfg_source());
- return -1;
- }
+ if (cfg_number("Icons", 0, 0, 8, &Icons)<0) return -1;
if (Icons>0) {
info ("reserving %d of %d user-defined characters for icons", Icons, CHARS);
icon_init(Lcd.rows, Lcd.cols, XRES, YRES, CHARS, Icons, USBLCD_define_char);
{
int row, col, pos1, pos2;
int c, equal;
- static int junk=0; //Fixme
bar_process(USBLCD_define_char);
-/* $Id: XWindow.c,v 1.32 2003/07/24 04:48:09 reinelt Exp $
+/* $Id: XWindow.c,v 1.33 2003/09/09 06:54:43 reinelt Exp $
*
* X11 Driver for LCD4Linux
*
*
*
* $Log: XWindow.c,v $
+ * Revision 1.33 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.32 2003/07/24 04:48:09 reinelt
* 'soft clear' needed for virtual rows
*
}
if (rgap<0) rgap=pixel+pgap;
if (cgap<0) cgap=pixel+pgap;
- border=atoi(cfg_get("border","0"));
+
+ if (cfg_number("border", 0, 0, 1000000, &border)<0) return -1;
+
rgbfg=cfg_get("foreground","#000000");
rgbbg=cfg_get("background","#80d000");
rgbhg=cfg_get("halfground","#70c000");
-/* $Id: cfg.c,v 1.15 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: cfg.c,v 1.16 2003/09/09 06:54:43 reinelt Exp $
*
* config file stuff
*
*
*
* $Log: cfg.c,v $
+ * Revision 1.16 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.15 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
#include "debug.h"
#include "cfg.h"
+
typedef struct {
char *key;
char *val;
int lock;
} ENTRY;
+
static char *Config_File=NULL;
static ENTRY *Config=NULL;
static int nConfig=0;
return s;
}
+
static char *dequote (char *string)
{
char *s=string;
return string;
}
+
static void cfg_add (char *key, char *val, int lock)
{
int i;
Config[i].lock=lock;
}
+
int l4l_cfg_cmd (char *arg)
{
char *key, *val;
return 0;
}
+
char *l4l_cfg_get (char *key, char *defval)
{
int i;
return defval;
}
+
+int l4l_cfg_number (char *key, int defval, int min, int max, int *value)
+{
+
+ char *s, *e;
+
+ s=cfg_get(key, NULL);
+ if (s==NULL) {
+ *value=defval;
+ return 0;
+ }
+
+ *value=strtol(s, &e, 0);
+ if (*e!='\0') {
+ error ("bad %s entry '%s' in %s", key, s, cfg_source());
+ return -1;
+ }
+
+ if (*value<min) {
+ error ("bad %s value '%s' in %s, minimum is %d", key, s, cfg_source(), min);
+ return -1;
+ }
+
+ if (*value>max) {
+ error ("bad %s value '%s' in %s, maximum is %d", key, s, cfg_source(), max);
+ return -1;
+ }
+
+ return 0;
+}
+
+
static int check_cfg_source(char *file)
{
/* as passwords and commands are stored in the config file,
return error;
}
+
int l4l_cfg_init (char *file)
{
FILE *stream;
return 0;
}
+
char *l4l_cfg_source (void)
{
if (Config_File)
}
-int (*cfg_init) (char *source) = l4l_cfg_init;
-char *(*cfg_source) (void) = l4l_cfg_source;
-int (*cfg_cmd) (char *arg) = l4l_cfg_cmd;
-char *(*cfg_get) (char *key, char *defval) = l4l_cfg_get;
-
+int (*cfg_init) (char *source) = l4l_cfg_init;
+char *(*cfg_source) (void) = l4l_cfg_source;
+int (*cfg_cmd) (char *arg) = l4l_cfg_cmd;
+char *(*cfg_get) (char *key, char *defval) = l4l_cfg_get;
+int (*cfg_number) (char *key, int defval,
+ int min, int max, int *value) = l4l_cfg_number;
-/* $Id: cfg.h,v 1.4 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: cfg.h,v 1.5 2003/09/09 06:54:43 reinelt Exp $
*
* config file stuff
*
*
*
* $Log: cfg.h,v $
+ * Revision 1.5 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.4 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
extern char *(*cfg_source) (void);
extern int (*cfg_cmd) (char *arg);
extern char *(*cfg_get) (char *key, char *defval);
+extern int (*cfg_number) (char *key, int defval,
+ int min, int max, int *value);
int l4l_cfg_init (char *file);
char *l4l_cfg_source (void);
int l4l_cfg_cmd (char *arg);
char *l4l_cfg_get (char *key, char *defval);
+int l4l_cfg_number (char *key, int defval,
+ int min, int max, int *value);
#endif
-/* $Id: filter.c,v 1.6 2003/02/22 07:53:10 reinelt Exp $
+/* $Id: filter.c,v 1.7 2003/09/09 06:54:43 reinelt Exp $
*
* smooth and damp functions
*
*
*
* $Log: filter.c,v $
+ * Revision 1.7 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.6 2003/02/22 07:53:10 reinelt
* cfg_get(key,defval)
*
double max;
int i, j;
- if (tau==-1)
- tau=atoi(cfg_get("tau","500"));
-
+ if (tau==-1)
+ if (cfg_number("tau", 500, 0, 1000000, &tau)<0) tau=0.0;
+
if (tau==0.0)
return value;
-/* $Id: lcd4linux.c,v 1.45 2003/09/09 05:30:34 reinelt Exp $
+/* $Id: lcd4linux.c,v 1.46 2003/09/09 06:54:43 reinelt Exp $
*
* LCD4Linux
*
*
*
* $Log: lcd4linux.c,v $
+ * Revision 1.46 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.45 2003/09/09 05:30:34 reinelt
* even more icons stuff
*
char *release="LCD4Linux " VERSION " (c) 2003 Michael Reinelt <reinelt@eunet.at>";
char **my_argv;
+int tick;
int got_signal=0;
extern char* output;
{
char *cfg="/etc/lcd4linux.conf";
char *driver;
- char *s, *e;
int c;
- int tick;
int quiet=0;
// save arguments for restart
signal(SIGQUIT, handler);
signal(SIGTERM, handler);
- s=cfg_get("tick", "100");
- tick=strtol(s, &e, 0);
- if (*e!='\0' || tick<0) {
- error ("bad tick entry '%s' in %s", s, cfg_source());
+ if (cfg_number("Tick", 100, 1, 1000000, &tick)<0) {
pid_exit(PIDFILE);
exit (1);
}
-/* $Id: parport.c,v 1.7 2003/08/24 05:17:58 reinelt Exp $
+/* $Id: parport.c,v 1.8 2003/09/09 06:54:43 reinelt Exp $
*
* generic parallel port handling
*
*
*
* $Log: parport.c,v $
+ * Revision 1.8 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.7 2003/08/24 05:17:58 reinelt
* liblcd4linux patch from Patrick Schemitz
*
int parport_open (void)
{
char *s, *e;
-
+
#ifdef USE_OLD_UDELAY
- s=cfg_get ("Delay",NULL);
- if (s==NULL || *s=='\0') {
- error ("parport: no 'Delay' entry in %s", cfg_source());
- return -1;
- }
- if ((loops_per_usec=strtol(s, &e, 0))==0 || *e!='\0') {
- error ("parport: bad delay '%s' in %s", s, cfg_source());
- return -1;
- }
+ if (cfg_number("Delay", 0, 1, 1000000000, &loops_per_usec)<0) return -1;
#else
udelay_init();
#endif
-/* $Id: processor.c,v 1.39 2003/09/09 05:30:34 reinelt Exp $
+/* $Id: processor.c,v 1.40 2003/09/09 06:54:43 reinelt Exp $
*
* main data processing
*
*
*
* $Log: processor.c,v $
+ * Revision 1.40 2003/09/09 06:54:43 reinelt
+ * new function 'cfg_number()'
+ *
* Revision 1.39 2003/09/09 05:30:34 reinelt
* even more icons stuff
*
debug ("Display: %d rows, %d columns, %dx%d pixels, %d icons, %d GPOs", rows, cols, xres, yres, icons, gpos);
- lines=atoi(cfg_get("Rows","1"));
- if (lines<1) {
- error ("bad 'Rows' entry in %s, ignoring.", cfg_source());
+ if (cfg_number("Rows", 1, 1, 1000, &lines)<0) {
lines=1;
+ error ("ignoring bad 'Rows' value and using '%d'", lines);
}
if (lines>ROWS) {
error ("%d virtual rows exceeds limit, reducing to %d rows", lines, ROWS);
lines=ROWS;
}
if (lines>rows) {
- scroll=atoi(cfg_get("Scroll","1"));
- if (scroll<1) {
- error ("bad 'Scroll' entry in %s, ignoring and using '1'", cfg_source());
+ if (cfg_number("Scroll", 1, 1, 1000, &scroll)<0) {
scroll=1;
+ error ("ignoring bad 'Scroll' value and using '%d'", scroll);
}
if (scroll>rows) {
error ("'Scroll' entry in %s is %d, > %d display rows.", cfg_source(), scroll, rows);
error ("This may lead to unexpected results!");
}
- turn=atoi(cfg_get("Turn","1000"));
- if (turn<1) {
- error ("bad 'Turn' entry in %s, ignoring and using '1000'", cfg_source());
- turn=1;
+ if (cfg_number("Turn", 1000, 1, 1000000, &turn)<0) {
+ turn=1000;
+ error ("ignoring bad 'Scroll' value and using '%d'", turn);
}
debug ("Virtual: %d rows, scroll %d lines every %d msec", lines, scroll, turn);
} else {
char *txt;
static int offset=0;
+ // Fixme: smooth has gone...
+ int smooth=0;
+
collect_data();
if (smooth==0 && Turn()) {