From 39cdf2e6157d83f0a92f4f8ba3b6ec2bc951c882 Mon Sep 17 00:00:00 2001 From: Francesco Bedussi Date: Sat, 5 Feb 2022 17:55:09 +0100 Subject: [PATCH] feat: add barometer --- apps/barometer/ChangeLog | 1 + apps/barometer/app-icon.js | 1 + apps/barometer/app.js | 120 ++++++++++++++++++++++++++++++++++ apps/barometer/barometer.png | Bin 0 -> 887 bytes apps/barometer/metadata.json | 15 +++++ apps/barometer/screenshot.png | Bin 0 -> 3154 bytes 6 files changed, 137 insertions(+) create mode 100644 apps/barometer/ChangeLog create mode 100644 apps/barometer/app-icon.js create mode 100644 apps/barometer/app.js create mode 100644 apps/barometer/barometer.png create mode 100644 apps/barometer/metadata.json create mode 100644 apps/barometer/screenshot.png diff --git a/apps/barometer/ChangeLog b/apps/barometer/ChangeLog new file mode 100644 index 000000000..06ff68298 --- /dev/null +++ b/apps/barometer/ChangeLog @@ -0,0 +1 @@ +0.01: Display pressure as number and hand diff --git a/apps/barometer/app-icon.js b/apps/barometer/app-icon.js new file mode 100644 index 000000000..7caf53348 --- /dev/null +++ b/apps/barometer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH4AVmczmALI7oWJgYXBmYLHhvd6AuKGBHdAAYXLDAwXRJIvd73u9oXSLoPuAAJhHOwYYGIYIXDGAwWGMIYvMC5QwBC4ZeMC4x3KL44XEU6KQEC5gAMCqoXZAH4AchAXWxAXWwBGWC62IC6sILywXXxAXUhWqzAXTCwIABOyYXD0AXSCwQABC/4XaO68JC6wYCCygA/AH4AGA")) diff --git a/apps/barometer/app.js b/apps/barometer/app.js new file mode 100644 index 000000000..61c0edce4 --- /dev/null +++ b/apps/barometer/app.js @@ -0,0 +1,120 @@ +const center = { + x: g.getWidth()/2, + y: g.getHeight()/2, +}; + +const MIN = 940; +const MAX = 1090; +const NUMBER_OF_VALUES = MAX - MIN; +const SCALE_TICK_STEP = 5; +const SCALE_VALUES_STEP = 25; +const NUMBER_OF_LABELS = NUMBER_OF_VALUES / SCALE_VALUES_STEP; +const NUMBER_OF_TICKS = NUMBER_OF_VALUES / SCALE_TICK_STEP; +const ZERO_OFFSET = (Math.PI / 4) * 3; +const SCALE_SPAN = (Math.PI / 2) * 3; +const TICK_LENGTH = 10; +const HAND_LENGTH = 45; +const HAND_WIDTH = 5; + +function generatePoly(radius, width, angle){ + const x = center.x + Math.cos(angle) * radius; + const y = center.y + Math.sin(angle) * radius; + const d = { + x: width/2 * Math.cos(angle + Math.PI/2), + y: width/2 * Math.sin(angle + Math.PI/2), + }; + + const poly = [center.x - d.x, center.y - d.y, center.x + d.x, center.y + d.y, x + d.x, y + d.y, x - d.x, y - d.y]; + + return poly; +} + +function drawHand(value){ + g.setColor(256, 0, 0); + + g.setFontAlign(0,0); + g.setFont("Vector",15); + g.drawString(value, center.x, center.y * 2 - 15, true); + + const angle = SCALE_SPAN / NUMBER_OF_VALUES * (value - MIN) + ZERO_OFFSET; + g.fillPoly(generatePoly(HAND_LENGTH, HAND_WIDTH, angle), true); + g.fillCircle(center.x ,center.y, 4); +} + + +function drawTicks(){ + g.setColor(1,1,1); + for(let i= 0; i <= NUMBER_OF_TICKS; i++){ + const angle = (i * (SCALE_SPAN/NUMBER_OF_TICKS)) + ZERO_OFFSET; + + const tickWidth = i%5==0 ? 5 : 2; + g.fillPoly(generatePoly(center.x, tickWidth, angle), true); + } + + g.setColor(0,0,0); + g.fillCircle(center.x,center.y,center.x - TICK_LENGTH); +} + + +function drawScaleLabels(){ + g.setColor(1,1,1); + g.setFont("Vector",12); + + let label = MIN; + for (let i=0;i <= NUMBER_OF_LABELS; i++){ + const angle = (i * (SCALE_SPAN/NUMBER_OF_LABELS)) + ZERO_OFFSET; + const labelDimensions = g.stringMetrics(label); + + const LABEL_PADDING = 5; + const radius = center.x - TICK_LENGTH - LABEL_PADDING; + const x = center.x + Math.cos(angle) * radius; + const y = center.y + Math.sin(angle) * radius; + + const visualX = x > center.x ? x - labelDimensions.width : x + labelDimensions.width > center.x ? x - (labelDimensions.width / 2) : x; + const visualY = y >= center.y - labelDimensions.height / 2 ? y - labelDimensions.height / 2 : y; + + g.drawString(label, visualX, visualY); + + label += SCALE_VALUES_STEP; + } +} + +function drawIcons() { + const sunIcon = { + width : 24, height : 24, bpp : 4, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAkP+ALeA40PAYf/BYv/CYYLBBwIICCQ4ACHI4ICEIgkEAg48GDApcFAoYPBBY5NDBZIjLHZpTLNZiDKTZSzMZZT7iA=")) + }; + g.drawImage(sunIcon, center.x + 15, center.y - 12); + + const sunRainIcon = { + width : 24, height : 24, bpp : 4, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AB/wBbEPBAoGEDI/wh4jJBQIMJEgUP///IpAJCBgf/+ALCAQRJFAoIHECgI7FIYwSEHAoGBEQwsEDIJdHCYYLLFwwTEQQwGFQQQACYpYpLf0AAEA")) + }; + g.drawImage(sunRainIcon, center.x - 12, 30); + + const rainIcon = { + width : 24, height : 24, bpp : 4, + transparent : 0, + buffer : require("heatshrink").decompress(atob("ADnwBRP/AIQAGh4ZKA4YLLh//EwoTFh4GCCIIfGDAQ5DIQ5bIBbQvII4gAGWLwzBOoarLCw4RKLBAAgA")) + }; + g.drawImage(rainIcon, center.x - 44, center.y - 12); +} + +g.setBgColor(0,0,0); +g.clear(); + +drawTicks(); +drawScaleLabels(); +drawIcons(); + +try { + Bangle.getPressure().then(data => { + drawHand(Math.round(data.pressure)); + }); +} catch(e) { + print(e.message); + print("barometer not supporter, show a demo value"); + drawHand(MIN); +} diff --git a/apps/barometer/barometer.png b/apps/barometer/barometer.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5cec6c8238ae8578be8c88baa1e461804f1e37 GIT binary patch literal 887 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 literal 0 HcmV?d00001