Load instrument specific rules if defined in the anticollider.tcl

This commit is contained in:
Ferdi Franceschini
2014-02-14 15:04:05 +11:00
parent 4748f9ba58
commit 0a3805fa5a

View File

@ -1,8 +1,6 @@
# Author: Ferdi Franceschini (ffr@ansto.gov.au) # Author: Ferdi Franceschini (ffr@ansto.gov.au)
# TODO Handle sequencing when simultaneously moving multiple axes # TODO Handle sequencing when simultaneously moving multiple axes
# TODO Handle functional dependencies (just write your own tcl script)
# or get the generic acscript to call a user proc
AntiCollisionInstall AntiCollisionInstall
namespace eval anticollider { namespace eval anticollider {
@ -11,11 +9,41 @@ namespace eval anticollider {
array unset ::anticollider::veto_region array unset ::anticollider::veto_region
array set ::anticollider::veto_region "" array set ::anticollider::veto_region ""
# Don't show 'acscript' call on error. This is done by the anticollider
# module.
proc handle_acscript_exception {status message args} {
switch $status {
0 {
# TCL_OK, This is raised when you just drop out of the
# bottom of a 'catch' command.
return -code ok
}
1 {
# TCL_ERROR
return -code error "$message: $args"
}
2 {
# TCL_RETURN
return -code return "$message"
}
3 {
# TCL_BREAK
return -code break
}
4 {
# TCL_CONTINUE
return -code continue
}
default {
# Propogate user defined return codes with message
return -code $status "$message"
}
}
}
## ##
# @brief Load an anticollider script # @brief Load an anticollider script
proc ::anticollider::loadscript {args} { proc ::anticollider::loadscript {args} {
variable prog variable veto_rules
set prog ""
set fh [open $::cfPath(anticollider)/[lindex $args 0] RDONLY ] set fh [open $::cfPath(anticollider)/[lindex $args 0] RDONLY ]
while {[gets $fh line] >= 0} { while {[gets $fh line] >= 0} {
@ -23,7 +51,7 @@ proc ::anticollider::loadscript {args} {
if [regexp {^\s*$|^ *#} $line] { if [regexp {^\s*$|^ *#} $line] {
continue continue
} }
lappend prog $line lappend veto_rules $line
} }
} }
@ -31,7 +59,7 @@ proc ::anticollider::loadscript {args} {
# @brief Compile compile an anticollider declaration into a veto region table # @brief Compile compile an anticollider declaration into a veto region table
# for the anticollider script. # for the anticollider script.
# #
# @param vprog, an anticollider declaration as a list of quote enclosed lines. # @param veto_rules, an anticollider declaration as a list of quote enclosed lines.
# @return Generates the ::anticollider::veto_region lookup table. # @return Generates the ::anticollider::veto_region lookup table.
# #
# Example\n # Example\n
@ -42,14 +70,16 @@ proc ::anticollider::loadscript {args} {
# for sphi forbid { {0 5} {10 15} } when schi in { {5 10} {15 20} }\n # for sphi forbid { {0 5} {10 15} } when schi in { {5 10} {15 20} }\n
# forbid {-inf 5} when mtth in {0 10} for sphi\n # forbid {-inf 5} when mtth in {0 10} for sphi\n
# forbid {0 10} for samx whenall { samrot in {0 5} samy in {0 15} }\n # forbid {0 10} for samx whenall { samrot in {0 5} samy in {0 15} }\n
proc ::anticollider::genveto {vprog} { proc ::anticollider::genveto {veto_rules} {
variable veto_region variable veto_region
array unset veto_region array unset veto_region
set lnum 1 set lnum 1
foreach line $vprog { foreach line $veto_rules {
array unset vp array unset vp
array set vp $line array set vp $line
clientput "::anticollider::veto_rule: $line"
if [info exists vp(whenall)] { if [info exists vp(whenall)] {
foreach {mot in range} $vp(whenall) { foreach {mot in range} $vp(whenall) {
# if {[llength [join $range]] != 2} { # if {[llength [join $range]] != 2} {
@ -147,7 +177,6 @@ proc ::anticollider::veto_region_acscript {args} {
} }
} }
} }
anticollision add 0 $regmot $target
} }
} message ] } message ]
handle_exception $catch_status $message handle_exception $catch_status $message
@ -159,30 +188,38 @@ proc ::anticollider::init {} {
variable evp variable evp
variable veto_region variable veto_region
if [ catch { set catch_status [ catch {
::anticollider::genveto $::anticollider::prog if { ![info exists ::anticollider::veto_rules] } {
return
}
clientput Load anticollider rules:
if { [info procs ::anticollider::load_acrules] == "::anticollider::load_acrules" } {
::anticollider::load_acrules
}
::anticollider::genveto $::anticollider::veto_rules
foreach motor [array names veto_region] { foreach motor [array names veto_region] {
anticollision register $motor anticollision register $motor
} }
} message ] {
clientput [info level 0] ERROR: $message
if {$::errorCode=="NONE"} {return $message}
return -code error $message
}
}
proc ::anticollider::acscript {args} {
set catch_status [ catch {
if {[::anticollider::enable $args] == "false"} {
foreach {regmot target} $args {
anticollision add 0 $regmot $target
}
return
}
::anticollider::veto_region_acscript {*}$args
} message ] } message ]
handle_exception $catch_status $message handle_exception $catch_status $message
} }
lappend ::anticollider::scripts ::anticollider::veto_region_acscript
proc ::anticollider::acscript {args} {
set catch_status [ catch {
if {[::anticollider::enable $args] == "false"} {
return
} else {
foreach {regmot target} $args {
anticollision add 0 $regmot $target
}
}
foreach script $::anticollider::scripts {
$script {*}$args
}
} message ]
handle_acscript_exception $catch_status $message
}
publish ::anticollider::acscript user publish ::anticollider::acscript user
anticollision script ::anticollider::acscript anticollision script ::anticollider::acscript