[Lcdproc] [PATCH] Icon support on MD8800 VFD

Arthur van Dongen avdongen at xs4all.nl
Wed Dec 24 00:15:50 UTC 2008


Hi Stefan, hi all,

I created a patch to support the icons on the MD8800 VFD, for more info
see earlier in the lcdproc mailing list.
The diff is based on the CVS trunk, synced last week.

The icons can be controlled by issuing a 
"namedicon_set <icongroup>.<iconmember> command, for example 
"namedicon_set PLAYMODE.STOP". The current status can be queried by
issuing a "namedicon_get {ALL|<icongroup>}" command, the list of
possible values with "namedicon_info".

Please have a look at the patch and send me any feedback. If all is OK,
I will implement the same functions for my ShuttleVFD display, and try
to control these icons from MythTV.

Best regards,
Arthur van Dongen


-------------- next part --------------
? .cdtproject
? .project
? .settings
? LDCd_test.conf
? cvsdiff.out
? clients/.cdtproject
? clients/.project
? clients/.settings
? docs/LCDd.8
? docs/lcdproc-config.5
? docs/lcdproc.1
? docs/lcdproc-dev/README.tex
? docs/lcdproc-dev/a1960.html
? docs/lcdproc-dev/add-your-driver.tex
? docs/lcdproc-dev/bookinfo.tex
? docs/lcdproc-dev/c1245.html
? docs/lcdproc-dev/c150.html
? docs/lcdproc-dev/c1608.html
? docs/lcdproc-dev/c1707.html
? docs/lcdproc-dev/c35.html
? docs/lcdproc-dev/c47.html
? docs/lcdproc-dev/driver-api.tex
? docs/lcdproc-dev/introduction.tex
? docs/lcdproc-dev/language.tex
? docs/lcdproc-dev/lcdproc-dev.tex
? docs/lcdproc-dev/license.tex
? docs/lcdproc-dev/make-driver.tex
? docs/lcdproc-dev/shared-files.tex
? docs/lcdproc-dev/x11.html
? docs/lcdproc-dev/x114.html
? docs/lcdproc-dev/x1158.html
? docs/lcdproc-dev/x12.html
? docs/lcdproc-dev/x1255.html
? docs/lcdproc-dev/x1266.html
? docs/lcdproc-dev/x155.html
? docs/lcdproc-dev/x161.html
? docs/lcdproc-dev/x1614.html
? docs/lcdproc-dev/x1669.html
? docs/lcdproc-dev/x1713.html
? docs/lcdproc-dev/x1970.html
? docs/lcdproc-dev/x1980.html
? docs/lcdproc-dev/x1984.html
? docs/lcdproc-dev/x1990.html
? docs/lcdproc-dev/x2026.html
? docs/lcdproc-dev/x2031.html
? docs/lcdproc-dev/x2035.html
? docs/lcdproc-dev/x2039.html
? docs/lcdproc-dev/x2042.html
? docs/lcdproc-dev/x2045.html
? docs/lcdproc-dev/x2050.html
? docs/lcdproc-dev/x21.html
? docs/lcdproc-dev/x22.html
? docs/lcdproc-dev/x25.html
? docs/lcdproc-dev/x31.html
? docs/lcdproc-dev/x52.html
? docs/lcdproc-dev/x6.html
? docs/lcdproc-dev/x62.html
? docs/lcdproc-dev/x67.html
? docs/lcdproc-dev/x68.html
? docs/lcdproc-dev/x7.html
? docs/lcdproc-dev/x72.html
? docs/lcdproc-dev/x76.html
? docs/lcdproc-dev/x80.html
? docs/lcdproc-dev/x83.html
? docs/lcdproc-dev/x86.html
? docs/lcdproc-dev/x91.html
? docs/lcdproc-dev/x962.html
? scripts/init-LCDd.LSB
? scripts/init-lcdexec.LSB
? scripts/init-lcdexec.debian
? scripts/init-lcdproc.LSB
? scripts/init-lcdvc.LSB
? scripts/init-lcdvc.debian
? server/.cdtproject
? server/.project
? server/.settings
Index: server/driver.c
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/driver.c,v
retrieving revision 1.21
diff -w -u -r1.21 driver.c
--- server/driver.c	14 Dec 2008 23:38:42 -0000	1.21
+++ server/driver.c	24 Dec 2008 00:02:59 -0000
@@ -76,6 +76,9 @@
 	{ "output",             offsetof(Driver, output),             0 },
 	{ "get_key",            offsetof(Driver, get_key),            0 },
 	{ "get_info",           offsetof(Driver, get_info),           0 },
+	{ "namedicon_set",      offsetof(Driver, namedicon_set),      0 },
+	{ "namedicon_get",      offsetof(Driver, namedicon_get),      0 },
+	{ "namedicon_info",     offsetof(Driver, namedicon_info),     0 },
 	{ NULL, 0, 0 }
 };
 
