BangleApps/apps/widpedom/widget.js

145 lines
4.5 KiB
JavaScript
Raw Permalink Normal View History

(() => {
// Last time Bangle.on('step' was called
let lastUpdate = new Date();
// Last step count when Bangle.on('step' was called
var lastStepCount;
let stp_today = 0;
let settings;
function loadSettings() {
const d = require('Storage').readJSON("wpedom.json", 1) || {};
settings = Object.assign({
2021-06-22 08:36:57 +00:00
'goal': 10000,
'progress': false,
'large': false,
'hide': false
}, d.settings || {});
return d;
}
Bangle.on('step', stepCount => {
var steps = stepCount-lastStepCount;
if (lastStepCount===undefined || steps<0) steps=1;
lastStepCount = stepCount;
let date = new Date();
if (lastUpdate.getDate() == date.getDate()){
stp_today += steps;
} else {
// TODO: could save this to "wpedom.json" for lastUpdate's day?
stp_today = steps;
}
if (stp_today === settings.goal
2021-03-20 18:24:45 +00:00
&& !(require('Storage').readJSON('setting.json',1)||{}).quiet) {
let b = 3, buzz = () => {
if (b--) Bangle.buzz().then(() => setTimeout(buzz, 100))
}
buzz()
}
lastUpdate = date
//console.log("up: " + up + " stp: " + stp_today + " " + date.toString());
WIDGETS["wpedom"].redraw();
});
// redraw when the LCD turns on
Bangle.on('lcdPower', function(on) {
if (on) WIDGETS["wpedom"].redraw();
});
// When unloading, save state
E.on('kill', () => {
require("Storage").writeJSON("wpedom.json",{
lastUpdate : lastUpdate.valueOf(),
stepsToday : stp_today,
settings : settings,
});
});
// add your widget
WIDGETS["wpedom"]={area:"tl",width:0,
getWidth:function() {
let stps = stp_today.toString();
let newWidth = 24;
if (settings.hide)
newWidth = 0;
else {
if (settings.large) {
newWidth = 12 * stps.length + 3;
if (settings.progress)
newWidth += 24;
}
}
return newWidth;
},
redraw:function() { // work out the width, and queue a full redraw if needed
let newWidth = this.getWidth();
if (newWidth!=this.width) {
// width has changed, re-layout all widgets
this.width = newWidth;
Bangle.drawWidgets();
} else {
// width not changed - just redraw
WIDGETS["wpedom"].draw();
}
},
draw:function() {
if (settings.hide) return;
if (stp_today > 99999)
stp_today = stp_today % 100000; // cap to five digits + comma = 6 characters
let stps = stp_today.toString();
g.reset().clearRect(this.x, this.y, this.x + this.width, this.y + 23); // erase background
if (settings.progress) {
const width = 23, half = 11;
const goal = settings.goal, left = Math.max(goal-stps,0);
// blue or dark green
g.setColor(left ? "#08f" : "#080").fillCircle(this.x + half, this.y + half, half);
if (left) {
const TAU = Math.PI*2;
const f = left/goal; // fraction to blank out
let p = [];
p.push(half,half);
p.push(half,0);
if(f>1/8) p.push(0,0);
if(f>2/8) p.push(0,half);
if(f>3/8) p.push(0,width);
if(f>4/8) p.push(half,width);
if(f>5/8) p.push(width,width);
if(f>6/8) p.push(width,half);
if(f>7/8) p.push(width,0);
p.push(half - Math.sin(f * TAU) * half);
p.push(half - Math.cos(f * TAU) * half);
g.setColor(g.theme.bg).fillPoly(g.transformVertices(p,{x:this.x,y:this.y}));
}
g.reset();
}
if (settings.large) {
g.setFont("6x8",2);
g.setFontAlign(-1, 0);
g.drawString(stps, this.x + (settings.progress?28:4), this.y + 12);
} else {
let w = 24;
if (stps.length > 3){
stps = stps.slice(0,-3) + "," + stps.slice(-3);
g.setFont("4x6", 1); // if big, shrink text to fix
} else {
g.setFont("6x8", 1);
}
g.setFontAlign(0, 0); // align to x: center, y: center
g.drawString(stps, this.x+w/2, this.y+19);
g.drawImage(atob("CgoCLguH9f2/7+v6/79f56CtAAAD9fw/n8Hx9A=="),this.x+(w-10)/2,this.y+2);
}
},
reload:function() {
loadSettings();
WIDGETS["wpedom"].redraw();
},
getSteps:()=>stp_today
};
// Load data at startup
let pedomData = loadSettings();
if (pedomData) {
if (pedomData.lastUpdate)
lastUpdate = new Date(pedomData.lastUpdate);
stp_today = pedomData.stepsToday|0;
2021-06-22 08:36:57 +00:00
delete pedomData;
}
WIDGETS["wpedom"].width = WIDGETS["wpedom"].getWidth();
})()