]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2005-04-20 05:49:21 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Wed, 20 Apr 2005 05:49:21 +0000 (05:49 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Wed, 20 Apr 2005 05:49:21 +0000 (05:49 +0000)
Changed the code to add some VT100-compatible control sequences (see the comments above).
A configfile boolean option 'VT100_Support' (default to 1) indicate if the display in
used support these control-sequences or not.

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@530 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

drv_SimpleLCD.c

index eb449a67e9e7553ba9ddf0c90d72b57e304b8b11..017b5dae3fadde2a7faa86d91dd53d13580aeb73 100644 (file)
@@ -1,24 +1,6 @@
-/* $Id: drv_SimpleLCD.c,v 1.2 2005/04/02 05:28:58 reinelt Exp $
+/* $Id: drv_SimpleLCD.c,v 1.3 2005/04/20 05:49:21 reinelt Exp $
  * 
  * driver for a simple serial terminal.
- * This driver simply send out caracters on the serial port, without any 
- * formatting instructions for a particular LCD device. 
- * This is useful for custom boards of for very simple LCD.
- *
- * I use it for tests on a custom-made board based on a AVR microcontroler
- * and also for driver a Point-of-Sale text-only display.
- * I assume the following :
- * - CR (0x0d) Return to the begining of the line without erasing,
- * - LF (0x0a) Initiate a new line (but without sending the cursor to 
- * the begining of the line)
- * - BS (0x08) Erase the previous caracter on the line.
- * - It's not possible to return to the first line. Thus a back buffer is used
- * in this driver.
- *
- * The code come mostly taken from the LCDTerm driver in LCD4Linux, from 
- * Michaels Reinelt, many thanks to him.
- *
- * This driver is released under the GPL.
  * 
  * Copyright (C) 2005 Julien Aube <ob@obconseil.net>
  * Copyright (C) 2005 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  * $Log: drv_SimpleLCD.c,v $
+ * Revision 1.3  2005/04/20 05:49:21  reinelt
+ * Changed the code to add some VT100-compatible control sequences (see the comments above).
+ * A configfile boolean option 'VT100_Support' (default to 1) indicate if the display in
+ * used support these control-sequences or not.
+ *
  * Revision 1.2  2005/04/02 05:28:58  reinelt
  * fixed gcc4 warnings about signed/unsigned mismatches
  *
  *
  */
 
+/*
+ * This driver simply send out caracters on the serial port, without any 
+ * formatting instructions for a particular LCD device. 
+ * This is useful for custom boards of for very simple LCD.
+ *
+ * I use it for tests on a custom-made board based on a AVR microcontroler
+ * and also for driver a Point-of-Sale text-only display.
+ * I assume the following :
+ * - CR (0x0d) Return to the begining of the line without erasing,
+ * - LF (0x0a) Initiate a new line (but without sending the cursor to 
+ * the begining of the line)
+ * - BS (0x08) Move the cursor to the previous caracter (but does no erase it).
+ * - It's not possible to return to the first line. Thus a back buffer is used
+ * in this driver.
+ * 
+ * ******** UPDATE *********
+ * I have added a "VT-100 Compatible mode" that allows the driver to support
+ * control-sequence code. This greatly reduce flickering and eliminate the need
+ * for the back-buffer. But it is optional since all displays cannot support them.
+ * Here are the codes:
+ * Delete the display (but does not move the cursor) : 
+ *    "ESC [ 2 J"     (0x1b 0x5b 0x32 0x4a)
+ * Position the cursor :
+ *    "ESC [ YY ; XX H" ( 0x1b 0x5b YY 0x3b XX 0x48 ) where YY is the ascii for the line 
+ *    number, and XX is the ascii for the column number ( first line/column is '1', not zero)
+ * Delete to the end of line from current cursor position :
+ *    "ESC [ 0 K" ( 0x1b 0x5b 0x30 0x4b )
+ * Set Country Code : 
+ *    "ESC R NN"  (0x1b 0x52 NN) where NN is the country code *in byte, NOT ascii*.
+ *    The default is 0 (USA), see below for specific countries. 
+ *    the list of accessible characters page are available on this page : 
+ *    http://www.wincor-nixdorf.com/internet/com/Services/Support/TechnicalSupport/POSSystems
+ *    /Manuals/BAxx/index.html
+ * Get the display identification : (Doesn't work reliably, timing issues here)
+ *    "ESC [ 0 c" ( 0x1b 0x5b 0x30 0x63). Return a string which look like this : 
+ *  ESC [ ? M ; NN ; OO ; PP ; QQ c) where M is type of display (2 for VFD),
+ *  NN is the rom version, 00 is the current caracter set, PP is the number of lines and 
+ *  QQ the number of colomns.  
+ * 
+ *
+ * A "bar" capability is now provided if the config file has a "BarCharValue" parameter in it.
+ *
+ * The code come mostly taken from the LCDTerm driver in LCD4Linux, from 
+ * Michaels Reinelt, many thanks to him.
+ *
+ * This driver is released under the GPL.
+ */
+
 /* 
  *
  * exported fuctions:
 static char Name[]="SimpleLCD";
 static char *backbuffer=0;
 static int   backbuffer_size=0;
+static int   vt100_mode=0;
+static unsigned char  bar_char=0;
 
 /****************************************/
 /***  hardware dependant functions    ***/
 /****************************************/
 
 /** No clear function on SimpleLCD : Just send CR-LF * number of lines **/
-static void drv_SL_clear (void)
+void drv_SL_simple_clear (void)
 {
-  char cmd[2] = { '\r', '\n' };
+  char cmd[2];
   int i;
+  cmd[0] = '\r' ; cmd[1] = '\n';
   for (i=0;i<DROWS;++i) {
-    drv_generic_serial_write (cmd, 2);
+       drv_generic_serial_write (cmd, 2);
   }
   memset(backbuffer,' ',backbuffer_size);
 }
 
+/** vt-100 mode : send the ESC-code **/
+void drv_SL_vt100_clear (void)
+{
+  char cmd[4];
+  cmd[0] = 0x1b; cmd[1] = '[' ; cmd[2] = '2' ; cmd[3] = 'J';
+  drv_generic_serial_write (cmd, 4); 
+}
+
+void drv_SL_clear (void)
+{
+  vt100_mode==1?drv_SL_vt100_clear():drv_SL_simple_clear();
+}
+
+
 /* If full_commit = true, then the whole buffer is to be sent to screen.
    if full_commit = false, then only the last line is to be sent (faster on slow screens)
 */
@@ -112,31 +164,51 @@ static void drv_SL_commit(int full_commit)
   }
 }
 
