package oebb;
/**
* TestMode.java: test modus for OEBB.
*
* Author: Martin Schoeberl (martin.schoeberl@chello.at)
*
*/
import util.*;
import joprt.*;
import com.jopdesign.sys.Const;
import com.jopdesign.sys.Native;
public class TestMode {
/**
* test main.
*/
public static void doit() {
//
// start Display and Keyboard thread.
//
new Display(1, 5000);
RtThread.startMission();
Display.clear();
flushSerial();
serVal = 0;
outVal = 0;
Display.write(0, "BG263 Pruefmodus");
Display.write(20, "Software V ");
Display.intVal(31, Main.VER_MAJ);
Display.write(32, ".");
Display.intVal(33, Main.VER_MIN);
Display.write(40, "ID: ");
Display.intVal(44, Flash.getId());
for (int i=0; i<20; ++i) {
Timer.wd();
RtThread.sleepMs(100);
}
Display.clear();
forever();
}
// value for relais, dtr
private static int outVal;
private static void setOutputs() {
if (outVal==0) {
outVal = 2; // relais a
} else if (outVal==2) {
outVal = 4; // relais b
} else if (outVal==4) {
outVal = 8; // modem dtr
} else {
outVal = 0; // all off
}
}
// test keyboard
private static void testKeyboard() {
int val;
val = Keyboard.rd();
if (val != -1) {
if (val==Keyboard.UP) {
Display.write(40, 'A');
Display.write(41, 'U');
Display.write(42, 'F');
} else if (val==Keyboard.DOWN) {
Display.write(40, 'A');
Display.write(41, 'B');
Display.write(42, ' ');
} else if (val==Keyboard.E) {
Display.write(40, 'E');
Display.write(41, ' ');
Display.write(42, ' ');
} else if (val==Keyboard.B) {
Display.write(40, 'B');
Display.write(41, ' ');
Display.write(42, ' ');
} else if (val==Keyboard.C) {
Display.write(40, 'C');
Display.write(41, ' ');
Display.write(42, ' ');
} else if (val==Keyboard.BLACK) {
Display.write(40, 'S');
Display.write(41, ' ');
Display.write(42, ' ');
} else {
val = Keyboard.num(val);
if (val!=-1) {
Display.write(40, ' ');
Display.write(41, ' ');
Display.write(42, ' ');
Display.intVal(40, val);
}
}
}
}
// read all characters from serial buffer
private static void flushSerial() {
int i;
for (i=0; i<10; ++i) {
RtThread.sleepMs(100);
Timer.wd();
while ((Native.rd(Const.IO_STATUS) & Const.MSK_UA_RDRF)!=0) {
Native.rd(Const.IO_UART);
}
while ((Native.rd(Const.IO_STATUS2) & Const.MSK_UA_RDRF)!=0) {
Native.rd(Const.IO_UART2);
}
while ((Native.rd(Const.IO_STATUS3) & Const.MSK_UA_RDRF)!=0) {
Native.rd(Const.IO_UART3);
}
}
}
private static int serVal;
private static void serialSend() {
++serVal;
if (serVal==10) serVal = 0;
if ((Native.rd(Const.IO_STATUS) & Const.MSK_UA_TDRE)!=0) {
Native.wr('0'+serVal, Const.IO_UART);
}
if ((Native.rd(Const.IO_STATUS2) & Const.MSK_UA_TDRE)!=0) {
Native.wr('a'+serVal, Const.IO_UART2);
}
if ((Native.rd(Const.IO_STATUS3) & Const.MSK_UA_TDRE)!=0) {
Native.wr('A'+serVal, Const.IO_UART3);
}
}
private static void serialRcv() {
int val;
if ((Native.rd(Const.IO_STATUS) & Const.MSK_UA_RDRF)!=0) {
val = Native.rd(Const.IO_UART);
if (val != '0'+serVal) {
Display.write(0, "Serv.: Falsches Z.");
while ((Native.rd(Const.IO_STATUS) & Const.MSK_UA_RDRF)!=0) {
Native.rd(Const.IO_UART);
}
} else {
Display.write(0, "Ser.: OK ");
}
} else {
Display.write(0, "Serv.: Kein Zeich.");
}
if ((Native.rd(Const.IO_STATUS2) & Const.MSK_UA_RDRF)!=0) {
val = Native.rd(Const.IO_UART2);
if (val != 'a'+serVal) {
Display.write(20, "Modem: Falsches Z.");
while ((Native.rd(Const.IO_STATUS2) & Const.MSK_UA_RDRF)!=0) {
Native.rd(Const.IO_UART2);
}
} else {
Display.write(20, "Modem: OK ");
}
} else {
Display.write(20, "Modem: Kein Zeich.");
}
if ((Native.rd(Const.IO_STATUS3) & Const.MSK_UA_RDRF)!=0) {
val = Native.rd(Const.IO_UART3);
if (val != 'A'+serVal) {
Display.write(43, "GPS: Falsches Z.");
while ((Native.rd(Const.IO_STATUS3) & Const.MSK_UA_RDRF)!=0) {
Native.rd(Const.IO_UART3);
}
} else {
Display.write(43, "GPS: OK ");
}
} else {
Display.write(43, "GPS: Kein Zeich.");
}
}
private static void forever() {
int val;
//
// just do the WD blink with lowest priority
// => if the other threads take to long (*3) there will be a reset
//
for (;;) {
Timer.wd();
setOutputs();
// 1s loop
for (int i=0; i<50; ++i) {
serialSend();
RtThread.sleepMs(20);
serialRcv();
testKeyboard();
val = Native.rd(Const.IO_BG+1); // check input pin
Native.wr(val | (outVal ^ 8), Const.IO_BG+1); // and set led with value, invert DTR
}
}
}
}