diff --git a/apps/drinkcounter/ChangeLog b/apps/drinkcounter/ChangeLog index 596ed8040..51cade4c5 100644 --- a/apps/drinkcounter/ChangeLog +++ b/apps/drinkcounter/ChangeLog @@ -1 +1,2 @@ -0.10: Initial release - still work in progress \ No newline at end of file +0.10: Initial release - still work in progress +0.15: Added settings and calculations \ No newline at end of file diff --git a/apps/drinkcounter/README.md b/apps/drinkcounter/README.md index ea0c6f3c9..f1700531b 100644 --- a/apps/drinkcounter/README.md +++ b/apps/drinkcounter/README.md @@ -1,14 +1,12 @@ # Drink Counter -Development still in progress. Still need to make config page etc. This is only a demo for now that calculates a 0.33L Beer for a 80kg male for the BAC! -Counts drinks you had for science. Calculates BAC. +Development still in progress. Counts drinks you had for science. Calculates BAC. ## Usage Swipe left/right to select drink. Swipe up/down to add/remove drinks. - ## Creator Hank - contact at http://forum.espruino.com diff --git a/apps/drinkcounter/app.js b/apps/drinkcounter/app.js index 317fc906e..534d78ccc 100644 --- a/apps/drinkcounter/app.js +++ b/apps/drinkcounter/app.js @@ -1,7 +1,9 @@ g.reset().clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); +require("Font8x16").add(Graphics); +const SETTINGSFILE = "drinkcounter.json"; 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; @@ -17,97 +19,69 @@ var drinks = [0,0,0]; const maxDrinks = 2; // 3 drinks var firstDrinkTime = null; +var confBeerSize; +var confSex; +var confWeight; +var confWeightUnit; - -//static float get_ebac() -//{ -// float sum_drinks = getSumDrinks(drinks); -// -// int day1 = current_time.tm_yday; -// int hour1 = current_time.tm_hour; -// int min1 = current_time.tm_min; -// long int combine1 = min1+hour1*60+day1*24*60; -// -// int day2 = settings.first_drink_time.tm_yday; -// int hour2 = settings.first_drink_time.tm_hour; -// int min2 = settings.first_drink_time.tm_min; -// long int combine2 = min2+hour2*60+day2*24*60; -// -// unsigned int time_diff = abs(combine1 - combine2); -// -// if(settings.beer_size==1) -// sum_drinks+=*(drinks[0].num_drinks)/0.33*0.25-*(drinks[0].num_drinks); -// if(settings.beer_size==2) -// sum_drinks+=*(drinks[0].num_drinks)/0.33*0.5-*(drinks[0].num_drinks); -// if(settings.beer_size==3) -// sum_drinks+=*(drinks[0].num_drinks)*3.0-*(drinks[0].num_drinks); -// -// float bw = settings.sex==0 ? 0.58f:0.49f; -// float scale_factor = settings.unit==0? 1.0f:0.453592f; // 0 = kg, 1 = pounds -// float multiplication = settings.output==0? 10.f:1.f; //0 = %o, 1 = % -// return( ((0.806f * sum_drinks * 1.2f)/(bw*(float)settings.weight*scale_factor) - (0.017f * (time_diff/60.f)))*multiplication); -//} - -//function drawEbac(){ -// if (firstDrinkTime) { -// var sum_drinks = drinks[0] + drinks[1] + drinks[2]; -// -// // TODO: Settings -// var bw = 0.58; //bw = settings.sex==0 ? 0.58f:0.49f; -// var weight = 80 * 0.453592; //* scale factor: 1.0f:0.453592f; // 0 = kg, 1 = pounds -// var multiplication = 10; //10.f:1.f; //0 = %o, 1 = % -// -// var currentTime = new Date(); -// var time_diff = Math.floor(((currentTime - firstDrinkTime) % 86400000) / 3600000); -// -// console.log("timediff: " + time_diff); -// -// ebac = Math.round(((0.806 * sum_drinks * 1.2)/(bw*weight) - (0.017 * (time_diff/60)))*multiplication * 100) / 100 -// console.log("BAC: " + ebac); -// g.clearRect(0,34 + 20 + 8,176,34 + 20 + 20 + 8); //Clear -// g.setFontAlign(0,0).setFont("Vector",15).setColor(g.theme.fg).drawString("BAC: " + ebac, 90, 74); -// } -//} - - +var drinksAlcohol = [12,16,5.6]; // in gramm // 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 + // sex: Women 60 - Men 70 (Percent) - - // 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(){ if (firstDrinkTime) { - var sum_drinks = drinks[0] + drinks[1] + drinks[2]; + var sum_drinks = (drinks[0] * drinksAlcohol[0]) + (drinks[1] * drinksAlcohol[1]) + (drinks[2] * drinksAlcohol[2]); - // TODO: Settings - var sex = 70; // TODO - var weight = 80; // kg, TODO: pounds - var alcoholInG = 12; // TODO + if (confSex == "male") { + sex = 70; + } else { + sex = 60; + } + var weight = confWeight; + + if (confWeightUnit == "US Pounds") { + weight = weight * 0.45359237; + } var currentTime = new Date(); - var time_diff = Math.floor(((currentTime - firstDrinkTime) % 86400000) / 3600000); + var time_diff = Math.floor(((currentTime - firstDrinkTime) % 86400000) / 3600000); // in hours! - console.log("timediff: " + time_diff); - ebac = Math.round( ((sum_drinks * alcoholInG) / (weight / 100 * sex) - (0.15 * time_diff) ) * 100) / 100 + //console.log("timediff: " + time_diff); + ebac = Math.round( ((sum_drinks) / (weight / 100 * sex) - (0.15 * time_diff) ) * 100) / 100 - console.log("BAC: " + ebac); + //console.log("BAC: " + ebac + " weight: " + confWeight + " weightInKilo: " + weight + " Unit: " + confWeightUnit); g.clearRect(0,34 + 20 + 8,176,34 + 20 + 20 + 8); //Clear - g.setFontAlign(0,0).setFont("Vector",15).setColor(g.theme.fg).drawString("BAC: " + ebac, 90, 74); + g.setFontAlign(0,0).setFont("8x16").setColor(g.theme.fg).drawString("BAC: " + ebac, 90, 74); } } +// Load settings +function loadMySettings() { + // Helper function default setting + function def (value, def) {return value !== undefined ? value : def;} + + var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; + confBeerSize = def(settings.beerSize, "0.3L"); + confSex = def(settings.sex, "male"); + confWeight = def(settings.weight, 80); + confWeightUnit = def(settings.weightUnit, "Kilo"); + //console.log("Read config - weight: " + confWeight); +} + function updateTime(){ - var d = new Date(); - var da = d.toString().split(" "); - var time = da[4].split(":"); + var d = require("locale").time(new Date(), 1); + + //console.log(d); + var time = d.split(":"); var hours = time[0]; var minutes = time[1]; if (_12hour){ @@ -125,7 +99,7 @@ function updateTime(){ g.setBgColor(g.theme.bg).clearRect(0,24,176,44); //Clear g.setFontAlign(0,0); // center font g.setBgColor(g.theme.bg).setColor(g.theme.fg); - g.setFont("Vector",14).drawString("Time: " + hours + ":" + minutes + " " + ampm,90,34); + g.setFont("8x16").drawString("Time: " + hours + ":" + minutes + " " + ampm,90,34); queueDrawTime(); } @@ -147,7 +121,7 @@ function updateDrinks(){ g.setColor(g.theme.fg); } g.setFont("Vector",20).drawString(drinks[i], (40 * (i + 1)) - 20, 160); - console.log(drinks[i] + " drinks of drink #" + i + " - Active: " + activeDrink); + //console.log(drinks[i] + " drinks of drink #" + i + " - Active: " + activeDrink); } drawBac(); } @@ -155,12 +129,11 @@ function updateDrinks(){ function addDrink(){ if (!firstDrinkTime){ firstDrinkTime = new Date(); - var dafirstDrinkTime = firstDrinkTime.toString().split(" "); - var firstDrinkTimeTime = dafirstDrinkTime[4].split(":"); - var firstDrinkTimeHours = firstDrinkTimeTime[0]; - var firstDrinkTimeMinutes = firstDrinkTimeTime[1]; - console.log("FIRST drink @ " + firstDrinkTime + " = " + firstDrinkTime.toString()); - g.setFontAlign(0,0).setFont("Vector",15).drawString("1st drink @ " + firstDrinkTimeHours + ":" + firstDrinkTimeMinutes, 90, 34 + 20 ); + var firstDrinkTimeTime = require("locale").time(new Date(), 1); + //console.log("FIRST drink @ " + firstDrinkTime + " = " + firstDrinkTime.toString()); + + g.setFont("8x16"); + g.setFontAlign(0,0).drawString("1st drink @ " + firstDrinkTimeTime, 90, 34 + 20 ); } drinks[activeDrink] = drinks[activeDrink] + 1; updateDrinks(); @@ -192,19 +165,19 @@ function initDragEvents() { if (Math.abs(dx)>Math.abs(dy)+10) { // horizontal if (dx < dy) { - console.log("left " + dx + " " + dy); + //console.log("left " + dx + " " + dy); previousDrink(); } else { - console.log("right " + dx + " " + dy); + //console.log("right " + dx + " " + dy); nextDrink(); } } else if (Math.abs(dy)>Math.abs(dx)+10) { // vertical if (dx < dy) { - console.log("down " + dx + " " + dy); + //console.log("down " + dx + " " + dy); removeDrink(); } else { - console.log("up " + dx + " " + dy); + //console.log("up " + dx + " " + dy); addDrink(); } } @@ -212,7 +185,7 @@ function initDragEvents() { }); } - +loadMySettings(); g.setBgColor(g.theme.bg); g.drawImage(icoBeer,0,100); g.drawImage(icoCocktail,40,100); diff --git a/apps/drinkcounter/app.png b/apps/drinkcounter/app.png deleted file mode 100644 index daf04c14a..000000000 Binary files a/apps/drinkcounter/app.png and /dev/null differ diff --git a/apps/drinkcounter/drinkcounter-icon.js b/apps/drinkcounter/drinkcounter-icon.js index 27bce0f0e..e7b95f9ef 100644 --- a/apps/drinkcounter/drinkcounter-icon.js +++ b/apps/drinkcounter/drinkcounter-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+64A/AH4A/AH4ABwIAFE0gtIGDwfGExg4bChAcKFIwwUIbYvnDjQucMCQvdDyIvvX94SKBKQvTCY4IBBKDuRDwwAE4wIIBJClWEgoACBBAxFaq4jGABwyYF7YxTF4nV6ojDAo4GDYjAvDEQoFCAxIpDGCgvaGAgvlFAov/F+y4MF+rvvF/4v/d9gvXFwYvpAAouPF4a4MX5Av0FyCPWF4QqRF5wGCAooGDF7gASF9y6UF7guWGIgARFrIA/AH4A/AEo")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AAWBAAomkFpAweD4fXAAIGGAAo4bExAuJF4YGGF6QmJF5QHHF8o4JF1pgSF7pgRF96/vF5QJSF6YcHBAIJQdyIxFAAvGBBAJIFyYwGEgIACBBAxFFyovCEYoAOGTAvbGKYvE6vVEYYFHAwbEYF4YiFAoQGJFIYwUF7QwEF8ooFF/4v2XBgv1d94v/F/7vsF64uDF9IAFFx4vDXBi/IF+guQR6wvCFSIvOAwQFFAwYvcACQvuXSgvcFywxEACItZAH4A/AH4AlA==")) diff --git a/apps/drinkcounter/drinkcounter.png b/apps/drinkcounter/drinkcounter.png new file mode 100644 index 000000000..91a0cd4ad Binary files /dev/null and b/apps/drinkcounter/drinkcounter.png differ diff --git a/apps/drinkcounter/metadata.json b/apps/drinkcounter/metadata.json index 5930c6b5a..d648d893f 100644 --- a/apps/drinkcounter/metadata.json +++ b/apps/drinkcounter/metadata.json @@ -2,16 +2,21 @@ "id": "drinkcounter", "name": "Drink Counter", "shortName": "Drink Counter", - "version": "0.10", + "version": "0.15", "description": "Counts drinks you had for science.", "allow_emulator":true, - "icon": "app.png", + "icon": "drinkcounter.png", "type": "app", "tags": "health", - "supports": ["BANGLEJS","BANGLEJS2"], + "supports": ["BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"drinkcounter.app.js","url":"app.js"}, - {"name":"drinkcounter.img","url":"drinkcounter-icon.js","evaluate":true} + {"name":"drinkcounter.img","url":"drinkcounter-icon.js","evaluate":true}, + {"name":"drinkcounter.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"drinkcounter.settings.json"}, + {"name":"drinkcounter.json"} ] } \ No newline at end of file diff --git a/apps/drinkcounter/settings.js b/apps/drinkcounter/settings.js new file mode 100644 index 000000000..9d213f4d2 --- /dev/null +++ b/apps/drinkcounter/settings.js @@ -0,0 +1,58 @@ +(function(back) { + var FILE = "drinkcounter.json"; + var settings = Object.assign({ + secondsOnUnlock: false, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + // Helper method which uses int-based menu item for set of string values + function stringItems(startvalue, writer, values) { + return { + value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), + format: v => values[v], + min: 0, + max: values.length - 1, + wrap: true, + step: 1, + onchange: v => { + writer(values[v]); + writeSettings(); + } + }; + } + + // Helper method which breaks string set settings down to local settings object + function stringInSettings(name, values) { + return stringItems(settings[name], v => settings[name] = v, values); + } + + var mainmenu = { + "": { + "title": "Drink counter" + }, + "< Back": () => back(), + + "Beer size": stringInSettings("beerSize", ["0.3L", "0.5L"]), + + + "Sex": stringInSettings("sex", ["male", "female"]), + + 'Weight': { + value: 0|settings.weight, + min: 40, max: 500, + onchange: v => { + settings.weight = v; + writeSettings(); + } + }, + "Weight unit": stringInSettings("weightUnit", ["Kilo", "US Pounds"]) + + + }; + + E.showMenu(mainmenu); + +});