Android Open Source - Andriod-PC-GPSApplication G P S Data Handler






From Project

Back to project page Andriod-PC-GPSApplication.

License

The source code is released under:

MIT License

If you think the Android project Andriod-PC-GPSApplication 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

/**
 * /*  w ww  .j  av  a  2 s.com*/
 */
package com.dev.appxpress.gps.android_pc.data.handler;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;

import com.dev.appxpress.gps.android_pc.domain.GPSWayPoint;
import com.dev.appxpress.gps.android_pc.domain.GPSWayPoint.GPSWayPoints;
import com.dev.appxpress.gps.android_pc.util.DateTimeUtil;
import com.dev.appxpress.gps.android_pc.util.PrintManager;

/**
 * GPS Data Handler.
 * 
 * @author NThusitha
 * @date 21-August-2014
 * 
 */
public class GPSDataHandler {

  private static final Logger log = Logger.getLogger(GPSDataHandler.class
      .getName());
  
  // last time the system read data from the device.
  private static long LAST_UPDATED_AT = 0;
  private static int DATA_COLUMN_COUNT = 7;
  private static final int CACHE_DURATION_MS = 1000 * 60;

  private GPSWayPoints wayPoints = new GPSWayPoints();

  private static final SimpleDateFormat SIMPLE_DATE_FORMATTER = new SimpleDateFormat(
      "yyyy-MM-dd'T'HH:mm:ss'Z'");

  private static DescriptiveStatistics latStats = new DescriptiveStatistics();
  private static DescriptiveStatistics lonStats = new DescriptiveStatistics();
  private static DescriptiveStatistics elevationStats = new DescriptiveStatistics();
  private static DescriptiveStatistics accuracyStats = new DescriptiveStatistics();
  private static DescriptiveStatistics bearingStats = new DescriptiveStatistics();
  private static DescriptiveStatistics speedStats = new DescriptiveStatistics();

  /**
   * @param data
   */
  public void readData(String data) {

    if (!data.isEmpty()) {

      String[] dataElements = data.split(",");

      try {
        if (dataElements.length == DATA_COLUMN_COUNT
            && !dataElements[0].startsWith("time")) {

          Date time = SIMPLE_DATE_FORMATTER.parse(dataElements[0]);
          double lat = Double.parseDouble(dataElements[1]);
          double lon = Double.parseDouble(dataElements[2]);
          double elevation = Double.parseDouble(dataElements[3]);
          double accuracy = Double.parseDouble(dataElements[4]);
          double bearing = Double.parseDouble(dataElements[5]);
          double speed = Double.parseDouble(dataElements[6]);

          GPSWayPoint point = new GPSWayPoint(time, lat, lon,
              elevation, accuracy, bearing, speed);
          // wayPoints.addWayPoints(point);
          addGPSWayPoint(point);

        }

      } catch (ParseException e) {
        e.printStackTrace();
      }

    }

  }
  
  
  
  
  

  /**
   * 
   * Need to do this time agnostic way.
   * 
   * @param wayPoint
   */
  private synchronized void addGPSWayPoint(final GPSWayPoint wayPoint) {

    if (wayPoint != null) {

      if (LAST_UPDATED_AT == 0) {

        log.log(Level.FINER, "initializing LAST_UPDATED_AT to {0}",
            wayPoint.getTime().getTime());
        LAST_UPDATED_AT = wayPoint.getTime().getTime();
        // process data in buffer for each overflow timing
      } else if ((wayPoint.getTime().getTime() - LAST_UPDATED_AT) >= CACHE_DURATION_MS) {
        
        log.log(Level.FINER, "processing waypoints, current waypoint size {0}", wayPoints.getWaypoints().size());
        filter(wayPoint);
        process(wayPoints);
        // flush data after each process
        wayPoints.getWaypoints().clear();
        LAST_UPDATED_AT = wayPoint.getTime().getTime();
        return;
      }
      filter(wayPoint);
    }

  }

  /**
   * @param point
   */
  private void filter(final GPSWayPoint point) {

    if (point != null && point.getTime() != null) {

      if (point.getTime().getTime() >= LAST_UPDATED_AT) {
        log.log(Level.FINER, "inside filter, adding point to waypoints");
        wayPoints.addWayPoints(point);
      }
    }

  }

  /**
   * 
   * Process incoming gps data sentence
   * 
   * @param wayPoints
   */
  private static void process(GPSWayPoints wayPoints) {

    if (wayPoints != null) {
      if (!wayPoints.getWaypoints().isEmpty()) {

        double meanLat = 0;
        double meanLon = 0;
        double meanElevation = 0;
        double meanAccuracy = 0;
        double meanBearing = 0;
        double meanSpeed = 0;

        resetStats();

        for (GPSWayPoint point : wayPoints.getWaypoints()) {
          latStats.addValue(point.getLat());
          lonStats.addValue(point.getLon());
          elevationStats.addValue(point.getElevation());
          accuracyStats.addValue(point.getAccuracy());
          bearingStats.addValue(point.getBearing());
          speedStats.addValue(point.getSpeed());
        }

        meanLat = latStats.getMean();
        meanLon = lonStats.getMean();
        meanElevation = elevationStats.getMean();
        meanAccuracy = accuracyStats.getMean();
        meanBearing = bearingStats.getMean();
        meanSpeed = speedStats.getMean();

        print(meanLat, meanLon, meanElevation, meanAccuracy,
            meanBearing, meanSpeed);

      }
    }

  }

  /**
   * Reset all stats
   */
  private static void resetStats() {
    latStats.clear();
    lonStats.clear();
    elevationStats.clear();
    accuracyStats.clear();
    bearingStats.clear();
    speedStats.clear();
  }

  /**
   * Print with formatting on
   * 
   * @param args
   */
  private static void print(double... args) {

    PrintManager.printHeader();
    if (args.length == 6) {
      Object[] printables = new Object[] { DateTimeUtil.nowUTCString(),
          args[0], args[1], args[2], args[3], args[4], args[5] };

      System.out
          .printf("%1$s %2$15.3f %3$15.3f %4$15.3f %5$20.3f %6$15.3f %7$15.3f\n",
              printables);

    }

  }

}




Java Source Code List

com.dev.appxpress.gps.android_pc.AndroidDataReader.java
com.dev.appxpress.gps.android_pc.AndroidPCClientLauncher.java
com.dev.appxpress.gps.android_pc.data.handler.GPSDataHandler.java
com.dev.appxpress.gps.android_pc.domain.GPSAware.java
com.dev.appxpress.gps.android_pc.domain.GPSWayPoint.java
com.dev.appxpress.gps.android_pc.runtime.exec.PortForwarder.java
com.dev.appxpress.gps.android_pc.util.DateTimeUtil.java
com.dev.appxpress.gps.android_pc.util.PrintManager.java
com.example.appxgpsmodule.Globals.java
com.example.appxgpsmodule.Loaded.java
com.example.appxgpsmodule.Start.java
com.example.appxgpsmodule.storage.ExternalStorageReader.java