// Метрики подхода между нажатиями Lap (errata Ф-2.3): // «время подхода» = время с последнего Lap по timerTime (включает предшествующий // отдых — errata Ф-2.1), «средний пульс подхода» = среднее сэмплов за интервал. // Часы ядра — Activity.Info.timerTime (при паузе активности стоит сам). class SetTracker { var lapAtMs; // timerTime последнего Lap (мс) var sumBpm; var nBpm; function initialize() { lapAtMs = 0; sumBpm = 0; nBpm = 0; } // Lap = граница подхода: метрики обнуляются function onLap(timerTimeMs) { lapAtMs = timerTimeMs; sumBpm = 0; nBpm = 0; } // null-пульс (датчик не готов) в среднее не попадает function onSample(bpm) { if (bpm != null && bpm > 0) { sumBpm += bpm; nBpm += 1; } } // Время с границы подхода, мс function elapsedMs(timerTimeMs) { return timerTimeMs - lapAtMs; } // Средний пульс интервала (округление к ближайшему, целочисленно — без // Float), null пока нет сэмплов function avgBpm() { if (nBpm > 0) { var num = sumBpm * 2; var den = nBpm * 2; var q = 0; while (num >= den) { num -= den; q += 1; } if (num * 2 >= den) { q += 1; } return q; } return null; } }