mirror of https://github.com/espruino/BangleApps
Chronowid initial
parent
944693eaf9
commit
1a935951b0
|
@ -0,0 +1,35 @@
|
||||||
|
# Chronometer Widget
|
||||||
|
|
||||||
|
Chronometer (timer) that runs as a widget.
|
||||||
|
The advantage is, that you can still see your normal watchface and other widgets when the timer is running.
|
||||||
|
The widget is always active, but only shown when the timer is on.
|
||||||
|
Hours, minutes, seconds and timer status can be set with an app.
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded)
|
||||||
|
* Target time is saved to a file and timer picks up again when widget is loaded again.
|
||||||
|
|
||||||
|
## Settings
|
||||||
|
|
||||||
|
There are no settings section in the settings app, timer can be set using an app.
|
||||||
|
|
||||||
|
* Hours: Set the hours for the timer
|
||||||
|
* Minutes: Set the minutes for the timer
|
||||||
|
* Seconds: Set the seconds for the timer
|
||||||
|
* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app. The widget is always there, but only visible when timer is on.
|
||||||
|
|
||||||
|
|
||||||
|
## Releases
|
||||||
|
|
||||||
|
* Offifical app loader: Not yet published.
|
||||||
|
* Forked app loader: Not yet published.
|
||||||
|
* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid
|
||||||
|
|
||||||
|
## Requests
|
||||||
|
|
||||||
|
If you have any feature requests, please contact me on the Espruino forum: http://forum.espruino.com/profiles/155005/
|
|
@ -0,0 +1 @@
|
||||||
|
require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA="))
|
|
@ -0,0 +1,91 @@
|
||||||
|
g.clear();
|
||||||
|
Bangle.loadWidgets();
|
||||||
|
Bangle.drawWidgets();
|
||||||
|
|
||||||
|
const storage = require('Storage');
|
||||||
|
const boolFormat = v => v ? "On" : "Off";
|
||||||
|
let settingsChronowid;
|
||||||
|
|
||||||
|
function updateSettings() {
|
||||||
|
var now = new Date();
|
||||||
|
const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(),
|
||||||
|
now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds);
|
||||||
|
settingsChronowid.goal = goal.getTime();
|
||||||
|
storage.writeJSON('chronowid.json', settingsChronowid);
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetSettings() {
|
||||||
|
settingsChronowid = {
|
||||||
|
hours : 0,
|
||||||
|
minutes : 0,
|
||||||
|
seconds : 0,
|
||||||
|
started : false,
|
||||||
|
counter : 0,
|
||||||
|
goal : 0,
|
||||||
|
};
|
||||||
|
updateSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
settingsChronowid = storage.readJSON('chronowid.json',1);
|
||||||
|
if (!settingsChronowid.started) resetSettings();
|
||||||
|
|
||||||
|
E.on('kill', () => {
|
||||||
|
print("-KILL-");
|
||||||
|
updateSettings();
|
||||||
|
});
|
||||||
|
|
||||||
|
function showMenu() {
|
||||||
|
const timerMenu = {
|
||||||
|
'': {
|
||||||
|
'title': 'Set timer',
|
||||||
|
'predraw': function() {
|
||||||
|
timerMenu.hours.value = settingsChronowid.hours;
|
||||||
|
timerMenu.minutes.value = settingsChronowid.minutes;
|
||||||
|
timerMenu.seconds.value = settingsChronowid.seconds;
|
||||||
|
timerMenu.started.value = settingsChronowid.started;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Hours': {
|
||||||
|
value: settingsChronowid.hours,
|
||||||
|
min: 0,
|
||||||
|
max: 24,
|
||||||
|
step: 1,
|
||||||
|
onchange: v => {
|
||||||
|
settingsChronowid.hours = v;
|
||||||
|
updateSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Minutes': {
|
||||||
|
value: settingsChronowid.minutes,
|
||||||
|
min: 0,
|
||||||
|
max: 59,
|
||||||
|
step: 1,
|
||||||
|
onchange: v => {
|
||||||
|
settingsChronowid.minutes = v;
|
||||||
|
updateSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Seconds': {
|
||||||
|
value: settingsChronowid.seconds,
|
||||||
|
min: 0,
|
||||||
|
max: 59,
|
||||||
|
step: 1,
|
||||||
|
onchange: v => {
|
||||||
|
settingsChronowid.seconds = v;
|
||||||
|
updateSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Timer on': {
|
||||||
|
value: settingsChronowid.started,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: v => {
|
||||||
|
settingsChronowid.started = v;
|
||||||
|
updateSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
timerMenu['-Exit-'] = ()=>{load();};
|
||||||
|
return E.showMenu(timerMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
showMenu();
|
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
|
@ -0,0 +1,93 @@
|
||||||
|
(() => {
|
||||||
|
const storage = require('Storage');
|
||||||
|
settingsChronowid = storage.readJSON("chronowid.json",1)||{}; //read settingsChronowid from file
|
||||||
|
var height = 23;
|
||||||
|
var width = 58;
|
||||||
|
var interval = 0; //used for the 1 second interval timer
|
||||||
|
var now = new Date();
|
||||||
|
|
||||||
|
var time = 0;
|
||||||
|
var diff = settingsChronowid.goal - now;
|
||||||
|
|
||||||
|
//Convert ms to time
|
||||||
|
function getTime(t) {
|
||||||
|
var milliseconds = parseInt((t % 1000) / 100),
|
||||||
|
seconds = Math.floor((t / 1000) % 60),
|
||||||
|
minutes = Math.floor((t / (1000 * 60)) % 60),
|
||||||
|
hours = Math.floor((t / (1000 * 60 * 60)) % 24);
|
||||||
|
|
||||||
|
hours = (hours < 10) ? "0" + hours : hours;
|
||||||
|
minutes = (minutes < 10) ? "0" + minutes : minutes;
|
||||||
|
seconds = (seconds < 10) ? "0" + seconds : seconds;
|
||||||
|
|
||||||
|
return hours + ":" + minutes + ":" + seconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
function printDebug() {
|
||||||
|
print ("Nowtime: " + getTime(now));
|
||||||
|
print ("Now: " + now);
|
||||||
|
print ("Goaltime: " + getTime(settingsChronowid.goal));
|
||||||
|
print ("Goal: " + settingsChronowid.goal);
|
||||||
|
print("Difftime: " + getTime(diff));
|
||||||
|
print("Diff: " + diff);
|
||||||
|
print ("Started: " + settingsChronowid.started);
|
||||||
|
print ("----");
|
||||||
|
}
|
||||||
|
|
||||||
|
//counts down, calculates and displays
|
||||||
|
function countDown() {
|
||||||
|
//printDebug();
|
||||||
|
now = new Date();
|
||||||
|
diff = settingsChronowid.goal - now; //calculate difference
|
||||||
|
WIDGETS["chronowid"].draw();
|
||||||
|
//time is up
|
||||||
|
if (settingsChronowid.started && diff <= 0) {
|
||||||
|
Bangle.buzz(1500);
|
||||||
|
//write timer off to file
|
||||||
|
settingsChronowid.started = false;
|
||||||
|
storage.writeJSON('chronowid.json', settingsChronowid);
|
||||||
|
clearInterval(interval); //stop interval
|
||||||
|
//printDebug();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw your widget
|
||||||
|
function draw() {
|
||||||
|
if (!settingsChronowid.started) {
|
||||||
|
width = 0;
|
||||||
|
return; //do not draw anything if timer is not started
|
||||||
|
}
|
||||||
|
g.reset();
|
||||||
|
if (diff >= 0) {
|
||||||
|
if (diff < 600000) { //less than 1 hour left
|
||||||
|
width = 58;
|
||||||
|
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
||||||
|
g.setFont("6x8", 2);
|
||||||
|
g.drawString(getTime(diff).substring(3), this.x+1, this.y+5); //remove hour part 00:00:00 -> 00:00
|
||||||
|
}
|
||||||
|
if (diff >= 600000) { //one hour or more left
|
||||||
|
width = 48;
|
||||||
|
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
||||||
|
g.setFont("6x8", 1);
|
||||||
|
g.drawString(getTime(diff), this.x+1, this.y+((height/2)-4)); //display hour 00:00:00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
width = 58;
|
||||||
|
g.clearRect(this.x,this.y,this.x+width,this.y+height);
|
||||||
|
g.setFont("6x8", 2);
|
||||||
|
g.drawString("END", this.x+15, this.y+5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsChronowid.started) interval = setInterval(countDown, 1000); //start countdown each second
|
||||||
|
|
||||||
|
// add the widget
|
||||||
|
WIDGETS["chronowid"]={area:"bl",width:width,draw:draw,reload:function() {
|
||||||
|
reload();
|
||||||
|
Bangle.drawWidgets(); // relayout all widgets
|
||||||
|
}};
|
||||||
|
|
||||||
|
//printDebug();
|
||||||
|
countDown();
|
||||||
|
})();
|
Loading…
Reference in New Issue