diff options
Diffstat (limited to 'abs')
| -rw-r--r-- | abs/extra/lcdproc/PKGBUILD | 52 | ||||
| -rw-r--r-- | abs/extra/lcdproc/__changelog | 4 | ||||
| -rwxr-xr-x | abs/extra/lcdproc/lcdd | 38 | ||||
| -rw-r--r-- | abs/extra/lcdproc/lcdproc-add-serdisplib | 1353 | ||||
| -rw-r--r-- | abs/extra/lcdproc/lcdproc.install | 7 | 
5 files changed, 72 insertions, 1382 deletions
| diff --git a/abs/extra/lcdproc/PKGBUILD b/abs/extra/lcdproc/PKGBUILD index 03b4333..e8fe80d 100644 --- a/abs/extra/lcdproc/PKGBUILD +++ b/abs/extra/lcdproc/PKGBUILD @@ -1,28 +1,44 @@ +# Maintainer: BlackEagle <ike DOT devolder AT gmail DOT com>  # Contributor: Bernhard Walle <bernhard.walle@gmx.de>  pkgname=lcdproc -pkgver=0.5.3 -pkgrel=4 -pkgdesc="LCDproc is a utility to drive one or more LCD (and LCD-like) devices attached to a host." +pkgver=0.5.5 +pkgrel=3 +pkgdesc="Utility to drive one or more LCD (and LCD-like) devices"  url="http://lcdproc.omnipotent.net/"  license="GPL" -depends=(libusb serdisplib libftdi autoconf automake lirc libnxml libmrss pkgconfig xosd) -backup=(etc/LCDd.conf) +depends=('libusb-compat') +optdepends=( +	'perl: needed for some lcdproc tools' +) +backup=( +	'etc/LCDd.conf' +	'etc/lcdexec.conf' +	'etc/lcdproc.conf' +	'etc/lcdvc.conf' +)  arch=('i686' 'x86_64') -install=lcdproc.install -source=(http://switch.dl.sourceforge.net/sourceforge/$pkgname/$pkgname-$pkgver.tar.gz -        lcdproc-add-serdisplib) +source=( +	"http://switch.dl.sourceforge.net/sourceforge/$pkgname/$pkgname-$pkgver.tar.gz" +	'lcdd' +)  build() { -  cd ${srcdir}/${pkgname}-${pkgver} -#  patch -p1 < ../lcdproc-add-serdisplib -  autoreconf -  ./configure --prefix=/usr --sysconfdir=/etc --enable-libusb --enable-lcdproc-menus --enable-stat-smbfs --enable-drivers=all -  make +	cd "$pkgname-$pkgver" +	./configure \ +		--prefix=/usr \ +		--sysconfdir=/etc \ +		--enable-libusb \ +		--enable-lcdproc-menus \ +		--enable-stat-smbfs \ +		--enable-drivers=all +	make  } +  package() { -  cd ${srcdir}/${pkgname}-${pkgver} -  make DESTDIR=${pkgdir} install -  sed -e "s/server\/drivers\//\/usr\/lib\/lcdproc\//g" LCDd.conf > $pkgdir/etc/LCDd.conf +	cd "$pkgname-$pkgver" +	make DESTDIR="$pkgdir" install +	sed -e "s/server\/drivers\//\/usr\/lib\/lcdproc\//g" -i "$pkgdir/etc/LCDd.conf" +	install -Dm755 "$srcdir/lcdd" "$pkgdir/etc/rc.d/lcdd"  } -md5sums=('fe9a7c9d8f2c5e76250ce2ea8f644921' -         '274322642740ad323c43ec5d324519d4') +sha256sums=('b136b47d7bf585a003334f432d8730a36ef5ed1cd520084b919667d825e48d42' +            'b43dfd02e38f0149a02396cdc355e5ca2b51217b2da6092de56d426490abfcab') diff --git a/abs/extra/lcdproc/__changelog b/abs/extra/lcdproc/__changelog deleted file mode 100644 index 96fd954..0000000 --- a/abs/extra/lcdproc/__changelog +++ /dev/null @@ -1,4 +0,0 @@ -add xosd -# mihanson 2010-04-05 -updated to 0.5.3 -removed lcdproc-add-serdisplib as it does not appear to be needed anymore diff --git a/abs/extra/lcdproc/lcdd b/abs/extra/lcdproc/lcdd new file mode 100755 index 0000000..a124c00 --- /dev/null +++ b/abs/extra/lcdproc/lcdd @@ -0,0 +1,38 @@ +#!/bin/bash + +. /etc/rc.conf +. /etc/rc.d/functions + +PID=`pidof -o %PPID /usr/sbin/LCDd` +case "$1" in +  start) +    stat_busy "Starting LCDd daemon" +    [ -z "$PID" ] && /usr/sbin/LCDd -c /etc/LCDd.conf +    if [ $? -gt 0 ]; then +      stat_fail +    else +      echo $PID > /var/run/lcdd.pid +      add_daemon lcdd +      stat_done +    fi +    ;; +  stop) +    stat_busy "Stopping LCDd daemon" +    [ ! -z "$PID" ]  && kill $PID &> /dev/null +    if [ $? -gt 0 ]; then +      stat_fail +    else +      rm /var/run/lcdd.pid +      rm_daemon lcdd +      stat_done +    fi +    ;; +  restart) +    $0 stop +    sleep 1 +    $0 start +    ;; +  *) +    echo "usage: $0 {start|stop|restart}"   +esac +exit 0 diff --git a/abs/extra/lcdproc/lcdproc-add-serdisplib b/abs/extra/lcdproc/lcdproc-add-serdisplib deleted file mode 100644 index 48d239a..0000000 --- a/abs/extra/lcdproc/lcdproc-add-serdisplib +++ /dev/null @@ -1,1353 +0,0 @@ -[PATCH] Add serdisplib driver - -This patch adds a serdisplib driver for the serdisplib library -(http://serdisplib.sf.net) that is used for low-level accessing of dot-matrix -devices (i.e. such displays that are drived by pixel and not by characters -unlike HD44780, for example). - -I know there's already glcdlib. But that approach has several disadvantages: - -  o Unnecessary library dependencies. -  o Complicated installation, i.e. you have to edit two configuration files. -  o Too much redraws. In fact, that was the reason for me to write this -    driver because my ctinclud display (http://www.ct-maeusekino.de) was quite -    unusable with the glcdlib driver. The problem is simply that lcdproc -    redraws the whole screen each second and it's the task of the driver -    to not to redraw it in reality. The problem is now that the glcdproc -    driver only has the view of characters, and cannot decide which pixels it -    actually has to redraw. And graphlcd which has the per-pixel view doesn't -    do that "caching" and simply redraws all. Of course, that _can_ -    be changed in graphlcd, but I'm sure that leads to endless discussions and -    because I didn't like the glcdlib -> graphlcd -> serdisplib approach -    anyway, I decided to write that driver. - -Some important design decisions: - - o The driver is split into lcdgraphic.c and serdisplib.c. All function that -   do the character -> pixel "rendering" are split out into lcdgraphic.c, -   so it would be possible to write another low-level driver that uses that -   function. However, in normal cases it makes more sense to add that part to -   serdisplib. - o It only requires FreeType (http://freetype.sf.net) for font rendering. -   That's no new real dependency because in almost all cases, graphlcd was -   compiled with FreeType support. - o Only mono space fonts are supported. - o The driver implements symbols (arrow, etc.) using Unicode characters of the -   font. (The recommended font is Andale Mono which is available for free -   from http://corefonts.sf.net) - o Works on i686 and x86_64. - -Please review. The patch is against 0.5.2. If you consider to add this into -CVS, I'll provide documentation. And this time, I'll provide the documentation -in time unlike with the ula200 driver. ;-) - - -Signed-off-by: Bernhard Walle <bernhard.walle@gmx.de> - ---- - LCDd.conf                   |   28 ++ - acinclude.m4                |   27 +- - server/drivers/Makefile.am  |    5  - server/drivers/lcdgraphic.c |  590 ++++++++++++++++++++++++++++++++++++++++++++ - server/drivers/lcdgraphic.h |  195 ++++++++++++++ - server/drivers/serdisplib.c |  379 ++++++++++++++++++++++++++++ - 6 files changed, 1220 insertions(+), 4 deletions(-) - ---- a/acinclude.m4 -+++ b/acinclude.m4 -@@ -10,13 +10,13 @@ AC_ARG_ENABLE(drivers, - 	[                    irman,joy,lb216,lcdm001,lcterm,lirc,MD8800,ms6931,] - 	[                    mtc_s16209x,MtxOrb,NoritakeVFD,picolcd,pyramid,sed1330] - 	[                    sed1520,serialPOS,serialVFD,sli,stv5730,svga,t6963,text,] --	[                    tyan,ula200,xosd] -+	[                    tyan,ula200,serdisplib,xosd] - 	[                  'all' compiles all drivers;] - 	[                  'all,!xxx,!yyy' de-selects previously selected drivers], - 	drivers="$enableval", - 	drivers=[bayrad,CFontz,CFontz633,curses,CwLnx,glk,lb216,lcdm001,MtxOrb,pyramid,text]) -  --allDrivers=[bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,g15,glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,joy,lb216,lcdm001,lcterm,lirc,MD8800,ms6931,mtc_s16209x,MtxOrb,NoritakeVFD,picolcd,pyramid,sed1330,sed1520,serialPOS,serialVFD,sli,stv5730,svga,t6963,text,tyan,ula200,xosd] -+allDrivers=[bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,g15,glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,joy,lb216,lcdm001,lcterm,lirc,MD8800,ms6931,mtc_s16209x,MtxOrb,NoritakeVFD,picolcd,pyramid,sed1330,sed1520,serialPOS,serialVFD,sli,stv5730,svga,t6963,text,tyan,ula200,serdisplib,xosd] -  - drivers=`echo $drivers | sed -e 's/,/ /g'` -  -@@ -383,6 +383,29 @@ dnl			else - 				AC_MSG_WARN([The ula200 driver needs ftdi.h and usb.h]) - 			]) - 			;; -+                serdisplib) -+                        LIBFREETYPE_CFLAGS=`pkg-config --cflags freetype2` -+                        LIBFREETYPE_LIBS=`pkg-config --libs freetype2` -+                        if test x"$LIBFREETYPE_CFLAGS" = "x" ; then -+                                AC_MSG_WARN([The serdisplib driver needs freetype2]) -+                        fi -+ -+                        AC_CHECK_HEADERS([serdisplib/serdisp.h],[ -+                                AC_CHECK_LIB(serdisp, serdisp_nextdisplaydescription,[ -+                                        LIBSERDISP="-lserdisp" -+                                        DRIVERS="$DRIVERS serdisplib${SO}" -+                                        actdrivers=["$actdrivers serdisplib"] -+                                ],[ -+                                        AC_MSG_WARN([The serdisplib driver needs serdisplib]) -+                                ]) -+                        ],[ -+                                AC_MSG_WARN([The serdisplib driver needs serdislib/serdisp.h]) -+                        ]) -+ -+                        AC_SUBST(LIBFREETYPE_CFLAGS) -+                        AC_SUBST(LIBFREETYPE_LIBS) -+                        AC_SUBST(LIBSERDISP) -+                        ;; - 		xosd) - 			AC_CHECK_HEADERS([xosd.h],[ - 				AC_CHECK_LIB(xosd, main,[ ---- a/server/drivers/Makefile.am -+++ b/server/drivers/Makefile.am -@@ -19,12 +19,13 @@ AM_LDFLAGS = @LDSHARED@ - #LIBS = -  - pkglib_PROGRAMS = @DRIVERS@ --EXTRA_PROGRAMS = bayrad CFontz CFontz633 CFontzPacket curses CwLnx ea65 EyeboxOne g15 glcdlib glk hd44780 icp_a106 imon IOWarrior irman joy lb216 lcdm001 lcterm lirc MD8800 ms6931 mtc_s16209x MtxOrb NoritakeVFD picolcd pyramid sed1330 sed1520 serialPOS serialVFD stv5730 svga t6963 text tyan sli ula200 xosd -+EXTRA_PROGRAMS = bayrad CFontz CFontz633 CFontzPacket curses CwLnx ea65 EyeboxOne g15 glcdlib glk hd44780 icp_a106 imon IOWarrior irman joy lb216 lcdm001 lcterm lirc MD8800 ms6931 mtc_s16209x MtxOrb NoritakeVFD picolcd pyramid sed1330 sed1520 serialPOS serialVFD stv5730 svga t6963 text tyan sli ula200 serdisplib xosd - noinst_LIBRARIES = libLCD.a libbignum.a -  - IOWarrior_CFLAGS =   @libusb_cflags@ $(AM_CFLAGS) - hd44780_CFLAGS =     @libusb_cflags@ $(AM_CFLAGS) - g15_CFLAGS =         @libusb_cflags@ $(AM_CFLAGS) -+serdisplib_CFLAGS =  @LIBFREETYPE_CFLAGS@ $(AM_CFLAGS) -  - CFontz_LDADD =       libLCD.a libbignum.a - CFontz633_LDADD =    libLCD.a libbignum.a -@@ -53,6 +54,7 @@ svga_LDADD =         @LIBSVGA@ - t6963_LDADD =        libLCD.a - tyan_LDADD =         libLCD.a libbignum.a - ula200_LDADD =       libLCD.a @LIBFTDI@ -+serdisplib_LDADD =   libLCD.a @LIBSERDISP@ @LIBFREETYPE_LIBS@ - sli_LDADD =          libLCD.a - xosd_LDADD =         @LIBXOSD@ -  -@@ -99,6 +101,7 @@ t6963_SOURCES =      lcd.h lcd_lib.h t69 - text_SOURCES =       lcd.h text.h text.c report.h - tyan_SOURCES =       lcd.h lcd_lib.h tyan_lcdm.h tyan_lcdm.c report.h adv_bignum.h - ula200_SOURCES =     lcd.h lcd_lib.h ula200.h ula200.c report.h -+serdisplib_SOURCES = lcd.h serdisplib.h serdisplib.c lcdgraphic.c lcdgraphic.h - sli_SOURCES =        lcd.h lcd_lib.h wirz-sli.h wirz-sli.c report.h - xosd_SOURCES =       lcd.h xosdlib_drv.c xosdlib_drv.h report.h -  ---- /dev/null -+++ b/server/drivers/lcdgraphic.c -@@ -0,0 +1,590 @@ -+// Description: -+ -+/*  Copyright (C) 2007 Bernhard Walle <bernhard.walle@gmx.de> -+ -+    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 -+    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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <unistd.h> -+#include <termios.h> -+#include <fcntl.h> -+#include <string.h> -+#include <errno.h> -+#include <limits.h> -+#include <syslog.h> -+#include <stdint.h> -+ -+#include "lcdgraphic.h" -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Defines -+ -+#undef report -+#define lcdgr_report    lcdgr->drv->report -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Returns the value of a pixel in the new_buffer buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x location of the pixel -+// @param y         the y location of the pixel -+// -+// @return the value of the pixel -+// -+static inline int get_pixel_new(struct lcdgraphic *lcdgr, int x, int y) -+{ -+    if (x >= lcdgr->width || y >= lcdgr->height) -+        return -1; -+    else -+        return lcdgr->new_buffer[lcdgr->width * y + x]; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Returns the value of a pixel in the disp_buffer buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x location of the pixel -+// @param y         the y location of the pixel -+// -+// @return the value of the pixel -+// -+static inline int get_pixel_disp(struct lcdgraphic *lcdgr, int x, int y) -+{ -+    if (x >= lcdgr->width || y >= lcdgr->height) -+        return -1; -+    else -+        return lcdgr->disp_buffer[lcdgr->width * y + x]; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Sets the value of a pixel in the new_buffer buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x location of the pixel -+// @param y         the y location of the pixel -+// @param value     the value to which the buffer should be set -+// -+static void set_pixel_new(struct lcdgraphic *lcdgr, int x, int y, int value) -+{ -+    if (x < lcdgr->width && y < lcdgr->height) -+        lcdgr->new_buffer[lcdgr->width * y + x] = value; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Sets the value of a pixel in the disp_buffer buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x location of the pixel -+// @param y         the y location of the pixel -+// @param value     the value to which the buffer should be set -+// -+static void set_pixel_disp(struct lcdgraphic *lcdgr, int x, int y, int value) -+{ -+    if (x < lcdgr->width && y < lcdgr->height) -+        lcdgr->disp_buffer[lcdgr->width * y + x] = value; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Maps a lcdproc icon to a unicode code for an icon. -+// -+// @param icon      the lcdproc icon constant -+// -+// @return Unicode value -+// -+static int icon2unicode(int icon) -+{ -+    switch (icon) { -+        case ICON_BLOCK_FILLED: -+            return UNICODE_BLOCK_FILLED; -+        case ICON_HEART_FILLED: -+            return UNICODE_HEART_FILLED; -+        case ICON_HEART_OPEN: -+            return UNICODE_HEART_OPEN; -+        case ICON_ARROW_UP: -+            return UNICODE_ARROW_UP; -+        case ICON_ARROW_DOWN: -+            return UNICODE_ARROW_DOWN; -+        case ICON_ARROW_LEFT: -+            return UNICODE_ARROW_LEFT; -+        case ICON_ARROW_RIGHT: -+            return UNICODE_ARROW_RIGHT; -+        case ICON_SELECTOR_AT_LEFT: -+            return UNICODE_SELECTOR_AT_LEFT; -+        case ICON_SELECTOR_AT_RIGHT: -+            return UNICODE_SELECTOR_AT_RIGHT; -+        case ICON_ELLIPSIS: -+            return UNICODE_ELLIPSIS; -+        default: -+            return -1; -+    } -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Initialises the instance -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure (not initialised, -+//                  only allocated -+// @param settings  a pointer to a settings structure, for a description of the -+//                  members, see above -+// @param functions a pointer to the functions structure, for a description of -+//                  the members, see above -+// -+// @return          0 on success, != 0 on failure -+// -+int lcdgraphic_init(struct lcdgraphic              *lcdgr, -+                    struct lcdgraphic_settings     *settings, -+                    struct lcdgraphic_functions    *functions) -+{ -+    int ret; -+ -+    // check the arguments -+    if (!lcdgr || !functions || !settings) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_init: one of the arguments is NULL"); -+        return -EINVAL; -+    } -+ -+    // check functions -+    if (!functions->setpixel || !functions->clear || !functions->flush) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_init: all functions must be valid"); -+        return -EINVAL; -+    } -+ -+    // validation -+    if (settings->cwidth == 0 || settings->cheight == 0) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_init: cwidth / cheight is 0"); -+        return -EINVAL; -+    } -+ -+    // zero all first -+    memset(lcdgr, 0, sizeof(struct lcdgraphic)); -+ -+    // assign some members -+    lcdgr->width = settings->width; -+    lcdgr->height = settings->height; -+    lcdgr->cwidth = settings->cwidth; -+    lcdgr->cheight = settings->cheight; -+    lcdgr->bwidth = settings->bheight; -+    lcdgr->drv = settings->drv; -+    strncpy(lcdgr->normal_font, settings->normal_font, PATH_MAX); -+    lcdgr->normal_font[PATH_MAX-1] = 0; -+    lcdgr->funcs = *functions; -+    lcdgr->all_dirty = 1; -+ -+    // calculate some stuff -+    lcdgr->num_pixels = lcdgr->width * lcdgr->height; -+    lcdgr->xchars = (lcdgr->width - 2*lcdgr->bwidth) / lcdgr->cwidth; -+    lcdgr->ychars = (lcdgr->height - 2*lcdgr->bheight) / lcdgr->cheight; -+ -+    // initialise freetype -+    ret = FT_Init_FreeType(&lcdgr->ft_library); -+    if (ret != 0) { -+        lcdgr_report(RPT_ERR, "Freetype initialisation failed"); -+        goto out; -+    } -+ -+    // load the font face for freetype -+    ret = FT_New_Face(lcdgr->ft_library, lcdgr->normal_font, 0, -+            &lcdgr->ft_normal_font); -+    if (ret != 0) { -+        lcdgr_report(RPT_ERR, "Freetype creation of font '%s' failed", -+                lcdgr->normal_font); -+        goto out; -+    } -+ -+    // allocate the buffers -+    lcdgr->disp_buffer = (int *)malloc(sizeof(int) * lcdgr->num_pixels); -+    if (!lcdgr->disp_buffer) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_init: malloc of disp_buffer failed"); -+        ret = -ENOMEM; -+        goto out; -+    } -+ -+    lcdgr->new_buffer = (int *)malloc(sizeof(int) * lcdgr->num_pixels); -+    if (!lcdgr->new_buffer) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_init: malloc of new_buffer failed"); -+        ret = -ENOMEM; -+        goto out; -+    } -+ -+    // clear buffers initially -+    memset(lcdgr->new_buffer, 0, sizeof(int) * lcdgr->num_pixels); -+    memset(lcdgr->disp_buffer, 0, sizeof(int) * lcdgr->num_pixels); -+ -+    return 0; -+ -+out: -+    if (lcdgr->ft_normal_font) -+        FT_Done_Face(lcdgr->ft_normal_font); -+    if (lcdgr->ft_library) -+        FT_Done_FreeType(lcdgr->ft_library); -+    if (lcdgr->new_buffer) -+        free(lcdgr->new_buffer); -+    if (lcdgr->disp_buffer) -+        free(lcdgr->disp_buffer); -+ -+    return ret; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Destroys the instance -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// -+void lcdgraphic_destroy(struct lcdgraphic *lcdgr) -+{ -+    if (!lcdgr) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_destroy: lcdgr == NULL"); -+        return; -+    } -+ -+    if (lcdgr->ft_normal_font) -+        FT_Done_Face(lcdgr->ft_normal_font); -+    if (lcdgr->ft_library) -+        FT_Done_FreeType(lcdgr->ft_library); -+ -+    free(lcdgr->disp_buffer); -+    free(lcdgr->new_buffer); -+ -+    // allow multiple calls of that function -+    lcdgr->disp_buffer = NULL; -+    lcdgr->new_buffer = NULL; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Returns the number of characters in one line. This function can be used -+// inside the width callback of the display driver. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// -+// @return the number of characters in a line -+// -+int lcdgraphic_width(struct lcdgraphic *lcdgr) -+{ -+    if (!lcdgr) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_destroy: lcdgr == NULL"); -+        return -1; -+    } -+ -+    return lcdgr->xchars; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Returns the number of lines. This function can be used inside the height -+// callback of the display driver. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// -+// @return the number lines -+// -+int lcdgraphic_height(struct lcdgraphic *lcdgr) -+{ -+    if (!lcdgr) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_destroy: lcdgr == NULL"); -+        return -1; -+    } -+ -+    return lcdgr->ychars; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Clears the buffer. Doesn't draw anything. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// -+void lcdgraphic_clear(struct lcdgraphic *lcdgr) -+{ -+    if (!lcdgr) { -+        lcdgr_report(RPT_ERR, "lcdgraphic_destroy: lcdgr == NULL"); -+        return; -+    } -+ -+    memset(lcdgr->new_buffer, 0, sizeof(int) * lcdgr->num_pixels); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a string into the display buffer. This calls lcdgraphic_draw_char() -+// internally. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the column (position in characters!) where the character -+//                  should be drawn -+// @param y         the line (position in characters!) where the character -+//                  should be drawn -+// @param str       the string that should be drawn -+// -+void lcdgraphic_draw_string(struct lcdgraphic *lcdgr, int x, int y, char *str) -+{ -+    int i; -+    int num_chars = strlen(str); -+ -+    // check string length -+    if (x + num_chars > lcdgr->xchars) { -+        lcdgr_report(RPT_WARNING, "lcdgraphic_draw_string: %dx%d - %s too long", -+                x, y, str); -+        return; -+    } -+ -+    for (i = 0; i < num_chars; i++) -+        lcdgraphic_draw_char(lcdgr, x + i, y, str[i]); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a Unicode character into the display buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the column (position in characters!) where the character -+//                  should be drawn -+// @param y         the line (position in characters!) where the character -+//                  should be drawn -+// @param c         the character that should be drawn (unicode code) -+// @param scale     for big numbers -- the number of cells that the rendered -+//                  string should occupy -+// @param width     the width in characters -+// -+static int lcdgraphic_draw_char_unicode(struct lcdgraphic *lcdgr, -+                                        int               x, -+                                        int               y, -+                                        int               c, -+                                        int               scale, -+                                        int               width) -+{ -+    static int      last_font_size = -1; -+    int             xoffset, yoffset; // in pixel -+    int             err; -+    FT_Bitmap       *bitmap; -+    unsigned char   *bitmap_buf; -+    int             col, row; -+    FT_GlyphSlot    glyph; -+    FT_Face         face; -+    int             cwidth, cheight; -+    int             font_size; -+ -+    face = lcdgr->ft_normal_font; -+    xoffset = lcdgr->bwidth + x*lcdgr->cwidth; -+    yoffset = lcdgr->bheight + y*lcdgr->cheight; -+ -+    // set the font size -+    font_size = lcdgr->cheight * scale; -+    if (last_font_size != font_size) { -+        err = FT_Set_Pixel_Sizes(lcdgr->ft_normal_font, font_size, font_size); -+        if (err != 0) { -+            lcdgr_report(RPT_ERR, "Failed to set pixel size (%dx%x)", -+                    lcdgr->cwidth * scale, lcdgr->cheight * scale); -+            return -1; -+        } -+ -+        last_font_size = font_size; -+    } -+ -+    // load the glyph and render it -+    err = FT_Load_Char(lcdgr->ft_normal_font, c, -+            FT_LOAD_RENDER | FT_LOAD_MONOCHROME); -+    if (err != 0) { -+        lcdgr_report(RPT_WARNING, "lcdgraphic_draw_char: loading char " -+                "'%c' (%d) failed", c, c); -+ -+        return -1; -+    } -+ -+    // clear the rectangle first -+    cwidth = lcdgr->cwidth * width; -+    cheight = lcdgr->cheight * scale; -+    for (col = 0; col < cwidth; col++) -+        for (row = 0; row < cheight; row++) -+            set_pixel_new(lcdgr, xoffset + col, yoffset + row, 0); -+ -+    // set some data elements for convenience -+    glyph = lcdgr->ft_normal_font->glyph; -+    bitmap = &glyph->bitmap; -+    bitmap_buf = bitmap->buffer; -+ -+    // and now copy the pixels -+    for (row = 0; row < bitmap->rows; row++) { -+        for (col = 0; col < bitmap->width; col++) { -+            int bitmap_left = glyph->bitmap_left; -+ -+            if (scale != width) -+                bitmap_left = (cwidth - bitmap->width)/2; -+ -+            set_pixel_new(lcdgr, xoffset + col + bitmap_left, -+                    yoffset + row + lcdgr->cheight + (face->size->metrics.descender >> 6) -+                    - glyph->bitmap_top, -+                    bitmap_buf[col/8] >> (7 - (col % 8)) & 1); -+        } -+        bitmap_buf += bitmap->pitch; -+    } -+ -+    return 0; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a character into the display buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the column (position in characters!) where the character -+//                  should be drawn -+// @param y         the line (position in characters!) where the character -+//                  should be drawn -+// @param c         the character that should be drawn -+// -+void lcdgraphic_draw_char(struct lcdgraphic *lcdgr, int x, int y, char c) -+{ -+    if (lcdgraphic_draw_char_unicode(lcdgr, x, y, c & 0xff, 1, 1) != 0) -+        lcdgraphic_draw_char_unicode(lcdgr, x, y, '?', 1, 1); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a big number into the display buffer. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x position -+// @param num       the actual number -+// -+void lcdgraphic_draw_num(struct lcdgraphic *lcdgr, int x, int num) -+{ -+    int y; -+    const int BIG_HEIGHT = 3; -+ -+    if (num < 0 || num > 10) { -+        lcdgr_report(RPT_WARNING, "lcdgraphic_draw_num: num out of range (%d)", num); -+        return; -+    } -+ -+    y = lcdgr->ychars - (lcdgr->ychars - BIG_HEIGHT + 1)/2; -+    if (num == 10) -+        lcdgraphic_draw_char_unicode(lcdgr, x, y, ':', BIG_HEIGHT, 1); -+    else -+        lcdgraphic_draw_char_unicode(lcdgr, x, y, '0' + num, BIG_HEIGHT, BIG_HEIGHT); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws an icon (which standard lcdproc icon syntax) -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x position of the icon -+// @param y         the y position of the icon -+// @param icon      the icon constant -+// -+// @return 0 on success, -1 on failure (i.e. the core replaces the icon by a -+//         suitable character -+// -+int lcdgraphic_icon(struct lcdgraphic *lcdgr, int x, int y, int icon) -+{ -+    int unicode; -+ -+    unicode = icon2unicode(icon); -+    if (unicode > 0) -+        return lcdgraphic_draw_char_unicode(lcdgr, x, y, unicode, 1, 1); -+    else -+        return -1; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a horizontal bar -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x position of the bar -+// @param y         the y position of the bar -+// @param len       the maximum length -+// @param promille  the current state -+// @param options -+// -+void lcdgraphic_hbar(struct lcdgraphic  *lcdgr, -+                     int                x, -+                     int                y, -+                     int                len, -+                     int                promille, -+                     int                options) -+{ -+    int startx, midx, endx, starty, endy; -+    int col, row; -+ -+    /* calculate positions */ -+    startx = lcdgr->bwidth + x*lcdgr->cwidth; -+    midx   = startx + promille * (len*lcdgr->cwidth) / 1000; -+    endx   = startx + len*lcdgr->cwidth; -+    starty = lcdgr->bheight + y*lcdgr->cheight; -+    endy   = starty + lcdgr->cheight - 1;  /* don't draw the last line */ -+ -+    for (col = startx; col < endx; col++) -+        for (row = starty; row < endy; row++) -+                set_pixel_new(lcdgr, col, row, col < midx); -+} -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a vertical bar -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// @param x         the x position of the bar -+// @param y         the y position of the bar -+// @param len       the maximum length -+// @param promille  the current state -+// @param options -+// -+void lcdgraphic_vbar(struct lcdgraphic  *lcdgr, -+                     int                x, -+                     int                y, -+                     int                len, -+                     int                promille, -+                     int                options) -+{ -+    int startx, endx, starty, midy, endy; -+    int col, row; -+ -+    /* calculation positions */ -+    startx = lcdgr->bwidth + x*lcdgr->cwidth; -+    endx   = startx + lcdgr->cwidth - 1; /* don't draw the last column */ -+    starty = lcdgr->bheight + (y + 1)*lcdgr->cheight - 1; -+    midy   = starty - promille * (len*lcdgr->cheight) / 1000; -+    endy   = starty - len*lcdgr->cheight; -+ -+    for (col = startx; col < endx; col++) -+        for (row = starty; row > endy; row--) -+            set_pixel_new(lcdgr, col, row, row > midy); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Flushes the output to the display. Uses the provided callback functions -+// of the underlying display. -+// -+// @param lcdgr     a pointer to a valid lcdgraphic structure -+// -+void lcdgraphic_flush(struct lcdgraphic *lcdgr) -+{ -+    int x, y; -+ -+    if (lcdgr->all_dirty) -+        lcdgr->funcs.clear(lcdgr->drv); -+ -+    for (y = 0; y < lcdgr->height; y++) { -+        for (x = 0; x < lcdgr->width; x++) { -+            int val = get_pixel_new(lcdgr, x, y); -+ -+            if (lcdgr->all_dirty || -+                    (val != get_pixel_disp(lcdgr, x, y)) ) { -+                lcdgr->funcs.setpixel(lcdgr->drv, x, y, val); -+                set_pixel_disp(lcdgr, x, y, val); -+            } -+        } -+    } -+ -+    lcdgr->funcs.flush(lcdgr->drv); -+    lcdgr->all_dirty = 0; -+} -+ -+// vimx: set sw=4 ts=4 et: ---- /dev/null -+++ b/server/drivers/lcdgraphic.h -@@ -0,0 +1,195 @@ -+// Description: -+ -+/*  Copyright (C) 2007 Bernhard Walle <bernhard.walle@gmx.de> -+ -+    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 -+    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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ -+ -+#ifndef LCDGRAPHIC_H -+#define LCDGRAPHIC_H -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <unistd.h> -+#include <termios.h> -+#include <fcntl.h> -+#include <string.h> -+#include <errno.h> -+#include <syslog.h> -+#include <iconv.h> -+ -+#ifdef HAVE_CONFIG_H -+# include "config.h" -+#endif -+ -+#include <ft2build.h> -+#include FT_FREETYPE_H -+ -+#include <serdisplib/serdisp.h> -+ -+ -+#include "lcd.h" -+#include "report.h" -+#include "timing.h" -+ -+/////////////////////////////////////////////////////////////////////////////// -+// constants -+// -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Unicode characters -+// -+ -+#define UNICODE_BLOCK_FILLED        0x2588 -+#define UNICODE_HEART_OPEN		    0x2661 -+#define UNICODE_HEART_FILLED	    0x2665 -+#define UNICODE_ARROW_UP		    0x2191 -+#define UNICODE_ARROW_DOWN  	    0x2193 -+#define UNICODE_ARROW_LEFT  	    0x2190 -+#define UNICODE_ARROW_RIGHT         0x2192 -+#define UNICODE_CHECKBOX_OFF        -1          /* -1 == not implemented */ -+#define UNICODE_CHECKBOX_ON         -1 -+#define UNICODE_CHECKBOX_GRAY       -1 -+#define UNICODE_SELECTOR_AT_LEFT    -1 -+#define UNICODE_SELECTOR_AT_RIGHT   -1 -+#define UNICODE_ELLIPSIS            -1 -+ -+/////////////////////////////////////////////////////////////////////////////// -+// These are callback functions that the low level driver must provide -+// -+struct lcdgraphic_functions { -+ -+    // sets the colour of a pixel -+    void (*setpixel)(Driver *drvthis, int x, int y, int pixel); -+ -+    // clears the whole display -+    void (*clear)(Driver *drvthis); -+ -+    // flushes the display -+    void (*flush)(Driver *drvthis); -+}; -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// That structure should be passed by the user, while struct lcdgraphic is -+// entirely private to the library -+struct lcdgraphic_settings { -+ -+    // the width and the height (in number of pixels) of the display -+	int width, height; -+ -+    // the width and the height of one character -+    int cwidth, cheight; -+ -+    // defines unused area on the display (border width / border height) -+    int bwidth, bheight; -+ -+    // that's the cookie that is passed to the callback functions -+    // it's also used for reporting errors -+    Driver *drv; -+ -+    // font file used for normal characters (TTF, must be monospaced) -+    char normal_font[PATH_MAX]; -+}; -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Private structure for drivers that use the functions of that library. -+// Don't access the members by hand here. -+// -+struct lcdgraphic { -+ -+    // --- public members from the structure above ----- -+ -+    // the width and the height (in number of pixels) of the display -+	int width, height; -+ -+    // the width and the height of one character -+    int cwidth, cheight; -+ -+    // defines unused area on the display (border width / border height) -+    int bwidth, bheight; -+ -+    // that's the cookie that is passed to the callback functions -+    // it's also used for reporting errors -+    Driver *drv; -+ -+    // font file used for normal characters (TTF, must be monospaced) -+    char normal_font[PATH_MAX]; -+ -+    // a set of callback functions -+    struct lcdgraphic_functions funcs; -+ -+    // --- private members ----- -+ -+    // the framebuffer that's actually displayed -+    int *disp_buffer; -+ -+    // the buffer that shows the contents of the next update but wasn't -+    // flushed yet -+    int *new_buffer; -+ -+    // (calculated) convenience value because we need that often -+    int num_pixels; -+ -+    // (calculated) number of characters in both directions -+    int xchars, ychars; -+ -+    // all buffers are dirty, i.e. update all -+    int all_dirty; -+ -+    // freetype library handle -+    FT_Library ft_library; -+ -+    // handle for the normal font -+    FT_Face ft_normal_font; -+ -+    // handle for charset convertions -+    iconv_t iconv_handle; -+}; -+ -+// Forward declarations for 'clients' -+ -+int lcdgraphic_init(struct lcdgraphic              *lcdgr, -+                    struct lcdgraphic_settings     *settings, -+                    struct lcdgraphic_functions    *functions); -+ -+int lcdgraphic_width(struct lcdgraphic *lcdgr); -+int lcdgraphic_height(struct lcdgraphic *lcdgr); -+void lcdgraphic_destroy(struct lcdgraphic *lcdgr); -+void lcdgraphic_clear(struct lcdgraphic *lcdgr); -+void lcdgraphic_flush(struct lcdgraphic *lcdgr); -+void lcdgraphic_draw_string(struct lcdgraphic *lcdgr, int x, int y, char *str); -+void lcdgraphic_draw_char(struct lcdgraphic *lcdgr, int x, int y, char c); -+void lcdgraphic_draw_num(struct lcdgraphic *lcdgr, int x, int num); -+int lcdgraphic_icon(struct lcdgraphic *lcdgr, int x, int y, int icon); -+ -+void lcdgraphic_hbar(struct lcdgraphic  *lcdgr, -+                     int                x, -+                     int                y, -+                     int                len, -+                     int                promille, -+                     int                options); -+ -+void lcdgraphic_vbar(struct lcdgraphic  *lcdgr, -+                     int                x, -+                     int                y, -+                     int                len, -+                     int                promille, -+                     int                options); -+ -+#endif /* LCDGRAPHIC_H */ -+ -+// vim: set sw=4 ts=4 et: ---- /dev/null -+++ b/server/drivers/serdisplib.c -@@ -0,0 +1,379 @@ -+// Description: -+ -+/*  Copyright (C) 2007 Bernhard Walle <bernhard.walle@gmx.de> -+ -+    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 -+    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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <unistd.h> -+#include <termios.h> -+#include <fcntl.h> -+#include <string.h> -+#include <errno.h> -+#include <limits.h> -+#include <syslog.h> -+ -+#include <serdisplib/serdisp.h> -+ -+#ifdef HAVE_CONFIG_H -+# include "config.h" -+#endif -+ -+#include "lcd.h" -+#include "report.h" -+#include "timing.h" -+#include "lcdgraphic.h" -+ -+/* Vars for the server core */ -+MODULE_EXPORT char *api_version = API_VERSION; -+MODULE_EXPORT int stay_in_foreground = 0; -+MODULE_EXPORT int supports_multiple = 1; -+MODULE_EXPORT char *symbol_prefix = "serdisplib_"; -+ -+/////////////////////////////////////////////////////////////////////////////// -+// constants -+// -+#define SERDISPLIB_MAX_DISPLAYNAME      32 -+#define SERDISPLIB_MAX_DEVICENAME       PATH_MAX -+ -+/////////////////////////////////////////////////////////////////////////////// -+// private data types -+// -+typedef struct { -+ -+    // the name of the display driver in serdisplib, e.g. 'ctinclud' -+    char display_name[SERDISPLIB_MAX_DISPLAYNAME]; -+ -+    // the name of the device in serdisplib, e.g. /dev/parport0 -+    char display_device[SERDISPLIB_MAX_DEVICENAME]; -+ -+    // the serdisplib connection handle -+    serdisp_CONN_t* serdisplib_conn; -+ -+    // the serdisplib handle -+    serdisp_t *serdisplib; -+ -+    // invert the display -+    int invert; -+ -+    // the lcdgraphic handle -+    struct lcdgraphic *lcdgraphic; -+ -+} PrivateData; -+ -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Callback functions -+// -+ -+static void callback_setpixel(Driver *drvthis, int x, int y, int pixel) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    serdisp_setcolour(p->serdisplib, x, y, pixel ? SD_COL_BLACK : SD_COL_WHITE); -+} -+ -+static void callback_clear(Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    serdisp_clearbuffer(p->serdisplib); -+} -+ -+static void callback_flush(Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    serdisp_update(p->serdisplib); -+} -+ -+struct lcdgraphic_functions lcdgraphic_functions = { -+    .setpixel       = callback_setpixel, -+    .clear          = callback_clear, -+    .flush          = callback_flush -+}; -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Init the driver and display -+// -+MODULE_EXPORT int -+serdisplib_init(Driver *drvthis) -+{ -+    PrivateData *p; -+    int ret; -+    struct lcdgraphic_settings settings; -+    const char *s; -+ -+    // Alocate and store private data -+    p = (PrivateData *) malloc(sizeof(PrivateData)); -+    if (!p) -+        return -1; -+    if (drvthis->store_private_ptr(drvthis, p)) -+        return -1; -+    memset(p, 0, sizeof(PrivateData)); -+ -+    // get the display name -+    s = drvthis->config_get_string(drvthis->name, "display_name", 0, NULL); -+    if (!s) { -+        report(RPT_ERR, "You must specify display_name in configuration"); -+        goto out; -+    } -+    strncpy(p->display_name, s, SERDISPLIB_MAX_DISPLAYNAME); -+    p->display_name[SERDISPLIB_MAX_DISPLAYNAME-1] = 0; -+ -+    // get the display device -+    s = drvthis->config_get_string(drvthis->name, "display_device", 0, NULL); -+    if (!s) { -+        report(RPT_ERR, "You must specify display_device in configuration"); -+        goto out; -+    } -+    strncpy(p->display_device, s, SERDISPLIB_MAX_DEVICENAME); -+    p->display_device[SERDISPLIB_MAX_DEVICENAME-1] = 0; -+ -+    // get the normal font -+    s = drvthis->config_get_string(drvthis->name, "normal_font", 0, NULL); -+    if (!s) { -+        report(RPT_ERR, "You must specify normal_font in configuration"); -+        goto out; -+    } -+    strncpy(settings.normal_font, s, PATH_MAX); -+    settings.normal_font[PATH_MAX-1] = 0; -+ -+    // character size -+    s = drvthis->config_get_string(drvthis->name, "char_size", 0, "6x10"); -+    if (!s) { -+        report(RPT_ERR, "Could not retrieve char_size from configuration"); -+        goto out; -+    } -+    if (sscanf(s, "%dx%d", &settings.cwidth, &settings.cheight) != 2) { -+        report(RPT_ERR, "Could not scan '%s' correctly", s); -+        goto out; -+    } -+ -+    // border size -+    s = drvthis->config_get_string(drvthis->name, "border_size", 0, "0x0"); -+    if (!s) { -+        report(RPT_ERR, "Could not retrieve border size from configuration"); -+        goto out; -+    } -+    if (sscanf(s, "%dx%d", &settings.bwidth, &settings.bheight) != 2) { -+        report(RPT_ERR, "Could not scan '%s' correctly", s); -+        goto out; -+    } -+ -+    // invert -+    p->invert = drvthis->config_get_bool(drvthis->name, "invert", 0, 1); -+ -+ -+    /* End of config file parsing */ -+ -+    // opening the output device */ -+    p->serdisplib_conn = SDCONN_open(p->display_device); -+    if (!p->serdisplib_conn) { -+        report(RPT_ERR, "Could not open %s: %s", p->display_device, -+                sd_geterrormsg()); -+        goto out; -+    } -+ -+    // opening and initialising the display -+    p->serdisplib = serdisp_init(p->serdisplib_conn, p->display_name, ""); -+    if (!p->serdisplib) { -+        report(RPT_ERR, "Error opening display %s: %s\n", p->display_name, -+                sd_geterrormsg()); -+        goto out; -+    } -+ -+    // invert settings -+    serdisp_setoption(p->serdisplib, "INVERT", p->invert -+            ? SD_OPTION_YES : SD_OPTION_NO); -+ -+    // allocate lcdgraphic handle -+    p->lcdgraphic = (struct lcdgraphic *)malloc(sizeof(struct lcdgraphic)); -+    if (!p->lcdgraphic) { -+        report(RPT_ERR, "Not enough memory to allocate struct lcdgraphic"); -+        goto out; -+    } -+ -+    // register at the lcdgraphic backend -+    settings.width = serdisp_getwidth(p->serdisplib); -+    settings.height = serdisp_getheight(p->serdisplib); -+    settings.drv = drvthis; -+ -+    ret = lcdgraphic_init(p->lcdgraphic, &settings, &lcdgraphic_functions); -+    if (ret != 0) { -+        report(RPT_ERR, "Error registering at lcdgraphic subsystem"); -+        goto out; -+    } -+ -+    return 0; -+ -+out: -+    if (p->serdisplib_conn && !p->serdisplib) -+        SDCONN_close(p->serdisplib_conn); -+    if (p->serdisplib) -+        serdisp_quit(p->serdisplib); -+    drvthis->store_private_ptr(drvthis, NULL); -+    free(p); -+ -+    return -1; -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Clean-up -+// -+MODULE_EXPORT void -+serdisplib_close(Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    if (p) { -+        if (p->serdisplib) -+            serdisp_quit(p->serdisplib); -+        if (p->lcdgraphic) -+            lcdgraphic_destroy(p->lcdgraphic); -+    } -+    drvthis->store_private_ptr(drvthis, NULL); -+    free(p); -+} -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Returns the display width -+// -+MODULE_EXPORT int -+serdisplib_width (Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    return lcdgraphic_width(p->lcdgraphic); -+} -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Returns the display height -+// -+MODULE_EXPORT int -+serdisplib_height (Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    return lcdgraphic_height(p->lcdgraphic); -+} -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Clear the framebuffer -+// -+MODULE_EXPORT void -+serdisplib_clear (Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_clear(p->lcdgraphic); -+} -+ -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Place a character in the framebuffer -+// -+MODULE_EXPORT void -+serdisplib_chr (Driver *drvthis, int x, int y, char ch) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_draw_char(p->lcdgraphic, x - 1, y - 1, ch); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Place a string in the framebuffer -+// -+MODULE_EXPORT void -+serdisplib_string (Driver *drvthis, int x, int y, char *s) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_draw_string(p->lcdgraphic, x - 1, y - 1, s); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Place a big number in the framebuffer -+// -+MODULE_EXPORT void -+serdisplib_num (Driver *drvthis, int x, int num) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_draw_num(p->lcdgraphic, x - 1, num); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Sets the backlight on or off -+// -+MODULE_EXPORT void -+serdisplib_backlight (Driver *drvthis, int on) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    serdisp_setoption(p->serdisplib, "BACKLIGHT", on ? SD_OPTION_YES : SD_OPTION_NO); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Flush the framebuffer to the display -+// -+MODULE_EXPORT void -+serdisplib_flush(Driver *drvthis) -+{ -+	PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_flush(p->lcdgraphic); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Set default icon into a userdef char -+// -+MODULE_EXPORT int -+serdisplib_icon(Driver *drvthis, int x, int y, int icon) -+{ -+    PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    return lcdgraphic_icon(p->lcdgraphic, x - 1, y - 1, icon); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a horizontal bar -+// -+MODULE_EXPORT void -+serdisplib_hbar(Driver *drvthis, int x, int y, int len, int promille, int options) -+{ -+    PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_hbar(p->lcdgraphic, x - 1, y - 1, len, promille, options); -+} -+ -+/////////////////////////////////////////////////////////////////////////////// -+// Draws a vertical bar -+// -+MODULE_EXPORT void -+serdisplib_vbar(Driver *drvthis, int x, int y, int len, int promille, int options) -+{ -+    PrivateData *p = (PrivateData *) drvthis->private_data; -+ -+    lcdgraphic_vbar(p->lcdgraphic, x - 1, y - 1, len, promille, options); -+} -+ -+ -+// vim: set sw=4 ts=4 et: ---- a/LCDd.conf -+++ b/LCDd.conf -@@ -40,7 +40,8 @@ - #   EyeboxOne, g15, glcdlib, glk, hd44780, icp_a106, imon, IOWarrior, - #   irman, joy, lb216, lcdm001, lcterm, lirc, MD8800, ms6931, mtc_s16209x, - #   MtxOrb, NoritakeVFD, picolcd, pyramid, sed1330, sed1520, serialPOS, --#   serialVFD, sli, stv5730, svga, t6963, text, tyan, ula200, xosd -+#   serialVFD, sli, stv5730, svga, t6963, text, tyan, ula200, serdisplib, -+#   xosd - Driver=curses -  - # Tells the driver to bind to the given interface -@@ -931,6 +932,31 @@ Size=20x4 - # KeyMap_E=Enter - # KeyMap_F=Escape -  -+## serdisplib meta-driver for dot-matrix displays ## -+[serdisplib] -+ -+# the underlying serdisplib driver, e.g. ctinclud -+display_name=ctinclud -+ -+# the display device, e.g. serraw:/dev/ttyS0, parport:/dev/parport0 -+# or USB:07c0/1501 (vendor ID, device ID) -+display_device=USB:07c0/1501 -+ -+# the font which is used for rendering, this font must be monospace -+# and should contain some special Unicode characters like arrows -+# (Andale Mono is recommended and can be fetched at -+# http://corefonts.sf.net or from a Windows installation) -+normal_font=/usr/share/fonts/truetype/andalemo.ttf -+ -+# invert the display (black => white, white => black) -+invert=0 -+ -+# the size of one characters, the number of characters is calculated -+# automatically from this and from border_size (see below) -+char_size=6x10 -+ -+# size of the border around the drawing area -+border_size=0 -  -  - ## Wirz SLI LCD driver ## diff --git a/abs/extra/lcdproc/lcdproc.install b/abs/extra/lcdproc/lcdproc.install deleted file mode 100644 index bd3c85e..0000000 --- a/abs/extra/lcdproc/lcdproc.install +++ /dev/null @@ -1,7 +0,0 @@ -post_install() { -      add_service.sh lcdd -} - -pre_remove() { -      remove_service.sh lcdd -} | 
