📄 logic.java
字号:
package oebb;/*** Logic.java: Logic for OEBB project.** Author: Martin Schoeberl (martin.schoeberl@chello.at)** Changelog:**/import util.*;import joprt.*;import ejip.*;public class Logic extends RtThread { private LinkLayer ipLink; private boolean connSent; private boolean checkMelnr; /** * Richtungs黚erwachung */ private boolean checkDirection; /** * Bewegungsueberwachung bei keiner Fahrerlaubnis */ private boolean checkMove; private int alarmType; private int[] buf; // length is one display line without status character private static final int BUF_LEN = 19; private String[] mnuBereit; private static final int MNU_BEREIT_CNT = 2; private String[] mnuTxt; private static final int MNU_CNT = 6; private String[] mnuESTxt; private static final int MNU_ES_CNT = 3; private String bsyIndication; private StringBuffer tmpStr; static final int DL_STRNR = 999; static final int DL_TIMEOUT = 60; /** * Next state after alarm quit. */ private int stateAfterQuit; Logic(int prio, int period, LinkLayer ipl) { super(prio, period); ipLink = ipl; init(); } private void init() { buf = new int[BUF_LEN]; mnuBereit = new String[MNU_BEREIT_CNT]; mnuBereit[0] = "Deaktivieren"; mnuBereit[1] = "Neustart"; mnuTxt = new String[MNU_CNT]; mnuTxt[0] = "Ankunft"; mnuTxt[1] = "Verlassen"; mnuTxt[2] = "Infobetrieb"; mnuTxt[3] = "Lernbetrieb"; mnuTxt[4] = "Umschalten -> ES221"; mnuTxt[5] = "Neustart"; mnuESTxt = new String[MNU_ES_CNT]; mnuESTxt[0] = "Haltepunkt"; mnuESTxt[1] = "Verschub"; mnuESTxt[2] = "Neustart"; bsyIndication = "+*"; tmpStr = new StringBuffer(200); Status.dirMutex = new Object(); initVals(); } private void initVals() {System.out.println("Logic.initVals()"); Status.state = Status.INIT; Status.state = Status.DL_CHECK; Status.selectStr = false; Status.melNr = 0; Status.doCommAlarm = false; Status.melNrSent = 0; Status.strNr = 0; Status.zugNr = 0; Status.melNrStart = 0; Status.melNrZiel = 0; Status.angabe = 0; Status.von = -1; Status.direction = Gps.DIR_UNKNOWN; Status.sendFerlQuit = false; Status.dispMenu = false; stateAfterQuit = Status.state; connSent = false; checkMelnr = false; checkMove = false; checkDirection = false; Status.esMode = false; } public void run() { int old_state = Status.state; for (;;) { // // Beep on every change // if (Status.state != old_state) { Led.shortBeep(); old_state = Status.state; } if (Status.commErr!=0) { commError(); } else if (Status.download) { download(); } else if (Status.dispMenu) { menu(); } else { switch (Status.state) { case Status.DL_CHECK: queryDownload(); break; case Status.INIT: waitForGps(); break; case Status.GPS_OK: bereit(); break; case Status.CONNECT: startConn(); break; case Status.FDL_CONN: anmelden(); break; case Status.ANM_OK: if (Status.esMode) { // we get into ANM_OK after an alarm the removes // our Fahrerlaubnis Status.state = Status.ES_RDY; } else { Display.write("Anmeldung OK", "", ""); } break; case Status.ANGABE: // if we will remove this in the future, make shure // loadStrNames is invoked in ERLAUBNIS Flash.loadStrNames(Status.strNr, Status.melNr, Status.angabe); Flash.Point p = Flash.getPoint(Status.angabe); Display.write("Angabe", p.stationLine1, p.stationLine2); break; case Status.ERLAUBNIS: erlaubnis(); break; case Status.WIDERRUF: widerruf(); break; case Status.NOTHALT: nothalt(); break; case Status.NOTHALT_OK: Display.write("Nothalt OK", "", ""); break; case Status.ABGEMELDET: abmelden(); break; case Status.ZIEL: ziel(); break; case Status.INFO: info(); break; case Status.LERN: lern(); break; case Status.ES221: es221(); break; case Status.ALARM: alarm(); break; case Status.ES_RDY: esRdy(); break; case Status.ES_VERSCHUB: esVerschub(); break; case Status.DEAKT: deakt(); break; default: Display.write(0, "STATE "); Display.intVal(40, Status.state); } } loop(); } } /** * update display status, wait period and * check for ATC condition. */ private boolean loop() { waitForNextPeriod(); // // set status in display // Display.setInetOk(ipLink.getIpAddress()!=0); Display.setGpsOk(Gps.fix>0); Display.setDgpsOk(Gps.fix==2); // // do the LED and Beep thing // Led.loop(); // // update Timer // Timer.loop(); if (Status.commErr != 0) { // some async message should be displayed (like comm err, Nothalt...) return false; } if (Keyboard.peek()==Keyboard.B) { if (!Status.dispMenu) { Keyboard.rd(); Status.dispMenu = true; return false; } } updateStates(); if (!check()) return false;// Dbg.intVal(com.jopdesign.sys.Native.getSP()); return true; } /** * 'calculate' what to check from the state we are in. * */ private void updateStates() { if (Status.melNr>0) { Flash.Point p = Flash.getPoint(Status.melNr); checkDirection = p.checkDirection; // Stillstand: Enable checkMove if (Gps.speed<Gps.MIN_SPEED && Status.state!=Status.ERLAUBNIS) { checkMove = p.checkMove; } } if (Status.state!=Status.ERLAUBNIS) { checkDirection = false; } } /** * Check for error conditions. */ private boolean check() { // // check for MelNr range and direction // direction check also in ZIEL // if (checkMelnr && Status.von<=0 && Status.state!=Status.ALARM && Status.melNr!=-1) { synchronized (Status.dirMutex) { if (Status.direction==Gps.DIR_UNKNOWN) { if (Status.melNrZiel > Status.melNrStart) { // going from left to rigth. Status.direction = Gps.DIR_FORWARD; } else if (Status.melNrZiel < Status.melNrStart) { // going from left to rigth. Status.direction = Gps.DIR_BACK; } } } if (Status.direction==Gps.DIR_FORWARD) { // going from left to rigth. // check Melderaum if (Status.melNr<Status.melNrStart || Status.melNr>Status.melNrZiel) { stateAfterQuit = Status.state; Status.state = Status.ALARM; alarmType = Cmd.ALARM_UEBERF; Status.melNrStart = Status.melNr; Status.melNrZiel = Status.melNr; return false; } // check direction if (checkDirection && Gps.direction==Gps.DIR_BACK && !(Status.art==Status.ZUG_NF && Status.melNr==Status.melNrZiel)) { stateAfterQuit = Status.state;// FERL bleibt// stateAfterQuit = Status.ANM_OK; Status.state = Status.ALARM; alarmType = Cmd.ALARM_RICHTUNG; return false; } } else { // going from right to left // check Melderaum if (Status.melNr>Status.melNrStart || Status.melNr<Status.melNrZiel) { stateAfterQuit = Status.state; Status.state = Status.ALARM; alarmType = Cmd.ALARM_UEBERF; Status.melNrStart = Status.melNr; Status.melNrZiel = Status.melNr; return false; } // check direction if (checkDirection && Gps.direction==Gps.DIR_FORWARD && !(Status.art==Status.ZUG_NF && Status.melNr==Status.melNrZiel)) { stateAfterQuit = Status.state;// FERL bleibt// stateAfterQuit = Status.ANM_OK; Status.state = Status.ALARM; alarmType = Cmd.ALARM_RICHTUNG; return false; } } } // every state different form Erlaubnis/Verschub.. check moving // except Verschub, Info, Lern, NOTHALT (?...?) // Status.von > 0 means Verschub if (Status.von<=0 && Status.state!=Status.ALARM && Status.state!=Status.NOTHALT && Status.state!=Status.NOTHALT_OK && Status.state!=Status.INFO && Status.state!=Status.LERN && Status.state!=Status.ES_VERSCHUB && checkMove && Gps.speed>Gps.MIN_SPEED) { stateAfterQuit = Status.state; Status.state = Status.ALARM; alarmType = Cmd.ALARM_FAEHRT; checkMove = false; // disable further Alarms return false; } if (Status.von>0 && Status.state!=Status.ALARM) { // Verschub if (Status.melNr>Status.bis || Status.melNr<Status.von) { Status.state = Status.ALARM; alarmType = Cmd.ALARM_UEBERF; Status.von = 0; // clear Verschub Status.bis = 0; // clear Verschub stateAfterQuit = Status.FDL_CONN; return false; } } if (!Status.connOk) { // perhaps retry a connect if (ipLink.getIpAddress()!=0 && Comm.dst_ip!=0 && !connSent) { // send a connect Comm.connect(); connSent = true; } } else { // // send MelNr change // if (Status.melNrSent!=Status.melNr) { Comm.mel(Status.strNr, Status.melNr); Status.melNrSent = Status.melNr; // // change start to disallow going back // Status.melNrStart = Status.melNr; } } // // Ziel erreicht // if (Status.state == Status.ERLAUBNIS && Status.melNr == Status.melNrZiel && Status.art == Status.ZUG_NORMAL) { Status.state = Status.ZIEL; if (Status.connOk) { Comm.melnrCmd(Cmd.ANZ, Status.strNr, Status.melNr); } } return true; } /** * menu handling */ private void menu() { int cnt, val, tim; cnt = 0; tim = Timer.getTimeoutSec(10); boolean bereit = false; if (Status.state==Status.DL_CHECK || Status.state==Status.INIT || Status.state==Status.GPS_OK || Status.state==Status.CONNECT) { bereit = true; }// System.out.println("Menue"); while (loop()) { if (Status.esMode) { Display.write("Betriebsfunktion:", mnuESTxt[cnt],""); } else if (bereit) { Display.write("Betriebsfunktion:", mnuBereit[cnt],""); } else { Display.write("Betriebsfunktion:", mnuTxt[cnt],""); } if (Timer.timeout(tim)) { Status.dispMenu = false; return; } val = Keyboard.rd(); if (val==-1) { continue; } tim = Timer.getTimeoutSec(10); if (val==Keyboard.C) { Status.dispMenu = false; return; } if (val==Keyboard.B) { ++cnt; if (Status.esMode) { if (cnt==MNU_ES_CNT) cnt=0; } else if (bereit) { if (cnt==MNU_BEREIT_CNT) cnt=0; } else { if (cnt==MNU_CNT) cnt=0; } } if (val==Keyboard.E) { Status.dispMenu = false; if ((Status.state==Status.NOTHALT) && cnt!=4) { Display.write("", "Nicht m鰃lich", "(Quitt. [E])"); waitEnter(); return; } if (Status.esMode) { if (cnt==0) { Status.state = Status.ES_RDY; } else if (cnt==1) { Status.state = Status.ES_VERSCHUB; } else if (cnt==2) { Display.write("Neustart", "", ""); restart(); } } else if (bereit) { if (cnt==0) { Status.state = Status.DEAKT; } else if (cnt==1) { Display.write("Neustart", "", ""); restart(); } } else { if (cnt==0) { ankunft(); return; } else if (cnt==1) { verlassen(); return; } else if (cnt==2) { Status.state = Status.INFO; } else if (cnt==3) { if (!Status.isMaster) { Display.write("", "Nicht erlaubt", ""); waitEnter(); return; } Status.state = Status.LERN; } else if (cnt==4) { Status.state = Status.ES221; } else if (cnt==5) { Display.write("Neustart", "", ""); restart(); } } return; } } } /** * Wait for GPS to be ready. * */ private void waitForGps() {System.out.println("waitGps"); int tim; Gps.wait = false; Display.initMsg(); Led.shortBeep(); boolean first = true; tim = Timer.getSec()+10; // wait for GPS data for (;;) { if (Gps.fix!=-1) { break; } if (Timer.secTimeout(tim) && first) { Display.write("GPS gest鰎t!", "", "(Quitt. [E])"); Led.alarm(); waitEnterOnly(); Led.alarmOff(); first = false; } loop(); } tim = Timer.getSec()+120; first = true; // wait for GPS melnr found for (;;) { if (Gps.fix!=0) { break; } if (Timer.secTimeout(tim) && first) { if (Gps.fix==0) { Display.write("Keine Satelliten!", "",""); Led.shortBeep(); first = false; } } if (!loop()) return; } Status.state = Status.GPS_OK; } /** * GPS is ready, we are waiting for a valid Strecke * and a valid melNr. */ private void bereit() { // wait for GPS melnr found for (;;) { if (Status.melNr>0) { // now we can check for a change of Melnr checkMelnr = true; Status.melNrStart = Status.melNr; Status.melNrZiel = Status.melNr; break; } if (Status.strNr>0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -