diff --git a/apps.json b/apps.json index 595603578..9200ade1e 100644 --- a/apps.json +++ b/apps.json @@ -4970,6 +4970,7 @@ "storage": [ {"name":"coretemp.boot.js","url":"boot.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.settings.js","url":"settings.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index a73c67b47..61eefd6c8 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,47 +1,100 @@ (function() { -var state = {gatt : null, primary : null, temp : null, data : null}; -// Would it be better to scan by uuid rather than name? -NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) - // NRF.requestDevice({timeout : 20000, filters : [ {services : - // '1809','2100'} ]}) - .then(function(device) { - return device.gatt.connect(); - }) - .then(function(g) { - state.gatt = g; - return state.gatt - .getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121') - .then(function(service) { - state.primary = service; - return state.primary.getCharacteristic( - '00002101-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(c) { - state.data = c; - state.data.on('characteristicvaluechanged', function(event) { - var dv = event.target.value; - var flags = dv.buffer[0]; - var unit, core = -1, skin = -1; +var device; +var gatt; +var service; +var characteristic; - if (flags & 8) { - unit = "F"; - } else { - unit = "C"; - } +class CoreSensor { + constructor() { + this.unit = ""; + this.core = -1; + this.skin = -1; + this.battery = 0; + } - if (flags & 1) - skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) - core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + updateSensor(event) { + if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { + var dv = event.target.value; + var flags = dv.buffer[0]; - Bangle.emit('CoreTemp', {core : core, skin : skin, unit : unit}); - }); - return c.startNotifications(); - }) - .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); - console.log(e); - }); - }); + if (flags & 8) { + this.unit = "F"; + } else { + this.unit = "C"; + } + + if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', + {core : this.core, skin : this.skin, unit : this.unit}); + } + } + + updateBatteryLevel(event) { + if (event.target.uuid == "0x2a19") + this.battery = event.target.value.getUint8(0); + } +} + +var mySensor = new CoreSensor(); + +function getSensorBatteryLevel(gatt) { + gatt.getPrimaryService("180f") + .then(function(s) { return s.getCharacteristic("2a19"); }) + .then(function(c) { + c.on('characteristicvaluechanged', + (event) => mySensor.updateBatteryLevel(event)); + return c.startNotifications(); + }); +} + +function connection_setup() { + E.showMessage("Scanning for CoreTemp sensor..."); + NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + .then(function(d) { + device = d; + E.showMessage("Found device"); + return device.gatt.connect(); + }) + .then(function(g) { + gatt = g; + return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(s) { + service = s; + return service.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + characteristic = c; + characteristic.on('characteristicvaluechanged', + (event) => mySensor.updateSensor(event)); + return characteristic.startNotifications(); + }) + .then(function() { + console.log("Done!"); +// getSensorBatteryLevel(gatt); + g.reset().clearRect(Bangle.appRect).flip(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); +} + +function connection_end() { + if (gatt != undefined) gatt.disconnect(); +} + +connection_setup(); + +E.on('kill', () => { connection_end(); }); + +// move into setup +NRF.on('disconnect', connection_setup); // restart if disconnected + +// Bangle.loadWidgets(); +// Bangle.drawWidgets(); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 1856057a4..086614ed9 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,4 +1,4 @@ - +// Simply listen for core events and show Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); @@ -23,3 +23,4 @@ Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); + diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js new file mode 100644 index 000000000..2c541f72c --- /dev/null +++ b/apps/coretemp/settings.js @@ -0,0 +1,40 @@ +// This file should contain exactly one function, which shows the app's settings +/** + * @param {function} back Use back() to return to settings menu + */ +(function(back) { + const SETTINGS_FILE = 'coretemp.json' + // initialize with default settings... + let s = { + 'enabled': true, + } + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + const saved = storage.readJSON(SETTINGS_FILE, 1) || {} + for (const key in saved) { + s[key] = saved[key]; + } + // creates a function to safe a specific setting, e.g. save('color')(1) + function save(key) { + return function (value) { + s[key] = value; + storage.write(SETTINGS_FILE, s); + } + } + +const menu = { + '' : {'title' : 'CoreTemp sensor'}, + '< Back' : back, + 'Enabled' : { + value : !!settings.enabled, + format : v => v ? "Yes" : "No", + onchange : v => { + settings.enabled = v; + updateSettings(); + } + } +} + + E.showMenu(menu); +})