@@ -654,7 +657,6 @@
 		drv->chr(drv, x+1, y, ch2);
 }
 
-
 /** Set cursor position and state.
  * Fallback for the driver's \c cursor method if the driver does not provide one.
  * \param drv    Pointer to driver structure.
Index: server/drivers.c
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/drivers.c,v
retrieving revision 1.23
diff -w -u -r1.23 drivers.c
--- server/drivers.c	30 Nov 2008 22:31:20 -0000	1.23
+++ server/drivers.c	24 Dec 2008 00:02:59 -0000
@@ -388,8 +388,111 @@
 	}
 }
 
+/**
+ * Write named icon to all drivers.
+ * For drivers that define a namedicon_set() function, call it;
+ * \param icon  symbolic value representing the icon.
+ * \return      0 if OK or first error returned from any driver.
+ */
+int
+drivers_namedicon_set(const char *icon)
+{
+	Driver *drv;
+	int retval = 0;
+	int r = 0;
+	debug(RPT_DEBUG, "%s(icon=%s)", __FUNCTION__, icon);
+
+	ForAllDrivers(drv) {
+		/* Does the driver have the icon function ? */
+		if (drv->namedicon_set) {
+			/* Try driver call */
+			r = drv->namedicon_set(drv, icon);
+			if (retval == 0)
+				retval = r;
+		}
+	}
+	return retval; // 0 if OK or first error returned from any driver
+}
 
 /**
+ * Get icon state from all drivers for a specified icon group.
+ * For drivers that define a namedicon() function, call it;
+ * \param icon     symbolic value representing the icon.
+ * \return         pointer to allocated buffer with the text describing the icon state. 
+ *                 Buffer must be freed by the caller!
+ */
+const char *
+drivers_namedicon_get(const char *icon)
+{
+	Driver *drv;
+	char *retval = NULL;
+	const char *newretval = NULL;
+	debug(RPT_DEBUG, "%s(icon=%s)", __FUNCTION__, icon);
+
+	ForAllDrivers(drv) {
+		/* Does the driver have the icon function ? */
+		if (drv->namedicon_get) {
+			/* Try driver call */
+			newretval = drv->namedicon_get(drv, icon);
+			if (newretval != NULL)
+			{
+				if (retval != NULL) // not the first
+				{
+					retval = realloc(retval, strlen(retval)+strlen(newretval)+1);
+					strcat(retval, newretval);
+					free(newretval);
+				}			
+				else
+				{
+					retval = malloc(strlen(newretval)+1);
+					strcpy(retval, newretval);
+					free(newretval);
+				}
+			}
+		} 
+	}
+	return retval;
+}
+
+/**
+ * Write named icon to all drivers.
+ * For drivers that define a namedicon_info() function, call it;
+ * \return         pointer to allocated buffer with the text describing the possible icon states. 
+ *                 Buffer must be freed by the caller!
+ */
+const char *
+drivers_namedicon_info(void)
+{
+	Driver *drv;
+	char *retval = NULL;
+	const char *newretval = NULL;
+	debug(RPT_DEBUG, "%s()", __FUNCTION__);
+
+	ForAllDrivers(drv) {
+		/* Does the driver have the icon function ? */
+		if (drv->namedicon_info) {
+			/* Try driver call */
+			newretval = drv->namedicon_info(drv);
+			if (newretval != NULL)
+			{
+				if (retval != NULL) // not the first
+				{
+					retval = realloc(retval, strlen(retval)+strlen(newretval)+1);
+					strcat(retval, newretval);
+					free(newretval);
+				}			
+				else
+				{
+					retval = malloc(strlen(newretval)+1);
+					strcpy(retval, newretval);
+					free(newretval);
+				}
+			}
+		} 
+	}
+	return retval;
+}
+/**
  * Set cursor on all loaded drivers.
  * For drivers that define a cursor() function, call it;
  * otherwise call the general driver_alt_cursor() function from the server core.
Index: server/drivers.h
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/drivers.h,v
retrieving revision 1.13
diff -w -u -r1.13 drivers.h
--- server/drivers.h	30 Nov 2008 22:31:20 -0000	1.13
+++ server/drivers.h	24 Dec 2008 00:02:59 -0000
@@ -80,6 +80,15 @@
 void
 drivers_backlight(int brightness);
 
+int
+drivers_namedicon_set(const char *icon);
+
+const char *
+drivers_namedicon_get(const char *icon);
+
+const char *
+drivers_namedicon_info(void);
+
 void
 drivers_output(int state);
 
Index: server/widget.h
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/widget.h,v
retrieving revision 1.16
diff -w -u -r1.16 widget.h
Index: server/commands/client_commands.c
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/commands/client_commands.c,v
retrieving revision 1.12
diff -w -u -r1.12 client_commands.c
--- server/commands/client_commands.c	30 Nov 2008 22:42:34 -0000	1.12
+++ server/commands/client_commands.c	24 Dec 2008 00:03:00 -0000
@@ -268,6 +268,85 @@
 
 }
 
+/*******************************************************************************
+ * namedicon_set_func
+ *
+ * Usage: namedicon_set_func <client> ...
+ */
+int
+namedicon_set_func(Client *c, int argc, char **argv)
+{
+	int i;
+	int retval = 0;
+	int r = 0;
+	if (c->state != ACTIVE)
+		return 1;
+
+	if (argc < 2) {
+		sock_send_error(c->sock, "Usage: namedicon_set {ALL.OFF|<GROUP>.<VALUE> [<GROUP>.<VALUE> ...]}\n");
+		return 0;
+	}
+	for (i = 1; i < argc; i++)
+	{
+		r = drivers_namedicon_set(argv[i]);
+		if (retval == 0)
+			retval = r;
+	}
+	return retval; // return 0 or first error from drivers_namedicon_set() call
+}
+
+/*******************************************************************************
+ * namedicon_get_func
+ *
+ * Usage: namedicon_get_func <client> ...
+ */
+int
+namedicon_get_func(Client *c, int argc, char **argv)
+{
+	int i;
+	const char *p;
+	if (c->state != ACTIVE)
+		return 1;
+
+	if (argc < 2) {
+		sock_send_error(c->sock, "Usage: namedicon_get {ALL|<GROUP> [<GROUP> ...]}\n");
+		return 0;
+	}
+	for (i = 1; i < argc; i++)
+	{
+		p = drivers_namedicon_get(argv[i]);
+		sock_printf(c->sock, "%s\n", p);
+		free(p);
+	}
+	return 0;
+}
+
+/*******************************************************************************
+ * namedicon_info_func
+ *
+ * Usage: namedicon_info_func <client> ...
+ */
+int
+namedicon_info_func(Client *c, int argc, char **argv)
+{
+	const char *p;
+	if (c->state != ACTIVE)
+		return 1;
+
+	if (argc != 1) {
+		sock_send_error(c->sock, "Usage: namedicon_info\n");
+		return 0;
+	}
+	p = drivers_namedicon_info();
+	if (p != NULL)
+	{
+		sock_printf(c->sock, "%s\n", p);
+		free(p);
+	}
+	return 0;
+}
+
+
 /****************************************************************************
  * info_func
  *
Index: server/commands/client_commands.h
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/commands/client_commands.h,v
retrieving revision 1.5
diff -w -u -r1.5 client_commands.h
--- server/commands/client_commands.h	30 Nov 2008 22:42:34 -0000	1.5
+++ server/commands/client_commands.h	24 Dec 2008 00:03:00 -0000
@@ -20,6 +20,8 @@
 int client_add_key_func(Client *c, int argc, char **argv);
 int client_del_key_func(Client *c, int argc, char **argv);
 int backlight_func(Client *c, int argc, char **argv);
-
+int namedicon_set_func(Client *c, int argc, char **argv);
+int namedicon_get_func(Client *c, int argc, char **argv);
+int namedicon_info_func(Client *c, int argc, char **argv);
 #endif
 
Index: server/commands/command_list.c
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/commands/command_list.c,v
retrieving revision 1.8
diff -w -u -r1.8 command_list.c
--- server/commands/command_list.c	30 Nov 2008 22:42:34 -0000	1.8
+++ server/commands/command_list.c	24 Dec 2008 00:03:00 -0000
@@ -49,6 +49,9 @@
 	/* Misc stuff...*/
 	{ "backlight",      backlight_func      },
 	{ "output",         output_func         },
