import Toybox.Activity; import Toybox.Graphics; import Toybox.Lang; import Toybox.UserProfile; import Toybox.WatchUi; // TODO remove import Toybox.System; class RepaFieldView extends WatchUi.DataField { hidden var hrValue as Numeric; 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(); hrValue = 0; 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 { var hrColor = Graphics.COLOR_BLACK; if (hrZones != null) { if (hr < hrZones[1]) { hrColor = Graphics.COLOR_LT_GRAY; } else if (hr < hrZones[2]) { hrColor = Graphics.COLOR_BLUE; } else if (hr < hrZones[3]) { hrColor = Graphics.COLOR_GREEN; } else if (hr < hrZones[4]) { hrColor = Graphics.COLOR_YELLOW; } else if (hr < hrZones[5]) { hrColor = Graphics.COLOR_ORANGE; } else { hrColor = Graphics.COLOR_RED; } } 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 { var obscurityFlags = DataField.getObscurityFlags(); // TODO ? // Top layout if (obscurityFlags == (OBSCURE_TOP | OBSCURE_LEFT | OBSCURE_RIGHT)) { View.setLayout(Rez.Layouts.TopLayout(dc)); // Bottom layout } else if (obscurityFlags == (OBSCURE_BOTTOM | OBSCURE_LEFT | OBSCURE_RIGHT)) { View.setLayout(Rez.Layouts.BottomLayout(dc)); // Use the generic, centered layout } else { View.setLayout(Rez.Layouts.MainLayout(dc)); } var label = View.findDrawableById("label") as Text; if (label != null) { label.setText(Rez.Strings.label); } } // The given info object contains all the current workout information. // Calculate a value and save it locally in this method. // Note that compute() and onUpdate() are asynchronous, and there is no // 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) { hrValue = info.currentHeartRate as Number; } else { hrValue = 0; } } if (info has :averageHeartRate) { if(info.averageHeartRate != null) { ahrValue = info.averageHeartRate as Number; } else { ahrValue = 0; } } 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 // once a second when the data field is visible. function onUpdate(dc as Dc) as Void { // Set the background color (View.findDrawableById("Background") as Background).setColor(getBackgroundColor()); // HR value var hrColor = calculateHRColor(hrValue); var hr = View.findDrawableById("hr") as Text; 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; 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; if (value != null) { if (getBackgroundColor() == Graphics.COLOR_BLACK) { value.setColor(Graphics.COLOR_WHITE); } else { value.setColor(Graphics.COLOR_BLACK); } value.setText(hrValue.format("%d")); } // Call parent's onUpdate(dc) to redraw the layout View.onUpdate(dc); } }