/*
* ChargeStore.java - Copyright(c) 2014 Joe Pasqua
* Provided under the MIT License. See the LICENSE file for details.
* Created: Oct 23, 2014
*/
package org.noroomattheinn.visibletesla.data;
import com.google.common.collect.Range;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Date;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import jxl.write.WritableSheet;
import jxl.write.WriteException;
import org.apache.commons.lang3.StringUtils;
import org.noroomattheinn.tesla.Options;
import org.noroomattheinn.utils.TrackedObject;
import org.noroomattheinn.visibletesla.vehicle.VTVehicle;
/**
* ChargeStore: Manage persistent storage for Charge Cycle information.
*
* @author Joe Pasqua <joe at NoRoomAtTheInn dot org>
*/
class ChargeStore extends CycleStore<ChargeCycle> {
/*------------------------------------------------------------------------------
*
* Internal State
*
*----------------------------------------------------------------------------*/
private final ChargeCycleExporter exporter;
private final TrackedObject<ChargeCycle> lastChargeCycle;
/*==============================================================================
* ------- -------
* ------- Public Interface To This Class -------
* ------- -------
*============================================================================*/
ChargeStore(
File container, VTVehicle v, TrackedObject<ChargeCycle> lastCycle,
BooleanProperty submitCharge, BooleanProperty includeLoc,
DoubleProperty ditherAmt)
throws FileNotFoundException {
super("charge", ChargeCycle.class, container, v);
this.lastChargeCycle = lastCycle;
this.exporter = new ChargeCycleExporter(
submitCharge, includeLoc, ditherAmt,
v.getVehicle().getOptions().batteryType(),
v.getVehicle().getUUID());
lastChargeCycle.addTracker(new Runnable() {
@Override public void run() {
cycleWriter.println(lastChargeCycle.get().toJSONString());
exporter.submitData(lastChargeCycle.get());
}
});
}
boolean export(File toFile, Range<Long> exportPeriod) {
return exporter.export(this, toFile, exportPeriod);
}
}
/*------------------------------------------------------------------------------
*
* The CycleExporter for Charge Cycles
*
*----------------------------------------------------------------------------*/
class ChargeCycleExporter extends CycleExporter<ChargeCycle> {
private static final String[] labels = {
"Start Date/Time", "Ending Date/Time", "Supercharger?", "Phases", "Start Range",
"End Range", "Start SOC", "End SOC", "(Latitude, ", " Longitude)", "Odometer",
"Peak V", "Avg V", "Peak I", "Avg I", "Energy"};
private final Options.BatteryType batteryType;
private final String uuid;
ChargeCycleExporter(
BooleanProperty submitCharge,
BooleanProperty includeLoc,
DoubleProperty ditherAmt,
Options.BatteryType batteryType, String uuid) {
super("Charge", labels, submitCharge, includeLoc, ditherAmt);
this.batteryType = batteryType;
this.uuid = uuid;
}
@Override protected void emitRow(
WritableSheet sheet, int row, ChargeCycle cycle, StandardFormats sf)
throws WriteException {
int column = 0;
sheet.addCell(new jxl.write.DateTime(column++, row, new Date(cycle.startTime), sf.dateFormat));
sheet.addCell(new jxl.write.DateTime(column++, row, new Date(cycle.endTime), sf.dateFormat));
sheet.addCell(new jxl.write.Boolean(column++, row, cycle.superCharger, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.phases, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.startRange, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.endRange, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.startSOC, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.endSOC, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.lat, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.lng, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.odometer, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.peakVoltage, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.avgVoltage, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.peakCurrent, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.avgCurrent, sf.standardFormat));
sheet.addCell(new jxl.write.Number(column++, row, cycle.energyAdded, sf.standardFormat));
}
@Override protected String filterSubmissionData(String jsonRep) {
// Strip the closing curly to prepare to add more fields
jsonRep = StringUtils.substringBefore(jsonRep, "}");
// Concatenate the extra fields and put back the closing curly
return String.format("%s, \"battery\": \"%s\", \"uuid\": \"%s\" }",
jsonRep, batteryType, uuid);
}
@Override protected void ditherLocation(ChargeCycle cycle) {
if (cycle.superCharger && includeLoc.get()) return;
super.ditherLocation(cycle);
}
}