]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2003-09-29 06:58:36 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Mon, 29 Sep 2003 06:58:37 +0000 (06:58 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Mon, 29 Sep 2003 06:58:37 +0000 (06:58 +0000)
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

Makefile.am
Makefile.in
MilfordInstruments.c [new file with mode: 0644]
config.h.in
configure
configure.in
display.c

index b00622fb13bf78f6e96a87a31e52a3a3f0d8791d..8881956b002ade2598a106d8ef64ccb2f859fadd 100644 (file)
@@ -50,6 +50,7 @@ M50530.c \
 T6963.c \
 USBLCD.c \
 MatrixOrbital.c \
+MilfordInstruments.c \
 PalmPilot.c \
 Raster.c \
 SIN.c \
index 32a1c2972a3c69727530d6156f46d1670bc89c5b..3fa645cb43373f1075127e8a35de3058312ce055 100644 (file)
@@ -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 (file)
index 0000000..564c6c1
--- /dev/null
@@ -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 }
+};
index 531e60e5d99f376400f8a9aea3380cc0db48258d..3ae60674a1a5e7852222eb28a9e508aa015c379d 100644 (file)
 /* junk */
 #undef WITH_MATRIXORBITAL
 
+/* junk */
+#undef WITH_MILINST
+
 /* junk */
 #undef WITH_PALMPILOT
 
index f2d8fabfe4f325ac02c84a3b82d3f06d3d8464aa..1d1b4cc4937ce12d5729b96ad8f9d4f6d52df0f5 100755 (executable)
--- 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"
 
index 1888dfb451e21e8615089a2eaab97c4a854126b6..cdb6d7a18d5e79749e2460e40462211fdac3e595 100644 (file)
@@ -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])
index 11b5530f8b04ed4ee3bbd022dc95b0d8655fd1d9..cf418e6367f5d87e6758433d890c436f45b50e7c 100644 (file)
--- 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);
     }