mirror of https://github.com/espruino/BangleApps
130 lines
3.9 KiB
JavaScript
130 lines
3.9 KiB
JavaScript
(function(back) {
|
|
const SETTINGS_FILE = "run.json";
|
|
var ExStats = require("exstats");
|
|
var statsList = ExStats.getList();
|
|
statsList.unshift({name:"-",id:""}); // add blank menu item
|
|
var statsIDs = statsList.map(s=>s.id);
|
|
|
|
// ...and overwrite them with any saved values
|
|
// This way saved values are preserved if a new version adds more settings
|
|
const storage = require('Storage')
|
|
let settings = Object.assign({
|
|
record: true,
|
|
B1: "dist",
|
|
B2: "time",
|
|
B3: "pacea",
|
|
B4: "bpm",
|
|
B5: "step",
|
|
B6: "caden",
|
|
paceLength: 1000, // TODO: Default to either 1km or 1mi based on locale
|
|
notify: {
|
|
dist: {
|
|
increment: 0,
|
|
notifications: [],
|
|
},
|
|
step: {
|
|
increment: 0,
|
|
notifications: [],
|
|
},
|
|
time: {
|
|
increment: 0,
|
|
notifications: [],
|
|
},
|
|
},
|
|
}, storage.readJSON(SETTINGS_FILE, 1) || {});
|
|
function saveSettings() {
|
|
storage.write(SETTINGS_FILE, settings)
|
|
}
|
|
|
|
function getBoxChooser(boxID) {
|
|
return {
|
|
min: 0, max: statsIDs.length-1,
|
|
value: Math.max(statsIDs.indexOf(settings[boxID]),0),
|
|
format: v => statsList[v].name,
|
|
onchange: v => {
|
|
settings[boxID] = statsIDs[v];
|
|
saveSettings();
|
|
},
|
|
}
|
|
}
|
|
|
|
function sampleBuzz(buzzPatterns) {
|
|
return buzzPatterns.reduce(function (promise, buzzPattern) {
|
|
return promise.then(function () {
|
|
return Bangle.buzz(buzzPattern[0], buzzPattern[1]);
|
|
});
|
|
}, Promise.resolve());
|
|
}
|
|
|
|
var menu = {
|
|
'': { 'title': 'Run' },
|
|
'< Back': back,
|
|
};
|
|
if (global.WIDGETS&&WIDGETS["recorder"])
|
|
menu[/*LANG*/"Record Run"] = {
|
|
value : !!settings.record,
|
|
onchange : v => {
|
|
settings.record = v;
|
|
saveSettings();
|
|
}
|
|
};
|
|
var notificationsMenu = {
|
|
'< Back': function() { E.showMenu(menu) },
|
|
}
|
|
menu[/*LANG*/"Notifications"] = function() { E.showMenu(notificationsMenu)};
|
|
ExStats.appendMenuItems(menu, settings, saveSettings);
|
|
ExStats.appendNotifyMenuItems(notificationsMenu, settings, saveSettings);
|
|
var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"];
|
|
var vibTimes = [
|
|
[],
|
|
[[100, 1]],
|
|
[[300, 1]],
|
|
[[300, 1], [300, 0], [300, 1]],
|
|
[[300, 1],[300, 0], [100, 1], [300, 0], [300, 1]],
|
|
[[300, 1],[300, 0],[300, 1],[300, 0],[300, 1]],
|
|
];
|
|
notificationsMenu[/*LANG*/"Dist Pattern"] = {
|
|
value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.dist.notifications))),
|
|
min: 0, max: vibTimes.length - 1,
|
|
format: v => vibPatterns[v]||/*LANG*/"Off",
|
|
onchange: v => {
|
|
settings.notify.dist.notifications = vibTimes[v];
|
|
sampleBuzz(vibTimes[v]);
|
|
saveSettings();
|
|
}
|
|
}
|
|
notificationsMenu[/*LANG*/"Step Pattern"] = {
|
|
value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.step.notifications))),
|
|
min: 0, max: vibTimes.length - 1,
|
|
format: v => vibPatterns[v]||/*LANG*/"Off",
|
|
onchange: v => {
|
|
settings.notify.step.notifications = vibTimes[v];
|
|
sampleBuzz(vibTimes[v]);
|
|
saveSettings();
|
|
}
|
|
}
|
|
notificationsMenu[/*LANG*/"Time Pattern"] = {
|
|
value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.time.notifications))),
|
|
min: 0, max: vibTimes.length - 1,
|
|
format: v => vibPatterns[v]||/*LANG*/"Off",
|
|
onchange: v => {
|
|
settings.notify.time.notifications = vibTimes[v];
|
|
sampleBuzz(vibTimes[v]);
|
|
saveSettings();
|
|
}
|
|
}
|
|
var boxMenu = {
|
|
'< Back': function() { E.showMenu(menu) },
|
|
}
|
|
Object.assign(boxMenu,{
|
|
'Box 1': getBoxChooser("B1"),
|
|
'Box 2': getBoxChooser("B2"),
|
|
'Box 3': getBoxChooser("B3"),
|
|
'Box 4': getBoxChooser("B4"),
|
|
'Box 5': getBoxChooser("B5"),
|
|
'Box 6': getBoxChooser("B6"),
|
|
});
|
|
menu[/*LANG*/"Boxes"] = function() { E.showMenu(boxMenu)};
|
|
E.showMenu(menu);
|
|
})
|