From 16cc803b8632f07a71a9ec871be2209dc544dd16 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Tue, 12 Dec 2023 19:30:46 +0100 Subject: [PATCH] myprofile: Add birthday setting --- apps/myprofile/README.md | 14 ++-- apps/myprofile/settings.js | 131 +++++++++++++++++++++++++++---------- 2 files changed, 105 insertions(+), 40 deletions(-) diff --git a/apps/myprofile/README.md b/apps/myprofile/README.md index 4b2fac9f3..6879d84fc 100644 --- a/apps/myprofile/README.md +++ b/apps/myprofile/README.md @@ -4,12 +4,14 @@ Configure your personal profile. All settings are optional and are only stored o ## Available settings -| Setting | Description | Displayed in | Stored in | Default value | How to measure | -| ------------- | ------------------------------- | ------------------- | --------- | ------------- | ----------------------------------------------------------------- | -| HR max | maximum heart rate | BPM | BPM | 60 | Use maximum value when exercising.
If unsure set to 220-age. | -| HR min | minimum heart rate | BPM | BPM | 200 | Measure your heart rate after waking up | -| Stride length | distance traveled with one step | local length unit | meter | 0 (=not set) | Walk 10 steps and divide the travelled distance by 10 | +| Setting | Description | Displayed in | Stored in | Default value | How to measure | +| ------------- | ------------------------------- | ------------------- | ------------ | ------------- | ----------------------------------------------------------------- | +| Birthday | Used to calculate age | year, month, day | 'YYYY-MM-DD' | 01.01.1970 | - | +| HR max | maximum heart rate | BPM | BPM | 60 | Use maximum value when exercising.
If unsure set to 220-age. | +| HR min | minimum heart rate | BPM | BPM | 200 | Measure your heart rate after waking up | +| Stride length | distance traveled with one step | local length unit | meter | 0 (=not set) | Walk 10 steps and divide the travelled distance by 10 | ## Developer notes -Feel free to add additional settings +- Feel free to add additional settings. +- For values without reasonable defaults never assume that a value is set. Always check the value before using it. diff --git a/apps/myprofile/settings.js b/apps/myprofile/settings.js index 80979bd2c..ba2603d65 100644 --- a/apps/myprofile/settings.js +++ b/apps/myprofile/settings.js @@ -5,47 +5,110 @@ minHrm: 60, maxHrm: 200, strideLength: 0, // 0 = not set + birthday: '1970-01-01', }, require('Storage').readJSON(FILE, true) || {}); function writeProfile() { require('Storage').writeJSON(FILE, myprofile); } - // Show the menu - E.showMenu({ - "" : { "title" : /*LANG*/"My Profile" }, + const ageMenu = () => { + const date = new Date(myprofile.birthday); - "< Back" : () => back(), + E.showMenu({ + "" : { "title" : /*LANG*/"Birthday" }, - /*LANG*/'HR max': { - format: v => /*LANG*/`${v} BPM`, - value: myprofile.maxHrm, - min: 30, max: 220, - onchange: v => { - myprofile.maxHrm = v; - writeProfile(); - } - }, - - /*LANG*/'HR min': { - format: v => /*LANG*/`${v} BPM`, - value: myprofile.minHrm, - min: 30, max: 220, - onchange: v => { - myprofile.minHrm = v; - writeProfile(); - } - }, - - /*LANG*/"Stride length": { - value: myprofile.strideLength, - min:0.00, - step:0.01, - format: v => v ? require("locale").distance(v, 2) : '-', - onchange: v => { - myprofile.strideLength=v; - writeProfile(); + "< Back" : () => { + if (date != new Date(myprofile.birthday)) { + if (date > new Date()) { + E.showPrompt(/*LANG*/"Birthday must not be in future!", { + buttons : {"Ok":true}, + }).then(() => ageMenu()); + } else { + // Birthday changed + const age = (new Date()).getFullYear() - date.getFullYear(); + const newMaxHRM = 220-age; + E.showPrompt(/*LANG*/`Set HR max to ${newMaxHRM} calculated from age?`).then(function(v) { + myprofile.birthday = date.getFullYear() + "-" + (date.getMonth() + 1).toString().padStart(2, '0') + "-" + date.getDate().toString().padStart(2, '0'); + if (v) { + myprofile.maxHrm = newMaxHRM; + writeProfile(); + } + mainMenu(); + }); + } + } else { + mainMenu(); + } }, - }, - }); + + /*LANG*/"Day": { + value: date ? date.getDate() : null, + min: 1, + max: 31, + wrap: true, + onchange: v => { + date.setDate(v); + } + }, + /*LANG*/"Month": { + value: date ? date.getMonth() + 1 : null, + format: v => require("date_utils").month(v), + onchange: v => { + date.setMonth((v+11)%12); + } + }, + /*LANG*/"Year": { + value: date ? date.getFullYear() : null, + min: 1900, + max: (new Date()).getFullYear(), + onchange: v => { + date.setFullYear(v); + } + }, + }); + }; + + const mainMenu = () => { + E.showMenu({ + "" : { "title" : /*LANG*/"My Profile" }, + + "< Back" : () => back(), + + /*LANG*/"Birthday" : () => ageMenu(), + + /*LANG*/'HR max': { + format: v => /*LANG*/`${v} BPM`, + value: myprofile.maxHrm, + min: 30, max: 220, + onchange: v => { + myprofile.maxHrm = v; + writeProfile(); + } + }, + + /*LANG*/'HR min': { + format: v => /*LANG*/`${v} BPM`, + value: myprofile.minHrm, + min: 30, max: 220, + onchange: v => { + myprofile.minHrm = v; + writeProfile(); + } + }, + + /*LANG*/"Stride length": { + value: myprofile.strideLength, + min:0.00, + step:0.01, + format: v => v ? require("locale").distance(v, 2) : '-', + onchange: v => { + myprofile.strideLength=v; + writeProfile(); + }, + }, + }); + }; + + mainMenu(); })