Patch: Special feature (pictogramm, icon, ...) interface demo
Stefan Herdler <[email protected]> Wed, 09 Nov 2011 04:18:05 +0100
| Newsgroups | gmane.comp.sysutils.lcdproc |
|---|---|
| Message-ID | <[email protected]> |
Hi!
Caution!
The attached patch is not well written nor complete, it is for
demonstration purpose only!
Not all features are fully implemented, so some will work correct, some
not ore at all!
Instead of writing mails describing the interfaces I quickly typed in
some code to show it directly.
The client interface is almost complete and the basic functionality on
the drivers side too.
Details like "highlighting" and keywords ("on", "off, ...) are missing
completely.
Variable and function names are sometimes not well-conceived an I guess,
I violated most of the codingstyle rules.
I wouldn't like to wast to much time for that demo.
Working Features:
All Boolean and the volume bar. The bar is scaled in permille.
Use list_functions to get the names.
Implemented client commands:
"extra list_functions"
Retrieves the list of the supported features and their type.
"extra feature_name value"
Sets a feature.
"extra feature_name get_value"
Retrieves the value of a feature.
Have fun!
Stefan
_______________________________________________
LCDproc mailing list
[email protected]
http://lists.omnipotent.net/mailman/listinfo/lcdproc
Icon_2011.diff
(text/x-diff, 13.7 KB)
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/commands/command_list.c ./lcdproc_Icon/server/commands/command_list.c
--- ./cvs/lcdproc/server/commands/command_list.c 2011-10-28 20:48:43.000000000 +0200
+++ ./lcdproc_Icon/server/commands/command_list.c 2011-10-28 22:12:27.000000000 +0200
@@ -50,6 +50,7 @@
{ "info", info_func },
{ "sleep", sleep_func },
{ "bye", bye_func },
+ { "extra", extra_func },
{ NULL, NULL},
};
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/commands/server_commands.c ./lcdproc_Icon/server/commands/server_commands.c
--- ./cvs/lcdproc/server/commands/server_commands.c 2011-10-28 20:48:43.000000000 +0200
+++ ./lcdproc_Icon/server/commands/server_commands.c 2011-11-08 02:37:31.000000000 +0100
@@ -29,6 +29,8 @@
#include "client.h"
#include "render.h"
+#include "drivers.h"
+#include "../extra.h"
#define ALL_OUTPUTS_ON -1
#define ALL_OUTPUTS_OFF 0
@@ -95,6 +97,94 @@
return 0;
}
+
+/**
+ * Test extra functions
+ *
+ *\verbatim
+ * Usage: extra <function> <value>
+ *\endverbatim
+ */
+int
+extra_func(Client *c, int argc, char **argv)
+{
+ ExtraFunctionTable *extended_functions_table;
+ int function_number = 0;
+ int function_value_1 = 0;
+ int function_value_2 = 0;
+ const char ExtraFunctionType[][10] = {
+ "reserved",
+ "icon",
+ "bar",
+ "int",
+ "multicon",
+ "xxx",
+ "command"};
+
+ if (c->state != ACTIVE)
+ return 1;
+
+ extended_functions_table = drivers_get_ext_funct();
+ if (extended_functions_table == NULL) {
+ sock_send_error(c->sock, "extra functions not supported\n");
+ return 0;
+ }
+
+ if (argc < 2) {
+ sock_send_error(c->sock, "Usage: extra {<function>|list_functions} {<value>|get_value}\n");
+ return 0;
+ }
+
+ if (0 == strcmp(argv[1], "list_functions")) {
+ sock_send_string(c->sock, "extra_functions");
+ for (function_number = 0; (0 != strcmp("end of icon list", extended_functions_table[function_number].name)); function_number++)
+ sock_printf(c->sock, " %s %s", extended_functions_table[function_number].name, ExtraFunctionType[extended_functions_table[function_number].type]);
+ sock_send_string(c->sock, "\n");
+ return 0;
+ }
+
+ for (function_number = 0; (0 != strcmp(argv[1], extended_functions_table[function_number].name)); function_number++) {
+ if (0 == strcmp("end of icon list", extended_functions_table[function_number].name)) {
+ sock_send_error(c->sock, "function not supported\n");
+ return 0;
+ }
+ };
+
+ if (argc != 3) {
+ sock_send_error(c->sock, "Usage: extra {<function>|list_functions} {<value>|get_value}\n");
+ return 0;
+ }
+
+ if (0 == strcmp(argv[2], "get_value")) {
+ function_value_2 = drivers_ext_funct(function_number, 0, 1);
+ sock_printf(c->sock, "%s %d\n", argv[1], function_value_2);
+ return 0;
+ }
+
+
+ char *endptr;
+ /* set errno to be able to detect errors in strtol() */
+ errno = 0;
+
+ function_value_1 = strtol(argv[2], &endptr, 0);
+
+ if (errno) {
+ sock_printf_error(c->sock, "number argument: %s\n", strerror(errno));
+ return 0;
+ }
+ else if (! ((*argv[2] != '\0') && (*endptr == '\0'))) {
+ sock_send_error(c->sock, "invalid parameter...\n");
+ return 0;
+ }
+
+ function_value_2 = drivers_ext_funct(function_number, function_value_1, 0);
+
+ sock_send_string(c->sock, "success\n");
+
+ report(RPT_NOTICE, "extra state changed");
+ return 0;
+}
+
/**
* The sleep_func was intended to make the server sleep for some seconds.
* This function is currently ignored as making the server sleep actually
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/commands/server_commands.h ./lcdproc_Icon/server/commands/server_commands.h
--- ./cvs/lcdproc/server/commands/server_commands.h 2011-10-28 20:48:43.000000000 +0200
+++ ./lcdproc_Icon/server/commands/server_commands.h 2011-11-06 02:06:39.000000000 +0100
@@ -17,5 +17,6 @@
int noop_func(Client *c, int argc, char **argv);
int info_func(Client *c, int argc, char **argv);
int sleep_func(Client *c, int argc, char **argv);
+int extra_func(Client *c, int argc, char **argv);
#endif
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/driver.c ./lcdproc_Icon/server/driver.c
--- ./cvs/lcdproc/server/driver.c 2011-10-28 20:48:43.000000000 +0200
+++ ./lcdproc_Icon/server/driver.c 2011-11-06 21:41:46.000000000 +0100
@@ -72,6 +72,8 @@
{ "output", offsetof(Driver, output), 0 },
{ "get_key", offsetof(Driver, get_key), 0 },
{ "get_info", offsetof(Driver, get_info), 0 },
+ { "ext_funct", offsetof(Driver, ext_funct), 0 },
+ { "get_ext_funct", offsetof(Driver, get_ext_funct), 0 },
{ NULL, 0, 0 }
};
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/drivers/lcd.h ./lcdproc_Icon/server/drivers/lcd.h
--- ./cvs/lcdproc/server/drivers/lcd.h 2011-10-28 20:48:43.000000000 +0200
+++ ./lcdproc_Icon/server/drivers/lcd.h 2011-11-07 19:33:36.000000000 +0100
@@ -30,6 +30,7 @@
#define LCD_H
#include <stddef.h>
+#include "../extra.h"
/* Maximum supported sizes */
#define LCD_MAX_WIDTH 256
@@ -177,6 +178,11 @@
/* informational functions */
const char * (*get_info) (struct lcd_logical_driver *drvthis);
+ /* extra functions */
+ ExtraFunctionTable * (*get_ext_funct) (struct lcd_logical_driver *drvthis);
+ int (*ext_funct) (struct lcd_logical_driver *drvthis, int index, int state, char get_state);
+
+
/******** Variables in server core available for drivers ********/
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/drivers/mdm166a.c ./lcdproc_Icon/server/drivers/mdm166a.c
--- ./cvs/lcdproc/server/drivers/mdm166a.c 2011-04-03 20:07:15.000000000 +0200
+++ ./lcdproc_Icon/server/drivers/mdm166a.c 2011-11-08 02:21:08.000000000 +0100
@@ -58,6 +58,7 @@
#define CMD_SETRAM 0x60 /**< Set the actual graphics RAM offset for next data write */
#define CMD_SETPIXEL 0x70 /**< Write pixel data to RAM of the display */
+#define NUMBER_OF_ICONS 8
/** private data for the \c mdm166a driver */
typedef struct mdm166a_private_data {
@@ -69,6 +70,8 @@
int changed; /**< Indicator for framebuffer changes */
int last_output; /**< Icon states after last update */
char info[255]; /**< Pointer to driver description */
+ ExtraFunctionTable icons_names[NUMBER_OF_ICONS+1];
+ int icons_values[NUMBER_OF_ICONS];
} PrivateData;
/* Vars for the server core */
@@ -147,6 +150,26 @@
return -1;
strcpy(p->info, "Targa USB Graphic Vacuum Fluorescent Display (mdm166a) driver v0.1 : 19c2:6a11");
+ static ExtraFunctionTable icons[NUMBER_OF_ICONS+1] = {
+ { EXTRA_FUNC_ICON, "play" },
+ { EXTRA_FUNC_ICON, "pause" },
+ { EXTRA_FUNC_ICON, "record" },
+ { EXTRA_FUNC_ICON, "mailer" },
+ { EXTRA_FUNC_ICON, "at" },
+ { EXTRA_FUNC_ICON, "mute" },
+ { EXTRA_FUNC_BAR, "antenna" },
+ { EXTRA_FUNC_BAR, "volume" },
+ { EXTRA_FUNC_RESERVED, "end of icon list" } };
+
+ int i;
+ for (i = 0; i <= NUMBER_OF_ICONS; i++) {
+ strcpy(p->icons_names[i].name, icons[i].name);
+ p->icons_names[i].type = icons[i].type;
+ }
+ for (i = 0; i < NUMBER_OF_ICONS; i++)
+ p->icons_values[i] = 0;
+
+
/* Get clock setting from config */
strncpy(clock, drvthis->config_get_string(drvthis->name, "Clock", 0, DEFAULT_CLOCK), sizeof(clock));
clock[sizeof(clock) - 1] = '\0';
@@ -172,7 +195,8 @@
/* Init HID device */
ret = hid_init();
if (ret != HID_RET_SUCCESS) {
- report(RPT_ERR, "%s: hid_init failed: %s", drvthis->name, hid_strerror(ret));
+// report(RPT_ERR, "%s: hid_init failed: %s", drvthis->name, hid_strerror(ret));
+ report(RPT_ERR, "%s: hid_init failed", drvthis->name);
goto error;
}
@@ -184,7 +208,8 @@
ret = hid_force_open(p->hid, 0, &matcher, 3);
if (ret != HID_RET_SUCCESS) {
- report(RPT_ERR, "%s: hid_force_open failed: %s", drvthis->name, hid_strerror(ret));
+// report(RPT_ERR, "%s: hid_force_open failed: %s", drvthis->name, hid_strerror(ret));
+ report(RPT_ERR, "%s: hid_force_open failed", drvthis->name);
goto error;
}
@@ -705,3 +730,63 @@
PrivateData *p = drvthis->private_data;
return p->info;
}
+
+
+MODULE_EXPORT ExtraFunctionTable *
+mdm166a_get_ext_funct(Driver *drvthis)
+{
+ PrivateData *p = drvthis->private_data;
+ return p->icons_names;
+}
+
+MODULE_EXPORT int
+mdm166a_ext_funct(Driver *drvthis, int index, int state, char get_state)
+{
+ char const Icon[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x0a};
+ PrivateData *p = drvthis->private_data;
+ int const PATH_OUT[1] = {0xff7f0004};
+ char Cmd[64];
+ int i;
+report(RPT_ERR, "get_state:%d", get_state);
+ //not implemented yet
+ if (get_state == 1)
+ return p->icons_values[index];
+
+report(RPT_ERR, "index:%d state:%d", index, state);
+ if (state == p->icons_values[index])
+ return state;
+
+ p->icons_values[index] = state;
+ if (index < 6) {
+ /* Set Icons. */
+ Cmd[0] = 0x04;
+ Cmd[1] = CMD_PREFIX;
+ Cmd[2] = CMD_SETSYMBOL;
+ Cmd[3] = Icon[index];
+ Cmd[4] = state == 0 ? 0 : 1;
+report(RPT_ERR, "Cmd[3]:%d Cmd[4]:%d", Cmd[3], Cmd[4]);
+ hid_set_output_report(p->hid, PATH_OUT, sizeof(PATH_OUT), Cmd, 5);
+ return state;
+ } else if (index == 7) {
+
+ Cmd[0] = 56;
+ for (i = 0; i < 14; i++) {
+ Cmd[i * 4 + 1] = CMD_PREFIX;
+ Cmd[i * 4 + 2] = CMD_SETSYMBOL;
+ Cmd[i * 4 + 3] = 0x0B + i;
+ if (i < (state / 72))
+ Cmd[i * 4 + 4] = 2;
+ else if (i == (int)(state / 72))
+ Cmd[i * 4 + 4] = 2;
+ else
+ Cmd[i * 4 + 4] = 0;
+report(RPT_ERR, "Cmd %d: %d", i, Cmd[i * 4 + 4]);
+ }
+ hid_set_output_report(p->hid, PATH_OUT, sizeof(PATH_OUT), Cmd, 57);
+
+ return state;
+ }
+ return -99;
+
+
+}
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/drivers/mdm166a.h ./lcdproc_Icon/server/drivers/mdm166a.h
--- ./cvs/lcdproc/server/drivers/mdm166a.h 2010-12-28 12:08:00.000000000 +0100
+++ ./lcdproc_Icon/server/drivers/mdm166a.h 2011-11-07 19:33:50.000000000 +0100
@@ -20,5 +20,7 @@
MODULE_EXPORT void mdm166a_backlight (Driver *drvthis, int on);
MODULE_EXPORT const char * mdm166a_get_info (Driver *drvthis);
MODULE_EXPORT void mdm166a_output (Driver *drvthis, int on);
+MODULE_EXPORT ExtraFunctionTable * mdm166a_get_ext_funct(Driver *drvthis);
+MODULE_EXPORT int mdm166a_ext_funct(Driver *drvthis, int index, int state, char get_state);
#endif
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/drivers.c ./lcdproc_Icon/server/drivers.c
--- ./cvs/lcdproc/server/drivers.c 2010-10-28 22:50:16.000000000 +0200
+++ ./lcdproc_Icon/server/drivers.c 2011-11-07 19:41:17.000000000 +0100
@@ -477,3 +477,46 @@
return NULL;
}
+
+/**
+ * Controls additional functions like Icons.
+ *
+ *
+ */
+int
+drivers_ext_funct(int index, int state, char get_state)
+{
+ Driver *drv;
+
+ debug(RPT_DEBUG, "%s(index=%d, state=%d, get_state=%d)", __FUNCTION__, index, state, get_state);
+
+ ForAllDrivers(drv) {
+ if (drv->ext_funct)
+ return drv->ext_funct(drv, index, state, get_state);
+ }
+ return -9999;
+}
+
+
+/**
+ * Get available additional functions.
+ *
+ *
+ */
+ExtraFunctionTable *
+drivers_get_ext_funct(void)
+{
+ Driver *drv;
+
+ debug(RPT_DEBUG, "%s()", __FUNCTION__);
+
+ ExtraFunctionTable *extended_functions_table;
+ ForAllDrivers(drv) {
+ if (drv->get_ext_funct) {
+ extended_functions_table = drv->get_ext_funct(drv);
+ if (extended_functions_table != NULL)
+ return extended_functions_table;
+ }
+ }
+ return NULL;
+}
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/drivers.h ./lcdproc_Icon/server/drivers.h
--- ./cvs/lcdproc/server/drivers.h 2008-11-30 23:31:20.000000000 +0100
+++ ./lcdproc_Icon/server/drivers.h 2011-11-07 19:37:47.000000000 +0100
@@ -86,6 +86,12 @@
const char *
drivers_get_key(void);
+int
+drivers_ext_funct(int index, int state, char get_state);
+
+ExtraFunctionTable *
+drivers_get_ext_funct(void);
+
/* Please don't read this list except using the following functions */
extern LinkedList *loaded_drivers;
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/extra.h ./lcdproc_Icon/server/extra.h
--- ./cvs/lcdproc/server/extra.h 1970-01-01 01:00:00.000000000 +0100
+++ ./lcdproc_Icon/server/extra.h 2011-11-08 02:34:24.000000000 +0100
@@ -0,0 +1,31 @@
+/** \file server/extra.h
+ */
+
+/* This file is part of LCDd, the lcdproc server.
+ *
+ * This file is released under the GNU General Public License.
+ * Refer to the COPYING file distributed with this package.
+ *
+ * Copyright (c) 2001, Joris Robijn
+ */
+
+#ifndef EXTRA_FUNC_H
+#define EXTRA_FUNC_H
+
+#define MAX_EXTRA_NAME_LENGTH 16 //16 characters schould be sufficient I think
+
+typedef struct ExtraFunctionTable {
+ char type;
+ char name[MAX_EXTRA_NAME_LENGTH];
+} ExtraFunctionTable;
+
+
+#define EXTRA_FUNC_RESERVED 0
+#define EXTRA_FUNC_ICON 1
+#define EXTRA_FUNC_BAR 2
+#define EXTRA_FUNC_INT 3
+#define EXTRA_FUNC_MULTICON 4
+#define EXTRA_FUNC_SUBMULTI 5
+#define EXTRA_FUNC_HW_COMMAND 6
+
+#endif
diff -NaurwB -X ./cvs/lcdproc/diff_ignore ./cvs/lcdproc/server/Makefile.am ./lcdproc_Icon/server/Makefile.am
--- ./cvs/lcdproc/server/Makefile.am 2007-04-14 09:54:27.000000000 +0200
+++ ./lcdproc_Icon/server/Makefile.am 2011-11-07 17:43:11.000000000 +0100
@@ -4,7 +4,7 @@
sbin_PROGRAMS=LCDd
-LCDd_SOURCES= client.c client.h clients.c clients.h input.c input.h main.c main.h menuitem.c menuitem.h menu.c menu.h menuscreens.c menuscreens.h parse.c parse.h render.c render.h screen.c screen.h screenlist.c screenlist.h serverscreens.c serverscreens.h sock.c sock.h widget.c widget.h drivers.c drivers.h driver.c driver.h
+LCDd_SOURCES= client.c client.h clients.c clients.h input.c input.h main.c main.h menuitem.c menuitem.h menu.c menu.h menuscreens.c menuscreens.h parse.c parse.h render.c render.h screen.c screen.h screenlist.c screenlist.h serverscreens.c serverscreens.h sock.c sock.h widget.c widget.h drivers.c drivers.h driver.c driver.h extra.h
LDADD = ../shared/libLCDstuff.a commands/libLCDcommands.a