summaryrefslogtreecommitdiffstats
path: root/abs/extra/lcdproc
diff options
context:
space:
mode:
Diffstat (limited to 'abs/extra/lcdproc')
-rw-r--r--abs/extra/lcdproc/PKGBUILD52
-rw-r--r--abs/extra/lcdproc/__changelog4
-rwxr-xr-xabs/extra/lcdproc/lcdd38
-rw-r--r--abs/extra/lcdproc/lcdproc-add-serdisplib1353
-rw-r--r--abs/extra/lcdproc/lcdproc.install7
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
-}