diff --git a/apps.json b/apps.json index 116f1488d..3207f8ab0 100644 --- a/apps.json +++ b/apps.json @@ -2395,5 +2395,17 @@ "storage": [ {"name":"gpstimeserver.wid.js","url":"widget.js"} ] +}, +{ "id": "tilthydro", + "name": "Tilt Hydrometer Display", + "shortName":"Tilt Hydro", + "icon": "app.png", + "version":"0.01", + "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)", + "tags": "tools,bluetooth", + "storage": [ + {"name":"tilthydro.app.js","url":"app.js"}, + {"name":"tilthydro.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/tilthydro/ChangeLog b/apps/tilthydro/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/tilthydro/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/tilthydro/app-icon.js b/apps/tilthydro/app-icon.js new file mode 100644 index 000000000..86fd7d388 --- /dev/null +++ b/apps/tilthydro/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwggNKgtQESUF5gAEDR8M5nFAwdVAwoWJBxFcDBZEBBZNc4ALJCxQMCMZAiLHgRJHBBBsHGAwHHABAnGFxwoHhhdMLAgRErj8RT4hGQJApGTJAaNQrnMIIJDCLx0F5gACCgZeNhgWDCQMMBIJeNC4ZcEVYpCFrgLBC4wVBRxQTBBYMFqAFBLIQXCRw/MCIp4DAoQXBFhIRFEAIFD4oXECIIfBIgQXHIQQXEZIIXDIgIREBoRyCC4TJE4pEDCIgXIZIpEDJYafBAoYXDIoQ/DAgRLCFgQXGBoNVHIgREHQhkDa4ghEVArtEC4bZBCQZfCSAvFcwoVCC4QnBfQaQDFgokCDwL7DaAjVFC4xvCcQ7UEAAwUCeApAHAAxvDSA4AKRgYbEIRR2GMAoAOCQhIDABpGEJAhGSGoRdOFA8FGBxYIGBsFe5AJJEp0MJJVcKpYMJrg7MBwQ9EKIK0PCIIAEZaAZCqtVS5QA==")) diff --git a/apps/tilthydro/app.js b/apps/tilthydro/app.js new file mode 100644 index 000000000..b64fa4573 --- /dev/null +++ b/apps/tilthydro/app.js @@ -0,0 +1,87 @@ + +function displayInfo(reading) { + g.reset(1).setColor(1,0,0); + g.clearRect(0,24,g.getWidth(),g.getHeight()-48); + g.drawImage(require("heatshrink").decompress(atob("o1GgQIFgOr///0oZLg4PBAAP+oAQJjf/yolBtf/yAQIj/5AocGCJMf+hKF3+AGQ4QFCIRHGg/4DI0B/wHFgRDEBIn9A4u+QJI9Fl6DJhfQApIAFDgkCMwwAE3oEILA4dDj7IKIAPAAYMDIhQABnwDC3AQLgI0CPBQ0FGZsAlwzOGgZnMgO8heAgXgCBUG//QnsAAIIAJr///wgBg+AGJO////+EfgDPJgIPBEQIPBCQIAIn4QB/tAheBKxFAgQQCAwN8loPGgr7Bj4RBDwMD4atGD4PggP+t//BAMtngQFqEvKIMFLAJkBgPnPIu/BgPwAoMP/4NBj94CAgOBBgLIC3/8AYP7aAcUBwW//AHBg//4AmB2gQCt/QDYIMDRoJ6CEQS3B/wOB6AMDNoQiDBoJDBBwIMDRoQiDQAIABBwQMDPQYiBl4QCBwYMCgh6D/dCCARJBBwIMCjfQv56BEQLHEBwW//uv/0DNoX3wAiCSwZdCLwMvyAbBvELyI/CPQYRCoKHC+6gCJgU//xrBAAIZBAAMenrHEcIRNCGIKgC6XQGAaWCoH//1Qdoc9jzHC/z1C/EL/L+Eg/B+DHCAYMLOYNkCAkAvEPLYIwCgCWCAAoPB3AwCMAMD/oUBAAkB+EHPQIwBPQMZEI0AlwBCGBIACgfQEgIEBPQQAIIYMLGAMvOgoAEj5NBvpKB8gQJgXgAQI0BABYfBPgI0BABSaCCgYzMAYL7DABG9AYULTwJnMAAN+CBUHSon4CBMBBYkHPZQuFj6+Jl6GFAwwbK35dDAAcLZI0B/wRGg5hHgQRGhf9Hg8G/+QAwcbCBAjB//lHQVv/KUK3//1Wv/4QKAANr/4ABygKFA==")),24,24); + g.setColor(-1).setFont("6x8",2); + + if (reading=="startup") { + g.setFontAlign(0,0); + g.drawString("Scanning...", g.getWidth()/2, g.getHeight()*2/3); + } else if (!reading) { + g.setFontAlign(0,0); + g.drawString("No Tilt found", g.getWidth()/2, g.getHeight()*2/3); + } else { + g.drawString("Temperature",0,100); + g.drawString("Gravity",0,160); + g.setFontAlign(0,0); + g.drawString(reading.color, g.getWidth()*3/4, 24+40); + g.setFontVector(34); + g.setFontAlign(0,-1); + g.drawString(reading.F.toFixed(1),g.getWidth()/2,120); + g.drawString(reading.gravity,g.getWidth()/2,180); + } + g.flip(); +} + +function arrayBufferToHex (arrayBuffer){ + return (new Uint8Array(arrayBuffer)).slice().map(x=>(256+x).toString(16).substr(-2)).join(""); +} + +var TILT_DEVICES = { + 'a495bb30c5b14b44b5121370f02d74de': 'Black', + 'a495bb60c5b14b44b5121370f02d74de': 'Blue', + 'a495bb20c5b14b44b5121370f02d74de': 'Green', + 'a495bb50c5b14b44b5121370f02d74de': 'Orange', + 'a495bb80c5b14b44b5121370f02d74de': 'Pink', + 'a495bb40c5b14b44b5121370f02d74de': 'Purple', + 'a495bb10c5b14b44b5121370f02d74de': 'Red', + 'a495bb70c5b14b44b5121370f02d74de': 'Yellow', +}; + +var failures = 0; + +function takeReading() { + // scan for 5 seconds max + NRF.setScan(function(device) { + d = new DataView(device.manufacturerData); + if (d.getUint8(4) == 0xbb) { + var hexData = arrayBufferToHex(device.manufacturerData); + var tempF = d.getUint16(18); + var tempC = ( tempF - 32) * 5 / 9; + var gravity = d.getUint16(20) / 1000.0; + var color = TILT_DEVICES[hexData.substr(4,32)]; + readings= { + C:tempC, + F:tempF, + gravity:gravity, + d:device.manufacturerData, + color: color, + }; + failures=0; + NRF.setScan(); + if (notFoundTimeout) clearTimeout(notFoundTimeout); + notFoundTimeout = undefined; + displayInfo(readings); + } + }, { filters: [{ manufacturerData: { 0x004C: {} } }]}); + // stop scanning after 5 seconds + var notFoundTimeout = setTimeout(function() { + NRF.setScan(); + notFoundTimeout = undefined; + failures++; + if (failures>5) displayInfo(); + }, 5000); +} + +Bangle.loadWidgets(); +Bangle.drawWidgets(); + + +// Scan every minute +setInterval(function() { + takeReading(); +}, 60*1000); +// Scan once at boot/upload +displayInfo("startup"); +takeReading(); diff --git a/apps/tilthydro/app.png b/apps/tilthydro/app.png new file mode 100644 index 000000000..c4a4e3243 Binary files /dev/null and b/apps/tilthydro/app.png differ