package org.syzygy.gps.midp; import org.syzygy.gps.ErrorListenerAdapter; import org.syzygy.gps.GeoName; import org.syzygy.gps.Location; import org.syzygy.gps.Util; import org.syzygy.util.WrappedException; import org.syzygy.util.midp.FileUtil; import javax.microedition.lcdui.*; import java.io.IOException; import java.util.Vector; public final class RouteMIDlet extends LocationAwareMIDlet { public RouteMIDlet() throws Exception { this.form = new Form("Routelet"); final String saveDir = props.getProperty("gps.midlet.traces"); final Form saver = new Form("Save Route"); final TextField file = new TextField("File:", "", 16, TextField.ANY); final Command ok = new Command("Save", Command.SCREEN, 1); final Command cancel = new Command("Quit", Command.SCREEN, 1); final ChoiceGroup overwrite = new ChoiceGroup(null, ChoiceGroup.MULTIPLE); overwrite.append("overwrite", null); saver.append(file); saver.append(overwrite); saver.addCommand(ok); saver.addCommand(cancel); saver.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable d) { if (c == ok) try { String fileName = file.getString(); boolean[] sel = new boolean[1]; boolean ow = overwrite.getSelectedFlags(sel) == 1; saver.removeCommand(ok); saver.removeCommand(cancel); saver.deleteAll(); saver.append(new StringItem("Saving", fileName)); Vector p = listener.getPositions(); Gauge gauge = new Gauge(null, true, p.size(), 0); saver.append(gauge); FileUtil.save(gauge, saveDir + "/" + fileName, p.elements(), ow); } catch (IOException ex) { message(ex, "Save", "Error: ", false); return; } quit(true); } }); form.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable d) { if (c == start) { form.removeCommand(start); listener.startRecording(); } else if (c == locate) { reader.stop(); locate(); } else if (c == exit) { reader.stop(); if (listener.getPositions().size() > 0) { String l = location.getText(); if (!"".equals(l)) file.setString(l); display.setCurrent(saver); return; } quit(true); } } }); this.time = new StringItem("Time/Sat", ""); this.speed = new StringItem("Spd/Max", ""); this.position = new StringItem("Lat/Lon", ""); this.location = new StringItem("Location", ""); this.status = new StringItem("", ""); reader.addListener(listener); } private class Listener extends ErrorListenerAdapter { protected void onLocation(Location l) { time.setText(l.getGpsTime() + " " + sats + (l.getIsError() ? "E" : "")); boolean changed = spd != l.getSpeed() || lat != l.getLatitude() || lng != l.getLongitude(); if (spd != l.getSpeed() || !connected) { spd = l.getSpeed(); if (spd > smax) smax = spd; speed.setText(Util.formatDouble(spd, 5, "0") + " " + Util.formatDouble(smax, 5, "0")); } else if (changed) { lat = l.getLatitude(); lng = l.getLongitude(); position.setText(Util.formatCoords(lat, lng, 10)); } if (changed) { if (started) positions.addElement(l.toString()); status.setText(Integer.toString(positions.size())); } connected = true; } protected void onClose() { if (!error) status.setText(connected ? "Connection closed" : "Connect failed"); } protected void onSatellites(int s) { sats = s; } public void notifyError(WrappedException e) { error = true; status.setLabel(e.getWrapped().toString()); status.setText(e.getMessage()); } double getLatitude() { return lat; } double getLongitude() { return lng; } Vector getPositions() { return positions; } void startRecording() { started = true; } private double lat, lng, spd, smax; private int sats; private boolean connected, started, error; private final Vector positions = new Vector(); } private void locate() { try { GeoName name = new GeoNameFactory().fromDefaultURL(listener.getLatitude(), listener.getLongitude()); if (name != null) { form.append(location); location.setText(name.getName()); form.removeCommand(locate); } } catch (Exception e) { message(e, "Error: ", "Locate", false); } } protected void startApp() { form.append(time); form.append(speed); form.append(position); form.append(status); form.addCommand(start); form.addCommand(locate); form.addCommand(exit); display.setCurrent(form); new Thread(reader).start(); } private final Form form; private final Command start = new Command("Start", Command.SCREEN, 1); private final Command locate = new Command("Locate", Command.SCREEN, 1); private final StringItem time, speed, location, position, status; private final Listener listener = new Listener(); }