From 97989e2884e24414ce96b686894b5be589315c63 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:31:48 +0100 Subject: [PATCH 1/4] Created a timer for pizza --- apps.json | 15 ++ apps/pizzatimer/ChangeLog | 1 + apps/pizzatimer/README.md | 1 + apps/pizzatimer/app-icon.js | 1 + apps/pizzatimer/app.js | 273 ++++++++++++++++++++++++++++++++++++ apps/pizzatimer/pizza.png | Bin 0 -> 4210 bytes 6 files changed, 291 insertions(+) create mode 100644 apps/pizzatimer/ChangeLog create mode 100644 apps/pizzatimer/README.md create mode 100644 apps/pizzatimer/app-icon.js create mode 100644 apps/pizzatimer/app.js create mode 100644 apps/pizzatimer/pizza.png diff --git a/apps.json b/apps.json index 3386867cf..8f29ede49 100644 --- a/apps.json +++ b/apps.json @@ -1773,5 +1773,20 @@ "storage": [ {"name":"widviz.wid.js","url":"widget.js"} ] + }, + { + "id": "pizzatimer", + "name": "Pizza Timer", + "shortName":"PTimer", + "icon": "pizza.png", + "version":"0.01", + "description": "A timer app for when you cook Pizza. Some say it can also time other things", + "tags": "timer,tool,pizza", + "readme": "README.md", + "allow_emulator":true, + "storage": [ + {"name":"pizzatimer.app.js","url":"app.js"}, + {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/pizzatimer/ChangeLog b/apps/pizzatimer/ChangeLog new file mode 100644 index 000000000..3c3e41a33 --- /dev/null +++ b/apps/pizzatimer/ChangeLog @@ -0,0 +1 @@ +0.01: You can now time cooking a Pizza! \ No newline at end of file diff --git a/apps/pizzatimer/README.md b/apps/pizzatimer/README.md new file mode 100644 index 000000000..14f2e6bbb --- /dev/null +++ b/apps/pizzatimer/README.md @@ -0,0 +1 @@ +# Pizza Timer \ No newline at end of file diff --git a/apps/pizzatimer/app-icon.js b/apps/pizzatimer/app-icon.js new file mode 100644 index 000000000..936ef6e2a --- /dev/null +++ b/apps/pizzatimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AH4AwgCzUgEFqtVDIcQDpkQgtO9wACqAfCoAYKCwIVD93kCQMQgAcDAA8F73tqEAAAQXC6Fe8owIiFO9peBpvdAAIRBgvdHQIwIggKBhsNCoPUF4UEgtAp3gFxHlhsFgvQptAFAMQGoPUhpmCLoouB7tArvV7tVC4QEBAIPuC40O8hECAAVVIwXQKIPQC4xGB8FNotEgBBBXIMQhtAIwPQpx4FiBGCotFgFd7vQBQIUBF4NAhwIBLwpGC6ovCEwMAhvUqvVgsOSAsNRoJcCCwKlCgsNPoIXBCAJ2FLwJ2EgpeBGgKOBD4MEVAkQr3QaAIxCqgvBiFUNAMES4SQERwNA6tdBoPVhpeBCYVQQYKXBC4veNQMECIR2CAoUFoB/CC4vugoJBUgIABBgMQgtNoEFbQMA91RC4wAEgALCYoVQ6HQ7wvFOoYAB6DaBBoSMBBAMApxHGgC9BBgPUprbBB4RLBO4NNC4tVgqMBoHQYgQcBDAcAoFUR4tQhvQKoQuBroDBDAZLBKAYXCCoKzCJYKtBb4QHBGQYXEp3gC4XUVIYFBAQVQGYgACr3gCYVFAQJgCAwIKB6kEqAYFh3lU4JBCAQLDDUwNAH4IvFgnuhtF6FdCAJFDggGBgvuoAXFVANQC4NVhoxBqAUBPAVe9xfGPAKfBIgNNgsNhtVGAPVFwPlC40RhvkIgQqCLgQFBpw9BCwzHBKIKRFAANQIoIuIJAIwBgFUCodFgFd93tdggwGpwYBAAhEBIoIuIDAnu6lEolNCoIWNDAVUCYQAB6sACxoYCgEFqtQAgIVOAH4AC")) \ No newline at end of file diff --git a/apps/pizzatimer/app.js b/apps/pizzatimer/app.js new file mode 100644 index 000000000..aac908cc9 --- /dev/null +++ b/apps/pizzatimer/app.js @@ -0,0 +1,273 @@ +/* UI GLOBALS */ + +const HOUR_SCENE = 0; +const MIN_SCENE = 1; +const SEC_SCENE = 2; +const COUNTDOWN_SCENE = 3; + +var currentScene = 0; + +var btn1Watch; +var btn2Watch; +var btn3Watch; + +var drawInterval; + +/* STATE GLOBALS */ + +var menuTime = new Uint8Array([0,0,0]); +var countdownTime = menuTime.slice(0); +var show = [true, true, true]; + +/* COUNTDOWN CONSTANTS */ + +const HOUR_INDEX = 0; +const MIN_INDEX = 1; +const SEC_INDEX = 2; + +var flashIndex = HOUR_INDEX; + +/* logic */ + +function setCountdownTime() { + countdownTime = menuTime.slice(0); +} + +function countDownFinished() { + return countdownTime[HOUR_INDEX] <= 0 && + countdownTime[MIN_INDEX] <= 0 && + countdownTime[SEC_INDEX] <= 0; +} + +function alertCountdownFinished() { + if (drawInterval) return; + Bangle.buzz() + .then(() => new Promise(resolve => setTimeout(resolve, 200))) + .then(() => Bangle.buzz()); + setTimeout(alertCountdownFinished, 2000); +} + +function unsetDrawInterval() { + clearInterval(drawInterval); + drawInterval = undefined; +} + +function decrementCountdownTime() { + const allZero = countDownFinished(); + + if(allZero) { + return; + } + + if (countdownTime[SEC_INDEX] !== 0) { + countdownTime[SEC_INDEX] = countdownTime[SEC_INDEX] - 1; + return; + } + + countdownTime[SEC_INDEX] = 59; + + if (countdownTime[MIN_INDEX] !== 0) { + countdownTime[MIN_INDEX] = countdownTime[MIN_INDEX] - 1; + return; + } + + countdownTime[MIN_INDEX] = 59; + + if (countdownTime[HOUR_INDEX] !== 0) { + countdownTime[HOUR_INDEX] = countdownTime[HOUR_INDEX] - 1; + return; + } +} + +function toggleShow(timeIndex) { + show[timeIndex] = !show[timeIndex]; +} + +function twoPadded(i) { + return i.length < 2 ? "0" + i : i; +} + +function getTimeString(t) { + let hour = t[HOUR_INDEX].toString(); + let min = t[MIN_INDEX].toString(); + let sec = t[SEC_INDEX].toString(); + + hour = show[HOUR_INDEX] ? twoPadded(hour) : " "; + min = show[MIN_INDEX] ? twoPadded(min) : " "; + sec = show[SEC_INDEX] ? twoPadded(sec) : " "; + + return hour + ":" + min + ":" + sec; +} + +/* drawing */ + +/* + shamelessly stollen from Bluetooth Music Controls + https://github.com/espruino/BangleApps/blob/6b09377414e02d575b8335bb051c831ecc9da9d9/apps/hidmsic/hid-music.js#L42 +*/ +function drawArrows() { + function c(a) { + return { + width: 8, + height: a.length, + bpp: 1, + buffer: (new Uint8Array(a)).buffer + }; + } + const d = g.getWidth() - 18; + g.drawImage(c([16,56,124,254,16,16,16,16]),d,40); + g.drawImage(c([16,16,16,16,254,124,56,16]),d,194); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); +} + +function drawTime(input) { + g.clear(); + g.setFontAlign(0,0); + g.setFont("4x6",5); + g.drawString(input, g.getWidth() / 2, g.getHeight() / 2); +} + +function drawMenu() { + const timeString = getTimeString(menuTime); + drawTime(timeString); + drawArrows(); +} + +function drawCountdown() { + const timeString = getTimeString(countdownTime); + drawTime(timeString); +} + +/* button callbacks */ + +function getMaxSelectableTime() { + return flashIndex === HOUR_INDEX ? 23 : 59; +} + +/* btn1 */ + +function incrementMenuTime() { + const maxTime = getMaxSelectableTime(); + const currentTime = menuTime[flashIndex]; + const newTime = currentTime < maxTime ? currentTime + 1 : 0; + menuTime[flashIndex] = newTime; +} + +/* btn2 */ + +function incrementScene() { + currentScene++; +} + +function incrementFlashIndex() { + flashIndex++; +} + +function showAll() { + for(var i = 0; i < show.length; i++) { + show[i] = true; + } +} + +function showFlashIndex() { + show[flashIndex] = true; +} + +function hideFlashIndex() { + show[flashIndex] = false; +} + +function next() { + incrementScene(); + + if (currentScene === COUNTDOWN_SCENE) { + showAll(); + startCountdownScene(); + } else { + showFlashIndex(); + incrementFlashIndex(); + hideFlashIndex(); + } +} + +/* btn3 */ + +function decrementMenuTime() { + const maxTime = getMaxSelectableTime(); + const currentTime = menuTime[flashIndex]; + const newTime = currentTime > 0 ? currentTime - 1 : maxTime; + menuTime[flashIndex] = newTime; +} + +/* watches */ + +function setupMenuWatches() { + clearWatch(); + btn1Watch = setWatch(incrementMenuTime, BTN1, {repeat: true}); + btn2Watch = setWatch(next, BTN2, {repeat: true}); + btn3Watch = setWatch(decrementMenuTime, BTN3, {repeat: true}); +} + +function setupCountdownWatches() { + clearWatch(); + btn2Watch = setWatch(main, BTN2, {repeat: true}); +} + +/* scenes */ + +function menu() { + drawMenu(); + toggleShow(flashIndex); +} + +function countdown() { + decrementCountdownTime(); + drawCountdown(); + + if (countDownFinished()) { + unsetDrawInterval(); + alertCountdownFinished(); + } +} + +/* init */ + +function unsetDrawInterval() { + if (!drawInterval) return; + clearInterval(drawInterval); + drawInterval = undefined; +} + +function startMenuScene() { + g.flip(); + Bangle.buzz(); + setupMenuWatches(); + unsetDrawInterval(); + menu(); + drawInterval = setInterval(menu, 500); +} + +function startCountdownScene() { + Bangle.beep(); + setupCountdownWatches(); + unsetDrawInterval(); + setCountdownTime(); + showAll(); + drawCountdown(); + drawInterval = setInterval(countdown, 1000); +} + +/* main */ + +function reset() { + currentScene = 0; + flashIndex = HOUR_INDEX; + hideFlashIndex(); +} + +function main() { + reset(); + startMenuScene(); +} + +main(); diff --git a/apps/pizzatimer/pizza.png b/apps/pizzatimer/pizza.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a083633a83da864fc15b425a935958739bf34d GIT binary patch literal 4210 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 literal 0 HcmV?d00001 From 2205660600fa5237a5fe20f90f93b29e46a7d682 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:38:25 +0100 Subject: [PATCH 2/4] emulator --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index 8f29ede49..012a56c6f 100644 --- a/apps.json +++ b/apps.json @@ -1783,7 +1783,6 @@ "description": "A timer app for when you cook Pizza. Some say it can also time other things", "tags": "timer,tool,pizza", "readme": "README.md", - "allow_emulator":true, "storage": [ {"name":"pizzatimer.app.js","url":"app.js"}, {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} From 6e14fc851d11faaa65c5c26d44f52ad319873918 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:42:06 +0100 Subject: [PATCH 3/4] Removed debugging buzzes --- apps/pizzatimer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pizzatimer/app.js b/apps/pizzatimer/app.js index aac908cc9..abd31bcc5 100644 --- a/apps/pizzatimer/app.js +++ b/apps/pizzatimer/app.js @@ -226,6 +226,7 @@ function countdown() { if (countDownFinished()) { unsetDrawInterval(); + g.flip(); alertCountdownFinished(); } } @@ -248,7 +249,6 @@ function startMenuScene() { } function startCountdownScene() { - Bangle.beep(); setupCountdownWatches(); unsetDrawInterval(); setCountdownTime(); From 9990beeeac6c34abb73fce108b9ad03034f3c806 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:43:50 +0100 Subject: [PATCH 4/4] Updated short name --- apps.json | 2 +- apps/pizzatimer/app.js | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 012a56c6f..787781278 100644 --- a/apps.json +++ b/apps.json @@ -1777,7 +1777,7 @@ { "id": "pizzatimer", "name": "Pizza Timer", - "shortName":"PTimer", + "shortName":"Pizza Timer", "icon": "pizza.png", "version":"0.01", "description": "A timer app for when you cook Pizza. Some say it can also time other things", diff --git a/apps/pizzatimer/app.js b/apps/pizzatimer/app.js index abd31bcc5..2779124fd 100644 --- a/apps/pizzatimer/app.js +++ b/apps/pizzatimer/app.js @@ -226,7 +226,6 @@ function countdown() { if (countDownFinished()) { unsetDrawInterval(); - g.flip(); alertCountdownFinished(); } } @@ -240,8 +239,6 @@ function unsetDrawInterval() { } function startMenuScene() { - g.flip(); - Bangle.buzz(); setupMenuWatches(); unsetDrawInterval(); menu();