diff options
Diffstat (limited to '')
-rw-r--r-- | drv_SimpleLCD.c | 169 |
1 files changed, 125 insertions, 44 deletions
diff --git a/drv_SimpleLCD.c b/drv_SimpleLCD.c index eb449a6..017b5da 100644 --- a/drv_SimpleLCD.c +++ b/drv_SimpleLCD.c @@ -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> @@ -40,6 +22,11 @@ * 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 * @@ -48,6 +35,54 @@ * */ +/* + * 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: @@ -78,22 +113,39 @@ 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 */ |