Merge pull request #225 from detached/auto-on-settings

Add lcd wake-up settings
master
Gordon Williams 2020-04-06 08:47:36 +01:00 committed by GitHub
commit c45cfb47b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 168 additions and 36 deletions

View File

@ -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}
], ],

View File

@ -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

6
apps/setting/boot.js Normal file
View File

@ -0,0 +1,6 @@
(() => {
var settings = require('Storage').readJSON('setting.json', true);
if (settings != undefined) {
Bangle.setOptions(settings.options);
}
})()

View File

@ -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
}
} }

View File

@ -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)
} }