Skip to content

Instantly share code, notes, and snippets.

@fntneves
Last active August 13, 2017 18:35
Show Gist options
  • Save fntneves/0451011521bc76bed3bb to your computer and use it in GitHub Desktop.
Save fntneves/0451011521bc76bed3bb to your computer and use it in GitHub Desktop.
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