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() {
|
2019-11-09 20:01:36 +00:00
|
|
|
//storage.erase('@setting'); // - not needed, just causes extra writes if settings were the same
|
2019-11-07 21:49:47 +00:00
|
|
|
storage.write('@setting', settings);
|
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
|
|
|
|
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?
|
2020-02-04 16:17:23 +00:00
|
|
|
distance : "kilometer" // or "mile"
|
2020-02-13 08:18:32 +00:00
|
|
|
// welcomed : undefined/true (whether welcome app should show)
|
2019-11-06 22:12:54 +00:00
|
|
|
};
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2019-11-07 21:49:47 +00:00
|
|
|
settings = storage.readJSON('@setting');
|
2019-11-06 22:12:54 +00:00
|
|
|
} catch (e) {}
|
|
|
|
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() {
|
|
|
|
const mainmenu = {
|
|
|
|
'': { 'title': 'Settings' },
|
2020-02-04 16:17:23 +00:00
|
|
|
'Make Connectable': makeConnectable,
|
2019-11-08 17:52:37 +00:00
|
|
|
'BLE': {
|
|
|
|
value: settings.ble,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.ble = !settings.ble;
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2019-11-10 11:46:05 +00:00
|
|
|
'Programmable': {
|
2020-02-25 13:34:06 +00:00
|
|
|
value: settings.blerepl,
|
2019-11-09 01:30:11 +00:00
|
|
|
format: boolFormat,
|
2019-11-08 23:59:37 +00:00
|
|
|
onchange: () => {
|
2020-02-25 13:34:06 +00:00
|
|
|
settings.blerepl = !settings.blerepl;
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Debug info': {
|
|
|
|
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
|
|
|
'LCD Timeout': {
|
|
|
|
value: settings.timeout,
|
|
|
|
min: 0,
|
|
|
|
max: 60,
|
|
|
|
step: 5,
|
|
|
|
onchange: v => {
|
|
|
|
settings.timeout = 0 | v;
|
|
|
|
updateSettings();
|
|
|
|
Bangle.setLCDTimeout(settings.timeout);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Beep': {
|
|
|
|
value: settings.beep,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.beep = !settings.beep;
|
|
|
|
updateSettings();
|
|
|
|
if (settings.beep) {
|
|
|
|
Bangle.beep(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Vibration': {
|
|
|
|
value: settings.vibrate,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: () => {
|
|
|
|
settings.vibrate = !settings.vibrate;
|
|
|
|
updateSettings();
|
|
|
|
if (settings.vibrate) {
|
|
|
|
VIBRATE.write(1);
|
|
|
|
setTimeout(()=>VIBRATE.write(0), 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2020-02-13 08:18:32 +00:00
|
|
|
'Welcome App': {
|
|
|
|
value: !settings.welcomed,
|
|
|
|
format: boolFormat,
|
|
|
|
onchange: v => {
|
|
|
|
settings.welcomed = v?undefined:true;
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2020-02-04 16:17:23 +00:00
|
|
|
'Locale': showLocaleMenu,
|
2019-11-16 22:13:49 +00:00
|
|
|
'Select Clock': showClockMenu,
|
2020-02-04 16:17:23 +00:00
|
|
|
'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,
|
2019-11-06 22:12:54 +00:00
|
|
|
'Time Zone': {
|
|
|
|
value: settings.timezone,
|
|
|
|
min: -11,
|
|
|
|
max: 12,
|
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"],
|
|
|
|
format : v => v?"12hr":"24hr",
|
|
|
|
onchange: v => {
|
|
|
|
settings["12hour"] = v;
|
2019-11-08 15:54:57 +00:00
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
2020-02-04 16:17:23 +00:00
|
|
|
'Distance/Speed': {
|
2020-02-10 13:49:57 +00:00
|
|
|
value: settings.distance=="mile",
|
|
|
|
format: v => v?"mile":"km",
|
2020-02-04 16:17:23 +00:00
|
|
|
onchange: v => {
|
2020-02-10 13:49:57 +00:00
|
|
|
settings.distance = v?"mile":"kilometer";
|
2019-11-06 22:12:54 +00:00
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
};
|
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' },
|
|
|
|
'< Back': showMainMenu,
|
|
|
|
'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() {
|
|
|
|
try { NRF.wake(); } catch(e) {}
|
2019-11-10 11:46:05 +00:00
|
|
|
Bluetooth.setConsole(1);
|
2019-11-09 20:01:36 +00:00
|
|
|
var name="Bangle.js "+NRF.getAddress().substr(-5).replace(":","");
|
|
|
|
E.showPrompt(name+"\nStay Connectable?",{title:"Connectable"}).then(r=>{
|
|
|
|
if (settings.ble!=r) {
|
|
|
|
settings.ble = r;
|
|
|
|
updateSettings();
|
|
|
|
}
|
|
|
|
if (!r) try { NRF.sleep(); } catch(e) {}
|
|
|
|
showMainMenu();
|
|
|
|
});
|
|
|
|
}
|
2019-11-16 22:13:49 +00:00
|
|
|
function showClockMenu() {
|
|
|
|
var clockApps = require("Storage").list().filter(a=>a[0]=='+').map(app=>{
|
|
|
|
try { return require("Storage").readJSON(app); }
|
|
|
|
catch (e) {}
|
|
|
|
}).filter(app=>app.type=="clock").sort((a, b) => a.sortorder - b.sortorder);
|
|
|
|
const clockMenu = {
|
|
|
|
'': {
|
|
|
|
'title': 'Select Clock',
|
|
|
|
},
|
|
|
|
'< Back': showMainMenu,
|
|
|
|
};
|
2019-11-16 22:36:43 +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)) {
|
2019-11-16 22:13:49 +00:00
|
|
|
label = "* "+label;
|
|
|
|
}
|
|
|
|
clockMenu[label] = () => {
|
|
|
|
if (settings.clock !== app.src) {
|
|
|
|
settings.clock = app.src;
|
|
|
|
updateSettings();
|
|
|
|
showMainMenu();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
});
|
|
|
|
if (clockApps.length === 0) {
|
|
|
|
clockMenu["No Clocks Found"] = () => {};
|
|
|
|
}
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(clockMenu);
|
2019-11-16 22:13:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-11-09 20:01:36 +00:00
|
|
|
|
2019-11-07 23:28:07 +00:00
|
|
|
function showSetTimeMenu() {
|
|
|
|
d = new Date();
|
|
|
|
const timemenu = {
|
|
|
|
'': {
|
|
|
|
'title': 'Set Time',
|
|
|
|
'predraw': function() {
|
|
|
|
d = new Date();
|
|
|
|
timemenu.Hour.value = d.getHours();
|
|
|
|
timemenu.Minute.value = d.getMinutes();
|
|
|
|
timemenu.Second.value = d.getSeconds();
|
|
|
|
timemenu.Date.value = d.getDate();
|
|
|
|
timemenu.Month.value = d.getMonth() + 1;
|
|
|
|
timemenu.Year.value = d.getFullYear();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'< Back': showMainMenu,
|
|
|
|
'Hour': {
|
|
|
|
value: d.getHours(),
|
|
|
|
min: 0,
|
|
|
|
max: 23,
|
|
|
|
step: 1,
|
|
|
|
onchange: v => {
|
|
|
|
d = new Date();
|
|
|
|
d.setHours(v);
|
|
|
|
setTime(d.getTime()/1000);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Minute': {
|
|
|
|
value: d.getMinutes(),
|
|
|
|
min: 0,
|
|
|
|
max: 59,
|
|
|
|
step: 1,
|
|
|
|
onchange: v => {
|
|
|
|
d = new Date();
|
|
|
|
d.setMinutes(v);
|
|
|
|
setTime(d.getTime()/1000);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Second': {
|
|
|
|
value: d.getSeconds(),
|
|
|
|
min: 0,
|
|
|
|
max: 59,
|
|
|
|
step: 1,
|
|
|
|
onchange: v => {
|
|
|
|
d = new Date();
|
|
|
|
d.setSeconds(v);
|
|
|
|
setTime(d.getTime()/1000);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Date': {
|
|
|
|
value: d.getDate(),
|
|
|
|
min: 1,
|
|
|
|
max: 31,
|
|
|
|
step: 1,
|
|
|
|
onchange: v => {
|
|
|
|
d = new Date();
|
|
|
|
d.setDate(v);
|
|
|
|
setTime(d.getTime()/1000);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Month': {
|
|
|
|
value: d.getMonth() + 1,
|
|
|
|
min: 1,
|
|
|
|
max: 12,
|
|
|
|
step: 1,
|
|
|
|
onchange: v => {
|
|
|
|
d = new Date();
|
|
|
|
d.setMonth(v - 1);
|
|
|
|
setTime(d.getTime()/1000);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Year': {
|
|
|
|
value: d.getFullYear(),
|
2019-11-20 08:19:56 +00:00
|
|
|
min: 2019,
|
|
|
|
max: 2100,
|
2019-11-07 23:28:07 +00:00
|
|
|
step: 1,
|
|
|
|
onchange: v => {
|
|
|
|
d = new Date();
|
|
|
|
d.setFullYear(v);
|
|
|
|
setTime(d.getTime()/1000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(timemenu);
|
2019-11-07 23:28:07 +00:00
|
|
|
}
|
|
|
|
|
2019-11-06 22:12:54 +00:00
|
|
|
showMainMenu();
|