mirror of https://github.com/espruino/BangleApps
commit
5a967ac423
|
@ -0,0 +1 @@
|
|||
0.01: New App!
|
|
@ -0,0 +1,9 @@
|
|||
# Terminal clock
|
||||
|
||||
A clock displayed as a terminal cli.
|
||||
It can display :
|
||||
- time
|
||||
- date
|
||||
- hrm
|
||||
- activity
|
||||
- steps
|
|
@ -0,0 +1 @@
|
|||
require("heatshrink").decompress(atob("mEwghC/AHsHu93uAX/C+wACsAaTC/4Xiu1mswXRCYNnDQQxTgwX/C8QABuAaTg4X/C7Z3Xa/4Xds1ms4XUCgV2DYIXUsBdTC/4AEg4VCC61wIiYX/C74A/AGIA=="))
|
|
@ -0,0 +1,138 @@
|
|||
var locale = require("locale");
|
||||
var fontColor = g.theme.dark ? "#0f0" : "#000";
|
||||
var startY = 24;
|
||||
var paddingY = 2;
|
||||
var font6x8At4Size = 32;
|
||||
var font6x8At2Size = 18;
|
||||
var heartRate = 0;
|
||||
|
||||
|
||||
function setFontSize(pos){
|
||||
if(pos == 1)
|
||||
g.setFont("6x8", 4);
|
||||
else
|
||||
g.setFont("6x8", 2);
|
||||
}
|
||||
|
||||
function clearField(pos){
|
||||
var yStartPos = startY +
|
||||
paddingY * (pos - 1) +
|
||||
font6x8At4Size * Math.min(1, pos-1) +
|
||||
font6x8At2Size * Math.max(0, pos-2);
|
||||
var yEndPos = startY +
|
||||
paddingY * (pos - 1) +
|
||||
font6x8At4Size * Math.min(1, pos) +
|
||||
font6x8At2Size * Math.max(0, pos-1);
|
||||
g.clearRect(0, yStartPos, 240, yEndPos);
|
||||
}
|
||||
|
||||
function clearWatchIfNeeded(now){
|
||||
if(now.getMinutes() % 10 == 0)
|
||||
g.clearRect(0, startY, 240, 240);
|
||||
}
|
||||
|
||||
function drawLine(line, pos){
|
||||
setFontSize(pos);
|
||||
var yPos = startY +
|
||||
paddingY * (pos - 1) +
|
||||
font6x8At4Size * Math.min(1, pos-1) +
|
||||
font6x8At2Size * Math.max(0, pos-2);
|
||||
g.drawString(line, 5, yPos, true);
|
||||
}
|
||||
|
||||
function drawTime(now, pos){
|
||||
var h = now.getHours();
|
||||
var m = now.getMinutes();
|
||||
var time = ">" + (""+h).substr(-2) + ":" + ("0"+m).substr(-2);
|
||||
drawLine(time, pos);
|
||||
}
|
||||
|
||||
function drawDate(now, pos){
|
||||
var dow = locale.dow(now, 1);
|
||||
var date = locale.date(now, 1).substr(0,6) + locale.date(now, 1).substr(-2);
|
||||
var locale_date = ">" + dow + " " + date;
|
||||
drawLine(locale_date, pos);
|
||||
}
|
||||
|
||||
function drawInput(now, pos){
|
||||
clearField(pos);
|
||||
drawLine(">", pos);
|
||||
}
|
||||
|
||||
function drawStepCount(pos){
|
||||
var health = Bangle.getHealthStatus("day");
|
||||
var steps_formated = ">Steps: " + health.steps;
|
||||
drawLine(steps_formated, pos);
|
||||
}
|
||||
|
||||
function drawHRM(pos){
|
||||
clearField(pos);
|
||||
if(heartRate != 0)
|
||||
drawLine(">HR: " + parseInt(heartRate), pos);
|
||||
else
|
||||
drawLine(">HR: unknown", pos);
|
||||
}
|
||||
|
||||
function drawActivity(pos){
|
||||
clearField(pos);
|
||||
var health = Bangle.getHealthStatus('last');
|
||||
var steps_formated = ">Activity: " + parseInt(health.movement/10);
|
||||
drawLine(steps_formated, pos);
|
||||
}
|
||||
|
||||
|
||||
function draw(){
|
||||
var curPos = 1;
|
||||
g.reset();
|
||||
g.setFontAlign(-1, -1);
|
||||
g.setColor(fontColor);
|
||||
var now = new Date();
|
||||
clearWatchIfNeeded(now); // mostly to not have issues when changing days
|
||||
drawTime(now, curPos);
|
||||
curPos++;
|
||||
if(settings.showDate){
|
||||
drawDate(now, curPos);
|
||||
curPos++;
|
||||
}
|
||||
if(settings.showHRM){
|
||||
drawHRM(curPos);
|
||||
curPos++;
|
||||
}
|
||||
if(settings.showActivity){
|
||||
drawActivity(curPos);
|
||||
curPos++;
|
||||
}
|
||||
if(settings.showStepCount){
|
||||
drawStepCount(curPos);
|
||||
curPos++;
|
||||
}
|
||||
drawInput(now, curPos);
|
||||
}
|
||||
|
||||
|
||||
Bangle.on('HRM',function(hrmInfo) {
|
||||
if(hrmInfo.confidence >= settings.HRMinConfidence)
|
||||
heartRate = hrmInfo.bpm;
|
||||
});
|
||||
|
||||
|
||||
// Clear the screen once, at startup
|
||||
g.clear();
|
||||
// load the settings
|
||||
var settings = Object.assign({
|
||||
// default values
|
||||
HRMinConfidence: 50,
|
||||
showDate: true,
|
||||
showHRM: true,
|
||||
showActivity: true,
|
||||
showStepCount: true,
|
||||
}, require('Storage').readJSON("terminalclock.json", true) || {});
|
||||
// draw immediately at first
|
||||
draw();
|
||||
// Show launcher when middle button pressed
|
||||
Bangle.setUI("clock");
|
||||
// Load widgets
|
||||
Bangle.loadWidgets();
|
||||
Bangle.drawWidgets();
|
||||
|
||||
var secondInterval = setInterval(draw, 10000);
|
Binary file not shown.
After Width: | Height: | Size: 1022 B |
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"id": "terminalclock",
|
||||
"name": "Terminal Clock",
|
||||
"shortName":"Terminal Clock",
|
||||
"description": "A terminal cli like clock displaying multiple sensor data",
|
||||
"version":"0.01",
|
||||
"icon": "app.png",
|
||||
"type": "clock",
|
||||
"tags": "clock",
|
||||
"supports": ["BANGLEJS2"],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name": "terminalclock.app.js","url": "app.js"},
|
||||
{"name": "terminalclock.settings.js","url": "settings.js"},
|
||||
{"name": "terminalclock.img","url": "app-icon.js","evaluate": true}
|
||||
],
|
||||
"data": [
|
||||
{"name": "terminalclock.json"}
|
||||
],
|
||||
"screenshots": [
|
||||
{"url": "screenshot1.png"},
|
||||
{"url": "screenshot2.png"}
|
||||
]
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.0 KiB |
|
@ -0,0 +1,61 @@
|
|||
(function(back) {
|
||||
var FILE = "terminalclock.json";
|
||||
// Load settings
|
||||
var settings = Object.assign({
|
||||
HRMinConfidence: 50,
|
||||
showDate: true,
|
||||
showHRM: true,
|
||||
showActivity: true,
|
||||
showStepCount: true,
|
||||
}, require('Storage').readJSON(FILE, true) || {});
|
||||
|
||||
function writeSettings() {
|
||||
require('Storage').writeJSON(FILE, settings);
|
||||
}
|
||||
|
||||
// Show the menu
|
||||
E.showMenu({
|
||||
"" : { "title" : "Terminal Clock" },
|
||||
"< Back" : () => back(),
|
||||
'HR confidence': {
|
||||
value: 50|settings.HRMinConfidence, // 0| converts undefined to 0
|
||||
min: 0, max: 100,
|
||||
onchange: v => {
|
||||
settings.HRMinConfidence = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
'Show date': {
|
||||
value: !!settings.showDate,
|
||||
format: v => v?"Yes":"No",
|
||||
onchange: v => {
|
||||
settings.showDate = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
'Show HRM': {
|
||||
value: !!settings.showHRM,
|
||||
format: v => v?"Yes":"No",
|
||||
onchange: v => {
|
||||
settings.showHRM = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
'Show Activity': {
|
||||
value: !!settings.showActivity,
|
||||
format: v => v?"Yes":"No",
|
||||
onchange: v => {
|
||||
settings.showActivity = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
'Show Steps': {
|
||||
value: !!settings.showStepCount,
|
||||
format: v => v?"Yes":"No",
|
||||
onchange: v => {
|
||||
settings.showStepCount = v;
|
||||
writeSettings();
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
Loading…
Reference in New Issue