diff --git a/apps.json b/apps.json index f79f74488..c76f8dcfa 100644 --- a/apps.json +++ b/apps.json @@ -219,6 +219,23 @@ {"name":"*mouse","url":"animals-mouse.js","evaluate":true} ] }, + { + "id": "start", + "name": "NCEU Startup", + "icon": "start.png", + "description": "NodeConfEU 2019 Startup Sequence", + "tags": "start", + "storage": [ + {"name":"+start","url":"start.json"}, + {"name":"-start","url":"start.js"}, + {"name":"*start","url":"start-icon.js"}, + {"name":"*bangle","url":"start-bangle.js"}, + {"name":"*nceu","url":"start-nceu.js"}, + {"name":"*nfr","url":"start-nfr.js"}, + {"name":"*nodew","url":"start-nodew.js"}, + {"name":"*tf","url":"start-tf.js"} + ] + }, { "id": "qrcode", "name": "Custom QR Code", "icon": "qrcode.png", diff --git a/apps/bootloader.js b/apps/bootloader.js index 642af0c83..cc9f29a0f 100644 --- a/apps/bootloader.js +++ b/apps/bootloader.js @@ -1,86 +1,96 @@ E.setTimeZone(1); E.setFlags({pretokenise:1}); -setWatch(function() { - Bangle.setLCDMode("direct"); - g.clear(); - clearInterval(); - clearWatch(); - Bangle.removeAllListeners(); - - var s = require("Storage"); - apps = s.list().filter(a=>a[0]=='+').map(app=>{ - try { return s.readJSON(app); } - catch (e) { return {name:"DEAD: "+app.substr(1)} } - }).filter(app=>app.type=="app" || app.type=="clock" || !app.type); - var selected = 0; - var menuScroll = 0; - var menuShowing = false; - - function drawMenu() { - g.setFont("6x8",2); - g.setFontAlign(-1,0); - var n = 3; - if (selected>=n+menuScroll) menuScroll = 1+selected-n; - if (selectedn+menuScroll) g.fillPoly([120,239,100,219,140,219]); - else g.clearRect(100,219,140,239); - for (var i=0;i0) { - selected--; - drawMenu(); - } - }, BTN1, {repeat:true}); - setWatch(function() { - if (selected+1a[0]=='+').map(app=>{ + try { return s.readJSON(app); } + catch (e) { return {name:"DEAD: "+app.substr(1)} } + }).filter(app=>app.type=="app" || app.type=="clock" || !app.type); + var selected = 0; + var menuScroll = 0; + var menuShowing = false; + + function drawMenu() { + g.setFont("6x8",2); + g.setFontAlign(-1,0); + var n = 3; + if (selected>=n+menuScroll) menuScroll = 1+selected-n; + if (selectedn+menuScroll) g.fillPoly([120,239,100,219,140,219]); + else g.clearRect(100,219,140,239); + for (var i=0;iWIDGETS[k].draw()); + drawMenu(); + setWatch(function() { + if (selected>0) { + selected--; + drawMenu(); + } + }, BTN1, {repeat:true}); + setWatch(function() { + if (selected+1WIDGETS[k].draw()); + } + + var clockApp = require("Storage").list().filter(a=>a[0]=='+').map(app=>{ + try { return require("Storage").readJSON(app); } + catch (e) {} + }).find(app=>app.type=="clock"); + if (clockApp) eval(require("Storage").read(clockApp.src)); + else E.showMessage("No Clock Found"); + delete clockApp; + require("Storage").list().filter(a=>a[0]=='=').forEach(widget=>eval(require("Storage").read(widget))); + setTimeout(drawWidgets,100); } -var clockApp = require("Storage").list().filter(a=>a[0]=='+').map(app=>{ - try { return require("Storage").readJSON(app); } - catch (e) {} -}).find(app=>app.type=="clock"); -if (clockApp) eval(require("Storage").read(clockApp.src)); -else E.showMessage("No Clock Found"); -delete clockApp; -require("Storage").list().filter(a=>a[0]=='=').forEach(widget=>eval(require("Storage").read(widget))); -setTimeout(drawWidgets,100); diff --git a/apps/settings-default.json b/apps/settings-default.json index bc95dd686..7c395b0d9 100644 --- a/apps/settings-default.json +++ b/apps/settings-default.json @@ -1,4 +1,6 @@ { + ble: false, // Bluetooth disabled by default + dev: false, // Espruino IDE disabled by default timeout: 10, // Default LCD timeout in seconds vibrate: true, // Vibration enabled by default. App must support beep: true, // Beep enabled by default. App must support diff --git a/apps/settings-init.js b/apps/settings-init.js index a4209c50e..cf3a017c9 100644 --- a/apps/settings-init.js +++ b/apps/settings-init.js @@ -1,80 +1,91 @@ (function() { var s = require('Storage').readJSON('@setting'); - var adv = { uart: true }; - if (s.HID) { - // Report from https://notes.iopush.net/custom-usb-hid-device-descriptor-media-keyboard/ - Bangle.HID = new Uint8Array([ - // Keyboard Controls - 0x05, 0x01, - 0x09, 0x06, - 0xA1, 0x01, - 0x85, 0x02, - 0x05, 0x07, - 0x19, 0xe0, - 0x29, 0xe7, - 0x15, 0x00, - 0x25, 0x01, - 0x75, 0x01, - 0x95, 0x08, - 0x81, 0x02, - 0x95, 0x01, - 0x75, 0x08, - 0x81, 0x01, - 0x95, 0x05, - 0x75, 0x01, - 0x05, 0x08, - 0x19, 0x01, - 0x29, 0x05, - 0x91, 0x02, - 0x95, 0x01, - 0x75, 0x03, - 0x91, 0x01, - 0x95, 0x06, - 0x75, 0x08, - 0x15, 0x00, - 0x25, 0x73, - 0x05, 0x07, - 0x19, 0x00, - 0x29, 0x73, - 0x81, 0x00, - 0x09, 0x05, - 0x15, 0x00, - 0x26, 0xFF, 0x00, - 0x75, 0x08, - 0x95, 0x02, - 0xB1, 0x02, - 0xC0, + if (s.ble) { + if (s.dev) + Bluetooth.setConsole(); + else + LoopbackA.setControl(true); + var adv = { uart: true }; + if (s.HID) { + // Report from https://notes.iopush.net/custom-usb-hid-device-descriptor-media-keyboard/ + Bangle.HID = new Uint8Array([ + // Keyboard Controls + 0x05, 0x01, + 0x09, 0x06, + 0xA1, 0x01, + 0x85, 0x02, + 0x05, 0x07, + 0x19, 0xe0, + 0x29, 0xe7, + 0x15, 0x00, + 0x25, 0x01, + 0x75, 0x01, + 0x95, 0x08, + 0x81, 0x02, + 0x95, 0x01, + 0x75, 0x08, + 0x81, 0x01, + 0x95, 0x05, + 0x75, 0x01, + 0x05, 0x08, + 0x19, 0x01, + 0x29, 0x05, + 0x91, 0x02, + 0x95, 0x01, + 0x75, 0x03, + 0x91, 0x01, + 0x95, 0x06, + 0x75, 0x08, + 0x15, 0x00, + 0x25, 0x73, + 0x05, 0x07, + 0x19, 0x00, + 0x29, 0x73, + 0x81, 0x00, + 0x09, 0x05, + 0x15, 0x00, + 0x26, 0xFF, 0x00, + 0x75, 0x08, + 0x95, 0x02, + 0xB1, 0x02, + 0xC0, - // Music Controls - 0x05, 0x0C, - 0x09, 0x01, - 0xA1, 0x01, - 0x85, 0x01, - 0x15, 0x00, - 0x25, 0x01, - 0x75, 0x01, - 0x95, 0x01, - 0x09, 0xB5, - 0x81, 0x02, - 0x09, 0xB6, - 0x81, 0x02, - 0x09, 0xB7, - 0x81, 0x02, - 0x09, 0xB8, - 0x81, 0x02, - 0x09, 0xCD, - 0x81, 0x02, - 0x09, 0xE2, - 0x81, 0x02, - 0x09, 0xE9, - 0x81, 0x02, - 0x09, 0xEA, - 0x81, 0x02, - 0xC0 - ]); - adv.hid = Bangle.HID; + // Music Controls + 0x05, 0x0C, + 0x09, 0x01, + 0xA1, 0x01, + 0x85, 0x01, + 0x15, 0x00, + 0x25, 0x01, + 0x75, 0x01, + 0x95, 0x01, + 0x09, 0xB5, + 0x81, 0x02, + 0x09, 0xB6, + 0x81, 0x02, + 0x09, 0xB7, + 0x81, 0x02, + 0x09, 0xB8, + 0x81, 0x02, + 0x09, 0xCD, + 0x81, 0x02, + 0x09, 0xE2, + 0x81, 0x02, + 0x09, 0xE9, + 0x81, 0x02, + 0x09, 0xEA, + 0x81, 0x02, + 0xC0 + ]); + adv.hid = Bangle.HID; + } + NRF.setServices({}, adv); + try { + NRF.wake(); + } catch (e) {} + } else { + NRF.sleep(); } - NRF.setServices(undefined, adv); if (!s.vibrate) Bangle.buzz=()=>Promise.resolve(); if (!s.beep) Bangle.beep=()=>Promise.resolve(); diff --git a/apps/settings.js b/apps/settings.js index e84a8112e..4903290ff 100644 --- a/apps/settings.js +++ b/apps/settings.js @@ -18,6 +18,8 @@ function updateSettings() { function resetSettings() { settings = { + ble: false, + dev: false, timeout: 10, vibrate: true, beep: true, @@ -40,6 +42,22 @@ const boolFormat = (v) => v ? "On" : "Off"; function showMainMenu() { const mainmenu = { '': { 'title': 'Settings' }, + 'BLE': { + value: settings.ble, + format: boolFormat, + onchange: () => { + settings.ble = !settings.ble; + updateSettings(); + } + }, + 'Dev': { + value: settings.dev, + format: boolFormat, + onchange: () => { + settings.dev = !settings.dev; + updateSettings(); + } + }, 'LCD Timeout': { value: settings.timeout, min: 0, diff --git a/apps/start-bangle.js b/apps/start-bangle.js new file mode 100644 index 000000000..26f38ae14 --- /dev/null +++ b/apps/start-bangle.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("s8wxH+AH4AQ/4AJJX5mmM/5m/AH5m/M34A/M35l/M35mqM/5m/AH5m/M34A/MqQKQJm5laOh7kNM35MGbiQxLM9osWIiZnGDI5m/VTBm/MsrOGM35maB4xm/MsoZFORZm/Fq5mDAAwUKBhAHBDJYLGAY4rOPShmRF44TIIoqlJCIxmKEZLMSBxY1GE5RTIJpwYSP5hmQZxodKLBKpIDBQZHMxS4MM1IKCMzKNQHJJmtFwbbUMy4AIM35mcJR5mbLCo1GZrxLOLZ6BMH5wOHMyAYRSRLOWGRY+MAxRmODCZeNMyLNMAA4TIBgpmPFA4YMHBZnPFIp/cADa0cC9Zm2J5YkKMtgsIGjZRTCYLMsFow0dDqJluGAgzhEJwxiAGpYLMn70hAA5N/M34A/M35mzJn5m/AH5nNJf5m/AH5m/M34A/M35m/MpgA=")) diff --git a/apps/start-icon.js b/apps/start-icon.js new file mode 100644 index 000000000..0302cadbc --- /dev/null +++ b/apps/start-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AHMPADQv/F+YxZYtb1wFto7SEbwwQBIsen0/ADU+jxfOjwtbAAYwDWZVWF79WfBAvEq4vfq4vIGQgviR44AEFz4vEGRQvnGA4v/F79YX9IHEq4aKh//jwvRrBcHG4ovL/4ABB5gAFRAwvVGIQveoAAIF4oABq0/CZIACF8BiBrAvTGIoaKF5AABIpVXd44AFJBQvKh4vOGBIvVL54vdX5iPhqztLoFYFpYvSh8/FxgABFpYvQRRgveoEP/8eFqAvbACi/CeA4IDP6IvUGIYGEF+EMADwvJR4ovmdoovnFoowDF8QsIF4dZF79ZF5RpCj1AFztAjy7JAAgwdFwbAFFwwAmF/4vhGFrxLFkoAvA=")) diff --git a/apps/start-nceu.js b/apps/start-nceu.js new file mode 100644 index 000000000..89a9850cc --- /dev/null +++ b/apps/start-nceu.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("o9HxH+AEOAwAkiIkIADIv5CEI/4/IJHbNLbPA4Iv1+JHREIwkmk2EJBBE2IoUnIwJHBCx5GoBA2DIgQACBw5G3aQQADwRG+wEmagQCBvxGufoQpDFxOCI4YNIDgxNeD4gDHCY+EwgMKBQIjGJDJlHA4YlKvzRHDRZHZDJQkMBZojVECb+OHJgkOZ6w6KCJAHJCgY1dK5wPDCg4GICYjDZBY9+vxGMArItLeRgWDwOEwmBJA5Ggv2GlMMwJGTwRFBI5JGfv2HlIACwRGRwBFDAAIUGIz+FIYMMI4R0CIxzSCRwhaMIBy2FAAaMBhmHI4QjIRqwUFIxxFJOgLTDlMGRqJHFwF+CpAWDIxgwJBgN+aoSMEIyAGBweDXBg6FABIWLAgOCw+GMhRGKByI9IIxYtQIywaJC5YTTIzwRGOyQqTIzLGNCTJGgXqIRTIzILIIzQvUI5a4EBgh6TDI7dKZJo7IAwQLFIzAjKIhwQGChBvMEhojLIqIjGBaZGPEbppOEerrLBYpGVEZrVOBpJjJIzCHNcpoqPI6gaUIywfSCLJGgXBYSZIzwRFCxoSGFSJGYCA4XLCRArQIywOJYxDPLFqA3OwFPp4HCy4lKHogAIM5uulukMIxGNy1MAAWW2JENFBJIMv8B0ksAAQQDIx2AptMpoCCChZGQGROYIocslsBIyGVIQNOp5HByhaMIxj9IAAWMIYUtRwiNPaIKNCpgUGIB4FNAAMXRq/+yhDBAAOUtJGlgKOCAAOvCJRGH2OVp1OypFGI0BHB0jUBzCMCIyAABtJEHI0RICIgYRMJBBGMCg4GICYgnPCBhHPBwQSIA5IUDGpxWOJBwgLfpgkOIhwVOEBj9WIipsKA4YiKgMBERojIIqphHAgYjKy+n1VpTJYjIADZlGEpOVlwABhTJKRL4oHFxIIEIgUKlula44/hShwIG1RFB02lJQJVII2zTC0iNBhVpI24vGgOmlpIBl2WagwWIJGFp1UKhRFGImI0FGouAaIoPIJGQMWJG5E7H5BE/I4pF/JA4kiA")) diff --git a/apps/start-nfr.js b/apps/start-nfr.js new file mode 100644 index 000000000..2a0ad70ea --- /dev/null +++ b/apps/start-nfr.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("5EuxH+AAkPABIQFABIaKDiIA/AH6qaVpwbbAH4A/YzysMDbYA/AH7GfVhbHgChrr0MT5FoTDobOQijH/Y/6aYcqzH/Y/5EeZDLHmFxTH/Y/4TVY84uJY/7H7TibHuC4rH5XmiHRZC7HpDAjSQF5QpJCgYGJY6Y8MFR4bJBSrITY9RNJb6LFNY5ALFP6CsVY55PQTzDH6MhrGPY7opYY7IZFAgqfRY9xzIWx7GQY6QsYFTTHQZDLHlL44ONDxIfJdKS3PA54qSCRL1MWpDIRY8yLNCg5FICB7ZMHZwrKaB4bQEpTHZH5bHgRhiZNbCTZSY5qBNHiDHZZCbHsOZjHPRSTHYOZbHyZDLH/Y8pQRY+zIYY8xPLG6bHsDJjHuUiTbQdTjHfQBjHYVaLHyUqbHoKJC2KCBgRDBA7HeThbHvZETHdVxKKPTkzISfJLHpZELHeOZLGOY9g8OY+TIgY74OJLqDHqFZIMJY/7HuFxRcPYJbHeXi7HUKAqGYCSgdRAH4A/XC7IdY/4A/Y9rIZY/4A/Y/7H/AH7H2ZDDH/AH7HvZC7H/SMrH/Io7IZDCoVIBgwNFBSA7JBRoZOJ5jboY6IOBY9oWKDpYLFApZkNH6YIHJ5BMNY97IZY6yvTTJCGRBwQRIExYVKB4zH+ZDDHpBQ7HgH5Q+QY/7IYY9KDJY6QeKY6xDOY/7H7BhRiPCRQGHA4SsRCJDH4ZDJqUfpQiIBR6UNDRISQOJ52TY9DIYNSyvSIZLfOAxoaIY/7HVZC4SQQBSJUC57HTDIw9QGZzH/Y7xmINyTHTAAwfKHyzH/OBTH3CRg1LYxAUFD5Y+QY9RXLLxQaWY6yIYY6g5SH57kHY9StRcbZPQQJivRC6AKJEBpGHBxrH/DcbHUEpQKQBojSPH5gpIXx7HjVp4caJkbjRGv4AkA==")) diff --git a/apps/start-nodew.js b/apps/start-nodew.js new file mode 100644 index 000000000..9233abefb --- /dev/null +++ b/apps/start-nodew.js @@ -0,0 +1 @@ +require('Storage').write('*nodew',require("heatshrink").decompress(atob("5E1xH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A6hEICD4A/AH7FlY6TJ/AH7G1Y6bI/AH7FyY6rJ/AH7GyY6zI/AH7H/Y/4A/Y3DHXg5g/AH4Ak5jH/AH4A/Y9VXq5l/AH4Ag47HjZAJm/AH7GgY5S9KZBjHDZH4A/Y9S5KBxrH/AH7GkY5DGOCIrHJZA4pGBiQAPKpAQLHKQmPADRSQY6LFQCZLHPQJjIeQqwKVHTLHoEpDISY4rIGJRbH/IjBYXC67GCY5LGRY7CCaY8hEPV87Ha4zHEYyoXGY6SOKY9IQJIhRDUY+YdEY64YCAgTIBY6CDPMBxRIDpAvMIaZALV5z/NFRrHH5glGYyqOFY4LIJDJoHKaZolPMZIRMUZAyLHxotLLJzHJ4zGBY8TICY6KXJO6wdQWiJCHGRp+QJaTINYoRbQY6bICZINRY8RJQDhowPY8RMYY5YABgR9US6MHgIwGJ5QMLE44GIURY4NBSoyKIZQRObhrIMg7HkgQvIJBapSBzrBPCBhdJY5w+NeBgAFzO93rIFY8AFBxmGwydKFxSFOMJR6JFZhXLIKbHVPhbHPZALJBZA7HcAgLFBY5qFYY+KsLY/DICY4rIWC4kC/2MY6CGJOZjWPRBy8KY95MHY62ZAoLICY64/G/zGIMRxcQdB7HWBZqeQEZxcIY7e9Y4ZMHY/AwJIByrOY7JzLCJAbNY8jITCozHVURqDRDrY/MGSDHWPhTHOZAbHFZCgxHY4gxGIJbrLT6AQIDiRLQOp7ITGBbHcZB4wKY5o+IOxwWLBoQdUY54zMCJTTQBQ6GSZAjHGZCJCLY5IA/AH4AWY5L7LBpzHDNH4A/ZEDHIXQoALaZLH/AH7HsZB4WHgTHCM34A/AELHjY34A/AErHhAH4A/AEzH/AH4A/Y8xe/AH7IwCsgA/AH7IiCkYA/AH7IjCcQA/AH7JkCMAA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHIA="))) diff --git a/apps/start-tf.js b/apps/start-tf.js new file mode 100644 index 000000000..5be986c32 --- /dev/null +++ b/apps/start-tf.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("+FrghC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AD0RiIEDiBG/KqAABKbp3/O7JYDO/530KjkBO/7NYKgQGCL4UBBAQLEAYINDNgYEBO4wYDAQIMEAH53JJwIDDBgYLFBIRvCRggFDEwYbEO/53Ma4RWDAwgLGO44MEO44MCUwgA/O4wAEcoRWBO4jRCfIbyCAQZqHBgYaDA4QA/O5RQCMYZ3GbQhnDA4ocDN4aSEO/53MLQh1DQYp3Od453DQYgA/O4wECO5UQO4cAO4wECd5YSDN/53PAQJxCAQoUCM4YCEd5QHCO/53PKAZ6HBYoHGO4INEEAryDAYIA/O55VEO5YLBRYh3/O7gGFO4YLGMAchAgZ3JBgR3/AG6WEAH53/AH4AqiMQIP532IH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/ACPdABPQG+nQAYR3/O/53/O/53/O/53/O/4AWho5yNpJ38ddh3/O55BCA4b+DBQwLDSYwJH5oGBEAx3NAwQHDEgggDSER3GHIY1GMgY0DA4iMHLA4IEO54oHO+JZFFQQIGIopuNBIR3VGYwyBBo53pNpB3HGoKBJBI53XGRB3HGQMMKoh3gMaJ3FJIbGEaBJ3RGRgSEIwh3megoJGIAZEECYRtECQhwECgqIKGRPQO5h2dGopOFNpJEIO4a7GdBR3QGRISECY533NwYhGDop3UChAyEAYR3sJIxkFIBJ3rBQY2GCYx3zCgoMHAwp3kEoQCDO/C5EA4ooHMRQAFO/53TCox3rOhB38eIoSGO8wFJO8wOLO45MEO5RiLO/53YNooZCO4xiOO6QlBO95aHO5o7DLAp3cGRIPEDQR3rOYp3S7hGDTQx3XNYp3FApB3iUIilEO5JODAAaVFBIp3UHhJ3/O6xwIO5wfGNQYGFIgp3jHQwOKbgjFJZBB3SD4xNGKZB3jPAqqIAopNIBJB3WHg53KOz6bILIx3LJwa3FBIfAA4XNO6o8HO9YA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4Ae")) diff --git a/apps/start.js b/apps/start.js new file mode 100644 index 000000000..52fa703f4 --- /dev/null +++ b/apps/start.js @@ -0,0 +1,137 @@ +var g = Graphics.getInstance(); +g.setFontAlign(1, 1, 0); +const d = g.getWidth() - 18; +function c(a) { + return { + width: 8, + height: a.length, + bpp: 1, + buffer: (new Uint8Array(a)).buffer + }; +} + +function welcome() { + var welcomes = [ + 'Welcome', + 'Failte', + 'Bienvenue', + 'Willkommen', + 'Bienvenido' + ]; + function next() { + var n = welcomes.shift(); + E.showMessage(n); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + welcomes.push(n); + } + return new Promise((res) => { + next(); + var i = setInterval(next, 2000); + setWatch(() => { + clearInterval(i); + clearWatch(); + E.showMessage('Loading...'); + res(); + }, BTN2, {repeat:false}); + }); +} + +function logos() { + var logos = [ + ['nfr', 20, 90, ()=>{}], + ['nceu', 20, 90, ()=>{ + g.setFont("6x8", 2); + g.setColor(0,0,1); + g.drawString('Welcome To', 160, 110); + g.drawString('NodeConfEU', 160, 130); + g.drawString('2019', 200, 150); + }], + ['bangle', 70, 90, ()=>{}], + ['nodew', 20, 90, ()=>{}], + ['tf', 5, 60, ()=>{}], + ]; + function next() { + var n = logos.shift(); + var img = require("Storage").read("*"+n[0]); + g.clear(); + g.drawImage(img, n[1], n[2]); + n[3](); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + logos.push(n); + } + return new Promise((res) => { + next(); + var i = setInterval(next, 2000); + setWatch(() => { + clearInterval(i); + clearWatch(); + res(); + }, BTN2, {repeat:false}); + }); +} + +function info() { + var slides = [ + () => E.showMessage('Visit\\nnodewatch.dev\\nfor info'), + () => E.showMessage('Visit\\nbanglejs.com/apps\\nfor apps'), + () => E.showMessage('Remember\\nto charge\\nyour watch!'), + () => { + g.clear(); + g.setFont('6x8',2); + g.setColor(1,1,1); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,40); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,194); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + g.drawString('Menu Up', d - 50, 42); + g.drawString('Select', d - 40, 118); + g.drawString('Menu Down', d - 60, 196); + }, + () => { + g.clear(); + E.showMessage('Hold both\\nto return\\nto clock'); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,40); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,194); + }, + () => { + g.clear(); + E.showMessage('Hold both\\nto reboot'); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,40); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + }, + () => E.showMessage('Open Settings\\nto enable\\nBluetooth') + ]; + function next() { + var n = slides.shift(); + n(); + slides.push(n); + } + return new Promise((res) => { + next(); + var i = setInterval(next, 2000); + setWatch(()=>{ + clearInterval(i); + clearWatch(); + res(); + }, BTN2, {repeat:false}); + }); +} + +function cleanup() { + E.showMessage('Loading...'); + var s = require('Storage'); + s.erase('*nfr'); + s.erase('*nceu'); + s.erase('*bangle'); + s.erase('*nodew'); + s.erase('*tf'); + s.erase('+start'); + s.erase('-start'); + s.erase('*start'); + return Promise.resolve(); +} + +welcome() + .then(logos) + .then(info) + .then(cleanup) + .then(load); diff --git a/apps/start.json b/apps/start.json new file mode 100644 index 000000000..09ecff467 --- /dev/null +++ b/apps/start.json @@ -0,0 +1,6 @@ +{ + "name": "Start", + "type": "app", + "icon": "*start", + "src": "-start" +} diff --git a/apps/start.png b/apps/start.png new file mode 100644 index 000000000..9df0974c8 Binary files /dev/null and b/apps/start.png differ