diff --git a/apps.json b/apps.json index 29e7b7d3c..f8d73cc7e 100644 --- a/apps.json +++ b/apps.json @@ -2057,7 +2057,7 @@ { "id": "magnav", "name": "Navigation Compass", "icon": "magnav.png", - "version":"0.03", + "version":"0.04", "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", "readme": "README.md", "tags": "tool,outdoors", @@ -2139,7 +2139,7 @@ "name": "Multi Clock", "icon": "multiclock.png", "version":"0.07", - "description": "Clock with multiple faces - Big, Analogue, Digital, Text.\n Switch between faces with BT1 & BTN3", + "description": "Clock with multiple faces - Big, Analogue, Digital, Text, Time-Date.\n Switch between faces with BTN1 & BTN3", "readme": "README.md", "tags": "clock", "type":"clock", diff --git a/apps/magnav/ChangeLog b/apps/magnav/ChangeLog index 6a33b0ce9..35e8798c6 100644 --- a/apps/magnav/ChangeLog +++ b/apps/magnav/ChangeLog @@ -1,4 +1,6 @@ 0.01: New App! 0.02: Course marker 0.03: Tilt compensation and calibration +0.04: Fix Font size + diff --git a/apps/magnav/magnav.js b/apps/magnav/magnav.js index 111d42c38..ed617a664 100644 --- a/apps/magnav/magnav.js +++ b/apps/magnav/magnav.js @@ -1,11 +1,11 @@ const Yoff = 80; var pal2color = new Uint16Array([0x0000,0xffff,0x07ff,0xC618],0,2); -var buf = Graphics.createArrayBuffer(240,50,2,{msb:true}); +var buf = Graphics.createArrayBuffer(240,60,2,{msb:true}); Bangle.setLCDTimeout(30); function flip(b,y) { - g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer, palette:pal2color},0,y); + g.drawImage({width:240,height:60,bpp:2,buffer:b.buffer, palette:pal2color},0,y); b.clear(); } @@ -14,7 +14,7 @@ var brg=null; function drawCompass(course) { buf.setColor(1); - buf.setFont("Vector",16); + buf.setFont("Vector",24); var start = course-90; if (start<0) start+=360; buf.fillRect(28,45,212,49); @@ -89,7 +89,7 @@ function reading() { buf.setFont("6x8",2); buf.setFontAlign(-1,-1); buf.drawString("o",170,0); - buf.setFont("Vector",40); + buf.setFont("Vector",54); var course = Math.round(heading); var cs = course.toString(); cs = course<10?"00"+cs : course<100 ?"0"+cs : cs; @@ -163,7 +163,7 @@ var intervalRef; function startdraw(){ g.clear(); g.setColor(1,0.5,0.5); - g.fillPoly([120,Yoff+50,110,Yoff+70,130,Yoff+70]); + g.fillPoly([120,Yoff+60,110,Yoff+80,130,Yoff+80]); g.setColor(1,1,1); Bangle.drawWidgets(); candraw = true; diff --git a/apps/magnav/magnav.min.js b/apps/magnav/magnav.min.js index 03700df14..1d5439164 100644 --- a/apps/magnav/magnav.min.js +++ b/apps/magnav/magnav.min.js @@ -1,10 +1,10 @@ -var Yoff=80,pal2color=new Uint16Array([0,65535,2047,50712],0,2),buf=Graphics.createArrayBuffer(240,50,2,{msb:!0});Bangle.setLCDTimeout(30);function flip(b,c){g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer,palette:pal2color},0,c);b.clear()}var labels="N NE E SE S SW W NW".split(" "),brg=null; -function drawCompass(b){buf.setColor(1);buf.setFont("Vector",16);var c=b-90;0>c&&(c+=360);buf.fillRect(28,45,212,49);var a=30,d=15-c%15;15>d?a+=d:d=0;for(var e=d;e<=180-d;e+=15){var f=c+e;0==f%90?(buf.drawString(labels[Math.floor(f/45)%8],a-8,0),buf.fillRect(a-2,25,a+2,45)):0==f%45?(buf.drawString(labels[Math.floor(f/45)%8],a-12,0),buf.fillRect(a-2,30,a+2,45)):0==f%15&&buf.fillRect(a,35,a+1,45);a+=15}brg&&(b=brg-b,180b&&(b+=360),b+=120,30>b&&(b=14),210c&&(c+=360);buf.fillRect(28,45,212,49);var a=30,d=15-c%15;15>d?a+=d:d=0;for(var e=d;e<=180-d;e+=15){var f=c+e;0==f%90?(buf.drawString(labels[Math.floor(f/45)%8],a-8,0),buf.fillRect(a-2,25,a+2,45)):0==f%45?(buf.drawString(labels[Math.floor(f/45)%8],a-12,0),buf.fillRect(a-2,30,a+2,45)):0==f%15&&buf.fillRect(a,35,a+1,45);a+=15}brg&&(b=brg-b,180b&&(b+=360),b+=120,30>b&&(b=14),210c?1:-1;180<=a&&(a=360-a,d=-d);if(2>a)return c;a=c+d*(1+Math.round(a/5));0>a&&(a+=360);360a&&(a+=360);return a} -function reading(){var b=tiltfixread(CALIBDATA.offset,CALIBDATA.scale);heading=newHeading(b,heading);drawCompass(heading);buf.setColor(1);buf.setFont("6x8",2);buf.setFontAlign(-1,-1);buf.drawString("o",170,0);buf.setFont("Vector",40);b=Math.round(heading);var c=b.toString();buf.drawString(10>b?"00"+c:100>b?"0"+c:c,70,10);flip(buf,Yoff+80)} -function calibrate(){var b=-32E3,c=-32E3,a=-32E3,d=32E3,e=32E3,f=32E3,k=setInterval(function(){var h=Bangle.getCompass();b=h.x>b?h.x:b;c=h.y>c?h.y:c;a=h.z>a?h.z:a;d=h.xb?"00"+c:100>b?"0"+c:c,70,10);flip(buf,Yoff+80)} +function calibrate(){var b=-32E3,c=-32E3,a=-32E3,d=32E3,e=32E3,f=32E3,k=setInterval(function(){var h=Bangle.getCompass();b=h.x>b?h.x:b;c=h.y>c?h.y:c;a=h.z>a?h.z:a;d=h.x{ + var m = Bangle.getCompass(); + if (mag) mag.write( + [((m.x-O.x)*S.x).toFixed(2), + ((m.y-O.y)*S.y).toFixed(2), + ((m.z-O.z)*S.z).toFixed(2)].join(",")+"\n"); + max.x = m.x>max.x?m.x:max.x; + max.y = m.y>max.y?m.y:max.y; + max.z = m.z>max.z?m.z:max.z; + min.x = m.x { + setTimeout(()=>{ + if(ref) clearInterval(ref); + var offset = {x:(max.x+min.x)/2,y:(max.y+min.y)/2,z:(max.z+min.z)/2}; + var delta = {x:(max.x-min.x)/2,y:(max.y-min.y)/2,z:(max.z-min.z)/2}; + var avg = (delta.x+delta.y+delta.z)/3; + var scale = {x:avg/delta.x, y:avg/delta.y, z:avg/delta.z}; + resolve({o:offset,s:scale}); + },60000); + }); + } + +function reading(){ + var start = Date.now(); + var m = Bangle.getCompass(); + var g = Bangle.getAccel(); + m.dx =m.x-O.x; m.dy=m.y-O.y; m.dz=m.z-O.z; + var d = Math.atan2(-m.dx,m.dy)*180/Math.PI; + if (d<0) d+=360; + var phi = Math.atan(-g.x/-g.z); + var cosphi = Math.cos(phi), sinphi = Math.sin(phi); + var theta = Math.atan(-g.y/(-g.x*sinphi-g.z*cosphi)); + var costheta = Math.cos(theta), sintheta = Math.sin(theta); + var xh = m.dy*costheta + m.dx*sinphi*sintheta + m.dz*cosphi*sintheta; + var yh = m.dz*sinphi - m.dx*cosphi; + var psi = Math.atan2(yh,xh)*180/Math.PI; + if (psi<0) psi+=360; + // display + buf.setFont('6x8',2); + buf.drawString("BX: "+m.dy,20,0);buf.drawString("X: "+Math.floor(g.y*1000),120,0); + buf.drawString("BY: "+m.dx,20,20);buf.drawString("Y: "+Math.floor(-g.x*1000),120,20); + buf.drawString("BZ: "+m.dz,20,40);buf.drawString("Z: "+Math.floor(-g.z*1000),120,40); + buf.drawString("HC: "+Math.floor(d),20,60); + buf.drawString("Roll: "+Math.floor(phi*180/Math.PI),20,80); + buf.drawString("Pitch: "+Math.floor(theta*180/Math.PI),20,100); + buf.drawString("TC: "+Math.floor(psi),20,120); + var duration = Date.now()-start; + buf.drawString("Time: "+Math.floor(duration)+"ms",20,140); + flip(); +} + +Bangle.on('kill',()=>{Bangle.setCompassPower(0);}); + +g.clear(); +g.setColor(1,1,1); +Bangle.setCompassPower(1); +buf.setFont('6x8',2); +buf.drawString("Calibrate",20,40); +flip(); +calibrate().then((f)=>{ + O=f.o; + S=f.s; + console.log(O); + console.log(S); + setInterval(reading,200); +});