Skip to content

Instantly share code, notes, and snippets.

@javisantana
Last active August 30, 2023 07:07

Revisions

  1. javisantana revised this gist Jun 1, 2021. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion nmea.java
    Original file line number Diff line number Diff line change
    @@ -6,7 +6,6 @@

    public class NMEA {

    // fucking java interfaces
    interface SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position);
    }
  2. javisantana revised this gist Jan 17, 2013. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions license.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    this software is under the terms of MIT license: http://opensource.org/licenses/MIT
  3. javisantana created this gist Oct 30, 2011.
    126 changes: 126 additions & 0 deletions nmea.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,126 @@
    package es.agroguia.model;

    import java.util.HashMap;
    import java.util.Map;


    public class NMEA {

    // fucking java interfaces
    interface SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position);
    }

    // utils
    static float Latitude2Decimal(String lat, String NS) {
    float med = Float.parseFloat(lat.substring(2))/60.0f;
    med += Float.parseFloat(lat.substring(0, 2));
    if(NS.startsWith("S")) {
    med = -med;
    }
    return med;
    }

    static float Longitude2Decimal(String lon, String WE) {
    float med = Float.parseFloat(lon.substring(3))/60.0f;
    med += Float.parseFloat(lon.substring(0, 3));
    if(WE.startsWith("W")) {
    med = -med;
    }
    return med;
    }

    // parsers
    class GPGGA implements SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position) {
    position.time = Float.parseFloat(tokens[1]);
    position.lat = Latitude2Decimal(tokens[2], tokens[3]);
    position.lon = Longitude2Decimal(tokens[4], tokens[5]);
    position.quality = Integer.parseInt(tokens[6]);
    position.altitude = Float.parseFloat(tokens[9]);
    return true;
    }
    }

    class GPGGL implements SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position) {
    position.lat = Latitude2Decimal(tokens[1], tokens[2]);
    position.lon = Longitude2Decimal(tokens[3], tokens[4]);
    position.time = Float.parseFloat(tokens[5]);
    return true;
    }
    }

    class GPRMC implements SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position) {
    position.time = Float.parseFloat(tokens[1]);
    position.lat = Latitude2Decimal(tokens[3], tokens[4]);
    position.lon = Longitude2Decimal(tokens[5], tokens[6]);
    position.velocity = Float.parseFloat(tokens[7]);
    position.dir = Float.parseFloat(tokens[8]);
    return true;
    }
    }

    class GPVTG implements SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position) {
    position.dir = Float.parseFloat(tokens[3]);
    return true;
    }
    }

    class GPRMZ implements SentenceParser {
    public boolean parse(String [] tokens, GPSPosition position) {
    position.altitude = Float.parseFloat(tokens[1]);
    return true;
    }
    }

    public class GPSPosition {
    public float time = 0.0f;
    public float lat = 0.0f;
    public float lon = 0.0f;
    public boolean fixed = false;
    public int quality = 0;
    public float dir = 0.0f;
    public float altitude = 0.0f;
    public float velocity = 0.0f;

    public void updatefix() {
    fixed = quality > 0;
    }

    public String toString() {
    return String.format("POSITION: lat: %f, lon: %f, time: %f, Q: %d, dir: %f, alt: %f, vel: %f", lat, lon, time, quality, dir, altitude, velocity);
    }
    }

    GPSPosition position = new GPSPosition();

    private static final Map<String, SentenceParser> sentenceParsers = new HashMap<String, SentenceParser>();

    public NMEA() {
    sentenceParsers.put("GPGGA", new GPGGA());
    sentenceParsers.put("GPGGL", new GPGGL());
    sentenceParsers.put("GPRMC", new GPRMC());
    sentenceParsers.put("GPRMZ", new GPRMZ());
    //only really good GPS devices have this sentence but ...
    sentenceParsers.put("GPVTG", new GPVTG());
    }

    public GPSPosition parse(String line) {

    if(line.startsWith("$")) {
    String nmea = line.substring(1);
    String[] tokens = nmea.split(",");
    String type = tokens[0];
    //TODO check crc
    if(sentenceParsers.containsKey(type)) {
    sentenceParsers.get(type).parse(tokens, position);
    }
    position.updatefix();
    }

    return position;
    }
    }