From 75f8f7b86ad31e41838d36d39f8413e3f34f2db6 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 8 Nov 2019 09:52:37 -0800 Subject: [PATCH 1/7] Setting to turn Bluetooth on and off --- apps/settings-default.json | 3 +- apps/settings-init.js | 153 +++++++++++++++++++------------------ apps/settings.js | 9 +++ 3 files changed, 91 insertions(+), 74 deletions(-) diff --git a/apps/settings-default.json b/apps/settings-default.json index 26d07d76a..9f73f1e7c 100644 --- a/apps/settings-default.json +++ b/apps/settings-default.json @@ -1,8 +1,9 @@ { + ble: false, // Bluetooth 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 timezone: 0, // Set the timezone for the device - HID : false, // BLE HID mode, off by default + HID: false, // BLE HID mode, off by default debug: false, // Debug mode disabled by default. App must support } diff --git a/apps/settings-init.js b/apps/settings-init.js index a4209c50e..16079801f 100644 --- a/apps/settings-init.js +++ b/apps/settings-init.js @@ -1,80 +1,87 @@ (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) { + 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(undefined, 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 245feae6b..6a11eab55 100644 --- a/apps/settings.js +++ b/apps/settings.js @@ -18,6 +18,7 @@ function updateSettings() { function resetSettings() { settings = { + ble: false, timeout: 10, vibrate: true, beep: true, @@ -39,6 +40,14 @@ const boolFormat = (v) => v ? "On" : "Off"; function showMainMenu() { const mainmenu = { '': { 'title': 'Settings' }, + 'BLE': { + value: settings.ble, + format: boolFormat, + onchange: () => { + settings.ble = !settings.ble; + updateSettings(); + } + }, 'LCD Timeout': { value: settings.timeout, min: 0, From 21274595f39bac57cb5af651b61ce9e5f43ffb61 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 8 Nov 2019 11:06:51 -0800 Subject: [PATCH 2/7] Initial start up app --- apps/start-bangle.js | 1 + apps/start-icon.js | 1 + apps/start-nceu.js | 1 + apps/start-nfr.js | 1 + apps/start-nodew.js | 1 + apps/start-tf.js | 1 + apps/start.js | 238 +++++++++++++++++++++++++++++++++++++++++++ apps/start.json | 13 +++ apps/start.png | Bin 0 -> 1936 bytes 9 files changed, 257 insertions(+) create mode 100644 apps/start-bangle.js create mode 100644 apps/start-icon.js create mode 100644 apps/start-nceu.js create mode 100644 apps/start-nfr.js create mode 100644 apps/start-nodew.js create mode 100644 apps/start-tf.js create mode 100644 apps/start.js create mode 100644 apps/start.json create mode 100644 apps/start.png 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..0c5e4007e --- /dev/null +++ b/apps/start.js @@ -0,0 +1,238 @@ +var g = Graphics.getInstance(); + +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});var g = Graphics.getInstance(); + +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 = [ + () => { + g.clear(); + g.setFont('6x8',2); + g.setColor(1,1,1); + g.drawString('Visit', 120, 80); + g.drawString('nodewatch.dev', 120, 110); + g.drawString('for info', 115, 140); + }, + () => { + g.clear(); + g.setFont('6x8',2); + g.setColor(1,1,1); + g.drawString('Remember', 120, 80); + g.drawString('to charge', 120, 110); + g.drawString('your watch!', 125, 140); + }, + () => { + g.clear(); + 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); + } + ]; + function next() { + var n = slides.shift(); + n(); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + slides.push(n); + } + return new Promise((res) => { + next(); + var i = setInterval(next, 2000); + setWatch(()=>{ + clearInterval(i); + clearWatch(); + res(); + }, BTN2, {repeat:false}); + }); +} + +welcome() + .then(logos) + .then(info) + .then(()=>E.showMessage('done')); + + + }); +} + +function info() { + var slides = [ + () => { + g.clear(); + g.setFont('6x8',2); + g.setColor(1,1,1); + g.drawString('Visit', 120, 80); + g.drawString('nodewatch.dev', 120, 110); + g.drawString('for info', 115, 140); + }, + () => { + g.clear(); + g.setFont('6x8',2); + g.setColor(1,1,1); + g.drawString('Remember', 120, 80); + g.drawString('to charge', 120, 110); + g.drawString('your watch!', 125, 140); + }, + () => { + } + ]; + function next() { + var n = slides.shift(); + n(); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + slides.push(n); + } + return new Promise((res) => { + next(); + var i = setInterval(next, 2000); + setWatch(()=>{ + clearInterval(i); + clearWatch(); + res(); + }, BTN2, {repeat:false}); + }); +} + +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..e97c0e7fe --- /dev/null +++ b/apps/start.json @@ -0,0 +1,13 @@ +{ + "name": "Start", + "type": "app", + "icon": "*start", + "src": "-start", + "files": [ + "*bangle", + "*nceu", + "*nfr", + "*nodew", + "*tf" + ] +} diff --git a/apps/start.png b/apps/start.png new file mode 100644 index 0000000000000000000000000000000000000000..9df0974c8bd0543ed0078c713b02d92481b341f2 GIT binary patch literal 1936 zcmV;B2XFX^P)gT7i55qqB|>Qf<$**b zDS}o&p;c*t7SX-|@1%hzc;Ky-Dzy?SZW{?ilL|F)i9-c-DJ3MTl8OZ41pJY>c5vjR zw&Ux&cMcD`vv=?2eyknm<4ChRJA3BL|37Eu%pcob1Ta!+I1V^TqF#eSIU#4$hPDJg+mVx_^{}NH0gYKs=Y7r#tb(wYG(jS! zU&{mTm4uZXc;{6U=!|(Dr_x|cX`yd=u^O<2(ZvRaz7u1qyCi4zkV zD$fC@8%3QEplFF4VS5th9SI`=7J;l9o&-t+hVyLAm=bt#J+6=$nxO6X?~xrokNCDq z-!84FXDF;+#q`(jrPy^FCiIGts004ubPYhp&=U`34!pTIOZ)SEq$d>`iGY%mIhLEsk{9_sM;l_TI006*^B7!461dwd8pn_uGoO)q9PPxixM=C*ta zJ6jd;W1LyL(M+`Hf{I8H@?>dnSH5an{4`2A1sP4L6U@OVTJ2o-Bb5q$w zHh_f-MdeGi7cwns70+Ea(J&yZ24UCT1y&e%F2zb*Z-061rEJR`rf{L{F_o*_TvBa; z6yaFp0aeYOEpS)S23uwy8fSYC?r1*zukFWOqLbZO!P35sI(9jZREmH34t@!n+m*-2Ny8 zf692gxklt8PgT8-eD;dck=)M+ilihUohzZOImq9+4sX|^*!_RU{_zO-#YGcnIeM~x z`O`agS0#A9Ko3Gkyim(>DLs%3R#^}8wfm5J@5H`(2t7HR7W0C{NR|mIgqmRI=m?}u zSBl)WoXn5DLFRkgp`~Gg_Nv>B2&@u0C&G)BUn{6hmuiJu0oi;P-p`-Jd|_h%Dz)7@ z1OQfNct+tFgnbD8BJ>0OW@h%xQuP!7&5fAHzKr?y*3>pHZolu@({rl-$*T_KH9wNq zKa8lZC?g;uwlgO$tjo$nT{+pdAt&3q8)e%q@4VkD6iJuTe=C^HpH6AB2x8;YD~IqE zDezNQP-i8!q~A)UC!l{jwgCNLXqKI72pe3!4uND~t=~{hnYoPJdkB5!NJ^XKc0&@D zBENQJDLjytK#d+%Mc+S${p|smo=s^lknH&RcLfGQ6w?ZC-QFmN-TOKO>K;wTq{?D7 zF^PTU4fNy{A5*EM>F5XjZBIYEyW0Dj1k3`)H8!DJ@X`Hmqi_8g{NkcF<@M?<-4Gfb zg{e!>-in?$g}(YaOiZS$TT^ONs7=5wU2aU?1N@hb!EoqWvgtnkW+C~B0MlU zPiI8H^VtPF;7(_v^Y4YsgKHuhfsX%2P(Xz5Mg%OZkDq=8OPCE-!y708hSezZ8My3#N3pa{2SEG@q9hye2&@5VOm!OSjgXiO`%shRnn&jeovh685{ z`ic*K?aInQrz5B4^=_|7zZh1;|BASL!+!^9`CTvG&}qcKKHgBz!|&>5`r*gPcXh|3 zj?4FMXpqMNWN=Og1h&L~U?)j9-^GvKHTLY@#qZTblJ`W6mqdFNzz09Xm95>&~nMkGrxJ;FNr8-owUkisSFLf`I zL(x$D=Zvn+8g?Rl(gB0g(rw~p@w+KKFIL>ITN{6- Date: Fri, 8 Nov 2019 12:10:49 -0800 Subject: [PATCH 3/7] NCEU Start Sequence --- apps.json | 17 +++++ apps/bootloader.js | 170 ++++++++++++++++++++++++--------------------- apps/start.js | 126 ++++----------------------------- apps/start.json | 9 +-- 4 files changed, 120 insertions(+), 202 deletions(-) diff --git a/apps.json b/apps.json index e00345468..6b18669d7 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..e7dad0247 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/start.js b/apps/start.js index 0c5e4007e..79ce35515 100644 --- a/apps/start.js +++ b/apps/start.js @@ -36,74 +36,6 @@ function welcome() { }); } -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});var g = Graphics.getInstance(); - -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, ()=>{}], @@ -183,51 +115,18 @@ function info() { }); } -welcome() - .then(logos) - .then(info) - .then(()=>E.showMessage('done')); - - - }); -} - -function info() { - var slides = [ - () => { - g.clear(); - g.setFont('6x8',2); - g.setColor(1,1,1); - g.drawString('Visit', 120, 80); - g.drawString('nodewatch.dev', 120, 110); - g.drawString('for info', 115, 140); - }, - () => { - g.clear(); - g.setFont('6x8',2); - g.setColor(1,1,1); - g.drawString('Remember', 120, 80); - g.drawString('to charge', 120, 110); - g.drawString('your watch!', 125, 140); - }, - () => { - } - ]; - function next() { - var n = slides.shift(); - n(); - g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); - 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() @@ -235,4 +134,3 @@ welcome() .then(info) .then(cleanup) .then(load); - diff --git a/apps/start.json b/apps/start.json index e97c0e7fe..09ecff467 100644 --- a/apps/start.json +++ b/apps/start.json @@ -2,12 +2,5 @@ "name": "Start", "type": "app", "icon": "*start", - "src": "-start", - "files": [ - "*bangle", - "*nceu", - "*nfr", - "*nodew", - "*tf" - ] + "src": "-start" } From f7cccd4fa738dcf3f1dba3a388d264c45ea6f4f9 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 8 Nov 2019 15:43:06 -0800 Subject: [PATCH 4/7] Out of the box improvements --- apps/start.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/apps/start.js b/apps/start.js index 79ce35515..959532993 100644 --- a/apps/start.js +++ b/apps/start.js @@ -1,5 +1,5 @@ var g = Graphics.getInstance(); - +g.setFontAlign(1, 1, 0); const d = g.getWidth() - 18; function c(a) { return { @@ -72,36 +72,37 @@ function logos() { 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.drawString('Visit', 120, 80); - g.drawString('nodewatch.dev', 120, 110); - g.drawString('for info', 115, 140); - }, - () => { - g.clear(); - g.setFont('6x8',2); - g.setColor(1,1,1); - g.drawString('Remember', 120, 80); - g.drawString('to charge', 120, 110); - g.drawString('your watch!', 125, 140); - }, - () => { - g.clear(); 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(); - g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); slides.push(n); } return new Promise((res) => { From 79377b20c5ae2b3313602d7e8879fef994af5222 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 8 Nov 2019 15:59:37 -0800 Subject: [PATCH 5/7] Dev/Uart setting --- apps/settings-default.json | 1 + apps/settings-init.js | 4 ++-- apps/settings.js | 9 +++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/settings-default.json b/apps/settings-default.json index 9f73f1e7c..58ec43244 100644 --- a/apps/settings-default.json +++ b/apps/settings-default.json @@ -1,5 +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 16079801f..38ced8feb 100644 --- a/apps/settings-init.js +++ b/apps/settings-init.js @@ -1,7 +1,7 @@ (function() { var s = require('Storage').readJSON('@setting'); if (s.ble) { - var adv = { uart: true }; + var adv = { uart: s.dev }; if (s.HID) { // Report from https://notes.iopush.net/custom-usb-hid-device-descriptor-media-keyboard/ Bangle.HID = new Uint8Array([ @@ -75,7 +75,7 @@ ]); adv.hid = Bangle.HID; } - NRF.setServices(undefined, adv); + NRF.setServices({}, adv); try { NRF.wake(); } catch (e) {} diff --git a/apps/settings.js b/apps/settings.js index 6a11eab55..f8e2d493f 100644 --- a/apps/settings.js +++ b/apps/settings.js @@ -19,6 +19,7 @@ function updateSettings() { function resetSettings() { settings = { ble: false, + dev: false, timeout: 10, vibrate: true, beep: true, @@ -48,6 +49,14 @@ function showMainMenu() { updateSettings(); } }, + 'Dev': { + value: settings.dev, + format: bootFormat, + onchange: () => { + settings.dev = !settings.dev; + updateSettings(); + } + }, 'LCD Timeout': { value: settings.timeout, min: 0, From 62d87b88531e62ad021f08d04843e314936d90cc Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 8 Nov 2019 17:30:11 -0800 Subject: [PATCH 6/7] Fixups --- apps/bootloader.js | 2 +- apps/settings.js | 2 +- apps/start.js | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/bootloader.js b/apps/bootloader.js index e7dad0247..cc9f29a0f 100644 --- a/apps/bootloader.js +++ b/apps/bootloader.js @@ -2,7 +2,7 @@ E.setTimeZone(1); E.setFlags({pretokenise:1}); var startapp; try { - startapp = s.readJSON('+start'); + startapp = require('Storage').readJSON('+start'); } catch (e) {} if (startapp) { eval(require("Storage").read(startapp.src)); diff --git a/apps/settings.js b/apps/settings.js index f8e2d493f..5aa8f7837 100644 --- a/apps/settings.js +++ b/apps/settings.js @@ -51,7 +51,7 @@ function showMainMenu() { }, 'Dev': { value: settings.dev, - format: bootFormat, + format: boolFormat, onchange: () => { settings.dev = !settings.dev; updateSettings(); diff --git a/apps/start.js b/apps/start.js index 959532993..52fa703f4 100644 --- a/apps/start.js +++ b/apps/start.js @@ -72,9 +72,9 @@ function logos() { 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!'), + () => 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); @@ -88,17 +88,17 @@ function info() { }, () => { g.clear(); - E.showMessage('Hold both\nto return\nto clock'); + 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'); + 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') + () => E.showMessage('Open Settings\\nto enable\\nBluetooth') ]; function next() { var n = slides.shift(); From 1f558cd899e1ccc7c624cd7b27e2dc605d603501 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 8 Nov 2019 18:36:30 -0800 Subject: [PATCH 7/7] Use loopbacka intead of disabling uart --- apps/settings-init.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/settings-init.js b/apps/settings-init.js index 38ced8feb..cf3a017c9 100644 --- a/apps/settings-init.js +++ b/apps/settings-init.js @@ -1,7 +1,11 @@ (function() { var s = require('Storage').readJSON('@setting'); if (s.ble) { - var adv = { uart: s.dev }; + 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([