(() => { require("Font5x9Numeric7Seg").add(Graphics); const alarms = require("Storage").readJSON("sched.json",1) || []; const config = Object.assign({ maxhours: 24, drawBell: false, showSeconds: 0, // 0=never, 1=only when display is unlocked, 2=for less than a minute }, require("Storage").readJSON("widalarmeta.json",1) || {}); function draw() { const times = alarms .map(alarm => alarm.hidden !== true && require("sched").getTimeToAlarm(alarm) ) .filter(a => a !== undefined); const next = times.length > 0 ? Math.min.apply(null, times) : 0; let calcWidth = 0; let drawSeconds = false; if (next > 0 && next < config.maxhours*60*60*1000) { const hours = Math.floor((next-1) / 3600000).toString(); const minutes = Math.floor(((next-1) % 3600000) / 60000).toString(); const seconds = Math.floor(((next-1) % 60000) / 1000).toString(); drawSeconds = (config.showSeconds & 0b01 && !Bangle.isLocked()) || (config.showSeconds & 0b10 && next <= 1000*60); g.reset(); // reset the graphics context to defaults (color/font/etc) g.setFontAlign(0,0); // center fonts g.clearRect(this.x, this.y, this.x+this.width-1, this.y+23); var text = hours.padStart(2, '0') + ":" + minutes.padStart(2, '0'); if (drawSeconds) { text += ":" + seconds.padStart(2, '0'); } g.setFont("5x9Numeric7Seg:1x2"); g.drawString(text, this.x+this.width/2, this.y+12); calcWidth = 5*5+2; if (drawSeconds) { calcWidth += 3*5; } } else if (config.drawBell && alarms.some(alarm=>alarm.on&&(alarm.hidden!==true))) { // next alarm too far in future, draw only widalarm bell g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); calcWidth = 24; } if (this.width !== calcWidth) { // width changed, re-layout this.width = calcWidth; Bangle.drawWidgets(); } // redraw next full minute or second const period = drawSeconds ? 1000 : 60000; let timeout = next > 0 ? next % period : period - (Date.now() % period); if (timeout === 0) { timeout += period; } if (this.timeoutId !== undefined) { clearTimeout(this.timeoutId); } this.timeoutId = setTimeout(()=>{ this.timeoutId = undefined; this.draw(); }, timeout); } /* draw */ if (config.maxhours > 0) { // add your widget WIDGETS["widalarmeta"]={ area:"tl", width: 0, // hide by default = assume no timer draw:draw }; } })();