]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/load/NmeaMessage.java
Version 10, May 2010
[GpsPrune.git] / tim / prune / load / NmeaMessage.java
1 package tim.prune.load;
2
3 import java.util.Calendar;
4
5 /**
6  * Class to hold a single NMEA message
7  */
8 public class NmeaMessage
9 {
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;
17
18         /**
19          * Constructor
20          * @param inLatitude latitude
21          * @param inLongitude longitude
22          * @param inAltitude altitude
23          * @param inTimestamp timestamp
24          * @param inFix fix = 0, 1 or 2
25          */
26         public NmeaMessage(String inLatitude, String inLongitude,
27                 String inAltitude, String inTimestamp, String inFix)
28         {
29                 _latitude = inLatitude;
30                 _longitude = inLongitude;
31                 _altitude = inAltitude;
32                 _timestamp = inTimestamp;
33                 _fix = (inFix != null && !inFix.equals("0"));
34         }
35
36         /**
37          * @return true if message has a fix
38          */
39         public boolean hasFix() {
40                 return _fix;
41         }
42
43         /**
44          * @param inSegment segment flag
45          */
46         public void setSegment(boolean inSegment)
47         {
48                 _segment = inSegment;
49         }
50
51         /**
52          * @param inDate date from MRC sentence
53          */
54         public void setDate(String inDate) {
55                 _date = inDate;
56         }
57
58         /**
59          * @return String array for loading
60          */
61         public String[] getStrings()
62         {
63                 String[] results = new String[] {modify(_latitude), modify(_longitude), _altitude,
64                         getTimestamp(), (_segment?"1":"")};
65                 return results;
66         }
67
68         /**
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
72          */
73         private static String modify(String inCoordinate)
74         {
75                 if (inCoordinate != null && inCoordinate.length() > 6)
76                 {
77                         int dotPos = inCoordinate.indexOf('.');
78                         if (dotPos > 0) {
79                                 return inCoordinate.substring(0, dotPos-2) + "d" + inCoordinate.substring(dotPos-2);
80                         }
81                 }
82                 return inCoordinate;
83         }
84
85         /**
86          * Use time from NMEA message, and today's date (as date isn't given in GPGGA messages)
87          * @return Timestamp in parseable format
88          */
89         private String getTimestamp()
90         {
91                 try
92                 {
93                         Calendar cal = Calendar.getInstance();
94                         // use date if available (today if not)
95                         if (_date != null && _date.length() == 6) {
96                                 try {
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);
102                                 }
103                                 catch (Exception e) {} // ignore exceptions for date, still take time
104                         }
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();
111                 }
112                 catch (Exception e) {}  // ignore parsing errors, just have no timestamp
113                 return null;
114         }
115 }