diff --git a/apps.json b/apps.json index acfe363728..23cac7942d 100644 --- a/apps.json +++ b/apps.json @@ -264,6 +264,18 @@ {"name":"*hrm","url":"heartrate-icon.js","evaluate":true} ] }, + { "id": "stetho", + "name": "Stethoscope", + "icon": "stetho.png", + "version":"0.0198", + "description": "Hear your heart rate", + "tags": "health", + "storage": [ + {"name":"+stetho","url":"stetho.json"}, + {"name":"-stetho","url":"stetho.js"}, + {"name":"*stetho","url":"stetho-icon.js","evaluate":true} + ] + }, { "id": "swatch", "name": "Stopwatch", "icon": "stopwatch.png", diff --git a/apps/stetho/stetho-icon.js b/apps/stetho/stetho-icon.js new file mode 100644 index 0000000000..6057036c44 --- /dev/null +++ b/apps/stetho/stetho-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+64A/AAOzxNknVl1oLHnVexOzFrtlnU6i06Eg2JrwMBGAIxaLgYuBF5IMBAARiaKAYhK1pfDAAWJFy2tLoNkxOtQAJQIBYWtAYIwBZ4xeQFwR7RMoJgW2brBsqqTMAQvVRwLaUMARftrAvVX4bZTwdYwYvWryQTRwRFTSAZgBDSOtwdeLyxKDMCITBwReR2ez1oCBMAZ7QLwK9SE4NlsmJxIpCVYRgO1uCUSVlnQACFIIYBMCC9T2dkFwYACLQROCM4ZeKXqOJnUWAAItBmhhBMAggLLwOCXqKNBFoYACMAiABMBOtLyfXrwuGF4iBMLwWnFyAvBFwwvGcIQwGLwQKHX5ouFmiJBF4RgKLyoWBL47vCcYwIF05eU6+zxKRBLwodFGAgACFwLsSEAgwDrwuHWwYwBwenGoKNBF6owDrAuIGAYrCvgzBFy7jDryqLGAV8viTCFy7CBwZeBIB1804tYAAQvQSIJdZF6l8F9unF/4vPwYvtwQv/04vc1ovBD5gvv0+h0/RF7uCF5fR0+gF7vRwd8EBaOB0KOcEIV8SBReBRzxRDMBReC04udMAYwIL0QkDGAWt6IAC07sfGA+gE4IAD0JdBF8YwEAAhmCF0TnEFoS7iAE4=")) \ No newline at end of file diff --git a/apps/stetho/stetho.js b/apps/stetho/stetho.js new file mode 100644 index 0000000000..ec0916f4e9 --- /dev/null +++ b/apps/stetho/stetho.js @@ -0,0 +1,82 @@ +// a variation on the hrm app +Bangle.setLCDPower(1); +Bangle.setLCDTimeout(0); +Bangle.ioWr(0x80,0) +x=0; +var min=0,max=0; +var wasHigh = 0, wasLow = 0; +var lastHigh = getTime(); +var hrmList = []; +var hrm; +var SPEAKER_PIN = D18; + +function freq(f) { + console.log("frequency: ", f); + if (f===0) digitalWrite(SPEAKER_PIN, 0); + else analogWrite(SPEAKER_PIN, 0.5, {freq: f}); +} + +function readHRM() { + var a = analogRead(D29); + var h = getTime(); + min=Math.min(min*0.97+a*0.03,a); + max=Math.max(max*0.97+a*0.03,a); + y = E.clip(170 - (a*960*4),100,230); + if (x==0) { + g.clearRect(0,100,239,239); + g.moveTo(-100,0); + } + let frequency = parseFloat((170 - (a*960*4)) + 500); + if(frequency > 0) freq(frequency); + + g.setColor(1,1,1); + g.lineTo(x,y); + if ((max-min)>0.005) { + if (4*a > (min+3*max)) { // high + g.setColor(1,0,0); + g.fillRect(x,230,x,239); + g.setColor(1,1,1); + if (!wasHigh && wasLow) { + var currentHrm = 60/(h-lastHigh); + lastHigh = h; + if (currentHrm<250) { + while (hrmList.length>12) hrmList.shift(); + hrmList.push(currentHrm); + // median filter + var t = hrmList.slice(); // copy + t.sort(); + // average the middle 3 + var mid = t.length>>1; + if (mid+2239)x=0; +} + +setInterval(readHRM,50); diff --git a/apps/stetho/stetho.json b/apps/stetho/stetho.json new file mode 100644 index 0000000000..239fffb684 --- /dev/null +++ b/apps/stetho/stetho.json @@ -0,0 +1,5 @@ +{ + "name":"Stethoscope","type":"app", + "icon":"*stetho", + "src":"-stetho" +} diff --git a/apps/stetho/stetho.png b/apps/stetho/stetho.png new file mode 100644 index 0000000000..c0f183d963 Binary files /dev/null and b/apps/stetho/stetho.png differ