Skip to content

Commit 23facbd

Browse files
committed
analyze to fix statistics for all firmwares
1 parent 1a90aaa commit 23facbd

3 files changed

Lines changed: 38 additions & 5 deletions

File tree

‎app/src/main/java/com/mg4/control/model/StatsRecords.kt‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mg4.control.model
22

33
import kotlin.math.abs
4+
import kotlin.math.floor
45
import kotlin.math.max
56
import kotlin.math.roundToInt
67

@@ -174,9 +175,19 @@ data class Trip(
174175
* Nommée « moteur » et non « traction » : la MG4 est une propulsion, et la XPower une quatre
175176
* roues motrices. Null tant qu'aucun poste n'est connu, sinon on présenterait le total comme
176177
* une mesure séparée qui n'existe pas.
178+
*
179+
* Sur un trajet à l'énergie intégrée, le seul poste connu est [auxiliaryKwh] et le calcul est
180+
* celui du camembert de l'écran d'origine : « Driving power » = total − « AC and others ». Ce
181+
* compteur tronque au kWh, le vrai poste vaut donc jusqu'à 1 kWh de plus : le reste est rendu
182+
* au kWh entier **par défaut**, seule valeur ronde qui tombe toujours dans l'intervalle
183+
* possible. À présenter comme un ordre de grandeur, au même titre que [auxiliaryKwh].
177184
*/
178185
val motorKwh: Float?
179186
get() {
187+
if (energyIntegrated) {
188+
val autres = auxiliaryKwh ?: return null
189+
return floor(energyKwh - autres).coerceAtLeast(0f)
190+
}
180191
if (climateKwh == null && accessoriesKwh == null) return null
181192
// Sur le BRUT : moteur + climatisation + accessoires − régénération = énergie nette.
182193
val reste = energyKwh - (climateKwh ?: 0f) - (accessoriesKwh ?: 0f)

‎app/src/main/java/com/mg4/control/ui/StatsFragment.kt‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,11 @@ class StatsFragment : Fragment() {
321321
if (trip.energyIntegrated)
322322
getString(R.string.stats_detail_origin) to getString(R.string.stats_detail_origin_integrated)
323323
else null,
324-
// L'énergie du moteur n'est pas publiée : c'est le total moins les postes annexes.
325-
trip.motorKwh?.let { getString(R.string.stats_detail_motor) to kwh(it) },
324+
// L'énergie du moteur n'est pas publiée : c'est le total moins les postes annexes. Sur un
325+
// trajet calculé, le poste annexe est au kWh entier : le moteur ne peut pas être plus fin.
326+
trip.motorKwh?.let {
327+
getString(R.string.stats_detail_motor) to (if (trip.energyIntegrated) kwhEntier(it) else kwh(it))
328+
},
326329
trip.climateKwh?.let { getString(R.string.stats_detail_climate) to kwh(it) },
327330
trip.accessoriesKwh?.let { getString(R.string.stats_detail_accessories) to kwh(it) },
328331
trip.auxiliaryKwh?.let { getString(R.string.stats_detail_auxiliary) to kwhEntier(it) },
@@ -738,9 +741,9 @@ class StatsFragment : Fragment() {
738741
private fun kwh(value: Float): String = "${fmt(value)} kWh"
739742

740743
/**
741-
* Valeur d'un compteur qui n'avance que par kWh entier (celui de l'écran d'origine) : un ordre
742-
* de grandeur, annoncé comme tel — et « moins d'un » plutôt qu'un zéro qui passerait pour une
743-
* mesure.
744+
* Valeur connue au kWh entier seulement — le compteur de l'écran d'origine, et le moteur qui
745+
* s'en déduit : un ordre de grandeur, annoncé comme tel — et « moins d'un » plutôt qu'un zéro
746+
* qui passerait pour une mesure.
744747
*/
745748
private fun kwhEntier(value: Float): String =
746749
if (value < 1f) "< 1 kWh" else "≈ ${value.roundToInt()} kWh"

‎app/src/test/java/com/mg4/control/model/TripTest.kt‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,23 @@ class TripTest {
191191
assertTrue(trip(km = 12, kwh = 1.8f, integre = 12.3f).energyKnown)
192192
assertTrue(trip(km = 0, kwh = 0.1f, integre = 0.4f).energyKnown)
193193
}
194+
195+
@Test
196+
fun `trajet calcule, le moteur est le total moins climatisation et autres`() {
197+
// Le camembert de l'écran d'origine : « Driving power » = total − « AC and others ».
198+
// Le compteur d'origine tronque au kWh : le vrai poste vaut 2 à 3, le moteur 15,6 à 16,6.
199+
val t = trip(km = 120, kwh = 18.6f).copy(energyIntegrated = true, auxiliaryKwh = 2f)
200+
assertEquals("au kWh entier, par défaut", 16f, t.motorKwh!!, 0.001f)
201+
}
202+
203+
@Test
204+
fun `petit trajet calcule, le moteur reste sous le kWh`() {
205+
val t = trip(km = 3, kwh = 0.6f).copy(energyIntegrated = true, auxiliaryKwh = 0f)
206+
assertEquals(0f, t.motorKwh!!, 0.001f)
207+
}
208+
209+
@Test
210+
fun `trajet calcule sans compteur d'origine, pas de moteur`() {
211+
assertNull(trip(km = 120, kwh = 18.6f).copy(energyIntegrated = true).motorKwh)
212+
}
194213
}

0 commit comments

Comments
 (0)