LCDproc development and user support list

Text archives Help


[Lcdproc] picoLCD patch to remove libusblcd and libhid dependency


Chronological Thread 
  • From: npavel AT ituner.com (Nicu Pavel)
  • Subject: [Lcdproc] picoLCD patch to remove libusblcd and libhid dependency
  • Date: Wed May 2 14:55:01 2007

Hi,

Attached is a patch for Mini-box.com picoLCD (based on latest CVS)
that removes the need for libusblcd as suggested by the original author
Gatewood Green. It only uses libusb there is no need for libhid (the
latest libusblcd doesn't need libhid either).
The patch also adds supports for vbar, hbar, bignum and custom
characters.

Thanks,
Nicu Pavel.

P.S. I'd like to thanks Gatewood Green for his work on adding picoLCD to
lcdproc.

P.S2. If any maintainers would like a sample of picoLCD we will be happy
to send it to you.



diff -uNrp lcdproc-cvs/acinclude.m4 lcdproc-patch/acinclude.m4
--- lcdproc-cvs/acinclude.m4	2007-03-31 15:43:27.000000000 +0300
+++ lcdproc-patch/acinclude.m4	2007-05-02 15:15:30.000000000 +0300
@@ -277,21 +277,8 @@ dnl				else
 			actdrivers=["$actdrivers NoritakeVFD"]
 			;;
 		picolcd)
-			AC_CHECK_HEADERS([usblcd.h],[
-				AC_CHECK_LIB(usblcd, main,[
-					LIBUSBLCD="-lusblcd"
-					DRIVERS="$DRIVERS picolcd${SO}"
-					actdrivers=["$actdrivers picolcd"]
-				],[
-dnl				else
-					AC_MSG_WARN([The picolcd driver needs the usblcd library])
-				],
-				[-lusblcd]
-				)
-			],[
-dnl			else        
-				AC_MSG_WARN([The picolcd driver needs widgets.h, usblcd.h and usblcd_util.h from the usblcd package])
-			])       
+			DRIVERS="$DRIVERS picolcd${SO}"
+			actdrivers=["$actdrivers picolcd"]
 			;;       
 		pyramid)
 			DRIVERS="$DRIVERS pyramid${SO}"
diff -uNrp lcdproc-cvs/server/drivers/Makefile.am lcdproc-patch/server/drivers/Makefile.am
--- lcdproc-cvs/server/drivers/Makefile.am	2007-03-31 15:43:28.000000000 +0300
+++ lcdproc-patch/server/drivers/Makefile.am	2007-05-02 17:08:39.000000000 +0300
@@ -25,6 +25,7 @@ noinst_LIBRARIES = libLCD.a libbignum.a
 IOWarrior_CFLAGS =   @libusb_cflags@ $(AM_CFLAGS)
 hd44780_CFLAGS =     @libusb_cflags@ $(AM_CFLAGS)
 g15_CFLAGS =         @libusb_cflags@ $(AM_CFLAGS)
+picolcd_CFLAGS =     @libusb_cflags@ $(AM_CFLAGS)	
 
 CFontz_LDADD =       libLCD.a libbignum.a
 CFontz633_LDADD =    libLCD.a libbignum.a
@@ -45,7 +46,7 @@ MD8800_LDADD =       libLCD.a
 mtc_s16209x_LDADD =  libLCD.a
 MtxOrb_LDADD =       libLCD.a libbignum.a
 NoritakeVFD_LDADD =  libLCD.a
-picolcd_LDADD =      libLCD.a @LIBUSBLCD@
+picolcd_LDADD =      @libusb_libs@ libLCD.a libbignum.a
 pyramid_LDADD =      libLCD.a
 serialPOS_LDADD =    libLCD.a libbignum.a
 serialVFD_LDADD =    libLCD.a libbignum.a
diff -uNrp lcdproc-cvs/server/drivers/picolcd.c lcdproc-patch/server/drivers/picolcd.c
--- lcdproc-cvs/server/drivers/picolcd.c	2007-03-18 16:53:24.000000000 +0200
+++ lcdproc-patch/server/drivers/picolcd.c	2007-05-02 16:26:04.000000000 +0300
@@ -4,6 +4,9 @@
  * (c) 2007 NitroSecurity, Inc.
  * Written by Gatewood Green <woody AT nitrosecurity.com> or <woody AT linif.org>
  * (c) 2007 Peter Marschall - adapted coding style and reporting to LCDproc
