mirror of https://github.com/espruino/BangleApps
0.15 - first working version
parent
570bec09ff
commit
efdff0f4a4
|
@ -1 +1,2 @@
|
||||||
0.10: Initial release - still work in progress
|
0.10: Initial release - still work in progress
|
||||||
|
0.15: Added settings and calculations
|
|
@ -1,14 +1,12 @@
|
||||||
# Drink Counter
|
# 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!
|
Development still in progress. Counts drinks you had for science. Calculates BAC.
|
||||||
Counts drinks you had for science. Calculates BAC.
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Swipe left/right to select drink. Swipe up/down to add/remove drinks.
|
Swipe left/right to select drink. Swipe up/down to add/remove drinks.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Creator
|
## Creator
|
||||||
|
|
||||||
Hank - contact at http://forum.espruino.com
|
Hank - contact at http://forum.espruino.com
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
g.reset().clear();
|
g.reset().clear();
|
||||||
Bangle.loadWidgets();
|
Bangle.loadWidgets();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
|
require("Font8x16").add(Graphics);
|
||||||
|
|
||||||
|
const SETTINGSFILE = "drinkcounter.json";
|
||||||
setting = require("Storage").readJSON("setting.json",1);
|
setting = require("Storage").readJSON("setting.json",1);
|
||||||
E.setTimeZone(setting.timezone); // timezone = 1 for MEZ, = 2 for MESZ
|
E.setTimeZone(setting.timezone); // timezone = 1 for MEZ, = 2 for MESZ
|
||||||
var _12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false;
|
var _12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false;
|
||||||
|
@ -17,97 +19,69 @@ var drinks = [0,0,0];
|
||||||
const maxDrinks = 2; // 3 drinks
|
const maxDrinks = 2; // 3 drinks
|
||||||
var firstDrinkTime = null;
|
var firstDrinkTime = null;
|
||||||
|
|
||||||
|
var confBeerSize;
|
||||||
|
var confSex;
|
||||||
|
var confWeight;
|
||||||
|
var confWeightUnit;
|
||||||
|
|
||||||
|
var drinksAlcohol = [12,16,5.6]; // in gramm
|
||||||
//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);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
// Beer: 0.3L 12g - 0.5L 20g
|
// Beer: 0.3L 12g - 0.5L 20g
|
||||||
// Radler: 0.3L 6g - 0.5L 10g
|
// Radler: 0.3L 6g - 0.5L 10g
|
||||||
// Wine: 0.2L 16g
|
// Wine: 0.2L 16g
|
||||||
// Jäger Shot: 0.02L 5.6g
|
// Jäger Shot: 0.02L 5.6g
|
||||||
|
|
||||||
// sex: Women 60 - Men 70 (Percent)
|
// sex: Women 60 - Men 70 (Percent)
|
||||||
|
|
||||||
|
|
||||||
// Formula: Alcohol in g /(Body weight in kg x sex) – (0,15 x Hours) = bac per mille
|
// 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
|
// Example: 5 Beer (0.3L=12g), 80KG, Male (70%), 5 hours
|
||||||
// (5 * 12) / (80 / 100 * 70) - (0.15 * 5)
|
// (5 * 12) / (80 / 100 * 70) - (0.15 * 5)
|
||||||
|
|
||||||
function drawBac(){
|
function drawBac(){
|
||||||
if (firstDrinkTime) {
|
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
|
if (confSex == "male") {
|
||||||
var sex = 70; // TODO
|
sex = 70;
|
||||||
var weight = 80; // kg, TODO: pounds
|
} else {
|
||||||
var alcoholInG = 12; // TODO
|
sex = 60;
|
||||||
|
}
|
||||||
|
var weight = confWeight;
|
||||||
|
|
||||||
|
if (confWeightUnit == "US Pounds") {
|
||||||
|
weight = weight * 0.45359237;
|
||||||
|
}
|
||||||
|
|
||||||
var currentTime = new Date();
|
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);
|
//console.log("timediff: " + time_diff);
|
||||||
ebac = Math.round( ((sum_drinks * alcoholInG) / (weight / 100 * sex) - (0.15 * time_diff) ) * 100) / 100
|
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.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(){
|
function updateTime(){
|
||||||
var d = new Date();
|
var d = require("locale").time(new Date(), 1);
|
||||||
var da = d.toString().split(" ");
|
|
||||||
var time = da[4].split(":");
|
//console.log(d);
|
||||||
|
var time = d.split(":");
|
||||||
var hours = time[0];
|
var hours = time[0];
|
||||||
var minutes = time[1];
|
var minutes = time[1];
|
||||||
if (_12hour){
|
if (_12hour){
|
||||||
|
@ -125,7 +99,7 @@ function updateTime(){
|
||||||
g.setBgColor(g.theme.bg).clearRect(0,24,176,44); //Clear
|
g.setBgColor(g.theme.bg).clearRect(0,24,176,44); //Clear
|
||||||
g.setFontAlign(0,0); // center font
|
g.setFontAlign(0,0); // center font
|
||||||
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
|
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();
|
queueDrawTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +121,7 @@ function updateDrinks(){
|
||||||
g.setColor(g.theme.fg);
|
g.setColor(g.theme.fg);
|
||||||
}
|
}
|
||||||
g.setFont("Vector",20).drawString(drinks[i], (40 * (i + 1)) - 20, 160);
|
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();
|
drawBac();
|
||||||
}
|
}
|
||||||
|
@ -155,12 +129,11 @@ function updateDrinks(){
|
||||||
function addDrink(){
|
function addDrink(){
|
||||||
if (!firstDrinkTime){
|
if (!firstDrinkTime){
|
||||||
firstDrinkTime = new Date();
|
firstDrinkTime = new Date();
|
||||||
var dafirstDrinkTime = firstDrinkTime.toString().split(" ");
|
var firstDrinkTimeTime = require("locale").time(new Date(), 1);
|
||||||
var firstDrinkTimeTime = dafirstDrinkTime[4].split(":");
|
//console.log("FIRST drink @ " + firstDrinkTime + " = " + firstDrinkTime.toString());
|
||||||
var firstDrinkTimeHours = firstDrinkTimeTime[0];
|
|
||||||
var firstDrinkTimeMinutes = firstDrinkTimeTime[1];
|
g.setFont("8x16");
|
||||||
console.log("FIRST drink @ " + firstDrinkTime + " = " + firstDrinkTime.toString());
|
g.setFontAlign(0,0).drawString("1st drink @ " + firstDrinkTimeTime, 90, 34 + 20 );
|
||||||
g.setFontAlign(0,0).setFont("Vector",15).drawString("1st drink @ " + firstDrinkTimeHours + ":" + firstDrinkTimeMinutes, 90, 34 + 20 );
|
|
||||||
}
|
}
|
||||||
drinks[activeDrink] = drinks[activeDrink] + 1;
|
drinks[activeDrink] = drinks[activeDrink] + 1;
|
||||||
updateDrinks();
|
updateDrinks();
|
||||||
|
@ -192,19 +165,19 @@ function initDragEvents() {
|
||||||
if (Math.abs(dx)>Math.abs(dy)+10) {
|
if (Math.abs(dx)>Math.abs(dy)+10) {
|
||||||
// horizontal
|
// horizontal
|
||||||
if (dx < dy) {
|
if (dx < dy) {
|
||||||
console.log("left " + dx + " " + dy);
|
//console.log("left " + dx + " " + dy);
|
||||||
previousDrink();
|
previousDrink();
|
||||||
} else {
|
} else {
|
||||||
console.log("right " + dx + " " + dy);
|
//console.log("right " + dx + " " + dy);
|
||||||
nextDrink();
|
nextDrink();
|
||||||
}
|
}
|
||||||
} else if (Math.abs(dy)>Math.abs(dx)+10) {
|
} else if (Math.abs(dy)>Math.abs(dx)+10) {
|
||||||
// vertical
|
// vertical
|
||||||
if (dx < dy) {
|
if (dx < dy) {
|
||||||
console.log("down " + dx + " " + dy);
|
//console.log("down " + dx + " " + dy);
|
||||||
removeDrink();
|
removeDrink();
|
||||||
} else {
|
} else {
|
||||||
console.log("up " + dx + " " + dy);
|
//console.log("up " + dx + " " + dy);
|
||||||
addDrink();
|
addDrink();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -212,7 +185,7 @@ function initDragEvents() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadMySettings();
|
||||||
g.setBgColor(g.theme.bg);
|
g.setBgColor(g.theme.bg);
|
||||||
g.drawImage(icoBeer,0,100);
|
g.drawImage(icoBeer,0,100);
|
||||||
g.drawImage(icoCocktail,40,100);
|
g.drawImage(icoCocktail,40,100);
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 302 B |
|
@ -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=="))
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 811 B |
|
@ -2,16 +2,21 @@
|
||||||
"id": "drinkcounter",
|
"id": "drinkcounter",
|
||||||
"name": "Drink Counter",
|
"name": "Drink Counter",
|
||||||
"shortName": "Drink Counter",
|
"shortName": "Drink Counter",
|
||||||
"version": "0.10",
|
"version": "0.15",
|
||||||
"description": "Counts drinks you had for science.",
|
"description": "Counts drinks you had for science.",
|
||||||
"allow_emulator":true,
|
"allow_emulator":true,
|
||||||
"icon": "app.png",
|
"icon": "drinkcounter.png",
|
||||||
"type": "app",
|
"type": "app",
|
||||||
"tags": "health",
|
"tags": "health",
|
||||||
"supports": ["BANGLEJS","BANGLEJS2"],
|
"supports": ["BANGLEJS2"],
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"drinkcounter.app.js","url":"app.js"},
|
{"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"}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -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);
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue