Android Open Source - BlueMouse N M E A Helper






From Project

Back to project page BlueMouse.

License

The source code is released under:

GNU General Public License

If you think the Android project BlueMouse listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.oldsch00l.BlueMouse;
//from  w  w  w  .j  a va  2 s  .  c  om
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import android.location.Location;
import android.os.Bundle;

public class NMEAHelper {
  /**
   * Creates a NMEA checksum for a sentence.
   * 
   * The checksum is calculated by XOR every char value, between '$' and
   * '*'(end), with the current sum.
   * 
   * @param sbString
   *            String to calculate the checksum.
   * @return The checksum.
   */
  public static int getNMEAChecksum(final StringBuilder sbString) {
    int checksum = 0;

    for (int i = 0; i < sbString.length(); i++) {
      if (sbString.charAt(i) != '*' && sbString.charAt(i) != '$')
        checksum ^= sbString.charAt(i);
    }
    return checksum;
  }

  public static DecimalFormatSymbols decSymFormat = new DecimalFormatSymbols();
  static {
    decSymFormat.setDecimalSeparator('.');
  }
  public static DecimalFormat locFormat = new DecimalFormat("0000.######", decSymFormat);
  public static DecimalFormat shortFormat = new DecimalFormat("##.#", decSymFormat);

  public static SimpleDateFormat HHMMSS = new SimpleDateFormat("HHmmss.000",
      Locale.UK);

  public static SimpleDateFormat DDMMYY = new SimpleDateFormat("ddMMyy",
      Locale.UK);
  static {
    HHMMSS.setTimeZone(TimeZone.getTimeZone("GMT"));
    DDMMYY.setTimeZone(TimeZone.getTimeZone("GMT"));
  }

  /**
   * Creates a valid NMEA GGA Global Positioning System Fix Data.
   * 
   * Example:
   * $GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45
   * 
   * @param loc
   *            object to transfer into a GGA sentence.
   * @return The GGA sentence as String.
   */
  public static String getNMEAGGA(final Location loc) {
    StringBuilder sbGPGGA = new StringBuilder();

    char cNorthSouth = loc.getLatitude() >= 0 ? 'N' : 'S';
    char cEastWest = loc.getLongitude() >= 0 ? 'E' : 'W';

    Date curDate = new Date();
    sbGPGGA.append("$GPGGA,");
    sbGPGGA.append(HHMMSS.format(curDate));
    sbGPGGA.append(',');
    sbGPGGA.append(getCorrectPosition(loc.getLatitude()));
    sbGPGGA.append(",");
    sbGPGGA.append(cNorthSouth);
    sbGPGGA.append(',');
    sbGPGGA.append(getCorrectPosition(loc.getLongitude()));
    sbGPGGA.append(',');
    sbGPGGA.append(cEastWest);
    sbGPGGA.append(',');
    sbGPGGA.append('1'); // quality
    sbGPGGA.append(',');
    Bundle bundle = loc.getExtras();
    int satellites = 7;
    if( bundle != null )
      satellites = bundle.getInt("satellites", 7);
    sbGPGGA.append(satellites);
    sbGPGGA.append(',');
    sbGPGGA.append(',');
    if (loc.hasAltitude())
      sbGPGGA.append(shortFormat.format(loc.getAltitude()));
    sbGPGGA.append(',');
    sbGPGGA.append('M');
    sbGPGGA.append(',');
    sbGPGGA.append(',');
    sbGPGGA.append('M');
    sbGPGGA.append(',');
    sbGPGGA.append("*");
    int checksum = getNMEAChecksum(sbGPGGA);
    sbGPGGA.append(java.lang.Integer.toHexString(checksum));
    sbGPGGA.append("\r\n");

    return sbGPGGA.toString();
  }

  /**
   * Returns the correct NMEA position string.
   * 
   * Android location object returns the data in the format that is not
   * expected by the NMEA data set. We have to multiple the minutes and
   * seconds by 60.
   * 
   * @param degree
   *            value from the Location.getLatitude() or
   *            Location.getLongitude()
   * @return The correct formated string for a NMEA data set.
   */
  public static String getCorrectPosition(double degree) {
    double val = degree - (int) degree;
    val *= 60;

    val = (int) degree * 100 + val;
    return locFormat.format(Math.abs(val));
  }

  /**
   * Creates a valid NMEA RMC Recommended Minimum Sentence C.
   * 
   * Example:
   * $GPRMC,053117.000,V,4812.7084,N,01619.3522,E,0.14,237.29,070311,,,N*76
   * 
   * @param loc
   *            object to transfer into a RMC sentence.
   * @return The RMC sentence as String.
   */
  public static String getNMEARMC(final Location loc) {
    // $GPRMC,053117.000,V,4812.7084,N,01619.3522,E,0.14,237.29,070311,,,N*76
    StringBuilder sbGPRMC = new StringBuilder();

    char cNorthSouth = loc.getLatitude() >= 0 ? 'N' : 'S';
    char cEastWest = loc.getLongitude() >= 0 ? 'E' : 'W';

    Date curDate = new Date();
    sbGPRMC.append("$GPRMC,");
    sbGPRMC.append(HHMMSS.format(curDate));
    sbGPRMC.append(",A,");
    sbGPRMC.append(getCorrectPosition(loc.getLatitude()));
    sbGPRMC.append(",");
    sbGPRMC.append(cNorthSouth);
    sbGPRMC.append(",");
    sbGPRMC.append(getCorrectPosition(loc.getLongitude()));
    sbGPRMC.append(',');
    sbGPRMC.append(cEastWest);
    sbGPRMC.append(',');
    sbGPRMC.append(shortFormat.format(loc.getSpeed() * 1.94));
    sbGPRMC.append(",");
    sbGPRMC.append(shortFormat.format(loc.getBearing()));
    sbGPRMC.append(",");
    sbGPRMC.append(DDMMYY.format(curDate));
    sbGPRMC.append(",,,");
    sbGPRMC.append("A");
    sbGPRMC.append("*");
    int checksum = getNMEAChecksum(sbGPRMC);
    sbGPRMC.append(java.lang.Integer.toHexString(checksum));
    // if(D) Log.v(TAG, sbGPRMC.toString());
    sbGPRMC.append("\r\n");

    return sbGPRMC.toString();
  }
}




Java Source Code List

com.oldsch00l.BlueMouse.BlueMouseService.java
com.oldsch00l.BlueMouse.BlueMouse.java
com.oldsch00l.BlueMouse.NMEAHelper.java
com.oldsch00l.BlueMouse.Preferences.java