New software BigNum, work in progress tested on emulator only...

This commit is contained in:
dglaude
2002-01-15 14:13:44 +00:00
parent e090a84276
commit cc7447a12f
+275 -89
View File
@@ -47,7 +47,7 @@
#include "lcd.h" #include "lcd.h"
#include "lcd_lib.h" #include "lcd_lib.h"
#include "MtxOrb.h" #include "MtxOrb.h"
/*#include "drv_base.h"*/ #include "bigfont.h"
#include "shared/report.h" #include "shared/report.h"
@@ -68,16 +68,11 @@
RESP: Because software emulated hbar/vbar permit simultaneous use. RESP: Because software emulated hbar/vbar permit simultaneous use.
*/ */
/* TODO: Remove this custom_type if not in use anymore. */ /* TODO: Find a better way to deal with the bitmap/name of custom char */
typedef enum { #define START_FONT 22
bar = 2, #define START_ICON 30
bign = 4,
beat = 8
} custom_type;
#define DIRTY_CHAR 254
#define START_ICON 22
typedef enum { typedef enum {
/* This is for bar up */
baru1 = 0, baru1 = 0,
baru2 = 1, baru2 = 1,
baru3 = 2, baru3 = 2,
@@ -85,6 +80,8 @@ typedef enum {
baru5 = 4, baru5 = 4,
baru6 = 5, baru6 = 5,
baru7 = 6, baru7 = 6,
/* This was for bar up */
/* This is for bar down */
bard1 = 7, bard1 = 7,
bard2 = 8, bard2 = 8,
bard3 = 9, bard3 = 9,
@@ -92,29 +89,58 @@ typedef enum {
bard5 = 11, bard5 = 11,
bard6 = 12, bard6 = 12,
bard7 = 13, bard7 = 13,
/* This was for bar down */
/* This is for bar right */
barr1 = 14, barr1 = 14,
barr2 = 15, barr2 = 15,
barr3 = 16, barr3 = 16,
barr4 = 17, barr4 = 17,
/* This was for bar right */
/* This is for bar left */
barl1 = 18, barl1 = 18,
barl2 = 19, barl2 = 19,
barl3 = 20, barl3 = 20,
barl4 = 21, barl4 = 21,
empty_heart = 22, /* This was for bar left */
filled_heart = 23, /* This is for sofware bigfont */
ellipsis = 24, bigfonta = 22,
barw = 32, bigfontb = 23,
bigfontc = 24,
bigfontd = 25,
bigfonte = 26,
bigfontf = 27,
bigfontg = 28,
bigfonth = 29,
/* This was for software bigfont */
/* This is for standard icon */
empty_heart = 30,
filled_heart = 31,
ellipsis = 32,
/* This was for standard icon */
/* This is for non standard icon */
play = 33, /* Play */
fforward = 34, /* FForward */
frewind = 35, /* Rewind */
uparrow = 36, /* Up arrow */
downarrow = 37, /* Down arrow */
/* This was for non standard icon */
dirty = 253,
barw = 254,
barb = 255 barb = 255
} bar_type; } bar_type;
static int custom = 0;
static enum {MTXORB_LCD, MTXORB_LKD, MTXORB_VFD, MTXORB_VKD} MtxOrb_type; static enum {MTXORB_LCD, MTXORB_LKD, MTXORB_VFD, MTXORB_VKD} MtxOrb_type;
static int fd; static int fd;
/* Control when the LCD is cleared to custom char are not in use anymore */
static int clear = 1; static int clear = 1;
static int def[9] = { -1, -1, -1, -1, -1, -1, -1, -1, -1 }; 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 }; static int use[9] = { 1, 0, 0, 0, 0, 0, 0, 0, 0 };
/* This is the char to use for the basic block of bigfont. */
static int fonttable[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
static char *framebuf = NULL; static char *framebuf = NULL;
static int width = LCD_DEFAULT_WIDTH; static int width = LCD_DEFAULT_WIDTH;
static int height = LCD_DEFAULT_HEIGHT; static int height = LCD_DEFAULT_HEIGHT;
@@ -135,17 +161,6 @@ static void MtxOrb_linewrap (Driver *drvthis, int on);
static void MtxOrb_autoscroll (Driver *drvthis, int on); static void MtxOrb_autoscroll (Driver *drvthis, int on);
static void MtxOrb_cursorblink (Driver *drvthis, int on); static void MtxOrb_cursorblink (Driver *drvthis, int on);
/* Very private function that clear internal definition. */
static void
MtxOrb_clear_custom (Driver *drvthis)
{
int pos;
for (pos = 0; pos < 9; pos++) {
def[pos] = -1; /* Not in use. */
use[pos] = 0; /* Not in use. */
}
}
static int static int
MtxOrb_parse_type (char * str) { MtxOrb_parse_type (char * str) {
@@ -440,7 +455,7 @@ MtxOrb_init (Driver *drvthis, char *args)
drvthis->backlight = MtxOrb_backlight; drvthis->backlight = MtxOrb_backlight;
drvthis->output = MtxOrb_output; drvthis->output = MtxOrb_output;
drvthis->set_char = MtxOrb_set_char; drvthis->set_char = MtxOrb_set_char;
drvthis->old_icon = MtxOrb_icon; drvthis->old_icon = MtxOrb_old_icon;
drvthis->getkey = MtxOrb_getkey; drvthis->getkey = MtxOrb_getkey;
drvthis->get_info = MtxOrb_get_info; drvthis->get_info = MtxOrb_get_info;
@@ -466,6 +481,8 @@ MtxOrb_clear (Driver *drvthis)
if (framebuf != NULL) if (framebuf != NULL)
memset (framebuf, ' ', (width * height)); memset (framebuf, ' ', (width * height));
/* We don't use hardware clear anymore.
* We use incremental update with the frame_buffer. */
/* write(fd, "\x0FE" "X", 2); */ /* instant clear... */ /* write(fd, "\x0FE" "X", 2); */ /* instant clear... */
clear = 1; clear = 1;
@@ -805,7 +822,6 @@ MtxOrb_cursorblink (Driver *drvthis, int on)
MODULE_EXPORT void MODULE_EXPORT void
MtxOrb_init_vbar (Driver *drvthis) MtxOrb_init_vbar (Driver *drvthis)
{ {
custom = bar;
} }
/****************************** /******************************
@@ -814,7 +830,6 @@ MtxOrb_init_vbar (Driver *drvthis)
MODULE_EXPORT void MODULE_EXPORT void
MtxOrb_init_hbar (Driver *drvthis) MtxOrb_init_hbar (Driver *drvthis)
{ {
custom = bar;
} }
/****************************** /******************************
@@ -943,6 +958,7 @@ MtxOrb_get_info (Driver *drvthis)
/* TODO: Finish the support for bar growing reverse way. /* TODO: Finish the support for bar growing reverse way.
* TODO: Need a "y" as input also !!! * TODO: Need a "y" as input also !!!
* TODO: Migrate to the new vbar.
****************************** ******************************
* Draws a vertical bar... * Draws a vertical bar...
* This is the new version ussing dynamic icon alocation * This is the new version ussing dynamic icon alocation
@@ -985,6 +1001,7 @@ MtxOrb_vbar (Driver *drvthis, int x, int len)
} }
/* TODO: Finish the support for bar growing reverse way. /* TODO: Finish the support for bar growing reverse way.
* TODO: Migrate to the new vbar.
****************************** ******************************
* Draws a horizontal bar to the right. * Draws a horizontal bar to the right.
* This is the new version ussing dynamic icon alocation * This is the new version ussing dynamic icon alocation
@@ -1026,9 +1043,9 @@ MtxOrb_hbar (Driver *drvthis, int x, int y, int len)
} }
/* TODO: Might not work, bignum is untested... an untested with dynamic bar. /* TODO: Might not work, bignum is untested... an untested with dynamic bar.
*
* TODO: Rather than to use the hardware BigNum we should use software * TODO: Rather than to use the hardware BigNum we should use software
* emulation, this will make it work simultaniously as hbar/vbar. GLU * emulation, this will make it work simultaniously as hbar/vbar. GLU
* TODO: Remove any need for init_num from MtxOrb (same for bar).
* *
****************************** ******************************
* Sets up for big numbers. * Sets up for big numbers.
@@ -1038,15 +1055,43 @@ MtxOrb_init_num (Driver *drvthis)
{ {
debug(RPT_DEBUG, "MtxOrb: init for big numbers"); debug(RPT_DEBUG, "MtxOrb: init for big numbers");
if (custom != bign) { /* This is NOT good since it bypass the cache */
write (fd, "\x0FEn", 2); /* TODO: Replace this stuff */
custom = bign;
MtxOrb_clear_custom (drvthis); /* This is using the custom char cache */
} fonttable[0]=MtxOrb_ask_bar ( drvthis, bigfonta);
fonttable[1]=MtxOrb_ask_bar ( drvthis, bigfontb);
fonttable[2]=MtxOrb_ask_bar ( drvthis, bigfontc);
fonttable[3]=MtxOrb_ask_bar ( drvthis, bigfontd);
fonttable[4]=MtxOrb_ask_bar ( drvthis, bigfonte);
fonttable[5]=MtxOrb_ask_bar ( drvthis, bigfontf);
fonttable[6]=MtxOrb_ask_bar ( drvthis, bigfontg);
fonttable[7]=MtxOrb_ask_bar ( drvthis, bigfonth);
/* This was using hardware call */
/*
MtxOrb_set_known_char (drvthis, 0, bigfonta);
MtxOrb_set_known_char (drvthis, 1, bigfontb);
MtxOrb_set_known_char (drvthis, 2, bigfontc);
MtxOrb_set_known_char (drvthis, 3, bigfontd);
MtxOrb_set_known_char (drvthis, 4, bigfonte);
MtxOrb_set_known_char (drvthis, 5, bigfontf);
MtxOrb_set_known_char (drvthis, 6, bigfontg);
MtxOrb_set_known_char (drvthis, 7, bigfonth);
*/
/* This was the hardware way of doing it. We keep it for historical reason. */
/* if (custom != bign) {
* write (fd, "\x0FEn", 2);
* custom = bign;
* MtxOrb_clear_custom (drvthis);
* }
*/
} }
/* TODO: MtxOrb_set_char is d ing the j b "real-time" as oppose
/* TODO: MtxOrb_set_char is doing the job "real-time" as oppose
* to at flush time. Call to this function should be done in flush * to at flush time. Call to this function should be done in flush
* this mean in raw_frame. GLU * this mean in raw_frame. GLU
* *
@@ -1062,21 +1107,54 @@ MtxOrb_init_num (Driver *drvthis)
* Writes a big number. * Writes a big number.
*/ */
MODULE_EXPORT void MODULE_EXPORT void
MtxOrb_num (Driver *drvthis, int x, int num) MtxOrb_num (Driver *drvthis, int pos, int val)
{ {
int y, dx; int x, y;
char out[5]; /* char out[5]; */
int c;
debug(RPT_DEBUG, "MtxOrb: write big number %d at %d", num, x); /* printf( "MtxOrb: write big number %d at %d ", val, pos); */
/* We don't use hardware bignum anymore, so we remove those. */
/*
snprintf (out, sizeof(out), "\x0FE#%c%c", x, num); snprintf (out, sizeof(out), "\x0FE#%c%c", x, num);
write (fd, out, 4); write (fd, out, 4);
*/
/* Make this space dirty as far as frame buffer knows. */ /* Make this space dirty as far as frame buffer knows. */
/*
for (y = 1; y < 5; y++) for (y = 1; y < 5; y++)
for (dx = 0; dx < 3; dx++) for (dx = 0; dx < 3; dx++)
MtxOrb_chr (drvthis, x + dx, y, DIRTY_CHAR); MtxOrb_chr (drvthis, x + dx, y, dirty);
*/
c=val+'0'; /* We transform from 0-9 to 'O' to '9' */
/* printf("c: %d '%c'\n", c, c); */
debug(RPT_DEBUG, "MtxOrb: write big number %d at %d", c, pos);
if ((pos < -2) || (pos > 20)) return; // are we outisde the visible spectrum
if (('c' < 32) || ('c' > 127)) return; // are we characteristic or not?
c -= 32;
/* printf("pos: %d char: %d val: %d\n", pos, c, val); */
for (y=0;y<4;y++) {
for (x=0;x<3;x++) {
/* lcd.chr(x+pos+1, y+1, normal[c][x + (y * 3)]); */
if ( normal[c][x + (y * 3)] == 32)
MtxOrb_chr (drvthis, x+pos, y+1, 32);
else if ( normal[c][x + (y * 3)] == 255)
MtxOrb_chr (drvthis, x+pos, y+1, 255);
else
{
/* This was using hardware call */
/* MtxOrb_chr (drvthis, x+pos, y+1, normal[c][x + (y * 3)]); */
/* This is using the custom char cache */
MtxOrb_chr (drvthis, x+pos, y+1, fonttable[normal[c][x + (y * 3)]]);
}
}
}
} }
/* TODO: Every time we define a custom char within the LCD, /* TODO: Every time we define a custom char within the LCD,
@@ -1139,10 +1217,8 @@ MtxOrb_set_char (Driver *drvthis, int n, char *dat)
* already defined. GLU * already defined. GLU
*/ */
MODULE_EXPORT void MODULE_EXPORT void
MtxOrb_icon (Driver *drvthis, int which, char dest) MtxOrb_old_icon (Driver *drvthis, int which, char dest)
{ {
if (custom == bign)
custom = beat;
MtxOrb_set_known_char (drvthis, dest, START_ICON+which); MtxOrb_set_known_char (drvthis, dest, START_ICON+which);
} }
@@ -1183,57 +1259,46 @@ MtxOrb_getkey (Driver *drvthis)
return in; return in;
} }
/****************************** /*************************************************************************
* Ask for dynamic allocation of a custom caracter to be * Ask for allocation of a custom caracter to be a well known graphic.
* a well none bar graphic. The function is suppose to * The function is suppose to return a value between 0 and 7.
* return a value between 0 and 7 but 0 is reserver for * 0 is NOT reserver anymore for heartbeat or icon.
* heart beat.
* This function manadge a cache of graphical caracter in use. * 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.
*/ */
static int static int
MtxOrb_ask_bar (Driver *drvthis, int type) MtxOrb_ask_bar (Driver *drvthis, int type)
{ {
int i; int i;
int last_not_in_use;
int pos; int pos;
/* 0 is icon, 1 to 7 are free, 8 is not found. int last_not_in_use;
* TODO: Reuse graphic caracter 0 if heartbeat is not in use.
* static int circular = -1;
* REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar(%d).\n", type);
* Check if the screen was clear. /* fprintf(stderr, "GLU: MtxOrb_ask_bar(%d).\n", type); */
*/
/* If the screen was clear then no graphic caracter are in use yet. */
if (clear) { if (clear) {
/* If the screen was clear then graphic caracter are not in use. /* fprintf(stderr, "GLU: MtxOrb_ask_bar| clear was set.\n"); */
* REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| clear was set.\n"); for (pos = 0; pos < 8; pos++) use[pos] = 0;
*/
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; clear = 0;
/* We made the special treatement. */
} else {
/* Nothing special if some caracter a curently in use (...) ? */
} }
/* Search for a match with caracter already defined. */ /* Search for a match with caracter already defined. */
pos = 8; /* Not found. */ pos = 8; /* Not found. */
last_not_in_use = 8; /* No empty slot to reuse. */ for (i = 0; i < 8; i++) { /* For all including heartbeat. */
for (i = 1; i < 8; i++) { /* For all but first (heartbeat). */ if (def[i] == type) pos = i; /* Founded (should break now). */
if (!use[i])
last_not_in_use = i; /* New empty slot. */
if (def[i] == type)
pos = i; /* Founded (should break now). */
} }
if (pos == 8) { if (pos == 8) {
/* REMOVE: fprintf(stderr, "GLU: MtxOrb_ask_bar| not found.\n"); */ last_not_in_use = 8; /* No empty slot to reuse. */
/* fprintf(stderr, "GLU: MtxOrb_ask_bar| not found.\n"); */
circular = (circular + 1) % 8;
for (i = 0; i < 8; i++) {
if (!use[(i + circular) % 8])
last_not_in_use = (i + circular) % 8;
}
pos = last_not_in_use; pos = last_not_in_use;
/* TODO: Best match/deep search is no more graphic caracter are available. */
} }
if (pos != 8) { if (pos != 8) {
@@ -1242,6 +1307,7 @@ MtxOrb_ask_bar (Driver *drvthis, int type)
*/ */
if (def[pos] != type) { if (def[pos] != type) {
MtxOrb_set_known_char (drvthis, pos, type); MtxOrb_set_known_char (drvthis, pos, type);
/* fprintf(stderr, "GLU: MtxOrb_ask_bar [Set a char] pos: %d.\n", pos); */
/* Define a new graphic caracter. */ /* Define a new graphic caracter. */
def[pos] = type; def[pos] = type;
/* Remember that now the caracter is available. */ /* Remember that now the caracter is available. */
@@ -1252,10 +1318,7 @@ MtxOrb_ask_bar (Driver *drvthis, int type)
/* Remember it is in use (so protect it from re-use). */ /* Remember it is in use (so protect it from re-use). */
} }
} }
if (pos==8) {
if (pos == 8)
/* TODO: Choose a character to approximate the graph */
{
/* pos=65; ("A")? */ /* pos=65; ("A")? */
switch (type) { switch (type) {
case baru1: pos = '_'; break; case baru1: pos = '_'; break;
@@ -1282,6 +1345,11 @@ MtxOrb_ask_bar (Driver *drvthis, int type)
case barl4: pos = '='; break; case barl4: pos = '='; break;
case barw: pos = ' '; break; case barw: pos = ' '; break;
case barb: pos = 255; break; case barb: pos = 255; break;
case play: pos = 'P'; break;
case fforward: pos = '>'; break;
case frewind: pos = '<'; break;
case uparrow: pos = '^'; break;
case downarrow: pos = 'v'; break;
default: pos = '?'; break; default: pos = '?'; break;
} }
} }
@@ -1298,10 +1366,6 @@ MtxOrb_heartbeat (Driver *drvthis, int type)
int the_icon=255; int the_icon=255;
static int timer = 0; static int timer = 0;
int whichIcon; int whichIcon;
static int saved_type = HEARTBEAT_ON;
if (type)
saved_type = type;
if (type == HEARTBEAT_ON) { if (type == HEARTBEAT_ON) {
/* Set this to pulsate like a real heart beat... */ /* Set this to pulsate like a real heart beat... */
@@ -1309,7 +1373,7 @@ MtxOrb_heartbeat (Driver *drvthis, int type)
/* This defines a custom character EVERY time... */ /* This defines a custom character EVERY time... */
/* not efficient... is this necessary? */ /* not efficient... is this necessary? */
/* MtxOrb_icon (whichIcon, 0); */ /* Normaly the cache should take care of that. */
the_icon=MtxOrb_ask_bar (drvthis, whichIcon+START_ICON); the_icon=MtxOrb_ask_bar (drvthis, whichIcon+START_ICON);
/* Put character on screen... */ /* Put character on screen... */
@@ -1329,7 +1393,7 @@ MtxOrb_heartbeat (Driver *drvthis, int type)
static void static void
MtxOrb_set_known_char (Driver *drvthis, int car, int type) MtxOrb_set_known_char (Driver *drvthis, int car, int type)
{ {
char all_bar[25][5 * 8] = { char all_bar[38][5 * 8] = {
{ {
0, 0, 0, 0, 0, /* char u1[] = */ 0, 0, 0, 0, 0, /* char u1[] = */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1528,6 +1592,78 @@ MtxOrb_set_known_char (Driver *drvthis, int car, int type)
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,
}, { /* char a[] */
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
1,0,0,0,0,
1,1,0,0,0,
1,1,1,0,0,
1,1,1,1,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,1,
0,0,0,1,1,
0,0,1,1,1,
0,1,1,1,1,
1,1,1,1,1,
}, { /* char c[] */
1,1,1,1,1,
0,1,1,1,1,
0,0,1,1,1,
0,0,0,1,1,
0,0,0,0,1,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
}, { /* char d[] */
1,1,1,1,1,
1,1,1,1,0,
1,1,1,0,0,
1,1,0,0,0,
1,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
}, { /* 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[] */
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,
0,0,0,0,0,
}, { /* char g[] */
1,0,0,0,0,
1,1,0,0,0,
1,1,1,0,0,
1,1,1,1,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
}, { /* char h[] */
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,
1,1,1,0,0,
1,1,0,0,0,
1,0,0,0,0,
}, { }, {
1, 1, 1, 1, 1, /* Empty Heart */ 1, 1, 1, 1, 1, /* Empty Heart */
1, 0, 1, 0, 1, 1, 0, 1, 0, 1,
@@ -1555,9 +1691,59 @@ MtxOrb_set_known_char (Driver *drvthis, int car, int type)
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, 1, 0, 1, 0, 1,
}, {
/* This is not suppose to be standard icon, just I don't want to lose them.
* They come directly from the old patch for bignum.
* TODO: It need some editing to make it like above (REMOVE ME WHEN DONE)
*/
0, 1, 0, 0, 0, /* Play */
0,1,1,0,0,
0,1,1,1,0,
0,1,1,1,1,
0,1,1,1,0,
0,1,1,0,0,
0,1,0,0,0,
0,0,0,0,0,
}, {
0, 0, 0, 0, 0, /* FForward */
1,0,1,0,0,
1,1,0,1,0,
1,1,1,0,1,
1,1,0,1,0,
1,0,1,0,0,
0,0,0,0,0,
0,0,0,0,0,
}, {
0,0,0,0,0, /* Rewind */
0,0,1,0,1,
0,1,0,1,1,
1,0,1,1,1,
0,1,0,1,1,
0,0,1,0,1,
0,0,0,0,0,
0,0,0,0,0,
}, {
0,0,1,0,0, /* Up arrow */
0,1,1,1,0,
1,1,1,1,1,
0,0,1,0,0,
0,0,1,0,0,
0,0,1,0,0,
0,0,1,0,0,
0,0,0,0,0,
}, {
0,0,1,0,0, /* Down arrow */
0,0,1,0,0,
0,0,1,0,0,
0,0,1,0,0,
1,1,1,1,1,
0,1,1,1,0,
0,0,1,0,0,
0,0,0,0,0,
} }
}; };
MtxOrb_set_char (drvthis, car, &all_bar[type][0]); MtxOrb_set_char (drvthis, car, &all_bar[type][0]);
} }