diff --git a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/DummyEVController.java b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/DummyEVController.java index 96fd218..956e7c7 100644 --- a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/DummyEVController.java +++ b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/DummyEVController.java @@ -54,10 +54,12 @@ public class DummyEVController implements IACEVController, IDCEVController { private Logger logger = LogManager.getLogger(this.getClass().getSimpleName()); private V2GCommunicationSessionEVCC commSessionContext; private CPStates cpState; + private int chargingLoopCounter; public DummyEVController(V2GCommunicationSessionEVCC commSessionContext) { setCommSessionContext(commSessionContext); setCPState(CPStates.STATE_B); // should be signaled before ISO/IEC 15118 stack initializes + setChargingLoopCounter((short) 0); } @Override @@ -299,4 +301,22 @@ public class DummyEVController implements IACEVController, IDCEVController { short multiplier = (short) (evseMaxCurrent.getMultiplier() & 0xFF); getLogger().info("Adjusting max current to " + evseMaxCurrent.getValue() * Math.pow(10, multiplier) + " A"); } + + @Override + public boolean isChargingLoopActive() { + // Keep charging until 10 charging loops are finished + if (getChargingLoopCounter() < 10) { + setChargingLoopCounter(getChargingLoopCounter() + 1); + return true; + } else + return false; + } + + public int getChargingLoopCounter() { + return chargingLoopCounter; + } + + public void setChargingLoopCounter(int chargingLoopCounter) { + this.chargingLoopCounter = chargingLoopCounter; + } } diff --git a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/IEVController.java b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/IEVController.java index 6b611dc..c69a59d 100644 --- a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/IEVController.java +++ b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/evController/IEVController.java @@ -76,4 +76,12 @@ public interface IEVController { * @return The respective CP state */ public CPStates getCPState(); + + + /** + * Provides information on whether the charging loop should be active to charge the EV's battery, or not + * + * @return True, if charging process should be continued, false otherwise + */ + public boolean isChargingLoopActive(); } diff --git a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForChargingStatusRes.java b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForChargingStatusRes.java index fe1b578..2c6810a 100644 --- a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForChargingStatusRes.java +++ b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForChargingStatusRes.java @@ -31,6 +31,7 @@ import org.v2gclarity.risev2g.shared.messageHandling.ReactionToIncomingMessage; import org.v2gclarity.risev2g.shared.messageHandling.TerminateSession; import org.v2gclarity.risev2g.shared.utils.SecurityUtils; import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.ChargeProgressType; +import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.ChargingStatusReqType; import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.ChargingStatusResType; import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.MeteringReceiptReqType; import org.v2gclarity.risev2g.shared.v2gMessages.msgDef.V2GMessage; @@ -102,11 +103,15 @@ public class WaitForChargingStatusRes extends ClientState { default: // TODO regard [V2G2-305] (new SalesTariff if EAmount not yet met and tariff finished) - // TODO check somehow if charging is stopped by EV, otherwise send new ChargingStatusReq - getCommSessionContext().setStopChargingRequested(true); - return getSendMessage(getPowerDeliveryReq(ChargeProgressType.STOP), - V2GMessages.POWER_DELIVERY_RES, - " (ChargeProgress = STOP_CHARGING)"); + if (getCommSessionContext().getEvController().isChargingLoopActive()) { + ChargingStatusReqType chargingStatusReq = new ChargingStatusReqType(); + return getSendMessage(chargingStatusReq, V2GMessages.CHARGING_STATUS_RES); + } else { + getCommSessionContext().setStopChargingRequested(true); + return getSendMessage(getPowerDeliveryReq(ChargeProgressType.STOP), + V2GMessages.POWER_DELIVERY_RES, + " (ChargeProgress = STOP_CHARGING)"); + } } } else { return new TerminateSession("Incoming message raised an error"); diff --git a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForCurrentDemandRes.java b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForCurrentDemandRes.java index 21afaaa..765e306 100644 --- a/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForCurrentDemandRes.java +++ b/RISE-V2G-EVCC/src/main/java/org/v2gclarity/risev2g/evcc/states/WaitForCurrentDemandRes.java @@ -96,12 +96,14 @@ public class WaitForCurrentDemandRes extends ClientState { default: // TODO regard [V2G2-305] (new SalesTariff if EAmount not yet met and tariff finished) - // TODO check somehow if charging is stopped by EV, otherwise send new CurrentDemandReq - - getCommSessionContext().setStopChargingRequested(true); - return getSendMessage(getPowerDeliveryReq(ChargeProgressType.STOP), - V2GMessages.POWER_DELIVERY_RES, - " (ChargeProgress = STOP_CHARGING)"); + if (getCommSessionContext().getEvController().isChargingLoopActive()) { + return getSendMessage(getCurrentDemandReq(), V2GMessages.CURRENT_DEMAND_RES); + } else { + getCommSessionContext().setStopChargingRequested(true); + return getSendMessage(getPowerDeliveryReq(ChargeProgressType.STOP), + V2GMessages.POWER_DELIVERY_RES, + " (ChargeProgress = STOP_CHARGING)"); + } } } else { return new TerminateSession("Incoming message raised an error");