#//# # Leica serial communication procs #
#Ulyxes - an open source project to drive total stations and # publish observation results
#GPL v2.0 license
#Copyright (C) 2010-2012 Zoltan Siki
Input chars are added to global input buffer (buf)
proc ReadCom {} { global buf ;# input buffer global com ;# com port global debuglevel if {[catch {set cmsg [read $com 1]} msg]} { # in case of error write error message puts $msg CloseCom } if {[string length $cmsg]} { if {$debuglevel > 1} { puts "in=$cmsg" ;# echo input char } set buf "$buf$cmsg" ;# append char to input buffer } if {[eof $com]} { # port closed? puts "EOF" CloseCom return } } # Close communicaton port proc CloseCom {} { global com global debuglevel if {[catch {close $com} msg] == 1} { if {$debuglevel > 0} { puts "error closing $com $msg" } } } # Open com port, port number and other parameters are read from a file. #Set global variable com
# @param par name of parameter file, optional (default leica.com) # @return 0 on success nonzero in case of error proc OpenCom {{par "leica.com"}} { global com if {[catch {source $par} msg] == 1} { puts "error openinng $par $msg" return 1 } if {[catch {set com [open $actPars(port) RDWR]} msg] == 1} { puts "error opening $com $msg" return 1 } if {[catch {fconfigure $com \ -mode $actPars(baud),$actPars(parity),$actPars(data),$actPars(stop) \ -blocking $actPars(blocking) \ -translation $actPars(translation) \ -buffering $actPars(buffering) \ -buffersize $actPars(buffsize)} msg] == 1} { catch {close $com} puts "error configuring com port $msg" return 1 } return 0 } # Send message to the instrument and wait for answer # @param msg message to send # @return return 0 on sucess or nonzero error status proc GetLine {} { global com global debuglevel set c "" if {[catch {gets $com c} err] == 1} { puts "error reading com: $err" return -2 } if {$debuglevel && [string length $c]} { puts $c } return $c } # Check NMEA checksum # @param msg message to check # @return 0 on success, 1 on error proc NMEAChecksum {msg} { foreach ch [split [string range [string trim $msg] 1 end-3] ""] { if {[info exists cs]} { set cs [expr {$cs ^ [scan $ch %c]}] } else { set cs [scan $ch %c] } } if {[format "%X" $cs] != [string range $msg end-1 end]} { return 1 } return 0 }