diff --git a/core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt b/core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt index b4c0f83423..cded16e7ae 100644 --- a/core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt +++ b/core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt @@ -16,11 +16,13 @@ */ package org.meshtastic.core.model.util +import kotlin.math.floor import kotlin.math.ln +import kotlin.math.log10 +import kotlin.math.pow import kotlin.math.roundToInt object UnitConversions { - @Suppress("MagicNumber") fun celsiusToFahrenheit(celsius: Float): Float = (celsius * 1.8F) + 32 @@ -44,7 +46,7 @@ object UnitConversions { } /** - * Calculated the dew point based on the Magnus-Tetens approximation which is a widely used formula for calculating + * Calculates the dew point based on the Magnus-Tetens approximation which is a widely used formula for calculating * dew point temperature. */ @Suppress("MagicNumber") @@ -53,4 +55,19 @@ object UnitConversions { val alpha = (a * tempCelsius) / (b + tempCelsius) + ln(humidity / 100f) return (b * alpha) / (a - alpha) } + + /** + * Converts numbers from milli to unit. examples: + * - 1000 milliamperes will be converted into 1 ampere, + * - 100 millimeters to 0.1 meters + */ + @Suppress("MagicNumber") + fun convertToBaseUnit(number: Float): Float { + if (number <= 0) return 0f + + var exponent = floor(log10(number / 1000.0)).toInt() + if (exponent.mod(3) != 0 && exponent in -11..11) exponent = (exponent / 3) * 3 + + return number / 10f.pow(exponent) + } } diff --git a/core/model/src/test/kotlin/org/meshtastic/core/model/util/UnitConversionsTest.kt b/core/model/src/test/kotlin/org/meshtastic/core/model/util/UnitConversionsTest.kt index 07832a9036..5cbe637df4 100644 --- a/core/model/src/test/kotlin/org/meshtastic/core/model/util/UnitConversionsTest.kt +++ b/core/model/src/test/kotlin/org/meshtastic/core/model/util/UnitConversionsTest.kt @@ -115,4 +115,11 @@ class UnitConversionsTest { val zeroHumidity = UnitConversions.calculateDewPoint(20.0f, 0.0f) assertTrue("Expected NaN for 0% humidity", zeroHumidity.isNaN()) } + + @Test + fun `convertToBaseUnit converts correctly`() { + mapOf(18200f to 18.2f, -4f to 0.004f, 0f to 0f, -9f to 0f).forEach { (number, expectedvalue) -> + assertEquals(expectedvalue, UnitConversions.convertToBaseUnit(number)) + } + } } diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt index 750b3159de..268bc88d28 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt @@ -65,6 +65,7 @@ import kotlinx.coroutines.launch import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.TelemetryType import org.meshtastic.core.model.util.UnitConversions.celsiusToFahrenheit +import org.meshtastic.core.model.util.UnitConversions.convertToBaseUnit import org.meshtastic.core.strings.Res import org.meshtastic.core.strings.current import org.meshtastic.core.strings.env_metrics_log @@ -374,9 +375,9 @@ private fun VoltageCurrentDisplay(envMetrics: org.meshtastic.proto.EnvironmentMe ) } if (hasCurrent) { - val current = envMetrics.current!! + val current = convertToBaseUnit(envMetrics.current!!) Text( - text = "%s %.2f mA".format(stringResource(Res.string.current), current), + text = "%s %.2f A".format(stringResource(Res.string.current), current), color = MaterialTheme.colorScheme.onSurface, fontSize = MaterialTheme.typography.labelLarge.fontSize, )