/* * WayPoint.java - Copyright(c) 2013, 2014 Joe Pasqua * Provided under the MIT License. See the LICENSE file for details. * Created: Nov 27, 2013 */ package org.noroomattheinn.visibletesla.data; import java.util.Date; import org.noroomattheinn.utils.GeoUtils; import org.noroomattheinn.utils.Utils; /** * WayPoint: Describes a point on a trip * * @author Joe Pasqua <joe at NoRoomAtTheInn dot org> */ public class WayPoint implements GeoUtils.LocationSource { /*------------------------------------------------------------------------------ * * Internal State * *----------------------------------------------------------------------------*/ private final long timestamp; private final double odometer; private final double speed; private final double heading; private final double power; private final double soc; private final double lat; private final double lng; private double elevation; /*============================================================================== * ------- ------- * ------- Public Interface To This Class ------- * ------- ------- *============================================================================*/ public WayPoint( long timestamp, double odometer, double speed, double heading, double lat, double lng, double elevation, double power, double soc) { this.timestamp = timestamp; this.odometer = odometer; this.speed = speed; this.heading = heading; this.lat = lat; this.lng = lng; this.elevation = elevation; this.power = power; this.soc = soc; } public String asJSON() { return asJSON(true); } public String asJSON(boolean useMiles) { double adjustedSpeed, adjustedOdo, adjustedElevation; if (useMiles) { adjustedSpeed = speed; adjustedOdo = odometer; adjustedElevation = Utils.round(Utils.metersToFeet(elevation), 0); } else { adjustedSpeed = Utils.round(Utils.milesToKm(speed), 1); adjustedOdo = Utils.round(Utils.milesToKm(odometer),1); adjustedElevation = Utils.round(elevation, 1); } StringBuilder sb = new StringBuilder(); sb.append("{\n"); sb.append(" timestamp: \""); sb.append(String.format("%1$tm/%1$td/%1$ty %1$tH:%1$tM:%1$tS", new Date(timestamp))); sb.append("\",\n"); sb.append(" lat: ").append(getLat()).append(",\n"); sb.append(" lng: ").append(getLng()).append(",\n"); sb.append(" speed: ").append(adjustedSpeed).append(",\n"); sb.append(" heading: ").append(getHeading()).append(",\n"); sb.append(" power: ").append(getPower()).append(",\n"); sb.append(" odometer: ").append(adjustedOdo).append(",\n"); sb.append(" soc: ").append(soc).append(",\n"); sb.append(" elevation: ").append(adjustedElevation).append("\n"); sb.append("}\n"); return sb.toString(); } @Override public String toString() { return asJSON(); } public long getTime() { return timestamp; } public double getElevation() { return elevation; } public double getOdo() { return odometer; } public double getHeading() { return heading; } public double getPower() { return power; } public double getSOC() { return soc; } public double getSpeed() { return speed; } // The following getters are also part of the GeoUtils.LocationSource interface @Override public double getLat() { return lat; } @Override public double getLng() { return lng; } // Elevation is the only field that can be set after the WayPoint is created // This is done so that it can be added lazily only when needed public void setElevation(double e) { elevation = e; } }