-static void drv_SL_write (const int row, const int col, const char *data, int len)
+static void drv_SL_simple_write (const int row, const int col, const char *data, int len)
 {
-  memcpy(backbuffer+(row*DCOLS)+col,data,len);
-  if (row == DROWS-1)
-     drv_SL_commit(0);
-  else
-     drv_SL_commit(1);
+   memcpy(backbuffer+(row*DCOLS)+col,data,len);
+   if (row == DROWS-1)
+      drv_SL_commit(0);
+   else
+      drv_SL_commit(1);
 }
 
+static void drv_SL_vt100_write (const int row, const int col, const char *data, int len)
+{
+  char cmd[8];
+    cmd[0] = 0x1b;                 cmd[1] = '['; 
+    cmd[2] = row + '1';  cmd[3] = ';';
+    cmd[4] = (col/10) + '0' ;      cmd[5] = (col%10) + '1' ; 
+    cmd[6] = 'H';
+    drv_generic_serial_write (cmd, 7);
+    drv_generic_serial_write (data,len); 
+}
 
 
 static int drv_SL_start (const char *section, const int quiet)
 {
   int rows=-1, cols=-1;
-  int flags=0;
+  unsigned int flags=0;
   char *s;
+  char * model=0;
+  
+  vt100_mode = 0;
+  model = cfg_get(section,"Model","generic");
+  if (model != NULL && *model != '\0')
+  {
+       if ( strcasecmp("vt100",model) == 0 ) 
+          vt100_mode = 1;
+  }
+  
+  cfg_number(section,"BarCharValue",0,0,255,&flags);
+  bar_char = flags;  
   cfg_number(section,"Options",0,0,0xffff,&flags);
-  if (drv_generic_serial_open(section, Name, (unsigned) flags) < 0) return -1;
-
+  if (drv_generic_serial_open(section, Name, flags) < 0) return -1;
+  
   s=cfg_get(section, "Size", NULL);
   if (s==NULL || *s=='\0') {
-    error ("%s: no '%s.Size' entry from %s", Name, section, cfg_source());
-    return -1;
+     error ("%s: no '%s.Size' entry from %s", Name, section, cfg_source());
+     return -1;
   }
   if (sscanf(s,"%dx%d",&cols,&rows)!=2 || rows<1 || cols<1) {
     error ("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source());
@@ -146,13 +218,24 @@ static int drv_SL_start (const char *section, const int quiet)
   
   DROWS = rows;
   DCOLS = cols;
-
-  backbuffer_size = DROWS * DCOLS;
-  backbuffer = malloc(backbuffer_size);
-  if ( ! backbuffer ){  
-     return -1;
+  
+  if ( ! vt100_mode) { 
+     backbuffer_size = DROWS * DCOLS;
+     backbuffer = malloc(backbuffer_size);
+     if ( ! backbuffer ){  
+        return -1;
+     }
+  }
+  
+  /* real worker functions */
+  if ( vt100_mode ) {
+       drv_generic_text_real_write = drv_SL_vt100_write;
+  }
+  else { 
+       drv_generic_text_real_write = drv_SL_simple_write;
   }
-  drv_SL_clear();        /* clear */
+   drv_SL_clear();   /* clear */
 
   
   if (!quiet) {
@@ -191,7 +274,7 @@ static int drv_SL_start (const char *section, const int quiet)
 /* list models */
 int drv_SL_list (void)
 {
-  printf ("generic");
+  printf ("generic vt100");
   return 0;
 }
 
@@ -210,8 +293,6 @@ int drv_SL_init (const char *section, const int quiet)
 
   GOTO_COST = -1;  /* number of bytes a goto command requires */
   
-  /* real worker functions */
-  drv_generic_text_real_write   = drv_SL_write;
 
 
   /* start display */