# Android location/GPS/NMEA demo package require Tcl 8.5 package require Tk catch {package require vu} proc make_items c { set mw [winfo screenmmwidth $c] set mh [winfo screenmmheight $c] if {$mw < $mh} { set mh $mw } set fs [expr round($mh / 6)] set fonts(ttbig) [list {DejaVu Sans Mono} $fs] set fs [expr round($mh / 12)] set fonts(normal) [list {DejaVu Sans} $fs] set fonts(tt) [list {DejaVu Sans Mono} $fs] $c create text 10 20 -tags pos_NS -anchor nw -font $fonts(ttbig) $c create text 10 70 -tags pos_EW -anchor nw -font $fonts(ttbig) $c create text 10 120 -tags pos_A -anchor nw -font $fonts(ttbig) $c create text 10 330 -tags nmea -anchor nw -fill gray75 -font $fonts(tt) $c create text 600 70 -tags rate -anchor nw -fill black \ -font $fonts(ttbig) -text " stop " $c create rectangle {*}[$c bbox rate] -tags rateb -width 5 \ -outline orange -fill orange $c lower rateb for {set i 0} {$i < 10} {incr i} { set x [expr {60 + $i * 70}] catch { $c create sticker $x 200 [expr {$x + 50}] 300 \ -tags snr_$i -fill {} -orient vertical \ -font $fonts(normal) \ -relheight 0 -relwidth 1 -relx 0 -rely 0 \ -space 0 -width 0 -bar blue -color white \ -outline white } } .c bind rate <1> [list change_rate $c] .c bind rateb <1> [list change_rate $c] } proc change_rate c { set text [$c itemcget rate -text] switch -glob -- $text { { 60 *} { $c itemconfigure rate -text " stop " set rate 0 } { 30 *} { $c itemconfigure rate -text " 60 s " set rate 60000 } { 15 *} { $c itemconfigure rate -text " 30 s " set rate 30000 } { 10 *} { $c itemconfigure rate -text " 15 s " set rate 15000 } { 5 *} { $c itemconfigure rate -text " 10 s " set rate 15000 } default { $c itemconfigure rate -text " 5 s " set rate 10000 } } if {$rate <= 0} { borg location stop } else { borg location start $rate } } proc location_update c { set t [borg location get] borg log verbose AndroWish "location: $t" array set pos [borg location get] if {[info exists pos(gps)]} { array set pos $pos(gps) set color green } elseif {[info exists pos(network)]} { array set pos $pos(network) set color green2 } if {[info exists pos(latitude)]} { set ns [format "%12.6f" [expr abs($pos(latitude))]] if {$pos(latitude) < 0} { append ns "\u00b0 S" } else { append ns "\u00b0 N" } set ew [format "%12.6f" [expr abs($pos(longitude))]] if {$pos(longitude) < 0} { append ew "\u00b0 W" } else { append ew "\u00b0 E" } set alt [format "%7.1f MAMSL" $pos(altitude)] $c itemconfigure pos_NS -fill $color -text $ns $c itemconfigure pos_EW -fill $color -text $ew $c itemconfigure pos_A -fill $color -text $alt } else { $c itemconfigure pos_NS -fill yellow $c itemconfigure pos_EW -fill yellow $c itemconfigure pos_A -fill yellow } } proc gps_update c { set color blue set t [borg location gps] borg log verbose AndroWish "gps: $t" array set state $t if {$state(state) eq "off"} { set color blue4 $c itemconfigure pos_NS -fill yellow $c itemconfigure pos_EW -fill yellow $c itemconfigure pos_A -fill yellow for {set i 0} {$i < 10} {incr i} { $c itemconfigure snr_$i -bar $color } } set t [borg location satellites] if {$t eq ""} { for {set i 0} {$i < 10} {incr i} { $c itemconfigure snr_$i -bar blue4 } return } borg log verbose AndroWish "sat: $t" array set sat $t for {set i 0} {$i < 10} {incr i} { if {[info exists sat($i)]} { set v [dict get $sat($i) snr] set t [dict get $sat($i) prn] } else { set v 0 set t "" } if {$v > 60} { set v 60 } set v [expr {$v / 60.0}] $c itemconfigure snr_$i -rely [expr {1 - $v}] -relheight $v \ -text $t -bar $color } } proc nmea_update c { array set nmea [borg location nmea] if {[info exists nmea(nmea)]} { set text [split [$c itemcget nmea -text] "\n"] set t [split [string map [list "\r" ""] [string trim $nmea(nmea)]]] lappend text {*}$t set text [lrange $text end-15 end] $c itemconfigure nmea -text [join $text "\n"] } } wm attributes . -fullscreen 1 borg screenorientation landscape canvas .c -bg black -bd 0 -highlightthickness 0 pack .c -side top -fill both -expand 1 -padx 0 -pady 0 make_items .c bind all exit bind . <> [list location_update .c] bind . <> [list gps_update .c] bind . <> [list nmea_update .c] change_rate .c