From ee994e027fe21fd94041ec73bbe795787bfbacca Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:12:26 +0200 Subject: [PATCH] Version 0.02 of "Info" app including weather data --- apps/info/ChangeLog | 3 +- apps/info/info.app.js | 144 ++++++++++++++++++++++++------------- apps/info/metadata.json | 2 +- apps/info/screenshot_1.png | Bin 3552 -> 3399 bytes apps/info/screenshot_2.png | Bin 3334 -> 3825 bytes apps/info/screenshot_3.png | Bin 3455 -> 3620 bytes 6 files changed, 98 insertions(+), 51 deletions(-) diff --git a/apps/info/ChangeLog b/apps/info/ChangeLog index 07afedd21..400e7a119 100644 --- a/apps/info/ChangeLog +++ b/apps/info/ChangeLog @@ -1 +1,2 @@ -0.01: Release \ No newline at end of file +0.01: Release +0.02: Recfactoring and show weather data. \ No newline at end of file diff --git a/apps/info/info.app.js b/apps/info/info.app.js index c61a88045..9de80affc 100644 --- a/apps/info/info.app.js +++ b/apps/info/info.app.js @@ -1,27 +1,90 @@ -var s = require("Storage"); +const storage = require("Storage"); const locale = require('locale'); var ENV = process.env; var W = g.getWidth(), H = g.getHeight(); var screen = 0; -const maxScreen = 2; + + +var screens = [ + { + name: "General", + items: [ + {name: "Steps", fun: () => getSteps()}, + {name: "HRM", fun: () => getBpm()}, + {name: "", fun: () => ""}, + {name: "Temp.", fun: () => getWeatherTemp()}, + {name: "Humidity", fun: () => getWeatherHumidity()}, + {name: "Wind", fun: () => getWeatherWind()}, + ] + }, + { + name: "Hardware", + items: [ + {name: "Battery", fun: () => E.getBattery() + "%"}, + {name: "Charge?", fun: () => Bangle.isCharging() ? "Yes" : "No"}, + {name: "TempInt.", fun: () => locale.temp(parseInt(E.getTemperature()))}, + {name: "Bluetooth", fun: () => NRF.getSecurityStatus().connected ? "Conn" : "NoConn"}, + {name: "GPS", fun: () => Bangle.isGPSOn() ? "On" : "Off"}, + {name: "Compass", fun: () => Bangle.isCompassOn() ? "On" : "Off"}, + ] + }, + { + name: "Software", + items: [ + {name: "Firmw.", fun: () => ENV.VERSION}, + {name: "Boot.", fun: () => getVersion("boot.info")}, + {name: "Settings.", fun: () => getVersion("setting.info")}, + {name: "Storage.", fun: () => ""}, + {name: " Total", fun: () => ENV.STORAGE>>10}, + {name: " Free", fun: () => require("Storage").getFree()>>10}, + ] + } +]; + + +function getWeatherTemp(){ + try { + var weather = storage.readJSON('weather.json').weather; + return locale.temp(weather.temp-273.15); + } catch(ex) { } + + return "?"; +} + + +function getWeatherHumidity(){ + try { + var weather = storage.readJSON('weather.json').weather; + return weather.hum = weather.hum + "%"; + } catch(ex) { } + + return "?"; +} + + +function getWeatherWind(){ + try { + var weather = storage.readJSON('weather.json').weather; + var speed = locale.speed(weather.wind).replace("mph", ""); + return Math.round(speed * 1.609344) + "kph"; + } catch(ex) { } + + return "?"; +} + function getVersion(file) { - var j = s.readJSON(file,1); + var j = storage.readJSON(file,1); var v = ("object"==typeof j)?j.version:false; return v?((v?"v"+v:"Unknown")):"NO "; } -function drawData(name, value, y){ - g.drawString(name, 5, y); - g.drawString(value, 100, y); -} - function getSteps(){ try{ return Bangle.getHealthStatus("day").steps; } catch(e) { - return ">= 2v12"; + return ">2v12"; } } @@ -29,53 +92,36 @@ function getBpm(){ try{ return Math.round(Bangle.getHealthStatus("day").bpm) + "bpm"; } catch(e) { - return ">= 2v12"; + return ">2v12"; } } +function drawData(name, value, y){ + g.drawString(name, 10, y); + g.drawString(value, 100, y); +} + function drawInfo() { g.reset().clearRect(Bangle.appRect); var h=18, y = h;//-h; // Header - g.setFont("Vector", h+2).setFontAlign(0,-1); - g.drawString("--==|| INFO ||==--", W/2, 0); + g.drawLine(0,25,W,25); + g.drawLine(0,26,W,26); + + // Info body depending on screen g.setFont("Vector",h).setFontAlign(-1,-1); + screens[screen].items.forEach(function (item, index){ + drawData(item.name, item.fun(), y+=h); + }); - // Dynamic data - if(screen == 0){ - drawData("Steps", getSteps(), y+=h); - drawData("HRM", getBpm(), y+=h); - drawData("Battery", E.getBattery() + "%", y+=h); - drawData("Voltage", E.getAnalogVRef().toFixed(2) + "V", y+=h); - drawData("IntTemp.", locale.temp(parseInt(E.getTemperature())), y+=h); - } - - if(screen == 1){ - drawData("Charging?", Bangle.isCharging() ? "Yes" : "No", y+=h); - drawData("Bluetooth", NRF.getSecurityStatus().connected ? "Conn." : "Disconn.", y+=h); - drawData("GPS", Bangle.isGPSOn() ? "On" : "Off", y+=h); - drawData("Compass", Bangle.isCompassOn() ? "On" : "Off", y+=h); - drawData("HRM", Bangle.isHRMOn() ? "On" : "Off", y+=h); - } - - // Static data - if(screen == 2){ - drawData("Firmw.", ENV.VERSION, y+=h); - drawData("Boot.", getVersion("boot.info"), y+=h); - drawData("Settings", getVersion("setting.info"), y+=h); - drawData("Storage", "", y+=h); - drawData(" Total", ENV.STORAGE>>10, y+=h); - drawData(" Free", require("Storage").getFree()>>10, y+=h); - } - - if(Bangle.isLocked()){ - g.setFont("Vector",h-2).setFontAlign(-1,-1); - g.drawString("Locked", 0, H-h+2); - } - + // Bottom + g.drawLine(0,H-h-3,W,H-h-3); + g.drawLine(0,H-h-2,W,H-h-2); + g.setFont("Vector",h-2).setFontAlign(-1,-1); + g.drawString(screens[screen].name, 2, H-h+2); g.setFont("Vector",h-2).setFontAlign(1,-1); - g.drawString((screen+1) + "/3", W, H-h+2); + g.drawString((screen+1) + "/" + screens.length, W, H-h+2); } drawInfo(); @@ -88,14 +134,15 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; if(isRight){ - screen = (screen + 1) % (maxScreen+1); + screen = (screen + 1) % screens.length; } if(isLeft){ screen -= 1; - screen = screen < 0 ? maxScreen : screen; + screen = screen < 0 ? screens.length-1 : screen; } + Bangle.buzz(40, 0.6); drawInfo(); }); @@ -104,5 +151,4 @@ Bangle.on('lock', function(isLocked) { }); Bangle.loadWidgets(); -for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} -// Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/info/metadata.json b/apps/info/metadata.json index f05f0e134..97aeb687a 100644 --- a/apps/info/metadata.json +++ b/apps/info/metadata.json @@ -1,7 +1,7 @@ { "id": "info", "name": "Info", - "version": "0.01", + "version": "0.02", "description": "An application that displays information such as battery level, steps etc.", "icon": "info.png", "type": "app", diff --git a/apps/info/screenshot_1.png b/apps/info/screenshot_1.png index 97d42a89636e01437a6397075db1dc453ca22fe8..25f5b0a8bea17a3edd50da81e9196af01a22756b 100644 GIT binary patch literal 3399 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 BcGmy^ literal 3552 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 diff --git a/apps/info/screenshot_2.png b/apps/info/screenshot_2.png index 2d25dd4e6ce4166d5a6b48ad7f50231bf643cc95..517a83299fe937020cdbd4e427cc4e7de98ae6e0 100644 GIT binary patch literal 3825 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 C7%aU2 literal 3334 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 diff --git a/apps/info/screenshot_3.png b/apps/info/screenshot_3.png index 782e4a1952f1dc3205f20852edf88e9493edd6d8..6802495f5edb75442a3b7e397ddc19bfe8a4710a 100644 GIT binary patch literal 3620 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 Qdiy{&mUb467rj&d5BxC2SO5S3 literal 3455 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 Xk+%_!CsMW>72tTx)$W-M?(+Wt^h|>m