mirror of https://github.com/espruino/BangleApps
widalarmeta version 0.02
Change font to 5x9 7 segment-style Add settings page Add option to show secondspull/2532/head
parent
9131d4923e
commit
134f258d39
|
@ -0,0 +1,4 @@
|
||||||
|
0.01: New App!
|
||||||
|
0.02: Change font to 5x9 7 segment-style
|
||||||
|
Add settings page
|
||||||
|
Add option to show seconds
|
|
@ -2,8 +2,8 @@
|
||||||
"id": "widalarmeta",
|
"id": "widalarmeta",
|
||||||
"name": "Alarm & Timer ETA",
|
"name": "Alarm & Timer ETA",
|
||||||
"shortName": "Alarm ETA",
|
"shortName": "Alarm ETA",
|
||||||
"version": "0.01",
|
"version": "0.02",
|
||||||
"description": "A widget that displays the time to the next Alarm or Timer in hours and minutes, maximum 24h",
|
"description": "A widget that displays the time to the next Alarm or Timer in hours and minutes, maximum 24h (configurable).",
|
||||||
"icon": "widget.png",
|
"icon": "widget.png",
|
||||||
"type": "widget",
|
"type": "widget",
|
||||||
"tags": "widget",
|
"tags": "widget",
|
||||||
|
@ -11,6 +11,8 @@
|
||||||
"provides_widgets" : ["alarm"],
|
"provides_widgets" : ["alarm"],
|
||||||
"screenshots" : [ { "url":"screenshot.png" } ],
|
"screenshots" : [ { "url":"screenshot.png" } ],
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"widalarmeta.wid.js","url":"widget.js"}
|
{"name":"widalarmeta.wid.js","url":"widget.js"},
|
||||||
]
|
{"name":"widalarmeta.settings.js","url":"settings.js"}
|
||||||
|
],
|
||||||
|
"data": [{"name":"widalarmeta.json"}]
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.2 KiB |
|
@ -0,0 +1,45 @@
|
||||||
|
(function(back) {
|
||||||
|
const CONFIGFILE = "widalarmeta.json";
|
||||||
|
// Load settings
|
||||||
|
const settings = Object.assign({
|
||||||
|
maxhours: 24,
|
||||||
|
drawBell: false,
|
||||||
|
showSeconds: 0, // 0=never, 1=only when display is unlocked, 2=for less than a minute
|
||||||
|
}, require("Storage").readJSON(CONFIGFILE,1) || {});
|
||||||
|
|
||||||
|
function writeSettings() {
|
||||||
|
require('Storage').writeJSON(CONFIGFILE, settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the menu
|
||||||
|
E.showMenu({
|
||||||
|
"" : { "title" : "Alarm & Timer ETA" },
|
||||||
|
"< Back" : () => back(),
|
||||||
|
/*LANG*/'Maximum hours': {
|
||||||
|
format: v => v === 0 ? /*LANG*/'disabled' : v,
|
||||||
|
value: settings.maxhours,
|
||||||
|
min: 0, max: 24,
|
||||||
|
onchange: v => {
|
||||||
|
settings.maxhours = v;
|
||||||
|
writeSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*LANG*/'Draw bell': {
|
||||||
|
value: !!settings.drawBell,
|
||||||
|
format: v => v?/*LANG*/"Yes":/*LANG*/"No",
|
||||||
|
onchange: v => {
|
||||||
|
settings.drawBell = v;
|
||||||
|
writeSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*LANG*/'Show seconds': {
|
||||||
|
value: settings.showSeconds,
|
||||||
|
min: 0, max: 2,
|
||||||
|
format: v => [/*LANG*/"Never", /*LANG*/"Unlocked", /*LANG*/"Last minute"][v || 0],
|
||||||
|
onchange: v => {
|
||||||
|
settings.showSeconds = v;
|
||||||
|
writeSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,35 +1,68 @@
|
||||||
(() => {
|
(() => {
|
||||||
|
require("Font5x9Numeric7Seg").add(Graphics);
|
||||||
const alarms = require("Storage").readJSON("sched.json",1) || [];
|
const alarms = require("Storage").readJSON("sched.json",1) || [];
|
||||||
|
const config = Object.assign({
|
||||||
|
maxhours: 24,
|
||||||
|
drawBell: false,
|
||||||
|
showSeconds: 0, // 0=never, 1=only when display is unlocked, 2=for less than a minute
|
||||||
|
}, require("Storage").readJSON("widalarmeta.json",1) || {});
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
const times = alarms.map(alarm => require("sched").getTimeToAlarm(alarm)).filter(a => a !== undefined);
|
const times = alarms.map(alarm => require("sched").getTimeToAlarm(alarm)).filter(a => a !== undefined);
|
||||||
const next = Math.min.apply(null, times);
|
const next = Math.min.apply(null, times);
|
||||||
if (next > 0 && next < 86400000) {
|
let calcWidth = 0;
|
||||||
const hours = Math.floor((next % 86400000) / 3600000).toString();
|
let drawSeconds = false;
|
||||||
const minutes = Math.floor(((next % 86400000) % 3600000) / 60000).toString();
|
|
||||||
|
if (next > 0 && next < config.maxhours*60*60*1000) {
|
||||||
|
const hours = Math.floor((next-1) / 3600000).toString();
|
||||||
|
const minutes = Math.floor(((next-1) % 3600000) / 60000).toString();
|
||||||
|
const seconds = Math.floor(((next-1) % 60000) / 1000).toString();
|
||||||
|
drawSeconds = (config.showSeconds & 0b01 && !Bangle.isLocked()) || (config.showSeconds & 0b10 && next <= 1000*60);
|
||||||
|
|
||||||
g.reset(); // reset the graphics context to defaults (color/font/etc)
|
g.reset(); // reset the graphics context to defaults (color/font/etc)
|
||||||
g.setFontAlign(0,0); // center fonts
|
g.setFontAlign(0,0); // center fonts
|
||||||
g.clearRect(this.x, this.y, this.x+this.width-1, this.y+23);
|
g.clearRect(this.x, this.y, this.x+this.width-1, this.y+23);
|
||||||
|
|
||||||
var text = hours.padStart(2, '0') + ":" + minutes.padStart(2, '0');
|
var text = hours.padStart(2, '0') + ":" + minutes.padStart(2, '0');
|
||||||
g.setFont("6x8:1x2");
|
if (drawSeconds) {
|
||||||
g.drawString(text, this.x+this.width/2, this.y+12);
|
text += ":" + seconds.padStart(2, '0');
|
||||||
if (this.width === 0) {
|
|
||||||
this.width = 6*5+2;
|
|
||||||
Bangle.drawWidgets(); // width changed, re-layout
|
|
||||||
}
|
}
|
||||||
|
g.setFont("5x9Numeric7Seg:1x2");
|
||||||
|
g.drawString(text, this.x+this.width/2, this.y+12);
|
||||||
|
|
||||||
|
calcWidth = 5*5+2;
|
||||||
|
if (drawSeconds) {
|
||||||
|
calcWidth += 3*5;
|
||||||
|
}
|
||||||
|
} else if (times.length > 0 && config.drawBell) {
|
||||||
|
// next alarm too far in future, draw only widalarm bell
|
||||||
|
g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y);
|
||||||
|
calcWidth = 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.width !== calcWidth) {
|
||||||
|
// width changed, re-layout
|
||||||
|
this.width = calcWidth;
|
||||||
|
Bangle.drawWidgets();
|
||||||
|
}
|
||||||
|
|
||||||
|
// redraw next full minute or second
|
||||||
|
const period = drawSeconds ? 1000 : 60000;
|
||||||
|
let timeout = next > 0 ? next % period : period - (Date.now() % period);
|
||||||
|
if (timeout === 0) {
|
||||||
|
timeout += period;
|
||||||
|
}
|
||||||
|
setTimeout(()=>{
|
||||||
|
WIDGETS["widalarmeta"].draw(WIDGETS["widalarmeta"]);
|
||||||
|
}, timeout);
|
||||||
|
} /* draw */
|
||||||
|
|
||||||
|
if (config.maxhours > 0) {
|
||||||
|
// add your widget
|
||||||
|
WIDGETS["widalarmeta"]={
|
||||||
|
area:"tl",
|
||||||
|
width: 0, // hide by default = assume no timer
|
||||||
|
draw:draw
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(function() {
|
|
||||||
WIDGETS["widalarmeta"].draw(WIDGETS["widalarmeta"]);
|
|
||||||
}, 30000); // update every half minute
|
|
||||||
|
|
||||||
// add your widget
|
|
||||||
WIDGETS["widalarmeta"]={
|
|
||||||
area:"tl",
|
|
||||||
width: 0, // hide by default = assume no timer
|
|
||||||
draw:draw
|
|
||||||
};
|
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Reference in New Issue