From ec7e58a14d38742e2eb8aca202d9c91f1715f8d8 Mon Sep 17 00:00:00 2001 From: Aaron Rolls Date: Tue, 23 Aug 2022 08:49:10 +1200 Subject: [PATCH] Added first version of Chimer app --- apps/chimer/icon.txt | 2 ++ apps/chimer/metadata.json | 15 +++++++++++ apps/chimer/settings.js | 54 ++++++++++++++++++++++++++++++++++++++ apps/chimer/widget.js | 49 ++++++++++++++++++++++++++++++++++ apps/chimer/widget.png | Bin 0 -> 1704 bytes 5 files changed, 120 insertions(+) create mode 100644 apps/chimer/icon.txt create mode 100644 apps/chimer/metadata.json create mode 100644 apps/chimer/settings.js create mode 100644 apps/chimer/widget.js create mode 100644 apps/chimer/widget.png diff --git a/apps/chimer/icon.txt b/apps/chimer/icon.txt new file mode 100644 index 000000000..c1750ff20 --- /dev/null +++ b/apps/chimer/icon.txt @@ -0,0 +1,2 @@ + +widget.png: https://icons8.com/icon/15715/plus-1-hour \ No newline at end of file diff --git a/apps/chimer/metadata.json b/apps/chimer/metadata.json new file mode 100644 index 000000000..4f021c866 --- /dev/null +++ b/apps/chimer/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "chimer", + "name": "Chimer", + "version": "0.01", + "description": "A fork of Hour Chime. Buzz or beep on every 60, 30 or 15 minutes.", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widchime.wid.js","url":"widget.js"}, + {"name":"widchime.settings.js","url":"settings.js"} + ], + "data": [{"name":"widchime.json"}] +} \ No newline at end of file diff --git a/apps/chimer/settings.js b/apps/chimer/settings.js new file mode 100644 index 000000000..586b9d7ca --- /dev/null +++ b/apps/chimer/settings.js @@ -0,0 +1,54 @@ +/** + * @param {function} back Use back() to return to settings menu + */ + + + +(function(back) { + // default to buzzing + var FILE = "chimer.json" + var settings = {} + const chimes = ["Off", "Buzz", "Beep", "Both"] + const frequency = ["60 min", "30 min", "15 min"] + + + + const menu = { + "": {"title": "Hour Chime"}, + "< Back": back, + "Chime Type": { + value: settings.type, + min: 0, max: 2, // both is just silly + format: v => chimes[v], + onchange: function(v) { + settings.type = v + writeSettings(settings) + }, + }, + "Frequency": { + value: settings.freq, + min: 0, max: 2, + format: v => frequency[v], + onchange : function(v) { + settings.freq = v + writeSettings(settings) + } + } + } + + + var readSettings = () => { + var settings = require("Storage").readJSON(FILE, 1) || { + type: 1, + freq: 0, + }; + return settings; + }; + + var writeSettings = (settings) => { + require("Storage").writeJSON(FILE, settings); + }; + settings = readSettings() + E.showMenu(menu) +}) + diff --git a/apps/chimer/widget.js b/apps/chimer/widget.js new file mode 100644 index 000000000..faf913a20 --- /dev/null +++ b/apps/chimer/widget.js @@ -0,0 +1,49 @@ +(function() { + // 0: off, 1: buzz, 2: beep, 3: both + var readSettings = () => { + var settings = require("Storage").readJSON(FILE, 1) || { + type: 1, + freq: 0, + }; + return settings; + }; + + var settings = readSettings() + + function chime() { + if (settings.type == 0) return; + if (settings.type&1) Bangle.buzz(100); + if (settings.type&2) Bangle.beep(); + } + + let lastHour = (new Date()).getHours(); // don't chime when (re)loaded at a whole hour + function check() { + const now = new Date(), + h = now.getHours(), m = now.getMinutes(), + s = now.getSeconds(), ms = now.getMilliseconds(); + if (settings.freq == 1){ + if (h!==lastHour && m===30) chime(); + lastHour = h; + // check again in 30 minutes + const mLeft = 30-m, sLeft = (mLeft*60)-s, msLeft = (sLeft*1000)-ms; + setTimeout(check, msLeft); + }else if (settings.freq == 2){ + if (h!==lastHour && m===15) chime(); + lastHour = h; + // check again in 15 minutes + const mLeft = 15-m, sLeft = (mLeft*60)-s, msLeft = (sLeft*1000)-ms; + setTimeout(check, msLeft); + }else{ + if (h!==lastHour && m===0) chime(); + lastHour = h; + // check again in 60 minutes + const mLeft = 60-m, sLeft = (mLeft*60)-s, msLeft = (sLeft*1000)-ms; + setTimeout(check, msLeft); + } + + + } + + check(); +}) +(); \ No newline at end of file diff --git a/apps/chimer/widget.png b/apps/chimer/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3d7eebd3439ff27290c923cb494376f59ca970 GIT binary patch literal 1704 zcmV;Z23PrsP))2}t z2Zyln-n=_IJJSbyZ;8jA*>y^h{C_&_} znM~E~vI;e`eW4}AuCGn7b#oF)%s$5h4Fv)X8Cq6nXb;CJ7=pn_fUdqK&W-qL7F`L) z0W>Ykv48hPwzei5JCh}oZEXp*wIvvc1bLxr4HI#Apprm>$y*(g0w8M^g<|;J1-K|Lc8}I?>{v9M+{szM3T=A?9Gy)gyM@jb= zEh!`s7Pn=G>{86Vk;y#6jCezBCbjPO3nv~xsHB>o!*FjXTKpL1(@rQX12DTiw_|eG zj3?5~zr$3P*DBQ#rm~du+GnU347<%9&uwc~Gtpt*{op)W zKF=ff?d9yy2)};*B>+0U9Oi+}JFain@Fle1u9?*d5atuW@tOlLyL}3-Z(;fO2VA>l-}eYOSc!x8(=<_Uok1$|j7CVp0q2oY%Q5%e1wu zv3~-XoUWOGnV4VKlzlOJ^e=}lPLg}FKOiQefJVtv25CxZ+oe(r$JD; zTU)_m6*AWsQ-&)vCxO@F#_O?nAUi)iN?zAd6d8akS10+$Tjh<+R9BVKF4f*G)?yVB zffA{!$rh0vgxfZ9@cw&9rZfEXH_wvSb)vD0rE)_lca|*M`vNvjqh@K?RHD*W98U9L zNx+W~f}r2WlAxcKj5M zz;XbgjaT*XwUc-uA@b!DZ(gf!5}z)nl=M4w3$qJXrtB-5vG)Zm0+8M=rqtvc^{H|I z*W~M^baqNastN_Y*VYHCA!Nv1NV*Ov^3))*7NwwW1a8dG0g!VM%t>66uaymk^pth&YFGv!IMSrd{ILg-a>GSS62#+9DCP`6d@~mX^WkD%N%s>N z`ZhxU#Ie@vxb--J;qRcNPXJ(=fG`h;j_d^|Jo7&8iVp4Yk?!&tMai5b7~PGMdDo%j zGNw81L`n6PY%h0*5MS5+?v%^c>-3SH5HG%2J}F9Cj6ie`zLAHJbN{jJOwL8{#~vaO z-HW7+mh8uRoA~Fy=05dW!S>VQvEC-GOsYJ%XAFU0%nHYf9^qicDmj;BROZ=?N#ONoy8*tctpZJW!FyYkc^ z-s!8LZJavS$X{Mt!{xZ@sNJ=2{5m}mS2^_8o7mi(W>@wAM!)%Om*Z|OPIx#w9N_&(fJFNLPmM2 literal 0 HcmV?d00001