From 9546275d28feab52b0bb470eabb208af3a319443 Mon Sep 17 00:00:00 2001 From: kyledo Date: Tue, 23 Dec 2025 14:35:46 +1100 Subject: [PATCH 01/10] minor UI change --- source/GarminApp.mc | 2 +- source/Views/AdvancedView.mc | 47 ++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index 4ec1535..49a91ff 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -46,7 +46,7 @@ class GarminApp extends Application.AppBase { // onStart() is called on application start up function onStart(state as Dictionary?) as Void { globalTimer = new Timer.Timer(); - globalTimer.start(method(:updateCadence),1000,true); + globalTimer.start(method(:updateCadence),3000,true); dummyValueTesting(); /* remember to remove after testing diff --git a/source/Views/AdvancedView.mc b/source/Views/AdvancedView.mc index 6f2d476..f10b4d5 100644 --- a/source/Views/AdvancedView.mc +++ b/source/Views/AdvancedView.mc @@ -17,7 +17,7 @@ class AdvancedView extends WatchUi.View { function onShow() as Void { _simulationTimer = new Timer.Timer(); - _simulationTimer.start(method(:refreshScreen), 1000, true); + _simulationTimer.start(method(:refreshScreen), 3000, true); } function onHide() as Void { @@ -50,15 +50,15 @@ class AdvancedView extends WatchUi.View { var seconds = info.timerTime / 1000; var hours = seconds / 3600; var minutes = (seconds % 3600) / 60; - var secs = seconds % 60; - var timeStr = hours.format("%01d") + ":" + minutes.format("%02d") + "." + secs.format("%02d"); + //var secs = seconds % 60; + var timeStr = hours.format("%01d") + ":" + minutes.format("%02d"); //+ "." + secs.format("%02d"); dc.setColor(0xFFF813, Graphics.COLOR_TRANSPARENT); dc.drawText(width / 2, 3, Graphics.FONT_LARGE, timeStr, Graphics.TEXT_JUSTIFY_CENTER); } // Draw heart rate circle (left, dark red RGB: 211,19,2519 var hrX = width / 4; - var hrY = (height * 2) / 5; + var hrY = (height * 2) / 7; var circleRadius = 42; dc.setColor(0x9D0000, Graphics.COLOR_TRANSPARENT); @@ -87,7 +87,7 @@ class AdvancedView extends WatchUi.View { //draw ideal cadence range var idealMinCadence = app.getMinCadence(); var idealMaxCadence = app.getMaxCadence(); - var idealCadenceY = height * 0.45; + var idealCadenceY = height * 0.37; if(idealMinCadence != null && idealMaxCadence != null){ @@ -127,20 +127,41 @@ class AdvancedView extends WatchUi.View { //margins value var margin = width * 0.1; var marginLeftRightMultiplier = 1.2; - var marginTopMultiplier = 0.5; + //var marginTopMultiplier = 0.5; var marginBottomMultiplier = 2; //chart position var chartLeft = margin * marginLeftRightMultiplier; var chartRight = width - chartLeft; - var chartTop = height * 0.5 + margin * marginTopMultiplier; + var chartTop = height * 0.45; var chartBottom = height - margin*marginBottomMultiplier; var chartWidth = chartRight - chartLeft; var chartHeight = chartBottom - chartTop; - + var quarterChartHeight = chartHeight / 4; + + //bar zone + var barZoneLeft = chartLeft + 0.5; + var barZoneRight = chartRight - 1.25; + var barZoneWidth = barZoneRight - barZoneLeft; + + //additional line indicator + var nLine = 3; + var line1x1 = chartLeft - margin * 0.25; + var line1x2 = chartLeft; + var line2x1 = chartRight; + var line2x2 = chartRight + margin * 0.25; + var lineY = chartTop + quarterChartHeight; + + // Draw white border around chart (RGB: 255,255,255 = 0xFFFFFF) - dc.setColor(0xFFFFFF, Graphics.COLOR_TRANSPARENT); + dc.setColor(0x969696, Graphics.COLOR_TRANSPARENT); dc.drawRectangle(chartLeft, chartTop, chartWidth, chartHeight); + for(var i = 0; i < nLine; i++){ + dc.drawLine(line1x1,lineY,line1x2,lineY); + dc.drawLine(line2x1,lineY,line2x2,lineY); + lineY += quarterChartHeight; + } + // Get data from app var app = getApp(); @@ -155,7 +176,7 @@ class AdvancedView extends WatchUi.View { // Calculate bar width var numBars = cadenceCount; if(numBars == 0) { return; } - var barWidth = chartWidth / MAX_BARS; + var barWidth = barZoneWidth / MAX_BARS; var startIndex = (cadenceIndex - numBars + MAX_BARS) % MAX_BARS; @@ -167,13 +188,13 @@ class AdvancedView extends WatchUi.View { //calculate bar height and position var barHeight = (cadence / MAX_CADENCE_DISPLAY) * chartHeight; - var x = chartLeft + i * barWidth; + var x = barZoneLeft + i * barWidth; var y = chartBottom - barHeight; //seperation between each bar - var barOffset = 1; + var barOffset = 0; correctColor(cadence, idealMinCadence, idealMaxCadence, dc); - dc.fillRectangle(x, y, barWidth-barOffset, barHeight); + dc.fillRectangle(x, y, barWidth+barOffset, barHeight); } } } From 3261e4f18f2635668786aa9027882c1ec5295f75 Mon Sep 17 00:00:00 2001 From: kyledo Date: Thu, 8 Jan 2026 20:00:50 +1100 Subject: [PATCH 02/10] minor fixes --- source/GarminApp.mc | 8 +++++--- source/Views/AdvancedView.mc | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index 49a91ff..c00bf1f 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -3,7 +3,8 @@ import Toybox.Lang; import Toybox.WatchUi; class GarminApp extends Application.AppBase { - const MAX_BARS = 60; + const MAX_BARS = 180; + const MAX_BARS_DISPLAY = 0; const BASELINE_AVG_CADENCE = 160; const MAX_CADENCE = 190; @@ -25,7 +26,8 @@ class GarminApp extends Application.AppBase { private var _idealMaxCadence = 100; private var _cadenceIndex = 0; private var _cadenceCount = 0; - private var _cadenceHistory as Array = new [MAX_BARS]; // Store 60 data points (1 minutes at 1-second intervals) + private var _cadenceHistory as Array = []; // Store session's cadence + private var _cadenceChartDisplay as Array = new [MAX_BARS]; // Store data points for display private var _userHeight = null;//>>cm private var _userSpeed = null;//>>m/s @@ -46,7 +48,7 @@ class GarminApp extends Application.AppBase { // onStart() is called on application start up function onStart(state as Dictionary?) as Void { globalTimer = new Timer.Timer(); - globalTimer.start(method(:updateCadence),3000,true); + globalTimer.start(method(:updateCadence),1000,true); dummyValueTesting(); /* remember to remove after testing diff --git a/source/Views/AdvancedView.mc b/source/Views/AdvancedView.mc index f10b4d5..7ff6394 100644 --- a/source/Views/AdvancedView.mc +++ b/source/Views/AdvancedView.mc @@ -17,7 +17,7 @@ class AdvancedView extends WatchUi.View { function onShow() as Void { _simulationTimer = new Timer.Timer(); - _simulationTimer.start(method(:refreshScreen), 3000, true); + _simulationTimer.start(method(:refreshScreen), 1000, true); } function onHide() as Void { From 36d043db91b412322be9fd58c1c6de4c3acfa848 Mon Sep 17 00:00:00 2001 From: kyledo Date: Mon, 12 Jan 2026 15:52:15 +1100 Subject: [PATCH 03/10] minor changes --- source/GarminApp.mc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index c00bf1f..f21e5f0 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -10,6 +10,12 @@ class GarminApp extends Application.AppBase { var globalTimer; + enum { + ThirtyminChart, + OneHourChart, + TwoHourChart + } + enum { Beginner = 1.06, Intermediate = 1.04, @@ -27,7 +33,7 @@ class GarminApp extends Application.AppBase { private var _cadenceIndex = 0; private var _cadenceCount = 0; private var _cadenceHistory as Array = []; // Store session's cadence - private var _cadenceChartDisplay as Array = new [MAX_BARS]; // Store data points for display + //private var _cadenceChartDisplay as Array = new [MAX_BARS]; // Store data points for display private var _userHeight = null;//>>cm private var _userSpeed = null;//>>m/s @@ -77,8 +83,6 @@ class GarminApp extends Application.AppBase { if (_cadenceCount < MAX_BARS) { _cadenceCount++; } } - //WatchUi.requestUpdate(); - } function idealCadenceCalculator() as Void { From eb5058485c98b0af168697001222f792ac0f6ab2 Mon Sep 17 00:00:00 2001 From: kyledo Date: Wed, 14 Jan 2026 22:12:18 +1100 Subject: [PATCH 04/10] minor adjustment to chart position --- source/GarminApp.mc | 28 +++++++++------------------- source/Views/AdvancedView.mc | 23 +++++++++++------------ 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index f21e5f0..8352d14 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -3,8 +3,8 @@ import Toybox.Lang; import Toybox.WatchUi; class GarminApp extends Application.AppBase { - const MAX_BARS = 180; - const MAX_BARS_DISPLAY = 0; + const MAX_BARS = 147; + //const MAX_BARS_DISPLAY = 0; const BASELINE_AVG_CADENCE = 160; const MAX_CADENCE = 190; @@ -32,20 +32,15 @@ class GarminApp extends Application.AppBase { private var _idealMaxCadence = 100; private var _cadenceIndex = 0; private var _cadenceCount = 0; - private var _cadenceHistory as Array = []; // Store session's cadence + private var _cadenceHistory as Array = new [MAX_BARS]; // Store session's cadence //private var _cadenceChartDisplay as Array = new [MAX_BARS]; // Store data points for display - private var _userHeight = null;//>>cm - private var _userSpeed = null;//>>m/s - private var _experienceLvl = null; - private var _userGender = null; - - function dummyValueTesting() as Void { - _userHeight = 170; - _userSpeed = 3.8; - _experienceLvl = Beginner; - _userGender = Female; - } + //default value (can change in settings) + private var _userHeight = 170;//>>cm + private var _userSpeed = 3.8;//>>m/s + private var _experienceLvl = Beginner; + private var _userGender = Male; + private var _chartOption = ThirtyminChart; function initialize() { AppBase.initialize(); @@ -55,10 +50,6 @@ class GarminApp extends Application.AppBase { function onStart(state as Dictionary?) as Void { globalTimer = new Timer.Timer(); globalTimer.start(method(:updateCadence),1000,true); - dummyValueTesting(); - /* - remember to remove after testing - */ idealCadenceCalculator(); } @@ -173,7 +164,6 @@ class GarminApp extends Application.AppBase { return _experienceLvl; } - //double check ltr function setExperienceLvl(value as Number) as Void { _experienceLvl = value; } diff --git a/source/Views/AdvancedView.mc b/source/Views/AdvancedView.mc index 7ff6394..483650e 100644 --- a/source/Views/AdvancedView.mc +++ b/source/Views/AdvancedView.mc @@ -6,7 +6,7 @@ import Toybox.Timer; import Toybox.System; class AdvancedView extends WatchUi.View { - const MAX_BARS = 60; + const MAX_BARS = 147; const MAX_CADENCE_DISPLAY = 200; private var _simulationTimer; @@ -126,29 +126,30 @@ class AdvancedView extends WatchUi.View { //margins value var margin = width * 0.1; - var marginLeftRightMultiplier = 1.2; + var marginLeftRightMultiplier = 1.38; //var marginTopMultiplier = 0.5; - var marginBottomMultiplier = 2; + var marginBottomMultiplier = 1.6; //chart position var chartLeft = margin * marginLeftRightMultiplier; var chartRight = width - chartLeft; - var chartTop = height * 0.45; + var chartTop = height * 0.5; var chartBottom = height - margin*marginBottomMultiplier; var chartWidth = chartRight - chartLeft; var chartHeight = chartBottom - chartTop; var quarterChartHeight = chartHeight / 4; //bar zone - var barZoneLeft = chartLeft + 0.5; - var barZoneRight = chartRight - 1.25; + var barZoneLeft = chartLeft + 1; + var barZoneRight = chartRight - 1; var barZoneWidth = barZoneRight - barZoneLeft; + var barZoneBottom = chartBottom - 1; //additional line indicator var nLine = 3; var line1x1 = chartLeft - margin * 0.25; var line1x2 = chartLeft; - var line2x1 = chartRight; + var line2x1 = chartRight - 1; var line2x2 = chartRight + margin * 0.25; var lineY = chartTop + quarterChartHeight; @@ -176,7 +177,7 @@ class AdvancedView extends WatchUi.View { // Calculate bar width var numBars = cadenceCount; if(numBars == 0) { return; } - var barWidth = barZoneWidth / MAX_BARS; + var barWidth = (barZoneWidth / MAX_BARS).toNumber(); var startIndex = (cadenceIndex - numBars + MAX_BARS) % MAX_BARS; @@ -189,12 +190,10 @@ class AdvancedView extends WatchUi.View { //calculate bar height and position var barHeight = (cadence / MAX_CADENCE_DISPLAY) * chartHeight; var x = barZoneLeft + i * barWidth; - var y = chartBottom - barHeight; + var y = barZoneBottom - barHeight; - //seperation between each bar - var barOffset = 0; correctColor(cadence, idealMinCadence, idealMaxCadence, dc); - dc.fillRectangle(x, y, barWidth+barOffset, barHeight); + dc.fillRectangle(x, y, barWidth, barHeight); } } } From 1232cdb233bc4d4d3bf6cfbfae20e9ab1ba86a3c Mon Sep 17 00:00:00 2001 From: kyledo Date: Thu, 15 Jan 2026 18:20:11 +1100 Subject: [PATCH 05/10] 4 Bar chart duration customization user can now choose between 15min, 30min, 1 hour, and 2 hours duration for the bar chart. The new chart have better accuracy on cadence reading --- source/GarminApp.mc | 59 +++++++++++++++++++++++++----------- source/Views/AdvancedView.mc | 51 ++++++++++++++++--------------- 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index 8352d14..8d6a38d 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -3,17 +3,18 @@ import Toybox.Lang; import Toybox.WatchUi; class GarminApp extends Application.AppBase { - const MAX_BARS = 147; + const MAX_BARS = 280; //const MAX_BARS_DISPLAY = 0; const BASELINE_AVG_CADENCE = 160; const MAX_CADENCE = 190; var globalTimer; - enum { - ThirtyminChart, - OneHourChart, - TwoHourChart + enum { //each chart corresponds to a difference bar duration average + FifteenminChart = 3, + ThirtyminChart = 6, + OneHourChart = 13, + TwoHourChart = 26 } enum { @@ -28,19 +29,23 @@ class GarminApp extends Application.AppBase { Other } - private var _idealMinCadence = 80; - private var _idealMaxCadence = 100; - private var _cadenceIndex = 0; - private var _cadenceCount = 0; - private var _cadenceHistory as Array = new [MAX_BARS]; // Store session's cadence - //private var _cadenceChartDisplay as Array = new [MAX_BARS]; // Store data points for display - //default value (can change in settings) private var _userHeight = 170;//>>cm private var _userSpeed = 3.8;//>>m/s private var _experienceLvl = Beginner; private var _userGender = Male; - private var _chartOption = ThirtyminChart; + private var _chartOption = TwoHourChart; + + private var _idealMinCadence = 80; + private var _idealMaxCadence = 100; + + private var _cadenceHistory as Array = new [MAX_BARS]; // Store session's cadence + private var _cadenceIndex = 0; + private var _cadenceCount = 0; + + private var _cadenceBarAvg as Array = new [_chartOption]; // Store data points for display + private var _cadenceAvgIndex = 0; + private var _cadenceAvgCount = 0; function initialize() { AppBase.initialize(); @@ -49,7 +54,7 @@ class GarminApp extends Application.AppBase { // onStart() is called on application start up function onStart(state as Dictionary?) as Void { globalTimer = new Timer.Timer(); - globalTimer.start(method(:updateCadence),1000,true); + globalTimer.start(method(:updateCadenceBarAvg),1000,true); idealCadenceCalculator(); } @@ -62,20 +67,38 @@ class GarminApp extends Application.AppBase { } - function updateCadence() as Void { + function updateCadenceBarAvg() as Void { var info = Activity.getActivityInfo(); //var zoneState = null; if (info != null && info.currentCadence != null) { var newCadence = info.currentCadence; - _cadenceHistory[_cadenceIndex] = newCadence.toFloat(); + _cadenceBarAvg[_cadenceAvgIndex] = newCadence.toFloat(); // Add to circular buffer - _cadenceIndex = (_cadenceIndex + 1) % MAX_BARS; - if (_cadenceCount < MAX_BARS) { _cadenceCount++; } + _cadenceAvgIndex = (_cadenceAvgIndex + 1) % _chartOption; + if (_cadenceAvgCount < _chartOption) { + _cadenceAvgCount++; + } + else //calculate avg + { + var barAvg = 0.0; + for(var i = 0; i < _chartOption; i++){ + barAvg += _cadenceBarAvg[i]; + } + updateCadenceHistory(barAvg / _chartOption); + _cadenceAvgCount = 0; + } } } + function updateCadenceHistory(newCadence as Float) as Void { + _cadenceHistory[_cadenceIndex] = newCadence; + // Add to circular buffer + _cadenceIndex = (_cadenceIndex + 1) % MAX_BARS; + if (_cadenceCount < MAX_BARS) { _cadenceCount++; } + } + function idealCadenceCalculator() as Void { var referenceCadence = 0; var finalCadence = 0; diff --git a/source/Views/AdvancedView.mc b/source/Views/AdvancedView.mc index 483650e..17302a7 100644 --- a/source/Views/AdvancedView.mc +++ b/source/Views/AdvancedView.mc @@ -6,7 +6,7 @@ import Toybox.Timer; import Toybox.System; class AdvancedView extends WatchUi.View { - const MAX_BARS = 147; + const MAX_BARS = 280; const MAX_CADENCE_DISPLAY = 200; private var _simulationTimer; @@ -99,13 +99,9 @@ class AdvancedView extends WatchUi.View { var cadenceY = height * 0.8; if (info != null && info.currentCadence != null) { - // Draw "CADENCE" label (light gray RGB: 170,170,170 = 0xAAAAAA) - dc.setColor(0xAAAAAA, Graphics.COLOR_TRANSPARENT); - dc.drawText(width / 2, cadenceY, Graphics.FONT_XTINY, "CADENCE", Graphics.TEXT_JUSTIFY_CENTER); - // Draw cadence value in green (RGB: 0,255,0 = 0x00FF00) correctColor(info.currentCadence, idealMinCadence, idealMaxCadence, dc); - dc.drawText(width / 2, cadenceY + 20, Graphics.FONT_XTINY, info.currentCadence.toString() + " spm", Graphics.TEXT_JUSTIFY_CENTER); + dc.drawText(width / 2, cadenceY + 20, Graphics.FONT_XTINY, info.currentCadence.toString() + " spm", Graphics.TEXT_JUSTIFY_CENTER); } drawChart(dc); @@ -147,10 +143,11 @@ class AdvancedView extends WatchUi.View { //additional line indicator var nLine = 3; - var line1x1 = chartLeft - margin * 0.25; + var lineLength = 6; + var line1x1 = chartLeft - lineLength; var line1x2 = chartLeft; var line2x1 = chartRight - 1; - var line2x2 = chartRight + margin * 0.25; + var line2x2 = chartRight + lineLength; var lineY = chartTop + quarterChartHeight; @@ -163,7 +160,6 @@ class AdvancedView extends WatchUi.View { lineY += quarterChartHeight; } - // Get data from app var app = getApp(); var idealMinCadence = app.getMinCadence(); @@ -188,7 +184,7 @@ class AdvancedView extends WatchUi.View { if(cadence == null) {cadence = 0;} //calculate bar height and position - var barHeight = (cadence / MAX_CADENCE_DISPLAY) * chartHeight; + var barHeight = ((cadence / MAX_CADENCE_DISPLAY) * chartHeight).toNumber(); var x = barZoneLeft + i * barWidth; var y = barZoneBottom - barHeight; @@ -196,19 +192,26 @@ class AdvancedView extends WatchUi.View { dc.fillRectangle(x, y, barWidth, barHeight); } } -} -function correctColor(cadence as Number, idealMinCadence as Number, idealMaxCadence as Number, dc as Dc) as Void{ - if(cadence <= idealMinCadence) - { - dc.setColor(0x0000FF, Graphics.COLOR_TRANSPARENT);//blue - } - else if (cadence >= idealMaxCadence) - { - dc.setColor(0xFF0000, Graphics.COLOR_TRANSPARENT);//red - } - else - { - dc.setColor(0x00FF00, Graphics.COLOR_TRANSPARENT);//green + function correctColor(cadence as Number, idealMinCadence as Number, idealMaxCadence as Number, dc as Dc) as Void{ + var yellowThreshold = idealMaxCadence + 20; + + if(cadence <= idealMinCadence) + { + dc.setColor(0x38b6ff, Graphics.COLOR_TRANSPARENT);//blue + } + else if (cadence >= idealMaxCadence && cadence < yellowThreshold) + { + dc.setColor(0xff751f, Graphics.COLOR_TRANSPARENT);//orange + } + else if (cadence >= yellowThreshold) + { + dc.setColor(0xFF0000, Graphics.COLOR_TRANSPARENT);//red + } + else + { + dc.setColor(0x00FF00, Graphics.COLOR_TRANSPARENT);//green + } } -} \ No newline at end of file +} + From 89e4d2e33a044e79ac88ce1f83721f7b6911ef30 Mon Sep 17 00:00:00 2001 From: kyledo Date: Fri, 16 Jan 2026 16:39:01 +1100 Subject: [PATCH 06/10] Update GarminApp.mc --- source/GarminApp.mc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index 8d6a38d..9855756 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -10,6 +10,11 @@ class GarminApp extends Application.AppBase { var globalTimer; + enum{ + barChart, + lineChart + } + enum { //each chart corresponds to a difference bar duration average FifteenminChart = 3, ThirtyminChart = 6, @@ -34,7 +39,7 @@ class GarminApp extends Application.AppBase { private var _userSpeed = 3.8;//>>m/s private var _experienceLvl = Beginner; private var _userGender = Male; - private var _chartOption = TwoHourChart; + private var _chartDuration = TwoHourChart; private var _idealMinCadence = 80; private var _idealMaxCadence = 100; @@ -43,7 +48,7 @@ class GarminApp extends Application.AppBase { private var _cadenceIndex = 0; private var _cadenceCount = 0; - private var _cadenceBarAvg as Array = new [_chartOption]; // Store data points for display + private var _cadenceBarAvg as Array = new [_chartDuration]; // Store data points for display private var _cadenceAvgIndex = 0; private var _cadenceAvgCount = 0; @@ -75,17 +80,17 @@ class GarminApp extends Application.AppBase { var newCadence = info.currentCadence; _cadenceBarAvg[_cadenceAvgIndex] = newCadence.toFloat(); // Add to circular buffer - _cadenceAvgIndex = (_cadenceAvgIndex + 1) % _chartOption; - if (_cadenceAvgCount < _chartOption) { + _cadenceAvgIndex = (_cadenceAvgIndex + 1) % _chartDuration; + if (_cadenceAvgCount < _chartDuration) { _cadenceAvgCount++; } else //calculate avg { var barAvg = 0.0; - for(var i = 0; i < _chartOption; i++){ + for(var i = 0; i < _chartDuration; i++){ barAvg += _cadenceBarAvg[i]; } - updateCadenceHistory(barAvg / _chartOption); + updateCadenceHistory(barAvg / _chartDuration); _cadenceAvgCount = 0; } } From b467d478eed157c18afbe068ac289860ee07dbf9 Mon Sep 17 00:00:00 2001 From: kyledo Date: Sun, 18 Jan 2026 16:05:05 +1100 Subject: [PATCH 07/10] Duration display Watch UI now displays the duration option the user had chosen --- source/GarminApp.mc | 5 +++++ source/Views/AdvancedView.mc | 39 +++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index 9855756..e7d750b 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -39,6 +39,7 @@ class GarminApp extends Application.AppBase { private var _userSpeed = 3.8;//>>m/s private var _experienceLvl = Beginner; private var _userGender = Male; + private var _chartType = barChart; private var _chartDuration = TwoHourChart; private var _idealMinCadence = 80; @@ -164,6 +165,10 @@ class GarminApp extends Application.AppBase { _idealMaxCadence = value; } + function getChartDuration() as Number{ + return _chartDuration; + } + function getUserGender() as String { return _userGender; } diff --git a/source/Views/AdvancedView.mc b/source/Views/AdvancedView.mc index 17302a7..1d4bafb 100644 --- a/source/Views/AdvancedView.mc +++ b/source/Views/AdvancedView.mc @@ -85,8 +85,10 @@ class AdvancedView extends WatchUi.View { } //draw ideal cadence range + var idealMinCadence = app.getMinCadence(); var idealMaxCadence = app.getMaxCadence(); + /* var idealCadenceY = height * 0.37; @@ -94,9 +96,11 @@ class AdvancedView extends WatchUi.View { var displayString = (idealMinCadence + " - " + idealMaxCadence).toString(); dc.setColor(0xAAAAAA, Graphics.COLOR_TRANSPARENT); dc.drawText(width / 2,idealCadenceY , Graphics.FONT_XTINY, displayString, Graphics.TEXT_JUSTIFY_CENTER); - } + }*/ - var cadenceY = height * 0.8; + var cadenceY = height * 0.37; + var chartDurationDisplay = null; + var chartDurationY = height * 0.85; if (info != null && info.currentCadence != null) { // Draw cadence value in green (RGB: 0,255,0 = 0x00FF00) @@ -105,6 +109,12 @@ class AdvancedView extends WatchUi.View { } drawChart(dc); + + var string = displayChartDuration(dc, app.getChartDuration()); + + dc.setColor(0x969696, Graphics.COLOR_TRANSPARENT); + dc.drawText(width / 2, chartDurationY, Graphics.FONT_XTINY, "Last " + string, Graphics.TEXT_JUSTIFY_CENTER); + } @@ -213,5 +223,28 @@ class AdvancedView extends WatchUi.View { dc.setColor(0x00FF00, Graphics.COLOR_TRANSPARENT);//green } } -} + function displayChartDuration(dc as Dc, chartDuration as Number) as String { + var string = null; + + switch (chartDuration) { + case 3: + string = "15 Minutes"; + break; + + case 6: + string = "30 Minutes"; + break; + + case 13: + string = "1 Hour"; + break; + + case 26: + string = "2 Hours"; + break; + } + + return string; + } +} \ No newline at end of file From a5ff0685512ceec0f30cdf1fcad37f071c40a105 Mon Sep 17 00:00:00 2001 From: kyledo Date: Sun, 18 Jan 2026 16:56:59 +1100 Subject: [PATCH 08/10] minor change --- source/GarminApp.mc | 23 ++++++++++++----------- source/Views/AdvancedView.mc | 36 ++++++------------------------------ 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index e7d750b..b447370 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -10,18 +10,20 @@ class GarminApp extends Application.AppBase { var globalTimer; - enum{ - barChart, - lineChart - } - - enum { //each chart corresponds to a difference bar duration average + enum { //each chart corresponds to a difference bar duration average (in seconds) FifteenminChart = 3, ThirtyminChart = 6, OneHourChart = 13, TwoHourChart = 26 } + const CHART_ENUM_NAMES = { + FifteenminChart => "15 Minutes", + ThirtyminChart => "30 Minutes", + OneHourChart => "1 Hour", + TwoHourChart => "2 Hours" + }; + enum { Beginner = 1.06, Intermediate = 1.04, @@ -39,8 +41,7 @@ class GarminApp extends Application.AppBase { private var _userSpeed = 3.8;//>>m/s private var _experienceLvl = Beginner; private var _userGender = Male; - private var _chartType = barChart; - private var _chartDuration = TwoHourChart; + private var _chartDuration = ThirtyminChart; private var _idealMinCadence = 80; private var _idealMaxCadence = 100; @@ -165,10 +166,10 @@ class GarminApp extends Application.AppBase { _idealMaxCadence = value; } - function getChartDuration() as Number{ - return _chartDuration; + function getChartDuration() as String{ + return CHART_ENUM_NAMES[_chartDuration]; } - + function getUserGender() as String { return _userGender; } diff --git a/source/Views/AdvancedView.mc b/source/Views/AdvancedView.mc index 1d4bafb..f837e55 100644 --- a/source/Views/AdvancedView.mc +++ b/source/Views/AdvancedView.mc @@ -110,7 +110,7 @@ class AdvancedView extends WatchUi.View { drawChart(dc); - var string = displayChartDuration(dc, app.getChartDuration()); + var string = app.getChartDuration(); dc.setColor(0x969696, Graphics.COLOR_TRANSPARENT); dc.drawText(width / 2, chartDurationY, Graphics.FONT_XTINY, "Last " + string, Graphics.TEXT_JUSTIFY_CENTER); @@ -179,20 +179,18 @@ class AdvancedView extends WatchUi.View { var cadenceCount = app.getCadenceCount(); //check array ?null if(cadenceCount == 0) {return;} - - // Calculate bar width + var numBars = cadenceCount; - if(numBars == 0) { return; } var barWidth = (barZoneWidth / MAX_BARS).toNumber(); var startIndex = (cadenceIndex - numBars + MAX_BARS) % MAX_BARS; - + // Draw bars for (var i = 0; i < numBars; i++) { var index = (startIndex + i) % MAX_BARS; // Start from oldest data var cadence = cadenceHistory[index]; if(cadence == null) {cadence = 0;} - + //calculate bar height and position var barHeight = ((cadence / MAX_CADENCE_DISPLAY) * chartHeight).toNumber(); var x = barZoneLeft + i * barWidth; @@ -201,6 +199,8 @@ class AdvancedView extends WatchUi.View { correctColor(cadence, idealMinCadence, idealMaxCadence, dc); dc.fillRectangle(x, y, barWidth, barHeight); } + + } function correctColor(cadence as Number, idealMinCadence as Number, idealMaxCadence as Number, dc as Dc) as Void{ @@ -223,28 +223,4 @@ class AdvancedView extends WatchUi.View { dc.setColor(0x00FF00, Graphics.COLOR_TRANSPARENT);//green } } - - function displayChartDuration(dc as Dc, chartDuration as Number) as String { - var string = null; - - switch (chartDuration) { - case 3: - string = "15 Minutes"; - break; - - case 6: - string = "30 Minutes"; - break; - - case 13: - string = "1 Hour"; - break; - - case 26: - string = "2 Hours"; - break; - } - - return string; - } } \ No newline at end of file From ef3d5de73807b04ea9d3b5daf02396d1e3caf9ec Mon Sep 17 00:00:00 2001 From: kyledo Date: Sun, 18 Jan 2026 21:42:50 +1100 Subject: [PATCH 09/10] Update GarminApp.mc --- source/GarminApp.mc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index b447370..73f8071 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -145,6 +145,14 @@ class GarminApp extends Application.AppBase { function getMaxCadence() as Number { return _idealMaxCadence; } + + function setMinCadence(value as Number) as Void { + _idealMinCadence = value; + } + + function setMaxCadence(value as Number) as Void { + _idealMaxCadence = value; + } function getCadenceHistory() as Array { return _cadenceHistory; @@ -158,14 +166,6 @@ class GarminApp extends Application.AppBase { return _cadenceCount; } - function setMinCadence(value as Number) as Void { - _idealMinCadence = value; - } - - function setMaxCadence(value as Number) as Void { - _idealMaxCadence = value; - } - function getChartDuration() as String{ return CHART_ENUM_NAMES[_chartDuration]; } From a382cca40fedf596e3cbcf960d959c92d92361c4 Mon Sep 17 00:00:00 2001 From: kyledo Date: Mon, 19 Jan 2026 16:16:16 +1100 Subject: [PATCH 10/10] minor change --- source/GarminApp.mc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/GarminApp.mc b/source/GarminApp.mc index 73f8071..d102fa4 100644 --- a/source/GarminApp.mc +++ b/source/GarminApp.mc @@ -169,6 +169,10 @@ class GarminApp extends Application.AppBase { function getChartDuration() as String{ return CHART_ENUM_NAMES[_chartDuration]; } + + function setChartDuration(value as String) as Void { + _chartDuration = value; + } function getUserGender() as String { return _userGender;