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 PRN | SNR | Elevation | Azimuth |
\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(" | Position | Vertical | Horizontal |
\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;
}
}