Modified to use setUI, theme and different screens

master
Gordon Williams 2021-06-24 15:45:49 +01:00
parent e4dc3e7afd
commit 9aa746fbc3
5 changed files with 42 additions and 48 deletions

View File

@ -1531,9 +1531,9 @@
"name": "Dev Stopwatch", "name": "Dev Stopwatch",
"shortName":"Dev Stopwatch", "shortName":"Dev Stopwatch",
"icon": "app.png", "icon": "app.png",
"version":"0.02", "version":"0.03",
"description": "Stopwatch with 5 laps supported (cyclically replaced)", "description": "Stopwatch with 5 laps supported (cyclically replaced)",
"tags": "stopwatch, chrono, timer, chronometer", "tags": "stopwatch,chrono,timer,chronometer,b2",
"allow_emulator":true, "allow_emulator":true,
"storage": [ "storage": [
{"name":"devstopwatch.app.js","url":"app.js"}, {"name":"devstopwatch.app.js","url":"app.js"},
@ -2814,7 +2814,7 @@
"name": "De-Stress", "name": "De-Stress",
"shortName":"De-Stress", "shortName":"De-Stress",
"icon": "app.png", "icon": "app.png",
"version":"0.01", "version":"0.02",
"description": "Simple haptic heartbeat", "description": "Simple haptic heartbeat",
"storage": [ "storage": [
{"name":"de-stress.app.js","url":"app.js"}, {"name":"de-stress.app.js","url":"app.js"},

2
apps/de-stress/ChangeLog Normal file
View File

@ -0,0 +1,2 @@
0.01: New App!
0.02: Adjust for different screen types and themes

View File

@ -1,29 +1,21 @@
g.setBgColor(0).clear();
//g.clear(); var img = require("heatshrink").decompress(atob("plB4X/ln7A4OGmMs5dVAANa1WlAoQADBI9W1QAByoJNtWv4f61ISEtWrBI2q4EAgeqCQgJHq2sLoU6IYdaBIg5CrWAn2q2EDF4dq4EO1W8gQcCtUD1fP9cA9QSC1cA9f/9XADgWohxBBh2whQvBq2gAwMAh+wlQSB1k7IIXogYvBrXAlYJC9k6DYOw9gIChXA9JBC0AJCncOytWwAtBAAMDF4RBDAAMOgWVrXDwDjD9kKy2gIIcAgXD0taDYgvCRIJBDF4OA0trhwIDJgK2B4BKDAAXptcLA4kC4HrD4IJE8HptE4BAhfBLAJBEgEslISGL4JOBBAoSB1ksBIs6/70DBIgSHh+q+AIFnASIABASU0EgCR0IhWgEp4SBHCBxJLzusXowAIaBISLhYSO8EptcOCR2w9NagXACJkDwGlrXDwASMgXDCQOA2ASMh0C0tW2HgCRkLh2Vq2glASMlEKytV1iFN9k6qtVtEOORcD2EpCQNqOwJwL4GpCQNa4GgCRUKgelCQJyBlgSKnBwBCQWgnZdLOAQAB1BfKLoMqCIVVtYHBXZPA9ISDL4PsCRE7LoZfDnRKJLoYAC1kOTI8CDoIREJgMA1gSGFwJKEJgaGH9hKFTIaGGPQKVEAAeogbTFhXASogADtXAlYSE9cDeYRMG2A5EG4MOJQxMC1g5EG4M6JQ4AB1Q5E9ED1QRIHIatBG5Y5EVoM6G5Y5DnXDCwJvIHIsD32AG5Y5C1aUBgHqG5atDLwI3MHIReCG5hgD4aUKHI2+G5xgC1RcNAAdpBJA"))
var img = {
width : 100, height : 100, bpp : 8,
transparent : 254,
buffer : require("heatshrink").decompress(atob("/wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AglYAGE/44gHz4nnHKtPumez3C4WezFzp49ZLAgoCE4WeugnaHStPG4QAHzw9DE/Y6VHJQ9YMJwnEMk46CF4lzfglPug9WCAWYDQl0E4tzN4gLCMVC5Cp+YGoOezxBCubKHExxUEuiFCEoInECAhkjMQuYLArCFGwLLEHpjsGMIRpEfAsrMkwhBFAQ6BHJA9EKApDBHpAJBQYhPBE5iZBzAsDMb4gBEwg6MJhBkIYorgBPQiMMUAhkeHgkrug7ObI5qBHwhiGZYomOEojGeJQVzTx5kOMQ6JREAR3CDIJkcHobwEMiw+CAAYJEMSYWCAgRjcDgI4CYyiiDXopiFBooAWRwJkaHwjGVKwdzH4rADuhiXZAaICMbbtGHy2YBQ+YRDCiEMbidCULBkDLIwIIdqbmCp5jZPwIfDAYQAXXwNPzwACIQLQIACt0ZDIZBTwRFBHjWeHoSJCETlPc4ZjdAYYA7L4Jj/Mf5jCEYQDDAHhEEMbzH+McBfCMf4ADzxjep+YL/1PMb10MYQDCAHd0MYV0MbdzEYoA7UYdPMTBkCc4hj9leeAYRjbL4aIDAHN0UwRjeL4WYZHlPzBnCMbZkBQojtCAG6gEp5ibZARfCdwjG3ugDBzzGcMYTIEFAQA1ujGFMbjIFeAgA0HobGeZA9PAgYAyG4jGfZAyPBzBizf4LGjMggtCFAJpDAFw0FMURjCeAd0AgYAup90AgZjjMgWYFYZkwGImYMUhkDeYdPuZituZiDzximMYUrFwj6DAFF0TAg6CMcpkCSYpkqMQtPMVBkDuZktMQtzMVRkDLwZkoMQoFBMVZkJp5ijX4JizMhFPMkQjBMWpkHIAKjEADTrGMWZkDuY8DuZkdMQKKEMWpkDUIxFEACocGdoJi1MhCqBAwgATLYLkEMXJkDIY4GEAB+ep9PC4aDBMXRkJukruhiRCgxi+MglzJAtPMR7cGNIJi+MglPJYhSBzBhLzB0FzwWBMX5lGMghVGAAtzld0bwph/MhNzWYzKGNwR2Euhi/MhhTHA4ZrHA4Rh/Mp10YIlzA4JoCBQjE/ZTK8BA45i/MqtzX4jE/Mj0rYQjECBYZP/MrFPMoWep5h/ZT90ujE/MsZh/MsZB/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/ACg"))
};
function hr(){ function hr(){
Bangle.buzz(100,0.1).then(()=>{ Bangle.buzz(100,0.1).then(()=>{
g.clear(); g.clear();
return new Promise(resolve=>setTimeout(resolve,250)); // wait 250ms return new Promise(resolve=>setTimeout(resolve,250)); // wait 250ms
}).then(()=>{ }).then(()=>{
return Bangle.buzz(150); return Bangle.buzz(150);
}).then(()=>{ }).then(()=>{
g.drawImage(img, 25, 40, {scale:2}); g.drawImage(img, g.getWidth()/2 - 76, g.getHeight()/2 - 65, {scale:2});
}); });
} }
setInterval(hr, 2000); setInterval(hr, 2000);
g.flip(); g.flip();
setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); // TODO - not clock but we still want a press to show launcher when button pressed
Bangle.setUI("clock");

View File

@ -1,2 +1,3 @@
0.01: App created 0.01: App created
0.02: Persist state to storage to enable stopwatch to continue in the background 0.02: Persist state to storage to enable stopwatch to continue in the background
0.03: Modified to use setUI, theme and different screens

View File

@ -2,13 +2,16 @@ const EMPTY_LAP = '--:--:---';
const EMPTY_H = '00:00:000'; const EMPTY_H = '00:00:000';
const MAX_LAPS = 6; const MAX_LAPS = 6;
const XY_CENTER = g.getWidth() / 2; const XY_CENTER = g.getWidth() / 2;
const big = g.getWidth()>200;
const Y_CHRONO = 40; const Y_CHRONO = 40;
const Y_HEADER = 80; const Y_HEADER = big?80:60;
const Y_LAPS = 125; const Y_LAPS = big?125:90;
const Y_BTN3 = 225; const H_LAPS = big?15:8;
const Y_BTN3 = big?225:165;
const FONT = '6x8'; const FONT = '6x8';
const CHRONO = '/* C H R O N O */'; const CHRONO = '/* C H R O N O */';
var reset = false; var reset = false;
var currentLap = ''; var currentLap = '';
var chronoInterval; var chronoInterval;
@ -22,9 +25,9 @@ var state = require("Storage").readJSON("devstopwatch.state.json",1) || {
laps: [EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP], laps: [EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP],
}; };
// Set laps. // Show launcher when button pressed
setWatch(() => { Bangle.setUI("clockupdown", btn=>{
if (btn==0) {
reset = false; reset = false;
if (state.started) { if (state.started) {
@ -34,13 +37,9 @@ setWatch(() => {
chronoInterval = setInterval(chronometer, 10); chronoInterval = setInterval(chronometer, 10);
} }
} }
}, BTN1, { repeat: true, edge: 'rising' }); }
if (btn==1) resetChrono();
// Reset chronometre. });
setWatch(() => { resetChrono(); }, BTN3, { repeat: true, edge: 'rising' });
// Show launcher when middle button pressed.
setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: 'falling' });
function resetChrono() { function resetChrono() {
state.laps = [EMPTY_H, EMPTY_H, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP]; state.laps = [EMPTY_H, EMPTY_H, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP];
@ -106,33 +105,33 @@ function printChrono() {
var print = ''; var print = '';
g.setFont(FONT, 2); g.setFont(FONT, big?2:1);
print = CHRONO; print = CHRONO;
g.drawString(print, XY_CENTER, Y_CHRONO, true); g.drawString(print, XY_CENTER, Y_CHRONO, true);
g.setColor(0, 220, 0); g.setColor("#0e0");
g.setFont(FONT, 3); g.setFont(FONT, big?3:2);
print = ` T ${state.laps[0]}\n`; print = ` T ${state.laps[0]}\n`;
print += ` C ${state.laps[1]}\n`; print += ` C ${state.laps[1]}\n`;
g.drawString(print, XY_CENTER, Y_HEADER, true); g.drawString(print, XY_CENTER, Y_HEADER, true);
g.setColor(255, 255, 255); g.setColor(g.theme.fg);
g.setFont(FONT, 2); g.setFont(FONT, big?2:1);
for (var i = 2; i < MAX_LAPS + 1; i++) { for (var i = 2; i < MAX_LAPS + 1; i++) {
g.setColor(255, 255, 255); g.setColor(g.theme.fg);
let suffix = ' '; let suffix = ' ';
if (state.currentLapIndex === i) { if (state.currentLapIndex === i) {
let suffix = '*'; let suffix = '*';
g.setColor(255, 200, 0); g.setColor("#f70");
} }
const lapLine = `L${i - 1} ${state.laps[i]} ${suffix}\n`; const lapLine = `L${i - 1} ${state.laps[i]} ${suffix}\n`;
g.drawString(lapLine, XY_CENTER, Y_LAPS + (15 * (i - 1)), true); g.drawString(lapLine, XY_CENTER, Y_LAPS + (H_LAPS * (i - 1)), true);
} }
g.setColor(255, 255, 255); g.setColor(g.theme.fg);
g.setFont(FONT, 1); g.setFont(FONT, 1);
print = 'Press 3 to reset'; print = 'Press 3 to reset';
g.drawString(print, XY_CENTER, Y_BTN3, true); g.drawString(print, XY_CENTER, Y_BTN3, true);