Display temperature and LCD state in chart
parent
eebc494704
commit
900b820474
|
|
@ -1148,9 +1148,9 @@
|
|||
},
|
||||
{ "id": "batchart",
|
||||
"name": "Battery Chart",
|
||||
"shortName":"BatChart",
|
||||
"shortName":"Battery Chart",
|
||||
"icon": "app.png",
|
||||
"version":"0.03",
|
||||
"version":"0.04",
|
||||
"description": "A widget and an app for recording and visualizing battery percentage over time.",
|
||||
"tags": "app,widget,battery,time,record,chart,tool",
|
||||
"storage": [
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
0.01: New app and widget
|
||||
0.02: Widget stores data to file (1 dataset/10min)
|
||||
0.03: Rotate log files once a week.
|
||||
0.04: Display temperature and LCD state in chart
|
||||
|
|
|
|||
|
|
@ -1,17 +1,26 @@
|
|||
const GraphXZero = 40;
|
||||
const GraphYZero = 180;
|
||||
const GraphY100 = 80;
|
||||
|
||||
const GraphMarkerOffset = 5;
|
||||
const MaxValueCount = 144;
|
||||
const GraphXMax = GraphXZero + MaxValueCount;
|
||||
|
||||
const GraphLcdY = GraphYZero + 10;
|
||||
// const GraphCompassY = GraphYZero + 16;
|
||||
// const GraphBluetoothY = GraphYZero + 22;
|
||||
// const GraphGpsY = GraphYZero + 28;
|
||||
// const GraphHrmY = GraphYZero + 34;
|
||||
|
||||
var Storage = require("Storage");
|
||||
|
||||
function renderCoordinateSystem() {
|
||||
g.setFont("6x8", 1);
|
||||
g.drawString("t", GraphXMax + GraphMarkerOffset, GraphYZero - GraphMarkerOffset);
|
||||
g.drawLine(GraphXZero, GraphYZero + GraphMarkerOffset, GraphXZero, GraphY100);
|
||||
|
||||
g.drawString("%", 39, 70);
|
||||
// Left Y axis (Battery)
|
||||
g.setColor(1, 1, 0);
|
||||
g.drawLine(GraphXZero, GraphYZero + GraphMarkerOffset, GraphXZero, GraphY100);
|
||||
g.drawString("%", 39, GraphY100 - 10);
|
||||
|
||||
g.setFontAlign(1, -1, 0);
|
||||
g.drawString("100", 30, GraphY100 - GraphMarkerOffset);
|
||||
|
|
@ -21,29 +30,47 @@ function renderCoordinateSystem() {
|
|||
g.drawLine(GraphXZero - GraphMarkerOffset, 130, GraphXZero, 130);
|
||||
|
||||
g.drawString("0", 30, GraphYZero - GraphMarkerOffset);
|
||||
g.drawLine(GraphXZero - GraphMarkerOffset, GraphYZero, GraphXMax, GraphYZero);
|
||||
|
||||
g.setColor(1,1,1);
|
||||
g.setFontAlign(1, -1, 0);
|
||||
g.drawLine(GraphXZero - GraphMarkerOffset, GraphYZero, GraphXMax + GraphMarkerOffset, GraphYZero);
|
||||
|
||||
// Right Y axis (Temperature)
|
||||
g.setColor(0.4, 0.4, 1);
|
||||
g.drawLine(GraphXMax, GraphYZero + GraphMarkerOffset, GraphXMax, GraphY100);
|
||||
g.drawString("°C", GraphXMax + GraphMarkerOffset, GraphY100 - 10);
|
||||
g.setFontAlign(-1, -1, 0);
|
||||
g.drawString("20", GraphXMax + 2 * GraphMarkerOffset, GraphYZero - GraphMarkerOffset);
|
||||
|
||||
g.drawLine(GraphXMax + GraphMarkerOffset, 130, GraphXMax, 130);
|
||||
g.drawString("30", GraphXMax + 2 * GraphMarkerOffset, GraphYZero - 50 - GraphMarkerOffset);
|
||||
|
||||
g.drawLine(GraphXMax + GraphMarkerOffset, 80, GraphXMax, 80);
|
||||
g.drawString("40", GraphXMax + 2 * GraphMarkerOffset, GraphY100 - GraphMarkerOffset);
|
||||
|
||||
g.setColor(1,1,1);
|
||||
}
|
||||
|
||||
function decrementDay(dayToDecrement) {
|
||||
return dayToDecrement === 0 ? 6 : dayToDecrement-1;
|
||||
}
|
||||
|
||||
function loadData() {
|
||||
const MaxValueCount = 144;
|
||||
const startingDay = new Date().getDay();
|
||||
|
||||
// Load data for the current day
|
||||
var logFileName = "bclog" + startingDay;
|
||||
let logFileName = "bclog" + startingDay;
|
||||
|
||||
var dataLines = loadLinesFromFile(MaxValueCount, logFileName);
|
||||
let dataLines = loadLinesFromFile(MaxValueCount, logFileName);
|
||||
|
||||
// Top up to MaxValueCount from previous days as required
|
||||
var previousDay = decrementDay(startingDay);
|
||||
let previousDay = decrementDay(startingDay);
|
||||
while (dataLines.length < MaxValueCount
|
||||
&& previousDay !== startingDay) {
|
||||
|
||||
var topUpLogFileName = "bclog" + previousDay;
|
||||
var remainingLines = MaxValueCount - dataLines.length;
|
||||
var topUpLines = loadLinesFromFile(remainingLines, topUpLogFileName);
|
||||
let topUpLogFileName = "bclog" + previousDay;
|
||||
let remainingLines = MaxValueCount - dataLines.length;
|
||||
let topUpLines = loadLinesFromFile(remainingLines, topUpLogFileName);
|
||||
dataLines = topUpLines.concat(dataLines);
|
||||
|
||||
previousDay = decrementDay(previousDay);
|
||||
|
|
@ -53,8 +80,8 @@ function loadData() {
|
|||
}
|
||||
|
||||
function loadLinesFromFile(requestedLineCount, fileName) {
|
||||
var allLines = [];
|
||||
var returnLines = [];
|
||||
let allLines = [];
|
||||
let returnLines = [];
|
||||
|
||||
var readFile = Storage.open(fileName, "r");
|
||||
|
||||
|
|
@ -63,11 +90,13 @@ function loadLinesFromFile(requestedLineCount, fileName) {
|
|||
allLines.push(nextLine);
|
||||
}
|
||||
}
|
||||
|
||||
readFile = null;
|
||||
|
||||
if (allLines.length <= 0) return;
|
||||
|
||||
linesToReadCount = Math.min(requestedLineCount, allLines.length);
|
||||
startingLineIndex = Math.max(0, allLines.length - requestedLineCount - 1);
|
||||
let linesToReadCount = Math.min(requestedLineCount, allLines.length);
|
||||
let startingLineIndex = Math.max(0, allLines.length - requestedLineCount - 1);
|
||||
|
||||
for (let i = startingLineIndex; i < linesToReadCount + startingLineIndex; i++) {
|
||||
if(allLines[i]) {
|
||||
|
|
@ -81,20 +110,86 @@ function loadLinesFromFile(requestedLineCount, fileName) {
|
|||
}
|
||||
|
||||
function renderData(dataArray) {
|
||||
g.setColor(1, 1, 0);
|
||||
const switchableConsumers = {
|
||||
none: 0,
|
||||
lcd: 1,
|
||||
compass: 2,
|
||||
bluetooth: 4,
|
||||
gps: 8,
|
||||
hrm: 16
|
||||
};
|
||||
|
||||
//const timestampIndex = 0;
|
||||
const batteryIndex = 1;
|
||||
const temperatureIndex = 2;
|
||||
const switchabelsIndex = 3;
|
||||
|
||||
var allConsumers = switchableConsumers.none | switchableConsumers.lcd | switchableConsumers.compass | switchableConsumers.bluetooth | switchableConsumers.gps | switchableConsumers.hrm;
|
||||
|
||||
for (let i = 0; i < dataArray.length; i++) {
|
||||
const element = dataArray[i];
|
||||
|
||||
var dataInfo = element.split(",");
|
||||
var batteryPercentage = parseInt(dataInfo[1]);
|
||||
|
||||
g.setPixel(GraphXZero + i, GraphYZero - batteryPercentage);
|
||||
// Battery percentage
|
||||
g.setColor(1, 1, 0);
|
||||
g.setPixel(GraphXZero + i, GraphYZero - parseInt(dataInfo[batteryIndex]));
|
||||
|
||||
// Temperature
|
||||
g.setColor(0.4, 0.4, 1);
|
||||
let scaledTemp = Math.floor(((parseFloat(dataInfo[temperatureIndex]) * 100) - 2000)/20) + ((((parseFloat(dataInfo[temperatureIndex]) * 100) - 2000) % 100)/25);
|
||||
|
||||
g.setPixel(GraphXZero + i, GraphYZero - scaledTemp);
|
||||
|
||||
// LCD state
|
||||
if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.lcd == switchableConsumers.lcd) {
|
||||
g.setColor(1, 1, 1);
|
||||
g.setFontAlign(1, -1, 0);
|
||||
g.drawString("LCD", GraphXZero - GraphMarkerOffset, GraphLcdY - 2, true);
|
||||
g.drawLine(GraphXZero + i, GraphLcdY, GraphXZero + i, GraphLcdY + 1);
|
||||
}
|
||||
|
||||
// // Compass state
|
||||
// if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) {
|
||||
// g.setColor(0, 1, 0);
|
||||
// g.setFontAlign(-1, -1, 0);
|
||||
// g.drawString("Compass", GraphXMax + GraphMarkerOffset, GraphCompassY - 2, true);
|
||||
// g.drawLine(GraphXZero + i, GraphCompassY, GraphXZero + i, GraphCompassY + 1);
|
||||
// }
|
||||
|
||||
// // Bluetooth state
|
||||
// if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) {
|
||||
// g.setColor(0, 0, 1);
|
||||
// g.setFontAlign(1, -1, 0);
|
||||
// g.drawString("BLE", GraphXZero - GraphMarkerOffset, GraphBluetoothY - 2, true);
|
||||
// g.drawLine(GraphXZero + i, GraphBluetoothY, GraphXZero + i, GraphBluetoothY + 1);
|
||||
// }
|
||||
|
||||
// // Gps state
|
||||
// if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) {
|
||||
// g.setColor(0.8, 0.5, 0.24);
|
||||
// g.setFontAlign(-1, -1, 0);
|
||||
// g.drawString("GPS", GraphXMax + GraphMarkerOffset, GraphGpsY - 2, true);
|
||||
// g.drawLine(GraphXZero + i, GraphGpsY, GraphXZero + i, GraphGpsY + 1);
|
||||
// }
|
||||
|
||||
// // Hrm state
|
||||
// if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) {
|
||||
// g.setColor(1, 0, 0);
|
||||
// g.setFontAlign(1, -1, 0);
|
||||
// g.drawString("HRM", GraphXZero - GraphMarkerOffset, GraphHrmY - 2, true);
|
||||
// g.drawLine(GraphXZero + i, GraphHrmY, GraphXZero + i, GraphHrmY + 1);
|
||||
// }
|
||||
}
|
||||
|
||||
dataArray = null;
|
||||
}
|
||||
|
||||
function renderBatteryChart() {
|
||||
renderCoordinateSystem();
|
||||
var data = loadData();
|
||||
let data = loadData();
|
||||
renderData(data);
|
||||
data = null;
|
||||
}
|
||||
|
||||
// special function to handle display switch on
|
||||
|
|
@ -102,10 +197,10 @@ Bangle.on('lcdPower', (on) => {
|
|||
if (on) {
|
||||
// call your app function here
|
||||
// If you clear the screen, do Bangle.drawWidgets();
|
||||
//g.clear()
|
||||
g.clear()
|
||||
Bangle.loadWidgets();
|
||||
Bangle.drawWidgets();
|
||||
//renderBatteryChart();
|
||||
renderBatteryChart();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue