From 692ff509e51e73d63952f737c12ab5d5e99008fc Mon Sep 17 00:00:00 2001
From: Gordon Williams
Date: Tue, 4 Feb 2020 16:13:06 +0000
Subject: [PATCH 1/5] Add button clear everything and reload default apps
---
defaultapps.json | 1 +
index.html | 3 ++-
index.js | 33 +++++++++++++++++++++++++++++++++
3 files changed, 36 insertions(+), 1 deletion(-)
create mode 100644 defaultapps.json
diff --git a/defaultapps.json b/defaultapps.json
new file mode 100644
index 000000000..11db89641
--- /dev/null
+++ b/defaultapps.json
@@ -0,0 +1 @@
+["boot","launch","mclock","setting","sbat","sbt"]
diff --git a/index.html b/index.html
index 4360c3bef..0141365b7 100644
--- a/index.html
+++ b/index.html
@@ -126,7 +126,8 @@
Utilities
-
+
+
diff --git a/index.js b/index.js
index 8d5442697..fa986ac21 100644
--- a/index.js
+++ b/index.js
@@ -432,3 +432,36 @@ document.getElementById("removeall").addEventListener("click",event=>{
});
});
});
+// Install all default apps in one go
+document.getElementById("installdefault").addEventListener("click",event=>{
+ var defaultApps
+ httpGet("defaultapps.json").then(json=>{
+ defaultApps = JSON.parse(json);
+ defaultApps = defaultApps.map( appid => appJSON.find(app=>app.id==appid) );
+ if (defaultApps.some(x=>x===undefined))
+ throw "Not all apps found";
+ return showPrompt("Install Defaults","Remove everything and install default apps?");
+ }).then(() => {
+ return Comms.removeAllApps();
+ }).then(()=>{
+ showToast("Existing apps removed","success");
+ return new Promise(resolve => {
+ function upload() {
+ var app = defaultApps.shift();
+ if (app===undefined) return resolve();
+ Comms.uploadApp(app).then((appJSON) => {
+ if (appJSON) appsInstalled.push(appJSON);
+ showToast(app.name+" Uploaded", "success");
+ upload();
+ });
+ }
+ upload();
+ });
+ }).then(()=>{
+ showToast("Default apps successfully installed!","success");
+ refreshMyApps();
+ refreshLibrary();
+ }).catch(err=>{
+ showToast("App Install failed, "+err,"error");
+ });
+});
From 0e7742d9365e2fc2579b1451431bb64734140b99 Mon Sep 17 00:00:00 2001
From: Gordon Williams
Date: Tue, 4 Feb 2020 16:15:37 +0000
Subject: [PATCH 2/5] Add better sort orders for most people, and remove the
HID minification hack as it's no longer needed
---
apps.json | 21 +++++++--------------
apps/hidkbd/hid-keyboard.min.js | 1 -
2 files changed, 7 insertions(+), 15 deletions(-)
delete mode 100644 apps/hidkbd/hid-keyboard.min.js
diff --git a/apps.json b/apps.json
index 76151a627..3ba73b8ff 100644
--- a/apps.json
+++ b/apps.json
@@ -61,7 +61,6 @@
"storage": [
{"name":"+setting","url":"settings.json"},
{"name":"-setting","url":"settings.js"},
- {"name":"=setting","url":"settings-init.js"},
{"name":"@setting","url":"settings-default.json","evaluate":true},
{"name":"*setting","url":"settings-icon.js","evaluate":true}
],
@@ -309,7 +308,7 @@
"tags": "bluetooth",
"storage": [
{"name":"+hidkbd","url":"hid-keyboard.json"},
- {"name":"-hidkbd","url":"hid-keyboard.min.js"},
+ {"name":"-hidkbd","url":"hid-keyboard.js"},
{"name":"*hidkbd","url":"hid-keyboard-icon.js","evaluate":true}
]
},
@@ -343,8 +342,7 @@
{"name":"*pig","url":"animals-pig.js","evaluate":true},
{"name":"*sheep","url":"animals-sheep.js","evaluate":true},
{"name":"*mouse","url":"animals-mouse.js","evaluate":true}
- ],
- "sortorder" : 1
+ ]
},
{ "id": "qrcode",
"name": "Custom QR Code",
@@ -404,8 +402,7 @@
{"name":"*nfr","url":"start-nfr.js","evaluate":true},
{"name":"*nodew","url":"start-nodew.js","evaluate":true},
{"name":"*tf","url":"start-tf.js","evaluate":true}
- ],
- "sortorder" : -1
+ ]
},
{ "id": "ncfrun",
"name": "NCEU 5K Fun Run",
@@ -417,8 +414,7 @@
{"name":"+ncfrun","url":"nceu-funrun.json"},
{"name":"-ncfrun","url":"nceu-funrun.js"},
{"name":"*ncfrun","url":"nceu-funrun-icon.js","evaluate":true}
- ],
- "sortorder" : -1
+ ]
},
{ "id": "nceuwid",
"name": "NCEU Logo Widget",
@@ -430,8 +426,7 @@
"storage": [
{"name":"+nceuwid","url":"nceu-widget.json"},
{"name":"=nceuwid","url":"nceu-widget.js"}
- ],
- "sortorder" : -1
+ ]
},
@@ -734,8 +729,7 @@
{"name":"+ctrclk","url":"app.json"},
{"name":"-ctrclk","url":"app.js"},
{"name":"*ctrclk","url":"app-icon.js","evaluate":true}
- ],
- "sortorder" : -9
+ ]
},
{ "id": "demoapp",
"name": "Demo Loop",
@@ -749,7 +743,6 @@
{"name":"+demoapp","url":"app.json"},
{"name":"-demoapp","url":"app.js"},
{"name":"*demoapp","url":"app-icon.js","evaluate":true}
- ],
- "sortorder" : -9
+ ]
}
]
diff --git a/apps/hidkbd/hid-keyboard.min.js b/apps/hidkbd/hid-keyboard.min.js
deleted file mode 100644
index 5110be4d3..000000000
--- a/apps/hidkbd/hid-keyboard.min.js
+++ /dev/null
@@ -1 +0,0 @@
-function drawApp(){function b(a){return{width:8,height:a.length,bpp:1,buffer:new Uint8Array(a).buffer};}g.clear(),g.setFont('6x8',2),g.setFontAlign(0,0),g.drawString(profile,120,120);const a=g.getWidth()-18;g.drawImage(b([16,56,124,254,16,16,16,16]),a,40),g.drawImage(b([16,16,16,16,254,124,56,16]),a,194),g.drawImage(b([0,8,12,14,255,14,12,8]),a,116);}var storage=require('Storage');const settings=storage.readJSON('@setting')||{HID:!1};var sendHid,next,prev,toggle,up,down,profile;settings.HID?(profile='Keyboard',sendHid=function(b,a){try{NRF.sendHIDReport([2,0,0,b,0,0,0,0,0],()=>NRF.sendHIDReport([2,0,0,0,0,0,0,0,0],()=>a&&a();););}catch(a){print(a);}},next=function(a){sendHid(79,a);},prev=function(a){sendHid(80,a);},toggle=function(a){sendHid(44,a);},up=function(a){sendHid(82,a);},down=function(a){sendHid(81,a);}):(E.showMessage('HID disabled'),setTimeout(load,1000)),next&&(settings.HIDGestures&&Bangle.on('aiGesture',v=>switch(v){case'swipeleft':E.showMessage('next');setTimeout(drawApp,1000);next(()=>;);break;case'swiperight':E.showMessage('prev');setTimeout(drawApp,1000);prev(()=>;);break;}),setWatch(function(b){var a=b.time-b.lastTime;a>0.3&&a<0.9?(E.showMessage('prev'),setTimeout(drawApp,1000),prev(()=>;)):(E.showMessage('up'),setTimeout(drawApp,1000),up(()=>;));},BTN1,{edge:'falling',repeat:!0,debounce:50}),setWatch(function(b){var a=b.time-b.lastTime;a>0.3&&a<0.9?(E.showMessage('next'),setTimeout(drawApp,1000),next(()=>;)):(E.showMessage('down'),setTimeout(drawApp,1000),down(()=>;));},BTN3,{edge:'falling',repeat:!0,debounce:50}),setWatch(function(a){E.showMessage('toggle'),setTimeout(drawApp,1000),toggle();},BTN2,{edge:'falling',repeat:!0,debounce:50}),drawApp());
\ No newline at end of file
From 527ff57e997a9b27625c33b37b6858afbe601396 Mon Sep 17 00:00:00 2001
From: Gordon Williams
Date: Tue, 4 Feb 2020 16:17:23 +0000
Subject: [PATCH 3/5] Simplify settings and add locale submenu, add 12/24 hour
option (fix #76), add distance format option, and ensure settings all apply
at boot by moving them to the bootloader 'app' (fix #89)
---
apps/boot/boot0.js | 19 +++++++
apps/hidkbd/hid-keyboard.js | 31 ++++++------
apps/setting/settings-default.json | 19 +++----
apps/setting/settings-init.js | 27 ----------
apps/setting/settings.js | 80 ++++++++++++++----------------
5 files changed, 80 insertions(+), 96 deletions(-)
delete mode 100644 apps/setting/settings-init.js
diff --git a/apps/boot/boot0.js b/apps/boot/boot0.js
index 9f34f1b15..dbee62d9c 100644
--- a/apps/boot/boot0.js
+++ b/apps/boot/boot0.js
@@ -1,5 +1,24 @@
// This ALWAYS runs at boot
E.setFlags({pretokenise:1});
+// Load settings...
+var s = require('Storage').readJSON('@setting')||{};
+if (s.ble!==false) {
+ if (s.HID) { // Humen interface device
+ Bangle.HID = E.toUint8Array(atob("BQEJBqEBhQIFBxngKecVACUBdQGVCIEClQF1CIEBlQV1AQUIGQEpBZEClQF1A5EBlQZ1CBUAJXMFBxkAKXOBAAkFFQAm/wB1CJUCsQLABQwJAaEBhQEVACUBdQGVAQm1gQIJtoECCbeBAgm4gQIJzYECCeKBAgnpgQIJ6oECwA=="));
+ NRF.setServices({}, {uart:true, hid:Bangle.HID});
+ }
+}
+// If not programmable, force terminal onto screen
+if (s.dev===false) Terminal.setConsole(true);
+// we just reset, so BLE should be on
+if (s.ble===false) NRF.sleep();
+// Set time, vibrate, beep, etc
+if (!s.vibrate) Bangle.buzz=Promise.resolve;
+if (!s.beep) Bangle.beep=Promise.resolve;
+Bangle.setLCDTimeout(s.timeout);
+if (!s.timeout) Bangle.setLCDPower(1);
+E.setTimeZone(s.timezone);
+delete s;
// All of this is just shim for older Bangles
if (!Bangle.loadWidgets) {
Bangle.loadWidgets = function(){
diff --git a/apps/hidkbd/hid-keyboard.js b/apps/hidkbd/hid-keyboard.js
index 1e734edc5..01f5090f0 100644
--- a/apps/hidkbd/hid-keyboard.js
+++ b/apps/hidkbd/hid-keyboard.js
@@ -49,23 +49,20 @@ function drawApp() {
}
if (next) {
-
- if (settings.HIDGestures) {
- Bangle.on('aiGesture', (v) => {
- switch (v) {
- case 'swipeleft':
- E.showMessage('next');
- setTimeout(drawApp, 1000);
- next(() => {});
- break;
- case 'swiperight':
- E.showMessage('prev');
- setTimeout(drawApp, 1000);
- prev(() => {});
- break;
- }
- });
- }
+ Bangle.on('aiGesture', (v) => {
+ switch (v) {
+ case 'swipeleft':
+ E.showMessage('next');
+ setTimeout(drawApp, 1000);
+ next(() => {});
+ break;
+ case 'swiperight':
+ E.showMessage('prev');
+ setTimeout(drawApp, 1000);
+ prev(() => {});
+ break;
+ }
+ });
setWatch(function(e) {
var len = e.time - e.lastTime;
diff --git a/apps/setting/settings-default.json b/apps/setting/settings-default.json
index 860fe200b..50d223a69 100644
--- a/apps/setting/settings-default.json
+++ b/apps/setting/settings-default.json
@@ -1,11 +1,12 @@
{
- ble: true, // Bluetooth enabled by default
- dev: true, // Espruino IDE enabled 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
- HIDGestures: false,
- debug: false, // Debug mode disabled by default. App must support
+ ble: true, // Bluetooth enabled by default
+ dev: true, // Is REPL on Bluetooth - can Espruino IDE be used?
+ 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
+ clock: null, // a string for the default clock's name
+ "12hour" : false, // 12 or 24 hour clock?
+ distance : "kilometer" // or "mile"
}
diff --git a/apps/setting/settings-init.js b/apps/setting/settings-init.js
deleted file mode 100644
index 69854ad74..000000000
--- a/apps/setting/settings-init.js
+++ /dev/null
@@ -1,27 +0,0 @@
-Bangle.HID = E.toUint8Array(atob("BQEJBqEBhQIFBxngKecVACUBdQGVCIEClQF1CIEBlQV1AQUIGQEpBZEClQF1A5EBlQZ1CBUAJXMFBxkAKXOBAAkFFQAm/wB1CJUCsQLABQwJAaEBhQEVACUBdQGVAQm1gQIJtoECCbeBAgm4gQIJzYECCeKBAgnpgQIJ6oECwA=="));
-
-(function() {
- var s = require('Storage').readJSON('@setting');
- var adv = { uart: true };
- if (s.ble) {
- if (s.dev)
- Bluetooth.setConsole(true);
- else
- Terminal.setConsole(true);
- if (s.HID) {
- adv.hid = Bangle.HID;
- } else
- delete Bangle.HID;
- }
- NRF.setServices({}, adv);
- // we just reset, so BLE should be on
- try { // disable advertising if BLE should be off
- if (!s.ble) NRF.sleep();
- else NRF.wake();
- } catch(e) {}
- if (!s.vibrate) Bangle.buzz=Promise.resolve;
- if (!s.beep) Bangle.beep=Promise.resolve;
- Bangle.setLCDTimeout(s.timeout);
- if (!s.timeout) Bangle.setLCDPower(1);
- E.setTimeZone(s.timezone);
-})()
diff --git a/apps/setting/settings.js b/apps/setting/settings.js
index 4b71b1c3d..a6a009806 100644
--- a/apps/setting/settings.js
+++ b/apps/setting/settings.js
@@ -5,13 +5,7 @@ g.clear();
const storage = require('Storage');
let settings;
-function debug(msg, arg) {
- if (settings.debug)
- console.log(msg, arg);
-}
-
function updateSettings() {
- debug('updating settings', settings);
//storage.erase('@setting'); // - not needed, just causes extra writes if settings were the same
storage.write('@setting', settings);
}
@@ -25,9 +19,9 @@ function resetSettings() {
beep: true,
timezone: 0,
HID : false,
- HIDGestures: false,
- debug: false,
- clock: null
+ clock: null,
+ "12hour" : false,
+ distance : "kilometer" // or "mile"
};
setLCDTimeout(settings.timeout);
updateSettings();
@@ -43,6 +37,7 @@ const boolFormat = (v) => v ? "On" : "Off";
function showMainMenu() {
const mainmenu = {
'': { 'title': 'Settings' },
+ 'Make Connectable': makeConnectable,
'BLE': {
value: settings.ble,
format: boolFormat,
@@ -93,7 +88,28 @@ function showMainMenu() {
}
}
},
+ 'Locale': showLocaleMenu,
'Select Clock': showClockMenu,
+ 'HID': {
+ value: settings.HID,
+ format: boolFormat,
+ onchange: () => {
+ settings.HID = !settings.HID;
+ updateSettings();
+ }
+ },
+ 'Set Time': showSetTimeMenu,
+ 'Reset Settings': showResetMenu,
+ 'Turn Off': Bangle.off,
+ '< Back': ()=> {load();}
+ };
+ return E.showMenu(mainmenu);
+}
+
+function showLocaleMenu() {
+ const localemenu = {
+ '': { 'title': 'Locale' },
+ '< Back': showMainMenu,
'Time Zone': {
value: settings.timezone,
min: -11,
@@ -104,37 +120,24 @@ function showMainMenu() {
updateSettings();
}
},
- 'HID': {
- value: settings.HID,
- format: boolFormat,
- onchange: () => {
- settings.HID = !settings.HID;
+ 'Clock Style': {
+ value: !!settings["12hour"],
+ format : v => v?"12hr":"24hr",
+ onchange: v => {
+ settings["12hour"] = v;
updateSettings();
}
},
- 'HID Gestures': {
- value: settings.HIDGestures,
- format: boolFormat,
- onchange: () => {
- settings.HIDGestures = !settings.HIDGestures;
+ 'Distance/Speed': {
+ value: settings.distanceunit=="mile",
+ format: v => v?"mile":"kilometer",
+ onchange: v => {
+ settings.distanceunit = v?"mile":"kilometer";
updateSettings();
}
},
- 'Debug': {
- value: settings.debug,
- format: boolFormat,
- onchange: () => {
- settings.debug = !settings.debug;
- updateSettings();
- }
- },
- 'Set Time': showSetTimeMenu,
- 'Make Connectable': makeConnectable,
- 'Reset Settings': showResetMenu,
- 'Turn Off': Bangle.off,
- '< Back': ()=> {load();}
};
- return E.showMenu(mainmenu);
+ return E.showMenu(localemenu);
}
function showResetMenu() {
@@ -149,16 +152,7 @@ function showResetMenu() {
}
setTimeout(showMainMenu, 50);
});
- },
- // this is include for debugging. remove for production
- /*'Erase': () => {
- storage.erase('=setting');
- storage.erase('-setting');
- storage.erase('@setting');
- storage.erase('*setting');
- storage.erase('+setting');
- E.reboot();
- }*/
+ }
};
return E.showMenu(resetmenu);
}
From c2234d39e591a1ee7decdf5065c55576114d0a1a Mon Sep 17 00:00:00 2001
From: Gordon Williams
Date: Tue, 4 Feb 2020 16:19:29 +0000
Subject: [PATCH 4/5] Add newlines to stop app names overflowing - fix #87
---
apps/files/files.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/files/files.js b/apps/files/files.js
index b5b77a7f8..9f3f7b46f 100644
--- a/apps/files/files.js
+++ b/apps/files/files.js
@@ -31,7 +31,7 @@ function showMainMenu() {
}
function eraseApp(app) {
- E.showMessage('Erasing ' + app.name + '...');
+ E.showMessage('Erasing\n' + app.name + '...');
storage.erase(app['']);
storage.erase(app.icon);
storage.erase(app.src);
@@ -44,7 +44,7 @@ function showAppMenu(app) {
},
'< Back': () => m = showApps(),
'Erase': () => {
- E.showPrompt('Erase ' + app.name + '?').then((v) => {
+ E.showPrompt('Erase\n' + app.name + '?').then((v) => {
if (v) {
Bangle.buzz(100, 1);
eraseApp(app);
From a6f23a5cc58e9aa815e9b2caabc8481a0e6b09c7 Mon Sep 17 00:00:00 2001
From: Gordon Williams
Date: Tue, 4 Feb 2020 16:30:31 +0000
Subject: [PATCH 5/5] UI tweaks for uploader
---
index.js | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/index.js b/index.js
index fa986ac21..242d60b2d 100644
--- a/index.js
+++ b/index.js
@@ -422,36 +422,37 @@ document.getElementById("settime").addEventListener("click",event=>{
});
document.getElementById("removeall").addEventListener("click",event=>{
showPrompt("Remove All","Really remove all apps?").then(() => {
- Comms.removeAllApps().then(()=>{
- appsInstalled = [];
- showToast("All apps removed","success");
- refreshMyApps();
- refreshLibrary();
- }, err=>{
- showToast("App removal failed, "+err,"error");
- });
+ return Comms.removeAllApps();
+ }).then(()=>{
+ appsInstalled = [];
+ showToast("All apps removed","success");
+ return getInstalledApps();
+ }).catch(err=>{
+ showToast("App removal failed, "+err,"error");
});
});
// Install all default apps in one go
document.getElementById("installdefault").addEventListener("click",event=>{
- var defaultApps
+ var defaultApps, appCount;
httpGet("defaultapps.json").then(json=>{
defaultApps = JSON.parse(json);
defaultApps = defaultApps.map( appid => appJSON.find(app=>app.id==appid) );
if (defaultApps.some(x=>x===undefined))
throw "Not all apps found";
+ appCount = defaultApps.length;
return showPrompt("Install Defaults","Remove everything and install default apps?");
}).then(() => {
return Comms.removeAllApps();
}).then(()=>{
- showToast("Existing apps removed","success");
+ appsInstalled = [];
+ showToast(`Existing apps removed. Installing ${appCount} apps...`);
return new Promise(resolve => {
function upload() {
var app = defaultApps.shift();
if (app===undefined) return resolve();
Comms.uploadApp(app).then((appJSON) => {
if (appJSON) appsInstalled.push(appJSON);
- showToast(app.name+" Uploaded", "success");
+ showToast(`(${appCount-defaultApps.length}/${appCount}) ${app.name} Uploaded`);
upload();
});
}
@@ -459,8 +460,7 @@ document.getElementById("installdefault").addEventListener("click",event=>{
});
}).then(()=>{
showToast("Default apps successfully installed!","success");
- refreshMyApps();
- refreshLibrary();
+ return getInstalledApps();
}).catch(err=>{
showToast("App Install failed, "+err,"error");
});