import java.io.*; import java.util.Date; import javax.bluetooth.*; import javax.microedition.io.*; import javax.microedition.location.*; import lejos.addon.gps.*; import lejos.nxt.*; public class GPSInfo implements GPSListener { boolean doneInq = false; private static final int GPS_MAJOR = 0x1F00; DiscoveryAgent da = null; RemoteDevice myBTDevice = null; private static final int LOCATION_SCREEN = 0; private static final int ACCURACY_SCREEN = 1; private static final int SATELLITE_SCREEN = 2; private static int currentScreen = 0; private GPS gps = null; private static Coordinates target = null; DiscoveryListener dl = new DiscoveryListener() { public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { if((cod.getMajorDeviceClass() & GPS_MAJOR) == GPS_MAJOR) { if(btDevice.isAuthenticated()) { // Check if paired. myBTDevice = btDevice; da.cancelInquiry(this); } } } public void inquiryCompleted(int arg0) { doneInq = true; } }; public GPSInfo() throws LocationException { gps = new GPS(getInputStream()); GPS.addListener(this); } public InputStream getInputStream() throws LocationException { try { da = LocalDevice.getLocalDevice().getDiscoveryAgent(); da.startInquiry(DiscoveryAgent.GIAC, dl); } catch (BluetoothStateException e) { throw new LocationException(e.getMessage()); } while(!doneInq) {Thread.yield();} if(myBTDevice == null) throw new LocationException("No device found"); String address = myBTDevice.getBluetoothAddress(); String btaddy = "btspp://" + address; try { StreamConnectionNotifier scn = (StreamConnectionNotifier)Connector.open(btaddy); StreamConnection c = scn.acceptAndOpen(); return c.openInputStream(); } catch(IOException e) { throw new LocationException(e.getMessage()); } } public static void main(String [] args) { System.out.println("INSTRUCTIONS:"); System.out.println("Use arrows to \nchange screen"); System.out.println("Escape exits"); System.out.println(" "); System.out.println("Connecting..."); GPSInfo info = null; try { info = new GPSInfo(); System.out.println("Connected"); } catch (LocationException e) { System.out.println(e.getMessage()); Button.waitForPress(); System.exit(0); } while(true) { int press = Button.waitForPress(); switch(press) { case Button.ID_ESCAPE: System.exit(0); case Button.ID_RIGHT: currentScreen++; LCD.clearDisplay(); System.out.println("Refreshing..."); break; case Button.ID_LEFT: currentScreen--; LCD.clearDisplay(); System.out.println("Refreshing..."); break; case Button.ID_ENTER: target = new Coordinates(info.gps.getLatitude(),info.gps.getLongitude()); break; } } } public void sentenceReceived(NMEASentence sen) { if(sen.getHeader().equals(GGASentence.HEADER) & currentScreen == LOCATION_SCREEN) { LCD.clearDisplay(); LCD.drawString(" GPS FIX DATA " , 0, 0, true); LCD.drawString("Lat: " + gps.getLatitude(), 0, 1); LCD.drawString("Long: " + gps.getLongitude(), 0, 2); LCD.drawString("Alt: " + gps.getAltitude(), 0, 3); LCD.drawString("Dir: " + gps.getCourse(), 0, 4); LCD.drawString("Speed: " + gps.getSpeed(), 0, 5); Coordinates curC = new Coordinates(gps.getLatitude(), gps.getLongitude()); if(target != null) { LCD.drawString("Target: " + curC.distance(target), 0, 6); // TODO: Inverting text screws up LCD.drawString("Target Dir: " + curC.azimuthTo(target), 0, 7); } else { LCD.drawString("Hit ENTER to", 0, 6); LCD.drawString("set new target", 0, 7); } LCD.refresh(); } else if(sen.getHeader().equals(GSASentence.HEADER) & currentScreen == ACCURACY_SCREEN) { Date date = gps.getDate(); LCD.clearDisplay(); LCD.drawString(" Accuracy Data ", 0, 0, true); LCD.drawString(date.getMonth() + "/" + date.getDay() + "/" + date.getYear(), 0, 1); // Grenwich Mean Time. Ensure two-digit segments: String minutes = "" + date.getMinutes(); if(minutes.length() <=1) minutes = "0" + minutes; String seconds = "" + date.getSeconds(); if(seconds.length() <=1) seconds = "0" + seconds; LCD.drawString(date.getHours() + ":" + minutes + ":" + seconds + " GMT", 0, 2); LCD.drawString("H-Acc (m): " + (gps.getHDOP()*6), 0, 3); LCD.drawString("(HDOP:" + gps.getHDOP() + ")", 0, 4); LCD.drawString("V-Acc (m): " + (gps.getVDOP()*6), 0, 5); LCD.drawString("(VDOP:" + gps.getVDOP() + ")", 0, 6); LCD.drawString(" Tracked Sats: " + gps.getSatellitesTracked() + " ", 0, 7); LCD.refresh(); } else if(sen.getHeader().equals(GSVSentence.HEADER) & currentScreen >= SATELLITE_SCREEN) { LCD.clearDisplay(); int [] sv = gps.getPRN(); int svtot=0; for(int i=0;i<sv.length;i++) { if(sv[i] >=0) svtot++; } //LCD.drawString("SV size: " + svtot, 0, 2); int satIndex = currentScreen - 2; LCD.drawString("Satellite " + (satIndex + 1) + "/" + gps.getSatellitesInView(), 0, 0, true); Satellite s = gps.getSatellite(satIndex); LCD.drawString("AZ: " + s.getAzimuth(), 0, 2); LCD.drawString("Elev: " + s.getElevation(), 0, 3); LCD.drawString("PRN: " + s.getPRN(), 0, 4); LCD.drawString("Sig/Noise: " + s.getSignalNoiseRatio(), 0, 5); LCD.drawString("Tracked? " + s.isTracked(), 0, 6); LCD.refresh(); } } }