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; } }