From 1131586cec1f60446918cde2ff9b7073abb74635 Mon Sep 17 00:00:00 2001 From: Ate Hempenius Date: Tue, 23 Jun 2026 16:54:21 +0200 Subject: [PATCH] getTripsActiveBetween_h triptracker + visibility changes for charging EMS in ev and chargingSession --- .../Classes/Class.J_ActivityTrackerTrips.java | 30 +++++++++++++++++++ _alp/Classes/Class.J_EAChargingSession.java | 2 +- _alp/Classes/Class.J_EAEV.java | 6 ++-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/_alp/Classes/Class.J_ActivityTrackerTrips.java b/_alp/Classes/Class.J_ActivityTrackerTrips.java index d9f205a8..7cd16cb6 100644 --- a/_alp/Classes/Class.J_ActivityTrackerTrips.java +++ b/_alp/Classes/Class.J_ActivityTrackerTrips.java @@ -239,6 +239,36 @@ public double getAnnualDistance_km() { return currentAnnualDistance_km; } + public List getTripsActiveBetween_h(double t1_h, double t2_h) { + List matchingTrips = new ArrayList<>(); + if (tripRecords.isEmpty() || t2_h <= t1_h) { + return matchingTrips; + } + + // Start one week earlier so a trip that began before t1_h (and is still running) is + // reachable by the unroll. A single trip is assumed shorter than a week. + double weekStartOffset_h = t1_h - getTimeSinceWeekStart_h(t1_h); + + for (double weekOffset_h = weekStartOffset_h - 168.0; weekOffset_h < t2_h; weekOffset_h += 168.0) { + for (TripRecord tripRecord : tripRecords) { + double absoluteStartTime_h = tripRecord.startTime_h() + weekOffset_h; + + double duration_h = tripRecord.endTime_h() - tripRecord.startTime_h(); + if (duration_h < 0) duration_h += 168.0; // trip straddles the week wrap + double absoluteEndTime_h = absoluteStartTime_h + duration_h; + + // Include if it starts inside the window, OR it is in progress at t1_h. + boolean startsInWindow = absoluteStartTime_h >= t1_h && absoluteStartTime_h < t2_h; + boolean inProgressAtT1 = absoluteStartTime_h < t1_h && absoluteEndTime_h > t1_h; + + if (startsInWindow || inProgressAtT1) { + matchingTrips.add(tripRecord); + } + } + } + return matchingTrips; + } + public static record TripRecord(double startTime_h, double endTime_h, double distance_km) { } diff --git a/_alp/Classes/Class.J_EAChargingSession.java b/_alp/Classes/Class.J_EAChargingSession.java index cfe65210..0a68a6b9 100644 --- a/_alp/Classes/Class.J_EAChargingSession.java +++ b/_alp/Classes/Class.J_EAChargingSession.java @@ -194,7 +194,7 @@ public void enableV2GCapabilityOverride(boolean enableV2GCapabilityOverride, Dou setV2GActive(getV2GActive()); } - protected void setV2GActive(boolean activateV2G) { // Should only be called by the chargingManagement class or J_EAChargingSession during initialization itself. (No such thing as friend class in java, so only can put on protected). + public void setV2GActive(boolean activateV2G) { // Should only be called by the chargingManagement class or J_EAChargingSession during initialization itself. (No such thing as friend class in java). this.V2GActive = activateV2G; if((!this.overrideV2GCapability || (this.overrideV2GCapability && this.V2GCapabilityProbablityOverride > 0)) && activateV2G) { this.assetFlowCategory = OL_AssetFlowCategories.V2GPower_kW; diff --git a/_alp/Classes/Class.J_EAEV.java b/_alp/Classes/Class.J_EAEV.java index 85df0723..491137c6 100644 --- a/_alp/Classes/Class.J_EAEV.java +++ b/_alp/Classes/Class.J_EAEV.java @@ -146,8 +146,8 @@ public boolean endTrip(double tripDist_km) { energyUsed_kWh += tripDist_km * vehicleScaling * energyConsumption_kWhpkm; energyUse_kW += tripDist_km * vehicleScaling * energyConsumption_kWhpkm / this.timeParameters.getTimeStep_h(); - if (stateOfCharge_fr < 0) { - traceln("EV of type: " + this.energyAssetType + " arrived home with negative SOC: " + roundToDecimal(100 * stateOfCharge_fr,2) + "%"); + if (DoubleCompare.lessThanZero(stateOfCharge_fr)) { + traceln("EV of type: " + this.energyAssetType + " arrived home with negative SOC: " + (100 * stateOfCharge_fr) + "%"); } this.available = true; return true; @@ -254,7 +254,7 @@ public boolean getV2GActive() { return this.V2GActive; } - protected void setV2GActive(boolean activateV2G) { // Should only be called by the chargingManagement class or J_EAEV during initialization itself. (No such thing as friend class in java, so only can put on protected). + public void setV2GActive(boolean activateV2G) { // Should only be called by the chargingManagement class or J_EAEV during initialization itself. (No such thing as friend class in java). this.V2GActive = activateV2G; if(this.V2GCapable && activateV2G) { this.assetFlowCategory = OL_AssetFlowCategories.V2GPower_kW;