commit
c45cfb47b1
|
|
@ -118,11 +118,12 @@
|
||||||
{ "id": "setting",
|
{ "id": "setting",
|
||||||
"name": "Settings",
|
"name": "Settings",
|
||||||
"icon": "settings.png",
|
"icon": "settings.png",
|
||||||
"version":"0.09",
|
"version":"0.10",
|
||||||
"description": "A menu for setting up Bangle.js",
|
"description": "A menu for setting up Bangle.js",
|
||||||
"tags": "tool,system",
|
"tags": "tool,system",
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"setting.app.js","url":"settings.js"},
|
{"name":"setting.app.js","url":"settings.js"},
|
||||||
|
{"name":"setting.boot.js","url":"boot.js"},
|
||||||
{"name":"setting.json","url":"settings-default.json","evaluate":true},
|
{"name":"setting.json","url":"settings-default.json","evaluate":true},
|
||||||
{"name":"setting.img","url":"settings-icon.js","evaluate":true}
|
{"name":"setting.img","url":"settings-icon.js","evaluate":true}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,4 @@
|
||||||
0.07: Added vibrate as beep workaround
|
0.07: Added vibrate as beep workaround
|
||||||
0.08: Add support for app/widget settings
|
0.08: Add support for app/widget settings
|
||||||
0.09: Move Welcome into App/widget settings
|
0.09: Move Welcome into App/widget settings
|
||||||
|
0.10: Added LCD wake-up settings
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
(() => {
|
||||||
|
var settings = require('Storage').readJSON('setting.json', true);
|
||||||
|
if (settings != undefined) {
|
||||||
|
Bangle.setOptions(settings.options);
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
|
@ -10,4 +10,15 @@
|
||||||
clock: null, // a string for the default clock's name
|
clock: null, // a string for the default clock's name
|
||||||
"12hour" : false, // 12 or 24 hour clock?
|
"12hour" : false, // 12 or 24 hour clock?
|
||||||
// welcomed : undefined/true (whether welcome app should show)
|
// welcomed : undefined/true (whether welcome app should show)
|
||||||
|
options: {
|
||||||
|
wakeOnBTN1: true,
|
||||||
|
wakeOnBTN2: true,
|
||||||
|
wakeOnBTN3: true,
|
||||||
|
wakeOnFaceUp: false,
|
||||||
|
wakeOnTouch: false,
|
||||||
|
wakeOnTwist: true,
|
||||||
|
twistThreshold: 819.2,
|
||||||
|
twistMaxY: -800,
|
||||||
|
twistTimeout: 1000
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,21 @@ function updateSettings() {
|
||||||
storage.write('setting.json', settings);
|
storage.write('setting.json', settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateOptions() {
|
||||||
|
updateSettings();
|
||||||
|
Bangle.setOptions(settings.options)
|
||||||
|
}
|
||||||
|
|
||||||
|
function gToInternal(g) {
|
||||||
|
// converts g to Espruino internal unit
|
||||||
|
return g * 8192;
|
||||||
|
}
|
||||||
|
|
||||||
|
function internalToG(u) {
|
||||||
|
// converts Espruino internal unit to g
|
||||||
|
return u / 8192
|
||||||
|
}
|
||||||
|
|
||||||
function resetSettings() {
|
function resetSettings() {
|
||||||
settings = {
|
settings = {
|
||||||
ble: true, // Bluetooth enabled by default
|
ble: true, // Bluetooth enabled by default
|
||||||
|
|
@ -18,22 +33,33 @@ function resetSettings() {
|
||||||
vibrate: true, // Vibration enabled by default. App must support
|
vibrate: true, // Vibration enabled by default. App must support
|
||||||
beep: "vib", // Beep enabled by default. App must support
|
beep: "vib", // Beep enabled by default. App must support
|
||||||
timezone: 0, // Set the timezone for the device
|
timezone: 0, // Set the timezone for the device
|
||||||
HID : false, // BLE HID mode, off by default
|
HID: false, // BLE HID mode, off by default
|
||||||
clock: null, // a string for the default clock's name
|
clock: null, // a string for the default clock's name
|
||||||
"12hour" : false, // 12 or 24 hour clock?
|
"12hour": false, // 12 or 24 hour clock?
|
||||||
// welcomed : undefined/true (whether welcome app should show)
|
// welcomed : undefined/true (whether welcome app should show)
|
||||||
|
options: {
|
||||||
|
wakeOnBTN1: true,
|
||||||
|
wakeOnBTN2: true,
|
||||||
|
wakeOnBTN3: true,
|
||||||
|
wakeOnFaceUp: false,
|
||||||
|
wakeOnTouch: false,
|
||||||
|
wakeOnTwist: true,
|
||||||
|
twistThreshold: 819.2,
|
||||||
|
twistMaxY: -800,
|
||||||
|
twistTimeout: 1000
|
||||||
|
}
|
||||||
};
|
};
|
||||||
updateSettings();
|
updateSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
settings = storage.readJSON('setting.json',1);
|
settings = storage.readJSON('setting.json', 1);
|
||||||
if (!settings) resetSettings();
|
if (!settings) resetSettings();
|
||||||
|
|
||||||
const boolFormat = v => v ? "On" : "Off";
|
const boolFormat = v => v ? "On" : "Off";
|
||||||
|
|
||||||
function showMainMenu() {
|
function showMainMenu() {
|
||||||
var beepV = [ false,true,"vib" ];
|
var beepV = [false, true, "vib"];
|
||||||
var beepN = [ "Off","Piezo","Vibrate" ];
|
var beepN = ["Off", "Piezo", "Vibrate"];
|
||||||
const mainmenu = {
|
const mainmenu = {
|
||||||
'': { 'title': 'Settings' },
|
'': { 'title': 'Settings' },
|
||||||
'Make Connectable': makeConnectable,
|
'Make Connectable': makeConnectable,
|
||||||
|
|
@ -73,13 +99,13 @@ function showMainMenu() {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Beep': {
|
'Beep': {
|
||||||
value: 0|beepV.indexOf(settings.beep),
|
value: 0 | beepV.indexOf(settings.beep),
|
||||||
min:0,max:2,
|
min: 0, max: 2,
|
||||||
format: v=>beepN[v],
|
format: v => beepN[v],
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
settings.beep = beepV[v];
|
settings.beep = beepV[v];
|
||||||
if (v==1) { analogWrite(D18,0.5,{freq:2000});setTimeout(()=>D18.reset(),200) } // piezo
|
if (v == 1) { analogWrite(D18, 0.5, { freq: 2000 }); setTimeout(() => D18.reset(), 200) } // piezo
|
||||||
else if (v==2) { analogWrite(D13,0.1,{freq:2000});setTimeout(()=>D13.reset(),200) } // vibrate
|
else if (v == 2) { analogWrite(D13, 0.1, { freq: 2000 }); setTimeout(() => D13.reset(), 200) } // vibrate
|
||||||
updateSettings();
|
updateSettings();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -91,7 +117,7 @@ function showMainMenu() {
|
||||||
updateSettings();
|
updateSettings();
|
||||||
if (settings.vibrate) {
|
if (settings.vibrate) {
|
||||||
VIBRATE.write(1);
|
VIBRATE.write(1);
|
||||||
setTimeout(()=>VIBRATE.write(0), 10);
|
setTimeout(() => VIBRATE.write(0), 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -106,14 +132,101 @@ function showMainMenu() {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Set Time': showSetTimeMenu,
|
'Set Time': showSetTimeMenu,
|
||||||
|
'LCD Wake-Up': showWakeUpMenu,
|
||||||
'App/widget settings': showAppSettingsMenu,
|
'App/widget settings': showAppSettingsMenu,
|
||||||
'Reset Settings': showResetMenu,
|
'Reset Settings': showResetMenu,
|
||||||
'Turn Off': Bangle.off,
|
'Turn Off': Bangle.off,
|
||||||
'< Back': ()=> {load();}
|
'< Back': () => { load(); }
|
||||||
};
|
};
|
||||||
return E.showMenu(mainmenu);
|
return E.showMenu(mainmenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showWakeUpMenu() {
|
||||||
|
const wakeUpMenu = {
|
||||||
|
'': { 'title': 'LCD Wake-Up' },
|
||||||
|
'< Back': showMainMenu,
|
||||||
|
'Wake On BTN1': {
|
||||||
|
value: settings.options.wakeOnBTN1,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: () => {
|
||||||
|
settings.options.wakeOnBTN1 = !settings.options.wakeOnBTN1;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Wake On BTN2': {
|
||||||
|
value: settings.options.wakeOnBTN2,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: () => {
|
||||||
|
settings.options.wakeOnBTN2 = !settings.options.wakeOnBTN2;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Wake On BTN3': {
|
||||||
|
value: settings.options.wakeOnBTN3,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: () => {
|
||||||
|
settings.options.wakeOnBTN3 = !settings.options.wakeOnBTN3;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Wake on FaceUp': {
|
||||||
|
value: settings.options.wakeOnFaceUp,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: () => {
|
||||||
|
settings.options.wakeOnFaceUp = !settings.options.wakeOnFaceUp;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Wake on Touch': {
|
||||||
|
value: settings.options.wakeOnTouch,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: () => {
|
||||||
|
settings.options.wakeOnTouch = !settings.options.wakeOnTouch;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Wake On Twist': {
|
||||||
|
value: settings.options.wakeOnTwist,
|
||||||
|
format: boolFormat,
|
||||||
|
onchange: () => {
|
||||||
|
settings.options.wakeOnTwist = !settings.options.wakeOnTwist;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Twist Threshold': {
|
||||||
|
value: internalToG(settings.options.twistThreshold),
|
||||||
|
min: -0.5,
|
||||||
|
max: 0.5,
|
||||||
|
step: 0.01,
|
||||||
|
onchange: v => {
|
||||||
|
settings.options.twistThreshold = gToInternal(v || 0.1);
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Twist Max Y': {
|
||||||
|
value: settings.options.twistMaxY,
|
||||||
|
min: -1500,
|
||||||
|
max: 1500,
|
||||||
|
step: 100,
|
||||||
|
onchange: v => {
|
||||||
|
settings.options.twistMaxY = v || -800;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Twist Timeout': {
|
||||||
|
value: settings.options.twistTimeout,
|
||||||
|
min: 0,
|
||||||
|
max: 2000,
|
||||||
|
step: 100,
|
||||||
|
onchange: v => {
|
||||||
|
settings.options.twistTimeout = v || 1000;
|
||||||
|
updateOptions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return E.showMenu(wakeUpMenu)
|
||||||
|
}
|
||||||
|
|
||||||
function showLocaleMenu() {
|
function showLocaleMenu() {
|
||||||
const localemenu = {
|
const localemenu = {
|
||||||
'': { 'title': 'Locale' },
|
'': { 'title': 'Locale' },
|
||||||
|
|
@ -130,7 +243,7 @@ function showLocaleMenu() {
|
||||||
},
|
},
|
||||||
'Clock Style': {
|
'Clock Style': {
|
||||||
value: !!settings["12hour"],
|
value: !!settings["12hour"],
|
||||||
format : v => v?"12hr":"24hr",
|
format: v => v ? "12hr" : "24hr",
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
settings["12hour"] = v;
|
settings["12hour"] = v;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
|
|
@ -158,33 +271,33 @@ function showResetMenu() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeConnectable() {
|
function makeConnectable() {
|
||||||
try { NRF.wake(); } catch(e) {}
|
try { NRF.wake(); } catch (e) { }
|
||||||
Bluetooth.setConsole(1);
|
Bluetooth.setConsole(1);
|
||||||
var name="Bangle.js "+NRF.getAddress().substr(-5).replace(":","");
|
var name = "Bangle.js " + NRF.getAddress().substr(-5).replace(":", "");
|
||||||
E.showPrompt(name+"\nStay Connectable?",{title:"Connectable"}).then(r=>{
|
E.showPrompt(name + "\nStay Connectable?", { title: "Connectable" }).then(r => {
|
||||||
if (settings.ble!=r) {
|
if (settings.ble != r) {
|
||||||
settings.ble = r;
|
settings.ble = r;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
}
|
}
|
||||||
if (!r) try { NRF.sleep(); } catch(e) {}
|
if (!r) try { NRF.sleep(); } catch (e) { }
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function showClockMenu() {
|
function showClockMenu() {
|
||||||
var clockApps = require("Storage").list(/\.info$/).map(app=>{
|
var clockApps = require("Storage").list(/\.info$/).map(app => {
|
||||||
try { return require("Storage").readJSON(app); }
|
try { return require("Storage").readJSON(app); }
|
||||||
catch (e) {}
|
catch (e) { }
|
||||||
}).filter(app=>app.type=="clock").sort((a, b) => a.sortorder - b.sortorder);
|
}).filter(app => app.type == "clock").sort((a, b) => a.sortorder - b.sortorder);
|
||||||
const clockMenu = {
|
const clockMenu = {
|
||||||
'': {
|
'': {
|
||||||
'title': 'Select Clock',
|
'title': 'Select Clock',
|
||||||
},
|
},
|
||||||
'< Back': showMainMenu,
|
'< Back': showMainMenu,
|
||||||
};
|
};
|
||||||
clockApps.forEach((app,index) => {
|
clockApps.forEach((app, index) => {
|
||||||
var label = app.name;
|
var label = app.name;
|
||||||
if ((!settings.clock && index === 0) || (settings.clock === app.src)) {
|
if ((!settings.clock && index === 0) || (settings.clock === app.src)) {
|
||||||
label = "* "+label;
|
label = "* " + label;
|
||||||
}
|
}
|
||||||
clockMenu[label] = () => {
|
clockMenu[label] = () => {
|
||||||
if (settings.clock !== app.src) {
|
if (settings.clock !== app.src) {
|
||||||
|
|
@ -195,7 +308,7 @@ function showClockMenu() {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
if (clockApps.length === 0) {
|
if (clockApps.length === 0) {
|
||||||
clockMenu["No Clocks Found"] = () => {};
|
clockMenu["No Clocks Found"] = () => { };
|
||||||
}
|
}
|
||||||
return E.showMenu(clockMenu);
|
return E.showMenu(clockMenu);
|
||||||
}
|
}
|
||||||
|
|
@ -207,7 +320,7 @@ function showSetTimeMenu() {
|
||||||
const timemenu = {
|
const timemenu = {
|
||||||
'': {
|
'': {
|
||||||
'title': 'Set Time',
|
'title': 'Set Time',
|
||||||
'predraw': function() {
|
'predraw': function () {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
timemenu.Hour.value = d.getHours();
|
timemenu.Hour.value = d.getHours();
|
||||||
timemenu.Minute.value = d.getMinutes();
|
timemenu.Minute.value = d.getMinutes();
|
||||||
|
|
@ -226,7 +339,7 @@ function showSetTimeMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
d.setHours(v);
|
d.setHours(v);
|
||||||
setTime(d.getTime()/1000);
|
setTime(d.getTime() / 1000);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Minute': {
|
'Minute': {
|
||||||
|
|
@ -237,7 +350,7 @@ function showSetTimeMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
d.setMinutes(v);
|
d.setMinutes(v);
|
||||||
setTime(d.getTime()/1000);
|
setTime(d.getTime() / 1000);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Second': {
|
'Second': {
|
||||||
|
|
@ -248,7 +361,7 @@ function showSetTimeMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
d.setSeconds(v);
|
d.setSeconds(v);
|
||||||
setTime(d.getTime()/1000);
|
setTime(d.getTime() / 1000);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Date': {
|
'Date': {
|
||||||
|
|
@ -259,7 +372,7 @@ function showSetTimeMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
d.setDate(v);
|
d.setDate(v);
|
||||||
setTime(d.getTime()/1000);
|
setTime(d.getTime() / 1000);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Month': {
|
'Month': {
|
||||||
|
|
@ -270,7 +383,7 @@ function showSetTimeMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
d.setMonth(v - 1);
|
d.setMonth(v - 1);
|
||||||
setTime(d.getTime()/1000);
|
setTime(d.getTime() / 1000);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Year': {
|
'Year': {
|
||||||
|
|
@ -281,16 +394,16 @@ function showSetTimeMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
d = new Date();
|
d = new Date();
|
||||||
d.setFullYear(v);
|
d.setFullYear(v);
|
||||||
setTime(d.getTime()/1000);
|
setTime(d.getTime() / 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return E.showMenu(timemenu);
|
return E.showMenu(timemenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showAppSettingsMenu(){
|
function showAppSettingsMenu() {
|
||||||
let appmenu = {
|
let appmenu = {
|
||||||
'': {'title': 'App Settings'},
|
'': { 'title': 'App Settings' },
|
||||||
'< Back': showMainMenu,
|
'< Back': showMainMenu,
|
||||||
}
|
}
|
||||||
const apps = storage.list(/\.info$/)
|
const apps = storage.list(/\.info$/)
|
||||||
|
|
@ -298,10 +411,10 @@ function showAppSettingsMenu(){
|
||||||
.filter(app => app && app.settings)
|
.filter(app => app && app.settings)
|
||||||
.sort((a, b) => a.sortorder - b.sortorder)
|
.sort((a, b) => a.sortorder - b.sortorder)
|
||||||
if (apps.length === 0) {
|
if (apps.length === 0) {
|
||||||
appmenu['No app has settings'] = () => {};
|
appmenu['No app has settings'] = () => { };
|
||||||
}
|
}
|
||||||
apps.forEach(function (app) {
|
apps.forEach(function (app) {
|
||||||
appmenu[app.name] = () => {showAppSettings(app)};
|
appmenu[app.name] = () => { showAppSettings(app) };
|
||||||
})
|
})
|
||||||
E.showMenu(appmenu)
|
E.showMenu(appmenu)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue