-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added interval alerts every 5min with short and fast blip vibration.
- Loading branch information
Showing
6 changed files
with
222 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
using Toybox.Graphics as Gfx; | ||
|
||
module IntervalAlertType { | ||
enum { | ||
OneOff = 1, | ||
Repeat = 2 | ||
} | ||
} | ||
|
||
class IntervalAlerts { | ||
private var mAlerts; | ||
|
||
function initialize() { | ||
me.reset(); | ||
} | ||
|
||
function addNew() { | ||
me.mAlerts.add(new Alert()); | ||
var newAlertIndex = me.mAlerts.size() - 1; | ||
return newAlertIndex; | ||
} | ||
|
||
function delete(index) { | ||
var alert = me.mAlerts[index]; | ||
me.mAlerts.remove(alert); | ||
} | ||
|
||
function reset() { | ||
me.mAlerts = []; | ||
} | ||
|
||
function get(index) { | ||
return me.mAlerts[index]; | ||
} | ||
|
||
function set(index, alert) { | ||
me.mAlerts[index] = alert; | ||
} | ||
|
||
function count() { | ||
return me.mAlerts.size(); | ||
} | ||
} | ||
|
||
class Alert { | ||
function initialize() { | ||
me.reset(); | ||
} | ||
|
||
function reset() { | ||
me.type = IntervalAlertType.Repeat; | ||
me.time = 60 * 5; | ||
me.color = Gfx.COLOR_YELLOW; | ||
me.vibePattern = VibePattern.Blip; | ||
} | ||
|
||
function getAlertArcPercentageTimes(sessionTime) { | ||
return me.getAlertPercentageTimes(sessionTime, ArcMaxRepeatExecutionsCount, ArcMinRepeatPercentageTime); | ||
} | ||
|
||
private function getAlertPercentageTimes(sessionTime, maxRepeatExecutionsCount, minRepeatPercentageTime) { | ||
if (sessionTime < 1 || me.time < 1) { | ||
return []; | ||
} | ||
var percentageTime = me.time.toDouble() / sessionTime.toDouble(); | ||
if (me.type == IntervalAlertType.OneOff) { | ||
return [percentageTime]; | ||
} | ||
else { | ||
var executionsCount = (sessionTime / me.time); | ||
if (executionsCount > maxRepeatExecutionsCount) { | ||
executionsCount = maxRepeatExecutionsCount; | ||
} | ||
if (percentageTime < minRepeatPercentageTime) { | ||
percentageTime = minRepeatPercentageTime; | ||
} | ||
var result = new [executionsCount]; | ||
for (var i = 0; i < executionsCount; i++) { | ||
result[i] = percentageTime * (i + 1); | ||
if (result[i] > 1.0) { | ||
result[i] = 1.0; | ||
} | ||
} | ||
return result; | ||
} | ||
} | ||
|
||
function getAlertProgressBarPercentageTimes(sessionTime) { | ||
return me.getAlertPercentageTimes(sessionTime, ProgressBarRepeatExecutionsCount, ProgressBarRepeatPercentageTime); | ||
} | ||
|
||
private const ProgressBarRepeatExecutionsCount = 20; | ||
private const ProgressBarRepeatPercentageTime = 0.05; | ||
|
||
private const ArcMaxRepeatExecutionsCount = 139; | ||
private const ArcMinRepeatPercentageTime = 0.0072; | ||
|
||
var type; | ||
var time;//in seconds | ||
var color; | ||
var vibePattern; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
using Toybox.Graphics as Gfx; | ||
using Toybox.Lang; | ||
|
||
class IntervalAlertsRenderer { | ||
function initialize(sessionTime, repeatIntervalAlerts, radius, width) { | ||
me.mSessionTime = sessionTime; | ||
me.mRepeatIntervalAlerts = repeatIntervalAlerts; | ||
me.mRadius = radius; | ||
me.mWidth = width; | ||
me.mRepeatPercentageTimes = me.createPercentageTimes(repeatIntervalAlerts); | ||
} | ||
|
||
private var mSessionTime; | ||
private var mRepeatIntervalAlerts; | ||
private var mRadius; | ||
private var mWidth; | ||
private var mRepeatPercentageTimes; | ||
private const StartDegreeOffset = 90; | ||
|
||
function drawRepeatIntervalAlerts(dc) { | ||
me.drawIntervalAlerts(dc, me.mRepeatIntervalAlerts, me.mRepeatPercentageTimes); | ||
} | ||
|
||
private function createPercentageTimes(intervalAlerts) { | ||
if (intervalAlerts.size() == 0) { | ||
return []; | ||
} | ||
var resultPercentageTimes = new [intervalAlerts.size()]; | ||
for (var i = 0; i < intervalAlerts.size(); i++) { | ||
var intervalAlert = intervalAlerts[i]; | ||
resultPercentageTimes[i] = intervalAlert.getAlertArcPercentageTimes(me.mSessionTime); | ||
} | ||
return resultPercentageTimes; | ||
} | ||
|
||
private function drawIntervalAlerts(dc, intervalAlerts, percentageTimes) { | ||
for (var i = 0; i < intervalAlerts.size(); i++) { | ||
for (var pIndex = 0; pIndex < percentageTimes[i].size(); pIndex++) { | ||
me.drawIntervalAlert(dc, percentageTimes[i][pIndex], intervalAlerts[i].color); | ||
} | ||
} | ||
} | ||
|
||
private function getAlertProgressPercentage(percentageTime) { | ||
var progressPercentage = percentageTime * 100; | ||
if (progressPercentage > 100) { | ||
progressPercentage = 100; | ||
} | ||
else { | ||
if (progressPercentage == 0) { | ||
progressPercentage = 0.05; | ||
} | ||
} | ||
return progressPercentage; | ||
} | ||
|
||
private function drawIntervalAlert(dc, intervalAlertTime, color) { | ||
var progressPercentage = me.getAlertProgressPercentage(intervalAlertTime); | ||
dc.setColor(color, Gfx.COLOR_TRANSPARENT); | ||
|
||
// Because 235 screen is not totally round we need this hack | ||
if (progressPercentage == 0 || progressPercentage == 50) { | ||
dc.setPenWidth(me.mWidth + 38); | ||
} else { | ||
dc.setPenWidth(me.mWidth); | ||
} | ||
var startDegree = percentageToArcDegree(progressPercentage); | ||
var endDegree = startDegree - 1.2; | ||
dc.drawArc(dc.getWidth() / 2, dc.getHeight() / 2, me.mRadius , Gfx.ARC_CLOCKWISE, startDegree, endDegree); | ||
} | ||
|
||
private static function percentageToArcDegree(percentage) { | ||
return StartDegreeOffset - percentage * 3.6; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters