mirror of https://github.com/espruino/BangleApps
Merge pull request #1948 from peerdavid/master
[cassioWatch] Version 0.10 - Show daily step count, temperature as well as heartrate.pull/1954/head
commit
9ffaa834c8
|
@ -7,4 +7,5 @@
|
||||||
0.6: Add Settings Page
|
0.6: Add Settings Page
|
||||||
0.7: Update Rocket Sequences Scope to not use memory all time
|
0.7: Update Rocket Sequences Scope to not use memory all time
|
||||||
0.8: Update Some Variable Scopes to not use memory until need
|
0.8: Update Some Variable Scopes to not use memory until need
|
||||||
0.9: Remove ESLint spaces
|
0.9: Remove ESLint spaces
|
||||||
|
0.10: Show daily steps, heartrate and the temperature if weather information is available.
|
|
@ -6,5 +6,6 @@ Clock with Space Cassio Watch Style.
|
||||||
|
|
||||||
It displays current temperature,day,steps,battery.heartbeat and weather.
|
It displays current temperature,day,steps,battery.heartbeat and weather.
|
||||||
|
|
||||||
|
|
||||||
**To-do**:
|
**To-do**:
|
||||||
Integrate heartbeat and Weather, Align and change size of some elements.
|
Align and change size of some elements.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
|
const storage = require('Storage');
|
||||||
|
|
||||||
require("Font6x12").add(Graphics);
|
require("Font6x12").add(Graphics);
|
||||||
require("Font8x12").add(Graphics);
|
require("Font8x12").add(Graphics);
|
||||||
require("Font7x11Numeric7Seg").add(Graphics);
|
require("Font7x11Numeric7Seg").add(Graphics);
|
||||||
|
|
||||||
let ClockInterval;
|
|
||||||
let RocketInterval;
|
|
||||||
let BatteryInterval;
|
|
||||||
|
|
||||||
function bigThenSmall(big, small, x, y) {
|
function bigThenSmall(big, small, x, y) {
|
||||||
g.setFont("7x11Numeric7Seg", 2);
|
g.setFont("7x11Numeric7Seg", 2);
|
||||||
g.drawString(big, x, y);
|
g.drawString(big, x, y);
|
||||||
|
@ -14,16 +12,6 @@ function bigThenSmall(big, small, x, y) {
|
||||||
g.drawString(small, x, y);
|
g.drawString(small, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ClearIntervals(inoreclock) {
|
|
||||||
if (RocketInterval) clearInterval(RocketInterval);
|
|
||||||
if (BatteryInterval) clearInterval(BatteryInterval);
|
|
||||||
RocketInterval = undefined;
|
|
||||||
BatteryInterval = undefined;
|
|
||||||
if (inoreclock) return;
|
|
||||||
if (ClockInterval) clearInterval(ClockInterval);
|
|
||||||
ClockInterval = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getBackgroundImage() {
|
function getBackgroundImage() {
|
||||||
return require("heatshrink").decompress(atob("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"));
|
return require("heatshrink").decompress(atob("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"));
|
||||||
}
|
}
|
||||||
|
@ -41,15 +29,31 @@ function getRocketSequences() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let rocket_sequence = 1;
|
let rocketSequence = 1;
|
||||||
|
let settings = storage.readJSON("cassioWatch.settings.json", true) || {};
|
||||||
let settings = require('Storage').readJSON("cassioWatch.settings.json", true) || {};
|
|
||||||
let rocketSpeed = settings.rocketSpeed || 700;
|
let rocketSpeed = settings.rocketSpeed || 700;
|
||||||
delete settings;
|
delete settings;
|
||||||
|
|
||||||
g.clear();
|
// schedule a draw for the next minute
|
||||||
|
let rocketInterval;
|
||||||
|
var drawTimeout;
|
||||||
|
function queueDraw() {
|
||||||
|
if (drawTimeout) clearTimeout(drawTimeout);
|
||||||
|
drawTimeout = setTimeout(function() {
|
||||||
|
drawTimeout = undefined;
|
||||||
|
draw();
|
||||||
|
}, 60000 - (Date.now() % 60000));
|
||||||
|
}
|
||||||
|
|
||||||
function DrawClock() {
|
|
||||||
|
function clearIntervals() {
|
||||||
|
if (rocketInterval) clearInterval(rocketInterval);
|
||||||
|
rocketInterval = undefined;
|
||||||
|
if (drawTimeout) clearTimeout(drawTimeout);
|
||||||
|
drawTimeout = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawClock() {
|
||||||
g.setFont("7x11Numeric7Seg", 3);
|
g.setFont("7x11Numeric7Seg", 3);
|
||||||
g.clearRect(80, 57, 170, 96);
|
g.clearRect(80, 57, 170, 96);
|
||||||
g.setColor(0, 255, 255);
|
g.setColor(0, 255, 255);
|
||||||
|
@ -66,23 +70,57 @@ function DrawClock() {
|
||||||
g.drawString(time < 10 ? "0" + time : time, 78, 137);
|
g.drawString(time < 10 ? "0" + time : time, 78, 137);
|
||||||
}
|
}
|
||||||
|
|
||||||
function DrawBattery() {
|
function drawBattery() {
|
||||||
bigThenSmall(E.getBattery(), "%", 135, 21);
|
bigThenSmall(E.getBattery(), "%", 135, 21);
|
||||||
}
|
}
|
||||||
|
|
||||||
function DrawRocket() {
|
function drawRocket() {
|
||||||
let Rocket = getRocketSequences();
|
let Rocket = getRocketSequences();
|
||||||
g.clearRect(5, 62, 63, 115);
|
g.clearRect(5, 62, 63, 115);
|
||||||
g.setColor(0, 255, 255);
|
g.setColor(0, 255, 255);
|
||||||
g.drawRect(5, 62, 63, 115);
|
g.drawRect(5, 62, 63, 115);
|
||||||
g.fillRect(5, 62, 63, 115);
|
g.fillRect(5, 62, 63, 115);
|
||||||
g.drawImage(Rocket[rocket_sequence], 5, 65, { scale: 0.7 });
|
g.drawImage(Rocket[rocketSequence], 5, 65, { scale: 0.7 });
|
||||||
g.setColor(0, 0, 0);
|
g.setColor(0, 0, 0);
|
||||||
rocket_sequence = rocket_sequence + 1;
|
rocketSequence = rocketSequence + 1;
|
||||||
if (rocket_sequence > 8) rocket_sequence = 1;
|
if(rocketSequence > 8) rocketSequence = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
function DrawScene() {
|
function getTemperature(){
|
||||||
|
try {
|
||||||
|
var weatherJson = storage.readJSON('weather.json');
|
||||||
|
var weather = weatherJson.weather;
|
||||||
|
return Math.round(weather.temp-273.15);
|
||||||
|
|
||||||
|
} catch(ex) {
|
||||||
|
print(ex)
|
||||||
|
return "?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSteps() {
|
||||||
|
var steps = 0;
|
||||||
|
try{
|
||||||
|
if (WIDGETS.wpedom !== undefined) {
|
||||||
|
steps = WIDGETS.wpedom.getSteps();
|
||||||
|
} else if (WIDGETS.activepedom !== undefined) {
|
||||||
|
steps = WIDGETS.activepedom.getSteps();
|
||||||
|
} else {
|
||||||
|
steps = Bangle.getHealthStatus("day").steps;
|
||||||
|
}
|
||||||
|
} catch(ex) {
|
||||||
|
// In case we failed, we can only show 0 steps.
|
||||||
|
return "? k";
|
||||||
|
}
|
||||||
|
|
||||||
|
steps = Math.round(steps/1000);
|
||||||
|
return steps + "k";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
queueDraw();
|
||||||
|
|
||||||
g.reset();
|
g.reset();
|
||||||
g.clear();
|
g.clear();
|
||||||
g.setColor(0, 255, 255);
|
g.setColor(0, 255, 255);
|
||||||
|
@ -94,40 +132,44 @@ function DrawScene() {
|
||||||
g.drawString("Launching Process", 30, 20);
|
g.drawString("Launching Process", 30, 20);
|
||||||
g.setFont("8x12");
|
g.setFont("8x12");
|
||||||
g.drawString("ACTIVATE", 40, 35);
|
g.drawString("ACTIVATE", 40, 35);
|
||||||
|
|
||||||
|
g.setFontAlign(0,-1);
|
||||||
g.setFont("8x12", 2);
|
g.setFont("8x12", 2);
|
||||||
g.drawString("30", 142, 132);
|
g.drawString(getTemperature(), 155, 132);
|
||||||
g.drawString("55", 95, 98);
|
g.drawString(Math.round(Bangle.getHealthStatus("last").bpm), 109, 98);
|
||||||
g.setFont("8x12", 1);
|
g.drawString(getSteps(), 158, 98);
|
||||||
g.drawString(Bangle.getStepCount(), 143, 104);
|
|
||||||
ClockInterval = setInterval(DrawClock, 30000);
|
g.setFontAlign(-1,-1);
|
||||||
DrawClock();
|
drawClock();
|
||||||
RocketInterval = setInterval(DrawRocket, rocketSpeed);
|
drawRocket();
|
||||||
DrawRocket();
|
drawBattery();
|
||||||
BatteryInterval = setInterval(DrawBattery, 5 * 60000);
|
|
||||||
DrawBattery();
|
// Hide widgets
|
||||||
|
for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bangle.on("lcdPower", (on) => {
|
Bangle.on("lcdPower", (on) => {
|
||||||
if (!on) {
|
if (on) {
|
||||||
g.clear();
|
draw();
|
||||||
ClearIntervals(true);
|
} else {
|
||||||
|
clearIntervals();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Bangle.on("lock", (locked) => {
|
Bangle.on("lock", (locked) => {
|
||||||
if (locked) {
|
clearIntervals();
|
||||||
ClearIntervals(true);
|
draw();
|
||||||
} else {
|
if (!locked) {
|
||||||
ClearIntervals();
|
rocketInterval = setInterval(drawRocket, rocketSpeed);
|
||||||
DrawScene();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Load widgets, but don't show them
|
||||||
|
Bangle.loadWidgets();
|
||||||
|
Bangle.setUI("clock");
|
||||||
|
|
||||||
g.reset();
|
g.reset();
|
||||||
g.clear();
|
g.clear();
|
||||||
Bangle.setUI("clock");
|
draw();
|
||||||
DrawScene();
|
|
||||||
|
|
||||||
if (Bangle.isLocked()) {
|
|
||||||
ClearIntervals(true);
|
|
||||||
}
|
|
|
@ -4,7 +4,7 @@
|
||||||
"description": "Animated Clock with Space Cassio Watch Style",
|
"description": "Animated Clock with Space Cassio Watch Style",
|
||||||
"screenshots": [{ "url": "screens/screen_night.png" },{ "url": "screens/screen_day.png" }],
|
"screenshots": [{ "url": "screens/screen_night.png" },{ "url": "screens/screen_day.png" }],
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"version": "0.9",
|
"version": "0.10",
|
||||||
"type": "clock",
|
"type": "clock",
|
||||||
"tags": "clock, weather, cassio, retro",
|
"tags": "clock, weather, cassio, retro",
|
||||||
"supports": ["BANGLEJS2"],
|
"supports": ["BANGLEJS2"],
|
||||||
|
|
Loading…
Reference in New Issue