forked from FOSS/BangleApps
111 lines
3.2 KiB
JavaScript
111 lines
3.2 KiB
JavaScript
const storage = require("Storage");
|
|
|
|
Bangle.loadWidgets();
|
|
Bangle.drawWidgets();
|
|
|
|
function pad(number) {
|
|
return ('00' + parseInt(number)).slice(-2);
|
|
}
|
|
|
|
function fileNameToDateString(fileName) {
|
|
let timestamp = 0;
|
|
let foundDigitYet = false;
|
|
for (let character of fileName) {
|
|
if ('1234567890'.includes(character)) {
|
|
foundDigitYet = true;
|
|
timestamp *= 10;
|
|
timestamp += parseInt(character);
|
|
} else if (foundDigitYet) break;
|
|
}
|
|
let date = new Date(timestamp);
|
|
|
|
let dayOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][date.getDay()];
|
|
let completed = storage.readJSON(fileName).final;
|
|
|
|
return `${dayOfWeek} ${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` + (completed ? '' : ' (running)');
|
|
}
|
|
|
|
function msToHumanReadable(ms) {
|
|
|
|
let hours = Math.floor(ms / 3600000);
|
|
let minutes = Math.floor((ms % 3600000) / 60000);
|
|
let seconds = Math.floor((ms % 60000) / 1000);
|
|
let hundredths = Math.floor((ms % 1000) / 10);
|
|
|
|
return `${hours}:${pad(minutes)}:${pad(seconds)}:${pad(hundredths)}`;
|
|
}
|
|
|
|
function view(fileName) {
|
|
let lapTimes = [];
|
|
let fileData = storage.readJSON(fileName).splits;
|
|
for (let i = 0; i < fileData.length; i++) {
|
|
if (i == 0) lapTimes.push(fileData[i]);
|
|
else lapTimes.push(fileData[i] - fileData[i - 1]);
|
|
}
|
|
|
|
let fastestIndex = 0;
|
|
let slowestIndex = 0;
|
|
for (let i = 0; i < lapTimes.length; i++) {
|
|
if (lapTimes[i] < lapTimes[fastestIndex]) fastestIndex = i;
|
|
else if (lapTimes[i] > lapTimes[slowestIndex]) slowestIndex = i;
|
|
}
|
|
|
|
let lapMenu = {
|
|
'': {
|
|
'title': fileNameToDateString(fileName),
|
|
'back': () => showMainMenu()
|
|
},
|
|
};
|
|
lapMenu[`Total time: ${msToHumanReadable(fileData[fileData.length - 1])}`] = () => { };
|
|
lapMenu[`Fastest lap: ${fastestIndex + 1}: ${msToHumanReadable(lapTimes[fastestIndex])}`] = () => { };
|
|
lapMenu[`Slowest lap: ${slowestIndex + 1}: ${msToHumanReadable(lapTimes[slowestIndex])}`] = () => { };
|
|
lapMenu[`Average lap: ${msToHumanReadable(fileData[fileData.length - 1] / fileData.length)}`] = () => { };
|
|
|
|
for (let i = 0; i < lapTimes.length; i++) {
|
|
lapMenu[`Lap ${i + 1}: ${msToHumanReadable(lapTimes[i])}`] = () => { };
|
|
}
|
|
|
|
lapMenu.Delete = () => {
|
|
E.showMenu({
|
|
'': {
|
|
'title': 'Are you sure?',
|
|
'back': () => { E.showMenu(lapMenu); }
|
|
},
|
|
'Yes': () => {
|
|
storage.erase(fileName);
|
|
showMainMenu();
|
|
},
|
|
'No': () => { E.showMenu(lapMenu); }
|
|
});
|
|
};
|
|
|
|
E.showMenu(lapMenu);
|
|
}
|
|
|
|
function showMainMenu() {
|
|
let LAP_FILES = storage.list(/stlap-[0-9]*\.json/);
|
|
LAP_FILES.sort();
|
|
LAP_FILES.reverse();
|
|
|
|
let mainMenu = {
|
|
'': {
|
|
'title': 'Sessions',
|
|
'back': () => load()
|
|
}
|
|
};
|
|
|
|
for (let lapFile of LAP_FILES) {
|
|
// `let` variables in JS have special behaviour in loops,
|
|
// where capturing them captures that instance of the variable,
|
|
// but for espruino we need to do a slightly older trick:
|
|
mainMenu[fileNameToDateString(lapFile)] = ((lapFile) => () => view(lapFile))(lapFile);
|
|
}
|
|
|
|
if (LAP_FILES.length == 0) {
|
|
mainMenu['No data'] = _ => { load(); };
|
|
}
|
|
|
|
E.showMenu(mainMenu);
|
|
}
|
|
|
|
showMainMenu(); |