1 package tim.prune.load;
3 import java.util.Calendar;
6 * Class to hold a single NMEA message
8 public class NmeaMessage
10 private String _latitude = null;
11 private String _longitude = null;
12 private String _altitude = null;
13 private String _timestamp = null;
14 private String _date = null;
15 private boolean _fix = false;
16 private boolean _segment = false;
20 * @param inLatitude latitude
21 * @param inLongitude longitude
22 * @param inAltitude altitude
23 * @param inTimestamp timestamp
24 * @param inFix fix = 0, 1 or 2
26 public NmeaMessage(String inLatitude, String inLongitude,
27 String inAltitude, String inTimestamp, String inFix)
29 _latitude = inLatitude;
30 _longitude = inLongitude;
31 _altitude = inAltitude;
32 _timestamp = inTimestamp;
33 _fix = (inFix != null && !inFix.equals("0"));
37 * @return true if message has a fix
39 public boolean hasFix() {
44 * @param inSegment segment flag
46 public void setSegment(boolean inSegment)
52 * @param inDate date from MRC sentence
54 public void setDate(String inDate) {
59 * @return String array for loading
61 public String[] getStrings()
63 String[] results = new String[] {modify(_latitude), modify(_longitude), _altitude,
64 getTimestamp(), (_segment?"1":"")};
69 * Insert a separator between degrees and minutes
70 * @param inCoordinate NMEA coordinate string
71 * @return modified string or input string if format wasn't what was expected
73 private static String modify(String inCoordinate)
75 if (inCoordinate != null && inCoordinate.length() > 6)
77 int dotPos = inCoordinate.indexOf('.');
79 return inCoordinate.substring(0, dotPos-2) + "d" + inCoordinate.substring(dotPos-2);
86 * Use time from NMEA message, and today's date (as date isn't given in GPGGA messages)
87 * @return Timestamp in parseable format
89 private String getTimestamp()
93 Calendar cal = Calendar.getInstance();
94 // use date if available (today if not)
95 if (_date != null && _date.length() == 6) {
97 cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(_date.substring(0, 2)));
98 cal.set(Calendar.MONTH, Integer.parseInt(_date.substring(2, 4))-1); // month starts at zero
99 int year = Integer.parseInt(_date.substring(4, 6));
100 if (year < 80) {year += 2000;} else {year += 1900;} // two-digit year hack
101 cal.set(Calendar.YEAR, year);
103 catch (Exception e) {} // ignore exceptions for date, still take time
105 cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(_timestamp.substring(0, 2)));
106 cal.set(Calendar.MINUTE, Integer.parseInt(_timestamp.substring(2, 4)));
107 cal.set(Calendar.SECOND, Integer.parseInt(_timestamp.substring(4, 6)));
108 cal.set(Calendar.MILLISECOND, 0);
109 // Return time as number of milliseconds
110 return "" + cal.getTimeInMillis();
112 catch (Exception e) {} // ignore parsing errors, just have no timestamp