+	{ "namedicon_set",  namedicon_set_func  },
+	{ "namedicon_get",  namedicon_get_func  },
+	{ "namedicon_info", namedicon_info_func },
 	{ "noop",           noop_func           },
 	{ "info",           info_func           },
 	{ "sleep",          sleep_func          },
Index: server/drivers/MD8800.c
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/drivers/MD8800.c,v
retrieving revision 1.5
diff -w -u -r1.5 MD8800.c
--- server/drivers/MD8800.c	7 Dec 2008 19:41:36 -0000	1.5
+++ server/drivers/MD8800.c	24 Dec 2008 00:03:00 -0000
@@ -1,6 +1,6 @@
 /*  This is the LCDproc driver for the VFD of the Medion MD8800 PC
 
-    Copyright (C) 2006 Stefan Herdler in collaboration with Martin M?.
+    Copyright (C) 2006 Stefan Herdler in collaboration with Martin M?ller.
 
     This source Code is based on the NoritakeVFD, the serialVFD and the
     CFontzPacket Driver of this package.
@@ -25,7 +25,7 @@
     ==============================================================================
 
     Known hardware-commands of the MD8800 display
-    discovered by Martin M? (listed in octal notation):
+    discovered by Martin M?ller (listed in octal notation):
 
     \33\0abcdef (abcdef can be anything, it seems) - set clock, I think.
 	   	The mapping is: bb:aa dd.cc.eeff
@@ -176,6 +176,7 @@
 #include <string.h>
 #include <errno.h>
 #include <syslog.h>
+#include <ctype.h>
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -192,6 +193,33 @@
 #define DEFAULT_OFF_BRIGHTNESS	300
 #define DEFAULT_ON_BRIGHTNESS	1000
 
+#define PLAYMODE_OFF 0
+#define PLAYMODE_PLAY 1
+#define PLAYMODE_PAUSE 2
+#define PLAYMODE_STOP 3
+#define PLAYMODE_FF 4
+#define PLAYMODE_REW 5
+#define PLAYMODE_HEART 6
+#define PLAYMODE_HEARTOUTLINE 7
+
+#define RECORDING_OFF 0
+#define RECORDING_ON 1
+
+#define MAIL_OFF 0
+#define MAIL_ENVELOPE 1
+#define MAIL_NEW 2
+
+#define MEDIASRC_OFF 0
+#define MEDIASRC_HDD 1
+#define MEDIASRC_1394 2
+#define MEDIASRC_CD 3
+#define MEDIASRC_USB 4
+#define MEDIATYPE_OFF 0
+#define MEDIATYPE_MOVIE 1
+#define MEDIATYPE_TV 2
+#define MEDIATYPE_MUSIC 3
+#define MEDIATYPE_PHOTO 4
+
 /** private data for the \c MD8800 driver */
 typedef struct MD8800_private_data {
 	char device[200];
@@ -209,6 +237,12 @@
 	int hw_brightness;
 	int last_command;
 	int wifi_scan;
+	int playmode;
+	int recording;
+	int mediasrc;
+	int mediatype;
+	int volume;
+	int mail;
 	char info[255];
 } PrivateData;
 
