@@ -8,19 +8,13 @@ import android.os.Bundle
88import android.os.IBinder
99import android.view.View
1010import com.evsuite.chargepilot.databinding.ActivityBatteryHealthBinding
11- import com.evsuite.hardware.telemetry.BatteryExposure
1211import com.evsuite.hardware.telemetry.BatteryExposureReport
13- import com.evsuite.hardware.telemetry.BatteryLedgerStore
14- import com.evsuite.hardware.telemetry.CalibrationDrift
1512import com.evsuite.hardware.telemetry.CalibrationDriftReport
1613import com.evsuite.hardware.telemetry.CalibrationVerdict
17- import com.evsuite.hardware.telemetry.ChargeEnergyAnalyzer
1814import com.evsuite.hardware.telemetry.ChargeEnergyReport
1915import com.evsuite.hardware.telemetry.SohEnergySource
2016import com.evsuite.hardware.telemetry.StateOfHealthEstimate
21- import com.evsuite.hardware.telemetry.StateOfHealthEstimator
2217import com.evsuite.hardware.telemetry.StateOfHealthResult
23- import java.io.File
2418import java.util.Locale
2519import java.util.concurrent.Executors
2620import kotlin.math.abs
@@ -49,6 +43,7 @@ class BatteryHealthActivity : PrimaryNavigationActivity() {
4943 }
5044
5145 private var recorder: TripRecordingService ? = null
46+ private var loadedBatteryRevision = - 1
5247 private var bound = false
5348 private var speedKmh: Float? = null
5449 private var speedObservedAtMs: Long? = null
@@ -66,9 +61,20 @@ class BatteryHealthActivity : PrimaryNavigationActivity() {
6661 override fun onServiceConnected (name : ComponentName ? , service : IBinder ? ) {
6762 val value = (service as ? TripRecordingService .LocalBinder )?.service ? : return
6863 recorder = value
64+ if (ChargeLearningDefaults .AUTO_REFRESH ) {
65+ loadedBatteryRevision = value.batteryRevision
66+ load()
67+ }
6968 value.setListener(this @BatteryHealthActivity) { snapshot ->
7069 speedKmh = snapshot.speedKmh
7170 speedObservedAtMs = snapshot.timestampMs
71+ if (
72+ ChargeLearningDefaults .AUTO_REFRESH &&
73+ value.batteryRevision != loadedBatteryRevision
74+ ) {
75+ loadedBatteryRevision = value.batteryRevision
76+ load()
77+ }
7278 renderApply()
7379 }
7480 speedKmh = value.latest?.speedKmh
@@ -120,24 +126,18 @@ class BatteryHealthActivity : PrimaryNavigationActivity() {
120126
121127 private fun load () {
122128 disk.execute {
123- val entries = BatteryLedgerStore (File (filesDir, BatteryLedgerStore .FILE_NAME )).read()
124129 val settings = VehicleSettings .read(this )
125- val estimate = StateOfHealthEstimator ()
126- .estimate(entries, settings.usableCapacityKwhWhenNew)
127- val ready = (estimate as ? StateOfHealthResult .Ready )?.estimate
128- val report = CalibrationDrift ().analyse(entries, System .currentTimeMillis(), ready)
129- val exposureReport = BatteryExposure ().analyse(entries)
130- // The sessions come from the exposure report rather than being cut again here, so
131- // the two blocks on this screen can never disagree about what counts as a charge.
132- val chargeReport = ChargeEnergyAnalyzer ()
133- .analyse(entries, exposureReport?.sessions.orEmpty())
130+ val learned = LocalBatteryLearning .refresh(
131+ filesDir,
132+ settings.usableCapacityKwhWhenNew,
133+ )
134134 runOnUiThread {
135135 if (isFinishing || isDestroyed) return @runOnUiThread
136136 declared = settings
137- health = estimate
138- drift = report
139- exposure = exposureReport
140- charge = chargeReport
137+ health = learned.health
138+ drift = learned.drift
139+ exposure = learned.exposure
140+ charge = learned.charge
141141 render()
142142 }
143143 }
0 commit comments