diff --git a/resources/layouts/layouts.xml b/resources/layouts/layouts.xml
index b620a0a..52af035 100755
--- a/resources/layouts/layouts.xml
+++ b/resources/layouts/layouts.xml
@@ -5,7 +5,7 @@
64
-
+
diff --git a/source/RepaFieldStamina.mc b/source/RepaFieldStamina.mc
index 6fab78a..c218689 100644
--- a/source/RepaFieldStamina.mc
+++ b/source/RepaFieldStamina.mc
@@ -2,6 +2,8 @@ import Toybox.Application;
import Toybox.Graphics;
import Toybox.WatchUi;
+// TODO: stamina not supported yet in the API
+
class Stamina extends WatchUi.Drawable {
function initialize() {
diff --git a/source/RepaFieldTrack.mc b/source/RepaFieldTrack.mc
index 3ab8e20..8786165 100644
--- a/source/RepaFieldTrack.mc
+++ b/source/RepaFieldTrack.mc
@@ -1,18 +1,76 @@
import Toybox.Application;
import Toybox.Graphics;
import Toybox.WatchUi;
+import Toybox.Lang;
class Track extends WatchUi.Drawable {
+ hidden var _toDestination as Float;
+ hidden var _distance as Float;
+ hidden var _offCourse as Float;
+
function initialize() {
var dictionary = {
:identifier => "Track"
};
Drawable.initialize(dictionary);
+
+ _toDestination = 0.0f;
+ _distance = 0.0f;
+ _offCourse = 0.0f;
+ }
+
+ function setToDestination(tdst as Float) as Void {
+ _toDestination = tdst;
+ }
+
+ function setDistance(dst as Float) as Void {
+ _distance = dst;
+ }
+
+ function setOffCourse(off as Float) as Void {
+ _offCourse = off;
}
function draw(dc as Dc) as Void {
- dc.setColor(0xFF8800, Graphics.COLOR_TRANSPARENT);
+ if (_toDestination == 0.0f) {
+ return;
+ }
+
+ var trackPercentage = _distance / (_distance + _toDestination);
+ if (trackPercentage > 1.0f) {
+ trackPercentage = 1.0f;
+ }
+
+ // draw
+ var w = dc.getWidth();
+ var h = dc.getHeight();
+ var astart = 150;
+ var aend = 390;
+ dc.setPenWidth(4);
+ dc.setColor(0x555555, Graphics.COLOR_TRANSPARENT);
+ dc.drawArc(w / 2, h / 2, w / 2 - 2, Graphics.ARC_COUNTER_CLOCKWISE, astart, aend);
+
+ if (trackPercentage <= 0.0f) {
+ return;
+ }
+
+ // color
+ if (_offCourse > 50.0f) {
+ dc.setColor(0xFF0000, Graphics.COLOR_TRANSPARENT);
+ } else if (trackPercentage < 0.2) {
+ dc.setColor(0xFFFF00, Graphics.COLOR_TRANSPARENT);
+ } else if (trackPercentage < 0.4) {
+ dc.setColor(0xAAFF00, Graphics.COLOR_TRANSPARENT);
+ } else if (trackPercentage < 0.6) {
+ dc.setColor(0x88FF00, Graphics.COLOR_TRANSPARENT);
+ } else if (trackPercentage < 0.8) {
+ dc.setColor(0x44FF00, Graphics.COLOR_TRANSPARENT);
+ } else {
+ dc.setColor(0x00FF00, Graphics.COLOR_TRANSPARENT);
+ }
+
+ dc.drawArc(w / 2, h / 2, w / 2 - 2, Graphics.ARC_COUNTER_CLOCKWISE, astart, astart + (aend-astart) * trackPercentage);
}
}
diff --git a/source/RepaFieldView.mc b/source/RepaFieldView.mc
index 84e4c9f..cd0b872 100644
--- a/source/RepaFieldView.mc
+++ b/source/RepaFieldView.mc
@@ -3,6 +3,8 @@ import Toybox.Graphics;
import Toybox.Lang;
import Toybox.UserProfile;
import Toybox.WatchUi;
+// TODO remove
+import Toybox.System;
class RepaFieldView extends WatchUi.DataField {
@@ -10,6 +12,9 @@ class RepaFieldView extends WatchUi.DataField {
hidden var ahrValue as Numeric;
hidden var mhrValue as Numeric;
hidden var hrZones as Array;
+ hidden var toDestination as Float;
+ hidden var distance as Float;
+ hidden var offCourse as Float;
function initialize() {
DataField.initialize();
@@ -17,6 +22,9 @@ class RepaFieldView extends WatchUi.DataField {
ahrValue = 0;
mhrValue = 0;
hrZones = UserProfile.getHeartRateZones(UserProfile.getCurrentSport());
+ toDestination = 0.0f;
+ distance = 0.0f;
+ offCourse = 0.0f;
}
function calculateHRColor(hr as Numeric) as Numeric {
@@ -39,6 +47,16 @@ class RepaFieldView extends WatchUi.DataField {
return hrColor;
}
+ function darken(color as Numeric) as Numeric {
+ var r = (color >> 16) & 0xFF;
+ var g = (color >> 8) & 0xFF;
+ var b = color & 0xFF;
+ r = r * 0.5f;
+ g = g * 0.5f;
+ b = b * 0.5f;
+ return (r.toLong() << 16) | (g.toLong() << 8) | b.toLong();
+ }
+
// Set your layout here. Anytime the size of obscurity of
// the draw context is changed this will be called.
function onLayout(dc as Dc) as Void {
@@ -70,27 +88,48 @@ class RepaFieldView extends WatchUi.DataField {
// guarantee that compute() will be called before onUpdate().
function compute(info as Activity.Info) as Void {
// See Activity.Info in the documentation for available information.
- if (info has :currentHeartRate){
- if(info.currentHeartRate != null){
+ if (info has :currentHeartRate) {
+ if(info.currentHeartRate != null) {
hrValue = info.currentHeartRate as Number;
} else {
hrValue = 0;
}
}
- if (info has :averageHeartRate){
- if(info.averageHeartRate != null){
+ if (info has :averageHeartRate) {
+ if(info.averageHeartRate != null) {
ahrValue = info.averageHeartRate as Number;
} else {
ahrValue = 0;
}
}
- if (info has :maxHeartRate){
- if(info.maxHeartRate != null){
+ if (info has :maxHeartRate) {
+ if(info.maxHeartRate != null) {
mhrValue = info.maxHeartRate as Number;
} else {
mhrValue = 0;
}
}
+ if (info has :elapsedDistance) {
+ if (info.elapsedDistance != null) {
+ distance = info.elapsedDistance as Float;
+ } else {
+ distance = 0.0f;
+ }
+ }
+ if (info has :distanceToDestination) {
+ if (info.distanceToDestination != null) {
+ toDestination = info.distanceToDestination as Float;
+ } else {
+ toDestination = 0.0f;
+ }
+ }
+ if (info has :offCourseDistance) {
+ if (info.offCourseDistance != null) {
+ offCourse = info.offCourseDistance as Float;
+ } else {
+ offCourse = 0.0f;
+ }
+ }
}
// Display the value you computed here. This will be called
@@ -102,16 +141,28 @@ class RepaFieldView extends WatchUi.DataField {
// HR value
var hrColor = calculateHRColor(hrValue);
var hr = View.findDrawableById("hr") as Text;
- hr.setColor(hrColor);
+ hr.setColor(calculateHRColor(hrValue));
hr.setText(hrValue.format("%d"));
var ahr = View.findDrawableById("ahr") as Text;
+ ahr.setColor(darken(calculateHRColor(ahrValue)));
ahr.setText(ahrValue.format("%d"));
var mhr = View.findDrawableById("mhr") as Text;
+ mhr.setColor(darken(calculateHRColor(mhrValue)));
mhr.setText(mhrValue.format("%d"));
var hrGraph = View.findDrawableById("HeartRate") as HeartRate;
- hrGraph.setHRColor(hrColor);
- hrGraph.setHRZones(hrZones);
- hrGraph.setHRValue(hrValue);
+ if (hrGraph != null) {
+ hrGraph.setHRColor(hrColor);
+ hrGraph.setHRZones(hrZones);
+ hrGraph.setHRValue(hrValue);
+ }
+
+ // track
+ var track = View.findDrawableById("Track") as Track;
+ if (track != null) {
+ track.setToDestination(toDestination);
+ track.setDistance(distance);
+ track.setOffCourse(offCourse);
+ }
// Set the foreground color and value
var value = View.findDrawableById("value") as Text;