More formatting changes, new tags file.

This commit is contained in:
William Ferrell
2000-04-03 22:13:57 +00:00
parent 0d703c5864
commit 6a115b4446
64 changed files with 8950 additions and 8950 deletions
+121 -121
View File
@@ -18,47 +18,47 @@ static int get_batt_stat (int *acstat, int *battstat, int *battflag, int *percen
static int
get_batt_stat (int *acstat, int *battstat, int *battflag, int *percent)
{
char str[64];
char str[64];
if (!batt_fd)
batt_fd = open ("/proc/apm", O_RDONLY);
if (batt_fd <= 0)
return -1;
if (!batt_fd)
batt_fd = open ("/proc/apm", O_RDONLY);
if (batt_fd <= 0)
return -1;
if (lseek (batt_fd, 0, 0) != 0)
return -1;
if (lseek (batt_fd, 0, 0) != 0)
return -1;
if (read (batt_fd, str, sizeof (str) - 1) < 0)
return -1;
if (read (batt_fd, str, sizeof (str) - 1) < 0)
return -1;
if (3 > sscanf (str + 13, "0x%x 0x%x 0x%x %d", acstat, battstat, battflag, percent))
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 ()
{
static int first = 1;
static int first = 1;
if (first) {
first = 0;
sock_send_string (sock, "screen_add B\n");
}
if (first) {
first = 0;
sock_send_string (sock, "screen_add B\n");
}
return 0;
return 0;
}
int
batt_close ()
{
if (batt_fd)
close (batt_fd);
batt_fd = 0;
if (batt_fd)
close (batt_fd);
batt_fd = 0;
return 0;
return 0;
}
////////////////////////////////////////////////////////////////////////
@@ -74,116 +74,116 @@ batt_close ()
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) {
first = 0;
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");
}
}
// Only run once every 16 frames...
//if(rep&0x0f) return 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");
}
}
// 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 (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 (display)
sock_send_string (sock, tmp);
if (lcd_hgt >= 4) // 4-line version of the screen
{
sprintf (tmp, "widget_set B one 1 2 {");
switch (acstat) {
case 0:
sprintf (tmp + strlen (tmp), "AC: Off}\n");
break;
case 1:
sprintf (tmp + strlen (tmp), "AC: On}\n");
break;
case 2:
sprintf (tmp + strlen (tmp), "AC: Backup}\n");
break;
default:
sprintf (tmp + strlen (tmp), "AC: Unknown}\n");
break;
}
if (lcd_hgt >= 4) // 4-line version of the screen
{
sprintf (tmp, "widget_set B one 1 2 {");
switch (acstat) {
case 0:
sprintf (tmp + strlen (tmp), "AC: Off}\n");
break;
case 1:
sprintf (tmp + strlen (tmp), "AC: On}\n");
break;
case 2:
sprintf (tmp + strlen (tmp), "AC: Backup}\n");
break;
default:
sprintf (tmp + strlen (tmp), "AC: Unknown}\n");
break;
}
if (display)
sock_send_string (sock, tmp);
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);
sprintf (tmp, "widget_set B two 1 3 {");
if (battflag == 0xff) {
sprintf (tmp + strlen (tmp), "Battery Stat Unknown");
} else {
sprintf (tmp + strlen (tmp), "Batt:");
if (battflag & 1)
sprintf (tmp + strlen (tmp), " High");
if (battflag & 2)
sprintf (tmp + strlen (tmp), " Low");
if (battflag & 4)
sprintf (tmp + strlen (tmp), " Critical");
if (battflag & 8 || battstat == 3)
sprintf (tmp + strlen (tmp), " Charging");
if (battflag & 128)
sprintf (tmp + strlen (tmp), " (NONE)");
}
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
if (percent > 0) {
sprintf (tmp, "widget_set B gauge 2 4 %i\n", (percent * ((lcd_wid - 2) * lcd_cellwid) / 100));
if (display)
sock_send_string (sock, tmp);
}
} // end if(lcd_hgt >= 4)
else // two-line version of the screen
{
sprintf (tmp, "widget_set B one 1 2 {");
if (acstat == 1)
sprintf (tmp + strlen (tmp), "AC, ");
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???");
} 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 (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)");
}
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
}
}
return 0;
return 0;
}
+361 -361
View File
@@ -23,106 +23,106 @@ 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;
*up = uptime;
return 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 ()
{
struct utsname *unamebuf;
struct utsname *unamebuf;
if (!uptime_fd) {
unamebuf = (struct utsname *) malloc (sizeof (struct utsname));
uptime_fd = open ("/proc/uptime", O_RDONLY);
if (!uptime_fd) {
unamebuf = (struct utsname *) malloc (sizeof (struct utsname));
uptime_fd = open ("/proc/uptime", O_RDONLY);
#if 0
kversion_fd = open ("/proc/sys/kernel/osrelease", O_RDONLY);
kversion_fd = open ("/proc/sys/kernel/osrelease", O_RDONLY);
reread (kversion_fd, "main:");
sscanf (buffer, "%s", kver);
reread (kversion_fd, "main:");
sscanf (buffer, "%s", kver);
close (kversion_fd);
close (kversion_fd);
# endif
/* Get OS name and version from uname() */
if (uname (unamebuf) != 0) {
perror ("Error calling uname:");
}
strcpy (kver, unamebuf->release);
strcpy (sysname, unamebuf->sysname);
/* Get OS name and version from uname() */
if (uname (unamebuf) != 0) {
perror ("Error calling uname:");
}
strcpy (kver, unamebuf->release);
strcpy (sysname, unamebuf->sysname);
free (unamebuf);
free (unamebuf);
}
}
return 0;
return 0;
}
int
chrono_close ()
{
if (uptime_fd)
close (uptime_fd);
if (uptime_fd)
close (uptime_fd);
uptime_fd = 0;
uptime_fd = 0;
return 0;
return 0;
}
//////////////////////////////////////////////////////////////////////
@@ -139,133 +139,133 @@ chrono_close ()
int
time_screen (int rep, int display)
{
char hr[8], min[8], sec[8], ampm[8];
char day[16], month[16];
static int first = 1;
static int colons = 0;
time_t thetime;
struct tm *rtime;
double uptime, idle;
int i = 0;
char colon;
char hr[8], min[8], sec[8], ampm[8];
char day[16], month[16];
static int first = 1;
static int colons = 0;
time_t thetime;
struct tm *rtime;
double uptime, idle;
int i = 0;
char colon;
if (first) {
first = 0;
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)
colon = ':';
else
colon = ' ';
if (colons)
colon = ':';
else
colon = ' ';
time (&thetime);
rtime = localtime (&thetime);
time (&thetime);
rtime = localtime (&thetime);
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
sprintf (ampm, "%s", "A");
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
sprintf (ampm, "%s", "A");
sprintf (min, "%02d", rtime->tm_min);
sprintf (sec, "%02d", rtime->tm_sec);
sprintf (min, "%02d", rtime->tm_min);
sprintf (sec, "%02d", rtime->tm_sec);
strcpy (day, shortdays[rtime->tm_wday]);
strcpy (month, shortmonths[rtime->tm_mon]);
strcpy (day, shortdays[rtime->tm_wday]);
strcpy (month, shortmonths[rtime->tm_mon]);
///////////////////// Write the title bar (os name and version)
///////////////////// 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);
}
/////////////////////// Display the time...
if (lcd_hgt >= 4) {
get_uptime (&uptime, &idle);
idle = (idle * 100) / uptime;
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);
idle = (idle * 100) / uptime;
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);
// 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);
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);
// 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);
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);
if (colons)
sprintf (tmp, "%s %s:%s:%s", day, hr, min, sec);
else
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);
/////////////////////// 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);
if (colons)
sprintf (tmp, "%s %s:%s:%s", day, hr, min, sec);
else
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);
} 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);
}
} 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);
}
colons = colons ^ 1;
colons = colons ^ 1;
return 0;
} // End time_screen()
return 0;
} // End time_screen()
//////////////////////////////////////////////////////////////////////
// Clock Screen displays current time and date...
@@ -273,103 +273,103 @@ time_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];
static int first = 1;
static int colons = 0;
time_t thetime;
struct tm *rtime;
int i = 0;
char colon;
char hr[8], min[8], sec[8], ampm[8];
char day[16], month[16];
static int first = 1;
static int colons = 0;
time_t thetime;
struct tm *rtime;
int i = 0;
char colon;
if (lcd_hgt < 4)
return 0;
if (lcd_hgt < 4)
return 0;
if (first) {
first = 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)
colon = ':';
else
colon = ' ';
if (colons)
colon = ':';
else
colon = ' ';
time (&thetime);
rtime = localtime (&thetime);
time (&thetime);
rtime = localtime (&thetime);
strcpy (day, days[rtime->tm_wday]);
strcpy (day, days[rtime->tm_wday]);
if (TwentyFourHour) {
sprintf (hr, "%02d", rtime->tm_hour);
} else {
if (rtime->tm_hour > 12) {
i = 1;
sprintf (hr, "%02d", (rtime->tm_hour - 12));
} else {
i = 0;
sprintf (hr, "%02d", rtime->tm_hour);
}
}
if (rtime->tm_hour == 12)
i = 1;
sprintf (min, "%02d", rtime->tm_min);
sprintf (sec, "%02d", rtime->tm_sec);
if (i == 1) {
sprintf (ampm, "%s", "P");
} else {
sprintf (ampm, "%s", "A");
}
strcpy (month, months[rtime->tm_mon]);
if (TwentyFourHour) {
sprintf (hr, "%02d", rtime->tm_hour);
} else {
if (rtime->tm_hour > 12) {
i = 1;
sprintf (hr, "%02d", (rtime->tm_hour - 12));
} else {
i = 0;
sprintf (hr, "%02d", rtime->tm_hour);
}
}
if (rtime->tm_hour == 12)
i = 1;
sprintf (min, "%02d", rtime->tm_min);
sprintf (sec, "%02d", rtime->tm_sec);
if (i == 1) {
sprintf (ampm, "%s", "P");
} else {
sprintf (ampm, "%s", "A");
}
strcpy (month, months[rtime->tm_mon]);
if (lcd_hgt >= 4) // 4-line version of the screen
{
sprintf (tmp, "widget_set O two 1 3 {");
if (TwentyFourHour)
sprintf (tmp + strlen (tmp), "%s%c%s%c%s %s", hr, colon, min, colon, sec, day);
else
sprintf (tmp + strlen (tmp), "%s%c%s%c%s%s %s", hr, colon, min, colon, sec, ampm, day);
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
if (lcd_hgt >= 4) // 4-line version of the screen
{
sprintf (tmp, "widget_set O two 1 3 {");
if (TwentyFourHour)
sprintf (tmp + strlen (tmp), "%s%c%s%c%s %s", hr, colon, min, colon, sec, day);
else
sprintf (tmp + strlen (tmp), "%s%c%s%c%s%s %s", hr, colon, min, colon, sec, ampm, day);
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
sprintf (tmp, "widget_set O three 2 4 {");
sprintf (tmp + strlen (tmp), "%s %d, %d", month, rtime->tm_mday, (rtime->tm_year + 1900));
sprintf (tmp + strlen (tmp), "}\n");
if (display)
sock_send_string (sock, tmp);
} // 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 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);
}
colons = colons ^ 1;
colons = colons ^ 1;
return 0;
} // End clock_screen()
return 0;
} // End clock_screen()
////////////////////////////////////////////////////////////////////
// Uptime Screen shows info about system uptime and OS version
@@ -377,65 +377,65 @@ clock_screen (int rep, int display)
int
uptime_screen (int rep, int display)
{
int i;
char date[16], hour[8], min[8], sec[8];
double uptime, idle;
static int first = 1;
static int colons = 0;
char colon;
int i;
char date[16], hour[8], min[8], sec[8];
double uptime, idle;
static int first = 1;
static int colons = 0;
char colon;
if (first) {
first = 0;
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)
colon = ':';
else
colon = ' ';
if (colons)
colon = ':';
else
colon = ' ';
get_uptime (&uptime, &idle);
i = (int) uptime / 86400;
sprintf (date, "%d day%s,", i, (i != 1 ? "s" : ""));
i = ((int) uptime % 86400) / 60 / 60;
sprintf (hour, "%02i", i);
i = (((int) uptime % 86400) % 3600) / 60;
sprintf (min, "%02i", i);
i = ((int) uptime % 60);
sprintf (sec, "%02i", i);
sprintf (tmp, "%s %s%c%s%c%s", date, hour, colon, min, colon, sec);
i = ((20 - strlen (tmp)) / 2) + 1;
get_uptime (&uptime, &idle);
i = (int) uptime / 86400;
sprintf (date, "%d day%s,", i, (i != 1 ? "s" : ""));
i = ((int) uptime % 86400) / 60 / 60;
sprintf (hour, "%02i", i);
i = (((int) uptime % 86400) % 3600) / 60;
sprintf (min, "%02i", i);
i = ((int) uptime % 60);
sprintf (sec, "%02i", i);
sprintf (tmp, "%s %s%c%s%c%s", date, hour, colon, min, colon, sec);
i = ((20 - strlen (tmp)) / 2) + 1;
if (lcd_hgt >= 4)
sprintf (buffer, "widget_set U two %i 3 {%s}\n", i, tmp);
else
sprintf (buffer, "widget_set U one %i 2 {%s}\n", i, tmp);
if (display)
sock_send_string (sock, buffer);
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);
colons = colons ^ 1;
colons = colons ^ 1;
return 0;
} // End uptime_screen()
return 0;
} // End uptime_screen()
//////////////////////////////////////////////////////////////////////
// Big Clock Screen displays current time...
@@ -452,61 +452,61 @@ uptime_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;
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;
char fulltxt[16], old_fulltxt[16];
int j = 0;
char fulltxt[16], old_fulltxt[16];
int j = 0;
if (lcd_hgt < 4)
return 0;
if (lcd_hgt < 4)
return 0;
if (first) {
first = 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()
return 0;
} // End big_clock_screen()
+266 -266
View File
@@ -12,7 +12,7 @@
#include "cpu.h"
struct load {
unsigned long total, user, system, nice, idle;
unsigned long total, user, system, nice, idle;
};
int load_fd = 0;
@@ -21,43 +21,43 @@ 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 ()
{
if (!load_fd) {
load_fd = open ("/proc/stat", O_RDONLY);
}
if (!load_fd) {
load_fd = open ("/proc/stat", O_RDONLY);
}
return 0;
return 0;
}
int
cpu_close ()
{
if (load_fd)
close (load_fd);
if (load_fd)
close (load_fd);
load_fd = 0;
load_fd = 0;
return 0;
return 0;
}
//////////////////////////////////////////////////////////////////////////
@@ -68,193 +68,193 @@ 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
struct load load;
int i, j, n;
static int first = 1;
float value;
static float cpu[CPU_BUF_SIZE + 1][5]; // last buffer is scratch
struct load load;
if (first) {
first = 0;
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");
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, "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");
}
return 0;
}
//else return 0;
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];
// 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];
// 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;
// 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;
// Only clear on first display...
if (!rep) {
/*
// 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];
*/
}
// Average values for final result
for (i = 0; i < 5; i++) {
value = 0;
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[j][i];
}
value /= CPU_BUF_SIZE;
cpu[CPU_BUF_SIZE][i] = value;
}
// Only clear on first display...
if (!rep) {
/*
// 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];
*/
}
// Average values for final result
for (i = 0; i < 5; i++) {
value = 0;
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[j][i];
}
value /= CPU_BUF_SIZE;
cpu[CPU_BUF_SIZE][i] = value;
}
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);
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][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][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][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][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);
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);
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][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][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][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);
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()
return 0;
} // End cpu_screen()
//////////////////////////////////////////////////////////////////////////
// Cpu Graph Screen shows a quick-moving histogram of CPU use.
@@ -262,95 +262,95 @@ cpu_screen (int rep, int display)
int
cpu_graph_screen (int rep, int display)
{
int i, j, n = 0;
static int first = 1;
float value, maxload;
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 int cpu_past[LCD_MAX_WIDTH];
struct load load;
int status = 0;
static float cpu[CPU_BUF_SIZE + 1]; // last buffer is scratch
static int cpu_past[LCD_MAX_WIDTH];
struct load load;
int status = 0;
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);
} 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);
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);
} 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);
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];
// Shift values over by one
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;
// Read new data
cpu[CPU_BUF_SIZE - 1] = ((float) load.user + (float) load.system + (float) load.nice) / (float) load.total;
// Only clear on first display...
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];
*/
}
// Average values for final result
value = 0;
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[j];
}
value /= (float) CPU_BUF_SIZE;
cpu[CPU_BUF_SIZE] = value;
// Only clear on first display...
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];
*/
}
// Average values for final result
value = 0;
for (j = 0; j < CPU_BUF_SIZE; j++) {
value += cpu[j];
}
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);
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);
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));
else
n = (int) (value * (float) (lcd_cellhgt) * (float) (lcd_hgt));
value = cpu[CPU_BUF_SIZE];
if (lcd_hgt > 2)
n = (int) (value * (float) (lcd_cellhgt) * (float) (lcd_hgt - 1));
else
n = (int) (value * (float) (lcd_cellhgt) * (float) (lcd_hgt));
cpu_past[lcd_wid - 1] = n;
sprintf (tmp, "widget_set G %i %i %i %i\n", lcd_wid, lcd_wid, lcd_hgt, n);
if (display)
sock_send_string (sock, tmp);
cpu_past[lcd_wid - 1] = n;
sprintf (tmp, "widget_set G %i %i %i %i\n", lcd_wid, lcd_wid, lcd_hgt, n);
if (display)
sock_send_string (sock, tmp);
if (n > maxload)
maxload = n;
if (n > maxload)
maxload = n;
if (cpu_past[lcd_wid - 1] > 0)
status = BACKLIGHT_ON;
if (maxload < 1)
status = BACKLIGHT_OFF;
if (cpu_past[lcd_wid - 1] > 0)
status = BACKLIGHT_ON;
if (maxload < 1)
status = BACKLIGHT_OFF;
// return status;
return 0;
} // End cpu_graph_screen()
return 0;
} // End cpu_graph_screen()
+119 -119
View File
@@ -59,7 +59,7 @@
#define MAX_CPUS 8
struct load {
unsigned long total, user, system, nice, idle;
unsigned long total, user, system, nice, idle;
};
static int load_fd = 0;
@@ -69,62 +69,62 @@ static char *numnames[MAX_CPUS] = { "one", "two", "three", "four", "five", "six"
static void
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);
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;
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");
}
(*numcpus)++;
}
} else {
break;
}
token = strtok (NULL, "\n");
}
}
int
cpu_smp_init ()
{
if (!load_fd) {
load_fd = open ("/proc/stat", O_RDONLY);
}
if (!load_fd) {
load_fd = open ("/proc/stat", O_RDONLY);
}
return 0;
return 0;
}
int
cpu_smp_close ()
{
if (load_fd)
close (load_fd);
if (load_fd)
close (load_fd);
load_fd = 0;
load_fd = 0;
return 0;
return 0;
}
//////////////////////////////////////////////////////////////////////////
@@ -135,105 +135,105 @@ 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
struct load load[MAX_CPUS];
int numprocs;
char buf[256];
char *graphsize;
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
struct load load[MAX_CPUS];
int numprocs;
char buf[256];
char *graphsize;
if (first) {
first = 0;
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] = ' ';
}
} else {
for (i = 0; i < lcd_wid - 6; i++) {
graphsize[i] = ' ';
}
}
graphsize = calloc (sizeof (char), lcd_wid);
if (numprocs > lcd_hgt) {
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 < 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);
free (graphsize);
return 0;
}
return 0;
}
get_load (load, &numprocs);
get_load (load, &numprocs);
for (z = 0; z < numprocs; z++) {
for (z = 0; z < numprocs; z++) {
// Shift values over by one
for (i = 0; i < (CPU_BUF_SIZE - 1); i++)
for (j = 4; j < 5; j++)
cpu[z][i][j] = cpu[z][i + 1][j];
// 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;
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 (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 (z + 1 > lcd_hgt * 2)
break;
}
return 0;
} // End cpu_screen()
return 0;
} // End cpu_screen()
+138 -138
View File
@@ -36,79 +36,79 @@
FILE *mtab_fd;
typedef struct mounts {
char dev[256], type[64], mpoint[256];
long bsize, blocks, bfree, files, ffree;
char dev[256], type[64], mpoint[256];
long bsize, blocks, bfree, files, ffree;
} mounts;
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;
char line[256];
int x = 0, y;
mtab_fd = fopen ("/etc/mtab", "r");
mtab_fd = fopen ("/etc/mtab", "r");
// Get rid of old, unmounted filesystems...
memset (fs, 0, sizeof (mounts) * 256);
// 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;
}
while (x < 256) {
if (fgets (line, 256, mtab_fd) == NULL) {
fclose (mtab_fd);
return x;
}
sscanf (line, "%s %s %s", fs[x].dev, fs[x].mpoint, fs[x].type);
sscanf (line, "%s %s %s", fs[x].dev, fs[x].mpoint, fs[x].type);
if (strcmp (fs[x].type, "proc")
if (strcmp (fs[x].type, "proc")
#ifndef STAT_NFS
&& strcmp (fs[x].type, "nfs")
&& strcmp (fs[x].type, "nfs")
#endif
#ifndef STAT_SMBFS
&& strcmp (fs[x].type, "smbfs")
&& strcmp (fs[x].type, "smbfs")
#endif
) {
) {
#ifdef STAT_STATVFS
y = statvfs (fs[x].mpoint, &fsinfo);
y = statvfs (fs[x].mpoint, &fsinfo);
#elif STAT_STATFS2_BSIZE
y = statfs (fs[x].mpoint, &fsinfo);
y = statfs (fs[x].mpoint, &fsinfo);
#elif STAT_STATFS4
y = statfs (fs[x].mpoint, &fsinfo, sizeof (fsinfo), 0);
y = statfs (fs[x].mpoint, &fsinfo, sizeof (fsinfo), 0);
#else
#error "statfs for this system noy yet supported"
#endif
fs[x].blocks = fsinfo.f_blocks;
if (fs[x].blocks > 0) {
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++;
}
}
}
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;
fclose (mtab_fd);
return x;
}
int
disk_init ()
{
return 0;
return 0;
}
int
disk_close ()
{
return 0;
return 0;
}
///////////////////////////////////////////////////////////////////////////
@@ -122,123 +122,123 @@ disk_close ()
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;
} table[256];
int i;
static int num_disks = 0;
static int first = 1; // First line to display, sort of.
// Holds info to display (avoid recalculating it)
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.
#define huge long long int
huge size;
huge size;
if (first) {
first = 0;
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, "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");
}
// Grab disk stats on first display, and fill "table".
// Get rid of old, unmounted filesystems...
memset (table, 0, sizeof (struct disp) * 256);
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");
}
// 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;
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);
}
// 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;
//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);
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);
// 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);
// 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);
// 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);
// Kilobytes
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);
// 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);
// 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);
// 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);
// 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);
}
}
}
}
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(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...
{
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);
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(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...
{
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);
}
// 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);
}
num_disks = count;
num_disks = count;
#undef huge
@@ -248,5 +248,5 @@ disk_screen (int rep, int display)
// /dos/c 2.1G E----F
// /stuff 4.3G E----F
*/
return 0;
return 0;
}
+87 -87
View File
@@ -17,31 +17,31 @@ 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 ()
{
if (!loadavg_fd)
loadavg_fd = open ("/proc/loadavg", O_RDONLY);
if (!loadavg_fd)
loadavg_fd = open ("/proc/loadavg", O_RDONLY);
return 0;
return 0;
}
int
load_close ()
{
if (loadavg_fd)
close (loadavg_fd);
if (loadavg_fd)
close (loadavg_fd);
loadavg_fd = 0;
loadavg_fd = 0;
return 0;
return 0;
}
///////////////////////////////////////////////////////////////////////////
@@ -51,89 +51,89 @@ load_close ()
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;
int status = 0;
static int first = 1;
static float loads[LCD_MAX_WIDTH];
int n, i;
float loadmax = 0, factor, x;
int status = 0;
if (first) // Only the first time this is ever called...
{
first = 0;
memset (loads, 0, sizeof (float) * LCD_MAX_WIDTH);
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);
// 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);
}
// 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");
} 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, "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);
}
// 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");
} 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);
}
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);
//if(display) sock_send_string(sock, tmp);
sock_send_string (sock, tmp);
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);
if (loadmax < 1.0)
factor = (float) (lcd_cellhgt) * ((lcd_hgt == 2) ? 2.0 : 3.0);
else
factor = (float) (lcd_cellhgt) * ((lcd_hgt == 2) ? 2.0 : 3.0) / (float) n;
if (loadmax < 1.0)
factor = (float) (lcd_cellhgt) * ((lcd_hgt == 2) ? 2.0 : 3.0);
else
factor = (float) (lcd_cellhgt) * ((lcd_hgt == 2) ? 2.0 : 3.0) / (float) n;
for (n = 0; n < lcd_wid - 1; n++) {
x = (loads[n] * factor);
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);
//if(display) sock_send_string(sock, tmp);
sock_send_string (sock, tmp);
}
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;
}
// And now the title...
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]);
//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;
}
// And now the title...
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]);
//if(display) sock_send_string(sock, tmp);
sock_send_string (sock, tmp);
return status;
} // End xload_screen()
return status;
} // End xload_screen()
+238 -238
View File
@@ -47,24 +47,24 @@ void main_loop (mode * sequence);
// Contains a list of modes to run
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.
@@ -74,123 +74,123 @@ mode default_sequence[] = {
int
main (int argc, char **argv)
{
mode sequence[MAX_SEQUENCE];
char cfgfile[256] = "/etc/lcdproc.cf";
char server[256] = "localhost";
int port = LCDPORT;
int i, j, k;
int tmp;
mode sequence[MAX_SEQUENCE];
char cfgfile[256] = "/etc/lcdproc.cf";
char server[256] = "localhost";
int port = LCDPORT;
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);
// and "kill"...
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
signal (SIGKILL, exit_program);
// Ctrl-C will cause a clean exit...
signal (SIGINT, exit_program);
// and "kill"...
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
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
case 'S':
case 's':
if (argc < i + 1)
HelpScreen ();
strcpy (server, argv[++i]);
break;
// p is for port
case 'P':
case 'p':
if (argc < i + 1)
HelpScreen ();
port = atoi (argv[++i]);
if (port < 1 && port > 0xffff)
fprintf (stderr, "Warning: Port %i outside of standard range\n", port);
break;
// 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
case 'S':
case 's':
if (argc < i + 1)
HelpScreen ();
strcpy (server, argv[++i]);
break;
// p is for port
case 'P':
case 'p':
if (argc < i + 1)
HelpScreen ();
port = atoi (argv[++i]);
if (port < 1 && port > 0xffff)
fprintf (stderr, "Warning: Port %i outside of standard range\n", port);
break;
// otherwise... Get help!
default:
HelpScreen ();
break;
}
// Parse command line here... read the man page.
else if (strlen (argv[i]) == 1) {
// Grab the mode letter...
sequence[j].which = argv[i][0];
// otherwise... Get help!
default:
HelpScreen ();
break;
}
// Parse command line here... read the man page.
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;
break;
}
}
if (!tmp) {
printf ("Invalid Mode: %c\n", argv[i][0]);
exit (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;
break;
}
}
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 {
// A multicharacter parameter by itself
// is assumed to be a config file..
strcpy (cfgfile, argv[i]);
printf ("Ignoring config file: %s\n", cfgfile);
}
}
j++;
// Set the last element to 0...
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);
}
}
// 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);
return 0;
}
sock_send_string (sock, "hello\n");
usleep (500000); // wait for the server to say hi.
// 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);
return 0;
}
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;
// 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);
// Init the status gatherers...
mode_init (sequence);
// And spew stuff!
main_loop (sequence);
// And spew stuff!
main_loop (sequence);
// Clean up
exit_program (0);
return 0;
// Clean up
exit_program (0);
return 0;
}
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);
}
///////////////////////////////////////////////////////////////////
@@ -199,10 +199,10 @@ HelpScreen ()
void
exit_program (int val)
{
Quit = 1;
sock_close (sock);
mode_close ();
exit (0);
Quit = 1;
sock_close (sock);
mode_close ();
exit (0);
}
///////////////////////////////////////////////////////////////////
@@ -211,126 +211,126 @@ exit_program (int val)
void
main_loop (mode * sequence)
{
int i = 0, j;
//int status=0;
char buf[8192];
char *argv[256];
int argc, newtoken;
int len;
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) {
// Check for server input...
len = sock_recv (sock, buf, 8000);
// Main loop
// Run whatever screen we want, then wait. Woo-hoo!
while (!Quit) {
// Check for server input...
len = sock_recv (sock, buf, 8000);
// Handle server input...
while (len > 0) {
// Now split the string into tokens...
//for(i=0; i<argc; i++) argv[i]=NULL; // Get rid of old tokens
argc = 0;
newtoken = 1;
for (i = 0; i < len; i++) {
if (buf[i]) // For regular letters, keep tokenizing...
{
switch (buf[i]) {
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...
{
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]) {
sequence[j].visible = 1;
//debug("Listen %s\n", argv[1]);
// Handle server input...
while (len > 0) {
// Now split the string into tokens...
//for(i=0; i<argc; i++) argv[i]=NULL; // Get rid of old tokens
argc = 0;
newtoken = 1;
for (i = 0; i < len; i++) {
if (buf[i]) // For regular letters, keep tokenizing...
{
switch (buf[i]) {
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...
{
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]) {
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]) {
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")) {
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]);
}
sock_send_string (sock, "client_set -name LCDproc\n");
} else if (0 == strcmp (argv[0], "bye")) {
//printf("Exiting LCDproc\n");
exit_program (0);
} else {
int j;
for (j = 0; j < argc; j++)
printf ("%s ", argv[j]);
printf ("\n");
}
}
argc = 0;
newtoken = 1;
}
}
}
} 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]);
len = sock_recv (sock, buf, 8000);
//debug("\n");
}
// Gather stats...
// Update screens...
for (i = 0; sequence[i].which > 1; i++) {
sequence[i].timer++;
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);
}
} 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);
}
} else {
if (sequence[i].timer >= sequence[i].off_time) {
sequence[i].timer = 0;
// Now, update the screen...
update_screen (sequence + i, 0);
}
}
}
}
} 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]);
}
sock_send_string (sock, "client_set -name LCDproc\n");
} else if (0 == strcmp (argv[0], "bye")) {
//printf("Exiting LCDproc\n");
exit_program (0);
} else {
int j;
for (j = 0; j < argc; j++)
printf ("%s ", argv[j]);
printf ("\n");
}
}
}
argc = 0;
newtoken = 1;
}
}
len = sock_recv (sock, buf, 8000);
//debug("\n");
}
// Gather stats...
// Update screens...
for (i = 0; sequence[i].which > 1; i++) {
sequence[i].timer++;
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);
}
} 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);
}
} else {
if (sequence[i].timer >= sequence[i].off_time) {
sequence[i].timer = 0;
// Now, update the screen...
update_screen (sequence + i, 0);
}
}
}
}
// Now sleep...
usleep (TIME_UNIT);
// Now sleep...
usleep (TIME_UNIT);
/* Old stuff
timer=0;
@@ -398,5 +398,5 @@ main_loop (mode * sequence)
i++;
if(sequence[i].which < 2) i=0;
*/
}
}
}
+6 -6
View File
@@ -12,12 +12,12 @@ extern int lcd_cellwid;
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;
#define BLINK_ON 0x10
+305 -305
View File
@@ -16,7 +16,7 @@
#include "mem.h"
struct meminfo {
int total, cache, buffers, free, shared;
int total, cache, buffers, free, shared;
};
int meminfo_fd = 0;
@@ -28,35 +28,35 @@ 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 ()
{
if (!meminfo_fd) {
meminfo_fd = open ("/proc/meminfo", O_RDONLY);
}
if (!meminfo_fd) {
meminfo_fd = open ("/proc/meminfo", O_RDONLY);
}
return 0;
return 0;
}
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;
meminfo_fd = 0;
return 0;
return 0;
}
/////////////////////////////////////////////////////////////////////////
@@ -65,343 +65,343 @@ mem_close ()
int
mem_screen (int rep, int display)
{
int n;
struct meminfo mem[2];
static int first = 1;
static int which_title = 0;
float value;
int n;
struct meminfo mem[2];
static int first = 1;
static int which_title = 0;
float value;
if (first) {
first = 0;
if (first) {
first = 0;
sock_send_string (sock, "screen_add M\n");
sprintf (buffer, "screen_set M -name {Memory & Swap: %s}\n", host);
sock_send_string (sock, buffer);
sock_send_string (sock, "screen_add M\n");
sprintf (buffer, "screen_set M -name {Memory & Swap: %s}\n", host);
sock_send_string (sock, buffer);
if (lcd_hgt >= 4) {
sock_send_string (sock, "widget_add M title title\n");
sock_send_string (sock, "widget_set M title { MEM -==- SWAP}\n");
sock_send_string (sock, "widget_add M totl string\n");
sock_send_string (sock, "widget_add M used string\n");
sock_send_string (sock, "widget_set M totl 9 2 Totl\n");
sock_send_string (sock, "widget_set M used 9 3 Free\n");
sock_send_string (sock, "widget_add M EF string\n");
sock_send_string (sock, "widget_set M EF 1 4 {E F E F}\n");
sock_send_string (sock, "widget_add M memused string\n");
sock_send_string (sock, "widget_add M swapused string\n");
//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");
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_set M memgauge 8 1 0\n");
//sock_send_string(sock, "widget_set M swapgauge 8 2 0\n");
}
sock_send_string (sock, "widget_add M memtotl string\n");
sock_send_string (sock, "widget_add M swaptotl string\n");
sock_send_string (sock, "widget_add M memtotl string\n");
sock_send_string (sock, "widget_add M swaptotl string\n");
sock_send_string (sock, "widget_add M memgauge hbar\n");
sock_send_string (sock, "widget_add M swapgauge hbar\n");
sock_send_string (sock, "widget_add M memgauge hbar\n");
sock_send_string (sock, "widget_add M swapgauge hbar\n");
//sock_send_string(sock, "\n");
}
//sock_send_string(sock, "\n");
}
get_mem_info (mem);
get_mem_info (mem);
// flip the title back and forth...
if (lcd_hgt >= 4) {
if (which_title & 4) {
sprintf (buffer, "widget_set M title {%s}\n", host);
sock_send_string (sock, buffer);
} else
sock_send_string (sock, "widget_set M title { MEM -==- SWAP}\n");
which_title = (which_title + 1) & 7;
// 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;
// Total memory
sprintf (tmp, "widget_set M memtotl 1 2 {%6dk}\n", mem[0].total);
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);
// 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);
// 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);
// 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 swap
sprintf (tmp, "widget_set M swapused 14 3 {%6dk}\n", mem[1].free);
if (display)
sock_send_string (sock, tmp);
// Free memory graph
n = (int) (35.0 - ((float) mem[0].free + (float) mem[0].buffers + (float) mem[0].cache)
/ (float) mem[0].total * 35.0);
sprintf (tmp, "widget_set M memgauge 2 4 %i\n", n);
if (display)
sock_send_string (sock, tmp);
// 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);
// 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 swap
sprintf (tmp, "widget_set M swaptotl 2 2 {%4dM}\n", (int) (mem[1].total / 1024.0));
if (display)
sock_send_string (sock, tmp);
// Total swap
sprintf (tmp, "widget_set M swaptotl 2 2 {%4dM}\n", (int) (mem[1].total / 1024.0));
if (display)
sock_send_string (sock, tmp);
// 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
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);
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);
// 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);
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()
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;
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)
{
proc_mem_info *one, *two;
proc_mem_info *one, *two;
if (!a)
return 0;
if (!b)
return 0;
if (!a)
return 0;
if (!b)
return 0;
one = (proc_mem_info *) a;
two = (proc_mem_info *) b;
one = (proc_mem_info *) a;
two = (proc_mem_info *) b;
return (two->totl > one->totl);
return (two->totl > one->totl);
}
int
mem_top_screen (int rep, int display)
{
// Much of this code was ripped from "gmemusage"
char buf[128];
// Much of this code was ripped from "gmemusage"
char buf[128];
DIR *proc;
FILE *StatusFile;
struct dirent *procdir;
DIR *proc;
FILE *StatusFile;
struct dirent *procdir;
char procName[16];
int
procSize, procRSS, procData, procStk, procExe;
const char
*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);
char procName[16];
int
procSize, procRSS, procData, procStk, procExe;
const char
*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);
int threshold = 400, unique;
int i;
proc_mem_info *p;
LL *procs;
static int first = 1;
int threshold = 400, unique;
int i;
proc_mem_info *p;
LL *procs;
static int first = 1;
if (first) {
first = 0;
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");
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 1 1 1 Checking...\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 1 1 1 Checking...\n");
}
procs = LL_new ();
if (!procs) {
fprintf (stderr, "mem_top_screen: Error allocating list\n");
return -1;
}
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 ("");
return -1;
}
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;
}
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;
}
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) {
// Figure out if it's sharing any memory...
unique = 1;
LL_Rewind (procs);
do {
p = LL_Get (procs);
if (p) {
if (0 == strcmp (p->name, procName)) {
unique = 0;
p->number++;
p->totl += procData + procStk + procExe;
}
}
} while (LL_Next (procs) == 0);
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) {
// 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;
}
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) {
// Figure out if it's sharing any memory...
unique = 1;
LL_Rewind (procs);
do {
p = LL_Get (procs);
if (p) {
if (0 == strcmp (p->name, procName)) {
unique = 0;
p->number++;
p->totl += procData + procStk + procExe;
}
}
} 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!
}
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);
}
}
// 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!
}
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);
}
}
}
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) {
//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);
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);
}
// 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) {
//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);
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);
}
LL_Next (procs);
}
LL_Next (procs);
}
end: // Ack! I hate using labels!
// Now clean it all up...
LL_Rewind (procs);
do {
p = (proc_mem_info *) LL_Get (procs);
if (p) {
//printf("Proc: %6ik %s\n", p->size, p->name);
free (p);
}
} while (LL_Next (procs) == 0);
LL_Destroy (procs);
end: // Ack! I hate using labels!
// Now clean it all up...
LL_Rewind (procs);
do {
p = (proc_mem_info *) LL_Get (procs);
if (p) {
//printf("Proc: %6ik %s\n", p->size, p->name);
free (p);
}
} while (LL_Next (procs) == 0);
LL_Destroy (procs);
return 0;
return 0;
} // End mem_top_screen()
} // End mem_top_screen()
+200 -200
View File
@@ -42,211 +42,211 @@ int getentry (const char *tag, const char *bufptr);
int
mode_init (mode * sequence)
{
int i;
struct utsname Uname;
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;
}
// 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;
}
// 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;
}
}
// 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;
}
}
return 0;
return 0;
}
void
mode_close ()
{
batt_close ();
chrono_close ();
cpu_close ();
disk_close ();
load_close ();
mem_close ();
cpu_smp_close ();
batt_close ();
chrono_close ();
cpu_close ();
disk_close ();
load_close ();
mem_close ();
cpu_smp_close ();
}
int
update_screen (mode * m, int display)
{
static int status = -1;
int old_status = status;
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;
}
/* Debugging tool...
if(display)
{
printf("Displayed Mode %c\n", m->which);
}
*/
}
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 (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 == BLINK_ON) {
sock_send_string (sock, "backlight blink\n");
}
}
return status;
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 == BLINK_ON) {
sock_send_string (sock, "backlight blink\n");
}
}
return status;
}
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)
{
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;
}
///////////////////////////////////////////////////////////////////////////
@@ -263,28 +263,28 @@ char tmp[1024];
int
credit_screen (int rep, int display)
{
static int first = 1;
static int first = 1;
if (first) {
first = 0;
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()
return 0;
} // End credit_screen()
+47 -47
View File
@@ -19,66 +19,66 @@
int
client_data_init (client_data * d)
{
if (!d)
return -1;
if (!d)
return -1;
d->ack = 0;
d->name = NULL;
d->ack = 0;
d->name = NULL;
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)
{
fprintf(stderr, "client_data_init: Error allocating menulist\n");
return -1;
}
*/
return 0;
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)
{
fprintf(stderr, "client_data_init: Error allocating menulist\n");
return -1;
}
*/
return 0;
}
int
client_data_destroy (client_data * d)
{
screen *s;
screen *s;
debug ("client_data_destroy\n");
debug ("client_data_destroy\n");
if (!d)
return -1;
if (!d)
return -1;
d->ack = 0;
d->ack = 0;
// Clean up the name...
if (d->name)
free (d->name);
// Clean up the name...
if (d->name)
free (d->name);
// Clean up the 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);
// Clean up the 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);
// FIXME? This shouldn't be handled here...
// Now, remove it from the screenlist...
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf (stderr, "client_data_destroy: Error dequeueing screen\n");
return 0;
}
// Free its memory...
screen_destroy (s);
}
} while (LL_Next (d->screenlist) == 0);
LL_Destroy (d->screenlist);
// FIXME? This shouldn't be handled here...
// Now, remove it from the screenlist...
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf (stderr, "client_data_destroy: Error dequeueing screen\n");
return 0;
}
// Free its memory...
screen_destroy (s);
}
} while (LL_Next (d->screenlist) == 0);
LL_Destroy (d->screenlist);
// TODO: clean up the rest of the data...
// TODO: clean up the rest of the data...
return 0;
return 0;
}
+6 -6
View File
@@ -6,12 +6,12 @@
#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;
int ack;
char *name;
// and other stuff... doesn't matter yet
LL *screenlist;
// list of accepted keys... (?)
LL *menulist;
} client_data;
+609 -609
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -7,8 +7,8 @@
*/
typedef struct client_function {
char *keyword;
int (*function) (client * c, int argc, char **argv);
char *keyword;
int (*function) (client * c, int argc, char **argv);
} client_function;
// FIXME? Do these really need to be visible from other sources?
+7 -7
View File
@@ -9,16 +9,16 @@
*/
typedef struct client_menu {
char id[];
LL *items;
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
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;
#endif
+130 -130
View File
@@ -26,120 +26,120 @@ LL *clients;
int
client_init ()
{
debug ("client_init()\n");
debug ("client_init()\n");
clients = LL_new ();
if (!clients) {
fprintf (stderr, "client_init: Unable to create client list\n");
return -1;
}
clients = LL_new ();
if (!clients) {
fprintf (stderr, "client_init: Unable to create client list\n");
return -1;
}
return 0;
return 0;
}
int
client_shutdown ()
{
// TODO: Close all connections first...
client *c;
// 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");
} else {
debug ("client_shutdown: Freed client...\n");
}
} else {
debug ("client_shutdown: No client!\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");
} else {
debug ("client_shutdown: Freed client...\n");
}
} else {
debug ("client_shutdown: No client!\n");
}
}
// Then, free the list...
LL_Destroy (clients);
// Then, free the list...
LL_Destroy (clients);
debug ("client_shutdown: done\n");
debug ("client_shutdown: done\n");
return 0;
return 0;
}
// Create and destroy clients....
client *
client_create (int sock)
{
client *c;
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");
return NULL;
}
// Init struct members
c->sock = 0;
c->data = NULL;
c->messages = NULL;
// Allocate new client...
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;
c->messages = NULL;
c->sock = 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);
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);
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);
// Set up message list...
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);
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);
return c;
return c;
}
int
client_destroy (client * c)
{
// TODO: Close the socket connection here?
int err;
// TODO: Close the socket connection here?
int err;
char *str;
char *str;
debug ("client_destroy()\n");
debug ("client_destroy()\n");
if (!c)
return -1;
if (!c)
return -1;
// Eat the rest of the incoming requests...
debug ("client_destroy: get_messages\n");
while ((str = client_get_message (c))) {
if (str) {
debug ("client_destroy: kill message %s\n", str);
free (str);
}
}
// 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);
}
}
err = LL_Destroy (c->messages);
err = LL_Destroy (c->messages);
// Free client's other data
client_data_destroy (c->data);
// Free client's other data
client_data_destroy (c->data);
/*
// FIXME? Should the connection get closed here or elsewhere?
@@ -147,52 +147,52 @@ client_destroy (client * c)
c->sock = 0;
*/
// Remove the client from the clients list...
LL_Remove (clients, c);
// Remove the client from the clients list...
LL_Remove (clients, c);
free (c);
free (c);
return 0;
return 0;
}
// Add and remove messages from the client's queue...
int
client_add_message (client * c, char *message)
{
int err = 0;
char *dup;
char *str, *cp;
char delimiters[] = "\n\r\0";
int err = 0;
char *dup;
char *str, *cp;
char delimiters[] = "\n\r\0";
// int len;
//debug("client_add_message(%s)\n", message);
//debug("client_add_message(%s)\n", message);
if (!c)
return -1;
if (!message)
return -1;
if (!c)
return -1;
if (!message)
return -1;
// len = strlen(message);
// if(len < 1) return 0;
// Copy the string to avoid overwriting the original...
dup = strdup (message);
if (!dup) {
fprintf (stderr, "client_add_message: Error allocating new string\n");
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);
}
// Copy the string to avoid overwriting the original...
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);
}
//debug("client_add_message(%s): %i errors\n", message, err);
free (dup); // Fixed memory leak...
//debug("client_add_message(%s): %i errors\n", message, err);
free (dup); // Fixed memory leak...
// Err is the number of errors encountered...
return err;
// Err is the number of errors encountered...
return err;
}
@@ -200,54 +200,54 @@ client_add_message (client * c, char *message)
char *
client_get_message (client * c)
{
char *str;
char *str;
//debug("client_get_message()\n");
//debug("client_get_message()\n");
if (!c)
return NULL;
if (!c)
return NULL;
str = (char *) LL_Dequeue (c->messages);
str = (char *) LL_Dequeue (c->messages);
//debug("client_get_message: \"%s\"\n", str);
//debug("client_get_message: \"%s\"\n", str);
return str;
return str;
}
// Get and set the client's data...
int
client_set (client * c, void *data)
{
// You know, I really doubt this function will be useful...
return 0;
// You know, I really doubt this function will be useful...
return 0;
}
void *
client_get (client * c)
{
// But this one might be handy...
// But this one might be handy...
return NULL;
return NULL;
}
client *
client_find_sock (int sock)
{
client *c;
client *c;
// debug("client_find_sock(%i)\n", sock);
LL_Rewind (clients);
do {
c = (client *) LL_Get (clients);
LL_Rewind (clients);
do {
c = (client *) LL_Get (clients);
// debug("client_find_sock: ... %i ...\n", c->sock);
if (c->sock == sock) {
if (c->sock == sock) {
// debug("client_find_sock: ..! %i !..\n", c->sock);
return c;
}
} while (LL_Next (clients) == 0);
return c;
}
} while (LL_Next (clients) == 0);
debug ("client_find_sock: failed\n");
debug ("client_find_sock: failed\n");
return NULL;
return NULL;
}
+3 -3
View File
@@ -5,9 +5,9 @@
#include "../shared/LL.h"
typedef struct client {
int sock;
LL *messages;
client_data *data;
int sock;
LL *messages;
client_data *data;
} client;
+435 -435
View File
File diff suppressed because it is too large Load Diff
+675 -675
View File
File diff suppressed because it is too large Load Diff
+152 -152
View File
@@ -35,100 +35,100 @@ static char icon_char = '@';
int
curses_drv_init (struct lcd_logical_driver *driver, char *args)
{
char *argv[64];
int argc;
int i, j;
char *argv[64];
int argc;
int i, j;
argc = get_args (argv, args, 64);
argc = get_args (argv, args, 64);
for (i = 0; i < argc; i++) {
if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--forecolor")) {
if (i + 1 > argc) {
fprintf (stderr, "curses_init: %s requires an argument\n", argv[i]);
return -1;
}
// TODO: color display in curses driver!
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]);
return -1;
}
// TODO: color display in curses driver!
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]);
return -1;
}
// TODO: color display in curses driver!
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");
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
for (i = 0; i < argc; i++) {
if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--forecolor")) {
if (i + 1 > argc) {
fprintf (stderr, "curses_init: %s requires an argument\n", argv[i]);
return -1;
}
// TODO: color display in curses driver!
printf ("Sorry, colors not yet implemented...\n");
//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]);
return -1;
}
// TODO: color display in curses driver!
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]);
return -1;
}
// TODO: color display in curses driver!
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");
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
}
curses_drv = driver;
curses_drv = driver;
// Init curses...
initscr ();
cbreak ();
noecho ();
nodelay (stdscr, TRUE);
nonl ();
intrflush (stdscr, FALSE);
keypad (stdscr, TRUE);
// Init curses...
initscr ();
cbreak ();
noecho ();
nodelay (stdscr, TRUE);
nonl ();
intrflush (stdscr, FALSE);
keypad (stdscr, TRUE);
curses_drv_clear ();
curses_drv_clear ();
// Override output functions...
driver->clear = curses_drv_clear;
driver->string = curses_drv_string;
driver->chr = curses_drv_chr;
driver->vbar = curses_drv_vbar;
driver->init_vbar = NULL;
driver->hbar = curses_drv_hbar;
driver->init_hbar = NULL;
driver->num = curses_drv_num;
driver->init_num = curses_drv_init_num;
// Override output functions...
driver->clear = curses_drv_clear;
driver->string = curses_drv_string;
driver->chr = curses_drv_chr;
driver->vbar = curses_drv_vbar;
driver->init_vbar = NULL;
driver->hbar = curses_drv_hbar;
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;
driver->flush_box = curses_drv_flush_box;
driver->contrast = NULL;
driver->backlight = NULL;
driver->set_char = NULL;
driver->icon = curses_drv_icon;
driver->draw_frame = curses_drv_draw_frame;
driver->init = curses_drv_init;
driver->close = curses_drv_close;
driver->flush = curses_drv_flush;
driver->flush_box = curses_drv_flush_box;
driver->contrast = NULL;
driver->backlight = NULL;
driver->set_char = NULL;
driver->icon = curses_drv_icon;
driver->draw_frame = curses_drv_draw_frame;
driver->getkey = curses_drv_getkey;
driver->getkey = curses_drv_getkey;
// Change the character used for padding the title bars...
PAD = '#';
// Change the character used for "..."
ELLIPSIS = '~';
// Change the character used for padding the title bars...
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 ()
{
// Close curses
clear ();
move (0, 0);
refresh ();
endwin ();
// Close curses
clear ();
move (0, 0);
refresh ();
endwin ();
drv_base_close ();
drv_base_close ();
}
@@ -138,7 +138,7 @@ curses_drv_close ()
void
curses_drv_clear ()
{
clear ();
clear ();
}
@@ -149,21 +149,21 @@ curses_drv_clear ()
void
curses_drv_string (int x, int y, char string[])
{
int i;
unsigned char *c;
int i;
unsigned char *c;
for (i = 0; string[i]; i++) {
c = &string[i];
switch (*c) {
case 0:
*c = icon_char;
break;
case 255:
*c = '#';
break;
}
}
mvaddstr (y - 1, x - 1, string);
for (i = 0; string[i]; i++) {
c = &string[i];
switch (*c) {
case 0:
*c = icon_char;
break;
case 255:
*c = '#';
break;
}
}
mvaddstr (y - 1, x - 1, string);
}
/////////////////////////////////////////////////////////////////
@@ -173,16 +173,16 @@ curses_drv_string (int x, int y, char string[])
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);
}
/////////////////////////////////////////////////////////////////
@@ -199,15 +199,15 @@ curses_drv_init_num ()
void
curses_drv_num (int x, int num)
{
char c;
int y, dx;
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);
}
/////////////////////////////////////////////////////////////////
@@ -216,17 +216,17 @@ curses_drv_num (int x, int num)
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]);
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]);
len -= lcd.cellhgt;
}
len -= lcd.cellhgt;
}
// move(4-len/lcd.cellhgt, x-1);
// vline(0, len/lcd.cellhgt);
@@ -239,14 +239,14 @@ curses_drv_vbar (int x, 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, '=');
else
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, '-');
len -= lcd.cellwid;
}
len -= lcd.cellwid;
}
// move(y-1, x-1);
// hline(0, len/lcd.cellwid);
@@ -258,18 +258,18 @@ curses_drv_hbar (int x, int y, int len)
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;
}
}
@@ -279,13 +279,13 @@ curses_drv_icon (int which, char dest)
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)
{
curses_drv_flush ();
curses_drv_flush ();
}
void
@@ -293,29 +293,29 @@ 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 ()
{
int i;
int i;
i = getch ();
i = getch ();
if (i == KEY_LEFT)
return 'D';
if (i == KEY_UP)
return 'B';
if (i == KEY_DOWN)
return 'C';
if (i == KEY_RIGHT)
return 'A';
if (i == KEY_LEFT)
return 'D';
if (i == KEY_UP)
return 'B';
if (i == KEY_DOWN)
return 'C';
if (i == KEY_RIGHT)
return 'A';
if (i != ERR)
return i;
else
return 0;
if (i != ERR)
return i;
else
return 0;
}
+102 -102
View File
@@ -19,46 +19,46 @@
int
debug_init (struct lcd_logical_driver *driver, char *args)
{
printf ("debug_init(%s)\n", device);
printf ("debug_init(%s)\n", device);
if (!driver->framebuf) {
printf ("Allocating frame buffer (%ix%i)\n", lcd.wid, lcd.hgt);
driver->framebuf = malloc (lcd.wid * lcd.hgt);
}
if (!driver->framebuf) {
printf ("Allocating frame buffer (%ix%i)\n", lcd.wid, lcd.hgt);
driver->framebuf = malloc (lcd.wid * lcd.hgt);
}
if (!driver->framebuf) {
debug_close ();
return -1;
}
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->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->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;
driver->getkey = debug_getkey;
return 200; // 200 is arbitrary. (must be 1 or more)
return 200; // 200 is arbitrary. (must be 1 or more)
}
void
@@ -66,15 +66,15 @@ 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");
}
@@ -84,9 +84,9 @@ debug_close ()
void
debug_clear ()
{
printf ("clear()\n");
printf ("clear()\n");
memset (driver->framebuf, ' ', lcd.wid * lcd.hgt);
memset (driver->framebuf, ' ', lcd.wid * lcd.hgt);
}
@@ -96,9 +96,9 @@ debug_clear ()
void
debug_flush ()
{
printf ("flush()\n");
printf ("flush()\n");
lcd.draw_frame ();
lcd.draw_frame ();
}
/////////////////////////////////////////////////////////////////
@@ -109,16 +109,16 @@ 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;
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
for (i = 0; string[i]; i++) {
driver->framebuf[(y * lcd.wid) + x + i] = string[i];
}
for (i = 0; string[i]; i++) {
driver->framebuf[(y * lcd.wid) + x + i] = string[i];
}
}
/////////////////////////////////////////////////////////////////
@@ -128,58 +128,58 @@ debug_string (int x, int y, char string[])
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--;
y--;
x--;
lcd.framebuf[(y * lcd.wid) + x] = c;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
void
debug_contrast (int contrast)
{
printf ("Contrast: %i\n", contrast);
printf ("Contrast: %i\n", contrast);
}
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 ()
{
printf ("Vertical bars.\n");
printf ("Vertical bars.\n");
}
void
debug_init_hbar ()
{
printf ("Horizontal bars.\n");
printf ("Horizontal bars.\n");
}
void
debug_init_num ()
{
printf ("Big Numbers.\n");
printf ("Big Numbers.\n");
}
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)
{
printf ("Set Character %i\n", n);
printf ("Set Character %i\n", n);
}
/////////////////////////////////////////////////////////////////
@@ -188,15 +188,15 @@ debug_set_char (int n, char *dat)
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;
}
len -= lcd.cellhgt;
}
}
@@ -206,13 +206,13 @@ debug_vbar (int x, int len)
void
debug_hbar (int x, int y, int len)
{
printf ("Hbar(%i, %i, %i)\n", x, y, len);
printf ("Hbar(%i, %i, %i)\n", x, y, len);
for (; x < lcd.wid && len > 0; x++) {
debug_chr (x, y, '-');
for (; x < lcd.wid && len > 0; x++) {
debug_chr (x, y, '-');
len -= lcd.cellwid;
}
len -= lcd.cellwid;
}
}
@@ -222,58 +222,58 @@ debug_hbar (int x, int y, int len)
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)
{
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)
{
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++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf ("+%s+\n", out);
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++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf ("+%s+\n", out);
for (i = 0; i < lcd.wid; i++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf ("+%s+\n", out);
}
char
debug_getkey ()
{
printf ("Trying to grab keypress.\n");
return 0;
printf ("Trying to grab keypress.\n");
return 0;
}
+72 -72
View File
@@ -25,51 +25,51 @@ drv_base_init (struct lcd_logical_driver *driver, char *args)
{
// printf("drv_base_init()\n");
drv_base = driver;
drv_base = driver;
driver->wid = 20;
driver->hgt = 4;
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);
// 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;
}
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->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->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->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;
driver->getkey = drv_base_getkey;
return 200; // 200 is arbitrary. (must be 1 or more)
return 200; // 200 is arbitrary. (must be 1 or more)
}
// Below here, you may use either lcd.framebuf or driver->framebuf..
@@ -79,10 +79,10 @@ drv_base_init (struct lcd_logical_driver *driver, char *args)
void
drv_base_close ()
{
if (lcd.framebuf != NULL)
free (lcd.framebuf);
if (lcd.framebuf != NULL)
free (lcd.framebuf);
lcd.framebuf = NULL;
lcd.framebuf = NULL;
}
/////////////////////////////////////////////////////////////////
@@ -91,7 +91,7 @@ drv_base_close ()
void
drv_base_clear ()
{
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
}
@@ -101,7 +101,7 @@ drv_base_clear ()
void
drv_base_flush ()
{
//lcd.draw_frame(lcd.framebuf);
//lcd.draw_frame(lcd.framebuf);
}
/////////////////////////////////////////////////////////////////
@@ -111,17 +111,17 @@ drv_base_flush ()
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;
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];
}
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];
}
}
/////////////////////////////////////////////////////////////////
@@ -131,10 +131,10 @@ drv_base_string (int x, int y, char string[])
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;
}
//////////////////////////////////////////////////////////////////////
@@ -145,7 +145,7 @@ int
drv_base_contrast (int contrast)
{
// printf("Contrast: %i\n", contrast);
return -1;
return -1;
}
//////////////////////////////////////////////////////////////////////
@@ -154,16 +154,16 @@ drv_base_contrast (int contrast)
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");
}
*/
}
//////////////////////////////////////////////////////////////////////
@@ -217,12 +217,12 @@ drv_base_set_char (int n, char *dat)
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;
}
len -= lcd.cellhgt;
}
}
@@ -232,11 +232,11 @@ drv_base_vbar (int x, 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;
}
len -= lcd.cellwid;
}
}
@@ -258,7 +258,7 @@ drv_base_icon (int which, char dest)
void
drv_base_flush_box (int lft, int top, int rgt, int bot)
{
//drv_base_flush();
//drv_base_flush();
}
@@ -313,5 +313,5 @@ drv_base_draw_frame (char *dat)
char
drv_base_getkey ()
{
return 0;
return 0;
}
+95 -95
View File
@@ -61,127 +61,127 @@ static unsigned char EnMask[] = { EN1, EN2, EN3, STRB, LF, INIT, SEL };
static int EnMaskSize = sizeof (EnMask) / sizeof (unsigned char);
static unsigned int lptPort;
static int extIF = 0; // non-zero if extended interface
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)
{
// 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);
}
// 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);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (4100);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (100);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (100);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (40);
port_out (lptPort, displayID | 0x03);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x03);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (40);
// now in 8-bit mode... set 4-bit mode
port_out (lptPort, displayID | 0x02);
if (extIF)
port_out (lptPort + 2, (EnMask[3] | EnMask[4] | EnMask[5] | EnMask[6]) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort, 0x02);
if (extIF)
port_out (lptPort + 2, 0 ^ OUTMASK);
hd44780_functions->uPause (40);
// 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;
common_init (IF_4bit);
return 0;
}
// lcdstat_HD44780_senddata
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);
}
}
+2 -2
View File
@@ -1,8 +1,8 @@
#ifndef HD_LCDSTAT_H
#define HD_LCDSTAT_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_4bit (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
+19 -19
View File
@@ -18,30 +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;
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
+25 -25
View File
@@ -61,41 +61,41 @@ static int semid;
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)
{
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);
}
+2 -2
View File
@@ -1,8 +1,8 @@
#ifndef HD_EXT8BIT_H
#define HD_EXT8BIT_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_ext8bit (HD44780_functions * hd44780_functions, lcd_logical_driver * driver, char *args, unsigned int port);
+19 -19
View File
@@ -10,24 +10,24 @@ void common_init (enum ifWidth ifwidth);
// Structures holding pointers to HD44780 specific functions
typedef struct hwDependentFns {
// microsec pauses
void (*uPause) (int microSecondsTenths);
// 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;
@@ -64,8 +64,8 @@ extern HD44780_functions *hd44780_functions;
#define IF_4BIT 0x00
#define TWOLINE 0x08
#define ONELINE 0x00
#define LARGECHAR 0x04 /* 5x11 characters */
#define SMALLCHAR 0x00 /* 5x8 characters */
#define LARGECHAR 0x04 /* 5x11 characters */
#define SMALLCHAR 0x00 /* 5x8 characters */
#define SETCHAR 0x40
@@ -73,11 +73,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
+69 -69
View File
@@ -50,110 +50,110 @@ static char lastkey = 0;
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)
{
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 ()
{
// 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);
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);
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);
}
/* this function sends r out onto the shift register */
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);
rawshift (r);
port_out (lp, displayID); //latch it, to correct display
port_out (lp, 0);
}
+2 -2
View File
@@ -1,8 +1,8 @@
#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);
+31 -31
View File
@@ -47,54 +47,54 @@ static unsigned char EnMask[] = { EN1, EN2, EN3 };
static int EnMaskSize = sizeof (EnMask) / sizeof (unsigned char);
static unsigned int lptPort;
static int extIF = 0; // non-zero if extended interface
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)
{
// TODO: remove magic numbers below
char *argv[64];
int argc;
int i;
// TODO: remove magic numbers below
char *argv[64];
int argc;
int i;
hd44780_functions->senddata = lcdwinamp_HD44780_senddata;
lptPort = port;
hd44780_functions->senddata = lcdwinamp_HD44780_senddata;
lptPort = port;
// 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;
for (i = 0; i < argc; ++i)
if (strcmp (argv[i], "-e") == 0 || strcmp (argv[i], "--extended") == 0)
extIF = 1;
if ((ioperm (lptPort + 2, 1, 255)) == -1) {
fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno));
return -1;
}
if ((ioperm (lptPort + 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;
}
// lcdwinamp_HD44780_senddata
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];
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);
port_out (lptPort, ch);
port_out (lptPort + 2, (dispID | portControl) ^ OUTMASK);
hd44780_functions->uPause (1);
port_out (lptPort + 2, portControl ^ OUTMASK);
}
+2 -2
View File
@@ -1,8 +1,8 @@
#ifndef HD_WINAMP_H
#define HD_WINAMP_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, args is probably not used but keep
// for consistency
+431 -431
View File
File diff suppressed because it is too large Load Diff
+113 -113
View File
@@ -29,34 +29,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
};
//////////////////////////////////////////////////////////////////////////
@@ -78,95 +78,95 @@ lcd_logical_driver *irmanin;
int
irmanin_init (struct lcd_logical_driver *driver, char *args)
{
char device[256];
char *ptrdevice;
char config[256];
char *ptrconfig;
char device[256];
char *ptrdevice;
char config[256];
char *ptrconfig;
char *portname;
char *portname;
char *argv[64];
int argc, i, j;
char *filename;
char *argv[64];
int argc, i, j;
char *filename;
ptrconfig = NULL;
ptrdevice = NULL;
ptrconfig = NULL;
ptrdevice = NULL;
irmanin = driver;
irmanin = driver;
argc = get_args (argv, args, 64);
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, "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]);
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");
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[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]);
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]);
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");
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
if (ir_init_commands (ptrconfig, 1) < 0) {
fprintf (stderr, "error initialising commands: %s\n", strerror (errno));
exit (1);
}
if (ir_init_commands (ptrconfig, 1) < 0) {
fprintf (stderr, "error initialising commands: %s\n", strerror (errno));
exit (1);
}
portname = ir_default_portname ();
if (portname == NULL) {
if (ptrdevice == NULL) {
portname = ptrdevice;
} else {
fprintf (stderr, "error no device defined\n");
exit (1);
}
}
portname = ir_default_portname ();
if (portname == NULL) {
if (ptrdevice == NULL) {
portname = ptrdevice;
} else {
fprintf (stderr, "error no device defined\n");
exit (1);
}
}
driver->getkey = irmanin_getkey;
driver->close = irmanin_close;
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 ()
{
if (irmanin->framebuf != NULL)
free (irmanin->framebuf);
if (irmanin->framebuf != NULL)
free (irmanin->framebuf);
irmanin->framebuf = NULL;
irmanin->framebuf = NULL;
ir_free_commands ();
ir_finish ();
ir_free_commands ();
ir_finish ();
}
//////////////////////////////////////////////////////////////////////
@@ -177,23 +177,23 @@ irmanin_close ()
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));
break;
case IR_CMD_UNKNOWN:
break;
default:
key = (char) ('A' - 1 + cmd);
break;
}
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:
break;
default:
key = (char) ('A' - 1 + cmd);
break;
}
return key;
return key;
}
/* end of irmanin.c */
+97 -97
View File
@@ -48,87 +48,87 @@ char *buttonmap = "BDACEFGHIJKLMNOP";
int
joy_init (struct lcd_logical_driver *driver, char *args)
{
char device[256];
char *argv[64];
int argc, i, j;
char device[256];
char *argv[64];
int argc, i, j;
joy = driver;
joy = driver;
strcpy (device, "/dev/js0");
strcpy (device, "/dev/js0");
argc = get_args (argv, args, 64);
argc = get_args (argv, args, 64);
for (i = 0; i < argc; i++) {
//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]);
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]);
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]);
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);
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
for (i = 0; i < argc; i++) {
//printf("Arg(%i): %s\n", i, argv[i]);
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--device")) {
if (i + 1 > argc) {
fprintf (stderr, "joy_init: %s requires an argument\n", argv[i]);
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]);
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]);
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);
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
}
driver->getkey = joy_getkey;
driver->close = joy_close;
driver->getkey = joy_getkey;
driver->close = joy_close;
/* FIXME: This crashes!
if(args)
{
if(strlen(args) > 0)
strcpy(device, args);
}
*/
/* FIXME: This crashes!
if(args)
{
if(strlen(args) > 0)
strcpy(device, args);
}
*/
fd = open (device, O_RDONLY);
fcntl (fd, F_SETFL, O_NONBLOCK);
fd = open (device, O_RDONLY);
fcntl (fd, F_SETFL, O_NONBLOCK);
if (fd < 0)
return -1;
if (fd < 0)
return -1;
ioctl (fd, JSIOCGVERSION, &jsversion);
ioctl (fd, JSIOCGAXES, &axes);
ioctl (fd, JSIOCGBUTTONS, &buttons);
ioctl (fd, JSIOCGNAME (NAME_LENGTH), jsname);
ioctl (fd, JSIOCGVERSION, &jsversion);
ioctl (fd, JSIOCGAXES, &axes);
ioctl (fd, JSIOCGBUTTONS, &buttons);
ioctl (fd, JSIOCGNAME (NAME_LENGTH), jsname);
debug ("Joystick (%s) has %d axes and %d buttons. Driver version is %d.%d.%d.\n", jsname, axes, buttons, jsversion >> 16, (jsversion >> 8) & 0xff, jsversion & 0xff);
debug ("Joystick (%s) has %d axes and %d buttons. Driver version is %d.%d.%d.\n", jsname, axes, buttons, jsversion >> 16, (jsversion >> 8) & 0xff, jsversion & 0xff);
axis = calloc (axes, sizeof (int));
button = calloc (buttons, sizeof (char));
axis = calloc (axes, sizeof (int));
button = calloc (buttons, sizeof (char));
return fd; // 200 is arbitrary. (must be 1 or more)
return fd; // 200 is arbitrary. (must be 1 or more)
}
void
joy_close ()
{
if (joy->framebuf != NULL)
free (joy->framebuf);
close (fd);
if (joy->framebuf != NULL)
free (joy->framebuf);
close (fd);
joy->framebuf = NULL;
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);
}
@@ -140,46 +140,46 @@ joy_close ()
char
joy_getkey ()
{
int i;
int err;
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");
return 0;
}
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 (buttons) {
//printf("Buttons: ");
for (i = 0; i < buttons; i++)
//printf("%2d:%s ", i, button[i] ? "on " : "off");
if (button[i])
return buttonmap[i];
}
if (axes) {
//printf("Axes: ");
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 (axes) {
//printf("Axes: ");
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)];
}
}
return 0;
return 0;
}
+372 -372
View File
@@ -61,38 +61,38 @@
lcd_logical_driver lcd;
lcd_physical_driver drivers[] = {
{"base", drv_base_init,},
{"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,},
};
@@ -105,37 +105,37 @@ int
lcd_init (char *args)
{
// int i;
int err;
int err;
list = LL_new ();
if (!list) {
printf ("Error allocating driver list.\n");
return -1;
}
list = LL_new ();
if (!list) {
printf ("Error allocating driver list.\n");
return -1;
}
lcd_drv_init (NULL, NULL);
lcd_drv_init (NULL, NULL);
err = lcd_add_driver ("base", args);
err = lcd_add_driver ("base", args);
lcd.wid = 20;
lcd.hgt = 4;
lcd.wid = 20;
lcd.hgt = 4;
return err;
return err;
/*
drv_base_init(args);
/*
drv_base_init(args);
for(i=0; drivers[i].name; i++)
{
if(!strcmp(driver, drivers[i].name))
{
return drivers[i].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;
*/
}
@@ -144,80 +144,80 @@ lcd_init (char *args)
int
lcd_add_driver (char *driver, char *args)
{
int i;
int i;
lcd_logical_driver *add;
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);
//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);
//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);
return -1;
}
//printf("Allocated driver\n");
memset (add, 0, sizeof (lcd_logical_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));
add->wid = lcd.wid;
add->hgt = lcd.hgt;
add->cellwid = lcd.cellwid;
add->cellhgt = lcd.cellhgt;
add->wid = lcd.wid;
add->hgt = lcd.hgt;
add->cellwid = lcd.cellwid;
add->cellhgt = lcd.cellhgt;
// printf("LCD driver info:\n\twid: %i\thgt: %i\n",
// add->wid, add->hgt);
add->framebuf = malloc (add->wid * add->hgt);
add->framebuf = malloc (add->wid * add->hgt);
if (!add->framebuf) {
printf ("Couldn't allocate framebuffer for driver \"%s\".\n", driver);
free (add);
return -1;
}
//printf("Allocated frame buffer\n");
if (!add->framebuf) {
printf ("Couldn't allocate framebuffer for driver \"%s\".\n", driver);
free (add);
return -1;
}
//printf("Allocated frame buffer\n");
LL_Push (list, (void *) add);
LL_Push (list, (void *) add);
return drivers[i].init (add, args);
}
}
return drivers[i].init (add, args);
}
}
return -1;
return -1;
}
// TODO: Put lcd_shutdown in the shutdown function...
int
lcd_shutdown ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
//printf("driver...\n");
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
// FIXME: This crashes!
//if(driver) free(driver);
//printf("...freed\n");
}
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;
return 0;
}
int
@@ -225,10 +225,10 @@ 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.wid = LCD_MAX_WID;
lcd.hgt = LCD_MAX_HGT;
lcd.framebuf = NULL;
lcd.framebuf = NULL;
/*
if(!lcd.framebuf)
lcd.framebuf = malloc(lcd.wid * lcd.hgt);
@@ -243,34 +243,34 @@ 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;
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;
// 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.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;
lcd.getkey = lcd_drv_getkey;
return 1; // 1 is arbitrary. (must be 1 or more)
return 1; // 1 is arbitrary. (must be 1 or more)
}
//////////////////////////////////////////////////////////////////////
@@ -291,354 +291,354 @@ lcd_drv_init (struct lcd_logical_driver *driver, char *args)
void
lcd_drv_close ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
// printf("lcd_drv_close()\n");
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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 ();
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_clear ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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 ();
}
}
} while (LL_Next (list) == 0);
if ((int) driver->clear > 0)
driver->clear ();
else if ((int) driver->clear == -1) {
drv_base->clear ();
}
}
} while (LL_Next (list) == 0);
}
void
lcd_drv_flush ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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 ();
}
}
} while (LL_Next (list) == 0);
if ((int) driver->flush > 0)
driver->flush ();
else if ((int) driver->flush == -1) {
drv_base->flush ();
}
}
} while (LL_Next (list) == 0);
}
void
lcd_drv_string (int x, int y, char string[])
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_chr (int x, int y, char c)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
int
lcd_drv_contrast (int contrast)
{
int res = 0;
int res = 0;
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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;
}
/*
else if((int)driver->contrast == -1)
{
res=drv_base->contrast(contrast);
}
*/
}
} while (LL_Next (list) == 0);
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);
}
*/
}
} while (LL_Next (list) == 0);
return res;
return res;
}
void
lcd_drv_backlight (int on)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
if ((int) driver->backlight > 0)
driver->backlight (on);
else if ((int) driver->backlight == -1) {
drv_base->backlight (on);
}
}
} while (LL_Next (list) == 0);
}
void
lcd_drv_output (int on)
{
lcd_logical_driver *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);
}
}
} while (LL_Next (list) == 0);
lcd_logical_driver *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);
}
}
} while (LL_Next (list) == 0);
}
void
lcd_drv_init_vbar ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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 ();
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_init_hbar ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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 ();
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_init_num ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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 ();
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_num (int x, int num)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_set_char (int n, char *dat)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_vbar (int x, int len)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_hbar (int x, int y, int len)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_icon (int which, char dest)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
void
lcd_drv_flush_box (int lft, int top, int rgt, int bot)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
@@ -647,48 +647,48 @@ lcd_drv_flush_box (int lft, int top, int rgt, int bot)
void
lcd_drv_draw_frame (char *dat)
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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);
}
}
} while (LL_Next (list) == 0);
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);
}
char
lcd_drv_getkey ()
{
lcd_logical_driver *driver;
lcd_logical_driver *driver;
char key;
char key;
LL_Rewind (list);
do {
driver = (lcd_logical_driver *) LL_Get (list);
if (driver) {
lcd.framebuf = driver->framebuf;
LL_Rewind (list);
do {
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;
}
}
} while (LL_Next (list) == 0);
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);
return 0;
return 0;
}
+32 -32
View File
@@ -18,47 +18,47 @@ int lcd_shutdown ();
// 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;
// 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[]);
// 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);
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 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) ();
// Returns 0 for "no key pressed", or (A-Z).
char (*getkey) ();
// more?
// more?
} lcd_logical_driver;
typedef struct lcd_physical_driver {
char *name;
int (*init) (struct lcd_logical_driver * driver, char *device);
char *name;
int (*init) (struct lcd_logical_driver * driver, char *device);
} lcd_physical_driver;
extern lcd_logical_driver lcd;
+59 -59
View File
@@ -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>
@@ -32,8 +32,8 @@
#define SEMAPHORE "portctrl"
#define SEMKEY 0x706f7274 /* semaphore key */
#define SEMCOUNT 1 /* number of semaphores to create */
#define WMODE 0660 /* access permissions */
#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
@@ -54,7 +54,7 @@ static char rcsId[] = "$Id$";
static key_t
getkey (register char *p)
{
return ((key_t) SEMKEY);
return ((key_t) SEMKEY);
}
/*
@@ -65,40 +65,40 @@ getkey (register char *p)
int
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);
}
}
if (semctl (semid, 0, SETVAL, semval) < 0) {
perror ("setval, can't initialise semaphore");
exit (1);
}
}
return semid;
return semid;
}
/*
@@ -108,12 +108,12 @@ sem_get (void)
int
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;
}
/*
@@ -123,12 +123,12 @@ sem_wait (int sid)
int
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;
}
/*
@@ -138,20 +138,20 @@ sem_signal (int sid)
int
sem_remove (int sid)
{
int i;
union semun dummy;
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);
}
}
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;
return 0;
}
+32 -32
View File
@@ -49,8 +49,8 @@ lcd_logical_driver *lircin;
void
lircin_close ()
{
lirc_freeconfig (config);
lirc_deinit ();
lirc_freeconfig (config);
lirc_deinit ();
}
//////////////////////////////////////////////////////////////////////
@@ -61,23 +61,23 @@ lircin_close ()
char
lircin_getkey ()
{
char key;
char *ir, *cmd;
char key;
char *ir, *cmd;
if (!(ir = lirc_nextir ())) {
return 0;
} else {
if (!(cmd = lirc_ir2char (config, ir)))
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;
}
printf ("lirc: \"%s\"\n", cmd);
sscanf (cmd, "%c", &key);
printf ("\n%c\n", key);
free (ir);
return key;
}
return 0;
return 0;
}
////////////////////////////////////////////////////////////
@@ -89,29 +89,29 @@ lircin_init (struct lcd_logical_driver *driver, char *args)
/* assign funktions */
lircin = driver;
lircin = driver;
driver->getkey = lircin_getkey;
driver->close = lircin_close;
driver->getkey = lircin_getkey;
driver->close = lircin_close;
/* open socket to lirc */
if (-1 == (fd = lirc_init ("lcdd", 1))) {
fprintf (stderr, "no infrared remote support available\n");
return -1;
}
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 (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);
fcntl (fd, F_SETFL, O_NONBLOCK);
fcntl (fd, F_SETFD, FD_CLOEXEC);
return 1; // 200 is arbitrary. (must be 1 or more)
return 1; // 200 is arbitrary. (must be 1 or more)
}
+10 -10
View File
@@ -18,17 +18,17 @@
static inline int
port_in (int port)
{
unsigned char value;
__asm__ volatile ("inb %1,%0":"=a" (value)
:"d" ((unsigned short) port));
return value;
unsigned char value;
__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)
{
__asm__ volatile ("outb %0,%1\n"::"a" (val), "d" (port)
);
__asm__ volatile ("outb %0,%1\n"::"a" (val), "d" (port)
);
}
#else
#include <pc.h>
@@ -36,15 +36,15 @@ port_out (unsigned short int port, unsigned char val)
static inline int
port_in (int port)
{
unsigned char value;
value = inportb ((unsigned short) port);
return (int) value;
unsigned char value;
value = inportb ((unsigned short) port);
return (int) value;
}
static inline void
port_out (unsigned int port, unsigned char val)
{
outportb ((unsigned short) port, val);
outportb ((unsigned short) port, val);
}
#endif
+234 -234
View File
@@ -166,8 +166,8 @@ const unsigned char simple_font5x7[] = {
};
// <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!!!>
// No, I don't understand SVGALIB key mappings or a neat way of doing this
@@ -183,9 +183,9 @@ lcd_logical_driver *svgalib_drv;
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) */
/*
Setting SVGALIB_figure_mappings will trap all keypresses and write the
@@ -205,26 +205,26 @@ 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;
}
p++;
mask *= 2;
}
}
}
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;
}
}
}
}
@@ -234,10 +234,10 @@ 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]);
}
}
static char icon_char = '@';
@@ -245,81 +245,81 @@ static char icon_char = '@';
int
svgalib_drv_init (struct lcd_logical_driver *driver, char *args)
{
char *argv[64];
int argc;
int i, j;
int VGAMODE;
int fgtemp;
char param[100];
char buffer[1024];
char *argv[64];
int argc;
int i, j;
int VGAMODE;
int fgtemp;
char param[100];
char buffer[1024];
/* not used at the moment */
argc = get_args (argv, args, 64);
/* not used at the moment */
argc = get_args (argv, args, 64);
svgalib_drv = driver;
vga_init ();
VGAMODE = G320x200x256; /* Default mode. */
svgalib_drv = driver;
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 ();
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);
/* 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));
gl_clearscreen (gl_rgbcolor (0, 0, 0));
// Override output functions...
driver->clear = svgalib_drv_clear;
driver->string = svgalib_drv_string;
driver->chr = svgalib_drv_chr;
driver->vbar = svgalib_drv_vbar;
driver->init_vbar = NULL;
driver->hbar = svgalib_drv_hbar;
driver->init_hbar = NULL;
driver->num = svgalib_drv_num;
driver->init_num = svgalib_drv_init_num;
// Override output functions...
driver->clear = svgalib_drv_clear;
driver->string = svgalib_drv_string;
driver->chr = svgalib_drv_chr;
driver->vbar = svgalib_drv_vbar;
driver->init_vbar = NULL;
driver->hbar = svgalib_drv_hbar;
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;
driver->flush_box = svgalib_drv_flush_box;
driver->contrast = NULL;
driver->backlight = NULL;
driver->set_char = NULL;
driver->icon = svgalib_drv_icon;
driver->draw_frame = svgalib_drv_draw_frame;
driver->init = svgalib_drv_init;
driver->close = svgalib_drv_close;
driver->flush = svgalib_drv_flush;
driver->flush_box = svgalib_drv_flush_box;
driver->contrast = NULL;
driver->backlight = NULL;
driver->set_char = NULL;
driver->icon = svgalib_drv_icon;
driver->draw_frame = svgalib_drv_draw_frame;
driver->getkey = svgalib_drv_getkey;
driver->getkey = svgalib_drv_getkey;
// Change the character used for padding the title bars...
SVGALIB_PAD = '#';
// Change the character used for "..."
SVGALIB_ELLIPSIS = '~';
// Change the character used for padding the title bars...
SVGALIB_PAD = '#';
// Change the character used for "..."
SVGALIB_ELLIPSIS = '~';
return 1;
return 1;
}
void
svgalib_drv_close ()
{
vga_setmode (TEXT);
drv_base_close ();
vga_setmode (TEXT);
drv_base_close ();
}
void
svgalib_drv_clear ()
{
vga_waitretrace ();
gl_clearscreen (gl_rgbcolor (0, 0, 0));
vga_waitretrace ();
gl_clearscreen (gl_rgbcolor (0, 0, 0));
}
/////////////////////////////////////////////////////////////////
@@ -329,21 +329,21 @@ svgalib_drv_clear ()
void
svgalib_drv_string (int x, int y, char string[])
{
int i;
unsigned char *c;
for (i = 0; string[i]; i++) {
c = &string[i];
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);
int i;
unsigned char *c;
for (i = 0; string[i]; i++) {
c = &string[i];
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);
}
/////////////////////////////////////////////////////////////////
@@ -353,19 +353,19 @@ svgalib_drv_string (int x, int y, char string[])
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;
}
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);
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);
}
/////////////////////////////////////////////////////////////////
@@ -382,14 +382,14 @@ svgalib_drv_init_num ()
void
svgalib_drv_num (int x, int num)
{
char c;
int y, dx;
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);
}
/////////////////////////////////////////////////////////////////
@@ -398,17 +398,17 @@ svgalib_drv_num (int x, int num)
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]);
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]);
len -= lcd.cellhgt;
}
len -= lcd.cellhgt;
}
}
/////////////////////////////////////////////////////////////////
@@ -417,14 +417,14 @@ svgalib_drv_vbar (int x, 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, '=');
else
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, '-');
len -= lcd.cellwid;
}
len -= lcd.cellwid;
}
}
/////////////////////////////////////////////////////////////////
@@ -433,18 +433,18 @@ svgalib_drv_hbar (int x, int y, int len)
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
@@ -465,97 +465,97 @@ svgalib_drv_draw_frame (char *dat)
char
svgalib_drv_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;
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;
/*
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.
/*
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 '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;
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;
}
+73 -73
View File
@@ -19,47 +19,47 @@ lcd_logical_driver *text;
int
text_init (lcd_logical_driver * driver, char *args)
{
text = driver;
text = driver;
if (!driver->framebuf) {
driver->close ();
return -1;
}
if (!driver->framebuf) {
driver->close ();
return -1;
}
driver->wid = 20;
driver->hgt = 4;
driver->cellwid = 5;
driver->cellhgt = 8;
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->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->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;
driver->getkey = NULL;
return 200; // 200 is arbitrary. (must be 1 or more)
return 200; // 200 is arbitrary. (must be 1 or more)
}
void
text_close ()
{
drv_base_close ();
drv_base_close ();
}
/////////////////////////////////////////////////////////////////
@@ -68,7 +68,7 @@ text_close ()
void
text_clear ()
{
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
}
@@ -78,7 +78,7 @@ text_clear ()
void
text_flush ()
{
text_draw_frame (lcd.framebuf);
text_draw_frame (lcd.framebuf);
}
/////////////////////////////////////////////////////////////////
@@ -88,14 +88,14 @@ text_flush ()
void
text_string (int x, int y, char string[])
{
int i;
int i;
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
for (i = 0; string[i]; i++) {
lcd.framebuf[(y * lcd.wid) + x + i] = string[i];
}
for (i = 0; string[i]; i++) {
lcd.framebuf[(y * lcd.wid) + x + i] = string[i];
}
}
/////////////////////////////////////////////////////////////////
@@ -105,17 +105,17 @@ text_string (int x, int y, char string[])
void
text_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;
}
int
text_contrast (int contrast)
{
// printf("Contrast: %i\n", contrast);
return 0;
return 0;
}
void
@@ -169,12 +169,12 @@ text_set_char (int n, char *dat)
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;
}
len -= lcd.cellhgt;
}
}
@@ -184,52 +184,52 @@ text_vbar (int x, 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;
}
len -= lcd.cellwid;
}
}
void
text_flush_box (int lft, int top, int rgt, int bot)
{
text_flush ();
text_flush ();
}
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++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf ("+%s+\n", out);
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++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf ("+%s+\n", out);
for (i = 0; i < lcd.wid; i++) {
out[i] = '-';
}
out[lcd.wid] = 0;
printf ("+%s+\n", out);
}
+363 -363
View File
@@ -20,10 +20,10 @@
static int custom = 0;
typedef enum {
hbar = 1,
vbar = 2,
bign = 4,
beat = 8
hbar = 1,
vbar = 2,
bign = 4,
beat = 8
} custom_type;
static int fd;
@@ -37,151 +37,151 @@ lcd_logical_driver *sli;
int
sli_init (lcd_logical_driver * driver, char *args)
{
char *argv[64];
int argc;
struct termios portset;
int i;
int tmp;
char out[2];
char *argv[64];
int argc;
struct termios portset;
int i;
int tmp;
char out[2];
char device[256] = "/dev/lcd";
int speed = B19200;
char device[256] = "/dev/lcd";
int speed = B19200;
sli = driver;
sli = driver;
//debug("sli_init: Args(all): %s\n", args);
//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++)
{
printf("Arg(%i): %s\n", i, argv[i]);
}
*/
/*
for(i=0; i<argc; i++)
{
printf("Arg(%i): %s\n", i, argv[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]);
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]);
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");
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[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]);
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]);
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");
return -1;
} else {
printf ("Invalid parameter: %s\n", argv[i]);
}
}
}
// Set up io port correctly, and open it...
fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
fprintf (stderr, "sli_init: failed (%s)\n", strerror (errno));
return -1;
}
//else fprintf(stderr, "sli_init: opened device %s\n", device);
tcgetattr (fd, &portset);
// This is necessary in Linux, but does not exist in irix.
// 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));
return -1;
}
//else fprintf(stderr, "sli_init: opened device %s\n", device);
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);
/* 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);
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...
driver->wid = 15;
driver->hgt = 2;
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...
driver->wid = 15;
driver->hgt = 2;
// Set the functions the driver supports...
// 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->draw_frame = sli_draw_frame;
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;
return fd;
}
/* Clean-up */
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 ()
{
sli_draw_frame (lcd.framebuf);
sli_draw_frame (lcd.framebuf);
}
/* no bounds checking is done in MtxOrb.c (which I shamelessly ripped)
@@ -191,27 +191,27 @@ sli_flush ()
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);
}
}
@@ -222,10 +222,10 @@ sli_flush_box (int lft, int top, int rgt, int bot)
void
sli_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;
}
/////////////////////////////////////////////////////////////////
@@ -244,87 +244,87 @@ sli_chr (int x, int y, char c)
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;
}
}
/////////////////////////////////////////////////////////////////
@@ -334,54 +334,54 @@ 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;
}
}
/////////////////////////////////////////////////////////////////
@@ -396,17 +396,17 @@ sli_init_hbar ()
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;
}
len -= lcd.cellhgt;
}
}
@@ -416,17 +416,17 @@ sli_vbar (int x, 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;
len -= lcd.cellwid;
}
}
}
@@ -440,79 +440,79 @@ sli_hbar (int x, int y, int len)
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)
{
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,
},
{
1, 1, 1, 1, 1, // Filled Heart
1, 0, 1, 0, 1,
0, 1, 0, 1, 0,
0, 1, 1, 1, 0,
0, 1, 1, 1, 0,
1, 0, 1, 0, 1,
1, 1, 0, 1, 1,
1, 1, 1, 1, 1,
},
{
0, 0, 0, 0, 0, // Ellipsis
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 0, 1, 0, 1,
},
{
0, 0, 0, 0, 0, // Ellipsis
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 0, 1, 0, 1,
},
};
};
if (custom == bign)
custom = beat;
sli_set_char (dest, &icons[which][0]);
if (custom == bign)
custom = beat;
sli_set_char (dest, &icons[which][0]);
}
/////////////////////////////////////////////////////////////
@@ -523,33 +523,33 @@ sli_icon (int which, char dest)
void
sli_draw_frame (char *dat)
{
char out[2]; /* Again, why does the Matrix driver allocate so much here? */
int y;
char out[2]; /* Again, why does the Matrix driver allocate so much here? */
int y;
if (!dat)
return;
if (!dat)
return;
/*
out[0]=0x0FE;
out[1]=0x001;
write(fd, out, 2);
*/
/*
out[0]=0x0FE;
out[1]=0x001;
write(fd, out, 2);
*/
/* Don't update if we have no new data
this keeps me from getting a migraine
(just like those copyleft penguin mints... mmmmmm) */
/* Don't update if we have no new data
this keeps me from getting a migraine
(just like those copyleft penguin mints... mmmmmm) */
// if (!strncmp(dat,lastframe,32)) /* Nothing has changed */
// return;
// if (!strncmp(dat,lastframe,32)) /* Nothing has changed */
// return;
/* Do the actual refresh */
out[0] = 0x0FE;
out[1] = 0x080;
write (fd, out, 2);
write (fd, &dat[0], 16);
usleep (10);
write (fd, &dat[16], 15);
/* 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...
// strncpy(lastframe,dat,32); // Update lastframe...
}
+58 -58
View File
@@ -49,74 +49,74 @@ int server_input (int key);
int
handle_input ()
{
char str[256];
int key;
screen *s;
client *c;
char str[256];
int key;
screen *s;
client *c;
key = lcd.getkey ();
key = lcd.getkey ();
if (!key)
return 0;
if (!key)
return 0;
debug ("handle_input(%c)\n", (char) key);
debug ("handle_input(%c)\n", (char) key);
if (key) {
s = screenlist_current ();
if (s) {
c = s->parent;
if (c) {
// TODO: Interpret and translate keys!
// If the client should have this keypress...
// Send keypress to client
if (key >= 'E' && key <= 'Z') {
// TODO: Implement client "acceptable key" lists
sprintf (str, "key %c\n", key);
sock_send_string (c->sock, str);
}
// Otherwise, tell the server about it.
else {
server_input (key);
}
} else {
// If no parent, it means we're on the server screen.
// so, the server gets all keypresses there.
server_input (key);
}
}
}
if (key) {
s = screenlist_current ();
if (s) {
c = s->parent;
if (c) {
// TODO: Interpret and translate keys!
// If the client should have this keypress...
// Send keypress to client
if (key >= 'E' && key <= 'Z') {
// TODO: Implement client "acceptable key" lists
sprintf (str, "key %c\n", key);
sock_send_string (c->sock, str);
}
// Otherwise, tell the server about it.
else {
server_input (key);
}
} else {
// If no parent, it means we're on the server screen.
// so, the server gets all keypresses there.
server_input (key);
}
}
}
return 0;
return 0;
}
int
server_input (int key)
{
debug ("server_input(%c)\n", (char) 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;
}
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;
return 0;
}
+199 -199
View File
@@ -53,12 +53,12 @@ static screen_size sizes[] =
// 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[] = {
{"-h", "--help"},
{"-d", "--driver"},
{"-t", "--type"},
{"-f", "--foreground"},
{"-b", "--backlight"},
{NULL, NULL},
{"-h", "--help"},
{"-d", "--driver"},
{"-t", "--type"},
{"-f", "--foreground"},
{"-b", "--backlight"},
{NULL, NULL},
};
void exit_program (int val);
@@ -67,112 +67,112 @@ void HelpScreen ();
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 child;
screen *s = NULL;
char *str, *ing; // strings for commandline handling
// 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 child;
screen *s = NULL;
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);
// and "kill"...
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
signal (SIGKILL, exit_program);
// Ctrl-C will cause a clean exit...
signal (SIGINT, exit_program);
// and "kill"...
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
signal (SIGKILL, exit_program);
// If no paramaters given, give the help screen.
if (argc == 1)
HelpScreen ();
// If no paramaters given, give the help screen.
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"))
daemon_mode = 0;
}
// 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"))
daemon_mode = 0;
}
// Now, go into daemon mode...
// 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 */
}
// This line removed because it eats error messages...
//setsid(); /* RELEASE TTY */
}
if (daemon_mode) {
if ((child = fork ()) != 0) {
usleep (1500000); // Wait for child to initialize
exit (0); /* PARENT EXITS */
}
// This line removed because it eats error messages...
//setsid(); /* RELEASE TTY */
}
#endif
// Set up lcd driver base system
lcd_init ("");
// Set up lcd driver base system
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 ();
str = argv[++i];
ing = NULL;
// 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 ();
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;
// 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 (!skip) {
ing = argv[++i];
}
//else i++;
}
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 ();
}
// 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 ();
str = argv[++i];
if (0 == strcmp (str, "off"))
backlight_state = backlight = BACKLIGHT_OFF;
else if (0 == strcmp (str, "on"))
backlight_state = backlight = BACKLIGHT_ON;
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 {
int wid, hgt;
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);
}
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 ();
str = argv[++i];
if (0 == strcmp (str, "off"))
backlight_state = backlight = BACKLIGHT_OFF;
else if (0 == strcmp (str, "on"))
backlight_state = backlight = BACKLIGHT_ON;
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 {
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]);
lcd.wid = 20;
lcd.hgt = 4;
} else {
lcd.wid = wid;
lcd.hgt = 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]);
lcd.wid = 20;
lcd.hgt = 4;
} else {
lcd.wid = wid;
lcd.hgt = hgt;
}
/* no longer needed
int j=0, valid=0;
@@ -192,126 +192,126 @@ main (int argc, char **argv)
fprintf(stderr, "LCDd: Invalid lcd size \"%s\". Using 20x4.\n", argv[i]);
}
*/
}
} 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;
}
} else {
// otherwise... Get help!
printf ("Invalid parameter: %s\n", argv[i]);
HelpScreen ();
}
}
}
} 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;
}
} else {
// otherwise... Get help!
printf ("Invalid parameter: %s\n", argv[i]);
HelpScreen ();
}
}
// Now init a bunch of required stuff...
// Now init a bunch of required stuff...
if (sock_create_server () <= 0) {
printf ("Error opening socket.\n");
return 1;
}
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 (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");
return 1;
} else if (disable_server_screen) {
server_screen->priority = 256;
}
// Main loop...
while (1) {
sock_poll_clients ();
parse_all_client_messages ();
handle_input ();
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");
return 1;
} else if (disable_server_screen) {
server_screen->priority = 256;
}
// Main loop...
while (1) {
sock_poll_clients ();
parse_all_client_messages ();
handle_input ();
// TODO: Move this code to screenlist.c...
// ... it should just say "handle_screens();"
// Timer gets reset by screenlist_next()
timer++;
// this line's here because s was getting overwritten at one time...
//s = screenlist_current();
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 ();
// TODO: Move this code to screenlist.c...
// ... it should just say "handle_screens();"
// Timer gets reset by screenlist_next()
timer++;
// this line's here because s was getting overwritten at one time...
//s = screenlist_current();
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 ();
// render something here...
if (s)
draw_screen (s, timer);
else
no_screen_screen (timer);
// render something here...
if (s)
draw_screen (s, timer);
else
no_screen_screen (timer);
usleep (TIME_UNIT);
}
usleep (TIME_UNIT);
}
// Quit!
exit_program (0);
// Quit!
exit_program (0);
return 0;
return 0;
}
void
exit_program (int val)
{
// TODO: These things shouldn't be so interdependent. The order
// things are shut down in shouldn't matter...
// TODO: These things shouldn't be so interdependent. The order
// things are shut down in shouldn't matter...
// Say goodbye!
goodbye_screen ();
// Can go anywhere...
lcd_shutdown ();
// Say goodbye!
goodbye_screen ();
// Can go anywhere...
lcd_shutdown ();
// Must come before screenlist_shutdown
client_shutdown ();
// Must come after client_shutdown
screenlist_shutdown ();
// Should come after client_shutdown
sock_close_all ();
// Must come before screenlist_shutdown
client_shutdown ();
// Must come after client_shutdown
screenlist_shutdown ();
// Should come after client_shutdown
sock_close_all ();
exit (0);
exit (0);
}
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);
}
+3 -3
View File
@@ -22,12 +22,12 @@ void exit_program (int val);
//#define TIME_UNIT (125000/2)
typedef struct screen_size {
char *size;
int wid, hgt;
char *size;
int wid, hgt;
} screen_size;
typedef struct parameter {
char *sh, *lg; // short and long versions
char *sh, *lg; // short and long versions
} parameter;
#endif
+224 -224
View File
@@ -32,34 +32,34 @@
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 int timer = 0;
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);
}
lcd.flush ();
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 ();
timer++;
timer &= 0x0f;
timer++;
timer &= 0x0f;
}
static int PAD = 255;
typedef struct menu_info {
int selected;
int length;
int selected;
int length;
} menu_info;
static int draw_menu (Menu menu, menu_info * info);
@@ -71,271 +71,271 @@ static int slid_func (menu_item * item);
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);
int (*func) ();
int (*readfunc) (int);
if (!menu)
return MENU_ERROR;
if (!menu)
return MENU_ERROR;
fill_menu_info (menu, &info);
fill_menu_info (menu, &info);
while (!done) {
// 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;
}
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);
draw_menu (menu, &info);
// FIXME: This should use a better keypress interface, which
// FIXME: handles things according to keybindings...
// FIXME: This should use a better keypress interface, which
// FIXME: handles things according to keybindings...
for (key = lcd.getkey (); key == 0; key = lcd.getkey ()) {
// sleep for 1/8th second...
framedelay ();
// do the heartbeat...
draw_heartbeat ();
// Check for client input...
}
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;
}
// 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;
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;
}
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;
}
// 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;
return status;
}
static int
draw_menu (Menu menu, menu_info * info)
{
int i;
int x = 1, y = 1;
int top = 0, bottom = 0;
int i;
int x = 1, y = 1;
int top = 0, bottom = 0;
int (*readfunc) (int);
int (*readfunc) (int);
// these should maybe be removed:
int wid = lcd.wid, hgt = lcd.hgt;
// these should maybe be removed:
int wid = lcd.wid, hgt = lcd.hgt;
if (!menu)
return MENU_ERROR;
if (!menu)
return MENU_ERROR;
lcd.clear ();
lcd.clear ();
// Scroll down until the selected item is centered, if possible...
top = info->selected - (hgt / 2);
if (top < 0)
top = 0;
bottom = top + hgt;
if (bottom > info->length)
bottom = info->length;
top = bottom - hgt;
if (top < 0)
top = 0;
// 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, '>');
// 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;
}
}
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');
if (top != 0)
lcd.chr (1, 1, '^');
if (bottom < info->length)
lcd.chr (1, hgt, 'v');
draw_heartbeat ();
//lcd.flush();
draw_heartbeat ();
//lcd.flush();
return 0;
return 0;
}
static int
fill_menu_info (Menu menu, menu_info * info)
{
int i;
int i;
info->selected = 0;
info->selected = 0;
// count the entries in the menu
for (i = 0; menu[i].text; i++);
// count the entries in the menu
for (i = 0; menu[i].text; i++);
info->length = i;
info->length = i;
return 0;
return 0;
}
static int
menu_handle_action (menu_item * item)
{
return MENU_OK;
return MENU_OK;
}
static int
slid_func (menu_item * item)
{
char str[16];
int key = 0;
int value = 0;
int x, y = 1;
int (*readfunc) (int);
char str[16];
int key = 0;
int value = 0;
int x, y = 1;
int (*readfunc) (int);
readfunc = item->data;
readfunc = item->data;
lcd.init_hbar ();
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);
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);
// Draw the slider now...
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);
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.flush();
// Draw the slider now...
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);
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.flush();
for (key = lcd.getkey (); key == 0; key = lcd.getkey ()) {
// do the heartbeat...
draw_heartbeat ();
// sleep for 1/8th second...
framedelay ();
// Check for client input...
}
for (key = lcd.getkey (); key == 0; key = lcd.getkey ()) {
// do the heartbeat...
draw_heartbeat ();
// sleep for 1/8th second...
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')
return value;
}
if (value >= MENU_CLOSE || value < 0 || key == 'A' || key == 'D')
return value;
}
return MENU_OK;
return MENU_OK;
}
+3 -3
View File
@@ -123,9 +123,9 @@ and sliders should return 0-255.
#define MENU_READ 5
typedef struct menu_item {
char *text;
int type;
void *data;
char *text;
int type;
void *data;
} menu_item;
#define Menu menu_item *
+188 -188
View File
@@ -40,20 +40,20 @@ int Backlight_On_func ();
int Backlight_Open_func ();
menu_item main_menu[] = {
{"LCDproc", 0, 0}, // Title
{"Options", TYPE_MENU, (void *) options_menu},
{"Screens", TYPE_MENU, (void *) screens_menu},
{"Shutdown", TYPE_MENU, (void *) shutdown_menu},
{0, 0, 0},
{"LCDproc", 0, 0}, // Title
{"Options", TYPE_MENU, (void *) options_menu},
{"Screens", TYPE_MENU, (void *) screens_menu},
{"Shutdown", TYPE_MENU, (void *) shutdown_menu},
{0, 0, 0},
};
menu_item options_menu[] = {
{"OPTIONS", TYPE_TITL, 0}, // Title
{"OPTIONS", TYPE_TITL, 0}, // Title
// "24-hour Time", TYPE_CHEK, (void *)Time24_func,
{"Contrast...", TYPE_SLID, (void *) Contrast_func},
{"Backlight", TYPE_MENU, (void *) Backlight_menu},
{"Heartbeat", TYPE_CHEK, (void *) Heartbeat_func},
{"Contrast...", TYPE_SLID, (void *) Contrast_func},
{"Backlight", TYPE_MENU, (void *) Backlight_menu},
{"Heartbeat", TYPE_CHEK, (void *) Heartbeat_func},
// { "Backlight...", TYPE_SLID, (void *)Backlight_func},
// "OK", TYPE_FUNC, (void *)OK_func,
// "Close Menu", TYPE_FUNC, (void *)Close_func,
@@ -61,32 +61,32 @@ menu_item options_menu[] = {
// "Another Title",TYPE_TITL, 0,
// "Main menu?", TYPE_MENU, (void *)main_menu,
// "Nothing!", TYPE_FUNC, 0,
{0, 0, 0},
{0, 0, 0},
};
menu_item screens_menu[] = {
{"SCREENS", TYPE_TITL, 0}, // Title
{"Server Scr", TYPE_CHEK, (void *) Server_screen_func},
{0, 0, 0},
{"SCREENS", TYPE_TITL, 0}, // Title
{"Server Scr", TYPE_CHEK, (void *) Server_screen_func},
{0, 0, 0},
};
menu_item shutdown_menu[] = {
{"Shut Down...", TYPE_TITL, 0}, // Title
{"Kill LCDproc", TYPE_FUNC, (void *) Shutdown_func},
{"System halt", TYPE_FUNC, (void *) System_halt_func},
{"Reboot", TYPE_FUNC, (void *) Reboot_func},
{0, 0, 0},
{"Shut Down...", TYPE_TITL, 0}, // Title
{"Kill LCDproc", TYPE_FUNC, (void *) Shutdown_func},
{"System halt", TYPE_FUNC, (void *) System_halt_func},
{"Reboot", TYPE_FUNC, (void *) Reboot_func},
{0, 0, 0},
};
menu_item Backlight_menu[] = {
{"BACKLIGHT MENU", TYPE_TITL, 0}, // Title
{"Brightness...", TYPE_SLID, (void *) Backlight_Brightness_func},
{"\"Off\" Brightness", TYPE_SLID, (void *) Backlight_Off_Brightness_func},
{"Backlight Mode:", TYPE_FUNC, 0}, // Label
{" - Off", TYPE_FUNC, Backlight_Off_func},
{" - On", TYPE_FUNC, Backlight_On_func},
{" - Open", TYPE_FUNC, Backlight_Open_func},
{0, 0, 0},
{"BACKLIGHT MENU", TYPE_TITL, 0}, // Title
{"Brightness...", TYPE_SLID, (void *) Backlight_Brightness_func},
{"\"Off\" Brightness", TYPE_SLID, (void *) Backlight_Off_Brightness_func},
{"Backlight Mode:", TYPE_FUNC, 0}, // Label
{" - Off", TYPE_FUNC, Backlight_Off_func},
{" - On", TYPE_FUNC, Backlight_On_func},
{" - Open", TYPE_FUNC, Backlight_Open_func},
{0, 0, 0},
};
///////////////////////////////////////////////////////////////////////
@@ -97,274 +97,274 @@ menu_item Backlight_menu[] = {
int
Shutdown_func ()
{
exit_program (0);
exit_program (0);
return MENU_KILL;
return MENU_KILL;
}
// Shuts down the system, if possible
int
System_halt_func ()
{
int err;
uid_t id;
int err;
uid_t id;
id = geteuid ();
id = geteuid ();
err = system ("init 0");
err = system ("init 0");
if (err < 0)
return MENU_KILL;
if (err == 127)
return MENU_KILL;
if (err < 0)
return MENU_KILL;
if (err == 127)
return MENU_KILL;
// If we're root, exit
if (id == 0)
exit_program (0);
// If we're root, exit
if (id == 0)
exit_program (0);
// Otherwise, assume shutdown will fail; and show more stats.
return MENU_KILL;
// Otherwise, assume shutdown will fail; and show more stats.
return MENU_KILL;
}
// Shuts down the system and restarts it
int
Reboot_func ()
{
int err;
uid_t id;
int err;
uid_t id;
id = geteuid ();
id = geteuid ();
err = system ("init 6");
err = system ("init 6");
if (err < 0)
return MENU_KILL;
if (err == 127)
return MENU_KILL;
if (err < 0)
return MENU_KILL;
if (err == 127)
return MENU_KILL;
// If we're root, exit
if (id == 0)
exit_program (0);
// If we're root, exit
if (id == 0)
exit_program (0);
// Otherwise, assume shutdown will fail; and show more stats.
return MENU_KILL;
// Otherwise, assume shutdown will fail; and show more stats.
return MENU_KILL;
}
int
Close_func ()
{
return MENU_CLOSE;
return MENU_CLOSE;
}
int
OK_func ()
{
return MENU_OK;
return MENU_OK;
}
int
Time24_func (int input)
{
static int status = 0;
static int status = 0;
if (input == MENU_READ)
return status;
if (input == MENU_CHECK)
status ^= 1; // does something.
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
// values in one. :)
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
// values in one. :)
// Also, "MENU_OK" happens to be zero, so it does not matter
// unless you want something else (like MENU_CLOSE)
// 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)
{
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);
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 status = 128;
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(backlight) backlight = BACKLIGHT_OFF;
else backlight = BACKLIGHT_OPEN;
}
*/
lcd.backlight (backlight_state & BACKLIGHT_ON);
/*
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);
return (status | MENU_OK);
return (status | MENU_OK);
}
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));
return (MENU_OK | (server_screen->priority < 256));
}
int
Contrast_func (int input)
{
int status;
int status;
status = lcd.contrast (-1);
status = lcd.contrast (-1);
if (input == MENU_READ)
return status;
if (input == MENU_PLUS)
status += 5; // does something.
if (input == MENU_MINUS)
status -= 5; // does something.
if (input == MENU_READ)
return status;
if (input == MENU_PLUS)
status += 5; // does something.
if (input == MENU_MINUS)
status -= 5; // does something.
if (status < 0)
status = 0;
if (status > 255)
status = 255;
lcd.contrast (status);
if (status < 0)
status = 0;
if (status > 255)
status = 255;
lcd.contrast (status);
return (status | MENU_OK);
return (status | MENU_OK);
}
void
server_menu ()
{
debug ("server_menu()\n");
debug ("server_menu()\n");
do_menu (main_menu);
do_menu (main_menu);
}
int
Backlight_Brightness_func (int input)
{
int status = backlight_brightness;
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;
backlight_brightness = status;
return (status | MENU_OK);
return (status | MENU_OK);
}
int
Backlight_Off_Brightness_func (int input)
{
int status = backlight_off_brightness;
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;
backlight_off_brightness = status;
return (status | MENU_OK);
return (status | MENU_OK);
}
int
Backlight_Off_func ()
{
backlight_state = BACKLIGHT_OFF;
backlight = BACKLIGHT_OFF;
lcd.backlight (backlight_off_brightness);
return MENU_OK;
backlight_state = BACKLIGHT_OFF;
backlight = BACKLIGHT_OFF;
lcd.backlight (backlight_off_brightness);
return MENU_OK;
}
int
Backlight_On_func ()
{
backlight_state = BACKLIGHT_ON;
backlight = BACKLIGHT_ON;
lcd.backlight (backlight_brightness * (backlight_state & BACKLIGHT_ON));
return MENU_OK;
backlight_state = BACKLIGHT_ON;
backlight = BACKLIGHT_ON;
lcd.backlight (backlight_brightness * (backlight_state & BACKLIGHT_ON));
return MENU_OK;
}
int
Backlight_Open_func ()
{
backlight = BACKLIGHT_OPEN;
return MENU_OK;
backlight = BACKLIGHT_OPEN;
return MENU_OK;
}
+86 -86
View File
@@ -23,74 +23,74 @@
int
parse_all_client_messages ()
{
int i, j;
int newtoken, inquote;
client *c;
char *str;
int i, j;
int newtoken, inquote;
client *c;
char *str;
// char *tok;
int argc;
char *argv[256];
char delimiters[] = " \0";
char leftquote[] = "\0\"'`([{\0";
char rightquote[] = "\0\"'`)]}\0";
char errmsg[256];
int invalid = 0;
int argc;
char *argv[256];
char delimiters[] = " \0";
char leftquote[] = "\0\"'`([{\0";
char rightquote[] = "\0\"'`)]}\0";
char errmsg[256];
int invalid = 0;
//debug("parse: Rewinding list...\n");
LL_Rewind (clients);
do {
// Get the next client...
//debug("parse: Getting client...\n");
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);
// 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
{
if (str[i] == rightquote[inquote]) { // Found the end of the quote
inquote = 0;
str[i] = 0;
newtoken = 1;
}
} else // Normal operation; split at delimiters
{
for (j = 1; leftquote[j]; j++) {
// Found the beginning of a new quote...
if (str[i] == leftquote[j]) {
inquote = j;
str[i] = 0;
continue;
}
}
for (j = 0; delimiters[j]; j++) {
// Break into a new string...
if (str[i] == delimiters[j]) {
str[i] = 0;
newtoken = 1;
continue;
}
}
}
if (newtoken && str[i]) {
newtoken = 0;
argv[argc] = str + i;
argc++;
} else {
}
}
if (inquote) {
sprintf (errmsg, "huh? Unterminated string: missing %c\n", rightquote[inquote]);
sock_send_string (c->sock, errmsg);
continue;
}
//debug("parse: Rewinding list...\n");
LL_Rewind (clients);
do {
// Get the next client...
//debug("parse: Getting client...\n");
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);
// 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
{
if (str[i] == rightquote[inquote]) { // Found the end of the quote
inquote = 0;
str[i] = 0;
newtoken = 1;
}
} else // Normal operation; split at delimiters
{
for (j = 1; leftquote[j]; j++) {
// Found the beginning of a new quote...
if (str[i] == leftquote[j]) {
inquote = j;
str[i] = 0;
continue;
}
}
for (j = 0; delimiters[j]; j++) {
// Break into a new string...
if (str[i] == delimiters[j]) {
str[i] = 0;
newtoken = 1;
continue;
}
}
}
if (newtoken && str[i]) {
newtoken = 0;
argv[argc] = str + i;
argc++;
} else {
}
}
if (inquote) {
sprintf (errmsg, "huh? Unterminated string: missing %c\n", rightquote[inquote]);
sock_send_string (c->sock, errmsg);
continue;
}
/*
for(tok = strtok(str, delimiters);
tok;
@@ -100,31 +100,31 @@ parse_all_client_messages ()
argc++;
}
*/
argv[argc] = NULL;
if (argc < 1)
continue;
argv[argc] = NULL;
if (argc < 1)
continue;
// Now find and call the appropriate function...
// Now find and call the appropriate function...
// debug("parse: Finding function...\n");
invalid = 1;
for (i = 0; commands[i].keyword; i++) {
invalid = 1;
for (i = 0; commands[i].keyword; i++) {
// debug("(checking %s)\n", commands[i].keyword);
if (0 == strcmp (argv[0], commands[i].keyword)) {
if (0 == strcmp (argv[0], commands[i].keyword)) {
// debug("(FOUND %s)\n", commands[i].keyword);
invalid = commands[i].function (c, argc, argv);
invalid = commands[i].function (c, argc, argv);
// debug("parse: Returned %i...\n", err);
}
}
if (invalid) {
// FIXME: Check for buffer overflows here...
sprintf (errmsg, "huh? Invalid command \"%s\"\n", argv[0]);
sock_send_string (c->sock, errmsg);
}
}
}
if (invalid) {
// FIXME: Check for buffer overflows here...
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;
return 0;
}
+357 -357
View File
@@ -42,398 +42,398 @@ static int draw_frame (LL * list, char fscroll, int left, int top, int right, in
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;
//debug("Render...\n");
//return 0;
reset = 1;
reset = 1;
//debug("draw_screen: %8x, %i\n", (int)s, timer);
//debug("draw_screen: %8x, %i\n", (int)s, timer);
if (!s)
return -1;
if (!s)
return -1;
if (s == old_s)
reset = 0;
old_s = s;
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");
//debug("draw_screen done\n");
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);
}
if ((s->heartbeat == 2) && heartbeat != HEART_OFF) {
char *phases = "-\\|/";
lcd.chr (lcd.wid, 1, phases[timer & 3]);
}
}
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);
}
if ((s->heartbeat == 2) && heartbeat != HEART_OFF) {
char *phases = "-\\|/";
lcd.chr (lcd.wid, 1, phases[timer & 3]);
}
}
lcd.flush ();
lcd.flush ();
//debug("draw_screen: %8x, %i\n", s, timer);
//debug("draw_screen: %8x, %i\n", s, timer);
return 0;
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)
{
char str[BUFSIZE]; // scratch buffer
widget *w;
char str[BUFSIZE]; // scratch buffer
widget *w;
int wid, hgt; // Width and height of visible frame area
int x, y;
int fx, fy; // Scrolling offset for the frame...
int length, speed;
//int lines;
int wid, hgt; // Width and height of visible frame area
int x, y;
int fx, fy; // Scrolling offset for the frame...
int length, speed;
//int lines;
int reset = 1;
int reset = 1;
wid = right - left; // This is the size of the visible frame area
hgt = bottom - top;
wid = right - left; // This is the size of the visible frame area
hgt = bottom - top;
fx = 0;
fy = 0;
if (fscroll == 'v') {
fx = 0;
fy = 0;
if (fscroll == 'v') {
if (fspeed > 0)
fy = (timer - fspeed) / fspeed;
if (fspeed < 0)
fy = (-fspeed) * timer;
if (fy < 0)
fy = 0;
if (fspeed > 0)
fy = (timer - fspeed) / fspeed;
if (fspeed < 0)
fy = (-fspeed) * timer;
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) {
// Release hold after it has been displayed
if (!screenlist_action || screenlist_action == RENDER_HOLD)
screenlist_action = 0;
}
// Make sure the whole frame gets displayed, at least...
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)
screenlist_action = 0;
}
fy %= fhgt;
if (fy > fhgt - hgt)
fy = fhgt - hgt;
} else if (fscroll == 'h') { // TODO: Frames don't scroll horizontally yet!
fy %= fhgt;
if (fy > fhgt - hgt)
fy = fhgt - hgt;
} else if (fscroll == 'h') { // TODO: Frames don't scroll horizontally yet!
}
//debug("draw_screen: %8x, %i\n", s, timer);
}
//debug("draw_screen: %8x, %i\n", s, timer);
if (!list)
return -1;
if (!list)
return -1;
//debug("draw_frame: %8x, %i\n", frame, timer);
//debug("draw_frame: %8x, %i\n", frame, timer);
LL_Rewind (list);
do {
w = (widget *) LL_Get (list);
if (!w)
return -1;
LL_Rewind (list);
do {
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);
}
}
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...
// .. 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);
// 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);
}
}
} 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;
break;
case WID_HBAR:
if (reset) {
lcd.init_hbar ();
reset = 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 ((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.
}
}
}
if (timer > necessaryTimeUnits) {
if (screenlist_action == RENDER_HOLD)
screenlist_action = 0;
break;
case WID_VBAR: // FIXME: Vbars don't work in frames!
if (reset) {
lcd.init_vbar ();
reset = 0;
}
}
}
break;
}
}
break;
}
case WID_FRAME:
{
// FIXME: doesn't handle nested frames quite right!
// doesn't handle scrolling in nested frames at all...
int new_left, new_top, new_right, new_bottom;
new_left = left + w->left - 1;
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);
}
}
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);
}
break;
case WID_NONE:
default:
break;
}
} while (LL_Next (list) == 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;
return 0;
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...
int new_left, new_top, new_right, new_bottom;
new_left = left + w->left - 1;
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);
}
}
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);
}
break;
case WID_NONE:
default:
break;
}
} while (LL_Next (list) == 0);
return 0;
}
+104 -104
View File
@@ -15,153 +15,153 @@
screen *
screen_create ()
{
screen *s;
screen *s;
s = malloc (sizeof (screen));
if (!s) {
fprintf (stderr, "screen_create: Error allocating new screen\n");
return NULL;
}
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;
// 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->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 = LL_new ();
if (!s->widgets) {
fprintf (stderr, "screen_create: Error allocating widget list\n");
return NULL;
}
s->widgets = LL_new ();
if (!s->widgets) {
fprintf (stderr, "screen_create: Error allocating widget list\n");
return NULL;
}
return s;
return s;
}
int
screen_destroy (screen * s)
{
widget *w;
widget *w;
if (!s)
return -1;
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);
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);
if (s->id)
free (s->id);
if (s->name)
free (s->name);
if (s->id)
free (s->id);
if (s->name)
free (s->name);
free (s);
free (s);
return 0;
return 0;
}
screen *
screen_find (client * c, char *id)
{
screen *s;
screen *s;
if (!c)
return NULL;
if (!id)
return NULL;
if (!c)
return NULL;
if (!id)
return NULL;
debug ("client_find_screen(%s)\n", id);
debug ("client_find_screen(%s)\n", id);
LL_Rewind (c->data->screenlist);
do {
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);
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);
return s;
}
} while (LL_Next (c->data->screenlist) == 0);
return NULL;
return NULL;
}
int
screen_add (client * c, char *id)
{
screen *s;
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) {
return 1;
}
// Make sure this screen doesn't already exist...
s = screen_find (c, id);
if (s) {
return 1;
}
s = screen_create ();
if (!s) {
fprintf (stderr, "screen_add: Error creating screen\n");
return -1;
}
s = screen_create ();
if (!s) {
fprintf (stderr, "screen_add: Error creating screen\n");
return -1;
}
s->parent = c;
s->parent = c;
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);
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);
// Now, add it to the screenlist...
if (screenlist_add (s) < 0) {
fprintf (stderr, "screen_add: Error queueing new screen\n");
return -1;
}
// Now, add it to the screenlist...
if (screenlist_add (s) < 0) {
fprintf (stderr, "screen_add: Error queueing new screen\n");
return -1;
}
return 0;
return 0;
}
int
screen_remove (client * c, char *id)
{
screen *s;
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);
return 1;
}
// TODO: Check for errors here?
LL_Remove (c->data->screenlist, (void *) s);
// Make sure this screen *does* exist...
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);
// ... and here?
screen_destroy (s);
// ... and here?
screen_destroy (s);
// Now, remove it from the screenlist...
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf (stderr, "screen_remove: Error dequeueing screen\n");
return 0;
}
// Now, remove it from the screenlist...
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf (stderr, "screen_remove: Error dequeueing screen\n");
return 0;
}
return 0;
return 0;
}
+8 -8
View File
@@ -5,14 +5,14 @@
#include "clients.h"
typedef struct screen {
char *id;
char *name;
int wid, hgt;
int priority;
int duration;
int heartbeat;
LL *widgets;
client *parent;
char *id;
char *name;
int wid, hgt;
int priority;
int duration;
int heartbeat;
LL *widgets;
client *parent;
} screen;
screen *screen_create ();
+132 -132
View File
@@ -25,254 +25,254 @@ int compare_addresses (void *one, void *two);
int
screenlist_init ()
{
debug ("screenlist_init()\n");
debug ("screenlist_init()\n");
screenlist = LL_new ();
if (!screenlist) {
fprintf (stderr, "screenlist_init: Error allocating list\n");
return -1;
}
screenlist = LL_new ();
if (!screenlist) {
fprintf (stderr, "screenlist_init: Error allocating list\n");
return -1;
}
screenlist_action = 0;
timer = 0;
screenlist_action = 0;
timer = 0;
return 0;
return 0;
}
int
screenlist_shutdown ()
{
debug ("screenlist_shutdown()\n");
debug ("screenlist_shutdown()\n");
LL_Destroy (screenlist);
LL_Destroy (screenlist);
return 0;
return 0;
}
int
screenlist_remove (screen * s)
{
debug ("screenlist_remove()\n");
debug ("screenlist_remove()\n");
if (!LL_Remove (screenlist, s))
return -1;
else
return 0;
if (!LL_Remove (screenlist, s))
return -1;
else
return 0;
}
int
screenlist_remove_all (screen * s)
{
int i = 0;
int i = 0;
debug ("screenlist_remove_all()\n");
debug ("screenlist_remove_all()\n");
while (LL_Remove (screenlist, s))
i++;
while (LL_Remove (screenlist, s))
i++;
debug ("screenlist_remove_all()... got %i\n", i);
debug ("screenlist_remove_all()... got %i\n", i);
return i;
return i;
}
LL *
screenlist_getlist ()
{
debug ("screenlist_getlist()\n");
debug ("screenlist_getlist()\n");
return screenlist;
return screenlist;
}
screen *
screenlist_current ()
{
char str[256];
screen *s;
static screen *old_s = NULL;
client *c;
char str[256];
screen *s;
static screen *old_s = NULL;
client *c;
//debug("screenlist_current:\n");
//LL_dprint(screenlist);
//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");
timer = 0;
// FIXME: Make sure the screen/client exists!
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) {
//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 {
//debug("screenlist_current: ... sending ignore\n");
c = old_s->parent;
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
{
}
//debug("screenlist_current: ... sent ignore\n");
}
}
if (s) {
//debug("screenlist_current: listening to new screen\n");
c = s->parent;
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
{
}
}
}
// Tell the client we're done with the current screen
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 {
//debug("screenlist_current: ... sending ignore\n");
c = old_s->parent;
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
{
}
//debug("screenlist_current: ... sent ignore\n");
}
}
if (s) {
//debug("screenlist_current: listening to new screen\n");
c = s->parent;
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
{
}
}
}
old_s = s;
old_s = s;
//debug("screenlist_current: return %8x\n", s);
//debug("screenlist_current: return %8x\n", s);
return s;
return s;
}
int
screenlist_add (screen * s)
{
// TODO: Different queueing modes...
return screenlist_add_end (s);
// TODO: Different queueing modes...
return screenlist_add_end (s);
}
screen *
screenlist_next ()
{
screen *s;
screen *s;
//debug("Screenlist_next()\n");
//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 we're on hold, don't advance!
if (screenlist_action == SCR_HOLD)
return s;
if (screenlist_action == RENDER_HOLD)
return s;
// Otherwise, reset it to regular operation
screenlist_action = 0;
// Otherwise, reset it to regular operation
screenlist_action = 0;
//debug("Screenlist_next: calling handler...\n");
//debug("Screenlist_next: calling handler...\n");
// Call the selected queuing function...
// TODO: Different queueing modes...
s = screenlist_next_priority ();
//s = screenlist_next_roll();
// Call the selected queuing function...
// TODO: Different queueing modes...
s = screenlist_next_priority ();
//s = screenlist_next_roll();
//debug("Screenlist_next() done\n");
//debug("Screenlist_next() done\n");
return s;
return s;
}
screen *
screenlist_prev ()
{
screen *s;
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 we're on hold, don't advance!
if (screenlist_action == SCR_HOLD)
return s;
if (screenlist_action == RENDER_HOLD)
return s;
// Otherwise, reset it no regular operation
screenlist_action = 0;
// Otherwise, reset it no regular operation
screenlist_action = 0;
// Call the selected queuing function...
// TODO: Different queueing modes...
s = screenlist_prev_roll ();
// Call the selected queuing function...
// TODO: Different queueing modes...
s = screenlist_prev_roll ();
return s;
return s;
}
// Adds new screens to the end of the screenlist...
int
screenlist_add_end (screen * screen)
{
debug ("screenlist_add_end()\n");
debug ("screenlist_add_end()\n");
return LL_Push (screenlist, (void *) screen);
return LL_Push (screenlist, (void *) screen);
}
// Simple round-robin approach to screen cycling...
screen *
screenlist_next_roll ()
{
//debug("screenlist_next_roll()\n");
//debug("screenlist_next_roll()\n");
if (LL_UnRoll (screenlist) != 0)
return NULL;
if (LL_UnRoll (screenlist) != 0)
return NULL;
return screenlist_current ();
return screenlist_current ();
}
// Strict priority queue approach...
screen *
screenlist_next_priority ()
{
//screen *s, *t;
//debug("screenlist_next_priority\n");
//screen *s, *t;
//debug("screenlist_next_priority\n");
if (LL_UnRoll (screenlist) != 0)
return NULL;
if (LL_UnRoll (screenlist) != 0)
return NULL;
LL_Sort (screenlist, compare_priority);
LL_Sort (screenlist, compare_priority);
return screenlist_current ();
return screenlist_current ();
}
// Simple round-robin approach to screen cycling...
screen *
screenlist_prev_roll ()
{
//debug("screenlist_prev_roll()\n");
//debug("screenlist_prev_roll()\n");
if (LL_Roll (screenlist) != 0)
return NULL;
if (LL_Roll (screenlist) != 0)
return NULL;
return screenlist_current ();
return screenlist_current ();
}
int
compare_priority (void *one, void *two)
{
screen *a, *b;
screen *a, *b;
//debug("compare_priority: %8x %8x\n", one, two);
//debug("compare_priority: %8x %8x\n", one, two);
if (!one)
return 0;
if (!two)
return 0;
if (!one)
return 0;
if (!two)
return 0;
a = (screen *) one;
b = (screen *) two;
a = (screen *) one;
b = (screen *) two;
//debug("compare_priority: done?\n");
//debug("compare_priority: done?\n");
return (a->priority - b->priority);
return (a->priority - b->priority);
}
int
compare_addresses (void *one, void *two)
{
//printf("compare_addresses: 0x%x == 0x%x ???\n", one, two);
//if(one == two) printf("Yes!\n");
//else printf("No!\n");
return (one != two);
//printf("compare_addresses: 0x%x == 0x%x ???\n", one, two);
//if(one == two) printf("Yes!\n");
//else printf("No!\n");
return (one != two);
}
+119 -119
View File
@@ -30,168 +30,168 @@ char three[256] = "";
int
server_screen_init ()
{
widget *w;
widget *w;
debug ("server_screen_init\n");
debug ("server_screen_init\n");
server_screen = screen_create ();
server_screen = screen_create ();
if (!server_screen) {
fprintf (stderr, "server_screen_init: Error allocating screen\n");
return -1;
}
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->id = id;
server_screen->name = name;
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);
// 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);
// Now, initialize all the widgets...
w = widget_find (server_screen, "title");
if (w) {
w->text = title;
} else {
fprintf (stderr, "server_screen_init: Can't find title\n");
}
// Now, initialize all the widgets...
w = widget_find (server_screen, "title");
if (w) {
w->text = title;
} else {
fprintf (stderr, "server_screen_init: Can't find title\n");
}
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");
}
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");
}
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");
}
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");
}
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");
}
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");
}
// And enqueue the screen
screenlist_add (server_screen);
// And enqueue the screen
screenlist_add (server_screen);
debug ("server_screen_init done\n");
debug ("server_screen_init done\n");
return 0;
return 0;
}
int
update_server_screen (int timer)
{
client *c;
int num_clients;
screen *s;
int num_screens;
client *c;
int num_clients;
screen *s;
int num_screens;
// Draw a title...
//strcpy(title, "LCDproc Server");
// 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);
do {
c = LL_Get (clients);
if (c) {
num_clients++;
LL_Rewind (c->data->screenlist);
do {
s = LL_Get (c->data->screenlist);
if (s) {
num_screens++;
}
} while (LL_Next (c->data->screenlist) == 0);
}
} while (LL_Next (clients) == 0);
// Now get info on the number of connected clients...
num_clients = 0;
num_screens = 0;
LL_Rewind (clients);
do {
c = LL_Get (clients);
if (c) {
num_clients++;
LL_Rewind (c->data->screenlist);
do {
s = LL_Get (c->data->screenlist);
if (s) {
num_screens++;
}
} while (LL_Next (c->data->screenlist) == 0);
}
} while (LL_Next (clients) == 0);
if (lcd.hgt >= 3) {
sprintf (one, "Clients: %i", num_clients);
sprintf (two, "Screens: %i", num_screens);
} else {
if (lcd.wid >= 20)
sprintf (one, "%i Client%s, %i Screen%s", num_clients, (num_clients == 1) ? "" : "s", num_screens, (num_screens == 1) ? "" : "s");
else // 16x2 size
sprintf (one, "%i Cli%s, %i Scr%s", num_clients, (num_clients == 1) ? "" : "s", num_screens, (num_screens == 1) ? "" : "s");
}
if (lcd.hgt >= 3) {
sprintf (one, "Clients: %i", num_clients);
sprintf (two, "Screens: %i", num_screens);
} else {
if (lcd.wid >= 20)
sprintf (one, "%i Client%s, %i Screen%s", num_clients, (num_clients == 1) ? "" : "s", num_screens, (num_screens == 1) ? "" : "s");
else // 16x2 size
sprintf (one, "%i Cli%s, %i Scr%s", num_clients, (num_clients == 1) ? "" : "s", num_screens, (num_screens == 1) ? "" : "s");
}
return 0;
return 0;
}
int
no_screen_screen (int timer)
{
lcd.clear ();
lcd.clear ();
lcd.string (1, 1, "Error: No screen!");
lcd.string (1, 1, "Error: No screen!");
lcd.flush ();
lcd.flush ();
return 0;
return 0;
}
int
goodbye_screen ()
{
char
*b20 = " ", *t20 = " Thanks for using ",
char
*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 = "";
*nil = "";
lcd.clear ();
lcd.clear ();
if (lcd.hgt >= 4) {
if (lcd.wid >= 20) {
lcd.string (1, 1, b20);
lcd.string (1, 2, t20);
lcd.string (1, 3, l20);
lcd.string (1, 4, b20);
} 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);
}
}
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 {
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;
return 0;
}
+141 -141
View File
@@ -36,30 +36,30 @@ int read_from_client (int filedes);
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);
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;
}
/* 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;
}
/* 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;
return sock;
}
@@ -67,27 +67,27 @@ sock_create_inet_socket (unsigned short int port)
int
sock_create_server ()
{
int sock;
int sock;
debug ("sock_create_server()\n");
debug ("sock_create_server()\n");
/* Create the socket and set it up to accept connections. */
sock = sock_create_inet_socket (LCDPORT);
if (sock < 0) {
perror ("sock_create_server: Error creating socket");
return -1;
}
/* 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;
}
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);
/* Initialize the set of active sockets. */
FD_ZERO (&active_fd_set);
FD_SET (sock, &active_fd_set);
orig_sock = sock;
orig_sock = sock;
/*
{
@@ -104,123 +104,123 @@ sock_create_server ()
}
*/
return sock;
return sock;
}
int
sock_poll_clients ()
{
int i;
int err;
struct sockaddr_in clientname;
size_t size;
struct timeval t;
client *c;
int i;
int err;
struct sockaddr_in clientname;
size_t size;
struct timeval t;
client *c;
//debug("sock_poll_clients()\n");
//debug("sock_poll_clients()\n");
t.tv_sec = 0;
t.tv_usec = 0;
t.tv_sec = 0;
t.tv_usec = 0;
/* Block until input arrives on one or more active sockets. */
read_fd_set = active_fd_set;
/* 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");
return -1;
}
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) {
/* 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");
return -1;
}
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);
/* 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) {
/* 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");
return -1;
}
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);
return -1;
}
} 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) {
// TODO: Destroy a "client" here... (done?)
c = client_find_sock (i);
if (c) {
//sock_send_string(i, "bye\n");
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);
}
} while (err > 0);
// 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 {
/* 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) {
// TODO: Destroy a "client" here... (done?)
c = client_find_sock (i);
if (c) {
//sock_send_string(i, "bye\n");
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);
}
} while (err > 0);
}
}
}
return 0;
}
}
}
return 0;
}
int
read_from_client (int filedes)
{
char buffer[MAXMSG];
int nbytes, i;
client *c;
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);
//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?
{
// TODO: check errno here!
//fprintf (stderr,"read_from_client: Read error\n");
return 0;
} else if (nbytes == 0) // EOF
return -1;
else if (nbytes > (MAXMSG - (MAXMSG / 8))) // Very noisy client...
{
sock_send_string (filedes, "huh? Shut up!\n");
return -1;
} else // Data Read
{
buffer[nbytes] = 0;
// Now, replace zeros with linefeeds...
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);
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
return -1;
else if (nbytes > (MAXMSG - (MAXMSG / 8))) // Very noisy client...
{
sock_send_string (filedes, "huh? Shut up!\n");
return -1;
} else // Data Read
{
buffer[nbytes] = 0;
// Now, replace zeros with linefeeds...
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);
return nbytes;
}
return nbytes;
debug ("read_from_client: got message: `%s'\n", buffer);
return nbytes;
}
return nbytes;
}
// FIXME: This talks to all open files, including
@@ -229,18 +229,18 @@ read_from_client (int filedes)
int
sock_close_all ()
{
int i;
int i;
debug ("sock_close_all()\n");
debug ("sock_close_all()\n");
for (i = 0; i < FD_SETSIZE; i++) {
// TODO: Destroy a "client" here...? Nope.
sock_send_string (i, "bye\n");
close (i);
FD_CLR (i, &active_fd_set);
debug ("sock_close_all: Closed connection %i\n", i);
}
for (i = 0; i < FD_SETSIZE; i++) {
// TODO: Destroy a "client" here...? Nope.
sock_send_string (i, "bye\n");
close (i);
FD_CLR (i, &active_fd_set);
debug ("sock_close_all: Closed connection %i\n", i);
}
return 0;
return 0;
}
+238 -238
View File
@@ -9,16 +9,16 @@
#include "widget.h"
char *types[] = { "none",
"string",
"hbar",
"vbar",
"icon",
"title",
"scroller",
"frame",
"num",
//"",
NULL,
"string",
"hbar",
"vbar",
"icon",
"title",
"scroller",
"frame",
"num",
//"",
NULL,
};
static widget *widget_finder (LL * list, char *id);
@@ -27,85 +27,85 @@ static int widget_remover (LL * list, widget * w);
widget *
widget_create ()
{
widget *w;
widget *w;
debug ("widget_create()\n");
debug ("widget_create()\n");
w = malloc (sizeof (widget));
if (!w) {
fprintf (stderr, "widget_create: Error allocating widget\n");
return NULL;
}
w = malloc (sizeof (widget));
if (!w) {
fprintf (stderr, "widget_create: Error allocating widget\n");
return NULL;
}
w->id = NULL;
w->type = 0;
w->x = 1;
w->y = 1;
w->wid = 0;
w->hgt = 0;
w->left = 1;
w->top = 1;
w->right = 0;
w->bottom = 0;
w->length = 1;
w->speed = 1;
w->text = NULL;
w->kids = NULL;
w->id = NULL;
w->type = 0;
w->x = 1;
w->y = 1;
w->wid = 0;
w->hgt = 0;
w->left = 1;
w->top = 1;
w->right = 0;
w->bottom = 0;
w->length = 1;
w->speed = 1;
w->text = NULL;
w->kids = NULL;
return w;
return w;
}
int
widget_destroy (widget * w)
{
LL *list;
widget *foo;
LL *list;
widget *foo;
if (!w)
return -1;
if (!w)
return -1;
debug ("widget_destroy(%s)\n", w->id);
debug ("widget_destroy(%s)\n", w->id);
if (w->id)
free (w->id);
//debug("widget_destroy: id...\n");
if (w->text)
free (w->text);
//debug("widget_destroy: text...\n");
if (w->id)
free (w->id);
//debug("widget_destroy: id...\n");
if (w->text)
free (w->text);
//debug("widget_destroy: text...\n");
// TODO: Free kids!
if (w->kids) {
list = w->kids;
LL_Rewind (list);
do {
foo = LL_Get (list);
if (foo)
widget_destroy (foo);
} while (0 == LL_Next (list));
// TODO: Free kids!
if (w->kids) {
list = w->kids;
LL_Rewind (list);
do {
foo = LL_Get (list);
if (foo)
widget_destroy (foo);
} while (0 == LL_Next (list));
LL_Destroy (list);
w->kids = NULL;
}
LL_Destroy (list);
w->kids = NULL;
}
free (w);
//debug("widget_destroy: widget...\n");
free (w);
//debug("widget_destroy: widget...\n");
return 0;
return 0;
}
widget *
widget_find (screen * s, char *id)
{
//widget *w, *err;
//widget *w, *err;
if (!s)
return NULL;
if (!id)
return NULL;
if (!s)
return NULL;
if (!id)
return NULL;
debug ("widget_find(%s)\n", id);
debug ("widget_find(%s)\n", id);
return widget_finder (s->widgets, id);
return widget_finder (s->widgets, id);
/*
LL_Rewind(s->widgets);
do {
@@ -131,160 +131,160 @@ widget_find (screen * s, char *id)
widget *
widget_finder (LL * list, char *id)
{
widget *w, *err;
widget *w, *err;
if (!list)
return NULL;
if (!id)
return NULL;
if (!list)
return NULL;
if (!id)
return NULL;
debug ("widget_finder(%s)\n", id);
debug ("widget_finder(%s)\n", id);
LL_Rewind (list);
do {
//debug("widget_finder: Iteration\n");
w = LL_Get (list);
if (w) {
//debug("widget_finder: ...\n");
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;
}
//debug("widget_finder: ...\n");
}
LL_Rewind (list);
do {
//debug("widget_finder: Iteration\n");
w = LL_Get (list);
if (w) {
//debug("widget_finder: ...\n");
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;
}
//debug("widget_finder: ...\n");
}
} while (LL_Next (list) == 0);
} while (LL_Next (list) == 0);
return NULL;
return NULL;
}
int
widget_add (screen * s, char *id, char *type, char *in, int sock)
{
int i;
int valid = 0;
int wid_type = 0;
widget *w, *parent;
LL *list;
int i;
int valid = 0;
int wid_type = 0;
widget *w, *parent;
LL *list;
debug ("widget_add(%s, %s, %s)\n", id, type, in);
debug ("widget_add(%s, %s, %s)\n", id, type, in);
if (!s)
return -1;
if (!id)
return -1;
if (!s)
return -1;
if (!id)
return -1;
list = s->widgets;
list = s->widgets;
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) {
// already exists
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) {
// no frame to use as parent
sock_send_string (sock, "huh? Frame doesn't exist\n");
return 3;
} else {
if (parent->type == WID_FRAME) {
list = parent->kids;
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");
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;
}
}
if (!valid) {
// invalid widget type
sock_send_string (sock, "huh? Invalid widget type\n");
return 2;
}
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) {
// already exists
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) {
// no frame to use as parent
sock_send_string (sock, "huh? Frame doesn't exist\n");
return 3;
} else {
if (parent->type == WID_FRAME) {
list = parent->kids;
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");
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;
}
}
if (!valid) {
// invalid widget type
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");
return -1;
}
// Now, make it...
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");
return -1;
}
w->id = strdup (id);
if (!w->id) {
fprintf (stderr, "widget_add: Error allocating id\n");
return -1;
}
w->type = wid_type;
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");
return -1;
}
}
}
// TODO: Check for errors here?
LL_Push (list, (void *) w);
// 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");
return -1;
}
}
}
// TODO: Check for errors here?
LL_Push (list, (void *) w);
return 0;
return 0;
}
int
widget_remove (screen * s, char *id, int sock)
{
widget *w;
LL *list;
widget *w;
LL *list;
debug ("widget_remove(%s)\n", id);
debug ("widget_remove(%s)\n", id);
if (!s)
return -1;
if (!id)
return -1;
if (!s)
return -1;
if (!id)
return -1;
list = s->widgets;
list = s->widgets;
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);
return 1;
}
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);
return 1;
}
/*
// TODO: Check for errors here?
@@ -296,7 +296,7 @@ widget_remove (screen * s, char *id, int sock)
// widget_destroy(w);
*/
return widget_remover (list, w);
return widget_remover (list, w);
// return 0;
}
@@ -304,58 +304,58 @@ widget_remove (screen * s, char *id, int sock)
int
widget_remover (LL * list, widget * w)
{
widget *foo, *bar;
int err;
widget *foo, *bar;
int err;
debug ("widget_remover\n");
debug ("widget_remover\n");
if (!list)
return 0;
if (!w)
return 0;
if (!list)
return 0;
if (!w)
return 0;
// Search through the list...
LL_Rewind (list);
do {
// Test each item
foo = LL_Get (list);
if (foo) {
// Frames require recursion to search and/or destroy
if (foo->type == WID_FRAME) {
// If removing a frame, kill all its kids, too...
if (foo == w) {
if (!foo->kids) {
fprintf (stderr, "widget_remover: frame has no kids\n");
} else // Kill the kids...
{
LL_Rewind (foo->kids);
do {
bar = LL_Get (foo->kids);
err = widget_remover (foo->kids, bar);
} while (0 == LL_Next (foo->kids));
// Search through the list...
LL_Rewind (list);
do {
// Test each item
foo = LL_Get (list);
if (foo) {
// Frames require recursion to search and/or destroy
if (foo->type == WID_FRAME) {
// If removing a frame, kill all its kids, too...
if (foo == w) {
if (!foo->kids) {
fprintf (stderr, "widget_remover: frame has no kids\n");
} else // Kill the kids...
{
LL_Rewind (foo->kids);
do {
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);
}
// Then kill the parent...
LL_Remove (list, (void *) w);
widget_destroy (w);
}
} 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);
} 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);
}
} else // If not a frame, remove it if it matches...
{
if (foo == w) {
LL_Remove (list, (void *) w);
widget_destroy (w);
}
}
}
} while (0 == LL_Next (list));
}
} else // If not a frame, remove it if it matches...
{
if (foo == w) {
LL_Remove (list, (void *) w);
widget_destroy (w);
}
}
}
} while (0 == LL_Next (list));
return 0;
return 0;
}
+10 -10
View File
@@ -4,16 +4,16 @@
#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...
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...
+414 -414
View File
File diff suppressed because it is too large Load Diff
+15 -15
View File
@@ -116,13 +116,13 @@
// See LL.c for more detailed descriptions of these functions.
typedef struct LL_node {
struct LL_node *next, *prev;
void *data;
struct LL_node *next, *prev;
void *data;
} LL_node;
typedef struct LL {
LL_node head, tail;
LL_node *current;
LL_node head, tail;
LL_node *current;
} LL;
// Creates a new list...
@@ -149,10 +149,10 @@ int LL_Put (LL * list, void *data);
LL_node *LL_GetNode (LL * list);
int LL_PutNode (LL * list, LL_node * node);
void *LL_GetFirst (LL * list); // gets data from first node
void *LL_GetNext (LL * list); // ... next node
void *LL_GetPrev (LL * list); // ... prev node
void *LL_GetLast (LL * list); // ... last node
void *LL_GetFirst (LL * list); // gets data from first node
void *LL_GetNext (LL * list); // ... next node
void *LL_GetPrev (LL * list); // ... prev node
void *LL_GetLast (LL * list); // ... last node
int LL_AddNode (LL * list, void *add); // Adds node AFTER current one
int LL_InsertNode (LL * list, void *add); // Adds node BEFORE current one
@@ -163,14 +163,14 @@ void *LL_Remove (LL * list, void *data);
// Stack operations
int LL_Push (LL * list, void *add); // Add node to end of list
void *LL_Pop (LL * list); // Remove node from end of list
void *LL_Top (LL * list); // Peek at end node
void *LL_Shift (LL * list); // Remove node from start of list
void *LL_Look (LL * list); // Peek at first node
void *LL_Pop (LL * list); // Remove node from end of list
void *LL_Top (LL * list); // Peek at end node
void *LL_Shift (LL * list); // Remove node from start of list
void *LL_Look (LL * list); // Peek at first node
int LL_Unshift (LL * list, void *add); // Add node to beginning of list
int LL_Roll (LL * list); // Make first node last
int LL_UnRoll (LL * list); // Roll the other way...
int LL_Roll (LL * list); // Make first node last
int LL_UnRoll (LL * list); // Roll the other way...
// Queue operations...
//int LL_Enqueue(LL *list, void *add);
@@ -186,7 +186,7 @@ int LL_PriorityEnqueue (LL * list, void *add, int compare (void *, void *));
int LL_SwapNodes (LL_node * one, LL_node * two); // Switch two nodes positions...
int LL_nSwapNodes (int one, int two); // Switch two nodes positions...
int LL_Length (LL * list); // Returns # of nodes in entire list
int LL_Length (LL * list); // Returns # of nodes in entire list
// Searching...
void *LL_Find (LL * list, int compare (void *, void *), void *value);
+1 -1
View File
@@ -7,7 +7,7 @@
#else
#define debug /* printf */
#define debug /* printf */
#endif
+132 -132
View File
@@ -30,18 +30,18 @@ typedef struct sockaddr_in sockaddr_in;
static int
sock_init_sockaddr (sockaddr_in * name, const char *hostname, unsigned short int port)
{
struct hostent *hostinfo;
struct hostent *hostinfo;
name->sin_family = AF_INET;
name->sin_port = htons (port);
hostinfo = gethostbyname (hostname);
if (hostinfo == NULL) {
fprintf (stderr, "sock_init_sockaddr: Unknown host %s.\n", hostname);
return -1;
}
name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
name->sin_family = AF_INET;
name->sin_port = htons (port);
hostinfo = gethostbyname (hostname);
if (hostinfo == NULL) {
fprintf (stderr, "sock_init_sockaddr: Unknown host %s.\n", hostname);
return -1;
}
name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
return 0;
return 0;
}
@@ -49,179 +49,179 @@ sock_init_sockaddr (sockaddr_in * name, const char *hostname, unsigned short int
int
sock_connect (char *host, unsigned short int port)
{
struct sockaddr_in servername;
int sock;
int err = 0;
struct sockaddr_in servername;
int sock;
int err = 0;
debug ("sock_connect: Creating socket\n");
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror ("sock_connect: Error creating socket");
return sock;
}
debug ("sock_connect: Created socket (%i)\n", sock);
debug ("sock_connect: Creating socket\n");
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror ("sock_connect: Error creating socket");
return sock;
}
debug ("sock_connect: Created socket (%i)\n", sock);
sock_init_sockaddr (&servername, host, port);
sock_init_sockaddr (&servername, host, port);
err = connect (sock, (struct sockaddr *) &servername, sizeof (servername));
if (err < 0) {
perror ("sock_connect: connect failed");
shutdown (sock, 2);
return 0; // Normal exit if server doesn't exist...
}
err = connect (sock, (struct sockaddr *) &servername, sizeof (servername));
if (err < 0) {
perror ("sock_connect: connect failed");
shutdown (sock, 2);
return 0; // Normal exit if server doesn't exist...
}
fcntl (sock, F_SETFL, O_NONBLOCK);
fcntl (sock, F_SETFL, O_NONBLOCK);
return sock;
return sock;
}
int
sock_close (int fd)
{
int err;
int err;
err = shutdown (fd, 2);
if (!err)
close (fd);
err = shutdown (fd, 2);
if (!err)
close (fd);
return err;
return err;
}
// Send/receive lines of text
int
sock_send_string (int fd, char *string)
{
int len;
int offset = 0;
int len;
int offset = 0;
if (!string)
return -1;
if (!string)
return -1;
len = strlen (string) + 1;
while (offset != len) {
// write isn't guaranteed to send the entire string at once,
// so we have to sent it in a loop like this
int sent = write (fd, string + offset, len - offset);
if (sent == -1) {
if (errno != EAGAIN) {
perror ("sock_send_string: socket write error");
printf ("Message was: %s\n", string);
//shutdown(fd, 2);
return sent;
}
continue;
} else if (sent == 0) {
// when this returns zero, it generally means
// we got disconnected
return sent + offset;
}
len = strlen (string) + 1;
while (offset != len) {
// write isn't guaranteed to send the entire string at once,
// so we have to sent it in a loop like this
int sent = write (fd, string + offset, len - offset);
if (sent == -1) {
if (errno != EAGAIN) {
perror ("sock_send_string: socket write error");
printf ("Message was: %s\n", string);
//shutdown(fd, 2);
return sent;
}
continue;
} else if (sent == 0) {
// when this returns zero, it generally means
// we got disconnected
return sent + offset;
}
offset += sent;
}
offset += sent;
}
return offset;
return offset;
}
// Recv gives only one line per call...
int
sock_recv_string (int fd, char *dest, size_t maxlen)
{
char *ptr = dest;
int recv = 0;
char *ptr = dest;
int recv = 0;
if (!dest)
return -1;
if (maxlen <= 0)
return 0;
if (!dest)
return -1;
if (maxlen <= 0)
return 0;
while (1) {
int err = read (fd, ptr, 1);
if (err == -1) {
if (errno == EAGAIN) {
if (recv) {
// We've begun to read a string, but no bytes are
// available. Loop.
continue;
}
return 0;
} else {
perror ("sock_recv_string: socket read error");
return err;
}
} else if (err == 0) {
return recv;
}
while (1) {
int err = read (fd, ptr, 1);
if (err == -1) {
if (errno == EAGAIN) {
if (recv) {
// We've begun to read a string, but no bytes are
// available. Loop.
continue;
}
return 0;
} else {
perror ("sock_recv_string: socket read error");
return err;
}
} else if (err == 0) {
return recv;
}
recv++;
recv++;
if (recv == maxlen || *ptr == 0 || *ptr == 10) {
*ptr = 0;
break;
}
ptr++;
}
if (recv == maxlen || *ptr == 0 || *ptr == 10) {
*ptr = 0;
break;
}
ptr++;
}
if (recv == 1 && dest[0] == 0) {
// Don't return a null string
return 0;
}
if (recv == 1 && dest[0] == 0) {
// Don't return a null string
return 0;
}
if (recv < maxlen - 1) {
dest[recv] = 0;
}
if (recv < maxlen - 1) {
dest[recv] = 0;
}
return recv;
return recv;
}
// Send/receive raw data
int
sock_send (int fd, void *src, size_t size)
{
int offset = 0;
int offset = 0;
if (!src)
return -1;
if (!src)
return -1;
while (offset != size) {
// write isn't guaranteed to send the entire string at once,
// so we have to sent it in a loop like this
int sent = write (fd, ((char *) src) + offset, size - offset);
if (sent == -1) {
if (errno != EAGAIN) {
perror ("sock_send: socket write error");
//shutdown(fd, 2);
return sent;
}
continue;
} else if (sent == 0) {
// when this returns zero, it generally means
// we got disconnected
return sent + offset;
}
while (offset != size) {
// write isn't guaranteed to send the entire string at once,
// so we have to sent it in a loop like this
int sent = write (fd, ((char *) src) + offset, size - offset);
if (sent == -1) {
if (errno != EAGAIN) {
perror ("sock_send: socket write error");
//shutdown(fd, 2);
return sent;
}
continue;
} else if (sent == 0) {
// when this returns zero, it generally means
// we got disconnected
return sent + offset;
}
offset += sent;
}
offset += sent;
}
return offset;
return offset;
}
int
sock_recv (int fd, void *dest, size_t maxlen)
{
int err;
int err;
if (!dest)
return -1;
if (maxlen <= 0)
return 0;
if (!dest)
return -1;
if (maxlen <= 0)
return 0;
err = read (fd, dest, maxlen);
if (err < 0) {
//fprintf (stderr,"sock_recv: socket read error\n");
//shutdown(fd, 2);
return err;
}
//debug("sock_recv: Got message \"%s\"\n", (char *)dest);
err = read (fd, dest, maxlen);
if (err < 0) {
//fprintf (stderr,"sock_recv: socket read error\n");
//shutdown(fd, 2);
return err;
}
//debug("sock_recv: Got message \"%s\"\n", (char *)dest);
return err;
return err;
}
+20 -20
View File
@@ -8,28 +8,28 @@
int
get_args (char **argv, char *str, int max_args)
{
char *delimiters = " \n\0";
char *item;
int i = 0;
char *delimiters = " \n\0";
char *item;
int i = 0;
if (!argv)
return -1;
if (!str)
return 0;
if (max_args < 1)
return 0;
if (!argv)
return -1;
if (!str)
return 0;
if (max_args < 1)
return 0;
//debug("get_args(%i): string=%s\n", max_args, str);
//debug("get_args(%i): string=%s\n", max_args, str);
// Parse the command line...
for (item = strtok (str, delimiters); item; item = strtok (NULL, delimiters)) {
//debug("get_args: item=%s\n", item);
if (i < max_args) {
argv[i] = item;
i++;
} else
return i;
}
// Parse the command line...
for (item = strtok (str, delimiters); item; item = strtok (NULL, delimiters)) {
//debug("get_args: item=%s\n", item);
if (i < max_args) {
argv[i] = item;
i++;
} else
return i;
}
return i;
return i;
}
+335 -335
View File
File diff suppressed because it is too large Load Diff