From b2d389d56ea81855f36a2c44b6e69fe6bec4fcac Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 11 Oct 2021 14:31:10 +0100 Subject: [PATCH 1/4] Widbatpc: added option to fillbar with level color, see README for screenshots --- apps.json | 2 +- apps/widbatpc/ChangeLog | 1 + apps/widbatpc/README.md | 10 +++++++++- apps/widbatpc/screenshot.jpg | Bin 15828 -> 0 bytes apps/widbatpc/settings.js | 6 ++++++ apps/widbatpc/widbatpc.full.jpg | Bin 0 -> 3299 bytes apps/widbatpc/widbatpc.part.jpg | Bin 0 -> 2623 bytes apps/widbatpc/widget.js | 7 ++++++- 8 files changed, 23 insertions(+), 3 deletions(-) delete mode 100644 apps/widbatpc/screenshot.jpg create mode 100644 apps/widbatpc/widbatpc.full.jpg create mode 100644 apps/widbatpc/widbatpc.part.jpg diff --git a/apps.json b/apps.json index 876b243ae..7cc5e67f7 100644 --- a/apps.json +++ b/apps.json @@ -653,7 +653,7 @@ "name": "Battery Level Widget (with percentage)", "shortName": "Battery Widget", "icon": "widget.png", - "version":"0.12", + "version":"0.13", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", "tags": "widget,battery,b2", "type":"widget", diff --git a/apps/widbatpc/ChangeLog b/apps/widbatpc/ChangeLog index 64482db71..09e4fabf4 100644 --- a/apps/widbatpc/ChangeLog +++ b/apps/widbatpc/ChangeLog @@ -9,3 +9,4 @@ 0.10: Add 'hide if charge greater than' 0.11: Don't overwrite existing settings on app update 0.12: Fixed for Bangle 2 +0.13: Fillbar setting added, see README diff --git a/apps/widbatpc/README.md b/apps/widbatpc/README.md index 6e8fd10cc..c75154f72 100644 --- a/apps/widbatpc/README.md +++ b/apps/widbatpc/README.md @@ -4,5 +4,13 @@ Show the current battery level and charging status in the top right of the clock Works with Bangle 1 and Bangle 2 -![](screenshot.jpg) +When the fillbar setting is on the level colour will fill the entire +bar. This makes for an easier to read dsiplay when the charge is +below 50%. + +![](widbatpc.full.jpg) + +When the fillbar setting is off the level colour will follow the battry percentage + +![](widbatpc.part.jpg) diff --git a/apps/widbatpc/screenshot.jpg b/apps/widbatpc/screenshot.jpg deleted file mode 100644 index 48f9893ecf124d426541f5fa7f455a938d2fa919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15828 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': { value: s.hideifmorethan||100, min: 10, diff --git a/apps/widbatpc/widbatpc.full.jpg b/apps/widbatpc/widbatpc.full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3df2184fe6ed9be0be2f694b973248dc4dd52db7 GIT binary patch literal 3299 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℘8zZgqbgH#U5d#VcX-f_+3i|nRrYs3)1ABD+)FjabVt5SHxbQ`d^PtHO_Hezc@i#ZjqqtJQYQAe-sc4wjybW+;G2lWuVV5kScZm!+4#?ibfxv zFjErTgX8s(;0@Lsmbo{ZpMnAzOHy34i$_1s|zP!gjEx5IN_x#kb z=a%QNn06el?R)LG`y*V-AD_G}ooC5aaT9!Urb!MmQ*57>$-G2Cf`T6cHuBC4{dQooJ!^5s3{*^dm>UTZFq1gZc literal 0 HcmV?d00001 diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index 223db5f70..caecf8ae4 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -80,7 +80,12 @@ var s = 39; var x = this.x, y = this.y; const l = E.getBattery(); - const xl = x+4+l*(s-12)/100 + let xl = x+4+l*(s-12)/100; + + // show bar full in the level color, as you cant see the color if the bar is too small + if (setting('fillbar')) + xl = x+4+100*(s-12)/100; + c = levelColor(l); if (Bangle.isCharging() && setting('charger')) { From c795b5e3c577fa37bb322ac4735a5df584968442 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 14 Oct 2021 16:22:49 +0100 Subject: [PATCH 2/4] Add menusmall for small menus on Bangle.js 2 Updated about with new images --- apps.json | 13 ++++- apps/about/ChangeLog | 1 + apps/about/app.js | 2 +- apps/menusmall/ChangeLog | 1 + apps/menusmall/app.png | Bin 0 -> 619 bytes apps/menusmall/boot.js | 121 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 apps/menusmall/ChangeLog create mode 100644 apps/menusmall/app.png create mode 100644 apps/menusmall/boot.js diff --git a/apps.json b/apps.json index c8e614625..c0923e50d 100644 --- a/apps.json +++ b/apps.json @@ -67,7 +67,7 @@ { "id": "about", "name": "About", "icon": "app.png", - "version":"0.08", + "version":"0.09", "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", "tags": "tool,system,b2", "allow_emulator":true, @@ -3572,5 +3572,16 @@ "data": [ {"name":"score.json"} ] +}, +{ "id": "menusmall", + "name": "Small Menus", + "icon": "app.png", + "version":"0.01", + "description": "Replace Bangle.js 2's menus with a version that contains smaller text", + "tags": "b2,bno1", + "type": "boot", + "storage": [ + {"name":"menusmall.boot.js","url":"boot.js"} + ] } ] diff --git a/apps/about/ChangeLog b/apps/about/ChangeLog index 62e8d0126..ccc80148c 100644 --- a/apps/about/ChangeLog +++ b/apps/about/ChangeLog @@ -6,3 +6,4 @@ 0.06: Actual pixels as of 12 Jun 2020 0.07: Pressing a button now exits immediately (fix #618) 0.08: Make about (mostly) work on non-240px screens +0.09: Actual Bangle.js 1 pixels as of 13 Oct 2021 diff --git a/apps/about/app.js b/apps/about/app.js index 43b45010b..28a292376 100644 --- a/apps/about/app.js +++ b/apps/about/app.js @@ -32,7 +32,7 @@ g.setFontAlign(0,-1); g.flip(); // Pixel chooser image -g.drawImage(require("heatshrink").decompress(atob("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")),0,y+8); +g.drawImage(require("heatshrink").decompress(atob("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")),0,y+8); g.drawString(NRF.getAddress(),g.getWidth()/2,g.getHeight()-8,true); g.flip(); diff --git a/apps/menusmall/ChangeLog b/apps/menusmall/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/menusmall/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/menusmall/app.png b/apps/menusmall/app.png new file mode 100644 index 0000000000000000000000000000000000000000..094ee447cd355a0a2fa4ba20b3708100d782a5de GIT binary patch literal 619 zcmV-x0+juUP)DL6JZd>pLf3wLK`SStkO#f5epGwg#H87L%>idD0m8ZY3QLK=9p8D0goOf zH@yf#+DIcF5`+@EX^|9di|Da}5;X}yySsV4ibyse6|=j~@3{NE!_33Z?92d!5JCtc zgb)%ygxi61E`J1|<WA%3s8cd0u&(V0t`|Ej=fw2`JW?%jMWKF zGFCDn`@Ppob=UaV2T%YCKmphadv+gCf9mRc(DwmRrT_(?0KVP_Tpz%9&H_vU3P1rU z00p1`6o3Ly0PX|04;X$HNaynMe|f*~{S(&TSD@g`UFZoRmbERjIMFrWZRi4?&0hT% zrnB0XS@c8^EML5W%K6CI8MIN*OZA7I+6O$jbWO~4n$h`gb85`sUw32SRg^ur50Hzo z89QXupdm71@E^4w_M)i1`RvI)K-3ydDa0)R-$uCJmWD|E8NBBjA!FM-RAlcC0DFjQ z4pil?v1uOoq7zhK?3WeUdoaY6`+9MAbL2i?Qn79(9zjFKCGQ{W<@!Be&H`FHye@t^ zulgLRYK?Bjx5JRw*|yY`hPJKNMidv&7&*>=uUw?btf?=eL=jNAz zZ1`cMwUUV&07?LaYRQ!Ha<3G)x!zfduQ^NcH4s9E;TMUolhx*FzTW@<002ovPDHLk FV1lfj3d#Tg literal 0 HcmV?d00001 diff --git a/apps/menusmall/boot.js b/apps/menusmall/boot.js new file mode 100644 index 000000000..968f8866c --- /dev/null +++ b/apps/menusmall/boot.js @@ -0,0 +1,121 @@ +;//not entirely sure why we need this - related to how bootupdate adds these to .boot0 +E.showMenu = function(items) { + g.clear(1).flip(); // clear screen if no menu supplied + Bangle.drawWidgets(); + if (!items) { + Bangle.setUI(); + return; + } + var w = g.getWidth(); + var h = g.getHeight(); + var menuItems = Object.keys(items); + var options = items[""]; + if (options) menuItems.splice(menuItems.indexOf(""),1); + if (!(options instanceof Object)) options = {}; + options.fontHeight=14; + options.x=0; + options.x2=w-1; + options.y=24; + options.y2=h-12; + if (options.selected === undefined) + options.selected = 0; + var x = 0|options.x; + var x2 = options.x2||(g.getWidth()-1); + var y = 0|options.y; + var y2 = options.y2||(g.getHeight()-1); + if (options.title) + y += 15; + var loc = require("locale"); + var l = { + lastIdx : 0, + draw : function(rowmin,rowmax) { + var rows = 0|Math.min((y2-y) / options.fontHeight,menuItems.length); + var idx = E.clip(options.selected-(rows>>1),0,menuItems.length-rows); + if (idx!=l.lastIdx) rowmin=undefined; // redraw all if we scrolled + l.lastIdx = idx; + var iy = y; + g.reset().setFontAlign(0,-1,0); + g.setFontCustom(atob("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"), 32, atob("AwIGCAgICAMFBQYIAwYDBwcFBgYHBgYGBgYDAwYHBgcHBgYGBgYGBgYEBgYGBgYGBgYGBgYGBggGBgYEBwQGBwQGBgYGBgYHBgYGBgYGBgYGBgYGBgYGBgYGBgQCBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHCAYGBgAGBgYGAAYGBQYABgMGBgQABgYHBgAGBgYGBgYGBgYGBgYGBgYEBAYGBgYGBgYGAAYGBgYGBgYHBgYGBgYGBgYGBgYGBgYGBwcGBgYGBgYABgYGBgYGBg=="), 15); + + if (rowmin===undefined && options.title) + g.drawString(options.title,(x+x2)/2,y-14).drawLine(x,y-2,x2,y-2). + setColor(g.theme.fg).setBgColor(g.theme.bg); + iy += 12; + g.setColor((idx>0)?g.theme.fg:g.theme.bg).fillPoly([72,iy,104,iy,88,iy-12]); + if (rowmin!==undefined) { + if (idxrowmax) { + rows = 1+rowmax-rowmin; + } + } + var less = idx>0; + while (rows--) { + var name = menuItems[idx]; + var item = items[name]; + var hl = (idx==options.selected && !l.selectEdit); + g.setColor(hl ? g.theme.bgH : g.theme.bg); + g.fillRect(x,iy,x2,iy+options.fontHeight-1); + g.setColor(hl ? g.theme.fgH : g.theme.fg); + g.setFontAlign(-1,-1); + g.drawString(loc.translate(name),x+1,iy+1); + if ("object" == typeof item) { + var xo = x2; + var v = item.value; + if (item.format) v=item.format(v); + v = loc.translate(""+v); + if (l.selectEdit && idx==options.selected) { + xo -= 24 + 1; + g.setColor(g.theme.bgH).fillRect(xo-(g.stringWidth(v)+4),iy,x2,iy+options.fontHeight-1); + g.setColor(g.theme.fgH).drawImage("\x0c\x05\x81\x00 \x07\x00\xF9\xF0\x0E\x00@",xo,iy+(options.fontHeight-10)/2,{scale:2}); + } + g.setFontAlign(1,-1); + g.drawString(v,xo-2,iy+1); + } + g.setColor(g.theme.fg); + iy += options.fontHeight; + idx++; + } + g.setFontAlign(-1,-1); + g.setColor((idxitem.max) item.value = item.max; + if (item.onchange) item.onchange(item.value); + l.draw(options.selected,options.selected); + } else { + var a=options.selected; + options.selected = (dir+options.selected)%menuItems.length; + if (options.selected<0) options.selected += menuItems.length; + l.draw(Math.min(a,options.selected), Math.max(a,options.selected)); + } + } + }; + l.draw(); + Bangle.setUI("updown",dir => { + if (dir) l.move(dir); + else l.select(); + }); + return l; +}; From 541dbb4a9b4fc95b4ae63f0db98067c14069c1e6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 14 Oct 2021 16:34:32 +0100 Subject: [PATCH 3/4] fix lint error --- apps/menusmall/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/menusmall/boot.js b/apps/menusmall/boot.js index 968f8866c..59e47b178 100644 --- a/apps/menusmall/boot.js +++ b/apps/menusmall/boot.js @@ -1,4 +1,4 @@ -;//not entirely sure why we need this - related to how bootupdate adds these to .boot0 +"";//not entirely sure why we need this - related to how bootupdate adds these to .boot0 E.showMenu = function(items) { g.clear(1).flip(); // clear screen if no menu supplied Bangle.drawWidgets(); From be34e2b00d7536535b1fb768b6d94a2d413ea3a3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 14 Oct 2021 17:14:10 +0100 Subject: [PATCH 4/4] new 'health' app for 2v11, improved bangle2 launcher --- apps.json | 19 +++++++++++-- apps/health/ChangeLog | 1 + apps/health/README.md | 38 +++++++++++++++++++++++++ apps/health/app-icon.js | 1 + apps/health/app.js | 60 +++++++++++++++++++++++++++++++++++++++ apps/health/app.png | Bin 0 -> 1104 bytes apps/health/boot.js | 38 +++++++++++++++++++++++++ apps/health/lib.js | 61 ++++++++++++++++++++++++++++++++++++++++ apps/launchb2/ChangeLog | 1 + apps/launchb2/app.js | 8 +++++- 10 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 apps/health/ChangeLog create mode 100644 apps/health/README.md create mode 100644 apps/health/app-icon.js create mode 100644 apps/health/app.js create mode 100644 apps/health/app.png create mode 100644 apps/health/boot.js create mode 100644 apps/health/lib.js diff --git a/apps.json b/apps.json index bebace661..439b7e1b2 100644 --- a/apps.json +++ b/apps.json @@ -13,6 +13,21 @@ ], "sortorder" : -10 }, + { "id": "health", + "name": "Health Tracking", + "tags": "tool,system,b2", + "icon": "app.png", + "version":"0.01", + "description": "Logs health data and provides an app to view it (BETA - requires firmware 2v11)", + "readme": "README.md", + "storage": [ + {"name":"health.app.js","url":"app.js"}, + {"name":"health.img","url":"app-icon.js","evaluate":true}, + {"name":"health.boot.js","url":"boot.js"}, + {"name":"health","url":"lib.js"} + ], + "sortorder" : -10 + }, { "id": "moonphase", "name": "Moonphase", "icon": "app.png", @@ -55,7 +70,7 @@ "name": "Launcher (Bangle.js 2)", "shortName":"Launcher", "icon": "app.png", - "version":"0.02", + "version":"0.03", "description": "This is needed by Bangle.js 2.0 to display a menu allowing you to choose your own applications. It will not work on Bangle.js 1.0.", "tags": "tool,system,launcher,b2,bno1", "type":"launch", @@ -3578,7 +3593,7 @@ "icon": "app.png", "version":"0.01", "description": "Replace Bangle.js 2's menus with a version that contains smaller text", - "tags": "b2,bno1", + "tags": "b2,bno1,system", "type": "boot", "storage": [ {"name":"menusmall.boot.js","url":"boot.js"} diff --git a/apps/health/ChangeLog b/apps/health/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/health/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/health/README.md b/apps/health/README.md new file mode 100644 index 000000000..0ba0d8228 --- /dev/null +++ b/apps/health/README.md @@ -0,0 +1,38 @@ +# Health Tracking + +Logs health data to a file every 10 minutes, and provides an app to view it + +**BETA - requires firmware 2v11** + +## Usage + +Once installed, health data is logged automatically. + +To view data, run the `Health` app from your watch. + +## Features + +Stores: + +* Heart rate (TODO) +* Step count +* Movement + +## Technical Info + +Once installed, the `health.boot.js` hooks onto the `Bangle.health` event and +writes data to a binary file (one per month). + +A library (that can be used with `require("health").readXYZ` can then be used +to grab historical health info. + +## TODO + +* **Extend file format to include combined data for each day (to make graphs faster)** +* `interface` page for desktop to allow data to be viewed and exported in common formats +* More features in app: + * Step counting goal (ensure pedometers use this) + * Calendar view showing steps per day + * Yearly view + * Heart rate 'zone' graph + * .. other diff --git a/apps/health/app-icon.js b/apps/health/app-icon.js new file mode 100644 index 000000000..d522d9a9a --- /dev/null +++ b/apps/health/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///8H5AYM7/5L/ACsBqtQAgMFqtABYcVqtVAgIDBqgLDAwITBDYNVrQiEAANQEQNVtWAFIYfCE4Xq0AuEAAdX1W0BZFe1XUHQgADvWrJogAE9WtBYl66ouD2oLEtQGBFwQQBBYgeBFwYjFA4QuCBYgfCFwYLCL4IICFwacCPwetEwYLCR4QJBFwbFCU4QhBFwbMDNAYuCHQQwFFwowFFwowFFwwwEFwzNGFwjxFFwowEFw7aFBQwwDFwwwEFwwwEFw4wDBRAwBFxAwCFxAwCFxIA/AB4A=")) diff --git a/apps/health/app.js b/apps/health/app.js new file mode 100644 index 000000000..cb8651f4c --- /dev/null +++ b/apps/health/app.js @@ -0,0 +1,60 @@ +function menuMain() { + E.showMenu({ + "":{title:"Health Tracking"}, + "< Back":()=>load(), + "Step Counting":()=>menuStepCount(), + "Movement":()=>menuMovement() + }); +} + +function menuStepCount() { + E.showMenu({ + "":{title:"Step Counting"}, + "per hour":()=>stepsPerHour() + }); +} + +function menuMovement() { + E.showMenu({ + "":{title:"Movement"}, + "per hour":()=>movementPerHour() + }); +} + +function stepsPerHour() { + E.showMessage("Loading..."); + var data = new Uint16Array(24); + require("health").readDay(new Date(), h=>data[h.hr]+=h.steps); + g.clear(1); + Bangle.drawWidgets(); + g.reset(); + require("graph").drawBar(g, data, { + y:24, + miny: 0, + axes : true, + gridx : 6, + gridy : 500 + }); + Bangle.setUI("updown", ()=>menuStepCount()); +} + +function movementPerHour() { + E.showMessage("Loading..."); + var data = new Uint16Array(24); + require("health").readDay(new Date(), h=>data[h.hr]+=h.movement); + g.clear(1); + Bangle.drawWidgets(); + g.reset(); + require("graph").drawLine(g, data, { + y:24, + miny: 0, + axes : true, + gridx : 6, + ylabel : null + }); + Bangle.setUI("updown", ()=>menuStepCount()); +} + +Bangle.loadWidgets(); +Bangle.drawWidgets(); +menuMain(); diff --git a/apps/health/app.png b/apps/health/app.png new file mode 100644 index 0000000000000000000000000000000000000000..04f1fee5ebd50c744102fb878364858506b59c45 GIT binary patch literal 1104 zcmV-W1h4yvP)#2db4d?e4wiEO{}^ znxDEUsRm+)+1QLLsuUckw)3U> zPr)796h!-RdDRu;Ze-1Ft{!>r_{rl1-COPpvlo9=x@2%-qGHcC0uPt<^*fEg!?7cS zeE!y}C^Jy@1Y)P#MBmi`T))!b4sK8;HiIUao_Ouyzkq?<{`) z^B0!SDlJr9X*-_`4^v79%3CP7GPQ8~oPKy1a|3I4Gh#v(?EW=f-CQ%Oe6BJ)370{+ z0gj{=A9_jo*oX<)O^lvgY@6Yu%jeSJ;h)lhBm;k>0_1k^*RSQ{Sxk(+z8F&bXPT?`*nK6m(FF=w@N6zwb>N;(5u)3Zpr z-uiXjxMGV8G;wAu>FK29I#*G&y&N|wvfVbp!__h-!j^*do-W>6BPTWjPqaPcJ(AVH zB*A_RtC~2i_s_IMrMYT7->;*h=^?MoY2|ODo$e8RiHoYHPkRzcs%7UnCAdHIl=nZ$ zhZuw&-Gccz)l{I`;Cr#45~-!Df|yLkv{unW(*O7KNNovjk^00I}0!qD^Ws(Kfgi_(I?B=})pU)nou- zr-h;oGPK{>>oeO`8AZ>8y!UJ2so4O;4vVl}784m$;@Ob%Uabr30th)Di=ITGp7kY) zc&;9J8rZ>*w?Xif#!N)fl92Omy$Kp>fzV?;o~G}=huRdeG~~V02t&g?9CAKXyNQTp zA?NKz>o?^PhMW%sFJxX2tqeKqno+x1w}{YV4H--XD?{EJ&8pip0}yh$uskK?rO@N` zX4Y(~0SGy(1uM!XqL)L?Yt62A-V{5nh#g|z>y-=5Q { + // ensure we write health info for *last* block + var d = new Date(Date.now() - 590000); + + const DB_RECORD_LEN = 4; + const DB_RECORDS_PER_HR = 6; + const DB_RECORDS_PER_DAY = DB_RECORDS_PER_HR*24; + const DB_RECORDS_PER_MONTH = DB_RECORDS_PER_DAY*31; + const DB_HEADER_LEN = 8; + const DB_FILE_LEN = DB_HEADER_LEN + DB_RECORDS_PER_MONTH*DB_RECORD_LEN; + + function getRecordFN(d) { + return "health-"+d.getFullYear()+"-"+d.getMonth()+".raw"; + } + function getRecordIdx(d) { + return (DB_RECORDS_PER_DAY*(d.getDate()-1)) + + (DB_RECORDS_PER_HR*d.getHours()) + + (0|(d.getMinutes()*DB_RECORDS_PER_HR/60)); + } + + var rec = getRecordIdx(d); + var fn = getRecordFN(d); + var f = require("Storage").read(fn); + if (f) { + var dt = f.substr(DB_HEADER_LEN+(rec*DB_RECORD_LEN), DB_RECORD_LEN); + if (dt!="\xFF\xFF\xFF\xFF") { + print("HEALTH ERR: Already written!"); + return; + } + } else { + require("Storage").write(fn, "HEALTH1\0", 0, DB_FILE_LEN); // header + } + var recordData = String.fromCharCode( + health.steps>>8,health.steps&255, // 16 bit steps + health.bpm, // 8 bit bpm + Math.min(health.movement / 8, 255)); // movement + require("Storage").write(fn, recordData, DB_HEADER_LEN+(rec*DB_RECORD_LEN), DB_FILE_LEN); +}); diff --git a/apps/health/lib.js b/apps/health/lib.js new file mode 100644 index 000000000..791c4ce22 --- /dev/null +++ b/apps/health/lib.js @@ -0,0 +1,61 @@ +const DB_RECORD_LEN = 4; +const DB_RECORDS_PER_HR = 6; +const DB_RECORDS_PER_DAY = DB_RECORDS_PER_HR*24; +const DB_RECORDS_PER_MONTH = DB_RECORDS_PER_DAY*31; +const DB_HEADER_LEN = 8; +const DB_FILE_LEN = DB_HEADER_LEN + DB_RECORDS_PER_MONTH*DB_RECORD_LEN; + +function getRecordFN(d) { + return "health-"+d.getFullYear()+"-"+d.getMonth()+".raw"; +} +function getRecordIdx(d) { + return (DB_RECORDS_PER_DAY*(d.getDate()-1)) + + (DB_RECORDS_PER_HR*d.getHours()) + + (0|(d.getMinutes()*DB_RECORDS_PER_HR/60)); +} + +// Read all records from the given month +exports.readAllRecords = function(d, cb) { + var rec = getRecordIdx(d); + var fn = getRecordFN(d); + var f = require("Storage").read(fn); + var idx = DB_HEADER_LEN; + for (var day=0;day<31;day++) { + for (var hr=0;hr<24;hr++) { + for (var m=0;m{ if (app.icon) app.icon = s.read(app.icon); // should just be a link to a memory area }); +if (g.wrapString) { // FIXME: check not needed after 2v11 + g.setFont(font); + apps.forEach(app=>app.name = g.wrapString(app.name, g.getWidth()-64).join("\n")); +} function drawApp(i) { var y = 24+i*APPH-menuScroll; var app = apps[i]; if (!app || y<-APPH || y>=g.getHeight()) return; - g.setFont("6x8",2).setFontAlign(-1,0).drawString(app.name,64,y+32); + g.setFont(font).setFontAlign(-1,0).drawString(app.name,64,y+32); if (app.icon) try {g.drawImage(app.icon,8,y+8);} catch(e){} }