BangleApps/apps/drinkcounter/app.js

292 lines
8.6 KiB
JavaScript
Raw Permalink Normal View History

2022-07-07 16:45:16 +00:00
g.reset().clear();
Bangle.loadWidgets();
Bangle.drawWidgets();
2022-07-09 15:20:14 +00:00
require("Font8x16").add(Graphics);
2022-07-07 14:40:53 +00:00
2022-07-12 10:48:30 +00:00
const BANGLEJS2 = process.env.HWVERSION == 2;
2022-07-09 15:20:14 +00:00
const SETTINGSFILE = "drinkcounter.json";
2022-07-07 14:40:53 +00:00
setting = require("Storage").readJSON("setting.json",1);
E.setTimeZone(setting.timezone); // timezone = 1 for MEZ, = 2 for MESZ
var _12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false;
var ampm = "AM";
let drag;
2022-07-07 11:08:59 +00:00
2022-07-09 17:23:22 +00:00
var icoBeer = require("heatshrink").decompress(atob("lEoxH+AG2BAAoecEpAoWC4fXAAIGGAAowTDxAmJE4YGGE5QeJE5QHHE7owJE0pQKE7pQJE86fnE5QJSE5YUHBAIJQYxIpFAAvGBBAJIExYoGDgIACBBApFExonCDYoAOFSAnbFJYnE6vVDYYFHAwakQE4YaFAoQGJEIYoME7QoEE7ogFE/4neTBgntY84n/E+7HUE64mDE8IAFEw4nDTBifIE9gmId7gALE5IGCAooGDE6gASE8yaME7gmOFIgAREqIAhA=="));
var icoCocktail = require("heatshrink").decompress(atob("lEoxH+AH4AJtgABEkgmiEiXGAAIllAAiXeEAPXAQQDCFBYmTEgYqDFBZNWAIZRME6IfBEAYuEE5J2UwIAaJ5QncFBB3DB4YGCACQnKTQgoXE5bIEE6qfKPAZRFA4MUABgmNPAonBCgQnPExgpFPIgoNEyBSF4wGBFBgmSABCjJTZwoXEzwoHE0AoFE0QnCFAQmhKAonjFAInCE0Qn/E/4n/E/4n/wInDFEAhBEwQoDFLYdCEwooEFTAjHAAwoYIYgAMPDglT"));
var icoShot = require("heatshrink").decompress(atob("lEoxH+AH4A/AH4A/AH4AqwIAgE+HXADRPME8ZQM5AnSZBQkGAAYngEYonfJA5QQE8zGJFAYfKFBwmKE4iYIE7rpIeYgAJE5woEEpQKHTxhQIIpJaHJxgn/E8zGQZBAnQYxxQRFQYnlFgon5FCYmDE6LjHZRQmPE5AAOE/4njFCTGQKCwmRKAgATE54oWEyAqTDZY"));
2022-07-10 09:14:03 +00:00
var icoReset = require("heatshrink").decompress(atob("j0egILI8ACBh4DC/4DBh4DCv8f4ED8EPwEPEQMAvEAnkB4EA+AKBCAM8DYOA8EB//HwED/wXBg/wnAOC+EAjkDDoMgg+AJoRFCEIIAB/kHgEB/l8FwP/DYIDBC4MD/ASBgYeCAAw"));
2022-07-07 14:40:53 +00:00
var drawTimeout;
var activeDrink = 0;
var drinks = [0,0,0];
2022-07-07 16:45:16 +00:00
const maxDrinks = 2; // 3 drinks
2022-07-07 17:31:30 +00:00
var firstDrinkTime = null;
2022-07-09 17:23:22 +00:00
var firstDrinkTimeTime = null;
2022-07-07 17:31:30 +00:00
2024-03-04 20:34:50 +00:00
//var confBeerSize;
2022-07-09 15:20:14 +00:00
var confSex;
var confWeight;
var confWeightUnit;
2022-07-07 17:31:30 +00:00
2022-07-09 17:23:22 +00:00
2022-07-09 17:55:54 +00:00
// Load Status ===============
2022-07-09 17:23:22 +00:00
var drinkStatus = require("Storage").open("drinkcounter.status.json", "r");
var test = drinkStatus.read(drinkStatus.getLength());
if(test!== undefined) {
drinkStatus = JSON.parse(test);
2022-07-10 09:14:03 +00:00
//console.log("read status: " + test);
2022-07-09 17:55:54 +00:00
for (let i = 0; i <= maxDrinks; i++) {
drinks[i] = drinkStatus.drinks[i];
}
firstDrinkTime = Date.parse(drinkStatus.firstDrinkTime);
2022-07-10 09:14:03 +00:00
//console.log("read firstDrinkTime: " + firstDrinkTime);
2022-07-09 17:55:54 +00:00
if (firstDrinkTime) firstDrinkTimeTime = require("locale").time(new Date(firstDrinkTime), 1);
2022-07-10 09:14:03 +00:00
//console.log("read firstDrinkTimeTime: " + firstDrinkTimeTime);
2022-07-09 17:55:54 +00:00
} else {
2022-07-09 17:23:22 +00:00
drinkStatus = {
drinks: [0,0,0]
};
2022-07-10 09:14:03 +00:00
//console.log("no status file - applying default");
2022-07-09 17:23:22 +00:00
}
2022-07-09 17:55:54 +00:00
// Load Status ===============
2022-07-09 17:23:22 +00:00
2022-07-09 15:20:14 +00:00
var drinksAlcohol = [12,16,5.6]; // in gramm
2022-07-08 05:41:11 +00:00
// Beer: 0.3L 12g - 0.5L 20g
// Radler: 0.3L 6g - 0.5L 10g
// Wine: 0.2L 16g
// Jäger Shot: 0.02L 5.6g
2022-07-09 15:20:14 +00:00
// sex: Women 60 - Men 70 (Percent)
2022-07-08 05:41:11 +00:00
// Formula: Alcohol in g /(Body weight in kg x sex) (0,15 x Hours) = bac per mille
// Example: 5 Beer (0.3L=12g), 80KG, Male (70%), 5 hours
// (5 * 12) / (80 / 100 * 70) - (0.15 * 5)
function drawBac(){
2022-07-07 17:31:30 +00:00
if (firstDrinkTime) {
2022-07-09 15:20:14 +00:00
var sum_drinks = (drinks[0] * drinksAlcohol[0]) + (drinks[1] * drinksAlcohol[1]) + (drinks[2] * drinksAlcohol[2]);
if (confSex == "male") {
sex = 70;
} else {
sex = 60;
}
var weight = confWeight;
2022-07-07 17:31:30 +00:00
2022-07-09 15:20:14 +00:00
if (confWeightUnit == "US Pounds") {
weight = weight * 0.45359237;
}
2022-07-07 17:31:30 +00:00
var currentTime = new Date();
2022-07-09 15:20:14 +00:00
var time_diff = Math.floor(((currentTime - firstDrinkTime) % 86400000) / 3600000); // in hours!
2022-07-10 09:14:03 +00:00
//console.log("currentTime: " + currentTime)
//console.log("firstDrinkTime: " + firstDrinkTime)
2022-07-09 17:55:54 +00:00
2022-07-10 09:14:03 +00:00
//console.log("timediff: " + time_diff);
2022-07-09 17:23:22 +00:00
ebac = Math.round( ((sum_drinks) / (weight / 100 * sex) - (0.15 * time_diff) ) * 100) / 100;
2022-07-08 05:41:11 +00:00
2022-07-10 09:14:03 +00:00
//console.log("BAC: " + ebac + " weight: " + confWeight + " weightInKilo: " + weight + " Unit: " + confWeightUnit);
//console.log("sum_drinks: " + sum_drinks);
2022-07-07 17:31:30 +00:00
g.clearRect(0,34 + 20 + 8,176,34 + 20 + 20 + 8); //Clear
2022-07-09 15:20:14 +00:00
g.setFontAlign(0,0).setFont("8x16").setColor(g.theme.fg).drawString("BAC: " + ebac, 90, 74);
2022-07-07 17:31:30 +00:00
}
}
2022-07-09 15:20:14 +00:00
// Load settings
function loadMySettings() {
// Helper function default setting
function def (value, def) {return value !== undefined ? value : def;}
var settings = require('Storage').readJSON(SETTINGSFILE, true) || {};
2024-03-04 20:34:50 +00:00
//confBeerSize = def(settings.beerSize, "0.3L");
2022-07-09 15:20:14 +00:00
confSex = def(settings.sex, "male");
confWeight = def(settings.weight, 80);
confWeightUnit = def(settings.weightUnit, "Kilo");
//console.log("Read config - weight: " + confWeight);
}
2022-07-07 11:08:59 +00:00
2022-07-07 14:40:53 +00:00
function updateTime(){
2022-07-09 15:20:14 +00:00
var d = require("locale").time(new Date(), 1);
//console.log(d);
var time = d.split(":");
2022-07-07 14:40:53 +00:00
var hours = time[0];
var minutes = time[1];
if (_12hour){
//do 12 hour stuff
if (hours > 12) {
ampm = "PM";
hours = hours - 12;
if (hours < 10) hours = doublenum(hours);
} else {
ampm = "AM";
}
} else {
2022-07-08 05:41:11 +00:00
ampm = "";
2022-07-07 14:40:53 +00:00
}
2022-07-07 16:45:16 +00:00
g.setBgColor(g.theme.bg).clearRect(0,24,176,44); //Clear
2022-07-07 14:40:53 +00:00
g.setFontAlign(0,0); // center font
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
2022-07-09 15:20:14 +00:00
g.setFont("8x16").drawString("Time: " + hours + ":" + minutes + " " + ampm,90,34);
2022-07-07 14:40:53 +00:00
queueDrawTime();
2022-07-07 11:08:59 +00:00
}
2022-07-07 14:40:53 +00:00
function queueDrawTime() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
updateTime();
}, 20000 - (Date.now() % 20000));
}
2022-07-09 17:23:22 +00:00
2022-07-07 14:40:53 +00:00
function updateDrinks(){
2022-07-07 16:23:28 +00:00
g.setBgColor(g.theme.bg).clearRect(0,145,176,176); //Clear
2022-07-07 16:45:16 +00:00
for (let i = 0; i <= maxDrinks; i++) {
if (i == activeDrink) {
2022-07-07 17:31:30 +00:00
g.setColor(g.theme.fg).fillRect((40 * (i + 1)) - 40 ,145,(40 * (i + 1)),176);
2022-07-07 16:45:16 +00:00
g.setColor(g.theme.bg);
} else {
g.setColor(g.theme.fg);
}
g.setFont("Vector",20).drawString(drinks[i], (40 * (i + 1)) - 20, 160);
2022-07-09 17:23:22 +00:00
g.setColor(g.theme.fg);
drinkStatus.drinks[i] = drinks[i];
2022-07-07 16:45:16 +00:00
}
2022-07-09 17:23:22 +00:00
2022-07-10 09:14:03 +00:00
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
2022-07-12 10:48:30 +00:00
if (BANGLEJS2) {
g.drawImage(icoReset,145,145);
}
2022-07-09 17:23:22 +00:00
2022-07-09 17:55:54 +00:00
drinkStatus.firstDrinkTime = firstDrinkTime;
2022-07-09 17:23:22 +00:00
settings_file = require("Storage").open("drinkcounter.status.json", "w");
settings_file.write(JSON.stringify(drinkStatus));
2022-07-08 05:41:11 +00:00
drawBac();
2022-07-07 14:40:53 +00:00
}
2022-07-09 17:23:22 +00:00
function updateFirstDrinkTime(){
if (firstDrinkTime){
g.setFont("8x16");
g.setFontAlign(0,0).drawString("1st drink @ " + firstDrinkTimeTime, 90, 34 + 20 );
}
}
2022-07-07 14:40:53 +00:00
function addDrink(){
2022-07-07 17:31:30 +00:00
if (!firstDrinkTime){
2022-07-09 17:55:54 +00:00
firstDrinkTime = new Date();
2022-07-09 17:23:22 +00:00
firstDrinkTimeTime = require("locale").time(new Date(), 1);
2022-07-10 09:14:03 +00:00
//console.log("init drinking! " + firstDrinkTime);
2022-07-09 17:23:22 +00:00
}
2022-07-07 14:40:53 +00:00
drinks[activeDrink] = drinks[activeDrink] + 1;
2022-07-09 17:23:22 +00:00
updateFirstDrinkTime();
2022-07-07 14:40:53 +00:00
updateDrinks();
}
function removeDrink(){
if (drinks[activeDrink] > 0) drinks[activeDrink] = drinks[activeDrink] - 1;
updateDrinks();
2022-07-12 10:48:30 +00:00
if ((!BANGLEJS2) && (drinks[0] == 0) && (drinks[1] == 0) && (drinks[2] == 0)) {
resetDrinksFn()
}
2022-07-07 11:08:59 +00:00
}
2022-07-07 16:45:16 +00:00
function previousDrink(){
if (activeDrink > 0) activeDrink = activeDrink - 1;
updateDrinks();
}
function nextDrink(){
if (activeDrink < maxDrinks) activeDrink = activeDrink + 1;
updateDrinks();
}
2022-07-07 14:40:53 +00:00
2022-07-09 17:23:22 +00:00
function showDrinks() {
g.setBgColor(g.theme.bg);
g.drawImage(icoBeer,0,100);
g.drawImage(icoCocktail,40,100);
g.drawImage(icoShot,80,100);
}
2022-07-07 14:40:53 +00:00
2022-07-12 10:48:30 +00:00
function resetDrinksFn() {
g.clearRect(0,34,176,176); //Clear
resetDrinks = E.showPrompt("Reset drinks?", {
title: "Confirm",
buttons: { Yes: true, No: false },
});
resetDrinks.then((confirm) => {
if (confirm) {
for (let i = 0; i <= maxDrinks; i++) {
drinks[i] = 0;
}
//console.log("reset to default");
}
//console.log("reset " + confirm);
firstDrinkTime = null;
showDrinks();
updateDrinks();
updateTime();
updateFirstDrinkTime();
});
}
2022-07-07 14:40:53 +00:00
function initDragEvents() {
2022-07-12 11:51:20 +00:00
if (BANGLEJS2) {
Bangle.on("drag", e => {
if (!drag) { // start dragging
drag = {x: e.x, y: e.y};
} else if (!e.b) { // released
const dx = e.x-drag.x, dy = e.y-drag.y;
drag = null;
if (Math.abs(dx)>Math.abs(dy)+10) {
// horizontal
if (dx < dy) {
//console.log("left " + dx + " " + dy);
previousDrink();
2022-07-12 10:48:30 +00:00
} else {
2022-07-12 11:51:20 +00:00
//console.log("right " + dx + " " + dy);
nextDrink();
}
} else if (Math.abs(dy)>Math.abs(dx)+10) {
// vertical
if (dx < dy) {
//console.log("down " + dx + " " + dy);
removeDrink();
} else {
//console.log("up " + dx + " " + dy);
addDrink();
}
} else {
//console.log("tap " + e.x + " " + e.y);
if (e.x > 145 && e.y > 145) {
resetDrinksFn();
2022-07-09 17:23:22 +00:00
}
2022-07-12 10:48:30 +00:00
}
2022-07-09 17:23:22 +00:00
}
2022-07-12 11:51:20 +00:00
});
} else {
setWatch(addDrink, BTN1, { repeat: true, debounce:50 });
setWatch(removeDrink, BTN3, { repeat: true, debounce:50 });
setWatch(previousDrink, BTN4, { repeat: true, debounce:50 });
setWatch(nextDrink, BTN5, { repeat: true, debounce:50 });
}
2022-07-07 14:40:53 +00:00
}
2022-07-12 10:48:30 +00:00
loadMySettings();
2022-07-09 17:23:22 +00:00
showDrinks();
2022-07-07 14:40:53 +00:00
2022-07-07 11:08:59 +00:00
2022-07-07 14:40:53 +00:00
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
updateTime();
queueDrawTime();
initDragEvents();
2022-07-07 16:45:16 +00:00
updateDrinks();
2022-07-09 17:55:54 +00:00
updateFirstDrinkTime();
2022-07-07 14:40:53 +00:00