1999-12-09 23:15:14 +00:00
/* wirz-sli.c -- Source file for LCDproc Wirz SLI driver
Copyright (C) 1999 Horizon Technologies-http://horizon.pair.com/
Written by Bryan Rittmeyer <bryanr@pair.com> - Released under GPL
2001-09-24 16:30:31 +00:00
LCD info: http://www.wirz.com/ */
1999-12-09 23:15:14 +00:00
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
2001-07-18 22:30:12 +00:00
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
1999-12-09 23:15:14 +00:00
#include "lcd.h"
#include "wirz-sli.h"
#include "drv_base.h"
2001-05-25 03:14:27 +00:00
#include "shared/debug.h"
#include "shared/str.h"
1999-12-09 23:15:14 +00:00
2000-03-30 20:20:41 +00:00
static int custom = 0 ;
1999-12-09 23:15:14 +00:00
typedef enum {
2000-04-03 22:13:57 +00:00
hbar = 1 ,
vbar = 2 ,
bign = 4 ,
beat = 8
2000-03-30 20:20:41 +00:00
} custom_type ;
1999-12-09 23:15:14 +00:00
static int fd ;
static char lastframe [ 32 ];
lcd_logical_driver * sli ;
/////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly...
//
2000-03-30 20:20:41 +00:00
int
sli_init ( lcd_logical_driver * driver , char * args )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char * argv [ 64 ];
int argc ;
struct termios portset ;
int i ;
int tmp ;
char out [ 2 ];
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
char device [ 256 ] = "/dev/lcd" ;
int speed = B19200 ;
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
sli = driver ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
//debug("sli_init: Args(all): %s\n", args);
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
argc = get_args ( argv , args , 64 );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/*
for(i=0; i<argc; i++)
{
printf("Arg(%i): %s\n", i, argv[i]);
}
*/
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
for ( i = 0 ; i < argc ; i ++ ) {
//printf("Arg(%i): %s\n", i, argv[i]);
if ( 0 == strcmp ( argv [ i ], "-d" ) || 0 == strcmp ( argv [ i ], "--device" )) {
if ( i + 1 > argc ) {
fprintf ( stderr , "sli_init: %s requires an argument \n " , argv [ i ]);
return - 1 ;
}
strcpy ( device , argv [ ++ i ]);
} else if ( 0 == strcmp ( argv [ i ], "-s" ) || 0 == strcmp ( argv [ i ], "--speed" )) {
if ( i + 1 > argc ) {
fprintf ( stderr , "sli_init: %s requires an argument \n " , argv [ i ]);
return - 1 ;
}
tmp = atoi ( argv [ ++ i ]);
if ( tmp == 1200 )
speed = B1200 ;
else if ( tmp == 2400 )
speed = B2400 ;
else if ( tmp == 9600 )
speed = B9600 ;
else if ( tmp == 19200 )
speed = B19200 ;
else if ( tmp == 38400 )
speed = B38400 ;
else if ( tmp == 57600 )
speed = B57600 ;
else if ( tmp == 115200 )
speed = B115200 ;
else {
fprintf ( stderr , "sli_init: %s argument must be 1200, 2400, 9600, 19200, 38400, 57600, or 115200. Using default value (19200). \n " , argv [ i ]);
}
} else if ( 0 == strcmp ( argv [ i ], "-h" ) || 0 == strcmp ( argv [ i ], "--help" )) {
printf ( "LCDproc Wirz SLI LCD driver \n " " \t -d \t --device \t Select the output device to use [/dev/lcd] \n " " \t -s \t --speed \t\t Set the communication speed [19200] \n " " \t -h \t --help \t\t Show this help information \n " );
return - 1 ;
} else {
printf ( "Invalid parameter: %s \n " , argv [ i ]);
}
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
}
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
// Set up io port correctly, and open it...
fd = open ( device , O_RDWR | O_NOCTTY | O_NDELAY );
if ( fd == - 1 ) {
fprintf ( stderr , "sli_init: failed (%s) \n " , strerror ( errno ));
return - 1 ;
}
//else fprintf(stderr, "sli_init: opened device %s\n", device);
tcgetattr ( fd , & portset );
2001-07-18 22:30:12 +00:00
// We use RAW mode
#ifdef HAVE_CFMAKERAW
// The easy way
cfmakeraw ( & portset );
#else
// The hard way
portset . c_iflag &= ~ ( IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON );
portset . c_oflag &= ~ OPOST ;
portset . c_lflag &= ~ ( ECHO | ECHONL | ICANON | ISIG | IEXTEN );
portset . c_cflag &= ~ ( CSIZE | PARENB | CRTSCTS );
portset . c_cflag |= CS8 | CREAD | CLOCAL ;
1999-12-09 23:15:14 +00:00
#endif
2001-07-18 22:30:12 +00:00
// Set port speed
2000-04-03 22:13:57 +00:00
cfsetospeed ( & portset , speed );
2001-07-18 22:30:12 +00:00
cfsetispeed ( & portset , B0 );
// Do it...
2000-04-03 22:13:57 +00:00
tcsetattr ( fd , TCSANOW , & portset );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* Initialize SLI using autobaud detection, and then turn off cursor
and clear screen */
usleep ( 150000 ); /* 150ms delay to allow SLI to power on */
out [ 0 ] = 13 ; /* CR for SLI autobaud */
write ( fd , out , 1 );
usleep ( 3000 ); /* 3ms delay.. wait for it to autobaud */
out [ 0 ] = 0x0FE ;
out [ 1 ] = 0x00C ; /* No cursor */
write ( fd , out , 2 );
out [ 0 ] = 0x0FE ;
out [ 1 ] = 0x001 ; /* Clear LCD, not sure if this belongs here */
write ( fd , out , 2 );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
// Set LCD parameters (I use a 16x2 LCD) -- small but still useful
// Its also much cheaper than the higher quality Matrix Orbital modules
// Currently, $30 for interface kit and 16x2 non-backlit LCD...
driver -> wid = 15 ;
driver -> hgt = 2 ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
// Set the functions the driver supports...
1999-12-09 23:15:14 +00:00
2001-09-25 17:26:25 +00:00
driver -> clear = sli_clear ;
driver -> string = sli_string ;
driver -> chr = sli_chr ;
2000-04-03 22:13:57 +00:00
driver -> vbar = sli_vbar ;
driver -> init_vbar = sli_init_vbar ;
driver -> hbar = sli_hbar ;
driver -> init_hbar = sli_init_hbar ;
2001-09-25 17:26:25 +00:00
//driver->num = NULL;
//driver->init_num = NULL;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
driver -> init = sli_init ;
driver -> close = sli_close ;
driver -> flush = sli_flush ;
driver -> flush_box = sli_flush_box ;
2001-09-25 17:26:25 +00:00
//driver->contrast = NULL;
//driver->backlight = NULL;
2000-04-03 22:13:57 +00:00
driver -> set_char = sli_set_char ;
driver -> icon = sli_icon ;
driver -> draw_frame = sli_draw_frame ;
1999-12-09 23:15:14 +00:00
2001-09-25 17:26:25 +00:00
//driver->getkey = NULL;
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
return fd ;
1999-12-09 23:15:14 +00:00
}
/* Clean-up */
2000-03-30 20:20:41 +00:00
void
sli_close ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
close ( fd );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
if ( sli -> framebuf )
free ( sli -> framebuf );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
sli -> framebuf = NULL ;
1999-12-09 23:15:14 +00:00
}
2000-03-30 20:20:41 +00:00
void
sli_flush ()
1999-12-09 23:15:14 +00:00
{
2001-09-25 17:26:25 +00:00
sli_draw_frame ( sli -> framebuf );
1999-12-09 23:15:14 +00:00
}
/* no bounds checking is done in MtxOrb.c (which I shamelessly ripped)
this is bad imho, so I added it.. may remove later
speed is not a huge issue though, this isnt a
device driver or anything ;) */
2000-03-30 20:20:41 +00:00
void
sli_flush_box ( int lft , int top , int rgt , int bot )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
int y ;
char out [ 2 ]; /* Why does the matrix driver allocate so much here? */
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* simple bounds checking */
2001-09-25 17:26:25 +00:00
if (( top > sli -> hgt ) | ( bot > sli -> hgt ))
2000-04-03 22:13:57 +00:00
return ;
2000-03-30 20:20:41 +00:00
2001-09-25 17:26:25 +00:00
if (( lft > sli -> wid ) | ( rgt > sli -> wid ))
2000-04-03 22:13:57 +00:00
return ;
1999-12-09 23:15:14 +00:00
// printf("Flush (%i,%i)-(%i,%i)\n", lft, top, rgt, bot);
/* I like having hex, everywhere and all the time */
2000-04-03 22:13:57 +00:00
for ( y = top ; y <= bot ; y ++ ) {
if ( y == 1 )
2001-09-25 15:02:33 +00:00
snprintf ( out , sizeof ( out ), "%c%c" , 0x0FE , 0x080 + lft );
2000-04-03 22:13:57 +00:00
if ( y == 2 )
2001-09-25 15:02:33 +00:00
snprintf ( out , sizeof ( out ), "%c%c" , 0x0FE , 0x0C0 + lft );
2000-04-03 22:13:57 +00:00
write ( fd , out , 0x002 );
2001-09-25 17:26:25 +00:00
write ( fd , sli -> framebuf + ( y * sli -> wid ) + lft , rgt - lft + 1 );
2000-04-03 22:13:57 +00:00
}
2000-03-30 20:20:41 +00:00
1999-12-09 23:15:14 +00:00
}
2001-09-25 17:26:25 +00:00
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
void
sli_clear ()
{
memset ( sli -> framebuf , ' ' , sli -> wid * sli -> hgt );
}
/////////////////////////////////////////////////////////////////
// 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
sli_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 * sli -> wid ) + x + i > ( sli -> wid * sli -> hgt ))
break ;
sli -> framebuf [( y * sli -> wid ) + x + i ] = string [ i ];
}
}
1999-12-09 23:15:14 +00:00
/////////////////////////////////////////////////////////////////
// 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).
//
2000-03-30 20:20:41 +00:00
void
sli_chr ( int x , int y , char c )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
y -- ;
x -- ;
2000-03-30 20:20:41 +00:00
2001-09-25 17:26:25 +00:00
sli -> framebuf [( y * sli -> wid ) + x ] = c ;
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
2001-09-25 17:26:25 +00:00
// 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
sli_chr ( int x , int y , char c )
{
y -- ;
x -- ;
sli -> framebuf [( y * sli -> wid ) + x ] = c ;
}
/////////////////////////////////////////////////////////////////
// Sets up for vertical bars. Call before sli->vbar()
1999-12-09 23:15:14 +00:00
//
/* Because of the way we do this (custom characters in CGRAM)
we can't have both horizontal and vertical bars at once...
this also appears to be a limitation of the Matrix Orbital
modules so I will assume that all client coders know about it
I think it would be cool to use triangular stuff for the non-full
characters, so that you can do both bar types at once.. maybe I
will release a new version of the SLI driver that attempts this */
2000-03-30 20:20:41 +00:00
void
sli_init_vbar ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char a [] = {
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
};
char b [] = {
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
};
char c [] = {
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
};
char d [] = {
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
};
char e [] = {
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
};
char f [] = {
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
};
char g [] = {
0 , 0 , 0 , 0 , 0 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
};
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
if ( custom != vbar ) {
sli_set_char ( 1 , a );
sli_set_char ( 2 , b );
sli_set_char ( 3 , c );
sli_set_char ( 4 , d );
sli_set_char ( 5 , e );
sli_set_char ( 6 , f );
sli_set_char ( 7 , g );
custom = vbar ;
}
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Inits horizontal bars...
//
2000-03-30 20:20:41 +00:00
void
sli_init_hbar ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char a [] = {
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 ,
};
char b [] = {
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
1 , 1 , 0 , 0 , 0 ,
};
char c [] = {
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
1 , 1 , 1 , 0 , 0 ,
};
char d [] = {
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
1 , 1 , 1 , 1 , 0 ,
};
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
if ( custom != hbar ) {
sli_set_char ( 1 , a );
sli_set_char ( 2 , b );
sli_set_char ( 3 , c );
sli_set_char ( 4 , d );
custom = hbar ;
}
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar...
//
/* It would be cool if you could start a vertical bar at any y
like the horizontal bar routine can start at any x... but
since we only have 2 lines anyway this is rather pointless
for me to add */
2000-03-30 20:20:41 +00:00
void
sli_vbar ( int x , int len )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char map [ 9 ] = { 32 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 255 };
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
int y ;
2001-09-25 17:26:25 +00:00
for ( y = sli -> hgt ; y > 0 && len > 0 ; y -- ) {
if ( len >= sli -> cellhgt )
2000-04-03 22:13:57 +00:00
sli_chr ( x , y , 255 );
else
sli_chr ( x , y , map [ len ]);
1999-12-09 23:15:14 +00:00
2001-09-25 17:26:25 +00:00
len -= sli -> cellhgt ;
2000-04-03 22:13:57 +00:00
}
2000-03-30 20:20:41 +00:00
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
2000-03-30 20:20:41 +00:00
void
sli_hbar ( int x , int y , int len )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char map [ 6 ] = { 32 , 1 , 2 , 3 , 4 , 255 };
2000-03-30 20:20:41 +00:00
2001-09-25 17:26:25 +00:00
for (; x <= sli -> wid && len > 0 ; x ++ ) {
if ( len >= sli -> cellwid )
2000-04-03 22:13:57 +00:00
sli_chr ( x , y , 255 );
else
sli_chr ( x , y , map [ len ]);
1999-12-09 23:15:14 +00:00
2001-09-25 17:26:25 +00:00
len -= sli -> cellwid ;
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
}
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Sets a custom character from 0-7...
//
// For input, values > 0 mean "on" and values <= 0 are "off".
//
// The input is just an array of characters...
//
2000-03-30 20:20:41 +00:00
void
sli_set_char ( int n , char * dat )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 2 ];
int row , col ;
int letter ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* SLI also has 8 user definable characters */
if ( n < 0 || n > 7 )
return ;
if ( ! dat )
return ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* Move cursor to CGRAM */
out [ 0 ] = 0x0FE ;
out [ 1 ] = 0x040 + 8 * n ;
write ( fd , out , 2 );
1999-12-09 23:15:14 +00:00
2001-09-25 17:26:25 +00:00
for ( row = 0 ; row < sli -> cellhgt ; row ++ ) {
2000-04-03 22:13:57 +00:00
letter = 0 ;
2001-09-25 17:26:25 +00:00
for ( col = 0 ; col < sli -> cellwid ; col ++ ) {
2000-04-03 22:13:57 +00:00
letter <<= 1 ;
2001-09-25 17:26:25 +00:00
letter |= ( dat [( row * sli -> cellwid ) + col ] > 0 );
2000-04-03 22:13:57 +00:00
}
letter |= 0x020 ; /* SLI can't accept CR, LF, etc in this character! */
write ( fd , & letter , 1 );
}
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* Move cursor back to DDRAM */
out [ 0 ] = 0x0FE ;
out [ 1 ] = 0x080 ;
write ( fd , out , 2 );
1999-12-09 23:15:14 +00:00
}
2000-03-30 20:20:41 +00:00
void
sli_icon ( int which , char dest )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char icons [ 3 ][ 5 * 8 ] = {
{
1 , 1 , 1 , 1 , 1 , // Empty Heart
1 , 0 , 1 , 0 , 1 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 0 , 0 , 0 , 1 ,
1 , 1 , 0 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
},
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
{
1 , 1 , 1 , 1 , 1 , // Filled Heart
1 , 0 , 1 , 0 , 1 ,
0 , 1 , 0 , 1 , 0 ,
0 , 1 , 1 , 1 , 0 ,
0 , 1 , 1 , 1 , 0 ,
1 , 0 , 1 , 0 , 1 ,
1 , 1 , 0 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
},
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
{
0 , 0 , 0 , 0 , 0 , // Ellipsis
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
1 , 0 , 1 , 0 , 1 ,
},
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
};
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
if ( custom == bign )
custom = beat ;
sli_set_char ( dest , & icons [ which ][ 0 ]);
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////
// Blasts a single frame onscreen, to the lcd...
//
2001-09-25 17:26:25 +00:00
// Input is a character array, sized sli->wid*sli->hgt
1999-12-09 23:15:14 +00:00
//
2000-03-30 20:20:41 +00:00
void
sli_draw_frame ( char * dat )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 2 ]; /* Again, why does the Matrix driver allocate so much here? */
int y ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
if ( ! dat )
return ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/*
out[0]=0x0FE;
out[1]=0x001;
write(fd, out, 2);
*/
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* Don't update if we have no new data
this keeps me from getting a migraine
(just like those copyleft penguin mints... mmmmmm) */
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
// if (!strncmp(dat,lastframe,32)) /* Nothing has changed */
// return;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
/* Do the actual refresh */
out [ 0 ] = 0x0FE ;
out [ 1 ] = 0x080 ;
write ( fd , out , 2 );
write ( fd , & dat [ 0 ], 16 );
usleep ( 10 );
write ( fd , & dat [ 16 ], 15 );
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
// strncpy(lastframe,dat,32); // Update lastframe...
1999-12-09 23:15:14 +00:00
}