2020-12-05 10:41:50 +00:00
var Yoff = 40 , pal2color = new Uint16Array ( [ 0 , 65535 , 2047 , 50712 ] , 0 , 2 ) , buf = Graphics . createArrayBuffer ( 240 , 50 , 2 , { msb : ! 0 } ) , candraw = ! 0 ; function flip ( a , c ) { g . drawImage ( { width : 240 , height : 50 , bpp : 2 , buffer : a . buffer , palette : pal2color } , 0 , c ) ; a . clear ( ) } var brg = 0 , wpindex = 0 , labels = "N NE E SE S SW W NW" . split ( " " ) , loc = require ( "locale" ) ;
function drawCompass ( a ) { if ( candraw ) { buf . setColor ( 1 ) ; buf . setFont ( "Vector" , 24 ) ; var c = a - 90 ; 0 > c && ( c += 360 ) ; buf . fillRect ( 28 , 45 , 212 , 49 ) ; var b = 30 , d = 15 - c % 15 ; 15 > d ? b += 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 ] , b - 8 , 0 ) , buf . fillRect ( b - 2 , 25 , b + 2 , 45 ) ) : 0 == f % 45 ? ( buf . drawString ( labels [ Math . floor ( f / 45 ) % 8 ] , b - 12 , 0 ) , buf . fillRect ( b - 2 , 30 , b + 2 , 45 ) ) : 0 == f % 15 && buf . fillRect ( b , 35 , b + 1 , 45 ) ; b += 15 } 0 != wpindex && ( a = brg - a , 180 < a && ( a -= 360 ) , - 180 > a && ( a += 360 ) , a += 120 , 30 > a && ( a = 14 ) , 210 < a && ( a = 226 ) ,
buf . setColor ( 2 ) , buf . fillCircle ( a , 40 , 8 ) ) ; flip ( buf , Yoff ) } } var heading = 0 ; function newHeading ( a , c ) { var b = Math . abs ( a - c ) , d = a > c ? 1 : - 1 ; 180 <= b && ( b = 360 - b , d = - d ) ; if ( 2 > b ) return c ; b = c + d * ( 1 + Math . round ( b / 5 ) ) ; 0 > b && ( b += 360 ) ; 360 < b && ( b -= 360 ) ; return b } var course = 0 , speed = 0 , satellites = 0 , wp , dist = 0 ; function radians ( a ) { return a * Math . PI / 180 } function degrees ( a ) { return ( 180 * a / Math . PI + 360 ) % 360 }
function bearing ( a , c ) { var b = radians ( c . lon - a . lon ) , d = radians ( a . lat ) , e = radians ( c . lat ) ; return Math . round ( degrees ( Math . atan2 ( Math . sin ( b ) * Math . cos ( e ) , Math . cos ( d ) * Math . sin ( e ) - Math . sin ( d ) * Math . cos ( e ) * Math . cos ( b ) ) ) ) } function distance ( a , c ) { var b = radians ( a . lon - c . lon ) * Math . cos ( radians ( ( a . lat + c . lat ) / 2 ) ) , d = radians ( c . lat - a . lat ) ; return Math . round ( 6371E3 * Math . sqrt ( b * b + d * d ) ) } var selected = ! 1 ;
function drawN ( ) { var a = loc . speed ( speed ) ; buf . setColor ( 1 ) ; buf . setFont ( "6x8" , 2 ) ; buf . drawString ( "o" , 100 , 0 ) ; buf . setFont ( "6x8" , 1 ) ; buf . drawString ( a . substring ( a . length - 3 ) , 220 , 40 ) ; buf . setFont ( "Vector" , 48 ) ; var c = course . toString ( ) ; c = 10 > course ? "00" + c : 100 > course ? "0" + c : c ; buf . drawString ( c , 10 , 0 ) ; buf . drawString ( a . substring ( 0 , a . length - 3 ) , 140 , 4 ) ; flip ( buf , Yoff + 70 ) ; buf . setColor ( 1 ) ; buf . setFont ( "Vector" , 24 ) ; a = brg . toString ( ) ; a = 10 > brg ? "00" + a : 100 > brg ? "0" + a : a ; buf . setColor ( 3 ) ; buf . drawString ( "Brg: " , 0 , 0 ) ; buf . drawString ( "Dist: " ,
0 , 30 ) ; buf . setColor ( selected ? 1 : 2 ) ; buf . drawString ( wp . name , 140 , 0 ) ; buf . setColor ( 1 ) ; buf . drawString ( a , 60 , 0 ) ; buf . drawString ( loc . distance ( dist ) , 60 , 30 ) ; flip ( buf , Yoff + 130 ) ; g . setFont ( "6x8" , 1 ) ; g . setColor ( 0 , 0 , 0 ) ; g . fillRect ( 10 , 230 , 60 , 239 ) ; g . setColor ( 1 , 1 , 1 ) ; g . drawString ( "Sats " + satellites . toString ( ) , 10 , 230 ) } var savedfix ;
function onGPS ( a ) { savedfix = a ; void 0 !== a && ( course = isNaN ( a . course ) ? course : Math . round ( a . course ) , speed = isNaN ( a . speed ) ? speed : a . speed , satellites = a . satellites ) ; candraw && ( void 0 !== a && 1 == a . fix && ( dist = distance ( a , wp ) , isNaN ( dist ) && ( dist = 0 ) , brg = bearing ( a , wp ) , isNaN ( brg ) && ( brg = 0 ) ) , drawN ( ) ) } var intervalRef ; function stopdraw ( ) { candraw = ! 1 ; intervalRef && clearInterval ( intervalRef ) }
function startTimers ( ) { candraw = ! 0 ; intervalRefSec = setInterval ( function ( ) { heading = newHeading ( course , heading ) ; course != heading && drawCompass ( heading ) } , 200 ) } function drawAll ( ) { g . setColor ( 1 , . 5 , . 5 ) ; g . fillPoly ( [ 120 , Yoff + 50 , 110 , Yoff + 70 , 130 , Yoff + 70 ] ) ; g . setColor ( 1 , 1 , 1 ) ; drawN ( ) ; drawCompass ( heading ) } function startdraw ( ) { g . clear ( ) ; Bangle . drawWidgets ( ) ; startTimers ( ) ; drawAll ( ) }
2022-07-26 15:14:04 +00:00
function setButtons ( ) { setWatch ( nextwp . bind ( null , - 1 ) , BTN1 , { repeat : ! 0 , edge : "falling" } ) ; setWatch ( doselect , BTN2 , { repeat : ! 0 , edge : "falling" } ) ; setWatch ( nextwp . bind ( null , 1 ) , BTN3 , { repeat : ! 0 , edge : "falling" } ) } var SCREENACCESS = { withApp : ! 0 , request : function ( ) { this . withApp = ! 1 ; stopdraw ( ) ; clearWatch ( ) } , release : function ( ) { this . withApp = ! 0 ; startdraw ( ) ; setButtons ( ) } } ; Bangle . on ( "lcdPower" , function ( a ) { SCREENACCESS . withApp && ( a ? startdraw ( ) : stopdraw ( ) ) } ) ; var waypoints = require ( "waypoints" ) . load ( ) ;
wp = waypoints [ 0 ] ; function nextwp ( a ) { selected && ( wpindex += a , wpindex >= waypoints . length && ( wpindex = 0 ) , 0 > wpindex && ( wpindex = waypoints . length - 1 ) , wp = waypoints [ wpindex ] , drawN ( ) ) } function doselect ( ) { selected && 0 != wpindex && void 0 === waypoints [ wpindex ] . lat && savedfix . fix && ( waypoints [ wpindex ] = { name : "@" + wp . name , lat : savedfix . lat , lon : savedfix . lon } , wp = waypoints [ wpindex ] , require ( "waypoints" ) . save ( waypoints ) ) ; selected = ! selected ; drawN ( ) } g . clear ( ) ; Bangle . setLCDBrightness ( 1 ) ; Bangle . loadWidgets ( ) ; Bangle . drawWidgets ( ) ;
2020-12-05 10:41:50 +00:00
Bangle . setGPSPower ( 1 ) ; drawAll ( ) ; startTimers ( ) ; Bangle . on ( "GPS" , onGPS ) ; setButtons ( ) ;