X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fload%2FNmeaMessage.java;fp=src%2Ftim%2Fprune%2Fload%2FNmeaMessage.java;h=83f5382b5e0b32b67e2c7f6e82fe1d64dad34059;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/load/NmeaMessage.java b/src/tim/prune/load/NmeaMessage.java new file mode 100644 index 0000000..83f5382 --- /dev/null +++ b/src/tim/prune/load/NmeaMessage.java @@ -0,0 +1,115 @@ +package tim.prune.load; + +import java.util.Calendar; + +/** + * Class to hold a single NMEA message + */ +public class NmeaMessage +{ + private String _latitude = null; + private String _longitude = null; + private String _altitude = null; + private String _timestamp = null; + private String _date = null; + private boolean _fix = false; + private boolean _segment = false; + + /** + * Constructor + * @param inLatitude latitude + * @param inLongitude longitude + * @param inAltitude altitude + * @param inTimestamp timestamp + * @param inFix fix = 0, 1 or 2 + */ + public NmeaMessage(String inLatitude, String inLongitude, + String inAltitude, String inTimestamp, String inFix) + { + _latitude = inLatitude; + _longitude = inLongitude; + _altitude = inAltitude; + _timestamp = inTimestamp; + _fix = (inFix != null && !inFix.equals("0")); + } + + /** + * @return true if message has a fix + */ + public boolean hasFix() { + return _fix; + } + + /** + * @param inSegment segment flag + */ + public void setSegment(boolean inSegment) + { + _segment = inSegment; + } + + /** + * @param inDate date from MRC sentence + */ + public void setDate(String inDate) { + _date = inDate; + } + + /** + * @return String array for loading + */ + public String[] getStrings() + { + String[] results = new String[] {modify(_latitude), modify(_longitude), _altitude, + getTimestamp(), (_segment?"1":"")}; + return results; + } + + /** + * Insert a separator between degrees and minutes + * @param inCoordinate NMEA coordinate string + * @return modified string or input string if format wasn't what was expected + */ + private static String modify(String inCoordinate) + { + if (inCoordinate != null && inCoordinate.length() > 6) + { + int dotPos = inCoordinate.indexOf('.'); + if (dotPos > 0) { + return inCoordinate.substring(0, dotPos-2) + "d" + inCoordinate.substring(dotPos-2); + } + } + return inCoordinate; + } + + /** + * Use time from NMEA message, and today's date (as date isn't given in GPGGA messages) + * @return Timestamp in parseable format + */ + private String getTimestamp() + { + try + { + Calendar cal = Calendar.getInstance(); + // use date if available (today if not) + if (_date != null && _date.length() == 6) { + try { + cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(_date.substring(0, 2))); + cal.set(Calendar.MONTH, Integer.parseInt(_date.substring(2, 4))-1); // month starts at zero + int year = Integer.parseInt(_date.substring(4, 6)); + if (year < 80) {year += 2000;} else {year += 1900;} // two-digit year hack + cal.set(Calendar.YEAR, year); + } + catch (Exception e) {} // ignore exceptions for date, still take time + } + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(_timestamp.substring(0, 2))); + cal.set(Calendar.MINUTE, Integer.parseInt(_timestamp.substring(2, 4))); + cal.set(Calendar.SECOND, Integer.parseInt(_timestamp.substring(4, 6))); + cal.set(Calendar.MILLISECOND, 0); + // Return time as number of milliseconds + return "" + cal.getTimeInMillis(); + } + catch (Exception e) {} // ignore parsing errors, just have no timestamp + return null; + } +}