Merge pull request #1948 from peerdavid/master

[cassioWatch] Version 0.10 - Show daily step count, temperature as well as heartrate.
pull/1954/head
Gordon Williams 2022-06-13 15:37:51 +01:00 committed by GitHub
commit 9ffaa834c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 96 additions and 52 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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);
}

View File

@ -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"],