diff --git a/apps/agenda/ChangeLog b/apps/agenda/ChangeLog index 2c59c3cc2..16a90242b 100644 --- a/apps/agenda/ChangeLog +++ b/apps/agenda/ChangeLog @@ -3,3 +3,4 @@ 0.03: Disable past events display from settings 0.04: Added awareness of allDay field 0.05: Displaying calendar colour and name +0.06: Added clkinfo for clocks. \ No newline at end of file diff --git a/apps/agenda/agenda.clkinfo.js b/apps/agenda/agenda.clkinfo.js new file mode 100644 index 000000000..9e89b2ac8 --- /dev/null +++ b/apps/agenda/agenda.clkinfo.js @@ -0,0 +1,29 @@ +(function() { + var agendaItems = { + name: "Agenda", + img: atob("GBiBAf////////85z/AAAPAAAPgAAP////AAAPAAAPAAAPAAAOAAAeAAAeAAAcAAA8AAAoAABgAADP//+P//8PAAAPAAAPgAAf///w=="), + items: [] + }; + + var now = new Date(); + var agenda = storage.readJSON("android.calendar.json") + .filter(ev=>ev.timestamp + ev.durationInSeconds > now/1000) + .sort((a,b)=>a.timestamp - b.timestamp); + + agenda.forEach((entry, i) => { + + var title = entry.title.slice(0,14); + var date = new Date(entry.timestamp*1000); + var dateStr = locale.date(date).replace(/\d\d\d\d/,""); + dateStr += entry.durationInSeconds < 86400 ? "/ " + locale.time(date,1) : ""; + + agendaItems.items.push({ + name: "agendaEntry-" + i, + get: () => ({ text: title + "\n" + dateStr, img: null}), + show: function() { agendaItems.items[i].emit("redraw"); }, + hide: function () {} + }); + }); + + return agendaItems; +}) \ No newline at end of file diff --git a/apps/agenda/metadata.json b/apps/agenda/metadata.json index 982870905..2bce8ca56 100644 --- a/apps/agenda/metadata.json +++ b/apps/agenda/metadata.json @@ -1,7 +1,7 @@ { "id": "agenda", "name": "Agenda", - "version": "0.05", + "version": "0.06", "description": "Simple agenda", "icon": "agenda.png", "screenshots": [{"url":"screenshot_agenda_overview.png"}, {"url":"screenshot_agenda_event1.png"}, {"url":"screenshot_agenda_event2.png"}], @@ -12,6 +12,7 @@ "storage": [ {"name":"agenda.app.js","url":"agenda.js"}, {"name":"agenda.settings.js","url":"settings.js"}, + {"name":"agenda.clkinfo.js","url":"agenda.clkinfo.js"}, {"name":"agenda.img","url":"agenda-icon.js","evaluate":true} ], "data": [{"name":"agenda.settings.json"}] diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 59bf9eb96..72919e37f 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -18,4 +18,5 @@ 0.18: Set timer for an agenda entry by simply clicking in the middle of the screen. Only one timer can be set. 0.19: Fix - Compatibility with "Digital clock widget" 0.20: Better handling of async data such as getPressure. -0.21: On the default menu the week of year can be shown. \ No newline at end of file +0.21: On the default menu the week of year can be shown. +0.22: Use the new clkinfo module for the menu. \ No newline at end of file diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index edc4a9272..c69a4acdc 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -3,7 +3,7 @@ */ const locale = require('locale'); const storage = require('Storage'); -// const clock_info = require("clock_info"); +const clock_info = require("clock_info"); /************ * Statics @@ -82,215 +82,42 @@ function imgLock(){ } -// ----clock_info ------------------------------------------------------ -function loadClockInfo() { - // info used for drawing... - var hrm = "--"; - var alt = "--"; - var interval = null; - // callbacks (needed for easy removal of listeners) - function batteryUpdateHandler() { bangleItems[0].emit("redraw"); } - function stepUpdateHandler() { bangleItems[1].emit("redraw"); } - function hrmUpdateHandler() { bangleItems[2].emit("redraw"); } - function altUpdateHandler() { - Bangle.getPressure().then(data=>{ - if (!data) return; - alt = Math.round(data.altitude) + "m"; - bangleItems[3].emit("redraw"); - }); - } - function deleteInterval(inter){ - if(inter){ - clearInterval(inter); - } - delete inter; - } - // actual items - var items = [{ - name: "Bangle", - img: atob("GBiBAf8B//4B//4B//4B//4A//x4//n+f/P/P+fPn+fPn+fP3+/Px+/Px+fn3+fzn+f/n/P/P/n+f/x4//4A//4B//4B//4B//8B/w=="), - items: [ - { name : "Battery", - get : () => ({ - text : E.getBattery() + "%", - img : atob(Bangle.isCharging() ? "GBiBAAABgAADwAAHwAAPgACfAAHOAAPkBgHwDwP4Hwf8Pg/+fB//OD//kD//wD//4D//8D//4B//QB/+AD/8AH/4APnwAHAAACAAAA==" : "GBiBAAAAAAAAAAAAAAAAAAAAAD//+P///IAAAr//Ar//Ar//A7//A7//A7//A7//Ar//AoAAAv///D//+AAAAAAAAAAAAAAAAAAAAA==") }), - show : function() { - deleteInterval(interval); - interval = setInterval(()=>this.emit('redraw'), 60000); - Bangle.on("charging", batteryUpdateHandler); - batteryUpdateHandler(); - }, - hide : function() { - deleteInterval(interval); - Bangle.removeListener("charging", batteryUpdateHandler); - }, - }, - { name : "Steps", get : () => ({ - text : Bangle.getHealthStatus("day").steps, - img : atob("GBiBAAcAAA+AAA/AAA/AAB/AAB/gAA/g4A/h8A/j8A/D8A/D+AfH+AAH8AHn8APj8APj8AHj4AHg4AADAAAHwAAHwAAHgAAHgAADAA==") }), - show : function() { Bangle.on("step", stepUpdateHandler); stepUpdateHandler(); }, - hide : function() { Bangle.removeListener("step", stepUpdateHandler); }, - }, - { name : "HRM", get : () => ({ - text : Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", - img : atob("GBiBAAAAAAAAAAAAAAAAAAAAAADAAADAAAHAAAHjAAHjgAPngH9n/n82/gA+AAA8AAA8AAAcAAAYAAAYAAAAAAAAAAAAAAAAAAAAAA==") }), - show : function() { Bangle.setHRMPower(1,"clkinfo"); Bangle.on("HRM", hrmUpdateHandler); hrm = Math.round(Bangle.getHealthStatus("last").bpm); hrmUpdateHandler(); }, - hide : function() { Bangle.setHRMPower(0,"clkinfo"); Bangle.removeListener("HRM", hrmUpdateHandler); hrm = "--"; }, - } - ], - }]; - var bangleItems = items[0].items; - - if (Bangle.getPressure){ // Altimeter may not exist - bangleItems.push({ name : "Altitude", get : () => ({ - text : alt, - img : atob("GBiBAAAAAAAAAAAAAAAAAAAAAAACAAAGAAAPAAEZgAOwwAPwQAZgYAwAMBgAGBAACDAADGAABv///////wAAAAAAAAAAAAAAAAAAAA==") }), - show : function() { deleteInterval(); interval = setInterval(altUpdateHandler, 60000); alt = "--"; altUpdateHandler(); }, - hide : function() { deleteInterval(); }, - }); - } - - // now load extra data from a third party files - require("Storage").list(/clkinfo.js$/).forEach(fn => { - items = items.concat(eval(require("Storage").read(fn))()); - }); - - // return it all! - return items; -} -// ----clock_info ------------------------------------------------------ - - -// Custom menus -var clockItems = { +// Custom bwItems menu - therefore, its added here and not in a clkinfo.js file. +var bwItems = { name: null, img: null, items: [ { name: "WeekOfYear", get: () => ({ text: "Week " + weekOfYear(), img: null}), - show: function() { clockItems.items[0].emit("redraw"); }, + show: function() { bwItems.items[0].emit("redraw"); }, hide: function () {} }, ] }; - -// ----agenda_clock_info ------------------------------------------------------ -var agendaItems = { - name: "Agenda", - img: atob("GBiBAf////////85z/AAAPAAAPgAAP////AAAPAAAPAAAPAAAOAAAeAAAeAAAcAAA8AAAoAABgAADP//+P//8PAAAPAAAPgAAf///w=="), - items: [] -}; - -var now = new Date(); -var agenda = storage.readJSON("android.calendar.json") - .filter(ev=>ev.timestamp + ev.durationInSeconds > now/1000) - .sort((a,b)=>a.timestamp - b.timestamp); - -agenda.forEach((entry, i) => { - - var title = entry.title.slice(0,14); - var date = new Date(entry.timestamp*1000); - var dateStr = locale.date(date).replace(/\d\d\d\d/,""); - dateStr += entry.durationInSeconds < 86400 ? "/ " + locale.time(date,1) : ""; - - agendaItems.items.push({ - name: "agendaEntry-" + i, - get: () => ({ text: title + "\n" + dateStr, img: null}), - show: function() { agendaItems.items[i].emit("redraw"); }, - hide: function () {} - }); -}); -// ----agenda_clock_info ------------------------------------------------------ - - - -// ----weather_clock_info ------------------------------------------------------ -var weather = { - temp: "?", - hum: "?", - wind: "?", -}; - -var weatherJson = storage.readJSON('weather.json'); -if(weatherJson !== undefined && weatherJson.weather !== undefined){ - weather = weatherJson.weather; - weather.temp = locale.temp(weather.temp-273.15); - weather.hum = weather.hum + "%"; - weather.wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); - weather.wind = Math.round(weather.wind[1]) + "kph"; +function weekOfYear() { + var date = new Date(); + date.setHours(0, 0, 0, 0); + // Thursday in current week decides the year. + date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); + // January 4 is always in week 1. + var week1 = new Date(date.getFullYear(), 0, 4); + // Adjust to Thursday in week 1 and count number of weeks from date to week1. + return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 + - 3 + (week1.getDay() + 6) % 7) / 7); } -var weatherItems = { - name: "Weather", - img: atob("GBiBAf+///u5//n7//8f/9wHP8gDf/gB//AB/7AH/5AcP/AQH/DwD/uAD84AD/4AA/wAAfAAAfAAAfAAAfgAA/////+bP/+zf/+zfw=="), - items: [ - { - name: "temperature", - get: () => ({ text: weather.temp, img: atob("GBiBAf/D//+B//8Y//88//88//88//88//88//8k//8k//8k//8k//8k//8k//4kf/5mf/zDP/yBP/yBP/zDP/5mf/48f/8A///D/w==")}), - show: function() { weatherItems.items[0].emit("redraw"); }, - hide: function () {} - }, - { - name: "humidity", - get: () => ({ text: weather.hum, img: atob("GBiBAf/7///z///x///g///g///Af//Af/3Af/nA//jg//B/v/B/H+A/H8A+D8AeB8AcB4AYA8AYA8AYA+A4A/B4A//4A//8B///Dw==")}), - show: function() { weatherItems.items[1].emit("redraw"); }, - hide: function () {} - }, - { - name: "wind", - get: () => ({ text: weather.wind, img: atob("GBiBAf4f//wP//nn//Pn//Pzg//nAf/meIAOfAAefP///P//+fAAAfAAB////////wAAP4AAH///z///z//nz//nz//zj//wH//8Pw==")}), - show: function() { weatherItems.items[2].emit("redraw"); }, - hide: function () {} - }, - ] -}; -// ----weather_clock_info ------------------------------------------------------ - - -// ----ha_clock_info ------------------------------------------------------ -var ha = require("ha.lib.js"); -var triggers = ha.getTriggers(); - -var haItems = { - name: "Home", - img: atob("GBiBAf/////////n///D//+B//8A//48T/wkD/gkD/A8D+AYB8AYA4eZ4QyZMOyZN+fb5+D/B+B+B+A8B+AYB+AYB+AYB+AYB+A8Bw=="), - items: [ - // { - // name: "item1", - // get: () => ({ text: "Item1", img: atob("GBiBAf/D//+B//8Y//88//88//88//88//88//8k//8k//8k//8k//8k//8k//4kf/5mf/zDP/yBP/yBP/zDP/5mf/48f/8A///D/w==")}), - // show: function() { haItems.items[0].emit("redraw"); }, - // hide: function () {} - // }, - ] -}; - -triggers.forEach((trigger, i) => { - haItems.items.push({ - name: "haTrigger-" + i, - get: () => ({ text: trigger.display, img: trigger.getIcon()}), - show: function() { haItems.items[i].emit("redraw"); }, - hide: function () {}, - run: function() { - ha.sendTrigger("TRIGGER_BW"); - ha.sendTrigger(trigger.trigger); - } - }); -}); - -// ----ha_clock_info ------------------------------------------------------ - - -// Still missing -var timerItems = {}; - // Load menu -var menu = loadClockInfo(); -menu = menu.concat(agendaItems); -menu = menu.concat(weatherItems); -menu = menu.concat(haItems); -menu = menu.concat(clockItems); +var menu = clock_info.load(); +menu = menu.concat(bwItems); + + +// Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it. +if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){ + settings.menuPosX = 0; + settings.menuPosY = 0; +} // Set draw functions for each item menu.forEach((menuItm, x) => { @@ -328,19 +155,6 @@ function isFullscreen(){ } -function weekOfYear() { - var date = new Date(); - date.setHours(0, 0, 0, 0); - // Thursday in current week decides the year. - date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); - // January 4 is always in week 1. - var week1 = new Date(date.getFullYear(), 0, 4); - // Adjust to Thursday in week 1 and count number of weeks from date to week1. - return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - - 3 + (week1.getDay() + 6) % 7) / 7); -} - - /************ * DRAW */ @@ -363,7 +177,7 @@ function drawDate(){ // Draw date y = parseInt(y/2)+4; - y += isFullscreen() ? 0 : 13; + y += isFullscreen() ? 0 : 8; var date = new Date(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index b6896ab5e..35e707f68 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.21", + "version": "0.22", "description": "A very minimalistic clock to mainly show date and time.", "readme": "README.md", "icon": "app.png", diff --git a/apps/ha/ChangeLog b/apps/ha/ChangeLog index e78b4ccd0..493854eb4 100644 --- a/apps/ha/ChangeLog +++ b/apps/ha/ChangeLog @@ -1,2 +1,3 @@ 0.01: Release -0.02: Includeas the ha.lib.js library that can be used by other apps or clocks. \ No newline at end of file +0.02: Includeas the ha.lib.js library that can be used by other apps or clocks. +0.03: Added clkinfo for clocks. \ No newline at end of file diff --git a/apps/ha/ha.clkinfo.js b/apps/ha/ha.clkinfo.js new file mode 100644 index 000000000..bb3b7e5a1 --- /dev/null +++ b/apps/ha/ha.clkinfo.js @@ -0,0 +1,25 @@ +(function() { + var ha = require("ha.lib.js"); + var triggers = ha.getTriggers(); + + var haItems = { + name: "Home", + img: atob("GBiBAf/////////n///D//+B//8A//48T/wkD/gkD/A8D+AYB8AYA4eZ4QyZMOyZN+fb5+D/B+B+B+A8B+AYB+AYB+AYB+AYB+A8Bw=="), + items: [] + }; + + triggers.forEach((trigger, i) => { + haItems.items.push({ + name: "haTrigger-" + i, + get: () => ({ text: trigger.display, img: trigger.getIcon()}), + show: function() { haItems.items[i].emit("redraw"); }, + hide: function () {}, + run: function() { + ha.sendTrigger("TRIGGER_BW"); + ha.sendTrigger(trigger.trigger); + } + }); + }); + + return haItems; +}) \ No newline at end of file diff --git a/apps/ha/metadata.json b/apps/ha/metadata.json index 63308b933..e59e63c91 100644 --- a/apps/ha/metadata.json +++ b/apps/ha/metadata.json @@ -1,7 +1,7 @@ { "id": "ha", "name": "HomeAssistant", - "version": "0.02", + "version": "0.03", "description": "Integrates your BangleJS into HomeAssistant.", "icon": "ha.png", "type": "app", @@ -20,6 +20,7 @@ "storage": [ {"name":"ha.app.js","url":"ha.app.js"}, {"name":"ha.lib.js","url":"ha.lib.js"}, + {"name":"ha.clkinfo.js","url":"ha.clkinfo.js"}, {"name":"ha.img","url":"ha.icon.js","evaluate":true} ] } diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index 49e23e1d6..da28d8d5a 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -13,3 +13,4 @@ 0.14: Use weather condition code for icon selection 0.15: Fix widget icon 0.16: Don't mark app as clock +0.17: Added clkinfo for clocks. \ No newline at end of file diff --git a/apps/weather/clkinfo.js b/apps/weather/clkinfo.js new file mode 100644 index 000000000..8e502b7fc --- /dev/null +++ b/apps/weather/clkinfo.js @@ -0,0 +1,43 @@ +(function() { + var weather = { + temp: "?", + hum: "?", + wind: "?", + }; + + var weatherJson = storage.readJSON('weather.json'); + if(weatherJson !== undefined && weatherJson.weather !== undefined){ + weather = weatherJson.weather; + weather.temp = locale.temp(weather.temp-273.15); + weather.hum = weather.hum + "%"; + weather.wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); + weather.wind = Math.round(weather.wind[1]) + "kph"; + } + + var weatherItems = { + name: "Weather", + img: atob("GBiBAf+///u5//n7//8f/9wHP8gDf/gB//AB/7AH/5AcP/AQH/DwD/uAD84AD/4AA/wAAfAAAfAAAfAAAfgAA/////+bP/+zf/+zfw=="), + items: [ + { + name: "temperature", + get: () => ({ text: weather.temp, img: atob("GBiBAf/D//+B//8Y//88//88//88//88//88//8k//8k//8k//8k//8k//8k//4kf/5mf/zDP/yBP/yBP/zDP/5mf/48f/8A///D/w==")}), + show: function() { weatherItems.items[0].emit("redraw"); }, + hide: function () {} + }, + { + name: "humidity", + get: () => ({ text: weather.hum, img: atob("GBiBAf/7///z///x///g///g///Af//Af/3Af/nA//jg//B/v/B/H+A/H8A+D8AeB8AcB4AYA8AYA8AYA+A4A/B4A//4A//8B///Dw==")}), + show: function() { weatherItems.items[1].emit("redraw"); }, + hide: function () {} + }, + { + name: "wind", + get: () => ({ text: weather.wind, img: atob("GBiBAf4f//wP//nn//Pn//Pzg//nAf/meIAOfAAefP///P//+fAAAfAAB////////wAAP4AAH///z///z//nz//nz//zj//wH//8Pw==")}), + show: function() { weatherItems.items[2].emit("redraw"); }, + hide: function () {} + }, + ] + }; + + return weatherItems; +}) \ No newline at end of file diff --git a/apps/weather/metadata.json b/apps/weather/metadata.json index 25037de3d..125041ec4 100644 --- a/apps/weather/metadata.json +++ b/apps/weather/metadata.json @@ -1,7 +1,7 @@ { "id": "weather", "name": "Weather", - "version": "0.16", + "version": "0.17", "description": "Show Gadgetbridge weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], @@ -13,7 +13,8 @@ {"name":"weather.wid.js","url":"widget.js"}, {"name":"weather","url":"lib.js"}, {"name":"weather.img","url":"icon.js","evaluate":true}, - {"name":"weather.settings.js","url":"settings.js"} + {"name":"weather.settings.js","url":"settings.js"}, + {"name":"weather.clkinfo.js","url":"clkinfo.js"} ], "data": [{"name":"weather.json"}] } diff --git a/modules/clock_info.js b/modules/clock_info.js index 2ee7fc2f7..df35d4e22 100644 --- a/modules/clock_info.js +++ b/modules/clock_info.js @@ -37,57 +37,74 @@ exports.load = function() { // info used for drawing... var hrm = "--"; var alt = "--"; + var interval = null; // callbacks (needed for easy removal of listeners) - function batteryUpdateHandler() { items[0].emit("redraw"); } - function stepUpdateHandler() { items[1].emit("redraw"); } - function hrmUpdateHandler() { items[2].emit("redraw"); } + function batteryUpdateHandler() { bangleItems[0].emit("redraw"); } + function stepUpdateHandler() { bangleItems[1].emit("redraw"); } + function hrmUpdateHandler() { bangleItems[2].emit("redraw"); } function altUpdateHandler() { Bangle.getPressure().then(data=>{ if (!data) return; alt = Math.round(data.altitude) + "m"; - items[3].emit("redraw"); + bangleItems[3].emit("redraw"); }); } + function deleteInterval(inter){ + if(inter){ + clearInterval(inter); + } + delete inter; + } // actual items - var items = [ + var items = [{ + name: "Bangle", + img: atob("GBiBAf8B//4B//4B//4B//4A//x4//n+f/P/P+fPn+fPn+fP3+/Px+/Px+fn3+fzn+f/n/P/P/n+f/x4//4A//4B//4B//4B//8B/w=="), + items: [ { name : "Battery", get : () => ({ text : E.getBattery() + "%", img : atob(Bangle.isCharging() ? "GBiBAAABgAADwAAHwAAPgACfAAHOAAPkBgHwDwP4Hwf8Pg/+fB//OD//kD//wD//4D//8D//4B//QB/+AD/8AH/4APnwAHAAACAAAA==" : "GBiBAAAAAAAAAAAAAAAAAAAAAD//+P///IAAAr//Ar//Ar//A7//A7//A7//A7//Ar//AoAAAv///D//+AAAAAAAAAAAAAAAAAAAAA==") }), show : function() { - this.interval = setInterval(()=>this.emit('redraw'), 60000); + deleteInterval(interval); + interval = setInterval(()=>this.emit('redraw'), 60000); Bangle.on("charging", batteryUpdateHandler); + batteryUpdateHandler(); }, hide : function() { - clearInterval(this.interval); - delete this.interval; + deleteInterval(interval); Bangle.removeListener("charging", batteryUpdateHandler); }, }, { name : "Steps", get : () => ({ text : Bangle.getHealthStatus("day").steps, img : atob("GBiBAAcAAA+AAA/AAA/AAB/AAB/gAA/g4A/h8A/j8A/D8A/D+AfH+AAH8AHn8APj8APj8AHj4AHg4AADAAAHwAAHwAAHgAAHgAADAA==") }), - show : function() { Bangle.on("step", stepUpdateHandler); }, + show : function() { Bangle.on("step", stepUpdateHandler); stepUpdateHandler(); }, hide : function() { Bangle.removeListener("step", stepUpdateHandler); }, }, { name : "HRM", get : () => ({ text : Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", img : atob("GBiBAAAAAAAAAAAAAAAAAAAAAADAAADAAAHAAAHjAAHjgAPngH9n/n82/gA+AAA8AAA8AAAcAAAYAAAYAAAAAAAAAAAAAAAAAAAAAA==") }), - show : function() { Bangle.setHRMPower(1,"clkinfo"); Bangle.on("HRM", hrmUpdateHandler); hrm = Math.round(Bangle.getHealthStatus("last").bpm); }, + show : function() { Bangle.setHRMPower(1,"clkinfo"); Bangle.on("HRM", hrmUpdateHandler); hrm = Math.round(Bangle.getHealthStatus("last").bpm); hrmUpdateHandler(); }, hide : function() { Bangle.setHRMPower(0,"clkinfo"); Bangle.removeListener("HRM", hrmUpdateHandler); hrm = "--"; }, } - ]; - if (Bangle.getPressure) // Altimeter may not exist - items.push({ name : "Altitude", get : () => ({ + ], + }]; + var bangleItems = items[0].items; + + if (Bangle.getPressure){ // Altimeter may not exist + bangleItems.push({ name : "Altitude", get : () => ({ text : alt, img : atob("GBiBAAAAAAAAAAAAAAAAAAAAAAACAAAGAAAPAAEZgAOwwAPwQAZgYAwAMBgAGBAACDAADGAABv///////wAAAAAAAAAAAAAAAAAAAA==") }), - show : function() { this.interval = setInterval(altUpdateHandler, 60000); alt = "--"; altUpdateHandler(); }, - hide : function() { clearInterval(this.interval); delete this.interval; }, + show : function() { deleteInterval(interval); interval = setInterval(altUpdateHandler, 60000); alt = "--"; altUpdateHandler(); }, + hide : function() { deleteInterval(interval); }, }); + } + // now load extra data from a third party files require("Storage").list(/clkinfo.js$/).forEach(fn => { items = items.concat(eval(require("Storage").read(fn))()); }); + // return it all! return items; };