#!/bin/sh # the next line restarts using tclsh \ exec tclsh "$0" "$@" #//# # This program measures to given directions # @param input_file directions to points (tca file format) # @param atr 0/1 measure with no reflector/with reflector, optional (default 1) # @param edmMode distance measurement mode, optional (default 2) # @param com name of RS-232 parameter file, optional (default leica.com) # @param debuglevel 0/1/2 for debugging, optional (default 0) # #
Ulyses - an open source project to drive total stations and # publish observation results
#GPL v2.0 license
#Copyright (C) 2010-2012 Zoltan Siki
tca file format:
# !,station_id,ih (optional)
# point_id,hz,v,faces,PC
# faces = 0 no measurement, 1 measure face left, 2 measure two faces, 4 measure two rounds
# PC prism constant [mm], optional if missing no change to the measured distance
# @param fn path to tca file to load
# @return row number in case of error or 0 if file loaded
proc LoadTca {fn} {
global reg
global geo ;# GeoEasy like fieldbook
# open input file
if {[catch {set f1 [open $fn r]}] != 0} {
return -6
}
# get name part from path
catch "unset geo" ;# clear previous data
set lineno 0 ;# line numbers in input file
while {! [eof $f1]} {
gets $f1 ibuf
if {[string length [string trim $ibuf]] == 0} {continue}
set buflist [split $ibuf ","]
if {[lindex $buflist 0] == "!"} {
# station
set buf [list [list 2 [lindex $buflist 1]]]
if {[llength $buflist] > 2} {
lappend buf [list 3 [lindex $buflist 2]]
}
} else {
# observation
set buf [list [list 5 [lindex $buflist 0]]]
lappend buf [list 7 [lindex $buflist 1]]
lappend buf [list 8 [lindex $buflist 2]]
lappend buf [list 9 [lindex $buflist 3]]
lappend buf [list 112 [lindex $buflist 4]]
if {[llength $buflist] > 5} {
lappend buf [list 20 [lindex $buflist 5]]
}
}
# check for DMS angles (DDD-MM-SS format)
foreach code {7 8} {
if {[set w [GetVal $code $buf]] != "" && \
[regexp $reg(3) $w]} {
set buf [DelVal $code $buf]
set tmp [DMS2Rad $w]
if {[string length $w] > 0} {
lappend buf [list $code $tmp]
} else { ;# invalid angle value
catch {close $f1}
return [expr {$lineno + 1}]
}
}
}
# check for numeric values
foreach code {3 7 8 9 20 112} {
if {[set w [GetVal $code $buf]] != ""} {
if {[regexp $reg(2) $w] == 0} {
catch {close $f1}
return [expr {$lineno + 1}]
}
}
}
set geo($lineno) $buf
incr lineno
}
return 0
}
# make measurement from a geo array
# @param geo name of geo array in memory
# @param atr 0/1 without ATR/with ATR
proc Robot {geom {atr 1} {edmMode 2}} {
global PI PI2 maxtry
if {[GetEDMMode] != $edmMode} { SetEDMMode $edmMode }
upvar #0 $geom g
if {[GetVal 2 $g(0)] != ""} {
set first 1 ;# skip station record
} else {
set first 0
}
set last [expr {[array size g] - 1}]
# get max number of faces
set max 0
for {set i $first} {$i <= $last} {incr i} {
set m [GetVal 112 $g($i)]
if {$m > $max} { set max $m}
}
set n 0 ;# number of faces measured
while {$n < $max} {
if {[expr {$n % 2}] == 0} { ;# face left
set i1 $first
set i2 [expr {$last + 1}]
set i3 1
} else { ;# face right
set i1 $last
set i2 [expr {$first - 1}]
set i3 -1
}
for {set i $i1} {$i != $i2} {incr i $i3} {
if {[GetVal 112 $g($i)] > $n} {
set pn [GetVal 5 $g($i)]
set hz [GetVal 7 $g($i)]
set v [GetVal 8 $g($i)]
if {$i3 == -1} {
# change angles to face right
set hz [expr {$hz - $PI}]
while {$hz < 0} {set hz [expr {$hz + $PI2}]}
set v [expr {$PI2 - $v}]
}
# rotate instrument
set res ""
set j 0
while {$j < $maxtry} { ;# try measurement several times
if {[set res [Move $hz $v "RAD" $atr]] == 0} { ;# rotate instrument
if {[llength [set res [Measure]]] > 1} { ;# measure dist
if {[llength [set res [Coords]]] > 1} { ;# get coords
if {[info exists c($pn)]} {
set nn [GetVal 112 $c($pn)] ;# repeat count sofar
set nn1 [expr {$nn + 1}]
set east [expr {([GetVal 38 $c($pn)] * $nn + [GetVal 38 $res]) / $nn1}]
set north [expr {([GetVal 37 $c($pn)] * $nn + [GetVal 37 $res]) / $nn1}]
set elev [expr {([GetVal 39 $c($pn)] * $nn + [GetVal 39 $res]) / $nn1}]
set res [list [list 38 $east] [list 37 $north] [list 39 $elev] [list 112 $nn1]]
set c($pn) $res
break ;# leave while
} else {
lappend res [list 112 1] ;# repeat count
set c($pn) $res
break ;# leave while
}
}
}
}
incr j
after 5000 ;# wait before retry
}
}
}
incr n
}
# create SQL commands
set t [clock format [clock seconds] -format {%Y-%m-%d+%H:%M:%S}]
foreach pn [lsort -dictionary [array names c]] {
set e [GetVal 38 $c($pn)]
set n [GetVal 37 $c($pn)]
set z [GetVal 39 $c($pn)]
# TODO change localhost to parameter
set token [http::geturl "http://localhost/server_scripts/sensor2server.php?pn=$pn&epoch=$t&e=$e&n=$n&z=$z"]
upvar #0 $token state
if {$state(body) != "0"} {
puts "Error: $state(body)"
}
puts "$pn;$e;$n;$z;$t"
}
}
global argv argc
global geo
global coo
if {$argc == 0} {
puts "Usage robot.tcl input_file