(() => { let recordingInterval = null; const Storage = require("Storage"); const switchableConsumers = { none: 0, lcd: 1, compass: 2, bluetooth: 4, gps: 8, hrm: 16 }; var batChartFile; // file for battery percentage recording const recordingInterval10Min = 60 * 10 * 1000; const recordingInterval1Min = 60 * 1000; //For testing const recordingInterval10S = 10 * 1000; //For testing var compassEventReceived = false; var gpsEventReceived = false; var hrmEventReceived = false; function draw() { // void } function batteryChartOnMag() { compassEventReceived = true; // Stop handling events when no longer necessarry Bangle.removeListener("mag", batteryChartOnMag); } function batterChartOnGps() { gpsEventReceived = true; Bangle.removeListener("GPS", batterChartOnGps); } function batteryChartOnHrm() { hrmEventReceived = true; Bangle.removeListener("HRM", batteryChartOnHrm); } function getEnabledConsumersValue() { // Wait for an event from each of the devices to see if they are switched on var enabledConsumers = switchableConsumers.none; Bangle.on('mag', batteryChartOnMag); Bangle.on('GPS', batterChartOnGps); Bangle.on('HRM', batteryChartOnHrm); // Wait two seconds, that should be enough for each of the events to get raised once setTimeout(() => { Bangle.removeListener('mag', batteryChartOnMag); Bangle.removeListener('GPS', batterChartOnGps); Bangle.removeListener('HRM', batteryChartOnHrm); }, 2000); if (Bangle.isLCDOn()) enabledConsumers = enabledConsumers | switchableConsumers.lcd; if (compassEventReceived) enabledConsumers = enabledConsumers | switchableConsumers.compass; if (gpsEventReceived) enabledConsumers = enabledConsumers | switchableConsumers.gps; if (hrmEventReceived) enabledConsumers = enabledConsumers | switchableConsumers.hrm; // Very coarse first approach to check if the BLE device is on. if (NRF.getSecurityStatus().connected) enabledConsumers = enabledConsumers | switchableConsumers.bluetooth; // Reset the event registration vars compassEventReceived = false; gpsEventReceived = false; hrmEventReceived = false; return enabledConsumers.toString(); } function logBatteryData() { const previousWriteLogName = "bcprvday"; const previousWriteDay = parseInt(Storage.open(previousWriteLogName, "r").readLine()); const currentWriteDay = new Date().getDay(); const logFileName = "bclog" + currentWriteDay; // Change log target on day change if (!isNaN(previousWriteDay) && previousWriteDay != currentWriteDay) { //Remove a log file containing data from a week ago Storage.open(logFileName, "r").erase(); Storage.open(previousWriteLogName, "w").write(parseInt(currentWriteDay)); } var bcLogFileA = Storage.open(logFileName, "a"); if (bcLogFileA) { let logTime = getTime().toFixed(0); let logPercent = E.getBattery(); let logTemperature = E.getTemperature(); let logConsumers = getEnabledConsumersValue(); let logString = [logTime, logPercent, logTemperature, logConsumers].join(","); bcLogFileA.write(logString + "\n"); } } function reload() { console.log("Reloading BatteryChart widget"); WIDGETS["batchart"].width = 0; if (recordingInterval) { clearInterval(recordingInterval); recordingInterval = null; } recordingInterval = setInterval(logBatteryData, recordingInterval10Min); } // add the widget WIDGETS["batchart"] = { area: "tl", width: 0, draw: draw, reload: reload }; reload(); })();