mirror of
https://github.com/netfun2000/lcd4linux.git
synced 2026-02-27 09:44:34 +08:00
[lcd4linux @ 2001-02-14 07:40:16 by reinelt]
first (incomplete) GPO implementation git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@80 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
This commit is contained in:
52
HD44780.c
52
HD44780.c
@@ -1,4 +1,4 @@
|
||||
/* $Id: HD44780.c,v 1.11 2001/02/13 12:43:24 reinelt Exp $
|
||||
/* $Id: HD44780.c,v 1.12 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* driver for display modules based on the HD44780 chip
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: HD44780.c,v $
|
||||
* Revision 1.12 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.11 2001/02/13 12:43:24 reinelt
|
||||
*
|
||||
* HD_gpo() was missing
|
||||
@@ -137,6 +141,7 @@ static unsigned short Port=0;
|
||||
|
||||
static char Txt[4][40];
|
||||
static BAR Bar[4][40];
|
||||
static int GPO=0;
|
||||
|
||||
static int nSegment=2;
|
||||
static SEGMENT Segment[128] = {{ len1:0, len2:0, type:255, used:0, ascii:32 },
|
||||
@@ -155,13 +160,24 @@ static void HD_write (char *string, int len, int delay)
|
||||
{
|
||||
while (len--) {
|
||||
outb (*string++, Port); // put data on DB1..DB8
|
||||
outb (0x00, Port+2); // set Enable = bit 0 invertet
|
||||
outb (0x00, Port+2); // set Enable = bit 0 invertet
|
||||
udelay (1);
|
||||
outb (0x01, Port+2); // clear Enable
|
||||
outb (0x01, Port+2); // clear Enable
|
||||
udelay (delay);
|
||||
}
|
||||
}
|
||||
|
||||
static void HD_setGPO (int bits)
|
||||
{
|
||||
if (Lcd.gpos>0) {
|
||||
outb (bits, Port); // put data on DB1..DB8
|
||||
outb (0x05, Port+2); // set INIT = bit 2 invertet
|
||||
udelay (1);
|
||||
outb (0x03, Port+2); // clear INIT
|
||||
udelay (1);
|
||||
}
|
||||
}
|
||||
|
||||
static int HD_open (void)
|
||||
{
|
||||
debug ("using port 0x%x", Port);
|
||||
@@ -177,7 +193,6 @@ static int HD_open (void)
|
||||
HD_command (0x08, 40); // Display off, cursor off, blink off
|
||||
HD_command (0x0c, 1640); // Display on, cursor off, blink off, wait 1.64 ms
|
||||
HD_command (0x06, 40); // curser moves to right, no shift
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -361,13 +376,15 @@ int HD_clear (void)
|
||||
Bar[row][col].segment=-1;
|
||||
}
|
||||
}
|
||||
GPO=0;
|
||||
HD_setGPO (GPO); // All GPO's off
|
||||
HD_command (0x01, 1640); // clear display
|
||||
return 0;
|
||||
}
|
||||
|
||||
int HD_init (LCD *Self)
|
||||
{
|
||||
int rows=-1, cols=-1;
|
||||
int rows=-1, cols=-1, gpos=-1;
|
||||
char *s, *e;
|
||||
|
||||
s=cfg_get ("Port");
|
||||
@@ -400,15 +417,25 @@ int HD_init (LCD *Self)
|
||||
return -1;
|
||||
}
|
||||
|
||||
s=cfg_get ("GPOs");
|
||||
if (s==NULL) {
|
||||
gpos=0;
|
||||
}
|
||||
else if ((gpos=strtol(s, &e, 0))==0 || *e!='\0' || gpos<0 || gpos>8) {
|
||||
error ("HD44780: bad GPOs '%s' in %s", s, cfg_file());
|
||||
return -1;
|
||||
}
|
||||
|
||||
Self->rows=rows;
|
||||
Self->cols=cols;
|
||||
Self->gpos=gpos;
|
||||
Lcd=*Self;
|
||||
|
||||
|
||||
if (HD_open()!=0)
|
||||
return -1;
|
||||
|
||||
HD_clear();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -504,6 +531,14 @@ int HD_bar (int type, int row, int col, int max, int len1, int len2)
|
||||
|
||||
int HD_gpo (int num, int val)
|
||||
{
|
||||
if (num>=Lcd.gpos)
|
||||
return -1;
|
||||
|
||||
if (val) {
|
||||
GPO |= 1<<num; // set bit
|
||||
} else {
|
||||
GPO &= ~(1<<num); // clear bit
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -539,6 +574,9 @@ int HD_flush (void)
|
||||
HD_write (buffer, p-buffer, 40);
|
||||
}
|
||||
}
|
||||
|
||||
HD_setGPO(GPO);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: MatrixOrbital.c,v 1.20 2001/02/13 09:00:13 reinelt Exp $
|
||||
/* $Id: MatrixOrbital.c,v 1.21 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* driver for Matrix Orbital serial display modules
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: MatrixOrbital.c,v $
|
||||
* Revision 1.21 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.20 2001/02/13 09:00:13 reinelt
|
||||
*
|
||||
* prepared framework for GPO's (general purpose outputs)
|
||||
@@ -157,6 +161,7 @@ static int Device=-1;
|
||||
|
||||
static char Txt[4][40];
|
||||
static BAR Bar[4][40];
|
||||
static int GPO;
|
||||
|
||||
static int nSegment=2;
|
||||
static SEGMENT Segment[128] = {{ len1:0, len2:0, type:255, used:0, ascii:32 },
|
||||
@@ -397,7 +402,9 @@ int MO_clear (void)
|
||||
Bar[row][col].segment=-1;
|
||||
}
|
||||
}
|
||||
MO_write ("\014", 1);
|
||||
MO_write ("\014", 1); // Clear Screen
|
||||
MO_write ("\376V", 2); // GPO off
|
||||
GPO=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -453,7 +460,6 @@ int MO_init (LCD *Self)
|
||||
MO_write ("\376T", 2); // blink off
|
||||
MO_write ("\376D", 2); // line wrapping off
|
||||
MO_write ("\376R", 2); // auto scroll off
|
||||
MO_write ("\376V", 2); // GPO off
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -542,6 +548,14 @@ int MO_bar (int type, int row, int col, int max, int len1, int len2)
|
||||
|
||||
int MO_gpo (int num, int val)
|
||||
{
|
||||
if (num>=Lcd.gpos)
|
||||
return -1;
|
||||
|
||||
if (val) {
|
||||
GPO |= 1<<num; // set bit
|
||||
} else {
|
||||
GPO &= ~(1<<num); // clear bit
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -578,6 +592,13 @@ int MO_flush (void)
|
||||
MO_write (buffer, p-buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if (GPO & 1) {
|
||||
MO_write ("\376W", 2); // GPO on
|
||||
} else {
|
||||
MO_write ("\376V", 2); // GPO off
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -590,10 +611,10 @@ int MO_quit (void)
|
||||
}
|
||||
|
||||
LCD MatrixOrbital[] = {
|
||||
{ "LCD0821",2, 8,XRES,YRES,BARS,0,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD1621",2,16,XRES,YRES,BARS,0,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD2021",2,20,XRES,YRES,BARS,0,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD2041",4,20,XRES,YRES,BARS,0,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD4021",2,40,XRES,YRES,BARS,0,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD0821",2, 8,XRES,YRES,BARS,1,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD1621",2,16,XRES,YRES,BARS,1,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD2021",2,20,XRES,YRES,BARS,1,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD2041",4,20,XRES,YRES,BARS,1,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ "LCD4021",2,40,XRES,YRES,BARS,1,MO_init,MO_clear,MO_put,MO_bar,MO_gpo,MO_flush,MO_quit },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
13
display.c
13
display.c
@@ -1,4 +1,4 @@
|
||||
/* $Id: display.c,v 1.22 2001/02/13 09:00:13 reinelt Exp $
|
||||
/* $Id: display.c,v 1.23 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* framework for device drivers
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: display.c,v $
|
||||
* Revision 1.23 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.22 2001/02/13 09:00:13 reinelt
|
||||
*
|
||||
* prepared framework for GPO's (general purpose outputs)
|
||||
@@ -128,7 +132,7 @@
|
||||
* lcd_init (char *driver)
|
||||
* initializes the named driver
|
||||
*
|
||||
* lcd_query (int *rows, int *cols, int *xres, int *yres, int *bars)
|
||||
* lcd_query (int *rows, int *cols, int *xres, int *yres, int *bars, int *gpos)
|
||||
* queries the attributes of the selected driver
|
||||
*
|
||||
* lcd_clear ()
|
||||
@@ -219,16 +223,17 @@ int lcd_init (char *driver)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lcd_query (int *rows, int *cols, int *xres, int *yres, int *bars)
|
||||
int lcd_query (int *rows, int *cols, int *xres, int *yres, int *bars, int *gpos)
|
||||
{
|
||||
if (Lcd==NULL)
|
||||
return -1;
|
||||
|
||||
if (rows) *rows=Lcd->rows;
|
||||
if(cols) *cols=Lcd->cols;
|
||||
if (cols) *cols=Lcd->cols;
|
||||
if (xres) *xres=Lcd->xres;
|
||||
if (yres) *yres=Lcd->yres;
|
||||
if (bars) *bars=Lcd->bars;
|
||||
if (gpos) *gpos=Lcd->gpos;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: display.h,v 1.12 2001/02/13 09:00:13 reinelt Exp $
|
||||
/* $Id: display.h,v 1.13 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* framework for device drivers
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: display.h,v $
|
||||
* Revision 1.13 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.12 2001/02/13 09:00:13 reinelt
|
||||
*
|
||||
* prepared framework for GPO's (general purpose outputs)
|
||||
@@ -113,7 +117,7 @@ typedef struct {
|
||||
|
||||
int lcd_list (void);
|
||||
int lcd_init (char *driver);
|
||||
int lcd_query (int *rows, int *cols, int *xres, int *yres, int *bars);
|
||||
int lcd_query (int *rows, int *cols, int *xres, int *yres, int *bars, int *gpos);
|
||||
int lcd_clear (void);
|
||||
int lcd_put (int row, int col, char *text);
|
||||
int lcd_bar (int type, int row, int col, int max, int len1, int len2);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: lcd4linux.c,v 1.28 2000/10/25 08:10:48 reinelt Exp $
|
||||
/* $Id: lcd4linux.c,v 1.29 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* LCD4Linux
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: lcd4linux.c,v $
|
||||
* Revision 1.29 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.28 2000/10/25 08:10:48 reinelt
|
||||
*
|
||||
* added restart funnctionality
|
||||
@@ -204,7 +208,7 @@ int hello (void)
|
||||
"(c) M.Reinelt",
|
||||
NULL };
|
||||
|
||||
lcd_query (&y, &x, NULL, NULL, NULL);
|
||||
lcd_query (&y, &x, NULL, NULL, NULL, NULL);
|
||||
|
||||
flag=0;
|
||||
for (i=0; line1[i]; i++) {
|
||||
|
||||
33
parser.c
33
parser.c
@@ -1,4 +1,4 @@
|
||||
/* $Id: parser.c,v 1.7 2000/08/10 09:44:09 reinelt Exp $
|
||||
/* $Id: parser.c,v 1.8 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* row definition parser
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: parser.c,v $
|
||||
* Revision 1.8 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.7 2000/08/10 09:44:09 reinelt
|
||||
*
|
||||
* new debugging scheme: error(), info(), debug()
|
||||
@@ -63,11 +67,16 @@
|
||||
/*
|
||||
* exported functions:
|
||||
*
|
||||
* char *parse (char *string, int supported_bars, int usage[])
|
||||
* char *parse_row (char *string, int supported_bars, int usage[])
|
||||
* converts a row definition from the config file
|
||||
* into the internal form using tokens
|
||||
* sets the array usage[token] to usage count
|
||||
*
|
||||
* char parse_gpo (char *string, int usage[])
|
||||
* converts a GPO definition from the config file
|
||||
* into the internal form using tokens
|
||||
* sets the array usage[token] to usage count
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -167,7 +176,7 @@ static TOKEN get_token (char *s, char **p, int bar, int usage[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *parse (char *string, int supported_bars, int usage[])
|
||||
char *parse_row (char *string, int supported_bars, int usage[])
|
||||
{
|
||||
static char buffer[256];
|
||||
char *s=string;
|
||||
@@ -254,3 +263,21 @@ char *parse (char *string, int supported_bars, int usage[])
|
||||
*p='\0';
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char parse_gpo (char *string, int usage[])
|
||||
{
|
||||
char *s=string;
|
||||
TOKEN token=-1;
|
||||
|
||||
if (*s=='%') {
|
||||
if ((token=get_token (++s, &s, 0, usage))==-1) {
|
||||
error ("WARNING: unknown token <%%%c> in <%s>", *s, string);
|
||||
}
|
||||
}
|
||||
|
||||
if (*s!='\0') {
|
||||
error ("WARNING: error while parsing <%s>", string);
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
9
parser.h
9
parser.h
@@ -1,4 +1,4 @@
|
||||
/* $Id: parser.h,v 1.5 2000/05/21 06:20:35 reinelt Exp $
|
||||
/* $Id: parser.h,v 1.6 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* row definition parser
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: parser.h,v $
|
||||
* Revision 1.6 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.5 2000/05/21 06:20:35 reinelt
|
||||
*
|
||||
* added ppp throughput
|
||||
@@ -70,6 +74,7 @@ typedef enum {
|
||||
C_GENERIC, C_MEM, C_LOAD, C_CPU, C_DISK, C_ETH, C_PPP, C_ISDN, C_SENSOR
|
||||
} CLASS;
|
||||
|
||||
char *parse (char *string, int supported_bars, int usage[]);
|
||||
char *parse_row (char *string, int supported_bars, int usage[]);
|
||||
char parse_gpo (char *string, int usage[]);
|
||||
|
||||
#endif
|
||||
|
||||
53
processor.c
53
processor.c
@@ -1,4 +1,4 @@
|
||||
/* $Id: processor.c,v 1.10 2001/02/13 09:00:13 reinelt Exp $
|
||||
/* $Id: processor.c,v 1.11 2001/02/14 07:40:16 reinelt Exp $
|
||||
*
|
||||
* main data processing
|
||||
*
|
||||
@@ -20,6 +20,10 @@
|
||||
*
|
||||
*
|
||||
* $Log: processor.c,v $
|
||||
* Revision 1.11 2001/02/14 07:40:16 reinelt
|
||||
*
|
||||
* first (incomplete) GPO implementation
|
||||
*
|
||||
* Revision 1.10 2001/02/13 09:00:13 reinelt
|
||||
*
|
||||
* prepared framework for GPO's (general purpose outputs)
|
||||
@@ -97,9 +101,11 @@
|
||||
|
||||
|
||||
#define ROWS 16
|
||||
#define GPOS 16
|
||||
|
||||
char *row[ROWS];
|
||||
int rows, cols, xres, yres, supported_bars;
|
||||
char gpo[GPOS];
|
||||
int rows, cols, xres, yres, supported_bars, gpos;
|
||||
int token_usage[256]={0,};
|
||||
|
||||
struct { int total, used, free, shared, buffer, cache, avail; } ram;
|
||||
@@ -440,32 +446,65 @@ static char *process_row (int r)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static int process_gpo (int r)
|
||||
{
|
||||
int token;
|
||||
double val;
|
||||
|
||||
token=(unsigned char)gpo[r];
|
||||
val=query(token);
|
||||
|
||||
return (val > 0.0);
|
||||
}
|
||||
|
||||
void process_init (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
load.overload=atof(cfg_get("overload")?:"2.0");
|
||||
lcd_query (&rows, &cols, &xres, &yres, &supported_bars);
|
||||
debug ("%d rows, %d columns, %dx%d pixels", rows, cols, xres, yres);
|
||||
|
||||
lcd_query (&rows, &cols, &xres, &yres, &supported_bars, &gpos);
|
||||
if (rows>ROWS) {
|
||||
error ("%d rows exceeds limit, reducing to %d rows", rows, ROWS);
|
||||
rows=ROWS;
|
||||
}
|
||||
if (gpos>GPOS) {
|
||||
error ("%d gpos exceeds limit, reducing to %d gpos", gpos, GPOS);
|
||||
gpos=GPOS;
|
||||
}
|
||||
debug ("%d rows, %d columns, %dx%d pixels, %d GPOs", rows, cols, xres, yres, gpos);
|
||||
|
||||
for (i=1; i<=rows; i++) {
|
||||
char buffer[8], *p;
|
||||
snprintf (buffer, sizeof(buffer), "Row%d", i);
|
||||
p=cfg_get(buffer)?:"";
|
||||
debug ("%s: %s", buffer, p);
|
||||
row[i]=strdup(parse(p, supported_bars, token_usage));
|
||||
row[i]=strdup(parse_row(p, supported_bars, token_usage));
|
||||
}
|
||||
|
||||
for (i=1; i<=gpos; i++) {
|
||||
char buffer[8], *p;
|
||||
snprintf (buffer, sizeof(buffer), "GPO%d", i);
|
||||
p=cfg_get(buffer)?:"";
|
||||
debug ("%s: %s", buffer, p);
|
||||
gpo[i]=parse_gpo(p, token_usage);
|
||||
}
|
||||
}
|
||||
|
||||
void process (int smooth)
|
||||
{
|
||||
int i;
|
||||
int i, val;
|
||||
char *txt;
|
||||
|
||||
|
||||
collect_data();
|
||||
for (i=1; i<=rows; i++) {
|
||||
txt=process_row (i);
|
||||
if (smooth==0)
|
||||
lcd_put (i, 1, txt);
|
||||
}
|
||||
for (i=1; i<=gpos; i++) {
|
||||
val=process_gpo (i);
|
||||
lcd_gpo (i, val);
|
||||
}
|
||||
lcd_flush();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user