Drivers are now being loaded as modules.

This commit is contained in:
robijn
2002-02-21 22:50:12 +00:00
parent ca5f3d1f37
commit dba163c4a4
61 changed files with 702 additions and 2270 deletions
+83 -63
View File
@@ -13,45 +13,51 @@ First read the README if you haven't already.
In order to compile LCDproc, you'll need: In order to compile LCDproc, you'll need:
an ANSI C compiler, we recommend GCC. Most Linux or BSD systems come an ANSI C compiler, we recommend GCC. Most Linux or BSD systems come
with GCC. with GCC.
GNU Make, Most Linux come with GNU Make, on some BSD you will need to GNU Make. It is available for all major distributions. If you want to
install it. See the PLATFORM SPECIFIC section for more infos. compile it yourself, see http://www.gnu.org/software/make/make.html .
The GNU autotools, that is automake and autoconf. It is available for
all major distributions. If you want to compile it yourself, see
http://sources.redhat.com/automake/ and
http://sources.redhat.com/autoconf/ .
LCDproc is in fact two things, a client (lcdproc) and a server (LCDd). LCDproc is in fact two things, a client (lcdproc) and a server (LCDd).
The client gathers informations and sends them to the server. The client gathers informations and sends them to the server.
The server displays the informations on an LCD display. The server displays the informations on an LCD display.
The client and the server use a TCP connection to communicate, so it is The client and the server use a TCP connection to communicate, so it is
possible to have a client on a box in Sweden showing its stats on a LCD possible to have a client on a box in Sweden showing its stats on a LCD
display in the United States. For hardware reasons, the client is much display in the United States.
more portable than the server. Here's are the prerequistes for both:
--- Client --- -- DISPLAYS -----------------------------------------------------------
The client should run on any POSIX compliant system.
It has been sucessfully tested on:
Linux 2.2.x, Linux 2.4.x, NetBSD 1.5, OpenBSD 3.0
In the future want it to run on Windows, MacOS and others.
--- Server --- Many different displays (or better said: output devices) are supported.
The server needs to talk with the LCD display. At this time, it only works Some of these devices also support input, for example with a keypad.
on Intel i386 (PC Compatible) architecture. There are drivers for input-only devices too.
It has been sucessfully tested on:
Linux 2.2.x, Linux 2.4.x, NetBSD 1.5, OpenBSD 3.0
Connecting the display to your system For LCDd (the server) to use the device, it needs to load a driver. The
drivers are so called 'shared modules', that usually have an extension
of .so . The drivers to be loaded should be specified in the config file
(by one or more Driver= lines), or on the command line. The command line
should only be used to override things in the config file. The drivers
should be in a directory that is indicated by the DriverPath= line in
the configfile.
Depending on what kind of LCD display that you have, there are several Depending on what kind of LCD display that you have, there are several
sources for informations. If your LCD display came with a manual, this sources for informations. If your LCD display came with a manual, this
is a great place to start. If you don't have a manual, then you must find is a great place to start. If you don't have a manual, then you must
out what kind of display this is, and check the related informations: find out what kind of display this is, and check the related
informations:
HD44780 and compatible: http://robijn.net/lcdproc/ HD44780 and compatible: read docs/hd44780-howto.txt
or alternatively see http://www.robijn.net/lcdproc/
STV5730: http://www.adams-online.de/lcd/ STV5730: http://www.adams-online.de/lcd/
SED1520: http://www.adams-online.de/lcd/ SED1520: http://www.adams-online.de/lcd/
Also take a look at the comments in the driver source code in Also take a look at the comments in the driver source code in
server/drivers. You may have some good indications there. server/drivers. You may have some good indications there.
You may want to take a look at LCDproc's hardware page at You may want to take a look at LCDproc's hardware page at
@@ -72,22 +78,22 @@ And read the available options, especially --enable-drivers
Run make to build the server and all clients Run make to build the server and all clients
make make
If you only want to compile the clients, you can omit to compile the If you only want to compile the clients, you can omit to compile the
server: server:
cd shared cd shared
make make
cd ../clients cd ../clients
make make
Similarly, if you only want to compile the server, you can omit to Similarly, if you only want to compile the server, you can omit to
compile the clients: compile the clients:
cd shared cd shared
make make
cd ../server cd ../server
make make
Depending on your system, LCDproc will build in a few seconds to a Depending on your system, LCDproc will build in a few seconds to a
few minutes. It's not very big. few minutes. It's not very big.
If you want, you can install it (if you're root) by typing: If you want, you can install it (if you're root) by typing:
make install make install
@@ -97,46 +103,59 @@ specified in configure.
-- PLATFORM SPECIFIC ------------------------------------------------ -- PLATFORM SPECIFIC ------------------------------------------------
The lcdproc crew has tried to support a number of platforms. Platforms
that are very non-standard are not and will probably never be supported.
Both server & drivers and clients have their own difficulties in
porting. Here's are the prerequistes for both:
--- Client ---
The client should run on any POSIX compliant system.
It has been sucessfully tested on:
Linux 2.2.x, Linux 2.4.x, NetBSD 1.5, OpenBSD 3.0
In the future want it to run on Windows, MacOS and others.
--- Server ---
The server needs to talk with the LCD display. At this time, it works
on very little more than on the Intel i386 (PC Compatible)
architecture. It has been sucessfully tested on:
Linux 2.2.x, Linux 2.4.x, NetBSD 1.5, OpenBSD 3.0
Here are some comments specific to each platform that LCDproc has been Here are some comments specific to each platform that LCDproc has been
tested on. tested on.
--- Linux --- --- Linux ---
Nothing special to say, everything should go well. Nothing special to say, everything should go well.
You may be able to compile the server on something else than i386 if your You may not be able to compile all drivers on something else than i386
linux installation can emulate ioperm, inb and outb commands. I heared if your linux installation does not have ioperm, inb and outb commands.
that some Alpha do that. I heared that some Alpha do that. You can leave all parallel port
drivers out and it should compile again.
--- NetBSD --- --- NetBSD ---
You need to use GUN Make instead of NetBSD's make. You need to use GUN Make instead of NetBSD's make.
You can find a GNU Make binary package to use with pkg_add at:
ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/devel/gmake/README.html
Or download the source code at:
http://www.gnu.org/software/make/make.html
Remember to type gmake instead of make to compile LCDproc. Remember to type gmake instead of make to compile LCDproc.
The server will probably only compile on NetBSD/i386.
If you try to run LCDd and you get this error: If you try to run LCDd and you get this error:
Bus error (core dumped) Bus error (core dumped)
It is likely that you did not have the right permission to access the ports. It is likely that you did not have the right permission to access the
ports.
Try starting the program as root. Try starting the program as root.
As said ealier, the server should only compile on NetBSD/i386.
--- OpenBSD --- --- OpenBSD ---
You need to use GUN Make instead of OpenBSD's make. You need to use GUN Make instead of OpenBSD's make.
You can find a GNU Make binary package to use with pkg_add at: Remember to type gmake instead of make to compile LCDproc.
ftp://ftp.openbsd.org/pub/OpenBSD/3.0/packages/i386/ The server will probably only compile on NetBSD/i386.
Or download the source code at:
http://www.gnu.org/software/make/make.html
As said ealier, the server should only compile on i386.
--- FreeBSD --- --- FreeBSD ---
(not tested yet) It will compile fine on i386.
--- Other platforms ---
If the build process fails, but you do know how to link a loadable
module by hand, you can add the appropriate flags etcetera into
acinclude.m4. Experience required. Please let us know if you got it
working on a previously unsupported system, so we can include it in a
next release.
-- RUNNING LCDPROC ----------------------------------------------------- -- RUNNING LCDPROC -----------------------------------------------------
@@ -152,20 +171,21 @@ to do.
If you're in the LCDproc source directory, and have just built it, run: If you're in the LCDproc source directory, and have just built it, run:
server/LCDd -c path/to/config/file server/LCDd -c path/to/config/file
You can find out what drivers were compiled by running "LCDd -h". For some extra options useful while testing things, try "LCDd -h".
Note that you cannot use more than one display driver at the same time.
For security reasons, LCDd only accept connections from the For security reasons, LCDd only accept connections from the
localhost, it will not accept connections from other computers on localhost, it will not accept connections from other computers on
the Internet. You can change this behavior in the configuration file. the Internet. You can change this behavior in the configuration file.
--- Starting the client(s) --- --- Starting the client(s) ---
Then, you'll need some clients. LCDproc comes with one: Then, you'll need some clients. LCDproc comes with a few, of which the
'lcdproc' client is the main client:
clients/lcdproc/lcdproc C M T X & clients/lcdproc/lcdproc C M T X &
This will run the main LCDproc client, with the [C]pu, [M]emory, This will run the LCDproc client, with the [C]pu, [M]emory,
[T]ime, and [X]load screens. The ampersand (&) puts it in the background. [T]ime, and [X]load screens. The ampersand (&) puts it in the
background.
By default, the client tries to connect to a server located on localhost By default, the client tries to connect to a server located on localhost
and listening to port 13666. To change this, use the -s and -p options. and listening to port 13666. To change this, use the -s and -p options.
@@ -184,8 +204,8 @@ In Debian:
- Make a file "/etc/init.d/lcd" which works the same as the - Make a file "/etc/init.d/lcd" which works the same as the
other scripts in that directory. (it should accept "start" other scripts in that directory. (it should accept "start"
and "stop" as parameters...) and "stop" as parameters...)
- To start, run "LCDd" with any necessary parameters. It will - To start, run "LCDd" with any necessary parameters. If possible
put itself in the background as a daemon. it will put itself in the background as a daemon.
- Also in the "start" section, add "lcdproc" with some - Also in the "start" section, add "lcdproc" with some
parameters. Be sure to put a "&" on the end, or the system parameters. Be sure to put a "&" on the end, or the system
will get stuck there when you boot. will get stuck there when you boot.
@@ -194,17 +214,17 @@ In Debian:
started in the "start" section. They will shut down and exit. started in the "start" section. They will shut down and exit.
I recommend killing the server after all the clients, but it I recommend killing the server after all the clients, but it
really doesn't matter much. really doesn't matter much.
- Run (as root): update-rc.d lcd defaults
This will create symlinks to start and stop the daemon, resp.
from /etc/rc[2-5].d/S50lcd to /etc/init.d/lcd, and from
/etc/rc[016].d/K50lcd to /etc/init.d/lcd.
- Now, add symlinks from /etc/rc[2-5].d/S50lcd to /etc/init.d/lcd, That's all the distributions we've actually done this with so far..
and be sure to get /etc/rc[06].d/K50lcd to /etc/init.d/lcd.
This will cause LCDproc to shut down when your system does.
That's all the OS`s we've actually done this with so far.. -- WEB SITE ------------------------------------------------------------
-- WEB SITE -------------------------------------------------------------
Visit http://lcdproc.omnipotent.net/ for the latest updates and news Visit http://lcdproc.omnipotent.net/ for the latest updates and news
for LCDproc. If you've got comments, suggestions, bug fixes, or for LCDproc. If you've got comments, suggestions, bug fixes, or
problems (related to LCDproc, not women ;), send e-mail to either problems (related to LCDproc, not women ;), send e-mail to either
William W. Ferrell (willfe@yahoo.com) or Scott Scriven William W. Ferrell (willfe@yahoo.com) or Scott Scriven
(toykeeper@cheerful.com). (toykeeper@cheerful.com).
+7
View File
@@ -71,6 +71,10 @@ ServerScreen=no
Foreground=yes Foreground=yes
# The server will stay in the foreground if set to true. # The server will stay in the foreground if set to true.
DriverPath=server/drivers/
# Where can we find the driver modules ?
# Always place a slash as last character !
# Driver sections are below this line, in alphabetical order # Driver sections are below this line, in alphabetical order
@@ -113,6 +117,7 @@ NewFirmware=no
Reboot=no Reboot=no
[curses] [curses]
file=curses_drv.so
# Curses driver # Curses driver
# color settings # color settings
@@ -313,6 +318,8 @@ Arguments="fill in here"
#Port=0x378 #Port=0x378
#Size=20x6 #Size=20x6
[text] [text]
# Text driver # Text driver
+6 -30
View File
@@ -18,14 +18,6 @@
/* Leave the following blank line there!! Autoheader needs it. */ /* Leave the following blank line there!! Autoheader needs it. */
#undef LIRCIN_DRV
#undef BAYRAD_DRV
#undef CFONTZ_DRV
#undef CURSES_DRV
#undef CURSES_HAS__ACS_CHAR #undef CURSES_HAS__ACS_CHAR
#undef CURSES_HAS_ACS_MAP #undef CURSES_HAS_ACS_MAP
@@ -38,16 +30,6 @@
#undef DEFINED_ACS #undef DEFINED_ACS
#undef GLK_DRV
#undef HD44780_DRV
#undef IRMANIN_DRV
#undef JOY_DRV
#undef LB216_DRV
#undef LCDPORT #undef LCDPORT
#undef LINUX #undef LINUX
@@ -56,18 +38,6 @@
#undef LOAD_MIN #undef LOAD_MIN
#undef MTXORB_DRV
#undef LCDM001_DRV
#undef SED1330_DRV
#undef SED1520_DRV
#undef STV5730_DRV
#undef T6963_DRV
/* Define the package name */ /* Define the package name */
#undef PACKAGE #undef PACKAGE
@@ -76,6 +46,8 @@
#undef API_VERSION #undef API_VERSION
#undef MODULE_EXTENSION
#undef SLI_DRV #undef SLI_DRV
#undef SOLARIS #undef SOLARIS
@@ -84,6 +56,10 @@
#undef STAT_SMBFS #undef STAT_SMBFS
/* Define for AIX if your compiler is a genuine IBM xlC/xlC_r
and you want support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS
/* two-argument statfs with statfs.bsize member (AIX, 4.3BSD) */ /* two-argument statfs with statfs.bsize member (AIX, 4.3BSD) */
#undef STAT_STATFS2_BSIZE #undef STAT_STATFS2_BSIZE
+132 -73
View File
@@ -9,11 +9,11 @@ AC_ARG_ENABLE(drivers,
[ hd44780,joy,irman,lircin,bayrad,glk,] [ hd44780,joy,irman,lircin,bayrad,glk,]
[ stv5730,sed1330,sed1520,svgalib,lcdm001,t6963] [ stv5730,sed1330,sed1520,svgalib,lcdm001,t6963]
[ \"all\" compiles all drivers], [ \"all\" compiles all drivers],
drivers="$enableval", drivers="$enableval",
drivers=[lcdm001,mtxorb,cfontz,curses,text,lb216,bayrad,glk]) drivers=[lcdm001,mtxorb,cfontz,curses,text,lb216,bayrad,glk])
if test "$drivers" = "all"; then if test "$drivers" = "all"; then
drivers=[mtxorb,cfontz,curses,text,lb216,hd44780,joy,irman,lircin,bayrad,glk,stv5730,sed1330,sed1520,svgalib,lcdm001,t6963] drivers=[mtxorb,cfontz,curses,text,lb216,hd44780,joy,irman,lirc,bayrad,glk,stv5730,sed1330,sed1520,svgalib,lcdm001,t6963]
fi fi
drivers=`echo $drivers | sed 's/,/ /g'` drivers=`echo $drivers | sed 's/,/ /g'`
@@ -22,43 +22,36 @@ fi
case "$driver" in case "$driver" in
lcdm001) lcdm001)
DRIVERS="$DRIVERS lcdm001.o" DRIVERS="$DRIVERS lcdm001${SO}"
AC_DEFINE(LCDM001_DRV)
actdrivers=["$actdrivers lcdm001"] actdrivers=["$actdrivers lcdm001"]
;; ;;
mtxorb) mtxorb)
DRIVERS="$DRIVERS MtxOrb.o" DRIVERS="$DRIVERS MtxOrb${SO}"
AC_DEFINE(MTXORB_DRV)
actdrivers=["$actdrivers mtxorb"] actdrivers=["$actdrivers mtxorb"]
;; ;;
glk) glk)
DRIVERS="$DRIVERS glk.o glkproto.o" DRIVERS="$DRIVERS glk${SO}"
AC_DEFINE(GLK_DRV)
actdrivers=["$actdrivers glk"] actdrivers=["$actdrivers glk"]
;; ;;
bayrad) bayrad)
DRIVERS="$DRIVERS bayrad.o" DRIVERS="$DRIVERS bayrad${SO}"
AC_DEFINE(BAYRAD_DRV)
actdrivers=["$actdrivers bayrad"] actdrivers=["$actdrivers bayrad"]
;; ;;
cfontz) cfontz)
DRIVERS="$DRIVERS CFontz.o" DRIVERS="$DRIVERS CFontz${SO}"
AC_DEFINE(CFONTZ_DRV)
actdrivers=["$actdrivers cfontz"] actdrivers=["$actdrivers cfontz"]
;; ;;
sli) sli)
DRIVERS="$DRIVERS wirz-sli.o" DRIVERS="$DRIVERS wirz-sli${SO}"
AC_DEFINE(SLI_DRV)
actdrivers=["$actdrivers sli"] actdrivers=["$actdrivers sli"]
;; ;;
curses) curses)
AC_CHECK_HEADERS(ncurses.h curses.h) AC_CHECK_HEADERS(ncurses.h curses.h)
AC_CHECK_LIB(ncurses, main, AC_CHECK_LIB(ncurses, main,
AC_CHECK_HEADER(ncurses.h, AC_CHECK_HEADER(ncurses.h,
dnl We have ncurses.h and libncurses, add driver. dnl We have ncurses.h and libncurses, add driver.
LIBCURSES="-lncurses" LIBCURSES="-lncurses"
DRIVERS="$DRIVERS curses_drv.o" DRIVERS="$DRIVERS curses_drv${SO}"
AC_DEFINE(CURSES_DRV)
actdrivers=["$actdrivers curses"] actdrivers=["$actdrivers curses"]
, ,
dnl else dnl else
@@ -66,12 +59,11 @@ dnl else
) )
, ,
dnl else dnl else
AC_CHECK_LIB(curses, main, AC_CHECK_LIB(curses, main,
AC_CHECK_HEADER(curses.h, AC_CHECK_HEADER(curses.h,
dnl We have curses.h and libcurses, add driver. dnl We have curses.h and libcurses, add driver.
LIBCURSES="-lcurses" LIBCURSES="-lcurses"
DRIVERS="$DRIVERS curses_drv.o" DRIVERS="$DRIVERS curses_drv${SO}"
AC_DEFINE(CURSES_DRV)
actdrivers=["$actdrivers curses"] actdrivers=["$actdrivers curses"]
, ,
dnl else dnl else
@@ -82,9 +74,9 @@ dnl else
AC_MSG_WARN([The curses driver needs the curses (or ncurses) library.]), AC_MSG_WARN([The curses driver needs the curses (or ncurses) library.]),
) )
) )
AC_CURSES_ACS_ARRAY AC_CURSES_ACS_ARRAY
AC_CACHE_CHECK([for redrawwin() in curses], ac_cv_curses_redrawwin, AC_CACHE_CHECK([for redrawwin() in curses], ac_cv_curses_redrawwin,
[oldlibs="$LIBS" [oldlibs="$LIBS"
LIBS="$LIBS $LIBCURSES" LIBS="$LIBS $LIBCURSES"
@@ -94,7 +86,7 @@ dnl else
if test "$ac_cv_curses_redrawwin" = yes; then if test "$ac_cv_curses_redrawwin" = yes; then
AC_DEFINE(CURSES_HAS_REDRAWWIN) AC_DEFINE(CURSES_HAS_REDRAWWIN)
fi fi
AC_CACHE_CHECK([for wcolor_set() in curses], ac_cv_curses_wcolor_set, AC_CACHE_CHECK([for wcolor_set() in curses], ac_cv_curses_wcolor_set,
[oldlibs="$LIBS" [oldlibs="$LIBS"
LIBS="$LIBS $LIBCURSES" LIBS="$LIBS $LIBCURSES"
@@ -106,24 +98,20 @@ dnl else
fi fi
;; ;;
text) text)
DRIVERS="$DRIVERS text.o" DRIVERS="$DRIVERS text${SO}"
AC_DEFINE(TEXT_DRV)
actdrivers=["$actdrivers text"] actdrivers=["$actdrivers text"]
;; ;;
lb216) lb216)
DRIVERS="$DRIVERS lb216.o" DRIVERS="$DRIVERS lb216${SO}"
AC_DEFINE(LB216_DRV)
actdrivers=["$actdrivers lb216"] actdrivers=["$actdrivers lb216"]
;; ;;
hd44780) hd44780)
DRIVERS="$DRIVERS hd44780.o hd44780-4bit.o hd44780-ext8bit.o lcd_sem.o hd44780-serialLpt.o hd44780-winamp.o hd44780-picanlcd.o" DRIVERS="$DRIVERS hd44780${SO}"
AC_DEFINE(HD44780_DRV)
actdrivers=["$actdrivers hd44780"] actdrivers=["$actdrivers hd44780"]
;; ;;
joy) joy)
AC_CHECK_HEADER(linux/joystick.h, AC_CHECK_HEADER(linux/joystick.h,
DRIVERS="$DRIVERS joy.o" DRIVERS="$DRIVERS joy${SO}"
AC_DEFINE(JOY_DRV)
actdrivers=["$actdrivers joy"] actdrivers=["$actdrivers joy"]
, ,
dnl else dnl else
@@ -131,21 +119,19 @@ dnl else
) )
;; ;;
irman) irman)
AC_CHECK_LIB(irman, main, AC_CHECK_LIB(irman, main,
LIBIRMAN="-lirman" LIBIRMAN="-lirman"
DRIVERS="$DRIVERS irmanin.o" DRIVERS="$DRIVERS irman${SO}"
AC_DEFINE(IRMANIN_DRV)
actdrivers=["$actdrivers irman"] actdrivers=["$actdrivers irman"]
, ,
dnl else dnl else
AC_MSG_WARN([The irman driver needs the irman library.]) AC_MSG_WARN([The irman driver needs the irman library.])
) )
;; ;;
lircin) lirc)
AC_CHECK_LIB(lirc_client, main, AC_CHECK_LIB(lirc_client, main,
LIBLIRC_CLIENT="-llirc_client" LIBLIRC_CLIENT="-llirc_client"
DRIVERS="$DRIVERS lircin.o" DRIVERS="$DRIVERS lirc${SO}"
AC_DEFINE(LIRCIN_DRV)
actdrivers=["$actdrivers lircin"] actdrivers=["$actdrivers lircin"]
, ,
dnl else dnl else
@@ -153,36 +139,31 @@ dnl else
) )
;; ;;
sed1330) sed1330)
DRIVERS="$DRIVERS sed1330.o" DRIVERS="$DRIVERS sed1330${SO}"
AC_DEFINE(SED1330_DRV)
actdrivers=["$actdrivers sed1330"] actdrivers=["$actdrivers sed1330"]
;; ;;
sed1520) sed1520)
DRIVERS="$DRIVERS sed1520.o" DRIVERS="$DRIVERS sed1520${SO}"
AC_DEFINE(SED1520_DRV)
actdrivers=["$actdrivers sed1520"] actdrivers=["$actdrivers sed1520"]
;; ;;
stv5730) stv5730)
DRIVERS="$DRIVERS stv5730.o" DRIVERS="$DRIVERS stv5730${SO}"
AC_DEFINE(STV5730_DRV)
actdrivers=["$actdrivers stv5730"] actdrivers=["$actdrivers stv5730"]
;; ;;
svgalib) svgalib)
AC_CHECK_LIB(vga, main, AC_CHECK_LIB(vga, main,
LIBSVGA="-lvga -lvgagl" LIBSVGA="-lvga -lvgagl"
DRIVERS="$DRIVERS svgalib_drv.o" DRIVERS="$DRIVERS svgalib_drv${SO}"
AC_DEFINE(SVGALIB_DRV)
actdrivers=["$actdrivers svgalib"] actdrivers=["$actdrivers svgalib"]
, ,
dnl else dnl else
AC_MSG_WARN([The svgalib driver needs the vga library])) AC_MSG_WARN([The svgalib driver needs the vga library]))
;; ;;
t6963) t6963)
DRIVERS="$DRIVERS t6963.o" DRIVERS="$DRIVERS t6963${SO}"
AC_DEFINE(T6963_DRV)
actdrivers=["$actdrivers t6963"] actdrivers=["$actdrivers t6963"]
;; ;;
*) *)
AC_MSG_ERROR([Unknown driver $driver]) AC_MSG_ERROR([Unknown driver $driver])
;; ;;
esac esac
@@ -203,22 +184,22 @@ dnl
dnl Curses test to check if we use _acs_char* or acs_map* dnl Curses test to check if we use _acs_char* or acs_map*
dnl dnl
AC_DEFUN(AC_CURSES_ACS_ARRAY, [ AC_DEFUN(AC_CURSES_ACS_ARRAY, [
AC_CACHE_CHECK([for acs_map in curses.h], ac_cv_curses_acs_map, AC_CACHE_CHECK([for acs_map in curses.h], ac_cv_curses_acs_map,
[AC_TRY_COMPILE([#include <curses.h>], [ char map = acs_map['p'] ], ac_cv_curses_acs_map=yes, ac_cv_curses_acs_map=no)]) [AC_TRY_COMPILE([#include <curses.h>], [ char map = acs_map['p'] ], ac_cv_curses_acs_map=yes, ac_cv_curses_acs_map=no)])
if test "$ac_cv_curses_acs_map" = yes if test "$ac_cv_curses_acs_map" = yes
then then
AC_DEFINE(CURSES_HAS_ACS_MAP) AC_DEFINE(CURSES_HAS_ACS_MAP)
else else
AC_CACHE_CHECK([for _acs_char in curses.h], ac_cv_curses__acs_char, AC_CACHE_CHECK([for _acs_char in curses.h], ac_cv_curses__acs_char,
[AC_TRY_COMPILE([#include <curses.h>], [ char map = _acs_char['p'] ], ac_cv_curses__acs_char=yes, ac_cv_curses__acs_char=no)]) [AC_TRY_COMPILE([#include <curses.h>], [ char map = _acs_char['p'] ], ac_cv_curses__acs_char=yes, ac_cv_curses__acs_char=no)])
if test "$ac_cv_curses__acs_char" = yes if test "$ac_cv_curses__acs_char" = yes
then then
AC_DEFINE(CURSES_HAS__ACS_CHAR) AC_DEFINE(CURSES_HAS__ACS_CHAR)
fi fi
fi fi
]) ])
@@ -231,7 +212,7 @@ AC_DEFUN([AC_FIND_MTAB_FILE], [
dnl Linux dnl Linux
if test -e "/etc/mtab"; then if test -e "/etc/mtab"; then
ac_cv_mtab_file=/etc/mtab ac_cv_mtab_file=/etc/mtab
else else
dnl Solaris dnl Solaris
if test -e "/etc/mnttab"; then if test -e "/etc/mnttab"; then
ac_cv_mtab_file=/etc/mnttab ac_cv_mtab_file=/etc/mnttab
@@ -243,7 +224,7 @@ AC_DEFUN([AC_FIND_MTAB_FILE], [
fi fi
fi fi
]) ])
if test "$ac_cv_mtab_file"; then if test ! -z "$ac_cv_mtab_file"; then
AC_DEFINE_UNQUOTED([MTAB_FILE], ["$ac_cv_mtab_file"], [Location of your mounted filesystem table file]) AC_DEFINE_UNQUOTED([MTAB_FILE], ["$ac_cv_mtab_file"], [Location of your mounted filesystem table file])
fi fi
]) ])
@@ -419,11 +400,11 @@ AC_DEFUN(AC_GET_FS_INFO, [
dnl fi dnl fi
]) ])
dnl 1.1 (2001/07/26) -- Miscellaneous @ ac-archive-0.5.32 dnl 1.1 (2001/07/26) -- Miscellaneous @ ac-archive-0.5.32
dnl Warren Young <warren@etr-usa.com> dnl Warren Young <warren@etr-usa.com>
dnl This macro checks for the SysV IPC header files. It only checks dnl This macro checks for the SysV IPC header files. It only checks
dnl that you can compile a program with them, not whether the system dnl that you can compile a program with them, not whether the system
dnl actually implements working SysV IPC. dnl actually implements working SysV IPC.
dnl http://ac-archive.sourceforge.net/Miscellaneous/etr_sysv_ipc.html dnl http://ac-archive.sourceforge.net/Miscellaneous/etr_sysv_ipc.html
AC_DEFUN([ETR_SYSV_IPC], AC_DEFUN([ETR_SYSV_IPC],
[ [
@@ -444,15 +425,15 @@ AC_CACHE_CHECK([for System V IPC headers], ac_cv_sysv_ipc, [
fi fi
]) dnl ETR_SYSV_IPC ]) dnl ETR_SYSV_IPC
dnl 1.1 (2001/07/26) -- Miscellaneous @ ac-archive-0.5.32 dnl 1.1 (2001/07/26) -- Miscellaneous @ ac-archive-0.5.32
dnl Warren Young <warren@etr-usa.com> dnl Warren Young <warren@etr-usa.com>
dnl This macro checks to see if sys/sem.h defines union semun. Some dnl This macro checks to see if sys/sem.h defines union semun. Some
dnl systems do, some systems don't. Your code must be able to deal with dnl systems do, some systems don't. Your code must be able to deal with
dnl this possibility; if HAVE_STRUCT_SEMUM isn't defined for a given system, dnl this possibility; if HAVE_STRUCT_SEMUM isn't defined for a given system,
dnl you have to define this structure before you can call functions dnl you have to define this structure before you can call functions
dnl like semctl(). dnl like semctl().
dnl You should call ETR_SYSV_IPC before this macro, to separate the check dnl You should call ETR_SYSV_IPC before this macro, to separate the check
dnl for System V IPC headers from the check for struct semun. dnl for System V IPC headers from the check for struct semun.
dnl http://ac-archive.sourceforge.net/Miscellaneous/etr_struct_semun.html dnl http://ac-archive.sourceforge.net/Miscellaneous/etr_struct_semun.html
AC_DEFUN([ETR_UNION_SEMUN], AC_DEFUN([ETR_UNION_SEMUN],
[ [
@@ -474,3 +455,81 @@ AC_CACHE_CHECK([for union semun], ac_cv_union_semun, [
[ Define if your system's sys/sem.h file defines union semun ]) [ Define if your system's sys/sem.h file defines union semun ])
fi fi
]) dnl ETR_UNION_SEMUN ]) dnl ETR_UNION_SEMUN
dnl Loadable modules determination.
dnl Joris Robijn, 2002
dnl I choose not to use libtool.
dnl If your platform does not compile or link the modules correctly, add
dnl appropriate flags here.
AC_DEFUN([AC_MODULES_INFO],
[
AC_SUBST(SO)
dnl $SO is the extension of shared libraries (including the dot!)
dnl It is available in the program code as MODULE_EXTENSION
AC_MSG_CHECKING(module extension)
case $host in
hp*|HP*)
SO=.sl;;
cygwin*)
SO=.dll;;
*)
SO=.so;;
esac
AC_DEFINE_UNQUOTED(MODULE_EXTENSION,"$SO")
AC_MSG_RESULT($SO)
AC_SUBST(CCSHARED)
dnl CCSHARED are the flags used to compile the sources for the shared library
AC_SUBST(LDSHARED)
dnl LDSHARED are the flags used to create shared library.
dnl By default assume a GNU compatible build system
CCSHARED="-fPIC"
LDSHARED="-shared"
dnl Now override flags that should be different
case "$host" in
SunOS/4*)
LDSHARED=""
;;
SunOS/5*)
if test ! "$GCC" = "yes" ; then
LDSHARED="-G";
fi
;;
hp*|HP*)
if test ! "$GCC" = "yes"; then
CCSHARED="+z";
fi
LDSHARED="-b"
;;
CYGWIN*)
CCSHARED="-DUSE_DL_IMPORT"
LDSHARED="-shared -Wl,--enable-auto-image-base"
;;
BSD/OS*/4*)
CCSHARED="-fpic"
;;
esac
dnl checks for libraries
AC_CHECK_LIB(dl, dlopen) # Dynamic linking for Linux, *BSD, SunOS/Solaris and SYSV
AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX
dnl End of loadable modules determination
]) dnl AC_MODULES_INFO
dnl Generate the drivers/Makefile.am file from Makefile.am.pre
dnl Joris Robijn, 2002
AC_DEFUN([AC_GENERATE_MAKEFILE_AM],
[
echo creating server/drivers/Makefile.am
( cd $srcdir/server/drivers
SO_WO_DOT=`echo $SO|sed 's/[[.]]//'`
sed "s/[[!]]SO[[!]]/$SO_WO_DOT/g" < Makefile.am.pre | \
sed "s/[[!]]DRIVERS[[!]]/$DRIVERS/g" > Makefile.am
)
dnl End of Generate drivers Makefile.am
]) dnl AC_GENERATE_MAKEFILE_AM
+10 -6
View File
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(clients/lcdproc/batt.c) AC_INIT(clients/lcdproc/batt.c)
AM_INIT_AUTOMAKE(lcdproc, 0.5beta) AM_INIT_AUTOMAKE(lcdproc, 0.5dev)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
AC_CANONICAL_HOST AC_CANONICAL_HOST
@@ -132,7 +132,7 @@ AC_DEFINE_UNQUOTED(LCDPORT, $LCDPORT)
AC_DEFINE_UNQUOTED(PROTOCOL_VERSION, "0.3") AC_DEFINE_UNQUOTED(PROTOCOL_VERSION, "0.3")
AC_DEFINE_UNQUOTED(API_VERSION, "0.5beta") AC_DEFINE_UNQUOTED(API_VERSION, "0.5")
AC_ARG_WITH(loadmax, AC_ARG_WITH(loadmax,
@@ -151,13 +151,17 @@ AC_ARG_WITH(loadmin,
) )
AC_DEFINE_UNQUOTED(LOAD_MIN, $LOAD_MIN) AC_DEFINE_UNQUOTED(LOAD_MIN, $LOAD_MIN)
AC_MODULES_INFO
LCD_DRIVERS_SELECT LCD_DRIVERS_SELECT
AC_GENERATE_MAKEFILE_AM
AC_OUTPUT(Makefile AC_OUTPUT(Makefile
shared/Makefile shared/Makefile
server/Makefile server/Makefile
server/drivers/Makefile server/drivers/Makefile
clients/Makefile clients/Makefile
clients/lcdproc/Makefile clients/lcdproc/Makefile
clients/examples/Makefile clients/examples/Makefile
clients/headlines/Makefile clients/headlines/Makefile
+1 -1
View File
@@ -1,5 +1,5 @@
SUBDIRS=drivers SUBDIRS=drivers
sbin_PROGRAMS=LCDd sbin_PROGRAMS=LCDd
LCDd_SOURCES= client_data.c client_data.h client_functions.c client_functions.h client_menu.h clients.c clients.h input.c input.h main.c main.h menu.c menu.h menus.c menus.h parse.c parse.h render.c render.h screen.c screen.h screenlist.c screenlist.h serverscreens.c serverscreens.h sock.c sock.h widget.c widget.h configfile.c configfile.h drivers.c drivers.h driver.c driver.h LCDd_SOURCES= client_data.c client_data.h client_functions.c client_functions.h client_menu.h clients.c clients.h input.c input.h main.c main.h menu.c menu.h menus.c menus.h parse.c parse.h render.c render.h screen.c screen.h screenlist.c screenlist.h serverscreens.c serverscreens.h sock.c sock.h widget.c widget.h configfile.c configfile.h drivers.c drivers.h driver.c driver.h
LCDd_LDADD = drivers/libLCDdrivers.a ../shared/libLCDstuff.a @LIBCURSES@ @LIBIRMAN@ @LIBLIRC_CLIENT@ @LIBSVGA@ LCDd_LDADD = ../shared/libLCDstuff.a
INCLUDES = -I$(top_srcdir) INCLUDES = -I$(top_srcdir)
+118 -60
View File
@@ -12,12 +12,12 @@
* *
*/ */
#include <malloc.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <sys/errno.h> #include <sys/errno.h>
#include <dlfcn.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
@@ -31,7 +31,47 @@
#include "drivers/lcd.h" #include "drivers/lcd.h"
/* lcd.h is used for the driver API definition */ /* lcd.h is used for the driver API definition */
void * lcd_find_init (char *driver); /* HACK TO USE THIS WHILE NO LOADABLE DRIVERS */
typedef struct driver_symbols {
char *name;
short offset; /* offset in Driver structure */
short required;
} DriverSymbols;
DriverSymbols driver_symbols[] = {
{ "api_version", offsetof(Driver, api_version), 1 },
{ "stay_in_foreground", offsetof(Driver, stay_in_foreground), 1 },
{ "supports_multiple", offsetof(Driver, supports_multiple), 1 },
{ "symbol_prefix", offsetof(Driver, symbol_prefix), 1 },
{ "init", offsetof(Driver, init), 1 },
{ "close", offsetof(Driver, close), 1 },
{ "width", offsetof(Driver, width), 1 },
{ "height", offsetof(Driver, height), 1 },
{ "clear", offsetof(Driver, clear), 1 },
{ "flush", offsetof(Driver, flush), 1 },
{ "string", offsetof(Driver, string), 1 },
{ "chr", offsetof(Driver, chr), 1 },
{ "vbar", offsetof(Driver, vbar), 0 },
{ "hbar", offsetof(Driver, hbar), 0 },
{ "num", offsetof(Driver, num), 0 },
{ "heartbeat", offsetof(Driver, heartbeat), 0 },
{ "icon", offsetof(Driver, icon), 0 },
{ "cursor", offsetof(Driver, cursor), 0 },
{ "set_char", offsetof(Driver, set_char), 0 },
{ "get_free_chars", offsetof(Driver, get_free_chars), 0 },
{ "cellwidth", offsetof(Driver, cellwidth), 0 },
{ "cellheight", offsetof(Driver, cellheight), 0 },
{ "get_contrast", offsetof(Driver, get_contrast), 0 },
{ "set_contrast", offsetof(Driver, set_contrast), 0 },
{ "get_brightness", offsetof(Driver, get_brightness), 0 },
{ "set_brightness", offsetof(Driver, set_brightness), 0 },
{ "backlight", offsetof(Driver, backlight), 0 },
{ "output", offsetof(Driver, output), 0 },
{ "get_key", offsetof(Driver, get_key), 0 },
{ "get_info", offsetof(Driver, get_info), 0 },
{ NULL, 0, 0 }
};
/* Functions for the driver */ /* Functions for the driver */
@@ -43,59 +83,55 @@ static int driver_store_private_ptr(Driver * driver, void * private_data);
Driver * Driver *
driver_load( char * name, char * filename, char * args ) driver_load( char * name, char * filename, char * args )
{ {
void (*driver_init)();
Driver * driver = NULL; Driver * driver = NULL;
int res; int res;
debug( RPT_DEBUG, "Loading driver [%.40s]", name ); report( RPT_INFO, "driver_load( name=\"%.40s\", filename=\"%.80s\", args=\"%.80s\")", name, filename, args );
/* Allocate memory for new driver struct */ /* Allocate memory for new driver struct */
driver = malloc( sizeof( Driver )); driver = malloc( sizeof( Driver ));
memset( driver, 0, sizeof (Driver)); memset( driver, 0, sizeof (Driver));
/* Load the driver modules and fill the symbols */
if( driver_bind_module( driver ) < 0 ) {
report( RPT_ERR, "Driver [%.40s] load failed", name );
free( driver );
return NULL;
}
/* Find the driver in the array of driver types OLD CODE IS CALLED HERE */
if ((driver_init = lcd_find_init(name)) == NULL) {
/* Driver not found */
report( RPT_ERR, "Unknown driver [%.40s]", name);
return NULL;
}
driver->init = (int (*)(Driver*,char*)) driver_init;
/* And store its name and filename */ /* And store its name and filename */
driver->name = malloc( strlen( name ) + 1 ); driver->name = malloc( strlen( name ) + 1 );
strcpy( driver->name, name ); strcpy( driver->name, name );
driver->filename = malloc( strlen( filename ) + 1 ); driver->filename = malloc( strlen( filename ) + 1 );
strcpy( driver->filename, filename ); strcpy( driver->filename, filename );
/* Call the init function */ /* Load and bind the driver module and locate the symbols */
report( RPT_DEBUG, "Calling driver [%.40s] init function", driver->name ); if( driver_bind_module( driver ) < 0 ) {
res = driver->init( driver, args ); report( RPT_ERR, "Driver [%.40s] binding failed", name );
if( res < 0 ) {
report( RPT_ERR, "Driver [%.40s] init failed, return code < 0", driver->name );
/* Driver load failed, don't add driver to list
* Free driver structure again
*/
free( driver->name ); free( driver->name );
free( driver->filename ); free( driver->filename );
free( driver ); free( driver );
return NULL; return NULL;
} }
/* Check if necesary functions are filled /* Check module version */
* SHOULD BE DONE BEFORE CALLING INIT WHEN WE HAVE LOADABLE DRIVERS if( strcmp( *(driver->api_version), API_VERSION ) != 0 ) {
*/ report( RPT_ERR, "Driver [%.40s] is of an incompatible version", name );
if( ! driver_has_obligatory_symbols( driver ) ) { driver_unbind_module( driver );
report( RPT_ERR, "Driver [%.40s] does not have all obligatory symbols", driver->name ); free( driver->name );
driver_unload( driver ); free( driver->filename );
free( driver );
return NULL; return NULL;
} }
/* Call the init function */
debug( RPT_DEBUG, "Calling driver [%.40s] init function", driver->name );
res = driver->init( driver, args );
if( res < 0 ) {
report( RPT_ERR, "Driver [%.40s] init failed, return code < 0", driver->name );
/* Driver load failed, driver should not be added to list
* Free driver structure again
*/
driver_unbind_module( driver );
free( driver->name );
free( driver->filename );
free( driver );
return NULL;
}
debug( RPT_NOTICE, "Driver [%.40s] loaded", driver->name ); debug( RPT_NOTICE, "Driver [%.40s] loaded", driver->name );
return driver; return driver;
@@ -109,7 +145,7 @@ driver_unload( Driver * driver )
if( driver->close ) if( driver->close )
driver->close (driver); driver->close (driver);
/* FUTURE: UNLOAD THE LOADED MODULE */ /* Unlaod the module */
driver_unbind_module( driver ); driver_unbind_module( driver );
/* Free its data */ /* Free its data */
@@ -125,11 +161,54 @@ driver_unload( Driver * driver )
int int
driver_bind_module( Driver * driver ) driver_bind_module( Driver * driver )
{ {
/* Clear the struct, including all functions */ int i;
memset( driver, 0, sizeof(Driver) ); int missing_symbols = 0;
/* FUTURE: GET THE SYMBOLS FROM THE DRIVER MODULE */ /* Load the module */
driver->module_handle = dlopen( driver->filename, RTLD_NOW );
if( driver->module_handle == NULL ) {
report( RPT_ERR, "Could not dlopen driver module %.40s: %s", driver->filename, dlerror() );
return -1;
}
/* And locate the symbols */
for( i=0; driver_symbols[i].name; i++ ) {
void (**p)();
p = (void(**)() ) ((size_t)driver + (driver_symbols[i].offset));
*p = NULL;
/* Add the symbol_prefix */
if( driver->symbol_prefix ) {
char *s = malloc( strlen( *(driver->symbol_prefix) ) + strlen( driver_symbols[i].name ) + 1 );
strcpy( s, *(driver->symbol_prefix) ) ;
strcat( s, driver_symbols[i].name );
debug( RPT_DEBUG, "finding symbol: %s", s );
*p = dlsym( driver->module_handle, s );
free( s );
}
/* Retrieve the symbol */
if( !*p ) {
debug( RPT_DEBUG, "finding symbol: %s", driver_symbols[i].name );
*p = dlsym( driver->module_handle, driver_symbols[i].name );
}
if( *p ) {
debug( RPT_DEBUG, "found symbol at: %p", *p );
}
/* Was the symbol required but not found ? */
if( !*p && driver_symbols[i].required ) {
report( RPT_ERR, "Module [%.40s] does not have required symbol: %s", driver->name, driver_symbols[i].name );
missing_symbols = 1;
}
}
/* If errors, leave now while we can :) */
if( missing_symbols ) {
report( RPT_ERR, "Driver [%.40s] does not have all obligatory symbols", driver->name );
dlclose( driver->module_handle );
return -1;
}
/* Add our exported functions */ /* Add our exported functions */
@@ -159,33 +238,12 @@ driver_bind_module( Driver * driver )
int int
driver_unbind_module( Driver * driver ) driver_unbind_module( Driver * driver )
{ {
dlclose( driver->module_handle );
return 0; return 0;
} }
bool
driver_has_obligatory_symbols( Driver * driver )
{
if( driver->api_version == NULL
|| driver->stay_in_foreground == NULL
|| driver->supports_multiple == NULL ) {
report( RPT_ERR, "Driver [%.40s] misses symbols", driver->name );
return 0;
}
if( driver_does_output(driver)
&& ( driver->width == NULL
|| driver->height == NULL
|| driver->clear == NULL
|| driver->string == NULL
|| driver->chr == NULL )) {
report( RPT_ERR, "Driver [%.40s] does output but misses a obligatory function", driver->name );
return 0;
}
return 1;
}
bool bool
driver_does_output( Driver * driver ) driver_does_output( Driver * driver )
{ {
-3
View File
@@ -29,9 +29,6 @@ driver_bind_module( Driver * driver );
int int
driver_unbind_module( Driver * driver ); driver_unbind_module( Driver * driver );
bool
driver_has_obligatory_symbols( Driver * driver );
bool bool
driver_does_output( Driver * driver ); driver_does_output( Driver * driver );
+38 -80
View File
@@ -12,7 +12,6 @@
* *
*/ */
#include <malloc.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@@ -25,6 +24,7 @@
#include "shared/LL.h" #include "shared/LL.h"
#include "shared/report.h" #include "shared/report.h"
#include "configfile.h"
#include "drivers.h" #include "drivers.h"
#include "driver.h" #include "driver.h"
@@ -39,11 +39,15 @@ DisplayProps * display_props = NULL;
int int
drivers_load_driver( char * name, char * filename, char * args ) drivers_load_driver( char * name )
{ {
Driver * driver; Driver * driver;
char * s;
char * driverpath;
char * filename;
char * args;
report( RPT_INFO, "drivers_load_driver( name=\"%.40s\", filename=\"%.80s\", args=\"%.80s\")", name, filename, args ); report( RPT_INFO, "drivers_load_driver( name=\"%.40s\")", name );
/* First driver ? */ /* First driver ? */
if( !loaded_drivers ) { if( !loaded_drivers ) {
@@ -55,15 +59,45 @@ drivers_load_driver( char * name, char * filename, char * args )
} }
} }
/* Retrieve data from config file */
s = config_get_string( "server", "driverpath", 0, "" );
driverpath = malloc( strlen(s) + 1 );
strcpy( driverpath, s );
s = config_get_string( name, "file", 0, NULL );
if( s ) {
filename = malloc( strlen(driverpath) + strlen(s) + 1 );
strcpy( filename, driverpath );
strcat( filename, s );
} else {
filename = malloc( strlen(driverpath) + strlen(name) + strlen(MODULE_EXTENSION) + 1 );
strcpy( filename, driverpath );
strcat( filename, name );
strcat( filename, MODULE_EXTENSION );
}
s = config_get_string( name, "arguments", 0, "" );
args = malloc( strlen(s)+1 );
strcpy( args, s );
/* Load the module */ /* Load the module */
driver = driver_load( name, filename, args ); driver = driver_load( name, filename, args );
if( driver == NULL ) if( driver == NULL ) {
/* It failed. The message has already been given by driver_load() */ /* It failed. The message has already been given by driver_load() */
report( RPT_INFO, "Module %.40s could not be loaded", filename );
free( driverpath );
free( filename );
free( args );
return -1; return -1;
}
/* Add driver to list */ /* Add driver to list */
LL_Push( loaded_drivers, driver ); LL_Push( loaded_drivers, driver );
free( driverpath );
free( filename );
free( args );
/* If first driver, store display properties */ /* If first driver, store display properties */
if( driver_does_output(driver) && !display_props ) { if( driver_does_output(driver) && !display_props ) {
if( driver->width(driver) <= 0 || driver->width(driver) > LCD_MAX_WIDTH if( driver->width(driver) <= 0 || driver->width(driver) > LCD_MAX_WIDTH
@@ -185,55 +219,11 @@ drivers_chr( int x, int y, char c )
} }
void
drivers_init_vbar() /* TO BE REMOVED */
{
Driver *drv;
report( RPT_INFO, "drivers_init_vbar()" );
ForAllDrivers(drv) {
if( drv->init_vbar )
drv->init_vbar(drv);
}
}
void
drivers_init_hbar() /* TO BE REMOVED */
{
Driver *drv;
report( RPT_INFO, "drivers_init_hbar()" );
ForAllDrivers(drv) {
if( drv->init_hbar )
drv->init_hbar(drv);
}
}
void
drivers_init_num() /* TO BE REMOVED */
{
Driver *drv;
report( RPT_INFO, "drivers_init_num()" );
ForAllDrivers(drv) {
if( drv->init_num )
drv->init_num( drv );
}
}
void void
drivers_vbar( int x, int y, int len, int promille, int pattern ) drivers_vbar( int x, int y, int len, int promille, int pattern )
{ {
Driver *drv; Driver *drv;
int old_len;
report( RPT_INFO, "drivers_vbar( x=%d, y=%d, len=%d, promille=%d, pattern=%d )", x, y, len, promille, pattern ); report( RPT_INFO, "drivers_vbar( x=%d, y=%d, len=%d, promille=%d, pattern=%d )", x, y, len, promille, pattern );
/* NEW FUNCTIONS /* NEW FUNCTIONS
@@ -247,21 +237,6 @@ drivers_vbar( int x, int y, int len, int promille, int pattern )
drv->vbar( drv, x, y, len, promille, pattern ); drv->vbar( drv, x, y, len, promille, pattern );
} }
} }
/* OLD FUNCTIONS
*
* We need to convert the bar lengths, because the displays can
* have different pixels per char
*/
old_len = (long) display_props->cellheight * len * promille / 1000;
ForAllDrivers(drv) {
if( drv->old_vbar ) {
drv->old_vbar( drv, x, old_len );
}
}
} }
@@ -269,31 +244,14 @@ void
drivers_hbar( int x, int y, int len, int promille, int pattern ) drivers_hbar( int x, int y, int len, int promille, int pattern )
{ {
Driver *drv; Driver *drv;
int old_len;
report( RPT_INFO, "drivers_hbar( x=%d, y=%d, len=%d, promille=%d, pattern=%d )", x, y, len, promille, pattern ); report( RPT_INFO, "drivers_hbar( x=%d, y=%d, len=%d, promille=%d, pattern=%d )", x, y, len, promille, pattern );
/* NEW FUNCTIONS */
ForAllDrivers(drv) { ForAllDrivers(drv) {
if( drv->hbar ) { if( drv->hbar ) {
drv->hbar( drv, x, y, len, promille, pattern ); drv->hbar( drv, x, y, len, promille, pattern );
} }
} }
/* OLD FUNCTIONS
*
* We need to convert the bar lengths, because the displays can
* have different pixels per char
*/
old_len = (long) display_props->cellwidth * len * promille / 1000;
ForAllDrivers(drv) {
if( drv->old_hbar ) {
drv->old_hbar( drv, x, y, old_len );
}
}
} }
+1 -1
View File
@@ -25,7 +25,7 @@ extern DisplayProps * display_props;
int int
drivers_load_driver( char * name, char * filename, char * args ); drivers_load_driver( char * name );
/* returns: /* returns:
* <0 error * <0 error
* 0 ok, driver is an input driver only * 0 ok, driver is an input driver only
+5 -28
View File
@@ -37,7 +37,7 @@
#include "CFontz.h" #include "CFontz.h"
//#include "drv_base.h" //#include "drv_base.h"
//#include "shared/debug.h" //#include "shared/debug.h"
#include "shared/str.h" //#include "shared/str.h"
#include "report.h" #include "report.h"
#include "lcd_lib.h" #include "lcd_lib.h"
//#include "server/configfile.h" //#include "server/configfile.h"
@@ -68,11 +68,14 @@ MODULE_EXPORT int stay_in_foreground = 1;
MODULE_EXPORT int supports_multiple = 0; MODULE_EXPORT int supports_multiple = 0;
MODULE_EXPORT char *symbol_prefix = "CFontz_"; MODULE_EXPORT char *symbol_prefix = "CFontz_";
// Internal functions // Internal functions
static void CFontz_linewrap (int on); static void CFontz_linewrap (int on);
static void CFontz_autoscroll (int on); static void CFontz_autoscroll (int on);
static void CFontz_hidecursor (); static void CFontz_hidecursor ();
static void CFontz_reboot (); static void CFontz_reboot ();
static void CFontz_init_vbar (Driver * drvthis);
static void CFontz_init_hbar (Driver * drvthis);
// TODO: Get the frame buffers working right // TODO: Get the frame buffers working right
@@ -80,7 +83,7 @@ static void CFontz_reboot ();
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly... // Opens com port and sets baud correctly...
// //
int MODULE_EXPORT int
CFontz_init (Driver * drvthis, char *args) CFontz_init (Driver * drvthis, char *args)
{ {
struct termios portset; struct termios portset;
@@ -202,32 +205,6 @@ CFontz_init (Driver * drvthis, char *args)
CFontz_autoscroll (0); CFontz_autoscroll (0);
//CFontz_backlight (drvthis, backlight_brightness); // render.c variables should not be used in drivers ! //CFontz_backlight (drvthis, backlight_brightness); // render.c variables should not be used in drivers !
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = CFontz_clear;
drvthis->string = CFontz_string;
drvthis->chr = CFontz_chr;
drvthis->vbar = CFontz_vbar;
//drvthis->init_vbar = CFontz_init_vbar;
drvthis->hbar = CFontz_hbar;
//drvthis->init_hbar = CFontz_init_hbar;
drvthis->num = CFontz_num;
drvthis->init = CFontz_init;
drvthis->close = CFontz_close;
drvthis->flush = CFontz_flush;
drvthis->get_contrast = CFontz_get_contrast;
drvthis->set_contrast = CFontz_set_contrast;
drvthis->backlight = CFontz_backlight;
drvthis->set_char = CFontz_set_char;
drvthis->icon = CFontz_icon;
drvthis->heartbeat = CFontz_heartbeat;
CFontz_set_contrast (drvthis, contrast); CFontz_set_contrast (drvthis, contrast);
+1 -4
View File
@@ -13,7 +13,7 @@
#define DEFAULT_SIZE "20x4" #define DEFAULT_SIZE "20x4"
int CFontz_init (Driver * drvthis, char *device); MODULE_EXPORT int CFontz_init (Driver * drvthis, char *device);
MODULE_EXPORT void CFontz_close (Driver * drvthis); MODULE_EXPORT void CFontz_close (Driver * drvthis);
MODULE_EXPORT int CFontz_width (Driver * drvthis); MODULE_EXPORT int CFontz_width (Driver * drvthis);
MODULE_EXPORT int CFontz_height (Driver * drvthis); MODULE_EXPORT int CFontz_height (Driver * drvthis);
@@ -34,7 +34,4 @@ MODULE_EXPORT int CFontz_get_contrast (Driver * drvthis);
MODULE_EXPORT void CFontz_set_contrast (Driver * drvthis, int contrast); MODULE_EXPORT void CFontz_set_contrast (Driver * drvthis, int contrast);
MODULE_EXPORT void CFontz_backlight (Driver * drvthis, int on); MODULE_EXPORT void CFontz_backlight (Driver * drvthis, int on);
MODULE_EXPORT void CFontz_init_vbar (Driver * drvthis);
MODULE_EXPORT void CFontz_init_hbar (Driver * drvthis);
#endif #endif
+57 -28
View File
@@ -1,28 +1,57 @@
noinst_LIBRARIES = libLCDdrivers.a ## We use bin_ to generate the shared libraries, because automake only
libLCDdrivers_a_SOURCES = lcd.c lcd.h lcd_lib.c lcd_lib.h ## supports libtool shared libraries. But we don't want to use libtool...
EXTRA_libLCDdrivers_a_SOURCES = MtxOrb.c MtxOrb.h text.c text.h \ ##
lcdm001.c lcdm001.h \ ## configure replaces all occurrences of so to the appropriate extension
curses_drv.c curses_drv.h drv_base.h \ ## (without dot!)
hd44780.c hd44780.h lb216.c lb216.h \ ##
hd44780-4bit.c hd44780-4bit.h lpt-port.h timing.h \
hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h \ pkglib_PROGRAMS = @DRIVERS@
hd44780-serialLpt.c hd44780-serialLpt.h \ EXTRA_PROGRAMS = bayrad.so CFontz.so curses_drv.so glk.so hd44780.so irman.so joy.so lb216.so lcdm001.so lirc.so MtxOrb.so sed1330.so sed1520.so stv5730.so svga.so t6963.so text.so wirz_sli.so
hd44780-winamp.c hd44780-winamp.h \ noinst_LIBRARIES = libLCD.a
hd44780-picanlcd.c hd44780-picanlcd.h \
hd44780-low.h hd44780-drivers.h hd44780-charmap.h \ EXTRA_DIST = Makefile.am.pre
sed1330.c sed1330.h \ nodist_DIST = Makefile.am
sed1520.c sed1520.h sed1520fm.c \
stv5730.c stv5730.h \ ## How to compile the files for the modules:
port.h joy.c joy.h irmanin.c irmanin.h \ CCFLAGS += @CCSHARED@
bayrad.h bayrad.c \
CFontz.c CFontz.h lircin.c lircin.h debug.h \ ## And how to build them
glk.c glk.h glkproto.c glkproto.h \ LDFLAGS += @LDSHARED@
svgalib_drv.c svgalib_drv.h \
t6963.c t6963.h t6963_font.h ## Forget the libs that the server core requires
libLCDdrivers_a_DEPENDENCIES = @DRIVERS@ LIBS=
libLCDdrivers_a_LIBADD = @DRIVERS@
# NOTE: $(srcdir)/.. is to get .h files from the server directory CFontz_so_LDADD = libLCD.a
# $(top_srcdir) is to get .h files from shared/... curses_drv_so_LDADD = @LIBCURSES@
# These are necessary because a VPATH build has split source and build hd44780_so_LDADD = libLCD.a
# directories and these files are in the VPATH'd source area. irman_so_LDADD = @LIBIRMAN@
INCLUDES = -I$(srcdir)/.. -I$(top_srcdir) lirc_so_LDADD = @LIBLIRC_CLIENT@
svga_so_LDADD = @LIBSVGA@
t6963_so_LDADD = libLCD.a
libLCD_a_SOURCES = lcd_lib.h lcd_lib.c
bayrad_so_SOURCES = lcd.h bayrad.h bayrad.c report.h
CFontz_so_SOURCES = lcd.h CFontz.c CFontz.h report.h
curses_drv_so_SOURCES = lcd.h curses_drv.h curses_drv.c report.h
glk_so_SOURCES = lcd.h glk.c glk.h glkproto.c glkproto.h report.h
hd44780_so_SOURCES = lcd.h hd44780.h hd44780.c hd44780-drivers.h hd44780-low.h hd44780-charmap.h hd44780-4bit.c hd44780-4bit.h hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h hd44780-serialLpt.c hd44780-serialLpt.h hd44780-winamp.c hd44780-winamp.h hd44780-picanlcd.c hd44780-picanlcd.h port.h lpt-port.h timing.h report.h
irman_so_SOURCES = lcd.h irmanin.c irmanin.h report.h
joy_so_SOURCES = lcd.h joy.c joy.h port.h report.h
lb216_so_SOURCES = lcd.h lb216.c lb216.h report.h
lcdm001_so_SOURCES = lcd.h lcdm001.c lcdm001.h report.h
lirc_so_SOURCES = lcd.h lircin.c lircin.h report.h
MtxOrb_so_SOURCES = lcd.h MtxOrb.c MtxOrb.h report.h bigfont.h
sed1330_so_SOURCES = lcd.h sed1330.h sed1330.c port.h lpt-port.h timing.h report.h
sed1520_so_SOURCES = lcd.h sed1520.c sed1520.h sed1520fm.c sed1520fm.h port.h report.h
stv5730_so_SOURCES = lcd.h stv5730.c stv5730.h report.h
svga_so_SOURCES = lcd.h svgalib_drv.c svgalib_drv.h report.h
t6963_so_SOURCES = lcd.h t6963.c t6963.h t6963_font.h report.h
text_so_SOURCES = lcd.h text.h text.c report.h
wirz_sli_so_SOURCES = lcd.h wirz-sli.h wirz-sli.c report.h
Makefile.am: Makefile.am.pre
@echo Makefile.am.pre has been changed, please rerun configure.
@false
INCLUDES = -I$(top_srcdir)
+57
View File
@@ -0,0 +1,57 @@
## We use bin_ to generate the shared libraries, because automake only
## supports libtool shared libraries. But we don't want to use libtool...
##
## configure replaces all occurrences of !SO! to the appropriate extension
## (without dot!)
##
pkglib_PROGRAMS = @DRIVERS@
EXTRA_PROGRAMS = bayrad.!SO! CFontz.!SO! curses_drv.!SO! glk.!SO! hd44780.!SO! irman.!SO! joy.!SO! lb216.!SO! lcdm001.!SO! lirc.!SO! MtxOrb.!SO! sed1330.!SO! sed1520.!SO! stv5730.!SO! svga.!SO! t6963.!SO! text.!SO! wirz_sli.!SO!
noinst_LIBRARIES = libLCD.a
EXTRA_DIST = Makefile.am.pre
nodist_DIST = Makefile.am
## How to compile the files for the modules:
CCFLAGS += @CCSHARED@
## And how to build them
LDFLAGS += @LDSHARED@
## Forget the libs that the server core requires
LIBS=
CFontz_!SO!_LDADD = libLCD.a
curses_drv_!SO!_LDADD = @LIBCURSES@
hd44780_!SO!_LDADD = libLCD.a
irman_!SO!_LDADD = @LIBIRMAN@
lirc_!SO!_LDADD = @LIBLIRC_CLIENT@
svga_!SO!_LDADD = @LIBSVGA@
t6963_!SO!_LDADD = libLCD.a
libLCD_a_SOURCES = lcd_lib.h lcd_lib.c
bayrad_!SO!_SOURCES = lcd.h bayrad.h bayrad.c report.h
CFontz_!SO!_SOURCES = lcd.h CFontz.c CFontz.h report.h
curses_drv_!SO!_SOURCES = lcd.h curses_drv.h curses_drv.c report.h
glk_!SO!_SOURCES = lcd.h glk.c glk.h glkproto.c glkproto.h report.h
hd44780_!SO!_SOURCES = lcd.h hd44780.h hd44780.c hd44780-drivers.h hd44780-low.h hd44780-charmap.h hd44780-4bit.c hd44780-4bit.h hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h hd44780-serialLpt.c hd44780-serialLpt.h hd44780-winamp.c hd44780-winamp.h hd44780-picanlcd.c hd44780-picanlcd.h port.h lpt-port.h timing.h report.h
irman_!SO!_SOURCES = lcd.h irmanin.c irmanin.h report.h
joy_!SO!_SOURCES = lcd.h joy.c joy.h port.h report.h
lb216_!SO!_SOURCES = lcd.h lb216.c lb216.h report.h
lcdm001_!SO!_SOURCES = lcd.h lcdm001.c lcdm001.h report.h
lirc_!SO!_SOURCES = lcd.h lircin.c lircin.h report.h
MtxOrb_!SO!_SOURCES = lcd.h MtxOrb.c MtxOrb.h report.h bigfont.h
sed1330_!SO!_SOURCES = lcd.h sed1330.h sed1330.c port.h lpt-port.h timing.h report.h
sed1520_!SO!_SOURCES = lcd.h sed1520.c sed1520.h sed1520fm.c sed1520fm.h port.h report.h
stv5730_!SO!_SOURCES = lcd.h stv5730.c stv5730.h report.h
svga_!SO!_SOURCES = lcd.h svgalib_drv.c svgalib_drv.h report.h
t6963_!SO!_SOURCES = lcd.h t6963.c t6963.h t6963_font.h report.h
text_!SO!_SOURCES = lcd.h text.h text.c report.h
wirz_sli_!SO!_SOURCES = lcd.h wirz-sli.h wirz-sli.c report.h
Makefile.am: Makefile.am.pre
@echo Makefile.am.pre has been changed, please rerun configure.
@false
INCLUDES = -I$(top_srcdir)
+57 -90
View File
@@ -1,4 +1,4 @@
/* This is the LCDproc driver for Matrix Orbital devices /* This is the LCDproc driver for Matrix Orbital devices
(http://www.matrixorbital.com) (http://www.matrixorbital.com)
For the Matrix Orbital LCD* LKD* VFD* and VKD* displays For the Matrix Orbital LCD* LKD* VFD* and VKD* displays
@@ -25,7 +25,7 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
*/ */
#include <stdlib.h> #include <stdlib.h>
@@ -48,9 +48,23 @@
#include "lcd_lib.h" #include "lcd_lib.h"
#include "MtxOrb.h" #include "MtxOrb.h"
#include "shared/report.h" #include "report.h"
#include "shared/str.h" //#include "shared/str.h"
#include "input.h" //#include "input.h"
/* Above 3 lines modified by Joris */
#define INPUT_PAUSE_KEY 'A'
#define INPUT_BACK_KEY 'B'
#define INPUT_FORWARD_KEY 'C'
#define INPUT_MAIN_MENU_KEY 'D'
#define MTXORB_DEFAULT_PAUSE_KEY 'A'
#define MTXORB_DEFAULT_BACK_KEY 'B'
#define MTXORB_DEFAULT_FORWARD_KEY 'C'
#define MTXORB_DEFAULT_MAIN_MENU_KEY 'D'
#define DEFAULT_SIZE "20x4"
#define DEFAULT_BACKLIGHT 1
#define DEFAULT_TYPE "lcd"
#define CONFIG_FILE
/* Above 5 lines added by Joris :( */
#define IS_LCD_DISPLAY (MtxOrb_type == MTXORB_LCD) #define IS_LCD_DISPLAY (MtxOrb_type == MTXORB_LCD)
#define IS_LKD_DISPLAY (MtxOrb_type == MTXORB_LKD) #define IS_LKD_DISPLAY (MtxOrb_type == MTXORB_LKD)
@@ -66,9 +80,9 @@
RESP: Because software emulated hbar/vbar permit simultaneous use. RESP: Because software emulated hbar/vbar permit simultaneous use.
*/ */
/* TODO: Find a better way to deal with the bitmap/name of custom char /* TODO: Find a better way to deal with the bitmap/name of custom char
* Here the value link to the enum and the definition at the end. * Here the value link to the enum and the definition at the end.
*/ */
#define START_FONT 30 #define START_FONT 30
#define WHITE 254 #define WHITE 254
#define BLACK 255 #define BLACK 255
@@ -182,7 +196,7 @@ static void MtxOrb_cursorblink (Driver *drvthis, int on);
static int static int
MtxOrb_parse_type (char * str) { MtxOrb_parse_type (Driver *drvthis, char * str) {
char c; char c;
c = str[0]; c = str[0];
@@ -209,7 +223,7 @@ MtxOrb_parse_type (char * str) {
} }
static int static int
MtxOrb_parse_speed (char *arg) { MtxOrb_parse_speed (Driver *drvthis, char *arg) {
int speed; int speed;
switch (atoi(arg)) { switch (atoi(arg)) {
@@ -245,7 +259,7 @@ MtxOrb_usage (void) {
} }
int int
MtxOrb_parse_contrast (char * str) { MtxOrb_parse_contrast (Driver *drvthis, char * str) {
int contrast; int contrast;
contrast = atoi (str); contrast = atoi (str);
@@ -259,13 +273,13 @@ MtxOrb_parse_contrast (char * str) {
#ifdef CONFIG_FILE #ifdef CONFIG_FILE
/* Parse one key from the configfile */ /* Parse one key from the configfile */
static char MtxOrb_parse_keypad_setting (char * sectionname, char * keyname, char default_value) static char MtxOrb_parse_keypad_setting (Driver *drvthis, char * keyname, char default_value)
{ {
char return_val = 0; char return_val = 0;
char * s; char * s;
char buf [255]; char buf [255];
s = config_get_string ( sectionname, keyname, 0, NULL); s = drvthis->config_get_string ( drvthis->name, keyname, 0, NULL);
if (s != NULL){ if (s != NULL){
strncpy (buf, s, sizeof(buf)); strncpy (buf, s, sizeof(buf));
buf[sizeof(buf)-1]=0; buf[sizeof(buf)-1]=0;
@@ -283,7 +297,7 @@ static char MtxOrb_parse_keypad_setting (char * sectionname, char * keyname, cha
* *
* Called to initialize driver settings * Called to initialize driver settings
*/ */
int MODULE_EXPORT int
MtxOrb_init (Driver *drvthis, char *args) MtxOrb_init (Driver *drvthis, char *args)
{ {
#ifdef CONFIG_FILE #ifdef CONFIG_FILE
@@ -300,23 +314,18 @@ MtxOrb_init (Driver *drvthis, char *args)
MtxOrb_type = MTXORB_LKD; // Assume it's an LCD w/keypad MtxOrb_type = MTXORB_LKD; // Assume it's an LCD w/keypad
MtxOrb = driver; debug( RPT_INFO, "MtxOrb: init(%p,%s)", drvthis, args );
debug( RPT_INFO, "MtxOrb: init(%p,%s)", driver, args );
/* TODO: replace DriverName with driver->name when that field exists. */
#define DriverName "MtxOrb"
/* READ CONFIG FILE */ /* READ CONFIG FILE */
/* Get serial device to use */ /* Get serial device to use */
strncpy(device, config_get_string ( DriverName , "device" , 0 , DEFAULT_DEVICE),sizeof(device)); strncpy(device, drvthis->config_get_string ( drvthis->name , "device" , 0 , DEFAULT_DEVICE),sizeof(device));
device[sizeof(device)-1]=0; device[sizeof(device)-1]=0;
report (RPT_INFO,"MtxOrb: Using device: %s", device); report (RPT_INFO,"MtxOrb: Using device: %s", device);
/* Get display size */ /* Get display size */
strncpy(size, config_get_string ( DriverName , "size" , 0 , DEFAULT_SIZE),sizeof(size)); strncpy(size, drvthis->config_get_string ( drvthis->name , "size" , 0 , DEFAULT_SIZE),sizeof(size));
size[sizeof(size)-1]=0; size[sizeof(size)-1]=0;
if( sscanf(size , "%dx%d", &w, &h ) != 2 if( sscanf(size , "%dx%d", &w, &h ) != 2
|| (w <= 0) || (w > LCD_MAX_WIDTH) || (w <= 0) || (w > LCD_MAX_WIDTH)
@@ -324,18 +333,18 @@ MtxOrb_init (Driver *drvthis, char *args)
report (RPT_WARNING, "MtxOrb: Cannot read size: %s. Using default value %s.", size, DEFAULT_SIZE); report (RPT_WARNING, "MtxOrb: Cannot read size: %s. Using default value %s.", size, DEFAULT_SIZE);
sscanf( DEFAULT_SIZE , "%dx%d", &w, &h ); sscanf( DEFAULT_SIZE , "%dx%d", &w, &h );
} }
driver->wid = w; width = w;
driver->hgt = h; height = h;
/* Get contrast */ /* Get contrast */
if (0<=config_get_int ( DriverName , "Contrast" , 0 , DEFAULT_CONTRAST) && config_get_int ( DriverName , "Contrast" , 0 , DEFAULT_CONTRAST) <= 255) { if (0<=drvthis->config_get_int ( drvthis->name , "Contrast" , 0 , DEFAULT_CONTRAST) && drvthis->config_get_int ( drvthis->name , "Contrast" , 0 , DEFAULT_CONTRAST) <= 255) {
contrast = config_get_int ( DriverName , "Contrast" , 0 , DEFAULT_CONTRAST); contrast = drvthis->config_get_int ( drvthis->name , "Contrast" , 0 , DEFAULT_CONTRAST);
} else { } else {
report (RPT_WARNING, "MtxOrb: Contrast must be between 0 and 255. Using default value."); report (RPT_WARNING, "MtxOrb: Contrast must be between 0 and 255. Using default value.");
} }
/* Get speed */ /* Get speed */
tmp = config_get_int ( DriverName , "Speed" , 0 , DEFAULT_SPEED); tmp = drvthis->config_get_int ( drvthis->name , "Speed" , 0 , DEFAULT_SPEED);
switch (tmp) { switch (tmp) {
case 1200: case 1200:
@@ -372,12 +381,12 @@ MtxOrb_init (Driver *drvthis, char *args)
/* Get backlight setting*/ /* Get backlight setting*/
if(config_get_bool( DriverName , "enablebacklight" , 0 , DEFAULT_BACKLIGHT)) { if(drvthis->config_get_bool( drvthis->name , "enablebacklight" , 0 , DEFAULT_BACKLIGHT)) {
backlightenabled = 1; backlightenabled = 1;
} }
/* Get display type */ /* Get display type */
strncpy(buf, config_get_string ( DriverName , "type" , 0 , DEFAULT_TYPE),sizeof(size)); strncpy(buf, drvthis->config_get_string ( drvthis->name , "type" , 0 , DEFAULT_TYPE),sizeof(buf));
buf[sizeof(buf)-1]=0; buf[sizeof(buf)-1]=0;
if (strncasecmp(buf, "lcd", 3) == 0) { if (strncasecmp(buf, "lcd", 3) == 0) {
@@ -396,7 +405,7 @@ MtxOrb_init (Driver *drvthis, char *args)
/* Get keypad settings*/ /* Get keypad settings*/
/* keypad test mode? */ /* keypad test mode? */
if (config_get_bool( DriverName , "keypad_test_mode" , 0 , 0)) { if (drvthis->config_get_bool( drvthis->name , "keypad_test_mode" , 0 , 0)) {
report (RPT_INFO, "MtxOrb: Entering keypad test mode...\n"); report (RPT_INFO, "MtxOrb: Entering keypad test mode...\n");
keypad_test_mode = 1; keypad_test_mode = 1;
} }
@@ -406,19 +415,19 @@ MtxOrb_init (Driver *drvthis, char *args)
* So there's no need to get them from the configfile in keypad test mode. * So there's no need to get them from the configfile in keypad test mode.
*/ */
/* pause_key */ /* pause_key */
pause_key = MtxOrb_parse_keypad_setting (DriverName, "pause_key", MTXORB_DEFAULT_PAUSE_KEY); pause_key = MtxOrb_parse_keypad_setting (drvthis, "pause_key", MTXORB_DEFAULT_PAUSE_KEY);
report (RPT_DEBUG, "MtxOrb: Using \"%c\" as pause_key.", pause_key); report (RPT_DEBUG, "MtxOrb: Using \"%c\" as pause_key.", pause_key);
/* back_key */ /* back_key */
back_key = MtxOrb_parse_keypad_setting (DriverName, "back_key", MTXORB_DEFAULT_BACK_KEY); back_key = MtxOrb_parse_keypad_setting (drvthis, "back_key", MTXORB_DEFAULT_BACK_KEY);
report (RPT_DEBUG, "MtxOrb: Using \"%c\" as back_key", back_key); report (RPT_DEBUG, "MtxOrb: Using \"%c\" as back_key", back_key);
/* forward_key */ /* forward_key */
forward_key = MtxOrb_parse_keypad_setting (DriverName, "forward_key", MTXORB_DEFAULT_FORWARD_KEY); forward_key = MtxOrb_parse_keypad_setting (drvthis, "forward_key", MTXORB_DEFAULT_FORWARD_KEY);
report (RPT_DEBUG, "MtxOrb: Using \"%c\" as forward_key", forward_key); report (RPT_DEBUG, "MtxOrb: Using \"%c\" as forward_key", forward_key);
/* main_menu_key */ /* main_menu_key */
main_menu_key = MtxOrb_parse_keypad_setting (DriverName, "main_menu_key", MTXORB_DEFAULT_MAIN_MENU_KEY); main_menu_key = MtxOrb_parse_keypad_setting (drvthis, "main_menu_key", MTXORB_DEFAULT_MAIN_MENU_KEY);
report (RPT_DEBUG, "MtxOrb: Using \"%c\" as main_menu_key", main_menu_key); report (RPT_DEBUG, "MtxOrb: Using \"%c\" as main_menu_key", main_menu_key);
} }
@@ -472,14 +481,14 @@ MtxOrb_init (Driver *drvthis, char *args)
report (RPT_ERR, "MtxOrb_init: %s requires an argument\n", argv[i]); report (RPT_ERR, "MtxOrb_init: %s requires an argument\n", argv[i]);
return -1; return -1;
} }
contrast = MtxOrb_parse_contrast (argv[++i]); contrast = MtxOrb_parse_contrast (drvthis, argv[++i]);
break; break;
case 's': case 's':
if (i + 1 > argc) { if (i + 1 > argc) {
report (RPT_ERR, "MtxOrb_init: %s requires an argument\n", argv[i]); report (RPT_ERR, "MtxOrb_init: %s requires an argument\n", argv[i]);
return -1; return -1;
} }
speed = MtxOrb_parse_speed (argv[++i]); speed = MtxOrb_parse_speed (drvthis, argv[++i]);
break; break;
case 'h': case 'h':
MtxOrb_usage(); MtxOrb_usage();
@@ -518,7 +527,7 @@ MtxOrb_init (Driver *drvthis, char *args)
return -1; return -1;
} }
i++; i++;
MtxOrb_type = MtxOrb_parse_type(argv[i]); MtxOrb_type = MtxOrb_parse_type(drvthis, argv[i]);
break; break;
default: default:
printf ("Invalid parameter: %s\n", argv[i]); printf ("Invalid parameter: %s\n", argv[i]);
@@ -584,48 +593,6 @@ MtxOrb_init (Driver *drvthis, char *args)
MtxOrb_cursorblink (drvthis, DEFAULT_CURSORBLINK); MtxOrb_cursorblink (drvthis, DEFAULT_CURSORBLINK);
MtxOrb_set_contrast (drvthis, contrast); MtxOrb_set_contrast (drvthis, contrast);
/*
* Configure the display functions
*/
/* Set variables for server */
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
/* Set the functions the driver supports */
drvthis->clear = MtxOrb_clear;
drvthis->string = MtxOrb_string;
drvthis->chr = MtxOrb_chr;
drvthis->num = MtxOrb_num;
/* Old stuff that are going to be removed */
drvthis->old_vbar = MtxOrb_old_vbar;
drvthis->init_vbar = MtxOrb_init_old_vbar; /* EMPTY NOW */
drvthis->old_hbar = MtxOrb_old_hbar;
drvthis->init_hbar = MtxOrb_init_old_hbar; /* EMPTY NOW */
drvthis->old_icon = MtxOrb_old_icon;
drvthis->init_num = MtxOrb_init_old_num; /* EMPTY NOW */
/* Old stuff that are going to be removed */
drvthis->init = MtxOrb_init;
drvthis->close = MtxOrb_close;
drvthis->width = MtxOrb_width;
drvthis->height = MtxOrb_height;
drvthis->flush = MtxOrb_flush;
drvthis->get_contrast = MtxOrb_get_contrast;
drvthis->set_contrast = MtxOrb_set_contrast;
drvthis->backlight = MtxOrb_backlight;
drvthis->output = MtxOrb_output;
drvthis->set_char = MtxOrb_set_char;
/* Looking for the segfault... */
/* drvthis->icon = MtxOrb_icon; */
drvthis->getkey = MtxOrb_getkey;
drvthis->get_info = MtxOrb_get_info;
drvthis->heartbeat = MtxOrb_heartbeat;
return 0; return 0;
} }
@@ -788,7 +755,7 @@ MtxOrb_chr (Driver *drvthis, int x, int y, char c)
ValidX(x); ValidX(x);
ValidY(y); ValidY(y);
/* write immediately to screen... this code was taken /* write immediately to screen... this code was taken
* from the LK202-25; should work for others, yes? * from the LK202-25; should work for others, yes?
* snprintf(out, sizeof(out), "\x0FEG%c%c%c", x, y, c); * snprintf(out, sizeof(out), "\x0FEG%c%c%c", x, y, c);
* write (fd, out, 4); * write (fd, out, 4);
@@ -845,7 +812,7 @@ MtxOrb_set_contrast (Driver *drvthis, int promille)
/****************************** /******************************
* Sets the backlight on or off -- can be done quickly for * Sets the backlight on or off -- can be done quickly for
* an intermediate brightness... * an intermediate brightness...
* *
* WARNING: off switches vfd/vkd displays off entirely * WARNING: off switches vfd/vkd displays off entirely
* so maybe it is best to start LCDd with -b on * so maybe it is best to start LCDd with -b on
* *
@@ -915,7 +882,7 @@ MtxOrb_output (Driver *drvthis, int on)
} else { } else {
int i; int i;
/* Other displays have six output ports; /* Other displays have six output ports;
* the value "on" is a binary value determining which * the value "on" is a binary value determining which
* ports are turned on (1) and off (0). * ports are turned on (1) and off (0).
*/ */
@@ -1241,7 +1208,7 @@ MtxOrb_num (Driver *drvthis, int pos, int val)
/* printf("pos: %d char: %d val: %d\n", pos, c, val); */ /* printf("pos: %d char: %d val: %d\n", pos, c, val); */
for (y=0;y<4;y++) { for (y=0;y<4;y++) {
for (x=0;x<3;x++) { for (x=0;x<3;x++) {
MtxOrb_icon (drvthis, x+pos, y+1, START_FONT + normal[c][x + (y * 3)]); MtxOrb_icon (drvthis, x+pos, y+1, START_FONT + normal[c][x + (y * 3)]);
} }
} }
} }
@@ -1285,7 +1252,7 @@ MtxOrb_set_char (Driver *drvthis, int n, char *dat)
for (col = 0; col < cellwidth; col++) { for (col = 0; col < cellwidth; col++) {
/* shift to make room for new scan line data */ /* shift to make room for new scan line data */
letter <<= 1; letter <<= 1;
/* Now read a single bit of data /* Now read a single bit of data
* -- one entry in dat[] -- * -- one entry in dat[] --
* and add it to the binary data in "letter" * and add it to the binary data in "letter"
*/ */
@@ -1366,9 +1333,9 @@ MtxOrb_ask_bar (Driver *drvthis, int type)
/* This bypass the search for WHITE and BLACK */ /* This bypass the search for WHITE and BLACK */
if (type==barw) return 32; if (type==barw) return 32;
if (type==barb) return 255; if (type==barb) return 255;
/* If the screen was clear then no graphic caracter are in use yet. */ /* If the screen was clear then no graphic caracter are in use yet. */
if (clear) { if (clear) {
for (pos = 0; pos < 8; pos++) use[pos] = 0; for (pos = 0; pos < 8; pos++) use[pos] = 0;
clear = 0; clear = 0;
} }
@@ -1391,7 +1358,7 @@ MtxOrb_ask_bar (Driver *drvthis, int type)
pos = last_not_in_use; pos = last_not_in_use;
} }
if (pos != 8) { if (pos != 8) {
/* A caracter is found (Best match could solve our problem). /* A caracter is found (Best match could solve our problem).
* REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| found at %d.\n", pos); * REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| found at %d.\n", pos);
*/ */
@@ -1399,15 +1366,15 @@ MtxOrb_ask_bar (Driver *drvthis, int type)
MtxOrb_set_known_char (drvthis, pos, type); MtxOrb_set_known_char (drvthis, pos, type);
/* fprintf(stderr, "GLU: MtxOrb_ask_bar [Set a char] pos: %d.\n", pos); */ /* fprintf(stderr, "GLU: MtxOrb_ask_bar [Set a char] pos: %d.\n", pos); */
/* Define a new graphic caracter. */ /* Define a new graphic caracter. */
def[pos] = type; def[pos] = type;
/* Remember that now the caracter is available. */ /* Remember that now the caracter is available. */
} }
if (!use[pos]) { if (!use[pos]) {
/* If the caracter is no yet in use (but defined). */ /* If the caracter is no yet in use (but defined). */
use[pos] = 1; use[pos] = 1;
/* Remember it is in use (so protect it from re-use). */ /* Remember it is in use (so protect it from re-use). */
} }
} }
if (pos==8) { if (pos==8) {
/* pos=65; ("A")? */ /* pos=65; ("A")? */
switch (type) { switch (type) {
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int MtxOrb_init (Driver *drvthis, char *device); MODULE_EXPORT int MtxOrb_init (Driver *drvthis, char *device);
MODULE_EXPORT void MtxOrb_close (Driver *drvthis); MODULE_EXPORT void MtxOrb_close (Driver *drvthis);
MODULE_EXPORT int MtxOrb_width (Driver *drvthis); MODULE_EXPORT int MtxOrb_width (Driver *drvthis);
MODULE_EXPORT int MtxOrb_height (Driver *drvthis); MODULE_EXPORT int MtxOrb_height (Driver *drvthis);
+1 -27
View File
@@ -317,7 +317,7 @@ MODULE_EXPORT char *symbol_prefix = "bayrad_";
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and // init() should set up any device-specific stuff, and
// point all the function pointers. // point all the function pointers.
int MODULE_EXPORT int
bayrad_init(Driver *drvthis, char *args) bayrad_init(Driver *drvthis, char *args)
{ {
@@ -456,32 +456,6 @@ bayrad_init(Driver *drvthis, char *args)
/* Reset and clear the BayRAD */ /* Reset and clear the BayRAD */
write(fd, "\x80\x86\x00\x1a\x1e", 5); // sync,reset to type 0, clear screen, home write(fd, "\x80\x86\x00\x1a\x1e", 5); // sync,reset to type 0, clear screen, home
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = bayrad_clear;
drvthis->string = bayrad_string;
drvthis->chr = bayrad_chr;
drvthis->vbar = bayrad_vbar;
//drvthis->init_vbar = bayrad_init_vbar;
drvthis->hbar = bayrad_hbar;
//drvthis->init_hbar = bayrad_init_hbar;
//drvthis->num = NULL; //bayrad_num;
//drvthis->init_num = NULL; //bayrad_init_num;
drvthis->init = bayrad_init;
drvthis->close = bayrad_close;
drvthis->flush = bayrad_flush;
drvthis->backlight = bayrad_backlight;
drvthis->set_char = bayrad_set_char;
drvthis->icon = bayrad_icon;
drvthis->get_key = bayrad_get_key;
return 0; return 0;
} }
+1 -1
View File
@@ -10,7 +10,7 @@
#include "lcd.h" #include "lcd.h"
int bayrad_init(Driver * drvthis, char *args); MODULE_EXPORT int bayrad_init(Driver * drvthis, char *args);
MODULE_EXPORT void bayrad_close(Driver * drvthis); MODULE_EXPORT void bayrad_close(Driver * drvthis);
MODULE_EXPORT int bayrad_width(Driver * drvthis); MODULE_EXPORT int bayrad_width(Driver * drvthis);
MODULE_EXPORT int bayrad_height(Driver * drvthis); MODULE_EXPORT int bayrad_height(Driver * drvthis);
+17 -57
View File
@@ -61,8 +61,6 @@ SunOS (5.5.1):
#include <curses.h> #include <curses.h>
#endif #endif
#include "shared/str.h"
#include "lcd.h" #include "lcd.h"
#include "curses_drv.h" #include "curses_drv.h"
#include "report.h" #include "report.h"
@@ -234,11 +232,10 @@ MODULE_EXPORT int supports_multiple = 0;
MODULE_EXPORT char *symbol_prefix = "curses_drv_"; MODULE_EXPORT char *symbol_prefix = "curses_drv_";
int MODULE_EXPORT int
curses_drv_init (Driver *drvthis, char *args) curses_drv_init (Driver *drvthis, char *args)
{ {
char buf[256]; char buf[256];
int w, h;
// Colors.... // Colors....
chtype back_color = DEFAULT_BACKGROUND_COLOR, chtype back_color = DEFAULT_BACKGROUND_COLOR,
@@ -249,19 +246,6 @@ curses_drv_init (Driver *drvthis, char *args)
int screen_begx = CONF_DEF_TOP_LEFT_X, int screen_begx = CONF_DEF_TOP_LEFT_X,
screen_begy = CONF_DEF_TOP_LEFT_Y; screen_begy = CONF_DEF_TOP_LEFT_Y;
// Set display sizes
if( drvthis->request_display_width() > 0
&& drvthis->request_display_height() > 0 ) {
// Use size from primary driver
width = drvthis->request_display_width();
height = drvthis->request_display_height();
}
else {
// Use default size
width = LCD_DEFAULT_WIDTH;
height = LCD_DEFAULT_HEIGHT;
}
/*Get settings from config file*/ /*Get settings from config file*/
/*Get color settings*/ /*Get color settings*/
@@ -284,21 +268,26 @@ curses_drv_init (Driver *drvthis, char *args)
//TODO: Make it possible to configure the backlight's "off" color and its "on" color //TODO: Make it possible to configure the backlight's "off" color and its "on" color
// Or maybe don't do so? - Rene Wagner // Or maybe don't do so? - Rene Wagner
/*Get size settings*/ /* Get size settings */
strncpy(buf, drvthis->config_get_string ( drvthis->name , "size" , 0 , CONF_DEF_SIZE), sizeof(buf)); if( drvthis->request_display_width() > 0
buf[sizeof(buf)-1]=0; && drvthis->request_display_height() > 0 ) {
if( sscanf(buf , "%dx%d", &w, &h ) != 2 /* If this driver is secondairy driver, use size from primary driver */
|| (w <= 0) width = drvthis->request_display_width();
|| (h <= 0)) { height = drvthis->request_display_height();
report (RPT_WARNING, "CURSES: Cannot read size: %s. Using default value.\n", buf);
//sscanf( CONF_DEF_SIZE , "%dx%d", &width, &height );
// default value is already set
} }
else { else {
width = w; /* Use our own size from config file */
height = h; strncpy(buf, drvthis->config_get_string ( drvthis->name , "size" , 0 , CONF_DEF_SIZE), sizeof(buf));
buf[sizeof(buf)-1]=0;
if( sscanf(buf , "%dx%d", &width, &height ) != 2
|| (width <= 0)
|| (height <= 0)) {
report (RPT_WARNING, "CURSES: Cannot read size: %s. Using default value: %s\n", buf, CONF_DEF_SIZE);
sscanf( CONF_DEF_SIZE , "%dx%d", &width, &height );
}
} }
/*Get position settings*/ /*Get position settings*/
if (0<=drvthis->config_get_int ( drvthis->name , "topleftx" , 0 , CONF_DEF_TOP_LEFT_X) && drvthis->config_get_int ( drvthis->name , "topleftx" , 0 , CONF_DEF_TOP_LEFT_X) <= 255) { if (0<=drvthis->config_get_int ( drvthis->name , "topleftx" , 0 , CONF_DEF_TOP_LEFT_X) && drvthis->config_get_int ( drvthis->name , "topleftx" , 0 , CONF_DEF_TOP_LEFT_X) <= 255) {
screen_begx = drvthis->config_get_int ( drvthis->name , "topleftx" , 0 , CONF_DEF_TOP_LEFT_X); screen_begx = drvthis->config_get_int ( drvthis->name , "topleftx" , 0 , CONF_DEF_TOP_LEFT_X);
@@ -348,35 +337,6 @@ curses_drv_init (Driver *drvthis, char *args)
curses_drv_clear (drvthis); curses_drv_clear (drvthis);
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->init = curses_drv_init;
drvthis->close = curses_drv_close;
drvthis->width = curses_drv_width;
drvthis->height = curses_drv_height;
drvthis->clear = curses_drv_clear;
drvthis->flush = curses_drv_flush;
drvthis->string = curses_drv_string;
drvthis->chr = curses_drv_chr;
drvthis->vbar = curses_drv_vbar;
//drvthis->init_vbar = NULL;
drvthis->hbar = curses_drv_hbar;
//drvthis->init_hbar = NULL;
drvthis->num = curses_drv_num;
//drvthis->init_num = curses_drv_init_num;
drvthis->backlight = curses_drv_backlight;
//drvthis->set_char = NULL;
drvthis->icon = curses_drv_icon;
drvthis->get_key = curses_drv_get_key;
drvthis->heartbeat = curses_drv_heartbeat;
// Change the character used for "..." // Change the character used for "..."
ELLIPSIS = '~'; ELLIPSIS = '~';
+2 -2
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int curses_drv_init (Driver * drvthis, char *args); MODULE_EXPORT int curses_drv_init (Driver * drvthis, char *args);
MODULE_EXPORT void curses_drv_close (Driver *drvthis); MODULE_EXPORT void curses_drv_close (Driver *drvthis);
MODULE_EXPORT int curses_drv_width (Driver *drvthis); MODULE_EXPORT int curses_drv_width (Driver *drvthis);
MODULE_EXPORT int curses_drv_height (Driver *drvthis); MODULE_EXPORT int curses_drv_height (Driver *drvthis);
@@ -28,7 +28,7 @@ MODULE_EXPORT void curses_drv_init_num (Driver *drvthis);
#define CONF_DEF_FOREGR "blue" #define CONF_DEF_FOREGR "blue"
#define CONF_DEF_BACKGR "cyan" #define CONF_DEF_BACKGR "cyan"
#define CONF_DEF_BACKLIGHT "red" #define CONF_DEF_BACKLIGHT "red"
#define CONF_DEF_SIZE "20x4" // currently not used, LCD_DEFAULT_WIDTH etc. is used #define CONF_DEF_SIZE "20x4"
#define CONF_DEF_TOP_LEFT_X 7 #define CONF_DEF_TOP_LEFT_X 7
#define CONF_DEF_TOP_LEFT_Y 7 #define CONF_DEF_TOP_LEFT_Y 7
+1 -29
View File
@@ -36,7 +36,7 @@ MODULE_EXPORT char *symbol_prefix = "debug_";
// TODO: somehow allow access to the driver->framebuffer to each // TODO: somehow allow access to the driver->framebuffer to each
// function... // function...
int MODULE_EXPORT int
debug_init (Driver *drvthis, char *args) debug_init (Driver *drvthis, char *args)
{ {
report (RPT_INFO, "debug_init()"); report (RPT_INFO, "debug_init()");
@@ -45,34 +45,6 @@ debug_init (Driver *drvthis, char *args)
debug_clear (drvthis); debug_clear (drvthis);
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = debug_clear;
drvthis->string = debug_string;
drvthis->chr = debug_chr;
drvthis->vbar = debug_vbar;
drvthis->hbar = debug_hbar;
drvthis->init_num = debug_init_num;
drvthis->num = debug_num;
drvthis->init = debug_init;
drvthis->close = debug_close;
drvthis->width = debug_width;
drvthis->height = debug_height;
drvthis->flush = debug_flush;
drvthis->set_contrast = debug_set_contrast;
drvthis->backlight = debug_backlight;
drvthis->set_char = debug_set_char;
drvthis->icon = debug_icon;
drvthis->init_vbar = debug_init_vbar;
drvthis->init_hbar = debug_init_hbar;
drvthis->get_key = debug_get_key;
return 0; return 0;
} }
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int debug_init (Driver *drvthis, char *args); MODULE_EXPORT int debug_init (Driver *drvthis, char *args);
MODULE_EXPORT void debug_close (Driver *drvthis); MODULE_EXPORT void debug_close (Driver *drvthis);
MODULE_EXPORT int debug_width (Driver *drvthis); MODULE_EXPORT int debug_width (Driver *drvthis);
MODULE_EXPORT int debug_height (Driver *drvthis); MODULE_EXPORT int debug_height (Driver *drvthis);
-317
View File
@@ -1,317 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <sys/errno.h>
#include "lcd.h"
#include "drv_base.h"
//////////////////////////////////////////////////////////////////////////
////////////////////// Base "class" to derive from ///////////////////////
//////////////////////////////////////////////////////////////////////////
lcd_logical_driver *drv_base;
// TODO: Get lcd.framebuf to properly work as whatever driver is running...
////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and
// point all the function pointers.
int
drv_base_init (struct lcd_logical_driver *driver, char *args)
{
// printf("drv_base_init()\n");
drv_base = driver;
driver->wid = 20;
driver->hgt = 4;
// You must use driver->framebuf here, but may use lcd.framebuf later.
if (!driver->framebuf)
driver->framebuf = malloc (driver->wid * driver->hgt);
if (!driver->framebuf) {
drv_base_close ();
return -1;
}
// Debugging...
// if(lcd.framebuf) printf("Frame buffer: %i\n", (int)lcd.framebuf);
memset (driver->framebuf, ' ', driver->wid * driver->hgt);
// drv_base_clear();
driver->cellwid = 5;
driver->cellhgt = 8;
driver->clear = drv_base_clear;
driver->string = drv_base_string;
driver->chr = drv_base_chr;
driver->vbar = drv_base_vbar;
driver->init_vbar = drv_base_init_vbar;
driver->hbar = drv_base_hbar;
driver->init_hbar = drv_base_init_hbar;
driver->num = drv_base_num;
driver->init_num = drv_base_init_num;
driver->init = drv_base_init;
driver->close = drv_base_close;
driver->flush = drv_base_flush;
driver->flush_box = drv_base_flush_box;
driver->contrast = drv_base_contrast;
driver->backlight = drv_base_backlight;
driver->set_char = drv_base_set_char;
driver->icon = drv_base_icon;
driver->draw_frame = drv_base_draw_frame;
driver->getkey = drv_base_getkey;
return 200; // 200 is arbitrary. (must be 1 or more)
}
// Below here, you may use either lcd.framebuf or driver->framebuf..
// lcd.framebuf will be set to the appropriate buffer before calling
// your driver.
void
drv_base_close ()
{
if (lcd.framebuf != NULL)
free (lcd.framebuf);
lcd.framebuf = NULL;
}
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
void
drv_base_clear ()
{
memset (lcd.framebuf, ' ', lcd.wid * lcd.hgt);
}
//////////////////////////////////////////////////////////////////
// Flushes all output to the lcd...
//
void
drv_base_flush ()
{
//lcd.draw_frame(lcd.framebuf);
}
/////////////////////////////////////////////////////////////////
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void
drv_base_string (int x, int y, char string[])
{
int i;
x -= 1; // Convert 1-based coords to 0-based...
y -= 1;
for (i = 0; string[i]; i++) {
// Check for buffer overflows...
if ((y * lcd.wid) + x + i > (lcd.wid * lcd.hgt))
break;
lcd.framebuf[(y * lcd.wid) + x + i] = string[i];
}
}
/////////////////////////////////////////////////////////////////
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
void
drv_base_chr (int x, int y, char c)
{
y--;
x--;
lcd.framebuf[(y * lcd.wid) + x] = c;
}
//////////////////////////////////////////////////////////////////////
// Sets the contrast of the display. Value is 0-255, where 140 is
// what I consider "just right".
//
int
drv_base_contrast (int contrast)
{
// printf("Contrast: %i\n", contrast);
return -1;
}
//////////////////////////////////////////////////////////////////////
// Turns the lcd backlight on or off...
//
void
drv_base_backlight (int on)
{
/*
if(on)
{
printf("Backlight ON\n");
}
else
{
printf("Backlight OFF\n");
}
*/
}
//////////////////////////////////////////////////////////////////////
// Tells the driver to get ready for vertical bargraphs.
//
void
drv_base_init_vbar ()
{
// printf("Vertical bars.\n");
}
//////////////////////////////////////////////////////////////////////
// Tells the driver to get ready for horizontal bargraphs.
//
void
drv_base_init_hbar ()
{
// printf("Horizontal bars.\n");
}
//////////////////////////////////////////////////////////////////////
// Tells the driver to get ready for big numbers, if possible.
//
void
drv_base_init_num ()
{
// printf("Big Numbers.\n");
}
//////////////////////////////////////////////////////////////////////
// Draws a big (4-row) number.
//
void
drv_base_num (int x, int num)
{
// printf("BigNum(%i, %i)\n", x, num);
}
//////////////////////////////////////////////////////////////////////
// Changes the font data of character n.
//
void
drv_base_set_char (int n, char *dat)
{
// printf("Set Character %i\n", n);
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar, from the bottom of the screen up.
//
void
drv_base_vbar (int x, int len)
{
int y;
for (y = lcd.hgt; y > 0 && len > 0; y--) {
drv_base_chr (x, y, '|');
len -= lcd.cellhgt;
}
}
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
void
drv_base_hbar (int x, int y, int len)
{
for (; x <= lcd.wid && len > 0; x++) {
drv_base_chr (x, y, '-');
len -= lcd.cellwid;
}
}
/////////////////////////////////////////////////////////////////
// Sets character 0 to an icon...
//
void
drv_base_icon (int which, char dest)
{
// printf("Char %i set to icon %i\n", dest, which);
}
//////////////////////////////////////////////////////////////////////
// Send a rectangular area to the display.
//
// I've just called drv_base_flush() because there's not much point yet
// in flushing less than the entire framebuffer.
//
void
drv_base_flush_box (int lft, int top, int rgt, int bot)
{
//drv_base_flush();
}
//////////////////////////////////////////////////////////////////////
// Draws the framebuffer on the display.
//
// The commented-out code is from the text driver.
//
void
drv_base_draw_frame (char *dat)
{
/*
int i, j;
char out[LCD_MAX_WIDTH];
if(!dat) return;
for(i=0; i<lcd.wid; i++)
{
out[i] = '-';
}
out[lcd.wid] = 0;
printf("+%s+\n", out);
for(i=0; i<lcd.hgt; i++)
{
for(j=0; j<lcd.wid; j++)
{
out[j] = dat[j+(i*lcd.wid)];
}
out[lcd.wid] = 0;
printf("|%s|\n", out);
}
for(i=0; i<lcd.wid; i++)
{
out[i] = '-';
}
out[lcd.wid] = 0;
printf("+%s+\n", out);
*/
}
//////////////////////////////////////////////////////////////////////
// Tries to read a character from an input device...
//
// Return 0 for "nothing available".
//
char
drv_base_getkey ()
{
return 0;
}
-117
View File
@@ -1,117 +0,0 @@
#ifndef LCD_DRV_BASE_H
#define LCD_DRV_BASE_H
/********************************************************************
How to make a driver for LCDproc
Note: Insert the name of your driver in place of the phrase "new_driver".
1. Copy drv_base.c and drv_base.h to new_driver.c and new_driver.h.
2. Decide which functions you want to override, which ones you want
to leave alone, and which ones you don't want at all. If you
write your own driver functions, they will get called when
appropriate. Or, you can let the default driver "drv_base"
handle a function for you. But, if you really don't want a
function, you can completely prevent your driver from providing
it. This is discussed in step 5.
2.1. Remove all functions which you don't want to override, and the
ones you don't want at all.
3. Rename all functions from "drv_base_*" to "new_driver_*".
4. Write the new driver functions.
Be sure to do one of the following in/for your new_driver_close():
- free the framebuffer lcd.framebuf
- let the default driver handle close()
- call drv_base_close()
This will ensure that the frame buffer gets freed.
5. Register your functions in your new_driver_init(), like the following:
driver->clear = new_driver_clear; // We want to handle this one
driver->string = (void *)-1; // Leave this to the default
driver->getkey = NULL; // This should never get called
The convention here is to set NULL for all the functions which
your driver doesn't handle (and which you don't want the default
functions to be called for). Or, set -1 to indicate that the
driver should support the function but can use the default
behavior in drv_base.c. Or, to indicate that your driver should
handle a function, just set it like clear() above.
6. Add the driver to lcd.c, in the physical drivers section, protected
by an #ifdef like the rest of the drivers are.
7. Add your driver to the Makefile, and Makefile.config, in the same
style as the existing ones.
Notes:
Don't call lcd.whatever() functions within your driver. This causes
a lot of potentially puzzling problems.
However, feel free to access lcd.framebuf in your driver (but not in
your init() function!). It will always point to the frame buffer
you should be writing to. This will usually be your own frame
buffer, but could potentially be another frame buffer, if another
driver wants to access your functions.
Your driver will be provided with a frame buffer which contains one
byte per character on the LCD. The default is a 20x4, so that's 80
bytes. You can free this and reallocate it to something else if you
need to. A graphical driver may want to do this, for example.
If you don't set a function pointer, it will default to NULL, since
they get nullified before the driver's init() is called.
Assume that your driver may be added or removed dynamically, and
that more than one instance may exist at a time. In other words, it
should init and close cleanly, and not depend on global variables.
Special arguments will be passed through the "args" variable to your
_init() function. This is just a string, and you determine the
syntax of it. Please document the syntax so that it can easily be
included in the lcdproc config file. I suggest arguments such as
"port=0x378" or "-device /dev/ttyS0". These come directly from the
lcdproc server config file, so they should be human-readable. An
example may look like this:
# Set up two MtxOrb LCD's and a curses display on VT 2
Driver MtxOrb -device /dev/ttyS0 -keypad on
Driver curses -color off -size 20x4 -vt 2
Driver MtxOrb -device /dev/ttyS3 -size 20x2 -keypad off
# Before you ask, no, not all of these options are implemented yet.
Also, the driver API (if it can be called that) may change soon.
There seem to be several functions which just don't do anything
important... and there are other potential improvements too.
And... When in doubt, look at how the other drivers do it. :)
******************************************************************/
extern lcd_logical_driver *drv_base;
int drv_base_init (struct lcd_logical_driver *driver, char *args);
void drv_base_close ();
void drv_base_clear ();
void drv_base_flush ();
void drv_base_string (int x, int y, char string[]);
void drv_base_chr (int x, int y, char c);
int drv_base_contrast (int contrast);
void drv_base_backlight (int on);
void drv_base_output (int on);
void drv_base_vbar (int x, int len);
void drv_base_init_vbar ();
void drv_base_hbar (int x, int y, int len);
void drv_base_init_hbar ();
void drv_base_num (int x, int num);
void drv_base_init_num ();
void drv_base_set_char (int n, char *dat);
void drv_base_icon (int which, char dest);
void drv_base_flush_box (int lft, int top, int rgt, int bot);
void drv_base_draw_frame (char *dat);
char drv_base_getkey ();
#endif
+1 -29
View File
@@ -62,7 +62,7 @@ MODULE_EXPORT char *symbol_prefix = "glk_";
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and // init() should set up any device-specific stuff, and
// point all the function pointers. // point all the function pointers.
int MODULE_EXPORT int
glk_init(Driver *drvthis, char *args) glk_init(Driver *drvthis, char *args)
{ {
char * argv[64]; char * argv[64];
@@ -206,34 +206,6 @@ glk_init(Driver *drvthis, char *args)
// Set contrast // Set contrast
glk_set_contrast( drvthis, contrast ); glk_set_contrast( drvthis, contrast );
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = glk_clear;
drvthis->string = glk_string;
drvthis->chr = glk_chr;
drvthis->old_vbar = glk_vbar;
drvthis->init_vbar = glk_init_vbar;
drvthis->old_hbar = glk_hbar;
drvthis->init_hbar = glk_init_hbar;
drvthis->num = glk_num ;
drvthis->init_num = glk_init_num ;
drvthis->init = glk_init;
drvthis->close = glk_close;
drvthis->flush = glk_flush;
drvthis->get_contrast = glk_get_contrast;
drvthis->set_contrast = glk_set_contrast;
drvthis->backlight = glk_backlight;
drvthis->output = glk_output;
drvthis->set_char = glk_set_char;
drvthis->old_icon = glk_icon;
drvthis->getkey = glk_getkey;
return 0; return 0;
} }
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int glk_init(Driver *drvthis, char *args); MODULE_EXPORT int glk_init(Driver *drvthis, char *args);
MODULE_EXPORT void glk_close(Driver *drvthis); MODULE_EXPORT void glk_close(Driver *drvthis);
MODULE_EXPORT int glk_width(Driver *drvthis); MODULE_EXPORT int glk_width(Driver *drvthis);
MODULE_EXPORT int glk_height(Driver *drvthis); MODULE_EXPORT int glk_height(Driver *drvthis);
-1
View File
@@ -65,7 +65,6 @@
#include "lpt-port.h" #include "lpt-port.h"
#include "port.h" #include "port.h"
#include "shared/str.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
-2
View File
@@ -19,9 +19,7 @@
#include "hd44780-picanlcd.h" #include "hd44780-picanlcd.h"
#include "hd44780-low.h" #include "hd44780-low.h"
#include "hd44780.h"
#include "shared/str.h"
#include "report.h" #include "report.h"
#include <stdlib.h> #include <stdlib.h>
-1
View File
@@ -54,7 +54,6 @@
#include "lpt-port.h" #include "lpt-port.h"
#include "port.h" #include "port.h"
#include "shared/str.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
-1
View File
@@ -63,7 +63,6 @@
#include "lpt-port.h" #include "lpt-port.h"
#include "port.h" #include "port.h"
#include "shared/str.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
+3 -34
View File
@@ -69,7 +69,6 @@
# include "config.h" # include "config.h"
#endif #endif
#include "shared/str.h"
#include "lcd.h" #include "lcd.h"
#include "lcd_lib.h" #include "lcd_lib.h"
#include "hd44780.h" #include "hd44780.h"
@@ -121,7 +120,7 @@ MODULE_EXPORT char *symbol_prefix = "HD44780_";
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly... // Opens com port and sets baud correctly...
// //
int MODULE_EXPORT int
HD44780_init (Driver * drvthis, char *args) HD44780_init (Driver * drvthis, char *args)
{ {
// TODO: remove the two magic numbers below // TODO: remove the two magic numbers below
@@ -251,8 +250,6 @@ HD44780_init (Driver * drvthis, char *args)
if ( p->have_keypad ) { if ( p->have_keypad ) {
int x, y; int x, y;
drvthis->get_key = HD44780_get_key;
// Read keymap // Read keymap
for( x=0; x<KEYPAD_MAXX; x++ ) { for( x=0; x<KEYPAD_MAXX; x++ ) {
char buf[40]; char buf[40];
@@ -293,36 +290,6 @@ HD44780_init (Driver * drvthis, char *args)
} }
} }
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports...
// These are the default HD44780 functions
drvthis->init = HD44780_init;
drvthis->close = HD44780_close;
drvthis->width = HD44780_width;
drvthis->height = HD44780_height;
drvthis->flush = HD44780_flush;
drvthis->clear = HD44780_clear;
drvthis->chr = HD44780_chr;
drvthis->string = HD44780_string;
//drvthis->flush_box = HD44780_flush_box; // TO BE REMOVED
//drvthis->contrast = HD44780_contrast; // contrast is set by potmeter we assume
//drvthis->output = HD44780_output; // not implemented
//drvthis->init_vbar = HD44780_init_vbar;
//drvthis->init_hbar = HD44780_init_hbar;
drvthis->vbar = HD44780_vbar;
drvthis->hbar = HD44780_hbar;
drvthis->init_num = HD44780_init_num;
drvthis->num = HD44780_num;
drvthis->heartbeat = HD44780_heartbeat;
drvthis->set_char = HD44780_set_char;
drvthis->icon = HD44780_icon;
//drvthis->draw_frame = HD44780_draw_frame; // TO BE REMOVED
if ((p->hd44780_functions = (HD44780_functions *) malloc (sizeof (HD44780_functions))) == NULL) { if ((p->hd44780_functions = (HD44780_functions *) malloc (sizeof (HD44780_functions))) == NULL) {
fprintf (stderr, "Error mallocing for function struct"); fprintf (stderr, "Error mallocing for function struct");
return -1; return -1;
@@ -1075,6 +1042,8 @@ HD44780_get_key(Driver *drvthis)
char * keystr = NULL; char * keystr = NULL;
struct timeval curr_time, time_diff; struct timeval curr_time, time_diff;
if( ! p->have_keypad ) return NULL;
gettimeofday(&curr_time,NULL); gettimeofday(&curr_time,NULL);
scancode = p->hd44780_functions->scankeypad(p); scancode = p->hd44780_functions->scankeypad(p);
+4 -4
View File
@@ -18,7 +18,7 @@
#include "lcd.h" #include "lcd.h"
int HD44780_init (struct lcd_logical_driver *driver, char *args); MODULE_EXPORT int HD44780_init (struct lcd_logical_driver *driver, char *args);
MODULE_EXPORT void HD44780_close (Driver *drvthis); MODULE_EXPORT void HD44780_close (Driver *drvthis);
MODULE_EXPORT int HD44780_width (Driver *drvthis); MODULE_EXPORT int HD44780_width (Driver *drvthis);
MODULE_EXPORT int HD44780_height (Driver *drvthis); MODULE_EXPORT int HD44780_height (Driver *drvthis);
@@ -39,8 +39,8 @@ MODULE_EXPORT void HD44780_backlight (Driver *drvthis, int on);
MODULE_EXPORT char * HD44780_get_key (Driver *drvthis); MODULE_EXPORT char * HD44780_get_key (Driver *drvthis);
MODULE_EXPORT void HD44780_init_vbar (Driver *drvthis); static void HD44780_init_vbar (Driver *drvthis);
MODULE_EXPORT void HD44780_init_hbar (Driver *drvthis); static void HD44780_init_hbar (Driver *drvthis);
MODULE_EXPORT void HD44780_init_num (Driver *drvthis); static void HD44780_init_num (Driver *drvthis);
#endif #endif
+1 -1
View File
@@ -75,7 +75,7 @@ lcd_logical_driver *irmanin;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and // init() should set up any device-specific stuff, and
// point all the function pointers. // point all the function pointers.
int MODULE_EXPORT int
irmanin_init (struct lcd_logical_driver *driver, char *args) irmanin_init (struct lcd_logical_driver *driver, char *args)
{ {
char device[256]; char device[256];
+3 -3
View File
@@ -3,8 +3,8 @@
extern lcd_logical_driver *joy; extern lcd_logical_driver *joy;
int irmanin_init (struct lcd_logical_driver *driver, char *args); MODULE_EXPORT int irmanin_init (struct lcd_logical_driver *driver, char *args);
void irmanin_close (); MODULE_EXPORT void irmanin_close ();
char irmanin_getkey (); MODULE_EXPORT char irmanin_getkey ();
#endif #endif
+1 -10
View File
@@ -65,7 +65,7 @@ MODULE_EXPORT char *symbol_prefix = "joy_";
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and // init() should set up any device-specific stuff, and
// point all the function pointers. // point all the function pointers.
int MODULE_EXPORT int
joy_init (Driver *drvthis, char *args) joy_init (Driver *drvthis, char *args)
{ {
char device[256]; char device[256];
@@ -105,15 +105,6 @@ joy_init (Driver *drvthis, char *args)
} }
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->getkey = joy_getkey;
drvthis->close = joy_close;
if ((fd = open (device, O_RDONLY)) < 0) if ((fd = open (device, O_RDONLY)) < 0)
return -1; return -1;
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int joy_init (Driver *drvthis, char *args); MODULE_EXPORT int joy_init (Driver *drvthis, char *args);
MODULE_EXPORT void joy_close (Driver *drvthis); MODULE_EXPORT void joy_close (Driver *drvthis);
MODULE_EXPORT char joy_getkey (Driver *drvthis); MODULE_EXPORT char joy_getkey (Driver *drvthis);
+1 -26
View File
@@ -68,7 +68,7 @@ MODULE_EXPORT char *symbol_prefix = "LB216_";
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly... // Opens com port and sets baud correctly...
// //
int MODULE_EXPORT int
LB216_init(Driver * drvthis, char *args) LB216_init(Driver * drvthis, char *args)
{ {
char *argv[64]; char *argv[64];
@@ -211,31 +211,6 @@ LB216_init(Driver * drvthis, char *args)
LB216_hidecursor(); LB216_hidecursor();
LB216_backlight(drvthis, backlight_brightness); LB216_backlight(drvthis, backlight_brightness);
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = LB216_clear;
drvthis->string = LB216_string;
drvthis->chr = LB216_chr;
drvthis->old_vbar = LB216_vbar;
drvthis->init_vbar = LB216_init_vbar;
drvthis->old_hbar = LB216_hbar;
drvthis->init_hbar = LB216_init_hbar;
//drvthis->num = NULL;
//drvthis->init_num = NULL;
drvthis->init = LB216_init;
drvthis->close = LB216_close;
drvthis->width = LB216_width;
drvthis->height = LB216_height;
drvthis->flush = LB216_flush;
drvthis->backlight = LB216_backlight;
drvthis->set_char = LB216_set_char;
drvthis->old_icon = LB216_icon;
return 0; return 0;
} }
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int LB216_init(Driver * drvthis, char *device); MODULE_EXPORT int LB216_init(Driver * drvthis, char *device);
MODULE_EXPORT void LB216_close(Driver * drvthis); MODULE_EXPORT void LB216_close(Driver * drvthis);
MODULE_EXPORT int LB216_width (Driver *drvthis); MODULE_EXPORT int LB216_width (Driver *drvthis);
MODULE_EXPORT int LB216_height (Driver *drvthis); MODULE_EXPORT int LB216_height (Driver *drvthis);
-714
View File
@@ -1,714 +0,0 @@
/*
* Driver master (lcd.c)
*
* This code actually sets up the drivers as requested,
* initializes drivers, and allocates memory for drivers.
*
*/
/*
* These drivers don't seem to be in the build process yet;
* so here we fake it and define these variables...!
*
* Not pretty, but it works and its up here so everyone
* can see... and you can yank them out of the comments
* to make it work.
*/
// #define SVGALIB_DRV
// #define T6963_DRV
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <sys/errno.h>
#include <syslog.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "shared/LL.h"
#include "shared/report.h"
#include "lcd.h"
/*
static int lcd_drv_init (lcd_logical_driver * driver, char *args);
static void lcd_drv_close ();
static void lcd_drv_clear ();
static void lcd_drv_flush ();
static void lcd_drv_string (int x, int y, char *string);
static void lcd_drv_chr (int x, int y, char c);
static int lcd_drv_contrast (int contrast);
static void lcd_drv_backlight (int on);
static void lcd_drv_output (int on);
static void lcd_drv_init_vbar ();
static void lcd_drv_init_hbar ();
static void lcd_drv_init_num ();
static void lcd_drv_num (int x, int num);
static void lcd_drv_set_char (int n, char *dat);
static void lcd_drv_vbar (int x, int len);
static void lcd_drv_hbar (int x, int y, int len);
static void lcd_drv_icon (int which, char dest);
static void lcd_drv_flush_box (int lft, int top, int rgt, int bot);
static void lcd_drv_draw_frame ();
static char lcd_drv_getkey ();
static char lcd_drv_getkey_loop ();
static char *lcd_drv_getinfo ();
static void lcd_drv_heartbeat (int type);
*/
/*
* Add all of the driver's header files in...
* but WHY?
*
*/
#ifdef LCDM001_DRV
#include "lcdm001.h"
#endif
#ifdef MTXORB_DRV
#include "MtxOrb.h"
#endif
#ifdef CFONTZ_DRV
#include "CFontz.h"
#endif
#ifdef LB216_DRV
#include "lb216.h"
#endif
#ifdef TEXT_DRV
#include "text.h"
#endif
#ifdef DEBUG_DRV
#include "debug.h"
#endif
#ifdef CURSES_DRV
#include "curses_drv.h"
#endif
#ifdef HD44780_DRV
#include "hd44780.h"
#endif
#ifdef SLI_DRV
#include "wirz-sli.h"
#endif
#ifdef JOY_DRV
#include "joy.h"
#endif
#ifdef IRMANIN_DRV
#include "irmanin.h"
#endif
#ifdef LIRCIN_DRV
#include "lircin.h"
#endif
#ifdef BAYRAD_DRV
#include "bayrad.h"
#endif
#ifdef SED1330_DRV
#include "sed1330.h"
#endif
#ifdef SED1520_DRV
#include "sed1520.h"
#endif
#ifdef STV5730_DRV
#include "stv5730.h"
#endif
#ifdef GLK_DRV
#include "glk.h"
#endif
#ifdef SVGALIB_DRV
#include "svgalib_drv.h"
#endif
#ifdef T6963_DRV
#include "t6963.h"
#endif
// Make program more readable and understandable;
// hide details...
//#define ResetList(a) LL_Rewind(a)
//#define GetDriverData(a) ((lcd_logical_driver *)LL_Get(a))
//#define NextDriver(a) (LL_Next(a))
//#define MoreDrivers(a) (LL_Next(a) == 0)
//#define DriverPresent(a) (a)
//#define FunctionPresent(a) ((a) != 0)
// TODO: Make a Windows server, and clients...?
//Driver *lcd_root = NULL;
//Driver *lcd_ptr = NULL;
// TODO: Add multiple names for the same driver?
//
// Would allow the use of "MatrixOrbital" (for example) or
// "Joystick" or "CrystalFontz" or similar more memorable
// names, as well as older ones...
//
lcd_physical_driver drivers[] = {
#ifdef LCDM001_DRV
{"lcdm001", lcdm001_init,},
{"LCDM001", lcdm001_init,},
#endif
#ifdef MTXORB_DRV
{"MtxOrb", MtxOrb_init,},
{"MatrixOrbital", MtxOrb_init,},
#endif
#ifdef CFONTZ_DRV
{"CFontz", CFontz_init,},
{"CrystalFontz", CFontz_init,},
#endif
#ifdef HD44780_DRV
{"HD44780", HD44780_init,},
{"Hitachi", HD44780_init,},
#endif
#ifdef SLI_DRV
{"sli", sli_init,},
{"Wirz", sli_init,},
#endif
#ifdef LB216_DRV
{"LB216", LB216_init,},
#endif
#ifdef TEXT_DRV
{"text", text_init,},
#endif
#ifdef DEBUG_DRV
{"debug", debug_init,},
#endif
#ifdef CURSES_DRV
{"curses", curses_drv_init,},
{"ncurses", curses_drv_init,},
#endif
#ifdef JOY_DRV
{"joy", joy_init,},
{"joystick", joy_init,},
#endif
#ifdef IRMANIN_DRV
{"irmanin", irmanin_init,},
#endif
#ifdef LIRCIN_DRV
{"lircin", lircin_init,},
#endif
#ifdef BAYRAD_DRV
{"BayRAD", bayrad_init,},
#endif
#ifdef GLK_DRV
{"glk", glk_init,},
{"glc", glk_init,},
#endif
#ifdef SED1330_DRV
{"sed1330", sed1330_init,},
#endif
#ifdef SED1520_DRV
{"sed1520", sed1520_init,},
#endif
#ifdef STV5730_DRV
{"stv5730", stv5730_init,},
#endif
#ifdef SVGALIB_DRV
{"svgalib", svgalib_drv_init,},
{"vga", svgalib_drv_init,},
{"svga", svgalib_drv_init,},
#endif
#ifdef T6963_DRV
{"t6963", t6963_init,},
{"Toshiba", t6963_init,},
#endif
{NULL, NULL,},
};
LinkedList *list;
#define CurrentDriver (drivers[i].name)
#define NextDriver (drivers[i+1].name)
void
lcd_list_drivers (void) {
int i = 0;
printf("\t");
while (CurrentDriver != NULL) {
printf("%s", CurrentDriver);
if (NextDriver != NULL)
printf(", ");
i++;
if ((i % 8) == 0)
printf("\n\t");
}
printf("\n");
}
////////////////////////////////////////////////////////////
// This function initializes a few basics as well as the
// "base" array. To initialize a specific driver, use the
// lcd_add_driver() function.
//
// This was eliminated; everything
// done here is to be replaced by the use of lcd_add_driver()...
/*
int
lcd_init (char *args)
{
return 0;
}
*/
// This sets up all of the "wrapper" driver functions
// which call all of the drivers in turn.
//
/*
static int
lcd_drv_init (struct lcd_logical_driver *driver, char *args)
{
driver->wid = LCD_STD_WIDTH;
driver->hgt = LCD_STD_HEIGHT;
driver->cellwid = LCD_STD_CELL_WIDTH;
driver->cellhgt = LCD_STD_CELL_HEIGHT;
driver->framebuf = NULL;
driver->nextkey = NULL;
driver->daemonize = 1;
// Set up these wrapper functions...
driver->clear = lcd_drv_clear;
driver->string = lcd_drv_string;
driver->chr = lcd_drv_chr;
driver->vbar = lcd_drv_vbar;
driver->hbar = lcd_drv_hbar;
driver->init_num = lcd_drv_init_num;
driver->num = lcd_drv_num;
driver->init = lcd_drv_init;
driver->close = lcd_drv_close;
driver->flush = lcd_drv_flush;
driver->flush_box = lcd_drv_flush_box;
driver->contrast = lcd_drv_contrast;
driver->backlight = lcd_drv_backlight;
driver->output = lcd_drv_output;
driver->set_char = lcd_drv_set_char;
driver->icon = lcd_drv_icon;
driver->init_vbar = lcd_drv_init_vbar;
driver->init_hbar = lcd_drv_init_hbar;
driver->draw_frame = lcd_drv_draw_frame;
driver->getkey = lcd_drv_getkey;
driver->getinfo = lcd_drv_getinfo;
driver->heartbeat = lcd_drv_heartbeat;
return 1; // 1 is arbitrary. (must be 1 or more)
}
#define ChkNull(a,b,c) if ((driver->a) == 0) { syslog(LOG_INFO, "warning: %s: null entries deprecated!", (c)); driver->a = (b); }
#define ChkBaseDrv(a,b,c) if ((driver->a) == (void *) -1) { syslog(LOG_ERR, "warning: %s: base driver has been REMOVED!", (c)); driver->a = (b); }
static int
lcd_drv_patch_init (struct lcd_logical_driver *driver)
{
// These are to patch drivers that use "NULL" as a valid value...
ChkNull(clear, lcd_drv_clear, "clear");
ChkNull(string, lcd_drv_string, "string");
ChkNull(chr, lcd_drv_chr, "chr");
ChkNull(vbar, lcd_drv_vbar, "vbar");
ChkNull(hbar, lcd_drv_hbar, "hbar");
ChkNull(init_num, lcd_drv_init_num, "init_num");
ChkNull(num, lcd_drv_num, "num");
ChkNull(init, lcd_drv_init, "init");
ChkNull(close, lcd_drv_close, "close");
ChkNull(flush, lcd_drv_flush, "flush");
ChkNull(flush_box, lcd_drv_flush_box, "flush_box");
ChkNull(contrast, lcd_drv_contrast, "contrast");
ChkNull(backlight, lcd_drv_backlight, "backlight");
ChkNull(output, lcd_drv_output, "output");
ChkNull(set_char, lcd_drv_set_char, "set_char");
ChkNull(icon, lcd_drv_icon, "icon");
ChkNull(init_vbar, lcd_drv_init_vbar, "init_vbar");
ChkNull(init_hbar, lcd_drv_init_hbar, "init_hbar");
ChkNull(draw_frame, lcd_drv_draw_frame, "draw_frame");
ChkNull(getkey, lcd_drv_getkey, "getkey");
ChkNull(getinfo, lcd_drv_getinfo, "getinfo");
ChkNull(heartbeat, lcd_drv_heartbeat, "heartbeat");
// Now check for base driver entries...;
ChkBaseDrv(clear, lcd_drv_clear, "clear");
ChkBaseDrv(string, lcd_drv_string, "string");
ChkBaseDrv(chr, lcd_drv_chr, "chr");
ChkBaseDrv(vbar, lcd_drv_vbar, "vbar");
ChkBaseDrv(hbar, lcd_drv_hbar, "hbar");
ChkBaseDrv(init_num, lcd_drv_init_num, "init_num");
ChkBaseDrv(num, lcd_drv_num, "num");
ChkBaseDrv(init, lcd_drv_init, "init");
ChkBaseDrv(close, lcd_drv_close, "close");
ChkBaseDrv(flush, lcd_drv_flush, "flush");
ChkBaseDrv(flush_box, lcd_drv_flush_box, "flush_box");
ChkBaseDrv(contrast, lcd_drv_contrast, "contrast");
ChkBaseDrv(backlight, lcd_drv_backlight, "backlight");
ChkBaseDrv(output, lcd_drv_output, "output");
ChkBaseDrv(set_char, lcd_drv_set_char, "set_char");
ChkBaseDrv(icon, lcd_drv_icon, "icon");
ChkBaseDrv(init_vbar, lcd_drv_init_vbar, "init_vbar");
ChkBaseDrv(init_hbar, lcd_drv_init_hbar, "init_hbar");
ChkBaseDrv(draw_frame, lcd_drv_draw_frame, "draw_frame");
ChkBaseDrv(getkey, lcd_drv_getkey, "getkey");
ChkBaseDrv(getinfo, lcd_drv_getinfo, "getinfo");
ChkBaseDrv(heartbeat, lcd_drv_heartbeat, "heartbeat");
return 0;
}
*/
/*
* This function can be replaced later with something
* that utilizes the results of dynamic library loading
*
*/
void *
lcd_find_init (char *driver) {
int i;
if (!driver)
return NULL;
for (i = 0; drivers[i].name; i++) {
if (strcasecmp(driver, drivers[i].name) == 0) {
return (*drivers[i].init);
}
}
return NULL;
}
// TODO: lcd_remove_driver()
/*
Driver *
lcd_allocate_driver () {
Driver *driver;
//int driver_size;
// This bit of fakery allows us to use lcd as the first
// allocated buffer, which is what everything currently uses for
// output in the main server code.
#define FirstTime (lcd_ptr->framebuf == NULL)
if ((driver = malloc(sizeof(Driver))) == NULL) {
syslog(LOG_ERR, "error allocating driver space!");
return NULL;
}
if (lcd_root == NULL)
lcd_root = driver;
if (lcd_ptr == NULL)
lcd_ptr = driver;
return driver;
}
// This initializes the specified driver and sends parameters to
// it. This is the function which calls, for example,
// MtxOrb_init. The specifics come from the drivers[] array.
static char (*main_getkey) () = NULL;
int
lcd_add_driver (char *driver, char *args)
{
int i;
char buf[80];
int (*init_driver) ();
lcd_logical_driver *ptr = NULL;
lcd_logical_driver *add = NULL;
if (!driver)
return -1;
if ((init_driver = (void *) lcd_find_init(driver)) != NULL) {
snprintf(buf, sizeof(buf), "adding %s driver", driver);
syslog(LOG_INFO, buf);
// This creates an instance of the lcd structure specific to the
// driver... it is passed to the driver's init routine...
if ((add = lcd_allocate_driver()) == NULL)
return -1;
memset (add, 0, sizeof (lcd_logical_driver));
// Default settings for the driver...
lcd_drv_init(add, NULL);
i = init_driver (add, args);
if (!add->framebuf) {
if ((add->framebuf = malloc (add->wid * add->hgt)) == NULL) {
snprintf (buf, sizeof(buf), "couldn't allocate framebuffer of %d chars for driver \"%s\"",
(add->wid * add->hgt), driver);
syslog (LOG_ERR, buf);
// free (add);
return -1;
}
}
memset (add->framebuf, ' ', (add->wid * add->hgt));
// Now patch up the returned driver structure
// before returning
lcd_drv_patch_init (add); // patches drivers that think NULL is okay...
if (main_getkey == NULL) {
// Patch the getkey with the getkey loop...
main_getkey = add->getkey;
add->getkey = lcd_drv_getkey_loop;
add->nextkey = NULL;
} else {
// Tack additional drivers onto the getkey list...
ptr = lcd_root;
while (ptr->nextkey)
ptr = ptr->nextkey;
// ptr now points to a driver which contains
// a nextkey which is NULL... add the new
// driver in.
ptr->nextkey = add;
}
return i;
} else {
snprintf(buf, sizeof(buf), "invalid driver: %s", driver);
syslog(LOG_ERR, buf);
}
return -1;
}
*/
//////////////////////////////////////////////////////////////////////
// All functions below here call their respective driver functions...
//
// The way it works is this:
// It loops through the list of drivers, calling each one to keep
// them all synchronized. During this loop...
// - First, set the framebuffer to point to the drivers' framebuffer.
// (this ensures that whatever driver gets called will operate on
// the correct buffer)
// - Then, it checks to see what sort of call to make.
// driver->func() > 0 means it should call the driver function.
// driver->func() == NULL means it should not make a call.
// driver->func() == -1 means it should call the generic driver.
//////////////////////////////////////////////////////////////////////
/*
* The functions below are null functions which are used
* when a particular driver does not set them.
*
*/
// lcd_drv_close ()
// lcd_drv_clear ()
// lcd_drv_flush ()
// lcd_drv_string (int x, int y, char string[])
// lcd_drv_chr (int x, int y, char c)
// lcd_drv_contrast (int contrast)
// lcd_drv_backlight (int on)
// lcd_drv_output (int on)
// lcd_drv_init_vbar ()
// lcd_drv_init_hbar ()
// lcd_drv_init_num ()
// lcd_drv_num (int x, int num)
// lcd_drv_set_char (int n, char *dat)
// lcd_drv_vbar (int x, int len)
// lcd_drv_hbar (int x, int y, int len)
// lcd_drv_icon (int which, char dest)
// lcd_drv_flush_box (int lft, int top, int rgt, int bot)
// lcd_drv_draw_frame (char *dat)
// lcd_drv_getkey ()
// lcd_drv_getinfo ()
/*
static void
lcd_drv_close ()
{
;
}
static void
lcd_drv_clear ()
{
;
}
static void
lcd_drv_flush ()
{
;
}
static void
lcd_drv_string (int x, int y, char *string)
{
;
}
static void
lcd_drv_chr (int x, int y, char c)
{
;
}
static int
lcd_drv_contrast (int contrast)
{
return -1;
}
static void
lcd_drv_backlight (int on)
{
;
}
static void
lcd_drv_output (int on)
{
;
}
static void
lcd_drv_init_vbar ()
{
;
}
static void
lcd_drv_init_hbar ()
{
;
}
static void
lcd_drv_init_num ()
{
;
}
static void
lcd_drv_num (int x, int num)
{
;
}
static void
lcd_drv_set_char (int n, char *dat)
{
;
}
static void
lcd_drv_vbar (int x, int len)
{
;
}
static void
lcd_drv_hbar (int x, int y, int len)
{
;
}
static void
lcd_drv_icon (int which, char dest)
{
;
}
static void
lcd_drv_flush_box (int lft, int top, int rgt, int bot)
{
;
}
static void
lcd_drv_draw_frame (char *dat)
{
;
}
static char *
lcd_drv_getinfo ()
{
return NULL;
}
static char
lcd_drv_getkey ()
{
return 0;
}
// This loops through all defined getkeys, returning
// the first input that it finds, if any.
static char
lcd_drv_getkey_loop () {
Driver *driver;
char c;
if ((c = main_getkey()) != 0)
return c;
driver = lcd_root;
while ((driver = driver->nextkey) != NULL)
if ((c = driver->getkey()) > 0)
return c;
return 0;
}
static void
lcd_drv_heartbeat (int type)
{
;
}
*/
+7 -27
View File
@@ -1,5 +1,5 @@
/* /*
* client.h * lcd.h
* This file is part of LCDd, the lcdproc server. * This file is part of LCDd, the lcdproc server.
* *
* This file is released under the GNU General Public License. Refer to the * This file is released under the GNU General Public License. Refer to the
@@ -24,6 +24,8 @@
#ifndef LCD_H #ifndef LCD_H
#define LCD_H #define LCD_H
#include <stddef.h>
/* Maximum supported sizes */ /* Maximum supported sizes */
#define LCD_MAX_WIDTH 256 #define LCD_MAX_WIDTH 256
#define LCD_MAX_HEIGHT 256 #define LCD_MAX_HEIGHT 256
@@ -71,9 +73,9 @@
/* What does the shared module handle look like on the current platform? */ /* What does the shared module handle look like on the current platform? */
#define MODULE_HANDLE void* #define MODULE_HANDLE void*
/* And how do we define the exported functions */ /* And how do we define the exported functions */
#define MODULE_EXPORT static #define MODULE_EXPORT
/* WHILE NOT MODULES static BECAUSE OTHERWISE WE HAVE MULTIPLE IDENTICAL SYMBOLS */
typedef struct lcd_logical_driver { typedef struct lcd_logical_driver {
@@ -84,10 +86,10 @@ typedef struct lcd_logical_driver {
/******** Variables in the driver module ********/ /******** Variables in the driver module ********/
/* The driver loader will look for symbols with these names ! */ /* The driver loader will look for symbols with these names ! */
char *api_version; char **api_version;
int *stay_in_foreground; /* Does this driver require to be in foreground ? */ int *stay_in_foreground; /* Does this driver require to be in foreground ? */
int *supports_multiple; /* Does this driver support multiple instances ? */ int *supports_multiple; /* Does this driver support multiple instances ? */
char *func_prefix; /* What should be prepended to the function names ? */ char **symbol_prefix; /* What should alternatively be prepended to the function names ? */
/******** Functions in the driver module ********/ /******** Functions in the driver module ********/
@@ -132,20 +134,6 @@ typedef struct lcd_logical_driver {
char * (*get_info) (); char * (*get_info) ();
/* OLD FUNCTIONS */
void (*old_vbar) (struct lcd_logical_driver* drvthis, int x, int len);
void (*old_hbar) (struct lcd_logical_driver* drvthis, int x, int y, int len);
void (*old_icon) (struct lcd_logical_driver* drvthis, int which, char dest);
/* THESE 3 TO BE REMOVED */
void (*init_vbar) ();
void (*init_hbar) ();
void (*init_num) ();
void (*draw_frame) ();
void (*flush_box) (int lft, int top, int rgt, int bot);
/* THESE 4 TO BE REMOVED */
/* Returns 0 for "no key pressed", or (A-Z). */ /* Returns 0 for "no key pressed", or (A-Z). */
char (*getkey) (); char (*getkey) ();
/* TO BE REMOVED, IS RENAMED AND CHANGED */ /* TO BE REMOVED, IS RENAMED AND CHANGED */
@@ -189,12 +177,4 @@ typedef struct lcd_logical_driver {
} Driver; } Driver;
void lcd_list_drivers (void); /* TO BE REMOVED WHEN WE HAVE LOADABLE MODULES */
typedef struct lcd_physical_driver { /* TO BE REMOVED WHEN WE HAVE LOADABLE MODULES */
char *name;
int (*init) (struct lcd_logical_driver * driver, char *device);
} lcd_physical_driver;
#endif #endif
+1 -36
View File
@@ -60,7 +60,6 @@
#include "lcd.h" #include "lcd.h"
#include "lcdm001.h" #include "lcdm001.h"
#include "shared/str.h"
#include "report.h" #include "report.h"
//#include "configfile.h" //#include "configfile.h"
@@ -174,7 +173,7 @@ lcdm001_cursorblink (Driver *drvthis, int on)
* init() should set up any device-specific stuff, and * init() should set up any device-specific stuff, and
* point all the function pointers. * point all the function pointers.
*/ */
int MODULE_EXPORT int
lcdm001_init (Driver *drvthis, char *args) lcdm001_init (Driver *drvthis, char *args)
{ {
char device[200]; char device[200];
@@ -250,40 +249,6 @@ lcdm001_init (Driver *drvthis, char *args)
snprintf (out, sizeof(out), "\%cL%c%c", 126, 0, 0); snprintf (out, sizeof(out), "\%cL%c%c", 126, 0, 0);
write (fd, out, 4); write (fd, out, 4);
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = lcdm001_clear;
drvthis->width = lcdm001_width;
drvthis->height = lcdm001_height;
drvthis->string = lcdm001_string;
drvthis->chr = lcdm001_chr;
drvthis->old_vbar =lcdm001_vbar;
//init_vbar is not needed
drvthis->old_hbar = lcdm001_hbar;
//init_hbar is not needed
drvthis->num = lcdm001_num;
//init_num is not needed
drvthis->init = lcdm001_init;
drvthis->close = lcdm001_close;
drvthis->flush = lcdm001_flush;
//contrast and backlight are not implemented as
//changing the contrast or the state of the backlight
//is not supported by the device
//Well ... you could make use of your screw drvthis and
//soldering iron ;)
drvthis->output = lcdm001_output;
//set_char is not implemented as custom chars are not
//supported by the device
drvthis->old_icon = lcdm001_icon;
drvthis->getkey = lcdm001_getkey;
drvthis->heartbeat = lcdm001_heartbeat;
return 0; return 0;
} }
+1 -1
View File
@@ -33,7 +33,7 @@
/* REMOVE: I don't thing this is actualy needed. */ /* REMOVE: I don't thing this is actualy needed. */
/* extern lcd_logical_driver *lcdm001; */ /* extern lcd_logical_driver *lcdm001; */
int lcdm001_init (struct lcd_logical_driver *driver, char *args); MODULE_EXPORT int lcdm001_init (struct lcd_logical_driver *driver, char *args);
MODULE_EXPORT void lcdm001_close (Driver *drvthis); MODULE_EXPORT void lcdm001_close (Driver *drvthis);
MODULE_EXPORT int lcdm001_width (Driver *drvthis); MODULE_EXPORT int lcdm001_width (Driver *drvthis);
MODULE_EXPORT int lcdm001_height (Driver *drvthis); MODULE_EXPORT int lcdm001_height (Driver *drvthis);
+1 -10
View File
@@ -87,21 +87,12 @@ lircin_getkey (Driver * drvthis)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// init() should set up any device-specific stuff, and // init() should set up any device-specific stuff, and
// point all the function pointers. // point all the function pointers.
int MODULE_EXPORT int
lircin_init (Driver * drvthis, char *args) lircin_init (Driver * drvthis, char *args)
{ {
/* assign funktions */ /* assign funktions */
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->getkey = lircin_getkey;
drvthis->close = lircin_close;
/* open socket to lirc */ /* open socket to lirc */
if (-1 == (fd = lirc_init ("lcdd", 1))) { if (-1 == (fd = lirc_init ("lcdd", 1))) {
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int lircin_init (Driver * drvthis, char *args); MODULE_EXPORT int lircin_init (Driver * drvthis, char *args);
MODULE_EXPORT void lircin_close (Driver * drvthis); MODULE_EXPORT void lircin_close (Driver * drvthis);
MODULE_EXPORT char lircin_getkey (Driver * drvthis); MODULE_EXPORT char lircin_getkey (Driver * drvthis);
+7 -42
View File
@@ -170,9 +170,8 @@
#include "port.h" #include "port.h"
#include "lpt-port.h" #include "lpt-port.h"
#include "shared/str.h" #include "report.h"
#include "shared/report.h" //#include "configfile.h"
#include "configfile.h"
#include "timing.h" #include "timing.h"
#define uPause timing_uPause #define uPause timing_uPause
@@ -256,7 +255,7 @@ inline void sed1330_set_pixel( PrivateData * p, int x, int y, int value );
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Init the driver and display // Init the driver and display
// //
int MODULE_EXPORT int
sed1330_init( Driver * drvthis, char *args ) sed1330_init( Driver * drvthis, char *args )
{ {
char * s; char * s;
@@ -265,8 +264,6 @@ sed1330_init( Driver * drvthis, char *args )
debug( RPT_INFO, "SED1330: init(%p,%s)", drvthis, args ); debug( RPT_INFO, "SED1330: init(%p,%s)", drvthis, args );
// TODO: replace DriverName with driver->name when that field exists.
// Alocate and store private p // Alocate and store private p
p = (PrivateData *) malloc( sizeof(PrivateData) ); p = (PrivateData *) malloc( sizeof(PrivateData) );
@@ -281,13 +278,14 @@ sed1330_init( Driver * drvthis, char *args )
// READ THE CONFIG FILE // READ THE CONFIG FILE
// Port // Port
port = config_get_int( drvthis->name, "port", 0, 0x278 ); port = drvthis->config_get_int( drvthis->name, "port", 0, 0x278 );
p->port = port; p->port = port;
// Type // Type
s = drvthis->config_get_string( drvthis->name, "type", 0, NULL ); s = drvthis->config_get_string( drvthis->name, "type", 0, NULL );
if( !s ) { if( !s ) {
report( RPT_ERR, "SED1330: you need to specify the display type" ); report( RPT_ERR, "SED1330: you need to specify the display type" );
return -1;
} else if( strcmp( s, "G321D" ) == 0 ) { } else if( strcmp( s, "G321D" ) == 0 ) {
p->type = TYPE_G321D; p->type = TYPE_G321D;
p->graph_width = 320; p->graph_width = 320;
@@ -363,39 +361,6 @@ sed1330_init( Driver * drvthis, char *args )
if (timing_init() == -1) if (timing_init() == -1)
return -1; return -1;
// Set variables for server
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->api_version = api_version;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports...
drvthis->init = sed1330_init;
drvthis->close = sed1330_close;
drvthis->width = sed1330_width;
drvthis->height = sed1330_height;
drvthis->flush = sed1330_flush;
drvthis->clear = sed1330_clear;
drvthis->chr = sed1330_chr;
drvthis->string = sed1330_string;
//drvthis->init_vbar = sed1330_init_vbar;
//drvthis->init_hbar = sed1330_init_hbar;
drvthis->vbar = sed1330_vbar;
drvthis->hbar = sed1330_hbar;
//drvthis->init_num = sed1330_init_num;
drvthis->num = sed1330_num;
drvthis->heartbeat = sed1330_heartbeat;
//drvthis->set_char = sed1330_set_char;
//drvthis->icon = sed1330_icon;
// drvthis->contrast = sed1330_contrast; // contrast is set by potmeter we assume
// drvthis->output = sed1330_output; // not implemented
// drvthis->flush_box = sed1330_flush_box; // NOT SUPPORTED ANYMORE
// drvthis->draw_frame = sed1330_draw_frame; // NOT SUPPORTED ANYMORE
// INITIALIZE THE LCD // INITIALIZE THE LCD
// End reset-state // End reset-state
debug( RPT_DEBUG, "SED1330: initializing LCD" ); debug( RPT_DEBUG, "SED1330: initializing LCD" );
@@ -413,11 +378,11 @@ sed1330_init( Driver * drvthis, char *args )
sed1330_command( p, CMD_SCROLL, 10, ((char[6]) {SCR1_L,SCR1_H,0xC7,SCR2_L,SCR2_H,0xC7}) ); // screen1 and screen2 memory locations sed1330_command( p, CMD_SCROLL, 10, ((char[6]) {SCR1_L,SCR1_H,0xC7,SCR2_L,SCR2_H,0xC7}) ); // screen1 and screen2 memory locations
break; break;
case TYPE_G121C: case TYPE_G121C:
sed1330_command( p, CMD_SYSTEM_SET, 8, ((char[8]) {0x30,0x80+CHARWIDTH-1,CHARHEIGHT-1,0x14,0x18,0x7F,0x16,0x00}) ); // Set textmode 21x12 sed1330_command( p, CMD_SYSTEM_SET, 8, ((char[8]) {0x30,0x80+CHARWIDTH-1,CHARHEIGHT-1,0x14,0x58,0x7F,0x16,0x00}) ); // Set textmode 21x12
sed1330_command( p, CMD_SCROLL, 10, ((char[6]) {SCR1_L,SCR1_H,0xC7,SCR2_L,SCR2_H,0xC7}) ); // screen1 and screen2 memory locations sed1330_command( p, CMD_SCROLL, 10, ((char[6]) {SCR1_L,SCR1_H,0xC7,SCR2_L,SCR2_H,0xC7}) ); // screen1 and screen2 memory locations
break; break;
case TYPE_G242C: case TYPE_G242C:
sed1330_command( p, CMD_SYSTEM_SET, 8, ((char[8]) {0x30,0x80+CHARWIDTH-1,CHARHEIGHT-1,0x27,0x2B,0x7F,0x29,0x00}) ); // Set textmode 40x12 sed1330_command( p, CMD_SYSTEM_SET, 8, ((char[8]) {0x30,0x80+CHARWIDTH-1,CHARHEIGHT-1,0x27,0x58,0x7F,0x29,0x00}) ); // Set textmode 40x12
sed1330_command( p, CMD_SCROLL, 10, ((char[6]) {SCR1_L,SCR1_H,0xC7,SCR2_L,SCR2_H,0xC7}) ); // screen1 and screen2 memory locations sed1330_command( p, CMD_SCROLL, 10, ((char[6]) {SCR1_L,SCR1_H,0xC7,SCR2_L,SCR2_H,0xC7}) ); // screen1 and screen2 memory locations
break; break;
default: default:
+1 -1
View File
@@ -8,7 +8,7 @@
#include "lcd.h" #include "lcd.h"
int sed1330_init( Driver * drvthis, char *args ); MODULE_EXPORT int sed1330_init( Driver * drvthis, char *args );
MODULE_EXPORT void sed1330_close( Driver * drvthis ); MODULE_EXPORT void sed1330_close( Driver * drvthis );
MODULE_EXPORT int sed1330_width( Driver * drvthis ); MODULE_EXPORT int sed1330_width( Driver * drvthis );
MODULE_EXPORT int sed1330_height( Driver * drvthis ); MODULE_EXPORT int sed1330_height( Driver * drvthis );
+3 -31
View File
@@ -31,7 +31,8 @@
#include "port.h" #include "port.h"
#include "timing.h" #include "timing.h"
#define uPause timing_uPause #define uPause timing_uPause
#include "sed1520fm.c"
#include "sed1520fm.h"
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include "config.h" # include "config.h"
@@ -144,7 +145,7 @@ drawchar2fb (int x, int y, unsigned char z)
// This initialises the stuff. We support supplying port as // This initialises the stuff. We support supplying port as
// a command line argument. // a command line argument.
// //
int MODULE_EXPORT int
sed1520_init (Driver *drvthis, char *args) sed1520_init (Driver *drvthis, char *args)
{ {
char *argv[64], *str; char *argv[64], *str;
@@ -234,35 +235,6 @@ sed1520_init (Driver *drvthis, char *args)
cellwidth = 6; cellwidth = 6;
cellheight = 8; cellheight = 8;
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = sed1520_clear;
drvthis->string = sed1520_string;
drvthis->chr = sed1520_chr;
drvthis->old_vbar = sed1520_vbar;
drvthis->old_hbar = sed1520_hbar;
drvthis->num = sed1520_num;
drvthis->init = sed1520_init;
drvthis->close = sed1520_close;
drvthis->flush = sed1520_flush;
drvthis->set_char = sed1520_set_char;
drvthis->old_icon = sed1520_icon;
// We dont't need init for vbar,hbar and friends.
//drvthis->init_hbar = NULL;
//drvthis->init_vbar = NULL;
//drvthis->init_num = NULL;
// Neither contrast nor backlight are controllable.
//drvthis->contrast = NULL;
//drvthis->backlight = NULL;
// There are some unused input lines that may be used for input,
// but nothing is programmed so far.
//drvthis->getkey = NULL;
return 0; return 0;
} }
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int sed1520_init (Driver *drvthis, char *args); MODULE_EXPORT int sed1520_init (Driver *drvthis, char *args);
MODULE_EXPORT void sed1520_close (Driver *drvthis); MODULE_EXPORT void sed1520_close (Driver *drvthis);
MODULE_EXPORT int sed1520_width (Driver *drvthis); MODULE_EXPORT int sed1520_width (Driver *drvthis);
MODULE_EXPORT int sed1520_height (Driver *drvthis); MODULE_EXPORT int sed1520_height (Driver *drvthis);
+2 -2
View File
@@ -836,7 +836,7 @@ unsigned char fontmap[256][8] = {
//FIXME: make big chars use less memory //FIXME: make big chars use less memory
static unsigned char *fontbignum[10][24] = { unsigned char *fontbignum[10][24] = {
{ {
"++++++++++++++++++", "++++++++++++++++++",
"++++++++++++++++++", "++++++++++++++++++",
@@ -1089,7 +1089,7 @@ static unsigned char *fontbignum[10][24] = {
"++++++++++++++++++"} "++++++++++++++++++"}
}; };
static unsigned char *fontbigdp[] = { unsigned char *fontbigdp[] = {
"++++++", "++++++",
"++++++", "++++++",
"++++++", "++++++",
+2 -35
View File
@@ -24,7 +24,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <sys/errno.h> #include <sys/errno.h>
#include <sys/io.h> //#include <sys/io.h>
#include <time.h> #include <time.h>
#include "port.h" #include "port.h"
#include "timing.h" #include "timing.h"
@@ -279,7 +279,7 @@ stv5730_drawchar2fb (int x, int y, unsigned char z)
// This initialises the stuff. We support supplying port as // This initialises the stuff. We support supplying port as
// a command line argument. // a command line argument.
// //
int MODULE_EXPORT int
stv5730_init (Driver *drvthis, char *args) stv5730_init (Driver *drvthis, char *args)
{ {
char *argv[64], *str; char *argv[64], *str;
@@ -440,39 +440,6 @@ stv5730_init (Driver *drvthis, char *args)
// clear screen // clear screen
memset (stv5730_framebuf, 0, STV5730_WID * STV5730_HGT); memset (stv5730_framebuf, 0, STV5730_WID * STV5730_HGT);
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = stv5730_clear;
drvthis->string = stv5730_string;
drvthis->chr = stv5730_chr;
drvthis->old_vbar = stv5730_vbar;
drvthis->old_hbar = stv5730_hbar;
drvthis->num = stv5730_num;
drvthis->init = stv5730_init;
drvthis->close = stv5730_close;
drvthis->width = stv5730_width;
drvthis->height = stv5730_height;
drvthis->cellwidth = stv5730_cellwidth;
drvthis->cellheight = stv5730_cellheight;
drvthis->flush = stv5730_flush;
// We dont't have any programmable chars.
//drvthis->set_char = NULL;
drvthis->old_icon = stv5730_icon;
// We dont't need init for vbar,hbar and friends.
//drvthis->init_hbar = NULL;
//drvthis->init_vbar = NULL;
//drvthis->init_num = NULL;
// Neither contrast nor backlight are controllable.
//drvthis->contrast = NULL;
//drvthis->backlight = NULL;
// There are some unused input lines that may be used for input,
// but nothing is programmed so far.
//drvthis->getkey = NULL;
return 0; return 0;
} }
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int stv5730_init (Driver *drvthis, char *args); MODULE_EXPORT int stv5730_init (Driver *drvthis, char *args);
MODULE_EXPORT void stv5730_close (Driver *drvthis); MODULE_EXPORT void stv5730_close (Driver *drvthis);
MODULE_EXPORT int stv5730_width (Driver *drvthis); MODULE_EXPORT int stv5730_width (Driver *drvthis);
MODULE_EXPORT int stv5730_height (Driver *drvthis); MODULE_EXPORT int stv5730_height (Driver *drvthis);
+1 -26
View File
@@ -242,7 +242,7 @@ spaced_gl_writen (int x, int y, int count, char *text)
static char icon_char = '@'; static char icon_char = '@';
int MODULE_EXPORT int
svgalib_drv_init (struct lcd_logical_driver *driver, char *args) svgalib_drv_init (struct lcd_logical_driver *driver, char *args)
{ {
char *argv[64]; char *argv[64];
@@ -277,31 +277,6 @@ svgalib_drv_init (struct lcd_logical_driver *driver, char *args)
gl_clearscreen (gl_rgbcolor (0, 0, 0)); gl_clearscreen (gl_rgbcolor (0, 0, 0));
driver->daemonize = 0; // don't daemonize...
// Override output functions...
driver->clear = svgalib_drv_clear;
driver->string = svgalib_drv_string;
driver->chr = svgalib_drv_chr;
driver->vbar = svgalib_drv_vbar;
//driver->init_vbar = NULL;
driver->hbar = svgalib_drv_hbar;
//driver->init_hbar = NULL;
driver->num = svgalib_drv_num;
driver->init_num = svgalib_drv_init_num;
driver->init = svgalib_drv_init;
driver->close = svgalib_drv_close;
driver->flush = svgalib_drv_flush;
driver->flush_box = svgalib_drv_flush_box;
//driver->contrast = NULL;
//driver->backlight = NULL;
//driver->set_char = NULL;
driver->icon = svgalib_drv_icon;
driver->draw_frame = svgalib_drv_draw_frame;
driver->getkey = svgalib_drv_getkey;
// Change the character used for padding the title bars... // Change the character used for padding the title bars...
SVGALIB_PAD = '#'; SVGALIB_PAD = '#';
// Change the character used for "..." // Change the character used for "..."
+2 -32
View File
@@ -18,7 +18,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
//#include <asm/io.h> //#include <asm/io.h>
#include <sys/perm.h> //#include <sys/perm.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include "config.h" # include "config.h"
@@ -28,7 +28,6 @@
#include "t6963.h" #include "t6963.h"
#include "t6963_font.h" #include "t6963_font.h"
#include "shared/str.h"
#include "shared/debug.h" #include "shared/debug.h"
#include "report.h" #include "report.h"
#include "lcd_lib.h" #include "lcd_lib.h"
@@ -60,7 +59,7 @@ MODULE_EXPORT int stay_in_foreground = 0;
MODULE_EXPORT int supports_multiple = 0; MODULE_EXPORT int supports_multiple = 0;
MODULE_EXPORT char *symbol_prefix = "t6963_"; MODULE_EXPORT char *symbol_prefix = "t6963_";
int MODULE_EXPORT int
t6963_init (Driver *drvthis, char *args) t6963_init (Driver *drvthis, char *args)
{ {
int w, h, p; int w, h, p;
@@ -153,35 +152,6 @@ t6963_init (Driver *drvthis, char *args)
} }
debug (RPT_DEBUG, "T6963: Setting function pointers...\n");
// Set variables for server
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->api_version = api_version;
drvthis->supports_multiple = &supports_multiple;
debug (RPT_DEBUG, "T6963: Server variables set!");
// Set the functions the driver supports
drvthis->width = t6963_width;
drvthis->height = t6963_height;
drvthis->clear = t6963_clear;
drvthis->string = t6963_string;
drvthis->chr = t6963_chr;
drvthis->vbar = t6963_vbar;
drvthis->hbar = t6963_hbar;
drvthis->num = t6963_num;
drvthis->init = t6963_init;
drvthis->close = t6963_close;
drvthis->flush = t6963_flush;
drvthis->set_char = t6963_set_char;
drvthis->icon = t6963_icon;
drvthis->heartbeat = t6963_heartbeat;
//drvthis->get_key = t6963_get_key;
debug (RPT_DEBUG, "T6963: Supported functions set!");
debug (RPT_DEBUG, "T6963: Sending init to display..."); debug (RPT_DEBUG, "T6963: Sending init to display...");
T6963_CEHI; // disable chip T6963_CEHI; // disable chip
+1 -1
View File
@@ -114,7 +114,7 @@ typedef unsigned char u8;
// **************************************************************************************** // ****************************************************************************************
int t6963_init (Driver *drvthis, char *args); MODULE_EXPORT int t6963_init (Driver *drvthis, char *args);
MODULE_EXPORT void t6963_close (Driver *drvthis); MODULE_EXPORT void t6963_close (Driver *drvthis);
MODULE_EXPORT int t6963_width (Driver *drvthis); MODULE_EXPORT int t6963_width (Driver *drvthis);
MODULE_EXPORT int t6963_height (Driver *drvthis); MODULE_EXPORT int t6963_height (Driver *drvthis);
+1 -32
View File
@@ -82,7 +82,7 @@ MODULE_EXPORT char *symbol_prefix = "text_";
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
int MODULE_EXPORT int
text_init (Driver *drvthis, char *args) text_init (Driver *drvthis, char *args)
{ {
// Set display sizes // Set display sizes
@@ -102,37 +102,6 @@ text_init (Driver *drvthis, char *args)
framebuf = (unsigned char *) malloc (width * height); framebuf = (unsigned char *) malloc (width * height);
memset (framebuf, ' ', width * height); memset (framebuf, ' ', width * height);
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->init = text_init;
drvthis->close = text_close;
drvthis->width = text_width;
drvthis->height = text_height;
drvthis->clear = text_clear;
drvthis->flush = text_flush;
drvthis->string = text_string;
drvthis->chr = text_chr;
drvthis->vbar = text_vbar;
//drvthis->init_vbar = NULL;
drvthis->hbar = text_hbar;
//drvthis->init_hbar = NULL;
drvthis->num = text_num;
//drvthis->init_num = NULL;
drvthis->set_contrast = text_set_contrast;
drvthis->backlight = text_backlight;
//drvthis->set_char = NULL;
//drvthis->icon = NULL;
//drvthis->get_key = NULL;
return 0; return 0;
} }
+1 -1
View File
@@ -3,7 +3,7 @@
#include "lcd.h" #include "lcd.h"
int text_init (Driver * drvthis, char *args); MODULE_EXPORT int text_init (Driver * drvthis, char *args);
MODULE_EXPORT void text_close (Driver *drvthis); MODULE_EXPORT void text_close (Driver *drvthis);
MODULE_EXPORT int text_width (Driver *drvthis); MODULE_EXPORT int text_width (Driver *drvthis);
MODULE_EXPORT int text_height (Driver *drvthis); MODULE_EXPORT int text_height (Driver *drvthis);
+1 -27
View File
@@ -46,7 +46,7 @@ MODULE_EXPORT char *symbol_prefix = "sli_";
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly... // Opens com port and sets baud correctly...
// //
int MODULE_EXPORT int
sli_init (Driver *drvthis, char *args) sli_init (Driver *drvthis, char *args)
{ {
char *argv[64]; char *argv[64];
@@ -159,32 +159,6 @@ sli_init (Driver *drvthis, char *args)
width = 15; width = 15;
height = 2; height = 2;
// Set variables for server
drvthis->api_version = api_version;
drvthis->stay_in_foreground = &stay_in_foreground;
drvthis->supports_multiple = &supports_multiple;
// Set the functions the driver supports
drvthis->clear = sli_clear;
drvthis->string = sli_string;
drvthis->chr = sli_chr;
drvthis->old_vbar = sli_vbar;
drvthis->init_vbar = sli_init_vbar;
drvthis->old_hbar = sli_hbar;
drvthis->init_hbar = sli_init_hbar;
//drvthis->num = NULL;
//drvthis->init_num = NULL;
drvthis->init = sli_init;
drvthis->close = sli_close;
drvthis->flush = sli_flush;
//drvthis->contrast = NULL;
//drvthis->backlight = NULL;
drvthis->set_char = sli_set_char;
drvthis->old_icon = sli_icon;
//drvthis->getkey = NULL;
return fd; return fd;
} }
+1 -1
View File
@@ -9,7 +9,7 @@
#include "lcd.h" #include "lcd.h"
int sli_init (Driver *drvthis, char *args); MODULE_EXPORT int sli_init (Driver *drvthis, char *args);
MODULE_EXPORT void sli_close (Driver *drvthis); MODULE_EXPORT void sli_close (Driver *drvthis);
MODULE_EXPORT int sli_width (Driver *drvthis); MODULE_EXPORT int sli_width (Driver *drvthis);
MODULE_EXPORT int sli_height (Driver *drvthis); MODULE_EXPORT int sli_height (Driver *drvthis);
+37 -102
View File
@@ -53,12 +53,12 @@ extern int optind, optopt, opterr;
#define MAX_TIMER 0x10000 #define MAX_TIMER 0x10000
/*#define DEFAULT_DEBUG_LEVEL 1*/
#define DEFAULT_LCD_PORT LCDPORT #define DEFAULT_LCD_PORT LCDPORT
#define DEFAULT_BIND_ADDR "127.0.0.1" #define DEFAULT_BIND_ADDR "127.0.0.1"
#define DEFAULT_CONFIGFILE "/etc/LCDd.conf" #define DEFAULT_CONFIGFILE "/etc/LCDd.conf"
#define DEFAULT_USER "nobody" #define DEFAULT_USER "nobody"
#define DEFAULT_DRIVER "curses" #define DEFAULT_DRIVER "curses"
#define DEFAULT_DRIVER_PATH
#define DEFAULT_WAITTIME 8 #define DEFAULT_WAITTIME 8
#define MAX_DRIVERS 8 #define MAX_DRIVERS 8
#define DEFAULT_DAEMON_MODE 1 #define DEFAULT_DAEMON_MODE 1
@@ -89,14 +89,14 @@ char *build_date = __DATE__;
#define UNSET_INT -1 #define UNSET_INT -1
#define UNSET_STR "\01" #define UNSET_STR "\01"
int debug_level; /* for compatibility with MtxOrb and joy drivers. /* int debug_level; for compatibility with MtxOrb and joy drivers.
* I was about to remove the comment in front of this. * I was about to remove the comment in front of this.
* Now how do we become compatible WITHOUT this debug_level ?*/ * Now how do we become compatible WITHOUT this debug_level ?*/
int lcd_port = UNSET_INT; int lcd_port = UNSET_INT;
char bind_addr[64] = UNSET_STR; char bind_addr[64]; /* Do not preinit these strings as they will occupy */
char configfile[256] = UNSET_STR; char configfile[256]; /* a lot of space in the executable. */
char user[64] = UNSET_STR; char user[64]; /* The values will be overwritten anyway... */
int daemon_mode = UNSET_INT; int daemon_mode = UNSET_INT;
int enable_server_screen = UNSET_INT; int enable_server_screen = UNSET_INT;
@@ -107,34 +107,9 @@ static int serverStarted = 0;
/* The drivers and their driver parameters*/ /* The drivers and their driver parameters*/
char *drivernames[MAX_DRIVERS]; char *drivernames[MAX_DRIVERS];
char *driverfilenames[MAX_DRIVERS];
char *driverargs[MAX_DRIVERS];
int num_drivers = 0; int num_drivers = 0;
/* The parameter structure and args[] should
* be removed when getopt(3) is implemented,
* as there won't be any need for them then.
* typedef struct parameter {
* char *sh, *lg; */ /* short and long versions*/
/*} parameter;
+
* This is currently only a list of available arguments, but doesn't
* really *do* anything. It just helps to figure out which parameters
* go to the server, and which ones go to individual drivers...
*static parameter args[] = {
* {"-h", "--help"},
* {"-d", "--driver"},
* {"-t", "--type"},
* {"-f", "--foreground"},
* {"-b", "--backlight"},
* {"-i", "--serverinfo"},
* {"-w", "--waittime"},
* {NULL, NULL},
*};
*/
/**** Local functions ****/ /**** Local functions ****/
void exit_program (int val); void exit_program (int val);
void HelpScreen (); void HelpScreen ();
@@ -149,9 +124,8 @@ int drop_privs(char *user);
int init_drivers(); int init_drivers();
int init_screens(); int init_screens();
void do_mainloop(); void do_mainloop();
void lcd_list_drivers();
#define ESSENTIAL(f) {int r; if( ( r=(f) )<0 ) { report( RPT_CRIT,"Critical error, abort"); return r;}} #define ESSENTIAL(f) {int r; if( ( r=(f) )<0 ) { report( RPT_CRIT,"Critical error, abort"); exit_program(0);}}
int int
main (int argc, char **argv) main (int argc, char **argv)
@@ -212,13 +186,13 @@ main (int argc, char **argv)
set_default_settings(); set_default_settings();
/* Set reporting values*/ /* Set reporting values*/
debug_level = reportLevel; /*debug_level = reportLevel; */
ESSENTIAL( set_reporting( reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) ); ESSENTIAL( set_reporting( reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) );
report( RPT_NOTICE, "Set report level to %d, output to %s", reportLevel, (reportToSyslog?"syslog":"stderr") ); report( RPT_NOTICE, "Set report level to %d, output to %s", reportLevel, (reportToSyslog?"syslog":"stderr") );
/* Startup the server*/ /* Startup the server*/
ESSENTIAL( init_sockets() );
ESSENTIAL( init_drivers() ); ESSENTIAL( init_drivers() );
ESSENTIAL( init_sockets() );
ESSENTIAL( init_screens() ); ESSENTIAL( init_screens() );
ESSENTIAL( drop_privs(user) ); ESSENTIAL( drop_privs(user) );
@@ -263,11 +237,7 @@ clear_settings ()
for( i=0; i < num_drivers; i++ ) { for( i=0; i < num_drivers; i++ ) {
free( drivernames[i] ); free( drivernames[i] );
free( driverfilenames[i] );
free( driverargs[i] );
drivernames[i] = NULL; drivernames[i] = NULL;
driverfilenames[i] = NULL;
driverargs[i] = NULL;
} }
num_drivers = 0; num_drivers = 0;
} }
@@ -277,7 +247,7 @@ clear_settings ()
int int
process_command_line (int argc, char **argv) process_command_line (int argc, char **argv)
{ {
char c; signed char c;
/*report( RPT_INFO, "process_command_line()" );*/ /*report( RPT_INFO, "process_command_line()" );*/
@@ -290,13 +260,8 @@ process_command_line (int argc, char **argv)
case 'd': case 'd':
/* Add to a list of drivers to be initialized later...*/ /* Add to a list of drivers to be initialized later...*/
if (num_drivers < MAX_DRIVERS) { if (num_drivers < MAX_DRIVERS) {
drivernames[num_drivers] = malloc( strlen(optarg)+1 ); drivernames[num_drivers] = malloc( strlen(optarg)+1 );
driverfilenames[num_drivers] = malloc( strlen(optarg)+1 );
driverargs[num_drivers] = malloc(1);
strcpy( drivernames[num_drivers], optarg ); strcpy( drivernames[num_drivers], optarg );
strcpy( driverfilenames[num_drivers], optarg );
strcpy( driverargs[num_drivers], "" );
num_drivers ++; num_drivers ++;
} else } else
report( RPT_ERR, "Too many drivers!" ); report( RPT_ERR, "Too many drivers!" );
@@ -374,7 +339,6 @@ process_command_line (int argc, char **argv)
int int
process_configfile ( char *configfile ) process_configfile ( char *configfile )
{ {
int i;
char * s; char * s;
/*char buf[64];*/ /*char buf[64];*/
@@ -382,11 +346,9 @@ process_configfile ( char *configfile )
/* Read server settings*/ /* Read server settings*/
config_read_file( configfile ); if( config_read_file( configfile ) != 0 ) {
report( RPT_WARNING, "Could not read config file: %s", configfile );
/* if( debug_level == UNSET_INT ) }
* debug_level = config_get_int( "server", "debug", 0, UNSET_INT );
*/
if( lcd_port == UNSET_INT ) if( lcd_port == UNSET_INT )
lcd_port = config_get_int( "server", "port", 0, UNSET_INT ); lcd_port = config_get_int( "server", "port", 0, UNSET_INT );
@@ -402,8 +364,8 @@ process_configfile ( char *configfile )
if( default_duration == 0 ) if( default_duration == 0 )
default_duration = UNSET_INT; default_duration = UNSET_INT;
else if( default_duration * TIME_UNIT < 2e6 ) { else if( default_duration * TIME_UNIT < 2e6 ) {
report( RPT_ERR, "Waittime should be at least 2 (seconds)" ); report( RPT_WARNING, "Waittime should be at least 2 (seconds). Set to 2 seconds." );
return -1; default_duration = 2e6 / TIME_UNIT;
} }
} }
@@ -431,7 +393,7 @@ process_configfile ( char *configfile )
backlight = BACKLIGHT_OPEN; backlight = BACKLIGHT_OPEN;
} }
else if( strcmp( s, UNSET_STR ) != 0 ) { else if( strcmp( s, UNSET_STR ) != 0 ) {
report( RPT_ERR, "Backlight state should be on, off or open" ); report( RPT_WARNING, "Backlight state should be on, off or open" );
} }
} }
@@ -455,35 +417,17 @@ process_configfile ( char *configfile )
/* read the drivernames*/ /* read the drivernames*/
while( 1 ) { while( 1 ) {
s = config_get_string( "server", "driver", num_drivers, "" ); s = config_get_string( "server", "driver", num_drivers, NULL );
if( !s || s[0] == 0 ) if( !s )
break; break;
if( s[0] != 0 ) {
drivernames[num_drivers] = malloc(strlen(s)+1); drivernames[num_drivers] = malloc(strlen(s)+1);
driverfilenames[num_drivers] = malloc(1); strcpy( drivernames[num_drivers], s );
driverargs[num_drivers] = malloc(1); num_drivers++;
}
strcpy( drivernames[num_drivers], s );
strcpy( driverfilenames[num_drivers], "" );
strcpy( driverargs[num_drivers], "" );
num_drivers++;
} }
} }
/* Now read the driver options that the server needs
* Drivers can read their own options later...
*/
for( i=0; i<num_drivers; i ++ ) {
s = config_get_string( drivernames[i], "file", 0, "" );
driverfilenames[i] = realloc( driverfilenames[i], strlen(s)+1 );
strcpy (driverfilenames[i], s );
s = config_get_string( drivernames[i], "arguments", 0, "" );
driverargs[i] = realloc( driverargs[i], strlen(s)+1 );
strcpy (driverargs[i], s );
}
return 0; return 0;
} }
@@ -495,9 +439,6 @@ set_default_settings()
/* Set defaults into unfilled variables....*/ /* Set defaults into unfilled variables....*/
/* if (debug_level == UNSET_INT)
* debug_level = DEFAULT_DEBUG_LEVEL;
*/
if (lcd_port == UNSET_INT) if (lcd_port == UNSET_INT)
lcd_port = DEFAULT_LCD_PORT; lcd_port = DEFAULT_LCD_PORT;
if (strcmp( bind_addr, UNSET_STR ) == 0) if (strcmp( bind_addr, UNSET_STR ) == 0)
@@ -524,13 +465,8 @@ set_default_settings()
/* Use default driver*/ /* Use default driver*/
if( num_drivers == 0 ) { if( num_drivers == 0 ) {
drivernames[0] = malloc(strlen(DEFAULT_DRIVER)+1); drivernames[0] = malloc(strlen(DEFAULT_DRIVER)+1);
driverfilenames[0] = malloc(1);
driverargs[0] = malloc(1);
strcpy(drivernames[0], DEFAULT_DRIVER); strcpy(drivernames[0], DEFAULT_DRIVER);
strcpy(driverfilenames[0], ""); num_drivers = 1;
strcpy(driverargs[0], "");
num_drivers++;
} }
} }
@@ -596,7 +532,7 @@ init_drivers()
for (i = 0; i < num_drivers; i++) { for (i = 0; i < num_drivers; i++) {
res = drivers_load_driver (drivernames[i], driverfilenames[i], driverargs[i]); res = drivers_load_driver (drivernames[i]);
if (res >= 0) { if (res >= 0) {
/* Load went OK */ /* Load went OK */
@@ -783,13 +719,15 @@ exit_program (int val)
* things are shut down in shouldn't matter... * things are shut down in shouldn't matter...
*/ */
strncpy(buf, "Server shutting down on ", sizeof (buf) ); if( val > 0 ) {
switch(val) { strncpy(buf, "Server shutting down on ", sizeof (buf) );
case 1: strcat(buf, "SIGHUP"); break; switch(val) {
case 2: strcat(buf, "SIGINT"); break; case 1: strcat(buf, "SIGHUP"); break;
case 15: strcat(buf, "SIGTERM"); break; case 2: strcat(buf, "SIGINT"); break;
default: snprintf(buf, sizeof(buf), "Server shutting down on signal %d", val); break; case 15: strcat(buf, "SIGTERM"); break;
/* Other values should not be seen, but just in case.. */ default: snprintf(buf, sizeof(buf), "Server shutting down on signal %d", val); break;
/* Other values should not be seen, but just in case.. */
}
} }
report(RPT_NOTICE, buf); /* report it */ report(RPT_NOTICE, buf); /* report it */
@@ -801,11 +739,11 @@ exit_program (int val)
reportLevel = DEFAULT_REPORTLEVEL; reportLevel = DEFAULT_REPORTLEVEL;
set_reporting( reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ); set_reporting( reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) );
goodbye_screen (); /* display goodbye screen on LCD display */
drivers_unload_all (); /* release driver memory and file descriptors */
/* Shutdown things if server start was complete */ /* Shutdown things if server start was complete */
if( serverStarted ) { if( serverStarted ) {
goodbye_screen (); /* display goodbye screen on LCD display */
drivers_unload_all (); /* release driver memory and file descriptors */
client_shutdown (); /* shutdown clients (must come first) */ client_shutdown (); /* shutdown clients (must come first) */
screenlist_shutdown (); /* shutdown screens (must come after client_shutdown) */ screenlist_shutdown (); /* shutdown screens (must come after client_shutdown) */
sock_close_all (); /* close all open sockets (must come after client_shutdown) */ sock_close_all (); /* close all open sockets (must come after client_shutdown) */
@@ -845,9 +783,6 @@ HelpScreen ()
fprintf (stdout, "\t-s\t\tOutput messages to syslog\n"); fprintf (stdout, "\t-s\t\tOutput messages to syslog\n");
fprintf (stdout, "\t-r <level>\tReport level (default=2)\n"); fprintf (stdout, "\t-r <level>\tReport level (default=2)\n");
fprintf (stdout, "\nCurrently available drivers:\n");
lcd_list_drivers();
/*fprintf (stdout, "\tHelp on each driver's parameters are obtained upon request:\n\t\t\"LCDd -d driver --help\"\n");*/ /*fprintf (stdout, "\tHelp on each driver's parameters are obtained upon request:\n\t\t\"LCDd -d driver --help\"\n");*/
/*fprintf (stdout, "Example:\n");*/ /*fprintf (stdout, "Example:\n");*/
/*fprintf (stdout, "\tLCDd -d MtxOrb \"--device /dev/lcd --contrast 200\" -d joy\n");*/ /*fprintf (stdout, "\tLCDd -d MtxOrb \"--device /dev/lcd --contrast 200\" -d joy\n");*/
+3 -3
View File
@@ -257,7 +257,7 @@ draw_frame (LinkedList * list,
break; break;
case WID_HBAR: case WID_HBAR:
if (reset) { if (reset) {
drivers_init_hbar (); //drivers_init_hbar ();
reset = 0; reset = 0;
} }
if ((w->x > 0) && (w->y > 0)) { if ((w->x > 0) && (w->y > 0)) {
@@ -288,7 +288,7 @@ draw_frame (LinkedList * list,
break; break;
case WID_VBAR: /* FIXME: Vbars don't work in frames!*/ case WID_VBAR: /* FIXME: Vbars don't work in frames!*/
if (reset) { if (reset) {
drivers_init_vbar (); //drivers_init_vbar ();
reset = 0; reset = 0;
} }
if ((w->x > 0) && (w->y > 0)) { if ((w->x > 0) && (w->y > 0)) {
@@ -512,7 +512,7 @@ draw_frame (LinkedList * list,
/* NOTE: y=10 means COLON (:)*/ /* NOTE: y=10 means COLON (:)*/
if ((w->x > 0) && (w->y >= 0) && (w->y <= 10)) { if ((w->x > 0) && (w->y >= 0) && (w->y <= 10)) {
if (reset) { if (reset) {
drivers_init_num (); //drivers_init_num ();
reset = 0; reset = 0;
} }
drivers_num (w->x + left, w->y); drivers_num (w->x + left, w->y);
+12 -9
View File
@@ -48,8 +48,9 @@ void report( const int level, const char *format, .../*args*/ )
va_list ap; va_list ap;
va_start(ap, format); /* measure the required size (the number of elements of format) */ va_start(ap, format); /* measure the required size (the number of elements of format) */
switch( report_dest ) {
case RPT_DEST_STDERR: switch( report_dest ) {
case RPT_DEST_STDERR:
vfprintf( stderr, format, ap ); vfprintf( stderr, format, ap );
fprintf( stderr, "\n" ); fprintf( stderr, "\n" );
break; break;
@@ -57,9 +58,9 @@ void report( const int level, const char *format, .../*args*/ )
vsyslog( LOG_USER|(level+2), format, ap ); vsyslog( LOG_USER|(level+2), format, ap );
break; break;
case RPT_DEST_STORE: case RPT_DEST_STORE:
vsnprintf( buf, sizeof(buf), format, ap ); vsnprintf( buf, sizeof(buf), format, ap );
buf[sizeof(buf)-1] = 0; // be sure to have a terminating 0 buf[sizeof(buf)-1] = 0; // be sure to have a terminating 0
store_report_message( level, buf ); store_report_message( level, buf );
break; break;
} }
va_end(ap); va_end(ap);
@@ -93,10 +94,12 @@ int set_reporting( int new_level, int new_dest )
static void store_report_message( int level, const char *message ) static void store_report_message( int level, const char *message )
{ {
stored_msgs[num_stored_msgs] = malloc(strlen( message )+1); if( num_stored_msgs < MAX_STORED_MSGS ) {
strcpy( stored_msgs[num_stored_msgs], message ); stored_msgs[num_stored_msgs] = malloc(strlen( message )+1);
stored_levels[num_stored_msgs] = level; strcpy( stored_msgs[num_stored_msgs], message );
num_stored_msgs ++; stored_levels[num_stored_msgs] = level;
num_stored_msgs ++;
}
} }