diff options
-rw-r--r-- | drv_Cwlinux.c | 147 |
1 files changed, 130 insertions, 17 deletions
diff --git a/drv_Cwlinux.c b/drv_Cwlinux.c index 151140c..35a7a20 100644 --- a/drv_Cwlinux.c +++ b/drv_Cwlinux.c @@ -42,15 +42,18 @@ #include "debug.h" #include "cfg.h" #include "qprintf.h" +#include "timer.h" #include "plugin.h" #include "widget.h" #include "widget_text.h" #include "widget_icon.h" #include "widget_bar.h" +#include "widget_keypad.h" #include "drv.h" #include "drv_generic_text.h" #include "drv_generic_gpio.h" #include "drv_generic_serial.h" +#include "drv_generic_keypad.h" static char Name[] = "Cwlinux"; @@ -58,13 +61,21 @@ static char Name[] = "Cwlinux"; static int Model; static int Protocol; +/* ring buffer for bytes received from the display */ +static unsigned char RingBuffer[256]; +static unsigned int RingRPos = 0; +static unsigned int RingWPos = 0; + typedef struct { int type; char *name; int rows; int cols; - int xres; + int xres; /* pixel width of one char */ + int yres; /* pixel height of one char */ int gpos; + int gpis; + int chars; /* number of user definable chars */ int protocol; } MODEL; @@ -72,9 +83,9 @@ typedef struct { /* Fixme: number of gpo's should be verified */ static MODEL Models[] = { - {0x01, "CW1602", 2, 16, 5, 0, 1}, - {0x02, "CW12232", 4, 20, 6, 0, 2}, - {0xff, "Unknown", -1, -1, -1, -1, -1} + {0x01, "CW1602", 2, 16, 5, 7, 2, 2, 8, 1}, + {0x02, "CW12232", 4, 20, 6, 8, 2, 2, 16, 2}, + {0xff, "Unknown", -1, -1, -1, -1, -1, -1, -1, -1} }; @@ -82,10 +93,55 @@ static MODEL Models[] = { /*** hardware dependant functions ***/ /****************************************/ +static void drv_CW_process_input(void) +{ + while (RingRPos != RingWPos) { + drv_generic_keypad_press(RingBuffer[RingRPos++]); + if (RingRPos >= sizeof(RingBuffer)) + RingRPos = 0; + } +} + + +static int drv_CW_poll(void) +{ + while (1) { + char buffer[32]; + int num, n; + + num = drv_generic_serial_poll(buffer, sizeof(buffer)); + if (num <= 0) + break; /* no more input */ + + /* put result into RingBuffer */ + for (n = 0; n < num; n++) { + RingBuffer[RingWPos++] = (unsigned char) buffer[n]; + if (RingWPos >= sizeof(RingBuffer)) + RingWPos = 0; + } + } + + if (RingRPos != RingWPos) + return 1; + else + return 0; +} + + +static void drv_CW_timer(void __attribute__ ((unused)) * notused) +{ + while (drv_CW_poll()) { + drv_CW_process_input(); + } +} + + static void drv_CW_send(const char *string, const int len) { drv_generic_serial_write(string, len); usleep(20); + if (drv_CW_poll()) + drv_CW_process_input(); } @@ -145,6 +201,16 @@ static int drv_CW_GPO(const int num, const int val) } +static int drv_CW_GPI(const int num) +{ + if (num < 0 || num > GPIS) { + return 0; + } + error("%s: GPI's not yet implemented!", Name); + return num; +} + + static void drv_CW_clear(void) { #if 1 @@ -194,10 +260,43 @@ static int drv_CW_brightness(int brightness) } +static int drv_CW_keypad(const int num) +{ + int val = WIDGET_KEY_PRESSED; + + switch (num) { + case 65: + val += WIDGET_KEY_UP; + break; + case 66: + val += WIDGET_KEY_DOWN; + break; + case 67: + val += WIDGET_KEY_LEFT; + break; + case 68: + val += WIDGET_KEY_RIGHT; + break; + case 69: + val += WIDGET_KEY_CONFIRM; + break; + case 70: + val += WIDGET_KEY_CANCEL; + break; + default: + error("%s: unknown keypad value %d", Name, num); + } + + debug("%s: key %c (0x%x) pressed", Name, num, num); + return val; +} + + static int drv_CW_start(const char *section) { int i; char *model; + char buffer[16]; model = cfg_get(section, "Model", NULL); if (model != NULL && *model != '\0') { @@ -220,28 +319,37 @@ static int drv_CW_start(const char *section) if (drv_generic_serial_open(section, Name, 0) < 0) return -1; - /* this does not work as I'd expect it... */ -#if 0 /* read firmware version */ - generic_serial_read(buffer, sizeof(buffer)); - usleep(100000); - generic_serial_write("\3761", 2); - usleep(100000); - generic_serial_write("\375", 1); + drv_generic_serial_write("\3761\375", 3); usleep(100000); - if (generic_serial_read(buffer, 2) != 2) { + if (drv_generic_serial_read(buffer, 2) != 2) { info("unable to read firmware version!"); + } else { + info("Cwlinux Firmware V%d.%d", (int) buffer[0], (int) buffer[1]); + } + + /* read model mumber */ + drv_generic_serial_write("\3760\375", 3); + usleep(100000); + if (drv_generic_serial_read(buffer, 2) != 2) { + info("unable to read model number!"); + } else { + info("Cwlinux model CW%d%d", (int) buffer[0], (int) buffer[1]); } - info("Cwlinux Firmware %d.%d", (int) buffer[0], (int) buffer[1]); -#endif /* initialize global variables */ DROWS = Models[Model].rows; DCOLS = Models[Model].cols; XRES = Models[Model].xres; + YRES = Models[Model].yres; GPOS = Models[Model].gpos; + GPIS = Models[Model].gpis; + CHARS = Models[Model].chars; Protocol = Models[Model].protocol; + /* regularly process display input */ + timer_add(drv_CW_timer, NULL, 250, 0); + drv_CW_clear(); drv_CW_send("\376D\375", 3); /* auto line wrap off */ @@ -291,6 +399,7 @@ static void plugin_brightness(RESULT * result, const int argc, RESULT * argv[]) /* using drv_generic_text_icon_draw(W) */ /* using drv_generic_text_bar_draw(W) */ /* using drv_generic_gpio_draw(W) */ +/* using drv_generic_keypad_draw(W) */ /****************************************/ @@ -319,9 +428,6 @@ int drv_CW_init(const char *section, const int quiet) info("%s: %s", Name, "$Rev$"); /* display preferences */ - XRES = 6; /* pixel width of one char */ - YRES = 8; /* pixel height of one char */ - CHARS = 16; /* number of user-defineable characters */ CHAR0 = 1; /* ASCII of first user-defineable char */ GOTO_COST = 3; /* number of bytes a goto command requires */ INVALIDATE = 1; /* re-defined chars must be re-sent to the display */ @@ -333,6 +439,8 @@ int drv_CW_init(const char *section, const int quiet) /* real worker functions */ drv_generic_text_real_write = drv_CW_write; drv_generic_gpio_real_set = drv_CW_GPO; + drv_generic_gpio_real_get = drv_CW_GPI; + drv_generic_keypad_real_press = drv_CW_keypad; switch (Protocol) { case 1: @@ -371,6 +479,10 @@ int drv_CW_init(const char *section, const int quiet) if ((ret = drv_generic_gpio_init(section, Name)) != 0) return ret; + /* initialize generic key pad driver */ + if ((ret = drv_generic_keypad_init(section, Name)) != 0) + return ret; + /* register text widget */ wc = Widget_Text; wc.draw = drv_generic_text_draw; @@ -400,6 +512,7 @@ int drv_CW_quit(const int quiet) info("%s: shutting down.", Name); drv_generic_text_quit(); drv_generic_gpio_quit(); + drv_generic_keypad_quit(); /* clear display */ drv_CW_clear(); |