forked from FOSS/BangleApps
commit
0dcbd8a8a8
17
apps.json
17
apps.json
|
@ -219,6 +219,23 @@
|
||||||
{"name":"*mouse","url":"animals-mouse.js","evaluate":true}
|
{"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",
|
{ "id": "qrcode",
|
||||||
"name": "Custom QR Code",
|
"name": "Custom QR Code",
|
||||||
"icon": "qrcode.png",
|
"icon": "qrcode.png",
|
||||||
|
|
|
@ -1,86 +1,96 @@
|
||||||
E.setTimeZone(1);
|
E.setTimeZone(1);
|
||||||
E.setFlags({pretokenise:1});
|
E.setFlags({pretokenise:1});
|
||||||
setWatch(function() {
|
var startapp;
|
||||||
Bangle.setLCDMode("direct");
|
try {
|
||||||
g.clear();
|
startapp = require('Storage').readJSON('+start');
|
||||||
clearInterval();
|
} catch (e) {}
|
||||||
clearWatch();
|
if (startapp) {
|
||||||
Bangle.removeAllListeners();
|
eval(require("Storage").read(startapp.src));
|
||||||
|
} else {
|
||||||
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 (selected<menuScroll) menuScroll = selected;
|
|
||||||
if (menuScroll) g.fillPoly([120,0,100,20,140,20]);
|
|
||||||
else g.clearRect(100,0,140,20);
|
|
||||||
if (apps.length>n+menuScroll) g.fillPoly([120,239,100,219,140,219]);
|
|
||||||
else g.clearRect(100,219,140,239);
|
|
||||||
for (var i=0;i<n;i++) {
|
|
||||||
var app = apps[i+menuScroll];
|
|
||||||
if (!app) break;
|
|
||||||
var y = 24+i*64;
|
|
||||||
if (i+menuScroll==selected) {
|
|
||||||
g.setColor(0.3,0.3,0.3);
|
|
||||||
g.fillRect(0,y,239,y+63);
|
|
||||||
g.setColor(1,1,1);
|
|
||||||
g.drawRect(0,y,239,y+63);
|
|
||||||
} else
|
|
||||||
g.clearRect(0,y,239,y+63);
|
|
||||||
g.drawString(app.name,64,y+32);
|
|
||||||
var icon=undefined;
|
|
||||||
if (app.icon) icon = s.read(app.icon);
|
|
||||||
if (icon) try {g.drawImage(icon,8,y+8);} catch(e){}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
drawMenu();
|
|
||||||
setWatch(function() {
|
setWatch(function() {
|
||||||
if (selected>0) {
|
Bangle.setLCDMode("direct");
|
||||||
selected--;
|
|
||||||
drawMenu();
|
|
||||||
}
|
|
||||||
}, BTN1, {repeat:true});
|
|
||||||
setWatch(function() {
|
|
||||||
if (selected+1<apps.length) {
|
|
||||||
selected++;
|
|
||||||
drawMenu();
|
|
||||||
}
|
|
||||||
}, BTN3, {repeat:true});
|
|
||||||
setWatch(function() { // run
|
|
||||||
if (!apps[selected].src) return;
|
|
||||||
clearWatch();
|
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setFont("6x8",2);
|
clearInterval();
|
||||||
g.setFontAlign(0,0);
|
clearWatch();
|
||||||
g.drawString("Loading...",120,120);
|
Bangle.removeAllListeners();
|
||||||
if (apps[selected].name=="Clock") load();
|
|
||||||
else { // load like this so we ensure we've cleared out our RAM
|
var s = require("Storage");
|
||||||
var cmd = 'eval(require("Storage").read("'+apps[selected].src+'"));';
|
|
||||||
setTimeout(cmd,20);
|
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 (selected<menuScroll) menuScroll = selected;
|
||||||
|
if (menuScroll) g.fillPoly([120,0,100,20,140,20]);
|
||||||
|
else g.clearRect(100,0,140,20);
|
||||||
|
if (apps.length>n+menuScroll) g.fillPoly([120,239,100,219,140,219]);
|
||||||
|
else g.clearRect(100,219,140,239);
|
||||||
|
for (var i=0;i<n;i++) {
|
||||||
|
var app = apps[i+menuScroll];
|
||||||
|
if (!app) break;
|
||||||
|
var y = 24+i*64;
|
||||||
|
if (i+menuScroll==selected) {
|
||||||
|
g.setColor(0.3,0.3,0.3);
|
||||||
|
g.fillRect(0,y,239,y+63);
|
||||||
|
g.setColor(1,1,1);
|
||||||
|
g.drawRect(0,y,239,y+63);
|
||||||
|
} else
|
||||||
|
g.clearRect(0,y,239,y+63);
|
||||||
|
g.drawString(app.name,64,y+32);
|
||||||
|
var icon=undefined;
|
||||||
|
if (app.icon) icon = s.read(app.icon);
|
||||||
|
if (icon) try {g.drawImage(icon,8,y+8);} catch(e){}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, BTN2, {repeat:true});
|
drawMenu();
|
||||||
}, BTN2, {repeat:false}); // menu on middle button
|
setWatch(function() {
|
||||||
var WIDGETPOS={tl:32,tr:g.getWidth()-32,bl:32,br:g.getWidth()-32};
|
if (selected>0) {
|
||||||
var WIDGETS={};
|
selected--;
|
||||||
function drawWidgets() {
|
drawMenu();
|
||||||
Object.keys(WIDGETS).forEach(k=>WIDGETS[k].draw());
|
}
|
||||||
|
}, BTN1, {repeat:true});
|
||||||
|
setWatch(function() {
|
||||||
|
if (selected+1<apps.length) {
|
||||||
|
selected++;
|
||||||
|
drawMenu();
|
||||||
|
}
|
||||||
|
}, BTN3, {repeat:true});
|
||||||
|
setWatch(function() { // run
|
||||||
|
if (!apps[selected].src) return;
|
||||||
|
clearWatch();
|
||||||
|
g.clear();
|
||||||
|
g.setFont("6x8",2);
|
||||||
|
g.setFontAlign(0,0);
|
||||||
|
g.drawString("Loading...",120,120);
|
||||||
|
if (apps[selected].name=="Clock") load();
|
||||||
|
else { // load like this so we ensure we've cleared out our RAM
|
||||||
|
var cmd = 'eval(require("Storage").read("'+apps[selected].src+'"));';
|
||||||
|
setTimeout(cmd,20);
|
||||||
|
}
|
||||||
|
}, BTN2, {repeat:true});
|
||||||
|
}, BTN2, {repeat:false}); // menu on middle button
|
||||||
|
var WIDGETPOS={tl:32,tr:g.getWidth()-32,bl:32,br:g.getWidth()-32};
|
||||||
|
var WIDGETS={};
|
||||||
|
function drawWidgets() {
|
||||||
|
Object.keys(WIDGETS).forEach(k=>WIDGETS[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);
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
{
|
{
|
||||||
|
ble: false, // Bluetooth disabled by default
|
||||||
|
dev: false, // Espruino IDE disabled by default
|
||||||
timeout: 10, // Default LCD timeout in seconds
|
timeout: 10, // Default LCD timeout in seconds
|
||||||
vibrate: true, // Vibration enabled by default. App must support
|
vibrate: true, // Vibration enabled by default. App must support
|
||||||
beep: true, // Beep enabled by default. App must support
|
beep: true, // Beep enabled by default. App must support
|
||||||
|
|
|
@ -1,80 +1,91 @@
|
||||||
(function() {
|
(function() {
|
||||||
var s = require('Storage').readJSON('@setting');
|
var s = require('Storage').readJSON('@setting');
|
||||||
var adv = { uart: true };
|
if (s.ble) {
|
||||||
if (s.HID) {
|
if (s.dev)
|
||||||
// Report from https://notes.iopush.net/custom-usb-hid-device-descriptor-media-keyboard/
|
Bluetooth.setConsole();
|
||||||
Bangle.HID = new Uint8Array([
|
else
|
||||||
// Keyboard Controls
|
LoopbackA.setControl(true);
|
||||||
0x05, 0x01,
|
var adv = { uart: true };
|
||||||
0x09, 0x06,
|
if (s.HID) {
|
||||||
0xA1, 0x01,
|
// Report from https://notes.iopush.net/custom-usb-hid-device-descriptor-media-keyboard/
|
||||||
0x85, 0x02,
|
Bangle.HID = new Uint8Array([
|
||||||
0x05, 0x07,
|
// Keyboard Controls
|
||||||
0x19, 0xe0,
|
0x05, 0x01,
|
||||||
0x29, 0xe7,
|
0x09, 0x06,
|
||||||
0x15, 0x00,
|
0xA1, 0x01,
|
||||||
0x25, 0x01,
|
0x85, 0x02,
|
||||||
0x75, 0x01,
|
0x05, 0x07,
|
||||||
0x95, 0x08,
|
0x19, 0xe0,
|
||||||
0x81, 0x02,
|
0x29, 0xe7,
|
||||||
0x95, 0x01,
|
0x15, 0x00,
|
||||||
0x75, 0x08,
|
0x25, 0x01,
|
||||||
0x81, 0x01,
|
0x75, 0x01,
|
||||||
0x95, 0x05,
|
0x95, 0x08,
|
||||||
0x75, 0x01,
|
0x81, 0x02,
|
||||||
0x05, 0x08,
|
0x95, 0x01,
|
||||||
0x19, 0x01,
|
0x75, 0x08,
|
||||||
0x29, 0x05,
|
0x81, 0x01,
|
||||||
0x91, 0x02,
|
0x95, 0x05,
|
||||||
0x95, 0x01,
|
0x75, 0x01,
|
||||||
0x75, 0x03,
|
0x05, 0x08,
|
||||||
0x91, 0x01,
|
0x19, 0x01,
|
||||||
0x95, 0x06,
|
0x29, 0x05,
|
||||||
0x75, 0x08,
|
0x91, 0x02,
|
||||||
0x15, 0x00,
|
0x95, 0x01,
|
||||||
0x25, 0x73,
|
0x75, 0x03,
|
||||||
0x05, 0x07,
|
0x91, 0x01,
|
||||||
0x19, 0x00,
|
0x95, 0x06,
|
||||||
0x29, 0x73,
|
0x75, 0x08,
|
||||||
0x81, 0x00,
|
0x15, 0x00,
|
||||||
0x09, 0x05,
|
0x25, 0x73,
|
||||||
0x15, 0x00,
|
0x05, 0x07,
|
||||||
0x26, 0xFF, 0x00,
|
0x19, 0x00,
|
||||||
0x75, 0x08,
|
0x29, 0x73,
|
||||||
0x95, 0x02,
|
0x81, 0x00,
|
||||||
0xB1, 0x02,
|
0x09, 0x05,
|
||||||
0xC0,
|
0x15, 0x00,
|
||||||
|
0x26, 0xFF, 0x00,
|
||||||
|
0x75, 0x08,
|
||||||
|
0x95, 0x02,
|
||||||
|
0xB1, 0x02,
|
||||||
|
0xC0,
|
||||||
|
|
||||||
// Music Controls
|
// Music Controls
|
||||||
0x05, 0x0C,
|
0x05, 0x0C,
|
||||||
0x09, 0x01,
|
0x09, 0x01,
|
||||||
0xA1, 0x01,
|
0xA1, 0x01,
|
||||||
0x85, 0x01,
|
0x85, 0x01,
|
||||||
0x15, 0x00,
|
0x15, 0x00,
|
||||||
0x25, 0x01,
|
0x25, 0x01,
|
||||||
0x75, 0x01,
|
0x75, 0x01,
|
||||||
0x95, 0x01,
|
0x95, 0x01,
|
||||||
0x09, 0xB5,
|
0x09, 0xB5,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xB6,
|
0x09, 0xB6,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xB7,
|
0x09, 0xB7,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xB8,
|
0x09, 0xB8,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xCD,
|
0x09, 0xCD,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xE2,
|
0x09, 0xE2,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xE9,
|
0x09, 0xE9,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0x09, 0xEA,
|
0x09, 0xEA,
|
||||||
0x81, 0x02,
|
0x81, 0x02,
|
||||||
0xC0
|
0xC0
|
||||||
]);
|
]);
|
||||||
adv.hid = Bangle.HID;
|
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.vibrate) Bangle.buzz=()=>Promise.resolve();
|
||||||
if (!s.beep) Bangle.beep=()=>Promise.resolve();
|
if (!s.beep) Bangle.beep=()=>Promise.resolve();
|
||||||
|
|
|
@ -18,6 +18,8 @@ function updateSettings() {
|
||||||
|
|
||||||
function resetSettings() {
|
function resetSettings() {
|
||||||
settings = {
|
settings = {
|
||||||
|
ble: false,
|
||||||
|
dev: false,
|
||||||
timeout: 10,
|
timeout: 10,
|
||||||
vibrate: true,
|
vibrate: true,
|
||||||
beep: true,
|
beep: true,
|
||||||
|
@ -40,6 +42,22 @@ const boolFormat = (v) => v ? "On" : "Off";
|
||||||
function showMainMenu() {
|
function showMainMenu() {
|
||||||
const mainmenu = {
|
const mainmenu = {
|
||||||
'': { 'title': 'Settings' },
|
'': { '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': {
|
'LCD Timeout': {
|
||||||
value: settings.timeout,
|
value: settings.timeout,
|
||||||
min: 0,
|
min: 0,
|
||||||
|
|
|
@ -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="))
|
|
@ -0,0 +1 @@
|
||||||
|
require("heatshrink").decompress(atob("mEwxH+AHMPADQv/F+YxZYtb1wFto7SEbwwQBIsen0/ADU+jxfOjwtbAAYwDWZVWF79WfBAvEq4vfq4vIGQgviR44AEFz4vEGRQvnGA4v/F79YX9IHEq4aKh//jwvRrBcHG4ovL/4ABB5gAFRAwvVGIQveoAAIF4oABq0/CZIACF8BiBrAvTGIoaKF5AABIpVXd44AFJBQvKh4vOGBIvVL54vdX5iPhqztLoFYFpYvSh8/FxgABFpYvQRRgveoEP/8eFqAvbACi/CeA4IDP6IvUGIYGEF+EMADwvJR4ovmdoovnFoowDF8QsIF4dZF79ZF5RpCj1AFztAjy7JAAgwdFwbAFFwwAmF/4vhGFrxLFkoAvA="))
|
|
@ -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"))
|
|
@ -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=="))
|
|
@ -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=")))
|
|
@ -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"))
|
|
@ -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);
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"name": "Start",
|
||||||
|
"type": "app",
|
||||||
|
"icon": "*start",
|
||||||
|
"src": "-start"
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
Loading…
Reference in New Issue