diff options
Diffstat (limited to 'drv_MatrixOrbital.c')
-rw-r--r-- | drv_MatrixOrbital.c | 75 |
1 files changed, 58 insertions, 17 deletions
diff --git a/drv_MatrixOrbital.c b/drv_MatrixOrbital.c index 26da0fd..8f844c9 100644 --- a/drv_MatrixOrbital.c +++ b/drv_MatrixOrbital.c @@ -1,9 +1,9 @@ -/* $Id: drv_MatrixOrbital.c 773 2007-02-25 12:39:09Z michael $ - * $URL: https://ssl.bulix.org/svn/lcd4linux/branches/0.10.1/drv_MatrixOrbital.c $ +/* $Id: drv_MatrixOrbital.c 1140 2011-01-05 03:49:07Z michael $ + * $URL: https://ssl.bulix.org/svn/lcd4linux/trunk/drv_MatrixOrbital.c $ * * new style driver for Matrix Orbital serial display modules * - * Copyright (C) 1999, 2000 Michael Reinelt <reinelt@eunet.at> + * Copyright (C) 1999, 2000 Michael Reinelt <michael@reinelt.co.at> * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net> * * This file is part of LCD4Linux. @@ -58,6 +58,8 @@ static char Name[] = "MatrixOrbital"; static int Model; static int Protocol; +static char dispBuffer[4][20]; + typedef struct { int type; char *name; @@ -98,6 +100,8 @@ static MODEL Models[] = { {0x36, "LK202-24-USB", 2, 20, 8, 8, 2}, {0x38, "LK204-24-USB", 4, 20, 8, 8, 2}, {0x39, "VK204-24-USB", 4, 20, 8, 8, 2}, + {0x40, "DE-LD011", 2, 16, 0, 0, 3}, /* Sure electronics USB LCD board Rev.I */ + {0x41, "DE-LD021", 4, 20, 0, 0, 3}, {0xff, "Unknown", -1, -1, 0, 0, 0} }; @@ -106,8 +110,29 @@ static MODEL Models[] = { /*** hardware dependant functions ***/ /****************************************/ +static void drv_MO_write(const int row, const int col, const char *data, const int len) +{ + char cmd[5] = "\376Gyx"; + + if (Models[Model].protocol == 3) { // Sure electronics USB LCD board - full line output + cmd[2] = (char) 1; + cmd[3] = (char) row + 1; + strncpy(&(dispBuffer[row][col]), data, len); + drv_generic_serial_write(cmd, 4); + drv_generic_serial_write(dispBuffer[row], Models[Model].cols); + } else { + cmd[2] = (char) col + 1; + cmd[3] = (char) row + 1; + drv_generic_serial_write(cmd, 4); + drv_generic_serial_write(data, len); + } +} + + static void drv_MO_clear(void) { + int i, j; + switch (Protocol) { case 1: drv_generic_serial_write("\014", 1); /* Clear Screen */ @@ -115,19 +140,17 @@ static void drv_MO_clear(void) case 2: drv_generic_serial_write("\376\130", 2); /* Clear Screen */ break; - } -} - -static void drv_MO_write(const int row, const int col, const char *data, const int len) -{ - char cmd[5] = "\376Gyx"; - - cmd[2] = (char) col + 1; - cmd[3] = (char) row + 1; - drv_generic_serial_write(cmd, 4); - - drv_generic_serial_write(data, len); + case 3: + /* Sure electronics USB LCD board - clear buffer */ + for (i = 0; i < Models[Model].rows; i++) { + for (j = 0; j < Models[Model].cols; j++) { + dispBuffer[i][j] = ' '; + } + drv_MO_write(1, i + 1, dispBuffer[i], Models[Model].cols); + } + break; + } } @@ -302,6 +325,14 @@ static int drv_MO_start(const char *section, const int quiet) Model = -1; } + if (Model != -1 && Models[Model].protocol == 3) { // Sure electronics USB LCD board - full line output + int i, j; + for (i = 0; i < Models[Model].rows; i++) { // Clear buffer + for (j = 0; j < Models[Model].cols; j++) { + dispBuffer[i][j] = ' '; + } + } + } if (drv_generic_serial_open(section, Name, 0) < 0) return -1; @@ -462,8 +493,9 @@ int drv_MO_init(const char *section, const int quiet) { WIDGET_CLASS wc; int ret; + int asc255bug; - info("%s: %s", Name, "$Rev: 773 $"); + info("%s: %s", Name, "$Rev: 1140 $"); /* display preferences */ XRES = 5; /* pixel width of one char */ @@ -496,8 +528,13 @@ int drv_MO_init(const char *section, const int quiet) return ret; /* add fixed chars to the bar driver */ + /* most displays have a full block on ascii 255, but some have kind of */ + /* an 'inverted P'. If you specify 'asc255bug 1 in the config, this */ + /* char will not be used, but rendered by the bar driver */ + cfg_number(section, "asc255bug", 0, 0, 1, &asc255bug); drv_generic_text_bar_add_segment(0, 0, 255, 32); /* ASCII 32 = blank */ - drv_generic_text_bar_add_segment(255, 255, 255, 255); /* ASCII 255 = block */ + if (!asc255bug) + drv_generic_text_bar_add_segment(255, 255, 255, 255); /* ASCII 255 = block */ /* initialize generic GPIO driver */ if ((ret = drv_generic_gpio_init(section, Name)) != 0) @@ -538,11 +575,15 @@ int drv_MO_quit(const int quiet) /* clear display */ drv_MO_clear(); + usleep(300000); + /* say goodbye... */ if (!quiet) { drv_generic_text_greet("goodbye!", NULL); } + usleep(300000); + drv_generic_serial_close(); return (0); |