Fix repeater battery % inconsistency and add configurable repeater battery chemistry (#199)
* fix(repeater): unify battery percentage math and add repeater chemistry setting - Add shared battery percent utility used by connector, repeater status, and telemetry - Add repeater-specific battery chemistry persistence and service accessors - Add repeater chemistry selector in Repeater Hub - Ensure telemetry and status compute percentages consistently from same chemistry - Add focused battery utility tests Refs #116 Refs #174 * fix: Flutter Analyzer Errors fixed Recent Merge Compatible * Unify repeater battery source across status and telemetrychore/offband-rebrand
parent
304c389669
commit
061b715694
@ -0,0 +1,26 @@
|
||||
typedef BatteryVoltageRange = ({int minMv, int maxMv});
|
||||
|
||||
BatteryVoltageRange batteryVoltageRange(String chemistry) {
|
||||
switch (chemistry) {
|
||||
case 'lifepo4':
|
||||
return (minMv: 2600, maxMv: 3650);
|
||||
case 'lipo':
|
||||
return (minMv: 3000, maxMv: 4200);
|
||||
case 'nmc':
|
||||
default:
|
||||
return (minMv: 3000, maxMv: 4200);
|
||||
}
|
||||
}
|
||||
|
||||
int estimateBatteryPercentFromMillivolts(int millivolts, String chemistry) {
|
||||
final range = batteryVoltageRange(chemistry);
|
||||
if (millivolts <= range.minMv) return 0;
|
||||
if (millivolts >= range.maxMv) return 100;
|
||||
return (((millivolts - range.minMv) * 100) / (range.maxMv - range.minMv))
|
||||
.round();
|
||||
}
|
||||
|
||||
int estimateBatteryPercentFromVolts(double volts, String chemistry) {
|
||||
final millivolts = (volts * 1000).round();
|
||||
return estimateBatteryPercentFromMillivolts(millivolts, chemistry);
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:meshcore_open/utils/battery_utils.dart';
|
||||
|
||||
void main() {
|
||||
group('battery utils', () {
|
||||
test('nmc range maps 3.0V to 0% and 4.2V to 100%', () {
|
||||
expect(estimateBatteryPercentFromVolts(3.0, 'nmc'), 0);
|
||||
expect(estimateBatteryPercentFromVolts(4.2, 'nmc'), 100);
|
||||
});
|
||||
|
||||
test('lifepo4 range maps 2.6V to 0% and 3.65V to 100%', () {
|
||||
expect(estimateBatteryPercentFromVolts(2.6, 'lifepo4'), 0);
|
||||
expect(estimateBatteryPercentFromVolts(3.65, 'lifepo4'), 100);
|
||||
});
|
||||
|
||||
test('unknown chemistry falls back to nmc mapping', () {
|
||||
expect(
|
||||
estimateBatteryPercentFromMillivolts(3600, 'unknown'),
|
||||
estimateBatteryPercentFromMillivolts(3600, 'nmc'),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
Loading…
Reference in new issue