Distance calc and display
parent
5bbb6bfc89
commit
0ef33e12dc
|
|
@ -1 +1,2 @@
|
|||
0.01: New Widget!
|
||||
0.02: Distance calculation and display
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
# Improved pedometer
|
||||
# Active Pedometer
|
||||
Pedometer that filters out arm movement and displays a step goal progress.
|
||||
|
||||
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
|
||||
|
||||
* Two line display
|
||||
* Can display distance (in km) or steps in each line
|
||||
* 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'
|
||||
* Progress bar for step goal
|
||||
* 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)
|
||||
* 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
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
(function(back) {
|
||||
const SETTINGS_FILE = 'activepedom.settings.json';
|
||||
const LINES = ['Steps', 'Distance'];
|
||||
|
||||
// initialize with default settings...
|
||||
let s = {
|
||||
|
|
@ -13,6 +14,9 @@
|
|||
'intervalResetActive' : 30000,
|
||||
'stepSensitivity' : 80,
|
||||
'stepGoal' : 10000,
|
||||
'stepLength' : 75,
|
||||
'lineOne': LINES[0],
|
||||
'lineTwo': LINES[1],
|
||||
};
|
||||
// ...and overwrite them with any saved values
|
||||
// This way saved values are preserved if a new version adds more settings
|
||||
|
|
@ -27,7 +31,7 @@
|
|||
return function (value) {
|
||||
s[key] = value;
|
||||
storage.write(SETTINGS_FILE, s);
|
||||
WIDGETS["activepedom"].draw();
|
||||
//WIDGETS["activepedom"].draw();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -76,6 +80,33 @@
|
|||
step: 1000,
|
||||
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);
|
||||
});
|
||||
|
|
@ -8,22 +8,16 @@
|
|||
var active = 0; //x steps in y seconds achieved
|
||||
var stepGoalPercent = 0; //percentage of step goal
|
||||
var stepGoalBarLength = 0; //length og progress bar
|
||||
var lastUpdate = new Date();
|
||||
var width = 45;
|
||||
var lastUpdate = new Date(); //used to reset counted steps on new day
|
||||
var width = 45; //width of widget
|
||||
|
||||
//used for statistics and debugging
|
||||
var stepsTooShort = 0;
|
||||
var stepsTooLong = 0;
|
||||
var stepsOutsideTime = 0;
|
||||
|
||||
//define default settings
|
||||
const DEFAULTS = {
|
||||
'cMaxTime' : 1100,
|
||||
'cMinTime' : 240,
|
||||
'stepThreshold' : 30,
|
||||
'intervalResetActive' : 30000,
|
||||
'stepSensitivity' : 80,
|
||||
'stepGoal' : 10000,
|
||||
};
|
||||
var distance = 0; //distance travelled
|
||||
|
||||
const SETTINGS_FILE = 'activepedom.settings.json';
|
||||
const PEDOMFILE = "activepedom.steps.json";
|
||||
|
||||
|
|
@ -32,8 +26,19 @@
|
|||
function loadSettings() {
|
||||
settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {};
|
||||
}
|
||||
|
||||
//return setting
|
||||
function setting(key) {
|
||||
//define default settings
|
||||
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];
|
||||
}
|
||||
|
|
@ -46,7 +51,7 @@
|
|||
}
|
||||
|
||||
//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 >= 1000 && num < 10000) { //between 1.000 and 10.000
|
||||
num = Math.floor(num/100)*100;
|
||||
|
|
@ -99,11 +104,12 @@
|
|||
else {
|
||||
stepsOutsideTime++;
|
||||
}
|
||||
settings = 0; //reset settings to save memory
|
||||
}
|
||||
|
||||
function draw() {
|
||||
var height = 23; //width is deined globally
|
||||
var stepsDisplayLarge = kFormatter(stepsCounted);
|
||||
distance = (stepsCounted * setting('stepLength')) / 100 /1000 //distance in km
|
||||
|
||||
//Check if same day
|
||||
let date = new Date();
|
||||
|
|
@ -121,10 +127,21 @@
|
|||
if (active == 1) g.setColor(0x07E0); //green
|
||||
else g.setColor(0xFFFF); //white
|
||||
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.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
|
||||
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+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
|
||||
|
||||
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()
|
||||
|
|
@ -164,6 +183,7 @@
|
|||
|
||||
//Read data from file and set variables
|
||||
let pedomData = require("Storage").readJSON(PEDOMFILE,1);
|
||||
|
||||
if (pedomData) {
|
||||
if (pedomData.lastUpdate) lastUpdate = new Date(pedomData.lastUpdate);
|
||||
stepsCounted = pedomData.stepsToday|0;
|
||||
|
|
@ -172,6 +192,8 @@
|
|||
stepsOutsideTime = pedomData.stepsOutsideTime;
|
||||
}
|
||||
|
||||
pedomdata = 0; //reset pedomdata to save memory
|
||||
|
||||
setStepSensitivity(setting('stepSensitivity')); //set step sensitivity (80 is standard, 400 is muss less sensitive)
|
||||
|
||||
//Add widget
|
||||
|
|
|
|||
Loading…
Reference in New Issue