(function() { var heading, cnt; function magHandler(m) { var h = m.heading; if (isNaN(heading) || isNaN(h)) heading = h; else { // Average if (Math.abs(heading-h)>180) { if (h<180 && heading>180) h+=360; if (h>180 && heading<180) h-=360; } heading = heading*0.8 + h*0.2; if (heading<0) heading+=360; if (heading>=360) heading-=360; } // only draw 1 in 2 to try and save some power! if (!(1&cnt++)) ci.items[0].emit('redraw'); } var ci = { name: "Bangle", items: [ { name : "Compass", get : function() { var g = Graphics.createArrayBuffer(24,24,1,{msb:true}); if (isNaN(heading)) g.drawLine(8,12,16,12); else g.fillPoly(g.transformVertices([0,-10,4,10,-4,10],{x:12,y:12,rotate:-heading/57})); g.transparent=0; // only works on 2v18+, ignored otherwise (makes image background transparent) return { text : isNaN(heading)?"--":Math.round(heading), v : 0|heading, min : 0, max : 360, img : g.asImage("string") }}, show : function() { Bangle.setCompassPower(1,"clkinfomag"); Bangle.on('mag',magHandler); cnt=0; heading = undefined; }, hide : function() { Bangle.removeListener('mag', magHandler); Bangle.setCompassPower(0,"clkinfomag"); }, run : function() { Bangle.resetCompass(); } } ] }; return ci; }) // must not have a semi-colon!