import java.lang.*; import java.io.*; import java.net.*; import com.dalsemi.system.*; public class httpDaemon extends Thread { private boolean keepRunning; private int countValue; private int index; // temporary generic index value GPSStuff GPSData; private Clock C; private String inputString; private boolean refresh; public void run() {//throws IOException { try { ServerSocket server = new ServerSocket(80); C = new Clock(); while (keepRunning) { Socket socket = server.accept(); PrintWriter out = new PrintWriter(socket.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // Read in the HTTP headers String s; index = 0; while ((s = in.readLine()) != null) { index = s.indexOf("GET"); if (index >= 0) { if (s.length() <= 5) { inputString = "/"; } else { inputString = s.substring(4,s.indexOf(" ",4)); } } // if (s.equals("")) {break;} } // HTTP headers done refresh = false; index = 0; inputString = inputString.toLowerCase(); if (inputString.equals("/")) { index = 0; refresh = false; } // default output else if (inputString.equals("/refresh")) { index = 0; refresh = true; } // just put out the basic data else if (inputString.equals("/cmap")) { index = 1; refresh = false; } // output a mapblast map else if (inputString.equals("/mbmap")) { index = 2; refresh = false; } // output a mapblast map else if (inputString.equals("/full")) { index = 3; refresh = true; } // print everything else if (inputString.equals("/sv")) { index = 4; refresh = true; } // print SV summary else if (inputString.equals("/datamap")) { index = 5; refresh = true; } // print SV summary else if (inputString.equals("/basic")) { index = 6; refresh = false; } // just put out the basic data else if (inputString.equals("/help")) { index = 99; refresh = false; } // print a helper file else { inputString = "/"; } // send reply, start with the header out.print("HTTP/1.0 200 OK\r\n\r\n"); if (index == 6) { if (GPSData.fix2D) { out.print("2;"); } else if (GPSData.fix3D) { out.print("3;"); } else { out.print("-;"); } out.print(GPSData.date.toString(1)); out.print(";"); out.print(GPSData.time.toString(1)); out.print(";"); out.print(GPSData.latitude.toString(3)); out.print(";"); out.print(GPSData.longitude.toString(3)); out.print(";"); if (GPSData.fix3D) { out.print(GPSData.altitude); out.print(GPSData.altitudeUnits); out.print(";"); } else { out.print("-;"); } out.print(GPSData.heading); out.print(";"); out.print(GPSData.speed); out.print("\r\n"); } else { out.print("TiniGPS: "); if (GPSData.positionStatus) { out.print("Valid GPS Solution"); } else { out.print("Invalid GPS Solution"); } out.print(":Free RAM: " + com.dalsemi.system.TINIOS.getFreeRAM()); out.print("\r\n"); if (refresh) { out.print("\r\n"); } switch (index) { case 1: mapPage(out,1); break; case 2: mapPage(out,2); break; case 3: printFull(out); break; case 4: printSVSummary(out); break; case 5: dataMap(out); break; case 99: printHelp(out); break; default: printBasic(out); } out.print("\r\n"); } out.flush(); socket.close(); System.gc(); } } catch (java.io.IOException ioe) { ioe.printStackTrace(); } } public void mapPage(PrintWriter out, int format) { if (GPSData.positionStatus) { GPSMapOut(out,format); } else { out.print("GPS Data not available, I can't make an accurate map.
"); } } public void dataMap(PrintWriter out) { out.print(""); GPSDateOut(out,1); GPSValidOut(out,1); if (GPSData.positionStatus) { GPSPositionDataOut(out,1); GPSMapOut(out,2); } out.print("
\r\n"); } public void printFull(PrintWriter out) { out.print(""); GPSDateOut(out,1); GPSValidOut(out,1); if (GPSData.positionStatus) { GPSPositionDataOut(out,1); GPSMapOut(out,2); SVSummary(out,2); } out.print("
\r\n"); } public void printBasic(PrintWriter out) { out.print(""); GPSDateOut(out,1); GPSValidOut(out,1); if (GPSData.positionStatus) { GPSPositionDataOut(out,1); } out.print("
\r\n"); } public void printSVSummary(PrintWriter out) { out.print(""); SVSummary(out,2); out.print("
\r\n"); } public void printHelp(PrintWriter out) { out.print("

TiniGPS Help

\r\n"); out.print("Basic GPS data
\r\n"); out.print("Basic GPS data with refresh
\r\n"); out.print("Basic GPS data with Map
\r\n"); out.print("Data, map, and SV data
\r\n"); out.print("Map of the current position from the Census
\r\n"); out.print("Map of the current position from MapBlast
\r\n"); out.print("SV data
\r\n"); out.print("Simple data
\r\n"); out.print("This file
\r\n"); } public void SVSummary(PrintWriter out, int format) { switch (format) { case 1: out.print("SVs in view" + GPSData.SVInView + "\r\n"); for (index = 0; index < GPSData.SVInView; index++) { out.print("" + GPSData.SV[index].toString(1) + "\r\n"); } break; case 2: out.print("SV PRNSNRElevationAzimuth\r\n"); for (index = 0; index < GPSData.SVInView; index++) { boolean found = false; for (int a = 0; a < 12 ; a++) { if (GPSData.SV[index].PRN == GPSData.SVInUseArray[a]) { found = true; break; } } if (found) { out.print(GPSData.SV[index].toString(3)); } else { out.print(GPSData.SV[index].toString(2)); } } break; default: } } public void GPSDateOut(PrintWriter out, int format) { C.getRTC(); switch (format) { case 1: out.print("Local Date" + C.getMonth() + "/" + C.getDate() + "/" + (2000 + C.getYear()) + ""); out.print("Local time" + C.getHour() + ":" + C.getMinute() + ":" + C.getSecond() + "\r\n"); out.print("GPS Date" + GPSData.date.toString(1) + ""); out.print("GPS time" + GPSData.time.toString(1) + "\r\n"); break; default: } } public void GPSValidOut(PrintWriter out, int format) { switch (format) { case 1: out.print("GPS Solution"); if (GPSData.positionStatus) { out.print("Valid"); } else { out.print("Invalid"); } if (GPSData.fix2D) { out.print(", 2D\r\n"); } else if (GPSData.fix3D) { out.print(", 3D\r\n"); } else { out.print("\r\n"); } break; default: } } public void GPSMapOut(PrintWriter out, int format) { switch (format) { case 1: out.print("" + mapURL(1) + "\r\n"); break; case 2: out.print("" + mapURL(2) + "\r\n"); break; default: } } public void GPSPositionDataOut(PrintWriter out, int format) { switch (format) { case 1: out.print("Position"); if (GPSData.fix3D) { out.print("" + GPSData.latitude.toString(3) + " " + GPSData.longitude.toString(3) + "Altitude" + java.lang.Math.round(GPSData.altitude) + GPSData.altitudeUnits + "\r\n"); } else { out.print("" + GPSData.latitude.toString(3) + " " + GPSData.longitude.toString(3) + "Altitude----\r\n"); } out.print("Heading" + GPSData.heading + "Speed" + GPSData.speed + "\r\n" ); out.print("PositionVerticalHorizontal\r\n"); out.print("DOP" + GPSData.positionDOP + "" + GPSData.verticalDOP + "" + GPSData.horizontalDOP + "\r\n"); break; default: } } public String mapURL(int whichEngine) { String la = printPortion(Float.toString(GPSData.latitude.degrees),6); String lo = printPortion(Float.toString(GPSData.longitude.degrees),6); int width = 1; int height = 1; String URL = ""; switch (whichEngine) { case 1: // Census Map width = 422; height = 359; URL = "http://grizzly.ssd.census.gov/cgi-bin/mapper/map.gif?&lat=" + la + "&lon=" + lo + "&ht=0.006&wid=0.006&&tlevel=-&tvar=-&tmeth=i&mlat=" + la + "&mlon=" + lo + "&msym=cross&mlabel=&murl=&conf=mapnew.con&iht="+ height + "&iwd=" + width; break; case 2: // mapblast map width = 456; height = 259; URL = "http://www.mapblast.com/gif?&CT=" + la + ":" + lo + ":5000&IC=" + la + ":" + lo + ":8:&W=" + width + "&H=" + height + "&FAM=myblast&LB="; break; default: break; } return ""; } public httpDaemon(GPSStuff GPSData) { this.GPSData = GPSData; keepRunning = true; } private String printPortion(String numberString, int decimalPlaces) { int decimalPosition = numberString.indexOf("."); if (decimalPosition < 0) { return numberString; } else { int endString = decimalPosition+decimalPlaces+1; if (endString > numberString.length()) { endString = numberString.length();} return numberString.substring(0,endString); } } public void stopThread() { System.out.println("Sending the web daemon the shutdown message"); keepRunning = false; } }