+ * (c) 2007 Mini-Box.com, Nicu Pavel <npavel AT ituner.com> 
+ *     - removed libusblcd and hid dependency
+ *     - added vbar, hbar, custom char, bignum support
  *
  * License: GPL (same as usblcd and lcdPROC)
  *
@@ -15,38 +18,16 @@
  * of the picoLCD
  *
  * The picoLCD is usb connected and is driven (currently) via userspace 
- * libraries using the Mini-box.com usblcd library (not to be confused with the 
- * Linux usblcd module which does NOT support this device).  The usblcd library 
- * rides atop libusb and libhid (both of which are required for this driver to 
- * operate).
+ * using libusb library.
  *
  *   libusb: http://libusb.sf.net
- *   libhid: http://libhid.alioth.debian.org
- *   usblcd: http://www.mini-box.com/picoLCD-20x2-OEM
- * 
- * The usblcd library is very haphazardly written and directly writes to 
- * stdout and stderr instead of returning the result for most functions 
- * (including read_events).  Eventually it would be a good idea to eliminate 
- * the need for usblcd and drive the hardware via libusb and libhid directly.  
- * Such a conversion has the opportunity to provide meaningful return values 
- * for all fucntions (instead of stab and hope) and allow for use of multiple 
- * picoLCD devices.
- *
- * Due to the way libusblcd's read_events prints keys to stderr instead of 
- * returning a struct or some such, you will find my own get_key_events below.
- *
- * ### WARNING ###: libusblcd.so sets a handler for SIGTERM.  Because most 
- * applications would set up their signal handling early on (before calling 
- * new_usblcd_operations()), this can result in a condition that will prevent
- * a handler your application installed from executing.  If your handler was 
- * responsible for cleaning up logs, syncing, etc, it can result in lost data. 
  * 
  */
 
 /* lcdPROC includes */
 #include "lcd.h"
 #include "picolcd.h"
-
+#include <usb.h>
 /* Debug mode: un-comment to turn on debugging messages in the server */
 /* #define DEBUG 1 */
 
@@ -56,11 +37,6 @@
 # include "config.h"
 #endif
 
-/* These three includes are the Mini-box.com libusblcd (usblcd) and company. */
-#include <usblcd.h>
-#include <widgets.h>
-#include <usblcd_util.h>
-
 /* Various odds and ends */
 #include <string.h>
 #include <errno.h>
@@ -77,17 +53,32 @@
 #define DEFAULT_KEYLIGHTS 1    /* On */
 #define DEFAULT_TIMEOUT   500  /* Half second */
 
