Removed lcddriver.c (doesn't do anything, isn't in any makefiles, etc.).

Passed *every* piece of source in this project through indent. I'm setting
things up with ctags soon and am actually going to *gasp* use a nice
programming environment to continue development in. :)
This commit is contained in:
William Ferrell
2000-03-30 20:20:41 +00:00
parent 2222adcfbe
commit f5a5e9653b
88 changed files with 8207 additions and 8723 deletions
+1 -1
View File
@@ -73,8 +73,8 @@
/* Define the package version */
#undef VERSION
/* Leave that blank line there!! Autoheader needs it.
If you're adding to this file, keep in mind:
The entries are in sort -df order: alphabetical, case insensitive,
+113 -107
View File
@@ -14,24 +14,25 @@
int batt_fd = 0;
static int get_batt_stat(int *acstat, int *battstat,
int *battflag, int *percent);
static int get_batt_stat (int *acstat, int *battstat, int *battflag, int *percent);
static int get_batt_stat(int *acstat, int *battstat,
int *battflag, int *percent)
static int
get_batt_stat (int *acstat, int *battstat, int *battflag, int *percent)
{
char str[64];
if(!batt_fd)
batt_fd = open("/proc/apm", O_RDONLY);
if(batt_fd <= 0) return -1;
if (!batt_fd)
batt_fd = open ("/proc/apm", O_RDONLY);
if (batt_fd <= 0)
return -1;
if(lseek(batt_fd, 0, 0) != 0) return -1;
if (lseek (batt_fd, 0, 0) != 0)
return -1;
if(read(batt_fd, str, sizeof(str)-1) < 0) return -1;
if (read (batt_fd, str, sizeof (str) - 1) < 0)
return -1;
if(3 > sscanf(str+13, "0x%x 0x%x 0x%x %d",
acstat, battstat, battflag, percent))
if (3 > sscanf (str + 13, "0x%x 0x%x 0x%x %d", acstat, battstat, battflag, percent))
return -1;
return 0;
@@ -40,22 +41,24 @@ static int get_batt_stat(int *acstat, int *battstat,
int batt_init()
int
batt_init ()
{
static int first = 1;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add B\n");
sock_send_string (sock, "screen_add B\n");
}
return 0;
}
int batt_close()
int
batt_close ()
{
if(batt_fd) close(batt_fd);
if (batt_fd)
close (batt_fd);
batt_fd = 0;
return 0;
@@ -72,122 +75,125 @@ int batt_close()
//Batt: Low (Charging)
//E------------------F
int battery_screen(int rep, int display)
int
battery_screen (int rep, int display)
{
static int first=1;
static int first = 1;
int acstat=0, battstat=0, battflag=0, percent=0;
int acstat = 0, battstat = 0, battflag = 0, percent = 0;
if(first)
{
if (first) {
first = 0;
sprintf(buffer, "screen_set B -name {APM stats: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add B title title\n");
sprintf(tmp, "widget_set B title {LCDPROC %s}\n", version);
sock_send_string(sock, tmp);
sock_send_string(sock, "widget_add B one string\n");
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add B two string\n");
sock_send_string(sock, "widget_add B three string\n");
sock_send_string(sock, "widget_add B gauge hbar\n");
sock_send_string(sock,
"widget_set B one 1 2 {AC: Unknown}\n");
sock_send_string(sock,
"widget_set B two 1 3 {Batt: Unknown}\n");
sock_send_string(sock,
"widget_set B three 1 4 {E F}\n");
sock_send_string(sock, "widget_set B gauge 2 4 0\n");
sprintf (buffer, "screen_set B -name {APM stats: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add B title title\n");
sprintf (tmp, "widget_set B title {LCDPROC %s}\n", version);
sock_send_string (sock, tmp);
sock_send_string (sock, "widget_add B one string\n");
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add B two string\n");
sock_send_string (sock, "widget_add B three string\n");
sock_send_string (sock, "widget_add B gauge hbar\n");
sock_send_string (sock, "widget_set B one 1 2 {AC: Unknown}\n");
sock_send_string (sock, "widget_set B two 1 3 {Batt: Unknown}\n");
sock_send_string (sock, "widget_set B three 1 4 {E F}\n");
sock_send_string (sock, "widget_set B gauge 2 4 0\n");
}
}
// Only run once every 16 frames...
//if(rep&0x0f) return 0;
get_batt_stat(&acstat, &battstat, &battflag, &percent);
get_batt_stat (&acstat, &battstat, &battflag, &percent);
if(percent >= 0) sprintf(buffer, "%i%%", percent);
else sprintf(buffer, "??%%");
sprintf(tmp, "widget_set B title {Batt: %s: %s}\n", buffer, host);
if(display) sock_send_string(sock, tmp);
if(lcd_hgt >= 4) // 4-line version of the screen
{
sprintf(tmp, "widget_set B one 1 2 {");
switch(acstat)
{
case 0: sprintf(tmp+strlen(tmp), "AC: Off}\n");
break;
case 1: sprintf(tmp+strlen(tmp), "AC: On}\n");
break;
case 2: sprintf(tmp+strlen(tmp), "AC: Backup}\n");
break;
default: sprintf(tmp+strlen(tmp), "AC: Unknown}\n");
break;
}
if(display) sock_send_string(sock, tmp);
sprintf(tmp, "widget_set B two 1 3 {");
if(battflag == 0xff)
{
sprintf(tmp+strlen(tmp), "Battery Stat Unknown");
}
if (percent >= 0)
sprintf (buffer, "%i%%", percent);
else
sprintf (buffer, "??%%");
sprintf (tmp, "widget_set B title {Batt: %s: %s}\n", buffer, host);
if (display)
sock_send_string (sock, tmp);
if (lcd_hgt >= 4) // 4-line version of the screen
{
sprintf(tmp+strlen(tmp), "Batt:");
if(battflag & 1) sprintf(tmp+strlen(tmp), " High");
if(battflag & 2) sprintf(tmp+strlen(tmp), " Low");
if(battflag & 4) sprintf(tmp+strlen(tmp), " Critical");
if(battflag & 8
||battstat == 3) sprintf(tmp+strlen(tmp), " Charging");
if(battflag & 128) sprintf(tmp+strlen(tmp), " (NONE)");
sprintf (tmp, "widget_set B one 1 2 {");
switch (acstat) {
case 0:
sprintf (tmp + strlen (tmp), "AC: Off}\n");
break;
case 1:
sprintf (tmp + strlen (tmp), "AC: On}\n");
break;
case 2:
sprintf (tmp + strlen (tmp), "AC: Backup}\n");
break;
default:
sprintf (tmp + strlen (tmp), "AC: Unknown}\n");
break;
}
sprintf(tmp+strlen(tmp), "}\n");
if(display) sock_send_string(sock, tmp);
if (display)
sock_send_string (sock, tmp);
if(percent > 0)
{
sprintf(tmp, "widget_set B gauge 2 4 %i\n",
(percent * ((lcd_wid-2)*lcd_cellwid)/100));
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set B two 1 3 {");
if (battflag == 0xff) {
sprintf (tmp + strlen (tmp), "Battery Stat Unknown");
} else {
sprintf (tmp + strlen (tmp), "Batt:");
if (battflag & 1)
sprintf (tmp + strlen (tmp), " High");
if (battflag & 2)
sprintf (tmp + strlen (tmp), " Low");
if (battflag & 4)
sprintf (tmp + strlen (tmp), " Critical");
if (battflag & 8 || battstat == 3)
sprintf (tmp + strlen (tmp), " Charging");
if (battflag & 128)
sprintf (tmp + strlen (tmp), " (NONE)");
}
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
if (percent > 0) {
sprintf (tmp, "widget_set B gauge 2 4 %i\n", (percent * ((lcd_wid - 2) * lcd_cellwid) / 100));
if (display)
sock_send_string (sock, tmp);
}
} // end if(lcd_hgt >= 4)
else // two-line version of the screen
{
sprintf(tmp, "widget_set B one 1 2 {");
if(acstat == 1)
sprintf(tmp+strlen(tmp), "AC, ");
sprintf (tmp, "widget_set B one 1 2 {");
if (acstat == 1)
sprintf (tmp + strlen (tmp), "AC, ");
if(battflag == 0xff)
{
sprintf(tmp+strlen(tmp), "No battery???");
if (battflag == 0xff) {
sprintf (tmp + strlen (tmp), "No battery???");
} else {
sprintf (tmp + strlen (tmp), "Batt:");
if (battflag & 1)
sprintf (tmp + strlen (tmp), " High");
if (battflag & 2)
sprintf (tmp + strlen (tmp), " Low");
if (battflag & 4)
sprintf (tmp + strlen (tmp), " Critical");
if (battflag & 8 || battstat == 3)
sprintf (tmp + strlen (tmp), " Charging");
if (battflag & 128)
sprintf (tmp + strlen (tmp), " (NONE)");
}
else
{
sprintf(tmp+strlen(tmp), "Batt:");
if(battflag & 1) sprintf(tmp+strlen(tmp), " High");
if(battflag & 2) sprintf(tmp+strlen(tmp), " Low");
if(battflag & 4) sprintf(tmp+strlen(tmp), " Critical");
if(battflag & 8
||battstat == 3) sprintf(tmp+strlen(tmp), " Charging");
if(battflag & 128) sprintf(tmp+strlen(tmp), " (NONE)");
}
sprintf(tmp+strlen(tmp), "}\n");
if(display) sock_send_string(sock, tmp);
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
}
return 0;
}
+3 -3
View File
@@ -1,10 +1,10 @@
#ifndef BATT_H
#define BATT_H
int batt_init();
int batt_close();
int batt_init ();
int batt_close ();
int battery_screen(int rep, int display);
int battery_screen (int rep, int display);
#endif
+247 -268
View File
@@ -12,21 +12,22 @@
#include "mode.h"
#include "chrono.h"
int TwentyFourHour=1;
int TwentyFourHour = 1;
int uptime_fd = 0;
static char kver[SYS_NMLN];
static char sysname[SYS_NMLN];
static double get_uptime(double *up, double *idle);
static double get_uptime (double *up, double *idle);
static double get_uptime(double *up, double *idle)
static double
get_uptime (double *up, double *idle)
{
double uptime;
reread(uptime_fd, "get_uptime:");
sscanf(buffer, "%lf %lf", &uptime, idle);
reread (uptime_fd, "get_uptime:");
sscanf (buffer, "%lf %lf", &uptime, idle);
*up = uptime;
@@ -85,32 +86,32 @@ static char *shortmonths[] = {
int chrono_init()
int
chrono_init ()
{
struct utsname *unamebuf;
if(!uptime_fd)
{
unamebuf = (struct utsname *) malloc( sizeof(struct utsname) );
uptime_fd = open("/proc/uptime",O_RDONLY);
if (!uptime_fd) {
unamebuf = (struct utsname *) malloc (sizeof (struct utsname));
uptime_fd = open ("/proc/uptime", O_RDONLY);
#if 0
kversion_fd = open("/proc/sys/kernel/osrelease",O_RDONLY);
kversion_fd = open ("/proc/sys/kernel/osrelease", O_RDONLY);
reread(kversion_fd, "main:");
sscanf(buffer, "%s", kver);
reread (kversion_fd, "main:");
sscanf (buffer, "%s", kver);
close(kversion_fd);
close (kversion_fd);
# endif
/* Get OS name and version from uname() */
if( uname( unamebuf ) != 0 ) {
perror( "Error calling uname:" );
if (uname (unamebuf) != 0) {
perror ("Error calling uname:");
}
strcpy( kver, unamebuf->release );
strcpy( sysname, unamebuf->sysname );
strcpy (kver, unamebuf->release);
strcpy (sysname, unamebuf->sysname);
free(unamebuf);
free (unamebuf);
@@ -120,10 +121,11 @@ int chrono_init()
}
int chrono_close()
int
chrono_close ()
{
if(uptime_fd)
close(uptime_fd);
if (uptime_fd)
close (uptime_fd);
uptime_fd = 0;
@@ -143,7 +145,8 @@ int chrono_close()
//+--------------------+
//
int time_screen(int rep, int display)
int
time_screen (int rep, int display)
{
char hr[8], min[8], sec[8], ampm[8];
char day[16], month[16];
@@ -157,141 +160,129 @@ int time_screen(int rep, int display)
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add T\n");
sprintf(buffer, "screen_set T -name {Time Screen: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add T title title\n");
sock_send_string(sock, "widget_set T title {Time Screen}\n");
sock_send_string(sock, "widget_add T one string\n");
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add T two string\n");
sock_send_string(sock, "widget_add T three string\n");
}
else
{
sprintf(buffer, "widget_set T title {TIME: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string (sock, "screen_add T\n");
sprintf (buffer, "screen_set T -name {Time Screen: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add T title title\n");
sock_send_string (sock, "widget_set T title {Time Screen}\n");
sock_send_string (sock, "widget_add T one string\n");
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add T two string\n");
sock_send_string (sock, "widget_add T three string\n");
} else {
sprintf (buffer, "widget_set T title {TIME: %s}\n", host);
sock_send_string (sock, buffer);
}
}
if(colons)
if (colons)
colon = ':';
else
colon = ' ';
time(&thetime);
rtime = localtime(&thetime);
time (&thetime);
rtime = localtime (&thetime);
if(TwentyFourHour)
{
sprintf(hr, "%02d", rtime->tm_hour);
if (TwentyFourHour) {
sprintf (hr, "%02d", rtime->tm_hour);
} else {
if (rtime->tm_hour > 12) {
i = 1;
sprintf (hr, "%02d", (rtime->tm_hour - 12));
} else if (rtime->tm_hour == 0) {
i = 0;
sprintf (hr, "12");
} else {
i = 0;
sprintf (hr, "%02d", rtime->tm_hour);
}
}
if (rtime->tm_hour >= 12)
sprintf (ampm, "%s", "P");
else
{
if (rtime->tm_hour > 12)
{
i = 1; sprintf(hr, "%02d", (rtime->tm_hour - 12));
}
else if(rtime->tm_hour == 0)
{
i = 0; sprintf(hr, "12");
}
else
{
i = 0; sprintf(hr, "%02d", rtime->tm_hour);
}
}
if(rtime->tm_hour >= 12) sprintf(ampm, "%s", "P");
else sprintf(ampm, "%s", "A");
sprintf (ampm, "%s", "A");
sprintf(min, "%02d", rtime->tm_min);
sprintf(sec, "%02d", rtime->tm_sec);
sprintf (min, "%02d", rtime->tm_min);
sprintf (sec, "%02d", rtime->tm_sec);
strcpy(day, shortdays[rtime->tm_wday]);
strcpy(month, shortmonths[rtime->tm_mon]);
strcpy (day, shortdays[rtime->tm_wday]);
strcpy (month, shortmonths[rtime->tm_mon]);
///////////////////// Write the title bar (os name and version)
if(lcd_hgt >= 4)
{
sprintf(tmp, "widget_set T title {");
sprintf(tmp+strlen(tmp), "%s %s: %s}\n",
sysname, kver, host);
if(display) sock_send_string(sock, tmp);
if (lcd_hgt >= 4) {
sprintf (tmp, "widget_set T title {");
sprintf (tmp + strlen (tmp), "%s %s: %s}\n", sysname, kver, host);
if (display)
sock_send_string (sock, tmp);
}
/////////////////////// Display the time...
if(lcd_hgt >= 4)
{
get_uptime(&uptime, &idle);
if (lcd_hgt >= 4) {
get_uptime (&uptime, &idle);
idle = (idle * 100) / uptime;
if(TwentyFourHour)
sprintf(tmp, "%s%c%s%c%s %2i%% idle",
hr, colon, min, colon, sec, (int)idle);
if (TwentyFourHour)
sprintf (tmp, "%s%c%s%c%s %2i%% idle", hr, colon, min, colon, sec, (int) idle);
else
sprintf(tmp, "%s%c%s%c%s%s %2i%% idle",
hr, colon, min, colon, sec, ampm, (int)idle);
sprintf (tmp, "%s%c%s%c%s%s %2i%% idle", hr, colon, min, colon, sec, ampm, (int) idle);
// Center the output line...
i = ((lcd_wid - strlen(tmp)) / 2) + 1;
sprintf(buffer, "widget_set T three %i 4 {%s}\n", i, tmp);
if(display) sock_send_string(sock, buffer);
i = ((lcd_wid - strlen (tmp)) / 2) + 1;
sprintf (buffer, "widget_set T three %i 4 {%s}\n", i, tmp);
if (display)
sock_send_string (sock, buffer);
sprintf(tmp, "%s %s %d, %d", day, month,
rtime->tm_mday, (rtime->tm_year + 1900));
sprintf(buffer, "widget_set T two 3 3 {%s}\n", tmp);
if(display) sock_send_string(sock, buffer);
sprintf (tmp, "%s %s %d, %d", day, month, rtime->tm_mday, (rtime->tm_year + 1900));
sprintf (buffer, "widget_set T two 3 3 {%s}\n", tmp);
if (display)
sock_send_string (sock, buffer);
/////////////////////// Display the uptime...
i = (int)uptime / 86400;
sprintf(day, "Up %d day%s,", i, (i != 1 ? "s" : ""));
i = ((int)uptime % 86400) / 60 / 60;
sprintf(hr, "%02i",i);
i = (((int)uptime % 86400) % 3600) / 60;
sprintf(min, "%02i",i);
i = ((int)uptime % 60);
sprintf(sec, "%02i",i);
i = (int) uptime / 86400;
sprintf (day, "Up %d day%s,", i, (i != 1 ? "s" : ""));
i = ((int) uptime % 86400) / 60 / 60;
sprintf (hr, "%02i", i);
i = (((int) uptime % 86400) % 3600) / 60;
sprintf (min, "%02i", i);
i = ((int) uptime % 60);
sprintf (sec, "%02i", i);
if (colons)
sprintf(tmp, "%s %s:%s:%s", day, hr, min, sec);
sprintf (tmp, "%s %s:%s:%s", day, hr, min, sec);
else
sprintf(tmp, "%s %s %s %s", day, hr, min, sec);
sprintf (tmp, "%s %s %s %s", day, hr, min, sec);
//// Center this line automatically...
//i = ((lcd_wid - strlen(tmp)) / 2) + 1;
sprintf(buffer, "widget_set T one 1 2 {%s}\n", tmp);
if(display) sock_send_string(sock, buffer);
sprintf (buffer, "widget_set T one 1 2 {%s}\n", tmp);
if (display)
sock_send_string (sock, buffer);
}
else // 20x2 version of the screen
} else // 20x2 version of the screen
{
sprintf(tmp, "widget_set T one 1 2 {");
if(lcd_wid >= 20)
sprintf(tmp+strlen(tmp), "%d-%02d-%02d ",
rtime->tm_year+1900, rtime->tm_mon+1, rtime->tm_mday);
sprintf (tmp, "widget_set T one 1 2 {");
if (lcd_wid >= 20)
sprintf (tmp + strlen (tmp), "%d-%02d-%02d ", rtime->tm_year + 1900, rtime->tm_mon + 1, rtime->tm_mday);
else // 16x2 version...
sprintf(tmp+strlen(tmp), "%02d/%02d ",
rtime->tm_mon+1, rtime->tm_mday);
sprintf(tmp+strlen(tmp), "%s%c%s%c%s", hr, colon, min, colon, sec);
if(! TwentyFourHour)
sprintf(tmp+strlen(tmp), "%s", ampm);
sprintf(tmp+strlen(tmp), "}\n");
if(display) sock_send_string(sock, tmp);
sprintf (tmp + strlen (tmp), "%02d/%02d ", rtime->tm_mon + 1, rtime->tm_mday);
sprintf (tmp + strlen (tmp), "%s%c%s%c%s", hr, colon, min, colon, sec);
if (!TwentyFourHour)
sprintf (tmp + strlen (tmp), "%s", ampm);
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
}
@@ -306,7 +297,8 @@ int time_screen(int rep, int display)
//////////////////////////////////////////////////////////////////////
// Clock Screen displays current time and date...
//
int clock_screen(int rep, int display)
int
clock_screen (int rep, int display)
{
char hr[8], min[8], sec[8], ampm[8];
char day[16], month[16];
@@ -314,101 +306,94 @@ int clock_screen(int rep, int display)
static int colons = 0;
time_t thetime;
struct tm *rtime;
int i=0;
int i = 0;
char colon;
if(lcd_hgt < 4) return 0;
if (lcd_hgt < 4)
return 0;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add O\n");
sprintf(buffer, "screen_set O -name {Clock Screen: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add O title title\n");
sock_send_string(sock, "widget_add O one string\n");
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_set O title {DATE & TIME}\n");
sock_send_string(sock, "widget_add O two string\n");
sock_send_string(sock, "widget_add O three string\n");
sprintf(buffer, "widget_set O one 3 2 {%s}\n", host);
sock_send_string(sock, buffer);
}
else
{
sprintf(buffer, "widget_set O title {TIME: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string (sock, "screen_add O\n");
sprintf (buffer, "screen_set O -name {Clock Screen: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add O title title\n");
sock_send_string (sock, "widget_add O one string\n");
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_set O title {DATE & TIME}\n");
sock_send_string (sock, "widget_add O two string\n");
sock_send_string (sock, "widget_add O three string\n");
sprintf (buffer, "widget_set O one 3 2 {%s}\n", host);
sock_send_string (sock, buffer);
} else {
sprintf (buffer, "widget_set O title {TIME: %s}\n", host);
sock_send_string (sock, buffer);
}
}
if(colons)
if (colons)
colon = ':';
else
colon = ' ';
time(&thetime);
rtime = localtime(&thetime);
time (&thetime);
rtime = localtime (&thetime);
strcpy(day, days[rtime->tm_wday]);
strcpy (day, days[rtime->tm_wday]);
if(TwentyFourHour)
{
sprintf(hr, "%02d", rtime->tm_hour);
if (TwentyFourHour) {
sprintf (hr, "%02d", rtime->tm_hour);
} else {
if (rtime->tm_hour > 12) {
i = 1;
sprintf (hr, "%02d", (rtime->tm_hour - 12));
} else {
i = 0;
sprintf (hr, "%02d", rtime->tm_hour);
}
}
if (rtime->tm_hour == 12)
i = 1;
sprintf (min, "%02d", rtime->tm_min);
sprintf (sec, "%02d", rtime->tm_sec);
if (i == 1) {
sprintf (ampm, "%s", "P");
} else {
sprintf (ampm, "%s", "A");
}
strcpy (month, months[rtime->tm_mon]);
if (lcd_hgt >= 4) // 4-line version of the screen
{
sprintf (tmp, "widget_set O two 1 3 {");
if (TwentyFourHour)
sprintf (tmp + strlen (tmp), "%s%c%s%c%s %s", hr, colon, min, colon, sec, day);
else
{
if (rtime->tm_hour > 12)
{
i = 1; sprintf(hr, "%02d", (rtime->tm_hour - 12));
}
else
{
i = 0; sprintf(hr, "%02d", rtime->tm_hour);
}
}
if(rtime->tm_hour == 12) i=1;
sprintf(min, "%02d", rtime->tm_min);
sprintf(sec, "%02d", rtime->tm_sec);
if (i == 1) { sprintf(ampm, "%s", "P"); }
else { sprintf(ampm, "%s", "A"); }
strcpy(month, months[rtime->tm_mon]);
sprintf (tmp + strlen (tmp), "%s%c%s%c%s%s %s", hr, colon, min, colon, sec, ampm, day);
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
if(lcd_hgt >= 4) // 4-line version of the screen
{
sprintf(tmp, "widget_set O two 1 3 {");
if(TwentyFourHour)
sprintf(tmp+strlen(tmp), "%s%c%s%c%s %s",
hr, colon, min, colon, sec, day);
else
sprintf(tmp+strlen(tmp), "%s%c%s%c%s%s %s",
hr, colon, min, colon, sec, ampm, day);
sprintf(tmp+strlen(tmp), "}\n");
if(display) sock_send_string(sock, tmp);
sprintf(tmp, "widget_set O three 2 4 {");
sprintf(tmp+strlen(tmp),
"%s %d, %d",
month,
rtime->tm_mday,
(rtime->tm_year + 1900));
sprintf(tmp+strlen(tmp), "}\n");
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set O three 2 4 {");
sprintf (tmp + strlen (tmp), "%s %d, %d", month, rtime->tm_mday, (rtime->tm_year + 1900));
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
} // end if(lcd_hgt >= 4)
else // 20x2 version of the screen
{
sprintf(tmp, "widget_set O one 1 2 {");
sprintf(tmp+strlen(tmp), "%d-%02d-%02d ",
rtime->tm_year+1900, rtime->tm_mon+1, rtime->tm_mday);
sprintf(tmp+strlen(tmp), "%s%c%s%c%s", hr, colon, min, colon, sec);
if(! TwentyFourHour)
sprintf(tmp+strlen(tmp), "%s", ampm);
sprintf(tmp+strlen(tmp), "}\n");
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set O one 1 2 {");
sprintf (tmp + strlen (tmp), "%d-%02d-%02d ", rtime->tm_year + 1900, rtime->tm_mon + 1, rtime->tm_mday);
sprintf (tmp + strlen (tmp), "%s%c%s%c%s", hr, colon, min, colon, sec);
if (!TwentyFourHour)
sprintf (tmp + strlen (tmp), "%s", ampm);
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
}
colons = colons ^ 1;
@@ -421,7 +406,8 @@ int clock_screen(int rep, int display)
////////////////////////////////////////////////////////////////////
// Uptime Screen shows info about system uptime and OS version
//
int uptime_screen(int rep, int display)
int
uptime_screen (int rep, int display)
{
int i;
char date[16], hour[8], min[8], sec[8];
@@ -430,57 +416,53 @@ int uptime_screen(int rep, int display)
static int colons = 0;
char colon;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add U\n");
sprintf(buffer, "screen_set U -name {Uptime Screen: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add U title title\n");
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_set U title {SYSTEM UPTIME}\n");
sock_send_string(sock, "widget_add U one string\n");
sock_send_string(sock, "widget_add U two string\n");
sock_send_string(sock, "widget_add U three string\n");
sock_send_string (sock, "screen_add U\n");
sprintf (buffer, "screen_set U -name {Uptime Screen: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add U title title\n");
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_set U title {SYSTEM UPTIME}\n");
sock_send_string (sock, "widget_add U one string\n");
sock_send_string (sock, "widget_add U two string\n");
sock_send_string (sock, "widget_add U three string\n");
sprintf(buffer, "widget_set U one 3 2 {%s}\n", host);
sock_send_string(sock, buffer);
sprintf(tmp, "widget_set U three 5 4 {%s %s}\n", sysname, kver);
sock_send_string(sock, tmp);
}
else
{
sprintf(tmp, "widget_set U title {%s %s: %s}\n",
sysname, kver, host);
sock_send_string(sock, tmp);
sock_send_string(sock, "widget_add U one string\n");
sprintf (buffer, "widget_set U one 3 2 {%s}\n", host);
sock_send_string (sock, buffer);
sprintf (tmp, "widget_set U three 5 4 {%s %s}\n", sysname, kver);
sock_send_string (sock, tmp);
} else {
sprintf (tmp, "widget_set U title {%s %s: %s}\n", sysname, kver, host);
sock_send_string (sock, tmp);
sock_send_string (sock, "widget_add U one string\n");
}
}
if(colons)
if (colons)
colon = ':';
else
colon = ' ';
get_uptime(&uptime, &idle);
i = (int)uptime / 86400;
sprintf(date, "%d day%s,", i, (i != 1 ? "s" : ""));
i = ((int)uptime % 86400) / 60 / 60;
sprintf(hour, "%02i",i);
i = (((int)uptime % 86400) % 3600) / 60;
sprintf(min, "%02i",i);
i = ((int)uptime % 60);
sprintf(sec, "%02i",i);
sprintf(tmp, "%s %s%c%s%c%s", date, hour, colon, min, colon, sec);
i = ((20 - strlen(tmp)) / 2) + 1;
get_uptime (&uptime, &idle);
i = (int) uptime / 86400;
sprintf (date, "%d day%s,", i, (i != 1 ? "s" : ""));
i = ((int) uptime % 86400) / 60 / 60;
sprintf (hour, "%02i", i);
i = (((int) uptime % 86400) % 3600) / 60;
sprintf (min, "%02i", i);
i = ((int) uptime % 60);
sprintf (sec, "%02i", i);
sprintf (tmp, "%s %s%c%s%c%s", date, hour, colon, min, colon, sec);
i = ((20 - strlen (tmp)) / 2) + 1;
if(lcd_hgt >= 4)
sprintf(buffer, "widget_set U two %i 3 {%s}\n", i, tmp);
if (lcd_hgt >= 4)
sprintf (buffer, "widget_set U two %i 3 {%s}\n", i, tmp);
else
sprintf(buffer, "widget_set U one %i 2 {%s}\n", i, tmp);
if(display) sock_send_string(sock, buffer);
sprintf (buffer, "widget_set U one %i 2 {%s}\n", i, tmp);
if (display)
sock_send_string (sock, buffer);
colons = colons ^ 1;
@@ -500,67 +482,64 @@ int uptime_screen(int rep, int display)
//|111555 444222 111333|
//+--------------------+
//
int big_clock_screen(int rep, int display)
int
big_clock_screen (int rep, int display)
{
static int first = 1;
static int colons = 0;
time_t thetime;
struct tm *rtime;
int pos[]={1,4,8,11,15,18};
int pos[] = { 1, 4, 8, 11, 15, 18 };
// int i=0;
char fulltxt[16], old_fulltxt[16];
int j=0;
int j = 0;
if(lcd_hgt < 4) return 0;
if (lcd_hgt < 4)
return 0;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add K\n");
sock_send_string(sock, "screen_set K -name {Big Clock Screen}\n");
sock_send_string(sock, "widget_del K heartbeat\n");
sock_send_string(sock, "widget_add K d0 num\n");
sock_send_string(sock, "widget_add K d1 num\n");
sock_send_string(sock, "widget_add K d2 num\n");
sock_send_string(sock, "widget_add K d3 num\n");
sock_send_string(sock, "widget_add K d4 num\n");
sock_send_string(sock, "widget_add K d5 num\n");
sock_send_string (sock, "screen_add K\n");
sock_send_string (sock, "screen_set K -name {Big Clock Screen}\n");
sock_send_string (sock, "widget_del K heartbeat\n");
sock_send_string (sock, "widget_add K d0 num\n");
sock_send_string (sock, "widget_add K d1 num\n");
sock_send_string (sock, "widget_add K d2 num\n");
sock_send_string (sock, "widget_add K d3 num\n");
sock_send_string (sock, "widget_add K d4 num\n");
sock_send_string (sock, "widget_add K d5 num\n");
// sock_send_string(sock, "widget_add K one string\n");
sock_send_string(sock, "widget_set K d0 1 0\n");
sock_send_string(sock, "widget_set K d1 4 0\n");
sock_send_string(sock, "widget_set K d2 8 0\n");
sock_send_string(sock, "widget_set K d3 11 0\n");
sock_send_string(sock, "widget_set K d4 15 0\n");
sock_send_string(sock, "widget_set K d5 18 0\n");
old_fulltxt[0]='0';
old_fulltxt[1]='0';
old_fulltxt[2]='0';
old_fulltxt[3]='0';
old_fulltxt[4]='0';
old_fulltxt[5]='0';
old_fulltxt[6]=0;
sock_send_string (sock, "widget_set K d0 1 0\n");
sock_send_string (sock, "widget_set K d1 4 0\n");
sock_send_string (sock, "widget_set K d2 8 0\n");
sock_send_string (sock, "widget_set K d3 11 0\n");
sock_send_string (sock, "widget_set K d4 15 0\n");
sock_send_string (sock, "widget_set K d5 18 0\n");
old_fulltxt[0] = '0';
old_fulltxt[1] = '0';
old_fulltxt[2] = '0';
old_fulltxt[3] = '0';
old_fulltxt[4] = '0';
old_fulltxt[5] = '0';
old_fulltxt[6] = 0;
// sock_send_string(sock, "widget_set K one 1 4 {000000}\n");
}
time(&thetime);
rtime = localtime(&thetime);
time (&thetime);
rtime = localtime (&thetime);
sprintf(fulltxt, "%02d%02d%02d",
rtime->tm_hour, rtime->tm_min, rtime->tm_sec);
for(j=0;j<6;j++){
if (fulltxt[j]!=old_fulltxt[j]){
sprintf(tmp+strlen(tmp), "widget_set K d%d %d %c\n",
j, pos[j], fulltxt[j]);
old_fulltxt[j]=fulltxt[j];
sprintf (fulltxt, "%02d%02d%02d", rtime->tm_hour, rtime->tm_min, rtime->tm_sec);
for (j = 0; j < 6; j++) {
if (fulltxt[j] != old_fulltxt[j]) {
sprintf (tmp + strlen (tmp), "widget_set K d%d %d %c\n", j, pos[j], fulltxt[j]);
old_fulltxt[j] = fulltxt[j];
}
}
if(display)
sock_send_string(sock, tmp);
if (display)
sock_send_string (sock, tmp);
return 0;
} // End big_clock_screen()
+6 -6
View File
@@ -1,12 +1,12 @@
#ifndef CHRONO_H
#define CHRONO_H
int chrono_init();
int chrono_close();
int chrono_init ();
int chrono_close ();
int clock_screen(int rep, int display);
int uptime_screen(int rep, int display);
int time_screen(int rep, int display);
int big_clock_screen(int rep, int display);
int clock_screen (int rep, int display);
int uptime_screen (int rep, int display);
int time_screen (int rep, int display);
int big_clock_screen (int rep, int display);
#endif
+194 -187
View File
@@ -11,26 +11,23 @@
#include "mode.h"
#include "cpu.h"
struct load { unsigned long total, user, system, nice, idle; };
struct load {
unsigned long total, user, system, nice, idle;
};
int load_fd = 0;
static void get_load(struct load * result);
static void get_load (struct load *result);
static void get_load(struct load * result)
static void
get_load (struct load *result)
{
static struct load last_load = { 0, 0, 0, 0, 0 }; struct load curr_load;
static struct load last_load = { 0, 0, 0, 0, 0 };
struct load curr_load;
reread(load_fd, "get_load:");
sscanf(buffer, "%*s %lu %lu %lu %lu\n",
&curr_load.user,
&curr_load.nice,
&curr_load.system,
&curr_load.idle);
curr_load.total = curr_load.user
+ curr_load.nice
+ curr_load.system
+ curr_load.idle;
reread (load_fd, "get_load:");
sscanf (buffer, "%*s %lu %lu %lu %lu\n", &curr_load.user, &curr_load.nice, &curr_load.system, &curr_load.idle);
curr_load.total = curr_load.user + curr_load.nice + curr_load.system + curr_load.idle;
result->total = curr_load.total - last_load.total;
result->user = curr_load.user - last_load.user;
result->nice = curr_load.nice - last_load.nice;
@@ -45,20 +42,21 @@ static void get_load(struct load * result)
int cpu_init()
int
cpu_init ()
{
if(!load_fd)
{
load_fd = open("/proc/stat",O_RDONLY);
if (!load_fd) {
load_fd = open ("/proc/stat", O_RDONLY);
}
return 0;
}
int cpu_close()
int
cpu_close ()
{
if(load_fd)
close(load_fd);
if (load_fd)
close (load_fd);
load_fd = 0;
@@ -69,89 +67,79 @@ int cpu_close()
//////////////////////////////////////////////////////////////////////////
// CPU screen shows info about percentage of the CPU being used
//
int cpu_screen(int rep, int display)
int
cpu_screen (int rep, int display)
{
#undef CPU_BUF_SIZE
#define CPU_BUF_SIZE 4
int i, j, n;
static int first = 1;
float value;
static float cpu[CPU_BUF_SIZE + 1][5];// last buffer is scratch
static float cpu[CPU_BUF_SIZE + 1][5]; // last buffer is scratch
struct load load;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add C\n");
sprintf(buffer, "screen_set C -name {CPU Use: %s}\n", host);
sock_send_string(sock, buffer);
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add C title title\n");
sock_send_string(sock, "widget_set C title {CPU LOAD}\n");
sock_send_string(sock, "widget_add C one string\n");
sock_send_string(sock,
"widget_set C one 1 2 {0 1 Sys 0.0%}\n");
sock_send_string(sock, "widget_add C two string\n");
sock_send_string(sock, "widget_add C three string\n");
sock_send_string(sock,
"widget_set C one 1 2 {Usr 0.0% Nice 0.0%}\n");
sock_send_string(sock,
"widget_set C two 1 3 {Sys 0.0% Idle 0.0%}\n");
sock_send_string(sock,
"widget_set C three 1 4 {0% 100%}\n");
sock_send_string(sock, "widget_add C usr string\n");
sock_send_string(sock, "widget_add C nice string\n");
sock_send_string(sock, "widget_add C idle string\n");
sock_send_string(sock, "widget_add C sys string\n");
sock_send_string(sock, "widget_add C bar hbar\n");
sock_send_string(sock, "widget_set C bar 3 4 0\n");
}
sock_send_string (sock, "screen_add C\n");
sprintf (buffer, "screen_set C -name {CPU Use: %s}\n", host);
sock_send_string (sock, buffer);
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add C title title\n");
sock_send_string (sock, "widget_set C title {CPU LOAD}\n");
sock_send_string (sock, "widget_add C one string\n");
sock_send_string (sock, "widget_set C one 1 2 {0 1 Sys 0.0%}\n");
sock_send_string (sock, "widget_add C two string\n");
sock_send_string (sock, "widget_add C three string\n");
sock_send_string (sock, "widget_set C one 1 2 {Usr 0.0% Nice 0.0%}\n");
sock_send_string (sock, "widget_set C two 1 3 {Sys 0.0% Idle 0.0%}\n");
sock_send_string (sock, "widget_set C three 1 4 {0% 100%}\n");
sock_send_string (sock, "widget_add C usr string\n");
sock_send_string (sock, "widget_add C nice string\n");
sock_send_string (sock, "widget_add C idle string\n");
sock_send_string (sock, "widget_add C sys string\n");
sock_send_string (sock, "widget_add C bar hbar\n");
sock_send_string (sock, "widget_set C bar 3 4 0\n");
} else {
sock_send_string (sock, "widget_add C cpu0 string\n");
if (lcd_wid >= 20)
sock_send_string (sock, "widget_set C cpu0 1 1 {CPU0[ ]}\n");
else
{
sock_send_string(sock, "widget_add C cpu0 string\n");
if(lcd_wid >= 20)
sock_send_string(sock, "widget_set C cpu0 1 1 {CPU0[ ]}\n");
else
sock_send_string(sock, "widget_set C cpu0 1 1 {CPU0[ ]}\n");
sock_send_string(sock, "widget_add C cpu0% string\n");
sprintf(buffer, "widget_set C cpu0%% 1 %i { 0.0%%}\n", lcd_wid-4);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add C usni string\n");
sock_send_string(sock,
"widget_set C usni 1 2 { U S N I}\n");
sock_send_string(sock, "widget_add C usr hbar\n");
sock_send_string(sock, "widget_add C sys hbar\n");
sock_send_string(sock, "widget_add C nice hbar\n");
sock_send_string(sock, "widget_add C idle hbar\n");
sock_send_string(sock, "widget_add C total hbar\n");
sock_send_string(sock, "widget_set C total 6 1 0\n");
sock_send_string (sock, "widget_set C cpu0 1 1 {CPU0[ ]}\n");
sock_send_string (sock, "widget_add C cpu0% string\n");
sprintf (buffer, "widget_set C cpu0%% 1 %i { 0.0%%}\n", lcd_wid - 4);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add C usni string\n");
sock_send_string (sock, "widget_set C usni 1 2 { U S N I}\n");
sock_send_string (sock, "widget_add C usr hbar\n");
sock_send_string (sock, "widget_add C sys hbar\n");
sock_send_string (sock, "widget_add C nice hbar\n");
sock_send_string (sock, "widget_add C idle hbar\n");
sock_send_string (sock, "widget_add C total hbar\n");
sock_send_string (sock, "widget_set C total 6 1 0\n");
}
return 0;
}
//else return 0;
get_load(&load);
get_load (&load);
// Shift values over by one
for(i=0; i<(CPU_BUF_SIZE-1); i++)
for(j=0; j<5; j++)
cpu[i][j] = cpu[i+1][j];
for (i = 0; i < (CPU_BUF_SIZE - 1); i++)
for (j = 0; j < 5; j++)
cpu[i][j] = cpu[i + 1][j];
// Read new data
cpu[CPU_BUF_SIZE-1][0] = ((float)load.user / (float)load.total) * 100.0;
cpu[CPU_BUF_SIZE-1][1] = ((float)load.system / (float)load.total) * 100.0;
cpu[CPU_BUF_SIZE-1][2] = ((float)load.nice / (float)load.total) * 100.0;
cpu[CPU_BUF_SIZE-1][3] = ((float)load.idle / (float)load.total) * 100.0;
cpu[CPU_BUF_SIZE-1][4] = (((float)load.user + (float)load.system +
(float)load.nice) / (float)load.total) * 100.0;
cpu[CPU_BUF_SIZE - 1][0] = ((float) load.user / (float) load.total) * 100.0;
cpu[CPU_BUF_SIZE - 1][1] = ((float) load.system / (float) load.total) * 100.0;
cpu[CPU_BUF_SIZE - 1][2] = ((float) load.nice / (float) load.total) * 100.0;
cpu[CPU_BUF_SIZE - 1][3] = ((float) load.idle / (float) load.total) * 100.0;
cpu[CPU_BUF_SIZE - 1][4] = (((float) load.user + (float) load.system + (float) load.nice) / (float) load.total) * 100.0;
// Only clear on first display...
if(!rep)
{
if (!rep) {
/*
// Make all the same, if this is the first time...
for(i=0; i<CPU_BUF_SIZE-1; i++)
@@ -161,13 +149,10 @@ int cpu_screen(int rep, int display)
}
// Average values for final result
for(i=0; i<5; i++)
{
for (i = 0; i < 5; i++) {
value = 0;
for(j=0; j<CPU_BUF_SIZE; j++)
{
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[j][i];
}
value /= CPU_BUF_SIZE;
@@ -175,75 +160,104 @@ int cpu_screen(int rep, int display)
}
if(lcd_hgt >= 4)
{
if (lcd_hgt >= 4) {
value = cpu[CPU_BUF_SIZE][4];
n = (int)(value * 70.0);
if (value >= 99.9) { sprintf(tmp, "100%%"); }
else { sprintf(tmp, "%4.1f%%", value); }
sprintf(buffer, "widget_set C title {CPU %s: %s}\n", tmp, host);
if(display) sock_send_string(sock, buffer);
n = (int) (value * 70.0);
if (value >= 99.9) {
sprintf (tmp, "100%%");
} else {
sprintf (tmp, "%4.1f%%", value);
}
sprintf (buffer, "widget_set C title {CPU %s: %s}\n", tmp, host);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][0];
if (value >= 99.9) { sprintf(tmp, " 100%%"); }
else { sprintf(tmp, "%4.1f%%", value); }
sprintf(buffer, "widget_set C usr 5 2 {%s}\n", tmp);
if(display) sock_send_string(sock, buffer);
if (value >= 99.9) {
sprintf (tmp, " 100%%");
} else {
sprintf (tmp, "%4.1f%%", value);
}
sprintf (buffer, "widget_set C usr 5 2 {%s}\n", tmp);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][1];
if (value >= 99.9) { sprintf(tmp, " 100%%"); }
else { sprintf(tmp, "%4.1f%%", value); }
sprintf(buffer, "widget_set C sys 5 3 {%s}\n", tmp);
if(display) sock_send_string(sock, buffer);
if (value >= 99.9) {
sprintf (tmp, " 100%%");
} else {
sprintf (tmp, "%4.1f%%", value);
}
sprintf (buffer, "widget_set C sys 5 3 {%s}\n", tmp);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][2];
if (value >= 99.9) { sprintf(tmp, " 100%%"); }
else { sprintf(tmp, "%4.1f%%", value); }
sprintf(buffer, "widget_set C nice 16 2 {%s}\n", tmp);
if(display) sock_send_string(sock, buffer);
if (value >= 99.9) {
sprintf (tmp, " 100%%");
} else {
sprintf (tmp, "%4.1f%%", value);
}
sprintf (buffer, "widget_set C nice 16 2 {%s}\n", tmp);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][3];
if (value >= 99.9) { sprintf(tmp, " 100%%"); }
else { sprintf(tmp, "%4.1f%%", value); }
sprintf(buffer, "widget_set C idle 16 3 {%s}\n", tmp);
if(display) sock_send_string(sock, buffer);
if (value >= 99.9) {
sprintf (tmp, " 100%%");
} else {
sprintf (tmp, "%4.1f%%", value);
}
sprintf (buffer, "widget_set C idle 16 3 {%s}\n", tmp);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][4];
n = (int)(value * (lcd_cellwid * 14) / 100.0);
sprintf(buffer, "widget_set C bar 3 4 %i\n", n);
if(display) sock_send_string(sock, buffer);
n = (int) (value * (lcd_cellwid * 14) / 100.0);
sprintf (buffer, "widget_set C bar 3 4 %i\n", n);
if (display)
sock_send_string (sock, buffer);
} // end if(lcd_hgt >= 4)
else // 20x2 version
{
value = cpu[CPU_BUF_SIZE][4];
if (value >= 99.9) { sprintf(tmp, "100%%"); }
else { sprintf(tmp, "%4.1f%%", value); }
sprintf(buffer, "widget_set C cpu0%% %i 1 {%s}\n", lcd_wid-4, tmp);
if(display) sock_send_string(sock, buffer);
if (value >= 99.9) {
sprintf (tmp, "100%%");
} else {
sprintf (tmp, "%4.1f%%", value);
}
sprintf (buffer, "widget_set C cpu0%% %i 1 {%s}\n", lcd_wid - 4, tmp);
if (display)
sock_send_string (sock, buffer);
n = (float)(value * lcd_cellwid * (float)(lcd_wid-11)) / 100.0;
sprintf(buffer, "widget_set C total 6 1 %i\n", n);
if(display) sock_send_string(sock, buffer);
n = (float) (value * lcd_cellwid * (float) (lcd_wid - 11)) / 100.0;
sprintf (buffer, "widget_set C total 6 1 %i\n", n);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][0];
n = (float)(value * lcd_cellwid * 4.0) / 100.0;
sprintf(buffer, "widget_set C usr 1 2 %i\n", n);
if(display) sock_send_string(sock, buffer);
n = (float) (value * lcd_cellwid * 4.0) / 100.0;
sprintf (buffer, "widget_set C usr 1 2 %i\n", n);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][1];
n = (float)(value * lcd_cellwid * 3.0) / 100.0;
sprintf(buffer, "widget_set C sys 7 2 %i\n", n);
if(display) sock_send_string(sock, buffer);
n = (float) (value * lcd_cellwid * 3.0) / 100.0;
sprintf (buffer, "widget_set C sys 7 2 %i\n", n);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][2];
n = (float)(value * lcd_cellwid * 3.0) / 100.0;
sprintf(buffer, "widget_set C nice 12 2 %i\n", n);
if(display) sock_send_string(sock, buffer);
n = (float) (value * lcd_cellwid * 3.0) / 100.0;
sprintf (buffer, "widget_set C nice 12 2 %i\n", n);
if (display)
sock_send_string (sock, buffer);
value = cpu[CPU_BUF_SIZE][3];
n = (float)(value * lcd_cellwid * 3.0) / 100.0;
sprintf(buffer, "widget_set C idle 17 2 %i\n", n);
if(display) sock_send_string(sock, buffer);
n = (float) (value * lcd_cellwid * 3.0) / 100.0;
sprintf (buffer, "widget_set C idle 17 2 %i\n", n);
if (display)
sock_send_string (sock, buffer);
}
@@ -255,60 +269,54 @@ int cpu_screen(int rep, int display)
//////////////////////////////////////////////////////////////////////////
// Cpu Graph Screen shows a quick-moving histogram of CPU use.
//
int cpu_graph_screen(int rep, int display)
int
cpu_graph_screen (int rep, int display)
{
int i, j, n=0;
static int first=1;
int i, j, n = 0;
static int first = 1;
float value, maxload;
#undef CPU_BUF_SIZE
#define CPU_BUF_SIZE 2
static float cpu[CPU_BUF_SIZE + 1];// last buffer is scratch
static float cpu[CPU_BUF_SIZE + 1]; // last buffer is scratch
static int cpu_past[LCD_MAX_WIDTH];
struct load load;
int status=0;
int status = 0;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add G\n");
sprintf(buffer, "screen_set G -name {CPU Graph: %s}\n", host);
sock_send_string(sock, buffer);
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add G title title\n");
sprintf(buffer, "widget_set G title {CPU: %s}\n", host);
sock_send_string (sock, "screen_add G\n");
sprintf (buffer, "screen_set G -name {CPU Graph: %s}\n", host);
sock_send_string (sock, buffer);
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add G title title\n");
sprintf (buffer, "widget_set G title {CPU: %s}\n", host);
} else {
sock_send_string (sock, "widget_add G title string\n");
sprintf (buffer, "widget_set G title 1 1 {CPU: %s}\n", host);
}
else
{
sock_send_string(sock, "widget_add G title string\n");
sprintf(buffer, "widget_set G title 1 1 {CPU: %s}\n", host);
}
sock_send_string(sock, buffer);
sock_send_string (sock, buffer);
for(i=1; i<=lcd_wid; i++)
{
sprintf(tmp, "widget_add G %i vbar\n", i);
sock_send_string(sock, tmp);
sprintf(tmp, "widget_set G %i %i %i 0\n", i, i, lcd_hgt);
sock_send_string(sock, tmp);
for (i = 1; i <= lcd_wid; i++) {
sprintf (tmp, "widget_add G %i vbar\n", i);
sock_send_string (sock, tmp);
sprintf (tmp, "widget_set G %i %i %i 0\n", i, i, lcd_hgt);
sock_send_string (sock, tmp);
}
}
get_load(&load);
get_load (&load);
// Shift values over by one
for(i=0; i<(CPU_BUF_SIZE-1); i++)
cpu[i] = cpu[i+1];
for (i = 0; i < (CPU_BUF_SIZE - 1); i++)
cpu[i] = cpu[i + 1];
// Read new data
cpu[CPU_BUF_SIZE-1] = ((float)load.user + (float)load.system
+ (float)load.nice) / (float)load.total;
cpu[CPU_BUF_SIZE - 1] = ((float) load.user + (float) load.system + (float) load.nice) / (float) load.total;
// Only clear on first display...
if(!rep)
{
if (!rep) {
/*
// Make all the same, if this is the first time...
for(i=0; i<CPU_BUF_SIZE-1; i++)
@@ -316,50 +324,49 @@ int cpu_graph_screen(int rep, int display)
*/
}
// Average values for final result
value = 0;
for(j=0; j<CPU_BUF_SIZE; j++)
{
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[j];
}
value /= (float)CPU_BUF_SIZE;
value /= (float) CPU_BUF_SIZE;
cpu[CPU_BUF_SIZE] = value;
maxload=0;
for(i=0; i<lcd_wid-1; i++)
{
cpu_past[i] = cpu_past[i+1];
maxload = 0;
for (i = 0; i < lcd_wid - 1; i++) {
cpu_past[i] = cpu_past[i + 1];
j = cpu_past[i];
sprintf(tmp, "widget_set G %i %i %i %i\n",
i+1, i+1, lcd_hgt, j);
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set G %i %i %i %i\n", i + 1, i + 1, lcd_hgt, j);
if (display)
sock_send_string (sock, tmp);
if(cpu_past[i] > maxload) maxload = cpu_past[i];
if (cpu_past[i] > maxload)
maxload = cpu_past[i];
}
value = cpu[CPU_BUF_SIZE];
if(lcd_hgt > 2)
n = (int)(value * (float)(lcd_cellhgt) * (float)(lcd_hgt-1));
if (lcd_hgt > 2)
n = (int) (value * (float) (lcd_cellhgt) * (float) (lcd_hgt - 1));
else
n = (int)(value * (float)(lcd_cellhgt) * (float)(lcd_hgt));
n = (int) (value * (float) (lcd_cellhgt) * (float) (lcd_hgt));
cpu_past[lcd_wid-1] = n;
sprintf(tmp, "widget_set G %i %i %i %i\n",
lcd_wid, lcd_wid, lcd_hgt, n);
if(display) sock_send_string(sock, tmp);
cpu_past[lcd_wid - 1] = n;
sprintf (tmp, "widget_set G %i %i %i %i\n", lcd_wid, lcd_wid, lcd_hgt, n);
if (display)
sock_send_string (sock, tmp);
if(n > maxload) maxload = n;
if (n > maxload)
maxload = n;
if(cpu_past[lcd_wid-1] > 0 ) status = BACKLIGHT_ON;
if(maxload < 1) status = BACKLIGHT_OFF;
if (cpu_past[lcd_wid - 1] > 0)
status = BACKLIGHT_ON;
if (maxload < 1)
status = BACKLIGHT_OFF;
// return status;
return 0;
} // End cpu_graph_screen()
+4 -4
View File
@@ -2,11 +2,11 @@
#define CPU_H
int cpu_init();
int cpu_close();
int cpu_init ();
int cpu_close ();
int cpu_screen(int rep, int display);
int cpu_graph_screen(int rep, int display);
int cpu_screen (int rep, int display);
int cpu_graph_screen (int rep, int display);
#endif
+46 -53
View File
@@ -58,14 +58,16 @@
#define MAX_CPUS 8
struct load { unsigned long total, user, system, nice, idle; };
struct load {
unsigned long total, user, system, nice, idle;
};
static int load_fd = 0;
static char *numnames[MAX_CPUS] = {"one", "two", "three", "four", "five", "six", "seven", "eight"};
static char *numnames[MAX_CPUS] = { "one", "two", "three", "four", "five", "six", "seven", "eight" };
static void
get_load(struct load *result, int *numcpus)
get_load (struct load *result, int *numcpus)
{
char *token;
static struct load last_load[MAX_CPUS];
@@ -81,16 +83,9 @@ get_load(struct load *result, int *numcpus)
while (token) {
if (token[0] == 'c') {
if (isdigit (token[3])) {
sscanf(token, "%*s %lu %lu %lu %lu",
&curr_load[*numcpus].user,
&curr_load[*numcpus].nice,
&curr_load[*numcpus].system,
&curr_load[*numcpus].idle);
sscanf (token, "%*s %lu %lu %lu %lu", &curr_load[*numcpus].user, &curr_load[*numcpus].nice, &curr_load[*numcpus].system, &curr_load[*numcpus].idle);
curr_load[*numcpus].total = curr_load[*numcpus].user
+ curr_load[*numcpus].nice
+ curr_load[*numcpus].system
+ curr_load[*numcpus].idle;
curr_load[*numcpus].total = curr_load[*numcpus].user + curr_load[*numcpus].nice + curr_load[*numcpus].system + curr_load[*numcpus].idle;
result[*numcpus].total = curr_load[*numcpus].total - last_load[*numcpus].total;
result[*numcpus].user = curr_load[*numcpus].user - last_load[*numcpus].user;
result[*numcpus].nice = curr_load[*numcpus].nice - last_load[*numcpus].nice;
@@ -113,9 +108,9 @@ get_load(struct load *result, int *numcpus)
int
cpu_smp_init()
cpu_smp_init ()
{
if(!load_fd) {
if (!load_fd) {
load_fd = open ("/proc/stat", O_RDONLY);
}
@@ -123,7 +118,7 @@ cpu_smp_init()
}
int
cpu_smp_close()
cpu_smp_close ()
{
if (load_fd)
close (load_fd);
@@ -138,51 +133,52 @@ cpu_smp_close()
// CPU screen shows info about percentage of the CPU being used
//
int
cpu_smp_screen(int rep, int display)
cpu_smp_screen (int rep, int display)
{
#undef CPU_BUF_SIZE
#define CPU_BUF_SIZE 4
int i, j, n, z;
static int first = 1;
float value;
static float cpu[MAX_CPUS][CPU_BUF_SIZE + 1][5];// last buffer is scratch
static float cpu[MAX_CPUS][CPU_BUF_SIZE + 1][5]; // last buffer is scratch
struct load load[MAX_CPUS];
int numprocs;
char buf[256];
char* graphsize;
char *graphsize;
if(first)
{
if (first) {
first = 0;
get_load(load, &numprocs);
get_load (load, &numprocs);
sock_send_string(sock, "screen_add P\n");
sock_send_string(sock, "widget_del P heartbeat\n");
sock_send_string (sock, "screen_add P\n");
sock_send_string (sock, "widget_del P heartbeat\n");
sprintf(buffer, "screen_set P -name {CPU Use: %s}\n", host);
sock_send_string(sock, buffer);
sprintf (buffer, "screen_set P -name {CPU Use: %s}\n", host);
sock_send_string (sock, buffer);
graphsize = calloc (sizeof (char), lcd_wid);
if (numprocs > lcd_hgt) {
for (i=0; i<lcd_wid/2-6; i++) {
graphsize[i] = ' '; }
for (i = 0; i < lcd_wid / 2 - 6; i++) {
graphsize[i] = ' ';
}
} else {
for (i=0; i<lcd_wid-6; i++) {
for (i = 0; i < lcd_wid - 6; i++) {
graphsize[i] = ' ';
}
}
for (i=0; i<numprocs; i++) {
if (i+1 > lcd_hgt*2) break;
for (i = 0; i < numprocs; i++) {
if (i + 1 > lcd_hgt * 2)
break;
sprintf (buf, "widget_add P %s_title string\n", numnames[i]);
sock_send_string (sock, buf);
if (numprocs > lcd_hgt) {
sprintf (buf, "widget_set P %s_title %d %d \"CPU%d[%s]\"\n", numnames[i], i%2 * lcd_wid/2 + 1, i/2+1, i, graphsize);
sprintf (buf, "widget_set P %s_title %d %d \"CPU%d[%s]\"\n", numnames[i], i % 2 * lcd_wid / 2 + 1, i / 2 + 1, i, graphsize);
} else {
sprintf (buf, "widget_set P %s_title 1 %d \"CPU%d[%s]\"\n", numnames[i], i+1, i, graphsize);
sprintf (buf, "widget_set P %s_title 1 %d \"CPU%d[%s]\"\n", numnames[i], i + 1, i, graphsize);
}
sock_send_string (sock, buf);
@@ -195,36 +191,32 @@ cpu_smp_screen(int rep, int display)
return 0;
}
get_load(load, &numprocs);
get_load (load, &numprocs);
for (z=0; z<numprocs; z++) {
for (z = 0; z < numprocs; z++) {
// Shift values over by one
for(i=0; i<(CPU_BUF_SIZE-1); i++)
for(j=4; j<5; j++)
cpu[z][i][j] = cpu[z][i+1][j];
for (i = 0; i < (CPU_BUF_SIZE - 1); i++)
for (j = 4; j < 5; j++)
cpu[z][i][j] = cpu[z][i + 1][j];
if (load[z].total == 0) {
continue;
}
// Read new data
#if 0 // we're only using 4 right now
cpu[z][CPU_BUF_SIZE-1][0] = ((float)load[z].user / (float)load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE-1][1] = ((float)load[z].system / (float)load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE-1][2] = ((float)load[z].nice / (float)load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE-1][3] = ((float)load[z].idle / (float)load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE - 1][0] = ((float) load[z].user / (float) load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE - 1][1] = ((float) load[z].system / (float) load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE - 1][2] = ((float) load[z].nice / (float) load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE - 1][3] = ((float) load[z].idle / (float) load[z].total) * 100.0;
#endif
cpu[z][CPU_BUF_SIZE-1][4] = (((float)load[z].user + (float)load[z].system +
(float)load[z].nice) / (float)load[z].total) * 100.0;
cpu[z][CPU_BUF_SIZE - 1][4] = (((float) load[z].user + (float) load[z].system + (float) load[z].nice) / (float) load[z].total) * 100.0;
// Average values for final result
for(i=4; i<5; i++)
{
for (i = 4; i < 5; i++) {
value = 0;
for(j=0; j<CPU_BUF_SIZE; j++)
{
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[z][j][i];
}
value /= CPU_BUF_SIZE;
@@ -234,15 +226,16 @@ cpu_smp_screen(int rep, int display)
value = cpu[z][CPU_BUF_SIZE][4];
if (numprocs > lcd_hgt) {
n = (float)(value * lcd_cellwid * ((float)lcd_wid/2.f-6.f)) / 100.f + .5f;
sprintf (buf, "widget_set P %s_bar %d %d %d\n", numnames[z], z%2 * lcd_wid/2 + 6, z/2+1, n);
n = (float) (value * lcd_cellwid * ((float) lcd_wid / 2.f - 6.f)) / 100.f + .5f;
sprintf (buf, "widget_set P %s_bar %d %d %d\n", numnames[z], z % 2 * lcd_wid / 2 + 6, z / 2 + 1, n);
} else {
n = (float)(value * lcd_cellwid * ((float)lcd_wid-6.f)) / 100.f + .5f;
sprintf (buf, "widget_set P %s_bar 6 %d %d\n", numnames[z], z+1, n);
n = (float) (value * lcd_cellwid * ((float) lcd_wid - 6.f)) / 100.f + .5f;
sprintf (buf, "widget_set P %s_bar 6 %d %d\n", numnames[z], z + 1, n);
}
sock_send_string (sock, buf);
if (z+1 > lcd_hgt*2) break;
if (z + 1 > lcd_hgt * 2)
break;
}
return 0;
+3 -3
View File
@@ -2,10 +2,10 @@
#define CPU_SMP_H
int cpu_smp_init();
int cpu_smp_close();
int cpu_smp_init ();
int cpu_smp_close ();
int cpu_smp_screen(int rep, int display);
int cpu_smp_screen (int rep, int display);
#endif
+90 -117
View File
@@ -37,15 +37,15 @@
FILE *mtab_fd;
typedef struct mounts
{
typedef struct mounts {
char dev[256], type[64], mpoint[256];
long bsize, blocks, bfree, files, ffree;
} mounts;
static int get_fs(mounts fs[])
static int
get_fs (mounts fs[])
{
#ifdef STAT_STATVFS
struct statvfs fsinfo;
@@ -55,43 +55,39 @@ static int get_fs(mounts fs[])
char line[256];
int x = 0, y;
mtab_fd = fopen("/etc/mtab", "r");
mtab_fd = fopen ("/etc/mtab", "r");
// Get rid of old, unmounted filesystems...
memset(fs, 0, sizeof(mounts)*256);
memset (fs, 0, sizeof (mounts) * 256);
while (x < 256)
{
if(fgets(line, 256, mtab_fd) == NULL)
{
fclose(mtab_fd);
while (x < 256) {
if (fgets (line, 256, mtab_fd) == NULL) {
fclose (mtab_fd);
return x;
}
sscanf(line, "%s %s %s", fs[x].dev, fs[x].mpoint, fs[x].type);
sscanf (line, "%s %s %s", fs[x].dev, fs[x].mpoint, fs[x].type);
if(strcmp(fs[x].type, "proc")
if (strcmp (fs[x].type, "proc")
#ifndef STAT_NFS
&& strcmp(fs[x].type, "nfs")
&& strcmp (fs[x].type, "nfs")
#endif
#ifndef STAT_SMBFS
&& strcmp(fs[x].type, "smbfs")
&& strcmp (fs[x].type, "smbfs")
#endif
)
{
) {
#ifdef STAT_STATVFS
y = statvfs(fs[x].mpoint, &fsinfo);
y = statvfs (fs[x].mpoint, &fsinfo);
#elif STAT_STATFS2_BSIZE
y = statfs(fs[x].mpoint, &fsinfo);
y = statfs (fs[x].mpoint, &fsinfo);
#elif STAT_STATFS4
y = statfs(fs[x].mpoint, &fsinfo, sizeof(fsinfo), 0);
y = statfs (fs[x].mpoint, &fsinfo, sizeof (fsinfo), 0);
#else
#error "statfs for this system noy yet supported"
#endif
fs[x].blocks = fsinfo.f_blocks;
if(fs[x].blocks > 0)
{
if (fs[x].blocks > 0) {
fs[x].bsize = fsinfo.f_bsize;
fs[x].bfree = fsinfo.f_bfree;
fs[x].files = fsinfo.f_files;
@@ -101,17 +97,19 @@ static int get_fs(mounts fs[])
}
}
fclose(mtab_fd);
fclose (mtab_fd);
return x;
}
int disk_init()
int
disk_init ()
{
return 0;
}
int disk_close()
int
disk_close ()
{
return 0;
@@ -126,159 +124,135 @@ int disk_close()
// TODO: Disk screen! Requires virtual pages in the server, though...
int disk_screen(int rep, int display)
int
disk_screen (int rep, int display)
{
static mounts mnt[256];
static int count=0;
static int count = 0;
// Holds info to display (avoid recalculating it)
struct disp
{
struct disp {
char dev[8];
char cap[8];
int full;
} table[256];
int i;
static int num_disks=0;
static int first=1; // First line to display, sort of.
static int num_disks = 0;
static int first = 1; // First line to display, sort of.
#define huge long long int
huge size;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add D\n");
sprintf(buffer, "screen_set D -name {Disk Use: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add D title title\n");
sprintf(buffer, "widget_set D title {DISKS: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add D f frame\n");
sock_send_string (sock, "screen_add D\n");
sprintf (buffer, "screen_set D -name {Disk Use: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add D title title\n");
sprintf (buffer, "widget_set D title {DISKS: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add D f frame\n");
//sock_send_string(sock, "widget_set D f 1 2 20 4 20 3 v 8\n");
sprintf(buffer, "widget_set D f 1 2 %i %i %i %i v 12\n",
lcd_wid, lcd_hgt, lcd_wid, lcd_hgt-1);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add D err1 string\n");
sock_send_string(sock, "widget_add D err2 string\n");
sock_send_string(sock, "widget_set D err1 5 2 { Reading }\n");
sock_send_string(sock, "widget_set D err2 5 3 {Filesystems}\n");
sprintf (buffer, "widget_set D f 1 2 %i %i %i %i v 12\n", lcd_wid, lcd_hgt, lcd_wid, lcd_hgt - 1);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add D err1 string\n");
sock_send_string (sock, "widget_add D err2 string\n");
sock_send_string (sock, "widget_set D err1 5 2 { Reading }\n");
sock_send_string (sock, "widget_set D err2 5 3 {Filesystems}\n");
}
// Grab disk stats on first display, and fill "table".
// Get rid of old, unmounted filesystems...
memset(table, 0, sizeof(struct disp)*256);
memset (table, 0, sizeof (struct disp) * 256);
count = get_fs(mnt);
count = get_fs (mnt);
first = 0;
// Fill the display structure...
if(count)
{
sock_send_string(sock, "widget_set D err1 30 5 .\n");
sock_send_string(sock, "widget_set D err2 30 5 .\n");
for(i=0; i<count; i++)
{
if(strlen(mnt[i].mpoint) > 6)
{
sprintf(table[i].dev, "%c%s", ELLIPSIS,
(mnt[i].mpoint)+(strlen(mnt[i].mpoint)-5));
}
else
{
sprintf(table[i].dev, "%s", mnt[i].mpoint);
if (count) {
sock_send_string (sock, "widget_set D err1 30 5 .\n");
sock_send_string (sock, "widget_set D err2 30 5 .\n");
for (i = 0; i < count; i++) {
if (strlen (mnt[i].mpoint) > 6) {
sprintf (table[i].dev, "%c%s", ELLIPSIS, (mnt[i].mpoint) + (strlen (mnt[i].mpoint) - 5));
} else {
sprintf (table[i].dev, "%s", mnt[i].mpoint);
}
//table[i].full = (lcd.cellwid * 4)
table[i].full = (huge)(lcd_cellwid * 4)
* (huge)(mnt[i].blocks - mnt[i].bfree)
/ (huge)mnt[i].blocks;
table[i].full = (huge) (lcd_cellwid * 4)
* (huge) (mnt[i].blocks - mnt[i].bfree)
/ (huge) mnt[i].blocks;
size = (huge)mnt[i].bsize * (huge)mnt[i].blocks;
memset(table[i].cap, 0, 8);
size = (huge) mnt[i].bsize * (huge) mnt[i].blocks;
memset (table[i].cap, 0, 8);
// Kilobytes
if(size > 0 && size < (huge)1000*(huge)1000)
sprintf(table[i].cap, "%3.1fk",
(double)(size)/1024.0);
if (size > 0 && size < (huge) 1000 * (huge) 1000)
sprintf (table[i].cap, "%3.1fk", (double) (size) / 1024.0);
// Megabytes
else if(size >= (huge)1000*(huge)1000
&& size < (huge)1000*(huge)1000*(huge)1000)
sprintf(table[i].cap, "%3.1fM",
(float)(size/(huge)1024)/1024.0);
else if (size >= (huge) 1000 * (huge) 1000 && size < (huge) 1000 * (huge) 1000 * (huge) 1000)
sprintf (table[i].cap, "%3.1fM", (float) (size / (huge) 1024) / 1024.0);
// Gigabytes
else if(size >= (huge)1000*(huge)1000*(huge)1000
&& size < (huge)1000*(huge)1000*(huge)1000*(huge)1000)
sprintf(table[i].cap, "%3.1fG",
(float)(size/((huge)1024*(huge)1024))/1024.0);
else if (size >= (huge) 1000 * (huge) 1000 * (huge) 1000 && size < (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000)
sprintf (table[i].cap, "%3.1fG", (float) (size / ((huge) 1024 * (huge) 1024)) / 1024.0);
// Terabytes
else if(size >= (huge)1000*(huge)1000*(huge)1000*(huge)1000
&& size < (huge)1000*(huge)1000*(huge)1000*(huge)1000*(huge)1000)
sprintf(table[i].cap, "%3.1fT",
(float)(size/((huge)1024*(huge)1024*(huge)1024))/1024.0);
else if (size >= (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000 && size < (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000)
sprintf (table[i].cap, "%3.1fT", (float) (size / ((huge) 1024 * (huge) 1024 * (huge) 1024)) / 1024.0);
// PectaBytes -- Yeah! I want some!
else if(size >= (huge)1000*(huge)1000*(huge)1000*(huge)1000*(huge)1000
&& size < (huge)1000*(huge)1000*(huge)1000*(huge)1000*(huge)1000*(huge)1000)
sprintf(table[i].cap, "%3.1fP",
(float)(size/((huge)1024*(huge)1024*(huge)1024*(huge)1024))/1024.0);
else if (size >= (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000 && size < (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000 * (huge) 1000)
sprintf (table[i].cap, "%3.1fP", (float) (size / ((huge) 1024 * (huge) 1024 * (huge) 1024 * (huge) 1024)) / 1024.0);
}
}
if (!count)
{
sock_send_string(sock, "widget_set D err1 1 2 {Error Retrieving}\n");
sock_send_string(sock, "widget_set D err2 1 3 {Filesystem Stats}\n");
if (!count) {
sock_send_string (sock, "widget_set D err1 1 2 {Error Retrieving}\n");
sock_send_string (sock, "widget_set D err2 1 3 {Filesystem Stats}\n");
return 0;
}
// Display stuff... (show for two seconds, then scroll once per
// second, then hold at the end for two seconds)
sprintf(buffer, "widget_set D f 1 2 %i %i %i %i v 12\n",
lcd_wid, lcd_hgt, lcd_wid, count);
sock_send_string(sock, buffer);
sprintf (buffer, "widget_set D f 1 2 %i %i %i %i v 12\n", lcd_wid, lcd_hgt, lcd_wid, count);
sock_send_string (sock, buffer);
//sprintf(tmp, "widget_set D f 1 2 20 4 20 %i v 8\n", count);
//sock_send_string(sock, tmp);
for(i=0; i<count; i++)
for (i = 0; i < count; i++) {
if (table[i].dev[0] == 0)
continue;
if (i >= num_disks) // Make sure we have enough lines...
{
if(table[i].dev[0] == 0) continue;
if(i >= num_disks) // Make sure we have enough lines...
{
sprintf(tmp, "widget_add D s%i string -in f\n", i);
sock_send_string(sock, tmp);
sprintf(tmp, "widget_add D h%i hbar -in f\n", i);
sock_send_string(sock, tmp);
sprintf (tmp, "widget_add D s%i string -in f\n", i);
sock_send_string (sock, tmp);
sprintf (tmp, "widget_add D h%i hbar -in f\n", i);
sock_send_string (sock, tmp);
}
sprintf(tmp, "widget_set D s%i 1 %i {%-6s %6s E F}\n",
i, i+1, table[i].dev, table[i].cap);
sock_send_string(sock, tmp);
sprintf(tmp, "widget_set D h%i 16 %i %i\n",
i, i+1, table[i].full);
sock_send_string(sock, tmp);
sprintf (tmp, "widget_set D s%i 1 %i {%-6s %6s E F}\n", i, i + 1, table[i].dev, table[i].cap);
sock_send_string (sock, tmp);
sprintf (tmp, "widget_set D h%i 16 %i %i\n", i, i + 1, table[i].full);
sock_send_string (sock, tmp);
}
// Now remove extra widgets...
for(; i < num_disks; i++)
{
sprintf(tmp, "widget_del D s%i\n", i);
sock_send_string(sock, tmp);
sprintf(tmp, "widget_del D h%i\n", i);
sock_send_string(sock, tmp);
for (; i < num_disks; i++) {
sprintf (tmp, "widget_del D s%i\n", i);
sock_send_string (sock, tmp);
sprintf (tmp, "widget_del D h%i\n", i);
sock_send_string (sock, tmp);
}
num_disks = count;
#undef huge
#undef huge
/*
// ** FILESYSTEMS *****
@@ -288,4 +262,3 @@ int disk_screen(int rep, int display)
*/
return 0;
}
+3 -3
View File
@@ -1,9 +1,9 @@
#ifndef DISK_H
#define DISK_H
int disk_init();
int disk_close();
int disk_init ();
int disk_close ();
int disk_screen(int rep, int display);
int disk_screen (int rep, int display);
#endif
+65 -71
View File
@@ -12,30 +12,33 @@
int loadavg_fd = 0;
static double get_loadavg(void);
static double get_loadavg (void);
static double get_loadavg(void)
static double
get_loadavg (void)
{
double load;
reread(loadavg_fd, "get_load:");
sscanf(buffer, "%lf", &load);
reread (loadavg_fd, "get_load:");
sscanf (buffer, "%lf", &load);
return load;
}
int load_init()
int
load_init ()
{
if(!loadavg_fd)
loadavg_fd = open("/proc/loadavg",O_RDONLY);
if (!loadavg_fd)
loadavg_fd = open ("/proc/loadavg", O_RDONLY);
return 0;
}
int load_close()
int
load_close ()
{
if(loadavg_fd)
close(loadavg_fd);
if (loadavg_fd)
close (loadavg_fd);
loadavg_fd = 0;
@@ -47,106 +50,97 @@ int load_close()
// Shows a display very similar to "xload"'s histogram.
//
int xload_screen(int rep, int display)
int
xload_screen (int rep, int display)
{
static int first = 1;
static float loads[LCD_MAX_WIDTH];
int n, i;
float loadmax=0, factor, x;
float loadmax = 0, factor, x;
int status = 0;
if(first) // Only the first time this is ever called...
if (first) // Only the first time this is ever called...
{
first = 0;
memset(loads, 0, sizeof(float)*LCD_MAX_WIDTH);
memset (loads, 0, sizeof (float) * LCD_MAX_WIDTH);
sock_send_string(sock, "screen_add X\n");
sprintf(buffer, "screen_set X -name {X-Load: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string (sock, "screen_add X\n");
sprintf (buffer, "screen_set X -name {X-Load: %s}\n", host);
sock_send_string (sock, buffer);
// Add the vbars...
for(i=1; i<lcd_wid; i++)
{
sprintf(tmp, "widget_add X %i vbar\n", i);
sock_send_string(sock, tmp);
sprintf(tmp, "widget_set X %i %i %i 0\n", i, i, lcd_hgt);
sock_send_string(sock, tmp);
for (i = 1; i < lcd_wid; i++) {
sprintf (tmp, "widget_add X %i vbar\n", i);
sock_send_string (sock, tmp);
sprintf (tmp, "widget_set X %i %i %i 0\n", i, i, lcd_hgt);
sock_send_string (sock, tmp);
}
// And add a title...
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add X title title\n");
sock_send_string(sock, "widget_set X title {LOAD }\n");
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add X title title\n");
sock_send_string (sock, "widget_set X title {LOAD }\n");
} else {
sock_send_string (sock, "widget_add X title string\n");
sock_send_string (sock, "widget_set X title 1 1 {LOAD}\n");
sock_send_string (sock, "widget_del X heartbeat\n");
}
else
{
sock_send_string(sock, "widget_add X title string\n");
sock_send_string(sock, "widget_set X title 1 1 {LOAD}\n");
sock_send_string(sock, "widget_del X heartbeat\n");
}
sock_send_string(sock, "widget_add X zero string\n");
sock_send_string(sock, "widget_add X top string\n");
sprintf(tmp, "widget_set X zero %i %i 0\n", lcd_wid, lcd_hgt);
sock_send_string(sock, tmp);
sprintf(tmp, "widget_set X top %i %i 1\n",
lcd_wid, (lcd_hgt==2)?1:2);
sock_send_string(sock, tmp);
sock_send_string (sock, "widget_add X zero string\n");
sock_send_string (sock, "widget_add X top string\n");
sprintf (tmp, "widget_set X zero %i %i 0\n", lcd_wid, lcd_hgt);
sock_send_string (sock, tmp);
sprintf (tmp, "widget_set X top %i %i 1\n", lcd_wid, (lcd_hgt == 2) ? 1 : 2);
sock_send_string (sock, tmp);
}
for(n=0; n<(lcd_wid-2); n++) loads[n] = loads[n+1];
loads[lcd_wid-2] = get_loadavg();
for (n = 0; n < (lcd_wid - 2); n++)
loads[n] = loads[n + 1];
loads[lcd_wid - 2] = get_loadavg ();
for(n=0; n<lcd_wid-1; n++)
if(loads[n] > loadmax) loadmax = loads[n];
for (n = 0; n < lcd_wid - 1; n++)
if (loads[n] > loadmax)
loadmax = loads[n];
n = (int)loadmax;
if ((float)n < loadmax) { n++; }
sprintf(tmp, "widget_set X top %i %i %i\n",
lcd_wid, (lcd_hgt==2)?1:2, n);
n = (int) loadmax;
if ((float) n < loadmax) {
n++;
}
sprintf (tmp, "widget_set X top %i %i %i\n", lcd_wid, (lcd_hgt == 2) ? 1 : 2, n);
//if(display) sock_send_string(sock, tmp);
sock_send_string(sock, tmp);
sock_send_string (sock, tmp);
if (loadmax < 1.0) factor = (float)(lcd_cellhgt) * ((lcd_hgt==2)?2.0:3.0);
else factor = (float)(lcd_cellhgt) * ((lcd_hgt==2)?2.0:3.0) / (float)n;
if (loadmax < 1.0)
factor = (float) (lcd_cellhgt) * ((lcd_hgt == 2) ? 2.0 : 3.0);
else
factor = (float) (lcd_cellhgt) * ((lcd_hgt == 2) ? 2.0 : 3.0) / (float) n;
for(n=0; n<lcd_wid-1; n++)
{
for (n = 0; n < lcd_wid - 1; n++) {
x = (loads[n] * factor);
sprintf(tmp, "widget_set X %i %i %i %i\n", n+1, n+1, lcd_hgt, (int)x);
sprintf (tmp, "widget_set X %i %i %i %i\n", n + 1, n + 1, lcd_hgt, (int) x);
//if(display) sock_send_string(sock, tmp);
sock_send_string(sock, tmp);
sock_send_string (sock, tmp);
}
if(loadmax < LOAD_MIN)
{
if (loadmax < LOAD_MIN) {
status = BACKLIGHT_OFF;
}
if(loadmax > LOAD_MIN)
{
if (loadmax > LOAD_MIN) {
status = BACKLIGHT_ON;
}
if(loads[lcd_wid-2] > LOAD_MAX)
{
if (loads[lcd_wid - 2] > LOAD_MAX) {
status = BLINK_ON;
}
// And now the title...
if(lcd_hgt >= 4)
sprintf(tmp, "widget_set X title {LOAD %2.2f: %s}\n",
loads[lcd_wid-2], host);
if (lcd_hgt >= 4)
sprintf (tmp, "widget_set X title {LOAD %2.2f: %s}\n", loads[lcd_wid - 2], host);
else
sprintf(tmp, "widget_set X title 1 1 {%s %2.2f}\n",
host, loads[lcd_wid-2]);
sprintf (tmp, "widget_set X title 1 1 {%s %2.2f}\n", host, loads[lcd_wid - 2]);
//if(display) sock_send_string(sock, tmp);
sock_send_string(sock, tmp);
sock_send_string (sock, tmp);
return status;
} // End xload_screen()
+3 -3
View File
@@ -10,10 +10,10 @@
int load_init();
int load_close();
int load_init ();
int load_close ();
int xload_screen(int rep, int display);
int xload_screen (int rep, int display);
#endif
+139 -170
View File
@@ -39,9 +39,9 @@ int lcd_cellhgt;
See below... (default_sequence[])
*/
void HelpScreen();
void exit_program(int val);
void main_loop(mode *sequence);
void HelpScreen ();
void exit_program (int val);
void main_loop (mode * sequence);
#define MAX_SEQUENCE 256
// 1/8th second is a single time unit...
@@ -49,27 +49,26 @@ void main_loop(mode *sequence);
// Contains a list of modes to run
mode default_sequence[] =
{
mode default_sequence[] = {
// which on off inv timer/visible
{ 'C', 1, 2, 0, 0xffff,0,},// [C]PU
{ 'M', 4, 16, 0, 0xffff,0,},// [M]emory
{ 'X', 64, 128, 1, 0xffff,0,},// [X]-load (load histogram)
{ 'T', 4, 64, 0, 0xffff,0,},// [T]ime/Date
{ 'A', 999,9999, 0, 0xffff,0,},// [A]bout (credits)
{'C', 1, 2, 0, 0xffff, 0,}, // [C]PU
{'M', 4, 16, 0, 0xffff, 0,}, // [M]emory
{'X', 64, 128, 1, 0xffff, 0,}, // [X]-load (load histogram)
{'T', 4, 64, 0, 0xffff, 0,}, // [T]ime/Date
{'A', 999, 9999, 0, 0xffff, 0,}, // [A]bout (credits)
{ 1 , 0, 0, 0, 0,0,},// Modes after this line will not be run by default...
{1, 0, 0, 0, 0, 0,}, // Modes after this line will not be run by default...
// ... all non-default modes must be in here!
// ... they will not show up otherwise.
{ 'P', 1, 2, 0, 0xffff,0,},// [O]ld Timescreen
{ 'O', 4, 64, 0, 0xffff,0,},// [O]ld Timescreen
{ 'K', 4, 64, 0, 0xffff,0,},// big cloc[K]
{ 'U', 4, 128, 0, 0xffff,0,},// Old [U]ptime Screen
{ 'B', 32, 256, 1, 0xffff,0,},// [B]attery Status
{ 'G', 1, 2, 0, 0xffff,0,},// Cpu histogram [G]raph
{ 'S', 16, 256, 1, 0xffff,0,},// [S]ize of biggest programs
{ 'D', 256, 256, 1, 0xffff,0,},// [D]isk stats
{ 0, 0, 0, 0,0,},// No more.. all done.
{'P', 1, 2, 0, 0xffff, 0,}, // [O]ld Timescreen
{'O', 4, 64, 0, 0xffff, 0,}, // [O]ld Timescreen
{'K', 4, 64, 0, 0xffff, 0,}, // big cloc[K]
{'U', 4, 128, 0, 0xffff, 0,}, // Old [U]ptime Screen
{'B', 32, 256, 1, 0xffff, 0,}, // [B]attery Status
{'G', 1, 2, 0, 0xffff, 0,}, // Cpu histogram [G]raph
{'S', 16, 256, 1, 0xffff, 0,}, // [S]ize of biggest programs
{'D', 256, 256, 1, 0xffff, 0,}, // [D]isk stats
{0, 0, 0, 0, 0,}, // No more.. all done.
};
// TODO: Clean up main()... It is still way too big.
@@ -77,7 +76,8 @@ mode default_sequence[] =
// TODO: Config file; not just command line
int main(int argc, char **argv)
int
main (int argc, char **argv)
{
mode sequence[MAX_SEQUENCE];
char cfgfile[256] = "/etc/lcdproc.cf";
@@ -86,86 +86,87 @@ int main(int argc, char **argv)
int i, j, k;
int tmp;
memset(sequence, 0, sizeof(mode) * MAX_SEQUENCE);
memset (sequence, 0, sizeof (mode) * MAX_SEQUENCE);
// Ctrl-C will cause a clean exit...
signal(SIGINT, exit_program);
signal (SIGINT, exit_program);
// and "kill"...
signal(SIGTERM, exit_program);
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal(SIGHUP, exit_program);
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
signal(SIGKILL, exit_program);
signal (SIGKILL, exit_program);
// Command line
memcpy(sequence, default_sequence, sizeof(default_sequence));
for(i=1, j=0; i<argc; i++)
{
if(argv[i][0] == '-') switch(argv[i][1])
{
memcpy (sequence, default_sequence, sizeof (default_sequence));
for (i = 1, j = 0; i < argc; i++) {
if (argv[i][0] == '-')
switch (argv[i][1]) {
// s is for server
case 'S':
case 's': if(argc < i+1) HelpScreen();
strcpy(server, argv[++i]);
case 's':
if (argc < i + 1)
HelpScreen ();
strcpy (server, argv[++i]);
break;
// p is for port
case 'P':
case 'p': if(argc < i+1) HelpScreen();
port = atoi(argv[++i]);
if(port < 1 && port > 0xffff)
fprintf(stderr, "Warning: Port %i outside of standard range\n",
port);
case 'p':
if (argc < i + 1)
HelpScreen ();
port = atoi (argv[++i]);
if (port < 1 && port > 0xffff)
fprintf (stderr, "Warning: Port %i outside of standard range\n", port);
break;
// otherwise... Get help!
default: HelpScreen(); break;
default:
HelpScreen ();
break;
}
// Parse command line here... read the man page.
else if(strlen(argv[i]) == 1)
{
else if (strlen (argv[i]) == 1) {
// Grab the mode letter...
sequence[j].which = argv[i][0];
// If we have just a letter with no numbers...
// Set the defaults...
for(tmp=0, k=0; default_sequence[k].which; k++)
{
if(toupper(sequence[j].which) == default_sequence[k].which)
{
memcpy(&sequence[j], &default_sequence[k], sizeof(mode));
tmp=1;
for (tmp = 0, k = 0; default_sequence[k].which; k++) {
if (toupper (sequence[j].which) == default_sequence[k].which) {
memcpy (&sequence[j], &default_sequence[k], sizeof (mode));
tmp = 1;
break;
}
}
if(!tmp) { printf("Invalid Mode: %c\n", argv[i][0]); exit(0); }
if (!tmp) {
printf ("Invalid Mode: %c\n", argv[i][0]);
exit (0);
}
j++;
// Set the last element to 0...
memset(sequence + j, 0, sizeof(mode));
memset (sequence + j, 0, sizeof (mode));
} // End if(strlen(argv == 1))
else
{
else {
// A multicharacter parameter by itself
// is assumed to be a config file..
strcpy(cfgfile, argv[i]);
printf("Ignoring config file: %s\n", cfgfile);
strcpy (cfgfile, argv[i]);
printf ("Ignoring config file: %s\n", cfgfile);
}
}
// Connect to the server...
usleep(500000); // wait for the server to start up
sock = sock_connect(server, port);
if (sock <= 0)
{
printf("Error connecting to server %s on port %i.\n",
server, port);
usleep (500000); // wait for the server to start up
sock = sock_connect (server, port);
if (sock <= 0) {
printf ("Error connecting to server %s on port %i.\n", server, port);
return 0;
}
sock_send_string(sock, "hello\n");
usleep(500000); // wait for the server to say hi.
sock_send_string (sock, "hello\n");
usleep (500000); // wait for the server to say hi.
// We grab the real values below, from the "connect" line.
@@ -175,51 +176,54 @@ int main(int argc, char **argv)
lcd_cellhgt = 8;
// Init the status gatherers...
mode_init(sequence);
mode_init (sequence);
// And spew stuff!
main_loop(sequence);
main_loop (sequence);
// Clean up
exit_program(0);
exit_program (0);
return 0;
}
void HelpScreen()
void
HelpScreen ()
{
printf("LCDproc, %s\n", version);
printf("Usage: lcdproc [-s server] [-p port] [modelist]\n");
printf("\tOptions in []'s are optional.\n");
printf("\tmodelist is \"mode [mode mode ...]\"\n");
printf("\tMode letters: \t[C]pu [G]raph [T]ime [M]emory [X]load [D]isk [B]attery\n\t\t\tproc_[S]izes [O]ld_time big_cloc[K] [U]ptime CPU_SM[P]\n\t\t\t[A]bout\n");
printf("\n");
printf("\tUse \"man lcdproc\" for more info.\n");
printf("Example:\n");
printf("\tlcdproc -s my.lcdproc.server.com C M X -p 13666\n");
printf("\n");
exit(0);
printf ("LCDproc, %s\n", version);
printf ("Usage: lcdproc [-s server] [-p port] [modelist]\n");
printf ("\tOptions in []'s are optional.\n");
printf ("\tmodelist is \"mode [mode mode ...]\"\n");
printf ("\tMode letters: \t[C]pu [G]raph [T]ime [M]emory [X]load [D]isk [B]attery\n\t\t\tproc_[S]izes [O]ld_time big_cloc[K] [U]ptime CPU_SM[P]\n\t\t\t[A]bout\n");
printf ("\n");
printf ("\tUse \"man lcdproc\" for more info.\n");
printf ("Example:\n");
printf ("\tlcdproc -s my.lcdproc.server.com C M X -p 13666\n");
printf ("\n");
exit (0);
}
///////////////////////////////////////////////////////////////////
// Called upon TERM and INTR signals...
//
void exit_program(int val)
void
exit_program (int val)
{
Quit = 1;
sock_close(sock);
mode_close();
exit(0);
sock_close (sock);
mode_close ();
exit (0);
}
///////////////////////////////////////////////////////////////////
// Main program loop...
//
void main_loop(mode *sequence)
void
main_loop (mode * sequence)
{
int i=0, j;
int i = 0, j;
//int status=0;
char buf[8192];
char *argv[256];
@@ -229,23 +233,20 @@ void main_loop(mode *sequence)
// Main loop
// Run whatever screen we want, then wait. Woo-hoo!
while(!Quit)
{
while (!Quit) {
// Check for server input...
len = sock_recv(sock, buf, 8000);
len = sock_recv (sock, buf, 8000);
// Handle server input...
while(len > 0)
{
while (len > 0) {
// Now split the string into tokens...
//for(i=0; i<argc; i++) argv[i]=NULL; // Get rid of old tokens
argc = 0; newtoken = 1;
for(i=0; i<len; i++)
{
if(buf[i]) // For regular letters, keep tokenizing...
{
switch(buf[i])
argc = 0;
newtoken = 1;
for (i = 0; i < len; i++) {
if (buf[i]) // For regular letters, keep tokenizing...
{
switch (buf[i]) {
case ' ':
newtoken = 1;
buf[i] = 0;
@@ -253,126 +254,96 @@ void main_loop(mode *sequence)
case '\n':
buf[i] = 0;
default:
if(newtoken)
{
argv[argc] = buf+i;
if (newtoken) {
argv[argc] = buf + i;
argc++;
}
newtoken = 0;
break;
}
}
else // If we've got a zero, it's the end of a string...
{
if(argc > 0)
} else // If we've got a zero, it's the end of a string...
{
if (argc > 0) {
//printf("%s %s\n", argv[0], argv[1]);
if(0 == strcmp(argv[0], "listen"))
{
for(j=0; sequence[j].which; j++)
{
if(sequence[j].which == argv[1][0])
{
if (0 == strcmp (argv[0], "listen")) {
for (j = 0; sequence[j].which; j++) {
if (sequence[j].which == argv[1][0]) {
sequence[j].visible = 1;
//debug("Listen %s\n", argv[1]);
}
}
}
else if(0 == strcmp(argv[0], "ignore"))
{
for(j=0; sequence[j].which; j++)
{
if(sequence[j].which == argv[1][0])
{
} else if (0 == strcmp (argv[0], "ignore")) {
for (j = 0; sequence[j].which; j++) {
if (sequence[j].which == argv[1][0]) {
sequence[j].visible = 0;
//debug("Ignore %s\n", argv[1]);
}
}
}
else if(0 == strcmp(argv[0], "key"))
{
debug("Key %s\n", argv[1]);
}
else if(0 == strcmp(argv[0], "menu"))
{
}
else if(0 == strcmp(argv[0], "connect"))
{
} else if (0 == strcmp (argv[0], "key")) {
debug ("Key %s\n", argv[1]);
} else if (0 == strcmp (argv[0], "menu")) {
} else if (0 == strcmp (argv[0], "connect")) {
int a;
for(a=1; a<argc; a++)
{
if(0 == strcmp(argv[a], "wid"))
lcd_wid = atoi(argv[++a]);
else if(0 == strcmp(argv[a], "hgt"))
lcd_hgt = atoi(argv[++a]);
else if(0 == strcmp(argv[a], "cellwid"))
lcd_cellwid = atoi(argv[++a]);
else if(0 == strcmp(argv[a], "cellhgt"))
lcd_cellhgt = atoi(argv[++a]);
for (a = 1; a < argc; a++) {
if (0 == strcmp (argv[a], "wid"))
lcd_wid = atoi (argv[++a]);
else if (0 == strcmp (argv[a], "hgt"))
lcd_hgt = atoi (argv[++a]);
else if (0 == strcmp (argv[a], "cellwid"))
lcd_cellwid = atoi (argv[++a]);
else if (0 == strcmp (argv[a], "cellhgt"))
lcd_cellhgt = atoi (argv[++a]);
}
sock_send_string(sock, "client_set -name LCDproc\n");
}
else if(0 == strcmp(argv[0], "bye"))
{
sock_send_string (sock, "client_set -name LCDproc\n");
} else if (0 == strcmp (argv[0], "bye")) {
//printf("Exiting LCDproc\n");
exit_program(0);
}
else
{
exit_program (0);
} else {
int j;
for(j=0; j<argc; j++)
printf("%s ", argv[j]);
printf("\n");
for (j = 0; j < argc; j++)
printf ("%s ", argv[j]);
printf ("\n");
}
}
argc = 0; newtoken = 1;
argc = 0;
newtoken = 1;
}
}
len = sock_recv(sock, buf, 8000);
len = sock_recv (sock, buf, 8000);
//debug("\n");
}
// Gather stats...
// Update screens...
for(i=0; sequence[i].which > 1; i++)
{
for (i = 0; sequence[i].which > 1; i++) {
sequence[i].timer++;
if(sequence[i].visible)
{
if(sequence[i].timer >= sequence[i].on_time)
{
if (sequence[i].visible) {
if (sequence[i].timer >= sequence[i].on_time) {
sequence[i].timer = 0;
// Now, update the screen...
update_screen(sequence+i, 1);
update_screen (sequence + i, 1);
}
}
else
{
if(sequence[i].show_invisible)
{
if(sequence[i].timer >= sequence[i].off_time)
{
} else {
if (sequence[i].show_invisible) {
if (sequence[i].timer >= sequence[i].off_time) {
sequence[i].timer = 0;
// Now, update the screen...
update_screen(sequence+i, 1);
update_screen (sequence + i, 1);
}
}
else
{
if(sequence[i].timer >= sequence[i].off_time)
{
} else {
if (sequence[i].timer >= sequence[i].off_time) {
sequence[i].timer = 0;
// Now, update the screen...
update_screen(sequence+i, 0);
update_screen (sequence + i, 0);
}
}
}
}
// Now sleep...
usleep(TIME_UNIT);
usleep (TIME_UNIT);
/* Old stuff
timer=0;
@@ -442,5 +413,3 @@ void main_loop(mode *sequence)
*/
}
}
+2 -2
View File
@@ -3,8 +3,8 @@
extern int Quit;
extern int sock;
extern char * version;
extern char * build_date;
extern char *version;
extern char *build_date;
extern int lcd_wid;
extern int lcd_hgt;
+214 -251
View File
@@ -15,41 +15,45 @@
#include "mode.h"
#include "mem.h"
struct meminfo { int total, cache, buffers, free, shared; };
struct meminfo {
int total, cache, buffers, free, shared;
};
int meminfo_fd = 0;
static void get_mem_info(struct meminfo *result);
static void get_mem_info (struct meminfo *result);
static void get_mem_info(struct meminfo *result)
static void
get_mem_info (struct meminfo *result)
{
// int i, res; char *bufptr;
reread(meminfo_fd, "get_meminfo:");
result[0].total = getentry("MemTotal:", buffer);
result[0].free = getentry("MemFree:", buffer);
result[0].shared = getentry("MemShared:", buffer);
result[0].buffers = getentry("Buffers:", buffer);
result[0].cache = getentry("Cached:", buffer);
result[1].total = getentry("SwapTotal:", buffer);
result[1].free = getentry("SwapFree:", buffer);
reread (meminfo_fd, "get_meminfo:");
result[0].total = getentry ("MemTotal:", buffer);
result[0].free = getentry ("MemFree:", buffer);
result[0].shared = getentry ("MemShared:", buffer);
result[0].buffers = getentry ("Buffers:", buffer);
result[0].cache = getentry ("Cached:", buffer);
result[1].total = getentry ("SwapTotal:", buffer);
result[1].free = getentry ("SwapFree:", buffer);
}
int mem_init()
int
mem_init ()
{
if(!meminfo_fd)
{
meminfo_fd = open("/proc/meminfo",O_RDONLY);
if (!meminfo_fd) {
meminfo_fd = open ("/proc/meminfo", O_RDONLY);
}
return 0;
}
int mem_close()
int
mem_close ()
{
if(meminfo_fd)
meminfo_fd = open("/proc/meminfo",O_RDONLY);
if (meminfo_fd)
meminfo_fd = open ("/proc/meminfo", O_RDONLY);
meminfo_fd = 0;
@@ -60,157 +64,158 @@ int mem_close()
/////////////////////////////////////////////////////////////////////////
// Mem Screen displays info about memory and swap usage...
//
int mem_screen(int rep, int display)
int
mem_screen (int rep, int display)
{
int n;
struct meminfo mem[2];
static int first = 1;
static int which_title=0;
static int which_title = 0;
float value;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add M\n");
sprintf(buffer, "screen_set M -name {Memory & Swap: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string (sock, "screen_add M\n");
sprintf (buffer, "screen_set M -name {Memory & Swap: %s}\n", host);
sock_send_string (sock, buffer);
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add M title title\n");
sock_send_string(sock, "widget_set M title { MEM -==- SWAP}\n");
sock_send_string(sock, "widget_add M totl string\n");
sock_send_string(sock, "widget_add M used string\n");
sock_send_string(sock, "widget_set M totl 9 2 Totl\n");
sock_send_string(sock, "widget_set M used 9 3 Free\n");
sock_send_string(sock, "widget_add M EF string\n");
sock_send_string(sock, "widget_set M EF 1 4 {E F E F}\n");
sock_send_string(sock, "widget_add M memused string\n");
sock_send_string(sock, "widget_add M swapused string\n");
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add M title title\n");
sock_send_string (sock, "widget_set M title { MEM -==- SWAP}\n");
sock_send_string (sock, "widget_add M totl string\n");
sock_send_string (sock, "widget_add M used string\n");
sock_send_string (sock, "widget_set M totl 9 2 Totl\n");
sock_send_string (sock, "widget_set M used 9 3 Free\n");
sock_send_string (sock, "widget_add M EF string\n");
sock_send_string (sock, "widget_set M EF 1 4 {E F E F}\n");
sock_send_string (sock, "widget_add M memused string\n");
sock_send_string (sock, "widget_add M swapused string\n");
//sock_send_string(sock, "widget_set M memgauge 2 4 0\n");
//sock_send_string(sock, "widget_set M swapgauge 13 4 0\n");
} else {
sock_send_string (sock, "widget_add M m string\n");
sock_send_string (sock, "widget_add M s string\n");
if (lcd_wid >= 20) {
sock_send_string (sock, "widget_set M m 1 1 {M [ ]}\n");
sock_send_string (sock, "widget_set M s 1 2 {S [ ]}\n");
} else {
sock_send_string (sock, "widget_set M m 1 1 {M [ ]}\n");
sock_send_string (sock, "widget_set M s 1 2 {S [ ]}\n");
}
else
{
sock_send_string(sock, "widget_add M m string\n");
sock_send_string(sock, "widget_add M s string\n");
if(lcd_wid >= 20)
{
sock_send_string(sock, "widget_set M m 1 1 {M [ ]}\n");
sock_send_string(sock, "widget_set M s 1 2 {S [ ]}\n");
}
else
{
sock_send_string(sock, "widget_set M m 1 1 {M [ ]}\n");
sock_send_string(sock, "widget_set M s 1 2 {S [ ]}\n");
}
sock_send_string(sock, "widget_add M mem% string\n");
sock_send_string(sock, "widget_add M swap% string\n");
sock_send_string(sock, "widget_set M mem% 16 1 { 0.0%}\n");
sock_send_string(sock, "widget_set M swap% 16 2 { 0.0%}\n");
sock_send_string (sock, "widget_add M mem% string\n");
sock_send_string (sock, "widget_add M swap% string\n");
sock_send_string (sock, "widget_set M mem% 16 1 { 0.0%}\n");
sock_send_string (sock, "widget_set M swap% 16 2 { 0.0%}\n");
//sock_send_string(sock, "widget_set M memgauge 8 1 0\n");
//sock_send_string(sock, "widget_set M swapgauge 8 2 0\n");
}
sock_send_string(sock, "widget_add M memtotl string\n");
sock_send_string(sock, "widget_add M swaptotl string\n");
sock_send_string (sock, "widget_add M memtotl string\n");
sock_send_string (sock, "widget_add M swaptotl string\n");
sock_send_string(sock, "widget_add M memgauge hbar\n");
sock_send_string(sock, "widget_add M swapgauge hbar\n");
sock_send_string (sock, "widget_add M memgauge hbar\n");
sock_send_string (sock, "widget_add M swapgauge hbar\n");
//sock_send_string(sock, "\n");
}
get_mem_info(mem);
get_mem_info (mem);
// flip the title back and forth...
if(lcd_hgt >= 4)
{
if(which_title & 4)
{
sprintf(buffer, "widget_set M title {%s}\n", host);
sock_send_string(sock, buffer);
}
else sock_send_string(sock, "widget_set M title { MEM -==- SWAP}\n");
which_title = (which_title + 1)&7;
if (lcd_hgt >= 4) {
if (which_title & 4) {
sprintf (buffer, "widget_set M title {%s}\n", host);
sock_send_string (sock, buffer);
} else
sock_send_string (sock, "widget_set M title { MEM -==- SWAP}\n");
which_title = (which_title + 1) & 7;
// Total memory
sprintf(tmp, "widget_set M memtotl 1 2 {%6dk}\n", mem[0].total);
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set M memtotl 1 2 {%6dk}\n", mem[0].total);
if (display)
sock_send_string (sock, tmp);
// Free memory (plus buffers and cache)
sprintf(tmp, "widget_set M memused 1 3 {%6dk}\n",
mem[0].free + mem[0].buffers + mem[0].cache);
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set M memused 1 3 {%6dk}\n", mem[0].free + mem[0].buffers + mem[0].cache);
if (display)
sock_send_string (sock, tmp);
// Total swap
sprintf(tmp, "widget_set M swaptotl 14 2 {%6dk}\n", mem[1].total);
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set M swaptotl 14 2 {%6dk}\n", mem[1].total);
if (display)
sock_send_string (sock, tmp);
// Free swap
sprintf(tmp, "widget_set M swapused 14 3 {%6dk}\n", mem[1].free);
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set M swapused 14 3 {%6dk}\n", mem[1].free);
if (display)
sock_send_string (sock, tmp);
// Free memory graph
n = (int)(35.0 -
((float)mem[0].free + (float)mem[0].buffers + (float)mem[0].cache)
/ (float)mem[0].total
* 35.0);
sprintf(tmp, "widget_set M memgauge 2 4 %i\n", n);
if(display) sock_send_string(sock, tmp);
n = (int) (35.0 - ((float) mem[0].free + (float) mem[0].buffers + (float) mem[0].cache)
/ (float) mem[0].total * 35.0);
sprintf (tmp, "widget_set M memgauge 2 4 %i\n", n);
if (display)
sock_send_string (sock, tmp);
// Free swap graph
n = (int)(35.0 -
(float)mem[1].free / (float)mem[1].total
* 35.0);
sprintf(tmp, "widget_set M swapgauge 13 4 %i\n", n);
if(display) sock_send_string(sock, tmp);
}
else
{
n = (int) (35.0 - (float) mem[1].free / (float) mem[1].total * 35.0);
sprintf (tmp, "widget_set M swapgauge 13 4 %i\n", n);
if (display)
sock_send_string (sock, tmp);
} else {
// Total memory
sprintf(tmp, "widget_set M memtotl 2 1 {%4dM}\n",
(int)(mem[0].total / 1024.0));
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set M memtotl 2 1 {%4dM}\n", (int) (mem[0].total / 1024.0));
if (display)
sock_send_string (sock, tmp);
// Total swap
sprintf(tmp, "widget_set M swaptotl 2 2 {%4dM}\n",
(int)(mem[1].total / 1024.0));
if(display) sock_send_string(sock, tmp);
sprintf (tmp, "widget_set M swaptotl 2 2 {%4dM}\n", (int) (mem[1].total / 1024.0));
if (display)
sock_send_string (sock, tmp);
// Free memory graph
value = ((float)mem[0].free + (float)mem[0].buffers + (float)mem[0].cache)
/ (float)mem[0].total;
value = ((float) mem[0].free + (float) mem[0].buffers + (float) mem[0].cache)
/ (float) mem[0].total;
value = 1.0 - value;
n = (int)((lcd_cellwid * (float)(lcd_wid-13))*(value));
sprintf(tmp, "widget_set M memgauge 8 1 %i\n", n);
if(display) sock_send_string(sock, tmp);
n = (int) ((lcd_cellwid * (float) (lcd_wid - 13)) * (value));
sprintf (tmp, "widget_set M memgauge 8 1 %i\n", n);
if (display)
sock_send_string (sock, tmp);
value *= 100.0;
if (value >= 99.9) { sprintf(buffer, "100%%"); }
else { sprintf(buffer, "%4.1f%%", value); }
sprintf(tmp, "widget_set M mem%% %i 1 {%s}\n", lcd_wid-4, buffer);
if(display) sock_send_string(sock, tmp);
if (value >= 99.9) {
sprintf (buffer, "100%%");
} else {
sprintf (buffer, "%4.1f%%", value);
}
sprintf (tmp, "widget_set M mem%% %i 1 {%s}\n", lcd_wid - 4, buffer);
if (display)
sock_send_string (sock, tmp);
// Free swap graph
value = ((float)mem[1].free / (float)mem[1].total);
value = ((float) mem[1].free / (float) mem[1].total);
value = 1.0 - value;
n = (int)((lcd_cellwid * (float)(lcd_wid-13))*(value));
sprintf(tmp, "widget_set M swapgauge 8 2 %i\n", n);
if(display) sock_send_string(sock, tmp);
n = (int) ((lcd_cellwid * (float) (lcd_wid - 13)) * (value));
sprintf (tmp, "widget_set M swapgauge 8 2 %i\n", n);
if (display)
sock_send_string (sock, tmp);
value *= 100.0;
if (value >= 99.9) { sprintf(buffer, "100%%"); }
else { sprintf(buffer, "%4.1f%%", value); }
sprintf(tmp, "widget_set M swap%% %i 2 {%s}\n", lcd_wid-4, buffer);
if(display) sock_send_string(sock, tmp);
if (value >= 99.9) {
sprintf (buffer, "100%%");
} else {
sprintf (buffer, "%4.1f%%", value);
}
sprintf (tmp, "widget_set M swap%% %i 2 {%s}\n", lcd_wid - 4, buffer);
if (display)
sock_send_string (sock, tmp);
}
@@ -222,8 +227,7 @@ int mem_screen(int rep, int display)
typedef struct proc_mem_info
{
typedef struct proc_mem_info {
char name[16]; // Is this really long enough?
// Size isn't used any more...
// Totl stores the "size" of the program now...
@@ -232,215 +236,176 @@ typedef struct proc_mem_info
} proc_mem_info;
static int sort_procs(void *a, void *b)
static int
sort_procs (void *a, void *b)
{
proc_mem_info *one, *two;
if(!a) return 0;
if(!b) return 0;
if (!a)
return 0;
if (!b)
return 0;
one = (proc_mem_info *)a;
two = (proc_mem_info *)b;
one = (proc_mem_info *) a;
two = (proc_mem_info *) b;
return (two->totl > one->totl);
}
int mem_top_screen(int rep, int display)
int
mem_top_screen (int rep, int display)
{
// Much of this code was ripped from "gmemusage"
char buf[128];
DIR *proc;
FILE *StatusFile;
struct dirent * procdir;
struct dirent *procdir;
char procName[16];
int
procSize ,
procRSS ,
procData ,
procStk ,
procExe ;
procSize, procRSS, procData, procStk, procExe;
const char
*NameLine = "Name:" ,
*VmSizeLine = "VmSize:" ,
*VmRSSLine = "VmRSS" ,
*VmDataLine = "VmData" ,
*VmStkLine = "VmStk" ,
*VmExeLine = "VmExe" ;
*NameLine = "Name:", *VmSizeLine = "VmSize:", *VmRSSLine = "VmRSS", *VmDataLine = "VmData", *VmStkLine = "VmStk", *VmExeLine = "VmExe";
const int
NameLineLen = strlen ( NameLine ) ,
VmSizeLineLen = strlen ( VmSizeLine ) ,
VmDataLineLen = strlen ( VmDataLine ) ,
VmStkLineLen = strlen ( VmStkLine ) ,
VmExeLineLen = strlen ( VmExeLine ) ,
VmRSSLineLen = strlen ( VmRSSLine ) ;
NameLineLen = strlen (NameLine), VmSizeLineLen = strlen (VmSizeLine), VmDataLineLen = strlen (VmDataLine), VmStkLineLen = strlen (VmStkLine), VmExeLineLen = strlen (VmExeLine), VmRSSLineLen = strlen (VmRSSLine);
int threshold = 400, unique;
int i;
proc_mem_info *p;
LL * procs;
LL *procs;
static int first = 1;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add S\n");
sprintf(buffer, "screen_set S -name {Top Memory Use: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add S title title\n");
sprintf(buffer, "widget_set S title {TOP MEM: %s}\n", host);
sock_send_string(sock, buffer);
sock_send_string(sock, "widget_add S f frame\n");
if(lcd_hgt >= 4)
sock_send_string(sock, "widget_set S f 1 2 20 4 20 5 v 8\n");
sock_send_string (sock, "screen_add S\n");
sprintf (buffer, "screen_set S -name {Top Memory Use: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add S title title\n");
sprintf (buffer, "widget_set S title {TOP MEM: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "widget_add S f frame\n");
if (lcd_hgt >= 4)
sock_send_string (sock, "widget_set S f 1 2 20 4 20 5 v 8\n");
else
sock_send_string(sock, "widget_set S f 1 2 20 2 20 5 v 16\n");
for(i=1; i<=5; i++)
{
sprintf(buffer, "widget_add S %i string -in f\n", i);
sock_send_string(sock, buffer);
sock_send_string (sock, "widget_set S f 1 2 20 2 20 5 v 16\n");
for (i = 1; i <= 5; i++) {
sprintf (buffer, "widget_add S %i string -in f\n", i);
sock_send_string (sock, buffer);
}
sock_send_string(sock, "widget_set S 1 1 1 Checking...\n");
sock_send_string (sock, "widget_set S 1 1 1 Checking...\n");
}
procs = LL_new();
if(!procs)
{
fprintf(stderr, "mem_top_screen: Error allocating list\n");
procs = LL_new ();
if (!procs) {
fprintf (stderr, "mem_top_screen: Error allocating list\n");
return -1;
}
if ( ( proc = opendir ( "/proc" ) ) == NULL )
{
fprintf ( stderr , "mem_top_screen: unable to open /proc" ) ;
perror ( "" ) ;
if ((proc = opendir ("/proc")) == NULL) {
fprintf (stderr, "mem_top_screen: unable to open /proc");
perror ("");
return -1;
}
while ( (procdir = readdir ( proc )) )
{
if ( !index ( "1234567890" , procdir -> d_name [0] ) )
{
continue ;
while ((procdir = readdir (proc))) {
if (!index ("1234567890", procdir->d_name[0])) {
continue;
}
sprintf ( buf , "/proc/%s/status" , procdir -> d_name ) ;
if ( ( StatusFile = fopen ( buf , "r" ) ) == NULL )
{
sprintf (buf, "/proc/%s/status", procdir->d_name);
if ((StatusFile = fopen (buf, "r")) == NULL) {
// Not a serious error; process has finished before we could
// examine it:
//fprintf ( stderr , "mem_top_screen: cannot open %s for reading" ,
// buf ) ;
//perror ( "" ) ;
continue ;
continue;
}
procRSS = procSize = procData = procStk = procExe = 0 ;
while ( fgets ( buf , sizeof ( buf ) , StatusFile ) )
{
if ( !strncmp ( buf , NameLine , NameLineLen ) )
{
procRSS = procSize = procData = procStk = procExe = 0;
while (fgets (buf, sizeof (buf), StatusFile)) {
if (!strncmp (buf, NameLine, NameLineLen)) {
/* Name: procName */
sscanf ( buf , "%*s %s" , procName ) ;
}
else if ( !strncmp ( buf , VmSizeLine , VmSizeLineLen ) )
{
sscanf (buf, "%*s %s", procName);
} else if (!strncmp (buf, VmSizeLine, VmSizeLineLen)) {
/* VmSize: procSize kB */
sscanf ( buf , "%*s %d" , &procSize ) ;
}
else if ( !strncmp ( buf , VmRSSLine , VmRSSLineLen ) )
{
sscanf (buf, "%*s %d", &procSize);
} else if (!strncmp (buf, VmRSSLine, VmRSSLineLen)) {
/* VmRSS: procRSS kB */
sscanf ( buf , "%*s %d" , &procRSS ) ;
}
else if ( !strncmp ( buf , VmDataLine , VmDataLineLen ) )
{
sscanf (buf, "%*s %d", &procRSS);
} else if (!strncmp (buf, VmDataLine, VmDataLineLen)) {
/* VmData: procData kB */
sscanf ( buf , "%*s %d" , &procData ) ;
}
else if ( !strncmp ( buf , VmStkLine , VmStkLineLen ) )
{
sscanf (buf, "%*s %d", &procData);
} else if (!strncmp (buf, VmStkLine, VmStkLineLen)) {
/* VmStk: procStk kB */
sscanf ( buf , "%*s %d" , &procStk ) ;
}
else if ( !strncmp ( buf , VmExeLine , VmExeLineLen ) )
{
sscanf (buf, "%*s %d", &procStk);
} else if (!strncmp (buf, VmExeLine, VmExeLineLen)) {
/* VmExe: procExe kB */
sscanf ( buf , "%*s %d" , &procExe ) ;
sscanf (buf, "%*s %d", &procExe);
}
}
fclose ( StatusFile ) ;
if(procSize > threshold)
{
fclose (StatusFile);
if (procSize > threshold) {
// Figure out if it's sharing any memory...
unique = 1;
LL_Rewind(procs);
LL_Rewind (procs);
do {
p = LL_Get(procs);
if(p)
{
if(0 == strcmp(p->name, procName))
{
p = LL_Get (procs);
if (p) {
if (0 == strcmp (p->name, procName)) {
unique = 0;
p->number ++;
p->number++;
p->totl += procData + procStk + procExe;
}
}
} while(LL_Next(procs) == 0);
} while (LL_Next (procs) == 0);
// If this is the first one by this name...
if(unique)
{
p = malloc(sizeof(proc_mem_info));
if(!p)
{
fprintf(stderr,
"mem_top_screen: Error allocating process entry\n");
if (unique) {
p = malloc (sizeof (proc_mem_info));
if (!p) {
fprintf (stderr, "mem_top_screen: Error allocating process entry\n");
goto end; // Ack! I hate goto's!
}
strcpy(p->name, procName);
strcpy (p->name, procName);
p->size = procSize;
p->totl = procData + procStk + procExe;
p->number = 1;
// TODO: Check for errors here?
LL_Push(procs, (void *)p);
LL_Push (procs, (void *) p);
}
}
}
closedir ( proc ) ;
closedir (proc);
// Now, print some info...
LL_Rewind(procs);
LL_Sort(procs, sort_procs);
LL_Rewind(procs);
for(i=1; i<=5; i++)
{
p = LL_Get(procs);
if(p)
{
LL_Rewind (procs);
LL_Sort (procs, sort_procs);
LL_Rewind (procs);
for (i = 1; i <= 5; i++) {
p = LL_Get (procs);
if (p) {
//printf("Mem hog: %s: %ik\n", p->name, p->size);
if(p->number > 1)
sprintf(buffer, "widget_set S %i 1 %i {%i%6ik %s(%i)}\n", i, i, i,
p->totl, p->name, p->number);
if (p->number > 1)
sprintf (buffer, "widget_set S %i 1 %i {%i%6ik %s(%i)}\n", i, i, i, p->totl, p->name, p->number);
else
sprintf(buffer, "widget_set S %i 1 %i {%i%6ik %s}\n", i, i, i,
p->totl, p->name);
if(display) sock_send_string(sock, buffer);
}
else
{
sprintf (buffer, "widget_set S %i 1 %i {%i%6ik %s}\n", i, i, i, p->totl, p->name);
if (display)
sock_send_string (sock, buffer);
} else {
//printf("Mem hog: none?\n");
sprintf(buffer, "widget_set S %i 1 %i {}\n", i, i);
if(display) sock_send_string(sock, buffer);
sprintf (buffer, "widget_set S %i 1 %i {}\n", i, i);
if (display)
sock_send_string (sock, buffer);
}
LL_Next(procs);
LL_Next (procs);
}
@@ -448,19 +413,17 @@ int mem_top_screen(int rep, int display)
end: // Ack! I hate using labels!
// Now clean it all up...
LL_Rewind(procs);
LL_Rewind (procs);
do {
p = (proc_mem_info *)LL_Get(procs);
if(p)
{
p = (proc_mem_info *) LL_Get (procs);
if (p) {
//printf("Proc: %6ik %s\n", p->size, p->name);
free(p);
free (p);
}
} while(LL_Next(procs) == 0);
LL_Destroy(procs);
} while (LL_Next (procs) == 0);
LL_Destroy (procs);
return 0;
} // End mem_top_screen()
+4 -4
View File
@@ -1,11 +1,11 @@
#ifndef MEM_H
#define MEM_H
int mem_init();
int mem_close();
int mem_init ();
int mem_close ();
int mem_screen(int rep, int display);
int mem_top_screen(int rep, int display);
int mem_screen (int rep, int display);
int mem_top_screen (int rep, int display);
#endif
+127 -116
View File
@@ -30,86 +30,83 @@
#include "mem.h"
int ELLIPSIS='-';
int ELLIPSIS = '-';
// TODO: Clean this up... Support multiple display sizes..
char buffer[1024];
char host[16];
void reread(int f, char *errmsg);
int getentry(const char *tag, const char *bufptr);
void reread (int f, char *errmsg);
int getentry (const char *tag, const char *bufptr);
int mode_init(mode *sequence)
int
mode_init (mode * sequence)
{
int i;
struct utsname Uname;
// Grab the host name
if(0 > uname(&Uname))
{
perror("Can't get hostname");
strcpy(host, "host");
}
else
{
strncpy(host, Uname.nodename, 15);
host[16]=0;
if(index(host,'.')) // truncate at the first dot
*(index(host, '.'))='\0';
for(i=0; i<16; i++)
if(host[i] == '\n') host[i]=0;
if (0 > uname (&Uname)) {
perror ("Can't get hostname");
strcpy (host, "host");
} else {
strncpy (host, Uname.nodename, 15);
host[16] = 0;
if (index (host, '.')) // truncate at the first dot
*(index (host, '.')) = '\0';
for (i = 0; i < 16; i++)
if (host[i] == '\n')
host[i] = 0;
}
// Init all the modescreens we need
for(i=0; sequence[i].which > 1; i++)
{
switch(sequence[i].which)
{
for (i = 0; sequence[i].which > 1; i++) {
switch (sequence[i].which) {
case 'g':
case 'G': // cpu_graph_screen
cpu_init();
cpu_init ();
break;
case 'c':
case 'C': // cpu_screen
cpu_init();
cpu_init ();
break;
case 'o':
case 'O': // clock_screen
chrono_init();
chrono_init ();
break;
case 'k':
case 'K': // big_clock_screen
chrono_init();
chrono_init ();
break;
case 'm':
case 'M': // mem_screen
mem_init();
mem_init ();
break;
case 's':
case 'S': // mem_info_screen
mem_init();
mem_init ();
break;
case 'u':
case 'U': // uptime_screen
chrono_init();
chrono_init ();
break;
case 't':
case 'T': // time_screen
chrono_init();
chrono_init ();
break;
case 'd':
case 'D': // disk_screen
disk_init();
disk_init ();
break;
case 'x':
case 'X': // xload_screen
load_init();
load_init ();
break;
case 'b':
case 'B': // battery_screen
batt_init();
batt_init ();
break;
case 'a':
case 'A': // credit_screen
@@ -118,7 +115,8 @@ int mode_init(mode *sequence)
case 'P': // cpu_smp_screen
cpu_smp_init ();
break;
default: break;
default:
break;
}
}
@@ -127,54 +125,81 @@ int mode_init(mode *sequence)
return 0;
}
void mode_close()
void
mode_close ()
{
batt_close();
chrono_close();
cpu_close();
disk_close();
load_close();
mem_close();
batt_close ();
chrono_close ();
cpu_close ();
disk_close ();
load_close ();
mem_close ();
cpu_smp_close ();
}
int update_screen(mode *m, int display)
int
update_screen (mode * m, int display)
{
static int status = -1;
int old_status = status;
if(m)
{
switch(m->which)
{
if (m) {
switch (m->which) {
case 'g':
case 'G': status = cpu_graph_screen(m->timer, display); break;
case 'G':
status = cpu_graph_screen (m->timer, display);
break;
case 'c':
case 'C': status = cpu_screen(m->timer, display); break;
case 'C':
status = cpu_screen (m->timer, display);
break;
case 'o':
case 'O': status = clock_screen(m->timer, display); break;
case 'O':
status = clock_screen (m->timer, display);
break;
case 'k':
case 'K': status = big_clock_screen(m->timer, display); break;
case 'K':
status = big_clock_screen (m->timer, display);
break;
case 'm':
case 'M': status = mem_screen(m->timer, display); break;
case 'M':
status = mem_screen (m->timer, display);
break;
case 's':
case 'S': status = mem_top_screen(m->timer, display); break;
case 'S':
status = mem_top_screen (m->timer, display);
break;
case 'u':
case 'U': status = uptime_screen(m->timer, display); break;
case 'U':
status = uptime_screen (m->timer, display);
break;
case 't':
case 'T': status = time_screen(m->timer, display); break;
case 'T':
status = time_screen (m->timer, display);
break;
case 'd':
case 'D': status = disk_screen(m->timer, display); break;
case 'D':
status = disk_screen (m->timer, display);
break;
case 'x':
case 'X': status = xload_screen(m->timer, display); break;
case 'X':
status = xload_screen (m->timer, display);
break;
case 'b':
case 'B': status = battery_screen(m->timer, display); break;
case 'B':
status = battery_screen (m->timer, display);
break;
case 'a':
case 'A': status = credit_screen(m->timer, display); break;
case 'A':
status = credit_screen (m->timer, display);
break;
case 'p':
case 'P': status = cpu_smp_screen (m->timer, display); break;
default: break;
case 'P':
status = cpu_smp_screen (m->timer, display);
break;
default:
break;
}
/* Debugging tool...
if(display)
@@ -184,19 +209,15 @@ int update_screen(mode *m, int display)
*/
}
if(status != old_status)
{
if(status == BACKLIGHT_OFF)
{
sock_send_string(sock, "backlight off\n");
if (status != old_status) {
if (status == BACKLIGHT_OFF) {
sock_send_string (sock, "backlight off\n");
}
if(status == BACKLIGHT_ON)
{
sock_send_string(sock, "backlight on\n");
if (status == BACKLIGHT_ON) {
sock_send_string (sock, "backlight on\n");
}
if(status == BLINK_ON)
{
sock_send_string(sock, "backlight blink\n");
if (status == BLINK_ON) {
sock_send_string (sock, "backlight blink\n");
}
}
return status;
@@ -204,29 +225,32 @@ int update_screen(mode *m, int display)
}
void reread(int f, char *errmsg)
void
reread (int f, char *errmsg)
{
if (lseek(f, 0L, 0) == 0 && read(f, buffer, sizeof(buffer) - 1 ) > 0 )
if (lseek (f, 0L, 0) == 0 && read (f, buffer, sizeof (buffer) - 1) > 0)
return;
perror(errmsg);
exit(1);
perror (errmsg);
exit (1);
}
int getentry(const char *tag, const char *bufptr)
int
getentry (const char *tag, const char *bufptr)
{
char *tail;
int retval, len = strlen(tag);
int retval, len = strlen (tag);
while (bufptr)
{
if (*bufptr == '\n') bufptr++;
if (!strncmp(tag, bufptr, len))
{
retval = strtol(bufptr + len, &tail, 10);
if (tail == bufptr + len) return -1;
else return retval;
while (bufptr) {
if (*bufptr == '\n')
bufptr++;
if (!strncmp (tag, bufptr, len)) {
retval = strtol (bufptr + len, &tail, 10);
if (tail == bufptr + len)
return -1;
else
return retval;
}
bufptr = strchr( bufptr, '\n');
bufptr = strchr (bufptr, '\n');
}
return -1;
}
@@ -246,44 +270,31 @@ char tmp[1024];
////////////////////////////////////////////////////////////////////////
// Credit Screen shows who wrote this...
//
int credit_screen(int rep, int display)
int
credit_screen (int rep, int display)
{
static int first = 1;
if(first)
{
if (first) {
first = 0;
sock_send_string(sock, "screen_add A\n");
sock_send_string(sock,
"screen_set A -name {Credits for LCDproc}\n");
sock_send_string(sock, "widget_add A title title\n");
sprintf(tmp, "widget_set A title {LCDPROC %s}\n", version);
sock_send_string(sock, tmp);
if(lcd_hgt >= 4)
{
sock_send_string(sock, "widget_add A one string\n");
sock_send_string(sock, "widget_add A two string\n");
sock_send_string(sock, "widget_add A three string\n");
sock_send_string(sock,
"widget_set A one 1 2 { for Linux }\n");
sock_send_string(sock,
"widget_set A two 1 3 { by William Ferrell}\n");
sock_send_string(sock,
"widget_set A three 1 4 { and Scott Scriven}\n");
}
else
{
sock_send_string(sock, "widget_add A text scroller\n");
sock_send_string(sock,
"widget_set A text 1 2 20 2 v 8 { for Linux by William Ferrell and Scott Scriven}\n");
sock_send_string (sock, "screen_add A\n");
sock_send_string (sock, "screen_set A -name {Credits for LCDproc}\n");
sock_send_string (sock, "widget_add A title title\n");
sprintf (tmp, "widget_set A title {LCDPROC %s}\n", version);
sock_send_string (sock, tmp);
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add A one string\n");
sock_send_string (sock, "widget_add A two string\n");
sock_send_string (sock, "widget_add A three string\n");
sock_send_string (sock, "widget_set A one 1 2 { for Linux }\n");
sock_send_string (sock, "widget_set A two 1 3 { by William Ferrell}\n");
sock_send_string (sock, "widget_set A three 1 4 { and Scott Scriven}\n");
} else {
sock_send_string (sock, "widget_add A text scroller\n");
sock_send_string (sock, "widget_set A text 1 2 20 2 v 8 { for Linux by William Ferrell and Scott Scriven}\n");
}
}
return 0;
} // End credit_screen()
+6 -6
View File
@@ -16,16 +16,16 @@ extern int PAD;
// Character for the "..." symbol.
extern int ELLIPSIS;
int mode_init(mode *sequence);
void mode_close();
int mode_init (mode * sequence);
void mode_close ();
int update_screen(mode *m, int display);
int update_screen (mode * m, int display);
int credit_screen(int rep, int display);
int credit_screen (int rep, int display);
// These are for the modescreens' use only..
void reread(int f, char *errmsg);
int getentry(const char *tag, const char *bufptr);
void reread (int f, char *errmsg);
int getentry (const char *tag, const char *bufptr);
#endif
+24 -26
View File
@@ -19,17 +19,18 @@
int client_data_init(client_data *d)
int
client_data_init (client_data * d)
{
if(!d) return -1;
if (!d)
return -1;
d->ack = 0;
d->name = NULL;
d->screenlist = LL_new();
if(!d->screenlist)
{
fprintf(stderr, "client_data_init: Error allocating screenlist\n");
d->screenlist = LL_new ();
if (!d->screenlist) {
fprintf (stderr, "client_data_init: Error allocating screenlist\n");
return -1;
}
/* TODO: this section... (client menus)
@@ -43,47 +44,44 @@ int client_data_init(client_data *d)
return 0;
}
int client_data_destroy(client_data *d)
int
client_data_destroy (client_data * d)
{
screen *s;
debug("client_data_destroy\n");
debug ("client_data_destroy\n");
if(!d) return -1;
if (!d)
return -1;
d->ack = 0;
// Clean up the name...
if(d->name)
free(d->name);
if (d->name)
free (d->name);
// Clean up the screenlist...
debug("client_data_destroy: Cleaning screenlist\n");
LL_Rewind(d->screenlist);
debug ("client_data_destroy: Cleaning screenlist\n");
LL_Rewind (d->screenlist);
do {
s = (screen *)LL_Get(d->screenlist);
if(s)
{
debug("client_data_destroy: removing screen %s\n", s->id);
s = (screen *) LL_Get (d->screenlist);
if (s) {
debug ("client_data_destroy: removing screen %s\n", s->id);
// FIXME? This shouldn't be handled here...
// Now, remove it from the screenlist...
if(screenlist_remove_all(s) < 0)
{
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf(stderr, "client_data_destroy: Error dequeueing screen\n");
fprintf (stderr, "client_data_destroy: Error dequeueing screen\n");
return 0;
}
// Free its memory...
screen_destroy(s);
screen_destroy (s);
}
} while(LL_Next(d->screenlist) == 0);
LL_Destroy(d->screenlist);
} while (LL_Next (d->screenlist) == 0);
LL_Destroy (d->screenlist);
// TODO: clean up the rest of the data...
return 0;
}
+5 -6
View File
@@ -6,21 +6,20 @@
#define CLIENT_NAME_SIZE 256
typedef struct client_data
{
typedef struct client_data {
int ack;
char *name;
// and other stuff... doesn't matter yet
LL * screenlist;
LL *screenlist;
// list of accepted keys... (?)
LL * menulist;
LL *menulist;
} client_data;
// sets up an existing (empty) client_data struct
int client_data_init(client_data *d);
int client_data_init (client_data * d);
// destroys members of a client's data
int client_data_destroy(client_data *d);
int client_data_destroy (client_data * d);
#endif
+350 -446
View File
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,32 +7,31 @@
point to a function to call, defined below.
*/
typedef struct client_function
{
typedef struct client_function {
char *keyword;
int (*function)(client *c, int argc, char **argv);
int (*function) (client * c, int argc, char **argv);
} client_function;
// FIXME? Do these really need to be visible from other sources?
int test_func_func(client *c, int argc, char **argv);
int hello_func(client *c, int argc, char **argv);
int client_set_func(client *c, int argc, char **argv);
int client_add_key_func(client *c, int argc, char **argv);
int client_del_key_func(client *c, int argc, char **argv);
int screen_add_func(client *c, int argc, char **argv);
int screen_del_func(client *c, int argc, char **argv);
int screen_set_func(client *c, int argc, char **argv);
int widget_add_func(client *c, int argc, char **argv);
int widget_del_func(client *c, int argc, char **argv);
int widget_set_func(client *c, int argc, char **argv);
int menu_add_func(client *c, int argc, char **argv);
int menu_del_func(client *c, int argc, char **argv);
int menu_set_func(client *c, int argc, char **argv);
int menu_item_add_func(client *c, int argc, char **argv);
int menu_item_del_func(client *c, int argc, char **argv);
int menu_item_set_func(client *c, int argc, char **argv);
int backlight_func(client *c, int argc, char **argv);
int output_func(client *c, int argc, char **argv);
int test_func_func (client * c, int argc, char **argv);
int hello_func (client * c, int argc, char **argv);
int client_set_func (client * c, int argc, char **argv);
int client_add_key_func (client * c, int argc, char **argv);
int client_del_key_func (client * c, int argc, char **argv);
int screen_add_func (client * c, int argc, char **argv);
int screen_del_func (client * c, int argc, char **argv);
int screen_set_func (client * c, int argc, char **argv);
int widget_add_func (client * c, int argc, char **argv);
int widget_del_func (client * c, int argc, char **argv);
int widget_set_func (client * c, int argc, char **argv);
int menu_add_func (client * c, int argc, char **argv);
int menu_del_func (client * c, int argc, char **argv);
int menu_set_func (client * c, int argc, char **argv);
int menu_item_add_func (client * c, int argc, char **argv);
int menu_item_del_func (client * c, int argc, char **argv);
int menu_item_set_func (client * c, int argc, char **argv);
int backlight_func (client * c, int argc, char **argv);
int output_func (client * c, int argc, char **argv);
extern client_function commands[];
+3 -5
View File
@@ -8,14 +8,12 @@
what the user does.
*/
typedef struct client_menu
{
typedef struct client_menu {
char id[];
LL * items;
LL *items;
} client_menu;
typedef struct client_menu_item
{
typedef struct client_menu_item {
char id[];
int type; // Title, function, submenu, slider, checkbox, etc...
int value; // Holds stuff like "true", 43, etc...
+89 -96
View File
@@ -22,81 +22,72 @@
LL * clients;
LL *clients;
// Initialize and kill client list...
int client_init()
int
client_init ()
{
debug("client_init()\n");
debug ("client_init()\n");
clients = LL_new();
if(!clients)
{
fprintf(stderr, "client_init: Unable to create client list\n");
clients = LL_new ();
if (!clients) {
fprintf (stderr, "client_init: Unable to create client list\n");
return -1;
}
return 0;
}
int client_shutdown()
int
client_shutdown ()
{
// TODO: Close all connections first...
client *c;
debug("client_shutdown()\n");
debug ("client_shutdown()\n");
// Free all client structures...
// Note that the regular list loop doesn't work here, because
// client_destroy() calls LL_Remove()
for(c = LL_Pop(clients);
c;
c = LL_Pop(clients))
{
debug("client_shutdown: ...\n");
if(c)
{
debug("client_shutdown: ... %i ...\n", c->sock);
if(0 != client_destroy(c))
{
fprintf(stderr, "client_shutdown: Error freeing client\n");
for (c = LL_Pop (clients); c; c = LL_Pop (clients)) {
debug ("client_shutdown: ...\n");
if (c) {
debug ("client_shutdown: ... %i ...\n", c->sock);
if (0 != client_destroy (c)) {
fprintf (stderr, "client_shutdown: Error freeing client\n");
} else {
debug ("client_shutdown: Freed client...\n");
}
else
{
debug("client_shutdown: Freed client...\n");
}
}
else
{
debug("client_shutdown: No client!\n");
} else {
debug ("client_shutdown: No client!\n");
}
}
// Then, free the list...
LL_Destroy(clients);
LL_Destroy (clients);
debug("client_shutdown: done\n");
debug ("client_shutdown: done\n");
return 0;
}
// Create and destroy clients....
client * client_create(int sock)
client *
client_create (int sock)
{
client *c;
debug("client_create(%i)\n", sock);
debug ("client_create(%i)\n", sock);
// Allocate new client...
c = malloc(sizeof(client));
if(!c)
{
fprintf(stderr, "client_create: error allocating new client\n");
c = malloc (sizeof (client));
if (!c) {
fprintf (stderr, "client_create: error allocating new client\n");
return NULL;
}
// Init struct members
c->sock = 0;
c->data = NULL;
@@ -106,58 +97,54 @@ client * client_create(int sock)
c->sock = sock;
// Set up message list...
c->messages = LL_new();
if(!c->messages)
{
fprintf(stderr, "client_create: error allocating message list\n");
free(c);
c->messages = LL_new ();
if (!c->messages) {
fprintf (stderr, "client_create: error allocating message list\n");
free (c);
return NULL;
}
// TODO: allocate and init client data...
c->data = malloc(sizeof(client_data));
if(!c->data)
{
fprintf(stderr, "client_create: error allocating client data\n");
free(c->messages);
free(c);
c->data = malloc (sizeof (client_data));
if (!c->data) {
fprintf (stderr, "client_create: error allocating client data\n");
free (c->messages);
free (c);
return NULL;
} else if (client_data_init (c->data) < 0) {
return NULL;
}
else if(client_data_init(c->data) < 0)
{
return NULL;
}
// TODO: Check for errors while adding the client to the list?
LL_Push(clients, (void *)c);
LL_Push (clients, (void *) c);
return c;
}
int client_destroy(client *c)
int
client_destroy (client * c)
{
// TODO: Close the socket connection here?
int err;
char *str;
debug("client_destroy()\n");
debug ("client_destroy()\n");
if(!c) return -1;
if (!c)
return -1;
// Eat the rest of the incoming requests...
debug("client_destroy: get_messages\n");
while((str = client_get_message(c)))
{
if(str) {
debug("client_destroy: kill message %s\n", str);
free(str);
debug ("client_destroy: get_messages\n");
while ((str = client_get_message (c))) {
if (str) {
debug ("client_destroy: kill message %s\n", str);
free (str);
}
}
err = LL_Destroy(c->messages);
err = LL_Destroy (c->messages);
// Free client's other data
client_data_destroy(c->data);
client_data_destroy (c->data);
/*
// FIXME? Should the connection get closed here or elsewhere?
@@ -166,15 +153,16 @@ int client_destroy(client *c)
*/
// Remove the client from the clients list...
LL_Remove(clients, c);
LL_Remove (clients, c);
free(c);
free (c);
return 0;
}
// Add and remove messages from the client's queue...
int client_add_message(client *c, char *message)
int
client_add_message (client * c, char *message)
{
int err = 0;
char *dup;
@@ -184,45 +172,47 @@ int client_add_message(client *c, char *message)
//debug("client_add_message(%s)\n", message);
if(!c) return -1;
if(!message) return -1;
if (!c)
return -1;
if (!message)
return -1;
// len = strlen(message);
// if(len < 1) return 0;
// Copy the string to avoid overwriting the original...
dup = strdup(message);
if(!dup)
{
fprintf(stderr, "client_add_message: Error allocating new string\n");
dup = strdup (message);
if (!dup) {
fprintf (stderr, "client_add_message: Error allocating new string\n");
return -1;
}
// Now split the string into lines and enqueue each one...
for(str = strtok(dup, delimiters); str; str=strtok(NULL, delimiters))
{
cp = strdup(str);
debug("client_add_message: %s\n", cp);
err += LL_Enqueue(c->messages, (void *)cp);
for (str = strtok (dup, delimiters); str; str = strtok (NULL, delimiters)) {
cp = strdup (str);
debug ("client_add_message: %s\n", cp);
err += LL_Enqueue (c->messages, (void *) cp);
}
//debug("client_add_message(%s): %i errors\n", message, err);
free(dup); // Fixed memory leak...
free (dup); // Fixed memory leak...
// Err is the number of errors encountered...
return err;
}
// Woo-hoo! A simple function. :)
char * client_get_message(client *c)
char *
client_get_message (client * c)
{
char *str;
//debug("client_get_message()\n");
if(!c) return NULL;
if (!c)
return NULL;
str = (char *)LL_Dequeue(c->messages);
str = (char *) LL_Dequeue (c->messages);
//debug("client_get_message: \"%s\"\n", str);
@@ -230,12 +220,15 @@ char * client_get_message(client *c)
}
// Get and set the client's data...
int client_set(client *c, void *data)
int
client_set (client * c, void *data)
{
// You know, I really doubt this function will be useful...
return 0;
}
void * client_get(client *c)
void *
client_get (client * c)
{
// But this one might be handy...
@@ -243,24 +236,24 @@ void * client_get(client *c)
}
client * client_find_sock(int sock)
client *
client_find_sock (int sock)
{
client * c;
client *c;
// debug("client_find_sock(%i)\n", sock);
LL_Rewind(clients);
do{
c = (client *)LL_Get(clients);
LL_Rewind (clients);
do {
c = (client *) LL_Get (clients);
// debug("client_find_sock: ... %i ...\n", c->sock);
if(c->sock == sock)
{
if (c->sock == sock) {
// debug("client_find_sock: ..! %i !..\n", c->sock);
return c;
}
} while(LL_Next(clients) == 0);
} while (LL_Next (clients) == 0);
debug("client_find_sock: failed\n");
debug ("client_find_sock: failed\n");
return NULL;
}
+10 -11
View File
@@ -4,8 +4,7 @@
#include "client_data.h"
#include "../shared/LL.h"
typedef struct client
{
typedef struct client {
int sock;
LL *messages;
client_data *data;
@@ -16,25 +15,25 @@ extern LL *clients;
// Initialize and kill client list...
int client_init();
int client_shutdown();
int client_init ();
int client_shutdown ();
// Create and destroy clients....
client * client_create(int sock);
int client_destroy(client *c);
client *client_create (int sock);
int client_destroy (client * c);
// Add and remove messages from the client's queue...
int client_add_message(client *c, char *message);
char * client_get_message(client *c);
int client_add_message (client * c, char *message);
char *client_get_message (client * c);
// Get and set the client's data...
// Not used at all yet, and may never be. Oh, well.
int client_set(client *c, void *data);
void * client_get(client *c);
int client_set (client * c, void *data);
void *client_get (client * c);
// Search for a client with a particular filedescriptor...
client * client_find_sock(int sock);
client *client_find_sock (int sock);
#endif
+335 -354
View File
@@ -14,21 +14,22 @@
#include "../../shared/debug.h"
#include "../../shared/str.h"
static int custom=0;
static int custom = 0;
typedef enum {
hbar = 1,
vbar = 2,
bign = 4,
beat = 8 } custom_type;
beat = 8
} custom_type;
static int fd;
static void CFontz_linewrap(int on);
static void CFontz_autoscroll(int on);
static void CFontz_hidecursor();
static void CFontz_reboot();
static void CFontz_linewrap (int on);
static void CFontz_autoscroll (int on);
static void CFontz_hidecursor ();
static void CFontz_reboot ();
// TODO: Get rid of this variable?
lcd_logical_driver *CFontz;
@@ -37,24 +38,25 @@ lcd_logical_driver *CFontz;
/////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly...
//
int CFontz_init(lcd_logical_driver *driver, char *args)
int
CFontz_init (lcd_logical_driver * driver, char *args)
{
char *argv[64];
int argc;
struct termios portset;
int i;
int tmp;
int reboot=0;
int reboot = 0;
int contrast=140;
int contrast = 140;
char device[256] = "/dev/lcd";
int speed=B9600;
int speed = B9600;
CFontz = driver;
//debug("CFontz_init: Args(all): %s\n", args);
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
/*
for(i=0; i<argc; i++)
@@ -63,150 +65,113 @@ int CFontz_init(lcd_logical_driver *driver, char *args)
}
*/
for(i=0; i<argc; i++)
{
for (i = 0; i < argc; i++) {
//printf("Arg(%i): %s\n", i, argv[i]);
if(0 == strcmp(argv[i], "-d") ||
0 == strcmp(argv[i], "--device"))
{
if(i + 1 > argc) {
fprintf(stderr, "CFontz_init: %s requires an argument\n",
argv[i]);
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--device")) {
if (i + 1 > argc) {
fprintf (stderr, "CFontz_init: %s requires an argument\n", argv[i]);
return -1;
}
strcpy(device, argv[++i]);
}
else if(0 == strcmp(argv[i], "-c") ||
0 == strcmp(argv[i], "--contrast"))
{
if(i + 1 > argc) {
fprintf(stderr, "CFontz_init: %s requires an argument\n",
argv[i]);
strcpy (device, argv[++i]);
} else if (0 == strcmp (argv[i], "-c") || 0 == strcmp (argv[i], "--contrast")) {
if (i + 1 > argc) {
fprintf (stderr, "CFontz_init: %s requires an argument\n", argv[i]);
return -1;
}
tmp = atoi(argv[++i]);
if((tmp < 0) || (tmp > 255)){
fprintf(stderr, "CFontz_init: %s argument must between 0 and 255. Using default value.\n",
argv[i]);
} else contrast = tmp;
}
else if(0 == strcmp(argv[i], "-b") ||
0 == strcmp(argv[i], "--brightness"))
{
if(i + 1 > argc) {
fprintf(stderr, "CFontz_init: %s requires an argument\n",
argv[i]);
tmp = atoi (argv[++i]);
if ((tmp < 0) || (tmp > 255)) {
fprintf (stderr, "CFontz_init: %s argument must between 0 and 255. Using default value.\n", argv[i]);
} else
contrast = tmp;
} else if (0 == strcmp (argv[i], "-b") || 0 == strcmp (argv[i], "--brightness")) {
if (i + 1 > argc) {
fprintf (stderr, "CFontz_init: %s requires an argument\n", argv[i]);
return -1;
}
tmp = atoi(argv[++i]);
if((tmp < 0) || (tmp > 255)){
fprintf(stderr, "CFontz_init: %s argument must between 0 and 255. Using default value.\n",
argv[i]);
} else backlight_brightness = tmp;
}
else if(0 == strcmp(argv[i], "-o") ||
0 == strcmp(argv[i], "--off-bright"))
{
if(i + 1 > argc) {
fprintf(stderr, "CFontz_init: %s requires an argument\n",
argv[i]);
tmp = atoi (argv[++i]);
if ((tmp < 0) || (tmp > 255)) {
fprintf (stderr, "CFontz_init: %s argument must between 0 and 255. Using default value.\n", argv[i]);
} else
backlight_brightness = tmp;
} else if (0 == strcmp (argv[i], "-o") || 0 == strcmp (argv[i], "--off-bright")) {
if (i + 1 > argc) {
fprintf (stderr, "CFontz_init: %s requires an argument\n", argv[i]);
return -1;
}
tmp = atoi(argv[++i]);
if((tmp < 0) || (tmp > 255)){
fprintf(stderr, "CFontz_init: %s argument must between 0 and 255. Using default value.\n",
argv[i]);
} else backlight_off_brightness = tmp;
}
else if(0 == strcmp(argv[i], "-s") ||
0 == strcmp(argv[i], "--speed"))
{
if(i + 1 > argc) {
fprintf(stderr, "CFontz_init: %s requires an argument\n",
argv[i]);
tmp = atoi (argv[++i]);
if ((tmp < 0) || (tmp > 255)) {
fprintf (stderr, "CFontz_init: %s argument must between 0 and 255. Using default value.\n", argv[i]);
} else
backlight_off_brightness = tmp;
} else if (0 == strcmp (argv[i], "-s") || 0 == strcmp (argv[i], "--speed")) {
if (i + 1 > argc) {
fprintf (stderr, "CFontz_init: %s requires an argument\n", argv[i]);
return -1;
}
tmp = atoi(argv[++i]);
if(tmp==1200) speed=B1200;
else if(tmp==2400) speed=B2400;
else if(tmp==9600) speed=B9600;
else if(tmp==19200) speed=B19200;
tmp = atoi (argv[++i]);
if (tmp == 1200)
speed = B1200;
else if (tmp == 2400)
speed = B2400;
else if (tmp == 9600)
speed = B9600;
else if (tmp == 19200)
speed = B19200;
else {
fprintf(stderr, "CFontz_init: %s argument must be 1200, 2400, or 9600. Using default value.\n",
argv[i]);
fprintf (stderr, "CFontz_init: %s argument must be 1200, 2400, or 9600. Using default value.\n", argv[i]);
}
}
else if(0 == strcmp(argv[i], "-h") ||
0 == strcmp(argv[i], "--help"))
{
printf("LCDproc CrystalFontz LCD driver\n"
"\t-d\t--device\tSelect the output device to use [/dev/lcd]\n"
"\t-t\t--type\t\tSelect the LCD type (size) [20x4]\n"
"\t-c\t--contrast\tSet the initial contrast [140]\n"
"\t-b\t--brightness\tSet the initial brightness [255]\n"
"\t-o\t--off-bright\tSet the initial brightness [0]\n"
"\t-s\t--speed\t\tSet the communication speed [9600]\n"
"\t-r\t--reboot\tReinitialize the LCD's BIOS\n"
"\t-h\t--help\t\tShow this help information\n");
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
printf ("LCDproc CrystalFontz LCD driver\n" "\t-d\t--device\tSelect the output device to use [/dev/lcd]\n" "\t-t\t--type\t\tSelect the LCD type (size) [20x4]\n" "\t-c\t--contrast\tSet the initial contrast [140]\n" "\t-b\t--brightness\tSet the initial brightness [255]\n" "\t-o\t--off-bright\tSet the initial brightness [0]\n" "\t-s\t--speed\t\tSet the communication speed [9600]\n" "\t-r\t--reboot\tReinitialize the LCD's BIOS\n" "\t-h\t--help\t\tShow this help information\n");
return -1;
}
else if(0 == strcmp(argv[i], "-r") ||
0 == strcmp(argv[i], "--reboot"))
{
printf("LCDd: rebooting CrystalFontz LCD...\n");
reboot=1;
}
else
{
printf("Invalid parameter: %s\n", argv[i]);
} else if (0 == strcmp (argv[i], "-r") || 0 == strcmp (argv[i], "--reboot")) {
printf ("LCDd: rebooting CrystalFontz LCD...\n");
reboot = 1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
// Set up io port correctly, and open it...
fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
fprintf(stderr, "CFontz_init: failed (%s)\n", strerror(errno));
fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
fprintf (stderr, "CFontz_init: failed (%s)\n", strerror (errno));
return -1;
}
//else fprintf(stderr, "CFontz_init: opened device %s\n", device);
tcgetattr(fd, &portset);
tcgetattr (fd, &portset);
// This is necessary in Linux, but does not exist in irix.
#ifndef IRIX
cfmakeraw(&portset);
cfmakeraw (&portset);
#endif
cfsetospeed(&portset, speed);
cfsetispeed(&portset, speed);
tcsetattr(fd, TCSANOW, &portset);
cfsetospeed (&portset, speed);
cfsetispeed (&portset, speed);
tcsetattr (fd, TCSANOW, &portset);
// Set display-specific stuff..
if(reboot)
{
CFontz_reboot();
sleep(4);
reboot=0;
if (reboot) {
CFontz_reboot ();
sleep (4);
reboot = 0;
}
sleep(1);
CFontz_hidecursor();
CFontz_linewrap(1);
CFontz_autoscroll(0);
CFontz_backlight(backlight_brightness);
sleep (1);
CFontz_hidecursor ();
CFontz_linewrap (1);
CFontz_autoscroll (0);
CFontz_backlight (backlight_brightness);
if(!driver->framebuf)
{
fprintf(stderr, "CFontz_init: No frame buffer.\n");
driver->close();
if (!driver->framebuf) {
fprintf (stderr, "CFontz_init: No frame buffer.\n");
driver->close ();
return -1;
}
// Set the functions the driver supports...
driver->clear = (void *)-1;
driver->string = (void *)-1;
driver->clear = (void *) -1;
driver->string = (void *) -1;
// driver->chr = CFontz_chr;
driver->chr = CFontz_chr;
driver->vbar = CFontz_vbar;
@@ -226,12 +191,12 @@ int CFontz_init(lcd_logical_driver *driver, char *args)
driver->icon = CFontz_icon;
driver->draw_frame = CFontz_draw_frame;
CFontz_contrast(contrast);
CFontz_contrast (contrast);
lcd.cellwid = 6;
lcd.cellhgt = 8;
debug("CFontz: foo!\n");
debug ("CFontz: foo!\n");
return fd;
}
@@ -241,24 +206,28 @@ int CFontz_init(lcd_logical_driver *driver, char *args)
/////////////////////////////////////////////////////////////////
// Clean-up
//
void CFontz_close()
void
CFontz_close ()
{
close (fd);
if(CFontz->framebuf) free(CFontz->framebuf);
if (CFontz->framebuf)
free (CFontz->framebuf);
CFontz->framebuf = NULL;
}
void CFontz_flush()
void
CFontz_flush ()
{
CFontz_draw_frame(lcd.framebuf);
CFontz_draw_frame (lcd.framebuf);
}
void CFontz_flush_box(int lft, int top, int rgt, int bot)
void
CFontz_flush_box (int lft, int top, int rgt, int bot)
{
int y;
char out[LCD_MAX_WIDTH];
@@ -266,11 +235,10 @@ void CFontz_flush_box(int lft, int top, int rgt, int bot)
// printf("Flush (%i,%i)-(%i,%i)\n", lft, top, rgt, bot);
for(y=top; y<=bot; y++)
{
sprintf(out, "%c%c%c", 17, lft, y);
write(fd, out, 4);
write(fd, lcd.framebuf+(y*lcd.wid)+lft, rgt-lft+1);
for (y = top; y <= bot; y++) {
sprintf (out, "%c%c%c", 17, lft, y);
write (fd, out, 4);
write (fd, lcd.framebuf + (y * lcd.wid) + lft, rgt - lft + 1);
}
@@ -282,31 +250,33 @@ void CFontz_flush_box(int lft, int top, int rgt, int bot)
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void CFontz_chr(int x, int y, char c)
void
CFontz_chr (int x, int y, char c)
{
y--;
x--;
if(c < 32 && c >= 0) c += 128;
lcd.framebuf[(y*lcd.wid) + x] = c;
if (c < 32 && c >= 0)
c += 128;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
/////////////////////////////////////////////////////////////////
// Changes screen contrast (0-255; 140 seems good)
//
int CFontz_contrast(int contrast)
int
CFontz_contrast (int contrast)
{
int realcontrast;
char out[4];
static int status=140;
static int status = 140;
if(contrast > 0)
{
status=contrast;
realcontrast = (((int)(status)) * 100) / 255;
sprintf(out, "%c%c", 15, realcontrast);
write(fd, out, 3);
if (contrast > 0) {
status = contrast;
realcontrast = (((int) (status)) * 100) / 255;
sprintf (out, "%c%c", 15, realcontrast);
write (fd, out, 3);
}
return status;
@@ -317,249 +287,255 @@ int CFontz_contrast(int contrast)
// Sets the backlight on or off -- can be done quickly for
// an intermediate brightness...
//
void CFontz_backlight(int on)
void
CFontz_backlight (int on)
{
char out[4];
if(on)
{
sprintf(out, "%c%c", 14, (unsigned char)(on * 100 / 255));
if (on) {
sprintf (out, "%c%c", 14, (unsigned char) (on * 100 / 255));
//sprintf(out, "%c%c", 14, 100);
} else {
sprintf (out, "%c%c", 14, 0);
}
else
{
sprintf(out, "%c%c", 14, 0);
}
write(fd, out, 3);
write (fd, out, 3);
}
/////////////////////////////////////////////////////////////////
// Toggle the built-in linewrapping feature
//
static void CFontz_linewrap(int on)
static void
CFontz_linewrap (int on)
{
char out[4];
if(on)
sprintf(out, "%c", 23);
if (on)
sprintf (out, "%c", 23);
else
sprintf(out, "%c", 24);
write(fd, out, 1);
sprintf (out, "%c", 24);
write (fd, out, 1);
}
/////////////////////////////////////////////////////////////////
// Toggle the built-in automatic scrolling feature
//
static void CFontz_autoscroll(int on)
static void
CFontz_autoscroll (int on)
{
char out[4];
if(on)
sprintf(out, "%c", 19);
if (on)
sprintf (out, "%c", 19);
else
sprintf(out, "%c", 20);
write(fd, out, 1);
sprintf (out, "%c", 20);
write (fd, out, 1);
}
/////////////////////////////////////////////////////////////////
// Get rid of the blinking curson
//
static void CFontz_hidecursor()
static void
CFontz_hidecursor ()
{
char out[4];
sprintf(out, "%c", 4);
write(fd, out, 1);
sprintf (out, "%c", 4);
write (fd, out, 1);
}
/////////////////////////////////////////////////////////////////
// Reset the display bios
//
static void CFontz_reboot()
static void
CFontz_reboot ()
{
char out[4];
sprintf(out, "%c", 26);
write(fd, out, 1);
sprintf (out, "%c", 26);
write (fd, out, 1);
}
/////////////////////////////////////////////////////////////////
// Sets up for vertical bars. Call before lcd.vbar()
//
void CFontz_init_vbar()
void
CFontz_init_vbar ()
{
char a[] = {
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
};
char b[] = {
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,1,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
};
char c[] = {
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
};
char d[] = {
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
};
char e[] = {
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
};
char f[] = {
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
};
char g[] = {
0,0,0,0,0,0,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0,1,1,1,1,1,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1,
};
if(custom!=vbar) {
CFontz_set_char(1,a);
CFontz_set_char(2,b);
CFontz_set_char(3,c);
CFontz_set_char(4,d);
CFontz_set_char(5,e);
CFontz_set_char(6,f);
CFontz_set_char(7,g);
custom=vbar;
if (custom != vbar) {
CFontz_set_char (1, a);
CFontz_set_char (2, b);
CFontz_set_char (3, c);
CFontz_set_char (4, d);
CFontz_set_char (5, e);
CFontz_set_char (6, f);
CFontz_set_char (7, g);
custom = vbar;
}
}
/////////////////////////////////////////////////////////////////
// Inits horizontal bars...
//
void CFontz_init_hbar()
void
CFontz_init_hbar ()
{
char a[] = {
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
};
char b[] = {
1,1,0,0,0,0,
1,1,0,0,0,0,
1,1,0,0,0,0,
1,1,0,0,0,0,
1,1,0,0,0,0,
1,1,0,0,0,0,
1,1,0,0,0,0,
1,1,0,0,0,0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0,
};
char c[] = {
1,1,1,0,0,0,
1,1,1,0,0,0,
1,1,1,0,0,0,
1,1,1,0,0,0,
1,1,1,0,0,0,
1,1,1,0,0,0,
1,1,1,0,0,0,
1,1,1,0,0,0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 0, 0,
};
char d[] = {
1,1,1,1,0,0,
1,1,1,1,0,0,
1,1,1,1,0,0,
1,1,1,1,0,0,
1,1,1,1,0,0,
1,1,1,1,0,0,
1,1,1,1,0,0,
1,1,1,1,0,0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 0, 0,
};
char e[] = {
1,1,1,1,1,0,
1,1,1,1,1,0,
1,1,1,1,1,0,
1,1,1,1,1,0,
1,1,1,1,1,0,
1,1,1,1,1,0,
1,1,1,1,1,0,
1,1,1,1,1,0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0,
};
char f[] = {
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
};
if(custom!=hbar) {
CFontz_set_char(1,a);
CFontz_set_char(2,b);
CFontz_set_char(3,c);
CFontz_set_char(4,d);
CFontz_set_char(5,e);
CFontz_set_char(6,f);
custom=hbar;
if (custom != hbar) {
CFontz_set_char (1, a);
CFontz_set_char (2, b);
CFontz_set_char (3, c);
CFontz_set_char (4, d);
CFontz_set_char (5, e);
CFontz_set_char (6, f);
custom = hbar;
}
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar...
//
void CFontz_vbar(int x, int len)
void
CFontz_vbar (int x, int len)
{
char map[9] = {32, 1, 2, 3, 4, 5, 6, 7, 255 };
char map[9] = { 32, 1, 2, 3, 4, 5, 6, 7, 255 };
int y;
for(y=lcd.hgt; y > 0 && len>0; y--)
{
if(len >= lcd.cellhgt) CFontz_chr(x, y, 255);
else CFontz_chr(x, y, map[len]);
for (y = lcd.hgt; y > 0 && len > 0; y--) {
if (len >= lcd.cellhgt)
CFontz_chr (x, y, 255);
else
CFontz_chr (x, y, map[len]);
len -= lcd.cellhgt;
}
@@ -569,14 +545,16 @@ void CFontz_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void CFontz_hbar(int x, int y, int len)
void
CFontz_hbar (int x, int y, int len)
{
char map[7] = { 32, 1, 2, 3, 4, 5, 6 };
for(; x<=lcd.wid && len>0; x++)
{
if(len >= lcd.cellwid) CFontz_chr(x,y,map[6]);
else CFontz_chr(x, y, map[len]);
for (; x <= lcd.wid && len > 0; x++) {
if (len >= lcd.cellwid)
CFontz_chr (x, y, map[6]);
else
CFontz_chr (x, y, map[len]);
len -= lcd.cellwid;
@@ -588,7 +566,8 @@ void CFontz_hbar(int x, int y, int len)
/////////////////////////////////////////////////////////////////
// Sets up for big numbers.
//
void CFontz_init_num()
void
CFontz_init_num ()
{
}
@@ -596,11 +575,12 @@ void CFontz_init_num()
/////////////////////////////////////////////////////////////////
// Writes a big number.
//
void CFontz_num(int x, int num)
void
CFontz_num (int x, int num)
{
char out[5];
sprintf(out, "%c%c%c", 28, x, num);
write(fd, out, 3);
sprintf (out, "%c%c%c", 28, x, num);
write (fd, out, 3);
}
@@ -611,72 +591,75 @@ void CFontz_num(int x, int num)
//
// The input is just an array of characters...
//
void CFontz_set_char(int n, char *dat)
void
CFontz_set_char (int n, char *dat)
{
char out[4];
int row, col;
int letter;
if(n < 0 || n > 7) return;
if(!dat) return;
if (n < 0 || n > 7)
return;
if (!dat)
return;
sprintf(out, "%c%c", 25, n);
write(fd, out, 2);
sprintf (out, "%c%c", 25, n);
write (fd, out, 2);
for(row=0; row<lcd.cellhgt; row++)
{
for (row = 0; row < lcd.cellhgt; row++) {
letter = 0;
for(col=0; col<lcd.cellwid; col++)
{
for (col = 0; col < lcd.cellwid; col++) {
letter <<= 1;
letter |= (dat[(row*lcd.cellwid) + col] > 0);
letter |= (dat[(row * lcd.cellwid) + col] > 0);
}
write(fd, &letter, 1);
write (fd, &letter, 1);
}
}
void CFontz_icon(int which, char dest)
void
CFontz_icon (int which, char dest)
{
char icons[3][6*8] = {
char icons[3][6 * 8] = {
{
1,1,1,1,1,1, // Empty Heart
1,0,1,0,1,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
1,0,0,0,1,1,
1,1,0,1,1,1,
1,1,1,1,1,1,
1, 1, 1, 1, 1, 1, // Empty Heart
1, 0, 1, 0, 1, 1,
0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 1, 1,
1, 1, 0, 1, 1, 1,
1, 1, 1, 1, 1, 1,
},
{
1,1,1,1,1,1, // Filled Heart
1,0,1,0,1,1,
0,1,0,1,0,1,
0,1,1,1,0,1,
0,1,1,1,0,1,
1,0,1,0,1,1,
1,1,0,1,1,1,
1,1,1,1,1,1,
1, 1, 1, 1, 1, 1, // Filled Heart
1, 0, 1, 0, 1, 1,
0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 0, 1,
0, 1, 1, 1, 0, 1,
1, 0, 1, 0, 1, 1,
1, 1, 0, 1, 1, 1,
1, 1, 1, 1, 1, 1,
},
{
0,0,0,0,0,0, // Ellipsis
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,1,0,1,0,
0, 0, 0, 0, 0, 0, // Ellipsis
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 1, 0, 1, 0,
},
};
if(custom==bign) custom=beat;
CFontz_set_char(dest, &icons[which][0]);
if (custom == bign)
custom = beat;
CFontz_set_char (dest, &icons[which][0]);
}
@@ -685,12 +668,14 @@ void CFontz_icon(int which, char dest)
//
// Input is a character array, sized lcd.wid*lcd.hgt
//
void CFontz_draw_frame(char *dat)
void
CFontz_draw_frame (char *dat)
{
char out[LCD_MAX_WIDTH * LCD_MAX_HEIGHT];
int i;
if(!dat) return;
if (!dat)
return;
// Custom characters start at 128, not at 0.
/*
@@ -700,11 +685,10 @@ void CFontz_draw_frame(char *dat)
}
*/
for(i=0; i<lcd.hgt; i++)
{
sprintf(out, "%c%c%c", 17, 0, i);
write(fd, out, 3);
write(fd, dat+(lcd.wid*i), lcd.wid);
for (i = 0; i < lcd.hgt; i++) {
sprintf (out, "%c%c%c", 17, 0, i);
write (fd, out, 3);
write (fd, dat + (lcd.wid * i), lcd.wid);
}
/*
sprintf(out, "%c", 1);
@@ -713,6 +697,3 @@ void CFontz_draw_frame(char *dat)
*/
}
+16 -16
View File
@@ -4,22 +4,22 @@
extern lcd_logical_driver *CFontz;
int CFontz_init(lcd_logical_driver *driver, char *device);
void CFontz_close();
void CFontz_flush();
void CFontz_flush_box(int lft, int top, int rgt, int bot);
void CFontz_chr(int x, int y, char c) ;
int CFontz_contrast(int contrast);
void CFontz_backlight(int on);
void CFontz_init_vbar();
void CFontz_init_hbar();
void CFontz_vbar(int x, int len);
void CFontz_hbar(int x, int y, int len);
void CFontz_init_num();
void CFontz_num(int x, int num);
void CFontz_set_char(int n, char *dat);
void CFontz_icon(int which, char dest);
void CFontz_draw_frame(char *dat);
int CFontz_init (lcd_logical_driver * driver, char *device);
void CFontz_close ();
void CFontz_flush ();
void CFontz_flush_box (int lft, int top, int rgt, int bot);
void CFontz_chr (int x, int y, char c);
int CFontz_contrast (int contrast);
void CFontz_backlight (int on);
void CFontz_init_vbar ();
void CFontz_init_hbar ();
void CFontz_vbar (int x, int len);
void CFontz_hbar (int x, int y, int len);
void CFontz_init_num ();
void CFontz_num (int x, int num);
void CFontz_set_char (int n, char *dat);
void CFontz_icon (int which, char dest);
void CFontz_draw_frame (char *dat);
+572 -519
View File
File diff suppressed because it is too large Load Diff
+22 -22
View File
@@ -4,28 +4,28 @@
extern lcd_logical_driver *MtxOrb;
int MtxOrb_init(lcd_logical_driver *driver, char *device);
void MtxOrb_clear();
void MtxOrb_close();
void MtxOrb_flush();
void MtxOrb_flush_box(int lft, int top, int rgt, int bot);
void MtxOrb_chr(int x, int y, char c) ;
int MtxOrb_contrast(int contrast);
void MtxOrb_backlight(int on);
void MtxOrb_output(int on);
void MtxOrb_init_vbar();
void MtxOrb_init_hbar();
void MtxOrb_vbar(int x, int len);
void MtxOrb_hbar(int x, int y, int len);
void MtxOrb_init_num();
void MtxOrb_num(int x, int num);
void MtxOrb_set_char(int n, char *dat);
void MtxOrb_icon(int which, char dest);
void MtxOrb_draw_frame(char *dat);
char MtxOrb_getkey();
int MtxOrb_init (lcd_logical_driver * driver, char *device);
void MtxOrb_clear ();
void MtxOrb_close ();
void MtxOrb_flush ();
void MtxOrb_flush_box (int lft, int top, int rgt, int bot);
void MtxOrb_chr (int x, int y, char c);
int MtxOrb_contrast (int contrast);
void MtxOrb_backlight (int on);
void MtxOrb_output (int on);
void MtxOrb_init_vbar ();
void MtxOrb_init_hbar ();
void MtxOrb_vbar (int x, int len);
void MtxOrb_hbar (int x, int y, int len);
void MtxOrb_init_num ();
void MtxOrb_num (int x, int num);
void MtxOrb_set_char (int n, char *dat);
void MtxOrb_icon (int which, char dest);
void MtxOrb_draw_frame (char *dat);
char MtxOrb_getkey ();
void MtxOrb_init_all(int type);
int MtxOrb_ask_bar(int type);
void MtxOrb_set_known_char(int car, int type);
void MtxOrb_init_all (int type);
int MtxOrb_ask_bar (int type);
void MtxOrb_set_known_char (int car, int type);
#endif
+121 -113
View File
@@ -24,8 +24,8 @@
lcd_logical_driver *curses_drv;
int PAD=255;
int ELLIPSIS=7;
int PAD = 255;
int ELLIPSIS = 7;
//////////////////////////////////////////////////////////////////////////
////////////////////// For Curses Terminal Output ////////////////////////
@@ -34,66 +34,46 @@ int ELLIPSIS=7;
static char icon_char = '@';
int curses_drv_init(struct lcd_logical_driver *driver, char *args)
int
curses_drv_init (struct lcd_logical_driver *driver, char *args)
{
char *argv[64];
int argc;
int i,j;
int i, j;
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
for(i=0; i<argc; i++)
{
if(0 == strcmp(argv[i], "-f") ||
0 == strcmp(argv[i], "--forecolor"))
{
if(i + 1 > argc) {
fprintf(stderr, "curses_init: %s requires an argument\n",
argv[i]);
for (i = 0; i < argc; i++) {
if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--forecolor")) {
if (i + 1 > argc) {
fprintf (stderr, "curses_init: %s requires an argument\n", argv[i]);
return -1;
}
// TODO: color display in curses driver!
printf("Sorry, colors not yet implemented...\n");
printf ("Sorry, colors not yet implemented...\n");
//strcpy(device, argv[++i]);
}
else if(0 == strcmp(argv[i], "-b") ||
0 == strcmp(argv[i], "--backcolor"))
{
if(i + 1 > argc) {
fprintf(stderr, "curses_init: %s requires an argument\n",
argv[i]);
} else if (0 == strcmp (argv[i], "-b") || 0 == strcmp (argv[i], "--backcolor")) {
if (i + 1 > argc) {
fprintf (stderr, "curses_init: %s requires an argument\n", argv[i]);
return -1;
}
// TODO: color display in curses driver!
printf("Sorry, colors not yet implemented...\n");
printf ("Sorry, colors not yet implemented...\n");
//strcpy(device, argv[++i]);
}
else if(0 == strcmp(argv[i], "-B") ||
0 == strcmp(argv[i], "--backlight"))
{
if(i + 1 > argc) {
fprintf(stderr, "curses_init: %s requires an argument\n",
argv[i]);
} else if (0 == strcmp (argv[i], "-B") || 0 == strcmp (argv[i], "--backlight")) {
if (i + 1 > argc) {
fprintf (stderr, "curses_init: %s requires an argument\n", argv[i]);
return -1;
}
// TODO: color display in curses driver!
printf("Sorry, colors not yet implemented...\n");
printf ("Sorry, colors not yet implemented...\n");
//strcpy(device, argv[++i]);
}
else if(0 == strcmp(argv[i], "-h") ||
0 == strcmp(argv[i], "--help"))
{
printf("LCDproc [n]curses driver\n"
"\t-f\t--forecolor\tChange the foreground color\n"
"\t-b\t--backcolor\tChange the backlight's \"off\" color\n"
"\t-B\t--backlight\tChange the backlight's \"on\" color\n"
"\t-h\t--help\t\tShow this help information\n");
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
printf ("LCDproc [n]curses driver\n" "\t-f\t--forecolor\tChange the foreground color\n" "\t-b\t--backcolor\tChange the backlight's \"off\" color\n" "\t-B\t--backlight\tChange the backlight's \"on\" color\n" "\t-h\t--help\t\tShow this help information\n");
return -1;
}
else
{
printf("Invalid parameter: %s\n", argv[i]);
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
@@ -102,15 +82,15 @@ int curses_drv_init(struct lcd_logical_driver *driver, char *args)
curses_drv = driver;
// Init curses...
initscr();
cbreak();
noecho();
nodelay(stdscr, TRUE);
nonl();
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE);
initscr ();
cbreak ();
noecho ();
nodelay (stdscr, TRUE);
nonl ();
intrflush (stdscr, FALSE);
keypad (stdscr, TRUE);
curses_drv_clear();
curses_drv_clear ();
// Override output functions...
driver->clear = curses_drv_clear;
@@ -143,24 +123,26 @@ int curses_drv_init(struct lcd_logical_driver *driver, char *args)
return 200; // 200 is arbitrary. (must be 1 or more)
}
void curses_drv_close()
void
curses_drv_close ()
{
// Close curses
clear();
move(0,0);
refresh();
endwin();
clear ();
move (0, 0);
refresh ();
endwin ();
drv_base_close();
drv_base_close ();
}
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
void curses_drv_clear()
void
curses_drv_clear ()
{
clear();
clear ();
}
@@ -169,74 +151,85 @@ void curses_drv_clear()
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void curses_drv_string(int x, int y, char string[])
void
curses_drv_string (int x, int y, char string[])
{
int i;
unsigned char *c;
for(i=0; string[i]; i++)
{
for (i = 0; string[i]; i++) {
c = &string[i];
switch(*c)
{
case 0: *c = icon_char; break;
case 255: *c = '#'; break;
switch (*c) {
case 0:
*c = icon_char;
break;
case 255:
*c = '#';
break;
}
}
mvaddstr(y-1, x-1, string);
mvaddstr (y - 1, x - 1, string);
}
/////////////////////////////////////////////////////////////////
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void curses_drv_chr(int x, int y, char c)
void
curses_drv_chr (int x, int y, char c)
{
switch(c)
{
case 0: c = icon_char; break;
case -1: c = '#'; break;
switch (c) {
case 0:
c = icon_char;
break;
case -1:
c = '#';
break;
}
mvaddch(y-1, x-1, c);
mvaddch (y - 1, x - 1, c);
}
/////////////////////////////////////////////////////////////////
// Sets up for big numbers.
//
void curses_drv_init_num()
void
curses_drv_init_num ()
{
}
/////////////////////////////////////////////////////////////////
// Writes a big number.
//
void curses_drv_num(int x, int num)
void
curses_drv_num (int x, int num)
{
char c;
int y, dx;
c='0'+num;
c = '0' + num;
// printf(&c,"%1d",num);
for(y=1; y<5; y++)
for(dx=0; dx<3; dx++)
curses_drv_chr(x+dx, y, c);
for (y = 1; y < 5; y++)
for (dx = 0; dx < 3; dx++)
curses_drv_chr (x + dx, y, c);
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar; erases entire column onscreen.
//
void curses_drv_vbar(int x, int len)
void
curses_drv_vbar (int x, int len)
{
char map[]="_.,,ooO8";
char map[] = "_.,,ooO8";
int y;
for(y=lcd.hgt; y > 0 && len>0; y--)
{
if(len >= lcd.cellhgt) curses_drv_chr(x, y, '8');
else curses_drv_chr(x, y, map[len-1]);
for (y = lcd.hgt; y > 0 && len > 0; y--) {
if (len >= lcd.cellhgt)
curses_drv_chr (x, y, '8');
else
curses_drv_chr (x, y, map[len - 1]);
len -= lcd.cellhgt;
}
@@ -249,14 +242,14 @@ void curses_drv_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void curses_drv_hbar(int x, int y, int len)
void
curses_drv_hbar (int x, int y, int len)
{
for(; x<=lcd.wid && len>0; x++)
{
if(len>=lcd.cellwid)
curses_drv_chr(x, y, '=');
for (; x <= lcd.wid && len > 0; x++) {
if (len >= lcd.cellwid)
curses_drv_chr (x, y, '=');
else
curses_drv_chr(x, y, '-');
curses_drv_chr (x, y, '-');
len -= lcd.cellwid;
}
@@ -271,14 +264,20 @@ void curses_drv_hbar(int x, int y, int len)
/////////////////////////////////////////////////////////////////
// Sets character 0 to an icon...
//
void curses_drv_icon(int which, char dest)
void
curses_drv_icon (int which, char dest)
{
if(dest == 0)
switch(which)
{
case 0: icon_char = '+'; break;
case 1: icon_char = '*'; break;
default: icon_char = '#'; break;
if (dest == 0)
switch (which) {
case 0:
icon_char = '+';
break;
case 1:
icon_char = '*';
break;
default:
icon_char = '#';
break;
}
}
@@ -286,41 +285,50 @@ void curses_drv_icon(int which, char dest)
//////////////////////////////////////////////////////////////////
// Flushes all output to the lcd...
//
void curses_drv_flush()
void
curses_drv_flush ()
{
curses_drv_draw_frame(curses_drv->framebuf);
curses_drv_draw_frame (curses_drv->framebuf);
}
void curses_drv_flush_box(int lft, int top, int rgt, int bot)
void
curses_drv_flush_box (int lft, int top, int rgt, int bot)
{
curses_drv_flush();
curses_drv_flush ();
}
void curses_drv_draw_frame(char *dat)
void
curses_drv_draw_frame (char *dat)
{
// border(0, 0, 0, 0, 0, 0, lcd.wid+1, lcd.hgt+1);
refresh();
refresh ();
}
char curses_drv_getkey()
char
curses_drv_getkey ()
{
int i;
i = getch();
i = getch ();
if(i == KEY_LEFT) return 'D';
if(i == KEY_UP) return 'B';
if(i == KEY_DOWN) return 'C';
if(i == KEY_RIGHT) return 'A';
if (i == KEY_LEFT)
return 'D';
if (i == KEY_UP)
return 'B';
if (i == KEY_DOWN)
return 'C';
if (i == KEY_RIGHT)
return 'A';
if(i != ERR) return i;
else return 0;
if (i != ERR)
return i;
else
return 0;
}
+15 -15
View File
@@ -4,21 +4,21 @@
extern lcd_logical_driver *curses_drv;
int curses_drv_init(struct lcd_logical_driver *driver, char *args);
void curses_drv_close();
void curses_drv_clear();
void curses_drv_flush();
void curses_drv_string(int x, int y, char string[]);
void curses_drv_chr(int x, int y, char c);
void curses_drv_vbar(int x, int len);
void curses_drv_hbar(int x, int y, int len);
void curses_drv_icon(int which, char dest);
void curses_drv_flush();
void curses_drv_flush_box(int lft, int top, int rgt, int bot);
void curses_drv_draw_frame(char *dat);
char curses_drv_getkey();
void curses_drv_init_num();
void curses_drv_num(int x, int num);
int curses_drv_init (struct lcd_logical_driver *driver, char *args);
void curses_drv_close ();
void curses_drv_clear ();
void curses_drv_flush ();
void curses_drv_string (int x, int y, char string[]);
void curses_drv_chr (int x, int y, char c);
void curses_drv_vbar (int x, int len);
void curses_drv_hbar (int x, int y, int len);
void curses_drv_icon (int which, char dest);
void curses_drv_flush ();
void curses_drv_flush_box (int lft, int top, int rgt, int bot);
void curses_drv_draw_frame (char *dat);
char curses_drv_getkey ();
void curses_drv_init_num ();
void curses_drv_num (int x, int num);
#endif
+92 -81
View File
@@ -18,26 +18,26 @@
// function...
int debug_init(struct lcd_logical_driver *driver, char *args)
int
debug_init (struct lcd_logical_driver *driver, char *args)
{
printf("debug_init(%s)\n", device);
printf ("debug_init(%s)\n", device);
if(!driver->framebuf)
{
printf("Allocating frame buffer (%ix%i)\n", lcd.wid, lcd.hgt);
driver->framebuf = malloc(lcd.wid * lcd.hgt);
if (!driver->framebuf) {
printf ("Allocating frame buffer (%ix%i)\n", lcd.wid, lcd.hgt);
driver->framebuf = malloc (lcd.wid * lcd.hgt);
}
if(!driver->framebuf)
{
debug_close();
if (!driver->framebuf) {
debug_close ();
return -1;
}
if(driver->framebuf) printf("Frame buffer: %i\n", (int)driver->framebuf);
if (driver->framebuf)
printf ("Frame buffer: %i\n", (int) driver->framebuf);
debug_clear();
debug_clear ();
driver->clear = debug_clear;
driver->string = debug_string;
@@ -65,17 +65,20 @@ int debug_init(struct lcd_logical_driver *driver, char *args)
return 200; // 200 is arbitrary. (must be 1 or more)
}
void debug_close()
void
debug_close ()
{
// Ack! This shouldn't crash the program, but does.. Why??
printf("debug_close()\n");
printf ("debug_close()\n");
// This is the line which crashes.
if(driver->framebuf) free(driver->framebuf);
if (driver->framebuf)
free (driver->framebuf);
if(driver->framebuf) printf("Frame buffer: %i\n", (int)driver->framebuf);
if (driver->framebuf)
printf ("Frame buffer: %i\n", (int) driver->framebuf);
driver->framebuf = NULL;
// printf("debug_close() finished\n");
}
@@ -83,11 +86,12 @@ void debug_close()
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
void debug_clear()
void
debug_clear ()
{
printf("clear()\n");
printf ("clear()\n");
memset(driver->framebuf, ' ', lcd.wid*lcd.hgt);
memset (driver->framebuf, ' ', lcd.wid * lcd.hgt);
}
@@ -95,11 +99,12 @@ void debug_clear()
//////////////////////////////////////////////////////////////////
// Flushes all output to the lcd...
//
void debug_flush()
void
debug_flush ()
{
printf("flush()\n");
printf ("flush()\n");
lcd.draw_frame();
lcd.draw_frame ();
}
@@ -107,20 +112,20 @@ void debug_flush()
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void debug_string(int x, int y, char string[])
void
debug_string (int x, int y, char string[])
{
int i;
printf("string(%i, %i):%s \n", x, y, string);
printf ("string(%i, %i):%s \n", x, y, string);
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
for(i=0; string[i]; i++)
{
driver->framebuf[(y*lcd.wid) + x + i] = string[i];
for (i = 0; string[i]; i++) {
driver->framebuf[(y * lcd.wid) + x + i] = string[i];
}
}
@@ -128,74 +133,79 @@ void debug_string(int x, int y, char string[])
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void debug_chr(int x, int y, char c)
void
debug_chr (int x, int y, char c)
{
printf("character(%i, %i):%c\n", x, y, c);
printf ("character(%i, %i):%c\n", x, y, c);
y--;
x--;
lcd.framebuf[(y*lcd.wid) + x] = c;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
void debug_contrast(int contrast)
void
debug_contrast (int contrast)
{
printf("Contrast: %i\n", contrast);
printf ("Contrast: %i\n", contrast);
}
void debug_backlight(int on)
void
debug_backlight (int on)
{
if(on)
{
printf("Backlight ON\n");
}
else
{
printf("Backlight OFF\n");
if (on) {
printf ("Backlight ON\n");
} else {
printf ("Backlight OFF\n");
}
}
void debug_init_vbar()
void
debug_init_vbar ()
{
printf("Vertical bars.\n");
printf ("Vertical bars.\n");
}
void debug_init_hbar()
void
debug_init_hbar ()
{
printf("Horizontal bars.\n");
printf ("Horizontal bars.\n");
}
void debug_init_num()
void
debug_init_num ()
{
printf("Big Numbers.\n");
printf ("Big Numbers.\n");
}
void debug_num(int x, int num)
void
debug_num (int x, int num)
{
printf("BigNum(%i, %i)\n", x, num);
printf ("BigNum(%i, %i)\n", x, num);
}
void debug_set_char(int n, char *dat)
void
debug_set_char (int n, char *dat)
{
printf("Set Character %i\n", n);
printf ("Set Character %i\n", n);
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar; erases entire column onscreen.
//
void debug_vbar(int x, int len)
void
debug_vbar (int x, int len)
{
int y;
printf("Vbar(%i, %i)\n", x, len);
printf ("Vbar(%i, %i)\n", x, len);
for(y=lcd.hgt; y > 0 && len>0; y--)
{
debug_chr(x, y, '|');
for (y = lcd.hgt; y > 0 && len > 0; y--) {
debug_chr (x, y, '|');
len -= lcd.cellhgt;
}
@@ -205,14 +215,14 @@ void debug_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void debug_hbar(int x, int y, int len)
void
debug_hbar (int x, int y, int len)
{
printf("Hbar(%i, %i, %i)\n", x, y, len);
printf ("Hbar(%i, %i, %i)\n", x, y, len);
for(; x<lcd.wid && len>0; x++)
{
debug_chr(x,y,'-');
for (; x < lcd.wid && len > 0; x++) {
debug_chr (x, y, '-');
len -= lcd.cellwid;
}
@@ -223,66 +233,67 @@ void debug_hbar(int x, int y, int len)
/////////////////////////////////////////////////////////////////
// Sets character 0 to an icon...
//
void debug_icon(int which, char dest)
void
debug_icon (int which, char dest)
{
printf("Char %i is icon %i\n", dest, which);
printf ("Char %i is icon %i\n", dest, which);
}
void debug_flush_box(int lft, int top, int rgt, int bot)
void
debug_flush_box (int lft, int top, int rgt, int bot)
{
printf("Flush Box(%i, %i)-(%i, %i)\n", lft, top, rgt, bot);
printf ("Flush Box(%i, %i)-(%i, %i)\n", lft, top, rgt, bot);
debug_flush();
debug_flush ();
}
void debug_draw_frame(char *dat)
void
debug_draw_frame (char *dat)
{
int i, j;
char out[LCD_MAX_WIDTH];
printf("draw_frame()\n");
printf ("draw_frame()\n");
if(!dat) return;
if (!dat)
return;
// printf("Frame (%ix%i): \n%s\n", lcd.wid, lcd.hgt, dat);
for(i=0; i<lcd.wid; i++)
{
for (i = 0; i < lcd.wid; i++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf("+%s+\n", out);
printf ("+%s+\n", out);
for(i=0; i<lcd.hgt; i++)
{
for(j=0; j<lcd.wid; j++)
{
out[j] = dat[j+(i*lcd.wid)];
for (i = 0; i < lcd.hgt; i++) {
for (j = 0; j < lcd.wid; j++) {
out[j] = dat[j + (i * lcd.wid)];
}
out[lcd.wid] = 0;
printf("|%s|\n", out);
printf ("|%s|\n", out);
}
for(i=0; i<lcd.wid; i++)
{
for (i = 0; i < lcd.wid; i++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf("+%s+\n", out);
printf ("+%s+\n", out);
}
char debug_getkey()
char
debug_getkey ()
{
printf("Trying to grab keypress.\n");
printf ("Trying to grab keypress.\n");
return 0;
}
+19 -19
View File
@@ -2,25 +2,25 @@
#define LCD_DEBUG_H
int debug_init(struct lcd_logical_driver *driver, char *args);
void debug_close();
void debug_clear();
void debug_flush();
void debug_string(int x, int y, char string[]);
void debug_chr(int x, int y, char c);
void debug_contrast(int contrast);
void debug_backlight(int on);
void debug_init_vbar();
void debug_init_hbar();
void debug_init_num();
void debug_vbar(int x, int len);
void debug_hbar(int x, int y, int len);
void debug_num(int x, int num);
void debug_set_char(int n, char *dat);
void debug_icon(int which, char dest);
void debug_flush_box(int lft, int top, int rgt, int bot);
void debug_draw_frame(char *dat);
char debug_getkey();
int debug_init (struct lcd_logical_driver *driver, char *args);
void debug_close ();
void debug_clear ();
void debug_flush ();
void debug_string (int x, int y, char string[]);
void debug_chr (int x, int y, char c);
void debug_contrast (int contrast);
void debug_backlight (int on);
void debug_init_vbar ();
void debug_init_hbar ();
void debug_init_num ();
void debug_vbar (int x, int len);
void debug_hbar (int x, int y, int len);
void debug_num (int x, int num);
void debug_set_char (int n, char *dat);
void debug_icon (int which, char dest);
void debug_flush_box (int lft, int top, int rgt, int bot);
void debug_draw_frame (char *dat);
char debug_getkey ();
#endif
+55 -39
View File
@@ -22,7 +22,8 @@ lcd_logical_driver *drv_base;
////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and
// point all the function pointers.
int drv_base_init(struct lcd_logical_driver *driver, char *args)
int
drv_base_init (struct lcd_logical_driver *driver, char *args)
{
// printf("drv_base_init()\n");
@@ -32,18 +33,17 @@ int drv_base_init(struct lcd_logical_driver *driver, char *args)
driver->hgt = 4;
// You must use driver->framebuf here, but may use lcd.framebuf later.
if(!driver->framebuf)
driver->framebuf = malloc(driver->wid * driver->hgt);
if (!driver->framebuf)
driver->framebuf = malloc (driver->wid * driver->hgt);
if(!driver->framebuf)
{
drv_base_close();
if (!driver->framebuf) {
drv_base_close ();
return -1;
}
// Debugging...
// if(lcd.framebuf) printf("Frame buffer: %i\n", (int)lcd.framebuf);
memset(driver->framebuf, ' ', driver->wid*driver->hgt);
memset (driver->framebuf, ' ', driver->wid * driver->hgt);
// drv_base_clear();
driver->cellwid = 5;
@@ -80,9 +80,11 @@ int drv_base_init(struct lcd_logical_driver *driver, char *args)
// lcd.framebuf will be set to the appropriate buffer before calling
// your driver.
void drv_base_close()
void
drv_base_close ()
{
if(lcd.framebuf != NULL) free(lcd.framebuf);
if (lcd.framebuf != NULL)
free (lcd.framebuf);
lcd.framebuf = NULL;
}
@@ -90,9 +92,10 @@ void drv_base_close()
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
void drv_base_clear()
void
drv_base_clear ()
{
memset(lcd.framebuf, ' ', lcd.wid*lcd.hgt);
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
}
@@ -100,7 +103,8 @@ void drv_base_clear()
//////////////////////////////////////////////////////////////////
// Flushes all output to the lcd...
//
void drv_base_flush()
void
drv_base_flush ()
{
//lcd.draw_frame(lcd.framebuf);
}
@@ -110,18 +114,19 @@ void drv_base_flush()
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void drv_base_string(int x, int y, char string[])
void
drv_base_string (int x, int y, char string[])
{
int i;
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
for(i=0; string[i]; i++)
{
for (i = 0; string[i]; i++) {
// Check for buffer overflows...
if((y*lcd.wid) + x + i > (lcd.wid*lcd.hgt)) break;
lcd.framebuf[(y*lcd.wid) + x + i] = string[i];
if ((y * lcd.wid) + x + i > (lcd.wid * lcd.hgt))
break;
lcd.framebuf[(y * lcd.wid) + x + i] = string[i];
}
}
@@ -129,12 +134,13 @@ void drv_base_string(int x, int y, char string[])
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void drv_base_chr(int x, int y, char c)
void
drv_base_chr (int x, int y, char c)
{
y--;
x--;
lcd.framebuf[(y*lcd.wid) + x] = c;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
@@ -142,7 +148,8 @@ void drv_base_chr(int x, int y, char c)
// Sets the contrast of the display. Value is 0-255, where 140 is
// what I consider "just right".
//
int drv_base_contrast(int contrast)
int
drv_base_contrast (int contrast)
{
// printf("Contrast: %i\n", contrast);
return -1;
@@ -151,7 +158,8 @@ int drv_base_contrast(int contrast)
//////////////////////////////////////////////////////////////////////
// Turns the lcd backlight on or off...
//
void drv_base_backlight(int on)
void
drv_base_backlight (int on)
{
/*
if(on)
@@ -168,7 +176,8 @@ void drv_base_backlight(int on)
//////////////////////////////////////////////////////////////////////
// Tells the driver to get ready for vertical bargraphs.
//
void drv_base_init_vbar()
void
drv_base_init_vbar ()
{
// printf("Vertical bars.\n");
}
@@ -176,7 +185,8 @@ void drv_base_init_vbar()
//////////////////////////////////////////////////////////////////////
// Tells the driver to get ready for horizontal bargraphs.
//
void drv_base_init_hbar()
void
drv_base_init_hbar ()
{
// printf("Horizontal bars.\n");
}
@@ -184,7 +194,8 @@ void drv_base_init_hbar()
//////////////////////////////////////////////////////////////////////
// Tells the driver to get ready for big numbers, if possible.
//
void drv_base_init_num()
void
drv_base_init_num ()
{
// printf("Big Numbers.\n");
}
@@ -192,7 +203,8 @@ void drv_base_init_num()
//////////////////////////////////////////////////////////////////////
// Draws a big (4-row) number.
//
void drv_base_num(int x, int num)
void
drv_base_num (int x, int num)
{
// printf("BigNum(%i, %i)\n", x, num);
}
@@ -200,7 +212,8 @@ void drv_base_num(int x, int num)
//////////////////////////////////////////////////////////////////////
// Changes the font data of character n.
//
void drv_base_set_char(int n, char *dat)
void
drv_base_set_char (int n, char *dat)
{
// printf("Set Character %i\n", n);
}
@@ -208,12 +221,12 @@ void drv_base_set_char(int n, char *dat)
/////////////////////////////////////////////////////////////////
// Draws a vertical bar, from the bottom of the screen up.
//
void drv_base_vbar(int x, int len)
void
drv_base_vbar (int x, int len)
{
int y;
for(y=lcd.hgt; y > 0 && len>0; y--)
{
drv_base_chr(x, y, '|');
for (y = lcd.hgt; y > 0 && len > 0; y--) {
drv_base_chr (x, y, '|');
len -= lcd.cellhgt;
}
@@ -223,11 +236,11 @@ void drv_base_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void drv_base_hbar(int x, int y, int len)
void
drv_base_hbar (int x, int y, int len)
{
for(; x<=lcd.wid && len>0; x++)
{
drv_base_chr(x,y,'-');
for (; x <= lcd.wid && len > 0; x++) {
drv_base_chr (x, y, '-');
len -= lcd.cellwid;
}
@@ -238,7 +251,8 @@ void drv_base_hbar(int x, int y, int len)
/////////////////////////////////////////////////////////////////
// Sets character 0 to an icon...
//
void drv_base_icon(int which, char dest)
void
drv_base_icon (int which, char dest)
{
// printf("Char %i set to icon %i\n", dest, which);
}
@@ -250,7 +264,8 @@ void drv_base_icon(int which, char dest)
// I've just called drv_base_flush() because there's not much point yet
// in flushing less than the entire framebuffer.
//
void drv_base_flush_box(int lft, int top, int rgt, int bot)
void
drv_base_flush_box (int lft, int top, int rgt, int bot)
{
//drv_base_flush();
@@ -261,7 +276,8 @@ void drv_base_flush_box(int lft, int top, int rgt, int bot)
//
// The commented-out code is from the text driver.
//
void drv_base_draw_frame(char *dat)
void
drv_base_draw_frame (char *dat)
{
/*
int i, j;
@@ -304,8 +320,8 @@ void drv_base_draw_frame(char *dat)
//
// Return 0 for "nothing available".
//
char drv_base_getkey()
char
drv_base_getkey ()
{
return 0;
}
+20 -20
View File
@@ -94,26 +94,26 @@
extern lcd_logical_driver *drv_base;
int drv_base_init(struct lcd_logical_driver *driver, char *args);
void drv_base_close();
void drv_base_clear();
void drv_base_flush();
void drv_base_string(int x, int y, char string[]);
void drv_base_chr(int x, int y, char c);
int drv_base_contrast(int contrast);
void drv_base_backlight(int on);
void drv_base_output(int on);
void drv_base_vbar(int x, int len);
void drv_base_init_vbar();
void drv_base_hbar(int x, int y, int len);
void drv_base_init_hbar();
void drv_base_num(int x, int num);
void drv_base_init_num();
void drv_base_set_char(int n, char *dat);
void drv_base_icon(int which, char dest);
void drv_base_flush_box(int lft, int top, int rgt, int bot);
void drv_base_draw_frame(char *dat);
char drv_base_getkey();
int drv_base_init (struct lcd_logical_driver *driver, char *args);
void drv_base_close ();
void drv_base_clear ();
void drv_base_flush ();
void drv_base_string (int x, int y, char string[]);
void drv_base_chr (int x, int y, char c);
int drv_base_contrast (int contrast);
void drv_base_backlight (int on);
void drv_base_output (int on);
void drv_base_vbar (int x, int len);
void drv_base_init_vbar ();
void drv_base_hbar (int x, int y, int len);
void drv_base_init_hbar ();
void drv_base_num (int x, int num);
void drv_base_init_num ();
void drv_base_set_char (int n, char *dat);
void drv_base_icon (int which, char dest);
void drv_base_flush_box (int lft, int top, int rgt, int bot);
void drv_base_draw_frame (char *dat);
char drv_base_getkey ();
#endif
+65 -72
View File
@@ -49,9 +49,7 @@
// implemented separately for each HW design. This is typically just
// HD44780_senddata
void lcdstat_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch);
void lcdstat_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch);
#define RS 0x10
@@ -61,16 +59,14 @@ void lcdstat_HD44780_senddata(unsigned char displayID,
#define EN3 0x20
static unsigned char EnMask[] = { EN1, EN2, EN3, STRB, LF, INIT, SEL };
static int EnMaskSize = sizeof(EnMask) / sizeof(unsigned char);
static int EnMaskSize = sizeof (EnMask) / sizeof (unsigned char);
static unsigned int lptPort;
static int extIF = 0; // non-zero if extended interface
// initialisation function
int hd_init_4bit(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port)
int
hd_init_4bit (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port)
{
// TODO: remove magic numbers below
char *argv[64];
@@ -83,70 +79,69 @@ int hd_init_4bit(HD44780_functions *hd44780_functions,
hd44780_functions->senddata = lcdstat_HD44780_senddata;
// parse command-line arguments
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
for (i = 0; i < argc; ++i)
{
if (strcmp(argv[i], "-e") == 0 ||
strcmp(argv[i], "--extended") == 0)
{
for (i = 0; i < argc; ++i) {
if (strcmp (argv[i], "-e") == 0 || strcmp (argv[i], "--extended") == 0) {
extIF = 1;
if ((ioperm(port + 2, 1, 255)) == -1) {
fprintf(stderr, "HD44780_init: failed (%s)\n", strerror(errno));
if ((ioperm (port + 2, 1, 255)) == -1) {
fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno));
return -1;
}
}
}
// powerup the lcd now
if (extIF)
{
if (extIF) {
displayID |= EN3;
port_out(lptPort + 2, 0 ^ OUTMASK);
port_out (lptPort + 2, 0 ^ OUTMASK);
}
port_out(lptPort, displayID | 0x03);
if (extIF) port_out(lptPort + 2,
(EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause(1);
port_out(lptPort, 0x03);
if (extIF) port_out(lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause(4100);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (4100);
port_out(lptPort, displayID | 0x03);
if (extIF) port_out(lptPort + 2,
(EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause(1);
port_out(lptPort, 0x03);
if (extIF) port_out(lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause(100);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (100);
port_out(lptPort, displayID | 0x03);
if (extIF) port_out(lptPort + 2,
(EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause(1);
port_out(lptPort, 0x03);
if (extIF) port_out(lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause(40);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (40);
// now in 8-bit mode... set 4-bit mode
port_out(lptPort,displayID | 0x02);
if (extIF) port_out(lptPort + 2,
(EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause(1);
port_out(lptPort, 0x02);
if (extIF) port_out(lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause(40);
port_out (lptPort, displayID | 0x02);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x02);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (40);
common_init(IF_4bit);
common_init (IF_4bit);
return 0;
}
// lcdstat_HD44780_senddata
void lcdstat_HD44780_senddata(unsigned char displayID,
unsigned char iflags,
unsigned char ch)
void
lcdstat_HD44780_senddata (unsigned char displayID, unsigned char iflags, unsigned char ch)
{
unsigned char dispID = 0, flags = 0;
unsigned char h = (ch >> 4) & 0x0f; // high and low nibbles
@@ -157,40 +152,38 @@ void lcdstat_HD44780_senddata(unsigned char displayID,
else //if (iflags == RS_DATA)
flags = RS;
if (displayID <= 3)
{
if (displayID <= 3) {
if (displayID == 0)
dispID = EnMask[0] | EnMask[1] | EnMask[2];
else
dispID = EnMask[displayID - 1];
port_out(lptPort, flags | h);
hd44780_functions->uPause(2);
port_out(lptPort, dispID | flags | h);
hd44780_functions->uPause(4);
port_out(lptPort, flags | h);
port_out (lptPort, flags | h);
hd44780_functions->uPause (2);
port_out (lptPort, dispID | flags | h);
hd44780_functions->uPause (4);
port_out (lptPort, flags | h);
port_out(lptPort, dispID | flags | l);
hd44780_functions->uPause(4);
port_out(lptPort, flags | l);
port_out (lptPort, dispID | flags | l);
hd44780_functions->uPause (4);
port_out (lptPort, flags | l);
}
if (extIF && (displayID == 0 || displayID >= 4))
{
if (extIF && (displayID == 0 || displayID >= 4)) {
if (displayID == 0)
dispID = EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6];
else
dispID = EnMask[(displayID - 1) % EnMaskSize];
port_out(lptPort, flags | h);
hd44780_functions->uPause(2);
port_out(lptPort + 2, dispID ^ OUTMASK);
hd44780_functions->uPause(4);
port_out(lptPort + 2, 0 ^ OUTMASK);
port_out (lptPort, flags | h);
hd44780_functions->uPause (2);
port_out (lptPort + 2, dispID ^ OUTMASK);
hd44780_functions->uPause (4);
port_out (lptPort + 2, 0 ^ OUTMASK);
port_out(lptPort, flags | l);
port_out(lptPort + 2, dispID ^ OUTMASK);
hd44780_functions->uPause(4);
port_out(lptPort + 2, 0 ^ OUTMASK);
port_out (lptPort, flags | l);
port_out (lptPort + 2, dispID ^ OUTMASK);
hd44780_functions->uPause (4);
port_out (lptPort + 2, 0 ^ OUTMASK);
}
}
+1 -4
View File
@@ -5,9 +5,6 @@
#include "hd44780-low.h" /* for HD44780_functions */
// initialise this particular driver
int hd_init_4bit(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port);
int hd_init_4bit (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
#endif
+11 -17
View File
@@ -20,34 +20,28 @@
enum connectionType { HD_4bit, HD_8bit, HD_serialLpt, HD_winamp,
// add new connection types here
HD_unknown };
HD_unknown
};
static struct ConnectionMapping
{
static struct ConnectionMapping {
enum connectionType type;
char *connectionTypeStr;
int (*init_fn)(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port);
int (*init_fn) (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
const char *helpMsg;
} connectionMapping[] = {
// connectionType enumerator
// string to identify connection on command line
// your initialisation function
// help string for your particular connection
{ HD_4bit, "4bit", hd_init_4bit,
"\t-e\t--extended\tEnable three or more displays\n" },
{ HD_8bit, "8bit", hd_init_ext8bit,
"\tnone\n" },
{ HD_serialLpt, "serialLpt", hd_init_serialLpt,
"\tnone\n" },
{ HD_winamp, "winamp", hd_init_winamp,
"\t-e\t--extended\tEnable three or more displays\n" },
{
HD_4bit, "4bit", hd_init_4bit, "\t-e\t--extended\tEnable three or more displays\n"}, {
HD_8bit, "8bit", hd_init_ext8bit, "\tnone\n"}, {
HD_serialLpt, "serialLpt", hd_init_serialLpt, "\tnone\n"}, {
HD_winamp, "winamp", hd_init_winamp, "\t-e\t--extended\tEnable three or more displays\n"},
// add new connection types and their string specifier here
// default, end of structure element (do not delete)
{ HD_unknown, "", NULL, "" }
{
HD_unknown, "", NULL, ""}
};
#endif
+16 -21
View File
@@ -43,9 +43,7 @@
// restricted to):
// HD44780_senddata
void lcdtime_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch);
void lcdtime_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch);
#define nRS nSTRB
@@ -62,30 +60,27 @@ static int semid;
// initialise the driver
int hd_init_ext8bit(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port)
int
hd_init_ext8bit (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port)
{
lptPort = port;
semid = sem_get();
semid = sem_get ();
hd44780_functions->senddata = lcdtime_HD44780_senddata;
if ((ioperm(port + 2, 1, 255)) == -1) {
fprintf(stderr, "HD44780_init: failed (%s)\n", strerror(errno));
if ((ioperm (port + 2, 1, 255)) == -1) {
fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno));
return -1;
}
common_init(IF_8bit);
common_init (IF_8bit);
return 0;
}
// lcdtime_HD44780_senddata
void lcdtime_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch)
void
lcdtime_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch)
{
unsigned char dispID = 0, portControl;
@@ -99,11 +94,11 @@ void lcdtime_HD44780_senddata(unsigned char displayID,
else
portControl = CTRL;
sem_wait(semid);
port_out(lptPort + 2, SETUPLCD);
port_out(lptPort, ch);
port_out(lptPort + 2, dispID | portControl);
hd44780_functions->uPause(1);
port_out(lptPort + 2, portControl);
sem_signal(semid);
sem_wait (semid);
port_out (lptPort + 2, SETUPLCD);
port_out (lptPort, ch);
port_out (lptPort + 2, dispID | portControl);
hd44780_functions->uPause (1);
port_out (lptPort + 2, portControl);
sem_signal (semid);
}
+1 -4
View File
@@ -5,9 +5,6 @@
#include "hd44780-low.h" /* for HD44780_functions */
// initialise this particular driver
int hd_init_ext8bit(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port);
int hd_init_ext8bit (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
#endif
+26 -29
View File
@@ -6,28 +6,27 @@
enum ifWidth { IF_4bit, IF_8bit };
void common_init(enum ifWidth ifwidth);
void common_init (enum ifWidth ifwidth);
// Structures holding pointers to HD44780 specific functions
typedef struct hwDependentFns
{
typedef struct hwDependentFns {
// microsec pauses
void (*uPause)(int microSecondsTenths);
void (*uPause) (int microSecondsTenths);
// senddata to the LCD
// dispID - display to send data to (0 = all displays)
// flags - data or instruction command (RS_DATA | RS_INSTR)
// ch - character to display or instruction value
void (*senddata)(unsigned char dispID, unsigned char flags, unsigned char ch);
void (*senddata) (unsigned char dispID, unsigned char flags, unsigned char ch);
// position the cursor
// dispID - display to send data to (0 = all displays)
// DDaddr - display data address (see sect 2.5.2 of the LCD module FAQ)
void (*position)(int dispID, int DDaddr);
void (*position) (int dispID, int DDaddr);
// toggle vertical autoscroll on all displays
// on - non-zero turns autoscroll on, zero value turns it off
void (*autoscroll)(int on);
void (*autoscroll) (int on);
} HD44780_functions; /* for want of a better name :-) */
extern HD44780_functions *hd44780_functions;
@@ -42,32 +41,32 @@ extern HD44780_functions *hd44780_functions;
#define HOMECURSOR 0x02
#define ENTRYMODE 0x04
#define E_MOVERIGHT 0x02
#define E_MOVELEFT 0x00
#define EDGESCROLL 0x01
#define NOSCROLL 0x00
#define E_MOVERIGHT 0x02
#define E_MOVELEFT 0x00
#define EDGESCROLL 0x01
#define NOSCROLL 0x00
#define ONOFFCTRL 0x08
#define DISPON 0x04
#define DISPOFF 0x00
#define CURSORON 0x02
#define CURSOROFF 0x00
#define CURSORBLINK 0x01
#define CURSORNOBLINK 0x00
#define DISPON 0x04
#define DISPOFF 0x00
#define CURSORON 0x02
#define CURSOROFF 0x00
#define CURSORBLINK 0x01
#define CURSORNOBLINK 0x00
#define CURSORSHIFT 0x10
#define SCROLLDISP 0x08
#define MOVECURSOR 0x00
#define MOVERIGHT 0x04
#define MOVELEFT 0x00
#define SCROLLDISP 0x08
#define MOVECURSOR 0x00
#define MOVERIGHT 0x04
#define MOVELEFT 0x00
#define FUNCSET 0x20
#define IF_8BIT 0x10
#define IF_4BIT 0x00
#define TWOLINE 0x08
#define ONELINE 0x00
#define LARGECHAR 0x04 /* 5x11 characters */
#define SMALLCHAR 0x00 /* 5x8 characters */
#define IF_8BIT 0x10
#define IF_4BIT 0x00
#define TWOLINE 0x08
#define ONELINE 0x00
#define LARGECHAR 0x04 /* 5x11 characters */
#define SMALLCHAR 0x00 /* 5x8 characters */
#define SETCHAR 0x40
@@ -98,5 +97,3 @@ extern HD44780_functions *hd44780_functions;
#define INMASK 0x48
#endif
+51 -62
View File
@@ -31,13 +31,11 @@
#include "port.h"
// Hardware specific functions
void lcdserLpt_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch);
void lcdserLpt_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch);
static char lcdserLpt_HD44780_getkey(void);
void rawshift(unsigned char r);
void shiftreg(unsigned char displayID, unsigned char r);
static char lcdserLpt_HD44780_getkey (void);
void rawshift (unsigned char r);
void shiftreg (unsigned char displayID, unsigned char r);
#define RS 16
#define LCDDATA 8
@@ -47,14 +45,12 @@ void shiftreg(unsigned char displayID, unsigned char r);
static unsigned int lp;
static char lastkey=0;
static char lastkey = 0;
// Initialisation
int hd_init_serialLpt(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port)
int
hd_init_serialLpt (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port)
{
int displayID = EN1 | EN2;
@@ -66,43 +62,35 @@ int hd_init_serialLpt(HD44780_functions *hd44780_functions,
driver->getkey = lcdserLpt_HD44780_getkey;
// setup the lcd in 4 bit mode
shiftreg(displayID,3);
hd44780_functions->uPause(4100);
shiftreg (displayID, 3);
hd44780_functions->uPause (4100);
shiftreg(displayID,3);
hd44780_functions->uPause(100);
shiftreg (displayID, 3);
hd44780_functions->uPause (100);
shiftreg(displayID,3);
hd44780_functions->uPause(40);
shiftreg (displayID, 3);
hd44780_functions->uPause (40);
shiftreg(displayID,2);
hd44780_functions->uPause(40);
shiftreg (displayID, 2);
hd44780_functions->uPause (40);
// set display type functions
lcdserLpt_HD44780_senddata(0,
RS_INSTR,
FUNCSET | IF_4BIT | TWOLINE | SMALLCHAR);
lcdserLpt_HD44780_senddata (0, RS_INSTR, FUNCSET | IF_4BIT | TWOLINE | SMALLCHAR);
// clear
lcdserLpt_HD44780_senddata(0, RS_INSTR, CLEAR);
hd44780_functions->uPause(1600);
lcdserLpt_HD44780_senddata (0, RS_INSTR, CLEAR);
hd44780_functions->uPause (1600);
// Now turn on the display
lcdserLpt_HD44780_senddata(displayID,
RS_INSTR,
ONOFFCTRL | DISPON | CURSOROFF | CURSORNOBLINK);
hd44780_functions->uPause(1600);
lcdserLpt_HD44780_senddata (displayID, RS_INSTR, ONOFFCTRL | DISPON | CURSOROFF | CURSORNOBLINK);
hd44780_functions->uPause (1600);
return 0;
}
void lcdserLpt_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch)
void
lcdserLpt_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch)
{
unsigned char dispID = 0,
portControl = 0,
h = ch >> 4,
l = ch & 15;
unsigned char dispID = 0, portControl = 0, h = ch >> 4, l = ch & 15;
if (displayID == 1)
dispID |= EN1;
@@ -116,58 +104,59 @@ void lcdserLpt_HD44780_senddata(unsigned char displayID,
else
portControl = 0;
shiftreg(displayID,flags | portControl | h);
shiftreg(displayID,flags | portControl | l);
shiftreg (displayID, flags | portControl | h);
shiftreg (displayID, flags | portControl | l);
/* TODO: instead of delay read keys here */
}
char lcdserLpt_HD44780_getkey()
char
lcdserLpt_HD44780_getkey ()
{
// TODO: a keypad scan that does not use shift register
// define a key table
char keytr[]="ABCDEFGH";
char keytr[] = "ABCDEFGH";
int n;
rawshift(0); //send all line on shift register low
hd44780_functions->uPause(1);
if ((port_in(lp+1)&32)==0) //test if line back is low - if not return(0)
rawshift (0); //send all line on shift register low
hd44780_functions->uPause (1);
if ((port_in (lp + 1) & 32) == 0) //test if line back is low - if not return(0)
{ //else
//start walking a single zero across the eight lines
for(n=7;n>=0;n--)
{
rawshift(255 - (1<<n));
hd44780_functions->uPause(1);
for (n = 7; n >= 0; n--) {
rawshift (255 - (1 << n));
hd44780_functions->uPause (1);
if ((port_in(lp+1)&32)==0) // check if line back is low if yes debounce
if ((port_in (lp + 1) & 32) == 0) // check if line back is low if yes debounce
{
if (lastkey==keytr[n])
return(0);
if (lastkey == keytr[n])
return (0);
// printf("key is %c %d\n",keytr[n],n);
lastkey=keytr[n];
return(keytr[n]); //return correct key code.
lastkey = keytr[n];
return (keytr[n]); //return correct key code.
}
}
} //else fall out and return(0) [too transient a keypress]
lastkey=0;
return(0);
lastkey = 0;
return (0);
}
/* this function sends r out onto the shift register */
void rawshift (unsigned char r)
void
rawshift (unsigned char r)
{
int i;
for (i=7;i>=0;i--) /* MSB first */
{
port_out(lp,((r>>i)&1)*LCDDATA); /*set up data */
port_out(lp,(((r>>i)&1)*LCDDATA)|LCDCLOCK);/*rising edge of clock */
for (i = 7; i >= 0; i--) { /* MSB first */
port_out (lp, ((r >> i) & 1) * LCDDATA); /*set up data */
port_out (lp, (((r >> i) & 1) * LCDDATA) | LCDCLOCK); /*rising edge of clock */
}
}
// displayID = value on parallel port to toggle the correct display
void shiftreg (unsigned char displayID, unsigned char r)
void
shiftreg (unsigned char displayID, unsigned char r)
{
rawshift(r);
port_out(lp,displayID); //latch it, to correct display
port_out(lp,0);
rawshift (r);
port_out (lp, displayID); //latch it, to correct display
port_out (lp, 0);
}
+1 -4
View File
@@ -5,9 +5,6 @@
#include "hd44780-low.h" /* for HD44780_functions */
// initialise this particular driver
int hd_init_serialLpt(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port);
int hd_init_serialLpt (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
#endif
+16 -23
View File
@@ -36,9 +36,7 @@
#include <string.h>
#include <errno.h>
void lcdwinamp_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch);
void lcdwinamp_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch);
#define EN1 STRB
#define EN2 SEL
@@ -46,17 +44,15 @@ void lcdwinamp_HD44780_senddata(unsigned char displayID,
#define RS INIT
static unsigned char EnMask[] = { EN1, EN2, EN3 };
static int EnMaskSize = sizeof(EnMask) / sizeof(unsigned char);
static int EnMaskSize = sizeof (EnMask) / sizeof (unsigned char);
static unsigned int lptPort;
static int extIF = 0; // non-zero if extended interface
// initialise the driver
int hd_init_winamp(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port)
int
hd_init_winamp (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port)
{
// TODO: remove magic numbers below
char *argv[64];
@@ -67,27 +63,25 @@ int hd_init_winamp(HD44780_functions *hd44780_functions,
lptPort = port;
// parse command-line arguments
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
for (i = 0; i < argc; ++i)
if (strcmp(argv[i], "-e") == 0 ||
strcmp(argv[i], "--extended") == 0)
if (strcmp (argv[i], "-e") == 0 || strcmp (argv[i], "--extended") == 0)
extIF = 1;
if ((ioperm(lptPort + 2, 1, 255)) == -1) {
fprintf(stderr, "HD44780_init: failed (%s)\n", strerror(errno));
if ((ioperm (lptPort + 2, 1, 255)) == -1) {
fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno));
return -1;
}
common_init(IF_8bit);
common_init (IF_8bit);
return 0;
}
// lcdwinamp_HD44780_senddata
void lcdwinamp_HD44780_senddata(unsigned char displayID,
unsigned char flags,
unsigned char ch)
void
lcdwinamp_HD44780_senddata (unsigned char displayID, unsigned char flags, unsigned char ch)
{
unsigned char dispID = 0, portControl;
@@ -97,13 +91,12 @@ void lcdwinamp_HD44780_senddata(unsigned char displayID,
portControl = 0;
if (displayID == 0)
dispID = EnMask[0] | EnMask [1] | ((extIF) ? EnMask[2] : 0);
dispID = EnMask[0] | EnMask[1] | ((extIF) ? EnMask[2] : 0);
else
dispID = EnMask[displayID - 1];
port_out(lptPort, ch);
port_out(lptPort + 2, (dispID | portControl) ^ OUTMASK);
hd44780_functions->uPause(1);
port_out(lptPort + 2, portControl ^ OUTMASK);
port_out (lptPort, ch);
port_out (lptPort + 2, (dispID | portControl) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort + 2, portControl ^ OUTMASK);
}
+1 -4
View File
@@ -6,9 +6,6 @@
// initialise this particular driver, args is probably not used but keep
// for consistency
int hd_init_winamp(HD44780_functions *hd44780_functions,
lcd_logical_driver *driver,
char *args,
unsigned int port);
int hd_init_winamp (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
#endif
+310 -363
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -17,7 +17,7 @@
#include "port.h"
int HD44780_init(struct lcd_logical_driver *driver, char *args);
int HD44780_init (struct lcd_logical_driver *driver, char *args);
/* The following methods can all be hidden. They are used through function ptrs
void HD44780_close();
void HD44780_flush();
+49 -61
View File
@@ -80,7 +80,8 @@ lcd_logical_driver *irmanin;
////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and
// point all the function pointers.
int irmanin_init(struct lcd_logical_driver *driver, char *args)
int
irmanin_init (struct lcd_logical_driver *driver, char *args)
{
char device[256];
char *ptrdevice;
@@ -93,99 +94,85 @@ int irmanin_init(struct lcd_logical_driver *driver, char *args)
int argc, i, j;
char *filename;
ptrconfig=NULL;
ptrdevice=NULL;
ptrconfig = NULL;
ptrdevice = NULL;
irmanin = driver;
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
for(i=0; i<argc; i++)
{
for (i = 0; i < argc; i++) {
//printf("Arg(%i): %s\n", i, argv[i]);
if(0 == strcmp(argv[i], "-d") ||
0 == strcmp(argv[i], "--device"))
{
if(i + 1 > argc) {
fprintf(stderr, "irmanin_init: %s requires an argument\n",
argv[i]);
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--device")) {
if (i + 1 > argc) {
fprintf (stderr, "irmanin_init: %s requires an argument\n", argv[i]);
return -1;
}
strcpy(device, argv[++i]);
ptrdevice=device;
}
else if(0 == strcmp(argv[i], "-c") ||
0 == strcmp(argv[i], "--config"))
{
if(i + 1 > argc) {
fprintf(stderr, "irmanin_init: %s requires an argument\n",
argv[i]);
strcpy (device, argv[++i]);
ptrdevice = device;
} else if (0 == strcmp (argv[i], "-c") || 0 == strcmp (argv[i], "--config")) {
if (i + 1 > argc) {
fprintf (stderr, "irmanin_init: %s requires an argument\n", argv[i]);
return -1;
}
strcpy(config, argv[++i]);
ptrconfig=config;
}
else if(0 == strcmp(argv[i], "-h") ||
0 == strcmp(argv[i], "--help"))
{
printf("LCDproc IrMan input driver\n"
"\t-d\t--device\tSelect the input device to use\n"
"\t-d\t--config\tSelect the configuration file to use\n"
"\t-h\t--help\t\tShow this help information\n");
strcpy (config, argv[++i]);
ptrconfig = config;
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
printf ("LCDproc IrMan input driver\n" "\t-d\t--device\tSelect the input device to use\n" "\t-d\t--config\tSelect the configuration file to use\n" "\t-h\t--help\t\tShow this help information\n");
return -1;
}
else
{
printf("Invalid parameter: %s\n", argv[i]);
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
if (ir_init_commands(ptrconfig, 1) < 0) {
fprintf(stderr, "error initialising commands: %s\n", strerror(errno));
exit(1);
if (ir_init_commands (ptrconfig, 1) < 0) {
fprintf (stderr, "error initialising commands: %s\n", strerror (errno));
exit (1);
}
portname = ir_default_portname();
if(portname==NULL){
if(ptrdevice==NULL){
portname=ptrdevice;
}else{
fprintf(stderr, "error no device defined\n");
exit(1);
portname = ir_default_portname ();
if (portname == NULL) {
if (ptrdevice == NULL) {
portname = ptrdevice;
} else {
fprintf (stderr, "error no device defined\n");
exit (1);
}
}
driver->getkey = irmanin_getkey;
driver->close = irmanin_close;
for (i=1; codes[i] != NULL; i++) {
if (ir_register_command(codes[i], i) < 0) {
for (i = 1; codes[i] != NULL; i++) {
if (ir_register_command (codes[i], i) < 0) {
if (errno == ENOENT) {
fprintf(stderr, "%s: no code set for `%s'\n", progname, codes[i]);
fprintf (stderr, "%s: no code set for `%s'\n", progname, codes[i]);
} else {
fprintf(stderr, "error registering `%s': `%s'\n", codes[i], strerror(errno));
fprintf (stderr, "error registering `%s': `%s'\n", codes[i], strerror (errno));
}
}
}
errno = 0;
if (ir_init(portname) < 0) {
fprintf(stderr, "%s: error initialising Irman: `%s'\n", strerror(errno), portname);
exit(1);
if (ir_init (portname) < 0) {
fprintf (stderr, "%s: error initialising Irman: `%s'\n", strerror (errno), portname);
exit (1);
}
return 1; // 200 is arbitrary. (must be 1 or more)
}
void irmanin_close()
void
irmanin_close ()
{
if(irmanin->framebuf != NULL) free(irmanin->framebuf);
if (irmanin->framebuf != NULL)
free (irmanin->framebuf);
irmanin->framebuf = NULL;
ir_free_commands();
ir_finish();
ir_free_commands ();
ir_finish ();
}
@@ -194,21 +181,22 @@ void irmanin_close()
//
// Return 0 for "nothing available".
//
char irmanin_getkey()
char
irmanin_getkey ()
{
int i;
int cmd;
char key;
key=(char)0;
switch (cmd=ir_poll_command()) {
key = (char) 0;
switch (cmd = ir_poll_command ()) {
case IR_CMD_ERROR:
fprintf(stderr, "%s: error reading command: %s\n", progname, strerror(errno));
fprintf (stderr, "%s: error reading command: %s\n", progname, strerror (errno));
break;
case IR_CMD_UNKNOWN:
break;
default:
key=(char)('A'-1+cmd);
key = (char) ('A' - 1 + cmd);
break;
}
+3 -3
View File
@@ -4,9 +4,9 @@
extern lcd_logical_driver *joy;
int irmanin_init(struct lcd_logical_driver *driver, char *args);
void irmanin_close();
char irmanin_getkey();
int irmanin_init (struct lcd_logical_driver *driver, char *args);
void irmanin_close ();
char irmanin_getkey ();
#endif
+51 -68
View File
@@ -53,7 +53,8 @@ char *buttonmap = "BDACEFGHIJKLMNOP";
////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and
// point all the function pointers.
int joy_init(struct lcd_logical_driver *driver, char *args)
int
joy_init (struct lcd_logical_driver *driver, char *args)
{
char device[256];
char *argv[64];
@@ -62,57 +63,35 @@ int joy_init(struct lcd_logical_driver *driver, char *args)
joy = driver;
strcpy(device, "/dev/js0");
strcpy (device, "/dev/js0");
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
for(i=0; i<argc; i++)
{
for (i = 0; i < argc; i++) {
//printf("Arg(%i): %s\n", i, argv[i]);
if(0 == strcmp(argv[i], "-d") ||
0 == strcmp(argv[i], "--device"))
{
if(i + 1 > argc) {
fprintf(stderr, "joy_init: %s requires an argument\n",
argv[i]);
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--device")) {
if (i + 1 > argc) {
fprintf (stderr, "joy_init: %s requires an argument\n", argv[i]);
return -1;
}
strcpy(device, argv[++i]);
}
else if(0 == strcmp(argv[i], "-a") ||
0 == strcmp(argv[i], "--axes"))
{
if(i + 1 > argc) {
fprintf(stderr, "joy_init: %s requires an argument\n",
argv[i]);
strcpy (device, argv[++i]);
} else if (0 == strcmp (argv[i], "-a") || 0 == strcmp (argv[i], "--axes")) {
if (i + 1 > argc) {
fprintf (stderr, "joy_init: %s requires an argument\n", argv[i]);
return -1;
}
strncpy(axismap, argv[++i], 16);
}
else if(0 == strcmp(argv[i], "-b") ||
0 == strcmp(argv[i], "--buttons"))
{
if(i + 1 > argc) {
fprintf(stderr, "joy_init: %s requires an argument\n",
argv[i]);
strncpy (axismap, argv[++i], 16);
} else if (0 == strcmp (argv[i], "-b") || 0 == strcmp (argv[i], "--buttons")) {
if (i + 1 > argc) {
fprintf (stderr, "joy_init: %s requires an argument\n", argv[i]);
return -1;
}
strncpy(buttonmap, argv[++i], 16);
}
else if(0 == strcmp(argv[i], "-h") ||
0 == strcmp(argv[i], "--help"))
{
printf("LCDproc Joystick input driver\n"
"\t-d\t--device\tSelect the input device to use [/dev/js0]\n"
"\t-a\t--axes\t\tModify the axis map [%s]\n"
"\t-b\t--buttons\tModify the button map [%s]\n"
"\t-h\t--help\t\tShow this help information\n",
axismap, buttonmap);
strncpy (buttonmap, argv[++i], 16);
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
printf ("LCDproc Joystick input driver\n" "\t-d\t--device\tSelect the input device to use [/dev/js0]\n" "\t-a\t--axes\t\tModify the axis map [%s]\n" "\t-b\t--buttons\tModify the button map [%s]\n" "\t-h\t--help\t\tShow this help information\n", axismap, buttonmap);
return -1;
}
else
{
printf("Invalid parameter: %s\n", argv[i]);
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
@@ -134,30 +113,31 @@ int joy_init(struct lcd_logical_driver *driver, char *args)
*/
fd = open (device, O_RDONLY);
fcntl(fd, F_SETFL, O_NONBLOCK);
fcntl (fd, F_SETFL, O_NONBLOCK);
if(fd < 0) return -1;
if (fd < 0)
return -1;
ioctl(fd, JSIOCGVERSION, &jsversion);
ioctl(fd, JSIOCGAXES, &axes);
ioctl(fd, JSIOCGBUTTONS, &buttons);
ioctl(fd, JSIOCGNAME(NAME_LENGTH), jsname);
ioctl (fd, JSIOCGVERSION, &jsversion);
ioctl (fd, JSIOCGAXES, &axes);
ioctl (fd, JSIOCGBUTTONS, &buttons);
ioctl (fd, JSIOCGNAME (NAME_LENGTH), jsname);
debug("Joystick (%s) has %d axes and %d buttons. Driver version is %d.%d.%d.\n",
jsname, axes, buttons,
jsversion >> 16, (jsversion >> 8) & 0xff, jsversion & 0xff);
debug ("Joystick (%s) has %d axes and %d buttons. Driver version is %d.%d.%d.\n", jsname, axes, buttons, jsversion >> 16, (jsversion >> 8) & 0xff, jsversion & 0xff);
axis = calloc(axes, sizeof(int));
button = calloc(buttons, sizeof(char));
axis = calloc (axes, sizeof (int));
button = calloc (buttons, sizeof (char));
return fd; // 200 is arbitrary. (must be 1 or more)
}
void joy_close()
void
joy_close ()
{
if(joy->framebuf != NULL) free(joy->framebuf);
close(fd);
if (joy->framebuf != NULL)
free (joy->framebuf);
close (fd);
joy->framebuf = NULL;
@@ -173,21 +153,22 @@ void joy_close()
//
// Return 0 for "nothing available".
//
char joy_getkey()
char
joy_getkey ()
{
int i;
int err;
err = read(fd, &js, sizeof(struct js_event));
if (err <= 0) return 0;
if (err != sizeof(struct js_event)) {
fprintf(stderr, "\nerror reading joystick\n");
err = read (fd, &js, sizeof (struct js_event));
if (err <= 0)
return 0;
if (err != sizeof (struct js_event)) {
fprintf (stderr, "\nerror reading joystick\n");
return 0;
}
// if(js.type & JS_EVENT_INIT) return 0;
switch(js.type & ~JS_EVENT_INIT) {
switch (js.type & ~JS_EVENT_INIT) {
case JS_EVENT_BUTTON:
button[js.number] = js.value;
break;
@@ -200,17 +181,19 @@ char joy_getkey()
//printf("Buttons: ");
for (i = 0; i < buttons; i++)
//printf("%2d:%s ", i, button[i] ? "on " : "off");
if(button[i]) return buttonmap[i];
if (button[i])
return buttonmap[i];
}
if (axes) {
//printf("Axes: ");
for (i = 0; i < axes; i++)
{
for (i = 0; i < axes; i++) {
//printf("%2d:%6d ", i, axis[i]);
// Eliminate noise...
if(axis[i] > 20000) return axismap[(2*i) + 1];
if(axis[i] < -20000) return axismap[(2*i)];
if (axis[i] > 20000)
return axismap[(2 * i) + 1];
if (axis[i] < -20000)
return axismap[(2 * i)];
}
}
+3 -3
View File
@@ -4,9 +4,9 @@
extern lcd_logical_driver *joy;
int joy_init(struct lcd_logical_driver *driver, char *args);
void joy_close();
char joy_getkey();
int joy_init (struct lcd_logical_driver *driver, char *args);
void joy_close ();
char joy_getkey ();
#endif
+248 -274
View File
@@ -61,40 +61,39 @@
lcd_logical_driver lcd;
lcd_physical_driver drivers[] =
{
{ "base", drv_base_init, },
lcd_physical_driver drivers[] = {
{"base", drv_base_init,},
#ifdef MTXORB_DRV
{ "MtxOrb", MtxOrb_init, },
{"MtxOrb", MtxOrb_init,},
#endif
#ifdef CFONTZ_DRV
{ "CFontz", CFontz_init, },
{"CFontz", CFontz_init,},
#endif
#ifdef HD44780_DRV
{ "HD44780", HD44780_init, },
{"HD44780", HD44780_init,},
#endif
#ifdef SLI_DRV
{ "sli", sli_init, },
{"sli", sli_init,},
#endif
#ifdef TEXT_DRV
{ "text", text_init, },
{"text", text_init,},
#endif
#ifdef DEBUG_DRV
{ "debug", debug_init, },
{"debug", debug_init,},
#endif
#ifdef CURSES_DRV
{ "curses", curses_drv_init, },
{"curses", curses_drv_init,},
#endif
#ifdef JOY_DRV
{ "joy", joy_init, },
{"joy", joy_init,},
#endif
#ifdef IRMANIN_DRV
{ "irmanin", irmanin_init, },
{"irmanin", irmanin_init,},
#endif
#ifdef LIRCIN_DRV
{ "lircin", lircin_init, },
{"lircin", lircin_init,},
#endif
{ NULL, NULL, },
{NULL, NULL,},
};
@@ -103,21 +102,21 @@ LL *list;
////////////////////////////////////////////////////////////
// This sets up which driver to use and initializes stuff.
//
int lcd_init(char *args)
int
lcd_init (char *args)
{
// int i;
int err;
list = LL_new();
if(!list)
{
printf("Error allocating driver list.\n");
list = LL_new ();
if (!list) {
printf ("Error allocating driver list.\n");
return -1;
}
lcd_drv_init(NULL, NULL);
lcd_drv_init (NULL, NULL);
err = lcd_add_driver("base", args);
err = lcd_add_driver ("base", args);
lcd.wid = 20;
lcd.hgt = 4;
@@ -144,51 +143,49 @@ int lcd_init(char *args)
// TODO: lcd_remove_driver()
int lcd_add_driver(char *driver, char *args)
int
lcd_add_driver (char *driver, char *args)
{
int i;
lcd_logical_driver *add;
for(i=0; drivers[i].name; i++)
{
for (i = 0; drivers[i].name; i++) {
//printf("Checking driver: %s\n", drivers[i].name);
if(0 == strcmp(driver, drivers[i].name))
{
if (0 == strcmp (driver, drivers[i].name)) {
//printf("Found driver: %s (%s)\n", drivers[i].name, driver);
add = malloc(sizeof(lcd_logical_driver));
if(!add)
{
printf("Couldn't allocate driver \"%s\".\n", driver);
add = malloc (sizeof (lcd_logical_driver));
if (!add) {
printf ("Couldn't allocate driver \"%s\".\n", driver);
return -1;
}
//printf("Allocated driver\n");
memset(add, 0, sizeof(lcd_logical_driver));
memset (add, 0, sizeof (lcd_logical_driver));
add->wid = lcd.wid; add->hgt = lcd.hgt;
add->cellwid = lcd.cellwid; add->cellhgt = lcd.cellhgt;
add->wid = lcd.wid;
add->hgt = lcd.hgt;
add->cellwid = lcd.cellwid;
add->cellhgt = lcd.cellhgt;
// printf("LCD driver info:\n\twid: %i\thgt: %i\n",
// add->wid, add->hgt);
add->framebuf = malloc(add->wid * add->hgt);
add->framebuf = malloc (add->wid * add->hgt);
if(!add->framebuf)
{
printf("Couldn't allocate framebuffer for driver \"%s\".\n",
driver);
free(add);
if (!add->framebuf) {
printf ("Couldn't allocate framebuffer for driver \"%s\".\n", driver);
free (add);
return -1;
}
//printf("Allocated frame buffer\n");
LL_Push(list, (void *)add);
LL_Push (list, (void *) add);
return drivers[i].init(add, args);
return drivers[i].init (add, args);
}
}
@@ -196,42 +193,40 @@ int lcd_add_driver(char *driver, char *args)
}
// TODO: Put lcd_shutdown in the shutdown function...
int lcd_shutdown()
int
lcd_shutdown ()
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
//printf("driver...\n");
lcd.framebuf = driver->framebuf;
if((int)driver->close > 0)
{
driver->close();
}
else if((int)driver->close == -1)
{
drv_base->close();
if ((int) driver->close > 0) {
driver->close ();
} else if ((int) driver->close == -1) {
drv_base->close ();
}
LL_Shift(list);
LL_Shift (list);
// FIXME: This crashes!
//if(driver) free(driver);
//printf("...freed\n");
}
} while(LL_Length(list) > 0);
} while (LL_Length (list) > 0);
return 0;
}
int lcd_drv_init(struct lcd_logical_driver *driver, char *args)
int
lcd_drv_init (struct lcd_logical_driver *driver, char *args)
{
// printf("lcd_drv_init()\n");
@@ -302,139 +297,132 @@ int lcd_drv_init(struct lcd_logical_driver *driver, char *args)
//////////////////////////////////////////////////////////////////////
void lcd_drv_close()
void
lcd_drv_close ()
{
lcd_logical_driver *driver;
// printf("lcd_drv_close()\n");
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->close > 0)
{
printf("Calling close()\n");
driver->close();
}
else if((int)driver->close == -1)
{
drv_base->close();
if ((int) driver->close > 0) {
printf ("Calling close()\n");
driver->close ();
} else if ((int) driver->close == -1) {
drv_base->close ();
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_clear()
void
lcd_drv_clear ()
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->clear > 0)
driver->clear();
else if((int)driver->clear == -1)
{
drv_base->clear();
if ((int) driver->clear > 0)
driver->clear ();
else if ((int) driver->clear == -1) {
drv_base->clear ();
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_flush()
void
lcd_drv_flush ()
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->flush > 0)
driver->flush();
else if((int)driver->flush == -1)
{
drv_base->flush();
if ((int) driver->flush > 0)
driver->flush ();
else if ((int) driver->flush == -1) {
drv_base->flush ();
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_string(int x, int y, char string[])
void
lcd_drv_string (int x, int y, char string[])
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->string > 0)
driver->string(x,y,string);
else if((int)driver->string == -1)
{
drv_base->string(x,y,string);
if ((int) driver->string > 0)
driver->string (x, y, string);
else if ((int) driver->string == -1) {
drv_base->string (x, y, string);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_chr(int x, int y, char c)
void
lcd_drv_chr (int x, int y, char c)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->chr > 0)
driver->chr(x,y,c);
else if((int)driver->chr == -1)
{
drv_base->chr(x,y,c);
if ((int) driver->chr > 0)
driver->chr (x, y, c);
else if ((int) driver->chr == -1) {
drv_base->chr (x, y, c);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
int lcd_drv_contrast(int contrast)
int
lcd_drv_contrast (int contrast)
{
int res=0;
int res = 0;
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->contrast > 0)
{
res=driver->contrast(contrast);
if(res >= 0) return res;
if ((int) driver->contrast > 0) {
res = driver->contrast (contrast);
if (res >= 0)
return res;
}
/*
else if((int)driver->contrast == -1)
@@ -443,296 +431,282 @@ int lcd_drv_contrast(int contrast)
}
*/
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
return res;
}
void lcd_drv_backlight(int on)
void
lcd_drv_backlight (int on)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->backlight > 0)
driver->backlight(on);
else if((int)driver->backlight == -1)
{
drv_base->backlight(on);
if ((int) driver->backlight > 0)
driver->backlight (on);
else if ((int) driver->backlight == -1) {
drv_base->backlight (on);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_output(int on)
void
lcd_drv_output (int on)
{
lcd_logical_driver *driver;
LL_Rewind(list);
do
{
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->output > 0)
driver->output(on);
else if((int)driver->output == -1)
{
drv_base->output(on);
if ((int) driver->output > 0)
driver->output (on);
else if ((int) driver->output == -1) {
drv_base->output (on);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_init_vbar()
void
lcd_drv_init_vbar ()
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->init_vbar > 0)
driver->init_vbar();
else if((int)driver->init_vbar == -1)
{
drv_base->init_vbar();
if ((int) driver->init_vbar > 0)
driver->init_vbar ();
else if ((int) driver->init_vbar == -1) {
drv_base->init_vbar ();
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_init_hbar()
void
lcd_drv_init_hbar ()
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->init_hbar > 0)
driver->init_hbar();
else if((int)driver->init_hbar == -1)
{
drv_base->init_hbar();
if ((int) driver->init_hbar > 0)
driver->init_hbar ();
else if ((int) driver->init_hbar == -1) {
drv_base->init_hbar ();
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_init_num()
void
lcd_drv_init_num ()
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->init_num > 0)
driver->init_num();
else if((int)driver->init_num == -1)
{
drv_base->init_num();
if ((int) driver->init_num > 0)
driver->init_num ();
else if ((int) driver->init_num == -1) {
drv_base->init_num ();
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_num(int x, int num)
void
lcd_drv_num (int x, int num)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->num > 0)
driver->num(x,num);
else if((int)driver->num == -1)
{
drv_base->num(x,num);
if ((int) driver->num > 0)
driver->num (x, num);
else if ((int) driver->num == -1) {
drv_base->num (x, num);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_set_char(int n, char *dat)
void
lcd_drv_set_char (int n, char *dat)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->set_char > 0)
driver->set_char(n,dat);
else if((int)driver->set_char == -1)
{
drv_base->set_char(n,dat);
if ((int) driver->set_char > 0)
driver->set_char (n, dat);
else if ((int) driver->set_char == -1) {
drv_base->set_char (n, dat);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_vbar(int x, int len)
void
lcd_drv_vbar (int x, int len)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->vbar > 0)
driver->vbar(x,len);
else if((int)driver->vbar == -1)
{
drv_base->vbar(x,len);
if ((int) driver->vbar > 0)
driver->vbar (x, len);
else if ((int) driver->vbar == -1) {
drv_base->vbar (x, len);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_hbar(int x, int y, int len)
void
lcd_drv_hbar (int x, int y, int len)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->hbar > 0)
driver->hbar(x,y,len);
else if((int)driver->hbar == -1)
{
drv_base->hbar(x,y,len);
if ((int) driver->hbar > 0)
driver->hbar (x, y, len);
else if ((int) driver->hbar == -1) {
drv_base->hbar (x, y, len);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_icon(int which, char dest)
void
lcd_drv_icon (int which, char dest)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->icon > 0)
driver->icon(which,dest);
else if((int)driver->icon == -1)
{
drv_base->icon(which,dest);
if ((int) driver->icon > 0)
driver->icon (which, dest);
else if ((int) driver->icon == -1) {
drv_base->icon (which, dest);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
void lcd_drv_flush_box(int lft, int top, int rgt, int bot)
void
lcd_drv_flush_box (int lft, int top, int rgt, int bot)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->flush_box > 0)
driver->flush_box(lft,top,rgt,bot);
else if((int)driver->flush_box == -1)
{
drv_base->flush_box(lft,top,rgt,bot);
if ((int) driver->flush_box > 0)
driver->flush_box (lft, top, rgt, bot);
else if ((int) driver->flush_box == -1) {
drv_base->flush_box (lft, top, rgt, bot);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
// TODO: Check whether lcd.draw_frame() should really take a framebuffer
// TODO: as an argument, or if it should always use lcd.framebuf
void lcd_drv_draw_frame(char *dat)
void
lcd_drv_draw_frame (char *dat)
{
lcd_logical_driver *driver;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->draw_frame > 0)
driver->draw_frame(dat);
else if((int)driver->draw_frame == -1)
{
drv_base->draw_frame(dat);
if ((int) driver->draw_frame > 0)
driver->draw_frame (dat);
else if ((int) driver->draw_frame == -1) {
drv_base->draw_frame (dat);
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
}
char lcd_drv_getkey()
char
lcd_drv_getkey ()
{
lcd_logical_driver *driver;
char key;
LL_Rewind(list);
LL_Rewind (list);
do {
driver = (lcd_logical_driver *)LL_Get(list);
if(driver)
{
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
if((int)driver->getkey > 0)
{
key = driver->getkey();
if(key) return key;
}
else if((int)driver->getkey == -1)
{
key = drv_base->getkey();
if(key) return key;
if ((int) driver->getkey > 0) {
key = driver->getkey ();
if (key)
return key;
} else if ((int) driver->getkey == -1) {
key = drv_base->getkey ();
if (key)
return key;
}
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
return 0;
}
+46 -49
View File
@@ -8,9 +8,9 @@
#define LCD_MAX_HEIGHT 256
int lcd_init(char *args);
int lcd_add_driver(char *driver, char *args);
int lcd_shutdown();
int lcd_init (char *args);
int lcd_add_driver (char *driver, char *args);
int lcd_shutdown ();
@@ -20,8 +20,7 @@ int lcd_shutdown();
// Feel free to override any/all functions here with real driver
// functions...
//
typedef struct lcd_logical_driver
{
typedef struct lcd_logical_driver {
// Size in cells of the LCD
int wid, hgt;
// Size of each LCD cell, in pixels
@@ -30,66 +29,64 @@ typedef struct lcd_logical_driver
char *framebuf;
// Functions which might be the same for all drivers...
void (*clear)();
void (*string)(int x, int y, char lcd[]);
void (*clear) ();
void (*string) (int x, int y, char lcd[]);
void (*chr)(int x, int y, char c);
void (*vbar)(int x, int len);
void (*hbar)(int x, int y, int len);
void (*init_num)();
void (*num)(int x, int num);
void (*chr) (int x, int y, char c);
void (*vbar) (int x, int len);
void (*hbar) (int x, int y, int len);
void (*init_num) ();
void (*num) (int x, int num);
// Functions which should probably be implemented in each driver...
int (*init)(struct lcd_logical_driver *driver, char *args);
void (*close)();
void (*flush)();
void (*flush_box)(int lft, int top, int rgt, int bot);
int (*contrast)(int contrast);
void (*backlight)(int on);
void (*output)(int on);
void (*set_char)(int n, char *dat);
void (*icon)(int which, char dest);
void (*init_vbar)();
void (*init_hbar)();
void (*draw_frame)();
int (*init) (struct lcd_logical_driver * driver, char *args);
void (*close) ();
void (*flush) ();
void (*flush_box) (int lft, int top, int rgt, int bot);
int (*contrast) (int contrast);
void (*backlight) (int on);
void (*output) (int on);
void (*set_char) (int n, char *dat);
void (*icon) (int which, char dest);
void (*init_vbar) ();
void (*init_hbar) ();
void (*draw_frame) ();
// Returns 0 for "no key pressed", or (A-Z).
char (*getkey)();
char (*getkey) ();
// more?
} lcd_logical_driver;
typedef struct lcd_physical_driver
{
typedef struct lcd_physical_driver {
char *name;
int (*init)(struct lcd_logical_driver *driver, char *device);
int (*init) (struct lcd_logical_driver * driver, char *device);
} lcd_physical_driver;
extern lcd_logical_driver lcd;
int lcd_drv_init(lcd_logical_driver *driver, char *args);
void lcd_drv_close();
void lcd_drv_clear();
void lcd_drv_flush();
void lcd_drv_string(int x, int y, char string[]);
void lcd_drv_chr(int x, int y, char c);
int lcd_drv_contrast(int contrast);
void lcd_drv_backlight(int on);
void lcd_drv_output(int on);
void lcd_drv_init_vbar();
void lcd_drv_init_hbar();
void lcd_drv_init_num();
void lcd_drv_num(int x, int num);
void lcd_drv_set_char(int n, char *dat);
void lcd_drv_vbar(int x, int len);
void lcd_drv_hbar(int x, int y, int len);
void lcd_drv_icon(int which, char dest);
void lcd_drv_flush_box(int lft, int top, int rgt, int bot);
void lcd_drv_draw_frame();
char lcd_drv_getkey();
int lcd_drv_init (lcd_logical_driver * driver, char *args);
void lcd_drv_close ();
void lcd_drv_clear ();
void lcd_drv_flush ();
void lcd_drv_string (int x, int y, char string[]);
void lcd_drv_chr (int x, int y, char c);
int lcd_drv_contrast (int contrast);
void lcd_drv_backlight (int on);
void lcd_drv_output (int on);
void lcd_drv_init_vbar ();
void lcd_drv_init_hbar ();
void lcd_drv_init_num ();
void lcd_drv_num (int x, int num);
void lcd_drv_set_char (int n, char *dat);
void lcd_drv_vbar (int x, int len);
void lcd_drv_hbar (int x, int y, int len);
void lcd_drv_icon (int which, char dest);
void lcd_drv_flush_box (int lft, int top, int rgt, int bot);
void lcd_drv_draw_frame ();
char lcd_drv_getkey ();
#endif
+32 -45
View File
@@ -39,11 +39,11 @@
#define SEM_WAIT 0,-1,SEM_UNDO
/* functions local to this file */
static key_t getkey(register char *p);
static key_t getkey (register char *p);
/* global variables */
static struct sembuf semaphore_wait = {SEM_WAIT};
static struct sembuf semaphore_signal = {SEM_SIGNAL};
static struct sembuf semaphore_wait = { SEM_WAIT };
static struct sembuf semaphore_signal = { SEM_SIGNAL };
static char rcsId[] = "$Id$";
@@ -52,9 +52,9 @@ static char rcsId[] = "$Id$";
*/
static key_t
getkey(register char *p)
getkey (register char *p)
{
return((key_t) SEMKEY);
return ((key_t) SEMKEY);
}
/*
@@ -63,46 +63,38 @@ getkey(register char *p)
*/
int
sem_get(void)
sem_get (void)
{
int semid;
union semun semval;
if ((semid = semget(getkey(SEMAPHORE), SEMCOUNT,
IPC_CREAT | IPC_EXCL | WMODE)) < 0)
{
switch (errno)
{
if ((semid = semget (getkey (SEMAPHORE), SEMCOUNT, IPC_CREAT | IPC_EXCL | WMODE)) < 0) {
switch (errno) {
case EEXIST:
/* semaphore set exists, get id and return it */
if ((semid = semget(getkey(SEMAPHORE), SEMCOUNT,
IPC_EXCL | WMODE)) < 0)
{
perror("semget");
exit(1);
if ((semid = semget (getkey (SEMAPHORE), SEMCOUNT, IPC_EXCL | WMODE)) < 0) {
perror ("semget");
exit (1);
}
return semid;
break;
case EACCES:
/* don't have permissions for semaphore, need to change key */
perror("semget, can't get permissions for semaphore");
exit(1);
perror ("semget, can't get permissions for semaphore");
exit (1);
break;
default:
perror("semget");
exit(1);
perror ("semget");
exit (1);
break;
}
}
else
{
} else {
/* initialise semaphore to 1 */
semval.val = 1;
if (semctl(semid, 0, SETVAL, semval) < 0)
{
perror("setval, can't initialise semaphore");
exit(1);
if (semctl (semid, 0, SETVAL, semval) < 0) {
perror ("setval, can't initialise semaphore");
exit (1);
}
}
@@ -114,12 +106,11 @@ sem_get(void)
*/
int
sem_wait(int sid)
sem_wait (int sid)
{
if (semop(sid, &semaphore_wait, 1) < -1)
{
perror(SEMAPHORE);
exit(1);
if (semop (sid, &semaphore_wait, 1) < -1) {
perror (SEMAPHORE);
exit (1);
}
return 0;
@@ -130,12 +121,11 @@ sem_wait(int sid)
*/
int
sem_signal(int sid)
sem_signal (int sid)
{
if (semop(sid, &semaphore_signal, 1) < -1)
{
perror(SEMAPHORE);
exit(1);
if (semop (sid, &semaphore_signal, 1) < -1) {
perror (SEMAPHORE);
exit (1);
}
return 0;
@@ -146,25 +136,22 @@ sem_signal(int sid)
*/
int
sem_remove(int sid)
sem_remove (int sid)
{
int i;
union semun dummy;
if ((i = semctl(sid, 0, IPC_RMID, dummy)) < 0)
{
switch(i)
{
if ((i = semctl (sid, 0, IPC_RMID, dummy)) < 0) {
switch (i) {
case EIDRM:
/* semaphore removed */
return 0;
break;
default:
perror("semctl, removing semaphore");
exit(1);
perror ("semctl, removing semaphore");
exit (1);
}
}
return 0;
}
+4 -4
View File
@@ -5,9 +5,9 @@
#ifndef LCD_SEM_H
#define LCD_SEM_H
int sem_get(void);
int sem_wait(int sid);
int sem_signal(int sid);
int sem_remove(int sid);
int sem_get (void);
int sem_wait (int sid);
int sem_signal (int sid);
int sem_remove (int sid);
#endif
-124
View File
@@ -1,124 +0,0 @@
/* lcddriver.cd - test/demo of LIBIR's to interface with lcdproc (LCDd) */
/* Copyright (C) 1999 David Glaude loosely based on workmanir.c */
/* workmanir.c - test/demo of LIBIR's high level command functions */
/* Copyright (C) 1998 Tom Wheeley, see file COPYING for details */
#include <config.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include "irman.h"
char *progname = "lcddriver";
char *codes[] = {
/* dummy */ NULL,
/* KeyToLcd */ "lcdproc-A",
/* KeyToLcd */ "lcdproc-B",
/* KeyToLcd */ "lcdproc-C",
/* KeyToLcd */ "lcdproc-D",
/* KeyToLcd */ "lcdproc-E",
/* KeyToLcd */ "lcdproc-F",
/* KeyToLcd */ "lcdproc-G",
/* KeyToLcd */ "lcdproc-H",
/* KeyToLcd */ "lcdproc-I",
/* KeyToLcd */ "lcdproc-J",
/* KeyToLcd */ "lcdproc-K",
/* KeyToLcd */ "lcdproc-L",
/* KeyToLcd */ "lcdproc-M",
/* KeyToLcd */ "lcdproc-N",
/* KeyToLcd */ "lcdproc-O",
/* KeyToLcd */ "lcdproc-P",
/* KeyToLcd */ "lcdproc-Q",
/* KeyToLcd */ "lcdproc-R",
/* KeyToLcd */ "lcdproc-S",
/* KeyToLcd */ "lcdproc-T",
/* KeyToLcd */ "lcdproc-U",
/* KeyToLcd */ "lcdproc-V",
/* KeyToLcd */ "lcdproc-W",
/* KeyToLcd */ "lcdproc-X",
/* KeyToLcd */ "lcdproc-Y",
/* KeyToLcd */ "lcdproc-Z",
/* end */ NULL
};
//void sigterm(int sig)
//{
// ir_free_commands();
// ir_finish();
// raise(sig);
//}
// INIT $$$
int INIT()
{
int i;
char *filename;
if (ir_init_commands(NULL, 1) < 0) {
fprintf(stderr, "error initialising commands: %s\n", strerror(errno));
exit(1);
}
filename = ir_default_portname();
filename = "option";
}
for (i=1; codes[i] != NULL; i++) {
if (ir_register_command(codes[i], i) < 0) {
if (errno == ENOENT) {
fprintf(stderr, "%s: no code set for `%s'\n", progname, codes[i]);
} else {
fprintf(stderr, "error registering `%s': `%s'\n", codes[i], strerror(errno));
}
}
}
errno = 0;
if (ir_init(filename) < 0) {
fprintf(stderr, "%s: error initialising Irman: `%s'\n", strerror(errno));
exit(1);
}
return 0;
}
// KEY $$$
int KEY(void)
{
int i;
int cmd;
char key;
key=(char)0;
for(i=1;i;) {
switch (cmd=ir_get_command()) {
case IR_CMD_ERROR:
fprintf(stderr, "%s: error reading command: %s\n", progname, strerror(errno));
// No exit in LCDd !!!
// exit(1);
case IR_CMD_UNKNOWN:
fprintf(stderr,"IR unknown command\n");
default: key='A'-1+cmd; break;
}
}
}
// CLOSE $$$
int CLOSE()
{
ir_free_commands();
ir_finish();
return 0;
}
/* end of lcddriver.c */
+25 -24
View File
@@ -49,10 +49,11 @@ lcd_logical_driver *lircin;
// raise(sig);
//}
void lircin_close()
void
lircin_close ()
{
lirc_freeconfig(config);
lirc_deinit();
lirc_freeconfig (config);
lirc_deinit ();
}
@@ -61,22 +62,22 @@ void lircin_close()
//
// Return 0 for "nothing available".
//
char lircin_getkey()
char
lircin_getkey ()
{
char key;
char *ir,*cmd;
char *ir, *cmd;
if (!(ir = lirc_nextir()))
{
if (!(ir = lirc_nextir ())) {
return 0;
} else {
if (!(cmd = lirc_ir2char (config, ir)))
return 0;
} else
{
if (!(cmd = lirc_ir2char(config,ir))) return 0;
printf("lirc: \"%s\"\n", cmd);
sscanf(cmd,"%c",&key);
printf("\n%c\n",key);
free(ir);
printf ("lirc: \"%s\"\n", cmd);
sscanf (cmd, "%c", &key);
printf ("\n%c\n", key);
free (ir);
return key;
}
@@ -87,7 +88,8 @@ char lircin_getkey()
////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and
// point all the function pointers.
int lircin_init(struct lcd_logical_driver *driver, char *args)
int
lircin_init (struct lcd_logical_driver *driver, char *args)
{
/* assign funktions */
@@ -100,23 +102,22 @@ int lircin_init(struct lcd_logical_driver *driver, char *args)
/* open socket to lirc */
if (-1 == (fd = lirc_init("lcdd",1))) {
fprintf(stderr,"no infrared remote support available\n");
if (-1 == (fd = lirc_init ("lcdd", 1))) {
fprintf (stderr, "no infrared remote support available\n");
return -1;
}
if (0 != lirc_readconfig(NULL,&config,NULL)) {
lirc_deinit();
if (0 != lirc_readconfig (NULL, &config, NULL)) {
lirc_deinit ();
return -1;
}
fcntl(fd,F_SETFL,O_NONBLOCK);
fcntl(fd,F_SETFD,FD_CLOEXEC);
fcntl (fd, F_SETFL, O_NONBLOCK);
fcntl (fd, F_SETFD, FD_CLOEXEC);
/* socket shouldn block lcdd */
fcntl(fd,F_SETFL,O_NONBLOCK);
fcntl(fd,F_SETFD,FD_CLOEXEC);
fcntl (fd, F_SETFL, O_NONBLOCK);
fcntl (fd, F_SETFD, FD_CLOEXEC);
return 1; // 200 is arbitrary. (must be 1 or more)
}
+3 -3
View File
@@ -4,9 +4,9 @@
extern lcd_logical_driver *lircin;
int lircin_init(struct lcd_logical_driver *driver, char *args);
void lircin_close();
char lircin_getkey();
int lircin_init (struct lcd_logical_driver *driver, char *args);
void lircin_close ();
char lircin_getkey ();
#endif
+14 -14
View File
@@ -15,36 +15,36 @@
#endif
#ifndef DOS
static inline int port_in( int port )
static inline int
port_in (int port)
{
unsigned char value;
__asm__ volatile ("inb %1,%0"
: "=a" (value)
: "d" ((unsigned short)port));
__asm__ volatile ("inb %1,%0":"=a" (value)
:"d" ((unsigned short) port));
return value;
}
static inline void port_out( unsigned short int port, unsigned char val )
static inline void
port_out (unsigned short int port, unsigned char val)
{
__asm__ volatile (
"outb %0,%1\n"
:
: "a" (val), "d" (port)
__asm__ volatile ("outb %0,%1\n"::"a" (val), "d" (port)
);
}
#else
#include <pc.h>
static inline int port_in( int port )
static inline int
port_in (int port)
{
unsigned char value;
value = inportb((unsigned short) port);
return (int)value;
value = inportb ((unsigned short) port);
return (int) value;
}
static inline void port_out( unsigned int port, unsigned char val )
static inline void
port_out (unsigned int port, unsigned char val)
{
outportb((unsigned short) port, val);
outportb ((unsigned short) port, val);
}
#endif
+308 -244
View File
@@ -38,134 +38,134 @@
/* Small font */
const unsigned char simple_font5x7[] = {
/* ascii '0' ( ) */ 31,31,31,31,31,31,31,
/* ascii '1' ( ) */ 31,31,31,31,31,31,31,
/* ascii '2' ( ) */ 31,31,31,31,31,31,31,
/* ascii '3' ( ) */ 31,31,31,31,31,31,31,
/* ascii '4' ( ) */ 31,31,31,31,31,31,31,
/* ascii '5' ( ) */ 31,31,31,31,31,31,31,
/* ascii '6' ( ) */ 31,31,31,31,31,31,31,
/* ascii '7' ( ) */ 31,31,31,31,31,31,31,
/* ascii '8' ( ) */ 31,31,31,31,31,31,31,
/* ascii '9' ( ) */ 31,31,31,31,31,31,31,
/* ascii '10' ( ) */ 31,31,31,31,31,31,31,
/* ascii '11' ( ) */ 31,31,31,31,31,31,31,
/* ascii '12' ( ) */ 31,31,31,31,31,31,31,
/* ascii '13' ( ) */ 31,31,31,31,31,31,31,
/* ascii '14' ( ) */ 31,31,31,31,31,31,31,
/* ascii '15' ( ) */ 31,31,31,31,31,31,31,
/* ascii '16' ( ) */ 31,31,31,31,31,31,31,
/* ascii '17' ( ) */ 31,31,31,31,31,31,31,
/* ascii '18' ( ) */ 31,31,31,31,31,31,31,
/* ascii '19' ( ) */ 31,31,31,31,31,31,31,
/* ascii '20' ( ) */ 31,31,31,31,31,31,31,
/* ascii '21' ( ) */ 31,31,31,31,31,31,31,
/* ascii '22' ( ) */ 31,31,31,31,31,31,31,
/* ascii '23' ( ) */ 31,31,31,31,31,31,31,
/* ascii '24' ( ) */ 31,31,31,31,31,31,31,
/* ascii '25' ( ) */ 31,31,31,31,31,31,31,
/* ascii '26' ( ) */ 31,31,31,31,31,31,31,
/* ascii '27' ( ) */ 31,31,31,31,31,31,31,
/* ascii '28' ( ) */ 31,31,31,31,31,31,31,
/* ascii '29' ( ) */ 31,31,31,31,31,31,31,
/* ascii '30' ( ) */ 31,31,31,31,31,31,31,
/* ascii '31' ( ) */ 31,31,31,31,31,31,31,
/* ascii '0' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '1' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '2' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '3' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '4' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '5' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '6' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '7' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '8' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '9' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '10' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '11' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '12' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '13' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '14' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '15' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '16' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '17' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '18' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '19' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '20' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '21' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '22' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '23' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '24' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '25' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '26' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '27' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '28' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '29' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '30' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '31' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '32' ( ) */ 31,31,31,31,31,31,31,
/* ascii '33' (!) */ 27,27,27,27,31,31,27,
/* ascii '34' (") */ 21,21,21,31,31,31,31,
/* ascii '35' (#) */ 21,21,0,21,0,21,21,
/* ascii '36' ($) */ 27,1,26,17,11,16,27,
/* ascii '37' (%) */ 28,12,23,27,29,6,7,
/* ascii '38' (&) */ 25,22,26,29,10,22,9,
/* ascii '39' (') */ 25,27,29,31,31,31,31,
/* ascii '40' (() */ 23,27,29,29,29,27,23,
/* ascii '41' ()) */ 29,27,23,23,23,27,29,
/* ascii '42' (*) */ 31,27,10,17,10,27,31,
/* ascii '43' (+) */ 31,27,27,0,27,27,31,
/* ascii '44' (,) */ 31,31,31,31,25,27,29,
/* ascii '45' (-) */ 31,31,31,0,31,31,31,
/* ascii '46' (.) */ 31,31,31,31,31,25,25,
/* ascii '47' (/) */ 31,15,23,27,29,30,31,
/* ascii '48' (0) */ 17,14,6,10,12,14,17,
/* ascii '49' (1) */ 27,25,27,27,27,27,17,
/* ascii '50' (2) */ 17,14,15,23,27,29,0,
/* ascii '51' (3) */ 0,23,27,23,15,14,17,
/* ascii '52' (4) */ 23,19,21,22,0,23,23,
/* ascii '53' (5) */ 0,30,16,15,15,14,17,
/* ascii '54' (6) */ 19,29,30,16,14,14,17,
/* ascii '55' (7) */ 0,15,23,27,29,29,29,
/* ascii '56' (8) */ 17,14,14,17,14,14,17,
/* ascii '57' (9) */ 17,14,14,1,15,23,25,
/* ascii '58' (:) */ 31,25,25,31,25,25,31,
/* ascii '59' (;) */ 31,25,25,31,25,27,29,
/* ascii '60' (<) */ 23,27,29,30,29,27,23,
/* ascii '61' (=) */ 31,31,0,31,0,31,31,
/* ascii '62' (>) */ 29,27,23,15,23,27,29,
/* ascii '63' (?) */ 17,14,15,23,27,31,27,
/* ascii '64' (@) */ 17,14,15,9,10,10,17,
/* ascii '65' (A) */ 17,14,14,14,0,14,14,
/* ascii '66' (B) */ 16,14,14,16,14,14,16,
/* ascii '67' (C) */ 16,14,30,30,30,14,16,
/* ascii '68' (D) */ 24,22,14,14,14,22,24,
/* ascii '69' (E) */ 0,30,30,16,30,30,0,
/* ascii '70' (F) */ 0,30,30,16,30,30,30,
/* ascii '71' (G) */ 17,14,30,2,14,14,1,
/* ascii '72' (H) */ 14,14,14,0,14,14,14,
/* ascii '73' (I) */ 17,27,27,27,27,27,17,
/* ascii '74' (J) */ 3,23,23,23,23,22,25,
/* ascii '75' (K) */ 14,22,26,28,26,22,14,
/* ascii '76' (L) */ 30,30,30,30,30,30,0,
/* ascii '77' (M) */ 14,4,10,10,14,14,14,
/* ascii '78' (N) */ 14,14,12,10,6,14,14,
/* ascii '79' (O) */ 17,14,14,14,14,14,17,
/* ascii '80' (P) */ 16,14,14,16,30,30,30,
/* ascii '81' (Q) */ 17,14,14,14,10,22,9,
/* ascii '82' (R) */ 16,14,14,16,26,22,14,
/* ascii '83' (S) */ 1,30,30,17,15,15,16,
/* ascii '84' (T) */ 0,27,27,27,27,27,27,
/* ascii '85' (U) */ 14,14,14,14,14,14,17,
/* ascii '86' (V) */ 14,14,14,14,14,21,27,
/* ascii '87' (W) */ 14,14,14,14,10,10,21,
/* ascii '88' (X) */ 14,14,21,27,21,14,14,
/* ascii '89' (Y) */ 14,14,14,21,27,27,27,
/* ascii '90' (Z) */ 0,15,23,27,29,30,0,
/* ascii '91' ([) */ 17,29,29,29,29,29,17,
/* ascii '92' (\) */ 31,30,29,27,23,15,31,
/* ascii '93' (]) */ 17,23,23,23,23,23,17,
/* ascii '94' (^) */ 27,21,14,31,31,31,31,
/* ascii '95' (_) */ 31,31,31,31,31,31,0,
/* ascii '96' (`) */ 29,27,23,31,31,31,31,
/* ascii '97' (a) */ 31,31,17,15,1,14,1,
/* ascii '98' (b) */ 30,30,18,12,14,14,16,
/* ascii '99' (c) */ 31,31,17,30,30,14,17,
/* ascii '100' (d) */ 15,15,9,6,14,14,1,
/* ascii '101' (e) */ 31,31,17,14,0,30,17,
/* ascii '102' (f) */ 19,13,29,24,29,29,29,
/* ascii '103' (g) */ 31,1,14,14,1,15,17,
/* ascii '104' (h) */ 30,30,18,12,14,14,14,
/* ascii '105' (i) */ 27,31,25,27,27,27,17,
/* ascii '106' (j) */ 23,31,19,23,23,22,25,
/* ascii '107' (k) */ 30,30,22,26,28,26,22,
/* ascii '108' (l) */ 25,27,27,27,27,27,17,
/* ascii '109' (m) */ 31,31,20,10,10,14,14,
/* ascii '110' (n) */ 31,31,18,12,14,14,14,
/* ascii '111' (o) */ 31,31,17,14,14,14,17,
/* ascii '112' (p) */ 31,31,16,14,16,30,30,
/* ascii '113' (q) */ 31,31,9,6,1,15,15,
/* ascii '114' (r) */ 31,31,18,12,30,30,30,
/* ascii '115' (s) */ 31,31,17,30,17,15,16,
/* ascii '116' (t) */ 29,29,24,29,29,13,19,
/* ascii '117' (u) */ 31,31,14,14,14,6,9,
/* ascii '118' (v) */ 31,31,14,14,14,21,27,
/* ascii '119' (w) */ 31,31,14,14,10,10,21,
/* ascii '120' (x) */ 31,31,14,21,27,21,14,
/* ascii '121' (y) */ 31,31,14,14,1,15,17,
/* ascii '122' (z) */ 31,31,0,23,27,29,0,
/* ascii '123' ({) */ 23,27,27,29,27,27,23,
/* ascii '124' (|) */ 27,27,27,27,27,27,27,
/* ascii '125' (}) */ 29,27,27,23,27,27,29,
/* ascii '126' (~) */ 31,27,23,0,23,27,31
/* ascii '32' ( ) */ 31, 31, 31, 31, 31, 31, 31,
/* ascii '33' (!) */ 27, 27, 27, 27, 31, 31, 27,
/* ascii '34' (") */ 21, 21, 21, 31, 31, 31, 31,
/* ascii '35' (#) */ 21, 21, 0, 21, 0, 21, 21,
/* ascii '36' ($) */ 27, 1, 26, 17, 11, 16, 27,
/* ascii '37' (%) */ 28, 12, 23, 27, 29, 6, 7,
/* ascii '38' (&) */ 25, 22, 26, 29, 10, 22, 9,
/* ascii '39' (') */ 25, 27, 29, 31, 31, 31, 31,
/* ascii '40' (() */ 23, 27, 29, 29, 29, 27, 23,
/* ascii '41' ()) */ 29, 27, 23, 23, 23, 27, 29,
/* ascii '42' (*) */ 31, 27, 10, 17, 10, 27, 31,
/* ascii '43' (+) */ 31, 27, 27, 0, 27, 27, 31,
/* ascii '44' (,) */ 31, 31, 31, 31, 25, 27, 29,
/* ascii '45' (-) */ 31, 31, 31, 0, 31, 31, 31,
/* ascii '46' (.) */ 31, 31, 31, 31, 31, 25, 25,
/* ascii '47' (/) */ 31, 15, 23, 27, 29, 30, 31,
/* ascii '48' (0) */ 17, 14, 6, 10, 12, 14, 17,
/* ascii '49' (1) */ 27, 25, 27, 27, 27, 27, 17,
/* ascii '50' (2) */ 17, 14, 15, 23, 27, 29, 0,
/* ascii '51' (3) */ 0, 23, 27, 23, 15, 14, 17,
/* ascii '52' (4) */ 23, 19, 21, 22, 0, 23, 23,
/* ascii '53' (5) */ 0, 30, 16, 15, 15, 14, 17,
/* ascii '54' (6) */ 19, 29, 30, 16, 14, 14, 17,
/* ascii '55' (7) */ 0, 15, 23, 27, 29, 29, 29,
/* ascii '56' (8) */ 17, 14, 14, 17, 14, 14, 17,
/* ascii '57' (9) */ 17, 14, 14, 1, 15, 23, 25,
/* ascii '58' (:) */ 31, 25, 25, 31, 25, 25, 31,
/* ascii '59' (;) */ 31, 25, 25, 31, 25, 27, 29,
/* ascii '60' (<) */ 23, 27, 29, 30, 29, 27, 23,
/* ascii '61' (=) */ 31, 31, 0, 31, 0, 31, 31,
/* ascii '62' (>) */ 29, 27, 23, 15, 23, 27, 29,
/* ascii '63' (?) */ 17, 14, 15, 23, 27, 31, 27,
/* ascii '64' (@) */ 17, 14, 15, 9, 10, 10, 17,
/* ascii '65' (A) */ 17, 14, 14, 14, 0, 14, 14,
/* ascii '66' (B) */ 16, 14, 14, 16, 14, 14, 16,
/* ascii '67' (C) */ 16, 14, 30, 30, 30, 14, 16,
/* ascii '68' (D) */ 24, 22, 14, 14, 14, 22, 24,
/* ascii '69' (E) */ 0, 30, 30, 16, 30, 30, 0,
/* ascii '70' (F) */ 0, 30, 30, 16, 30, 30, 30,
/* ascii '71' (G) */ 17, 14, 30, 2, 14, 14, 1,
/* ascii '72' (H) */ 14, 14, 14, 0, 14, 14, 14,
/* ascii '73' (I) */ 17, 27, 27, 27, 27, 27, 17,
/* ascii '74' (J) */ 3, 23, 23, 23, 23, 22, 25,
/* ascii '75' (K) */ 14, 22, 26, 28, 26, 22, 14,
/* ascii '76' (L) */ 30, 30, 30, 30, 30, 30, 0,
/* ascii '77' (M) */ 14, 4, 10, 10, 14, 14, 14,
/* ascii '78' (N) */ 14, 14, 12, 10, 6, 14, 14,
/* ascii '79' (O) */ 17, 14, 14, 14, 14, 14, 17,
/* ascii '80' (P) */ 16, 14, 14, 16, 30, 30, 30,
/* ascii '81' (Q) */ 17, 14, 14, 14, 10, 22, 9,
/* ascii '82' (R) */ 16, 14, 14, 16, 26, 22, 14,
/* ascii '83' (S) */ 1, 30, 30, 17, 15, 15, 16,
/* ascii '84' (T) */ 0, 27, 27, 27, 27, 27, 27,
/* ascii '85' (U) */ 14, 14, 14, 14, 14, 14, 17,
/* ascii '86' (V) */ 14, 14, 14, 14, 14, 21, 27,
/* ascii '87' (W) */ 14, 14, 14, 14, 10, 10, 21,
/* ascii '88' (X) */ 14, 14, 21, 27, 21, 14, 14,
/* ascii '89' (Y) */ 14, 14, 14, 21, 27, 27, 27,
/* ascii '90' (Z) */ 0, 15, 23, 27, 29, 30, 0,
/* ascii '91' ([) */ 17, 29, 29, 29, 29, 29, 17,
/* ascii '92' (\) */ 31, 30, 29, 27, 23, 15, 31,
/* ascii '93' (]) */ 17, 23, 23, 23, 23, 23, 17,
/* ascii '94' (^) */ 27, 21, 14, 31, 31, 31, 31,
/* ascii '95' (_) */ 31, 31, 31, 31, 31, 31, 0,
/* ascii '96' (`) */ 29, 27, 23, 31, 31, 31, 31,
/* ascii '97' (a) */ 31, 31, 17, 15, 1, 14, 1,
/* ascii '98' (b) */ 30, 30, 18, 12, 14, 14, 16,
/* ascii '99' (c) */ 31, 31, 17, 30, 30, 14, 17,
/* ascii '100' (d) */ 15, 15, 9, 6, 14, 14, 1,
/* ascii '101' (e) */ 31, 31, 17, 14, 0, 30, 17,
/* ascii '102' (f) */ 19, 13, 29, 24, 29, 29, 29,
/* ascii '103' (g) */ 31, 1, 14, 14, 1, 15, 17,
/* ascii '104' (h) */ 30, 30, 18, 12, 14, 14, 14,
/* ascii '105' (i) */ 27, 31, 25, 27, 27, 27, 17,
/* ascii '106' (j) */ 23, 31, 19, 23, 23, 22, 25,
/* ascii '107' (k) */ 30, 30, 22, 26, 28, 26, 22,
/* ascii '108' (l) */ 25, 27, 27, 27, 27, 27, 17,
/* ascii '109' (m) */ 31, 31, 20, 10, 10, 14, 14,
/* ascii '110' (n) */ 31, 31, 18, 12, 14, 14, 14,
/* ascii '111' (o) */ 31, 31, 17, 14, 14, 14, 17,
/* ascii '112' (p) */ 31, 31, 16, 14, 16, 30, 30,
/* ascii '113' (q) */ 31, 31, 9, 6, 1, 15, 15,
/* ascii '114' (r) */ 31, 31, 18, 12, 30, 30, 30,
/* ascii '115' (s) */ 31, 31, 17, 30, 17, 15, 16,
/* ascii '116' (t) */ 29, 29, 24, 29, 29, 13, 19,
/* ascii '117' (u) */ 31, 31, 14, 14, 14, 6, 9,
/* ascii '118' (v) */ 31, 31, 14, 14, 14, 21, 27,
/* ascii '119' (w) */ 31, 31, 14, 14, 10, 10, 21,
/* ascii '120' (x) */ 31, 31, 14, 21, 27, 21, 14,
/* ascii '121' (y) */ 31, 31, 14, 14, 1, 15, 17,
/* ascii '122' (z) */ 31, 31, 0, 23, 27, 29, 0,
/* ascii '123' ({) */ 23, 27, 27, 29, 27, 27, 23,
/* ascii '124' (|) */ 27, 27, 27, 27, 27, 27, 27,
/* ascii '125' (}) */ 29, 27, 27, 23, 27, 27, 29,
/* ascii '126' (~) */ 31, 27, 23, 0, 23, 27, 31
};
@@ -186,12 +186,12 @@ const unsigned char simple_font5x7[] = {
lcd_logical_driver *svgalib_drv;
int SVGALIB_PAD=255;
int SVGALIB_ELLIPSIS=7;
int SVGALIB_PAD = 255;
int SVGALIB_ELLIPSIS = 7;
void* SVGALIB_font; /* normal font */
void* SVGALIB_highfont; /* highlighted font (not used yet) */
void* SVGALIB_warnfont; /* warning font (not used yet) */
void *SVGALIB_font; /* normal font */
void *SVGALIB_highfont; /* highlighted font (not used yet) */
void *SVGALIB_warnfont; /* warning font (not used yet) */
/*
@@ -202,7 +202,7 @@ void* SVGALIB_warnfont; /* warning font (not used yet) */
Ahem... don't do this unless you can get to another console to kill the
process after.
*/
int SVGALIB_figure_mappings=0;
int SVGALIB_figure_mappings = 0;
//////////////////////////////////////////////////////////////////////////
////////////////////// For Output on SVGALIB screen //////////////////////
@@ -212,27 +212,27 @@ void* SVGALIB_warnfont; /* warning font (not used yet) */
void ExpandGroovyFont( int w, int ht, unsigned char col,
const unsigned char* fnt, unsigned char* ptr )
void
ExpandGroovyFont (int w, int ht, unsigned char col, const unsigned char *fnt, unsigned char *ptr)
// Expand groovy 5x7 font into an area of memory
{
int x,n,y;
unsigned char mask;
unsigned char base;
unsigned char *p;
int x, n, y;
unsigned char mask;
unsigned char base;
unsigned char *p;
p = ptr;
for (n=0;n<127;n++) {
for (y=0;y<ht;y++) {
for (n = 0; n < 127; n++) {
for (y = 0; y < ht; y++) {
mask = 1;
base = fnt[n*ht+y];
for (x=0;x<w;x++) {
base = fnt[n * ht + y];
for (x = 0; x < w; x++) {
if (base & mask) {
*p = 0;
} else {
*p = col;
}
p++;
mask*=2;
mask *= 2;
}
}
}
@@ -240,14 +240,15 @@ unsigned char *p;
}
void spaced_gl_writen( int x, int y, int count, char * text )
void
spaced_gl_writen (int x, int y, int count, char *text)
//
// Like gl_write but this one gets the spacing correct.
//
{
int i;
for (i=0;i<count;i++) {
gl_writen( 20+x+i*6, y,1, &text[i] );
int i;
for (i = 0; i < count; i++) {
gl_writen (20 + x + i * 6, y, 1, &text[i]);
}
}
@@ -255,39 +256,40 @@ int i;
static char icon_char = '@';
int svgalib_drv_init(struct lcd_logical_driver *driver, char *args)
int
svgalib_drv_init (struct lcd_logical_driver *driver, char *args)
{
char *argv[64];
int argc;
int i,j;
int i, j;
int VGAMODE;
int fgtemp;
char param[100];
char buffer[1024];
/* not used at the moment */
argc = get_args(argv, args, 64 );
argc = get_args (argv, args, 64);
svgalib_drv = driver;
vga_init();
vga_init ();
VGAMODE = G320x200x256; /* Default mode. */
if (!vga_hasmode(VGAMODE)) {
printf("320x200x256 Mode not available.\n");
if (!vga_hasmode (VGAMODE)) {
printf ("320x200x256 Mode not available.\n");
return -1;
} else {
vga_setmode(VGAMODE);
gl_setcontextvga(VGAMODE); /* Physical screen context. */
gl_setrgbpalette();
vga_setmode (VGAMODE);
gl_setcontextvga (VGAMODE); /* Physical screen context. */
gl_setrgbpalette ();
/* get the font */
SVGALIB_font = malloc( 256*8*8*1 );
ExpandGroovyFont( 5, 7, gl_rgbcolor(0,255,0), simple_font5x7, SVGALIB_font );
gl_setfont( 5, 7, SVGALIB_font );
SVGALIB_font = malloc (256 * 8 * 8 * 1);
ExpandGroovyFont (5, 7, gl_rgbcolor (0, 255, 0), simple_font5x7, SVGALIB_font);
gl_setfont (5, 7, SVGALIB_font);
}
gl_clearscreen(gl_rgbcolor(0,0,0));
gl_clearscreen (gl_rgbcolor (0, 0, 0));
// Override output functions...
@@ -321,16 +323,18 @@ int svgalib_drv_init(struct lcd_logical_driver *driver, char *args)
return 1;
}
void svgalib_drv_close()
void
svgalib_drv_close ()
{
vga_setmode(TEXT);
drv_base_close();
vga_setmode (TEXT);
drv_base_close ();
}
void svgalib_drv_clear()
void
svgalib_drv_clear ()
{
vga_waitretrace();
gl_clearscreen(gl_rgbcolor(0,0,0));
vga_waitretrace ();
gl_clearscreen (gl_rgbcolor (0, 0, 0));
}
@@ -338,74 +342,87 @@ void svgalib_drv_clear()
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void svgalib_drv_string(int x, int y, char string[])
void
svgalib_drv_string (int x, int y, char string[])
{
int i;
unsigned char *c;
for(i=0; string[i]; i++)
{
for (i = 0; string[i]; i++) {
c = &string[i];
switch(*c) {
case 0: *c = icon_char; break;
case 255: *c = '#'; break;
switch (*c) {
case 0:
*c = icon_char;
break;
case 255:
*c = '#';
break;
}
}
gl_setfont( 5,7,SVGALIB_font );
spaced_gl_writen( x*8,y*SVGALIB_FONT_VER+SVGALIB_Y_OFFSET, i, string );
gl_setfont (5, 7, SVGALIB_font);
spaced_gl_writen (x * 8, y * SVGALIB_FONT_VER + SVGALIB_Y_OFFSET, i, string);
}
/////////////////////////////////////////////////////////////////
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void svgalib_drv_chr(int x, int y, char c)
void
svgalib_drv_chr (int x, int y, char c)
{
char buffer[2];
switch(c) {
case 0: c=icon_char; break;
case -1: c = '#'; break;
char buffer[2];
switch (c) {
case 0:
c = icon_char;
break;
case -1:
c = '#';
break;
}
buffer[0] = c;
buffer[1] = 0;
gl_setfont( 5,7,SVGALIB_font );
spaced_gl_writen( x*8,y*SVGALIB_FONT_VER+SVGALIB_Y_OFFSET, 1, buffer );
gl_setfont (5, 7, SVGALIB_font);
spaced_gl_writen (x * 8, y * SVGALIB_FONT_VER + SVGALIB_Y_OFFSET, 1, buffer);
}
/////////////////////////////////////////////////////////////////
// Sets up for big numbers.
//
void svgalib_drv_init_num()
void
svgalib_drv_init_num ()
{
}
/////////////////////////////////////////////////////////////////
// Writes a big number, but not. A bit like the curses driver.
//
void svgalib_drv_num(int x, int num)
void
svgalib_drv_num (int x, int num)
{
char c;
int y, dx;
c='0'+num;
c = '0' + num;
for(y=1; y<5; y++)
for(dx=0; dx<3; dx++)
svgalib_drv_chr(x+dx, y, c);
for (y = 1; y < 5; y++)
for (dx = 0; dx < 3; dx++)
svgalib_drv_chr (x + dx, y, c);
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar; erases entire column onscreen.
//
void svgalib_drv_vbar(int x, int len)
void
svgalib_drv_vbar (int x, int len)
{
char map[]="_.,,ooO8";
char map[] = "_.,,ooO8";
int y;
for(y=lcd.hgt; y > 0 && len>0; y--)
{
if(len >= lcd.cellhgt) svgalib_drv_chr(x, y, '8');
else svgalib_drv_chr(x, y, map[len-1]);
for (y = lcd.hgt; y > 0 && len > 0; y--) {
if (len >= lcd.cellhgt)
svgalib_drv_chr (x, y, '8');
else
svgalib_drv_chr (x, y, map[len - 1]);
len -= lcd.cellhgt;
}
@@ -414,14 +431,14 @@ void svgalib_drv_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void svgalib_drv_hbar(int x, int y, int len)
void
svgalib_drv_hbar (int x, int y, int len)
{
for(; x<=lcd.wid && len>0; x++)
{
if(len>=lcd.cellwid)
svgalib_drv_chr(x, y, '=');
for (; x <= lcd.wid && len > 0; x++) {
if (len >= lcd.cellwid)
svgalib_drv_chr (x, y, '=');
else
svgalib_drv_chr(x, y, '-');
svgalib_drv_chr (x, y, '-');
len -= lcd.cellwid;
}
@@ -431,56 +448,74 @@ void svgalib_drv_hbar(int x, int y, int len)
/////////////////////////////////////////////////////////////////
// Sets character 0 to an icon...
//
void svgalib_drv_icon(int which, char dest)
void
svgalib_drv_icon (int which, char dest)
{
if(dest == 0)
switch(which)
{
case 0: icon_char = '+'; break;
case 1: icon_char = '*'; break;
default: icon_char = '#'; break;
if (dest == 0)
switch (which) {
case 0:
icon_char = '+';
break;
case 1:
icon_char = '*';
break;
default:
icon_char = '#';
break;
}
}
void svgalib_drv_flush()
void
svgalib_drv_flush ()
{
}
void svgalib_drv_flush_box(int lft, int top, int rgt, int bot)
void
svgalib_drv_flush_box (int lft, int top, int rgt, int bot)
{
}
void svgalib_drv_draw_frame(char *dat)
void
svgalib_drv_draw_frame (char *dat)
{
}
char svgalib_drv_getkey()
char
svgalib_drv_getkey ()
{
int i;
int loop;
FILE* fd;
i = vga_getkey();
int i;
int loop;
FILE *fd;
i = vga_getkey ();
if (i) {
switch (i) {
/* map the cursor keys to something sensible. */
case 27 :
i = vga_getkey();
if (i==91) {
i = vga_getkey();
case 27:
i = vga_getkey ();
if (i == 91) {
i = vga_getkey ();
switch (i) {
case VGAKEY_LEFT: i= 'D';break;
case VGAKEY_UP: i= 'B';break;
case VGAKEY_DOWN: i= 'C';break;
case VGAKEY_RIGHT: i= 'A';break;
case VGAKEY_LEFT:
i = 'D';
break;
case VGAKEY_UP:
i = 'B';
break;
case VGAKEY_DOWN:
i = 'C';
break;
case VGAKEY_RIGHT:
i = 'A';
break;
default:
i=0; /* key not recognised */
i = 0; /* key not recognised */
}
} else {
i=0;
i = 0;
}
break;
@@ -492,28 +527,57 @@ FILE* fd;
be able to quit LCDproc from the emulation.
*/
case 'j' : i= 'D';break; /* left */
case 'm' : i= 'B';break; /* up */
case '7' : i= 'C';break; /* down */
case 'u' : i= 'A';break; /* right */
case 'j':
i = 'D';
break; /* left */
case 'm':
i = 'B';
break; /* up */
case '7':
i = 'C';
break; /* down */
case 'u':
i = 'A';
break; /* right */
case 'v':i='Q';break; /* one */
case 'c':i='W';break; /* two */
case 'z':i='E';break; /* three */
case '4':i='R';break; /* four */
case '3':i='T';break; /* five */
case '1':i='Y';break; /* six */
case 'f':i='U';break; /* seven */
case 'd':i='I';break; /* eight */
case 'a':i='O';break; /* nine */
case 'e':i='P';break; /* zero */
case 'r':i='L';break; /* 'C' key */
default :
case 'v':
i = 'Q';
break; /* one */
case 'c':
i = 'W';
break; /* two */
case 'z':
i = 'E';
break; /* three */
case '4':
i = 'R';
break; /* four */
case '3':
i = 'T';
break; /* five */
case '1':
i = 'Y';
break; /* six */
case 'f':
i = 'U';
break; /* seven */
case 'd':
i = 'I';
break; /* eight */
case 'a':
i = 'O';
break; /* nine */
case 'e':
i = 'P';
break; /* zero */
case 'r':
i = 'L';
break; /* 'C' key */
default:
i = 0;
}
} /* if (i) */
}
/* if (i) */
return i;
}
+15 -15
View File
@@ -4,21 +4,21 @@
extern lcd_logical_driver *vgalib_drv;
int svgalib_drv_init(struct lcd_logical_driver *driver, char *args);
void svgalib_drv_close();
void svgalib_drv_clear();
void svgalib_drv_flush();
void svgalib_drv_string(int x, int y, char string[]);
void svgalib_drv_chr(int x, int y, char c);
void svgalib_drv_vbar(int x, int len);
void svgalib_drv_hbar(int x, int y, int len);
void svgalib_drv_icon(int which, char dest);
void svgalib_drv_flush();
void svgalib_drv_flush_box(int lft, int top, int rgt, int bot);
void svgalib_drv_draw_frame(char *dat);
char svgalib_drv_getkey();
void svgalib_drv_init_num();
void svgalib_drv_num(int x, int num);
int svgalib_drv_init (struct lcd_logical_driver *driver, char *args);
void svgalib_drv_close ();
void svgalib_drv_clear ();
void svgalib_drv_flush ();
void svgalib_drv_string (int x, int y, char string[]);
void svgalib_drv_chr (int x, int y, char c);
void svgalib_drv_vbar (int x, int len);
void svgalib_drv_hbar (int x, int y, int len);
void svgalib_drv_icon (int which, char dest);
void svgalib_drv_flush ();
void svgalib_drv_flush_box (int lft, int top, int rgt, int bot);
void svgalib_drv_draw_frame (char *dat);
char svgalib_drv_getkey ();
void svgalib_drv_init_num ();
void svgalib_drv_num (int x, int num);
#endif
+61 -52
View File
@@ -17,13 +17,13 @@ lcd_logical_driver *text;
////////////////////// For Text-Mode Output //////////////////////////////
//////////////////////////////////////////////////////////////////////////
int text_init(lcd_logical_driver *driver, char *args)
int
text_init (lcd_logical_driver * driver, char *args)
{
text = driver;
if(!driver->framebuf)
{
driver->close();
if (!driver->framebuf) {
driver->close ();
return -1;
}
@@ -33,14 +33,14 @@ int text_init(lcd_logical_driver *driver, char *args)
driver->cellwid = 5;
driver->cellhgt = 8;
driver->clear = (void *)-1;
driver->string = (void *)-1;
driver->chr = (void *)-1;
driver->clear = (void *) -1;
driver->string = (void *) -1;
driver->chr = (void *) -1;
driver->vbar = text_vbar;
driver->init_vbar = NULL;
driver->hbar = text_hbar;
driver->init_hbar = NULL;
driver->num = (void *)-1;
driver->num = (void *) -1;
driver->init_num = NULL;
driver->init = text_init;
@@ -59,17 +59,19 @@ int text_init(lcd_logical_driver *driver, char *args)
return 200; // 200 is arbitrary. (must be 1 or more)
}
void text_close()
void
text_close ()
{
drv_base_close();
drv_base_close ();
}
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
void text_clear()
void
text_clear ()
{
memset(lcd.framebuf, ' ', lcd.wid*lcd.hgt);
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
}
@@ -77,9 +79,10 @@ void text_clear()
//////////////////////////////////////////////////////////////////
// Flushes all output to the lcd...
//
void text_flush()
void
text_flush ()
{
text_draw_frame(lcd.framebuf);
text_draw_frame (lcd.framebuf);
}
@@ -87,16 +90,16 @@ void text_flush()
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void text_string(int x, int y, char string[])
void
text_string (int x, int y, char string[])
{
int i;
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
for(i=0; string[i]; i++)
{
lcd.framebuf[(y*lcd.wid) + x + i] = string[i];
for (i = 0; string[i]; i++) {
lcd.framebuf[(y * lcd.wid) + x + i] = string[i];
}
}
@@ -104,23 +107,26 @@ void text_string(int x, int y, char string[])
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void text_chr(int x, int y, char c)
void
text_chr (int x, int y, char c)
{
y--;
x--;
lcd.framebuf[(y*lcd.wid) + x] = c;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
int text_contrast(int contrast)
int
text_contrast (int contrast)
{
// printf("Contrast: %i\n", contrast);
return 0;
}
void text_backlight(int on)
void
text_backlight (int on)
{
/*
if(on)
@@ -134,27 +140,32 @@ void text_backlight(int on)
*/
}
void text_init_vbar()
void
text_init_vbar ()
{
// printf("Vertical bars.\n");
}
void text_init_hbar()
void
text_init_hbar ()
{
// printf("Horizontal bars.\n");
}
void text_init_num()
void
text_init_num ()
{
// printf("Big Numbers.\n");
}
void text_num(int x, int num)
void
text_num (int x, int num)
{
// printf("BigNum(%i, %i)\n", x, num);
}
void text_set_char(int n, char *dat)
void
text_set_char (int n, char *dat)
{
// printf("Set Character %i\n", n);
}
@@ -162,12 +173,12 @@ void text_set_char(int n, char *dat)
/////////////////////////////////////////////////////////////////
// Draws a vertical bar; erases entire column onscreen.
//
void text_vbar(int x, int len)
void
text_vbar (int x, int len)
{
int y;
for(y=lcd.hgt; y > 0 && len>0; y--)
{
text_chr(x, y, '|');
for (y = lcd.hgt; y > 0 && len > 0; y--) {
text_chr (x, y, '|');
len -= lcd.cellhgt;
}
@@ -177,11 +188,11 @@ void text_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void text_hbar(int x, int y, int len)
void
text_hbar (int x, int y, int len)
{
for(; x<=lcd.wid && len>0; x++)
{
text_chr(x,y,'-');
for (; x <= lcd.wid && len > 0; x++) {
text_chr (x, y, '-');
len -= lcd.cellwid;
}
@@ -189,48 +200,46 @@ void text_hbar(int x, int y, int len)
}
void text_flush_box(int lft, int top, int rgt, int bot)
void
text_flush_box (int lft, int top, int rgt, int bot)
{
text_flush();
text_flush ();
}
void text_draw_frame(char *dat)
void
text_draw_frame (char *dat)
{
int i, j;
char out[LCD_MAX_WIDTH];
if(!dat) return;
if (!dat)
return;
// printf("Frame (%ix%i): \n%s\n", lcd.wid, lcd.hgt, dat);
for(i=0; i<lcd.wid; i++)
{
for (i = 0; i < lcd.wid; i++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf("+%s+\n", out);
printf ("+%s+\n", out);
for(i=0; i<lcd.hgt; i++)
{
for(j=0; j<lcd.wid; j++)
{
out[j] = dat[j+(i*lcd.wid)];
for (i = 0; i < lcd.hgt; i++) {
for (j = 0; j < lcd.wid; j++) {
out[j] = dat[j + (i * lcd.wid)];
}
out[lcd.wid] = 0;
printf("|%s|\n", out);
printf ("|%s|\n", out);
}
for(i=0; i<lcd.wid; i++)
{
for (i = 0; i < lcd.wid; i++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf("+%s+\n", out);
printf ("+%s+\n", out);
}
+17 -17
View File
@@ -3,23 +3,23 @@
extern lcd_logical_driver *text;
int text_init(struct lcd_logical_driver *driver, char *args);
void text_close();
void text_clear();
void text_flush();
void text_string(int x, int y, char string[]);
void text_chr(int x, int y, char c);
int text_contrast(int contrast);
void text_backlight(int on);
void text_init_vbar();
void text_init_hbar();
void text_init_num();
void text_vbar(int x, int len);
void text_hbar(int x, int y, int len);
void text_num(int x, int num);
void text_set_char(int n, char *dat);
void text_flush_box(int lft, int top, int rgt, int bot);
void text_draw_frame(char *dat);
int text_init (struct lcd_logical_driver *driver, char *args);
void text_close ();
void text_clear ();
void text_flush ();
void text_string (int x, int y, char string[]);
void text_chr (int x, int y, char c);
int text_contrast (int contrast);
void text_backlight (int on);
void text_init_vbar ();
void text_init_hbar ();
void text_init_num ();
void text_vbar (int x, int len);
void text_hbar (int x, int y, int len);
void text_num (int x, int num);
void text_set_char (int n, char *dat);
void text_flush_box (int lft, int top, int rgt, int bot);
void text_draw_frame (char *dat);
#endif
+264 -260
View File
@@ -18,12 +18,13 @@
#include "../../shared/debug.h"
#include "../../shared/str.h"
static int custom=0;
static int custom = 0;
typedef enum {
hbar = 1,
vbar = 2,
bign = 4,
beat = 8 } custom_type;
beat = 8
} custom_type;
static int fd;
static char lastframe[32];
@@ -33,7 +34,8 @@ lcd_logical_driver *sli;
/////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly...
//
int sli_init(lcd_logical_driver *driver, char *args)
int
sli_init (lcd_logical_driver * driver, char *args)
{
char *argv[64];
int argc;
@@ -43,13 +45,13 @@ int sli_init(lcd_logical_driver *driver, char *args)
char out[2];
char device[256] = "/dev/lcd";
int speed=B19200;
int speed = B19200;
sli = driver;
//debug("sli_init: Args(all): %s\n", args);
argc = get_args(argv, args, 64);
argc = get_args (argv, args, 64);
/*
for(i=0; i<argc; i++)
@@ -58,93 +60,80 @@ int sli_init(lcd_logical_driver *driver, char *args)
}
*/
for(i=0; i<argc; i++)
{
for (i = 0; i < argc; i++) {
//printf("Arg(%i): %s\n", i, argv[i]);
if(0 == strcmp(argv[i], "-d") ||
0 == strcmp(argv[i], "--device"))
{
if(i + 1 > argc) {
fprintf(stderr, "sli_init: %s requires an argument\n",
argv[i]);
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--device")) {
if (i + 1 > argc) {
fprintf (stderr, "sli_init: %s requires an argument\n", argv[i]);
return -1;
}
strcpy(device, argv[++i]);
}
else if(0 == strcmp(argv[i], "-s") ||
0 == strcmp(argv[i], "--speed"))
{
if(i + 1 > argc) {
fprintf(stderr, "sli_init: %s requires an argument\n",
argv[i]);
strcpy (device, argv[++i]);
} else if (0 == strcmp (argv[i], "-s") || 0 == strcmp (argv[i], "--speed")) {
if (i + 1 > argc) {
fprintf (stderr, "sli_init: %s requires an argument\n", argv[i]);
return -1;
}
tmp = atoi(argv[++i]);
if(tmp==1200) speed=B1200;
else if(tmp==2400) speed=B2400;
else if(tmp==9600) speed=B9600;
else if(tmp==19200) speed=B19200;
else if(tmp==38400) speed=B38400;
else if(tmp==57600) speed=B57600;
else if(tmp==115200) speed=B115200;
tmp = atoi (argv[++i]);
if (tmp == 1200)
speed = B1200;
else if (tmp == 2400)
speed = B2400;
else if (tmp == 9600)
speed = B9600;
else if (tmp == 19200)
speed = B19200;
else if (tmp == 38400)
speed = B38400;
else if (tmp == 57600)
speed = B57600;
else if (tmp == 115200)
speed = B115200;
else {
fprintf(stderr, "sli_init: %s argument must be 1200, 2400, 9600, 19200, 38400, 57600, or 115200. Using default value (19200).\n",
argv[i]);
fprintf (stderr, "sli_init: %s argument must be 1200, 2400, 9600, 19200, 38400, 57600, or 115200. Using default value (19200).\n", argv[i]);
}
}
else if(0 == strcmp(argv[i], "-h") ||
0 == strcmp(argv[i], "--help"))
{
printf("LCDproc Wirz SLI LCD driver\n"
"\t-d\t--device\tSelect the output device to use [/dev/lcd]\n"
"\t-s\t--speed\t\tSet the communication speed [19200]\n"
"\t-h\t--help\t\tShow this help information\n");
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
printf ("LCDproc Wirz SLI LCD driver\n" "\t-d\t--device\tSelect the output device to use [/dev/lcd]\n" "\t-s\t--speed\t\tSet the communication speed [19200]\n" "\t-h\t--help\t\tShow this help information\n");
return -1;
}
else
{
printf("Invalid parameter: %s\n", argv[i]);
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
// Set up io port correctly, and open it...
fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
fprintf(stderr, "sli_init: failed (%s)\n", strerror(errno));
fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
fprintf (stderr, "sli_init: failed (%s)\n", strerror (errno));
return -1;
}
//else fprintf(stderr, "sli_init: opened device %s\n", device);
tcgetattr(fd, &portset);
tcgetattr (fd, &portset);
// This is necessary in Linux, but does not exist in irix.
#ifndef IRIX
cfmakeraw(&portset);
cfmakeraw (&portset);
#endif
cfsetospeed(&portset, speed);
tcsetattr(fd, TCSANOW, &portset);
cfsetospeed (&portset, speed);
tcsetattr (fd, TCSANOW, &portset);
/* Initialize SLI using autobaud detection, and then turn off cursor
and clear screen */
usleep(150000); /* 150ms delay to allow SLI to power on */
out[0]=13; /* CR for SLI autobaud */
write(fd, out, 1);
usleep(3000); /* 3ms delay.. wait for it to autobaud */
out[0]=0x0FE;
out[1]=0x00C; /* No cursor */
write(fd, out, 2);
out[0]=0x0FE;
out[1]=0x001; /* Clear LCD, not sure if this belongs here */
write(fd, out, 2);
usleep (150000); /* 150ms delay to allow SLI to power on */
out[0] = 13; /* CR for SLI autobaud */
write (fd, out, 1);
usleep (3000); /* 3ms delay.. wait for it to autobaud */
out[0] = 0x0FE;
out[1] = 0x00C; /* No cursor */
write (fd, out, 2);
out[0] = 0x0FE;
out[1] = 0x001; /* Clear LCD, not sure if this belongs here */
write (fd, out, 2);
if(!driver->framebuf)
{
fprintf(stderr, "sli_init: No frame buffer.\n");
driver->close();
if (!driver->framebuf) {
fprintf (stderr, "sli_init: No frame buffer.\n");
driver->close ();
return -1;
}
// Set LCD parameters (I use a 16x2 LCD) -- small but still useful
// Its also much cheaper than the higher quality Matrix Orbital modules
// Currently, $30 for interface kit and 16x2 non-backlit LCD...
@@ -154,46 +143,49 @@ int sli_init(lcd_logical_driver *driver, char *args)
// Set the functions the driver supports...
driver->clear = (void *)-1;
driver->string = (void *)-1;
driver->chr = (void *)-1;
driver->clear = (void *) -1;
driver->string = (void *) -1;
driver->chr = (void *) -1;
driver->vbar = sli_vbar;
driver->init_vbar = sli_init_vbar;
driver->hbar = sli_hbar;
driver->init_hbar = sli_init_hbar;
driver->num = (void *)-1;
driver->init_num = (void *)-1;
driver->num = (void *) -1;
driver->init_num = (void *) -1;
driver->init = sli_init;
driver->close = sli_close;
driver->flush = sli_flush;
driver->flush_box = sli_flush_box;
driver->contrast = (void *)-1;
driver->backlight = (void *)-1;
driver->contrast = (void *) -1;
driver->backlight = (void *) -1;
driver->set_char = sli_set_char;
driver->icon = sli_icon;
driver->draw_frame = sli_draw_frame;
driver->getkey = (void *)-1;
driver->getkey = (void *) -1;
return fd;
}
/* Clean-up */
void sli_close()
void
sli_close ()
{
close(fd);
close (fd);
if(sli->framebuf) free(sli->framebuf);
if (sli->framebuf)
free (sli->framebuf);
sli->framebuf = NULL;
}
void sli_flush()
void
sli_flush ()
{
sli_draw_frame(lcd.framebuf);
sli_draw_frame (lcd.framebuf);
}
@@ -201,29 +193,29 @@ void sli_flush()
this is bad imho, so I added it.. may remove later
speed is not a huge issue though, this isnt a
device driver or anything ;) */
void sli_flush_box(int lft, int top, int rgt, int bot)
void
sli_flush_box (int lft, int top, int rgt, int bot)
{
int y;
char out[2]; /* Why does the matrix driver allocate so much here? */
/* simple bounds checking */
if((top>lcd.hgt)|(bot>lcd.hgt))
if ((top > lcd.hgt) | (bot > lcd.hgt))
return;
if((lft>lcd.wid)|(rgt>lcd.wid))
if ((lft > lcd.wid) | (rgt > lcd.wid))
return;
// printf("Flush (%i,%i)-(%i,%i)\n", lft, top, rgt, bot);
/* I like having hex, everywhere and all the time */
for(y=top; y<=bot; y++)
{
if(y==1)
sprintf(out, "%c%c", 0x0FE, 0x080+lft);
if(y==2)
sprintf(out, "%c%c", 0x0FE, 0x0C0+lft);
write(fd, out, 0x002);
write(fd, lcd.framebuf+(y*lcd.wid)+lft, rgt-lft+1);
for (y = top; y <= bot; y++) {
if (y == 1)
sprintf (out, "%c%c", 0x0FE, 0x080 + lft);
if (y == 2)
sprintf (out, "%c%c", 0x0FE, 0x0C0 + lft);
write (fd, out, 0x002);
write (fd, lcd.framebuf + (y * lcd.wid) + lft, rgt - lft + 1);
}
@@ -233,12 +225,13 @@ void sli_flush_box(int lft, int top, int rgt, int bot)
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void sli_chr(int x, int y, char c)
void
sli_chr (int x, int y, char c)
{
y--;
x--;
lcd.framebuf[(y*lcd.wid) + x] = c;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
@@ -255,144 +248,146 @@ void sli_chr(int x, int y, char c)
characters, so that you can do both bar types at once.. maybe I
will release a new version of the SLI driver that attempts this */
void sli_init_vbar()
void
sli_init_vbar ()
{
char a[] = {
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,1,1,1,1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
};
char b[] = {
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,1,1,1,1,
1,1,1,1,1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
};
char c[] = {
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
};
char d[] = {
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
};
char e[] = {
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
};
char f[] = {
0,0,0,0,0,
0,0,0,0,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
};
char g[] = {
0,0,0,0,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
};
if(custom!=vbar) {
sli_set_char(1,a);
sli_set_char(2,b);
sli_set_char(3,c);
sli_set_char(4,d);
sli_set_char(5,e);
sli_set_char(6,f);
sli_set_char(7,g);
custom=vbar;
if (custom != vbar) {
sli_set_char (1, a);
sli_set_char (2, b);
sli_set_char (3, c);
sli_set_char (4, d);
sli_set_char (5, e);
sli_set_char (6, f);
sli_set_char (7, g);
custom = vbar;
}
}
/////////////////////////////////////////////////////////////////
// Inits horizontal bars...
//
void sli_init_hbar()
void
sli_init_hbar ()
{
char a[] = {
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
};
char b[] = {
1,1,0,0,0,
1,1,0,0,0,
1,1,0,0,0,
1,1,0,0,0,
1,1,0,0,0,
1,1,0,0,0,
1,1,0,0,0,
1,1,0,0,0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
};
char c[] = {
1,1,1,0,0,
1,1,1,0,0,
1,1,1,0,0,
1,1,1,0,0,
1,1,1,0,0,
1,1,1,0,0,
1,1,1,0,0,
1,1,1,0,0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
};
char d[] = {
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
};
if(custom!=hbar) {
sli_set_char(1,a);
sli_set_char(2,b);
sli_set_char(3,c);
sli_set_char(4,d);
custom=hbar;
if (custom != hbar) {
sli_set_char (1, a);
sli_set_char (2, b);
sli_set_char (3, c);
sli_set_char (4, d);
custom = hbar;
}
}
@@ -405,16 +400,18 @@ void sli_init_hbar()
since we only have 2 lines anyway this is rather pointless
for me to add */
void sli_vbar(int x, int len)
void
sli_vbar (int x, int len)
{
char map[9] = {32, 1, 2, 3, 4, 5, 6, 7, 255 };
char map[9] = { 32, 1, 2, 3, 4, 5, 6, 7, 255 };
int y;
for(y=lcd.hgt; y > 0 && len>0; y--)
{
if(len >= lcd.cellhgt) sli_chr(x, y, 255);
else sli_chr(x, y, map[len]);
for (y = lcd.hgt; y > 0 && len > 0; y--) {
if (len >= lcd.cellhgt)
sli_chr (x, y, 255);
else
sli_chr (x, y, map[len]);
len -= lcd.cellhgt;
}
@@ -424,14 +421,16 @@ void sli_vbar(int x, int len)
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void sli_hbar(int x, int y, int len)
void
sli_hbar (int x, int y, int len)
{
char map[6] = { 32, 1, 2, 3, 4, 255 };
for(; x<=lcd.wid && len>0; x++)
{
if(len >= lcd.cellwid) sli_chr(x,y,255);
else sli_chr(x, y, map[len]);
for (; x <= lcd.wid && len > 0; x++) {
if (len >= lcd.cellwid)
sli_chr (x, y, 255);
else
sli_chr (x, y, map[len]);
len -= lcd.cellwid;
@@ -447,80 +446,83 @@ void sli_hbar(int x, int y, int len)
//
// The input is just an array of characters...
//
void sli_set_char(int n, char *dat)
void
sli_set_char (int n, char *dat)
{
char out[2];
int row, col;
int letter;
/* SLI also has 8 user definable characters */
if(n < 0 || n > 7) return;
if(!dat) return;
if (n < 0 || n > 7)
return;
if (!dat)
return;
/* Move cursor to CGRAM */
out[0]=0x0FE;
out[1]=0x040+8*n;
write(fd, out, 2);
out[0] = 0x0FE;
out[1] = 0x040 + 8 * n;
write (fd, out, 2);
for(row=0; row<lcd.cellhgt; row++)
{
for (row = 0; row < lcd.cellhgt; row++) {
letter = 0;
for(col=0; col<lcd.cellwid; col++)
{
for (col = 0; col < lcd.cellwid; col++) {
letter <<= 1;
letter |= (dat[(row*lcd.cellwid) + col] > 0);
letter |= (dat[(row * lcd.cellwid) + col] > 0);
}
letter|=0x020; /* SLI can't accept CR, LF, etc in this character! */
write(fd, &letter, 1);
letter |= 0x020; /* SLI can't accept CR, LF, etc in this character! */
write (fd, &letter, 1);
}
/* Move cursor back to DDRAM */
out[0]=0x0FE;
out[1]=0x080;
write(fd, out, 2);
out[0] = 0x0FE;
out[1] = 0x080;
write (fd, out, 2);
}
void sli_icon(int which, char dest)
void
sli_icon (int which, char dest)
{
char icons[3][5*8] = {
char icons[3][5 * 8] = {
{
1,1,1,1,1, // Empty Heart
1,0,1,0,1,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,0,0,0,1,
1,1,0,1,1,
1,1,1,1,1,
1, 1, 1, 1, 1, // Empty Heart
1, 0, 1, 0, 1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 0, 0, 0, 1,
1, 1, 0, 1, 1,
1, 1, 1, 1, 1,
},
{
1,1,1,1,1, // Filled Heart
1,0,1,0,1,
0,1,0,1,0,
0,1,1,1,0,
0,1,1,1,0,
1,0,1,0,1,
1,1,0,1,1,
1,1,1,1,1,
1, 1, 1, 1, 1, // Filled Heart
1, 0, 1, 0, 1,
0, 1, 0, 1, 0,
0, 1, 1, 1, 0,
0, 1, 1, 1, 0,
1, 0, 1, 0, 1,
1, 1, 0, 1, 1,
1, 1, 1, 1, 1,
},
{
0,0,0,0,0, // Ellipsis
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,0,1,0,1,
0, 0, 0, 0, 0, // Ellipsis
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 0, 1, 0, 1,
},
};
if(custom==bign) custom=beat;
sli_set_char(dest, &icons[which][0]);
if (custom == bign)
custom = beat;
sli_set_char (dest, &icons[which][0]);
}
@@ -529,12 +531,14 @@ void sli_icon(int which, char dest)
//
// Input is a character array, sized lcd.wid*lcd.hgt
//
void sli_draw_frame(char *dat)
void
sli_draw_frame (char *dat)
{
char out[2]; /* Again, why does the Matrix driver allocate so much here? */
int y;
if(!dat) return;
if (!dat)
return;
/*
out[0]=0x0FE;
@@ -550,12 +554,12 @@ void sli_draw_frame(char *dat)
// return;
/* Do the actual refresh */
out[0]=0x0FE;
out[1]=0x080;
write(fd, out, 2);
write(fd, &dat[0], 16);
usleep(10);
write(fd, &dat[16],15);
out[0] = 0x0FE;
out[1] = 0x080;
write (fd, out, 2);
write (fd, &dat[0], 16);
usleep (10);
write (fd, &dat[16], 15);
// strncpy(lastframe,dat,32); // Update lastframe...
+17 -17
View File
@@ -10,23 +10,23 @@
extern lcd_logical_driver *sli;
int sli_init(lcd_logical_driver *driver, char *device);
void sli_close();
void sli_flush();
void sli_flush_box(int lft, int top, int rgt, int bot);
void sli_chr(int x, int y, char c) ;
int sli_contrast(int contrast);
void sli_backlight(int on);
void sli_init_vbar();
void sli_init_hbar();
void sli_vbar(int x, int len);
void sli_hbar(int x, int y, int len);
void sli_init_num();
void sli_num(int x, int num);
void sli_set_char(int n, char *dat);
void sli_icon(int which, char dest);
void sli_draw_frame(char *dat);
char sli_getkey();
int sli_init (lcd_logical_driver * driver, char *device);
void sli_close ();
void sli_flush ();
void sli_flush_box (int lft, int top, int rgt, int bot);
void sli_chr (int x, int y, char c);
int sli_contrast (int contrast);
void sli_backlight (int on);
void sli_init_vbar ();
void sli_init_hbar ();
void sli_vbar (int x, int len);
void sli_hbar (int x, int y, int len);
void sli_init_num ();
void sli_num (int x, int num);
void sli_set_char (int n, char *dat);
void sli_icon (int which, char dest);
void sli_draw_frame (char *dat);
char sli_getkey ();
+28 -34
View File
@@ -41,53 +41,48 @@
#include "input.h"
int server_input(int key);
int server_input (int key);
// FIXME! The server tends to crash when "E" is pressed.. (?!)
// (but only when the joystick driver is the last one on the list...)
// Checks for keypad input, and dispatches it
int handle_input()
int
handle_input ()
{
char str[256];
int key;
screen *s;
client *c;
key = lcd.getkey();
key = lcd.getkey ();
if (!key) return 0;
if (!key)
return 0;
debug("handle_input(%c)\n", (char)key);
debug ("handle_input(%c)\n", (char) key);
if(key)
{
s = screenlist_current();
if(s)
{
if (key) {
s = screenlist_current ();
if (s) {
c = s->parent;
if(c)
{
if (c) {
// TODO: Interpret and translate keys!
// If the client should have this keypress...
// Send keypress to client
if(key >= 'E' && key <= 'Z')
{
if (key >= 'E' && key <= 'Z') {
// TODO: Implement client "acceptable key" lists
sprintf(str, "key %c\n", key);
sock_send_string(c->sock, str);
sprintf (str, "key %c\n", key);
sock_send_string (c->sock, str);
}
// Otherwise, tell the server about it.
else
{
server_input(key);
else {
server_input (key);
}
}
else
{
} else {
// If no parent, it means we're on the server screen.
// so, the server gets all keypresses there.
server_input(key);
server_input (key);
}
}
}
@@ -97,33 +92,32 @@ int handle_input()
int server_input(int key)
int
server_input (int key)
{
debug("server_input(%c)\n", (char)key);
debug ("server_input(%c)\n", (char) key);
switch(key)
{
switch (key) {
case 'A':
if(screenlist_action == SCR_HOLD)
if (screenlist_action == SCR_HOLD)
screenlist_action = 0;
else
screenlist_action = SCR_HOLD;
break;
case 'B':
screenlist_action = SCR_BACK;
screenlist_prev();
screenlist_prev ();
break;
case 'C':
screenlist_action = SCR_SKIP;
screenlist_next();
screenlist_next ();
break;
case 'D':
debug("got the menu key!\n");
server_menu();
debug ("got the menu key!\n");
server_menu ();
break;
default:
debug("server_input: Invalid key \"%c\" (%i)\n",
(char)key, key);
debug ("server_input: Invalid key \"%c\" (%i)\n", (char) key, key);
break;
}
+1 -1
View File
@@ -3,7 +3,7 @@
// Accepts and uses keypad input while displaying screens...
int handle_input();
int handle_input ();
#endif
+121 -155
View File
@@ -54,8 +54,7 @@ static screen_size sizes[] =
// This is currently only a list of available arguments, but doesn't
// really *do* anything. It just helps to figure out which parameters
// go to the server, and which ones go to individual drivers...
static parameter args[] =
{
static parameter args[] = {
{"-h", "--help"},
{"-d", "--driver"},
{"-t", "--type"},
@@ -65,17 +64,18 @@ static parameter args[] =
};
void exit_program(int val);
void HelpScreen();
void exit_program (int val);
void HelpScreen ();
int main(int argc, char **argv)
int
main (int argc, char **argv)
{
// TODO: Use a config file!
//char cfgfile[256] = "/etc/LCDd.cf";
int i, err, tmp;
int daemon_mode=1;
int disable_server_screen=1;
int daemon_mode = 1;
int disable_server_screen = 1;
int child;
screen *s = NULL;
char *str, *ing; // strings for commandline handling
@@ -84,127 +84,103 @@ int main(int argc, char **argv)
// Ctrl-C will cause a clean exit...
signal(SIGINT, exit_program);
signal (SIGINT, exit_program);
// and "kill"...
signal(SIGTERM, exit_program);
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal(SIGHUP, exit_program);
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
signal(SIGKILL, exit_program);
signal (SIGKILL, exit_program);
// If no paramaters given, give the help screen.
if(argc == 1) HelpScreen();
if (argc == 1)
HelpScreen ();
// Don't spawn a child if we're using the curses driver
for(i=1; i<argc; i++)
{
if(0 == strcmp(argv[i], "-f") ||
0 == strcmp(argv[i], "--foreground") ||
0 == strcmp(argv[i], "curses"))
for (i = 1; i < argc; i++) {
if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--foreground") || 0 == strcmp (argv[i], "curses"))
daemon_mode = 0;
}
// Now, go into daemon mode...
#ifndef DEBUG
if(daemon_mode)
{
if ((child = fork()) != 0)
{
usleep(1500000); // Wait for child to initialize
exit(0); /* PARENT EXITS */
#ifndef DEBUG
if (daemon_mode) {
if ((child = fork ()) != 0) {
usleep (1500000); // Wait for child to initialize
exit (0); /* PARENT EXITS */
}
// This line removed because it eats error messages...
//setsid(); /* RELEASE TTY */
}
#endif
#endif
// Set up lcd driver base system
lcd_init("");
lcd_init ("");
// Parse the command line now...
// TODO: Move this to a separate function?
for(i=1; i<argc; i++)
{
if(0 == strcmp(argv[i], "-d") ||
0 == strcmp(argv[i], "--driver"))
{
if(argc <= i+1) HelpScreen();
for (i = 1; i < argc; i++) {
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--driver")) {
if (argc <= i + 1)
HelpScreen ();
str = argv[++i];
ing = NULL;
// Check to see if the next parameter is intended for LCDd,
// or if it should be passed to the driver...
if(argc > i+1)
{
int j, skip=0;
for(j=1; args[j].lg; j++) // check each option except "help"
if(! strcmp(argv[i+1], args[j].sh) ||
! strcmp(argv[i+1], args[j].lg)) skip=1;
if (argc > i + 1) {
int j, skip = 0;
for (j = 1; args[j].lg; j++) // check each option except "help"
if (!strcmp (argv[i + 1], args[j].sh) || !strcmp (argv[i + 1], args[j].lg))
skip = 1;
if(! skip)
{
if (!skip) {
ing = argv[++i];
}
//else i++;
}
err = lcd_add_driver(str, ing);
if(err <= 0)
{
printf("Error loading driver %s. Continuing anyway...\n",
str);
err = lcd_add_driver (str, ing);
if (err <= 0) {
printf ("Error loading driver %s. Continuing anyway...\n", str);
}
if((err > 0) && (0 == strcmp(str, "curses"))) daemon_mode=0;
}
else if(0 == strcmp(argv[i], "-h") ||
0 == strcmp(argv[i], "--help"))
{
HelpScreen();
if ((err > 0) && (0 == strcmp (str, "curses")))
daemon_mode = 0;
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
HelpScreen ();
}
// Redundant, but it prevents errors...
else if(0 == strcmp(argv[i], "-f") ||
0 == strcmp(argv[i], "--foreground"))
{
else if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--foreground")) {
daemon_mode = 0;
}
else if(0 == strcmp(argv[i], "-b") ||
0 == strcmp(argv[i], "--backlight"))
{
if(argc <= i+1) HelpScreen();
} else if (0 == strcmp (argv[i], "-b") || 0 == strcmp (argv[i], "--backlight")) {
if (argc <= i + 1)
HelpScreen ();
str = argv[++i];
if(0 == strcmp(str, "off"))
if (0 == strcmp (str, "off"))
backlight_state = backlight = BACKLIGHT_OFF;
else if(0 == strcmp(str, "on"))
else if (0 == strcmp (str, "on"))
backlight_state = backlight = BACKLIGHT_ON;
else if(0 == strcmp(str, "open"))
else if (0 == strcmp (str, "open"))
backlight = BACKLIGHT_OPEN;
else HelpScreen();
}
else if(0 == strcmp(argv[i], "-t") ||
0 == strcmp(argv[i], "--type"))
{
if(i + 1 > argc)
HelpScreen();
else
{
HelpScreen ();
} else if (0 == strcmp (argv[i], "-t") || 0 == strcmp (argv[i], "--type")) {
if (i + 1 > argc)
HelpScreen ();
else {
int wid, hgt;
i++;
sscanf(argv[i], "%ix%i", &wid, &hgt);
if(wid>80 || wid<16 || hgt>25 || hgt<2)
{
fprintf(stderr,
"LCDd: Invalid lcd size \"%s\". Using 20x4.\n",
argv[i]);
sscanf (argv[i], "%ix%i", &wid, &hgt);
if (wid > 80 || wid < 16 || hgt > 25 || hgt < 2) {
fprintf (stderr, "LCDd: Invalid lcd size \"%s\". Using 20x4.\n", argv[i]);
lcd.wid = 20;
lcd.hgt = 4;
}
else
{
} else {
lcd.wid = wid;
lcd.hgt = hgt;
}
@@ -228,24 +204,20 @@ int main(int argc, char **argv)
}
*/
}
}
else if(0 == strcmp(argv[i], "-i") ||
0 == strcmp(argv[i], "--serverinfo"))
{
if(i + 1 > argc)
HelpScreen();
else
{
} else if (0 == strcmp (argv[i], "-i") || 0 == strcmp (argv[i], "--serverinfo")) {
if (i + 1 > argc)
HelpScreen ();
else {
i++;
if(0 == strcmp(argv[i], "off")) disable_server_screen = 1;
if(0 == strcmp(argv[i], "on")) disable_server_screen = 0;
if (0 == strcmp (argv[i], "off"))
disable_server_screen = 1;
if (0 == strcmp (argv[i], "on"))
disable_server_screen = 0;
}
}
else
{
} else {
// otherwise... Get help!
printf("Invalid parameter: %s\n", argv[i]);
HelpScreen();
printf ("Invalid parameter: %s\n", argv[i]);
HelpScreen ();
}
}
@@ -253,45 +225,36 @@ int main(int argc, char **argv)
// Now init a bunch of required stuff...
if(sock_create_server() <= 0)
{
printf("Error opening socket.\n");
if (sock_create_server () <= 0) {
printf ("Error opening socket.\n");
return 1;
}
if(client_init() < 0)
{
printf("Error initializing client list\n");
if (client_init () < 0) {
printf ("Error initializing client list\n");
return 1;
}
if(screenlist_init() < 0)
{
printf("Error initializing screen list\n");
if (screenlist_init () < 0) {
printf ("Error initializing screen list\n");
return 1;
}
// Make sure the server screen shows up every once in a while..
if(server_screen_init() < 0)
{
printf("Error initializing server screens\n");
if (server_screen_init () < 0) {
printf ("Error initializing server screens\n");
return 1;
}
else if(disable_server_screen)
{
} else if (disable_server_screen) {
server_screen->priority = 256;
}
// Main loop...
while(1)
{
sock_poll_clients();
parse_all_client_messages();
handle_input();
while (1) {
sock_poll_clients ();
parse_all_client_messages ();
handle_input ();
// TODO: Move this code to screenlist.c...
// ... it should just say "handle_screens();"
@@ -299,73 +262,76 @@ int main(int argc, char **argv)
timer++;
// this line's here because s was getting overwritten at one time...
//s = screenlist_current();
if(s && (timer >= s->duration))
{
screenlist_next();
if (s && (timer >= s->duration)) {
screenlist_next ();
}
// Just in case it gets out of hand...
if(timer >= 0x10000) timer = 0;
update_server_screen(timer);
s = screenlist_current();
if (timer >= 0x10000)
timer = 0;
update_server_screen (timer);
s = screenlist_current ();
// render something here...
if(s) draw_screen(s, timer);
else no_screen_screen(timer);
if (s)
draw_screen (s, timer);
else
no_screen_screen (timer);
usleep(TIME_UNIT);
usleep (TIME_UNIT);
}
// Quit!
exit_program(0);
exit_program (0);
return 0;
}
void exit_program(int val)
void
exit_program (int val)
{
// TODO: These things shouldn't be so interdependent. The order
// things are shut down in shouldn't matter...
// Say goodbye!
goodbye_screen();
goodbye_screen ();
// Can go anywhere...
lcd_shutdown();
lcd_shutdown ();
// Must come before screenlist_shutdown
client_shutdown();
client_shutdown ();
// Must come after client_shutdown
screenlist_shutdown();
screenlist_shutdown ();
// Should come after client_shutdown
sock_close_all();
sock_close_all ();
exit(0);
exit (0);
}
void HelpScreen()
void
HelpScreen ()
{
printf("LCDproc server daemon, %s\n", version);
printf("Copyright (c) 1999 Scott Scriven, William Ferrell, and misc contributors\n");
printf("This program is freely redistributable under the terms of the GNU Public License\n\n");
printf("Usage: LCDd [options]\n");
printf("\tOptions in []'s are optional. Available options are:\n");
printf("\t-h\t--help\n\t\t\tDisplay this help screen\n");
printf("\t-t\t--type <size>\n\t\t\tSelect an LCD size (20x4, 16x2, etc...)\n");
printf("\t-d\t--driver <driver> [args]\n\t\t\tAdd a driver to use:\n");
printf("\t\t\tCFontz, curses, HD44780, irmanin, joy,\n\t\t\tMtxOrb, text\n");
printf("\t\t\t(args will be passed to the driver for init)\n");
printf("\t-f\t--foreground\n\t\t\tRun in the foreground (no daemon)\n");
printf("\t-b\t--backlight <mode>\n\t\t\tSet backlight mode (on, off, open)\n");
printf("\t-i\t--serverinfo off\n\t\t\tSet the server screen to low priority\n");
printf("\n");
printf("\tUse \"man LCDd\" for more info.\n");
printf("\tHelp on each driver's parameters are obtained upon request:\n\t\t\"LCDd -d driver --help\"\n");
printf("Example:\n");
printf("\tLCDd -d MtxOrb \"--device /dev/lcd --contrast 200\" -d joy\n");
printf("\n");
exit(0);
printf ("LCDproc server daemon, %s\n", version);
printf ("Copyright (c) 1999 Scott Scriven, William Ferrell, and misc contributors\n");
printf ("This program is freely redistributable under the terms of the GNU Public License\n\n");
printf ("Usage: LCDd [options]\n");
printf ("\tOptions in []'s are optional. Available options are:\n");
printf ("\t-h\t--help\n\t\t\tDisplay this help screen\n");
printf ("\t-t\t--type <size>\n\t\t\tSelect an LCD size (20x4, 16x2, etc...)\n");
printf ("\t-d\t--driver <driver> [args]\n\t\t\tAdd a driver to use:\n");
printf ("\t\t\tCFontz, curses, HD44780, irmanin, joy,\n\t\t\tMtxOrb, text\n");
printf ("\t\t\t(args will be passed to the driver for init)\n");
printf ("\t-f\t--foreground\n\t\t\tRun in the foreground (no daemon)\n");
printf ("\t-b\t--backlight <mode>\n\t\t\tSet backlight mode (on, off, open)\n");
printf ("\t-i\t--serverinfo off\n\t\t\tSet the server screen to low priority\n");
printf ("\n");
printf ("\tUse \"man LCDd\" for more info.\n");
printf ("\tHelp on each driver's parameters are obtained upon request:\n\t\t\"LCDd -d driver --help\"\n");
printf ("Example:\n");
printf ("\tLCDd -d MtxOrb \"--device /dev/lcd --contrast 200\" -d joy\n");
printf ("\n");
exit (0);
}
+5 -7
View File
@@ -14,22 +14,20 @@ extern char *version;
extern char *protocol_version;
extern char *build_date;
void exit_program(int val);
void exit_program (int val);
// 1/8th second is a single time unit...
#define TIME_UNIT 125000
// But I plan to double the framerate soon, or make it variable...
//#define TIME_UNIT (125000/2)
typedef struct screen_size
{
char * size;
typedef struct screen_size {
char *size;
int wid, hgt;
} screen_size;
typedef struct parameter
{
char * sh, * lg; // short and long versions
typedef struct parameter {
char *sh, *lg; // short and long versions
} parameter;
+136 -134
View File
@@ -29,26 +29,27 @@
// FIXME: Implement this where it is supposed to be...
#include <time.h>
void framedelay()
void
framedelay ()
{
sock_poll_clients();
parse_all_client_messages();
sock_poll_clients ();
parse_all_client_messages ();
usleep(TIME_UNIT);
usleep (TIME_UNIT);
}
static void draw_heartbeat()
static void
draw_heartbeat ()
{
static int timer = 0;
if(heartbeat)
{
if (heartbeat) {
// Set this to pulsate like a real heart beat...
// (binary is fun... :)
lcd.icon(!((timer+4)&5), 0);
lcd.chr(lcd.wid, 1, 0);
lcd.icon (!((timer + 4) & 5), 0);
lcd.chr (lcd.wid, 1, 0);
}
lcd.flush();
lcd.flush ();
timer++;
timer &= 0x0f;
@@ -58,103 +59,107 @@ static int PAD = 255;
typedef struct menu_info
{
typedef struct menu_info {
int selected;
int length;
} menu_info;
static int draw_menu(Menu menu, menu_info *info);
static int fill_menu_info(Menu menu, menu_info *info);
static int menu_handle_action(menu_item *item);
static int draw_menu (Menu menu, menu_info * info);
static int fill_menu_info (Menu menu, menu_info * info);
static int menu_handle_action (menu_item * item);
static int slid_func(menu_item *item);
static int slid_func (menu_item * item);
int do_menu(Menu menu)
int
do_menu (Menu menu)
{
menu_info info;
int key=0;
int status=MENU_OK;
int done=0;
int key = 0;
int status = MENU_OK;
int done = 0;
int (*func)();
int (*readfunc)(int);
int (*func) ();
int (*readfunc) (int);
if(!menu) return MENU_ERROR;
if (!menu)
return MENU_ERROR;
fill_menu_info(menu, &info);
fill_menu_info (menu, &info);
while(!done)
{
while (!done) {
// Keep the cursor off titles... (?)
while(menu[info.selected].type == TYPE_TITL)
{
while (menu[info.selected].type == TYPE_TITL) {
info.selected++;
// If the title is the last thing in the menu...
if(!menu[info.selected].text) info.selected -= 2;
if (!menu[info.selected].text)
info.selected -= 2;
}
draw_menu(menu, &info);
draw_menu (menu, &info);
// FIXME: This should use a better keypress interface, which
// FIXME: handles things according to keybindings...
for(key = lcd.getkey(); key==0; key = lcd.getkey())
{
for (key = lcd.getkey (); key == 0; key = lcd.getkey ()) {
// sleep for 1/8th second...
framedelay();
framedelay ();
// do the heartbeat...
draw_heartbeat();
draw_heartbeat ();
// Check for client input...
}
// Handle the key according to the keybindings...
switch(key)
{
case 'D': done=1; break;
case 'B': if(info.selected > 0) info.selected--;
while(menu[info.selected].type == TYPE_TITL)
{
if(info.selected > 0)
switch (key) {
case 'D':
done = 1;
break;
case 'B':
if (info.selected > 0)
info.selected--;
else break;
while (menu[info.selected].type == TYPE_TITL) {
if (info.selected > 0)
info.selected--;
else
break;
}
break;
case 'C': if(menu[info.selected+1].text) info.selected++; break;
case 'C':
if (menu[info.selected + 1].text)
info.selected++;
break;
case 'A':
switch(menu[info.selected].type)
{
case TYPE_MENU: status = do_menu(menu[info.selected].data);
switch (menu[info.selected].type) {
case TYPE_MENU:
status = do_menu (menu[info.selected].data);
break;
case TYPE_FUNC:
func = menu[info.selected].data;
if(func)
status = func();
if (func)
status = func ();
break;
case TYPE_CHEK:
readfunc = menu[info.selected].data;
if(readfunc)
status = readfunc(MENU_CHECK);
if (readfunc)
status = readfunc (MENU_CHECK);
status &= 0xffff0000;
break;
case TYPE_SLID:
func = menu[info.selected].data;
if(func)
status = slid_func(&menu[info.selected]);
if (func)
status = slid_func (&menu[info.selected]);
break;
default:
break;
}
switch(status)
{
switch (status) {
case MENU_OK:
break;
case MENU_CLOSE:
@@ -171,7 +176,8 @@ int do_menu(Menu menu)
// TODO: It should now do special stuff for "mover" widgets,
// TODO: and handle the return code appropriately.
break;
default: break;
default:
break;
}
}
@@ -180,67 +186,70 @@ int do_menu(Menu menu)
}
static int draw_menu(Menu menu, menu_info *info)
static int
draw_menu (Menu menu, menu_info * info)
{
int i;
int x=1, y=1;
int top=0, bottom=0;
int x = 1, y = 1;
int top = 0, bottom = 0;
int (*readfunc)(int);
int (*readfunc) (int);
// these should maybe be removed:
int wid=lcd.wid, hgt=lcd.hgt;
int wid = lcd.wid, hgt = lcd.hgt;
if(!menu) return MENU_ERROR;
if (!menu)
return MENU_ERROR;
lcd.clear();
lcd.clear ();
// Scroll down until the selected item is centered, if possible...
top = info->selected - (hgt/2);
if(top<0) top=0;
bottom = top+hgt;
if(bottom > info->length) bottom=info->length;
top = bottom-hgt;
if(top<0) top=0;
top = info->selected - (hgt / 2);
if (top < 0)
top = 0;
bottom = top + hgt;
if (bottom > info->length)
bottom = info->length;
top = bottom - hgt;
if (top < 0)
top = 0;
// Draw all visible items...
for(i=top; i<bottom; i++, y++)
{
if(i == info->selected) lcd.chr(2,y,'>');
for (i = top; i < bottom; i++, y++) {
if (i == info->selected)
lcd.chr (2, y, '>');
switch(menu[i].type)
{
switch (menu[i].type) {
case TYPE_TITL:
lcd.chr(1,y,PAD);
lcd.chr(2,y,PAD);
lcd.string(4,y,menu[i].text);
for(x=strlen(menu[i].text)+5; x <= wid; x++)
lcd.chr(x,y,PAD);
lcd.chr (1, y, PAD);
lcd.chr (2, y, PAD);
lcd.string (4, y, menu[i].text);
for (x = strlen (menu[i].text) + 5; x <= wid; x++)
lcd.chr (x, y, PAD);
break;
case TYPE_MENU:
lcd.string(3,y,menu[i].text);
lcd.chr(wid,y,'>');
lcd.string (3, y, menu[i].text);
lcd.chr (wid, y, '>');
break;
case TYPE_FUNC:
lcd.string(3,y,menu[i].text);
lcd.string (3, y, menu[i].text);
break;
case TYPE_CHEK:
if(menu[i].data)
{
if (menu[i].data) {
readfunc = menu[i].data;
if(readfunc(MENU_READ))
lcd.chr(wid,y,'Y');
if (readfunc (MENU_READ))
lcd.chr (wid, y, 'Y');
else
lcd.chr(wid,y,'N');
lcd.chr (wid, y, 'N');
}
lcd.string(3,y,menu[i].text);
lcd.string (3, y, menu[i].text);
break;
case TYPE_SLID:
lcd.string(3,y,menu[i].text);
lcd.string (3, y, menu[i].text);
break;
case TYPE_MOVE:
break;
@@ -249,27 +258,28 @@ static int draw_menu(Menu menu, menu_info *info)
}
}
if(top != 0)
lcd.chr(1,1,'^');
if(bottom < info->length)
lcd.chr(1,hgt,'v');
if (top != 0)
lcd.chr (1, 1, '^');
if (bottom < info->length)
lcd.chr (1, hgt, 'v');
draw_heartbeat();
draw_heartbeat ();
//lcd.flush();
return 0;
}
static int fill_menu_info(Menu menu, menu_info *info)
static int
fill_menu_info (Menu menu, menu_info * info)
{
int i;
info->selected = 0;
// count the entries in the menu
for(i=0; menu[i].text; i++);
for (i = 0; menu[i].text; i++);
info->length = i;
@@ -277,79 +287,71 @@ static int fill_menu_info(Menu menu, menu_info *info)
}
static int menu_handle_action(menu_item *item)
static int
menu_handle_action (menu_item * item)
{
return MENU_OK;
}
static int slid_func(menu_item *item)
static int
slid_func (menu_item * item)
{
char str[16];
int key = 0;
int value = 0;
int x, y=1;
int (*readfunc)(int);
int x, y = 1;
int (*readfunc) (int);
readfunc = item->data;
lcd.init_hbar();
lcd.init_hbar ();
while(key != 'A' && key != 'D')
{
while (key != 'A' && key != 'D') {
// Draw the title...
lcd.clear();
lcd.chr(1,y,PAD);
lcd.chr(2,y,PAD);
lcd.string(4,y,item->text);
for(x=strlen(item->text)+5; x <= lcd.wid; x++)
lcd.chr(x,y,PAD);
lcd.clear ();
lcd.chr (1, y, PAD);
lcd.chr (2, y, PAD);
lcd.string (4, y, item->text);
for (x = strlen (item->text) + 5; x <= lcd.wid; x++)
lcd.chr (x, y, PAD);
// Draw the slider now...
value = readfunc(MENU_READ);
if(value < 0 || value >= MENU_CLOSE)
value = readfunc (MENU_READ);
if (value < 0 || value >= MENU_CLOSE)
return value;
sprintf(str, "%i", value);
if(lcd.hgt >= 4)
{
lcd.string(8, 4, str);
sprintf (str, "%i", value);
if (lcd.hgt >= 4) {
lcd.string (8, 4, str);
value = (lcd.wid * lcd.cellwid * value / 256);
lcd.hbar(1, 3, value);
}
else
{
lcd.string(17, 2, str);
value = ((lcd.wid-4) * lcd.cellwid * value / 256);
lcd.hbar(1, 2, value);
lcd.hbar (1, 3, value);
} else {
lcd.string (17, 2, str);
value = ((lcd.wid - 4) * lcd.cellwid * value / 256);
lcd.hbar (1, 2, value);
}
//lcd.flush();
for(key = lcd.getkey(); key==0; key = lcd.getkey())
{
for (key = lcd.getkey (); key == 0; key = lcd.getkey ()) {
// do the heartbeat...
draw_heartbeat();
draw_heartbeat ();
// sleep for 1/8th second...
framedelay();
framedelay ();
// Check for client input...
}
switch(key)
{
switch (key) {
case 'B':
value = readfunc(MENU_MINUS);
value = readfunc (MENU_MINUS);
break;
case 'C':
value = readfunc(MENU_PLUS);
value = readfunc (MENU_PLUS);
break;
}
if(value >= MENU_CLOSE
|| value < 0
|| key == 'A'
|| key == 'D')
if (value >= MENU_CLOSE || value < 0 || key == 'A' || key == 'D')
return value;
}
return MENU_OK;
}
+2 -3
View File
@@ -126,8 +126,7 @@ and sliders should return 0-255.
#define MENU_READ 5
typedef struct menu_item
{
typedef struct menu_item {
char *text;
int type;
void *data;
@@ -137,7 +136,7 @@ typedef struct menu_item
#define Menu menu_item *
int do_menu(Menu menu);
int do_menu (Menu menu);
#endif
+161 -123
View File
@@ -25,38 +25,38 @@
#include "serverscreens.h"
int Shutdown_func();
int System_halt_func();
int Reboot_func();
int Close_func();
int OK_func();
int Time24_func(int input);
int Heartbeat_func(int input);
int Backlight_func(int input);
int Server_screen_func(int input);
int Contrast_func(int input);
int Backlight_Brightness_func(int input);
int Backlight_Off_Brightness_func(int input);
int Backlight_Off_func();
int Backlight_On_func();
int Backlight_Open_func();
int Shutdown_func ();
int System_halt_func ();
int Reboot_func ();
int Close_func ();
int OK_func ();
int Time24_func (int input);
int Heartbeat_func (int input);
int Backlight_func (int input);
int Server_screen_func (int input);
int Contrast_func (int input);
int Backlight_Brightness_func (int input);
int Backlight_Off_Brightness_func (int input);
int Backlight_Off_func ();
int Backlight_On_func ();
int Backlight_Open_func ();
menu_item main_menu[] = {
{ "LCDproc", 0, 0 },// Title
{ "Options", TYPE_MENU, (void *)options_menu},
{ "Screens", TYPE_MENU, (void *)screens_menu},
{ "Shutdown", TYPE_MENU, (void *)shutdown_menu },
{ 0, 0, 0 },
{"LCDproc", 0, 0}, // Title
{"Options", TYPE_MENU, (void *) options_menu},
{"Screens", TYPE_MENU, (void *) screens_menu},
{"Shutdown", TYPE_MENU, (void *) shutdown_menu},
{0, 0, 0},
};
menu_item options_menu[] = {
{ "OPTIONS", TYPE_TITL, 0}, // Title
{"OPTIONS", TYPE_TITL, 0}, // Title
// "24-hour Time", TYPE_CHEK, (void *)Time24_func,
{ "Contrast...", TYPE_SLID, (void *)Contrast_func},
{ "Backlight", TYPE_MENU, (void *)Backlight_menu},
{ "Heartbeat", TYPE_CHEK, (void *)Heartbeat_func},
{"Contrast...", TYPE_SLID, (void *) Contrast_func},
{"Backlight", TYPE_MENU, (void *) Backlight_menu},
{"Heartbeat", TYPE_CHEK, (void *) Heartbeat_func},
// { "Backlight...", TYPE_SLID, (void *)Backlight_func},
// "OK", TYPE_FUNC, (void *)OK_func,
// "Close Menu", TYPE_FUNC, (void *)Close_func,
@@ -64,32 +64,32 @@ menu_item options_menu[] = {
// "Another Title",TYPE_TITL, 0,
// "Main menu?", TYPE_MENU, (void *)main_menu,
// "Nothing!", TYPE_FUNC, 0,
{ 0, 0, 0},
{0, 0, 0},
};
menu_item screens_menu[] = {
{ "SCREENS", TYPE_TITL, 0}, // Title
{ "Server Scr",TYPE_CHEK, (void *)Server_screen_func},
{ 0, 0, 0},
{"SCREENS", TYPE_TITL, 0}, // Title
{"Server Scr", TYPE_CHEK, (void *) Server_screen_func},
{0, 0, 0},
};
menu_item shutdown_menu[] = {
{ "Shut Down...", TYPE_TITL, 0}, // Title
{ "Kill LCDproc", TYPE_FUNC, (void *)Shutdown_func},
{ "System halt", TYPE_FUNC, (void *)System_halt_func},
{ "Reboot", TYPE_FUNC, (void *)Reboot_func},
{ 0, 0, 0},
{"Shut Down...", TYPE_TITL, 0}, // Title
{"Kill LCDproc", TYPE_FUNC, (void *) Shutdown_func},
{"System halt", TYPE_FUNC, (void *) System_halt_func},
{"Reboot", TYPE_FUNC, (void *) Reboot_func},
{0, 0, 0},
};
menu_item Backlight_menu[] = {
{ "BACKLIGHT MENU", TYPE_TITL, 0}, // Title
{ "Brightness...", TYPE_SLID, (void *)Backlight_Brightness_func},
{ "\"Off\" Brightness", TYPE_SLID, (void *)Backlight_Off_Brightness_func},
{ "Backlight Mode:", TYPE_FUNC, 0}, // Label
{ " - Off", TYPE_FUNC, Backlight_Off_func},
{ " - On", TYPE_FUNC, Backlight_On_func},
{ " - Open", TYPE_FUNC, Backlight_Open_func},
{ 0, 0, 0},
{"BACKLIGHT MENU", TYPE_TITL, 0}, // Title
{"Brightness...", TYPE_SLID, (void *) Backlight_Brightness_func},
{"\"Off\" Brightness", TYPE_SLID, (void *) Backlight_Off_Brightness_func},
{"Backlight Mode:", TYPE_FUNC, 0}, // Label
{" - Off", TYPE_FUNC, Backlight_Off_func},
{" - On", TYPE_FUNC, Backlight_On_func},
{" - Open", TYPE_FUNC, Backlight_Open_func},
{0, 0, 0},
};
@@ -99,70 +99,84 @@ menu_item Backlight_menu[] = {
//
// Exits the program.
int Shutdown_func()
int
Shutdown_func ()
{
exit_program(0);
exit_program (0);
return MENU_KILL;
}
// Shuts down the system, if possible
int System_halt_func()
int
System_halt_func ()
{
int err;
uid_t id;
id = geteuid();
id = geteuid ();
err = system("init 0");
err = system ("init 0");
if(err < 0) return MENU_KILL;
if(err == 127) return MENU_KILL;
if (err < 0)
return MENU_KILL;
if (err == 127)
return MENU_KILL;
// If we're root, exit
if(id == 0) exit_program(0);
if (id == 0)
exit_program (0);
// Otherwise, assume shutdown will fail; and show more stats.
return MENU_KILL;
}
// Shuts down the system and restarts it
int Reboot_func()
int
Reboot_func ()
{
int err;
uid_t id;
id = geteuid();
id = geteuid ();
err = system("init 6");
err = system ("init 6");
if(err < 0) return MENU_KILL;
if(err == 127) return MENU_KILL;
if (err < 0)
return MENU_KILL;
if (err == 127)
return MENU_KILL;
// If we're root, exit
if(id == 0) exit_program(0);
if (id == 0)
exit_program (0);
// Otherwise, assume shutdown will fail; and show more stats.
return MENU_KILL;
}
int Close_func()
int
Close_func ()
{
return MENU_CLOSE;
}
int OK_func()
int
OK_func ()
{
return MENU_OK;
}
int Time24_func(int input)
int
Time24_func (int input)
{
static int status=0;
static int status = 0;
if(input == MENU_READ) return status;
if(input == MENU_CHECK) status ^= 1; // does something.
if (input == MENU_READ)
return status;
if (input == MENU_CHECK)
status ^= 1; // does something.
return (status | MENU_OK);
// The status is "or"-ed with the MENU value to let do_menu()
// know what to do after selecting the item. (two return
@@ -172,57 +186,57 @@ int Time24_func(int input)
// unless you want something else (like MENU_CLOSE)
}
int Heartbeat_func(int input)
int
Heartbeat_func (int input)
{
if(input == MENU_READ) return (heartbeat != HEART_OFF);
if(input == MENU_CHECK)
{
if(heartbeat) heartbeat = HEART_OFF;
else heartbeat = HEART_OPEN;
if (input == MENU_READ)
return (heartbeat != HEART_OFF);
if (input == MENU_CHECK) {
if (heartbeat)
heartbeat = HEART_OFF;
else
heartbeat = HEART_OPEN;
}
return ((heartbeat != HEART_OFF) | MENU_OK);
}
int Backlight_func(int input)
int
Backlight_func (int input)
{
int status = 128;
switch(backlight)
{
switch (backlight) {
case BACKLIGHT_OFF:
if(input == MENU_READ) status = 0;
if(input == MENU_PLUS)
{
if (input == MENU_READ)
status = 0;
if (input == MENU_PLUS) {
backlight = BACKLIGHT_OPEN;
status = 128;
}
if(input == MENU_MINUS)
{
if (input == MENU_MINUS) {
status = 0;
}
break;
case BACKLIGHT_ON:
if(input == MENU_READ) status = 255;
if(input == MENU_PLUS)
{
if (input == MENU_READ)
status = 255;
if (input == MENU_PLUS) {
status = 255;
}
if(input == MENU_MINUS)
{
if (input == MENU_MINUS) {
backlight = BACKLIGHT_OPEN;
status = 128;
}
break;
case BACKLIGHT_OPEN:
if(input == MENU_READ) status = 128;
if(input == MENU_PLUS)
{
if (input == MENU_READ)
status = 128;
if (input == MENU_PLUS) {
backlight = BACKLIGHT_ON;
backlight_state = BACKLIGHT_ON;
status = 255;
}
if(input == MENU_MINUS)
{
if (input == MENU_MINUS) {
backlight = BACKLIGHT_OFF;
backlight_state = BACKLIGHT_OFF;
status = 0;
@@ -238,102 +252,126 @@ int Backlight_func(int input)
else backlight = BACKLIGHT_OPEN;
}
*/
lcd.backlight(backlight_state & BACKLIGHT_ON);
lcd.backlight (backlight_state & BACKLIGHT_ON);
return (status | MENU_OK);
}
int Server_screen_func(int input)
int
Server_screen_func (int input)
{
if(input == MENU_READ) return (server_screen->priority < 256);
if(input == MENU_CHECK)
{
if(server_screen->priority < 256) server_screen->priority = 256;
else server_screen->priority = 128;
if (input == MENU_READ)
return (server_screen->priority < 256);
if (input == MENU_CHECK) {
if (server_screen->priority < 256)
server_screen->priority = 256;
else
server_screen->priority = 128;
}
return (MENU_OK | (server_screen->priority < 256));
}
int Contrast_func(int input)
int
Contrast_func (int input)
{
int status;
status=lcd.contrast(-1);
status = lcd.contrast (-1);
if(input == MENU_READ) return status;
if(input == MENU_PLUS) status+=5; // does something.
if(input == MENU_MINUS) status-=5; // does something.
if (input == MENU_READ)
return status;
if (input == MENU_PLUS)
status += 5; // does something.
if (input == MENU_MINUS)
status -= 5; // does something.
if(status<0) status=0;
if(status>255) status=255;
lcd.contrast(status);
if (status < 0)
status = 0;
if (status > 255)
status = 255;
lcd.contrast (status);
return (status | MENU_OK);
}
void server_menu()
void
server_menu ()
{
debug("server_menu()\n");
debug ("server_menu()\n");
do_menu(main_menu);
do_menu (main_menu);
}
int Backlight_Brightness_func(int input)
int
Backlight_Brightness_func (int input)
{
int status = backlight_brightness;
if(input == MENU_READ) return status;
if(input == MENU_PLUS) status+=5; // does something.
if(input == MENU_MINUS) status-=5; // does something.
if (input == MENU_READ)
return status;
if (input == MENU_PLUS)
status += 5; // does something.
if (input == MENU_MINUS)
status -= 5; // does something.
if(status<0) status=0;
if(status>255) status=255;
lcd.backlight(status);
if (status < 0)
status = 0;
if (status > 255)
status = 255;
lcd.backlight (status);
backlight_brightness = status;
return (status | MENU_OK);
}
int Backlight_Off_Brightness_func(int input)
int
Backlight_Off_Brightness_func (int input)
{
int status = backlight_off_brightness;
if(input == MENU_READ) return status;
if(input == MENU_PLUS) status+=5; // does something.
if(input == MENU_MINUS) status-=5; // does something.
if (input == MENU_READ)
return status;
if (input == MENU_PLUS)
status += 5; // does something.
if (input == MENU_MINUS)
status -= 5; // does something.
if(status<0) status=0;
if(status>255) status=255;
lcd.backlight(status);
if (status < 0)
status = 0;
if (status > 255)
status = 255;
lcd.backlight (status);
backlight_off_brightness = status;
return (status | MENU_OK);
}
int Backlight_Off_func()
int
Backlight_Off_func ()
{
backlight_state = BACKLIGHT_OFF;
backlight = BACKLIGHT_OFF;
lcd.backlight(backlight_off_brightness);
lcd.backlight (backlight_off_brightness);
return MENU_OK;
}
int Backlight_On_func()
int
Backlight_On_func ()
{
backlight_state = BACKLIGHT_ON;
backlight = BACKLIGHT_ON;
lcd.backlight(backlight_brightness * (backlight_state & BACKLIGHT_ON));
lcd.backlight (backlight_brightness * (backlight_state & BACKLIGHT_ON));
return MENU_OK;
}
int Backlight_Open_func()
int
Backlight_Open_func ()
{
backlight = BACKLIGHT_OPEN;
return MENU_OK;
}
+1 -1
View File
@@ -11,6 +11,6 @@ extern menu_item shutdown_menu[];
extern menu_item Backlight_menu[];
// Brings up the main menu...
void server_menu();
void server_menu ();
#endif
+37 -52
View File
@@ -23,7 +23,8 @@
int parse_all_client_messages()
int
parse_all_client_messages ()
{
int i, j;
int newtoken, inquote;
@@ -36,75 +37,61 @@ int parse_all_client_messages()
char leftquote[] = "\0\"'`([{\0";
char rightquote[] = "\0\"'`)]}\0";
char errmsg[256];
int invalid=0;
int invalid = 0;
//debug("parse: Rewinding list...\n");
LL_Rewind(clients);
LL_Rewind (clients);
do {
// Get the next client...
//debug("parse: Getting client...\n");
c = LL_Get(clients);
if(c)
{
c = LL_Get (clients);
if (c) {
// And parse all its messages...
//debug("parse: Getting messages...\n");
for(str = client_get_message(c); str; str = client_get_message(c))
{
debug("parse: ...%s\n", str);
for (str = client_get_message (c); str; str = client_get_message (c)) {
debug ("parse: ...%s\n", str);
// Now, split up the string...
//len = strlen(str);
argc=0;
newtoken=1;
inquote=0;
for(i=0; str[i]; i++)
argc = 0;
newtoken = 1;
inquote = 0;
for (i = 0; str[i]; i++) {
if (inquote) // Scan for the end of the quote
{
if(inquote) // Scan for the end of the quote
{
if(str[i] == rightquote[inquote])
{ // Found the end of the quote
inquote=0;
if (str[i] == rightquote[inquote]) { // Found the end of the quote
inquote = 0;
str[i] = 0;
newtoken=1;
newtoken = 1;
}
}
else // Normal operation; split at delimiters
{
for(j=1; leftquote[j]; j++)
} else // Normal operation; split at delimiters
{
for (j = 1; leftquote[j]; j++) {
// Found the beginning of a new quote...
if(str[i] == leftquote[j])
{
if (str[i] == leftquote[j]) {
inquote = j;
str[i] = 0;
continue;
}
}
for(j=0; delimiters[j]; j++)
{
for (j = 0; delimiters[j]; j++) {
// Break into a new string...
if(str[i] == delimiters[j])
{
if (str[i] == delimiters[j]) {
str[i] = 0;
newtoken = 1;
continue;
}
}
}
if(newtoken && str[i])
{
newtoken=0;
if (newtoken && str[i]) {
newtoken = 0;
argv[argc] = str + i;
argc++;
}
else
{
} else {
}
}
if(inquote)
{
sprintf(errmsg, "huh? Unterminated string: missing %c\n",
rightquote[inquote]);
sock_send_string(c->sock, errmsg);
if (inquote) {
sprintf (errmsg, "huh? Unterminated string: missing %c\n", rightquote[inquote]);
sock_send_string (c->sock, errmsg);
continue;
}
/*
@@ -117,32 +104,30 @@ int parse_all_client_messages()
}
*/
argv[argc] = NULL;
if(argc < 1) continue;
if (argc < 1)
continue;
// Now find and call the appropriate function...
// debug("parse: Finding function...\n");
invalid = 1;
for(i=0; commands[i].keyword; i++)
{
for (i = 0; commands[i].keyword; i++) {
// debug("(checking %s)\n", commands[i].keyword);
if(0 == strcmp(argv[0], commands[i].keyword))
{
if (0 == strcmp (argv[0], commands[i].keyword)) {
// debug("(FOUND %s)\n", commands[i].keyword);
invalid = commands[i].function(c, argc, argv);
invalid = commands[i].function (c, argc, argv);
// debug("parse: Returned %i...\n", err);
}
}
if(invalid)
{
if (invalid) {
// FIXME: Check for buffer overflows here...
sprintf(errmsg, "huh? Invalid command \"%s\"\n", argv[0]);
sock_send_string(c->sock, errmsg);
sprintf (errmsg, "huh? Invalid command \"%s\"\n", argv[0]);
sock_send_string (c->sock, errmsg);
}
free(str); // fixed memory leak?
free (str); // fixed memory leak?
} // end for(str...)
} // end if (c)
} while (LL_Next(clients) == 0);
} while (LL_Next (clients) == 0);
return 0;
}
+1 -1
View File
@@ -2,6 +2,6 @@
#define PARSE_H
// This should be pretty self-explanatory...
int parse_all_client_messages();
int parse_all_client_messages ();
#endif
+170 -249
View File
@@ -30,27 +30,25 @@
int heartbeat=HEART_OPEN;
int backlight=BACKLIGHT_OPEN;
int heartbeat = HEART_OPEN;
int backlight = BACKLIGHT_OPEN;
int backlight_state = BACKLIGHT_OPEN;
int backlight_brightness=255;
int backlight_off_brightness=0;
int backlight_brightness = 255;
int backlight_off_brightness = 0;
int output_state = 0;
static int reset;
#define BUFSIZE 1024
static int draw_frame(LL *list, char fscroll,
int left, int top, int right, int bottom,
int fwid, int fhgt,
int fspeed, int timer);
static int draw_frame (LL * list, char fscroll, int left, int top, int right, int bottom, int fwid, int fhgt, int fspeed, int timer);
int draw_screen(screen *s, int timer)
int
draw_screen (screen * s, int timer)
{
static screen *old_s=NULL;
int tmp=0;
static screen *old_s = NULL;
int tmp = 0;
//debug("Render...\n");
//return 0;
@@ -59,76 +57,68 @@ int draw_screen(screen *s, int timer)
//debug("draw_screen: %8x, %i\n", (int)s, timer);
if(!s) return -1;
if (!s)
return -1;
if(s == old_s) reset = 0;
if (s == old_s)
reset = 0;
old_s = s;
lcd.clear();
lcd.clear ();
switch(backlight_state)
{
switch (backlight_state) {
case BACKLIGHT_OFF:
lcd.backlight(backlight_off_brightness);
lcd.backlight (backlight_off_brightness);
break;
case BACKLIGHT_ON:
lcd.backlight(backlight_brightness);
lcd.backlight (backlight_brightness);
break;
default:
if(backlight_state & BACKLIGHT_FLASH)
{
tmp = (!((timer&7) == 7));
if(backlight_state & 1)
lcd.backlight(tmp?backlight_brightness:backlight_off_brightness);
if (backlight_state & BACKLIGHT_FLASH) {
tmp = (!((timer & 7) == 7));
if (backlight_state & 1)
lcd.backlight (tmp ? backlight_brightness : backlight_off_brightness);
//lcd.backlight(backlight_brightness * (!((timer&7) == 7)));
else
lcd.backlight(!tmp?backlight_brightness:backlight_off_brightness);
lcd.backlight (!tmp ? backlight_brightness : backlight_off_brightness);
//lcd.backlight(backlight_brightness * ((timer&7) == 7));
}
else if(backlight_state & BACKLIGHT_BLINK)
{
tmp = (!((timer&14) == 14));
if(backlight_state & 1)
lcd.backlight(tmp?backlight_brightness:backlight_off_brightness);
} else if (backlight_state & BACKLIGHT_BLINK) {
tmp = (!((timer & 14) == 14));
if (backlight_state & 1)
lcd.backlight (tmp ? backlight_brightness : backlight_off_brightness);
//lcd.backlight(backlight_brightness * (!((timer&14) == 14)));
else
lcd.backlight(!tmp?backlight_brightness:backlight_off_brightness);
lcd.backlight (!tmp ? backlight_brightness : backlight_off_brightness);
//lcd.backlight(backlight_brightness * ((timer&14) == 14));
}
break;
}
lcd.output(output_state);
lcd.output (output_state);
draw_frame(s->widgets, 'v',
0, 0, lcd.wid, lcd.hgt,
s->wid, s->hgt,
s->duration/s->hgt, timer);
draw_frame (s->widgets, 'v', 0, 0, lcd.wid, lcd.hgt, s->wid, s->hgt, s->duration / s->hgt, timer);
//debug("draw_screen done\n");
if(heartbeat)
{
if((s->heartbeat==1) || heartbeat == HEART_ON)
{
if (heartbeat) {
if ((s->heartbeat == 1) || heartbeat == HEART_ON) {
// Set this to pulsate like a real heart beat...
// (binary is fun... :)
lcd.icon(!((timer+4)&5), 0);
lcd.chr(lcd.wid, 1, 0);
lcd.icon (!((timer + 4) & 5), 0);
lcd.chr (lcd.wid, 1, 0);
}
if((s->heartbeat==2) && heartbeat != HEART_OFF)
{
if ((s->heartbeat == 2) && heartbeat != HEART_OFF) {
char *phases = "-\\|/";
lcd.chr(lcd.wid, 1, phases[timer&3]);
lcd.chr (lcd.wid, 1, phases[timer & 3]);
}
}
lcd.flush();
lcd.flush ();
//debug("draw_screen: %8x, %i\n", s, timer);
@@ -136,10 +126,8 @@ int draw_screen(screen *s, int timer)
}
static int draw_frame(LL *list, char fscroll,
int left, int top, int right, int bottom,
int fwid, int fhgt,
int fspeed, int timer)
static int
draw_frame (LL * list, char fscroll, int left, int top, int right, int bottom, int fwid, int fhgt, int fspeed, int timer)
{
char str[BUFSIZE]; // scratch buffer
widget *w;
@@ -157,86 +145,69 @@ static int draw_frame(LL *list, char fscroll,
fx = 0;
fy = 0;
if(fscroll == 'v')
{
if (fscroll == 'v') {
if(fspeed > 0)
fy = (timer-fspeed) / fspeed;
if(fspeed < 0)
if (fspeed > 0)
fy = (timer - fspeed) / fspeed;
if (fspeed < 0)
fy = (-fspeed) * timer;
if(fy < 0) fy = 0;
if (fy < 0)
fy = 0;
// Make sure the whole frame gets displayed, at least...
if(!screenlist_action) screenlist_action = RENDER_HOLD;
if((fy) > fhgt - 1)
{
if (!screenlist_action)
screenlist_action = RENDER_HOLD;
if ((fy) > fhgt - 1) {
// Release hold after it has been displayed
if(!screenlist_action || screenlist_action == RENDER_HOLD)
if (!screenlist_action || screenlist_action == RENDER_HOLD)
screenlist_action = 0;
}
fy %= fhgt;
if(fy > fhgt - hgt) fy = fhgt - hgt;
}
else if (fscroll == 'h')
{ // TODO: Frames don't scroll horizontally yet!
if (fy > fhgt - hgt)
fy = fhgt - hgt;
} else if (fscroll == 'h') { // TODO: Frames don't scroll horizontally yet!
}
//debug("draw_screen: %8x, %i\n", s, timer);
if(!list) return -1;
if (!list)
return -1;
//debug("draw_frame: %8x, %i\n", frame, timer);
LL_Rewind(list);
LL_Rewind (list);
do {
w = (widget *)LL_Get(list);
if(!w) return -1;
w = (widget *) LL_Get (list);
if (!w)
return -1;
// TODO: Make this cleaner and more flexible!
switch(w->type)
{
switch (w->type) {
case WID_STRING:
if((w->x > 0) && (w->y > 0) && (w->text))
{
if((w->y <= hgt + fy) &&
(w->y > fy))
{
strncpy(str, w->text, wid - w->x + 1);
if ((w->x > 0) && (w->y > 0) && (w->text)) {
if ((w->y <= hgt + fy) && (w->y > fy)) {
strncpy (str, w->text, wid - w->x + 1);
str[wid - w->x + 1] = 0;
lcd.string(w->x + left,
w->y + top - fy,
str);
lcd.string (w->x + left, w->y + top - fy, str);
}
}
break;
case WID_HBAR:
if(reset)
{
lcd.init_hbar();
if (reset) {
lcd.init_hbar ();
reset = 0;
}
if((w->x > 0) && (w->y > 0))
{
if((w->y <= hgt + fy) &&
(w->y > fy))
{
if(w->length > 0)
{
if((w->length / lcd.cellwid) < wid - w->x + 1)
lcd.hbar(w->x + left,
w->y + top - fy,
w->length);
if ((w->x > 0) && (w->y > 0)) {
if ((w->y <= hgt + fy) && (w->y > fy)) {
if (w->length > 0) {
if ((w->length / lcd.cellwid) < wid - w->x + 1)
lcd.hbar (w->x + left, w->y + top - fy, w->length);
else
lcd.hbar(w->x + left,
w->y + top - fy,
wid * lcd.cellwid);
}
else if(w->length < 0)
{
lcd.hbar (w->x + left, w->y + top - fy, wid * lcd.cellwid);
} else if (w->length < 0) {
// TODO: Rearrange stuff to get left-extending
// hbars to draw correctly...
// .. er, this'll require driver modifications,
@@ -246,19 +217,14 @@ static int draw_frame(LL *list, char fscroll,
}
break;
case WID_VBAR: // FIXME: Vbars don't work in frames!
if(reset)
{
lcd.init_vbar();
if (reset) {
lcd.init_vbar ();
reset = 0;
}
if((w->x > 0) && (w->y > 0))
{
if(w->length > 0)
{
lcd.vbar(w->x, w->length);
}
else if(w->length < 0)
{
if ((w->x > 0) && (w->y > 0)) {
if (w->length > 0) {
lcd.vbar (w->x, w->length);
} else if (w->length < 0) {
// TODO: Rearrange stuff to get down-extending
// vbars to draw correctly...
// .. er, this'll require driver modifications,
@@ -269,122 +235,110 @@ static int draw_frame(LL *list, char fscroll,
case WID_ICON: // FIXME: Not implemented
break;
case WID_TITLE: // FIXME: Doesn't work quite right in frames...
if(!w->text) break;
if(wid < 8) break;
if (!w->text)
break;
if (wid < 8)
break;
memset(str, 255, wid);
memset (str, 255, wid);
str[2] = ' ';
length = strlen(w->text);
if(length <= wid-6)
{
memcpy(str+3, w->text, length);
str[length+3] = ' ';
}
else // Scroll the title, if it doesn't fit...
length = strlen (w->text);
if (length <= wid - 6) {
memcpy (str + 3, w->text, length);
str[length + 3] = ' ';
} else // Scroll the title, if it doesn't fit...
{
speed = 1;
x = timer / speed;
y = x / length;
// Make sure the whole title gets displayed, at least...
if(!screenlist_action) screenlist_action = RENDER_HOLD;
if(x > length - 6)
{
if (!screenlist_action)
screenlist_action = RENDER_HOLD;
if (x > length - 6) {
// Release hold after it has been displayed
if(!screenlist_action || screenlist_action == RENDER_HOLD)
if (!screenlist_action || screenlist_action == RENDER_HOLD)
screenlist_action = 0;
}
x %= (length);
x -= 3;
if(x < 0) x = 0;
if(x > length - (wid-6)) x = length - (wid-6);
if (x < 0)
x = 0;
if (x > length - (wid - 6))
x = length - (wid - 6);
if(y&1) // Scrolling backwards...
if (y & 1) // Scrolling backwards...
{
x = (length-(wid-6)) - x;
x = (length - (wid - 6)) - x;
}
strncpy(str+3, w->text+x, (wid-6));
str[wid-3] = ' ';
strncpy (str + 3, w->text + x, (wid - 6));
str[wid - 3] = ' ';
}
str[wid] = 0;
lcd.string(1 + left, 1 + top, str);
lcd.string (1 + left, 1 + top, str);
break;
case WID_SCROLLER: // FIXME: doesn't work in frames...
{
int offset;
int screen_width;
if (!w->text) break;
if (w->right < w->left) break;
if (!w->text)
break;
if (w->right < w->left)
break;
//printf("rendering: %s %d\n",w->text,timer);
screen_width = w->right - w->left + 1;
switch (w->length)
{ // actually, direction...
switch (w->length) { // actually, direction...
// FIXED: Horz scrollers don't show the
// last letter in the string... (1-off error?)
case 'h':
length = strlen(w->text) + 1;
if (length <= screen_width)
{
length = strlen (w->text) + 1;
if (length <= screen_width) {
/* it fits within the box, just render it */
lcd.string(w->left,w->top,w->text);
}
else
{
lcd.string (w->left, w->top, w->text);
} else {
int effLength = length - screen_width;
int necessaryTimeUnits = 0;
if (!screenlist_action) screenlist_action = RENDER_HOLD;
if (!screenlist_action)
screenlist_action = RENDER_HOLD;
if (w->speed > 0) {
necessaryTimeUnits = effLength * w->speed;
if (((timer / (effLength*w->speed)) % 2) == 0) {
if (((timer / (effLength * w->speed)) % 2) == 0) {
//wiggle one way
offset = (timer % (effLength*w->speed))
offset = (timer % (effLength * w->speed))
/ w->speed;
}
else
{
} else {
//wiggle the other
offset = (((timer % (effLength*w->speed))
- (effLength*w->speed) + 1)
offset = (((timer % (effLength * w->speed))
- (effLength * w->speed) + 1)
/ w->speed) * -1;
}
}
else if (w->speed < 0)
{
} else if (w->speed < 0) {
necessaryTimeUnits = effLength / (w->speed * -1);
if (((timer / (effLength/(w->speed*-1))) % 2) == 0)
{
offset = (timer % (effLength/(w->speed*-1)))
if (((timer / (effLength / (w->speed * -1))) % 2) == 0) {
offset = (timer % (effLength / (w->speed * -1)))
* w->speed * -1;
}
else
{
offset = (((timer % (effLength/(w->speed*-1)))
} else {
offset = (((timer % (effLength / (w->speed * -1)))
* w->speed * -1) - effLength + 1) * -1;
}
}
else
{
} else {
offset = 0;
if(screenlist_action == RENDER_HOLD)
if (screenlist_action == RENDER_HOLD)
screenlist_action = 0;
}
if (timer > necessaryTimeUnits)
{
if(screenlist_action == RENDER_HOLD)
if (timer > necessaryTimeUnits) {
if (screenlist_action == RENDER_HOLD)
screenlist_action = 0;
}
if (offset <= length)
{
strncpy(str,&((w->text)[offset]),screen_width);
if (offset <= length) {
strncpy (str, &((w->text)[offset]), screen_width);
str[screen_width] = '\0';
//printf("%s : %d\n",str,length-offset);
}
else
{
} else {
str[0] = '\0';
}
lcd.string(w->left,w->top,str);
lcd.string (w->left, w->top, str);
}
break;
// FIXME: Vert scrollers don't always seem to scroll
@@ -392,89 +346,64 @@ static int draw_frame(LL *list, char fscroll,
// the top instead... (nevermind?)
case 'v':
{
int i=0;
length = strlen(w->text);
if (length <= screen_width)
{
/* no scrolling required...*/
lcd.string(w->left,w->top,w->text);
}
else
{
int lines_required =
(length / screen_width)
int i = 0;
length = strlen (w->text);
if (length <= screen_width) {
/* no scrolling required... */
lcd.string (w->left, w->top, w->text);
} else {
int lines_required = (length / screen_width)
+ (length % screen_width ? 1 : 0);
int available_lines = (w->bottom - w->top + 1);
if (lines_required <= available_lines)
{
if (lines_required <= available_lines) {
// easy...
for(i=0;i<lines_required;i++)
{
strncpy(str,
&((w->text)[i*screen_width]),
screen_width);
for (i = 0; i < lines_required; i++) {
strncpy (str, &((w->text)[i * screen_width]), screen_width);
str[screen_width] = '\0';
lcd.string(w->left,w->top + i,str);
lcd.string (w->left, w->top + i, str);
}
}
else
{
} else {
int necessaryTimeUnits = 0;
int effLines = lines_required - available_lines + 1;
int begin = 0;
if (!screenlist_action)
screenlist_action = RENDER_HOLD;
//printf("length: %d sw: %d lines req: %d avail lines: %d effLines: %d \n",length,screen_width,lines_required,available_lines,effLines);
if (w->speed > 0)
{
if (w->speed > 0) {
necessaryTimeUnits = effLines * w->speed;
if (((timer / (effLines*w->speed)) % 2) == 0)
{
if (((timer / (effLines * w->speed)) % 2) == 0) {
//printf("up ");
begin = (timer % (effLines*w->speed))
begin = (timer % (effLines * w->speed))
/ w->speed;
}
else
{
} else {
//printf("down ");
begin = (((timer % (effLines*w->speed))
- (effLines*w->speed) + 1)/w->speed)
begin = (((timer % (effLines * w->speed))
- (effLines * w->speed) + 1) / w->speed)
* -1;
}
}
else if (w->speed < 0)
{
} else if (w->speed < 0) {
necessaryTimeUnits = effLines / (w->speed * -1);
if (((timer / (effLines/(w->speed*-1))) % 2) == 0)
{
begin = (timer % (effLines/(w->speed*-1)))
if (((timer / (effLines / (w->speed * -1))) % 2) == 0) {
begin = (timer % (effLines / (w->speed * -1)))
* w->speed * -1;
}
else
{
begin = (((timer % (effLines/(w->speed*-1)))
} else {
begin = (((timer % (effLines / (w->speed * -1)))
* w->speed * -1) - effLines + 1)
* -1;
}
}
else
{
} else {
begin = 0;
}
//printf("rendering begin: %d timer: %d effLines: %d\n",begin,timer,effLines);
for(i=begin;i<begin+available_lines;i++)
{
strncpy(str,
&((w->text)[i*(screen_width)]),
screen_width);
for (i = begin; i < begin + available_lines; i++) {
strncpy (str, &((w->text)[i * (screen_width)]), screen_width);
str[screen_width] = '\0';
//printf("rendering: '%s' of %s\n",
//str,w->text);
lcd.string(w->left,w->top + (i-begin),str);
lcd.string (w->left, w->top + (i - begin), str);
}
if (timer > necessaryTimeUnits)
{
if(screenlist_action == RENDER_HOLD)
if (timer > necessaryTimeUnits) {
if (screenlist_action == RENDER_HOLD)
screenlist_action = 0;
}
}
@@ -493,39 +422,31 @@ static int draw_frame(LL *list, char fscroll,
new_top = top + w->top - 1;
new_right = left + w->right;
new_bottom = top + w->bottom;
if(new_right > right) new_right = right;
if(new_bottom > bottom) new_bottom = bottom;
if(new_left >= right ||
new_top >= bottom)
{ // Do nothing if it's invisible...
}
else
{
draw_frame(w->kids, w->length,
new_left, new_top, new_right, new_bottom,
w->wid, w->hgt,
w->speed, timer);
if (new_right > right)
new_right = right;
if (new_bottom > bottom)
new_bottom = bottom;
if (new_left >= right || new_top >= bottom) { // Do nothing if it's invisible...
} else {
draw_frame (w->kids, w->length, new_left, new_top, new_right, new_bottom, w->wid, w->hgt, w->speed, timer);
}
}
break;
case WID_NUM: // FIXME: doesn't work in frames...
if((w->x > 0) && (w->y >= 0) && (w->y <= 9))
{
if(reset)
{
lcd.init_num();
if ((w->x > 0) && (w->y >= 0) && (w->y <= 9)) {
if (reset) {
lcd.init_num ();
reset = 0;
}
lcd.num(w->x + left, w->y);
lcd.num (w->x + left, w->y);
}
break;
case WID_NONE:
default:
break;
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
return 0;
}
+1 -1
View File
@@ -23,7 +23,7 @@ extern int backlight_state;
extern int backlight_brightness;
extern int backlight_off_brightness;
extern int output_state;
int draw_screen(screen *s, int timer);
int draw_screen (screen * s, int timer);
#endif
+68 -67
View File
@@ -13,157 +13,158 @@
#include "screen.h"
screen * screen_create()
screen *
screen_create ()
{
screen *s;
s = malloc(sizeof(screen));
if(!s)
{
fprintf(stderr, "screen_create: Error allocating new screen\n");
s = malloc (sizeof (screen));
if (!s) {
fprintf (stderr, "screen_create: Error allocating new screen\n");
return NULL;
}
s->id=NULL;
s->name=NULL;
s->priority=128;
s->id = NULL;
s->name = NULL;
s->priority = 128;
// TODO: Make the screen duration configurable!
s->duration = 32;
s->heartbeat = 1;
s->wid = lcd.wid;
s->hgt = lcd.hgt;
s->parent = NULL;
s->widgets=NULL;
s->widgets = NULL;
s->widgets = LL_new();
if(!s->widgets)
{
fprintf(stderr, "screen_create: Error allocating widget list\n");
s->widgets = LL_new ();
if (!s->widgets) {
fprintf (stderr, "screen_create: Error allocating widget list\n");
return NULL;
}
return s;
}
int screen_destroy(screen *s)
int
screen_destroy (screen * s)
{
widget *w;
if(!s) return -1;
if (!s)
return -1;
LL_Rewind(s->widgets);
LL_Rewind (s->widgets);
do {
// Free a widget...
w = LL_Get(s->widgets);
widget_destroy(w);
} while (LL_Next(s->widgets) == 0);
LL_Destroy(s->widgets);
w = LL_Get (s->widgets);
widget_destroy (w);
} while (LL_Next (s->widgets) == 0);
LL_Destroy (s->widgets);
if(s->id)
free(s->id);
if(s->name)
free(s->name);
if (s->id)
free (s->id);
if (s->name)
free (s->name);
free(s);
free (s);
return 0;
}
screen *screen_find(client *c, char *id)
screen *
screen_find (client * c, char *id)
{
screen *s;
if(!c) return NULL;
if(!id) return NULL;
if (!c)
return NULL;
if (!id)
return NULL;
debug("client_find_screen(%s)\n", id);
debug ("client_find_screen(%s)\n", id);
LL_Rewind(c->data->screenlist);
LL_Rewind (c->data->screenlist);
do {
s = LL_Get(c->data->screenlist);
if( (s) && (0 == strcmp(s->id, id)))
{
debug("client_find_screen: Found %s\n", id);
s = LL_Get (c->data->screenlist);
if ((s) && (0 == strcmp (s->id, id))) {
debug ("client_find_screen: Found %s\n", id);
return s;
}
} while(LL_Next(c->data->screenlist) == 0);
} while (LL_Next (c->data->screenlist) == 0);
return NULL;
}
int screen_add(client *c, char *id)
int
screen_add (client * c, char *id)
{
screen *s;
if(!c) return -1;
if(!id) return -1;
if (!c)
return -1;
if (!id)
return -1;
// Make sure this screen doesn't already exist...
s = screen_find(c, id);
if(s)
{
s = screen_find (c, id);
if (s) {
return 1;
}
s = screen_create();
if(!s)
{
fprintf(stderr, "screen_add: Error creating screen\n");
s = screen_create ();
if (!s) {
fprintf (stderr, "screen_add: Error creating screen\n");
return -1;
}
s->parent = c;
s->id = strdup(id);
if(!s->id)
{
fprintf(stderr, "screen_add: Error allocating name\n");
s->id = strdup (id);
if (!s->id) {
fprintf (stderr, "screen_add: Error allocating name\n");
return -1;
}
// TODO: Check for errors here?
LL_Push(c->data->screenlist, (void *)s);
LL_Push (c->data->screenlist, (void *) s);
// Now, add it to the screenlist...
if(screenlist_add(s) < 0)
{
fprintf(stderr, "screen_add: Error queueing new screen\n");
if (screenlist_add (s) < 0) {
fprintf (stderr, "screen_add: Error queueing new screen\n");
return -1;
}
return 0;
}
int screen_remove(client *c, char *id)
int
screen_remove (client * c, char *id)
{
screen *s;
if(!c) return -1;
if(!id) return -1;
if (!c)
return -1;
if (!id)
return -1;
// Make sure this screen *does* exist...
s = screen_find(c, id);
if(!s)
{
fprintf(stderr, "screen_remove: Error finding screen %s\n", id);
s = screen_find (c, id);
if (!s) {
fprintf (stderr, "screen_remove: Error finding screen %s\n", id);
return 1;
}
// TODO: Check for errors here?
LL_Remove(c->data->screenlist, (void *)s);
LL_Remove (c->data->screenlist, (void *) s);
// ... and here?
screen_destroy(s);
screen_destroy (s);
// Now, remove it from the screenlist...
if(screenlist_remove_all(s) < 0)
{
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf(stderr, "screen_remove: Error dequeueing screen\n");
fprintf (stderr, "screen_remove: Error dequeueing screen\n");
return 0;
}
+7 -8
View File
@@ -4,26 +4,25 @@
#include "../shared/LL.h"
#include "clients.h"
typedef struct screen
{
typedef struct screen {
char *id;
char *name;
int wid, hgt;
int priority;
int duration;
int heartbeat;
LL * widgets;
LL *widgets;
client *parent;
} screen;
screen * screen_create();
int screen_destroy(screen *s);
screen *screen_create ();
int screen_destroy (screen * s);
screen * screen_find(client *c, char *id);
screen *screen_find (client * c, char *id);
int screen_add(client *c, char *id);
int screen_remove(client *c, char *id);
int screen_add (client * c, char *id);
int screen_remove (client * c, char *id);
#endif
+102 -85
View File
@@ -10,30 +10,30 @@
int screenlist_action=0;
int screenlist_action = 0;
int timer=0;
int timer = 0;
LL * screenlist;
LL *screenlist;
int screenlist_add_end(screen *screen);
screen * screenlist_next_roll();
screen * screenlist_prev_roll();
screen * screenlist_next_priority();
int screenlist_add_end (screen * screen);
screen *screenlist_next_roll ();
screen *screenlist_prev_roll ();
screen *screenlist_next_priority ();
int compare_priority(void *one, void *two);
int compare_addresses(void *one, void *two);
int compare_priority (void *one, void *two);
int compare_addresses (void *one, void *two);
int screenlist_init()
int
screenlist_init ()
{
debug("screenlist_init()\n");
debug ("screenlist_init()\n");
screenlist = LL_new();
if(!screenlist)
{
fprintf(stderr, "screenlist_init: Error allocating list\n");
screenlist = LL_new ();
if (!screenlist) {
fprintf (stderr, "screenlist_init: Error allocating list\n");
return -1;
}
@@ -43,46 +43,52 @@ int screenlist_init()
return 0;
}
int screenlist_shutdown()
int
screenlist_shutdown ()
{
debug("screenlist_shutdown()\n");
debug ("screenlist_shutdown()\n");
LL_Destroy(screenlist);
LL_Destroy (screenlist);
return 0;
}
int screenlist_remove(screen *s)
int
screenlist_remove (screen * s)
{
debug("screenlist_remove()\n");
debug ("screenlist_remove()\n");
if(!LL_Remove(screenlist, s))
if (!LL_Remove (screenlist, s))
return -1;
else return 0;
else
return 0;
}
int screenlist_remove_all(screen *s)
int
screenlist_remove_all (screen * s)
{
int i=0;
int i = 0;
debug("screenlist_remove_all()\n");
debug ("screenlist_remove_all()\n");
while(LL_Remove(screenlist, s))
while (LL_Remove (screenlist, s))
i++;
debug("screenlist_remove_all()... got %i\n", i);
debug ("screenlist_remove_all()... got %i\n", i);
return i;
}
LL * screenlist_getlist()
LL *
screenlist_getlist ()
{
debug("screenlist_getlist()\n");
debug ("screenlist_getlist()\n");
return screenlist;
}
screen * screenlist_current()
screen *
screenlist_current ()
{
char str[256];
screen *s;
@@ -94,47 +100,40 @@ screen * screenlist_current()
//LL_dprint(screenlist);
s = (screen *)LL_GetFirst(screenlist);
s = (screen *) LL_GetFirst (screenlist);
// FIXME: Make sure the screen/client exists!
if(s != old_s)
{
debug("screenlist_current: new screen\n");
if (s != old_s) {
debug ("screenlist_current: new screen\n");
timer = 0;
// Tell the client we're done with the current screen
if(old_s)
{
if (old_s) {
//debug("screenlist_current: ignoring old screen\n");
LL_Rewind(screenlist);
if(old_s != LL_Find(screenlist, compare_addresses, old_s))
{
debug("screenlist: Didn't find screen 0x%8x!\n", (int)old_s);
}
else {
LL_Rewind (screenlist);
if (old_s != LL_Find (screenlist, compare_addresses, old_s)) {
debug ("screenlist: Didn't find screen 0x%8x!\n", (int) old_s);
} else {
//debug("screenlist_current: ... sending ignore\n");
c = old_s->parent;
if(c) // Tell the client we're not listening any more...
if (c) // Tell the client we're not listening any more...
{
sprintf(str, "ignore %s\n", old_s->id);
sock_send_string(c->sock, str);
}
else // The server has the display, so do nothing
sprintf (str, "ignore %s\n", old_s->id);
sock_send_string (c->sock, str);
} else // The server has the display, so do nothing
{
}
//debug("screenlist_current: ... sent ignore\n");
}
}
if(s)
{
if (s) {
//debug("screenlist_current: listening to new screen\n");
c = s->parent;
if(c) // Tell the client we're paying attention...
if (c) // Tell the client we're paying attention...
{
sprintf(str, "listen %s\n", s->id);
sock_send_string(c->sock, str);
}
else // The server has the display, so do nothing
sprintf (str, "listen %s\n", s->id);
sock_send_string (c->sock, str);
} else // The server has the display, so do nothing
{
}
}
@@ -149,23 +148,27 @@ screen * screenlist_current()
return s;
}
int screenlist_add(screen *s)
int
screenlist_add (screen * s)
{
// TODO: Different queueing modes...
return screenlist_add_end(s);
return screenlist_add_end (s);
}
screen * screenlist_next()
screen *
screenlist_next ()
{
screen *s;
//debug("Screenlist_next()\n");
s = screenlist_current();
s = screenlist_current ();
// If we're on hold, don't advance!
if(screenlist_action == SCR_HOLD) return s;
if(screenlist_action == RENDER_HOLD) return s;
if (screenlist_action == SCR_HOLD)
return s;
if (screenlist_action == RENDER_HOLD)
return s;
// Otherwise, reset it to regular operation
screenlist_action = 0;
@@ -175,7 +178,7 @@ screen * screenlist_next()
// Call the selected queuing function...
// TODO: Different queueing modes...
s = screenlist_next_priority();
s = screenlist_next_priority ();
//s = screenlist_next_roll();
//debug("Screenlist_next() done\n");
@@ -183,15 +186,18 @@ screen * screenlist_next()
return s;
}
screen * screenlist_prev()
screen *
screenlist_prev ()
{
screen *s;
s = screenlist_current();
s = screenlist_current ();
// If we're on hold, don't advance!
if(screenlist_action == SCR_HOLD) return s;
if(screenlist_action == RENDER_HOLD) return s;
if (screenlist_action == SCR_HOLD)
return s;
if (screenlist_action == RENDER_HOLD)
return s;
// Otherwise, reset it no regular operation
screenlist_action = 0;
@@ -199,72 +205,83 @@ screen * screenlist_prev()
// Call the selected queuing function...
// TODO: Different queueing modes...
s = screenlist_prev_roll();
s = screenlist_prev_roll ();
return s;
}
// Adds new screens to the end of the screenlist...
int screenlist_add_end(screen *screen)
int
screenlist_add_end (screen * screen)
{
debug("screenlist_add_end()\n");
debug ("screenlist_add_end()\n");
return LL_Push(screenlist, (void *)screen);
return LL_Push (screenlist, (void *) screen);
}
// Simple round-robin approach to screen cycling...
screen * screenlist_next_roll()
screen *
screenlist_next_roll ()
{
//debug("screenlist_next_roll()\n");
if(LL_UnRoll(screenlist) != 0) return NULL;
if (LL_UnRoll (screenlist) != 0)
return NULL;
return screenlist_current();
return screenlist_current ();
}
// Strict priority queue approach...
screen * screenlist_next_priority()
screen *
screenlist_next_priority ()
{
//screen *s, *t;
//debug("screenlist_next_priority\n");
if(LL_UnRoll(screenlist) != 0) return NULL;
if (LL_UnRoll (screenlist) != 0)
return NULL;
LL_Sort(screenlist, compare_priority);
LL_Sort (screenlist, compare_priority);
return screenlist_current();
return screenlist_current ();
}
// Simple round-robin approach to screen cycling...
screen * screenlist_prev_roll()
screen *
screenlist_prev_roll ()
{
//debug("screenlist_prev_roll()\n");
if(LL_Roll(screenlist) != 0) return NULL;
if (LL_Roll (screenlist) != 0)
return NULL;
return screenlist_current();
return screenlist_current ();
}
int compare_priority(void *one, void *two)
int
compare_priority (void *one, void *two)
{
screen *a, *b;
//debug("compare_priority: %8x %8x\n", one, two);
if(!one) return 0;
if(!two) return 0;
if (!one)
return 0;
if (!two)
return 0;
a = (screen *)one;
b = (screen *)two;
a = (screen *) one;
b = (screen *) two;
//debug("compare_priority: done?\n");
return (a->priority - b->priority);
}
int compare_addresses(void *one, void *two)
int
compare_addresses (void *one, void *two)
{
//printf("compare_addresses: 0x%x == 0x%x ???\n", one, two);
//if(one == two) printf("Yes!\n");
+9 -9
View File
@@ -14,18 +14,18 @@
extern int screenlist_action;
extern int timer;
int screenlist_init();
int screenlist_shutdown();
int screenlist_init ();
int screenlist_shutdown ();
LL * screenlist_getlist();
screen * screenlist_current();
LL *screenlist_getlist ();
screen *screenlist_current ();
int screenlist_add(screen *s);
screen * screenlist_next();
screen * screenlist_prev();
int screenlist_add (screen * s);
screen *screenlist_next ();
screen *screenlist_prev ();
int screenlist_remove(screen *s);
int screenlist_remove_all(screen *s);
int screenlist_remove (screen * s);
int screenlist_remove_all (screen * s);
#endif
+76 -105
View File
@@ -27,17 +27,17 @@ char one[256] = "";
char two[256] = "";
char three[256] = "";
int server_screen_init()
int
server_screen_init ()
{
widget *w;
debug("server_screen_init\n");
debug ("server_screen_init\n");
server_screen = screen_create();
server_screen = screen_create ();
if(!server_screen)
{
fprintf(stderr, "server_screen_init: Error allocating screen\n");
if (!server_screen) {
fprintf (stderr, "server_screen_init: Error allocating screen\n");
return -1;
}
@@ -46,71 +46,60 @@ int server_screen_init()
server_screen->duration = 8; // 1 second, instead of 4...
// TODO: Error-checking?
widget_add(server_screen, "title", "title", NULL, 1);
widget_add(server_screen, "one" , "string", NULL, 1);
widget_add(server_screen, "two" , "string", NULL, 1);
widget_add(server_screen, "three", "string", NULL, 1);
widget_add (server_screen, "title", "title", NULL, 1);
widget_add (server_screen, "one", "string", NULL, 1);
widget_add (server_screen, "two", "string", NULL, 1);
widget_add (server_screen, "three", "string", NULL, 1);
// Now, initialize all the widgets...
w = widget_find(server_screen, "title");
if(w)
{
w = widget_find (server_screen, "title");
if (w) {
w->text = title;
}
else
{
fprintf(stderr, "server_screen_init: Can't find title\n");
} else {
fprintf (stderr, "server_screen_init: Can't find title\n");
}
w = widget_find(server_screen, "one");
if(w)
{
w = widget_find (server_screen, "one");
if (w) {
w->x = 1;
w->y = 2;
w->text = one;
}
else
{
fprintf(stderr, "server_screen_init: Can't find widget one\n");
} else {
fprintf (stderr, "server_screen_init: Can't find widget one\n");
}
w = widget_find(server_screen, "two");
if(w)
{
w = widget_find (server_screen, "two");
if (w) {
w->x = 1;
w->y = 3;
w->text = two;
}
else
{
fprintf(stderr, "server_screen_init: Can't find widget two\n");
} else {
fprintf (stderr, "server_screen_init: Can't find widget two\n");
}
w = widget_find(server_screen, "three");
if(w)
{
w = widget_find (server_screen, "three");
if (w) {
w->x = 1;
w->y = 4;
w->text = three;
}
else
{
fprintf(stderr, "server_screen_init: Can't find widget three\n");
} else {
fprintf (stderr, "server_screen_init: Can't find widget three\n");
}
// And enqueue the screen
screenlist_add(server_screen);
screenlist_add (server_screen);
debug("server_screen_init done\n");
debug ("server_screen_init done\n");
return 0;
}
int update_server_screen(int timer)
int
update_server_screen (int timer)
{
client *c;
int num_clients;
@@ -123,68 +112,60 @@ int update_server_screen(int timer)
// Now get info on the number of connected clients...
num_clients=0; num_screens=0;
LL_Rewind(clients);
num_clients = 0;
num_screens = 0;
LL_Rewind (clients);
do {
c = LL_Get(clients);
if(c)
{
c = LL_Get (clients);
if (c) {
num_clients++;
LL_Rewind(c->data->screenlist);
LL_Rewind (c->data->screenlist);
do {
s = LL_Get(c->data->screenlist);
if(s)
{
s = LL_Get (c->data->screenlist);
if (s) {
num_screens++;
}
} while(LL_Next(c->data->screenlist) == 0);
} while (LL_Next (c->data->screenlist) == 0);
}
} while(LL_Next(clients) == 0);
} while (LL_Next (clients) == 0);
if(lcd.hgt >= 3)
{
sprintf(one, "Clients: %i", num_clients);
sprintf(two, "Screens: %i", num_screens);
}
else
{
if(lcd.wid >= 20)
sprintf(one, "%i Client%s, %i Screen%s",
num_clients, (num_clients==1)?"":"s",
num_screens, (num_screens==1)?"":"s");
if (lcd.hgt >= 3) {
sprintf (one, "Clients: %i", num_clients);
sprintf (two, "Screens: %i", num_screens);
} else {
if (lcd.wid >= 20)
sprintf (one, "%i Client%s, %i Screen%s", num_clients, (num_clients == 1) ? "" : "s", num_screens, (num_screens == 1) ? "" : "s");
else // 16x2 size
sprintf(one, "%i Cli%s, %i Scr%s",
num_clients, (num_clients==1)?"":"s",
num_screens, (num_screens==1)?"":"s");
sprintf (one, "%i Cli%s, %i Scr%s", num_clients, (num_clients == 1) ? "" : "s", num_screens, (num_screens == 1) ? "" : "s");
}
return 0;
}
int no_screen_screen(int timer)
int
no_screen_screen (int timer)
{
lcd.clear();
lcd.clear ();
lcd.string(1, 1, "Error: No screen!");
lcd.string (1, 1, "Error: No screen!");
lcd.flush();
lcd.flush ();
return 0;
}
int goodbye_screen()
int
goodbye_screen ()
{
char
*b20 = " ",
*t20 = " Thanks for using ",
*b20 = " ", *t20 = " Thanks for using ",
#ifdef LINUX
*l20 = " LCDproc and Linux! ",
#else
*l20 = " LCDproc! ",
#endif
*b16 = " ",
*t16 = "Thanks for using",
*b16 = " ", *t16 = "Thanks for using",
#ifdef LINUX
*l16 = " LCDproc+Linux! ",
#else
@@ -192,41 +173,31 @@ int goodbye_screen()
#endif
*nil = "";
lcd.clear();
lcd.clear ();
if(lcd.hgt >= 4)
{
if(lcd.wid >= 20)
{
lcd.string(1, 1, b20);
lcd.string(1, 2, t20);
lcd.string(1, 3, l20);
lcd.string(1, 4, b20);
if (lcd.hgt >= 4) {
if (lcd.wid >= 20) {
lcd.string (1, 1, b20);
lcd.string (1, 2, t20);
lcd.string (1, 3, l20);
lcd.string (1, 4, b20);
} else {
lcd.string (1, 1, b16);
lcd.string (1, 2, t16);
lcd.string (1, 3, l16);
lcd.string (1, 4, b16);
}
else
{
lcd.string(1, 1, b16);
lcd.string(1, 2, t16);
lcd.string(1, 3, l16);
lcd.string(1, 4, b16);
}
}
else
{
if(lcd.wid >= 20)
{
lcd.string(1, 1, t20);
lcd.string(1, 2, l20);
}
else
{
lcd.string(1, 1, t16);
lcd.string(1, 2, l16);
} else {
if (lcd.wid >= 20) {
lcd.string (1, 1, t20);
lcd.string (1, 2, l20);
} else {
lcd.string (1, 1, t16);
lcd.string (1, 2, l16);
}
}
lcd.flush();
lcd.flush ();
return 0;
}
+4 -4
View File
@@ -6,9 +6,9 @@
extern screen *server_screen;
int server_screen_init();
int update_server_screen(int timer);
int no_screen_screen(int timer);
int goodbye_screen();
int server_screen_init ();
int update_server_screen (int timer);
int no_screen_screen (int timer);
int goodbye_screen ();
#endif
+61 -82
View File
@@ -36,19 +36,19 @@ int read_from_client (int filedes);
// Creates a socket in internet space
int sock_create_inet_socket(unsigned short int port)
int
sock_create_inet_socket (unsigned short int port)
{
struct sockaddr_in name;
int sock;
debug("sock_create_inet_socket(%i)\n", port);
debug ("sock_create_inet_socket(%i)\n", port);
/* Create the socket. */
//debug("Creating Inet Socket\n");
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror("Error creating socket");
if (sock < 0) {
perror ("Error creating socket");
return -1;
}
@@ -57,9 +57,8 @@ int sock_create_inet_socket(unsigned short int port)
name.sin_family = AF_INET;
name.sin_port = htons (port);
name.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
{
perror("Error binding socket");
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) {
perror ("Error binding socket");
return -1;
}
@@ -68,24 +67,23 @@ int sock_create_inet_socket(unsigned short int port)
}
//int StartSocketServer()
int sock_create_server()
int
sock_create_server ()
{
int sock;
debug("sock_create_server()\n");
debug ("sock_create_server()\n");
/* Create the socket and set it up to accept connections. */
sock = sock_create_inet_socket(LCDPORT);
if(sock < 0)
{
perror("sock_create_server: Error creating socket");
sock = sock_create_inet_socket (LCDPORT);
if (sock < 0) {
perror ("sock_create_server: Error creating socket");
return -1;
}
if (listen (sock, 1) < 0)
{
perror("sock_create_server: Listen error");
if (listen (sock, 1) < 0) {
perror ("sock_create_server: Listen error");
return -1;
}
@@ -114,7 +112,8 @@ int sock_create_server()
}
int sock_poll_clients()
int
sock_poll_clients ()
{
int i;
int err;
@@ -131,70 +130,52 @@ int sock_poll_clients()
/* Block until input arrives on one or more active sockets. */
read_fd_set = active_fd_set;
if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, &t) < 0)
{
perror("sock_poll_clients: Select error");
if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, &t) < 0) {
perror ("sock_poll_clients: Select error");
return -1;
}
/* Service all the sockets with input pending. */
for (i = 0; i < FD_SETSIZE; ++i)
{
if (FD_ISSET (i, &read_fd_set))
{
if (i == orig_sock)
{
for (i = 0; i < FD_SETSIZE; ++i) {
if (FD_ISSET (i, &read_fd_set)) {
if (i == orig_sock) {
/* Connection request on original socket. */
int new;
size = sizeof (clientname);
new = accept (orig_sock,
(struct sockaddr *) &clientname,
&size);
if (new < 0)
{
perror("sock_poll_clients: Accept error");
new = accept (orig_sock, (struct sockaddr *) &clientname, &size);
if (new < 0) {
perror ("sock_poll_clients: Accept error");
return -1;
}
debug("sock_poll_clients: connect from host %s, port %hd.\n",
inet_ntoa (clientname.sin_addr),
ntohs (clientname.sin_port));
debug ("sock_poll_clients: connect from host %s, port %hd.\n", inet_ntoa (clientname.sin_addr), ntohs (clientname.sin_port));
FD_SET (new, &active_fd_set);
fcntl(new, F_SETFL, O_NONBLOCK);
fcntl (new, F_SETFL, O_NONBLOCK);
// TODO: Create new "client" here... (done?)
if ( client_create(new) == NULL)
{
fprintf(stderr,
"sock_poll_clients: error creating client %i\n",
i);
if (client_create (new) == NULL) {
fprintf (stderr, "sock_poll_clients: error creating client %i\n", i);
return -1;
}
}
else
{
} else {
/* Data arriving on an already-connected socket. */
err = 0;
do {
debug("sock_poll_clients: reading...\n");
err = read_from_client(i);
debug("sock_poll_clients: ...done\n");
if (err < 0)
{
debug ("sock_poll_clients: reading...\n");
err = read_from_client (i);
debug ("sock_poll_clients: ...done\n");
if (err < 0) {
// TODO: Destroy a "client" here... (done?)
c = client_find_sock(i);
if(c)
{
c = client_find_sock (i);
if (c) {
//sock_send_string(i, "bye\n");
client_destroy(c);
client_destroy (c);
close (i);
FD_CLR (i, &active_fd_set);
debug("sock_poll_clients: Closed connection %i\n", i);
}
else fprintf(stderr,
"sock_poll_clients: Can't find client %i\n",
i);
debug ("sock_poll_clients: Closed connection %i\n", i);
} else
fprintf (stderr, "sock_poll_clients: Can't find client %i\n", i);
}
} while (err > 0);
@@ -205,7 +186,8 @@ int sock_poll_clients()
}
int read_from_client (int filedes)
int
read_from_client (int filedes)
{
char buffer[MAXMSG];
int nbytes, i;
@@ -215,7 +197,7 @@ int read_from_client (int filedes)
//debug("read_from_client(%i): reading...\n", filedes);
nbytes = sock_recv (filedes, buffer, MAXMSG);
//debug("read_from_client(%i): ...done\n", filedes);
debug("read_from_client(%i): %i bytes\n", filedes, nbytes);
debug ("read_from_client(%i): %i bytes\n", filedes, nbytes);
if (nbytes < 0) // Read error? No data available?
@@ -223,30 +205,27 @@ int read_from_client (int filedes)
// TODO: check errno here!
//fprintf (stderr,"read_from_client: Read error\n");
return 0;
}
else if (nbytes == 0) // EOF
} else if (nbytes == 0) // EOF
return -1;
else if (nbytes > (MAXMSG - (MAXMSG / 8))) // Very noisy client...
{
sock_send_string(filedes, "huh? Shut up!\n");
sock_send_string (filedes, "huh? Shut up!\n");
return -1;
}
else // Data Read
} else // Data Read
{
buffer[nbytes] = 0;
// Now, replace zeros with linefeeds...
for(i=0; i<nbytes; i++)
if(buffer[i] == 0) buffer[i] = '\n';
for (i = 0; i < nbytes; i++)
if (buffer[i] == 0)
buffer[i] = '\n';
// Enqueue a "client message" here...
c = client_find_sock(filedes);
if(c)
{
client_add_message(c, buffer);
}
else fprintf(stderr, "read_from_client: Can't find client %i\n",
filedes);
c = client_find_sock (filedes);
if (c) {
client_add_message (c, buffer);
} else
fprintf (stderr, "read_from_client: Can't find client %i\n", filedes);
debug("read_from_client: got message: `%s'\n", buffer);
debug ("read_from_client: got message: `%s'\n", buffer);
return nbytes;
}
return nbytes;
@@ -255,19 +234,19 @@ int read_from_client (int filedes)
// FIXME: This talks to all open files, including
// stdin, stdout, stderr, the LCD, etc...
// BUT it should only talk to sockets!
int sock_close_all()
int
sock_close_all ()
{
int i;
debug("sock_close_all()\n");
debug ("sock_close_all()\n");
for (i = 0; i < FD_SETSIZE; i++)
{
for (i = 0; i < FD_SETSIZE; i++) {
// TODO: Destroy a "client" here...? Nope.
sock_send_string(i, "bye\n");
sock_send_string (i, "bye\n");
close (i);
FD_CLR (i, &active_fd_set);
debug("sock_close_all: Closed connection %i\n", i);
debug ("sock_close_all: Closed connection %i\n", i);
}
return 0;
+4 -4
View File
@@ -9,10 +9,10 @@ typedef struct sockaddr_in sockaddr_in;
// Server functions...
int sock_create_server();
int sock_create_inet_socket(unsigned short int port);
int sock_poll_clients();
int sock_close_all();
int sock_create_server ();
int sock_create_inet_socket (unsigned short int port);
int sock_poll_clients ();
int sock_close_all ();
int read_from_client (int filedes);
#endif
+139 -157
View File
@@ -9,7 +9,7 @@
#include "widget.h"
char *types[] = {"none",
char *types[] = { "none",
"string",
"hbar",
"vbar",
@@ -20,23 +20,23 @@ char *types[] = {"none",
"num",
//"",
NULL,
};
};
static widget * widget_finder(LL *list, char *id);
static int widget_remover(LL *list, widget *w);
static widget *widget_finder (LL * list, char *id);
static int widget_remover (LL * list, widget * w);
widget * widget_create()
widget *
widget_create ()
{
widget *w;
debug("widget_create()\n");
debug ("widget_create()\n");
w = malloc(sizeof(widget));
if(!w)
{
fprintf(stderr, "widget_create: Error allocating widget\n");
w = malloc (sizeof (widget));
if (!w) {
fprintf (stderr, "widget_create: Error allocating widget\n");
return NULL;
}
@@ -58,51 +58,57 @@ widget * widget_create()
return w;
}
int widget_destroy(widget *w)
int
widget_destroy (widget * w)
{
LL * list;
LL *list;
widget *foo;
if(!w) return -1;
if (!w)
return -1;
debug("widget_destroy(%s)\n", w->id);
debug ("widget_destroy(%s)\n", w->id);
if(w->id) free(w->id);
if (w->id)
free (w->id);
//debug("widget_destroy: id...\n");
if(w->text) free(w->text);
if (w->text)
free (w->text);
//debug("widget_destroy: text...\n");
// TODO: Free kids!
if(w->kids)
{
if (w->kids) {
list = w->kids;
LL_Rewind(list);
LL_Rewind (list);
do {
foo = LL_Get(list);
if(foo)
widget_destroy(foo);
} while( 0 == LL_Next(list) );
foo = LL_Get (list);
if (foo)
widget_destroy (foo);
} while (0 == LL_Next (list));
LL_Destroy(list);
LL_Destroy (list);
w->kids = NULL;
}
free(w);
free (w);
//debug("widget_destroy: widget...\n");
return 0;
}
widget * widget_find(screen *s, char *id)
widget *
widget_find (screen * s, char *id)
{
//widget *w, *err;
if(!s) return NULL;
if(!id) return NULL;
if (!s)
return NULL;
if (!id)
return NULL;
debug("widget_find(%s)\n", id);
debug ("widget_find(%s)\n", id);
return widget_finder(s->widgets, id);
return widget_finder (s->widgets, id);
/*
LL_Rewind(s->widgets);
do {
@@ -125,186 +131,168 @@ widget * widget_find(screen *s, char *id)
*/
}
widget * widget_finder(LL *list, char *id)
widget *
widget_finder (LL * list, char *id)
{
widget *w, *err;
if(!list) return NULL;
if(!id) return NULL;
if (!list)
return NULL;
if (!id)
return NULL;
debug("widget_finder(%s)\n", id);
debug ("widget_finder(%s)\n", id);
LL_Rewind(list);
LL_Rewind (list);
do {
//debug("widget_finder: Iteration\n");
w = LL_Get(list);
if(w)
{
w = LL_Get (list);
if (w) {
//debug("widget_finder: ...\n");
if(0 == strcmp(w->id, id))
{
debug("widget_finder: Found %s\n", id);
if (0 == strcmp (w->id, id)) {
debug ("widget_finder: Found %s\n", id);
return w;
}
// Search kids recursively
//debug("widget_finder: ...\n");
if( w->type == WID_FRAME )
{
err = widget_finder(w->kids, id);
if(err) return err;
if (w->type == WID_FRAME) {
err = widget_finder (w->kids, id);
if (err)
return err;
}
//debug("widget_finder: ...\n");
}
} while(LL_Next(list) == 0);
} while (LL_Next (list) == 0);
return NULL;
}
int widget_add(screen *s, char *id, char *type, char *in, int sock)
int
widget_add (screen * s, char *id, char *type, char *in, int sock)
{
int i;
int valid=0;
int wid_type=0;
int valid = 0;
int wid_type = 0;
widget *w, *parent;
LL *list;
debug("widget_add(%s, %s, %s)\n", id, type, in);
debug ("widget_add(%s, %s, %s)\n", id, type, in);
if(!s) return -1;
if(!id) return -1;
if (!s)
return -1;
if (!id)
return -1;
list = s->widgets;
if(0 == strcmp(id, "heartbeat"))
{
if (0 == strcmp (id, "heartbeat")) {
s->heartbeat = 1;
return 0;
}
// Make sure this screen doesn't already exist...
w = widget_find(s, id);
if(w)
{
w = widget_find (s, id);
if (w) {
// already exists
sock_send_string(sock,
"huh? You already have a widget with that id#\n");
sock_send_string (sock, "huh? You already have a widget with that id#\n");
return 1;
}
// Make sure the container, if any, is real
if(in)
{
parent = widget_find(s, in);
if(!parent)
{
if (in) {
parent = widget_find (s, in);
if (!parent) {
// no frame to use as parent
sock_send_string(sock, "huh? Frame doesn't exist\n");
sock_send_string (sock, "huh? Frame doesn't exist\n");
return 3;
}
else
{
if(parent->type == WID_FRAME)
{
} else {
if (parent->type == WID_FRAME) {
list = parent->kids;
if(!list) fprintf(stderr, "widget_add: Parent has no kids\n");
}
else
{
if (!list)
fprintf (stderr, "widget_add: Parent has no kids\n");
} else {
// no frame to use as parent
sock_send_string(sock, "huh? Not a frame\n");
sock_send_string (sock, "huh? Not a frame\n");
return 4;
}
}
}
// Make sure it's a valid widget type
for(i=1; types[i]; i++)
{
if(0 == strcmp(types[i], type))
{
valid=1;
wid_type=i;
for (i = 1; types[i]; i++) {
if (0 == strcmp (types[i], type)) {
valid = 1;
wid_type = i;
}
}
if(!valid)
{
if (!valid) {
// invalid widget type
sock_send_string(sock, "huh? Invalid widget type\n");
sock_send_string (sock, "huh? Invalid widget type\n");
return 2;
}
debug("widget_add: making widget\n");
debug ("widget_add: making widget\n");
// Now, make it...
w = widget_create();
if(!w)
{
fprintf(stderr, "widget_add: Error creating widget\n");
w = widget_create ();
if (!w) {
fprintf (stderr, "widget_add: Error creating widget\n");
return -1;
}
w->id = strdup(id);
if(!w->id)
{
fprintf(stderr, "widget_add: Error allocating id\n");
w->id = strdup (id);
if (!w->id) {
fprintf (stderr, "widget_add: Error allocating id\n");
return -1;
}
w->type = wid_type;
// Set up the container's widget list...
if(w->type == WID_FRAME)
{
if(!w->kids)
{
w->kids = LL_new();
if(!w->kids)
{
fprintf(stderr, "widget_add: error allocating kids for frame\n");
if (w->type == WID_FRAME) {
if (!w->kids) {
w->kids = LL_new ();
if (!w->kids) {
fprintf (stderr, "widget_add: error allocating kids for frame\n");
return -1;
}
}
}
// TODO: Check for errors here?
LL_Push(list, (void *)w);
LL_Push (list, (void *) w);
return 0;
}
int widget_remove(screen *s, char *id, int sock)
int
widget_remove (screen * s, char *id, int sock)
{
widget *w;
LL *list;
debug("widget_remove(%s)\n", id);
debug ("widget_remove(%s)\n", id);
if(!s) return -1;
if(!id) return -1;
if (!s)
return -1;
if (!id)
return -1;
list = s->widgets;
if(0 == strcmp(id, "heartbeat"))
{
if (0 == strcmp (id, "heartbeat")) {
s->heartbeat = 0;
return 0;
}
// Make sure this screen *does* exist...
w = widget_find(s, id);
if(!w)
{
sock_send_string(sock,
"huh? You don't have a widget with that id#\n");
debug("widget_remove: Error finding widget %s\n", id);
w = widget_find (s, id);
if (!w) {
sock_send_string (sock, "huh? You don't have a widget with that id#\n");
debug ("widget_remove: Error finding widget %s\n", id);
return 1;
}
@@ -318,74 +306,68 @@ int widget_remove(screen *s, char *id, int sock)
// widget_destroy(w);
*/
return widget_remover(list, w);
return widget_remover (list, w);
// return 0;
}
int widget_remover(LL *list, widget *w)
int
widget_remover (LL * list, widget * w)
{
widget *foo, *bar;
int err;
debug("widget_remover\n");
debug ("widget_remover\n");
if(!list) return 0;
if(!w) return 0;
if (!list)
return 0;
if (!w)
return 0;
// Search through the list...
LL_Rewind(list);
LL_Rewind (list);
do {
// Test each item
foo = LL_Get(list);
if(foo)
{
foo = LL_Get (list);
if (foo) {
// Frames require recursion to search and/or destroy
if(foo->type == WID_FRAME)
{
if (foo->type == WID_FRAME) {
// If removing a frame, kill all its kids, too...
if(foo == w)
if (foo == w) {
if (!foo->kids) {
fprintf (stderr, "widget_remover: frame has no kids\n");
} else // Kill the kids...
{
if(!foo->kids)
{
fprintf(stderr, "widget_remover: frame has no kids\n");
}
else // Kill the kids...
{
LL_Rewind(foo->kids);
LL_Rewind (foo->kids);
do {
bar = LL_Get(foo->kids);
err = widget_remover(foo->kids, bar);
} while(0 == LL_Next(foo->kids));
bar = LL_Get (foo->kids);
err = widget_remover (foo->kids, bar);
} while (0 == LL_Next (foo->kids));
// Then kill the parent...
LL_Remove(list, (void *)w);
widget_destroy(w);
LL_Remove (list, (void *) w);
widget_destroy (w);
}
}
else // Otherwise, search the frame recursively...
} else // Otherwise, search the frame recursively...
{
if(!foo->kids)
{
fprintf(stderr, "widget_remover: frame has no kids\n");
}
else err = widget_remover(foo->kids, w);
if (!foo->kids) {
fprintf (stderr, "widget_remover: frame has no kids\n");
} else
err = widget_remover (foo->kids, w);
}
}
else // If not a frame, remove it if it matches...
} else // If not a frame, remove it if it matches...
{
if(foo == w)
{
LL_Remove(list, (void *)w);
widget_destroy(w);
if (foo == w) {
LL_Remove (list, (void *) w);
widget_destroy (w);
}
}
}
} while(0 == LL_Next(list));
} while (0 == LL_Next (list));
return 0;
}
+6 -7
View File
@@ -3,8 +3,7 @@
#include "screen.h"
typedef struct widget
{
typedef struct widget {
char *id;
int type;
// some sort of data here...
@@ -33,13 +32,13 @@ typedef struct widget
extern char *types[];
widget * widget_create();
int widget_destroy(widget *w);
widget *widget_create ();
int widget_destroy (widget * w);
widget * widget_find(screen *s, char *id);
widget *widget_find (screen * s, char *id);
int widget_add(screen *s, char *id, char *type, char *in, int sock);
int widget_remove(screen *s, char *id, int sock);
int widget_add (screen * s, char *id, char *type, char *in, int sock);
int widget_remove (screen * s, char *id, int sock);
#endif