aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2003-09-29 06:58:37 +0000
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2003-09-29 06:58:37 +0000
commit5abfdf9721cdb83851a15fcec795f59748eb97c6 (patch)
tree219b2b249576d73ba2eedd6a10804e8faaf3ab60
parent0280c32d667a36a5809f2c7a83015a7bc035dce7 (diff)
downloadlcd4linux-5abfdf9721cdb83851a15fcec795f59748eb97c6.tar.gz
[lcd4linux @ 2003-09-29 06:58:36 by reinelt]
new driver for Milford Instruments MI420 by Andy Baxter git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@249 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
-rw-r--r--Makefile.am1
-rw-r--r--Makefile.in19
-rw-r--r--MilfordInstruments.c332
-rw-r--r--config.h.in3
-rwxr-xr-xconfigure17
-rw-r--r--configure.in13
-rw-r--r--display.c11
7 files changed, 381 insertions, 15 deletions
diff --git a/Makefile.am b/Makefile.am
index b00622f..8881956 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -50,6 +50,7 @@ M50530.c \
T6963.c \
USBLCD.c \
MatrixOrbital.c \
+MilfordInstruments.c \
PalmPilot.c \
Raster.c \
SIN.c \
diff --git a/Makefile.in b/Makefile.in
index 32a1c29..3fa645c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -91,7 +91,7 @@ lcd4linux_DEPENDENCIES = @DRIVERS@
lcd4linux_SOURCES = lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h pid.c pid.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h widget.c widget.h bar.c bar.h icon.c icon.h fontmap.c fontmap.h exec.c exec.h mail2.c socket.c socket.h
-EXTRA_lcd4linux_SOURCES = parport.c parport.h BeckmannEgle.c Crystalfontz.c Cwlinux.c HD44780.c M50530.c T6963.c USBLCD.c MatrixOrbital.c PalmPilot.c Raster.c SIN.c Skeleton.c XWindow.c Text.c
+EXTRA_lcd4linux_SOURCES = parport.c parport.h BeckmannEgle.c Crystalfontz.c Cwlinux.c HD44780.c M50530.c T6963.c USBLCD.c MatrixOrbital.c MilfordInstruments.c PalmPilot.c Raster.c SIN.c Skeleton.c XWindow.c Text.c
EXTRA_DIST = lcd4linux.conf.sample lcd4kde.conf lcd4linux.kdelnk lcd4linux.xpm lcd4linux.lsm curses.m4 AUTHORS CREDITS FAQ NEWS TODO README README.Drivers README.KDE
@@ -130,14 +130,15 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP_ENV = --best
DEP_FILES = .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/Cwlinux.P \
-.deps/HD44780.P .deps/M50530.P .deps/MatrixOrbital.P .deps/PalmPilot.P \
-.deps/Raster.P .deps/SIN.P .deps/Skeleton.P .deps/T6963.P .deps/Text.P \
-.deps/USBLCD.P .deps/XWindow.P .deps/bar.P .deps/battery.P .deps/cfg.P \
-.deps/debug.P .deps/display.P .deps/dvb.P .deps/exec.P .deps/filter.P \
-.deps/fontmap.P .deps/icon.P .deps/isdn.P .deps/lcd4linux.P \
-.deps/lock.P .deps/mail.P .deps/mail2.P .deps/parport.P .deps/parser.P \
-.deps/pid.P .deps/pixmap.P .deps/processor.P .deps/seti.P \
-.deps/socket.P .deps/system.P .deps/udelay.P .deps/widget.P
+.deps/HD44780.P .deps/M50530.P .deps/MatrixOrbital.P \
+.deps/MilfordInstruments.P .deps/PalmPilot.P .deps/Raster.P .deps/SIN.P \
+.deps/Skeleton.P .deps/T6963.P .deps/Text.P .deps/USBLCD.P \
+.deps/XWindow.P .deps/bar.P .deps/battery.P .deps/cfg.P .deps/debug.P \
+.deps/display.P .deps/dvb.P .deps/exec.P .deps/filter.P .deps/fontmap.P \
+.deps/icon.P .deps/isdn.P .deps/lcd4linux.P .deps/lock.P .deps/mail.P \
+.deps/mail2.P .deps/parport.P .deps/parser.P .deps/pid.P .deps/pixmap.P \
+.deps/processor.P .deps/seti.P .deps/socket.P .deps/system.P \
+.deps/udelay.P .deps/widget.P
SOURCES = $(lcd4linux_SOURCES) $(EXTRA_lcd4linux_SOURCES)
OBJECTS = $(lcd4linux_OBJECTS)
diff --git a/MilfordInstruments.c b/MilfordInstruments.c
new file mode 100644
index 0000000..564c6c1
--- /dev/null
+++ b/MilfordInstruments.c
@@ -0,0 +1,332 @@
+/* $Id: MilfordInstruments.c,v 1.1 2003/09/29 06:58:36 reinelt Exp $
+ *
+ * driver for Milford Instruments serial display modules
+ *
+ * Written 2003 by Andy Baxter <andy@earthsong.free-online.co.uk>
+ *
+ * based on the MatrixOrbital driver by M. Reinelt
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: MilfordInstruments.c,v $
+ * Revision 1.1 2003/09/29 06:58:36 reinelt
+ * new driver for Milford Instruments MI420 by Andy Baxter
+ *
+ */
+
+/*
+ *
+ * exported fuctions:
+ *
+ * struct LCD MilfordInstruments[]
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <termios.h>
+#include <fcntl.h>
+
+#include "debug.h"
+#include "cfg.h"
+#include "lock.h"
+#include "display.h"
+#include "bar.h"
+#include "icon.h"
+
+#define XRES 5
+#define YRES 8
+#define CHARS 8
+
+static LCD Lcd;
+static char *Port=NULL;
+static speed_t Speed;
+static int Device=-1;
+static int Icons;
+
+static char *FrameBuffer1=NULL;
+static char *FrameBuffer2=NULL;
+
+
+static int MI_open (void)
+{
+ int fd;
+ pid_t pid;
+ struct termios portset;
+
+ if ((pid=lock_port(Port))!=0) {
+ if (pid==-1)
+ error ("MilfordInstruments: port %s could not be locked", Port);
+ else
+ error ("MilfordInstruments: port %s is locked by process %d", Port, pid);
+ return -1;
+ }
+ fd = open(Port, O_RDWR | O_NOCTTY | O_NDELAY);
+ if (fd==-1) {
+ error ("MilfordInstruments: open(%s) failed: %s", Port, strerror(errno));
+ unlock_port(Port);
+ return -1;
+ }
+ if (tcgetattr(fd, &portset)==-1) {
+ error ("MilfordInstruments: tcgetattr(%s) failed: %s", Port, strerror(errno));
+ unlock_port(Port);
+ return -1;
+ }
+ cfmakeraw(&portset);
+ cfsetospeed(&portset, Speed);
+ if (tcsetattr(fd, TCSANOW, &portset)==-1) {
+ error ("MilfordInstruments: tcsetattr(%s) failed: %s", Port, strerror(errno));
+ unlock_port(Port);
+ return -1;
+ }
+ return fd;
+}
+
+
+static void MI_write (char *string, int len)
+{
+ if (Device==-1) return;
+ if (write (Device, string, len)==-1) {
+ if (errno==EAGAIN) {
+ usleep(1000);
+ if (write (Device, string, len)>=0) return;
+ }
+ error ("MilfordInstruments: write(%s) failed: %s", Port, strerror(errno));
+ }
+}
+
+
+static void MI_define_char (int ascii, char *buffer)
+{
+ char cmd[3]="\376x";
+ if (ascii<8) {
+ cmd[2]=(char)(64+ascii*8);
+ MI_write (cmd, 3);
+ MI_write (buffer, 8);
+ }
+}
+
+
+static int MI_clear (int full)
+{
+ memset (FrameBuffer1, ' ', Lcd.rows*Lcd.cols*sizeof(char));
+
+ icon_clear();
+ bar_clear();
+
+ if (full) {
+ memset (FrameBuffer2, ' ', Lcd.rows*Lcd.cols*sizeof(char));
+ MI_write ("\376\001", 2); // clear screen
+ }
+ return 0;
+}
+
+
+static int MI_init (LCD *Self)
+{
+ char *port;
+ int speed;
+
+ Lcd=*Self;
+
+ // Init the framebuffers
+ FrameBuffer1 = (char*)malloc(Lcd.cols*Lcd.rows*sizeof(char));
+ FrameBuffer2 = (char*)malloc(Lcd.cols*Lcd.rows*sizeof(char));
+ if (FrameBuffer1==NULL || FrameBuffer2==NULL) {
+ error ("MilfordInstruments: framebuffer could not be allocated: malloc() failed");
+ return -1;
+ }
+
+ if (Port) {
+ free (Port);
+ Port=NULL;
+ }
+
+ port=cfg_get ("Port",NULL);
+ if (port==NULL || *port=='\0') {
+ error ("MilfordInstruments: no 'Port' entry in %s", cfg_source());
+ return -1;
+ }
+ Port=strdup(port);
+
+ if (cfg_number("Speed", 19200, 1200,19200, &speed)<0) return -1;
+ switch (speed) {
+ case 2400:
+ Speed=B2400;
+ break;
+ case 9600:
+ Speed=B9600;
+ break;
+ default:
+ error ("MilfordInstruments: unsupported speed '%d' in %s", speed, cfg_source());
+ return -1;
+ }
+
+ debug ("using port %s at %d baud", Port, speed);
+
+ Device=MI_open();
+ if (Device==-1) return -1;
+
+ if (cfg_number("Icons", 0, 0, CHARS, &Icons)<0) return -1;
+ if (Icons>0) {
+ debug ("reserving %d of %d user-defined characters for icons", Icons, CHARS);
+ icon_init(Lcd.rows, Lcd.cols, XRES, YRES, CHARS, Icons, MI_define_char);
+ Self->icons=Icons;
+ Lcd.icons=Icons;
+ }
+
+ bar_init(Lcd.rows, Lcd.cols, XRES, YRES, CHARS-Icons);
+ bar_add_segment( 0, 0,255, 32); // ASCII 32 = blank
+ bar_add_segment(255,255,255,255); // ASCII 255 = block
+
+ MI_clear(1);
+
+ MI_write ("\376\014", 2); // cursor off
+
+ return 0;
+}
+
+
+void MI_goto (int row, int col)
+{
+ char cmd[2]="\376x";
+ char ddbase=0;
+ switch (row) {
+ case 0:
+ ddbase=128;
+ break;
+ case 1:
+ ddbase=192;
+ break;
+ case 2:
+ ddbase=148;
+ break;
+ case 3:
+ ddbase=212;
+ break;
+ }
+ cmd[1]=(char)(ddbase+col);
+ MI_write(cmd,2);
+}
+
+
+int MI_put (int row, int col, char *text)
+{
+ char *p=FrameBuffer1+row*Lcd.cols+col;
+ char *t=text;
+
+ while (*t && col++<=Lcd.cols) {
+ *p++=*t++;
+ }
+ return 0;
+}
+
+
+int MI_bar (int type, int row, int col, int max, int len1, int len2)
+{
+ return bar_draw (type, row, col, max, len1, len2);
+}
+
+
+int MI_icon (int num, int seq, int row, int col)
+{
+ return icon_draw (num, seq, row, col);
+}
+
+
+static int MI_flush (void)
+{
+ int row, col, pos1, pos2;
+ int c, equal;
+
+ bar_process(MI_define_char);
+
+ for (row=0; row<Lcd.rows; row++) {
+ for (col=0; col<Lcd.cols; col++) {
+ c=bar_peek(row, col);
+ if (c==-1) c=icon_peek(row, col);
+ if (c!=-1) {
+ FrameBuffer1[row*Lcd.cols+col]=(char)c;
+ }
+ }
+ for (col=0; col<Lcd.cols; col++) {
+ if (FrameBuffer1[row*Lcd.cols+col]==FrameBuffer2[row*Lcd.cols+col]) continue;
+ MI_goto (row, col);
+ for (pos1=col++, pos2=pos1, equal=0; col<Lcd.cols; col++) {
+ if (FrameBuffer1[row*Lcd.cols+col]==FrameBuffer2[row*Lcd.cols+col]) {
+ // If we find just one equal byte, we don't break, because this
+ // would require a goto, which takes one byte, too.
+ if (++equal>5) break;
+ } else {
+ pos2=col;
+ equal=0;
+ }
+ }
+ MI_write (FrameBuffer1+row*Lcd.cols+pos1, pos2-pos1+1);
+ }
+ }
+
+ memcpy (FrameBuffer2, FrameBuffer1, Lcd.rows*Lcd.cols*sizeof(char));
+
+ return 0;
+}
+
+
+int MI_quit (void)
+{
+ info("MilfordInstruments: shutting down.");
+
+ debug ("closing port %s", Port);
+ close (Device);
+ unlock_port(Port);
+
+ if (FrameBuffer1) {
+ free(FrameBuffer1);
+ FrameBuffer1=NULL;
+ }
+
+ if (FrameBuffer2) {
+ free(FrameBuffer2);
+ FrameBuffer2=NULL;
+ }
+
+ return (0);
+}
+
+
+LCD MilfordInstruments[] = {
+ { name: "MI420",
+ rows: 4,
+ cols: 20,
+ xres: XRES,
+ yres: YRES,
+ bars: BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2,
+ icons: 0,
+ gpos: 0,
+ init: MI_init,
+ clear: MI_clear,
+ put: MI_put,
+ bar: MI_bar,
+ icon: MI_icon,
+ gpo: NULL,
+ flush: MI_flush,
+ quit: MI_quit
+ },
+ { NULL }
+};
diff --git a/config.h.in b/config.h.in
index 531e60e..3ae6067 100644
--- a/config.h.in
+++ b/config.h.in
@@ -249,6 +249,9 @@
#undef WITH_MATRIXORBITAL
/* junk */
+#undef WITH_MILINST
+
+/* junk */
#undef WITH_PALMPILOT
/* junk */
diff --git a/configure b/configure
index f2d8fab..1d1b4cc 100755
--- a/configure
+++ b/configure
@@ -873,8 +873,8 @@ Optional Packages:
(try 'all,\!<driver>' if your shell complains...)
possible drivers are:
BeckmannEgle, CrystalFontz, Cwlinux, HD44780,
- M50530, T6963, USBLCD, MatrixOrbital, PalmPilot
- PNG, PPM, X11, Text
+ M50530, T6963, USBLCD, MatrixOrbital,
+ MilfordInstruments, PalmPilot, PNG, PPM, X11, Text
Some influential environment variables:
CC C compiler command
@@ -5334,6 +5334,7 @@ for driver in $drivers; do
T6963="yes"
USBLCD="yes"
MATRIXORBITAL="yes"
+ MILINST="yes"
PALMPILOT="yes"
PNG="yes"
PPM="yes"
@@ -5364,6 +5365,9 @@ for driver in $drivers; do
MatrixOrbital)
MATRIXORBITAL=$val
;;
+ MilfordInstruments)
+ MILINST=$val
+ ;;
PalmPilot)
PALMPILOT=$val
;;
@@ -5474,6 +5478,15 @@ _ACEOF
fi
+if test "$MILINST" = "yes"; then
+ DRIVERS="$DRIVERS MilfordInstruments.o"
+
+cat >>confdefs.h <<\_ACEOF
+#define WITH_MILINST 1
+_ACEOF
+
+fi
+
if test "$PALMPILOT" = "yes"; then
DRIVERS="$DRIVERS PalmPilot.o"
diff --git a/configure.in b/configure.in
index 1888dfb..cdb6d7a 100644
--- a/configure.in
+++ b/configure.in
@@ -43,8 +43,8 @@ AC_ARG_WITH(
[ (try 'all,\!<driver>' if your shell complains...)]
[ possible drivers are:]
[ BeckmannEgle, CrystalFontz, Cwlinux, HD44780,]
- [ M50530, T6963, USBLCD, MatrixOrbital, PalmPilot]
- [ PNG, PPM, X11, Text],
+ [ M50530, T6963, USBLCD, MatrixOrbital,]
+ [ MilfordInstruments, PalmPilot, PNG, PPM, X11, Text],
drivers=$withval,
drivers=all
)
@@ -73,6 +73,7 @@ for driver in $drivers; do
T6963="yes"
USBLCD="yes"
MATRIXORBITAL="yes"
+ MILINST="yes"
PALMPILOT="yes"
PNG="yes"
PPM="yes"
@@ -103,6 +104,9 @@ for driver in $drivers; do
MatrixOrbital)
MATRIXORBITAL=$val
;;
+ MilfordInstruments)
+ MILINST=$val
+ ;;
PalmPilot)
PALMPILOT=$val
;;
@@ -178,6 +182,11 @@ if test "$MATRIXORBITAL" = "yes"; then
AC_DEFINE(WITH_MATRIXORBITAL,1,[junk])
fi
+if test "$MILINST" = "yes"; then
+ DRIVERS="$DRIVERS MilfordInstruments.o"
+ AC_DEFINE(WITH_MILINST,1,[junk])
+fi
+
if test "$PALMPILOT" = "yes"; then
DRIVERS="$DRIVERS PalmPilot.o"
AC_DEFINE(WITH_PALMPILOT,1,[junk])
diff --git a/display.c b/display.c
index 11b5530..cf418e6 100644
--- a/display.c
+++ b/display.c
@@ -1,4 +1,4 @@
-/* $Id: display.c,v 1.42 2003/09/10 03:48:23 reinelt Exp $
+/* $Id: display.c,v 1.43 2003/09/29 06:58:37 reinelt Exp $
*
* framework for device drivers
*
@@ -20,6 +20,9 @@
*
*
* $Log: display.c,v $
+ * Revision 1.43 2003/09/29 06:58:37 reinelt
+ * new driver for Milford Instruments MI420 by Andy Baxter
+ *
* Revision 1.42 2003/09/10 03:48:23 reinelt
* Icons for M50530, new processing scheme (Ticks.Text...)
*
@@ -238,6 +241,7 @@ extern LCD M50530[];
extern LCD T6963[];
extern LCD USBLCD[];
extern LCD MatrixOrbital[];
+extern LCD MilfordInstruments[];
extern LCD PalmPilot[];
extern LCD Raster[];
extern LCD SIN[];
@@ -275,6 +279,9 @@ FAMILY Driver[] = {
#ifdef WITH_MATRIXORBITAL
{ "Matrix Orbital", MatrixOrbital },
#endif
+#ifdef WITH_MILINST
+ { "Milford Instruments", MilfordInstruments },
+#endif
#ifdef WITH_PALMPILOT
{ "3Com Palm Pilot", PalmPilot },
#endif
@@ -307,7 +314,7 @@ int lcd_list (void)
printf ("available display drivers:");
for (i=0; Driver[i].name; i++) {
- printf ("\n %-16s:", Driver[i].name);
+ printf ("\n %-20s:", Driver[i].name);
for (j=0; Driver[i].Model[j].name; j++) {
printf (" %s", Driver[i].Model[j].name);
}