package com.geeksville.location;
import com.geeksville.info.FlightSummary;
public class SummaryWriter implements PositionWriter {
private boolean firstPosition = true;
private long endTime;
private float maxAltitudeAfterLaunch;
private float maxGroundSpeed;
private float totalGroundSpeed;
private double totalGroundDistance;
private float totalVerticalDistance;
private double maxDistanceFromLaunch;
private int positionCount;
private double firstLatitude;
private double firstLongitude;
private double lastLatitude;
private double lastLongitude;
private float lastAltitude;
private FlightSummary summary;
// accel is [0] - xaccel, [1] - yaccel, [2] - zaccel
// test on device
public SummaryWriter(FlightSummary summary) {
this.summary = summary;
}
@Override
public void emitProlog() {
}
@Override
public void emitPosition(long time, double latitude, double longitude,
float altitude, int bearing, float groundSpeed, float[] accel, float vspd) {
if (firstPosition) {
summary.setStartTime(time);
summary.setStartAltitude(altitude);
firstLatitude = latitude;
firstLongitude = longitude;
lastLatitude = latitude;
lastLongitude = longitude;
lastAltitude = altitude;
firstPosition = false;
} else {
endTime = time;
if (altitude > maxAltitudeAfterLaunch)
maxAltitudeAfterLaunch = altitude;
totalGroundDistance += LocationUtils.LatLongToMeter(lastLatitude,
lastLongitude, latitude, longitude);
lastLatitude = latitude;
lastLongitude = longitude;
double currentDistanceFromLaunch = LocationUtils.LatLongToMeter(
firstLatitude, firstLongitude, latitude, longitude);
if (currentDistanceFromLaunch > maxDistanceFromLaunch)
maxDistanceFromLaunch = currentDistanceFromLaunch;
totalVerticalDistance += Math.abs(lastAltitude - altitude);
lastAltitude = altitude;
}
totalGroundSpeed += groundSpeed;
if (groundSpeed > maxGroundSpeed)
maxGroundSpeed = groundSpeed;
positionCount++;
}
@Override
public void emitEpilog() {
summary.setEndTime(endTime);
summary.setMaxAltitudeAfterLaunch(maxAltitudeAfterLaunch);
summary.setMaxGroundSpeed(maxGroundSpeed);
summary.setAverageGroundSpeed(totalGroundSpeed / (float) positionCount);
summary.setTotalGroundDistance(totalGroundDistance);
summary.setTotalVerticalDistance(totalVerticalDistance);
summary.setMaxDistanceFromLaunch(maxDistanceFromLaunch);
}
}