#//#
# Leica TCA1800/RTS1200 specific functions
#
# Ulyxes - an open source project to drive total stations and
# publish observation results
# GPL v2.0 license
# Copyright (C) 2010-2012 Zoltan Siki
# @author Zoltan Siki
# @author Daniel Moka (TclDoc comments)
# @version 1.1
#//#
if {![info exists debuglevel]} {
source global.tcl
}
# load serial communication procs
source leica_com.tcl
#===============================================================================
# low level commands for instrument
#===============================================================================
# Set prism constant
# @param pc prism constant to set, mm unit
# @return 0 on succes or nonzero error code
proc SetPc {pc} {
set pc [format %.1f $pc] ;# set tenth of milimeter
# send value to instrument
if {[set res [Send "%R1Q,2024:$pc"]] != 0} {
return $res
}
return 0
}
# Get prism constant
# @return pc, mm unit
proc GetPc {} {
global buf
if {[set res [Send "%R1Q,2023:"]] != 0} {
return $res
}
# process input buffer
set buflist [split $buf ",:"]
return [lindex $buflist 4]
}
# Set ATR status on/off
# @param atr 0/1 = off/on
# @return 0 or error code
proc SetATR {atr} {
if {[set res [Send "%R1Q,18005:$atr"]] != 0} {
# try old command for old instruments
if {[set res [Send "%R1Q,9018:$atr"]] != 0} {
return $res
}
}
return 0
}
# Get ATR status
# @return 0/1 - off/on
proc GetATR {} {
global buf
if {[set res [Send "%R1Q,18006:"]] != 0} {
# try old command for old instruments
if {[set res [Send "%R1Q,9019:"]] != 0} {
return $res
}
}
# process input buffer
set buflist [split $buf ",:"]
return [lindex $buflist 4]
}
# Set Lock status on/off
# @param lock 0/1 = off/on
# @return 0 or error code
proc SetLock {lock} {
if {[set res [Send "%R1Q,18007:$lock"]] != 0} {
# try old command for old instruments
if {[set res [Send "%R1Q,9018:$lock"]] != 0} {
return $res
}
}
return 0
}
# Get Lock status
# @return 0/1 - off/on
proc GetLock {} {
global buf
if {[set res [Send "%R1Q,18008:"]] != 0} {
# try old command for old instruments
if {[set res [Send "%R1Q,9021:"]] != 0} {
return $res
}
}
# process input buffer
set buflist [split $buf ",:"]
return [lindex $buflist 4]
}
# Get atmospheric correction settings
# @return atmospheric settings as a list {lambda pressure drytemp wettemp}
proc GetAtmCorr {} {
global buf
if {[set res [Send "%R1Q,2029:"]] != 0} {
return $res
}
# process input buffer
set buflist [split $buf ",:"]
return [lrange $buflist 4 end]
}
# Set atmospheric correction settings
# @param lambda Constant for the instrument not changeable, use GetAtmCorr to get value
# @param pres pressure value
# @param dry dry temperature
# @param wet wet temperature
# @return 0 or error code
proc SetAtmCorr {lambda pres dry wet} {
if {[set res [Send "%R1Q,2028:$lambda,$pres,$dry,$wet"]] != 0} {
return $res
}
return 0
}
# Get refraction correction setting
# @return refraction correction as a list {on earthradius scale}
proc GetRefCorr {} {
global buf
if {[set res [Send "%R1Q,2031:"]] != 0} {
return $res
}
# process input buffer
set buflist [split $buf ",:"]
return [lrange $buflist 4 end]
}
# Set refraction correction settings
# @param on 0/1 off/on
# @param r earth radius
# @param s refractice scale
# @return 0 or error code
proc SetRefCorr {on r s} {
# TBD
if {[set res [Send "%R1Q,2030:$on,$r,$s"]] != 0} {
return $res
}
return 0
}
# Get station co-ordinates
# @return list {{37 N} {38 E} {39 Z}}
proc GetStation {} {
global buf
if {[set res [Send "%R1Q,2009:"]] != 0} {
return $res
}
# process input buffer
set buflist [split $buf ",:"]
set res {}
lappend res [list 38 [lindex $buflist 4]]
lappend res [list 37 [lindex $buflist 5]]
lappend res [list 39 [lindex $buflist 6]]
return $res
}
# Set station coordinates
# @param e easting
# @param n northing
# @param z elevation
# @return 0 or error code
proc SetStation {e n z} {
global buf
if {[set res [Send "%R1Q,2010:$e,$n,$z"]] != 0} {
return $res
}
return 0
}
# Get EDM (Electronic Distance Meter) mode
# @return mode
proc GetEDMMode {} {
global buf
if {[set res [Send "%R1Q,2021:"]] != 0} {
return $res
}
# process input buffer
set buflist [split $buf ",:"]
return [lindex $buflist 4]
}
# Set EDM mode
# @param mode EDM mode to set
# 0 -
# 1 - single to tape
# 2 - single to prism
# 3 - single fast to prism
# 4 - single long range
# 5 - single short range/ reflector less
# 6 - tracking to prism
# 7 - tracking dynamic
# 8 - tracking reflector less
# 9 - tracking fast
# 10- averaging to prism
# 11- averaging short range
# 12- averaging long range
# @return 0 on success, non zero in case of error
# TBD modes are changed
proc SetEDMMode {mode} {
global buf
if {[set res [Send "%R1Q,2020:$mode"]] != 0} {
return $res
}
return 0
}
# Set orientation angle
# @param ori whole circle bearing for the actual direction
# @param unit unit for bearing, optional (default RAD)
# @return return 0 or error code
proc SetOri {ori {units RAD}} {
global buf
# clear distance first
if {[set res [Measure 3]] != 0} { return $res }
# convert to radians
set ori_rad [ChangeAngle $ori $units "RAD"]
if {[set res [Send "%R1Q,2113:$ori_rad"]] != 0} {
return $res
}
return 0
}
# Set RCS searching mode
proc SetRCS {rcs} {
if {[set res [Send "%R1Q,18009:$rcs"]] != 0} {
return $res
}
return 0
}
# Rotate instrument to given direction
# @param hz horizontal direction
# @param v zenith angle
# @param units units for angles, optional (default RAD) see ChangeAngle
# @param atr 0/1 no atr/with atr, optional (default 0)
# @return return 0 or error code
proc Move {hz v {units "RAD"} {atr 0}} {
# convert to radians
set hz_rad [ChangeAngle $hz $units "RAD"]
set v_rad [ChangeAngle $v $units "RAD"]
# rotate instrument
if {[set res [Send "%R1Q,9027:$hz_rad,$v_rad,0,$atr,0"]] != 0} {
return $res
}
return 0
}
# Measure distance
#[NOTE: call "Measure 3" to clear previous distance measurement]
# @param prg measure program 1/2/3/... = default/track/clear..., optional (default 1)
# @param wait time in ms, optional (default 12000)
# @param incl inclination calculation - 0/1/2 = measure always (slow)/calculate (fast)/automatic, optional (default 0)
# @return list of observations: {{7 hz} {8 v} {9 sd}} or error code
proc Measure {{prg 1} {wait 12000} {incl 0}} {
global buf
# start distance meaurement
if {[set res [Send "%R1Q,2008:$prg,$incl"]] != 0} { return $res}
if {$prg == 3} {
# clear distance only and return
return $res
}
if {[set res [Send "%R1Q,2108:$wait,$incl"]] != 0} { return $res}
# process input buffer
set buflist [split $buf ",:"]
set res {}
lappend res [list 7 [lindex $buflist 4]]
lappend res [list 8 [lindex $buflist 5]]
lappend res [list 9 [lindex $buflist 6]]
return $res
}
# Measure distance
# @return list of observations: {{7 hz} {8 v} {9 sd}}
proc Measure1 {} {
global buf
if {[set res [Send "%R1Q,17017:2"]] != 0} { return $res}
# process input buffer
set buflist [split $buf ",:"]
set res {}
lappend res [list 7 [lindex $buflist 4]]
lappend res [list 8 [lindex $buflist 5]]
lappend res [list 9 [lindex $buflist 6]]
return $res
}
# Rotate the instrument and measure distance
# @param hz horizontal direction
# @param v zenith angle
# @param units angle unit, optional (default RAD)
# @param atr 0/1 atr off/on
proc MoveAndMeasure {hz v {units "RAD"} {atr 0}} {
if {[set res [Move $hz $v $units $atr]] != 0} { return $res }
if {[llength [set res [Measure]]] == 1} { return $res }
return $res
}
# Read coordinates from instrument calculated from last distance measurement
# @param wait wait time in ms, optional (default 1000)
# @param incl inclination calculation - 0/1/2 = measure always (slow)/calculate (fast)/automatic, optional (default 0)
# @return coordinate list : {{38 Easting} {37 Northing} {39 Height}}
proc Coords {{wait 1000} {incl 0}} {
global buf
# start distance measurement
if {[set res [Send "%R1Q,2082:$wait,$incl"]] != 0} { return $res}
set buflist [split $buf ":,"]
set res {}
lappend res [list 38 [lindex $buflist 4]]
lappend res [list 37 [lindex $buflist 5]]
lappend res [list 39 [lindex $buflist 6]]
return $res
}
# Read angles from instrument
# @return angles in radian in a list: {{7 hz} {8 v}}
proc GetAngles {} {
global buf
if {[set res [Send "%R1Q,2003:0"]] != 0} { return $res}
set buflist [split $buf ":,"]
set res {}
lappend res [list 7 [lindex $buflist 4]]
lappend res [list 8 [lindex $buflist 5]]
return $res
}
# Read instrument name
# @return instrument name
proc GetInstrument {} {
global buf
# TODO error result and normal output to separate?
if {[set res [Send "%R1Q,5004:0"]] != 0} { return $res}
set buflist [split $buf ":,"]
return [lindex $buflist 4]
}
# Read instrument id
# @return instrument id
proc GetId {} {
global buf
# TODO error result and normal output to separate?
if {[set res [Send "%R1Q,5003:0"]] != 0} { return $res}
set buflist [split $buf ":,"]
return [lindex $buflist 4]
}
# Search prism in a given area (elliptical)
# @param hzArea horizontal search region
# @param vArea vertical search region
# @param units units for hzArea and vArea
# @return 0 on success or error code
# TODO check 17020
proc Search {hzArea vArea {units "RAD"}} {
set hz_rad [ChangeAngle $hzArea $units "RAD"]
set v_rad [ChangeAngle $vArea $units "RAD"]
set res [Send "%R1Q,9029:$hz_rad,$v_rad,0"]
return $res
}
# Get internal temperature
# @return internal temperature in Celsius
proc GetIntTemp {} {
global buf
set res [Send "%R1Q,5011:"]
# process input buffer
set buflist [split $buf ",:"]
return [lindex $buflist 3]
}