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:
+1
-1
@@ -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,
|
||||
|
||||
+126
-120
@@ -14,48 +14,51 @@
|
||||
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;
|
||||
char str[64];
|
||||
|
||||
if(lseek(batt_fd, 0, 0) != 0) return -1;
|
||||
if (!batt_fd)
|
||||
batt_fd = open ("/proc/apm", O_RDONLY);
|
||||
if (batt_fd <= 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))
|
||||
return -1;
|
||||
if (lseek (batt_fd, 0, 0) != 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))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
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 (percent >= 0)
|
||||
sprintf (buffer, "%i%%", percent);
|
||||
else
|
||||
sprintf (buffer, "??%%");
|
||||
sprintf (tmp, "widget_set B title {Batt: %s: %s}\n", buffer, host);
|
||||
|
||||
if(lcd_hgt >= 4) // 4-line version of the screen
|
||||
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;
|
||||
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);
|
||||
|
||||
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);
|
||||
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)");
|
||||
}
|
||||
} // end if(lcd_hgt >= 4)
|
||||
else // two-line version of the screen
|
||||
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, ");
|
||||
|
||||
if(battflag == 0xff)
|
||||
{
|
||||
sprintf(tmp+strlen(tmp), "No battery???");
|
||||
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???");
|
||||
} 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;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+320
-341
@@ -12,118 +12,120 @@
|
||||
#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;
|
||||
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;
|
||||
|
||||
return uptime;
|
||||
*up = uptime;
|
||||
|
||||
return uptime;
|
||||
}
|
||||
|
||||
|
||||
// A couple of tables for later use...
|
||||
static char *days[] = {
|
||||
"Sunday, ",
|
||||
"Monday, ",
|
||||
"Tuesday, ",
|
||||
"Wednesday,",
|
||||
"Thursday, ",
|
||||
"Friday, ",
|
||||
"Saturday, ",
|
||||
"Sunday, ",
|
||||
"Monday, ",
|
||||
"Tuesday, ",
|
||||
"Wednesday,",
|
||||
"Thursday, ",
|
||||
"Friday, ",
|
||||
"Saturday, ",
|
||||
};
|
||||
static char *shortdays[] = {
|
||||
"Sun",
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
"Sun",
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
};
|
||||
|
||||
static char *months[] = {
|
||||
" January",
|
||||
" February",
|
||||
" March",
|
||||
" April",
|
||||
" May",
|
||||
" June",
|
||||
" July",
|
||||
" August",
|
||||
"September",
|
||||
" October",
|
||||
" November",
|
||||
" December",
|
||||
" January",
|
||||
" February",
|
||||
" March",
|
||||
" April",
|
||||
" May",
|
||||
" June",
|
||||
" July",
|
||||
" August",
|
||||
"September",
|
||||
" October",
|
||||
" November",
|
||||
" December",
|
||||
};
|
||||
static char *shortmonths[] = {
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"May",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Oct",
|
||||
"Nov",
|
||||
"Dec",
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"May",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Oct",
|
||||
"Nov",
|
||||
"Dec",
|
||||
};
|
||||
|
||||
|
||||
|
||||
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);
|
||||
|
||||
reread(kversion_fd, "main:");
|
||||
sscanf(buffer, "%s", kver);
|
||||
|
||||
close(kversion_fd);
|
||||
kversion_fd = open ("/proc/sys/kernel/osrelease", O_RDONLY);
|
||||
|
||||
reread (kversion_fd, "main:");
|
||||
sscanf (buffer, "%s", kver);
|
||||
|
||||
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 );
|
||||
|
||||
free(unamebuf);
|
||||
strcpy (kver, unamebuf->release);
|
||||
strcpy (sysname, unamebuf->sysname);
|
||||
|
||||
free (unamebuf);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
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];
|
||||
@@ -156,157 +159,146 @@ int time_screen(int rep, int display)
|
||||
char colon;
|
||||
|
||||
|
||||
|
||||
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(min, "%02d", rtime->tm_min);
|
||||
sprintf(sec, "%02d", rtime->tm_sec);
|
||||
sprintf (ampm, "%s", "A");
|
||||
|
||||
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);
|
||||
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, "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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
colons = colons ^ 1;
|
||||
|
||||
|
||||
return 0;
|
||||
} // End time_screen()
|
||||
} // End time_screen()
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// 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,114 +306,108 @@ 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(first)
|
||||
{
|
||||
if (lcd_hgt < 4)
|
||||
return 0;
|
||||
|
||||
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);
|
||||
|
||||
strcpy(day, days[rtime->tm_wday]);
|
||||
time (&thetime);
|
||||
rtime = localtime (&thetime);
|
||||
|
||||
if(TwentyFourHour)
|
||||
{
|
||||
sprintf(hr, "%02d", rtime->tm_hour);
|
||||
strcpy (day, days[rtime->tm_wday]);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
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");
|
||||
}
|
||||
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]);
|
||||
strcpy (month, months[rtime->tm_mon]);
|
||||
|
||||
|
||||
if(lcd_hgt >= 4) // 4-line version of the screen
|
||||
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);
|
||||
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);
|
||||
} // end if(lcd_hgt >= 4)
|
||||
else // 20x2 version of the screen
|
||||
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);
|
||||
} // 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;
|
||||
|
||||
|
||||
return 0;
|
||||
} // End clock_screen()
|
||||
} // End clock_screen()
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// 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,62 +416,58 @@ 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;
|
||||
|
||||
if(lcd_hgt >= 4)
|
||||
sprintf(buffer, "widget_set U two %i 3 {%s}\n", i, tmp);
|
||||
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);
|
||||
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;
|
||||
|
||||
|
||||
return 0;
|
||||
} // End uptime_screen()
|
||||
} // End uptime_screen()
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -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 i=0;
|
||||
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(first)
|
||||
{
|
||||
if (lcd_hgt < 4)
|
||||
return 0;
|
||||
|
||||
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()
|
||||
|
||||
|
||||
} // End big_clock_screen()
|
||||
|
||||
@@ -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
|
||||
|
||||
+240
-233
@@ -11,57 +11,55 @@
|
||||
#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;
|
||||
result->total = curr_load.total - last_load.total;
|
||||
result->user = curr_load.user - last_load.user;
|
||||
result->nice = curr_load.nice - last_load.nice;
|
||||
result->system = curr_load.system - last_load.system;
|
||||
result->idle = curr_load.idle - last_load.idle;
|
||||
last_load.total = curr_load.total;
|
||||
last_load.user = curr_load.user;
|
||||
last_load.nice = curr_load.nice;
|
||||
last_load.system = curr_load.system;
|
||||
last_load.idle = 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;
|
||||
result->system = curr_load.system - last_load.system;
|
||||
result->idle = curr_load.idle - last_load.idle;
|
||||
last_load.total = curr_load.total;
|
||||
last_load.user = curr_load.user;
|
||||
last_load.nice = curr_load.nice;
|
||||
last_load.system = curr_load.system;
|
||||
last_load.idle = curr_load.idle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
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;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -69,105 +67,92 @@ 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");
|
||||
}
|
||||
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");
|
||||
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_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++)
|
||||
// Make all the same, if this is the first time...
|
||||
for(i=0; i<CPU_BUF_SIZE-1; i++)
|
||||
for(j=0; j<5; j++)
|
||||
cpu[i][j] = cpu[CPU_BUF_SIZE-1][j];
|
||||
*/
|
||||
cpu[i][j] = cpu[CPU_BUF_SIZE-1][j];
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 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,191 +160,213 @@ 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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
} // 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);
|
||||
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 = (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);
|
||||
|
||||
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];
|
||||
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);
|
||||
|
||||
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];
|
||||
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);
|
||||
|
||||
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];
|
||||
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);
|
||||
|
||||
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);
|
||||
} // 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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
} // End cpu_screen()
|
||||
} // End cpu_screen()
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// 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++)
|
||||
cpu[i] = cpu[CPU_BUF_SIZE-1];
|
||||
*/
|
||||
// Make all the same, if this is the first time...
|
||||
for(i=0; i<CPU_BUF_SIZE-1; i++)
|
||||
cpu[i] = cpu[CPU_BUF_SIZE-1];
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
// 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(cpu_past[lcd_wid-1] > 0 ) status = BACKLIGHT_ON;
|
||||
if(maxload < 1) status = BACKLIGHT_OFF;
|
||||
if (n > maxload)
|
||||
maxload = n;
|
||||
|
||||
if (cpu_past[lcd_wid - 1] > 0)
|
||||
status = BACKLIGHT_ON;
|
||||
if (maxload < 1)
|
||||
status = BACKLIGHT_OFF;
|
||||
|
||||
// return status;
|
||||
return 0;
|
||||
} // End cpu_graph_screen()
|
||||
|
||||
|
||||
} // End cpu_graph_screen()
|
||||
|
||||
@@ -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
|
||||
|
||||
+116
-123
@@ -58,79 +58,74 @@
|
||||
|
||||
#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];
|
||||
struct load curr_load[MAX_CPUS];
|
||||
char *token;
|
||||
static struct load last_load[MAX_CPUS];
|
||||
struct load curr_load[MAX_CPUS];
|
||||
|
||||
*numcpus = 0;
|
||||
*numcpus = 0;
|
||||
|
||||
reread (load_fd, "get_load");
|
||||
reread (load_fd, "get_load");
|
||||
|
||||
// Look for lines starting with "cpu0", "cpu1", etc.
|
||||
// Look for lines starting with "cpu0", "cpu1", etc.
|
||||
|
||||
token = strtok (buffer, "\n");
|
||||
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);
|
||||
|
||||
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;
|
||||
result[*numcpus].system = curr_load[*numcpus].system - last_load[*numcpus].system;
|
||||
result[*numcpus].idle = curr_load[*numcpus].idle - last_load[*numcpus].idle;
|
||||
last_load[*numcpus].total = curr_load[*numcpus].total;
|
||||
last_load[*numcpus].user = curr_load[*numcpus].user;
|
||||
last_load[*numcpus].nice = curr_load[*numcpus].nice;
|
||||
last_load[*numcpus].system = curr_load[*numcpus].system;
|
||||
last_load[*numcpus].idle = curr_load[*numcpus].idle;
|
||||
|
||||
(*numcpus)++;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
token = strtok (NULL, "\n");
|
||||
}
|
||||
token = strtok (buffer, "\n");
|
||||
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);
|
||||
|
||||
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;
|
||||
result[*numcpus].system = curr_load[*numcpus].system - last_load[*numcpus].system;
|
||||
result[*numcpus].idle = curr_load[*numcpus].idle - last_load[*numcpus].idle;
|
||||
last_load[*numcpus].total = curr_load[*numcpus].total;
|
||||
last_load[*numcpus].user = curr_load[*numcpus].user;
|
||||
last_load[*numcpus].nice = curr_load[*numcpus].nice;
|
||||
last_load[*numcpus].system = curr_load[*numcpus].system;
|
||||
last_load[*numcpus].idle = curr_load[*numcpus].idle;
|
||||
|
||||
(*numcpus)++;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
token = strtok (NULL, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cpu_smp_init()
|
||||
cpu_smp_init ()
|
||||
{
|
||||
if(!load_fd) {
|
||||
load_fd = open ("/proc/stat", O_RDONLY);
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (!load_fd) {
|
||||
load_fd = open ("/proc/stat", O_RDONLY);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
cpu_smp_close()
|
||||
cpu_smp_close ()
|
||||
{
|
||||
if (load_fd)
|
||||
close (load_fd);
|
||||
|
||||
load_fd = 0;
|
||||
|
||||
return 0;
|
||||
if (load_fd)
|
||||
close (load_fd);
|
||||
|
||||
load_fd = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -138,112 +133,110 @@ 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++) {
|
||||
graphsize[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);
|
||||
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);
|
||||
} else {
|
||||
sprintf (buf, "widget_set P %s_title 1 %d \"CPU%d[%s]\"\n", numnames[i], i+1, i, graphsize);
|
||||
}
|
||||
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);
|
||||
} else {
|
||||
sprintf (buf, "widget_set P %s_title 1 %d \"CPU%d[%s]\"\n", numnames[i], i + 1, i, graphsize);
|
||||
}
|
||||
sock_send_string (sock, buf);
|
||||
|
||||
sprintf (buf, "widget_add P %s_bar hbar\n", numnames[i]);
|
||||
sock_send_string (sock, buf);
|
||||
sprintf (buf, "widget_add P %s_bar hbar\n", numnames[i]);
|
||||
sock_send_string (sock, buf);
|
||||
}
|
||||
|
||||
free (graphsize);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
get_load(load, &numprocs);
|
||||
|
||||
for (z=0; z<numprocs; z++) {
|
||||
get_load (load, &numprocs);
|
||||
|
||||
// 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 (z = 0; z < numprocs; z++) {
|
||||
|
||||
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;
|
||||
// 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];
|
||||
|
||||
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;
|
||||
#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++)
|
||||
{
|
||||
value = 0;
|
||||
for(j=0; j<CPU_BUF_SIZE; j++)
|
||||
{
|
||||
value += cpu[z][j][i];
|
||||
}
|
||||
value /= CPU_BUF_SIZE;
|
||||
cpu[z][CPU_BUF_SIZE][i] = value;
|
||||
}
|
||||
// Average values for final result
|
||||
for (i = 4; i < 5; i++) {
|
||||
value = 0;
|
||||
for (j = 0; j < CPU_BUF_SIZE; j++) {
|
||||
value += cpu[z][j][i];
|
||||
}
|
||||
value /= CPU_BUF_SIZE;
|
||||
cpu[z][CPU_BUF_SIZE][i] = value;
|
||||
}
|
||||
|
||||
value = cpu[z][CPU_BUF_SIZE][4];
|
||||
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);
|
||||
} 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);
|
||||
}
|
||||
sock_send_string (sock, buf);
|
||||
|
||||
if (z+1 > lcd_hgt*2) break;
|
||||
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);
|
||||
} 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);
|
||||
}
|
||||
sock_send_string (sock, buf);
|
||||
|
||||
if (z + 1 > lcd_hgt * 2)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
} // End cpu_screen()
|
||||
} // End cpu_screen()
|
||||
|
||||
@@ -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
|
||||
|
||||
+133
-160
@@ -17,7 +17,7 @@
|
||||
#ifdef HAVE_SYS_MOUNT_H
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_VFS_H
|
||||
#ifdef HAVE_SYS_VFS_H
|
||||
#include <sys/vfs.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_STATVFS_H
|
||||
@@ -37,81 +37,79 @@
|
||||
FILE *mtab_fd;
|
||||
|
||||
|
||||
typedef struct mounts
|
||||
{
|
||||
char dev[256], type[64], mpoint[256];
|
||||
long bsize, blocks, bfree, files, ffree;
|
||||
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;
|
||||
struct statvfs fsinfo;
|
||||
#else
|
||||
struct statfs fsinfo;
|
||||
struct statfs fsinfo;
|
||||
#endif
|
||||
char line[256];
|
||||
int x = 0, y;
|
||||
|
||||
mtab_fd = fopen("/etc/mtab", "r");
|
||||
char line[256];
|
||||
int x = 0, y;
|
||||
|
||||
// Get rid of old, unmounted filesystems...
|
||||
memset(fs, 0, sizeof(mounts)*256);
|
||||
mtab_fd = fopen ("/etc/mtab", "r");
|
||||
|
||||
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);
|
||||
|
||||
if(strcmp(fs[x].type, "proc")
|
||||
// Get rid of old, unmounted filesystems...
|
||||
memset (fs, 0, sizeof (mounts) * 256);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
#elif STAT_STATFS2_BSIZE
|
||||
y = statfs(fs[x].mpoint, &fsinfo);
|
||||
y = statvfs (fs[x].mpoint, &fsinfo);
|
||||
#elif STAT_STATFS2_BSIZE
|
||||
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)
|
||||
{
|
||||
fs[x].bsize = fsinfo.f_bsize;
|
||||
fs[x].bfree = fsinfo.f_bfree;
|
||||
fs[x].files = fsinfo.f_files;
|
||||
fs[x].ffree = fsinfo.f_ffree;
|
||||
x++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fclose(mtab_fd);
|
||||
return x;
|
||||
fs[x].blocks = fsinfo.f_blocks;
|
||||
if (fs[x].blocks > 0) {
|
||||
fs[x].bsize = fsinfo.f_bsize;
|
||||
fs[x].bfree = fsinfo.f_bfree;
|
||||
fs[x].files = fsinfo.f_files;
|
||||
fs[x].ffree = fsinfo.f_ffree;
|
||||
x++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 mounts mnt[256];
|
||||
static int count = 0;
|
||||
|
||||
// Holds info to display (avoid recalculating it)
|
||||
struct disp
|
||||
{
|
||||
char dev[8];
|
||||
char cap[8];
|
||||
int full;
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
//table[i].full = (lcd.cellwid * 4)
|
||||
table[i].full = (huge)(lcd_cellwid * 4)
|
||||
* (huge)(mnt[i].blocks - mnt[i].bfree)
|
||||
/ (huge)mnt[i].blocks;
|
||||
memset (table, 0, sizeof (struct disp) * 256);
|
||||
|
||||
size = (huge)mnt[i].bsize * (huge)mnt[i].blocks;
|
||||
memset(table[i].cap, 0, 8);
|
||||
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);
|
||||
}
|
||||
|
||||
//table[i].full = (lcd.cellwid * 4)
|
||||
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);
|
||||
|
||||
// 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++)
|
||||
{
|
||||
if(table[i].dev[0] == 0) continue;
|
||||
if(i >= num_disks) // Make sure we have enough lines...
|
||||
for (i = 0; i < count; i++) {
|
||||
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 *****
|
||||
@@ -286,6 +260,5 @@ int disk_screen(int rep, int display)
|
||||
// /dos/c 2.1G E----F
|
||||
// /stuff 4.3G E----F
|
||||
*/
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+79
-85
@@ -12,33 +12,36 @@
|
||||
|
||||
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;
|
||||
double load;
|
||||
|
||||
reread(loadavg_fd, "get_load:");
|
||||
sscanf(buffer, "%lf", &load);
|
||||
return 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;
|
||||
|
||||
|
||||
return 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);
|
||||
|
||||
sock_send_string(sock, "screen_add X\n");
|
||||
sprintf(buffer, "screen_set X -name {X-Load: %s}\n", host);
|
||||
sock_send_string(sock, buffer);
|
||||
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);
|
||||
// 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;
|
||||
|
||||
for(n=0; n<lcd_wid-1; 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++) {
|
||||
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);
|
||||
}
|
||||
|
||||
if(loadmax < LOAD_MIN)
|
||||
{
|
||||
status = BACKLIGHT_OFF;
|
||||
}
|
||||
if(loadmax > LOAD_MIN)
|
||||
{
|
||||
status = BACKLIGHT_ON;
|
||||
}
|
||||
if(loads[lcd_wid-2] > LOAD_MAX)
|
||||
{
|
||||
status = BLINK_ON;
|
||||
sock_send_string (sock, tmp);
|
||||
}
|
||||
|
||||
if (loadmax < LOAD_MIN) {
|
||||
status = BACKLIGHT_OFF;
|
||||
}
|
||||
if (loadmax > LOAD_MIN) {
|
||||
status = BACKLIGHT_ON;
|
||||
}
|
||||
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()
|
||||
|
||||
|
||||
|
||||
} // End xload_screen()
|
||||
|
||||
@@ -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
|
||||
|
||||
+171
-202
@@ -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...
|
||||
// ... 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.
|
||||
{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.
|
||||
};
|
||||
|
||||
// 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,294 +86,265 @@ 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])
|
||||
{
|
||||
// s is for server
|
||||
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
|
||||
// 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));
|
||||
} // End if(strlen(argv == 1))
|
||||
else
|
||||
{
|
||||
memset (sequence + j, 0, sizeof (mode));
|
||||
} // End if(strlen(argv == 1))
|
||||
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.
|
||||
lcd_wid = 20;
|
||||
lcd_hgt = 4;
|
||||
lcd_cellwid = 5;
|
||||
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);
|
||||
Quit = 1;
|
||||
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];
|
||||
int argc, newtoken;
|
||||
int len;
|
||||
|
||||
|
||||
|
||||
|
||||
// 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...
|
||||
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;
|
||||
break;
|
||||
case '\n':
|
||||
buf[i] = 0;
|
||||
default:
|
||||
if(newtoken)
|
||||
{
|
||||
argv[argc] = buf+i;
|
||||
argc++;
|
||||
}
|
||||
newtoken = 0;
|
||||
break;
|
||||
switch (buf[i]) {
|
||||
case ' ':
|
||||
newtoken = 1;
|
||||
buf[i] = 0;
|
||||
break;
|
||||
case '\n':
|
||||
buf[i] = 0;
|
||||
default:
|
||||
if (newtoken) {
|
||||
argv[argc] = buf + i;
|
||||
argc++;
|
||||
}
|
||||
newtoken = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else // If we've got a zero, it's the end of a string...
|
||||
} else // If we've got a zero, it's the end of a string...
|
||||
{
|
||||
if(argc > 0)
|
||||
{
|
||||
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;
|
||||
for(j=0; hold || (j<sequence[i].num_times && !Quit); j++)
|
||||
@@ -442,5 +413,3 @@ void main_loop(mode *sequence)
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -13,12 +13,12 @@ extern int lcd_cellhgt;
|
||||
|
||||
|
||||
typedef struct mode {
|
||||
char which; // Which screen is it?
|
||||
int on_time; // How often to update while visible?
|
||||
int off_time; // How often to get stats while not visible?
|
||||
int show_invisible; // Send stats while not visible?
|
||||
int timer; // Time since last update
|
||||
int visible; // Can we be seen right now?
|
||||
char which; // Which screen is it?
|
||||
int on_time; // How often to update while visible?
|
||||
int off_time; // How often to get stats while not visible?
|
||||
int show_invisible; // Send stats while not visible?
|
||||
int timer; // Time since last update
|
||||
int visible; // Can we be seen right now?
|
||||
} mode;
|
||||
|
||||
|
||||
|
||||
+286
-323
@@ -15,44 +15,48 @@
|
||||
#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;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -60,407 +64,366 @@ 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;
|
||||
float value;
|
||||
|
||||
if(first)
|
||||
{
|
||||
first = 0;
|
||||
int n;
|
||||
struct meminfo mem[2];
|
||||
static int first = 1;
|
||||
static int which_title = 0;
|
||||
float value;
|
||||
|
||||
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 (first) {
|
||||
first = 0;
|
||||
|
||||
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");
|
||||
}
|
||||
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, "screen_add M\n");
|
||||
sprintf (buffer, "screen_set M -name {Memory & Swap: %s}\n", host);
|
||||
sock_send_string (sock, buffer);
|
||||
|
||||
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, "\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");
|
||||
}
|
||||
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 memgauge hbar\n");
|
||||
sock_send_string (sock, "widget_add M swapgauge hbar\n");
|
||||
|
||||
//sock_send_string(sock, "\n");
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
get_mem_info (mem);
|
||||
|
||||
|
||||
// Total memory
|
||||
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);
|
||||
|
||||
// Total swap
|
||||
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);
|
||||
// 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;
|
||||
|
||||
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
{
|
||||
// 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);
|
||||
// Total memory
|
||||
sprintf (tmp, "widget_set M memtotl 1 2 {%6dk}\n", mem[0].total);
|
||||
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);
|
||||
// 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);
|
||||
|
||||
// Total swap
|
||||
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);
|
||||
|
||||
|
||||
// Free memory graph
|
||||
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);
|
||||
// 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);
|
||||
|
||||
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);
|
||||
// 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 {
|
||||
// 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);
|
||||
|
||||
// Free swap graph
|
||||
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);
|
||||
|
||||
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);
|
||||
// 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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Free memory graph
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
// Free swap graph
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
|
||||
return 0;
|
||||
} // End mem_screen()
|
||||
}
|
||||
|
||||
|
||||
|
||||
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...
|
||||
int size, totl;
|
||||
int number;
|
||||
return 0;
|
||||
} // End mem_screen()
|
||||
|
||||
|
||||
|
||||
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...
|
||||
int size, totl;
|
||||
int number;
|
||||
} 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;
|
||||
|
||||
one = (proc_mem_info *)a;
|
||||
two = (proc_mem_info *)b;
|
||||
if (!a)
|
||||
return 0;
|
||||
if (!b)
|
||||
return 0;
|
||||
|
||||
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];
|
||||
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 ;
|
||||
//fprintf ( stderr , "mem_top_screen: cannot open %s for reading" ,
|
||||
// buf ) ;
|
||||
//perror ( "" ) ;
|
||||
continue;
|
||||
}
|
||||
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 ) )
|
||||
{
|
||||
/* VmSize: procSize kB */
|
||||
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 ) )
|
||||
{
|
||||
/* VmData: procData kB */
|
||||
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 ) )
|
||||
{
|
||||
/* VmExe: procExe kB */
|
||||
sscanf ( buf , "%*s %d" , &procExe ) ;
|
||||
}
|
||||
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)) {
|
||||
/* VmSize: procSize kB */
|
||||
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)) {
|
||||
/* VmData: procData kB */
|
||||
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)) {
|
||||
/* VmExe: procExe kB */
|
||||
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");
|
||||
goto end; // Ack! I hate goto's!
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
end: // Ack! I hate using labels!
|
||||
|
||||
|
||||
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()
|
||||
|
||||
} // End mem_top_screen()
|
||||
|
||||
@@ -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
|
||||
|
||||
+199
-188
@@ -30,205 +30,229 @@
|
||||
#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)
|
||||
{
|
||||
case 'g':
|
||||
case 'G': // cpu_graph_screen
|
||||
cpu_init();
|
||||
break;
|
||||
case 'c':
|
||||
case 'C': // cpu_screen
|
||||
cpu_init();
|
||||
break;
|
||||
case 'o':
|
||||
case 'O': // clock_screen
|
||||
chrono_init();
|
||||
break;
|
||||
case 'k':
|
||||
case 'K': // big_clock_screen
|
||||
chrono_init();
|
||||
break;
|
||||
case 'm':
|
||||
case 'M': // mem_screen
|
||||
mem_init();
|
||||
break;
|
||||
case 's':
|
||||
case 'S': // mem_info_screen
|
||||
mem_init();
|
||||
break;
|
||||
case 'u':
|
||||
case 'U': // uptime_screen
|
||||
chrono_init();
|
||||
break;
|
||||
case 't':
|
||||
case 'T': // time_screen
|
||||
chrono_init();
|
||||
break;
|
||||
case 'd':
|
||||
case 'D': // disk_screen
|
||||
disk_init();
|
||||
break;
|
||||
case 'x':
|
||||
case 'X': // xload_screen
|
||||
load_init();
|
||||
break;
|
||||
case 'b':
|
||||
case 'B': // battery_screen
|
||||
batt_init();
|
||||
break;
|
||||
case 'a':
|
||||
case 'A': // credit_screen
|
||||
break;
|
||||
case 'p':
|
||||
case 'P': // cpu_smp_screen
|
||||
cpu_smp_init ();
|
||||
break;
|
||||
default: break;
|
||||
for (i = 0; sequence[i].which > 1; i++) {
|
||||
switch (sequence[i].which) {
|
||||
case 'g':
|
||||
case 'G': // cpu_graph_screen
|
||||
cpu_init ();
|
||||
break;
|
||||
case 'c':
|
||||
case 'C': // cpu_screen
|
||||
cpu_init ();
|
||||
break;
|
||||
case 'o':
|
||||
case 'O': // clock_screen
|
||||
chrono_init ();
|
||||
break;
|
||||
case 'k':
|
||||
case 'K': // big_clock_screen
|
||||
chrono_init ();
|
||||
break;
|
||||
case 'm':
|
||||
case 'M': // mem_screen
|
||||
mem_init ();
|
||||
break;
|
||||
case 's':
|
||||
case 'S': // mem_info_screen
|
||||
mem_init ();
|
||||
break;
|
||||
case 'u':
|
||||
case 'U': // uptime_screen
|
||||
chrono_init ();
|
||||
break;
|
||||
case 't':
|
||||
case 'T': // time_screen
|
||||
chrono_init ();
|
||||
break;
|
||||
case 'd':
|
||||
case 'D': // disk_screen
|
||||
disk_init ();
|
||||
break;
|
||||
case 'x':
|
||||
case 'X': // xload_screen
|
||||
load_init ();
|
||||
break;
|
||||
case 'b':
|
||||
case 'B': // battery_screen
|
||||
batt_init ();
|
||||
break;
|
||||
case 'a':
|
||||
case 'A': // credit_screen
|
||||
break;
|
||||
case 'p':
|
||||
case 'P': // cpu_smp_screen
|
||||
cpu_smp_init ();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
case 'g':
|
||||
case 'G': status = cpu_graph_screen(m->timer, display); break;
|
||||
case 'c':
|
||||
case 'C': status = cpu_screen(m->timer, display); break;
|
||||
case 'o':
|
||||
case 'O': status = clock_screen(m->timer, display); break;
|
||||
case 'k':
|
||||
case 'K': status = big_clock_screen(m->timer, display); break;
|
||||
case 'm':
|
||||
case 'M': status = mem_screen(m->timer, display); break;
|
||||
case 's':
|
||||
case 'S': status = mem_top_screen(m->timer, display); break;
|
||||
case 'u':
|
||||
case 'U': status = uptime_screen(m->timer, display); break;
|
||||
case 't':
|
||||
case 'T': status = time_screen(m->timer, display); break;
|
||||
case 'd':
|
||||
case 'D': status = disk_screen(m->timer, display); break;
|
||||
case 'x':
|
||||
case 'X': status = xload_screen(m->timer, display); break;
|
||||
case 'b':
|
||||
case 'B': status = battery_screen(m->timer, display); break;
|
||||
case 'a':
|
||||
case 'A': status = credit_screen(m->timer, display); break;
|
||||
case 'p':
|
||||
case 'P': status = cpu_smp_screen (m->timer, display); break;
|
||||
default: break;
|
||||
|
||||
if (m) {
|
||||
switch (m->which) {
|
||||
case 'g':
|
||||
case 'G':
|
||||
status = cpu_graph_screen (m->timer, display);
|
||||
break;
|
||||
case 'c':
|
||||
case 'C':
|
||||
status = cpu_screen (m->timer, display);
|
||||
break;
|
||||
case 'o':
|
||||
case 'O':
|
||||
status = clock_screen (m->timer, display);
|
||||
break;
|
||||
case 'k':
|
||||
case 'K':
|
||||
status = big_clock_screen (m->timer, display);
|
||||
break;
|
||||
case 'm':
|
||||
case 'M':
|
||||
status = mem_screen (m->timer, display);
|
||||
break;
|
||||
case 's':
|
||||
case 'S':
|
||||
status = mem_top_screen (m->timer, display);
|
||||
break;
|
||||
case 'u':
|
||||
case 'U':
|
||||
status = uptime_screen (m->timer, display);
|
||||
break;
|
||||
case 't':
|
||||
case 'T':
|
||||
status = time_screen (m->timer, display);
|
||||
break;
|
||||
case 'd':
|
||||
case 'D':
|
||||
status = disk_screen (m->timer, display);
|
||||
break;
|
||||
case 'x':
|
||||
case 'X':
|
||||
status = xload_screen (m->timer, display);
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
status = battery_screen (m->timer, display);
|
||||
break;
|
||||
case 'a':
|
||||
case 'A':
|
||||
status = credit_screen (m->timer, display);
|
||||
break;
|
||||
case 'p':
|
||||
case 'P':
|
||||
status = cpu_smp_screen (m->timer, display);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Debugging tool...
|
||||
if(display)
|
||||
{
|
||||
printf("Displayed Mode %c\n", m->which);
|
||||
}
|
||||
*/
|
||||
if(display)
|
||||
{
|
||||
printf("Displayed Mode %c\n", m->which);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
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 )
|
||||
return;
|
||||
perror(errmsg);
|
||||
exit(1);
|
||||
if (lseek (f, 0L, 0) == 0 && read (f, buffer, sizeof (buffer) - 1) > 0)
|
||||
return;
|
||||
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);
|
||||
char *tail;
|
||||
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;
|
||||
}
|
||||
bufptr = strchr( bufptr, '\n');
|
||||
}
|
||||
return -1;
|
||||
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');
|
||||
}
|
||||
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()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} // End credit_screen()
|
||||
|
||||
@@ -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
|
||||
|
||||
+31
-33
@@ -19,71 +19,69 @@
|
||||
|
||||
|
||||
|
||||
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)
|
||||
d->menulist = LL_new();
|
||||
if(!d->menulist)
|
||||
{
|
||||
d->menulist = LL_new();
|
||||
if(!d->menulist)
|
||||
{
|
||||
fprintf(stderr, "client_data_init: Error allocating menulist\n");
|
||||
return -1;
|
||||
}
|
||||
*/
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
int client_data_destroy(client_data *d)
|
||||
int
|
||||
client_data_destroy (client_data * d)
|
||||
{
|
||||
screen *s;
|
||||
|
||||
debug("client_data_destroy\n");
|
||||
|
||||
if(!d) return -1;
|
||||
debug ("client_data_destroy\n");
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+10
-11
@@ -6,21 +6,20 @@
|
||||
|
||||
#define CLIENT_NAME_SIZE 256
|
||||
|
||||
typedef struct client_data
|
||||
{
|
||||
int ack;
|
||||
char *name;
|
||||
// and other stuff... doesn't matter yet
|
||||
LL * screenlist;
|
||||
// list of accepted keys... (?)
|
||||
LL * menulist;
|
||||
|
||||
typedef struct client_data {
|
||||
int ack;
|
||||
char *name;
|
||||
// and other stuff... doesn't matter yet
|
||||
LL *screenlist;
|
||||
// list of accepted keys... (?)
|
||||
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
|
||||
|
||||
+503
-599
File diff suppressed because it is too large
Load Diff
+22
-23
@@ -7,32 +7,31 @@
|
||||
point to a function to call, defined below.
|
||||
*/
|
||||
|
||||
typedef struct client_function
|
||||
{
|
||||
char *keyword;
|
||||
int (*function)(client *c, int argc, char **argv);
|
||||
typedef struct client_function {
|
||||
char *keyword;
|
||||
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[];
|
||||
|
||||
|
||||
+9
-11
@@ -8,19 +8,17 @@
|
||||
what the user does.
|
||||
*/
|
||||
|
||||
typedef struct client_menu
|
||||
{
|
||||
char id[];
|
||||
LL * items;
|
||||
typedef struct client_menu {
|
||||
char id[];
|
||||
LL *items;
|
||||
} client_menu;
|
||||
|
||||
typedef struct client_menu_item
|
||||
{
|
||||
char id[];
|
||||
int type; // Title, function, submenu, slider, checkbox, etc...
|
||||
int value; // Holds stuff like "true", 43, etc...
|
||||
char text[]; // Text to display here...
|
||||
char child[]; // For the "submenu" type
|
||||
typedef struct client_menu_item {
|
||||
char id[];
|
||||
int type; // Title, function, submenu, slider, checkbox, etc...
|
||||
int value; // Holds stuff like "true", 43, etc...
|
||||
char text[]; // Text to display here...
|
||||
char child[]; // For the "submenu" type
|
||||
} client_menu;
|
||||
|
||||
|
||||
|
||||
+107
-114
@@ -22,81 +22,72 @@
|
||||
|
||||
|
||||
|
||||
LL * clients;
|
||||
LL *clients;
|
||||
|
||||
// Initialize and kill client list...
|
||||
int client_init()
|
||||
int
|
||||
client_init ()
|
||||
{
|
||||
debug("client_init()\n");
|
||||
|
||||
clients = LL_new();
|
||||
if(!clients)
|
||||
{
|
||||
fprintf(stderr, "client_init: Unable to create client list\n");
|
||||
debug ("client_init()\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);
|
||||
|
||||
debug("client_shutdown: done\n");
|
||||
LL_Destroy (clients);
|
||||
|
||||
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,75 +97,72 @@ 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");
|
||||
|
||||
if(!c) return -1;
|
||||
debug ("client_destroy()\n");
|
||||
|
||||
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?
|
||||
if(c->sock) close(c->sock);
|
||||
c->sock = 0;
|
||||
*/
|
||||
|
||||
|
||||
// Remove the client from the clients list...
|
||||
LL_Remove(clients, c);
|
||||
|
||||
free(c);
|
||||
LL_Remove (clients, 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;
|
||||
@@ -183,59 +171,64 @@ int client_add_message(client *c, char *message)
|
||||
// int len;
|
||||
|
||||
//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;
|
||||
|
||||
str = (char *)LL_Dequeue(c->messages);
|
||||
if (!c)
|
||||
return NULL;
|
||||
|
||||
str = (char *) LL_Dequeue (c->messages);
|
||||
|
||||
//debug("client_get_message: \"%s\"\n", str);
|
||||
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
// debug("client_find_sock: ..! %i !..\n", c->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;
|
||||
}
|
||||
|
||||
+14
-15
@@ -4,37 +4,36 @@
|
||||
#include "client_data.h"
|
||||
#include "../shared/LL.h"
|
||||
|
||||
typedef struct client
|
||||
{
|
||||
int sock;
|
||||
LL *messages;
|
||||
client_data *data;
|
||||
|
||||
typedef struct client {
|
||||
int sock;
|
||||
LL *messages;
|
||||
client_data *data;
|
||||
|
||||
} client;
|
||||
|
||||
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
|
||||
|
||||
+462
-481
File diff suppressed because it is too large
Load Diff
+16
-16
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
+706
-653
File diff suppressed because it is too large
Load Diff
+22
-22
@@ -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
|
||||
|
||||
+142
-134
@@ -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,85 +34,65 @@ 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;
|
||||
|
||||
|
||||
argc = get_args(argv, args, 64);
|
||||
int i, j;
|
||||
|
||||
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]);
|
||||
|
||||
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]);
|
||||
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]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
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...
|
||||
// Override output functions...
|
||||
driver->clear = curses_drv_clear;
|
||||
driver->string = curses_drv_string;
|
||||
driver->chr = curses_drv_chr;
|
||||
@@ -122,7 +102,7 @@ int curses_drv_init(struct lcd_logical_driver *driver, char *args)
|
||||
driver->init_hbar = NULL;
|
||||
driver->num = curses_drv_num;
|
||||
driver->init_num = curses_drv_init_num;
|
||||
|
||||
|
||||
driver->init = curses_drv_init;
|
||||
driver->close = curses_drv_close;
|
||||
driver->flush = curses_drv_flush;
|
||||
@@ -139,29 +119,31 @@ int curses_drv_init(struct lcd_logical_driver *driver, char *args)
|
||||
PAD = '#';
|
||||
// Change the character used for "..."
|
||||
ELLIPSIS = '~';
|
||||
|
||||
return 200; // 200 is arbitrary. (must be 1 or more)
|
||||
|
||||
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,100 +151,111 @@ 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;
|
||||
}
|
||||
|
||||
// move(4-len/lcd.cellhgt, x-1);
|
||||
// vline(0, len/lcd.cellhgt);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// move(y-1, x-1);
|
||||
// hline(0, len/lcd.cellwid);
|
||||
}
|
||||
@@ -271,56 +264,71 @@ 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// 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();
|
||||
|
||||
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;
|
||||
|
||||
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 != ERR)
|
||||
return i;
|
||||
else
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
+15
-15
@@ -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
|
||||
|
||||
+159
-148
@@ -18,88 +18,93 @@
|
||||
// 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);
|
||||
|
||||
if(!driver->framebuf)
|
||||
{
|
||||
printf("Allocating frame buffer (%ix%i)\n", lcd.wid, lcd.hgt);
|
||||
driver->framebuf = malloc(lcd.wid * lcd.hgt);
|
||||
}
|
||||
|
||||
printf ("debug_init(%s)\n", device);
|
||||
|
||||
if(!driver->framebuf)
|
||||
{
|
||||
debug_close();
|
||||
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 ();
|
||||
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;
|
||||
driver->chr = debug_chr;
|
||||
driver->vbar = debug_vbar;
|
||||
driver->hbar = debug_hbar;
|
||||
driver->init_num = debug_init_num;
|
||||
driver->num = debug_num;
|
||||
|
||||
driver->init = debug_init;
|
||||
driver->close = debug_close;
|
||||
driver->flush = debug_flush;
|
||||
driver->flush_box = debug_flush_box;
|
||||
driver->contrast = debug_contrast;
|
||||
driver->backlight = debug_backlight;
|
||||
driver->set_char = debug_set_char;
|
||||
driver->icon = debug_icon;
|
||||
driver->init_vbar = debug_init_vbar;
|
||||
driver->init_hbar = debug_init_hbar;
|
||||
driver->draw_frame = debug_draw_frame;
|
||||
driver->clear = debug_clear;
|
||||
driver->string = debug_string;
|
||||
driver->chr = debug_chr;
|
||||
driver->vbar = debug_vbar;
|
||||
driver->hbar = debug_hbar;
|
||||
driver->init_num = debug_init_num;
|
||||
driver->num = debug_num;
|
||||
|
||||
driver->getkey = debug_getkey;
|
||||
|
||||
|
||||
return 200; // 200 is arbitrary. (must be 1 or more)
|
||||
driver->init = debug_init;
|
||||
driver->close = debug_close;
|
||||
driver->flush = debug_flush;
|
||||
driver->flush_box = debug_flush_box;
|
||||
driver->contrast = debug_contrast;
|
||||
driver->backlight = debug_backlight;
|
||||
driver->set_char = debug_set_char;
|
||||
driver->icon = debug_icon;
|
||||
driver->init_vbar = debug_init_vbar;
|
||||
driver->init_hbar = debug_init_hbar;
|
||||
driver->draw_frame = debug_draw_frame;
|
||||
|
||||
driver->getkey = debug_getkey;
|
||||
|
||||
|
||||
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);
|
||||
driver->framebuf = NULL;
|
||||
if (driver->framebuf)
|
||||
printf ("Frame buffer: %i\n", (int) driver->framebuf);
|
||||
driver->framebuf = NULL;
|
||||
// printf("debug_close() finished\n");
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// Clears the LCD screen
|
||||
//
|
||||
void debug_clear()
|
||||
void
|
||||
debug_clear ()
|
||||
{
|
||||
printf("clear()\n");
|
||||
|
||||
memset(driver->framebuf, ' ', lcd.wid*lcd.hgt);
|
||||
|
||||
printf ("clear()\n");
|
||||
|
||||
memset (driver->framebuf, ' ', lcd.wid * lcd.hgt);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Flushes all output to the lcd...
|
||||
//
|
||||
void debug_flush()
|
||||
void
|
||||
debug_flush ()
|
||||
{
|
||||
printf("flush()\n");
|
||||
|
||||
lcd.draw_frame();
|
||||
printf ("flush()\n");
|
||||
|
||||
lcd.draw_frame ();
|
||||
}
|
||||
|
||||
|
||||
@@ -107,182 +112,188 @@ 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;
|
||||
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];
|
||||
}
|
||||
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
|
||||
y--;
|
||||
x--;
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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);
|
||||
|
||||
|
||||
for(; x<lcd.wid && len>0; x++)
|
||||
{
|
||||
debug_chr(x,y,'-');
|
||||
|
||||
printf ("Hbar(%i, %i, %i)\n", x, y, len);
|
||||
|
||||
|
||||
for (; x < lcd.wid && len > 0; x++) {
|
||||
debug_chr (x, y, '-');
|
||||
|
||||
len -= lcd.cellwid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
int i, j;
|
||||
|
||||
char out[LCD_MAX_WIDTH];
|
||||
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);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
for(i=0; i<lcd.wid; i++)
|
||||
{
|
||||
printf ("|%s|\n", out);
|
||||
|
||||
}
|
||||
|
||||
for (i = 0; i < lcd.wid; i++) {
|
||||
out[i] = '-';
|
||||
}
|
||||
out[lcd.wid] = 0;
|
||||
printf("+%s+\n", out);
|
||||
}
|
||||
out[lcd.wid] = 0;
|
||||
printf ("+%s+\n", out);
|
||||
|
||||
}
|
||||
|
||||
|
||||
char debug_getkey()
|
||||
char
|
||||
debug_getkey ()
|
||||
{
|
||||
printf("Trying to grab keypress.\n");
|
||||
return 0;
|
||||
printf ("Trying to grab keypress.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
+19
-19
@@ -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
|
||||
|
||||
+115
-99
@@ -22,57 +22,57 @@ 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");
|
||||
|
||||
drv_base = driver;
|
||||
|
||||
driver->wid = 20;
|
||||
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);
|
||||
driver->wid = 20;
|
||||
driver->hgt = 4;
|
||||
|
||||
if(!driver->framebuf)
|
||||
{
|
||||
drv_base_close();
|
||||
// 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) {
|
||||
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;
|
||||
driver->cellhgt = 8;
|
||||
|
||||
driver->clear = drv_base_clear;
|
||||
driver->string = drv_base_string;
|
||||
driver->chr = drv_base_chr;
|
||||
driver->vbar = drv_base_vbar;
|
||||
driver->init_vbar = drv_base_init_vbar;
|
||||
driver->hbar = drv_base_hbar;
|
||||
driver->init_hbar = drv_base_init_hbar;
|
||||
driver->num = drv_base_num;
|
||||
driver->init_num = drv_base_init_num;
|
||||
|
||||
driver->init = drv_base_init;
|
||||
driver->close = drv_base_close;
|
||||
driver->flush = drv_base_flush;
|
||||
driver->flush_box = drv_base_flush_box;
|
||||
driver->contrast = drv_base_contrast;
|
||||
driver->backlight = drv_base_backlight;
|
||||
driver->set_char = drv_base_set_char;
|
||||
driver->icon = drv_base_icon;
|
||||
driver->draw_frame = drv_base_draw_frame;
|
||||
driver->cellwid = 5;
|
||||
driver->cellhgt = 8;
|
||||
|
||||
driver->getkey = drv_base_getkey;
|
||||
|
||||
|
||||
return 200; // 200 is arbitrary. (must be 1 or more)
|
||||
driver->clear = drv_base_clear;
|
||||
driver->string = drv_base_string;
|
||||
driver->chr = drv_base_chr;
|
||||
driver->vbar = drv_base_vbar;
|
||||
driver->init_vbar = drv_base_init_vbar;
|
||||
driver->hbar = drv_base_hbar;
|
||||
driver->init_hbar = drv_base_init_hbar;
|
||||
driver->num = drv_base_num;
|
||||
driver->init_num = drv_base_init_num;
|
||||
|
||||
driver->init = drv_base_init;
|
||||
driver->close = drv_base_close;
|
||||
driver->flush = drv_base_flush;
|
||||
driver->flush_box = drv_base_flush_box;
|
||||
driver->contrast = drv_base_contrast;
|
||||
driver->backlight = drv_base_backlight;
|
||||
driver->set_char = drv_base_set_char;
|
||||
driver->icon = drv_base_icon;
|
||||
driver->draw_frame = drv_base_draw_frame;
|
||||
|
||||
driver->getkey = drv_base_getkey;
|
||||
|
||||
|
||||
return 200; // 200 is arbitrary. (must be 1 or more)
|
||||
}
|
||||
|
||||
|
||||
@@ -80,27 +80,31 @@ 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;
|
||||
lcd.framebuf = NULL;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Flushes all output to the lcd...
|
||||
//
|
||||
void drv_base_flush()
|
||||
void
|
||||
drv_base_flush ()
|
||||
{
|
||||
//lcd.draw_frame(lcd.framebuf);
|
||||
}
|
||||
@@ -110,31 +114,33 @@ 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;
|
||||
int i;
|
||||
|
||||
x -= 1; // Convert 1-based coords to 0-based...
|
||||
y -= 1;
|
||||
|
||||
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];
|
||||
}
|
||||
x -= 1; // Convert 1-based coords to 0-based...
|
||||
y -= 1;
|
||||
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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--;
|
||||
y--;
|
||||
x--;
|
||||
|
||||
lcd.framebuf[(y*lcd.wid) + x] = c;
|
||||
lcd.framebuf[(y * lcd.wid) + x] = c;
|
||||
}
|
||||
|
||||
|
||||
@@ -142,33 +148,36 @@ 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;
|
||||
return -1;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Turns the lcd backlight on or off...
|
||||
//
|
||||
void drv_base_backlight(int on)
|
||||
void
|
||||
drv_base_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");
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// 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,37 +221,38 @@ 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, '|');
|
||||
int y;
|
||||
for (y = lcd.hgt; y > 0 && len > 0; y--) {
|
||||
drv_base_chr (x, y, '|');
|
||||
|
||||
len -= lcd.cellhgt;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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,10 +264,11 @@ 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;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+20
-20
@@ -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
|
||||
|
||||
+100
-107
@@ -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,136 +59,131 @@ 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];
|
||||
int argc;
|
||||
int i;
|
||||
int displayID = EN1 | EN2;
|
||||
// TODO: remove magic numbers below
|
||||
char *argv[64];
|
||||
int argc;
|
||||
int i;
|
||||
int displayID = EN1 | EN2;
|
||||
|
||||
lptPort = port;
|
||||
lptPort = port;
|
||||
|
||||
hd44780_functions->senddata = lcdstat_HD44780_senddata;
|
||||
hd44780_functions->senddata = lcdstat_HD44780_senddata;
|
||||
|
||||
// parse command-line arguments
|
||||
argc = get_args(argv, args, 64);
|
||||
// parse command-line arguments
|
||||
argc = get_args (argv, args, 64);
|
||||
|
||||
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));
|
||||
return -1;
|
||||
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));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// powerup the lcd now
|
||||
if (extIF)
|
||||
{
|
||||
displayID |= EN3;
|
||||
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);
|
||||
// powerup the lcd now
|
||||
if (extIF) {
|
||||
displayID |= EN3;
|
||||
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(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 (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(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 (100);
|
||||
|
||||
// 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 | 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);
|
||||
|
||||
common_init(IF_4bit);
|
||||
return 0;
|
||||
// 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);
|
||||
|
||||
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
|
||||
unsigned char l = ch & 0x0f;
|
||||
unsigned char dispID = 0, flags = 0;
|
||||
unsigned char h = (ch >> 4) & 0x0f; // high and low nibbles
|
||||
unsigned char l = ch & 0x0f;
|
||||
|
||||
if (iflags == RS_INSTR)
|
||||
flags = 0;
|
||||
else //if (iflags == RS_DATA)
|
||||
flags = RS;
|
||||
if (iflags == RS_INSTR)
|
||||
flags = 0;
|
||||
else //if (iflags == RS_DATA)
|
||||
flags = RS;
|
||||
|
||||
if (displayID <= 3)
|
||||
{
|
||||
if (displayID == 0)
|
||||
dispID = EnMask[0] | EnMask[1] | EnMask[2];
|
||||
else
|
||||
dispID = EnMask[displayID - 1];
|
||||
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 (displayID == 0)
|
||||
dispID = EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6];
|
||||
else
|
||||
dispID = EnMask[(displayID - 1) % EnMaskSize];
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -18,36 +18,30 @@
|
||||
// add new connection type header files here
|
||||
|
||||
enum connectionType { HD_4bit, HD_8bit, HD_serialLpt, HD_winamp,
|
||||
// add new connection types here
|
||||
// add new connection types here
|
||||
|
||||
HD_unknown };
|
||||
HD_unknown
|
||||
};
|
||||
|
||||
static struct ConnectionMapping
|
||||
{
|
||||
enum connectionType type;
|
||||
char *connectionTypeStr;
|
||||
int (*init_fn)(HD44780_functions *hd44780_functions,
|
||||
lcd_logical_driver *driver,
|
||||
char *args,
|
||||
unsigned int port);
|
||||
const char *helpMsg;
|
||||
static struct ConnectionMapping {
|
||||
enum connectionType type;
|
||||
char *connectionTypeStr;
|
||||
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" },
|
||||
// add new connection types and their string specifier here
|
||||
|
||||
// default, end of structure element (do not delete)
|
||||
{ HD_unknown, "", NULL, "" }
|
||||
// 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"},
|
||||
// add new connection types and their string specifier here
|
||||
// default, end of structure element (do not delete)
|
||||
{
|
||||
HD_unknown, "", NULL, ""}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -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,48 +60,45 @@ 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();
|
||||
lptPort = port;
|
||||
semid = sem_get ();
|
||||
|
||||
hd44780_functions->senddata = lcdtime_HD44780_senddata;
|
||||
hd44780_functions->senddata = lcdtime_HD44780_senddata;
|
||||
|
||||
if ((ioperm(port + 2, 1, 255)) == -1) {
|
||||
fprintf(stderr, "HD44780_init: failed (%s)\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if ((ioperm (port + 2, 1, 255)) == -1) {
|
||||
fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
common_init(IF_8bit);
|
||||
return 0;
|
||||
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;
|
||||
unsigned char dispID = 0, portControl;
|
||||
|
||||
if (displayID == 1)
|
||||
dispID |= EN1;
|
||||
else //if (displayID == 0)
|
||||
dispID |= EN1;
|
||||
if (displayID == 1)
|
||||
dispID |= EN1;
|
||||
else //if (displayID == 0)
|
||||
dispID |= EN1;
|
||||
|
||||
if (flags == RS_DATA)
|
||||
portControl = CHAR;
|
||||
else
|
||||
portControl = CTRL;
|
||||
if (flags == RS_DATA)
|
||||
portControl = CHAR;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -6,29 +6,28 @@
|
||||
|
||||
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
|
||||
{
|
||||
// microsec pauses
|
||||
void (*uPause)(int microSecondsTenths);
|
||||
typedef struct hwDependentFns {
|
||||
// microsec pauses
|
||||
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);
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
// 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);
|
||||
|
||||
// toggle vertical autoscroll on all displays
|
||||
// on - non-zero turns autoscroll on, zero value turns it off
|
||||
void (*autoscroll)(int on);
|
||||
} HD44780_functions; /* for want of a better name :-) */
|
||||
// toggle vertical autoscroll on all displays
|
||||
// on - non-zero turns autoscroll on, zero value turns it off
|
||||
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
|
||||
|
||||
@@ -76,11 +75,11 @@ extern HD44780_functions *hd44780_functions;
|
||||
|
||||
// Parallel port pin definitions
|
||||
// Output lines
|
||||
#define nSTRB 0x01 /* negative logic */
|
||||
#define nSTRB 0x01 /* negative logic */
|
||||
#define STRB 0x01
|
||||
#define nLF 0x02
|
||||
#define LF 0x02
|
||||
#define INIT 0x04 /* the only positive logic output line */
|
||||
#define INIT 0x04 /* the only positive logic output line */
|
||||
#define nSEL 0x08
|
||||
#define SEL 0x08
|
||||
|
||||
@@ -98,5 +97,3 @@ extern HD44780_functions *hd44780_functions;
|
||||
#define INMASK 0x48
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -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,127 +45,118 @@ 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;
|
||||
int displayID = EN1 | EN2;
|
||||
|
||||
lp = port;
|
||||
lp = port;
|
||||
|
||||
hd44780_functions->senddata = lcdserLpt_HD44780_senddata;
|
||||
hd44780_functions->senddata = lcdserLpt_HD44780_senddata;
|
||||
|
||||
// TODO: enable keypad only if specified on command line
|
||||
driver->getkey = lcdserLpt_HD44780_getkey;
|
||||
// TODO: enable keypad only if specified on command line
|
||||
driver->getkey = lcdserLpt_HD44780_getkey;
|
||||
|
||||
// setup the lcd in 4 bit mode
|
||||
shiftreg(displayID,3);
|
||||
hd44780_functions->uPause(4100);
|
||||
// setup the lcd in 4 bit mode
|
||||
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);
|
||||
// clear
|
||||
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);
|
||||
// set display type functions
|
||||
lcdserLpt_HD44780_senddata (0, RS_INSTR, FUNCSET | IF_4BIT | TWOLINE | SMALLCHAR);
|
||||
// clear
|
||||
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);
|
||||
|
||||
return 0;
|
||||
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;
|
||||
else if (displayID == 2)
|
||||
dispID |= EN2;
|
||||
else
|
||||
dispID |= EN1 | EN2;
|
||||
if (displayID == 1)
|
||||
dispID |= EN1;
|
||||
else if (displayID == 2)
|
||||
dispID |= EN2;
|
||||
else
|
||||
dispID |= EN1 | EN2;
|
||||
|
||||
if (flags == RS_DATA)
|
||||
portControl = RS;
|
||||
else
|
||||
portControl = 0;
|
||||
if (flags == RS_DATA)
|
||||
portControl = RS;
|
||||
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 */
|
||||
/* 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";
|
||||
int n;
|
||||
// TODO: a keypad scan that does not use shift register
|
||||
// define a key table
|
||||
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)
|
||||
{ //else
|
||||
//start walking a single zero across the eight lines
|
||||
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 (lastkey==keytr[n])
|
||||
return(0);
|
||||
// printf("key is %c %d\n",keytr[n],n);
|
||||
lastkey=keytr[n];
|
||||
return(keytr[n]); //return correct key code.
|
||||
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);
|
||||
|
||||
if ((port_in (lp + 1) & 32) == 0) // check if line back is low if yes debounce
|
||||
{
|
||||
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.
|
||||
}
|
||||
}
|
||||
}
|
||||
} //else fall out and return(0) [too transient a keypress]
|
||||
lastkey=0;
|
||||
return(0);
|
||||
} //else fall out and return(0) [too transient a keypress]
|
||||
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 */
|
||||
}
|
||||
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 */
|
||||
}
|
||||
}
|
||||
|
||||
// displayID = value on parallel port to toggle the correct display
|
||||
void shiftreg (unsigned char displayID, unsigned char r)
|
||||
{
|
||||
rawshift(r);
|
||||
port_out(lp,displayID); //latch it, to correct display
|
||||
port_out(lp,0);
|
||||
void
|
||||
shiftreg (unsigned char displayID, unsigned char r)
|
||||
{
|
||||
rawshift (r);
|
||||
port_out (lp, displayID); //latch it, to correct display
|
||||
port_out (lp, 0);
|
||||
}
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
#ifndef HD_SERIALLPT_H
|
||||
#define HD_SERIALLPT_H
|
||||
|
||||
#include "lcd.h" /* for lcd_logical_driver */
|
||||
#include "hd44780-low.h" /* for HD44780_functions */
|
||||
#include "lcd.h" /* for lcd_logical_driver */
|
||||
#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
|
||||
|
||||
@@ -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,64 +44,59 @@ 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];
|
||||
int argc;
|
||||
int i;
|
||||
|
||||
hd44780_functions->senddata = lcdwinamp_HD44780_senddata;
|
||||
lptPort = port;
|
||||
char *argv[64];
|
||||
int argc;
|
||||
int i;
|
||||
|
||||
// parse command-line arguments
|
||||
argc = get_args(argv, args, 64);
|
||||
hd44780_functions->senddata = lcdwinamp_HD44780_senddata;
|
||||
lptPort = port;
|
||||
|
||||
for (i = 0; i < argc; ++i)
|
||||
if (strcmp(argv[i], "-e") == 0 ||
|
||||
strcmp(argv[i], "--extended") == 0)
|
||||
extIF = 1;
|
||||
// parse command-line arguments
|
||||
argc = get_args (argv, args, 64);
|
||||
|
||||
if ((ioperm(lptPort + 2, 1, 255)) == -1) {
|
||||
fprintf(stderr, "HD44780_init: failed (%s)\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
for (i = 0; i < argc; ++i)
|
||||
if (strcmp (argv[i], "-e") == 0 || strcmp (argv[i], "--extended") == 0)
|
||||
extIF = 1;
|
||||
|
||||
common_init(IF_8bit);
|
||||
return 0;
|
||||
if ((ioperm (lptPort + 2, 1, 255)) == -1) {
|
||||
fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
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;
|
||||
unsigned char dispID = 0, portControl;
|
||||
|
||||
if (flags == RS_DATA)
|
||||
portControl = RS;
|
||||
else
|
||||
portControl = 0;
|
||||
if (flags == RS_DATA)
|
||||
portControl = RS;
|
||||
else
|
||||
portControl = 0;
|
||||
|
||||
if (displayID == 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);
|
||||
if (displayID == 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+508
-561
File diff suppressed because it is too large
Load Diff
@@ -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();
|
||||
|
||||
+97
-109
@@ -32,34 +32,34 @@
|
||||
char *progname = "irmanin";
|
||||
|
||||
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
|
||||
/* 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
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
portname = ir_default_portname();
|
||||
if(portname==NULL){
|
||||
if(ptrdevice==NULL){
|
||||
portname=ptrdevice;
|
||||
}else{
|
||||
fprintf(stderr, "error no device defined\n");
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
driver->getkey = irmanin_getkey;
|
||||
driver->close = irmanin_close;
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
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(portname) < 0) {
|
||||
fprintf(stderr, "%s: error initialising Irman: `%s'\n", strerror(errno), portname);
|
||||
exit(1);
|
||||
errno = 0;
|
||||
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)
|
||||
return 1; // 200 is arbitrary. (must be 1 or more)
|
||||
}
|
||||
|
||||
|
||||
void irmanin_close()
|
||||
void
|
||||
irmanin_close ()
|
||||
{
|
||||
if(irmanin->framebuf != NULL) free(irmanin->framebuf);
|
||||
|
||||
irmanin->framebuf = NULL;
|
||||
if (irmanin->framebuf != NULL)
|
||||
free (irmanin->framebuf);
|
||||
|
||||
ir_free_commands();
|
||||
ir_finish();
|
||||
irmanin->framebuf = NULL;
|
||||
|
||||
ir_free_commands ();
|
||||
ir_finish ();
|
||||
}
|
||||
|
||||
|
||||
@@ -194,25 +181,26 @@ void irmanin_close()
|
||||
//
|
||||
// Return 0 for "nothing available".
|
||||
//
|
||||
char irmanin_getkey()
|
||||
char
|
||||
irmanin_getkey ()
|
||||
{
|
||||
int i;
|
||||
int cmd;
|
||||
char key;
|
||||
int i;
|
||||
int cmd;
|
||||
char key;
|
||||
|
||||
key=(char)0;
|
||||
switch (cmd=ir_poll_command()) {
|
||||
case IR_CMD_ERROR:
|
||||
fprintf(stderr, "%s: error reading command: %s\n", progname, strerror(errno));
|
||||
key = (char) 0;
|
||||
switch (cmd = ir_poll_command ()) {
|
||||
case IR_CMD_ERROR:
|
||||
fprintf (stderr, "%s: error reading command: %s\n", progname, strerror (errno));
|
||||
break;
|
||||
case IR_CMD_UNKNOWN:
|
||||
case IR_CMD_UNKNOWN:
|
||||
break;
|
||||
default:
|
||||
key=(char)('A'-1+cmd);
|
||||
default:
|
||||
key = (char) ('A' - 1 + cmd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return key;
|
||||
return key;
|
||||
}
|
||||
|
||||
/* end of irmanin.c */
|
||||
|
||||
@@ -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
|
||||
|
||||
+85
-102
@@ -46,125 +46,105 @@ int *button;
|
||||
|
||||
|
||||
// Configured for a Gravis Gamepad (2 axis, 4 button)
|
||||
char *axismap = "EFGHIJKLMNOPQRST";
|
||||
char *axismap = "EFGHIJKLMNOPQRST";
|
||||
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];
|
||||
int argc, i, j;
|
||||
|
||||
|
||||
joy = driver;
|
||||
|
||||
|
||||
strcpy(device, "/dev/js0");
|
||||
|
||||
argc = get_args(argv, args, 64);
|
||||
strcpy (device, "/dev/js0");
|
||||
|
||||
for(i=0; i<argc; i++)
|
||||
{
|
||||
argc = get_args (argv, args, 64);
|
||||
|
||||
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]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
driver->getkey = joy_getkey;
|
||||
driver->close = joy_close;
|
||||
|
||||
|
||||
/* FIXME: This crashes!
|
||||
if(args)
|
||||
{
|
||||
if(args)
|
||||
{
|
||||
if(strlen(args) > 0)
|
||||
strcpy(device, args);
|
||||
}
|
||||
*/
|
||||
|
||||
strcpy(device, args);
|
||||
}
|
||||
*/
|
||||
|
||||
fd = open (device, O_RDONLY);
|
||||
fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
fcntl (fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
if(fd < 0) return -1;
|
||||
|
||||
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);
|
||||
|
||||
axis = calloc(axes, sizeof(int));
|
||||
button = calloc(buttons, sizeof(char));
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
return fd; // 200 is arbitrary. (must be 1 or more)
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
joy->framebuf = NULL;
|
||||
if (joy->framebuf != NULL)
|
||||
free (joy->framebuf);
|
||||
close (fd);
|
||||
|
||||
joy->framebuf = NULL;
|
||||
|
||||
// Why do I have so much trouble getting memory freed without segfaults??
|
||||
//if(axis) free(axis);
|
||||
//if(button) free(button);
|
||||
|
||||
// Why do I have so much trouble getting memory freed without segfaults??
|
||||
//if(axis) free(axis);
|
||||
//if(button) free(button);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -173,46 +153,49 @@ 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) {
|
||||
case JS_EVENT_BUTTON:
|
||||
button[js.number] = js.value;
|
||||
break;
|
||||
case JS_EVENT_AXIS:
|
||||
axis[js.number] = js.value;
|
||||
break;
|
||||
|
||||
switch (js.type & ~JS_EVENT_INIT) {
|
||||
case JS_EVENT_BUTTON:
|
||||
button[js.number] = js.value;
|
||||
break;
|
||||
case JS_EVENT_AXIS:
|
||||
axis[js.number] = js.value;
|
||||
break;
|
||||
}
|
||||
|
||||
if (buttons) {
|
||||
//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)];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+338
-364
@@ -61,41 +61,40 @@
|
||||
|
||||
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,},
|
||||
|
||||
};
|
||||
|
||||
LL *list;
|
||||
@@ -103,92 +102,90 @@ 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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
lcd_drv_init(NULL, NULL);
|
||||
|
||||
err = lcd_add_driver("base", args);
|
||||
list = LL_new ();
|
||||
if (!list) {
|
||||
printf ("Error allocating driver list.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
lcd.wid = 20;
|
||||
lcd.hgt = 4;
|
||||
lcd_drv_init (NULL, NULL);
|
||||
|
||||
return err;
|
||||
|
||||
/*
|
||||
drv_base_init(args);
|
||||
err = lcd_add_driver ("base", args);
|
||||
|
||||
for(i=0; drivers[i].name; i++)
|
||||
{
|
||||
if(!strcmp(driver, drivers[i].name))
|
||||
{
|
||||
lcd.wid = 20;
|
||||
lcd.hgt = 4;
|
||||
|
||||
return err;
|
||||
|
||||
/*
|
||||
drv_base_init(args);
|
||||
|
||||
for(i=0; drivers[i].name; i++)
|
||||
{
|
||||
if(!strcmp(driver, drivers[i].name))
|
||||
{
|
||||
return drivers[i].init(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("Invalid driver: %s\n", driver);
|
||||
return -1;
|
||||
*/
|
||||
|
||||
printf("Invalid driver: %s\n", driver);
|
||||
return -1;
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 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);
|
||||
// printf("LCD driver info:\n\twid: %i\thgt: %i\n",
|
||||
// add->wid, add->hgt);
|
||||
|
||||
if(!add->framebuf)
|
||||
{
|
||||
printf("Couldn't allocate framebuffer for driver \"%s\".\n",
|
||||
driver);
|
||||
free(add);
|
||||
add->framebuf = malloc (add->wid * add->hgt);
|
||||
|
||||
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);
|
||||
|
||||
return drivers[i].init(add, args);
|
||||
|
||||
LL_Push (list, (void *) add);
|
||||
|
||||
return drivers[i].init (add, args);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,49 +193,47 @@ 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");
|
||||
|
||||
lcd.wid = LCD_MAX_WID;
|
||||
lcd.hgt = LCD_MAX_HGT;
|
||||
|
||||
lcd.framebuf = NULL;
|
||||
lcd.wid = LCD_MAX_WID;
|
||||
lcd.hgt = LCD_MAX_HGT;
|
||||
|
||||
lcd.framebuf = NULL;
|
||||
/*
|
||||
if(!lcd.framebuf)
|
||||
lcd.framebuf = malloc(lcd.wid * lcd.hgt);
|
||||
@@ -253,35 +248,35 @@ int lcd_drv_init(struct lcd_logical_driver *driver, char *args)
|
||||
// Debugging...
|
||||
// if(lcd.framebuf) printf("Frame buffer: %i\n", (int)lcd.framebuf);
|
||||
|
||||
lcd.cellwid = 5;
|
||||
lcd.cellhgt = 8;
|
||||
|
||||
// Set up these wrapper functions...
|
||||
lcd.clear = lcd_drv_clear;
|
||||
lcd.string = lcd_drv_string;
|
||||
lcd.chr = lcd_drv_chr;
|
||||
lcd.vbar = lcd_drv_vbar;
|
||||
lcd.hbar = lcd_drv_hbar;
|
||||
lcd.init_num = lcd_drv_init_num;
|
||||
lcd.num = lcd_drv_num;
|
||||
|
||||
lcd.init = lcd_drv_init;
|
||||
lcd.close = lcd_drv_close;
|
||||
lcd.flush = lcd_drv_flush;
|
||||
lcd.flush_box = lcd_drv_flush_box;
|
||||
lcd.contrast = lcd_drv_contrast;
|
||||
lcd.backlight = lcd_drv_backlight;
|
||||
lcd.output = lcd_drv_output;
|
||||
lcd.set_char = lcd_drv_set_char;
|
||||
lcd.icon = lcd_drv_icon;
|
||||
lcd.init_vbar = lcd_drv_init_vbar;
|
||||
lcd.init_hbar = lcd_drv_init_hbar;
|
||||
lcd.draw_frame = lcd_drv_draw_frame;
|
||||
lcd.cellwid = 5;
|
||||
lcd.cellhgt = 8;
|
||||
|
||||
lcd.getkey = lcd_drv_getkey;
|
||||
|
||||
|
||||
return 1; // 1 is arbitrary. (must be 1 or more)
|
||||
// Set up these wrapper functions...
|
||||
lcd.clear = lcd_drv_clear;
|
||||
lcd.string = lcd_drv_string;
|
||||
lcd.chr = lcd_drv_chr;
|
||||
lcd.vbar = lcd_drv_vbar;
|
||||
lcd.hbar = lcd_drv_hbar;
|
||||
lcd.init_num = lcd_drv_init_num;
|
||||
lcd.num = lcd_drv_num;
|
||||
|
||||
lcd.init = lcd_drv_init;
|
||||
lcd.close = lcd_drv_close;
|
||||
lcd.flush = lcd_drv_flush;
|
||||
lcd.flush_box = lcd_drv_flush_box;
|
||||
lcd.contrast = lcd_drv_contrast;
|
||||
lcd.backlight = lcd_drv_backlight;
|
||||
lcd.output = lcd_drv_output;
|
||||
lcd.set_char = lcd_drv_set_char;
|
||||
lcd.icon = lcd_drv_icon;
|
||||
lcd.init_vbar = lcd_drv_init_vbar;
|
||||
lcd.init_hbar = lcd_drv_init_hbar;
|
||||
lcd.draw_frame = lcd_drv_draw_frame;
|
||||
|
||||
lcd.getkey = lcd_drv_getkey;
|
||||
|
||||
|
||||
return 1; // 1 is arbitrary. (must be 1 or more)
|
||||
}
|
||||
|
||||
|
||||
@@ -302,437 +297,416 @@ 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)
|
||||
{
|
||||
res=drv_base->contrast(contrast);
|
||||
}
|
||||
*/
|
||||
else if((int)driver->contrast == -1)
|
||||
{
|
||||
res=drv_base->contrast(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;
|
||||
}
|
||||
|
||||
+61
-64
@@ -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,76 +20,73 @@ int lcd_shutdown();
|
||||
// Feel free to override any/all functions here with real driver
|
||||
// functions...
|
||||
//
|
||||
typedef struct lcd_logical_driver
|
||||
{
|
||||
// Size in cells of the LCD
|
||||
int wid, hgt;
|
||||
// Size of each LCD cell, in pixels
|
||||
int cellwid, cellhgt;
|
||||
// Frame buffer...
|
||||
char *framebuf;
|
||||
typedef struct lcd_logical_driver {
|
||||
// Size in cells of the LCD
|
||||
int wid, hgt;
|
||||
// Size of each LCD cell, in pixels
|
||||
int cellwid, cellhgt;
|
||||
// Frame buffer...
|
||||
char *framebuf;
|
||||
|
||||
// Functions which might be the same for all drivers...
|
||||
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);
|
||||
|
||||
// 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)();
|
||||
// Functions which might be the same for all drivers...
|
||||
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);
|
||||
|
||||
// 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) ();
|
||||
|
||||
// Returns 0 for "no key pressed", or (A-Z).
|
||||
char (*getkey) ();
|
||||
|
||||
// more?
|
||||
|
||||
// Returns 0 for "no key pressed", or (A-Z).
|
||||
char (*getkey)();
|
||||
|
||||
// more?
|
||||
|
||||
} lcd_logical_driver;
|
||||
|
||||
typedef struct lcd_physical_driver
|
||||
{
|
||||
char *name;
|
||||
int (*init)(struct lcd_logical_driver *driver, char *device);
|
||||
typedef struct lcd_physical_driver {
|
||||
char *name;
|
||||
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
|
||||
|
||||
|
||||
+71
-84
@@ -23,7 +23,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h> /* for semaphore functions */
|
||||
#include <sys/types.h> /* for semaphore functions */
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/sem.h>
|
||||
#include <errno.h>
|
||||
@@ -31,19 +31,19 @@
|
||||
#include "lcd_sem.h"
|
||||
|
||||
#define SEMAPHORE "portctrl"
|
||||
#define SEMKEY 0x706f7274 /* semaphore key */
|
||||
#define SEMCOUNT 1 /* number of semaphores to create */
|
||||
#define WMODE 0660 /* access permissions */
|
||||
#define SEMKEY 0x706f7274 /* semaphore key */
|
||||
#define SEMCOUNT 1 /* number of semaphores to create */
|
||||
#define WMODE 0660 /* access permissions */
|
||||
|
||||
#define SEM_SIGNAL 0,1,SEM_UNDO
|
||||
#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,50 +63,42 @@ getkey(register char *p)
|
||||
*/
|
||||
|
||||
int
|
||||
sem_get(void)
|
||||
sem_get (void)
|
||||
{
|
||||
int semid;
|
||||
union semun semval;
|
||||
int semid;
|
||||
union semun semval;
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
break;
|
||||
default:
|
||||
perror("semget");
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* initialise semaphore to 1 */
|
||||
semval.val = 1;
|
||||
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);
|
||||
}
|
||||
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);
|
||||
break;
|
||||
default:
|
||||
perror ("semget");
|
||||
exit (1);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* initialise semaphore to 1 */
|
||||
semval.val = 1;
|
||||
|
||||
if (semctl(semid, 0, SETVAL, semval) < 0)
|
||||
{
|
||||
perror("setval, can't initialise semaphore");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
return semid;
|
||||
if (semctl (semid, 0, SETVAL, semval) < 0) {
|
||||
perror ("setval, can't initialise semaphore");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
return semid;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -114,15 +106,14 @@ 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;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -130,15 +121,14 @@ 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;
|
||||
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)
|
||||
{
|
||||
case EIDRM:
|
||||
/* semaphore removed */
|
||||
return 0;
|
||||
break;
|
||||
default:
|
||||
perror("semctl, removing semaphore");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
int i;
|
||||
union semun dummy;
|
||||
|
||||
return 0;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
+41
-40
@@ -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,33 +62,34 @@ void lircin_close()
|
||||
//
|
||||
// Return 0 for "nothing available".
|
||||
//
|
||||
char lircin_getkey()
|
||||
char
|
||||
lircin_getkey ()
|
||||
{
|
||||
char key;
|
||||
char *ir,*cmd;
|
||||
|
||||
if (!(ir = lirc_nextir()))
|
||||
{
|
||||
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);
|
||||
return key;
|
||||
}
|
||||
char key;
|
||||
char *ir, *cmd;
|
||||
|
||||
return 0;
|
||||
if (!(ir = lirc_nextir ())) {
|
||||
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);
|
||||
return key;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// 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 */
|
||||
@@ -99,24 +101,23 @@ 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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (0 != lirc_readconfig(NULL,&config,NULL)) {
|
||||
lirc_deinit();
|
||||
return -1;
|
||||
}
|
||||
fcntl(fd,F_SETFL,O_NONBLOCK);
|
||||
fcntl(fd,F_SETFD,FD_CLOEXEC);
|
||||
|
||||
|
||||
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 ();
|
||||
return -1;
|
||||
}
|
||||
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);
|
||||
|
||||
return 1; // 200 is arbitrary. (must be 1 or more)
|
||||
}
|
||||
fcntl (fd, F_SETFL, O_NONBLOCK);
|
||||
fcntl (fd, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
return 1; // 200 is arbitrary. (must be 1 or more)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+15
-15
@@ -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
|
||||
|
||||
|
||||
+355
-291
@@ -38,141 +38,141 @@
|
||||
/* 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
|
||||
};
|
||||
|
||||
|
||||
|
||||
// <start user definable!!!>
|
||||
#define SVGALIB_FONT_VER 10 /* vertical spacing between lines (pixels) */
|
||||
#define SVGALIB_Y_OFFSET 40 /* distance from the top of the screen (pixels) */
|
||||
#define SVGALIB_FONT_VER 10 /* vertical spacing between lines (pixels) */
|
||||
#define SVGALIB_Y_OFFSET 40 /* distance from the top of the screen (pixels) */
|
||||
// <end user defineable!!!>
|
||||
|
||||
|
||||
@@ -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,42 +212,43 @@ 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;
|
||||
p = ptr;
|
||||
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++) {
|
||||
if (base & mask) {
|
||||
*p = 0;
|
||||
} else {
|
||||
*p = col;
|
||||
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++) {
|
||||
mask = 1;
|
||||
base = fnt[n * ht + y];
|
||||
for (x = 0; x < w; x++) {
|
||||
if (base & mask) {
|
||||
*p = 0;
|
||||
} else {
|
||||
*p = col;
|
||||
}
|
||||
p++;
|
||||
mask *= 2;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
mask*=2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
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,42 +256,43 @@ 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();
|
||||
VGAMODE = G320x200x256; /* Default mode. */
|
||||
vga_init ();
|
||||
VGAMODE = G320x200x256; /* Default mode. */
|
||||
|
||||
if (!vga_hasmode(VGAMODE)) {
|
||||
printf("320x200x256 Mode not available.\n");
|
||||
return -1;
|
||||
} else {
|
||||
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 );
|
||||
|
||||
}
|
||||
if (!vga_hasmode (VGAMODE)) {
|
||||
printf ("320x200x256 Mode not available.\n");
|
||||
return -1;
|
||||
} else {
|
||||
vga_setmode (VGAMODE);
|
||||
gl_setcontextvga (VGAMODE); /* Physical screen context. */
|
||||
gl_setrgbpalette ();
|
||||
|
||||
gl_clearscreen(gl_rgbcolor(0,0,0));
|
||||
/* 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);
|
||||
|
||||
}
|
||||
|
||||
gl_clearscreen (gl_rgbcolor (0, 0, 0));
|
||||
|
||||
|
||||
// Override output functions...
|
||||
// Override output functions...
|
||||
driver->clear = svgalib_drv_clear;
|
||||
driver->string = svgalib_drv_string;
|
||||
driver->chr = svgalib_drv_chr;
|
||||
@@ -300,7 +302,7 @@ int svgalib_drv_init(struct lcd_logical_driver *driver, char *args)
|
||||
driver->init_hbar = NULL;
|
||||
driver->num = svgalib_drv_num;
|
||||
driver->init_num = svgalib_drv_init_num;
|
||||
|
||||
|
||||
driver->init = svgalib_drv_init;
|
||||
driver->close = svgalib_drv_close;
|
||||
driver->flush = svgalib_drv_flush;
|
||||
@@ -317,20 +319,22 @@ int svgalib_drv_init(struct lcd_logical_driver *driver, char *args)
|
||||
SVGALIB_PAD = '#';
|
||||
// Change the character used for "..."
|
||||
SVGALIB_ELLIPSIS = '~';
|
||||
|
||||
return 1;
|
||||
|
||||
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,75 +342,88 @@ 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,15 +431,15 @@ 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,89 +448,136 @@ 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();
|
||||
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;
|
||||
default:
|
||||
i=0; /* key not recognised */
|
||||
}
|
||||
} else {
|
||||
i=0;
|
||||
}
|
||||
break;
|
||||
switch (i) {
|
||||
/* map the cursor keys to something sensible. */
|
||||
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;
|
||||
default:
|
||||
i = 0; /* key not recognised */
|
||||
}
|
||||
} else {
|
||||
i = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
Change this bit to your liking. I only set these values because
|
||||
they tie in with my keypads use of the keyboard controller chip
|
||||
see http://www.gofree.co.uk/home/smh/mp3 for details.
|
||||
Having said that try to make sure four keys map to D,B,C,A so you'll
|
||||
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 '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) */
|
||||
/*
|
||||
Change this bit to your liking. I only set these values because
|
||||
they tie in with my keypads use of the keyboard controller chip
|
||||
see http://www.gofree.co.uk/home/smh/mp3 for details.
|
||||
Having said that try to make sure four keys map to D,B,C,A so you'll
|
||||
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 '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) */
|
||||
return i;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+116
-107
@@ -17,69 +17,72 @@ 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;
|
||||
}
|
||||
|
||||
|
||||
driver->wid = 20;
|
||||
driver->hgt = 4;
|
||||
driver->cellwid = 5;
|
||||
driver->cellhgt = 8;
|
||||
|
||||
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->init_num = NULL;
|
||||
|
||||
driver->init = text_init;
|
||||
driver->close = text_close;
|
||||
driver->flush = text_flush;
|
||||
driver->flush_box = NULL;
|
||||
driver->contrast = NULL;
|
||||
driver->backlight = NULL;
|
||||
driver->set_char = NULL;
|
||||
driver->icon = NULL;
|
||||
driver->draw_frame = text_draw_frame;
|
||||
|
||||
driver->getkey = NULL;
|
||||
}
|
||||
|
||||
|
||||
return 200; // 200 is arbitrary. (must be 1 or more)
|
||||
driver->wid = 20;
|
||||
driver->hgt = 4;
|
||||
driver->cellwid = 5;
|
||||
driver->cellhgt = 8;
|
||||
|
||||
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->init_num = NULL;
|
||||
|
||||
driver->init = text_init;
|
||||
driver->close = text_close;
|
||||
driver->flush = text_flush;
|
||||
driver->flush_box = NULL;
|
||||
driver->contrast = NULL;
|
||||
driver->backlight = NULL;
|
||||
driver->set_char = NULL;
|
||||
driver->icon = NULL;
|
||||
driver->draw_frame = text_draw_frame;
|
||||
|
||||
driver->getkey = NULL;
|
||||
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Flushes all output to the lcd...
|
||||
//
|
||||
void text_flush()
|
||||
void
|
||||
text_flush ()
|
||||
{
|
||||
text_draw_frame(lcd.framebuf);
|
||||
text_draw_frame (lcd.framebuf);
|
||||
}
|
||||
|
||||
|
||||
@@ -87,40 +90,43 @@ 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;
|
||||
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];
|
||||
}
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
y--;
|
||||
x--;
|
||||
|
||||
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,75 +173,73 @@ 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, '|');
|
||||
int y;
|
||||
for (y = lcd.hgt; y > 0 && len > 0; y--) {
|
||||
text_chr (x, y, '|');
|
||||
|
||||
len -= lcd.cellhgt;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
int i, j;
|
||||
|
||||
char out[LCD_MAX_WIDTH];
|
||||
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);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
for(i=0; i<lcd.wid; i++)
|
||||
{
|
||||
printf ("|%s|\n", out);
|
||||
|
||||
}
|
||||
|
||||
for (i = 0; i < lcd.wid; i++) {
|
||||
out[i] = '-';
|
||||
}
|
||||
out[lcd.wid] = 0;
|
||||
printf("+%s+\n", out);
|
||||
}
|
||||
out[lcd.wid] = 0;
|
||||
printf ("+%s+\n", out);
|
||||
|
||||
}
|
||||
|
||||
|
||||
+17
-17
@@ -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
|
||||
|
||||
+370
-366
@@ -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;
|
||||
hbar = 1,
|
||||
vbar = 2,
|
||||
bign = 4,
|
||||
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,108 +45,95 @@ 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++)
|
||||
{
|
||||
for(i=0; i<argc; i++)
|
||||
{
|
||||
printf("Arg(%i): %s\n", i, argv[i]);
|
||||
}
|
||||
*/
|
||||
|
||||
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;
|
||||
else {
|
||||
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");
|
||||
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]);
|
||||
}
|
||||
} 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->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->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->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->set_char = sli_set_char;
|
||||
driver->icon = sli_icon;
|
||||
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->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;
|
||||
sli->framebuf = NULL;
|
||||
}
|
||||
|
||||
|
||||
void sli_flush()
|
||||
void
|
||||
sli_flush ()
|
||||
{
|
||||
sli_draw_frame(lcd.framebuf);
|
||||
sli_draw_frame (lcd.framebuf);
|
||||
}
|
||||
|
||||
|
||||
@@ -201,44 +193,45 @@ 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? */
|
||||
int y;
|
||||
char out[2]; /* Why does the matrix driver allocate so much here? */
|
||||
|
||||
/* simple bounds checking */
|
||||
if((top>lcd.hgt)|(bot>lcd.hgt))
|
||||
return;
|
||||
/* simple bounds checking */
|
||||
if ((top > lcd.hgt) | (bot > lcd.hgt))
|
||||
return;
|
||||
|
||||
if ((lft > lcd.wid) | (rgt > lcd.wid))
|
||||
return;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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;
|
||||
y--;
|
||||
x--;
|
||||
|
||||
lcd.framebuf[(y * lcd.wid) + x] = c;
|
||||
}
|
||||
|
||||
|
||||
@@ -255,145 +248,147 @@ 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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
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,
|
||||
};
|
||||
|
||||
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,37 +400,41 @@ 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]);
|
||||
|
||||
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]);
|
||||
|
||||
len -= lcd.cellhgt;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// 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 };
|
||||
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;
|
||||
char out[2];
|
||||
int row, col;
|
||||
int letter;
|
||||
|
||||
/* SLI also has 8 user definable characters */
|
||||
if(n < 0 || n > 7) return;
|
||||
if(!dat) return;
|
||||
/* SLI also has 8 user definable characters */
|
||||
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);
|
||||
/* Move cursor to CGRAM */
|
||||
out[0] = 0x0FE;
|
||||
out[1] = 0x040 + 8 * n;
|
||||
write (fd, out, 2);
|
||||
|
||||
for(row=0; row<lcd.cellhgt; row++)
|
||||
{
|
||||
letter = 0;
|
||||
for(col=0; col<lcd.cellwid; col++)
|
||||
{
|
||||
letter <<= 1;
|
||||
letter |= (dat[(row*lcd.cellwid) + col] > 0);
|
||||
}
|
||||
letter|=0x020; /* SLI can't accept CR, LF, etc in this character! */
|
||||
write(fd, &letter, 1);
|
||||
}
|
||||
for (row = 0; row < lcd.cellhgt; row++) {
|
||||
letter = 0;
|
||||
for (col = 0; col < lcd.cellwid; col++) {
|
||||
letter <<= 1;
|
||||
letter |= (dat[(row * lcd.cellwid) + col] > 0);
|
||||
}
|
||||
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);
|
||||
/* Move cursor back to DDRAM */
|
||||
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] = {
|
||||
{
|
||||
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,
|
||||
},
|
||||
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, // 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,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
if(custom==bign) custom=beat;
|
||||
sli_set_char(dest, &icons[which][0]);
|
||||
{
|
||||
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,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
if (custom == bign)
|
||||
custom = beat;
|
||||
sli_set_char (dest, &icons[which][0]);
|
||||
}
|
||||
|
||||
|
||||
@@ -529,34 +531,36 @@ 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;
|
||||
char out[2]; /* Again, why does the Matrix driver allocate so much here? */
|
||||
int y;
|
||||
|
||||
/*
|
||||
out[0]=0x0FE;
|
||||
out[1]=0x001;
|
||||
write(fd, out, 2);
|
||||
*/
|
||||
if (!dat)
|
||||
return;
|
||||
|
||||
/* Don't update if we have no new data
|
||||
this keeps me from getting a migraine
|
||||
(just like those copyleft penguin mints... mmmmmm) */
|
||||
/*
|
||||
out[0]=0x0FE;
|
||||
out[1]=0x001;
|
||||
write(fd, out, 2);
|
||||
*/
|
||||
|
||||
// if (!strncmp(dat,lastframe,32)) /* Nothing has changed */
|
||||
// return;
|
||||
/* Don't update if we have no new data
|
||||
this keeps me from getting a migraine
|
||||
(just like those copyleft penguin mints... mmmmmm) */
|
||||
|
||||
/* 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);
|
||||
// if (!strncmp(dat,lastframe,32)) /* Nothing has changed */
|
||||
// return;
|
||||
|
||||
// strncpy(lastframe,dat,32); // Update lastframe...
|
||||
/* 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);
|
||||
|
||||
// strncpy(lastframe,dat,32); // Update lastframe...
|
||||
|
||||
}
|
||||
|
||||
+17
-17
@@ -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 ();
|
||||
|
||||
|
||||
|
||||
|
||||
+46
-52
@@ -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();
|
||||
|
||||
if (!key) return 0;
|
||||
key = lcd.getkey ();
|
||||
|
||||
debug("handle_input(%c)\n", (char)key);
|
||||
|
||||
if(key)
|
||||
{
|
||||
s = screenlist_current();
|
||||
if(s)
|
||||
{
|
||||
if (!key)
|
||||
return 0;
|
||||
|
||||
debug ("handle_input(%c)\n", (char) key);
|
||||
|
||||
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,34 +92,33 @@ int handle_input()
|
||||
|
||||
|
||||
|
||||
int server_input(int key)
|
||||
int
|
||||
server_input (int key)
|
||||
{
|
||||
debug("server_input(%c)\n", (char)key);
|
||||
|
||||
switch(key)
|
||||
{
|
||||
case 'A':
|
||||
if(screenlist_action == SCR_HOLD)
|
||||
screenlist_action = 0;
|
||||
else
|
||||
screenlist_action = SCR_HOLD;
|
||||
break;
|
||||
case 'B':
|
||||
screenlist_action = SCR_BACK;
|
||||
screenlist_prev();
|
||||
break;
|
||||
case 'C':
|
||||
screenlist_action = SCR_SKIP;
|
||||
screenlist_next();
|
||||
break;
|
||||
case 'D':
|
||||
debug("got the menu key!\n");
|
||||
server_menu();
|
||||
break;
|
||||
default:
|
||||
debug("server_input: Invalid key \"%c\" (%i)\n",
|
||||
(char)key, key);
|
||||
break;
|
||||
debug ("server_input(%c)\n", (char) key);
|
||||
|
||||
switch (key) {
|
||||
case 'A':
|
||||
if (screenlist_action == SCR_HOLD)
|
||||
screenlist_action = 0;
|
||||
else
|
||||
screenlist_action = SCR_HOLD;
|
||||
break;
|
||||
case 'B':
|
||||
screenlist_action = SCR_BACK;
|
||||
screenlist_prev ();
|
||||
break;
|
||||
case 'C':
|
||||
screenlist_action = SCR_SKIP;
|
||||
screenlist_next ();
|
||||
break;
|
||||
case 'D':
|
||||
debug ("got the menu key!\n");
|
||||
server_menu ();
|
||||
break;
|
||||
default:
|
||||
debug ("server_input: Invalid key \"%c\" (%i)\n", (char) key, key);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
|
||||
// Accepts and uses keypad input while displaying screens...
|
||||
int handle_input();
|
||||
int handle_input ();
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+138
-172
@@ -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,150 +64,127 @@ 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
|
||||
char *str, *ing; // strings for commandline handling
|
||||
// screen_size *size = &sizes[0]; // No longer needed
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 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 */
|
||||
// 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"))
|
||||
{
|
||||
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], "-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 ();
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/* no longer needed
|
||||
int j=0, valid=0;
|
||||
i++;
|
||||
@@ -228,70 +204,57 @@ 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 ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// 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");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(screenlist_init() < 0)
|
||||
{
|
||||
printf("Error initializing screen list\n");
|
||||
if (client_init () < 0) {
|
||||
printf ("Error initializing client list\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
usleep(TIME_UNIT);
|
||||
if (s)
|
||||
draw_screen (s, timer);
|
||||
else
|
||||
no_screen_screen (timer);
|
||||
|
||||
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();
|
||||
|
||||
exit(0);
|
||||
sock_close_all ();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
+7
-9
@@ -3,7 +3,7 @@
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
contains a few things that other parts of the program might want
|
||||
@@ -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;
|
||||
int wid, hgt;
|
||||
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;
|
||||
|
||||
|
||||
|
||||
+255
-253
@@ -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)
|
||||
{
|
||||
// Set this to pulsate like a real heart beat...
|
||||
// (binary is fun... :)
|
||||
lcd.icon(!((timer+4)&5), 0);
|
||||
lcd.chr(lcd.wid, 1, 0);
|
||||
|
||||
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.flush();
|
||||
lcd.flush ();
|
||||
|
||||
timer++;
|
||||
timer &= 0x0f;
|
||||
@@ -58,298 +59,299 @@ static int PAD = 255;
|
||||
|
||||
|
||||
|
||||
typedef struct menu_info
|
||||
{
|
||||
int selected;
|
||||
int length;
|
||||
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;
|
||||
menu_info info;
|
||||
int key = 0;
|
||||
int status = MENU_OK;
|
||||
int done = 0;
|
||||
|
||||
int (*func)();
|
||||
int (*readfunc)(int);
|
||||
|
||||
|
||||
if(!menu) return MENU_ERROR;
|
||||
|
||||
fill_menu_info(menu, &info);
|
||||
int (*func) ();
|
||||
int (*readfunc) (int);
|
||||
|
||||
|
||||
while(!done)
|
||||
{
|
||||
// Keep the cursor off titles... (?)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
draw_menu(menu, &info);
|
||||
if (!menu)
|
||||
return MENU_ERROR;
|
||||
|
||||
// FIXME: This should use a better keypress interface, which
|
||||
// FIXME: handles things according to keybindings...
|
||||
fill_menu_info (menu, &info);
|
||||
|
||||
for(key = lcd.getkey(); key==0; key = lcd.getkey())
|
||||
{
|
||||
// sleep for 1/8th second...
|
||||
framedelay();
|
||||
// do the 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)
|
||||
info.selected--;
|
||||
else break;
|
||||
}
|
||||
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);
|
||||
break;
|
||||
case TYPE_FUNC:
|
||||
func = menu[info.selected].data;
|
||||
if(func)
|
||||
status = func();
|
||||
break;
|
||||
case TYPE_CHEK:
|
||||
readfunc = menu[info.selected].data;
|
||||
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]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch(status)
|
||||
{
|
||||
case MENU_OK:
|
||||
break;
|
||||
case MENU_CLOSE:
|
||||
return MENU_OK;
|
||||
case MENU_QUIT:
|
||||
return MENU_QUIT;
|
||||
// case MENU_KILL:
|
||||
// return MENU_KILL;
|
||||
case MENU_ERROR:
|
||||
return MENU_ERROR;
|
||||
}
|
||||
|
||||
// status = menu_handle_action(&menu[info.selected]);
|
||||
// TODO: It should now do special stuff for "mover" widgets,
|
||||
// TODO: and handle the return code appropriately.
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
static int draw_menu(Menu menu, menu_info *info)
|
||||
{
|
||||
int i;
|
||||
int x=1, y=1;
|
||||
int top=0, bottom=0;
|
||||
while (!done) {
|
||||
// Keep the cursor off titles... (?)
|
||||
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;
|
||||
}
|
||||
|
||||
int (*readfunc)(int);
|
||||
|
||||
// these should maybe be removed:
|
||||
int wid=lcd.wid, hgt=lcd.hgt;
|
||||
|
||||
|
||||
if(!menu) return MENU_ERROR;
|
||||
draw_menu (menu, &info);
|
||||
|
||||
lcd.clear();
|
||||
// FIXME: This should use a better keypress interface, which
|
||||
// FIXME: handles things according to keybindings...
|
||||
|
||||
|
||||
// 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;
|
||||
|
||||
|
||||
for (key = lcd.getkey (); key == 0; key = lcd.getkey ()) {
|
||||
// sleep for 1/8th second...
|
||||
framedelay ();
|
||||
// do the heartbeat...
|
||||
draw_heartbeat ();
|
||||
// Check for client input...
|
||||
}
|
||||
|
||||
// Draw all visible items...
|
||||
for(i=top; i<bottom; i++, y++)
|
||||
{
|
||||
if(i == info->selected) lcd.chr(2,y,'>');
|
||||
|
||||
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);
|
||||
break;
|
||||
case TYPE_MENU:
|
||||
lcd.string(3,y,menu[i].text);
|
||||
lcd.chr(wid,y,'>');
|
||||
break;
|
||||
case TYPE_FUNC:
|
||||
lcd.string(3,y,menu[i].text);
|
||||
break;
|
||||
case TYPE_CHEK:
|
||||
if(menu[i].data)
|
||||
{
|
||||
readfunc = menu[i].data;
|
||||
if(readfunc(MENU_READ))
|
||||
lcd.chr(wid,y,'Y');
|
||||
else
|
||||
lcd.chr(wid,y,'N');
|
||||
}
|
||||
lcd.string(3,y,menu[i].text);
|
||||
break;
|
||||
case TYPE_SLID:
|
||||
lcd.string(3,y,menu[i].text);
|
||||
break;
|
||||
case TYPE_MOVE:
|
||||
break;
|
||||
|
||||
// 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)
|
||||
info.selected--;
|
||||
else
|
||||
break;
|
||||
}
|
||||
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);
|
||||
break;
|
||||
case TYPE_FUNC:
|
||||
func = menu[info.selected].data;
|
||||
if (func)
|
||||
status = func ();
|
||||
break;
|
||||
case TYPE_CHEK:
|
||||
readfunc = menu[info.selected].data;
|
||||
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]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (status) {
|
||||
case MENU_OK:
|
||||
break;
|
||||
case MENU_CLOSE:
|
||||
return MENU_OK;
|
||||
case MENU_QUIT:
|
||||
return MENU_QUIT;
|
||||
// case MENU_KILL:
|
||||
// return MENU_KILL;
|
||||
case MENU_ERROR:
|
||||
return MENU_ERROR;
|
||||
}
|
||||
|
||||
// status = menu_handle_action(&menu[info.selected]);
|
||||
// TODO: It should now do special stuff for "mover" widgets,
|
||||
// TODO: and handle the return code appropriately.
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(top != 0)
|
||||
lcd.chr(1,1,'^');
|
||||
if(bottom < info->length)
|
||||
lcd.chr(1,hgt,'v');
|
||||
|
||||
|
||||
draw_heartbeat();
|
||||
//lcd.flush();
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int fill_menu_info(Menu menu, menu_info *info)
|
||||
static int
|
||||
draw_menu (Menu menu, menu_info * info)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
int x = 1, y = 1;
|
||||
int top = 0, bottom = 0;
|
||||
|
||||
info->selected = 0;
|
||||
|
||||
// count the entries in the menu
|
||||
for(i=0; menu[i].text; i++);
|
||||
|
||||
info->length = i;
|
||||
|
||||
return 0;
|
||||
|
||||
int (*readfunc) (int);
|
||||
|
||||
// these should maybe be removed:
|
||||
int wid = lcd.wid, hgt = lcd.hgt;
|
||||
|
||||
|
||||
if (!menu)
|
||||
return MENU_ERROR;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
|
||||
// Draw all visible items...
|
||||
for (i = top; i < bottom; i++, y++) {
|
||||
if (i == info->selected)
|
||||
lcd.chr (2, y, '>');
|
||||
|
||||
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);
|
||||
break;
|
||||
case TYPE_MENU:
|
||||
lcd.string (3, y, menu[i].text);
|
||||
lcd.chr (wid, y, '>');
|
||||
break;
|
||||
case TYPE_FUNC:
|
||||
lcd.string (3, y, menu[i].text);
|
||||
break;
|
||||
case TYPE_CHEK:
|
||||
if (menu[i].data) {
|
||||
readfunc = menu[i].data;
|
||||
if (readfunc (MENU_READ))
|
||||
lcd.chr (wid, y, 'Y');
|
||||
else
|
||||
lcd.chr (wid, y, 'N');
|
||||
}
|
||||
lcd.string (3, y, menu[i].text);
|
||||
break;
|
||||
case TYPE_SLID:
|
||||
lcd.string (3, y, menu[i].text);
|
||||
break;
|
||||
case TYPE_MOVE:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (top != 0)
|
||||
lcd.chr (1, 1, '^');
|
||||
if (bottom < info->length)
|
||||
lcd.chr (1, hgt, 'v');
|
||||
|
||||
|
||||
draw_heartbeat ();
|
||||
//lcd.flush();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int menu_handle_action(menu_item *item)
|
||||
|
||||
static int
|
||||
fill_menu_info (Menu menu, menu_info * info)
|
||||
{
|
||||
return MENU_OK;
|
||||
int i;
|
||||
|
||||
info->selected = 0;
|
||||
|
||||
// count the entries in the menu
|
||||
for (i = 0; menu[i].text; i++);
|
||||
|
||||
info->length = i;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
while(key != 'A' && key != 'D')
|
||||
{
|
||||
lcd.init_hbar ();
|
||||
|
||||
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)
|
||||
{
|
||||
case 'B':
|
||||
value = readfunc(MENU_MINUS);
|
||||
break;
|
||||
case 'C':
|
||||
value = readfunc(MENU_PLUS);
|
||||
break;
|
||||
|
||||
switch (key) {
|
||||
case 'B':
|
||||
value = readfunc (MENU_MINUS);
|
||||
break;
|
||||
case 'C':
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
+7
-8
@@ -121,23 +121,22 @@ and sliders should return 0-255.
|
||||
// User actions, sent to item-handling functions as input.
|
||||
#define MENU_SELECT 1
|
||||
#define MENU_CHECK 2
|
||||
#define MENU_PLUS 3
|
||||
#define MENU_MINUS 4
|
||||
#define MENU_PLUS 3
|
||||
#define MENU_MINUS 4
|
||||
#define MENU_READ 5
|
||||
|
||||
|
||||
typedef struct menu_item
|
||||
{
|
||||
char *text;
|
||||
int type;
|
||||
void *data;
|
||||
typedef struct menu_item {
|
||||
char *text;
|
||||
int type;
|
||||
void *data;
|
||||
} menu_item;
|
||||
|
||||
|
||||
#define Menu menu_item *
|
||||
|
||||
|
||||
int do_menu(Menu menu);
|
||||
int do_menu (Menu menu);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+214
-176
@@ -25,71 +25,71 @@
|
||||
#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
|
||||
// "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},
|
||||
{"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},
|
||||
// { "Backlight...", TYPE_SLID, (void *)Backlight_func},
|
||||
// "OK", TYPE_FUNC, (void *)OK_func,
|
||||
// "Close Menu", TYPE_FUNC, (void *)Close_func,
|
||||
// "Exit Program", TYPE_FUNC, (void *)Shutdown_func,
|
||||
// "Another Title",TYPE_TITL, 0,
|
||||
// "OK", TYPE_FUNC, (void *)OK_func,
|
||||
// "Close Menu", TYPE_FUNC, (void *)Close_func,
|
||||
// "Exit Program", TYPE_FUNC, (void *)Shutdown_func,
|
||||
// "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,241 +99,279 @@ 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();
|
||||
|
||||
err = system("init 0");
|
||||
id = geteuid ();
|
||||
|
||||
if(err < 0) return MENU_KILL;
|
||||
if(err == 127) return MENU_KILL;
|
||||
err = system ("init 0");
|
||||
|
||||
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();
|
||||
|
||||
err = system("init 6");
|
||||
id = geteuid ();
|
||||
|
||||
if(err < 0) return MENU_KILL;
|
||||
if(err == 127) return MENU_KILL;
|
||||
err = system ("init 6");
|
||||
|
||||
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;
|
||||
|
||||
if(input == MENU_READ) return status;
|
||||
if(input == MENU_CHECK) status ^= 1; // does something.
|
||||
static int status = 0;
|
||||
|
||||
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
|
||||
// know what to do after selecting the item. (two return
|
||||
// values in one. :)
|
||||
|
||||
// Also, "MENU_OK" happens to be zero, so it does not matter
|
||||
// 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)
|
||||
{
|
||||
case BACKLIGHT_OFF:
|
||||
if(input == MENU_READ) status = 0;
|
||||
if(input == MENU_PLUS)
|
||||
{
|
||||
backlight = BACKLIGHT_OPEN;
|
||||
status = 128;
|
||||
}
|
||||
if(input == MENU_MINUS)
|
||||
{
|
||||
status = 0;
|
||||
}
|
||||
break;
|
||||
case BACKLIGHT_ON:
|
||||
if(input == MENU_READ) status = 255;
|
||||
if(input == MENU_PLUS)
|
||||
{
|
||||
status = 255;
|
||||
}
|
||||
if(input == MENU_MINUS)
|
||||
{
|
||||
backlight = BACKLIGHT_OPEN;
|
||||
status = 128;
|
||||
}
|
||||
break;
|
||||
case BACKLIGHT_OPEN:
|
||||
if(input == MENU_READ) status = 128;
|
||||
if(input == MENU_PLUS)
|
||||
{
|
||||
backlight = BACKLIGHT_ON;
|
||||
backlight_state = BACKLIGHT_ON;
|
||||
status = 255;
|
||||
}
|
||||
if(input == MENU_MINUS)
|
||||
{
|
||||
backlight = BACKLIGHT_OFF;
|
||||
backlight_state = BACKLIGHT_OFF;
|
||||
status = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
switch (backlight) {
|
||||
case BACKLIGHT_OFF:
|
||||
if (input == MENU_READ)
|
||||
status = 0;
|
||||
if (input == MENU_PLUS) {
|
||||
backlight = BACKLIGHT_OPEN;
|
||||
status = 128;
|
||||
}
|
||||
if (input == MENU_MINUS) {
|
||||
status = 0;
|
||||
}
|
||||
break;
|
||||
case BACKLIGHT_ON:
|
||||
if (input == MENU_READ)
|
||||
status = 255;
|
||||
if (input == MENU_PLUS) {
|
||||
status = 255;
|
||||
}
|
||||
if (input == MENU_MINUS) {
|
||||
backlight = BACKLIGHT_OPEN;
|
||||
status = 128;
|
||||
}
|
||||
break;
|
||||
case BACKLIGHT_OPEN:
|
||||
if (input == MENU_READ)
|
||||
status = 128;
|
||||
if (input == MENU_PLUS) {
|
||||
backlight = BACKLIGHT_ON;
|
||||
backlight_state = BACKLIGHT_ON;
|
||||
status = 255;
|
||||
}
|
||||
if (input == MENU_MINUS) {
|
||||
backlight = BACKLIGHT_OFF;
|
||||
backlight_state = BACKLIGHT_OFF;
|
||||
status = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
if(input == MENU_READ) return (backlight != BACKLIGHT_OFF);
|
||||
if(input == MENU_CHECK)
|
||||
{
|
||||
if(input == MENU_READ) return (backlight != BACKLIGHT_OFF);
|
||||
if(input == MENU_CHECK)
|
||||
{
|
||||
if(backlight) backlight = BACKLIGHT_OFF;
|
||||
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);
|
||||
|
||||
return (status | MENU_OK);
|
||||
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");
|
||||
|
||||
do_menu(main_menu);
|
||||
|
||||
debug ("server_menu()\n");
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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
@@ -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
|
||||
|
||||
+46
-61
@@ -23,7 +23,8 @@
|
||||
|
||||
|
||||
|
||||
int parse_all_client_messages()
|
||||
int
|
||||
parse_all_client_messages ()
|
||||
{
|
||||
int i, j;
|
||||
int newtoken, inquote;
|
||||
@@ -33,78 +34,64 @@ int parse_all_client_messages()
|
||||
int argc;
|
||||
char *argv[256];
|
||||
char delimiters[] = " \0";
|
||||
char leftquote[] = "\0\"'`([{\0";
|
||||
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++)
|
||||
{
|
||||
if(inquote) // Scan for the end of the quote
|
||||
argc = 0;
|
||||
newtoken = 1;
|
||||
inquote = 0;
|
||||
for (i = 0; str[i]; i++) {
|
||||
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
|
||||
} else // Normal operation; split at delimiters
|
||||
{
|
||||
for(j=1; leftquote[j]; j++)
|
||||
{
|
||||
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");
|
||||
// debug("parse: Finding function...\n");
|
||||
invalid = 1;
|
||||
for(i=0; commands[i].keyword; i++)
|
||||
{
|
||||
// debug("(checking %s)\n", 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);
|
||||
// debug("parse: Returned %i...\n", err);
|
||||
for (i = 0; commands[i].keyword; i++) {
|
||||
// debug("(checking %s)\n", 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);
|
||||
// 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?
|
||||
} // end for(str...)
|
||||
} // end if (c)
|
||||
} while (LL_Next(clients) == 0);
|
||||
free (str); // fixed memory leak?
|
||||
} // end for(str...)
|
||||
} // end if (c)
|
||||
} while (LL_Next (clients) == 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1
-1
@@ -2,6 +2,6 @@
|
||||
#define PARSE_H
|
||||
|
||||
// This should be pretty self-explanatory...
|
||||
int parse_all_client_messages();
|
||||
int parse_all_client_messages ();
|
||||
|
||||
#endif
|
||||
|
||||
+333
-412
@@ -30,461 +30,390 @@
|
||||
|
||||
|
||||
|
||||
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;
|
||||
|
||||
reset = 1;
|
||||
|
||||
//debug("draw_screen: %8x, %i\n", (int)s, timer);
|
||||
|
||||
if(!s) return -1;
|
||||
|
||||
if(s == old_s) reset = 0;
|
||||
if (!s)
|
||||
return -1;
|
||||
|
||||
if (s == old_s)
|
||||
reset = 0;
|
||||
old_s = s;
|
||||
|
||||
|
||||
|
||||
lcd.clear();
|
||||
lcd.clear ();
|
||||
|
||||
|
||||
switch(backlight_state)
|
||||
{
|
||||
case BACKLIGHT_OFF:
|
||||
lcd.backlight(backlight_off_brightness);
|
||||
break;
|
||||
case BACKLIGHT_ON:
|
||||
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);
|
||||
//lcd.backlight(backlight_brightness * (!((timer&7) == 7)));
|
||||
else
|
||||
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);
|
||||
//lcd.backlight(backlight_brightness * (!((timer&14) == 14)));
|
||||
else
|
||||
lcd.backlight(!tmp?backlight_brightness:backlight_off_brightness);
|
||||
//lcd.backlight(backlight_brightness * ((timer&14) == 14));
|
||||
}
|
||||
break;
|
||||
switch (backlight_state) {
|
||||
case BACKLIGHT_OFF:
|
||||
lcd.backlight (backlight_off_brightness);
|
||||
break;
|
||||
case BACKLIGHT_ON:
|
||||
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);
|
||||
//lcd.backlight(backlight_brightness * (!((timer&7) == 7)));
|
||||
else
|
||||
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);
|
||||
//lcd.backlight(backlight_brightness * (!((timer&14) == 14)));
|
||||
else
|
||||
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);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
char str[BUFSIZE]; // scratch buffer
|
||||
widget *w;
|
||||
|
||||
int wid, hgt; // Width and height of visible frame area
|
||||
|
||||
int wid, hgt; // Width and height of visible frame area
|
||||
int x, y;
|
||||
int fx, fy; // Scrolling offset for the frame...
|
||||
int fx, fy; // Scrolling offset for the frame...
|
||||
int length, speed;
|
||||
//int lines;
|
||||
|
||||
|
||||
int reset = 1;
|
||||
|
||||
wid = right - left; // This is the size of the visible frame area
|
||||
wid = right - left; // This is the size of the visible frame area
|
||||
hgt = bottom - top;
|
||||
|
||||
fx = 0;
|
||||
fy = 0;
|
||||
if(fscroll == 'v')
|
||||
{
|
||||
|
||||
if(fspeed > 0)
|
||||
fy = (timer-fspeed) / fspeed;
|
||||
if(fspeed < 0)
|
||||
if (fscroll == 'v') {
|
||||
|
||||
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;
|
||||
if (fy > fhgt - hgt)
|
||||
fy = fhgt - hgt;
|
||||
} else if (fscroll == 'h') { // TODO: Frames don't scroll horizontally yet!
|
||||
|
||||
}
|
||||
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)
|
||||
{
|
||||
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);
|
||||
str[wid - w->x + 1] = 0;
|
||||
lcd.string(w->x + left,
|
||||
w->y + top - fy,
|
||||
str);
|
||||
}
|
||||
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);
|
||||
str[wid - w->x + 1] = 0;
|
||||
lcd.string (w->x + left, w->y + top - fy, str);
|
||||
}
|
||||
break;
|
||||
case WID_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);
|
||||
else
|
||||
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,
|
||||
// so I'll leave it out for now.
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WID_VBAR: // FIXME: Vbars don't work in frames!
|
||||
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)
|
||||
{
|
||||
// TODO: Rearrange stuff to get down-extending
|
||||
// vbars to draw correctly...
|
||||
}
|
||||
break;
|
||||
case WID_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);
|
||||
else
|
||||
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,
|
||||
// so I'll leave it out for now.
|
||||
}
|
||||
}
|
||||
break;
|
||||
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;
|
||||
|
||||
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...
|
||||
{
|
||||
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)
|
||||
{
|
||||
// Release hold after it has been displayed
|
||||
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(y&1) // Scrolling backwards...
|
||||
{
|
||||
x = (length-(wid-6)) - x;
|
||||
}
|
||||
strncpy(str+3, w->text+x, (wid-6));
|
||||
str[wid-3] = ' ';
|
||||
}
|
||||
str[wid] = 0;
|
||||
|
||||
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;
|
||||
//printf("rendering: %s %d\n",w->text,timer);
|
||||
screen_width = w->right - w->left + 1;
|
||||
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)
|
||||
{
|
||||
/* it fits within the box, just render it */
|
||||
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 (w->speed > 0) {
|
||||
necessaryTimeUnits = effLength * w->speed;
|
||||
if (((timer / (effLength*w->speed)) % 2) == 0) {
|
||||
//wiggle one way
|
||||
offset = (timer % (effLength*w->speed))
|
||||
/ w->speed;
|
||||
}
|
||||
else
|
||||
{
|
||||
//wiggle the other
|
||||
offset = (((timer % (effLength*w->speed))
|
||||
- (effLength*w->speed) + 1)
|
||||
/ w->speed) * -1;
|
||||
}
|
||||
}
|
||||
else if (w->speed < 0)
|
||||
{
|
||||
necessaryTimeUnits = 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)))
|
||||
* w->speed * -1) - effLength + 1) * -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
offset = 0;
|
||||
if(screenlist_action == RENDER_HOLD)
|
||||
screenlist_action = 0;
|
||||
}
|
||||
if (timer > necessaryTimeUnits)
|
||||
{
|
||||
if(screenlist_action == RENDER_HOLD)
|
||||
screenlist_action = 0;
|
||||
}
|
||||
if (offset <= length)
|
||||
{
|
||||
strncpy(str,&((w->text)[offset]),screen_width);
|
||||
str[screen_width] = '\0';
|
||||
//printf("%s : %d\n",str,length-offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
str[0] = '\0';
|
||||
}
|
||||
lcd.string(w->left,w->top,str);
|
||||
}
|
||||
break;
|
||||
// FIXME: Vert scrollers don't always seem to scroll
|
||||
// back up after hitting the bottom. They jump back to
|
||||
// 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)
|
||||
+ (length % screen_width ? 1 : 0);
|
||||
int available_lines = (w->bottom - w->top + 1);
|
||||
if (lines_required <= available_lines)
|
||||
{
|
||||
// easy...
|
||||
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);
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
necessaryTimeUnits = effLines * w->speed;
|
||||
if (((timer / (effLines*w->speed)) % 2) == 0)
|
||||
{
|
||||
//printf("up ");
|
||||
begin = (timer % (effLines*w->speed))
|
||||
/ w->speed;
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("down ");
|
||||
begin = (((timer % (effLines*w->speed))
|
||||
- (effLines*w->speed) + 1)/w->speed)
|
||||
* -1;
|
||||
}
|
||||
}
|
||||
else if (w->speed < 0)
|
||||
{
|
||||
necessaryTimeUnits = 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)))
|
||||
* w->speed * -1) - effLines + 1)
|
||||
* -1;
|
||||
}
|
||||
}
|
||||
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);
|
||||
str[screen_width] = '\0';
|
||||
//printf("rendering: '%s' of %s\n",
|
||||
//str,w->text);
|
||||
lcd.string(w->left,w->top + (i-begin),str);
|
||||
}
|
||||
if (timer > necessaryTimeUnits)
|
||||
{
|
||||
if(screenlist_action == RENDER_HOLD)
|
||||
screenlist_action = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WID_FRAME:
|
||||
break;
|
||||
case WID_VBAR: // FIXME: Vbars don't work in frames!
|
||||
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) {
|
||||
// TODO: Rearrange stuff to get down-extending
|
||||
// vbars to draw correctly...
|
||||
// .. er, this'll require driver modifications,
|
||||
// so I'll leave it out for now.
|
||||
}
|
||||
}
|
||||
break;
|
||||
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;
|
||||
|
||||
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...
|
||||
{
|
||||
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) {
|
||||
// Release hold after it has been displayed
|
||||
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 (y & 1) // Scrolling backwards...
|
||||
{
|
||||
x = (length - (wid - 6)) - x;
|
||||
}
|
||||
strncpy (str + 3, w->text + x, (wid - 6));
|
||||
str[wid - 3] = ' ';
|
||||
}
|
||||
str[wid] = 0;
|
||||
|
||||
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;
|
||||
//printf("rendering: %s %d\n",w->text,timer);
|
||||
screen_width = w->right - w->left + 1;
|
||||
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) {
|
||||
/* it fits within the box, just render it */
|
||||
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 (w->speed > 0) {
|
||||
necessaryTimeUnits = effLength * w->speed;
|
||||
if (((timer / (effLength * w->speed)) % 2) == 0) {
|
||||
//wiggle one way
|
||||
offset = (timer % (effLength * w->speed))
|
||||
/ w->speed;
|
||||
} else {
|
||||
//wiggle the other
|
||||
offset = (((timer % (effLength * w->speed))
|
||||
- (effLength * w->speed) + 1)
|
||||
/ w->speed) * -1;
|
||||
}
|
||||
} else if (w->speed < 0) {
|
||||
necessaryTimeUnits = 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)))
|
||||
* w->speed * -1) - effLength + 1) * -1;
|
||||
}
|
||||
} else {
|
||||
offset = 0;
|
||||
if (screenlist_action == RENDER_HOLD)
|
||||
screenlist_action = 0;
|
||||
}
|
||||
if (timer > necessaryTimeUnits) {
|
||||
if (screenlist_action == RENDER_HOLD)
|
||||
screenlist_action = 0;
|
||||
}
|
||||
if (offset <= length) {
|
||||
strncpy (str, &((w->text)[offset]), screen_width);
|
||||
str[screen_width] = '\0';
|
||||
//printf("%s : %d\n",str,length-offset);
|
||||
} else {
|
||||
str[0] = '\0';
|
||||
}
|
||||
lcd.string (w->left, w->top, str);
|
||||
}
|
||||
break;
|
||||
// FIXME: Vert scrollers don't always seem to scroll
|
||||
// back up after hitting the bottom. They jump back to
|
||||
// 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)
|
||||
+ (length % screen_width ? 1 : 0);
|
||||
int available_lines = (w->bottom - w->top + 1);
|
||||
if (lines_required <= available_lines) {
|
||||
// easy...
|
||||
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);
|
||||
}
|
||||
} 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) {
|
||||
necessaryTimeUnits = effLines * w->speed;
|
||||
if (((timer / (effLines * w->speed)) % 2) == 0) {
|
||||
//printf("up ");
|
||||
begin = (timer % (effLines * w->speed))
|
||||
/ w->speed;
|
||||
} else {
|
||||
//printf("down ");
|
||||
begin = (((timer % (effLines * w->speed))
|
||||
- (effLines * w->speed) + 1) / w->speed)
|
||||
* -1;
|
||||
}
|
||||
} else if (w->speed < 0) {
|
||||
necessaryTimeUnits = 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)))
|
||||
* w->speed * -1) - effLines + 1)
|
||||
* -1;
|
||||
}
|
||||
} 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);
|
||||
str[screen_width] = '\0';
|
||||
//printf("rendering: '%s' of %s\n",
|
||||
//str,w->text);
|
||||
lcd.string (w->left, w->top + (i - begin), str);
|
||||
}
|
||||
if (timer > necessaryTimeUnits) {
|
||||
if (screenlist_action == RENDER_HOLD)
|
||||
screenlist_action = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WID_FRAME:
|
||||
{
|
||||
// FIXME: doesn't handle nested frames quite right!
|
||||
// doesn't handle scrolling in nested frames at all...
|
||||
@@ -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();
|
||||
reset = 0;
|
||||
}
|
||||
lcd.num(w->x + left, w->y);
|
||||
case WID_NUM: // FIXME: doesn't work in frames...
|
||||
if ((w->x > 0) && (w->y >= 0) && (w->y <= 9)) {
|
||||
if (reset) {
|
||||
lcd.init_num ();
|
||||
reset = 0;
|
||||
}
|
||||
break;
|
||||
case WID_NONE:
|
||||
default:
|
||||
break;
|
||||
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
@@ -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
|
||||
|
||||
+77
-76
@@ -13,159 +13,160 @@
|
||||
#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;
|
||||
|
||||
LL_Rewind(s->widgets);
|
||||
if (!s)
|
||||
return -1;
|
||||
|
||||
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);
|
||||
|
||||
free(s);
|
||||
|
||||
if (s->id)
|
||||
free (s->id);
|
||||
if (s->name)
|
||||
free (s->name);
|
||||
|
||||
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);
|
||||
|
||||
LL_Rewind(c->data->screenlist);
|
||||
debug ("client_find_screen(%s)\n", id);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+14
-15
@@ -4,26 +4,25 @@
|
||||
#include "../shared/LL.h"
|
||||
#include "clients.h"
|
||||
|
||||
typedef struct screen
|
||||
{
|
||||
char *id;
|
||||
char *name;
|
||||
int wid, hgt;
|
||||
int priority;
|
||||
int duration;
|
||||
int heartbeat;
|
||||
LL * widgets;
|
||||
client *parent;
|
||||
typedef struct screen {
|
||||
char *id;
|
||||
char *name;
|
||||
int wid, hgt;
|
||||
int priority;
|
||||
int duration;
|
||||
int heartbeat;
|
||||
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
|
||||
|
||||
+125
-108
@@ -10,79 +10,85 @@
|
||||
|
||||
|
||||
|
||||
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");
|
||||
|
||||
screenlist = LL_new();
|
||||
if(!screenlist)
|
||||
{
|
||||
fprintf(stderr, "screenlist_init: Error allocating list\n");
|
||||
debug ("screenlist_init()\n");
|
||||
|
||||
screenlist = LL_new ();
|
||||
if (!screenlist) {
|
||||
fprintf (stderr, "screenlist_init: Error allocating list\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
screenlist_action = 0;
|
||||
timer = 0;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int screenlist_shutdown()
|
||||
int
|
||||
screenlist_shutdown ()
|
||||
{
|
||||
debug("screenlist_shutdown()\n");
|
||||
|
||||
LL_Destroy(screenlist);
|
||||
|
||||
debug ("screenlist_shutdown()\n");
|
||||
|
||||
LL_Destroy (screenlist);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int screenlist_remove(screen *s)
|
||||
int
|
||||
screenlist_remove (screen * s)
|
||||
{
|
||||
debug("screenlist_remove()\n");
|
||||
|
||||
if(!LL_Remove(screenlist, s))
|
||||
debug ("screenlist_remove()\n");
|
||||
|
||||
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;
|
||||
|
||||
debug("screenlist_remove_all()\n");
|
||||
|
||||
while(LL_Remove(screenlist, s))
|
||||
int i = 0;
|
||||
|
||||
debug ("screenlist_remove_all()\n");
|
||||
|
||||
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;
|
||||
@@ -92,55 +98,48 @@ screen * screenlist_current()
|
||||
|
||||
//debug("screenlist_current:\n");
|
||||
//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
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
old_s = s;
|
||||
|
||||
@@ -149,33 +148,37 @@ 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;
|
||||
|
||||
|
||||
|
||||
//debug("Screenlist_next: calling handler...\n");
|
||||
|
||||
// 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,88 +186,102 @@ 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;
|
||||
|
||||
|
||||
|
||||
// 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");
|
||||
|
||||
return LL_Push(screenlist, (void *)screen);
|
||||
debug ("screenlist_add_end()\n");
|
||||
|
||||
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;
|
||||
|
||||
return screenlist_current();
|
||||
if (LL_UnRoll (screenlist) != 0)
|
||||
return NULL;
|
||||
|
||||
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);
|
||||
|
||||
return screenlist_current();
|
||||
LL_Sort (screenlist, compare_priority);
|
||||
|
||||
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;
|
||||
|
||||
return screenlist_current();
|
||||
if (LL_Roll (screenlist) != 0)
|
||||
return NULL;
|
||||
|
||||
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;
|
||||
|
||||
a = (screen *)one;
|
||||
b = (screen *)two;
|
||||
|
||||
if (!one)
|
||||
return 0;
|
||||
if (!two)
|
||||
return 0;
|
||||
|
||||
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
@@ -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
|
||||
|
||||
+102
-131
@@ -23,210 +23,181 @@ char *id = "ClientList";
|
||||
char *name = "Client List";
|
||||
|
||||
char title[256] = "LCDproc Server";
|
||||
char one[256] = "";
|
||||
char two[256] = "";
|
||||
char one[256] = "";
|
||||
char two[256] = "";
|
||||
char three[256] = "";
|
||||
|
||||
int server_screen_init()
|
||||
int
|
||||
server_screen_init ()
|
||||
{
|
||||
widget *w;
|
||||
|
||||
debug("server_screen_init\n");
|
||||
|
||||
server_screen = screen_create();
|
||||
debug ("server_screen_init\n");
|
||||
|
||||
if(!server_screen)
|
||||
{
|
||||
fprintf(stderr, "server_screen_init: Error allocating screen\n");
|
||||
server_screen = screen_create ();
|
||||
|
||||
if (!server_screen) {
|
||||
fprintf (stderr, "server_screen_init: Error allocating screen\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
server_screen->id = id;
|
||||
server_screen->name = name;
|
||||
server_screen->duration = 8; // 1 second, instead of 4...
|
||||
|
||||
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;
|
||||
screen *s;
|
||||
int num_screens;
|
||||
|
||||
|
||||
|
||||
|
||||
// Draw a title...
|
||||
//strcpy(title, "LCDproc Server");
|
||||
|
||||
|
||||
// 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);
|
||||
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");
|
||||
}
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int no_screen_screen(int timer)
|
||||
int
|
||||
no_screen_screen (int timer)
|
||||
{
|
||||
|
||||
lcd.clear();
|
||||
|
||||
lcd.string(1, 1, "Error: No screen!");
|
||||
|
||||
lcd.flush();
|
||||
|
||||
lcd.clear ();
|
||||
|
||||
lcd.string (1, 1, "Error: No screen!");
|
||||
|
||||
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! ",
|
||||
*l20 = " LCDproc and Linux! ",
|
||||
#else
|
||||
*l20 = " LCDproc! ",
|
||||
*l20 = " LCDproc! ",
|
||||
#endif
|
||||
*b16 = " ",
|
||||
*t16 = "Thanks for using",
|
||||
*b16 = " ", *t16 = "Thanks for using",
|
||||
#ifdef LINUX
|
||||
*l16 = " LCDproc+Linux! ",
|
||||
*l16 = " LCDproc+Linux! ",
|
||||
#else
|
||||
*l16 = " LCDproc! ",
|
||||
*l16 = " LCDproc! ",
|
||||
#endif
|
||||
*nil = "";
|
||||
|
||||
lcd.clear();
|
||||
*nil = "";
|
||||
|
||||
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);
|
||||
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);
|
||||
} 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+110
-131
@@ -36,65 +36,63 @@ 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;
|
||||
struct sockaddr_in name;
|
||||
int sock;
|
||||
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Give the socket a name. */
|
||||
//debug("Binding Inet Socket\n");
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return sock;
|
||||
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Give the socket a name. */
|
||||
//debug("Binding Inet Socket\n");
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return sock;
|
||||
|
||||
}
|
||||
|
||||
//int StartSocketServer()
|
||||
int sock_create_server()
|
||||
int
|
||||
sock_create_server ()
|
||||
{
|
||||
int sock;
|
||||
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (listen (sock, 1) < 0)
|
||||
{
|
||||
perror("sock_create_server: Listen error");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Initialize the set of active sockets. */
|
||||
FD_ZERO (&active_fd_set);
|
||||
FD_SET (sock, &active_fd_set);
|
||||
|
||||
orig_sock = sock;
|
||||
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (listen (sock, 1) < 0) {
|
||||
perror ("sock_create_server: Listen error");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Initialize the set of active sockets. */
|
||||
FD_ZERO (&active_fd_set);
|
||||
FD_SET (sock, &active_fd_set);
|
||||
|
||||
orig_sock = sock;
|
||||
|
||||
/*
|
||||
{
|
||||
int val, len, sock;
|
||||
@@ -110,11 +108,12 @@ int sock_create_server()
|
||||
}
|
||||
*/
|
||||
|
||||
return sock;
|
||||
return sock;
|
||||
}
|
||||
|
||||
|
||||
int sock_poll_clients()
|
||||
int
|
||||
sock_poll_clients ()
|
||||
{
|
||||
int i;
|
||||
int err;
|
||||
@@ -122,82 +121,64 @@ int sock_poll_clients()
|
||||
size_t size;
|
||||
struct timeval t;
|
||||
client *c;
|
||||
|
||||
|
||||
//debug("sock_poll_clients()\n");
|
||||
|
||||
|
||||
t.tv_sec = 0;
|
||||
t.tv_usec = 0;
|
||||
|
||||
/* 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);
|
||||
|
||||
// TODO: Create new "client" here... (done?)
|
||||
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,48 +186,46 @@ int sock_poll_clients()
|
||||
}
|
||||
|
||||
|
||||
int read_from_client (int filedes)
|
||||
int
|
||||
read_from_client (int filedes)
|
||||
{
|
||||
char buffer[MAXMSG];
|
||||
int nbytes, i;
|
||||
client *c;
|
||||
|
||||
|
||||
// nbytes = read (filedes, buffer, MAXMSG);
|
||||
//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);
|
||||
|
||||
|
||||
if (nbytes < 0) // Read error? No data available?
|
||||
debug ("read_from_client(%i): %i bytes\n", filedes, nbytes);
|
||||
|
||||
|
||||
if (nbytes < 0) // Read error? No data available?
|
||||
{
|
||||
// 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...
|
||||
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);
|
||||
|
||||
debug("read_from_client: got message: `%s'\n", buffer);
|
||||
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);
|
||||
return nbytes;
|
||||
}
|
||||
return nbytes;
|
||||
@@ -255,21 +234,21 @@ 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");
|
||||
|
||||
for (i = 0; i < FD_SETSIZE; i++)
|
||||
{
|
||||
debug ("sock_close_all()\n");
|
||||
|
||||
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
@@ -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
|
||||
|
||||
+175
-193
@@ -9,34 +9,34 @@
|
||||
#include "widget.h"
|
||||
|
||||
|
||||
char *types[] = {"none",
|
||||
"string",
|
||||
"hbar",
|
||||
"vbar",
|
||||
"icon",
|
||||
"title",
|
||||
"scroller",
|
||||
"frame",
|
||||
"num",
|
||||
//"",
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
||||
static widget * widget_finder(LL *list, char *id);
|
||||
static int widget_remover(LL *list, widget *w);
|
||||
char *types[] = { "none",
|
||||
"string",
|
||||
"hbar",
|
||||
"vbar",
|
||||
"icon",
|
||||
"title",
|
||||
"scroller",
|
||||
"frame",
|
||||
"num",
|
||||
//"",
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
||||
widget * widget_create()
|
||||
static widget *widget_finder (LL * list, char *id);
|
||||
static int widget_remover (LL * list, widget * w);
|
||||
|
||||
|
||||
widget *
|
||||
widget_create ()
|
||||
{
|
||||
widget *w;
|
||||
|
||||
debug("widget_create()\n");
|
||||
|
||||
w = malloc(sizeof(widget));
|
||||
if(!w)
|
||||
{
|
||||
fprintf(stderr, "widget_create: Error allocating widget\n");
|
||||
debug ("widget_create()\n");
|
||||
|
||||
w = malloc (sizeof (widget));
|
||||
if (!w) {
|
||||
fprintf (stderr, "widget_create: Error allocating widget\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -54,55 +54,61 @@ widget * widget_create()
|
||||
w->speed = 1;
|
||||
w->text = NULL;
|
||||
w->kids = NULL;
|
||||
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
int widget_destroy(widget *w)
|
||||
int
|
||||
widget_destroy (widget * w)
|
||||
{
|
||||
LL * list;
|
||||
LL *list;
|
||||
widget *foo;
|
||||
|
||||
if(!w) return -1;
|
||||
|
||||
debug("widget_destroy(%s)\n", w->id);
|
||||
|
||||
if(w->id) free(w->id);
|
||||
if (!w)
|
||||
return -1;
|
||||
|
||||
debug ("widget_destroy(%s)\n", 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);
|
||||
|
||||
return widget_finder(s->widgets, id);
|
||||
debug ("widget_find(%s)\n", 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);
|
||||
|
||||
LL_Rewind(list);
|
||||
debug ("widget_finder(%s)\n", id);
|
||||
|
||||
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);
|
||||
|
||||
|
||||
if(!s) return -1;
|
||||
if(!id) return -1;
|
||||
debug ("widget_add(%s, %s, %s)\n", id, type, in);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
if(!s) return -1;
|
||||
if(!id) return -1;
|
||||
|
||||
|
||||
debug ("widget_remove(%s)\n", id);
|
||||
|
||||
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");
|
||||
|
||||
if(!list) return 0;
|
||||
if(!w) return 0;
|
||||
debug ("widget_remover\n");
|
||||
|
||||
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->kids)
|
||||
if (foo == w) {
|
||||
if (!foo->kids) {
|
||||
fprintf (stderr, "widget_remover: frame has no kids\n");
|
||||
} else // Kill the 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;
|
||||
}
|
||||
|
||||
+16
-17
@@ -3,18 +3,17 @@
|
||||
|
||||
#include "screen.h"
|
||||
|
||||
typedef struct widget
|
||||
{
|
||||
char *id;
|
||||
int type;
|
||||
// some sort of data here...
|
||||
int x, y; // Position
|
||||
int wid, hgt; // Size
|
||||
int left, top, right, bottom; // bounding rectangle
|
||||
int length; // size or direction
|
||||
int speed; // For scroller...
|
||||
char *text; // text or binary data
|
||||
LL *kids; // Frames can contain more widgets...
|
||||
typedef struct widget {
|
||||
char *id;
|
||||
int type;
|
||||
// some sort of data here...
|
||||
int x, y; // Position
|
||||
int wid, hgt; // Size
|
||||
int left, top, right, bottom; // bounding rectangle
|
||||
int length; // size or direction
|
||||
int speed; // For scroller...
|
||||
char *text; // text or binary data
|
||||
LL *kids; // Frames can contain more widgets...
|
||||
} widget;
|
||||
|
||||
// These correspond to the index into the "types" array...
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user