package lejos.addon.gps;
import java.util.*;
/**
* RMC is a Class designed to manage RMC Sentences from a NMEA GPS Receiver
*
* RMC - NMEA has its own version of essential gps pvt (position, velocity, time) data. It is called RMC, The Recommended Minimum, which will look similar to:
*
* $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
*
* Where:
* RMC Recommended Minimum sentence C
* 123519 Fix taken at 12:35:19 UTC
* A Status A=active or V=Void.
* 4807.038,N Latitude 48 deg 07.038' N
* 01131.000,E Longitude 11 deg 31.000' E
* 022.4 Speed over the ground in knots
* 084.4 Track angle in degrees True
* 230394 Date - 23rd of March 1994
* 003.1,W Magnetic Variation
* *6A The checksum data, always begins with *
*
* @author Juan Antonio Brenha Moral (major recoding by BB)
*/
public class RMCSentence extends NMEASentence{
//RMC Sentence
// TODO: Convert all/most of these floats to int
private int dateTimeOfFix = -1;
private String warning = "";
private double latitude = 0;
private String latitudeDirection = ""; // TODO Make char
private double longitude = 0;
private String longitudeDirection = ""; // TODO Make char
private float groundSpeed;//In knots
private String courseMadeGood = null;
private int dateOfFix = -1;
private String magneticVariation = null;
//private String magneticVariationLetter = "";
private float speed;//In Kilometers per hour
//Header
public static final String HEADER = "$GPRMC";
/*
* GETTERS & SETTERS
*/
/**
* Returns the NMEA header for this sentence.
*/
public String getHeader() {
return HEADER;
}
/**
* Get Latitude
*
*/
// TODO: Why is this specified as RAW?
public double getLatitudeRAW(){
checkRefresh();
return latitude;
}
/**
* Get Longitude
*
* @return the raw longitude
*/
// TODO: Why is this specified as RAW?
public double getLongitudeRAW(){
checkRefresh();
return longitude;
}
/**
* Get Speed in Kilometers
*
* @return the speed in kilometers per ???
*/
public float getSpeed(){
checkRefresh();
return speed;
}
/**
* Get date in integer format
*
* @return the date in integer format
*/
public int getDate(){
checkRefresh();
return dateOfFix;
}
/**
* Return compass value from GPS
*
* @return the compass value in degrees. -1 means it hasn't been obtained yet.
*/
public float getCompassDegrees(){
checkRefresh();
float compassDegrees = -1;
if(courseMadeGood != null){
compassDegrees = Float.parseFloat(courseMadeGood);
}
return compassDegrees;
}
public String getMagneticVariation() {
// TODO: Parse data. Should return float, -ve for West, +ve for East. See parse()
return magneticVariation;
}
/**
* Parse RMC Sentence
*
* $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
*/
protected void parse (String sentence){
//StringTokenizer st = new StringTokenizer(nmeaSentence,",");
st = new StringTokenizer(sentence,",");
try{
st.nextToken(); // skip header $GPRMC
// TODO: Maybe leave this as a float for greater accuracy?
dateTimeOfFix = (int)Float.parseFloat(st.nextToken());
warning = st.nextToken();
//latitude = Float.parseFloat(st.nextToken());
latitude = degreesMinToDegrees(st.nextToken());
latitudeDirection = st.nextToken();
//longitude = Float.parseFloat(st.nextToken());
longitude = degreesMinToDegrees(st.nextToken());
longitudeDirection = st.nextToken();
String s = st.nextToken();
groundSpeed = s.equals("") ? 0 : Float.parseFloat(s);
courseMadeGood = st.nextToken();
dateOfFix = Integer.parseInt(st.nextToken());
magneticVariation = st.nextToken();//Float.parseFloat((String)st.nextToken());
//magneticVariationLetter = (String)st.nextToken();
}catch(NoSuchElementException e){
System.err.println("Threw a NoSuch exception");
}catch(NumberFormatException e){
System.err.println("Threw a NumFormat exception");
}
//Improve quality data
if (!longitudeDirection.equals("E")) {
longitude = -longitude;
}
if (!latitudeDirection.equals("N")) {
latitude = -latitude;
}
//Speed
if (groundSpeed > 0) {
// km/h = knots * 1.852
speed = (float) ((groundSpeed) * 1.852);
}
// A negative speed doesn't make sense.
// TODO: This seems iffy. Why set it arbitrarily to zero?
if (speed < 0) {
speed = 0;
}
}//End Parse
}//End Class