|
|
|
@ -153,11 +153,11 @@ listen("telemetry", (event) => {
|
|
|
|
const t = event.payload.telemetry;
|
|
|
|
const t = event.payload.telemetry;
|
|
|
|
if (t.Power) {
|
|
|
|
if (t.Power) {
|
|
|
|
actualWatts = t.Power.watts;
|
|
|
|
actualWatts = t.Power.watts;
|
|
|
|
setMetric("power-value", actualWatts);
|
|
|
|
setMetric("power-value", `${actualWatts} W`);
|
|
|
|
updatePowerDeviation();
|
|
|
|
updatePowerDeviation();
|
|
|
|
} else if (t.Cadence) {
|
|
|
|
} else if (t.Cadence) {
|
|
|
|
actualCadence = Math.round(t.Cadence.rpm);
|
|
|
|
actualCadence = Math.round(t.Cadence.rpm);
|
|
|
|
setMetric("cadence-value", actualCadence);
|
|
|
|
setMetric("cadence-value", `${actualCadence} rpm`);
|
|
|
|
updateCadenceDeviation();
|
|
|
|
updateCadenceDeviation();
|
|
|
|
} else if (t.HeartRate) {
|
|
|
|
} else if (t.HeartRate) {
|
|
|
|
setMetric("hr-value", t.HeartRate.bpm);
|
|
|
|
setMetric("hr-value", t.HeartRate.bpm);
|
|
|
|
@ -224,30 +224,29 @@ function powerTolerance(target) {
|
|
|
|
return Math.max(POWER_TOL_ABS, Math.round(target * POWER_TOL_PCT));
|
|
|
|
return Math.max(POWER_TOL_ABS, Math.round(target * POWER_TOL_PCT));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function updateDeviation(metricEl, targetEl, warnEl, actual, target, tolerance) {
|
|
|
|
function updateDeviation(metricEl, targetEl, warnEl, actual, target, tolerance, unit) {
|
|
|
|
targetEl.textContent = target != null ? `цель ${target}` : "";
|
|
|
|
targetEl.textContent = target != null ? `цель ${target} ${unit}` : "—";
|
|
|
|
if (actual == null || target == null) {
|
|
|
|
if (actual == null || target == null) {
|
|
|
|
metricEl.classList.remove("metric--off");
|
|
|
|
metricEl.classList.remove("metric--off");
|
|
|
|
warnEl.hidden = true;
|
|
|
|
warnEl.textContent = "";
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const diff = actual - target;
|
|
|
|
const diff = actual - target;
|
|
|
|
if (Math.abs(diff) > tolerance) {
|
|
|
|
if (Math.abs(diff) > tolerance) {
|
|
|
|
metricEl.classList.add("metric--off");
|
|
|
|
metricEl.classList.add("metric--off");
|
|
|
|
warnEl.textContent = diff > 0 ? "выше цели" : "ниже цели";
|
|
|
|
warnEl.textContent = diff > 0 ? "выше цели" : "ниже цели";
|
|
|
|
warnEl.hidden = false;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
metricEl.classList.remove("metric--off");
|
|
|
|
metricEl.classList.remove("metric--off");
|
|
|
|
warnEl.hidden = true;
|
|
|
|
warnEl.textContent = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function updatePowerDeviation() {
|
|
|
|
function updatePowerDeviation() {
|
|
|
|
updateDeviation(powerMetric, powerTarget, powerWarn, actualWatts, targetWatts, powerTolerance(targetWatts ?? 0));
|
|
|
|
updateDeviation(powerMetric, powerTarget, powerWarn, actualWatts, targetWatts, powerTolerance(targetWatts ?? 0), "W");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function updateCadenceDeviation() {
|
|
|
|
function updateCadenceDeviation() {
|
|
|
|
updateDeviation(cadenceMetric, cadenceTarget, cadenceWarn, actualCadence, targetCadence, CADENCE_TOL_ABS);
|
|
|
|
updateDeviation(cadenceMetric, cadenceTarget, cadenceWarn, actualCadence, targetCadence, CADENCE_TOL_ABS, "rpm");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function clearTargets() {
|
|
|
|
function clearTargets() {
|
|
|
|
|