2020-06-09 11:08:14 +00:00
|
|
|
const Yoff = 80;
|
2021-11-20 10:45:21 +00:00
|
|
|
var pal2color = new Uint16Array([g.theme.bg,g.theme.fg,g.theme.fg2,0xC618],0,2);
|
2020-12-09 15:10:06 +00:00
|
|
|
var buf = Graphics.createArrayBuffer(240,60,2,{msb:true});
|
2020-06-09 11:08:14 +00:00
|
|
|
Bangle.setLCDTimeout(30);
|
|
|
|
|
|
|
|
function flip(b,y) {
|
2020-12-09 15:10:06 +00:00
|
|
|
g.drawImage({width:240,height:60,bpp:2,buffer:b.buffer, palette:pal2color},0,y);
|
2020-06-09 11:08:14 +00:00
|
|
|
b.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
const labels = ["N","NE","E","SE","S","SW","W","NW"];
|
|
|
|
var brg=null;
|
|
|
|
|
|
|
|
function drawCompass(course) {
|
2021-11-19 15:08:45 +00:00
|
|
|
"ram"
|
2020-06-09 11:08:14 +00:00
|
|
|
buf.setColor(1);
|
2020-12-09 15:10:06 +00:00
|
|
|
buf.setFont("Vector",24);
|
2020-06-09 11:08:14 +00:00
|
|
|
var start = course-90;
|
|
|
|
if (start<0) start+=360;
|
|
|
|
buf.fillRect(28,45,212,49);
|
|
|
|
var xpos = 30;
|
|
|
|
var frag = 15 - start%15;
|
|
|
|
if (frag<15) xpos+=frag; else frag = 0;
|
|
|
|
for (var i=frag;i<=180-frag;i+=15){
|
|
|
|
var res = start + i;
|
|
|
|
if (res%90==0) {
|
|
|
|
buf.drawString(labels[Math.floor(res/45)%8],xpos-8,0);
|
|
|
|
buf.fillRect(xpos-2,25,xpos+2,45);
|
|
|
|
} else if (res%45==0) {
|
|
|
|
buf.drawString(labels[Math.floor(res/45)%8],xpos-12,0);
|
|
|
|
buf.fillRect(xpos-2,30,xpos+2,45);
|
|
|
|
} else if (res%15==0) {
|
|
|
|
buf.fillRect(xpos,35,xpos+1,45);
|
|
|
|
}
|
|
|
|
xpos+=15;
|
|
|
|
}
|
|
|
|
if (brg) {
|
|
|
|
var bpos = brg - course;
|
|
|
|
if (bpos>180) bpos -=360;
|
|
|
|
if (bpos<-180) bpos +=360;
|
|
|
|
bpos+=120;
|
|
|
|
if (bpos<30) bpos = 14;
|
|
|
|
if (bpos>210) bpos = 226;
|
|
|
|
buf.setColor(2);
|
|
|
|
buf.fillCircle(bpos,40,8);
|
|
|
|
}
|
|
|
|
flip(buf,Yoff);
|
|
|
|
}
|
|
|
|
|
|
|
|
var heading = 0;
|
|
|
|
function newHeading(m,h){
|
|
|
|
var s = Math.abs(m - h);
|
|
|
|
var delta = (m>h)?1:-1;
|
|
|
|
if (s>=180){s=360-s; delta = -delta;}
|
|
|
|
if (s<2) return h;
|
|
|
|
var hd = h + delta*(1 + Math.round(s/5));
|
|
|
|
if (hd<0) hd+=360;
|
|
|
|
if (hd>360)hd-= 360;
|
|
|
|
return hd;
|
|
|
|
}
|
|
|
|
|
2024-03-04 20:34:50 +00:00
|
|
|
//var candraw = false;
|
2020-06-09 11:08:14 +00:00
|
|
|
var CALIBDATA = require("Storage").readJSON("magnav.json",1)||null;
|
2023-01-22 09:10:29 +00:00
|
|
|
const tiltfixread = require("magnav").tiltfixread;
|
2020-06-09 11:08:14 +00:00
|
|
|
|
|
|
|
// Note actual mag is 360-m, error in firmware
|
|
|
|
function reading() {
|
|
|
|
var d = tiltfixread(CALIBDATA.offset,CALIBDATA.scale);
|
|
|
|
heading = newHeading(d,heading);
|
|
|
|
drawCompass(heading);
|
|
|
|
buf.setColor(1);
|
|
|
|
buf.setFont("6x8",2);
|
|
|
|
buf.setFontAlign(-1,-1);
|
|
|
|
buf.drawString("o",170,0);
|
2020-12-09 15:10:06 +00:00
|
|
|
buf.setFont("Vector",54);
|
2020-06-09 11:08:14 +00:00
|
|
|
var course = Math.round(heading);
|
|
|
|
var cs = course.toString();
|
|
|
|
cs = course<10?"00"+cs : course<100 ?"0"+cs : cs;
|
|
|
|
buf.drawString(cs,70,10);
|
|
|
|
flip(buf,Yoff+80);
|
|
|
|
}
|
|
|
|
|
2021-11-19 15:08:45 +00:00
|
|
|
var calibrating=false;
|
|
|
|
function docalibrate(first){
|
|
|
|
calibrating=true;
|
2020-06-09 11:08:14 +00:00
|
|
|
const title = "Calibrate";
|
2021-11-19 15:08:45 +00:00
|
|
|
const msg = "takes 20 seconds";
|
|
|
|
function restart() {
|
|
|
|
calibrating=false;
|
|
|
|
setButtons();
|
|
|
|
startdraw();
|
|
|
|
}
|
2020-06-09 11:08:14 +00:00
|
|
|
function action(b){
|
|
|
|
if (b) {
|
|
|
|
buf.setColor(1);
|
|
|
|
buf.setFont("Vector",24);
|
|
|
|
buf.setFontAlign(0,-1);
|
|
|
|
buf.drawString("Fig 8s to",120,0);
|
|
|
|
buf.drawString("Calibrate",120,26);
|
|
|
|
flip(buf,Yoff);
|
2023-01-22 09:10:29 +00:00
|
|
|
require("magnav").calibrate().then((r)=>{
|
2021-11-19 16:01:13 +00:00
|
|
|
CALIBDATA=r;
|
2020-06-09 11:08:14 +00:00
|
|
|
require("Storage").write("magnav.json",r);
|
2021-11-19 15:08:45 +00:00
|
|
|
restart()
|
2020-06-09 11:08:14 +00:00
|
|
|
});
|
|
|
|
} else {
|
2021-11-19 15:08:45 +00:00
|
|
|
restart()
|
|
|
|
}
|
2020-06-09 11:08:14 +00:00
|
|
|
}
|
|
|
|
if (first===undefined) first=false;
|
|
|
|
stopdraw();
|
|
|
|
if (first)
|
|
|
|
E.showAlert(msg,title).then(action.bind(null,true));
|
|
|
|
else
|
|
|
|
E.showPrompt(msg,{title:title,buttons:{"Start":true,"Cancel":false}}).then(action);
|
|
|
|
}
|
|
|
|
|
|
|
|
var intervalRef;
|
|
|
|
|
|
|
|
function startdraw(){
|
|
|
|
g.clear();
|
|
|
|
g.setColor(1,0.5,0.5);
|
2020-12-09 15:10:06 +00:00
|
|
|
g.fillPoly([120,Yoff+60,110,Yoff+80,130,Yoff+80]);
|
2020-06-09 11:08:14 +00:00
|
|
|
g.setColor(1,1,1);
|
|
|
|
Bangle.drawWidgets();
|
2024-03-04 20:34:50 +00:00
|
|
|
//candraw = true;
|
2020-06-09 11:08:14 +00:00
|
|
|
intervalRef = setInterval(reading,200);
|
|
|
|
}
|
|
|
|
|
|
|
|
function stopdraw() {
|
2024-03-04 20:34:50 +00:00
|
|
|
//candraw=false;
|
2020-06-09 11:08:14 +00:00
|
|
|
if(intervalRef) {clearInterval(intervalRef);}
|
|
|
|
}
|
|
|
|
|
|
|
|
function setButtons(){
|
2021-11-19 15:08:45 +00:00
|
|
|
function actions(v){
|
|
|
|
if (!v) docalibrate(false);
|
|
|
|
else if (v==1) brg=null;
|
|
|
|
else brg=heading;
|
|
|
|
}
|
|
|
|
Bangle.setUI("updown",actions);
|
2020-06-09 11:08:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Bangle.on('lcdPower',function(on) {
|
|
|
|
if (on) {
|
2021-11-19 15:08:45 +00:00
|
|
|
if (!calibrating) startdraw();
|
2020-06-09 11:08:14 +00:00
|
|
|
} else {
|
|
|
|
stopdraw();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
Bangle.on('kill',()=>{Bangle.setCompassPower(0);});
|
|
|
|
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.setCompassPower(1);
|
|
|
|
if (!CALIBDATA)
|
2021-11-19 15:08:45 +00:00
|
|
|
docalibrate(true);
|
2020-06-09 11:08:14 +00:00
|
|
|
else {
|
|
|
|
startdraw();
|
|
|
|
setButtons();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|