]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/load/NmeaMessage.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / load / NmeaMessage.java
diff --git a/src/tim/prune/load/NmeaMessage.java b/src/tim/prune/load/NmeaMessage.java
new file mode 100644 (file)
index 0000000..83f5382
--- /dev/null
@@ -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;
+       }
+}