|
2 | 2 | // define settings filename |
3 | 3 | var filename = "sleeplog.json"; |
4 | 4 | // define logging prompt display status |
5 | | - var movementThresholdsPrompt = true; |
6 | | - var hrmThresholdsPrompt = true; |
| 5 | + var thresholdsPrompt = true; |
7 | 6 |
|
8 | 7 | // define default vaules |
9 | 8 | var defaults = { |
|
13 | 12 | maxAwake: 36E5, // [ms] maximal awake time to count for consecutive sleep |
14 | 13 | minConsec: 18E5, // [ms] minimal time to count for consecutive sleep |
15 | 14 | deepTh: 150, // threshold for deep sleep |
16 | | - lightTh: 300, |
17 | | - hrmLightTh: 74, |
18 | | - hrmDeepTh:60,// threshold for light sleep |
| 15 | + lightTh: 300, // threshold for light sleep |
19 | 16 | wearTemp: 19.5, // temperature threshold to count as worn |
20 | 17 | // app settings |
21 | 18 | breakToD: 12, // [h] time of day when to start/end graphs |
22 | 19 | appTimeout: 0 // lock and backlight timeouts for the app |
23 | 20 | }; |
24 | 21 |
|
25 | 22 | // assign loaded settings to default values |
26 | | - var settings = Object.assign({},defaults, require("Storage").readJSON(filename, true)); |
| 23 | + var settings = Object.assign(defaults, require("Storage").readJSON(filename, true) || {}); |
27 | 24 |
|
28 | 25 | // write change to storage |
29 | 26 | function writeSetting() { |
|
289 | 286 | }).then(showMain); |
290 | 287 | } |
291 | 288 | } |
292 | | - |
293 | | - |
| 289 | + |
294 | 290 | // show menu to change thresholds |
295 | | - function showHRMThresholds() { |
| 291 | + function showThresholds() { |
296 | 292 | // setup logging menu |
297 | 293 | //var menu; |
298 | 294 | var thresholdsMenu = { |
299 | 295 | "": { |
300 | | - title: /*LANG*/"HRM Thresholds", |
| 296 | + title: /*LANG*/"Thresholds", |
301 | 297 | back: () => showMain(2) |
302 | 298 | }, |
303 | | - /*LANG*/"Deep Sleep": { |
304 | | - value: settings.hrmDeepTh, |
305 | | - step: 2, |
306 | | - min: 30, |
307 | | - max: 100, |
| 299 | + /*LANG*/"Max Awake": { |
| 300 | + value: settings.maxAwake / 6E4, |
| 301 | + step: 10, |
| 302 | + min: 10, |
| 303 | + max: 120, |
308 | 304 | wrap: true, |
309 | 305 | noList: true, |
| 306 | + format: v => v + /*LANG*/"min", |
310 | 307 | onchange: v => { |
311 | | - settings.hrmDeepTh = v; |
| 308 | + settings.maxAwake = v * 6E4; |
312 | 309 | writeSetting(); |
313 | 310 | } |
314 | 311 | }, |
315 | | - /*LANG*/"Light Sleep": { |
316 | | - value: settings.hrmLightTh, |
317 | | - step: 2, |
318 | | - min: 30, |
319 | | - max: 100, |
| 312 | + /*LANG*/"Min Consecutive": { |
| 313 | + value: settings.minConsec / 6E4, |
| 314 | + step: 10, |
| 315 | + min: 10, |
| 316 | + max: 120, |
320 | 317 | wrap: true, |
321 | 318 | noList: true, |
| 319 | + format: v => v + /*LANG*/"min", |
322 | 320 | onchange: v => { |
323 | | - settings.hrmLightTh = v; |
| 321 | + settings.minConsec = v * 6E4; |
324 | 322 | writeSetting(); |
325 | 323 | } |
326 | 324 | }, |
327 | | - /*LANG*/"Reset to Default": () => { |
328 | | - settings.hrmDeepTh = defaults.hrmDeepTh; |
329 | | - settings.hrmLightTh = defaults.hrmLightTh; |
330 | | - writeSetting(); |
331 | | - showHRMThresholds(); |
332 | | - } |
333 | | - }; |
334 | | - if (hrmThresholdsPrompt) { |
335 | | - hrmThresholdsPrompt = false; |
336 | | - E.showPrompt("SleepLog only uses HRM if HRM is enabled in Health settings.", { |
337 | | - title: /*LANG*/"HRM Thresholds", |
338 | | - buttons: { |
339 | | - /*LANG*/"Ok": 0 |
340 | | - } |
341 | | - }).then(() => /*menu =*/ E.showMenu(thresholdsMenu)); |
342 | | - } else { |
343 | | - /*menu =*/ E.showMenu(thresholdsMenu); |
344 | | - } |
345 | | - } |
346 | | - |
347 | | - // show menu to change thresholds |
348 | | - function showMovementThresholds() { |
349 | | - // setup logging menu |
350 | | - //var menu; |
351 | | - var thresholdsMenu = { |
352 | | - "": { |
353 | | - title: /*LANG*/"Movement Thresholds", |
354 | | - back: () => showMain(2) |
355 | | - }, |
356 | | - |
357 | 325 | /*LANG*/"Deep Sleep": { |
358 | 326 | value: settings.deepTh, |
359 | 327 | step: 10, |
|
378 | 346 | writeSetting(); |
379 | 347 | } |
380 | 348 | }, |
381 | | - |
| 349 | + /*LANG*/"Wear Temperature": { |
| 350 | + value: settings.wearTemp, |
| 351 | + step: 0.5, |
| 352 | + min: 19.5, |
| 353 | + max: 40, |
| 354 | + wrap: true, |
| 355 | + noList: true, |
| 356 | + format: v => v === 19.5 ? "Disabled" : v + "°C", |
| 357 | + onchange: v => { |
| 358 | + settings.wearTemp = v; |
| 359 | + writeSetting(); |
| 360 | + } |
| 361 | + }, |
382 | 362 | /*LANG*/"Reset to Default": () => { |
383 | 363 | settings.maxAwake = defaults.maxAwake; |
384 | 364 | settings.minConsec = defaults.minConsec; |
385 | 365 | settings.deepTh = defaults.deepTh; |
386 | 366 | settings.lightTh = defaults.lightTh; |
387 | 367 | writeSetting(); |
388 | | - showMovementThresholds(); |
| 368 | + showThresholds(); |
389 | 369 | } |
390 | | - } |
391 | | - if (movementThresholdsPrompt) { |
392 | | - movementThresholdsPrompt = false; |
| 370 | + }; |
| 371 | + |
| 372 | + // display info/warning prompt or menu |
| 373 | + if (thresholdsPrompt) { |
| 374 | + thresholdsPrompt = false; |
393 | 375 | E.showPrompt("Changes take effect from now on, not retrospective", { |
394 | | - title: /*LANG*/"Movement Thresholds", |
| 376 | + title: /*LANG*/"Thresholds", |
395 | 377 | buttons: { |
396 | 378 | /*LANG*/"Ok": 0 |
397 | 379 | } |
398 | 380 | }).then(() => /*menu =*/ E.showMenu(thresholdsMenu)); |
399 | 381 | } else { |
400 | 382 | /*menu =*/ E.showMenu(thresholdsMenu); |
401 | 383 | } |
402 | | - }; |
403 | | - |
404 | | - function showOtherSettings() { |
405 | | - // setup logging menu |
406 | | - //var menu; |
407 | | - var otherSettingsMenu = { |
408 | | - "": { |
409 | | - title: /*LANG*/"Other Settings", |
410 | | - back: () => showMain(2) |
411 | | - }, |
412 | | - /*LANG*/"Max Awake": { |
413 | | - value: settings.maxAwake / 6E4, |
414 | | - step: 10, |
415 | | - min: 10, |
416 | | - max: 120, |
417 | | - wrap: true, |
418 | | - noList: true, |
419 | | - format: v => v + /*LANG*/"min", |
420 | | - onchange: v => { |
421 | | - settings.maxAwake = v * 6E4; |
422 | | - writeSetting(); |
423 | | - } |
424 | | - }, |
425 | | - /*LANG*/"Min Consecutive": { |
426 | | - value: settings.minConsec / 6E4, |
427 | | - step: 10, |
428 | | - min: 10, |
429 | | - max: 120, |
430 | | - wrap: true, |
431 | | - noList: true, |
432 | | - format: v => v + /*LANG*/"min", |
433 | | - onchange: v => { |
434 | | - settings.minConsec = v * 6E4; |
435 | | - writeSetting(); |
436 | | - } |
437 | | - }, |
438 | | - /*LANG*/"Wear Temp": { |
439 | | - value: settings.wearTemp, |
440 | | - step: 0.5, |
441 | | - min: 19.5, |
442 | | - max: 40, |
443 | | - wrap: true, |
444 | | - noList: true, |
445 | | - format: v => v === 19.5 ? "Disabled" : require("locale").temp(v), |
446 | | - onchange: v => { |
447 | | - settings.wearTemp = v; |
448 | | - writeSetting(); |
449 | | - } |
450 | | - }, |
451 | | - /*LANG*/"Break ToD": { |
| 384 | + } |
| 385 | + |
| 386 | + // show main menu |
| 387 | + function showMain(selected) { |
| 388 | + // set debug image |
| 389 | + var debugImg = !global.sleeplog ? |
| 390 | + "FBSBAOAAfwAP+AH3wD4+B8Hw+A+fAH/gA/wAH4AB+AA/wAf+APnwHw+D4Hx8A++AH/AA/gAH" : // X |
| 391 | + typeof global.sleeplog.debug === "object" ? |
| 392 | + "FBSBAB/4AQDAF+4BfvAX74F+CBf+gX/oFJKBf+gUkoF/6BSSgX/oFJ6Bf+gX/oF/6BAAgf/4" : // file |
| 393 | + global.sleeplog.debug ? |
| 394 | + "FBSBAP//+f/V///4AAGAABkAAZgAGcABjgAYcAGDgBhwAY4AGcABmH+ZB/mAABgAAYAAH///" : // console |
| 395 | + 0; // off |
| 396 | + debugImg = debugImg ? "\0" + atob(debugImg) : false; |
| 397 | + // set menu |
| 398 | + var mainMenu = { |
| 399 | + "": { |
| 400 | + title: "Sleep Log", |
| 401 | + back: back, |
| 402 | + selected: selected |
| 403 | + }, |
| 404 | + /*LANG*/"Thresholds": () => showThresholds(), |
| 405 | + /*LANG*/"Break ToD": { |
452 | 406 | value: settings.breakToD, |
453 | 407 | step: 1, |
454 | 408 | min: 0, |
|
474 | 428 | writeSetting(); |
475 | 429 | } |
476 | 430 | }, |
477 | | - /*LANG*/"Reset to Default": () => { |
478 | | - settings.maxAwake = defaults.maxAwake; |
479 | | - settings.minConsec = defaults.minConsec; |
480 | | - settings.breakToD = defaults.breakToD; |
481 | | - settings.appTimeout = defaults.appTimeout; |
482 | | - |
483 | | - writeSetting(); |
484 | | - showOtherSettings(); |
485 | | - } |
486 | | - }; |
487 | | - E.showMenu(otherSettingsMenu); |
488 | | - } |
489 | | - |
490 | | - |
491 | | - |
492 | | - // show main menu |
493 | | - function showMain(selected) { |
494 | | - // set debug image |
495 | | - var debugImg = !global.sleeplog ? |
496 | | - "FBSBAOAAfwAP+AH3wD4+B8Hw+A+fAH/gA/wAH4AB+AA/wAf+APnwHw+D4Hx8A++AH/AA/gAH" : // X |
497 | | - typeof global.sleeplog.debug === "object" ? |
498 | | - "FBSBAB/4AQDAF+4BfvAX74F+CBf+gX/oFJKBf+gUkoF/6BSSgX/oFJ6Bf+gX/oF/6BAAgf/4" : // file |
499 | | - global.sleeplog.debug ? |
500 | | - "FBSBAP//+f/V///4AAGAABkAAZgAGcABjgAYcAGDgBhwAY4AGcABmH+ZB/mAABgAAYAAH///" : // console |
501 | | - 0; // off |
502 | | - debugImg = debugImg ? "\0" + atob(debugImg) : false; |
503 | | - // set menu |
504 | | - var mainMenu = { |
505 | | - "": { |
506 | | - title: "Sleep Log", |
507 | | - back: back, |
508 | | - selected: selected |
509 | | - }, |
510 | | - /*LANG*/"Movement Thresholds": () => showMovementThresholds(), |
511 | | - /*LANG*/"HRM Thresholds": () => showHRMThresholds(), |
512 | | - /*LANG*/"Other Settings": () => showOtherSettings(), |
513 | | - |
514 | 431 | /*LANG*/"Enabled": { |
515 | 432 | value: settings.enabled, |
516 | 433 | onchange: v => { |
|
0 commit comments