var W = g.getWidth(); var M = W/2; // middle of screen // Angle buffer var AGS = W > 200 ? 160 : 120; // buffer size var AGM = AGS/2; // midpoint/radius var AGH = AGM-10; // hand size var ag = Graphics.createArrayBuffer(AGS,AGS,2,{msb:true}); var aimg = { width:ag.getWidth(), height:ag.getHeight(), bpp:2, buffer:ag.buffer, palette:new Uint16Array([ g.theme.bg, g.toColor("#07f"), g.toColor("#f00"), g.toColor("#00f")]) }; ag.setColor(1).fillCircle(AGM,AGM,AGM-1,AGM-1); ag.setColor(0).fillCircle(AGM,AGM,AGM-11,AGM-11); function arrow(r,c) { r=(360-r)*Math.PI/180; var p = Math.PI/2; ag.setColor(c).fillPoly([ AGM+AGH*Math.sin(r), AGM-AGH*Math.cos(r), AGM+10*Math.sin(r+p), AGM-10*Math.cos(r+p), AGM+10*Math.sin(r-p), AGM-10*Math.cos(r-p), ]); } var wasUncalibrated = false; var oldHeading = 0; Bangle.on('mag', function(m) { if (!Bangle.isLCDOn()) return; g.reset(); if (isNaN(m.heading)) { if (!wasUncalibrated) { g.clearRect(0,24,W,48); g.setFontAlign(0,-1).setFont("6x8"); g.drawString(/*LANG*/"Uncalibrated\nturn 360° around",M,24+4); wasUncalibrated = true; } } else { if (wasUncalibrated) { g.clearRect(0,24,W,48); wasUncalibrated = false; } g.setFontAlign(0,0).setFont("6x8",3); var y = 36; g.clearRect(M-40,24,M+40,48); g.drawString(Math.round(m.heading),M,y,true); } ag.setColor(0); arrow(oldHeading,0); arrow(oldHeading+180,0); arrow(m.heading,2); arrow(m.heading+180,3); g.drawImage(aimg, (W-ag.getWidth())/2, g.getHeight()-(ag.getHeight()+4)); oldHeading = m.heading; }); g.clear(1); g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"RESET", g.getWidth()-5, g.getHeight()/2); setWatch(function() { Bangle.resetCompass(); }, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true, edge:"falling"}); Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setCompassPower(1); Bangle.setLCDPower(1); Bangle.setLCDTimeout(0);