/* * Class TrackingGPRS * * This software is developed for Choral devices with Java. * Copyright Choral srl. All Rights reserved. */ package general; import choral.io.Can; import com.cinterion.io.*; /** * Thread that controls the periodic sending of GPS positions (GPRMC strings) * through GPRS connection, using a timer with time set. * * @version 1.02 <BR> <i>Last update</i>: 25-10-2007 * @author alessioza * */ public class TrackingGPRS extends ThreadCustom implements GlobCost{ /* * local variables */ /** Store received msg into local mailbox */ private String msgRicevuto = ""; /** Sleep indicator of current tracking */ private boolean sospendiTrack = false; /** Tracking execution indicator */ private boolean trackingAttivo = false; private boolean exit = false; protected BCListener BCL; private String infoGps; private boolean invia_to_socket = false; private boolean setStop = true; private double ctrlSpeed = 0.0; private int val_insensibgps; Can can; int counterCanMsg = 0; int timer2=0; /* * INHERITED RESOURCES from ThreadCustom and passed to AppMain * * semaphore 'semAT', for the exclusive use of the AT resource * InfoStato 'infoS', status informations about application * Mailbox 'mbox3', to receive msg with this thread * Mailbox 'mboxMAIN', to send msg to AppMain * Mailbox 'mbox2', to send msg to th2 (ATsender) * Mailbox 'mbox5', to send msg to th5 * DataStore 'dsData', to store GPS strings */ /* * constructors */ public TrackingGPRS() { //System.out.println("Th*TrackingGPRS: CREATED"); can = new Can(); } /* * methods */ /** * Thread execution code: * <BR> ---------- <BR> * Performed operations: <br> * <ul type="disc"> * <li> Create task to send strings through GPRS connection and pass parameters; * <li> Loop for receive message sent from tasks and AppMain (about trasking * start and suspen). * </ul> */ public void run() { //System.out.println("Th*TrackingGPRS: STARTED"); while(!infoS.isCloseTrackingGPRS()){ //try { // Bearer Control BCL = new BCListener(); BearerControl.addListener(BCL); /* * WAIT FOR MESSAGES into MAILBOX for GPRS TRACKING START * */ //System.out.println("Th*TrackingGPRS: Ready to start GPRS TRACKING..."); while(true) { if (msgRicevuto.equalsIgnoreCase(timeoutExpired)) { //System.out.println("GPRS TIMEOUT ON MBOX3"); try{ semAT.getCoin(5); infoS.setATexec(true); mbox2.write("AT+CGATT=0\r"); while(infoS.getATexec()) { Thread.sleep(whileSleep); } semAT.putCoin(); }catch(InterruptedException e){} } if (msgRicevuto.equalsIgnoreCase(rebootTrack)) { break; } // *** FORCED CLOSURE OF THREAD if (msgRicevuto.equalsIgnoreCase(exitTrack)) { // Case 1: active tracking -> suspend current tracking and exit if (trackingAttivo == true) { sospendiTrack = true; exit = true; } // Case 2: not active tracking -> exit directly else break; } //stopTrack // *** FINISHED to SEND strings through GPRS if (msgRicevuto.equalsIgnoreCase(invioCompletato)) { if(debug){ System.out.println("Th*TrackingGPRS: Tracking finished!!"); } // reset timer and task, and enable CSD sospendiTrack = true; } //invioCompletato // *** Suspend current tracking, if active if (sospendiTrack == true) { infoS.setEnableCSD(true); if(debug){ System.out.println("Th*TrackingGPRS: Reset socket task e timer completed"); } if (exit == true) break; } //sospendiTrack if ( msgRicevuto.equalsIgnoreCase(trackNormale) || msgRicevuto.equalsIgnoreCase(trackMovimento) || msgRicevuto.equalsIgnoreCase(trackAttivChiave) || msgRicevuto.equalsIgnoreCase(trackDisattivChiave) || msgRicevuto.equalsIgnoreCase(trackAlarmIn1) || msgRicevuto.equalsIgnoreCase(trackAlarmIn2) || msgRicevuto.equalsIgnoreCase(trackBatteria) || msgRicevuto.equalsIgnoreCase(trackSMS) || msgRicevuto.equalsIgnoreCase(trackAlive) || msgRicevuto.equalsIgnoreCase(trackCodice) || msgRicevuto.equalsIgnoreCase(trackUrcSim)) { String datoToSend; //if (GPRSposFormat == CHORAL) { if(infoS.getInfoFileString(TrackingProt).equals("USR")){ infoGps = null; Posusr msg = new Posusr(); msg.addInfoStato(infoS); String tempRMC = (String)dsDataRMC.getLastValid(); String tempGGA = (String)dsDataGGA.getLastValid(); if(tempRMC == null) tempRMC = ""; if(tempGGA == null) tempGGA = ""; if(tempRMC.equals(tempGGA)) tempRMC = ""; if((tempRMC != null) && (!(tempRMC.equals("")))) infoGps = msg.set_posusr(tempRMC, tempGGA); else infoGps = infoS.getInfoFileString(Header)+","+infoS.getInfoFileString(IDtraker)+defaultGPS; datoToSend = infoGps; } else datoToSend = (String)dsDataRMC.getLastValid(); if((datoToSend == null) || (datoToSend.indexOf("null")>=0)){ if(infoS.getInfoFileString(TrackingProt).equals("USR")){ datoToSend = infoS.getInfoFileString(Header)+","+infoS.getInfoFileString(IDtraker)+defaultGPS+",<ERROR>*00"; } /*else{ datoToSend = defaultGpsNMEA; }*/ } if(infoS.getInfoFileString(TrackingProt).equals("USR")){ if(msgRicevuto.equalsIgnoreCase(trackMovimento)) datoToSend = datoToSend + ",ALR<" + alarmMovimento + ">"; else if(msgRicevuto.equalsIgnoreCase(trackAttivChiave)) datoToSend = datoToSend + ",ALR<" + alarmChiaveAttivata + ">"; else if(msgRicevuto.equalsIgnoreCase(trackDisattivChiave)) datoToSend = datoToSend + ",ALR<" + alarmChiaveDisattivata + ">"; else if(msgRicevuto.equalsIgnoreCase(trackBatteria)) datoToSend = datoToSend + ",ALR<" + alarmBatteria + ">"; else if(msgRicevuto.equalsIgnoreCase(trackAlarmIn1)) datoToSend = datoToSend + ",ALR<" + alarmIn1 + ">"; else if(msgRicevuto.equalsIgnoreCase(trackAlarmIn2)) datoToSend = datoToSend + ",ALR<" + alarmIn2 + ">"; else if(msgRicevuto.equalsIgnoreCase(trackAlive)) datoToSend = datoToSend + ",ALR<" + alive + ">"; else if(msgRicevuto.equalsIgnoreCase(trackCodice)) datoToSend = datoToSend + ",COD<" + infoS.getCode() + ">"; else if(msgRicevuto.equalsIgnoreCase(trackUrcSim)) datoToSend = datoToSend + ",ALR<URC SIM>"; else; } if(infoS.getInfoFileString(TrackingProt).equals("USR")){ datoToSend = datoToSend + "*" + this.getChecksum(datoToSend).toUpperCase(); } if(debug) System.out.println(datoToSend); new LogError("Trk " +datoToSend); //System.out.println("TIME DATA: " + datoToSend); //System.out.println("RAM DATA: " + infoS.getDataRAM()); // Aggiunto il 29/12/2011 [MB] ctrlSpeed =infoS.getSpeedDFS(); if(debug_speed){ ctrlSpeed = infoS.getSpeedGree(); //System.out.println("SPEED " + ctrlSpeed); } infoS.setSpeedForTrk(ctrlSpeed); try{ val_insensibgps = Integer.parseInt(infoS.getInfoFileString(InsensibilitaGPS)); }catch(NumberFormatException e){ val_insensibgps = 0; } if(msgRicevuto.equalsIgnoreCase(trackNormale)){ if ((ctrlSpeed >= val_insensibgps)){ invia_to_socket = true; setStop = false; } else { if((!infoS.getPreAlive())&&(ctrlSpeed <= val_insensibgps)&&(infoS.getPreSpeedDFS() > val_insensibgps)){ invia_to_socket = true; setStop = false; } else{ if (!setStop){ invia_to_socket = true; setStop = true; } else{ invia_to_socket = false; } } } } else{ invia_to_socket = true; } if(invia_to_socket){ try{ // semophore for queue while(!InfoStato.getCoda()){Thread.sleep(1);} }catch (InterruptedException e){} if((infoS.getDataRAM()).equals("")){ infoS.setDataRAM(datoToSend); if(debug) System.out.println(datoToSend); } else{ String datoToMem = infoS.getDataRAM(); infoS.setDataRAM(datoToSend); /* * Save data to send */ int temp = infoS.getInfoFileInt(TrkIN); //System.out.println("Th*TrackingGPRS: pointer in - " + temp); if ((temp >= codaSize) || (temp < 0)) { temp = 0; } new LogError("Th*TrackingGPRS: pointer in - " + temp + " " + datoToMem); infoS.saveRecord(temp, datoToMem); temp++; if ((temp >= codaSize) || (temp < 0)) temp = 0; infoS.setInfoFileInt(TrkIN, "" + temp); file.setImpostazione(TrkIN, "" + temp); InfoStato.getFile(); file.writeSettings(); InfoStato.freeFile(); invia_to_socket = false; } InfoStato.freeCoda(); } } //variable to verify task operation timer2++; infoS.setTask2Timer(timer2); /* * Read message from Mailbox, if present * * read() method is BLOCKING, until a message is received * (of some sort) while loop is stopped */ msgRicevuto = (String)mbox3.read(); if(debug){ System.out.println("Th*TrackingGPRS: Received message: " + msgRicevuto); } // *** Check if tracking is active if (trackingAttivo == true) { sospendiTrack = true; } } //while(true) if(debug){ System.out.println("Th*TrackingGPRS: END"); } infoS.setTrackingAttivo(false); try{ Thread.sleep(1000); }catch(InterruptedException e){} if(infoS.closeGPRS()){ infoS.setCloseGPRS(false); // Sending communication to AppMain mboxMAIN.write(msgCloseGPRS); break; } } //while } //run public String getHexaString(int num){ String dato = Integer.toHexString(num); if(dato.length()>2) dato = dato.substring(dato.length()-2); if(dato.length()<2) dato = "0" + dato; return dato; } } //TrackingGPRS