1153 lines
22 KiB
C
1153 lines
22 KiB
C
/* This is the bignumber-library used by the serialVFD driver.
|
|
|
|
Copyright (C) 2006 Stefan Herdler
|
|
|
|
Based on drivers.c and lcd-lib.c.
|
|
It may contain parts of other drivers of this package too.
|
|
|
|
2006-01-26 Version 0.1: everything should work (not all hardware tested!)
|
|
|
|
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 of the License, or
|
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
|
|
|
|
Requirements to the calling driver / display:
|
|
cellwidth == 5
|
|
cellheight == 7 or 8 (tested only on 7)
|
|
needed functions:
|
|
drvthis->set_char (only if the display has customcharacters)
|
|
drvthis->chr
|
|
customcharacters (if available) at char 0, 1, 2, ..... ,n
|
|
|
|
USAGE:
|
|
|
|
Just call lib_adv_bignum(drvthis, x, num, height, do_init, customchars)
|
|
from drvthis->num.
|
|
The library does everything needed to show bignumbers EXCEPT checking or
|
|
setting the CCMODE variable. The driver has to do this (see serialVFD.c
|
|
for details).
|
|
|
|
Example: Call of the lib_adv_bignum from a drivers_num function :
|
|
|
|
MODULE_EXPORT void
|
|
serialVFD_num( Driver * drvthis, int x, int num )
|
|
{
|
|
int do_init=0;
|
|
PrivateData *p = drvthis->private_data;
|
|
|
|
|
|
if (p->ccmode != CCMODE_BIGNUM) // Are the customcharacters set up correctly? If not:
|
|
{
|
|
do_init=1; // Lib_adv_bignum has to set the customcharacters.
|
|
p->ccmode = CCMODE_BIGNUM; // Switch customcharactermode to bignum.
|
|
}
|
|
// Lib_adv_bignum does everything needed to show the bignumbers.
|
|
lib_adv_bignum(drvthis, x, num, p->height, do_init, p->customchars);
|
|
}
|
|
|
|
To enable the bignumbers on 2-line displays you have to edit "/clients/lcdproc/chrono.c"
|
|
before compiling. In function "big_clock_screen" you have to replace the "4" by a "2" in
|
|
this line: "if (lcd_hgt < 4)".
|
|
|
|
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <syslog.h>
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include "lcd.h"
|
|
#include "adv_bignum.h"
|
|
|
|
#include "report.h"
|
|
#include "lcd_lib.h"
|
|
|
|
|
|
|
|
|
|
static void adv_bignum_num_2_0 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
static void adv_bignum_num_2_1 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
static void adv_bignum_num_2_2 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
static void adv_bignum_num_2_5 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
static void adv_bignum_num_2_28 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
|
|
static void adv_bignum_num_4_0 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
static void adv_bignum_num_4_3 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
static void adv_bignum_num_4_8 (Driver *drvthis, int x, int num, int height, int do_init);
|
|
|
|
static void adv_bignum_write_num (Driver *drvthis, char write_num_map[][4][3], int x, int num, int height);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function determines the best possible bignumbertype for the display.
|
|
// The called bignumberfunction is depending on the display's height and the
|
|
// number of customcharacters.
|
|
void
|
|
lib_adv_bignum(Driver *drvthis, int x, int num, int do_init, int customchars)
|
|
{
|
|
int height = drvthis->height(drvthis);
|
|
|
|
switch (height) { // Display heigth:
|
|
case 2: // 2 lines
|
|
case 3: // are 3 line displays really existing?
|
|
if (customchars == 0) { // 2 lines and customchars = 0
|
|
adv_bignum_num_2_0 (drvthis, x, num, height, do_init);
|
|
}
|
|
else if (customchars == 1) { // 2 lines and customchars = 1
|
|
adv_bignum_num_2_1 (drvthis, x, num, height, do_init);
|
|
}
|
|
else if (customchars < 5) { // 2 lines and customchars = 2 ... 4
|
|
adv_bignum_num_2_2 (drvthis, x, num, height, do_init);
|
|
}
|
|
else if (customchars < 28) { // 2 lines and customchars = 5 ... 27
|
|
adv_bignum_num_2_5 (drvthis, x, num, height, do_init);
|
|
}
|
|
else { // 2 lines and customchars >= 28
|
|
adv_bignum_num_2_28 (drvthis, x, num, height, do_init);
|
|
}
|
|
break;
|
|
case 4: // 4 lines
|
|
if (customchars == 0) { // 4 lines and customchars < 3
|
|
adv_bignum_num_4_0 (drvthis, x, num, height, do_init);
|
|
}
|
|
else if (customchars < 8) { // 4 lines and customchars < 8
|
|
adv_bignum_num_4_3 (drvthis, x, num, height, do_init);
|
|
}
|
|
else { // 4 lines and customchars >= 8
|
|
adv_bignum_num_4_8 (drvthis, x, num, height, do_init);
|
|
}
|
|
break;
|
|
default:
|
|
return;
|
|
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function writes the selected type of bignumber by calling the driver's chr function.
|
|
// It is called by display-depending bignumber functions to write the numbers.
|
|
static void adv_bignum_write_num (Driver *drvthis, char write_num_map[][4][3], int x, int num, int height)
|
|
{
|
|
int y, dx;
|
|
|
|
for (y = 0; y < height; y++) {
|
|
if (num == 10) // ":" is only 1 character wide.
|
|
drvthis->chr(drvthis, x, y+1, write_num_map[num][y][0]);
|
|
else {
|
|
for (dx = 0; dx < 3; dx++)
|
|
drvthis->chr(drvthis, x + dx, y+1, write_num_map[num][y][dx]);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
// Display dependent functions.
|
|
//
|
|
//
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is called for a 2 line display without custom characters.
|
|
// (pretty ugly looking)
|
|
static void adv_bignum_num_2_0 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] = {
|
|
{ /* 0 */
|
|
" ||",
|
|
" ||",
|
|
" ",
|
|
" " },
|
|
{ /* 1 */
|
|
" |",
|
|
" |",
|
|
" ",
|
|
" " },
|
|
{ /* 2 */
|
|
" ]",
|
|
" [ ",
|
|
" ",
|
|
" " },
|
|
{ /* 3 */
|
|
" ]",
|
|
" ]",
|
|
" ",
|
|
" " },
|
|
{ /* 4 */
|
|
" L|",
|
|
" |",
|
|
" ",
|
|
" " },
|
|
{ /* 5 */
|
|
" [ ",
|
|
" ]",
|
|
" ",
|
|
" " },
|
|
{ /* 6 */
|
|
" [ ",
|
|
" []",
|
|
" ",
|
|
" " },
|
|
{ /* 7 */
|
|
" 7",
|
|
" |",
|
|
" ",
|
|
" " },
|
|
{ /* 8 */
|
|
" []",
|
|
" []",
|
|
" ",
|
|
" " },
|
|
{ /* 9 */
|
|
" []",
|
|
" ]",
|
|
" ",
|
|
" " },
|
|
{ /* colon */
|
|
".",
|
|
".",
|
|
" ",
|
|
" " }
|
|
}; // Defines the character placing inside the bignumber.
|
|
|
|
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 2 line display with 1 or more custom characters.
|
|
// (not a beauty, but useable)
|
|
static void adv_bignum_num_2_1 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] = {
|
|
{ /* 0 */
|
|
{'|',0,'|'},
|
|
{"|_|"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 1 */
|
|
{" |"},
|
|
{" |"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 2 */
|
|
{' ',0,']'},
|
|
{" [_"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 3 */
|
|
{' ',0,']'},
|
|
{" _]"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 4 */
|
|
{" L|"},
|
|
{" |"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 5 */
|
|
{' ','[',0},
|
|
{" _]"},
|
|
{" "},
|
|
{" " }},
|
|
{ /* 6 */
|
|
{' ','[',0},
|
|
{" []"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 7 */
|
|
{' ',0,'|'},
|
|
{" |"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 8 */
|
|
{" []"},
|
|
{" []"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* 9 */
|
|
{" []"},
|
|
{" _]"},
|
|
{" "},
|
|
{" "} },
|
|
{ /* colon */
|
|
{"."},
|
|
{"."},
|
|
{" "},
|
|
{" "} }
|
|
}; // Defines the character placing inside the bignumber.
|
|
|
|
if (do_init) { // Set customcharacters if needed.
|
|
static unsigned char bignum[1][8] = { // stored customcharacter
|
|
[0] {
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, }
|
|
};
|
|
drvthis->set_char (drvthis, 0, bignum[0]); // put the customcharacter into the display
|
|
}
|
|
|
|
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 2 line display with 2 or more custom characters.
|
|
// (o.k.)
|
|
static void adv_bignum_num_2_2 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] ={
|
|
{ /* 0 */
|
|
{'|',0,'|'},
|
|
"|_|",
|
|
" ",
|
|
" " },
|
|
{ /* 1 */
|
|
" |",
|
|
" |",
|
|
" ",
|
|
" " },
|
|
{ /* 2 */
|
|
{' ',1,'|'},
|
|
"|_ ",
|
|
" ",
|
|
" " },
|
|
{ /* 3 */
|
|
{' ',1,'|'},
|
|
" _|",
|
|
" ",
|
|
" " },
|
|
{ /* 4 */
|
|
"|_|",
|
|
" |",
|
|
" ",
|
|
" " },
|
|
{ /* 5 */
|
|
{'|',1,' '},
|
|
" _|",
|
|
" ",
|
|
" " },
|
|
{ /* 6 */
|
|
{'|',0,' '},
|
|
{'|',1,'|'},
|
|
" ",
|
|
" " },
|
|
{ /* 7 */
|
|
{' ',0,'|'},
|
|
" |",
|
|
" ",
|
|
" " },
|
|
{ /* 8 */
|
|
{'|',1,'|'},
|
|
"|_|",
|
|
" ",
|
|
" " },
|
|
{ /* 9 */
|
|
{'|',1,'|'},
|
|
" _|",
|
|
" ",
|
|
" " },
|
|
{ /* colon */
|
|
".",
|
|
".",
|
|
" ",
|
|
" " }
|
|
}; // Defines the character placing inside the bignumber.
|
|
|
|
if (do_init) { // Set customcharacters if needed.
|
|
static unsigned char bignum[2][8] = { // stored customcharacters
|
|
[0] {
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[1] {
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX, }
|
|
};
|
|
int i;
|
|
for (i = 0; i < 2; i++) { // put the customcharacters into the display
|
|
drvthis->set_char (drvthis, i, bignum[i]);
|
|
}
|
|
}
|
|
|
|
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 2 line display with 5 or more custom characters.
|
|
// (nice bignumbers)
|
|
static void adv_bignum_num_2_5 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] =
|
|
{{{3 ,0 ,2}, /*0*/
|
|
{3 ,1 ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{' ' ,' ', 2},/*1*/
|
|
{' ' ,' ', 2},
|
|
{" "},
|
|
{" "}},
|
|
{{' ' ,4 ,2},/*2*/
|
|
{3 ,1 ,' '},
|
|
{" "},
|
|
{" "}},
|
|
{{' ' ,4 ,2},/*3*/
|
|
{' ' ,1 ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{3 ,1 ,2},/*4*/
|
|
{' ' ,' ' ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{3 ,4 ,' '},/*5*/
|
|
{' ' ,1 ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{3 ,0 ,' '},/*6*/
|
|
{3 ,4 ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{' ' ,0 ,2},/*7*/
|
|
{' ' ,' ' ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{3 ,4 ,2},/*8*/
|
|
{3 ,1 ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{3 ,4 ,2},/*9*/
|
|
{' ' ,1 ,2},
|
|
{" "},
|
|
{" "}},
|
|
{{'.'},/*:*/
|
|
{'.'},
|
|
{" "},
|
|
{" "}}}; // Defines the character placing inside the bignumber.
|
|
|
|
if (do_init) { // Set customcharacters if needed.
|
|
static unsigned char bignum[5][8] = { // stored customcharacters
|
|
[0] {
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[1] {
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX, },
|
|
[2] {
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__, },
|
|
[3] {
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX, },
|
|
[4] {
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX, }
|
|
};
|
|
int i;
|
|
|
|
for (i = 0; i < 5 ; i++) { // put the customcharacters into the display
|
|
drvthis->set_char (drvthis, i, bignum[i]);
|
|
}
|
|
}
|
|
|
|
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 2 line display with 28 or more custom characters.
|
|
// (Wow, allmost graphical)
|
|
static void adv_bignum_num_2_28 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] =
|
|
{{{15 ,6 ,2}, /*0*/
|
|
{14 ,4 ,5},
|
|
{" "},
|
|
{" "}},
|
|
{{' ' ,26 ,' '},/*1*/
|
|
{' ' ,10 ,' '},
|
|
{" "},
|
|
{" "}},
|
|
{{1 ,6 ,2},/*2*/
|
|
{7 ,8 ,9},
|
|
{" "},
|
|
{" "}},
|
|
{{0 ,11 ,2},/*3*/
|
|
{3 ,13 ,5},
|
|
{" "},
|
|
{" "}},
|
|
{{25 ,21 ,23},/*4*/
|
|
{17 ,22 ,24},
|
|
{" "},
|
|
{" "}},
|
|
{{10 ,11 ,12},/*5*/
|
|
{3 ,13 ,5},
|
|
{" "},
|
|
{" "}},
|
|
{{15 ,11 ,16},/*6*/
|
|
{14 ,13 ,5},
|
|
{" "},
|
|
{" "}},
|
|
{{17 ,18 ,19},/*7*/
|
|
{' ' ,20 ,' '},
|
|
{" "},
|
|
{" "}},
|
|
{{15 ,11 ,2},/*8*/
|
|
{14 ,13 ,5},
|
|
{" "},
|
|
{" "}},
|
|
{{15 ,11 ,2},/*9*/
|
|
{3 ,13 ,5},
|
|
{" "},
|
|
{" "}},
|
|
{{27},/*:*/
|
|
{27},
|
|
{" "},
|
|
{" "}}}; // Defines the character placing inside the bignumber.
|
|
|
|
if (do_init) { // Set customcharacters if needed.
|
|
static unsigned char bignum[28][8] = { // stored customcharacters
|
|
[0] { //0
|
|
b_____XX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[1] { //1
|
|
b_____XX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[2] { //2
|
|
b__XX___,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__, },
|
|
[3] { //3
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b____XXX,
|
|
b____XXX,
|
|
b_____XX,
|
|
b_____XX, },
|
|
[4] { //4
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX, },
|
|
[5] { //5
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XX___,
|
|
b__X____, },
|
|
[6] { //6
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[7] { //7
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b______X,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX, },
|
|
[8] { //8
|
|
b____XXX,
|
|
b___XXXX,
|
|
b__XXXX_,
|
|
b__XXX__,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX, },
|
|
[9] { //9
|
|
b__X____,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__, },
|
|
[10] { //10
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX, },
|
|
[11] { //11
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX, },
|
|
[12] { //12
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[13] { //13
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX, },
|
|
[14] { //14
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b_____XX,
|
|
b_____XX, },
|
|
[15] { //15
|
|
b_____XX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX, },
|
|
[16] { //16
|
|
b__XX___,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[17] { //17
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[18] { //18
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b_______,
|
|
b_____XX,
|
|
b_____XX,
|
|
b____XXX,
|
|
b____XXX, },
|
|
[19] { //19
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XX___,
|
|
b__X____,
|
|
b_______,
|
|
b_______, },
|
|
[20] { //20
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b__XXXX_,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__, },
|
|
[21] { //21
|
|
b______X,
|
|
b_____XX,
|
|
b____XXX,
|
|
b___XXXX,
|
|
b__XXXXX,
|
|
b__XXX_X,
|
|
b__XX__X,
|
|
b__XX__X, },
|
|
[22] { //22
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b______X,
|
|
b______X,
|
|
b______X,
|
|
b______X,
|
|
b______X, },
|
|
[23] { //23
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____, },
|
|
[24] { //24
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__XXX__,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____,
|
|
b__X____, },
|
|
[25] { //25
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b______X,
|
|
b______X, },
|
|
[26] { //26
|
|
b____XXX,
|
|
b____XXX,
|
|
b___XXXX,
|
|
b__XXXXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX,
|
|
b____XXX, },
|
|
[27] { //27
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b____XX_,
|
|
b____XX_,
|
|
b_______,
|
|
b_______,
|
|
b_______, }
|
|
};
|
|
int i;
|
|
|
|
for (i = 0; i < 28 ; i++) { // put the customcharacters into the display
|
|
drvthis->set_char (drvthis, i, bignum[i]);
|
|
}
|
|
}
|
|
|
|
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 4 line display without custom characters.
|
|
// (o.k.)
|
|
static void adv_bignum_num_4_0 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
/* Ugly code extracted by David GLAUDE from lcdm001.c ;)*/
|
|
/* Moved to driver.c by Joris Robijn */
|
|
// Moved to adv_bignum.c by Stefan Herdler
|
|
static char num_map[][4][3] = {
|
|
{ /* 0 */
|
|
" _ ",
|
|
"| |",
|
|
"|_|",
|
|
" " },
|
|
{ /* 1 */
|
|
" ",
|
|
" |",
|
|
" |",
|
|
" " },
|
|
{ /* 2 */
|
|
" _ ",
|
|
" _|",
|
|
"|_ ",
|
|
" " },
|
|
{ /* 3 */
|
|
" _ ",
|
|
" _|",
|
|
" _|",
|
|
" " },
|
|
{ /* 4 */
|
|
" ",
|
|
"|_|",
|
|
" |",
|
|
" " },
|
|
{ /* 5 */
|
|
" _ ",
|
|
"|_ ",
|
|
" _|",
|
|
" " },
|
|
{ /* 6 */
|
|
" _ ",
|
|
"|_ ",
|
|
"|_|",
|
|
" " },
|
|
{ /* 7 */
|
|
" _ ",
|
|
" |",
|
|
" |",
|
|
" " },
|
|
{ /* 8 */
|
|
" _ ",
|
|
"|_|",
|
|
"|_|",
|
|
" " },
|
|
{ /* 9 */
|
|
" _ ",
|
|
"|_|",
|
|
" _|",
|
|
" " },
|
|
{ /* colon */
|
|
" ",
|
|
".",
|
|
".",
|
|
" " }
|
|
}; // Defines the character placing inside the bignumber.
|
|
|
|
adv_bignum_write_num(drvthis, num_map, x, num, height); // write the number
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 4 line display with 3 or more custom characters.
|
|
// (nice bignumbers)
|
|
static void adv_bignum_num_4_3 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] =
|
|
{{{3 ,1 ,3}, /*0*/
|
|
{3 ,' ' ,3},
|
|
{3 ,' ' ,3},
|
|
{3 ,2 ,3}},
|
|
{{' ' ,' ' ,3},/*1*/
|
|
{' ' ,' ' ,3},
|
|
{' ' ,' ' ,3},
|
|
{' ' ,' ' ,3}},
|
|
{{' ' ,1 ,3},/*2*/
|
|
{' ' ,2 ,3},
|
|
{3 ,' ' ,' '},
|
|
{3 ,2 ,' '}},
|
|
{{' ' ,1 ,3},/*3*/
|
|
{' ' ,2 ,3},
|
|
{' ' ,' ' ,3},
|
|
{' ' ,2 ,3}},
|
|
{{3 ,' ' ,3},/*4*/
|
|
{3 ,2 ,3},
|
|
{' ' ,' ' ,3},
|
|
{' ' ,' ' ,3}},
|
|
{{3 ,1 ,' '},/*5*/
|
|
{3 ,2 ,' '},
|
|
{' ' ,' ' ,3},
|
|
{' ' ,2 ,3}},
|
|
{{3 ,1 ,' '},/*6*/
|
|
{3 ,2 ,' '},
|
|
{3 ,' ' ,3},
|
|
{3 ,2 ,3}},
|
|
{{' ' ,1 ,3},/*7*/
|
|
{' ' ,' ' ,3},
|
|
{' ' ,' ' ,3},
|
|
{' ' ,' ' ,3}},
|
|
{{3 ,1 ,3},/*8*/
|
|
{3 ,2 ,3},
|
|
{3 ,' ' ,3},
|
|
{3 ,2 ,3}},
|
|
{{3 ,1 ,3},/*9*/
|
|
{3 ,2 ,3},
|
|
{' ' ,' ' ,3},
|
|
{' ' ,2 ,3}},
|
|
{{" "},/*:*/
|
|
{'.'},
|
|
{'.'},
|
|
{" "}}}; // Defines the character placing inside the bignumber.
|
|
|
|
if (do_init) { // Set customcharacters if needed.
|
|
static unsigned char bignum[3][8] = { // stored customcharacters
|
|
[0] {
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[1] {
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX,
|
|
b__XXXXX, },
|
|
[2] {
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b___XXX_,
|
|
b___XXX_, }
|
|
};
|
|
int i;
|
|
|
|
for (i = 0; i < 3; i++) { // put the customcharacters into the display
|
|
drvthis->set_char(drvthis, i+1, bignum[i]);
|
|
}
|
|
}
|
|
|
|
adv_bignum_write_num(drvthis, num_map, x, num, height); // write the number
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// This function is usable for a 4 line display with 8 or more custom characters.
|
|
// (nice bignumbers)
|
|
static void adv_bignum_num_4_8 (Driver *drvthis, int x, int num, int height, int do_init)
|
|
{
|
|
static char num_map[][4][3] = {
|
|
{ /* 0: */
|
|
{ 1, 2, 3 },
|
|
{ 6, 32, 6 },
|
|
{ 6, 32, 6 },
|
|
{ 7, 2, 32 } },
|
|
{ /* 1: */
|
|
{ 7, 6, 32 },
|
|
{ 32, 6, 32 },
|
|
{ 32, 6, 32 },
|
|
{ 7, 2, 32 } },
|
|
{ /* 2: */
|
|
{ 1, 2, 3 },
|
|
{ 32, 5, 0 },
|
|
{ 1, 32, 32 },
|
|
{ 2, 2, 0 } },
|
|
{ /* 3: */
|
|
{ 1, 2, 3 },
|
|
{ 32, 5, 0 },
|
|
{ 3, 32, 6 },
|
|
{ 7, 2, 32 } },
|
|
{ /* 4: */
|
|
{ 32, 3, 6 },
|
|
{ 1, 32, 6 },
|
|
{ 2, 2, 6 },
|
|
{ 32, 32, 0 } },
|
|
{ /* 5: */
|
|
{ 1, 2, 0 },
|
|
{ 2, 2, 3 },
|
|
{ 3, 32, 6 },
|
|
{ 7, 2, 32 } },
|
|
{ /* 6: */
|
|
{ 1, 2, 32 },
|
|
{ 6, 5, 32 },
|
|
{ 6, 32, 6 },
|
|
{ 7, 2, 32 } },
|
|
{ /* 7: */
|
|
{ 2, 2, 6 },
|
|
{ 32, 1, 32 },
|
|
{ 32, 6, 32 },
|
|
{ 32, 0, 32 } },
|
|
{ /* 8: */
|
|
{ 1, 2, 3 },
|
|
{ 4, 5, 0 },
|
|
{ 6, 32, 6 },
|
|
{ 7, 2, 32 } },
|
|
{ /* 9: */
|
|
{ 1, 2, 3 },
|
|
{ 4, 3, 6 },
|
|
{ 32, 1, 32 },
|
|
{ 7, 32, 32 } },
|
|
{ /* colon: (only 1st column used) */
|
|
{ 32, 32, 32 },
|
|
{ 0, 32, 32 },
|
|
{ 0, 32, 32 },
|
|
{ 32, 32, 32 } }
|
|
}; // Defines the character placing inside the bignumber.
|
|
|
|
if (do_init) { // Set customcharacters if needed.
|
|
static unsigned char bignum[8][8] = { // stored customcharacters
|
|
[0] {
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[1] {
|
|
b_____XX,
|
|
b_____XX,
|
|
b_____XX,
|
|
b_____XX,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___, },
|
|
[2] {
|
|
b__XX_XX,
|
|
b__XX_XX,
|
|
b__XX_XX,
|
|
b__XX_XX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, },
|
|
[3] {
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___, },
|
|
[4] {
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b_____XX,
|
|
b_____XX,
|
|
b_____XX,
|
|
b_____XX, },
|
|
[5] {
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b__XX_XX,
|
|
b__XX_XX,
|
|
b__XX_XX,
|
|
b__XX_XX, },
|
|
[6] {
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___,
|
|
b__XX___, },
|
|
[7] {
|
|
b_____XX,
|
|
b_____XX,
|
|
b_____XX,
|
|
b_____XX,
|
|
b_______,
|
|
b_______,
|
|
b_______,
|
|
b_______, }
|
|
};
|
|
int i;
|
|
|
|
for (i = 0; i < 8 ; i++) { // put the customcharacters into the display
|
|
drvthis->set_char(drvthis, i, bignum[i]);
|
|
}
|
|
}
|
|
|
|
adv_bignum_write_num(drvthis, num_map, x, num, height); // write the number
|
|
}
|