2020-12-09 15:10:06 +00:00
var Yoff = 80 , pal2color = new Uint16Array ( [ 0 , 65535 , 2047 , 50712 ] , 0 , 2 ) , buf = Graphics . createArrayBuffer ( 240 , 60 , 2 , { msb : ! 0 } ) ; Bangle . setLCDTimeout ( 30 ) ; function flip ( b , c ) { g . drawImage ( { width : 240 , height : 60 , 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" , 24 ) ; 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 , 180 < b && ( b -= 360 ) , - 180 > b && ( b += 360 ) , b += 120 , 30 > b && ( b = 14 ) , 210 < b && ( b = 226 ) , buf . setColor ( 2 ) ,
2020-06-09 11:08:14 +00:00
buf . fillCircle ( b , 40 , 8 ) ) ; flip ( buf , Yoff ) } var heading = 0 ; function newHeading ( b , c ) { var a = Math . abs ( b - c ) , d = b > c ? 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 ) ; 360 < a && ( a -= 360 ) ; return a } var candraw = ! 1 , CALIBDATA = require ( "Storage" ) . readJSON ( "magnav.json" , 1 ) || null ;
function tiltfixread ( b , c ) { Date . now ( ) ; var a = Bangle . getCompass ( ) , d = Bangle . getAccel ( ) ; a . dx = ( a . x - b . x ) * c . x ; a . dy = ( a . y - b . y ) * c . y ; a . dz = ( a . z - b . z ) * c . z ; var e = Math . atan ( - d . x / - d . z ) , f = Math . cos ( e ) ; e = Math . sin ( e ) ; d = Math . atan ( - d . y / ( - d . x * e - d . z * f ) ) ; var k = Math . sin ( d ) ; a = 180 * Math . atan2 ( a . dz * e - a . dx * f , a . dy * Math . cos ( d ) + a . dx * e * k + a . dz * f * k ) / Math . PI ; 0 > a && ( a += 360 ) ; return a }
2020-12-09 15:10:06 +00:00
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" , 54 ) ; 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 . x < d ? h . x : d ; e = h . y < e ? h . y : e ; f = h . z < f ? h . z : f } , 100 ) ; return new Promise ( function ( h ) { setTimeout ( function ( ) { k && clearInterval ( k ) ; var m = ( b - d ) / 2 , n = ( c - e ) / 2 , p = ( a - f ) / 2 , l = ( m + n + p ) / 3 ; h ( { offset : { x : ( b + d ) / 2 , y : ( c + e ) / 2 , z : ( a + f ) / 2 } , scale : { x : l / m , y : l / n , z : l / p } } ) } , 1E4 ) } ) }
function docalibrate ( b , c ) { function a ( d ) { d ? ( 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 ) , calibrate ( ) . then ( function ( e ) { require ( "Storage" ) . write ( "magnav.json" , e ) ; CALIBDATA = e ; startdraw ( ) ; setButtons ( ) } ) ) : ( startdraw ( ) , setTimeout ( setButtons , 1E3 ) ) } void 0 === c && ( c = ! 1 ) ; stopdraw ( ) ; clearWatch ( ) ; c ? E . showAlert ( "takes 10 seconds" , "Calibrate" ) . then ( a . bind ( null , ! 0 ) ) : E . showPrompt ( "takes 10 seconds" , { title : "Calibrate" ,
buttons : { Start : ! 0 , Cancel : ! 1 } } ) . then ( a ) } Bangle . on ( "touch" , function ( b ) { candraw && ( 1 == b && ( brg = heading ) , 2 == b && ( brg = null ) ) } ) ; var intervalRef ; function startdraw ( ) { g . clear ( ) ; g . setColor ( 1 , . 5 , . 5 ) ; g . fillPoly ( [ 120 , Yoff + 60 , 110 , Yoff + 80 , 130 , Yoff + 80 ] ) ; g . setColor ( 1 , 1 , 1 ) ; Bangle . drawWidgets ( ) ; candraw = ! 0 ; intervalRef = setInterval ( reading , 200 ) } function stopdraw ( ) { candraw = ! 1 ; intervalRef && clearInterval ( intervalRef ) }
2020-06-09 11:08:14 +00:00
function setButtons ( ) { setWatch ( function ( ) { load ( ) } , BTN1 , { repeat : ! 1 , edge : "falling" } ) ; setWatch ( Bangle . showLauncher , BTN2 , { repeat : ! 1 , edge : "falling" } ) ; setWatch ( docalibrate , BTN3 , { repeat : ! 1 , edge : "falling" } ) } var SCREENACCESS = { withApp : ! 0 , request : function ( ) { this . withApp = ! 1 ; stopdraw ( ) ; clearWatch ( ) } , release : function ( ) { this . withApp = ! 0 ; startdraw ( ) ; setButtons ( ) } } ; Bangle . on ( "lcdPower" , function ( b ) { SCREENACCESS . withApp && ( b ? startdraw ( ) : stopdraw ( ) ) } ) ; Bangle . on ( "kill" , function ( ) { Bangle . setCompassPower ( 0 ) } ) ; Bangle . loadWidgets ( ) ;
2020-12-09 15:10:06 +00:00
Bangle . setCompassPower ( 1 ) ; CALIBDATA ? ( startdraw ( ) , setButtons ( ) ) : docalibrate ( { } , ! 0 ) ;