diff --git a/LCDd.conf b/LCDd.conf index 94194b3..990b855 100644 --- a/LCDd.conf +++ b/LCDd.conf @@ -50,7 +50,7 @@ DriverPath=server/drivers/ # mtc_s16209x, MtxOrb, mx5000, NoritakeVFD, Olimex_MOD_LCD1x9, picolcd, # pyramid, rawserial, sdeclcd, sed1330, sed1520, serialPOS, serialVFD, # shuttleVFD, sli, stv5730, svga, t6963, text, tyan, ula200, vlsys_m428, -# xosd +# xosd, yard2LCD Driver=curses # Tells the driver to bind to the given interface. [default: 127.0.0.1] @@ -1387,4 +1387,9 @@ Offset=200x200 # X font to use, in XLFD format, as given by "xfontsel" Font=-*-terminus-*-r-*-*-*-320-*-*-*-*-* +## Y.A.R.D.2 LCD section +[yard2LCD] +Size=20x4 +# If rendering rate is too high, change in server\main.h #define RENDER_FREQ 8 to "1" + # EOF diff --git a/acinclude.m4 b/acinclude.m4 index 23efa4c..6f651aa 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -16,14 +16,14 @@ AC_ARG_ENABLE(drivers, [ Olimex_MOD_LCD1x9,picolcd,pyramid,rawserial,] [ sdeclcd,sed1330,sed1520,serialPOS,serialVFD,] [ shuttleVFD,sli,stv5730,SureElec,svga,t6963,text,] - [ tyan,ula200,vlsys_m428,xosd] + [ tyan,ula200,vlsys_m428,xosd,yard2LCD] [ ] [ 'all' compiles all drivers;] [ 'all,!xxx,!yyy' de-selects previously selected drivers], drivers="$enableval", drivers=[bayrad,CFontz,CFontzPacket,curses,CwLnx,glk,lb216,lcdm001,MtxOrb,pyramid,text]) -allDrivers=[bayrad,CFontz,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,g15,glcd,glcdlib,glk,hd44780,i2500vfd,icp_a106,imon,imonlcd,IOWarrior,irman,irtrans,joy,lb216,lcdm001,lcterm,linux_input,lirc,lis,MD8800,mdm166a,ms6931,mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,Olimex_MOD_LCD1x9,picolcd,pyramid,sdeclcd,sed1330,sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,SureElec,svga,t6963,text,tyan,ula200,vlsys_m428,xosd,rawserial] +allDrivers=[bayrad,CFontz,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,g15,glcd,glcdlib,glk,hd44780,i2500vfd,icp_a106,imon,imonlcd,IOWarrior,irman,irtrans,joy,lb216,lcdm001,lcterm,linux_input,lirc,lis,MD8800,mdm166a,ms6931,mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,Olimex_MOD_LCD1x9,picolcd,pyramid,sdeclcd,sed1330,sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,SureElec,svga,t6963,text,tyan,ula200,vlsys_m428,xosd,rawserial,yard2LCD] if test "$debug" = yes; then allDrivers=["${allDrivers},debug"] fi @@ -557,6 +557,10 @@ dnl else actdrivers=["$actdrivers xosd"] fi ;; + yard2LCD) + DRIVERS="$DRIVERS yard2LCD${SO}" + actdrivers=["$actdrivers yard2LCD"] + ;; *) AC_MSG_ERROR([Unknown driver $driver]) ;; diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index d507e02..418cfad 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -23,7 +23,7 @@ AM_LDFLAGS = @LDSHARED@ lcdexecbindir = $(pkglibdir) lcdexecbin_PROGRAMS = @DRIVERS@ -EXTRA_PROGRAMS = bayrad CFontz CFontzPacket curses CwLnx debug ea65 EyeboxOne g15 glcd glcdlib glk hd44780 i2500vfd icp_a106 imon imonlcd IOWarrior irman irtrans joy lb216 lcdm001 lcterm linux_input lirc lis MD8800 mdm166a ms6931 mtc_s16209x MtxOrb mx5000 NoritakeVFD Olimex_MOD_LCD1x9 picolcd pyramid rawserial sdeclcd sed1330 sed1520 serialPOS serialVFD shuttleVFD sli stv5730 SureElec svga t6963 text tyan ula200 vlsys_m428 xosd +EXTRA_PROGRAMS = bayrad CFontz CFontzPacket curses CwLnx debug ea65 EyeboxOne g15 glcd glcdlib glk hd44780 i2500vfd icp_a106 imon imonlcd IOWarrior irman irtrans joy lb216 lcdm001 lcterm linux_input lirc lis MD8800 mdm166a ms6931 mtc_s16209x MtxOrb mx5000 NoritakeVFD Olimex_MOD_LCD1x9 picolcd pyramid rawserial sdeclcd sed1330 sed1520 serialPOS serialVFD shuttleVFD sli stv5730 SureElec svga t6963 text tyan ula200 vlsys_m428 xosd yard2LCD noinst_LIBRARIES = libLCD.a libbignum.a g15_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) @@ -137,6 +137,8 @@ tyan_SOURCES = lcd.h lcd_lib.h tyan_lcdm.h tyan_lcdm.c report.h adv_bignum ula200_SOURCES = lcd.h adv_bignum.h ula200.h ula200.c report.h vlsys_m428_SOURCES = lcd.h report.h vlsys_m428.c vlsys_m428.h xosd_SOURCES = lcd.h xosdlib_drv.c xosdlib_drv.h report.h adv_bignum.h +yard2LCD = lcd.h yard2LCD.c yard2LCD.h report.h + AM_CPPFLAGS = -I$(top_srcdir) diff --git a/server/drivers/yard2LCD.c b/server/drivers/yard2LCD.c new file mode 100644 index 0000000..8a14276 --- /dev/null +++ b/server/drivers/yard2LCD.c @@ -0,0 +1,647 @@ +/*************************************************************************** + * Copyright (C) 2009 by M. Feser * + * Copyright (C) 1013 by R. Geigenberger (Update for YARD2) * + * * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "lcd.h" +//#define DEBUG +#include "report.h" +#include "yard2LCD.h" +#include "lcd_lib.h" + +/* +//Type of characters currently stored in CGRAM. from lcd.h as info +typedef enum { + standard, // one char is used for heartbeat + vbar, // vertical bars + hbar, // horizontal bars + icons, // standard icons + custom, // custom settings + bignum, // big numbers +} CGmode; +*/ + +typedef enum { + Dmode_standard, + Dmode_graphical +} Dmode; + + +/* Driver private data */ +typedef struct driver_private_data { + int fd; + int width, height; + int gwidth, gheight; + int hspace, vspace; + int cellwidth, cellheight; + int bigcellwidth, bigcellheight; + char *framebuf; + int on_brightness; + int off_brightness; + char hw_brightness; + CGmode ccmode; + Dmode dispmode; + char info[255]; + char LCDtype; +} PrivateData; + +/* Prototypes of internal functions */ +static int yard_hwWrite(Driver *drvthis, unsigned char *yardData, unsigned char Datalen); +static int yard_hwClearLCD(Driver *drvthis); +static int yard_hwEnterGmode(Driver *drvthis); +static int yard_hwGotoXY(Driver *drvthis, unsigned char x, unsigned char y); +static int yard_hwPrintChar(Driver *drvthis, char c); +static int yard_hwPrintCharArray(Driver *drvthis, char *str, unsigned char len); +static int yard_hwSetBrightness(Driver *drvthis, unsigned char brightVal); +static int yard_hwWriteCGRam(Driver *drvthis, unsigned char numChar, unsigned char *data); + + +/* Vars for the server core */ +MODULE_EXPORT char *api_version = API_VERSION; +MODULE_EXPORT int stay_in_foreground = 0; +MODULE_EXPORT int supports_multiple = 0; +MODULE_EXPORT char *symbol_prefix = "yard_"; + +unsigned char yardCmd[64]; + +/* + * Hardware function: Write YARD command to KeyLcd via socket + */ +static int +yard_hwWrite(Driver *drvthis, unsigned char *yardData, unsigned char Datalen) +{ + debug(RPT_DEBUG, "%s: Event 01 - Enter yard_hwWrite: %d - %s",drvthis->name,Datalen,yardData); + PrivateData *p = drvthis->private_data; + unsigned char byteCnt; + + // Send data to YARD server + if ( (Datalen > 0) && (Datalen <= MAX_YARDDATA_SIZE)) + { + byteCnt = write(p->fd, yardData, Datalen); //(char *)&yardCMD + //byteCnt = write(p->fd, "WTEST",5); + if (byteCnt < 0) + { + report(RPT_WARNING, "%s: Can't send data to YARD2 LCDserver !", drvthis->name); + debug(RPT_DEBUG, "%s: Event 01.1 - Can't send data to YARD2 LCDserver !", drvthis->name); + return -1; + } + } + else + { + debug(RPT_DEBUG, "%s: Event 01.1 - %s: Too much Data for YARD Server: %d !", drvthis->name,Datalen); + report(RPT_WARNING, "%s: Too much Data for YARD Server: %d !", drvthis->name,Datalen); + return -1; + } + + + // Just wait for YARD server response; No matter of Data received, but > 2 bytes, normally ROK is send + byteCnt = read(p->fd, (char *)&yardData, sizeof(yardData) ); + if (byteCnt < 0) + { + debug(RPT_DEBUG, "%s: Cannot receive ROK from YARD2 server !", drvthis->name); + report(RPT_ERR, "%s: Cannot receive ROK from YARD2 server !", drvthis->name); + return -1; + } + + return 0; +} + + +/* + * Hardware function: Clears screen + */ +static int +yard_hwClearLCD(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 02 - Enter yard_hwClearLCD",drvthis->name); + unsigned char cmd; + + cmd = 'C'; // = Clear cmd for YARD + return yard_hwWrite(drvthis, &cmd, 1); +} + +/* + * Hardware function: Shifts cursor to position (x,y), left upper corner equals (1,1) + */ +static int +yard_hwGotoXY(Driver *drvthis, unsigned char x, unsigned char y) +{ + debug(RPT_DEBUG, "%s: Event 03 - Enter yard_hwGotoXY: X.%d - Y.%d",drvthis->name,x,y); + PrivateData *p = (PrivateData *)drvthis->private_data; + unsigned char cmdBuf[5]; + + // Error check + switch (p->dispmode) + { + case Dmode_standard: + { + if ( (x > p->width) || (x < 1) || (y > p->height) || (y < 1) ) + return -1; + + // Setup and send YARD command + cmdBuf[0] = 'G'; + cmdBuf[1] = x - 1; // Zero index start ! lcdproc starts with 1,1, YARD 0,0 + cmdBuf[2] = y - 1; + return yard_hwWrite(drvthis, cmdBuf, 3); + + break; + } + default: { + return -1; + break; + } + } +} + + +/* + * Hardware function: Prints a single character + */ +static int +yard_hwPrintChar(Driver *drvthis, char c) +{ + debug(RPT_DEBUG, "%s: Event 04 - Enter yard_hwPrintChar: %s",drvthis->name,c); + unsigned char cmdBuf[2]; + + // Setup YARD command + cmdBuf[0] = 'W'; + cmdBuf[1] = c; + + // Send command + return yard_hwWrite(drvthis, cmdBuf, 2); +} + +/* + * Hardware function: Prints a character array + */ +static int +yard_hwPrintCharArray(Driver *drvthis, char *str, unsigned char len) +{ + debug(RPT_DEBUG, "%s: Event 05 - Enter yard_hwPrintCharArray: %d - %s",drvthis->name,len,str); + unsigned char cmdBuf[MAX_YARDDATA_SIZE]; + + // Error check + if (len > MAX_YARDDATA_SIZE) + { + report(RPT_WARNING, "%s: PrintCharArray parameter too large !", drvthis->name); + return -1; + } + + cmdBuf[0] = 'W'; + memcpy(&cmdBuf[1], str, len); + + // Send command + return yard_hwWrite(drvthis, cmdBuf, len + 1); +} + +/* + * Hardware function: Sets brightness of the backlight + */ +yard_hwSetBrightness(Driver *drvthis, unsigned char brightVal) +{ + debug(RPT_DEBUG, "%s: Event 06 - Enter yard_hwSetBrightness: %d",drvthis->name,brightVal); + unsigned char cmdBuf[3]; + + // Setup YARD command + cmdBuf[0] = 'B'; + cmdBuf[1] = brightVal; + return yard_hwWrite(drvthis, cmdBuf, 2); +} + +/* + * Hardware function: Writes a character into the CGRAM + */ +static int +yard_hwWriteCGRam(Driver *drvthis, unsigned char numChar, unsigned char *data) +{ + debug(RPT_DEBUG, "%s: Event 07 - Enter yard_hwWriteCGRam: %d - %02X",drvthis->name,numChar,data); + unsigned char cmdBuf[11]; + + // Setup YARD command + cmdBuf[0] = 'I'; + cmdBuf[1] = numChar; + memcpy(&cmdBuf[2], data, 8); + return yard_hwWrite(drvthis, cmdBuf, 10); +} + +/* + * Inits settings and connection + */ +MODULE_EXPORT int +yard_init(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 08 - Enter yard_init",drvthis->name); + struct sockaddr_un srvAddr; + int tmp, srvAddrLen; + PrivateData *p; + char sockpath[200] = DEFAULT_SOCK_PATH; + unsigned char byteCnt; + char Recbuffer[10]; + + + // Allocate and store private data + p = (PrivateData *)malloc(sizeof(PrivateData)); + if (p == NULL) + return -1; + if (drvthis->store_private_ptr(drvthis, p) < 0) + return -1; + + // Initialize cellsize, character spacing and graphical offset + p->fd = -1; + p->cellwidth = DEFAULT_CELLWIDTH; + p->cellheight = DEFAULT_CELLHEIGHT; + p->bigcellwidth = DEFAULT_CELLWIDTH_BIG; + p->bigcellheight = DEFAULT_CELLHEIGHT_BIG; + p->hspace = DEFAULT_HSPACE; + p->vspace = DEFAULT_VSPACE; + p->ccmode = standard; + p->dispmode = Dmode_standard; + p->LCDtype = 0; //only use 0=HD44780; not supported now 1=KS0066;2=T6963c;3=KS0108 + p->width = DEFAULT_WIDTH; + p->height = DEFAULT_HEIGHT; + p->gwidth = DEFAULT_GWIDTH; + p->gheight = DEFAULT_GHEIGHT; + + // Establish connection to YARD server + bzero( (char *)&srvAddr, sizeof(srvAddr)); + srvAddr.sun_family = AF_UNIX; + strcpy(srvAddr.sun_path, sockpath); + srvAddrLen = strlen(srvAddr.sun_path) + sizeof(srvAddr.sun_family); + + p->fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (p->fd < 0) { + report(RPT_ERR, "%s: Can't create socket !", drvthis->name); + return -1; + } + if (connect(p->fd, (struct sockaddr *)&srvAddr, srvAddrLen) < 0) { + report(RPT_ERR, "%s: Can't connect to yardsrv !", drvthis->name); + return -1; + } + + //Get the config from yard2srvd. Config is not in LCDd.conf ! + sprintf(Recbuffer,"LCDPROC\0"); + byteCnt = write(p->fd,Recbuffer, strlen(Recbuffer)); + if (byteCnt < 0) + { + report(RPT_ERR, "%s: Can't send config request to YARD2 LCDserver !", drvthis->name); + return -1; + } + + // Wait for YARD server response + byteCnt = read(p->fd, Recbuffer, sizeof(Recbuffer) ); + if (byteCnt < 0) + { + report(RPT_ERR, "%s: Cannot receive config from YARD server !", drvthis->name); + return -1; + } + else if (byteCnt == 1) + { + report(RPT_ERR, "%s: YARD communication timeout !", drvthis->name); + return -1; + } + + //Receiveconfig format: 0='C';1=sizeX;2=sizeY;3=LCDType(0=HD44780,1=KS0066,2=T6963,3=KS0108) + if(Recbuffer[0] == 'C') //C=Config + { + p->width = Recbuffer[1]; + p->height = Recbuffer[2]; + p->LCDtype = Recbuffer[3]; + } + else + { + report(RPT_ERR, "%s: YARD Config Receive error !", drvthis->name); + return -1; + } + + if(p->LCDtype > 1) //only char LCDs are currently supported + { + report(RPT_ERR, "%s: YARD LCD type %d not supported by this version or the driver !", drvthis->name,p->LCDtype); + return -1; + } + + // Allocate framebuf & Setup frame buffer x2 to be sure that the buffer is big enough + p->framebuf = (unsigned char *) malloc((p->width * p->height)*2); + if (p->framebuf == NULL) + { + report(RPT_ERR, "%s: Can't create framebuffer !", drvthis->name); + return -1; + } + memset(p->framebuf, ' ', p->width * p->height); + +/* not done yet + // Init size and graphical size +*/ + +/* + // Init backlight-on brightness -> done by YARD2 normally in auto mode +*/ + tmp = DEFAULT_ON_BRIGHTNESS; + p->on_brightness = tmp; +/* + // Init backlight-off brightness -> done by YARD2 normally in auto mode +*/ + tmp = DEFAULT_OFF_BRIGHTNESS; + p->off_brightness = tmp; + + + report(RPT_DEBUG, "%s: Init done", drvthis->name); + return 0; +} + +/* + * Closes down the driver + */ +MODULE_EXPORT void +yard_close(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 09 - Enter yard_close",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + if (p != NULL) { + close(p->fd); + if (p->framebuf) + free(p->framebuf); + free(p); + } + + drvthis->store_private_ptr(drvthis, NULL); +} + +/* + * Returns the display width in characters + */ +MODULE_EXPORT int +yard_width(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 10 - Enter yard_width",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + return p->width; +} + +/* + * Returns the display height in characters + */ +MODULE_EXPORT int +yard_height(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 11 - Enter yard_height",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + return p->height; +} + +/* + * Clears the framebuffer + */ +MODULE_EXPORT void +yard_clear(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 12 - Enter yard_clear",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + // Reset custom char mode and clear frambuffer + p->ccmode = standard; + memset(p->framebuf, ' ', p->width * p->height); +} + +/* + * Flushes a single frame to the VFD + */ +MODULE_EXPORT void +yard_flush(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 13 - Enter yard_flush",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + int i; + int width, height; + + switch (p->dispmode) { + case Dmode_standard: + { + // Set width and height + width = p->width; + height = p->height; + break; + } + default: + { + debug(RPT_DEBUG, "%s: Event 24 - Only Char. Mode supported: %d",drvthis->name,p->dispmode); + return; + break; + } + } + + // Send framebuffer content to LCD + for (i = 0; i < height; i++) + { + // Line feed + yard_hwGotoXY(drvthis, 1, i+1); + + // Write single line + yard_hwPrintCharArray(drvthis, &(p->framebuf[i*width]), width); + debug(RPT_DEBUG, "YARD2: flushed line %d - chars %d", i,width); + } + + +} + +/* + * Prints a string on the VFD + */ +MODULE_EXPORT void +yard_string(Driver *drvthis, int x, int y, const char string[]) +{ + debug(RPT_DEBUG, "%s: Event 14 - Enter yard_string: X.%d - Y.%d - %s",drvthis->name,x,y,string); + + PrivateData *p = (PrivateData *)drvthis->private_data; + int i; + + // Change display mode if necessary; Only char mode 0 is supported right now + if (p->dispmode == Dmode_graphical) + { + yard_hwClearLCD(drvthis); + p->dispmode = Dmode_standard; + } + + x--; //start with 0,0 + y--; + for (i = 0; string[i] != '\0'; i++) + { + // Check for buffer overflow + if ( (y * p->width + x + i) >= (p->width * p->height) ) + break; + p->framebuf[(y * p->width) + x + i] = string[i]; + } +} + +/* + * Prints a single character on the VFD + */ +MODULE_EXPORT void +yard_chr(Driver *drvthis, int x, int y, char c) +{ + PrivateData *p = (PrivateData *)drvthis->private_data; + debug(RPT_DEBUG, "%s: Event 15 - Enter yard_chr",drvthis->name); + + // Error check + if ( (x > p->width) || (y > p->height) ) + return; + + // Change display mode if necessary + if (p->dispmode == Dmode_graphical) + { + yard_hwClearLCD(drvthis); + p->dispmode = 0; + } + + y--; //start with 0,0 + x--; + p->framebuf[(y * p->width) + x ] = c; +} + +/* + * Returns the number of custom characters + */ +MODULE_EXPORT int +yard_get_free_chars(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 16 - Enter yard_get_free_chars",drvthis->name); + return NUM_CUSTOMCHARS; +} + +/* + * Sets a custom character + */ +MODULE_EXPORT void +yard_set_char(Driver *drvthis, int n, unsigned char *dat) +{ + debug(RPT_DEBUG, "%s: Event 17 - Enter yard_set_char: Nr.%d - %02X",drvthis->name,n,dat); + + if ( (n < 0) || (n >= NUM_CUSTOMCHARS) ) + return; + if (!dat) + return; + + yard_hwWriteCGRam(drvthis, n, dat); +} + +/* + * Returns the width of a character in pixels + */ +MODULE_EXPORT int +yard_cellwidth(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 18 - Enter yard_cellwidth",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + return p->cellwidth; +} + +/* + * Returns the height of a character in pixels + */ +MODULE_EXPORT int +yard_cellheight(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 19 - Enter yard_cellheight",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + return p->cellheight; +} + +/* + * Reads brightness (in promille) + */ +MODULE_EXPORT int +yard_get_brightness(Driver *drvthis, int state) +{ + debug(RPT_DEBUG, "%s: Event 20 - Enter yard_get_brightness: %d",drvthis->name,state); + PrivateData *p = (PrivateData *)drvthis->private_data; + + return (state == BACKLIGHT_ON) ? p->on_brightness : p->off_brightness; +} + +/* + * Sets brightness (in promille) + */ +MODULE_EXPORT void +yard_set_brightness(Driver *drvthis, int state, int promille) +{ + debug(RPT_DEBUG, "%s: Event 21 - Enter yard_set_brightness: %d - %d",drvthis->name,state,promille); + PrivateData *p = (PrivateData *)drvthis->private_data; + + // Error check + if (promille < 0 || promille > 1000) + return; + + // Store values + if (state == BACKLIGHT_ON) { + p->on_brightness = promille; + } + else { + p->off_brightness = promille; + } +} + +/* + * Sets the backlight on or off + * The hardware supports any value between 0 and 255 + */ +MODULE_EXPORT void +yard_backlight(Driver *drvthis, int on) +{ + debug(RPT_DEBUG, "%s: Event 22 - Enter yard_backlight: %d",drvthis->name,on); + PrivateData *p = (PrivateData *)drvthis->private_data; + + int hardware_value = (on == BACKLIGHT_ON) ? p->on_brightness : p->off_brightness; + + // Map range to hardware [0, 1000] -> [0, 255] + hardware_value /= 4; + if (hardware_value != p->hw_brightness) + { + // Send command and update private data + yard_hwSetBrightness(drvthis, hardware_value); + p->hw_brightness = (char)hardware_value; + } +} + +/* + * Provides info about the driver + */ +MODULE_EXPORT const char * +yard_get_info(Driver *drvthis) +{ + debug(RPT_DEBUG, "%s: Event 23 - Enter yard_get_info",drvthis->name); + PrivateData *p = (PrivateData *)drvthis->private_data; + + strcpy(p->info, "Socket-based driver for Y.A.R.D.2 USB LCD"); + return p->info; +} diff --git a/server/drivers/yard2LCD.h b/server/drivers/yard2LCD.h new file mode 100644 index 0000000..b10a303 --- /dev/null +++ b/server/drivers/yard2LCD.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * Copyright (C) 2013 by R. Geigenberger * + * * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef yard2LCD_H +#define yard2LCD_H + +#define MAX_YARDDATA_SIZE 40 +#define DEFAULT_SOCK_PATH "/tmp/lcdserver" +#define DEFAULT_OFF_BRIGHTNESS 100 +#define DEFAULT_ON_BRIGHTNESS 1000 +#define DEFAULT_WIDTH 16 +#define DEFAULT_HEIGHT 4 +#define DEFAULT_GWIDTH 64 +#define DEFAULT_GHEIGHT 32 +#define DEFAULT_CELLWIDTH 5 +#define DEFAULT_CELLHEIGHT 8 +#define DEFAULT_CELLWIDTH_BIG 10 +#define DEFAULT_CELLHEIGHT_BIG 14 +#define DEFAULT_HSPACE 2 +#define DEFAULT_VSPACE 1 +#define NUM_CUSTOMCHARS 8 + + +MODULE_EXPORT int yard_init (Driver *drvthis); +MODULE_EXPORT void yard_close (Driver *drvthis); +MODULE_EXPORT int yard_width (Driver *drvthis); +MODULE_EXPORT int yard_height (Driver *drvthis); +MODULE_EXPORT void yard_clear (Driver *drvthis); +MODULE_EXPORT void yard_flush (Driver *drvthis); +MODULE_EXPORT void yard_string (Driver *drvthis, int x, int y, const char string[]); +MODULE_EXPORT void yard_chr (Driver *drvthis, int x, int y, char c); +MODULE_EXPORT void yard_num(Driver *drvthis, int x, int num); +MODULE_EXPORT void yard_set_char(Driver *drvthis, int n, unsigned char *dat); +MODULE_EXPORT int yard_get_free_chars(Driver *drvthis); +MODULE_EXPORT int yard_cellwidth (Driver *drvthis); +MODULE_EXPORT int yard_cellheight (Driver *drvthis); +MODULE_EXPORT int yard_get_brightness (Driver *drvthis, int state); +MODULE_EXPORT void yard_set_brightness (Driver *drvthis, int state, int promille); +MODULE_EXPORT void yard_backlight (Driver *drvthis, int on); +MODULE_EXPORT const char * yard_get_info( Driver *drvthis ); + + +#endif