+#define NUM_CCs         8 /* max. number of custom characters */ 
+
+typedef enum {
+	standard,	/* only char 0 is used for heartbeat */
+	vbar,		/* vertical bars */
+	hbar,		/* horizontal bars */
+	custom,		/* custom settings */
+	bignum,		/* big numbers */
+	bigchar		/* big characters */
+} CGmode;
+
 
 /* PrivateData struct */
 typedef struct pd {
-	usblcd_operations *lcd; // Reference to the LCD instance
+	usb_dev_handle *lcd;
 	int  width;
 	int  height;
+	int  cellwidth;
+	int  cellheight;
 	int  key_timeout;
 	int  contrast;
 	int  backlight;
 	int  keylights;
 	int  key_light[KEYPAD_LIGHTS];
+	/* defineable characters */
+	CGmode ccmode;
 	char *key_matrix[KEYPAD_MAX];
 	char *info;
 	unsigned char *framebuf;
@@ -111,8 +102,11 @@ static char * keymap[KEYPAD_MAX] = {
 };
 
 /* Private function definitions */
-void get_key_event  (usblcd_operations *self, lcd_packet *packet, int timeout);
-void set_key_lights (usblcd_operations *self, int keys[], int state);
+static usb_dev_handle *picolcd_open(void);
+static void picolcd_send(usb_dev_handle *lcd, unsigned char *data, int size);
+static void picolcd_write(usb_dev_handle *lcd, const int row, const int col, const unsigned char *data);
+static void get_key_event  (usb_dev_handle *lcd, lcd_packet *packet, int timeout);
+static void set_key_lights (usb_dev_handle *lcd, int keys[], int state);
 
 /* lcd_logical_driver Variables */
 MODULE_EXPORT char *api_version       = API_VERSION;
@@ -120,7 +114,7 @@ MODULE_EXPORT int  stay_in_foreground = 
 MODULE_EXPORT int  supports_multiple  = 1;
 MODULE_EXPORT char *symbol_prefix     = "picoLCD_";
 
-/* lcd_logical_driver Manditory functions */
+/* lcd_logical_driver mandatory functions */
 MODULE_EXPORT int  picoLCD_init(Driver *drvthis) {
 	PrivateData *pd;
 	int x;
@@ -133,11 +127,13 @@ MODULE_EXPORT int  picoLCD_init(Driver *
 	if (drvthis->store_private_ptr(drvthis, pd))
 		return -1;
 
-	pd->lcd = new_usblcd_operations();
-	pd->lcd->init(pd->lcd);
+	pd->lcd = picolcd_open();
 	pd->width  = 20; /* hard coded (mfg spec) */
 	pd->height = 2;  /* hard coded (mfg spec) */
 	pd->info = "picoLCD: Supports the LCD as installed on the M300 (http://www.mini-box.com/Mini-Box-M300-LCD) ";
+	pd->cellwidth = LCD_DEFAULT_CELLWIDTH;
+	pd->cellheight = LCD_DEFAULT_CELLHEIGHT;
+	pd->ccmode = standard;
 
 	for (x = 0; x < KEYPAD_LIGHTS; x++)
 		pd->key_light[x] = 1; /* individual lights on */
@@ -191,7 +187,8 @@ MODULE_EXPORT int  picoLCD_init(Driver *
 MODULE_EXPORT void picoLCD_close(Driver *drvthis) {
 	PrivateData *pd = drvthis->private_data;
 
-	pd->lcd->close(pd->lcd); /* This actually does not do anything in usblcd (yet?) */
+	usb_release_interface(pd->lcd, 0);
+	usb_close(pd->lcd);
 
 	debug(RPT_DEBUG, "picolcd: close complete\n");
 }
@@ -213,6 +210,7 @@ MODULE_EXPORT void picoLCD_clear(Driver 
 	PrivateData *pd = drvthis->private_data;
 
 	memset(pd->framebuf, ' ', pd->width * pd->height);
+	pd->ccmode = standard;
 
 	debug(RPT_DEBUG, "picolcd: clear complete\n");
 }
@@ -221,7 +219,7 @@ MODULE_EXPORT void picoLCD_flush(Driver 
 	PrivateData   *pd = drvthis->private_data;
 	unsigned char *fb = pd->framebuf;
 	unsigned char *lf = pd->lstframe;
-	static char   text[48];
+	static unsigned char   text[48];
 	int           i, line, offset;
 
 	debug(RPT_DEBUG, "picolcd: flush started\n");
@@ -234,8 +232,8 @@ MODULE_EXPORT void picoLCD_flush(Driver 
 
 		for (i = 0; i < pd->width; i++) {
 			if (*fb++ != *lf++) {
-				strncpy(text, pd->framebuf + offset, pd->width);
-				pd->lcd->settext(pd->lcd, line, 0, text);
+				strncpy((char *)text, (char *)pd->framebuf + offset, pd->width);
+				picolcd_write(pd->lcd, line, 0, text);
 				memcpy(pd->lstframe + offset, pd->framebuf + offset, pd->width);
 
 				debug(RPT_DEBUG, "picolcd: flush wrote line %d (%s)\n", line + 1, text);
@@ -248,9 +246,9 @@ MODULE_EXPORT void picoLCD_flush(Driver 
 	debug(RPT_DEBUG, "picolcd: flush complete\n\t(%s)\n\t(%s)\n", pd->framebuf, pd->lstframe);
 }
 
-MODULE_EXPORT void picoLCD_string(Driver *drvthis, int x, int y, char *str) {
+MODULE_EXPORT void picoLCD_string(Driver *drvthis, int x, int y, unsigned char *str) {
 	PrivateData *pd = drvthis->private_data;
-	char *dest;
+	unsigned char *dest;
 	int  len;
 
 	debug(RPT_DEBUG, "picolcd: string start (%s)\n", str);
@@ -260,7 +258,7 @@ MODULE_EXPORT void picoLCD_string(Driver
 	if (x < 1 || x > pd->width)
 		return;
 
-	len = strlen(str);
+	len = strlen((char *)str);
 	if (len + x > pd->width) {
 		debug(RPT_DEBUG, "picolcd: string overlength (>%d). Start: %d Length: %d (%s)\n", pd->width, x, len ,str);
 
@@ -274,10 +272,9 @@ MODULE_EXPORT void picoLCD_string(Driver
 	debug(RPT_DEBUG, "picolcd: string complete (%s)\n", str);
 }
 
-MODULE_EXPORT void picoLCD_chr(Driver *drvthis, int x, int y, char chr) {
+MODULE_EXPORT void picoLCD_chr(Driver *drvthis, int x, int y, unsigned char chr) {
 	PrivateData *pd = drvthis->private_data;
-	char *dest;
-
+	unsigned char *dest;
 	debug(RPT_DEBUG, "picolcd: chr start (%c)\n", chr);
 
 	if (y < 1 || y > pd->height)
@@ -288,16 +285,168 @@ MODULE_EXPORT void picoLCD_chr(Driver *d
 	x--; y--; /* Convert 1-based to 0-based */
 	dest = pd->framebuf + (y * pd->width + x);
 	memcpy(dest, &chr, sizeof(char));
-
 	debug(RPT_DEBUG, "picolcd: chr complete (%c)\n", chr);
 }
 
+
+MODULE_EXPORT void picoLCD_set_char (Driver *drvthis, int n, unsigned char *dat)
+{
+	PrivateData *pd = drvthis->private_data;
+	unsigned char packet[10] = { 0x9c };   /* define character */ 
+	unsigned char mask = (1 << pd->cellwidth) - 1;
+	int row;
+
+	if ((n < 0) || (n >= NUM_CCs))
+		return;
+	if (!dat)
+		return;
+
+	packet[1] = n;	/* Custom char to define. */
+
+	for (row = 0; row < pd->cellheight; row++) {
+		packet[row + 2] = dat[row] & mask;
+	}
+	
+	picolcd_send(pd->lcd, packet, 10);
+}
+
+MODULE_EXPORT int picoLCD_get_free_chars (Driver *drvthis)
+{
+	return NUM_CCs;
+}
+
+
+MODULE_EXPORT void picoLCD_vbar (Driver *drvthis, int x, int y, int len, int promille, int options)
+{
+	PrivateData *pd = drvthis->private_data;
+
+	if (pd->ccmode != vbar) {
+		unsigned char vBar[pd->cellheight];
+		int i;
+
+		if (pd->ccmode != standard) {
+			/* Not supported(yet) */
+			report(RPT_WARNING, "%s: vbar: cannot combine two modes using user-defined characters",
+					drvthis->name);
+			return;
+		}
+		pd->ccmode = vbar;
+
+		memset(vBar, 0x00, sizeof(vBar));
+
+		for (i = 1; i < pd->cellheight; i++) {
+			// add pixel line per pixel line ...
+			vBar[pd->cellheight - i] = 0xFF;
+			picoLCD_set_char(drvthis, i, vBar);
+		}
+	}
+
+	lib_vbar_static(drvthis, x, y, len, promille, options, pd->cellheight, 0);
+}
+
+
+
+MODULE_EXPORT void picoLCD_hbar (Driver *drvthis, int x, int y, int len, int promille, int options)
+{
+	PrivateData *pd = drvthis->private_data;
+
+	if (pd->ccmode != hbar) {
+		unsigned char hBar[pd->cellheight];
+		int i;
+
+		if (pd->ccmode != standard) {
+			/* Not supported(yet) */
+			report(RPT_WARNING, "%s: hbar: cannot combine two modes using user-defined characters",
+					drvthis->name);
+			return;
+		}
+
+		pd->ccmode = hbar;
+
+		memset(hBar, 0x00, sizeof(hBar));
+
+		for (i = 1; i <= pd->cellwidth; i++) {
+			// fill pixel columns from left to right.
+			memset(hBar, 0xFF & ~((1 << (pd->cellwidth - i)) - 1), sizeof(hBar)-1);
+			picoLCD_set_char(drvthis, i, hBar);
+		}
+	}
+
+	lib_hbar_static(drvthis, x, y, len, promille, options, pd->cellwidth, 0);
+}
+
+MODULE_EXPORT void picoLCD_num (Driver *drvthis, int x, int num)
+{
+	PrivateData *pd = drvthis->private_data;
+	int do_init = 0;
+
+	if ((num < 0) || (num > 10))
+		return;
+
+	if (pd->ccmode != bignum) {
+		if (pd->ccmode != standard) {
+			/* Not supported (yet) */
+			report(RPT_WARNING, "%s: num: cannot combine two modes using user-defined characters",
+					drvthis->name);
+			return;
+		}
+
+		pd->ccmode = bignum;
+
+		do_init = 1;
+	}
+
+	// Lib_adv_bignum does everything needed to show the bignumbers.
+	lib_adv_bignum(drvthis, x, num, 0, do_init);
+}
+
+
+MODULE_EXPORT int picoLCD_icon (Driver *drvthis, int x, int y, int icon)
+{
+	PrivateData *pd = drvthis->private_data;
+	
+	/* 8x5 icons each number represents one row in binary */
+
+	static unsigned char heart_open[] = 
+	    { 0x0, 0xa, 0x15, 0x11, 0x1b, 0xa, 0x4, 0x0 };
+		 
+
+	static unsigned char heart_filled[] = 
+	    { 0x0, 0xa, 0x1f, 0x1f, 0x1f, 0xe, 0x4, 0x0 };
+		 
+	switch (icon) {
+		case ICON_BLOCK_FILLED:
+			picoLCD_chr(drvthis, x, y, 255);
+			break;
+		case ICON_HEART_FILLED:
+		        pd->ccmode = custom;
+			picoLCD_set_char(drvthis, 7, heart_filled);
+			picoLCD_chr(drvthis, x, y, 7);
+			break;
+		case ICON_HEART_OPEN:
+		        pd->ccmode = custom;
+			picoLCD_set_char(drvthis, 7, heart_open);
+			picoLCD_chr(drvthis, x, y, 7);
+			break;
+		case ICON_ARROW_LEFT:
+			picoLCD_chr(drvthis, x, y, 127);
+			break;
+		case ICON_ARROW_RIGHT:
+			picoLCD_chr(drvthis, x, y, 126);
+			break;
+
+		default:
+			return -1; /* Let the core do other icons */
+	}
+	return 0;
+}
+
 /* lcd_logical_driver Essential input functions */
 
 MODULE_EXPORT char *picoLCD_get_key(Driver *drvthis) {
 	PrivateData *pd = drvthis->private_data;
 	lcd_packet *keydata;
-	char *keystr;
+	char *keystr = NULL;
 	int  keys_read = 0;
 	int  key_pass  = 0;
 	int  two_keys  = 0;
@@ -398,20 +547,23 @@ MODULE_EXPORT char *picoLCD_get_key(Driv
 MODULE_EXPORT int  picoLCD_set_contrast(Driver *drvthis, int promille) {
 	PrivateData *pd = drvthis->private_data;
 	int inv; /* The hardware seems to go dark on higher values, so we turn it around */
-
+	unsigned char packet[2] = { 0x92 }; /* set contrast id */
+	
 	if (promille <= 1000 && promille > 0) {
 		inv = 1000 - promille;
-		pd->lcd->contrast(pd->lcd, (int) (inv / 1000 * 40));
-		return 0;
+		packet[1] =  inv / 1000 * 40;
 	} else if (promille > 1000) {
-		pd->lcd->contrast(pd->lcd,  0);
-		return 0;
+		packet[1] = 0;
 	} else if (promille <= 0) {
-		pd->lcd->contrast(pd->lcd,  40);
-		return 0;
+		packet[1] = 40;
 	} else {
 		return -1;
 	}
+	
+	picolcd_send(pd->lcd, packet, 2);
+	return 0;
+	
+	
 }
 
 /*MODULE_EXPORT int picoLCD_get_brightness(Driver *drvthis, int state) {
@@ -426,15 +578,18 @@ MODULE_EXPORT int  picoLCD_set_contrast(
 
 MODULE_EXPORT void picoLCD_backlight(Driver *drvthis, int state) {
 	PrivateData *pd = drvthis->private_data;
-
+	unsigned char packet[2] = { 0x91 }; /* set backlight id */
+	
 	if (state == 0) {
-		pd->lcd->backlight(pd->lcd, state);
+		packet[1] = state; 
+		picolcd_send(pd->lcd, packet, 2);
 		set_key_lights(pd->lcd, pd->key_light, state);
 		return;
 	}
 
 	if (state == 1) {
-		pd->lcd->backlight(pd->lcd, state);
+		packet[1] = state;
+		picolcd_send(pd->lcd, packet, 2);
 		if (pd->keylights)
 			set_key_lights(pd->lcd, pd->key_light, state);
 		return;
@@ -456,12 +611,90 @@ MODULE_EXPORT char *picoLCD_get_info(Dri
 }
 
 /* Private functions */
-void get_key_event (usblcd_operations *self, lcd_packet *packet, int timeout) {
+
+static usb_dev_handle *picolcd_open(void)
+{
+    
+	usb_dev_handle *lcd;
+        struct usb_bus *busses, *bus;
+	struct usb_device *dev;
+        char driver[1024];
+        int ret;
+    
+	lcd = NULL;
+
+        debug(RPT_DEBUG, "picolcd: scanning for devices...\n");
+
+	usb_init();
+	usb_find_busses();
+	usb_find_devices();
+	busses = usb_get_busses();
+
+	for (bus = busses; bus; bus = bus->next) {
+		for (dev = bus->devices; dev; dev = dev->next) {
+			if ((dev->descriptor.idVendor == picoLCD_VENDOR) && (dev->descriptor.idProduct == picoLCD_DEVICE)) {
+				debug(RPT_DEBUG, "Found picoLCD on bus %s device %s \n", bus->dirname, dev->filename);
+				lcd = usb_open(dev);
+				ret = usb_get_driver_np(lcd, 0, driver, sizeof(driver));
+				if (ret == 0) {
+					debug(RPT_DEBUG, "Interface 0 already claimed by '%s' attempting to detach driver...\n", driver);
+					if (usb_detach_kernel_driver_np(lcd, 0) < 0) {
+						debug(RPT_DEBUG, "Failed to detach '%s' driver !\n", driver);
+						return NULL;
+					}
+				}
+
+				usb_set_configuration(lcd, 1);
+				usleep(100);
+
+				if (usb_claim_interface(lcd, 0) < 0) {
+					debug(RPT_DEBUG, "Failed to claim interface !\n");
+					return NULL;
+				}
+
+				usb_set_altinterface(lcd, 0);
+				return lcd;
+			}
+		}
+	}
+	
+	debug(RPT_DEBUG, "Could not find a picoLCD !\n");
+	return NULL;
+}
+
+static void picolcd_send(usb_dev_handle *lcd, unsigned char *data, int size)
+{
+        usb_interrupt_write(lcd, USB_ENDPOINT_OUT + 1, (char *) data, size, 1000);
+}
+
+static void picolcd_write(usb_dev_handle *lcd, const int row, const int col, const unsigned char *data)
+{
+	unsigned char packet[64];
+        int len, i;
+    
+        len = strlen((char *)data);
+        if (len > 20) len = 20;
+
+	packet[0] = 0x98;
+        packet[1] = row;
+        packet[2] = col;
+        packet[3] = len;
+
+	i = 4;
+        while (len--) {
+		packet[i++] = *data++;
+        }
+
+	picolcd_send(lcd, packet, i);
+}
+
+
+void get_key_event (usb_dev_handle *lcd, lcd_packet *packet, int timeout) {
 	int ret;
 
 	memset(packet->data, 0, 255);
 	packet->type = 0;
-	ret = usb_interrupt_read(self->hid->hiddev->handle, USB_ENDPOINT_IN + 1, packet->data, _USBLCD_MAX_DATA_LEN, timeout);
+	ret = usb_interrupt_read(lcd, USB_ENDPOINT_IN + 1, (char *)packet->data, PICOLCD_MAX_DATA_LEN, timeout);
 	if (ret > 0) {
 		switch (packet->data[0]) {
 			case IN_REPORT_KEY_STATE: {
@@ -477,28 +710,24 @@ void get_key_event (usblcd_operations *s
 	}
 }
 
-void set_key_lights (usblcd_operations *self, int keys[], int state) {
+void set_key_lights (usb_dev_handle *lcd, int keys[], int state) {
+
+        unsigned char packet[2] = { 0x81 }; /* set led */
+	unsigned int leds = 0; 
+        int i;
+    
 	if (state) {
 		/* Only LEDs we want on */
-		if (keys[0])
-			self->setled(self, 0, 1);
-		if (keys[1])
-			self->setled(self, 1, 1);
-		if (keys[2])
-			self->setled(self, 2, 1);
-		if (keys[3])
-			self->setled(self, 3, 1);
-		if (keys[4])
-			self->setled(self, 4, 1);
-		if (keys[5])
-			self->setled(self, 5, 1);
+		for (i = 0; i < picoLCD_MAX_LEDS; i++) 
+			if(keys[i]) 
+				leds |= 1 << i;
+			else 
+				leds &= ~ (1 << i);
 	} else {
 		/* All LEDs off */
-		self->setled(self, 0, 0);
-		self->setled(self, 1, 0);
-		self->setled(self, 2, 0);
-		self->setled(self, 3, 0);
-		self->setled(self, 4, 0);
-		self->setled(self, 5, 0);
+		leds = 0;
 	}
+	
+	packet[1] = leds;
+        picolcd_send(lcd, packet, 2);
 }
diff -uNrp lcdproc-cvs/server/drivers/picolcd.h lcdproc-patch/server/drivers/picolcd.h
--- lcdproc-cvs/server/drivers/picolcd.h	2007-03-18 16:53:24.000000000 +0200
+++ lcdproc-patch/server/drivers/picolcd.h	2007-05-02 14:39:27.000000000 +0300
@@ -4,6 +4,8 @@
  *
  * (c) 2007 NitroSecurity, Inc.
  * Written by Gatewood Green <woody AT nitrosecurity.com> or <woody AT linif.org>
+ * (c) 2007 Mini-Box.com.
+ * <npavel AT ituner.com> removed libusblcd dependency
  *
  * License: GPL (same as usblcd and lcdPROC)
  *
@@ -19,6 +21,19 @@
 #define PCIOLCD_H
 
 #include "lcd.h"
+#include "lcd_lib.h"
+#include "adv_bignum.h"
+
+#define picoLCD_VENDOR  0x04d8
+#define picoLCD_DEVICE  0x0002
+
+#define picoLCD_MAX_LEDS 6
+
+#define IN_REPORT_KEY_STATE	0x11
+#define IN_REPORT_IR_DATA	0x21
+
+#define PICOLCD_MAX_DATA_LEN	24
+
 
 typedef struct _lcd_packet lcd_packet;
 struct _lcd_packet {
@@ -32,17 +47,16 @@ MODULE_EXPORT int  picoLCD_width(Driver 
 MODULE_EXPORT int  picoLCD_height(Driver *drvthis);
 MODULE_EXPORT void picoLCD_clear(Driver *drvthis);
 MODULE_EXPORT void picoLCD_flush(Driver *drvthis);
-MODULE_EXPORT void picoLCD_string(Driver *drvthis, int x, int y, char *str);
-MODULE_EXPORT void picoLCD_chr(Driver *drvthis, int x, int y, char c);
-
+MODULE_EXPORT void picoLCD_string(Driver *drvthis, int x, int y, unsigned char *str);
+MODULE_EXPORT void picoLCD_chr(Driver *drvthis, int x, int y, unsigned char c);
+MODULE_EXPORT void picoLCD_set_char (Driver *drvthis, int n, unsigned char *dat);
 MODULE_EXPORT char *picoLCD_get_key(Driver *drvthis);
 
-//MODULE_EXPORT void picoLCD_vbar(Driver *drvthis, int x, int y, int len, int promille, int options);
-//MODULE_EXPORT void picoLCD_hbar(Driver *drvthis, int x, int y, int len, int promille, int options);
-//MODULE_EXPORT void picoLCD_num(Driver *drvthis, int x, int y, int num);
-//MODULE_EXPORT void picoLCD_heartbeat(Driver *drvthis, int state);
-//MODULE_EXPORT void picoLCD_icon(Driver *drvthis, int x, int y, int icon);
-//MODULE_EXPORT void picoLCD_cursor(Driver *drvthis, int x, int y, int type);
+MODULE_EXPORT void picoLCD_vbar(Driver *drvthis, int x, int y, int len, int promille, int options);
+MODULE_EXPORT void picoLCD_hbar(Driver *drvthis, int x, int y, int len, int promille, int options);
+MODULE_EXPORT void picoLCD_num(Driver *drvthis, int x, int num);
+MODULE_EXPORT int picoLCD_icon(Driver *drvthis, int x, int y, int icon);
+MODULE_EXPORT void picoLCD_cursor(Driver *drvthis, int x, int y, int type);
 
 //MODULE_EXPORT int  picoLCD_get_contrast(Driver *drvthis);
 MODULE_EXPORT int  picoLCD_set_contrast(Driver *drvthis, int promille);



Archive powered by MHonArc 2.6.18.

Top of page