2020-02-12 10:48:14 +00:00
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
|
|
|
|
2019-11-06 22:12:54 +00:00
|
|
|
const storage = require('Storage');
|
|
|
|
let settings;
|
|
|
|
|
|
|
|
function updateSettings() {
|
2020-02-28 11:44:25 +00:00
|
|
|
//storage.erase('setting.json'); // - not needed, just causes extra writes if settings were the same
|
|
|
|
storage.write('setting.json', settings);
|
2019-11-06 22:12:54 +00:00
|
|
|
}
|
|
|
|
|
2020-04-03 20:43:38 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-11-06 22:12:54 +00:00
|
|
|
function resetSettings() {
|
|
|
|
settings = {
|
2020-02-25 13:34:06 +00:00
|
|
|
ble: true, // Bluetooth enabled by default
|
|
|
|
blerepl: true, // Is REPL on Bluetooth - can Espruino IDE be used?
|
|
|
|
log: false, // Do log messages appear on screen?
|
|
|
|
timeout: 10, // Default LCD timeout in seconds
|
|
|
|
vibrate: true, // Vibration enabled by default. App must support
|
2020-03-25 11:05:33 +00:00
|
|
|
beep: "vib", // Beep enabled by default. App must support
|
2020-02-25 13:34:06 +00:00
|
|
|
timezone: 0, // Set the timezone for the device
|
2020-04-03 20:43:38 +00:00
|
|
|
HID: false, // BLE HID mode, off by default
|
2020-02-25 13:34:06 +00:00
|
|
|
clock: null, // a string for the default clock's name
|
|
|
|
"12hour" : false, // 12 or 24 hour clock?
|
2020-04-05 14:30:55 +00:00
|
|
|
brightness: 1, // LCD brightness from 0 to 1
|
2020-02-13 08:18:32 +00:00
|
|
|
// welcomed : undefined/true (whether welcome app should show)
|
2020-04-03 20:43:38 +00:00
|
|
|
options: {
|
|
|
|
wakeOnBTN1: true,
|
|
|
|
wakeOnBTN2: true,
|
|
|
|
wakeOnBTN3: true,
|
|
|
|
wakeOnFaceUp: false,
|
|
|
|
wakeOnTouch: false,
|
|
|
|
wakeOnTwist: true,
|
|
|
|
twistThreshold: 819.2,
|
|
|
|
twistMaxY: -800,
|
|
|
|
twistTimeout: 1000
|
|
|
|
}
|
2019-11-06 22:12:54 +00:00
|
|
|
};
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
|
2020-04-03 20:43:38 +00:00
|
|
|
settings = storage.readJSON('setting.json', 1);
|
2019-11-06 22:12:54 +00:00
|
|
|
if (!settings) resetSettings();
|
|
|
|
|
2020-02-25 13:34:06 +00:00
|
|
|
const boolFormat = v => v ? "On" : "Off";
|
2019-11-06 22:12:54 +00:00
|
|
|
|
|
|
|
function showMainMenu() {
|
2020-04-03 20:43:38 +00:00
|
|
|
var beepV = [false, true, "vib"];
|
|
|
|
var beepN = ["Off", "Piezo", "Vibrate"];
|
2019-11-06 22:12:54 +00:00
|
|
|
const mainmenu = {
|
|
|
|
'': { 'title': 'Settings' },
|
2020-04-09 20:51:19 +00:00
|
|
|
'Make Connectable': ()=>makeConnectable(),
|
2020-04-11 23:29:57 +00:00
|
|
|
'App/Widget Settings': ()=>showAppSettingsMenu(),
|
2020-05-15 15:14:17 +00:00
|
|
|
'BLE': ()=>showBLEMenu(),
|
2020-04-11 23:29:57 +00:00
|
|
|
'Debug Info': {
|
2020-02-25 13:34:06 +00:00
|
|
|
value: settings.log,
|
|
|
|
format: v => v ? "Show" : "Hide",
|
|
|
|
onchange: () => {
|
|
|
|
settings.log = !settings.log;
|
2019-11-08 23:59:37 +00:00
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2019-11-06 22:12:54 +00:00
|
|
|
'Beep': {
|
2020-04-03 20:43:38 +00:00
|
|
|
value: 0 | beepV.indexOf(settings.beep),
|
|
|
|
min: 0, max: 2,
|
|
|
|
format: v => beepN[v],
|
2020-03-25 11:05:33 +00:00
|
|
|
onchange: v => {
|
|
|
|
settings.beep = beepV[v];
|
2020-04-05 14:30:55 +00:00
|
|
|
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
|
2019-11-06 22:12:54 +00:00
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Vibration': {
|
|
|
|
value: settings.vibrate,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.vibrate = !settings.vibrate;
|
|
|
|
updateSettings();
|
|
|
|
if (settings.vibrate) {
|
|
|
|
VIBRATE.write(1);
|
2020-04-03 20:43:38 +00:00
|
|
|
setTimeout(() => VIBRATE.write(0), 10);
|
2019-11-06 22:12:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2020-04-09 20:51:19 +00:00
|
|
|
'Locale': ()=>showLocaleMenu(),
|
|
|
|
'Select Clock': ()=>showClockMenu(),
|
|
|
|
'Set Time': ()=>showSetTimeMenu(),
|
2020-04-10 15:42:14 +00:00
|
|
|
'LCD': ()=>showLCDMenu(),
|
2020-04-09 20:51:19 +00:00
|
|
|
'Reset Settings': ()=>showResetMenu(),
|
|
|
|
'Turn Off': ()=>Bangle.off(),
|
|
|
|
'< Back': ()=>load()
|
2020-02-04 16:17:23 +00:00
|
|
|
};
|
|
|
|
return E.showMenu(mainmenu);
|
|
|
|
}
|
|
|
|
|
2020-05-15 15:14:17 +00:00
|
|
|
function showBLEMenu() {
|
2020-09-28 08:05:28 +00:00
|
|
|
var hidV = [false, "kbmedia", "kb", "joy"];
|
|
|
|
var hidN = ["Off", "Kbrd & Media", "Kbrd","Joystick"];
|
2020-05-15 15:14:17 +00:00
|
|
|
E.showMenu({
|
|
|
|
'BLE': {
|
|
|
|
value: settings.ble,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.ble = !settings.ble;
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Programmable': {
|
|
|
|
value: settings.blerepl,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.blerepl = !settings.blerepl;
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2020-09-28 08:05:28 +00:00
|
|
|
'HID': {
|
|
|
|
value: 0 | hidV.indexOf(settings.HID),
|
|
|
|
min: 0, max: 3,
|
|
|
|
format: v => hidN[v],
|
|
|
|
onchange: v => {
|
|
|
|
settings.HID = hidV[v];
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2020-07-30 08:59:20 +00:00
|
|
|
'Passkey BETA': {
|
2020-05-15 15:14:17 +00:00
|
|
|
value: settings.passkey?settings.passkey:"none",
|
|
|
|
onchange: () => setTimeout(showPasskeyMenu) // graphical_menu redraws after the call
|
|
|
|
},
|
2020-07-30 08:59:20 +00:00
|
|
|
'Whitelist': {
|
|
|
|
value: settings.whitelist?(settings.whitelist.length+" devs"):"off",
|
|
|
|
onchange: () => setTimeout(showWhitelistMenu) // graphical_menu redraws after the call
|
|
|
|
},
|
2020-05-15 15:14:17 +00:00
|
|
|
'< Back': ()=>showMainMenu()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function showPasskeyMenu() {
|
|
|
|
var menu = {
|
|
|
|
"Disable" : () => {
|
|
|
|
settings.passkey = undefined;
|
|
|
|
updateSettings();
|
|
|
|
showBLEMenu();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
if (!settings.passkey || settings.passkey.length!=6)
|
|
|
|
settings.passkey = "123456";
|
|
|
|
for (var i=0;i<6;i++) (function(i){
|
|
|
|
menu[`Digit ${i+1}`] = {
|
|
|
|
value : 0|settings.passkey[i],
|
|
|
|
min: 0, max: 9,
|
|
|
|
onchange: v => {
|
|
|
|
var p = settings.passkey.split("");
|
|
|
|
p[i] = v;
|
|
|
|
settings.passkey = p.join("");
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
})(i);
|
|
|
|
menu['< Back']=()=>showBLEMenu();
|
|
|
|
E.showMenu(menu);
|
2020-02-04 16:17:23 +00:00
|
|
|
}
|
|
|
|
|
2020-07-30 08:59:20 +00:00
|
|
|
function showWhitelistMenu() {
|
|
|
|
var menu = {
|
|
|
|
"Disable" : () => {
|
|
|
|
settings.whitelist = undefined;
|
|
|
|
updateSettings();
|
|
|
|
showBLEMenu();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
if (settings.whitelist) settings.whitelist.forEach(function(d){
|
|
|
|
menu[d.substr(0,17)] = function() {
|
|
|
|
E.showPrompt('Remove\n'+d).then((v) => {
|
|
|
|
if (v) {
|
|
|
|
settings.whitelist.splice(settings.whitelist.indexOf(d),1);
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
setTimeout(showWhitelistMenu, 50);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
menu['Add Device']=function() {
|
|
|
|
E.showAlert("Connect device\nto add to\nwhitelist","Whitelist").then(function() {
|
|
|
|
NRF.removeAllListeners('connect');
|
|
|
|
showWhitelistMenu();
|
|
|
|
});
|
|
|
|
NRF.removeAllListeners('connect');
|
|
|
|
NRF.on('connect', function(addr) {
|
|
|
|
if (!settings.whitelist) settings.whitelist=[];
|
|
|
|
settings.whitelist.push(addr);
|
|
|
|
updateSettings();
|
|
|
|
NRF.removeAllListeners('connect');
|
|
|
|
showWhitelistMenu();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
menu['< Back']=()=>showBLEMenu();
|
|
|
|
E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
2020-04-10 15:42:14 +00:00
|
|
|
function showLCDMenu() {
|
|
|
|
const lcdMenu = {
|
|
|
|
'': { 'title': 'LCD' },
|
2020-04-09 20:51:19 +00:00
|
|
|
'< Back': ()=>showMainMenu(),
|
2020-04-10 15:42:14 +00:00
|
|
|
'LCD Brightness': {
|
|
|
|
value: settings.brightness,
|
|
|
|
min: 0.1,
|
|
|
|
max: 1,
|
|
|
|
step: 0.1,
|
|
|
|
onchange: v => {
|
|
|
|
settings.brightness = v || 1;
|
|
|
|
updateSettings();
|
|
|
|
Bangle.setLCDBrightness(settings.brightness);
|
|
|
|
}
|
|
|
|
},
|
2020-04-09 20:51:19 +00:00
|
|
|
'LCD Timeout': {
|
|
|
|
value: settings.timeout,
|
|
|
|
min: 0,
|
|
|
|
max: 60,
|
|
|
|
step: 5,
|
|
|
|
onchange: v => {
|
|
|
|
settings.timeout = 0 | v;
|
|
|
|
updateSettings();
|
|
|
|
Bangle.setLCDTimeout(settings.timeout);
|
|
|
|
}
|
|
|
|
},
|
2020-04-11 23:29:57 +00:00
|
|
|
'Wake on BTN1': {
|
2020-04-03 20:43:38 +00:00
|
|
|
value: settings.options.wakeOnBTN1,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.options.wakeOnBTN1 = !settings.options.wakeOnBTN1;
|
|
|
|
updateOptions();
|
|
|
|
}
|
|
|
|
},
|
2020-04-11 23:29:57 +00:00
|
|
|
'Wake on BTN2': {
|
2020-04-03 20:43:38 +00:00
|
|
|
value: settings.options.wakeOnBTN2,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.options.wakeOnBTN2 = !settings.options.wakeOnBTN2;
|
|
|
|
updateOptions();
|
|
|
|
}
|
|
|
|
},
|
2020-04-11 23:29:57 +00:00
|
|
|
'Wake on BTN3': {
|
2020-04-03 20:43:38 +00:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
},
|
2020-04-11 23:29:57 +00:00
|
|
|
'Wake on Twist': {
|
2020-04-03 20:43:38 +00:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-04-10 15:42:14 +00:00
|
|
|
return E.showMenu(lcdMenu)
|
2020-04-03 20:43:38 +00:00
|
|
|
}
|
|
|
|
|
2020-02-04 16:17:23 +00:00
|
|
|
function showLocaleMenu() {
|
|
|
|
const localemenu = {
|
|
|
|
'': { 'title': 'Locale' },
|
2020-04-09 20:51:19 +00:00
|
|
|
'< Back': ()=>showMainMenu(),
|
2019-11-06 22:12:54 +00:00
|
|
|
'Time Zone': {
|
|
|
|
value: settings.timezone,
|
|
|
|
min: -11,
|
2021-01-28 04:43:52 +00:00
|
|
|
max: 13,
|
2019-12-18 21:23:35 +00:00
|
|
|
step: 0.5,
|
2019-11-06 22:12:54 +00:00
|
|
|
onchange: v => {
|
2019-12-19 14:23:53 +00:00
|
|
|
settings.timezone = v || 0;
|
2019-11-06 22:12:54 +00:00
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2020-02-04 16:17:23 +00:00
|
|
|
'Clock Style': {
|
|
|
|
value: !!settings["12hour"],
|
2020-04-03 20:43:38 +00:00
|
|
|
format: v => v ? "12hr" : "24hr",
|
2020-02-04 16:17:23 +00:00
|
|
|
onchange: v => {
|
|
|
|
settings["12hour"] = v;
|
2019-11-08 15:54:57 +00:00
|
|
|
updateSettings();
|
|
|
|
}
|
2020-03-10 12:35:45 +00:00
|
|
|
}
|
2019-11-06 22:12:54 +00:00
|
|
|
};
|
2020-02-04 16:17:23 +00:00
|
|
|
return E.showMenu(localemenu);
|
2019-11-06 22:12:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function showResetMenu() {
|
|
|
|
const resetmenu = {
|
|
|
|
'': { 'title': 'Reset' },
|
2020-04-09 20:51:19 +00:00
|
|
|
'< Back': ()=>showMainMenu(),
|
2019-11-06 22:12:54 +00:00
|
|
|
'Reset Settings': () => {
|
|
|
|
E.showPrompt('Reset Settings?').then((v) => {
|
|
|
|
if (v) {
|
|
|
|
E.showMessage('Resetting');
|
|
|
|
resetSettings();
|
|
|
|
}
|
|
|
|
setTimeout(showMainMenu, 50);
|
|
|
|
});
|
2020-02-04 16:17:23 +00:00
|
|
|
}
|
2019-11-06 22:12:54 +00:00
|
|
|
};
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(resetmenu);
|
2019-11-06 22:12:54 +00:00
|
|
|
}
|
|
|
|
|
2019-11-09 20:01:36 +00:00
|
|
|
function makeConnectable() {
|
2020-04-03 20:43:38 +00:00
|
|
|
try { NRF.wake(); } catch (e) { }
|
2019-11-10 11:46:05 +00:00
|
|
|
Bluetooth.setConsole(1);
|
2020-04-03 20:43:38 +00:00
|
|
|
var name = "Bangle.js " + NRF.getAddress().substr(-5).replace(":", "");
|
|
|
|
E.showPrompt(name + "\nStay Connectable?", { title: "Connectable" }).then(r => {
|
|
|
|
if (settings.ble != r) {
|
2019-11-09 20:01:36 +00:00
|
|
|
settings.ble = r;
|
|
|
|
updateSettings();
|
|
|
|
}
|
2020-04-03 20:43:38 +00:00
|
|
|
if (!r) try { NRF.sleep(); } catch (e) { }
|
2019-11-09 20:01:36 +00:00
|
|
|
showMainMenu();
|
|
|
|
});
|
|
|
|
}
|
2019-11-16 22:13:49 +00:00
|
|
|
function showClockMenu() {
|
2020-04-15 09:35:29 +00:00
|
|
|
var clockApps = require("Storage").list(/\.info$/)
|
|
|
|
.map(app => {var a=storage.readJSON(app, 1);return (a&&a.type == "clock")?a:undefined})
|
|
|
|
.filter(app => app) // filter out any undefined apps
|
|
|
|
.sort((a, b) => a.sortorder - b.sortorder);
|
2019-11-16 22:13:49 +00:00
|
|
|
const clockMenu = {
|
|
|
|
'': {
|
|
|
|
'title': 'Select Clock',
|
|
|
|
},
|
2020-04-09 20:51:19 +00:00
|
|
|
'< Back': ()=>showMainMenu(),
|
2019-11-16 22:13:49 +00:00
|
|
|
};
|
2020-04-03 20:43:38 +00:00
|
|
|
clockApps.forEach((app, index) => {
|
2019-11-16 22:13:49 +00:00
|
|
|
var label = app.name;
|
2019-11-16 22:36:43 +00:00
|
|
|
if ((!settings.clock && index === 0) || (settings.clock === app.src)) {
|
2020-04-03 20:43:38 +00:00
|
|
|
label = "* " + label;
|
2019-11-16 22:13:49 +00:00
|
|
|
}
|
|
|
|
clockMenu[label] = () => {
|
|
|
|
if (settings.clock !== app.src) {
|
|
|
|
settings.clock = app.src;
|
|
|
|
updateSettings();
|
|
|
|
showMainMenu();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
});
|
|
|
|
if (clockApps.length === 0) {
|
2020-04-03 20:43:38 +00:00
|
|
|
clockMenu["No Clocks Found"] = () => { };
|
2019-11-16 22:13:49 +00:00
|
|
|
}
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(clockMenu);
|
2019-11-16 22:13:49 +00:00
|
|
|
}
|
|
|
|
|
2019-11-07 23:28:07 +00:00
|
|
|
function showSetTimeMenu() {
|
|
|
|
d = new Date();
|
|
|
|
const timemenu = {
|
2020-06-08 08:52:27 +00:00
|
|
|
'': { 'title': 'Set Time' },
|
|
|
|
'< Back': function () {
|
|
|
|
setTime(d.getTime() / 1000);
|
|
|
|
showMainMenu();
|
2019-11-07 23:28:07 +00:00
|
|
|
},
|
|
|
|
'Hour': {
|
|
|
|
value: d.getHours(),
|
2020-06-08 08:52:27 +00:00
|
|
|
onchange: function (v) {
|
|
|
|
this.value = (v+24)%24;
|
|
|
|
d.setHours(this.value);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
'Minute': {
|
|
|
|
value: d.getMinutes(),
|
2020-06-08 08:52:27 +00:00
|
|
|
onchange: function (v) {
|
|
|
|
this.value = (v+60)%60;
|
|
|
|
d.setMinutes(this.value);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
'Second': {
|
|
|
|
value: d.getSeconds(),
|
2020-06-08 08:52:27 +00:00
|
|
|
onchange: function (v) {
|
|
|
|
this.value = (v+60)%60;
|
|
|
|
d.setSeconds(this.value);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
'Date': {
|
|
|
|
value: d.getDate(),
|
2020-06-08 08:52:27 +00:00
|
|
|
onchange: function (v) {
|
2020-06-08 14:45:16 +00:00
|
|
|
this.value = ((v+30)%31)+1;
|
2020-06-08 08:52:27 +00:00
|
|
|
d.setDate(this.value);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
'Month': {
|
|
|
|
value: d.getMonth() + 1,
|
2020-06-08 08:52:27 +00:00
|
|
|
onchange: function (v) {
|
|
|
|
this.value = ((v+11)%12)+1;
|
|
|
|
d.setMonth(this.value - 1);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
'Year': {
|
|
|
|
value: d.getFullYear(),
|
2019-11-20 08:19:56 +00:00
|
|
|
min: 2019,
|
|
|
|
max: 2100,
|
2020-06-08 08:52:27 +00:00
|
|
|
onchange: function (v) {
|
2019-11-07 23:28:07 +00:00
|
|
|
d.setFullYear(v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(timemenu);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
|
2020-04-04 15:56:49 +00:00
|
|
|
function showAppSettingsMenu() {
|
2020-04-02 23:18:21 +00:00
|
|
|
let appmenu = {
|
2020-04-04 15:56:49 +00:00
|
|
|
'': { 'title': 'App Settings' },
|
2020-04-09 20:51:19 +00:00
|
|
|
'< Back': ()=>showMainMenu(),
|
2020-04-02 23:18:21 +00:00
|
|
|
}
|
2020-04-17 19:08:07 +00:00
|
|
|
const apps = storage.list(/\.settings\.js$/)
|
|
|
|
.map(s => s.substr(0, s.length-12))
|
|
|
|
.map(id => {
|
2020-04-30 09:23:43 +00:00
|
|
|
const a=storage.readJSON(id+'.info',1) || {name: id};
|
2020-04-17 19:08:07 +00:00
|
|
|
return {id:id,name:a.name,sortorder:a.sortorder};
|
|
|
|
})
|
|
|
|
.sort((a, b) => {
|
|
|
|
const n = (0|a.sortorder)-(0|b.sortorder);
|
|
|
|
if (n) return n; // do sortorder first
|
|
|
|
if (a.name<b.name) return -1;
|
|
|
|
if (a.name>b.name) return 1;
|
|
|
|
return 0;
|
|
|
|
})
|
2020-04-02 23:18:21 +00:00
|
|
|
if (apps.length === 0) {
|
2020-04-04 15:56:49 +00:00
|
|
|
appmenu['No app has settings'] = () => { };
|
2020-04-02 23:18:21 +00:00
|
|
|
}
|
|
|
|
apps.forEach(function (app) {
|
2020-04-04 15:56:49 +00:00
|
|
|
appmenu[app.name] = () => { showAppSettings(app) };
|
2020-04-02 23:18:21 +00:00
|
|
|
})
|
|
|
|
E.showMenu(appmenu)
|
|
|
|
}
|
|
|
|
function showAppSettings(app) {
|
|
|
|
const showError = msg => {
|
|
|
|
E.showMessage(`${app.name}:\n${msg}!\n\nBTN1 to go back`);
|
|
|
|
setWatch(showAppSettingsMenu, BTN1, { repeat: false });
|
|
|
|
}
|
2020-04-17 19:08:07 +00:00
|
|
|
let appSettings = storage.read(app.id+'.settings.js');
|
2020-04-02 23:18:21 +00:00
|
|
|
try {
|
2020-04-03 19:32:05 +00:00
|
|
|
appSettings = eval(appSettings);
|
2020-04-02 23:18:21 +00:00
|
|
|
} catch (e) {
|
|
|
|
console.log(`${app.name} settings error:`, e)
|
|
|
|
return showError('Error in settings');
|
|
|
|
}
|
|
|
|
if (typeof appSettings !== "function") {
|
|
|
|
return showError('Invalid settings');
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
// pass showAppSettingsMenu as "back" argument
|
2020-04-11 23:29:57 +00:00
|
|
|
appSettings(()=>showAppSettingsMenu());
|
2020-04-02 23:18:21 +00:00
|
|
|
} catch (e) {
|
|
|
|
console.log(`${app.name} settings error:`, e)
|
|
|
|
return showError('Error in settings');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-06 22:12:54 +00:00
|
|
|
showMainMenu();
|