Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Toybox.Lang;
- import Toybox.Test;
- const TEST_HR_ZONES = [128, 153, 162, 180, 185, 190] as Array<Number>;
- function computeHrZoneFlocsy(heartRate as Number) as Float {
- var z = INVALID_ZONE, fZ = INVALID_FRACTIONAL_ZONE;
- var heartRateZones = TEST_HR_ZONES;
- for (z = 0; z < 5 && heartRate >= heartRateZones[z] + 1; z++) {
- }
- var min = z > 0 ? heartRateZones[z - 1] + 1 : 30; // use 30 as min for zone 0 to get similar fractional zone number as Garmin
- var max = heartRateZones[z];
- fZ = z + (100.0 * (heartRate - min) / (max + 1 - min)) / 100;
- return fZ;
- }
- function computeHrZoneTouching(heartRate as Number) as Float {
- var z = INVALID_ZONE, fZ = INVALID_FRACTIONAL_ZONE;
- var heartRateZones = TEST_HR_ZONES;
- for (z = 0; z < 5 && heartRate >= heartRateZones[z]; z++) {
- }
- var min = z > 0 ? heartRateZones[z - 1] : 30; // use 30 as min for zone 0 to get similar fractional zone number as Garmin
- var max = heartRateZones[z];
- fZ = z + (100.0 * (heartRate - min) / (max - min)) / 100;
- return fZ;
- }
- const absolute_min = 30;
- function computeHrZoneFlowState(heartRate as Number) as Float {
- var z = INVALID_ZONE, fZ = INVALID_FRACTIONAL_ZONE;
- var heartRateZones = TEST_HR_ZONES;
- var absolute_max = heartRateZones[5];
- // ofc this is superfluous bc Garmin can't read an HR less than 30,
- // but let's pretend we don't know that
- if (heartRate < absolute_min) {
- heartRate = absolute_min;
- }
- // match garmin behaviour (any hr>= 220 will produce a decimal zone of 6.0)
- if (heartRate > absolute_max) {
- heartRate = absolute_max;
- }
- for (z = 0; z < 5 && heartRate >= heartRateZones[z]; z++) {}
- var min = z > 0 ? heartRateZones[z - 1] : absolute_min; // use 30 as min for zone 0 to get similar fractional zone number as Garmin
- var max = heartRateZones[z];
- // This is closer to what I originally had in pseudocode
- fZ = z + (((heartRate - min) * 1.0) / (max - min));
- return fZ;
- }
- (:test)
- function compareHrZones(logger as Logger) as Boolean {
- var prev = 0;
- for (var hr = 0; hr < 256; hr++) {
- var old = computeHrZoneFlocsy(hr);
- var touching = computeHrZoneTouching(hr);
- var flowState = computeHrZoneFlowState(hr);
- logger.debug("HR: " + hr + ", HR zone: old: " + old + ", touching: " + touching + ", FlowState: " + flowState + ", angle: " + (flowState - prev));
- prev = flowState;
- }
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement