/* * StateProducer.java - Copyright(c) 2014 Joe Pasqua * Provided under the MIT License. See the LICENSE file for details. * Created: Aug 8, 2014 */ package org.noroomattheinn.visibletesla.data; import java.util.Map; import org.noroomattheinn.tesla.BaseState; import org.noroomattheinn.tesla.Vehicle; import org.noroomattheinn.utils.Utils; import org.noroomattheinn.utils.Executor; import org.noroomattheinn.visibletesla.vehicle.VTVehicle; /** * StateProducer: Produce state updates on demand. * * @author Joe Pasqua <joe at NoRoomAtTheInn dot org> */ class StateProducer extends Executor<StateProducer.Request> { /*------------------------------------------------------------------------------ * * Internal State * *----------------------------------------------------------------------------*/ private Map<Vehicle.StateType,Long> lastProduced = Utils.newHashMap( Vehicle.StateType.Charge, 0L, Vehicle.StateType.Drive, 0L, Vehicle.StateType.GUI, 0L, Vehicle.StateType.HVAC, 0L, Vehicle.StateType.Vehicle, 0L); private final VTVehicle vtVehicle; /*============================================================================== * ------- ------- * ------- Public Interface To This Class ------- * ------- ------- *============================================================================*/ StateProducer(VTVehicle v, FeedbackListener feedbackListener) { super("StateProducer", feedbackListener); this.vtVehicle = v; } void produce(Vehicle.StateType whichState, Object progressContext) { super.produce(new Request(whichState, progressContext)); } /*------------------------------------------------------------------------------ * * Internal Methods - Some declared protected since they implement interfaces * *----------------------------------------------------------------------------*/ @Override protected boolean requestSuperseded(Request r) { return r.timeOfRequest < lastProduced.get(r.stateType); } @Override protected boolean execRequest(Request r) { final BaseState state = vtVehicle.getVehicle().query(r.stateType); if (state.valid) { lastProduced.put(r.stateType, System.currentTimeMillis()); vtVehicle.noteUpdatedState(state); return true; } return false; } static class Request extends Executor.Request { Vehicle.StateType stateType; Request(Vehicle.StateType stateType, Object progressContext) { super(progressContext); this.stateType = stateType; } @Override protected String getRequestName() { return stateType.name(); } } }