/* $Id: SIN.c,v 1.15 2004/01/29 04:40:02 reinelt Exp $ * * driver for SIN router displays * * Copyright 2000 Michael Reinelt * * This file is part of LCD4Linux. * * LCD4Linux 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. * * LCD4Linux 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: SIN.c,v $ * Revision 1.15 2004/01/29 04:40:02 reinelt * every .c file includes "config.h" now * * Revision 1.14 2003/10/05 17:58:50 reinelt * libtool junk; copyright messages cleaned up * * Revision 1.13 2003/09/13 06:45:43 reinelt * icons for all remaining drivers * * Revision 1.12 2003/08/24 05:17:58 reinelt * liblcd4linux patch from Patrick Schemitz * * Revision 1.11 2003/08/17 12:11:58 reinelt * framework for icons prepared * * Revision 1.10 2003/08/17 08:25:30 reinelt * preparations for liblcd4linux; minor bugs in SIN.c and Skeleton.c * * Revision 1.9 2003/07/24 04:48:09 reinelt * 'soft clear' needed for virtual rows * * Revision 1.8 2003/02/22 07:53:10 reinelt * cfg_get(key,defval) * * Revision 1.7 2001/04/27 05:04:57 reinelt * * replaced OPEN_MAX with sysconf() * replaced mktemp() with mkstemp() * unlock serial port if open() fails * * Revision 1.6 2001/02/13 09:00:13 reinelt * * prepared framework for GPO's (general purpose outputs) * * Revision 1.5 2000/12/07 20:47:54 reinelt * * first try for SIN bars * * Revision 1.4 2000/12/01 20:42:37 reinelt * * added debugging of SIN driver output, probably found the positioning bug (format %02x instead of %2x) * * Revision 1.3 2000/12/01 07:20:26 reinelt * * modified text positioning: row starts with 0, column is hexadecimal * * Revision 1.2 2000/11/28 17:27:19 reinelt * * changed decimal values for screen, row, column to ascii values (shame on you!) * * Revision 1.1 2000/11/28 16:46:11 reinelt * * first try to support display of SIN router * * */ /* * * exported fuctions: * * struct LCD SIN[] * */ #include "config.h" #include #include #include #include #include #include #include #include #include "debug.h" #include "cfg.h" #include "lock.h" #include "display.h" #include "bar.h" // FIXME: 6x8 #define XRES 1 #define YRES 1 static LCD Lcd; static char *Port=NULL; static int Device=-1; static char Txt[8][40]; static int SIN_open (void) { int fd; pid_t pid; struct termios portset; if ((pid=lock_port(Port))!=0) { if (pid==-1) error ("SIN: port %s could not be locked", Port); else error ("SIN: port %s is locked by process %d", Port, pid); return -1; } fd = open(Port, O_RDWR | O_NOCTTY | O_NDELAY); if (fd==-1) { error ("SIN: open(%s) failed: %s", Port, strerror(errno)); unlock_port(Port); return -1; } if (tcgetattr(fd, &portset)==-1) { error ("SIN: tcgetattr(%s) failed: %s", Port, strerror(errno)); unlock_port(Port); return -1; } cfmakeraw(&portset); cfsetospeed(&portset, B9600); if (tcsetattr(fd, TCSANOW, &portset)==-1) { error ("SIN: tcsetattr(%s) failed: %s", Port, strerror(errno)); unlock_port(Port); return -1; } return fd; } static void SIN_debug (char *string, int len) { char buffer[256]; char *p, *c; p=buffer; c=string; while (len-->0) { if (isprint(*c)) { *p++=*c; } else { p+=sprintf(p, "\\%02x", *c); } c++; } *p='\0'; debug ("sending '%s'", buffer); } static void SIN_write (char *string, int len) { SIN_debug(string, len); if (Device==-1) return; if (write (Device, string, len)==-1) { if (errno==EAGAIN) { usleep(1000); if (write (Device, string, len)>=0) return; } error ("SIN: write(%s) failed: %s", Port, strerror(errno)); } } int SIN_clear (int full) { int row, col; for (row=0; rowmax) len=max; switch (type) { case BAR_L: len=max-len; rev=1; case BAR_R: while (max>0 && col<=Lcd.cols) { if (len>=XRES) { Txt[row][col]=rev?0x19:0x18; len-=XRES; } else { Txt[row][col]=rev?0x18:0x19; len=0; } max-=XRES; col++; } break; } return 0; } int SIN_flush (void) { char buffer[256]="\015\033T"; // place text char *p; int row, col; for (row=0; row