#9 #11 new grade calculation

This commit is contained in:
Gyuri Horák 2023-11-17 15:27:51 +01:00
parent 47e74c8dfe
commit 846e401313
Signed by: dyuri
GPG Key ID: 4993F07B3EAE8D38

View File

@ -119,15 +119,18 @@ class RepaFieldView extends WatchUi.DataField {
hidden var egain as Number; hidden var egain as Number;
hidden var edrop as Number; hidden var edrop as Number;
hidden var cadence as Number; hidden var cadence as Number;
hidden var grade as RollingAverage;
hidden var cgrade; hidden var cgrade;
hidden var vspeed as RollingAverage;
hidden var cvspeed; hidden var cvspeed;
hidden var cgap; hidden var cgap;
hidden var deltaAlt as RollingAverage;
hidden var deltaDist as RollingAverage;
hidden var deltaTime as RollingAverage;
function initialize() { function initialize() {
DataField.initialize(); DataField.initialize();
var RASize = 5; // TODO: rolling average window size => settings
themeColor = Application.Properties.getValue("themeColor").toNumberWithBase(16); themeColor = Application.Properties.getValue("themeColor").toNumberWithBase(16);
themeColor2 = Application.Properties.getValue("themeColor2").toNumberWithBase(16); themeColor2 = Application.Properties.getValue("themeColor2").toNumberWithBase(16);
themeColor3 = Application.Properties.getValue("themeColor3").toNumberWithBase(16); themeColor3 = Application.Properties.getValue("themeColor3").toNumberWithBase(16);
@ -164,11 +167,12 @@ class RepaFieldView extends WatchUi.DataField {
egain = 0; egain = 0;
edrop = 0; edrop = 0;
cadence = 0; cadence = 0;
grade = new RollingAverage(10);
cgrade = null; cgrade = null;
vspeed = new RollingAverage(10);
cvspeed = null; cvspeed = null;
cgap = null; cgap = null;
deltaAlt = new RollingAverage(RASize);
deltaDist = new RollingAverage(RASize);
deltaTime = new RollingAverage(RASize);
var settings = System.getDeviceSettings(); var settings = System.getDeviceSettings();
isDistanceMetric = settings.distanceUnits == System.UNIT_METRIC; isDistanceMetric = settings.distanceUnits == System.UNIT_METRIC;
@ -252,18 +256,21 @@ class RepaFieldView extends WatchUi.DataField {
} }
public function onNextMultisportLeg() as Void { public function onNextMultisportLeg() as Void {
grade.reset(); deltaAlt.reset();
vspeed.reset(); deltaDist.reset();
deltaTime.reset();
} }
public function onTimerLap() as Void { public function onTimerLap() as Void {
grade.lapReset(); deltaAlt.lapReset();
vspeed.lapReset(); deltaDist.lapReset();
deltaTime.lapReset();
} }
public function onTimerReset() as Void { public function onTimerReset() as Void {
grade.reset(); deltaAlt.reset();
vspeed.reset(); deltaDist.reset();
deltaTime.reset();
} }
public function onTimerStart() as Void { public function onTimerStart() as Void {
@ -381,30 +388,29 @@ class RepaFieldView extends WatchUi.DataField {
if (info.timerTime != null && info.timerTime > 0 && timerRunning) { if (info.timerTime != null && info.timerTime > 0 && timerRunning) {
if (info.altitude != null) { if (info.altitude != null) {
var altChange = info.altitude - altitude; var altChange = info.altitude - altitude;
deltaAlt.insert(altChange);
var da = deltaAlt.getRolling();
// grade // grade
if (info.elapsedDistance != null) { if (info.elapsedDistance != null) {
var distChange = info.elapsedDistance - distance; var distChange = info.elapsedDistance - distance;
if (distChange > 0) { deltaDist.insert(distChange);
grade.insert(altChange / distChange);
} var dd = deltaDist.getRolling();
var currentGrade = grade.getRolling(); if (da != null && dd != null && dd != 0) {
if (currentGrade) { cgrade = da / dd * 100;
cgrade = currentGrade * 100;
} }
} }
// vspeed - m/min or ft/min // vspeed - m/min or ft/min
var timerChange = info.timerTime - timer; var timerChange = info.timerTime - timer;
if (timerChange > 0) { deltaTime.insert(timerChange);
var dt = deltaTime.getRolling();
if (dt != null && dt > 0 && da != null) {
cvspeed = da / dt * 60000.0f;
if (!isElevationMetric) { if (!isElevationMetric) {
vspeed.insert(meterToFeet * altChange / (timerChange / 60000.0)); cvspeed *= meterToFeet;
} else {
vspeed.insert(altChange / (timerChange / 60000.0));
}
var currentVSpeed = vspeed.getRolling();
if (currentVSpeed != null ) {
cvspeed = currentVSpeed;
} }
} }
} }
@ -528,22 +534,50 @@ class RepaFieldView extends WatchUi.DataField {
// fit update // fit update
// TODO: refactor into separate function/class // TODO: refactor into separate function/class
if (timerRunning) { if (timerRunning) {
var avgDA = deltaAlt.totalAvg();
var avgLDA = deltaAlt.lapAvg();
if (fitGrade != null) { if (fitGrade != null) {
fitGrade.setData(cgrade ? cgrade : 0); fitGrade.setData(cgrade ? cgrade : 0);
var gradeSumAvg = grade.totalAvg();
fitGradeSumAvg.setData(gradeSumAvg ? gradeSumAvg * 100 : 0); var avgDD = deltaDist.totalAvg();
var gradeLapAvg = grade.lapAvg(); var avgGrade = 0.0f;
fitGradeLapAvg.setData(gradeLapAvg ? gradeLapAvg * 100 : 0); if (avgDA != null && avgDD != null && avgDD != 0) {
avgGrade = avgDA / avgDD;
}
fitGradeSumAvg.setData(avgGrade * 100);
var avgLDD = deltaDist.lapAvg();
var avgLGrade = 0.0f;
if (avgLDA != null && avgLDD != null && avgLDD != 0) {
avgLGrade = avgLDA / avgLDD;
}
fitGradeLapAvg.setData(avgLGrade * 100);
} }
if (fitGAP != null) { if (fitGAP != null) {
fitGAP.setData(cgap ? cgap : 0); fitGAP.setData(cgap ? cgap : 60);
} }
if (fitVSpeed != null) { if (fitVSpeed != null) {
fitVSpeed.setData(cvspeed ? cvspeed : 0); fitVSpeed.setData(cvspeed ? cvspeed : 0);
var vsSumAvg = vspeed.totalAvg();
fitVSpeedSumAvg.setData(vsSumAvg ? vsSumAvg : 0); var avgDT = deltaTime.totalAvg();
var vsLapAvg = vspeed.lapAvg(); var vsSumAvg = 0.0f;
fitVSpeedLapAvg.setData(vsLapAvg ? vsLapAvg : 0); if (avgDA != null && avgDT != null && avgDT != 0) {
vsSumAvg = avgDA / avgDT * 60000.0f;
if (!isElevationMetric) {
vsSumAvg *= meterToFeet;
}
}
fitVSpeedSumAvg.setData(vsSumAvg);
var avgLDT = deltaTime.lapAvg();
var vsLapAvg = 0.0f;
if (avgDA != null && avgLDT != null && avgLDT != 0) {
vsLapAvg = avgLDA / avgLDT * 60000.0f;
if (!isElevationMetric) {
vsLapAvg *= meterToFeet;
}
}
fitVSpeedLapAvg.setData(vsLapAvg);
} }
} }
} }