diff --git a/acconfig.h b/acconfig.h index 82d350f..993e0c6 100644 --- a/acconfig.h +++ b/acconfig.h @@ -29,6 +29,8 @@ #undef JOY_DRV +#undef LB216_DRV + #undef LCDPORT #undef LINUX @@ -47,6 +49,8 @@ #undef SLI_DRV +#undef SOLARIS + #undef STAT_NFS #undef STAT_SMBFS diff --git a/acinclude.m4 b/acinclude.m4 index 1ac1705..aae37cf 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -6,10 +6,10 @@ AC_ARG_ENABLE(drivers, [ drivers may be separated with commas.] [ \"all\" compiles all drivers], drivers="$enableval", - drivers=[mtxorb,cfontz,curses,text]) + drivers=[mtxorb,cfontz,curses,text,lb216]) if test "$drivers" = "all"; then - drivers=[mtxorb,cfontz,curses,text,hd44780,joy,irman,lircin] + drivers=[mtxorb,cfontz,curses,text,lb216,hd44780,joy,irman,lircin] AC_MSG_RESULT(all) fi @@ -41,6 +41,10 @@ fi DRIVERS="$DRIVERS text.o" AC_DEFINE(TEXT_DRV) ;; + lb216) + DRIVERS="$DRIVERS lb216.o" + AC_DEFINE(LB216_DRV) + ;; hd44780) DRIVERS="$DRIVERS hd44780.o hd44780-4bit.o hd44780-ext8bit.o lcd_sem.o hd44780-serialLpt.o hd44780-winamp.o" AC_DEFINE(HD44780_DRV) diff --git a/clients/lcdproc/chrono.c b/clients/lcdproc/chrono.c index f201c55..0bb8378 100644 --- a/clients/lcdproc/chrono.c +++ b/clients/lcdproc/chrono.c @@ -101,7 +101,9 @@ chrono_init () # endif /* Get OS name and version from uname() */ - if (uname (unamebuf) != 0) { + /* Changed to check if eq -1 instead of non-zero */ + /* since uname may return any non-negative value */ + if (uname (unamebuf) == -1) { perror ("Error calling uname:"); } strcpy (kver, unamebuf->release); diff --git a/clients/lcdproc/load.c b/clients/lcdproc/load.c index 455b65d..e81da7e 100644 --- a/clients/lcdproc/load.c +++ b/clients/lcdproc/load.c @@ -27,20 +27,24 @@ get_loadavg (void) int load_init () { +#ifndef SOLARIS if (!loadavg_fd) loadavg_fd = open ("/proc/loadavg", O_RDONLY); +#endif return 0; } int load_close () { +#ifndef SOLARIS if (loadavg_fd) close (loadavg_fd); loadavg_fd = 0; +#endif return 0; } diff --git a/clients/lcdproc/mem.c b/clients/lcdproc/mem.c index a159d08..35bb24b 100644 --- a/clients/lcdproc/mem.c +++ b/clients/lcdproc/mem.c @@ -15,6 +15,11 @@ #include "mode.h" #include "mem.h" +#ifdef SOLARIS +#include +#endif + + struct meminfo { int total, cache, buffers, free, shared; }; @@ -27,7 +32,9 @@ static void get_mem_info (struct meminfo *result) { // int i, res; char *bufptr; + int pagesize,page,i; +#ifndef SOLARIS reread (meminfo_fd, "get_meminfo:"); result[0].total = getentry ("MemTotal:", buffer); result[0].free = getentry ("MemFree:", buffer); @@ -36,26 +43,39 @@ get_mem_info (struct meminfo *result) result[0].cache = getentry ("Cached:", buffer); result[1].total = getentry ("SwapTotal:", buffer); result[1].free = getentry ("SwapFree:", buffer); +#else + result[0].total = 0; + result[0].free = 0; + result[0].shared = 0; + result[0].buffers = 0; + result[0].cache = 0; + result[1].total = 0; + result[1].free = 0; +#endif } int mem_init () { +#ifndef SOLARIS if (!meminfo_fd) { meminfo_fd = open ("/proc/meminfo", O_RDONLY); } +#endif return 0; } int mem_close () { +#ifndef SOLARIS if (meminfo_fd) meminfo_fd = open ("/proc/meminfo", O_RDONLY); meminfo_fd = 0; +#endif return 0; } diff --git a/clients/lcdproc/mode.c b/clients/lcdproc/mode.c index b80979a..55924b4 100644 --- a/clients/lcdproc/mode.c +++ b/clients/lcdproc/mode.c @@ -29,6 +29,10 @@ #include "load.h" #include "mem.h" +#ifdef SOLARIS +#include +#endif + int ELLIPSIS = '-'; // TODO: Clean this up... Support multiple display sizes.. diff --git a/configure.in b/configure.in index 6d9b7cc..4f0bb61 100644 --- a/configure.in +++ b/configure.in @@ -8,6 +8,10 @@ case "$host" in *-*-*linux*) AC_DEFINE(LINUX) ;; +*-*-*solaris*) + AC_DEFINE(SOLARIS) + LIBS="-lnsl -lsocket" + ;; esac AC_MSG_CHECKING(whether to enable debugging) diff --git a/server/drivers/CFontz.c b/server/drivers/CFontz.c index 4f05d09..5d7d4cb 100644 --- a/server/drivers/CFontz.c +++ b/server/drivers/CFontz.c @@ -13,6 +13,7 @@ #include "../../shared/debug.h" #include "../../shared/str.h" +#include "../../config.h" static int custom = 0; typedef enum { @@ -138,7 +139,9 @@ CFontz_init (lcd_logical_driver * driver, char *args) tcgetattr (fd, &portset); // This is necessary in Linux, but does not exist in irix. #ifndef IRIX +#ifndef SOLARIS cfmakeraw (&portset); +#endif #endif cfsetospeed (&portset, speed); cfsetispeed (&portset, speed); diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index 5c6598c..496ba52 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -2,7 +2,7 @@ noinst_LIBRARIES = libLCDdrivers.a libLCDdrivers_a_SOURCES = lcd.c lcd.h drv_base.c EXTRA_libLCDdrivers_a_SOURCES = MtxOrb.c MtxOrb.h text.c text.h \ curses_drv.c curses_drv.h drv_base.c drv_base.h \ - hd44780.c hd44780.h \ + hd44780.c hd44780.h lb216.c lb216.h \ hd44780-4bit.c hd44780-4bit.h \ hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h \ hd44780-serialLpt.c hd44780-serialLpt.h \ diff --git a/server/drivers/MtxOrb.c b/server/drivers/MtxOrb.c index 4515b56..ab66af8 100644 --- a/server/drivers/MtxOrb.c +++ b/server/drivers/MtxOrb.c @@ -11,6 +11,7 @@ #include "../../shared/debug.h" #include "../../shared/str.h" +#include "../../config.h" static int custom = 0; @@ -149,7 +150,9 @@ MtxOrb_init (lcd_logical_driver * driver, char *args) tcgetattr (fd, &portset); // This is necessary in Linux, but does not exist in irix. #ifndef IRIX +#ifndef SOLARIS cfmakeraw (&portset); +#endif #endif cfsetospeed (&portset, speed); cfsetispeed (&portset, speed); diff --git a/server/drivers/lb216.c b/server/drivers/lb216.c new file mode 100644 index 0000000..cd3ac3f --- /dev/null +++ b/server/drivers/lb216.c @@ -0,0 +1,599 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../shared/str.h" + +#include "lcd.h" +#include "lb216.h" +#include "drv_base.h" + +#include "../render.h" + +#include "../../shared/debug.h" +#include "../../config.h" + +static int custom=0; +typedef enum { + hbar = 1, + vbar = 2, + bign = 4, + beat = 8 } custom_type; + + + +static int fd; + +static void LB216_hidecursor(); +static void LB216_reboot(); + +// TODO: Get rid of this variable? +lcd_logical_driver *LB216; +// TODO: Get the frame buffers working right + +///////////////////////////////////////////////////////////////// +// Opens com port and sets baud correctly... +// +int LB216_init(lcd_logical_driver *driver, char *args) +{ + char *argv[64]; + int argc; + struct termios portset; + int i; + int tmp; + int reboot=0; + + char device[256] = "/dev/lcd"; + int speed=B9600; + + LB216 = driver; + + //debug("LB216_init: Args(all): %s\n", args); + + argc = get_args(argv, args, 64); + + /* + for(i=0; i argc) { + fprintf(stderr, "LB216_init: %s requires an argument\n", + argv[i]); + return -1; + } + strcpy(device, argv[++i]); + } + else if(0 == strcmp(argv[i], "-b") || + 0 == strcmp(argv[i], "--brightness")) + { + if(i + 1 > argc) { + fprintf(stderr, "LB216_init: %s requires an argument\n", + argv[i]); + return -1; + } + tmp = atoi(argv[++i]); + if((tmp < 0) || (tmp > 255)){ + fprintf(stderr, "LB216_init: %s argument must between 0 and 255. Using default value.\n", + argv[i]); + } else backlight_brightness = tmp; + } + else if(0 == strcmp(argv[i], "-s") || + 0 == strcmp(argv[i], "--speed")) + { + if(i + 1 > argc) { + fprintf(stderr, "LB216_init: %s requires an argument\n", + argv[i]); + return -1; + } + tmp = atoi(argv[++i]); + if(tmp==2400) speed=B2400; + else if(tmp==9600) speed=B9600; + else { + fprintf(stderr, "LB216_init: %s argument must be 2400, or 9600. Using default value.\n", + argv[i]); + } + } + else if(0 == strcmp(argv[i], "-h") || + 0 == strcmp(argv[i], "--help")) + { + printf("LCDproc LB216 LCD driver\n" + "\t-d\t--device\tSelect the output device to use [/dev/lcd]\n" + "\t-t\t--type\t\tSelect the LCD type (size) [16x2]\n" + "\t-b\t--brightness\tSet the initial brightness [255]\n" + "\t-s\t--speed\t\tSet the communication speed [9600]\n" + "\t-r\t--reboot\tReinitialize the LCD's BIOS\n" + "\t-h\t--help\t\tShow this help information\n"); + return -1; + } + else if(0 == strcmp(argv[i], "-r") || + 0 == strcmp(argv[i], "--reboot")) + { + printf("LCDd: rebooting LB216 LCD...\n"); + reboot=1; + } + else + { + printf("Invalid parameter: %s\n", argv[i]); + } + + } + + // Set up io port correctly, and open it... + fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY); + if (fd == -1) + { + fprintf(stderr, "LB216_init: failed (%s)\n", strerror(errno)); + return -1; + } + //else fprintf(stderr, "LB216_init: opened device %s\n", device); + tcgetattr(fd, &portset); + // This is necessary in Linux, but does not exist in irix or solaris. +#ifndef IRIX +#ifndef SOLARIS + cfmakeraw(&portset); +#endif +#endif + cfsetospeed(&portset, speed); + cfsetispeed(&portset, speed); + tcsetattr(fd, TCSANOW, &portset); + + + // Set display-specific stuff.. + if(reboot) + { + LB216_reboot(); + sleep(4); + reboot=0; + } + sleep(1); + LB216_hidecursor(); + LB216_backlight(backlight_brightness); + + + if(!driver->framebuf) + { + fprintf(stderr, "LB216_init: No frame buffer.\n"); + driver->close(); + return -1; + } + + + // Set the functions the driver supports... + + driver->clear = NULL; + driver->string = LB216_string; + driver->chr = LB216_chr; + driver->vbar = LB216_vbar; + driver->init_vbar = LB216_init_vbar; + driver->hbar = LB216_hbar; + driver->init_hbar = LB216_init_hbar; + driver->num = NULL; + driver->init_num = NULL; + + driver->init = LB216_init; + driver->close = LB216_close; + driver->flush = LB216_flush; + driver->flush_box = NULL; + driver->contrast = NULL; + driver->backlight = LB216_backlight; + driver->set_char = LB216_set_char; + driver->icon = LB216_icon; + driver->draw_frame = LB216_draw_frame; + + lcd.cellwid = 5; + lcd.cellhgt = 8; + + debug("LB216: foo!\n"); + + return fd; +} + + + +///////////////////////////////////////////////////////////////// +// Clean-up +// +void LB216_close() +{ + close (fd); + + if(LB216->framebuf) free(LB216->framebuf); + + LB216->framebuf = NULL; +} + + +void LB216_flush() +{ + LB216_draw_frame(lcd.framebuf); +} + + + +///////////////////////////////////////////////////////////////// +// Prints a character on the lcd display, at position (x,y). The +// upper-left is (1,1), and the lower right should be (16,2). +// +void LB216_chr(int x, int y, char c) +{ + //y--; + // x--; + + //if(c < 32 && c >= 0) c += 128; +// lcd.framebuf[(y*lcd.wid) + x] = c; + char chr[1]; + sprintf(chr, "%c", c); + LB216_string (x, y, chr); +} + + +///////////////////////////////////////////////////////////////// +// Sets the backlight on or off -- can be done quickly for +// an intermediate brightness... +// +void LB216_backlight(int on) +{ + char out[4]; + if(on) + { + sprintf(out, "%c%c", 254, 253); + } + else + { + sprintf(out, "%c%c", 254, 252); + } + write(fd, out, 2); +} + + +///////////////////////////////////////////////////////////////// +// Get rid of the blinking curson +// +static void LB216_hidecursor() +{ + char out[4]; + sprintf(out, "%c%c", 254,12); + write(fd, out, 2); +} + +///////////////////////////////////////////////////////////////// +// Reset the display bios +// +static void LB216_reboot() +{ + char out[4]; + sprintf(out, "%c%c", 254,1); + write(fd, out, 2); +} + + +///////////////////////////////////////////////////////////// +// Blasts a single frame onscreen, to the lcd... +// +// Input is a character array, sized lcd.wid*lcd.hgt +// +void LB216_draw_frame(char *dat) +{ + char out[LCD_MAX_WIDTH * LCD_MAX_HEIGHT]; + int i,j; + + if(!dat) return; + + sprintf(out, "%c%c", 254,80); + write(fd, out, 2); + + + for(j=0; j 0 && len>0; y--) + { + if(len >= lcd.cellhgt) LB216_chr(x, y, 255); + else LB216_chr(x, y, map[len]); + + len -= lcd.cellhgt; + } + +} + +///////////////////////////////////////////////////////////////// +// Draws a horizontal bar to the right. +// +void LB216_hbar(int x, int y, int len) +{ + char map[7] = { 32, 1, 2, 3, 4, 5 }; + + for(; x<=lcd.wid && len>0; x++) + { + if(len >= lcd.cellwid) LB216_chr(x,y,map[5]); + else LB216_chr(x, y, map[len]); + + //printf ("%d,",len); + len -= lcd.cellwid; + + } +// printf ("\n"); + +} + + +///////////////////////////////////////////////////////////////// +// Sets a custom character from 0-7... +// +// For input, values > 0 mean "on" and values <= 0 are "off". +// +// The input is just an array of characters... +// +void LB216_set_char(int n, char *dat) +{ + char out[4]; + int row, col; + int letter; + + if(n < 0 || n > 7) return; + n=64+(8*n); + if(!dat) return; + + sprintf(out, "%c%c", 254, n); + write(fd, out, 2); + + for(row=0; row 0); + } + sprintf(out,"%c",letter); + write(fd, out, 1); + } +} + +void LB216_icon(int which, char dest) +{ + char icons[3][8*8] = { + { + 1,1,1,1,1, // Empty Heart + 1,0,1,0,1, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 1,0,0,0,1, + 1,1,0,1,1, + 1,1,1,1,1, + }, + + { + 1,1,1,1,1, // Filled Heart + 1,0,1,0,1, + 0,1,0,1,0, + 0,1,1,1,0, + 0,1,1,1,0, + 1,0,1,0,1, + 1,1,0,1,1, + 1,1,1,1,1, + }, + + { + 0,0,0,0,0, // Ellipsis + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 1,0,1,0,1, + }, + + }; + + if(custom==bign) custom=beat; + LB216_set_char(dest, &icons[which][0]); +} diff --git a/server/drivers/lb216.h b/server/drivers/lb216.h new file mode 100644 index 0000000..d2a91b4 --- /dev/null +++ b/server/drivers/lb216.h @@ -0,0 +1,24 @@ +#ifndef LB216_H +#define LB216_H + + +extern lcd_logical_driver *LB216; + +int LB216_init(lcd_logical_driver *driver, char *device); +void LB216_close(); +void LB216_string (int x, int y, char string[]); +void LB216_flush(); +void LB216_flush_box(int lft, int top, int rgt, int bot); +void LB216_chr(int x, int y, char c) ; +void LB216_backlight(int on); +void LB216_init_vbar(); +void LB216_init_hbar(); +void LB216_vbar(int x, int len); +void LB216_hbar(int x, int y, int len); +void LB216_init_num(); +void LB216_num(int x, int num); +void LB216_set_char(int n, char *dat); +void LB216_icon(int which, char dest); +void LB216_draw_frame(char *dat); + +#endif diff --git a/server/drivers/lcd.c b/server/drivers/lcd.c index e0353f3..e779c84 100644 --- a/server/drivers/lcd.c +++ b/server/drivers/lcd.c @@ -24,6 +24,10 @@ #include "CFontz.h" #endif +#ifdef LB216_DRV +#include "lb216.h" +#endif + #ifdef TEXT_DRV #include "text.h" #endif @@ -74,6 +78,9 @@ lcd_physical_driver drivers[] = { #ifdef SLI_DRV {"sli", sli_init,}, #endif +#ifdef LB216_DRV + {"LB216", LB216_init,}, +#endif #ifdef TEXT_DRV {"text", text_init,}, #endif diff --git a/server/main.c b/server/main.c index c41a95e..c159246 100644 --- a/server/main.c +++ b/server/main.c @@ -303,7 +303,7 @@ HelpScreen () printf ("\t-h\t--help\n\t\t\tDisplay this help screen\n"); printf ("\t-t\t--type \n\t\t\tSelect an LCD size (20x4, 16x2, etc...)\n"); printf ("\t-d\t--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\tCFontz, curses, HD44780, irmanin, joy,\n\t\t\tMtxOrb, LB216, 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 \n\t\t\tSet backlight mode (on, off, open)\n");