package oebb;
/**
* Display.java: Display and Keyboard handling
*
* Author: Martin Schoeberl (martin.schoeberl@chello.at)
*
*/
import joprt.*;
import com.jopdesign.sys.Const;
import com.jopdesign.sys.Native;
public class Display extends RtThread {
static int[] fb;
static int posRef;
static boolean gpsOk;
static boolean dgpsOk;
static boolean inetOk;
static boolean hbOk;
static final int ESC = 0x1b;
// Language for 7 bit encoding
static final int FON = 0x52;
static final int GER = 2;
static final int CCT = 0x74; // character code type
static final int LAT = 16; // WPC 1252
static final int HOM = 0x0b;
static final int FB_OFF = 4;
Display(int prio, int period) {
super(prio, period);
init();
}
private static final int MAX_TMP = 32;
private static int[] tmp; // a generic buffer
private static void init() {
int i;
tmp = new int[MAX_TMP];
/*
Native.wr(1, Native.IO_DISP); // display reset
sleepMs(5);
Native.wr(0, Native.IO_DISP); // display operate
sleepMs(100);
*/
fb = new int[20*4+FB_OFF];
posRef = 0;
initMsg();
}
public static void initMsg() {
clear();
String s = "ZLB-01 System EEG";
write(0, s);
s = "Programm Ver: ";
int i = s.length();
write(20, s);
write(20+i, Main.VER_MAJ+'0');
write(20+i+1, '.');
write(20+i+2, (Main.VER_MIN/10)+'0');
write(20+i+3, (Main.VER_MIN%10)+'0');
s = "Strecken Ver: ";
i = s.length();
write(40, s);
intVal(40+i, Flash.getVer());
}
public static void setGpsOk(boolean val) {
gpsOk = val;
setStatus();
}
public static void setDgpsOk(boolean val) {
dgpsOk = val;
setStatus();
}
public static void setInetOk(boolean val) {
inetOk = val;
setStatus();
}
public static void setHbOk(boolean val) {
hbOk = val;
setStatus();
}
private static void setStatus() {
fb[19+FB_OFF] = gpsOk ? '*' : ' ';
fb[39+FB_OFF] = dgpsOk ? '+' : ' ';
fb[59+FB_OFF] = inetOk ? '#' : ' ';
if (Main.state!=null && Main.state.isDownloading()) {
fb[59+FB_OFF] = 'D';
} else if (hbOk) {
fb[59+FB_OFF] = 'H';
}
}
/**
* Clear display, set status info.
*/
public static void clear() {
fb[0] = HOM;
fb[1] = ESC;
fb[2] = CCT;
fb[3] = LAT;
for (int i=0; i<20*4; ++i) {
fb[i+FB_OFF] = ' ';
}
setStatus();
}
public static void write(int pos, int[] buf) {
int i = buf.length;
int j;
int end;
if (pos < 20) {
end = 19;
} else if (pos < 40) {
end = 39;
} else {
end = 59;
}
for (j=0; j<i; ++j) {
fb[pos+j+FB_OFF] = buf[j]; // in [0] is cursor home
}
for (; pos+j < end; ++j) {
fb[pos+j+FB_OFF] = ' ';
}
}
/**
* write a String at position x and clear till character position 19
*/
public static void write(int pos, String s) {
int i = s.length();
int j;
int end;
if (pos < 20) {
end = 19;
} else if (pos < 40) {
end = 39;
} else {
end = 59;
}
for (j=0; j<i; ++j) {
fb[pos+j+FB_OFF] = s.charAt(j); // in [0] is cursor home
}
for (; pos+j < end; ++j) {
fb[pos+j+FB_OFF] = ' ';
}
}
/**
* write a String and an integer at position x and clear till character position 19
*/
public static void write(int pos, String s, int val) {
int i = s.length();
int j;
int end;
if (pos < 20) {
end = 19;
} else if (pos < 40) {
end = 39;
} else {
end = 59;
}
for (j=0; j<i; ++j) {
fb[pos+j+FB_OFF] = s.charAt(j); // in [0] is cursor home
}
pos += j;
if (val<0) {
write(pos++, '-');
val = -val;
}
for (i=0; i<MAX_TMP-1; ++i) {
tmp[i] = (val%10)+'0';
val /= 10;
if (val==0) break;
}
for (val=i; val>=0; --val) {
write(pos++, tmp[val]);
}
for (j=0; pos+j < end; ++j) {
fb[pos+j+FB_OFF] = ' ';
}
}
/**
* write a StringBuffer at position x and clear till character position 19
*/
public static void write(int pos, StringBuffer s) {
int i = s.length();
int j;
int end;
if (pos < 20) {
end = 19;
} else if (pos < 40) {
end = 39;
} else {
end = 59;
}
for (j=0; j<i; ++j) {
fb[pos+j+FB_OFF] = s.charAt(j); // in [0] is cursor home
}
for (; pos+j < end; ++j) {
fb[pos+j+FB_OFF] = ' ';
}
}
/**
* write a StringBuffer and an integer at position x and clear till character position 19
*/
public static void write(int pos, StringBuffer s, int val) {
int i = s.length();
int j;
int end;
if (pos < 20) {
end = 19;
} else if (pos < 40) {
end = 39;
} else {
end = 59;
}
for (j=0; j<i; ++j) {
fb[pos+j+FB_OFF] = s.charAt(j); // in [0] is cursor home
}
pos += j;
if (val<0) {
write(pos++, '-');
val = -val;
}
for (i=0; i<MAX_TMP-1; ++i) {
tmp[i] = (val%10)+'0';
val /= 10;
if (val==0) break;
}
for (val=i; val>=0; --val) {
write(pos++, tmp[val]);
}
for (j=0; pos+j < end; ++j) {
fb[pos+j+FB_OFF] = ' ';
}
}
public static void write(int pos, int ch) {
fb[pos+FB_OFF] = ch;
}
public static void intVal(int pos, int val) {
int i;
if (val<0) {
write(pos++, '-');
val = -val;
}
for (i=0; i<MAX_TMP-1; ++i) {
tmp[i] = (val%10)+'0';
val /= 10;
if (val==0) break;
}
for (val=i; val>=0; --val) {
write(pos++, tmp[val]);
}
}
public static void ipVal(int pos, int val) {
for (int i=0; i<4; ++i) {
int b = (val>>((3-i)*8)) & 0xff;
write(pos++, b/100+'0');
write(pos++, b/10%10+'0');
write(pos++, b%10+'0');
if (i<3) write(pos++, '.');
}
}
public static void hexVal(int val) {
int i, j;
}
/**
* Write three lines.
*/
public static void write(String l1, String l2, String l3) {
write(0, l1);
write(20, l2);
write(40, l3);
}
public static void write(String l1, int v1, String l2, String l3) {
write(0, l1, v1);
write(20, l2);
write(40, l3);
}
public static void write(String l1, String l2, int v2, String l3) {
write(0, l1);
write(20, l2, v2);
write(40, l3);
}
public static void write(String l1, int v1, String l2, int v2, String l3) {
write(0, l1, v1);
write(20, l2, v2);
write(40, l3);
}
/**
* Write three lines.
*/
public static void write(StringBuffer l1, StringBuffer l2, StringBuffer l3) {
write(0, l1);
write(20, l2);
write(40, l3);
}
/**
* Write three lines.
*/
public static void write(String l1, StringBuffer l2, StringBuffer l3) {
write(0, l1);
write(20, l2);
write(40, l3);
}
/**
* Write three lines.
*/
public static void write(String l1, StringBuffer l2, String l3) {
write(0, l1);
write(20, l2);
write(40, l3);
}
public void run() {
int i, j;
for (;;) {
// try to write 3 characters to the disp-uart
// buffer (usualla two will fit)
// busy goes high after each character for two ms
for (j=0; j<3; ++j) {
if ((Native.rd(Const.IO_DISP) & 0x01) == 1) {
i = posRef;
Native.wr(fb[i], Const.IO_DISP+1);
++i;
// display only three lines
if (i==(60+FB_OFF)) i = 0;
posRef = i;
}
}
Keyboard.loop();
waitForNextPeriod();
}
}
}