@@ -599,6 +633,510 @@
 // Controls the custom icons.
 //
 //
+
+MODULE_EXPORT int
+MD8800_namedicon_set (Driver *drvthis, const char *iconName)
+{
+	PrivateData *p = drvthis->private_data;
+	
+	char iconGroup[ICONGROUP_LEN+1];
+	char iconGroupMember[ICONGROUPMEMBER_LEN+1];
+	int i;
+	int l = 0;
+	int retval = 0;
+	int Switched = 0;
+	char *dest = iconGroup;
+	memset(iconGroup, 0, ICONGROUP_LEN+1);
+	memset(iconGroupMember, 0, ICONGROUPMEMBER_LEN+1);
+	if (iconName == NULL)
+		return -1;
+	for (i=0; iconName[i] != 0; i++)
+	{
+		if (!Switched && (iconName[i] == ICONGROUP_MEMBER_SEPARATOR))
+		{
+			dest = iconGroupMember;
+			l = 0;
+		}
+		else
+		{
+			*dest++ = iconName[i];
+			l++;
+			if ((!Switched && (l>ICONGROUP_LEN)) || (Switched && (l > ICONGROUPMEMBER_LEN)))
+				return -1;
+		}
+	}
+	if (strcmp(iconGroup,"PLAYMODE") == 0)
+	{
+		if (strcmp(iconGroupMember, "OFF") == 0)
+		{
+			p->playmode = PLAYMODE_OFF;
+			write(p->fd, "\x1B\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00", 11); // turn off play icon
+			if (p->recording == RECORDING_OFF)
+				write(p->fd, "\x1B\x30\x1A\x01", 4); // turn off bounding box too
+		}
+		else if (strcmp(iconGroupMember, "PLAY") == 0)
+		{
+			p->playmode = PLAYMODE_PLAY;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x00\x00\x08\x1C\x3E\x7F\x00\x00\x00", 11);
+ 		} 		
+		else if (strcmp(iconGroupMember, "STOP") == 0)
+		{
+			p->playmode = PLAYMODE_STOP;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x00\x3E\x3E\x3E\x3E\x3E\x00\x00\x00", 11);
+ 		} 		
+		else if (strcmp(iconGroupMember, "PAUSE") == 0)
+		{
+			p->playmode = PLAYMODE_PAUSE;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x00\x3E\x3E\x00\x3E\x3E\x00\x00\x00", 11);
+ 		} 		
+		else if (strcmp(iconGroupMember, "FF") == 0)
+		{
+			p->playmode = PLAYMODE_FF;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x00\x08\x1C\x3E\x08\x1C\x3E\x00\x00", 11);
+ 		} 		
+		else if (strcmp(iconGroupMember, "REW") == 0)
+		{
+			p->playmode = PLAYMODE_REW;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x00\x3E\x1C\x08\x3E\x1C\x08\x00\x00", 11);
+ 		} 		
+		else if (strcmp(iconGroupMember, "HEART") == 0)
+		{
+			p->playmode = PLAYMODE_HEART;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x00\x0C\x1E\x3E\x7C\x3E\x1E\x0C\x00", 11);
+ 		} 		
+		else if (strcmp(iconGroupMember, "HEARTOUTLINE") == 0)
+		{
+			p->playmode = PLAYMODE_HEARTOUTLINE;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x31\x0C\x12\x21\x41\x02\x41\x21\x12\x0C", 11);
+ 		} 		
+ 		else
+ 			retval = -1;
+	}
+	else if (strcmp(iconGroup,"RECORDING") == 0)
+	{
+		if (strcmp(iconGroupMember, "ON") == 0)
+		{
+			p->recording = RECORDING_ON;
+			write(p->fd, "\x1B\x30\x1A\x01", 4); // turn on bounding box
+			write(p->fd, "\x1B\x30\x08", 3);     // Turn on REC icon
+			write(p->fd, &p->hw_brightness, 1);  // .. using right brightness level
+
+ 		} 		
+		else if (strcmp(iconGroupMember, "OFF") == 0)
+		{
+			p->recording = RECORDING_OFF;
+			write(p->fd, "\x1B\x30\x08\x00", 4); // turn off rec icon
+			if (p->playmode == PLAYMODE_OFF)
+				write(p->fd, "\x1B\x30\x1A\x01", 4); // turn off bounding box too
+ 		} 		
+ 		else
+ 			retval = -1;
+	}
+	else if (strcmp(iconGroup, "VOLUME") == 0)
+	{
+		int volumeLevel = -1;
+		if (strcmp(iconGroupMember, "OFF") == 0)
+			volumeLevel = -1;
+		else if (isdigit(iconGroupMember[0]))
+		{
+			volumeLevel = iconGroupMember[0] - '0';
+			if (isdigit(iconGroupMember[1]))
+			{
+				volumeLevel = 10 * volumeLevel + (iconGroupMember[1]-'0');
+				if (isdigit(iconGroupMember[2]))
+				{
+					volumeLevel = 10 * volumeLevel + (iconGroupMember[2]-'0');
+					if (iconGroupMember[3] != 0)
+					{
+						volumeLevel = -1;
+						retval = -1;
+					}
+				}
+				else if (iconGroupMember[2] != 0)
+				{
+					volumeLevel = -1;
+					retval = -1;
+				}					
+			}	 
+			else if (iconGroupMember[1] != 0)
+			{
+				volumeLevel = -1;
+				retval = -1;
+			}					
+		}
+		p->volume = volumeLevel;
+		if (volumeLevel > 100)
+		{
+			volumeLevel = -1;
+			retval = -1;
+		}					
+		if (volumeLevel >= 0)
+			write(p->fd, "\x1B\x30\x1C\x01", 4); // bounding box
+		else
+		{
+			write(p->fd, "\x1B\x30\x1C\x00", 4); // bounding box
+			write(p->fd, "\x1B\x30\x13\x00", 4); // turn off speaker icon
+			write(p->fd, "\x1B\x30\x14\x00", 4); // turn on muted speaker icon
+		}
+		if (volumeLevel == 0)
+		{
+			write(p->fd, "\x1B\x30\x13\x00", 4); // turn off speaker icon
+			write(p->fd, "\x1B\x30\x14\x01", 4); // turn on muted speaker icon
+		}
+		if (volumeLevel > 0)
+		{
+			write(p->fd, "\x1B\x30\x13\x01", 4); // turn on speaker icon
+			write(p->fd, "\x1B\x30\x14\x00", 4); // turn off muted speaker icon
+		}
+		if (volumeLevel >= 12)
+			write(p->fd, "\x1B\x30\x0B\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x0B\x00", 4);
+		if (volumeLevel >= 25)
+			write(p->fd, "\x1B\x30\x0C\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x0C\x00", 4);
+		if (volumeLevel >= 37)
+			write(p->fd, "\x1B\x30\x0D\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x0D\x00", 4);
+		if (volumeLevel >= 50)
+			write(p->fd, "\x1B\x30\x0E\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x0E\x00", 4);
+		if (volumeLevel >= 62)
+			write(p->fd, "\x1B\x30\x0F\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x0F\x00", 4);
+		if (volumeLevel >= 75)
+			write(p->fd, "\x1B\x30\x10\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x10\x00", 4);
+		if (volumeLevel >= 87)
+			write(p->fd, "\x1B\x30\x11\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x11\x00", 4);
+		if (volumeLevel >= 100)
+			write(p->fd, "\x1B\x30\x12\x01", 4);
+		else
+			write(p->fd, "\x1B\x30\x12\x00", 4);
+	}
+	else if (strcmp(iconGroup, "MAIL") == 0)
+	{
+		if (strcmp(iconGroupMember, "ENVELOPE") == 0)
+		{
+			p->mail = MAIL_ENVELOPE;
+			write(p->fd, "\x1B\x30\x09\x01", 4);
+			write(p->fd, "\x1B\x30\x0A\x00", 4);
+			write(p->fd, "\x1B\x30\x1B\x01", 4); // turn on email boundingbox
+		}
+		else if (strcmp(iconGroupMember, "NEW") == 0)
+		{
+			p->mail = MAIL_NEW;
+			write(p->fd, "\x1B\x30\x09\x01", 4);
+			write(p->fd, "\x1B\x30\x0A\x01", 4);
+			write(p->fd, "\x1B\x30\x1B\x01", 4); // turn on email boundinbox
+		}
+		else if (strcmp(iconGroupMember, "OFF") == 0)
+		{
+			p->mail = MAIL_OFF;
+			write(p->fd, "\x1B\x30\x09\x00", 4);
+			write(p->fd, "\x1B\x30\x0A\x00", 4);
+			write(p->fd, "\x1B\x30\x1B\x00", 4); // turn off email boundingbox
+		}
+		else
+		{
+			retval = -1;
+		}					
+	}
+	else if (strcmp(iconGroup, "MEDIASRC") == 0)
+	{
+		if (strcmp(iconGroupMember, "HDD") == 0)
+		{
+			p->mediasrc = MEDIASRC_HDD;
+			write(p->fd, "\x1B\x30\x00", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x01\x00", 4);
+			write(p->fd, "\x1B\x30\x02\x00", 4);
+			write(p->fd, "\x1B\x30\x03\x00", 4);
+			write(p->fd, "\x1B\x30\x18\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "1394") == 0)
+		{
+			p->mediasrc = MEDIASRC_1394;
+			write(p->fd, "\x1B\x30\x00\x00", 4);
+			write(p->fd, "\x1B\x30\x01", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x02\x00", 4);
+			write(p->fd, "\x1B\x30\x03\x00", 4);
+			write(p->fd, "\x1B\x30\x18\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "CD") == 0)
+		{
+			p->mediasrc = MEDIASRC_CD;
+			write(p->fd, "\x1B\x30\x00\x00", 4);
+			write(p->fd, "\x1B\x30\x01\x00", 4);
+			write(p->fd, "\x1B\x30\x02", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x03\x00", 4);
+			write(p->fd, "\x1B\x30\x18\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "USB") == 0)
+		{
+			p->mediasrc = MEDIASRC_USB;
+			write(p->fd, "\x1B\x30\x00\x00", 4);
+			write(p->fd, "\x1B\x30\x01\x00", 4);
+			write(p->fd, "\x1B\x30\x02\x00", 4);
+			write(p->fd, "\x1B\x30\x03", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x18\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "OFF") == 0)
+		{
+			p->mediasrc = MEDIASRC_OFF;
+			write(p->fd, "\x1B\x30\x00\x00", 4);
+			write(p->fd, "\x1B\x30\x01\x00", 4);
+			write(p->fd, "\x1B\x30\x02\x00", 4);
+			write(p->fd, "\x1B\x30\x03\x00", 4);
+			write(p->fd, "\x1B\x30\x18\x00", 4);
+		}
+		else
+		{
+			retval = -1;
+		}					
+	}
+	else if (strcmp(iconGroup, "MEDIATYPE") == 0)
+	{
+		if (strcmp(iconGroupMember, "MOVIE") == 0)
+		{
+			p->mediatype = MEDIATYPE_MOVIE;
+			write(p->fd, "\x1B\x30\x04", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x05\x00", 4);
+			write(p->fd, "\x1B\x30\x06\x00", 4);
+			write(p->fd, "\x1B\x30\x07\x00", 4);
+			write(p->fd, "\x1B\x30\x19\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "TV") == 0)
+		{
+			p->mediatype = MEDIATYPE_TV;
+			write(p->fd, "\x1B\x30\x04\x00", 4);
+			write(p->fd, "\x1B\x30\x05", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x06\x00", 4);
+			write(p->fd, "\x1B\x30\x07\x00", 4);
+			write(p->fd, "\x1B\x30\x19\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "MUSIC") == 0)
+		{
+			p->mediatype = MEDIATYPE_MUSIC;
+			write(p->fd, "\x1B\x30\x04\x00", 4);
+			write(p->fd, "\x1B\x30\x05\x00", 4);
+			write(p->fd, "\x1B\x30\x06", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x07\x00", 4);
+			write(p->fd, "\x1B\x30\x19\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "PHOTO") == 0)
+		{
+			p->mediatype = MEDIATYPE_PHOTO;
+			write(p->fd, "\x1B\x30\x04\x00", 4);
+			write(p->fd, "\x1B\x30\x05\x00", 4);
+			write(p->fd, "\x1B\x30\x06\x00", 4);
+			write(p->fd, "\x1B\x30\x07", 3);
+			write(p->fd, &p->hw_brightness, 1);
+			write(p->fd, "\x1B\x30\x19\x01", 4);
+		}
+		else if (strcmp(iconGroupMember, "OFF") == 0)
+		{
+			p->mediatype = MEDIATYPE_OFF;
+			write(p->fd, "\x1B\x30\x04\x00", 4);
+			write(p->fd, "\x1B\x30\x05\x00", 4);
+			write(p->fd, "\x1B\x30\x06\x00", 4);
+			write(p->fd, "\x1B\x30\x07\x00", 4);
+			write(p->fd, "\x1B\x30\x19\x00", 4);
+		}
+		else
+		{
+			retval = -1;
+		}					
+	}
+	else
+	{
+		retval = -1;
+	}					
+	return retval;
+}
+
+#define COPY_TO_RETVAL(string) { int temp=strlen(string); if (buflen > temp) { strcpy(dest, string); dest += temp; buflen -= temp; } }
+MODULE_EXPORT const char* MD8800_namedicon_get (Driver *drvthis, const char* iconGroup)
+{
+	PrivateData *p = drvthis->private_data;
+	int All = 0;
+	char *retval;
+	char *dest = NULL;
+	int buflen;
+	if (iconGroup == NULL)
+		return NULL;
+	if (strcmp(iconGroup,"ALL") == 0)
+	{
+		All = 1;
+		buflen = 93; // maximum for all icongroups
+	}
+	else
+		buflen = 22; // maximum for one icongroup
+		
+	retval = malloc(buflen); 
+	if (retval == NULL) 
+	{
+		return NULL;
+	}
+	dest = retval;
+		
+	if ((strcmp(iconGroup,"PLAYMODE") == 0) || All)
+	{
+		COPY_TO_RETVAL("PLAYMODE:");
+		switch(p->playmode)
+		{
+			default:
+			case PLAYMODE_OFF:
+				COPY_TO_RETVAL("OFF ")
+				break;
+			case PLAYMODE_PLAY:
+				COPY_TO_RETVAL("PLAY ")
+				break;
+			case PLAYMODE_STOP:
+				COPY_TO_RETVAL("STOP ")
+				break;
+			case PLAYMODE_PAUSE:
+				COPY_TO_RETVAL("PAUSE ")
+				break;
+			case PLAYMODE_FF:
+				COPY_TO_RETVAL("FF ")
+				break;
+			case PLAYMODE_REW:
+				COPY_TO_RETVAL("REW ")
+				break;
+			case PLAYMODE_HEART:
+				COPY_TO_RETVAL("HEART ")
+				break;
+			case PLAYMODE_HEARTOUTLINE:
+				COPY_TO_RETVAL("HEARTOUTLINE ")
+				break;
+		}
+	}
+	if ((strcmp(iconGroup,"RECORDING") == 0) || All)
+	{
+		COPY_TO_RETVAL("RECORDING:")
+		switch(p->playmode)
+		{
+			default:
+			case RECORDING_OFF:
+				COPY_TO_RETVAL("OFF ")
+				break;
+			case RECORDING_ON:
+				COPY_TO_RETVAL("ON ")
+				break;
+		}
+	}
+	if ((strcmp(iconGroup, "VOLUME") == 0) || All)
+	{
+		COPY_TO_RETVAL("VOLUME:")
+		if ((buflen > 4) && (p->volume >= 0) && (p->volume <= 100))
+		{
+			int i = sprintf(dest, "%d ", p->volume);
+			dest += i;
+			buflen -= i;
+		}	
+		else
+			COPY_TO_RETVAL("OFF ");
+	}
+	if ((strcmp(iconGroup, "MAIL") == 0) || All)
+	{
+		COPY_TO_RETVAL("MAIL:")
+		switch(p->mail)
+		{
+			default:
+			case MAIL_OFF:
+				COPY_TO_RETVAL("OFF ")
+				break;
+			case MAIL_ENVELOPE:
+				COPY_TO_RETVAL("ENVELOPE ")
+				break;
+			case MAIL_NEW:
+				COPY_TO_RETVAL("NEW ")
+				break;
+		}
+	}
+	if ((strcmp(iconGroup, "MEDIASRC") == 0) || All)
+	{
+		COPY_TO_RETVAL("MEDIASRC:")
+		switch(p->mediasrc)
+		{
+			default:
+			case MEDIASRC_OFF:
+				COPY_TO_RETVAL("OFF ")
+				break;
+			case MEDIASRC_HDD:
+				COPY_TO_RETVAL("HDD ")
+				break;
+			case MEDIASRC_1394:
+				COPY_TO_RETVAL("1394 ")
+				break;
+			case MEDIASRC_CD:
+				COPY_TO_RETVAL("CD ")
+				break;
+			case MEDIASRC_USB:
+				COPY_TO_RETVAL("USB ")
+				break;
+		}
+	}
+	if ((strcmp(iconGroup, "MEDIATYPE") == 0) || All)
+	{
+		COPY_TO_RETVAL("MEDIATYPE:")
+		switch(p->mediatype)
+		{
+			default:
+			case MEDIATYPE_OFF:
+				COPY_TO_RETVAL("OFF ")
+				break;
+			case MEDIATYPE_MOVIE:
+				COPY_TO_RETVAL("MOVIE ")
+				break;
+			case MEDIATYPE_TV:
+				COPY_TO_RETVAL("TV ")
+				break;
+			case MEDIATYPE_MUSIC:
+				COPY_TO_RETVAL("MUSIC ")
+				break;
+			case MEDIATYPE_PHOTO:
+				COPY_TO_RETVAL("PHOTO ")
+				break;
+		}
+	}
+	return retval;
+}
+MODULE_EXPORT const char* MD8800_namedicon_info (Driver *drvthis)
+{
+	static const char *template_string = "PLAYMODE:OFF|PLAY|STOP|PAUSE|FF|REW|HEART|HEARTOUTLINE "
+		"RECORDING:OFF|ON "
+		"VOLUME:<percent>|OFF "
+		"MAIL:OFF|ENVELOPE|NEW "
+		"MEDIASRC:OFF|HDD|1394|CD|USB "
+		"MEDIATYPE:OFF|MOVIE|TV|MUSIC|PHOTO";
+	char *p = malloc(strlen(template_string)+1);
+	if (p != NULL)
+		strcpy(p, template_string);
+	return p;
+}
+
 MODULE_EXPORT void
 MD8800_output (Driver *drvthis, int on)
 {
Index: server/drivers/MD8800.h
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/drivers/MD8800.h,v
retrieving revision 1.3
diff -w -u -r1.3 MD8800.h
--- server/drivers/MD8800.h	2 Apr 2007 21:29:54 -0000	1.3
+++ server/drivers/MD8800.h	24 Dec 2008 00:03:00 -0000
@@ -1,6 +1,6 @@
 /*  This is the LCDproc driver for the VFD of the Medion MD8800 PC
 
-    Copyright (C) 2006 Stefan Herdler in collaboration with Martin M?.
+    Copyright (C) 2006 Stefan Herdler in collaboration with Martin M?ller.
     This source Code is based on the NoritakeVFD, the serialVFD and the
     CFontzPacket Driver of this package.
 
@@ -45,7 +45,7 @@
 MODULE_EXPORT void MD8800_backlight (Driver *drvthis, int on);
 MODULE_EXPORT void MD8800_set_brightness(Driver *drvthis, int state, int promille);
 MODULE_EXPORT int  MD8800_get_brightness(Driver *drvthis, int state);
-MODULE_EXPORT int MD8800_icon (Driver *drvthis, int x, int y, int icon);
-
-
+MODULE_EXPORT int MD8800_namedicon_set (Driver *drvthis, const char* icon);
+MODULE_EXPORT const char* MD8800_namedicon_get (Driver *drvthis, const char* icon);
+MODULE_EXPORT const char* MD8800_namedicon_info (Driver *drvthis);
 #endif
Index: server/drivers/lcd.h
===================================================================
RCS file: /cvsroot/lcdproc/lcdproc/server/drivers/lcd.h,v
retrieving revision 1.25
diff -w -u -r1.25 lcd.h
--- server/drivers/lcd.h	2 Apr 2007 21:29:54 -0000	1.25
+++ server/drivers/lcd.h	24 Dec 2008 00:03:00 -0000
@@ -79,6 +79,11 @@
  * lot of things in that area might need to be changed.
  */
 
+#define ICONGROUP_LEN 16
+#define ICONGROUPMEMBER_LEN 16
+#define ICONGROUP_MEMBER_SEPARATOR '.'
+
+
 /* Heartbeat data */
 #define HEARTBEAT_OFF 0
 #define HEARTBEAT_ON 1
@@ -147,6 +152,9 @@
 	void (*num)		(struct lcd_logical_driver *drvthis, int x, int num);
 	void (*heartbeat)	(struct lcd_logical_driver *drvthis, int state);
 	int (*icon)		(struct lcd_logical_driver *drvthis, int x, int y, int icon);
+	int (*namedicon_set)    (struct lcd_logical_driver *drvthis, const char *namedicon);
+	const char* (*namedicon_get)    (struct lcd_logical_driver *drvthis, const char *namedicon);
+	const char* (*namedicon_info)    (struct lcd_logical_driver *drvthis);
 	void (*cursor)		(struct lcd_logical_driver *drvthis, int x, int y, int type);
 
 	/* user-defined character functions, are those still supported ? */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
URL: <http://lists.omnipotent.net/pipermail/lcdproc/attachments/20081224/16313526/attachment-0001.pgp>


More information about the LCDproc mailing list