Add drafty human friendly current metrics#4433
Add drafty human friendly current metrics#4433NeimadTL wants to merge 10 commits intomeshtastic:mainfrom
Conversation
Currently, the metircs are always shown with the in milliampere (e.i, using the "mA" unit). A nicer way would be to have thoses metrics shown in more friendly way (e.g, 1A -> 1A, 1000A -> 1kA, 0.000001A -> 1μA...etc). At this point, this is just a draft of how it would be implemented.
The ranges were wrong and therefore gave wrong result so they've been fixed. Also, there's possiblity of the function using custom units instead of the default ones. This new parameter is optional as one may be just fine the default units.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4433 +/- ##
=========================================
- Coverage 11.66% 9.45% -2.21%
=========================================
Files 424 397 -27
Lines 14545 13755 -790
Branches 2414 2229 -185
=========================================
- Hits 1696 1301 -395
+ Misses 12533 12196 -337
+ Partials 316 258 -58 ☔ View full report in Codecov by Sentry. |
Spotless has been apply to fix formatting and linting errors.
Both base and ampere units have been change into constants as gradle suggested it and also because it makes more sense.
|
@DaneEvans @jamesarich, could you please have look when you'll get some time please (couldn't assign it you for some reason). Also, I've got to do the same for the distance metric but couldn't find it in |
There was a problem hiding this comment.
Pull request overview
This pull request implements human-friendly formatting for electrical current metrics in the Environment Metrics display. Instead of always showing values in milliamperes (mA), it introduces intelligent unit scaling (μA, mA, A, kA, etc.) based on the magnitude of the value. This addresses issue #2944, which requests more readable display of large metric values (e.g., showing "18.2 A" instead of "18200 mA").
Changes:
- Added
numberToHuman()utility function to convert numeric values to human-readable format with appropriate SI prefixes - Added
BASE_UNITSandAMPERE_UNITSconstant maps to support unit conversion - Updated current display in
EnvironmentMetrics.ktto use the new formatting function
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 8 comments.
| File | Description |
|---|---|
| core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt | Adds numberToHuman function and unit conversion constants for intelligent unit prefix selection |
| feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt | Updates current value display to use numberToHuman instead of fixed mA formatting |
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
core/model/src/main/kotlin/org/meshtastic/core/model/util/UnitConversions.kt
Outdated
Show resolved
Hide resolved
DaneEvans
left a comment
There was a problem hiding this comment.
Go through the copilot stuff, most of it seems sensible.
Remember we want this generalised for all units / areas eventually (windspeed, distance etc.)
The mappings should be unnecessary, especially to amps in particular.
A string insertion ala (python) f"{f0.2 value}{SIprefix}{ Unit}" should be adequate.
The original formatting was the number with two decimal places (e.i, "% 2f") so the returned value is formatted that way now. The exponent logic wasn't straightforward and complex? It's been replaced the following formulae `(exponent / 3) * 3` which will round down to the nearest multiple of 3 in the exponent calculation is not a multiple of 3. The base unit map was inverted a second time to assign the unit so it's been updated.
This makes sure that number less than or equal to 0 are handle before attempting calculations and "N/A" will be returned in that case. Metrics like current and distance are stored respectively in milliampere (mA) and millimeters (mm) so before doing calculations and determining the units, the metrics have to be converted in base unit (e.i, divided by 1000) first.
We eventually decided to display metrics in base unit to make things simpler so therefore mapping exponent to unit is no longer needed.
Tests cases have been added to make sure the fonction works as expected.
|
Thanks for your feedback @DaneEvans. Made the changes but looks like there other issue which I haven't figured out yet. Any suggestion please ? FYI, the same warning appears the last CI run:
|
Spotless have been applied sucessfully but not sure issues are resolved (attempt#1).

Currently, the metrics are always shown with the in milliampere (e.i, using the "mA" unit). A nicer way would be to have those metrics shown in more friendly way (e.g, 1A -> 1A, 1000A -> 1kA, 0.000001A -> 1μA...etc). At this point, this is just a draft of how it would be implemented.
Related to #2944