42 lines
1.3 KiB
JavaScript
42 lines
1.3 KiB
JavaScript
import { POWER_UNIT } from "../mixins/formatter";
|
|
|
|
export function optionStep(maxEnergy) {
|
|
if (maxEnergy < 1) return 0.05;
|
|
if (maxEnergy < 2) return 0.1;
|
|
if (maxEnergy < 5) return 0.25;
|
|
if (maxEnergy < 10) return 0.5;
|
|
if (maxEnergy < 25) return 1;
|
|
if (maxEnergy < 50) return 2;
|
|
return 5;
|
|
}
|
|
|
|
export function fmtEnergy(energy, step, fmtWh, zeroText) {
|
|
if (energy === 0) {
|
|
return zeroText;
|
|
}
|
|
const inKWh = step >= 0.1;
|
|
const digits = inKWh && step < 1 ? 1 : 0;
|
|
return fmtWh(energy * 1e3, inKWh ? POWER_UNIT.KW : POWER_UNIT.W, true, digits);
|
|
}
|
|
|
|
export function estimatedSoc(energy, socPerKwh) {
|
|
if (!socPerKwh) return null;
|
|
return Math.round(energy * socPerKwh);
|
|
}
|
|
|
|
export function energyOptions(fromEnergy, maxEnergy, socPerKwh, fmtWh, fmtPercentage, zeroText) {
|
|
const step = optionStep(maxEnergy);
|
|
const result = [];
|
|
for (let energy = 0; energy <= maxEnergy; energy += step) {
|
|
let text = fmtEnergy(energy, step, fmtWh, zeroText);
|
|
const disabled = energy < fromEnergy / 1e3 && energy !== 0;
|
|
const soc = estimatedSoc(energy, socPerKwh);
|
|
if (soc) {
|
|
text += ` (+${fmtPercentage(soc)})`;
|
|
}
|
|
// prevent rounding errors
|
|
const energyNormal = energy.toFixed(3) * 1;
|
|
result.push({ energy: energyNormal, text, disabled });
|
|
}
|
|
return result;
|
|
}
|