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