1
0
Fork 0
BangleApps/apps/xxlmessage/lib-unbuffered.js

134 lines
3.3 KiB
JavaScript

// GB({"t":"notify","id":1575479849,"src":"Hangouts","title":"A Name","body":"message contents"})
var xxl = {
// private:
msg: [],
drawTimeout: undefined,
xpos : 0,
loopCount : 0,
txt:'',
wtot:0,
img:undefined,
imgcol:'#ffffff',
setFont: function(){
g.setFont('6x8:5x9'); // TODO this is a bottleneck. How to prepare the font once?
},
//public:
show: function(theMessage){
console.log("theMessage is:");
console.log(theMessage);
xxl.msg = theMessage;
// prepare string and metrics
xxl.txt = xxl.msg.src + ": " + xxl.msg.body;
xxl.setFont();
xxl.wtot = g.stringMetrics(xxl.txt).width;
xxl.xpos = 2 * g.getWidth();
// get icon
xxl.img = require("messageicons").getImage(xxl.msg);
xxl.imgcol = require("messageicons").getColor(xxl.msg, '#ffffff');
Bangle.loadWidgets();
Bangle.on('touch', function (b, xy) {
xxl.stop();
});
setWatch(xxl.stop, BTN1);
Bangle.buzz(500,1);
xxl.draw();
},
//private:
// schedule a draw for 30 FPS
queueDraw: function() {
if (xxl.drawTimeout) { return; } // clearTimeout(xxl.drawTimeout); }
xxl.drawTimeout = setTimeout(function () {
xxl.drawTimeout = undefined;
xxl.draw();
}, 33 - (Date.now() % 33));
},
stop:function() {
console.log("stop");
if (xxl.drawTimeout) { clearTimeout(xxl.drawTimeout); }
xxl.drawTimeout = undefined;
g.reset();
g.setBgColor('#ffff00');
g.clear();
// Bangle.setLCDPower(0); // light off
// Bangle.setLocked(true); // disable touch
setTimeout(load, 100);
},
draw: function() {
const wh = 24; // widgets height
var gw = g.getWidth();
var h = (g.getHeight() - wh)/2; // height of drawing area per stripe
Bangle.setLCDPower(1); // light on
Bangle.setLocked(false); // keep the touch input active
g.setBgColor('#000000');
g.clear();
if (xxl.img) { // 24x24
g.setColor(xxl.imgcol);
g.drawImage(xxl.img
, gw/2, wh+h // center point
,{rotate:0,scale:2}
);
}
xxl.setFont();
g.setFontAlign(-1, -1);
// draw both lines
g.setBgColor('#000000');
g.setColor('#ffffff');
g.drawString(xxl.txt, xxl.xpos, wh);
g.drawString(xxl.txt, xxl.xpos - gw - 32, h + wh);
g.reset();
// widget redraw
Bangle.drawWidgets();
// scroll
xxl.xpos -= 25;
if (xxl.xpos < -xxl.wtot - gw * 2) {
++xxl.loopCount;
if (xxl.loopCount > 2) {
xxl.stop();
return;
}
xxl.xpos = 3 * gw;
}
// loop drawing
xxl.queueDraw();
}
};
// for IDE
// var exports={};
exports.listener = function (type, msg) {
// msg = {t:"add",id:int, src,title,subject,body,sender,tel, important:bool, new:bool}
if (!msg) return;
if (type === 'text' && msg.t !== 'remove') {
msg.handled = true; // don't do anything else with the message
xxl.show(msg);
}
};
// debug
// Bangle.on("message", (type, msg) => exports.listener(type, msg));