Distance calc and display

master
Purple-Tentacle 2020-04-16 08:21:27 +02:00 committed by GitHub
parent 5bbb6bfc89
commit 0ef33e12dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 93 additions and 24 deletions

View File

@ -1 +1,2 @@
0.01: New Widget! 0.01: New Widget!
0.02: Distance calculation and display

View File

@ -1,4 +1,4 @@
# Improved pedometer # Active Pedometer
Pedometer that filters out arm movement and displays a step goal progress. Pedometer that filters out arm movement and displays a step goal progress.
I changed the step counting algorithm completely. I changed the step counting algorithm completely.
@ -19,8 +19,9 @@ When you reach the step threshold, the steps needed to reach the threshold are c
## Features ## Features
* Two line display * Two line display
* Can display distance (in km) or steps in each line
* Large number for good readability * Large number for good readability
* Small number with the exact steps counted * Small number with the exact steps counted or more exact distance
* Large number is displayed in green when status is 'active' * Large number is displayed in green when status is 'active'
* Progress bar for step goal * Progress bar for step goal
* Counts steps only if they are reached in a certain time * Counts steps only if they are reached in a certain time
@ -29,9 +30,23 @@ When you reach the step threshold, the steps needed to reach the threshold are c
* Steps are saved to a file and read-in at start (to not lose step progress) * Steps are saved to a file and read-in at start (to not lose step progress)
* Settings can be changed in Settings - App/widget settings - Active Pedometer * Settings can be changed in Settings - App/widget settings - Active Pedometer
## Development version ## Settings
* https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/pedometer * Max time (ms): Maximum time between two steps in milliseconds, steps will not be counted if exceeded. Standard: 1100
* Min time (ms): Minimum time between two steps in milliseconds, steps will not be counted if fallen below. Standard: 240
* Step threshold: How many steps are needed to reach 'active' mode. If you do not reach the threshold in the 'Active Reset' time, the steps are not counted. Standard: 30
* Act.Res. (ms): Active Reset. After how many miliseconds will the 'active mode' reset. You have to reach the step threshold in this time, otherwise the steps are not counted. Standard: 30000
* Step sens.: Step Sensitivity. How sensitive should the sted detection be? This changes sensitivity in step detection in the firmware. Standard in firmware: 80
* Step goal: This is your daily step goal. Standard: 10000
* Step length: Length of one step in cm. Standard: 75
* Line One: What to display in line one, steps or distance. Standard: steps
* Line Two: What to display in line two, steps or distance. Standard: distance
## Releases
* Offifical app loader: https://github.com/espruino/BangleApps/tree/master/apps/activepedom (https://banglejs.com/apps)
* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/activepedom (https://purple-tentacle.github.io/BangleApps/#widget)
* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/pedometer
## Requests ## Requests

View File

@ -4,6 +4,7 @@
*/ */
(function(back) { (function(back) {
const SETTINGS_FILE = 'activepedom.settings.json'; const SETTINGS_FILE = 'activepedom.settings.json';
const LINES = ['Steps', 'Distance'];
// initialize with default settings... // initialize with default settings...
let s = { let s = {
@ -13,6 +14,9 @@
'intervalResetActive' : 30000, 'intervalResetActive' : 30000,
'stepSensitivity' : 80, 'stepSensitivity' : 80,
'stepGoal' : 10000, 'stepGoal' : 10000,
'stepLength' : 75,
'lineOne': LINES[0],
'lineTwo': LINES[1],
}; };
// ...and overwrite them with any saved values // ...and overwrite them with any saved values
// This way saved values are preserved if a new version adds more settings // This way saved values are preserved if a new version adds more settings
@ -27,7 +31,7 @@
return function (value) { return function (value) {
s[key] = value; s[key] = value;
storage.write(SETTINGS_FILE, s); storage.write(SETTINGS_FILE, s);
WIDGETS["activepedom"].draw(); //WIDGETS["activepedom"].draw();
}; };
} }
@ -76,6 +80,33 @@
step: 1000, step: 1000,
onchange: save('stepGoal'), onchange: save('stepGoal'),
}, },
'Step length (cm)': {
value: s.stepLength,
min: 1,
max: 150,
step: 1,
onchange: save('stepLength'),
},
'Line One': {
format: () => s.lineOne,
onchange: function () {
// cycles through options
const oldIndex = LINES.indexOf(s.lineOne)
const newIndex = (oldIndex + 1) % LINES.length
s.lineOne = LINES[newIndex]
save('lineOne')(s.lineOne)
},
},
'Line Two': {
format: () => s.lineTwo,
onchange: function () {
// cycles through options
const oldIndex = LINES.indexOf(s.lineTwo)
const newIndex = (oldIndex + 1) % LINES.length
s.lineTwo = LINES[newIndex]
save('lineTwo')(s.lineTwo)
},
},
}; };
E.showMenu(menu); E.showMenu(menu);
}); });

View File

