VEU.WathBody/3-app/5-watch/FenixDataField/source/ZoneCalc.mc

42 lines
1.8 KiB
MonkeyC
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Зоны пульса: 50/70/85 % от макс. ЧСС (Ф-2.2).
// Макс. ЧСС хранится в масштабе ×10 (maxBpm10) — весь расчёт целочисленный,
// без Float; формула Танаки 208 − 0,7×возраст тоже считается в ×10.
class ZoneCalc {
// Идентификаторы зон (цвет на экране дублируется подписью)
var ZONE_NONE = 0; // нет данных — прочерк
var ZONE_BLUE = 1; // < 50 % — восстановление
var ZONE_GREEN = 2; // 50–70 % — лёгкая
var ZONE_YELLOW = 3; // 70–85 % — средняя
var ZONE_RED = 4; // ≥ 85 % — высокая
// Макс. ЧСС ×10: ручное значение (>0) приоритетно, иначе Танака от возраста.
// Возраст вне 14–100 — умолчание 45.
function maxBpm10For(hrMaxBpm, age) {
if (hrMaxBpm != null && hrMaxBpm > 0) {
return hrMaxBpm * 10;
}
if (age == null || age < 14 || age > 100) {
age = 45;
}
return 2080 - 7 * age;
}
// Зона по пульсу. Пороги в целых числах (масштаб ×10):
// 50 % → bpm×20 < maxBpm10; 70 % → bpm×100 < maxBpm10×7; 85 % → bpm×200 < maxBpm10×17
function zoneFor(bpm, maxBpm10) {
if (bpm == null || bpm <= 0 || maxBpm10 == null || maxBpm10 <= 0) {
return ZONE_NONE;
}
if (bpm * 20 < maxBpm10) {
return ZONE_BLUE;
}
if (bpm * 100 < maxBpm10 * 7) {
return ZONE_GREEN;
}
if (bpm * 200 < maxBpm10 * 17) {
return ZONE_YELLOW;
}
return ZONE_RED;
}
}