fitbit-frosted/app/index.js

130 lines
3.0 KiB
JavaScript

import document from "document";
import clock from "clock";
import { preferences } from "user-settings";
import { HeartRateSensor } from "heart-rate";
import { vibration } from "haptics";
import { today } from "user-activity";
import { display } from "display";
import * as messaging from "messaging";
import * as fs from "fs";
import * as digits from "../common/digits";
let hrm = new HeartRateSensor;
let hrTimer;
let touchArea = document.getElementById('touchArea');
let settings = {
colors: ['#843E86', '#00b0a0', 'white'],
dateReverse: false // US date
};
var storedSettings;
var fileSuccess = true;
console.log('reading settings');
try {
storedSettings = fs.readFileSync("settings.txt", "cbor");
}
catch(err) {
fileSuccess = false;
console.log('settings not found');
}
if (fileSuccess) {
settings = storedSettings;
}
function updateClock() {
let currDate = new Date();
let hours = currDate.getHours();
let displayHours = hours;
let day = currDate.getDate();
let month = currDate.getMonth()+1;
if (preferences.clockDisplay === '12h') {
displayHours = displayHours % 12;
displayHours = displayHours ? displayHours : 12;
}
let minutes = currDate.getMinutes();
let newDigits = [
Math.floor(displayHours/10),
displayHours%10,
Math.floor(minutes/10),
minutes%10
];
newDigits = [1, 2, 5, 7];
let dateString;
if (settings.dateReverse) {
dateString = month+"/"+day;
} else {
dateString = day+"/"+month;
}
digits.setSmallDigits('date', dateString, true);
digits.setDigits([newDigits[0], newDigits[1], newDigits[2], newDigits[3]], settings.colors);
}
hrm.onreading = () => {
if (display.on) {
let heartRate = (hrm.heartRate || null);
digits.setSmallDigits('hr', heartRate, false);
}
clearTimeout(hrTimer);
hrTimer = setTimeout(() => {
digits.setSmallDigits('hr', null, false);
}, 5000);
hrm.stop();
}
function updateSteps() {
if (display.on) {
let steps = (today.adjusted.steps || null);
digits.setSmallDigits('steps', steps, true);
}
}
function updateHealthDisplay() {
hrm.start();
updateSteps();
}
clock.granularity = "minutes";
clock.ontick = () => updateClock();
setInterval(() => {
updateHealthDisplay();
}, 2000);
updateHealthDisplay();
messaging.peerSocket.onmessage = e => {
console.log("Message received -> "+e.data.key+": "+e.data.newValue);
display.poke();
vibration.start("bump");
switch (e.data.key) {
case 'hrcolor':
settings.colors[0] = e.data.newValue;
break;
case 'mincolor':
settings.colors[1] = e.data.newValue;
break;
case 'date':
settings.dateReverse = e.data.newValue;
break;
};
updateClock();
fs.writeFileSync("settings.txt", settings, "cbor");
}
messaging.peerSocket.onopen = () => {
console.log("Clockface opened socket");
};
messaging.peerSocket.close = () => {
console.log("Clockface closed socket");
};
messaging.peerSocket.onerror = (err) => {
console.log("Clockface socket error: " + err.code + " - " + err.message);
}