@ -8,22 +8,16 @@
var active = 0; //x steps in y seconds achieved var active = 0; //x steps in y seconds achieved
var stepGoalPercent = 0; //percentage of step goal var stepGoalPercent = 0; //percentage of step goal
var stepGoalBarLength = 0; //length og progress bar var stepGoalBarLength = 0; //length og progress bar
var lastUpdate = new Date(); var lastUpdate = new Date(); //used to reset counted steps on new day
var width = 45; var width = 45; //width of widget
//used for statistics and debugging
var stepsTooShort = 0; var stepsTooShort = 0;
var stepsTooLong = 0; var stepsTooLong = 0;
var stepsOutsideTime = 0; var stepsOutsideTime = 0;
//define default settings var distance = 0; //distance travelled
const DEFAULTS = {
'cMaxTime' : 1100,
'cMinTime' : 240,
'stepThreshold' : 30,
'intervalResetActive' : 30000,
'stepSensitivity' : 80,
'stepGoal' : 10000,
};
const SETTINGS_FILE = 'activepedom.settings.json'; const SETTINGS_FILE = 'activepedom.settings.json';
const PEDOMFILE = "activepedom.steps.json"; const PEDOMFILE = "activepedom.steps.json";
@ -32,10 +26,21 @@
function loadSettings() { function loadSettings() {
settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {};
} }
//return setting //return setting
function setting(key) { function setting(key) {
if (!settings) { loadSettings(); } //define default settings
return (key in settings) ? settings[key] : DEFAULTS[key]; const DEFAULTS = {
'cMaxTime' : 1100,
'cMinTime' : 240,
'stepThreshold' : 30,
'intervalResetActive' : 30000,
'stepSensitivity' : 80,
'stepGoal' : 10000,
'stepLength' : 75,
};
if (!settings) { loadSettings(); }
return (key in settings) ? settings[key] : DEFAULTS[key];
} }
function setStepSensitivity(s) { function setStepSensitivity(s) {
@ -46,7 +51,7 @@
} }
//format number to make them shorter //format number to make them shorter
function kFormatter(num) { function kFormatterSteps(num) {
if (num <= 999) return num; //smaller 1.000, return 600 as 600 if (num <= 999) return num; //smaller 1.000, return 600 as 600
if (num >= 1000 && num < 10000) { //between 1.000 and 10.000 if (num >= 1000 && num < 10000) { //between 1.000 and 10.000
num = Math.floor(num/100)*100; num = Math.floor(num/100)*100;
@ -99,11 +104,12 @@
else { else {
stepsOutsideTime++; stepsOutsideTime++;
} }
settings = 0; //reset settings to save memory
} }
function draw() { function draw() {
var height = 23; //width is deined globally var height = 23; //width is deined globally
var stepsDisplayLarge = kFormatter(stepsCounted); distance = (stepsCounted * setting('stepLength')) / 100 /1000 //distance in km
//Check if same day //Check if same day
let date = new Date(); let date = new Date();
@ -121,10 +127,21 @@
if (active == 1) g.setColor(0x07E0); //green if (active == 1) g.setColor(0x07E0); //green
else g.setColor(0xFFFF); //white else g.setColor(0xFFFF); //white
g.setFont("6x8", 2); g.setFont("6x8", 2);
g.drawString(stepsDisplayLarge,this.x+1,this.y); //first line, big number
if (setting('lineOne') == 'Steps') {
g.drawString(kFormatterSteps(stepsCounted),this.x+1,this.y); //first line, big number, steps
}
if (setting('lineOne') == 'Distance') {
g.drawString(distance.toFixed(2),this.x+1,this.y); //first line, big number, distance
}
g.setFont("6x8", 1); g.setFont("6x8", 1);
g.setColor(0xFFFF); //white g.setColor(0xFFFF); //white
g.drawString(stepsCounted,this.x+1,this.y+14); //second line, small number if (setting('lineTwo') == 'Steps') {
g.drawString(stepsCounted,this.x+1,this.y+14); //second line, small number, steps
}
if (setting('lineTwo') == 'Distance') {
g.drawString(distance.toFixed(3) + "km",this.x+1,this.y+14); //second line, small number, distance
}
//draw step goal bar //draw step goal bar
stepGoalPercent = (stepsCounted / setting('stepGoal')) * 100; stepGoalPercent = (stepsCounted / setting('stepGoal')) * 100;
@ -136,6 +153,8 @@
g.fillRect(this.x, this.y+height, this.x+1, this.y+height-1); //draw start of bar g.fillRect(this.x, this.y+height, this.x+1, this.y+height-1); //draw start of bar
g.fillRect(this.x+width, this.y+height, this.x+width-1, this.y+height-1); //draw end of bar g.fillRect(this.x+width, this.y+height, this.x+width-1, this.y+height-1); //draw end of bar
g.fillRect(this.x, this.y+height, this.x+stepGoalBarLength, this.y+height); // draw progress bar g.fillRect(this.x, this.y+height, this.x+stepGoalBarLength, this.y+height); // draw progress bar
settings = 0; //reset settings to save memory
} }
//This event is called just before the device shuts down for commands such as reset(), load(), save(), E.reboot() or Bangle.off() //This event is called just before the device shuts down for commands such as reset(), load(), save(), E.reboot() or Bangle.off()
@ -164,6 +183,7 @@
//Read data from file and set variables //Read data from file and set variables
let pedomData = require("Storage").readJSON(PEDOMFILE,1); let pedomData = require("Storage").readJSON(PEDOMFILE,1);
if (pedomData) { if (pedomData) {
if (pedomData.lastUpdate) lastUpdate = new Date(pedomData.lastUpdate); if (pedomData.lastUpdate) lastUpdate = new Date(pedomData.lastUpdate);
stepsCounted = pedomData.stepsToday|0; stepsCounted = pedomData.stepsToday|0;
@ -172,6 +192,8 @@
stepsOutsideTime = pedomData.stepsOutsideTime; stepsOutsideTime = pedomData.stepsOutsideTime;
} }
pedomdata = 0; //reset pedomdata to save memory
setStepSensitivity(setting('stepSensitivity')); //set step sensitivity (80 is standard, 400 is muss less sensitive) setStepSensitivity(setting('stepSensitivity')); //set step sensitivity (80 is standard, 400 is muss less sensitive)
//Add widget //Add widget