aboutsummaryrefslogtreecommitdiffstats
path: root/drv_MatrixOrbital.c
diff options
context:
space:
mode:
Diffstat (limited to 'drv_MatrixOrbital.c')
-rw-r--r--drv_MatrixOrbital.c75
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);