pushups: loops + jumping jacks + rest

master
frederic wagner 2024-01-22 10:40:21 +01:00
parent f0c7d311c7
commit 926b2ef04c
1 changed files with 63 additions and 12 deletions

View File

@ -2,7 +2,9 @@ let h = require("heatshrink");
Bangle.loadWidgets(); Bangle.loadWidgets();
const ACTIVITIES = ["pushups", "situps", "squats", "plank"]; //TODO: should we force not moving for planks and rests
const ACTIVITIES = ["pushups", "situps", "squats", "plank", "jacks", "rest"];
const IMAGES = [ const IMAGES = [
h.decompress( h.decompress(
atob( atob(
@ -23,6 +25,16 @@ const IMAGES = [
atob( atob(
"mEwwhC/AH4A/AH4A/AHkEolAC6lEAAIuVAAIwTC6nd7oXTCoIAB6AXPgVNCwYwCO5siCopIEFxUCkUtC44AMkQX/CowACUogXLQAIXHbAgAHV4QXFTwa7IbwdEoQWCEg4sIC4kgHhAtJC4RULAAJQBC4qZKE4oXENwYXPP5KGLFJgA/AH4A/AH4AUA==" "mEwwhC/AH4A/AH4A/AHkEolAC6lEAAIuVAAIwTC6nd7oXTCoIAB6AXPgVNCwYwCO5siCopIEFxUCkUtC44AMkQX/CowACUogXLQAIXHbAgAHV4QXFTwa7IbwdEoQWCEg4sIC4kgHhAtJC4RULAAJQBC4qZKE4oXENwYXPP5KGLFJgA/AH4A/AH4AUA=="
) )
),
h.decompress(
atob(
"mEwwhC/AFdEogWUggXBoAuVC7BIUC7RHPE4h3GAwKJPIwiVLBYQMHMgZNJBoY+EBBAYKoUikUkSaAXJSRxjBCwIXCeKMEC4UiCyIABC4bvTC/4AGhvdAAQXX6AXRCwYwSFwgwSCwoXQFwfQAgYXSGggwOFIowQCAQoEGB4nHD44XJBwxINEwRQOBo4MIJBouDmYACBQwAKgYWDAAMwa5wXCAoYXRADBIEIyQAGDJoWCCAgHHCxANIDBkDBawA/ADQA=="
)
),
h.decompress(
atob(
"mEwwhC/AH4AU1QAGC/4XXAAkKC6wWB0Au/F3KvPFw4XOLpAXOLpaBKRhgMBEZAKKHYYKKK5IjLC5alNC5BSOC5AuLe5guKABQuWd54XYgUiAAUgC7IAPC64ACC4IWUGIIu/F2a/va7QA/AH4AGA="
)
) )
]; ];
@ -42,16 +54,28 @@ const DETECTORS = [
return null; return null;
} }
}, },
null,
(xyz) => {
if ((xyz.x > 0) && (xyz.y < 0) && xyz.z < -0.25) {
return 0;
}
if ((xyz.x < 0) && (xyz.y > 0) && xyz.z > -0.25) {
return 1;
}
return null;
},
null null
]; ];
class FitnessStatus { class FitnessStatus {
constructor() { constructor(duration) {
this.routine = [ this.routine = [
[0, 10], [0, 10],
[1, 10], [1, 10],
[2, 10], [2, 10],
[3, 30] [3, 30],
[4, 10],
[5, 30],
]; ];
this.routine_step = 0; this.routine_step = 0;
this.current_status = 0; this.current_status = 0;
@ -60,11 +84,20 @@ class FitnessStatus {
this.counts_in_opposite_status = 0; this.counts_in_opposite_status = 0;
this.remaining = this.routine[this.routine_step][1]; this.remaining = this.routine[this.routine_step][1];
this.activity_start = getTime(); this.activity_start = getTime();
this.starting_time = this.activity_start;
this.duration = duration;
this.completed = false;
} }
display() { display() {
g.clear(); g.clear();
g.setColor(0, 0, 0); g.setColor(0, 0, 0);
if (this.completed) {
g.setFont("Vector:40")
.setFontAlign(0, 0)
.drawString("Good Job!", g.getWidth()/2, g.getHeight()/2);
return;
}
let activity = this.routine[this.routine_step][0]; let activity = this.routine[this.routine_step][0];
let countdown = this.remaining; let countdown = this.remaining;
if (DETECTORS[activity] === null) { if (DETECTORS[activity] === null) {
@ -72,18 +105,29 @@ class FitnessStatus {
} }
g.setFont("Vector:70") g.setFont("Vector:70")
.setFontAlign(0, 0) .setFontAlign(0, 0)
.drawString( .drawString("" + countdown, (g.getWidth() * 3) / 10, g.getHeight() / 2);
"" + countdown,
(g.getWidth() * 3) / 10,
g.getHeight() / 2
);
let activity_name = ACTIVITIES[activity]; let activity_name = ACTIVITIES[activity];
g.drawImage(IMAGES[activity], g.getWidth() / 2, (g.getHeight() * 1) / 5, { g.drawImage(IMAGES[activity], g.getWidth() / 2, (g.getHeight() * 1) / 5, {
scale: 2, scale: 2,
}); });
let global_countdown = "";
if (this.duration !== null) {
let elapsed = getTime() - this.starting_time;
let remaining = Math.max(0, this.duration - elapsed);
let seconds = Math.floor(remaining % 60);
let minutes = Math.floor(remaining / 60) % 60;
let hours = Math.floor(remaining / 3600);
if (hours > 0) {
global_countdown = " / " + hours + "h" + minutes +"m" + seconds + "s";
} else if (minutes > 0) {
global_countdown = " / " + minutes +"m" + seconds + "s";
} else {
global_countdown = " / " + seconds + "s";
}
}
g.setFont("6x8:2") g.setFont("6x8:2")
.setFontAlign(0, 1) .setFontAlign(0, 1)
.drawString(activity_name, g.getWidth() / 2, g.getHeight()); .drawString(activity_name+global_countdown, g.getWidth() / 2, g.getHeight());
Bangle.drawWidgets(); Bangle.drawWidgets();
g.flip(); g.flip();
} }
@ -98,9 +142,16 @@ class FitnessStatus {
next_activity() { next_activity() {
this.routine_step += 1; this.routine_step += 1;
if (this.routine_step >= this.routine.length) {
this.completed = (this.duration===null)?(this.routine_step >= this.routine_length):(getTime() - this.starting_time > this.duration);
if (this.completed) {
Bangle.buzz(1000).then(() => {
load(); load();
});
return;
} }
this.routine_step = this.routine_step % this.routine.length;
this.remaining = this.routine[this.routine_step][1]; this.remaining = this.routine[this.routine_step][1];
// this.display(); // this.display();
this.activity_start = getTime(); this.activity_start = getTime();
@ -159,7 +210,7 @@ class FitnessStatus {
} }
} }
let status = new FitnessStatus(); let status = new FitnessStatus(10 * 60);
// status.display(); // status.display();
Bangle.setPollInterval(80); Bangle.setPollInterval(80);