diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | Makefile.in | 19 | ||||
-rw-r--r-- | MilfordInstruments.c | 332 | ||||
-rw-r--r-- | config.h.in | 3 | ||||
-rwxr-xr-x | configure | 17 | ||||
-rw-r--r-- | configure.in | 13 | ||||
-rw-r--r-- | display.c | 11 |
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 */ @@ -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]) @@ -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); } |