diff --git a/apps/ac_ac/ChangeLog.txt b/apps/ac_ac/ChangeLog similarity index 100% rename from apps/ac_ac/ChangeLog.txt rename to apps/ac_ac/ChangeLog diff --git a/apps/barometer/ChangeLog b/apps/barometer/ChangeLog index 031a86cdc..de3a5cb96 100644 --- a/apps/barometer/ChangeLog +++ b/apps/barometer/ChangeLog @@ -1,2 +1,3 @@ 0.01: Display pressure as number and hand 0.02: Use theme color +0.03: workaround for some firmwares that return 'undefined' for first call to barometer diff --git a/apps/barometer/app.js b/apps/barometer/app.js index 2ce95864b..77d4c974f 100644 --- a/apps/barometer/app.js +++ b/apps/barometer/app.js @@ -110,9 +110,13 @@ drawScaleLabels(); drawIcons(); try { - Bangle.getPressure().then(data => { - drawHand(Math.round(data.pressure)); - }); + function baroHandler(data) { + if (data===undefined) // workaround for https://github.com/espruino/BangleApps/issues/1429 + setTimeout(() => Bangle.getPressure().then(baroHandler), 500); + else + drawHand(Math.round(data.pressure)); + } + Bangle.getPressure().then(baroHandler); } catch(e) { print(e.message); print("barometer not supporter, show a demo value"); diff --git a/apps/barometer/metadata.json b/apps/barometer/metadata.json index 68af55c68..a385f2be2 100644 --- a/apps/barometer/metadata.json +++ b/apps/barometer/metadata.json @@ -1,7 +1,7 @@ { "id": "barometer", "name": "Barometer", "shortName":"Barometer", - "version":"0.02", + "version":"0.03", "description": "A simple barometer that displays the current air pressure", "icon": "barometer.png", "tags": "tool,outdoors", diff --git a/apps/bowserWF/README.md b/apps/bowserWF/README.md new file mode 100644 index 000000000..19dc84c83 --- /dev/null +++ b/apps/bowserWF/README.md @@ -0,0 +1,6 @@ +# Bowser Watchface + +Show your evil character. +With style! + +Bowser jumps once every minute to advance the clock. hehe diff --git a/apps/bowserWF/app-icon.js b/apps/bowserWF/app-icon.js new file mode 100644 index 000000000..7d040b0ad --- /dev/null +++ b/apps/bowserWF/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("Ly+EARERERERERERERERER//8RERERERERERERERERERERERERERERzP//d3EREREREREREREREREREREREREcz//3dxERERERERERERERERERERERERHMz/93dxERERERERERERERERERERERERd8zHd3f/8REREREREREREREREREREREXfMx3d3//ERERERERERERERERERERERF3d3d3d//3cRHBEREREREREREREREREXd3d3d3f/93fMDMERERERERERERERERF3d3d3d3//d3zAzBERERERERERERERERd3d3fMd3f//8zMwREREREREREREREREXd3d8zMd3f/zMzMERERERERERERERERF3d3fMzHd3/8zMzBERERERERER93d3//d3d3x3/Mx3fMzP8REREREREXzP/3d//3d3d8d3fMzMz/8RERERERERF8z/93f/93d3fHd3zMzM//ERERER//93zM//93//d3d3z/d/9////xEREREcz/d3zM/3d///d3d8zHERH/ERERERERHM/3d8zP93f//3d3fMxxER/xERERER/3zMd3d3d3d3f///d3zM8REREREREREf93d3d3d3d3d3d///d3zMERERERERERH/d3d3d3d3d3d3f//3d8zBERERERERERd3d3f///d3d3d3//93fMzP8RERERERH//3d3zP/3d//////3d3d8wRERERERER//93d8z/93f/////93d3fMEREREREREc//d3fMx3f//MzMd3d3d3dxERERERERHMx3d3d3d//8zMAPd3zMzHERERERERH/d3d3d3d3f3fMzwDMzAD8zBERERERER/3d3d3d3d393zM8AzMwA/MwRERERERH913d///d3d/d3AAzMzMAAzMERERERERREd3fM/3d//3d//MzMzMwP/BEREREREURHd3zP93f/93f/zMzMzMD/wRERERERFP/3d8zHd3//d3d3zMzMzAAMERERERER//93d3d3d//3d3d8zMzMwP8BEREREREf//d3d3d3f/93d3fMzMzMD/ARERERERFMzHf/93d3/3d3d3EczM/wABERERERERR3x3fMd3f/93d3dxEREREREREREREREUd8d3zHd3//d3d3cRERERERERERERERFHd3d3d///d3d3dxERERERERERERERERR3d3f///93d3dxEREREREREREREREREUd3d3////d3d3cRERERERERERERERERH//////3d3d3d8ERERERERERERERERER/////MzMx3fMz/8REREREREREREREREf////zMzMd3zM//EREREREREREREREREf/8zMzMzMzMzP//ERERERERERERERERERzMzM/8zP/xEREREREREREREREREREREczMzP/Mz/8REREREREREREREREREREczMzMz//8///xERERERERERERERERERA=")) diff --git a/apps/bowserWF/app.js b/apps/bowserWF/app.js new file mode 100644 index 000000000..e53d945cc --- /dev/null +++ b/apps/bowserWF/app.js @@ -0,0 +1,102 @@ +var sprite = { + width : 47, height : 47, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("kmSpICFn/+BAwCImV//VICJuT//SogRMpmT/2SCJtSyQDB/4RMymRkmX/gRLygDC3/piVhCJElAYf/pNIkgRIlIDCl/6pVBkIRIGwWJEYPypMJCI9KGwQRBLANIPRI2CGoPkyVCBwmeyVLTYNJom8yImBz4gEqV/6Vf+g2BPwf/IIq8C/+kyVRkgDBp/5CIX/+mkz/+y/9BIOf0v6///5LdCz+kCIOk34RBYQMSp5XBGQVk/pNBAQP/9IyBxGSv4yCk/1OIK8EC4QgEpM/JgJ+EGoIRBTApQCEYvplLOFXIIdBO4SqBeQJABGoeTDQMlk5WCAAPSYQLgEz4aBlM/9IgB/7CCcAvP/QsBiVfUwOJBgUiCIcmpAVCy/+pMAKwMkRgIRCp6VBAwW6qVOgmSgPkwgRDv53E6WSuEkyEPRgmf2VJv5HBl2SgAKBwEJRgnJiVKp/Sr/0y/yBQOQv56DKwVSv2STwO/DgWD/BADmaDByRoBYoQRCgFCCIf/+jgDNwOUAwMg/kSPQbODX4IJBAwUH8B6DsmRl5oBl7OBklMyV+gBoDycSxMpiVLZwS8EAQeYyjaByR6BBIJBDAQnEIgbFCogOFRgQDBr//I4L0EAQsxAYP//5WCGQ6MCAAKbCpKYEAQiMB//kIQOUyf+CJF/CIIEBTYOfcgQRHBQv/CJKnBpP8GRTCDJIPkGRQCB5I3C/n/EZUgA")) +}; + +const boxes = { + width : 122, height : 56, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("kmZkmSpICPwgDBmQUQAQMJAYNkFiOSiQDB5JESAYQsSpADByYsSyBZBydt23bAR+wgFJkwUQAQNggGSposR23AgMkzZESwECpM2IiUAgmSFiW2gDlBFiVsgDlBFiXYgDNBL4MDWZy2FgEGWZy2FgENWZy2EL4MbWZpTBWwZfBXJpTCWwZiCWZpTBWwZiCWZsbWwhiCWZpWCWwTORWwgXRWwgXRWwZESWwZESWwZESWwYXRWwgXRW362/W362/W362/W362/W362/W362/W362/W362/W362/W362/WwuAgazOWwsAgyzOWwsAhqzOWwhfBjazNKYK2DL4K5NKYS2DMQSzNKYK2DMQSzNja2EMQSzNKwS2CZyK2EC6K2EC6K2DIiS2DIiS2DIiUAFoMAAFTkBFtckyAtrLgWSpICnLIIsqyVAgAsqpIA=")) +}; + +const background = { + width : 176, height : 176, bpp : 3, + transparent : 5, + buffer : require("heatshrink").decompress(atob("kmSpIC/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/ATWAgEAIP1///8iRB8gf/AAOCIPdIIARBBoJB/+E4IP4ABghB9v4CB8BB5g/92//9pB7wP/97FEIO9IgDACAAn8iVBIOlHH4xBDnA+wyY9IAAmB/BB//5B/IOQ/OAARBup5B/yV/IP5B/IP5BRt5B7/wDC7aD8/w+B+3bBgP7IP5B7HYNt23/AQPfIPX/9oCC24IDINwCBIRAAHIOACBHI3+g4EC/l/4BByAQkA//wpED//4gGAhJB3pMAgQFBgEBH3AC/AX4C/AX4C/AX4C/AX4C/AUOAgBB/v//ghB9gf///gH3UgiVIIAJBBwRB5j+CIIf8uBB5//wIIXb//+hJB6o/92/7v5B7/0/97GCIPYAG4MgIP/BjkSIP34/hB//5B/AAQ+0IP5B/IP5BN7ZB97///wCBIPX93yAB2wCB+5B5tv//dt24CB35B5v/+n/t+P/I4PH8ESIO38gFA/+CgH/+EIgiD3gACCPoMAgQ+2AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/ASVIgAACgRB/IPY8GkAHBiRB/IPBLKgJB/IP5B/AQUAkmQghB/IP2AgEAyVAiRB/IP5BBpMAIP5B/IIUkgBB/IP5BpoAsBgJBOgEEIIoIBIP5BlyE27dt2EEIJ4CBBAlIgRBgpEAhu2IIO24ESQwxB/IJQhGkEJIL8GHwQCDgOweQpB/IKMkwAKJILVgAofYeQhBzsEAIKICLoESILmBQARBBtuwgZB3kA4B4ENIgJBcpMAIMYCDIOcAgEbHYgCGsEJkhEBE6cBIP5BZfYQ+JIIkDsEBIP5BVyEAIKtAHxgCDwBEBINk2IKCGCIKmSpECIP5BUkEBHyACD2BBUFoMJIP5BSpEbHyQCDIP5BXkmAIP5B/AQcAbKJB/ILH/AAP8hM/AgWSv4KCAAP+gmfAoXJk4ME//gpIEC8mTBgvwkgEC+QRDAAX4gVPAgP5kgsCLwWQh/kMIUf5LuFg4jBAoMBKAJ5EwF/AoUA/yFFoE/CI6RDgY+BCIQsDIP5B/IP5B/IP5B/IJ/AIJfghJBKv0EIJcAIJfwIP5BMhMAAAMEz5BGgmABoVJII9IBgUkII8kBgUSII8CoAMBhJB/IIsQoMAYoP/AAP4YpAMC/+BII9/BgXAYpAMC8DFIBgXwIIcCIP6DCgkQh/kCIRBIbQcBIJAFCgBBICI5BE/IRDFgQA=")) +}; + +numbersDims = { + width: 20, + height: 44 +}; +const numbers = [ + require("heatshrink").decompress(atob("ikswcBkmSpIC/ARGQKYQIDAwUEBxMAAQNAgECpMgAQMkB4IOIAQQLCgEQBwQaBgEBB1oCBBwYCCiRWDCIRWEO5wOHAX4CnA=")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/ARNIKYIIEwEAggOKNIQODyAHCBxQsWB3TUFgMgA4sSBwzU/AVA=")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/AQ8gKggIBAwkCBw+QCIQLCgIRCDQcQBwwyDDwUSCgVAAwIOBEwI7EpI7FBw4FDghZGHwgOEF4Y+CEYQ+DBxQADNAIAFNAIOFa/4CoA=")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/AQ8gKosSAwsBBw4aCoEAgQjEBoIpEBwtIBoIUEwEAggUDBwwyDDoWQA4ZWHhIIEJQoOCgI+EBwMQEAYOJO4oLBO4oRDJQrX/AU4")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/ARNIKgQIDwAGBgQOJNQYOCyAHDBxEggB6BBwYDBiVABxIjBCIIODF4YOEAAkBV40QBwxiDNAosEB0IC/AUg")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/AQ5UFkmQAwkCBxIdGCIIIDBxAsTgAaEkEASooOBiQOVJQgOBiBKDBxMSJQwRBLIgRCBwjX/AVA=")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/ARGQKgYICAwcCBxADBiQdDkEANYoOGEAYyEHYoOIHYqfFBxIdDBAMQFgZHCBysSFgwRBO46GFa/4CnA")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/AQ5VGiAGFgIOIDQUgBwUCEYQOJGQYNBHAlADQgOHwEAggUDpANBCgYpBBwmQAwJiGhIjDB1gC/AU4A=")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/AQ8gKYYICAwcEBxGQgAaDgVJgACBDQQOJgB6CBwcAiQODHa4AEhIRBpAHDiARBwAGCgIgCFIYOCFIYOHiQrEJQxlCBwzX/AVAA=")), + require("heatshrink").decompress(atob("ikswcBkmSpIC/AQ8gKggIBAwkCBw+QCIQLCgIRCDQcQBzkSTAsBHYoOIL4gOCMooOENAYOCoA4EBwoqDgiGGF4gOEa/4CoA=")), +]; +digitPositions = [ // relative to the box + {x:13, y:6}, {x:32, y:6}, + {x:74, y:6}, {x:93, y:6}, +]; + +var drawTimeout; +const animation_duration = 1; // seconds +const animation_steps = 20; +const jump_height = 45; // top coordinate of the jump +const seconds_per_minute = 60; + +function draw() { + const now = new Date(); + g.drawImage(background, 0, 0); + var boxTL_x = 27; var boxTL_y = 29; + var sprite_TL_x = 72; var sprite_TL_y = 161 - sprite.height; + const seconds = now.getSeconds()%seconds_per_minute + now.getMilliseconds()/1000; + const hours = now.getHours(); + const minutes = now.getMinutes(); + + var time_advance = seconds / animation_duration; + + if (time_advance < 0.5) { + sprite_TL_y += (jump_height - sprite_TL_y) * time_advance * 2; + } else if (time_advance < 1) { + sprite_TL_y = jump_height + (sprite_TL_y-jump_height) * (time_advance-0.5) * 2; + } + const box_penetration = boxTL_y + boxes.height - sprite_TL_y; + if (box_penetration > 0) { + boxTL_y -= box_penetration; + } + g.drawImage(boxes, boxTL_x, boxTL_y); + g.drawImage(numbers[(hours / 10) >> 0], boxTL_x+digitPositions[0].x, boxTL_y+digitPositions[0].y); + g.drawImage(numbers[(hours % 10) >> 0], boxTL_x+digitPositions[1].x, boxTL_y+digitPositions[1].y); + g.drawImage(numbers[(minutes / 10) >> 0], boxTL_x+digitPositions[2].x, boxTL_y+digitPositions[2].y); + g.drawImage(numbers[(minutes % 10) >> 0], boxTL_x+digitPositions[3].x, boxTL_y+digitPositions[3].y); + g.drawImage(sprite, sprite_TL_x, sprite_TL_y); + Bangle.drawWidgets(); + + const timeout = time_advance <= 1? + animation_duration / animation_steps + : (seconds_per_minute - seconds); + setTimeout( _=>{ + drawTimeout = undefined; + draw(); + }, timeout * 1000); +} + +// Clear the screen once, at startup +g.setTheme({bg:"#00f",fg:"#fff",dark:true}).clear(); + +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) { + clearTimeout(drawTimeout); + } + drawTimeout = undefined; + } +}); + +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); + +draw(); diff --git a/apps/bowserWF/app.png b/apps/bowserWF/app.png new file mode 100644 index 000000000..724d63078 Binary files /dev/null and b/apps/bowserWF/app.png differ diff --git a/apps/bowserWF/metadata.json b/apps/bowserWF/metadata.json new file mode 100644 index 000000000..22df2dea4 --- /dev/null +++ b/apps/bowserWF/metadata.json @@ -0,0 +1,14 @@ +{ "id": "bowserWF", + "name": "Bowser Watchface", + "shortName":"Bowser Watchface", + "version":"0.01", + "description": "Let bowser show you the time", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"bowserWF.app.js","url":"app.js"}, + {"name":"bowserWF.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/bthrm/ChangeLog b/apps/bthrm/ChangeLog index 3354a19e8..58d002f22 100644 --- a/apps/bthrm/ChangeLog +++ b/apps/bthrm/ChangeLog @@ -17,3 +17,6 @@ 0.06: Fix bug if no request waiting time is set Fix bug if no connection data was cached Fix error during disconnect +0.07: Recorder icon only blue if values actually arive + Adds some preset modes and a custom one + Restructure the settings menu diff --git a/apps/bthrm/README.md b/apps/bthrm/README.md index f0c7775c2..42ad619bd 100644 --- a/apps/bthrm/README.md +++ b/apps/bthrm/README.md @@ -29,6 +29,7 @@ Heart Rate Service (`180D`) and characteristic (`2A37`). So far it has been tested on: * CooSpo Bluetooth Heart Rate Monitor +* Wahoo TICKR X 2 ## Internals @@ -36,7 +37,6 @@ This replaces `Bangle.setHRMPower` with its own implementation. ## TODO -* Maybe a `bthrm.settings.js` and app (that calls it) to enable it to be turned on and off * A widget to show connection state? * Specify a specific device by address? diff --git a/apps/bthrm/boot.js b/apps/bthrm/boot.js index 6ac6382d6..339f6f8c6 100644 --- a/apps/bthrm/boot.js +++ b/apps/bthrm/boot.js @@ -548,9 +548,7 @@ E.on("kill", ()=>{ if (gatt && gatt.connected){ log("Got killed, trying to disconnect"); - var promise = gatt.disconnect(); - promise.then(()=>log("Disconnected on kill")); - promise.catch((e)=>log("Error during disconnnect on kill", e)); + var promise = gatt.disconnect().then(()=>log("Disconnected on kill")).catch((e)=>log("Error during disconnnect on kill", e)); } }); } diff --git a/apps/bthrm/default.json b/apps/bthrm/default.json index c973eef25..64e638b8a 100644 --- a/apps/bthrm/default.json +++ b/apps/bthrm/default.json @@ -1,4 +1,5 @@ { + "mode": 1, "enabled": true, "replace": true, "debuglog": false, @@ -6,6 +7,12 @@ "allowFallback": true, "warnDisconnect": false, "fallbackTimeout": 10, + "custom_replace": false, + "custom_debuglog": false, + "custom_startWithHrm": false, + "custom_allowFallback": false, + "custom_warnDisconnect": false, + "custom_fallbackTimeout": 10, "gracePeriodNotification": 0, "gracePeriodConnect": 0, "gracePeriodService": 0, diff --git a/apps/bthrm/metadata.json b/apps/bthrm/metadata.json index 9aea5f3aa..1c21269e2 100644 --- a/apps/bthrm/metadata.json +++ b/apps/bthrm/metadata.json @@ -2,7 +2,7 @@ "id": "bthrm", "name": "Bluetooth Heart Rate Monitor", "shortName": "BT HRM", - "version": "0.06", + "version": "0.07", "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", "icon": "app.png", "type": "app", @@ -12,7 +12,7 @@ "storage": [ {"name":"bthrm.app.js","url":"bthrm.js"}, {"name":"bthrm.recorder.js","url":"recorder.js"}, - {"name":"bthrm.boot.js","url":"boot.js"}, + {"name":"bthrm.0.boot.js","url":"boot.js"}, {"name":"bthrm.img","url":"app-icon.js","evaluate":true}, {"name":"bthrm.settings.js","url":"settings.js"}, {"name":"bthrm.default.json","url":"default.json"} diff --git a/apps/bthrm/recorder.js b/apps/bthrm/recorder.js index 938990362..21345a907 100644 --- a/apps/bthrm/recorder.js +++ b/apps/bthrm/recorder.js @@ -32,7 +32,7 @@ Bangle.removeListener('BTHRM', onHRM); if (Bangle.setBTRHMPower) Bangle.setBTHRMPower(0,"recorder"); }, - draw : (x,y) => g.setColor((Bangle.isBTHRMConnected && Bangle.isBTHRMConnected())?"#00f":"#88f").drawImage(atob("DAwBAAAAMMeef+f+f+P8H4DwBgAA"),x,y) + draw : (x,y) => g.setColor((bpm != "")?"#00f":"#88f").drawImage(atob("DAwBAAAAMMeef+f+f+P8H4DwBgAA"),x,y) }; } }) diff --git a/apps/bthrm/settings.js b/apps/bthrm/settings.js index 62d2e7ea3..beefb00e9 100644 --- a/apps/bthrm/settings.js +++ b/apps/bthrm/settings.js @@ -20,182 +20,147 @@ var mainmenu = { '': { 'title': 'Bluetooth HRM' }, '< Back': back, - 'Use BT HRM': { - value: !!settings.enabled, - format: v => settings.enabled ? "On" : "Off", + 'Mode': { + value: 0 | settings.mode, + min: 0, + max: 3, + format: v => ["Off", "Default", "Both", "Custom"][v], onchange: v => { - writeSettings("enabled",v); + settings.mode = v; + switch (v){ + case 0: + writeSettings("enabled",false); + break; + case 1: + writeSettings("enabled",true); + writeSettings("replace",true); + writeSettings("debuglog",false); + writeSettings("startWithHrm",true); + writeSettings("allowFallback",true); + writeSettings("fallbackTimeout",10); + break; + case 2: + writeSettings("enabled",true); + writeSettings("replace",false); + writeSettings("debuglog",false); + writeSettings("startWithHrm",false); + writeSettings("allowFallback",false); + break; + case 3: + writeSettings("enabled",true); + writeSettings("replace",settings.custom_replace); + writeSettings("debuglog",settings.custom_debuglog); + writeSettings("startWithHrm",settings.custom_startWithHrm); + writeSettings("allowFallback",settings.custom_allowFallback); + writeSettings("fallbackTimeout",settings.custom_fallbackTimeout); + break; + } + writeSettings("mode",v); } }, - 'Replace HRM': { - value: !!settings.replace, - format: v => settings.replace ? "On" : "Off", - onchange: v => { - writeSettings("replace",v); - } - }, - 'Start with HRM': { - value: !!settings.startWithHrm, - format: v => settings.startWithHrm ? "On" : "Off", - onchange: v => {(function(back) { - function writeSettings(key, value) { - var s = require('Storage').readJSON(FILE, true) || {}; - s[key] = value; - require('Storage').writeJSON(FILE, s); - readSettings(); - } + 'Custom Mode': function() { E.showMenu(submenu_custom); }, + 'Debug': function() { E.showMenu(submenu_debug); } + }; - function readSettings(){ - settings = Object.assign( - require('Storage').readJSON("bthrm.default.json", true) || {}, - require('Storage').readJSON(FILE, true) || {} - ); - } - - var FILE="bthrm.json"; - var settings; - readSettings(); - - var mainmenu = { - '': { 'title': 'Bluetooth HRM' }, - '< Back': back, - 'Use BT HRM': { - value: !!settings.enabled, - format: v => settings.enabled ? "On" : "Off", + var submenu_debug = { + '' : { title: "Debug"}, + '< Back': function() { E.showMenu(mainmenu); }, + 'Alert on disconnect': { + value: !!settings.warnDisconnect, + format: v => settings.warnDisconnect ? "On" : "Off", onchange: v => { - writeSettings("enabled",v); + writeSettings("warnDisconnect",v); } }, - 'Replace HRM': { - value: !!settings.replace, - format: v => settings.replace ? "On" : "Off", + 'Debug log': { + value: !!settings.debuglog, + format: v => settings.debuglog ? "On" : "Off", onchange: v => { - writeSettings("replace",v); + writeSettings("debuglog",v); + } + }, + 'Grace periods': function() { E.showMenu(submenu_grace); } + }; + + var submenu_custom = { + '' : { title: "Custom mode"}, + '< Back': function() { E.showMenu(mainmenu); }, + 'Replace HRM': { + value: !!settings.custom_replace, + format: v => settings.custom_replace ? "On" : "Off", + onchange: v => { + writeSettings("custom_replace",v); } }, 'Start w. HRM': { - value: !!settings.startWithHrm, - format: v => settings.startWithHrm ? "On" : "Off", + value: !!settings.custom_startWithHrm, + format: v => settings.custom_startWithHrm ? "On" : "Off", onchange: v => { - writeSettings("startWithHrm",v); + writeSettings("custom_startWithHrm",v); } }, 'HRM Fallback': { - value: !!settings.allowFallback, - format: v => settings.allowFallback ? "On" : "Off", + value: !!settings.custom_allowFallback, + format: v => settings.custom_allowFallback ? "On" : "Off", onchange: v => { - writeSettings("allowFallback",v); + writeSettings("custom_allowFallback",v); } }, 'Fallback Timeout': { - value: settings.fallbackTimeout, + value: settings.custom_fallbackTimeout, min: 5, max: 60, step: 5, format: v=>v+"s", onchange: v => { - writeSettings("fallbackTimout",v*1000); + writeSettings("custom_fallbackTimout",v*1000); } }, - 'Conn. Alert': { - value: !!settings.warnDisconnect, - format: v => settings.warnDisconnect ? "On" : "Off", + }; + + var submenu_grace = { + '' : { title: "Grace periods"}, + '< Back': function() { E.showMenu(submenu_debug); }, + 'Request': { + value: settings.gracePeriodRequest, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", onchange: v => { - writeSettings("warnDisconnect",v); + writeSettings("gracePeriodRequest",v); } }, - 'Debug log': { - value: !!settings.debuglog, - format: v => settings.debuglog ? "On" : "Off", + 'Connect': { + value: settings.gracePeriodConnect, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", onchange: v => { - writeSettings("debuglog",v); + writeSettings("gracePeriodConnect",v); } }, - 'Grace periods >': function() { E.showMenu(submenu); } - }; - - var submenu = { - '' : { title: "Grace periods"}, - '< Back': function() { E.showMenu(mainmenu); }, - 'Request': { - value: settings.gracePeriodRequest, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodRequest",v); - } - }, - 'Connect': { - value: settings.gracePeriodConnect, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodConnect",v); - } - }, - 'Notification': { - value: settings.gracePeriodNotification, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodNotification",v); - } - }, - 'Service': { - value: settings.gracePeriodService, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodService",v); - } - } - }; - - E.showMenu(mainmenu); -}) - writeSettings("startWithHrm",v); - } - }, - 'Fallback to HRM': { - value: !!settings.allowFallback, - format: v => settings.allowFallback ? "On" : "Off", - onchange: v => { - writeSettings("allowFallback",v); - } - }, - 'Fallback Timeout': { - value: settings.fallbackTimeout, - min: 5, - max: 60, - step: 5, - format: v=>v+"s", - onchange: v => { - writeSettings("fallbackTimout",v*1000); - } - }, - 'Conn. Alert': { - value: !!settings.warnDisconnect, - format: v => settings.warnDisconnect ? "On" : "Off", - onchange: v => { - writeSettings("warnDisconnect",v); - } - }, - 'Debug log': { - value: !!settings.debuglog, - format: v => settings.debuglog ? "On" : "Off", - onchange: v => { - writeSettings("debuglog",v); - } - }, - 'Grace periods': function() { E.showMenu(submenu); } + 'Notification': { + value: settings.gracePeriodNotification, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", + onchange: v => { + writeSettings("gracePeriodNotification",v); + } + }, + 'Service': { + value: settings.gracePeriodService, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", + onchange: v => { + writeSettings("gracePeriodService",v); + } + } }; var submenu = { diff --git a/apps/contourclock/ChangeLog b/apps/contourclock/ChangeLog index b8d01ff86..0b6709d24 100644 --- a/apps/contourclock/ChangeLog +++ b/apps/contourclock/ChangeLog @@ -3,3 +3,4 @@ 0.21: Fixed settings menu, four more fonts 0.22: Changed timing code, original "Nunito" Font is back! 0.23: Customizer! Unused fonts no longer take up precious memory. +0.24: Added previews to the customizer. diff --git a/apps/contourclock/custom.html b/apps/contourclock/custom.html index 7d780d39c..602182573 100644 --- a/apps/contourclock/custom.html +++ b/apps/contourclock/custom.html @@ -1,70 +1,74 @@
+ +