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); }