Last active
August 13, 2017 18:35
-
-
Save fntneves/0451011521bc76bed3bb to your computer and use it in GitHub Desktop.
This file contains hidden or 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
var activities = { | |
resting: { bpm: 70 }, | |
walking: { bpm: 90 }, | |
running: { bpm: 150 }, | |
}; | |
var activityStatus = { | |
previousActivity: activities.resting, | |
activity: activities.resting, | |
inTransition: false, | |
upDirectionTransition: false, | |
currentTInterval: 0, | |
}; | |
var interval = 500, | |
secondsUntilBpmMax = 30, | |
bpmOutputDelta = 2, | |
tInterval = 0.15; | |
function getHeartRate(iteration, symetric) { | |
t = tInterval * iteration; | |
var b0 = 0.13, | |
b1 = 0.49, | |
b2 = 0.60, | |
b3 = 0.90; | |
var p1 = Math.pow(1 - t, 3) * b0, | |
p2 = 3 * t * Math.pow(1 - t, 2) * b1, | |
p3 = 3 * Math.pow(t, 2) * (1 - t) * b2, | |
p4 = Math.pow(t, 3) * b3; | |
var result = (p1 + p2 + p3 + p4); | |
return symetric ? -result : result; | |
} | |
function setActivity(activity) { | |
activityStatus.previousActivity = activityStatus.activity; | |
switch(activity) { | |
case 'resting': | |
activityStatus.activity = activities.resting; | |
break; | |
case 'walking': | |
activityStatus.activity = activities.walking; | |
break; | |
case 'running': | |
activityStatus.activity = activities.running; | |
break; | |
} | |
if(activityStatus.previousActivity.bpm > activityStatus.activity.bpm) | |
startTransitionInUpDirection(false); | |
else if(activityStatus.previousActivity.bpm < activityStatus.activity.bpm) | |
startTransitionInUpDirection(true); | |
} | |
function startTransitionInUpDirection(upDirection) { | |
activityStatus.inTransition = true; | |
activityStatus.upDirectionTransition = upDirection; | |
activityStatus.currentTInterval = 0; | |
} | |
function enterConstantActivity() { | |
activityStatus.inTransition = false; | |
} | |
function startHeartRate() { | |
setTimeout(function() | |
{ | |
bpmDelta = 0; | |
// Calculate bpm delta according to bpm in resting activity | |
if(activityStatus.inTransition) { | |
bpmDelta = getHeartRate(activityStatus.currentTInterval, !activityStatus.upDirectionTransition); | |
activityStatus.currentTInterval++; | |
if(activityStatus.upDirectionTransition && (bpmDelta + activityStatus.previousActivity.bpm) > activityStatus.activity.bpm) | |
{ | |
console.log('bpmDelta: ' + bpmDelta); | |
console.log('prev: ' + activityStatus.previousActivity.bpm); | |
console.log('act: ' + activityStatus.activity.bpm); | |
bpmDelta = activityStatus.activity.bpm - activityStatus.previousActivity.bpm; | |
enterConstantActivity(); | |
} | |
else if(!activityStatus.upDirectionTransition && (activityStatus.previousActivity.bpm + bpmDelta) <= activityStatus.activity.bpm) | |
{ | |
console.log('bpmDelta: ' + bpmDelta); | |
console.log('prev: ' + activityStatus.previousActivity.bpm); | |
console.log('act: ' + activityStatus.activity.bpm); | |
enterConstantActivity(); | |
} | |
} | |
else | |
bpmDelta = activityStatus.activity.bpm - activityStatus.previousActivity.bpm; | |
var range = Math.random() * 2; | |
var delta = Math.random() >= 0.5 ? -range : range; | |
var finalBpm = Math.floor(activityStatus.previousActivity.bpm + bpmDelta + delta); | |
console.log(finalBpm); | |
startHeartRate(); | |
}, interval); | |
} | |
startHeartRate(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment