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>
#include "lcd.h"
#include "MtxOrb.h"
#include "drv_base.h"
#include "../../shared/debug.h"
#include "../../shared/str.h"
2000-11-29 18:48:53 +00:00
#include "../../config.h"
1999-12-09 23:15:14 +00:00
2000-03-30 20:20:41 +00:00
static int custom = 0 ;
2001-03-22 22:51:49 +00:00
static enum { MTXORB_LCD , MTXORB_LKD , MTXORB_VFD , MTXORB_VKD } MtxOrb_type ;
1999-12-09 23:15:14 +00:00
// TODO: Remove this custom_type if not in use anymore.
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
// TODO: This is my ugglyest piece of code.
typedef enum {
2000-04-03 22:13:57 +00:00
baru1 = 0 ,
baru2 = 1 ,
baru3 = 2 ,
baru4 = 3 ,
baru5 = 4 ,
baru6 = 5 ,
baru7 = 6 ,
bard1 = 7 ,
bard2 = 8 ,
bard3 = 9 ,
bard4 = 10 ,
bard5 = 11 ,
bard6 = 12 ,
bard7 = 13 ,
barr1 = 14 ,
barr2 = 15 ,
barr3 = 16 ,
barr4 = 17 ,
barl1 = 18 ,
barl2 = 19 ,
barl3 = 20 ,
barl4 = 21 ,
barw = 32 ,
barb = 255
2000-03-30 20:20:41 +00:00
} bar_type ;
1999-12-09 23:15:14 +00:00
static int fd ;
2000-03-30 20:20:41 +00:00
static int clear = 1 ;
1999-12-09 23:15:14 +00:00
2000-03-30 20:20:41 +00:00
static int def [ 9 ] = { - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 };
static int use [ 9 ] = { 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
1999-12-09 23:15:14 +00:00
2000-03-30 20:20:41 +00:00
static void MtxOrb_linewrap ( int on );
static void MtxOrb_autoscroll ( int on );
static void MtxOrb_cursorblink ( int on );
1999-12-09 23:15:14 +00:00
// TODO: Get rid of this variable?
lcd_logical_driver * MtxOrb ;
// TODO: Get the frame buffers working right
/////////////////////////////////////////////////////////////////
// Opens com port and sets baud correctly...
//
2000-03-30 20:20:41 +00:00
int
MtxOrb_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 ;
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
int contrast = 140 ;
char device [ 256 ] = "/dev/lcd" ;
int speed = B19200 ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
MtxOrb = driver ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
//debug("MtxOrb_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 , "MtxOrb_init: %s requires an argument \n " , argv [ i ]);
return - 1 ;
}
strcpy ( device , argv [ ++ i ]);
} else if ( 0 == strcmp ( argv [ i ], "-c" ) || 0 == strcmp ( argv [ i ], "--contrast" )) {
if ( i + 1 > argc ) {
fprintf ( stderr , "MtxOrb_init: %s requires an argument \n " , argv [ i ]);
return - 1 ;
}
tmp = atoi ( argv [ ++ i ]);
if (( tmp < 0 ) || ( tmp > 255 )) {
fprintf ( stderr , "MtxOrb_init: %s argument must between 0 and 255. Ussing default value. \n " , argv [ i ]);
} else
contrast = tmp ;
} else if ( 0 == strcmp ( argv [ i ], "-s" ) || 0 == strcmp ( argv [ i ], "--speed" )) {
if ( i + 1 > argc ) {
fprintf ( stderr , "MtxOrb_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 {
fprintf ( stderr , "MtxOrb_init: %s argument must be 1200, 2400, 9600 or 19200. Ussing default value. \n " , argv [ i ]);
}
} else if ( 0 == strcmp ( argv [ i ], "-h" ) || 0 == strcmp ( argv [ i ], "--help" )) {
printf ( "LCDproc Matrix-Orbital LCD driver \n " " \t -d \t --device \t Select the output device to use [/dev/lcd] \n "
2000-03-30 20:20:41 +00:00
// "\t-t\t--type\t\tSelect the LCD type (size) [20x4]\n"
2001-03-22 22:51:49 +00:00
" \t -c \t --contrast \t Set the initial contrast [140] \n " " \t -s \t --speed \t\t Set the communication speed [19200] \n " " \t -h \t --help \t\t Show this help information \n " " \t -t \t --type \t\t display type: lcd, lkd, vfd, vkd \n " );
2000-04-03 22:13:57 +00:00
return - 1 ;
2001-03-22 22:51:49 +00:00
} else if ( 0 == strcmp ( argv [ i ], "-t" ) || 0 == strcmp ( argv [ i ], "--type" )) {
if ( i + 1 > argc ) {
fprintf ( stderr , "MtxOrb_init: %s requires an argument \n " , argv [ i ]);
return - 1 ;
}
i ++ ;
if ( 0 == strcmp ( argv [ i ], "lcd" ) ) {
MtxOrb_type = MTXORB_LCD ;
} else if ( 0 == strcmp ( argv [ i ], "lkd" ) ) {
MtxOrb_type = MTXORB_LKD ;
} else if ( 0 == strcmp ( argv [ i ], "vfd" ) ) {
MtxOrb_type = MTXORB_VFD ;
} else if ( 0 == strcmp ( argv [ i ], "vkd" ) ) {
MtxOrb_type = MTXORB_VKD ;
} else {
fprintf ( stderr , "MtxOrb_init: unknwon display type %s \n " , argv [ i ]);
return ( - 1 );
}
2000-04-03 22:13:57 +00:00
} 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 , "MtxOrb_init: failed (%s) \n " , strerror ( errno ));
return - 1 ;
}
//else fprintf(stderr, "MtxOrb_init: opened device %s\n", device);
tcgetattr ( fd , & portset );
// This is necessary in Linux, but does not exist in irix.
1999-12-09 23:15:14 +00:00
#ifndef IRIX
2000-11-29 18:48:53 +00:00
#ifndef SOLARIS
2000-04-03 22:13:57 +00:00
cfmakeraw ( & portset );
2000-11-29 18:48:53 +00:00
#endif
1999-12-09 23:15:14 +00:00
#endif
2000-04-03 22:13:57 +00:00
cfsetospeed ( & portset , speed );
cfsetispeed ( & portset , speed );
tcsetattr ( fd , TCSANOW , & portset );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
// Set display-specific stuff..
MtxOrb_linewrap ( 1 );
MtxOrb_autoscroll ( 1 );
MtxOrb_cursorblink ( 0 );
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
if ( ! driver -> framebuf ) {
fprintf ( stderr , "MtxOrb_init: No frame buffer. \n " );
driver -> close ();
return - 1 ;
}
// Set the functions the driver supports...
1999-12-09 23:15:14 +00:00
// driver->clear = (void *)-1;
2000-04-03 22:13:57 +00:00
driver -> clear = MtxOrb_clear ;
driver -> string = ( void * ) - 1 ;
1999-12-09 23:15:14 +00:00
// driver->chr = MtxOrb_chr;
2000-04-03 22:13:57 +00:00
driver -> chr = ( void * ) - 1 ;
driver -> vbar = MtxOrb_vbar ;
driver -> init_vbar = MtxOrb_init_vbar ;
1999-12-09 23:15:14 +00:00
// driver->init_vbar = (void *)-1;
2000-04-03 22:13:57 +00:00
driver -> hbar = MtxOrb_hbar ;
driver -> init_hbar = MtxOrb_init_hbar ;
1999-12-09 23:15:14 +00:00
// driver->init_hbar = (void *)-1;
2000-04-03 22:13:57 +00:00
driver -> num = MtxOrb_num ;
driver -> init_num = MtxOrb_init_num ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
driver -> init = MtxOrb_init ;
driver -> close = MtxOrb_close ;
driver -> flush = MtxOrb_flush ;
driver -> flush_box = MtxOrb_flush_box ;
driver -> contrast = MtxOrb_contrast ;
driver -> backlight = MtxOrb_backlight ;
driver -> output = MtxOrb_output ;
driver -> set_char = MtxOrb_set_char ;
driver -> icon = MtxOrb_icon ;
driver -> draw_frame = MtxOrb_draw_frame ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
driver -> getkey = MtxOrb_getkey ;
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
MtxOrb_contrast ( contrast );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
return fd ;
1999-12-09 23:15:14 +00:00
}
// TODO: Check this quick hack to detect clear of the screen.
/////////////////////////////////////////////////////////////////
// Clear: catch up when the screen get clear to be able to
// forget bar caracter not in use anymore and reuse the
// slot for another bar caracter.
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_clear ()
1999-12-09 23:15:14 +00:00
{
// REMOVE: fprintf(stderr, "GLU: MtxOrb_clear.\n");
2000-04-03 22:13:57 +00:00
drv_base_clear ();
clear = 1 ;
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Clean-up
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_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 ( MtxOrb -> framebuf )
free ( MtxOrb -> framebuf );
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
MtxOrb -> framebuf = NULL ;
1999-12-09 23:15:14 +00:00
}
2000-03-30 20:20:41 +00:00
void
MtxOrb_flush ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
MtxOrb_draw_frame ( lcd . framebuf );
1999-12-09 23:15:14 +00:00
}
2000-03-30 20:20:41 +00:00
void
MtxOrb_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 [ LCD_MAX_WIDTH ];
2000-03-30 20:20:41 +00:00
1999-12-09 23:15:14 +00:00
// printf("Flush (%i,%i)-(%i,%i)\n", lft, top, rgt, bot);
2000-04-03 22:13:57 +00:00
for ( y = top ; y <= bot ; y ++ ) {
sprintf ( out , "%cG%c%c" , 254 , lft , y );
write ( fd , out , 4 );
write ( fd , lcd . framebuf + ( y * lcd . wid ) + lft , rgt - lft + 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
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
MtxOrb_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
2000-04-03 22:13:57 +00:00
lcd . framebuf [( y * lcd . wid ) + x ] = c ;
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Changes screen contrast (0-255; 140 seems good)
2001-03-22 22:51:49 +00:00
// note: works only for LCD displays
// Is it better to use the brightness for VFD/VKD displays ?
1999-12-09 23:15:14 +00:00
//
2000-03-30 20:20:41 +00:00
int
MtxOrb_contrast ( int contrast )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 4 ];
static int status = 140 ;
1999-12-09 23:15:14 +00:00
2001-03-22 22:51:49 +00:00
if ( (( MtxOrb_type == MTXORB_LCD ) || ( MtxOrb_type == MTXORB_LKD )) &&
( contrast > 0 ) ) {
2000-04-03 22:13:57 +00:00
status = contrast ;
sprintf ( out , "%cP%c" , 254 , status );
write ( fd , out , 3 );
}
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
return status ;
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Sets the backlight on or off -- can be done quickly for
// an intermediate brightness...
2001-03-22 22:51:49 +00:00
// WARN: off switches vfd/vkd displays off
// -> so it's maybe the best to start LCDd with -b on
1999-12-09 23:15:14 +00:00
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_backlight ( int on )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 4 ];
if ( on ) {
sprintf ( out , "%cB%c" , 254 , 0 );
write ( fd , out , 3 );
} else {
sprintf ( out , "%cF" , 254 );
write ( fd , out , 2 );
}
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Sets output port on or off
2001-03-22 22:51:49 +00:00
// displays with keypad have 6 outputs but the one without kepad
// have only one output
// NOTE: length of command are different
2000-03-30 20:20:41 +00:00
void
MtxOrb_output ( int on )
1999-12-09 23:15:14 +00:00
{
2001-03-22 22:51:49 +00:00
char out [ 5 ];
if ( (( MtxOrb_type == MTXORB_LCD ) || ( MtxOrb_type == MTXORB_VFD )) ) {
if ( on ) {
sprintf ( out , "%cW" , 254 );
} else {
sprintf ( out , "%cV" , 254 );
}
2000-04-03 22:13:57 +00:00
write ( fd , out , 2 );
2001-03-22 22:51:49 +00:00
} else {
int i ;
for ( i = 0 ; i < 6 ; i ++ ) {
if ( on & ( 1 << i ) ) {
sprintf ( out , "%cW%c" , 254 , i + 1 );
} else {
2001-04-27 02:20:38 +00:00
sprintf ( out , "%cV%c" , 254 , i + 1 );
2001-03-22 22:51:49 +00:00
}
write ( fd , out , 3 );
}
2000-04-03 22:13:57 +00:00
}
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Toggle the built-in linewrapping feature
//
2000-03-30 20:20:41 +00:00
static void
MtxOrb_linewrap ( int on )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 4 ];
if ( on )
sprintf ( out , "%cC" , 254 );
else
sprintf ( out , "%cD" , 254 );
write ( fd , out , 2 );
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Toggle the built-in automatic scrolling feature
//
2000-03-30 20:20:41 +00:00
static void
MtxOrb_autoscroll ( int on )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 4 ];
if ( on )
sprintf ( out , "%cQ" , 254 );
else
sprintf ( out , "%cR" , 254 );
write ( fd , out , 2 );
1999-12-09 23:15:14 +00:00
}
// TODO: make sure this doesn't mess up non-VFD displays
/////////////////////////////////////////////////////////////////
// Toggle cursor blink on/off
//
2000-03-30 20:20:41 +00:00
static void
MtxOrb_cursorblink ( int on )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 4 ];
if ( on )
sprintf ( out , "%cS" , 254 );
else
sprintf ( out , "%cT" , 254 );
write ( fd , out , 2 );
1999-12-09 23:15:14 +00:00
}
//// TODO: Might not be needed anymore...
/////////////////////////////////////////////////////////////////
// Sets up for vertical bars. Call before lcd.vbar()
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_init_vbar ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
MtxOrb_init_all ( vbar );
1999-12-09 23:15:14 +00:00
}
// TODO: Might not be needed anymore...
/////////////////////////////////////////////////////////////////
// Inits horizontal bars...
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_init_hbar ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
MtxOrb_init_all ( hbar );
1999-12-09 23:15:14 +00:00
}
// TODO: Finish the support for bar growing reverse way.
// TODO: Need a "y" as input also !!!
/////////////////////////////////////////////////////////////////
// Draws a vertical bar...
// This is the new version ussing dynamic icon alocation
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_vbar ( int x , int len )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
unsigned char mapu [ 9 ] = { barw , baru1 , baru2 , baru3 , baru4 , baru5 , baru6 , baru7 , barb };
unsigned char mapd [ 9 ] = { barw , bard1 , bard2 , bard3 , bard4 , bard5 , bard6 , bard7 , barb };
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
int y ;
1999-12-09 23:15:14 +00:00
// TODO: REMOVE THE NEXT LINE FOR TESTING ONLY...
// len=-len;
// TODO: REMOVE THE PREVIOUS LINE FOR TESTING ONLY...
2000-04-03 22:13:57 +00:00
if ( len > 0 ) {
for ( y = lcd . hgt ; y > 0 && len > 0 ; y -- ) {
if ( len >= lcd . cellhgt )
MtxOrb_chr ( x , y , 255 );
else
MtxOrb_chr ( x , y , MtxOrb_ask_bar ( mapu [ len ]));
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
len -= lcd . cellhgt ;
}
} else {
len = - len ;
for ( y = 2 ; y <= lcd . hgt && len > 0 ; y ++ ) {
if ( len >= lcd . cellhgt )
MtxOrb_chr ( x , y , 255 );
else
MtxOrb_chr ( x , y , MtxOrb_ask_bar ( mapd [ len ]));
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
len -= lcd . cellhgt ;
}
}
1999-12-09 23:15:14 +00:00
}
// TODO: Finish the support for bar growing reverse way.
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
// This is the new version ussing dynamic icon alocation
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_hbar ( int x , int y , int len )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
unsigned char mapr [ 6 ] = { barw , barr1 , barr2 , barr3 , barr4 , barb };
unsigned char mapl [ 6 ] = { barw , barl1 , barl2 , barl3 , barl4 , barb };
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
if ( len > 0 ) {
for (; x <= lcd . wid && len > 0 ; x ++ ) {
if ( len >= lcd . cellwid )
MtxOrb_chr ( x , y , 255 );
else
MtxOrb_chr ( x , y , MtxOrb_ask_bar ( mapr [ len ]));
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
len -= lcd . cellwid ;
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
}
} else {
len = - len ;
for (; x > 0 && len > 0 ; x -- ) {
if ( len >= lcd . cellwid )
MtxOrb_chr ( x , y , 255 );
else
MtxOrb_chr ( x , y , MtxOrb_ask_bar ( mapl [ len ]));
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
len -= lcd . 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
}
// TODO: Might not work, bignum is untested... an untested with dynamic bar.
/////////////////////////////////////////////////////////////////
// Sets up for big numbers.
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_init_num ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 3 ];
if ( custom != bign ) {
sprintf ( out , "%cn" , 254 );
write ( fd , out , 2 );
custom = bign ;
}
1999-12-09 23:15:14 +00:00
}
// TODO: Might not work, bignum is untested... an untested with dynamic bar.
/////////////////////////////////////////////////////////////////
// Writes a big number.
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_num ( int x , int num )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 5 ];
sprintf ( out , "%c#%c%c" , 254 , x , num );
write ( fd , out , 4 );
1999-12-09 23:15:14 +00:00
}
// TODO: This could be higly optimised if data where to be pre-computed.
/////////////////////////////////////////////////////////////////
// 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
MtxOrb_set_char ( int n , char * dat )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ 4 ];
int row , col ;
int letter ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
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
sprintf ( out , "%cN%c" , 254 , n );
write ( fd , out , 3 );
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
for ( row = 0 ; row < lcd . cellhgt ; row ++ ) {
letter = 0 ;
for ( col = 0 ; col < lcd . cellwid ; col ++ ) {
letter <<= 1 ;
letter |= ( dat [( row * lcd . cellwid ) + col ] > 0 );
}
write ( fd , & letter , 1 );
}
1999-12-09 23:15:14 +00:00
}
2000-03-30 20:20:41 +00:00
void
MtxOrb_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 ;
MtxOrb_set_char ( dest , & icons [ which ][ 0 ]);
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////
// Blasts a single frame onscreen, to the lcd...
//
// Input is a character array, sized lcd.wid*lcd.hgt
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_draw_frame ( char * dat )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char out [ LCD_MAX_WIDTH * LCD_MAX_HEIGHT ];
int i ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
if ( ! dat )
return ;
2000-05-25 18:21:22 +00:00
/*
2000-05-24 21:34:13 +00:00
sprintf(out, "%cG%c%c", 254, 1, 1);
write(fd, out, 4);
write(fd, dat, lcd.wid*lcd.hgt);
2000-05-25 18:21:22 +00:00
*/
2000-04-03 22:13:57 +00:00
for ( i = 0 ; i < lcd . hgt ; i ++ ) {
sprintf ( out , "%cG%c%c" , 254 , 1 , i + 1 );
write ( fd , out , 4 );
write ( fd , dat + ( lcd . wid * i ), lcd . wid );
}
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////
// returns one character from the keypad...
// (A-Z) on success, 0 on failure...
//
2000-03-30 20:20:41 +00:00
char
MtxOrb_getkey ()
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char in = 0 ;
read ( fd , & in , 1 );
return in ;
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Ask for dynamic allocation of a custom caracter to be
// a well none bar graphic. The function is suppose to
// return a value between 0 and 7 but 0 is reserver for
// heart beat.
// This function manadge a cache of graphical caracter in use.
// I really hope it is working and bug-less because it is not
// completely tested, just a quick hack.
//
2000-03-30 20:20:41 +00:00
int
MtxOrb_ask_bar ( int type )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
int i ;
int last_not_in_use ;
int pos ; // 0 is icon, 1 to 7 are free, 8 is not found.
// TODO: Reuse graphic caracter 0 if heartbeat is not in use.
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
// REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar(%d).\n", type);
// Check if the screen was clear.
if ( clear ) { // If the screen was clear then graphic caracter are not in use.
//REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| clear was set.\n");
use [ 0 ] = 1 ; // Heartbeat is always in use (not true but it help).
for ( pos = 1 ; pos < 8 ; pos ++ ) {
use [ pos ] = 0 ; // Other are not in use.
}
clear = 0 ; // We made the special treatement.
} else {
// Nothing special if some caracter a curently in use (...) ?
}
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
// Search for a match with caracter already defined.
pos = 8 ; // Not found.
last_not_in_use = 8 ; // No empty slot to reuse.
for ( i = 1 ; i < 8 ; i ++ ) { // For all but first (heartbeat).
if ( ! use [ i ])
last_not_in_use = i ; // New empty slot.
if ( def [ i ] == type )
pos = i ; // Founded (should break now).
}
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
if ( pos == 8 ) {
// REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| not found.\n");
pos = last_not_in_use ;
// TODO: Best match/deep search is no more graphic caracter are available.
}
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
if ( pos != 8 ) { // A caracter is found (Best match could solve our problem).
// REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| found at %d.\n", pos);
if ( def [ pos ] != type ) {
MtxOrb_set_known_char ( pos , type ); // Define a new graphic caracter.
def [ pos ] = type ; // Remember that now the caracter is available.
}
if ( ! use [ pos ]) { // If the caracter is no yet in use (but defined).
use [ pos ] = 1 ; // Remember it is in use (so protect it from re-use).
}
}
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
if ( pos == 8 ) // TODO: Choose a character to approximate the graph
{
//pos=65; // ("A")?
switch ( type ) {
case baru1 :
pos = '_' ;
break ;
case baru2 :
pos = '.' ;
break ;
case baru3 :
pos = ',' ;
break ;
case baru4 :
pos = 'o' ;
break ;
case baru5 :
pos = 'o' ;
break ;
case baru6 :
pos = 'O' ;
break ;
case baru7 :
pos = '8' ;
break ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
case bard1 :
pos = '\'' ;
break ;
case bard2 :
pos = '"' ;
break ;
case bard3 :
pos = '^' ;
break ;
case bard4 :
pos = '^' ;
break ;
case bard5 :
pos = '*' ;
break ;
case bard6 :
pos = 'O' ;
break ;
case bard7 :
pos = '8' ;
break ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
case barr1 :
pos = '-' ;
break ;
case barr2 :
pos = '-' ;
break ;
case barr3 :
pos = '=' ;
break ;
case barr4 :
pos = '=' ;
break ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
case barl1 :
pos = '-' ;
break ;
case barl2 :
pos = '-' ;
break ;
case barl3 :
pos = '=' ;
break ;
case barl4 :
pos = '=' ;
break ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
case barw :
pos = ' ' ;
break ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
case barb :
pos = 255 ;
break ;
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
default :
pos = '?' ;
break ;
}
}
2000-03-30 20:20:41 +00:00
2000-04-03 22:13:57 +00:00
return ( pos );
1999-12-09 23:15:14 +00:00
}
/////////////////////////////////////////////////////////////////
// Sets up a well known character for use.
//
2000-03-30 20:20:41 +00:00
void
MtxOrb_set_known_char ( int car , int type )
1999-12-09 23:15:14 +00:00
{
2000-04-03 22:13:57 +00:00
char all_bar [ 25 ][ 5 * 8 ] = {
{
0 , 0 , 0 , 0 , 0 , // char u1[] =
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 ,
}, {
0 , 0 , 0 , 0 , 0 , // char u2[] =
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 ,
}, {
0 , 0 , 0 , 0 , 0 , // char u3[] =
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 ,
}, {
0 , 0 , 0 , 0 , 0 , // char u4[] =
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 ,
}, {
0 , 0 , 0 , 0 , 0 , // char u5[] =
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 ,
}, {
0 , 0 , 0 , 0 , 0 , // char u6[] =
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 ,
}, {
0 , 0 , 0 , 0 , 0 , // char u7[] =
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 ,
}, {
1 , 1 , 1 , 1 , 1 , // char d1[] =
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 d2[] =
1 , 1 , 1 , 1 , 1 ,
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 d3[] =
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
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 d4[] =
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
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 d5[] =
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
}, {
1 , 1 , 1 , 1 , 1 , // char d6[] =
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 ,
0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 ,
}, {
1 , 1 , 1 , 1 , 1 , // char d7[] =
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 ,
0 , 0 , 0 , 0 , 0 ,
}, {
1 , 0 , 0 , 0 , 0 , // char r1[] =
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 , 1 , 0 , 0 , 0 , // char r2[] =
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 , 1 , 0 , 0 , // char r3[] =
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 , 1 , 0 , // char r4[] =
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 ,
}, {
0 , 0 , 0 , 0 , 1 , // char l1[] =
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 , 1 , 1 , // char l2[] =
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 , 1 , 1 , 1 , // char l3[] =
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 , 1 , 1 , 1 , 1 , // char l4[] =
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 ,
}, {
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 ,
}, {
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 ,
}, {
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 ,
}
};
1999-12-09 23:15:14 +00:00
2000-04-03 22:13:57 +00:00
MtxOrb_set_char ( car , & all_bar [ type ][ 0 ]);
1999-12-09 23:15:14 +00:00
}
/////////////////STOP READING --- TRASH IS AT THE END////////////////
// TODO: Remove this code wich was use for developpement.
// PS: There might be reference to this code left, so keep it for some time.
2000-03-30 20:20:41 +00:00
void
MtxOrb_init_all ( int type )
1999-12-09 23:15:14 +00:00
{
}