⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logic.java

📁 Java Op Processor java vhdl processor
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
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 + -