- Fixed bugs in tcl code
This commit is contained in:
245
tcl/gumxml.tcl
245
tcl/gumxml.tcl
@ -1,181 +1,80 @@
|
|||||||
#-------------------------------------------------------------------------------
|
proc getdataType {path} {
|
||||||
# This file contains the implementation of the routines which generate the
|
return [lindex [split [hinfo $path] ,] 0]
|
||||||
# XML file as required by GumTree from a SICS Hipadaba.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, Tony Lam, Ferdi Franceccini, January 2007
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
proc makeGumHeader {} {
|
|
||||||
return "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n"
|
|
||||||
}
|
}
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
proc sicssplit {txt} {
|
|
||||||
set l [split $txt =]
|
proc make_nodes {path result indent} {
|
||||||
return [string trim [lindex $l 1]]
|
set nodename [file tail $path];
|
||||||
|
set type [getdataType $path]
|
||||||
|
set prefix [string repeat " " $indent]
|
||||||
|
set newIndent [expr $indent + 2]
|
||||||
|
#array set prop_list [ string trim [join [split [hlistprop $path] =]] ]
|
||||||
|
set prop_list(control) true
|
||||||
|
set we_have_control [info exists prop_list(control)]
|
||||||
|
if {$we_have_control == 0 || $we_have_control && $prop_list(control) == "true"} {
|
||||||
|
append result "$prefix<component id=\"$nodename\" dataType=\"$type\">\n"
|
||||||
|
foreach p [property_elements $path $newIndent] {
|
||||||
|
append result $p
|
||||||
|
}
|
||||||
|
foreach x [hlist $path] {
|
||||||
|
set result [make_nodes [string map {// /} "$path/$x"] $result $newIndent]
|
||||||
|
}
|
||||||
|
append result "$prefix</component>\n"
|
||||||
|
}
|
||||||
|
return $result
|
||||||
}
|
}
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
proc getNodePriv {nodepath} {
|
proc property_elements_old {path indent} {
|
||||||
set status [catch {hgetprop $nodepath priv} msg]
|
set prefix [string repeat " " $indent]
|
||||||
if {$status != 0} {
|
foreach {key value} [string map {= " "} [hlistprop $path]] {
|
||||||
set priv user
|
if {[string compare -nocase $key "control"] == 0} {continue}
|
||||||
} else {
|
lappend proplist "$prefix<property id=\"$key\">\n"
|
||||||
set priv [sicssplit $msg]
|
# foreach v [split $value ,] {
|
||||||
}
|
# lappend proplist "$prefix$prefix<value>$v</value>\n"
|
||||||
if {[string length $priv] < 2} {
|
# }
|
||||||
set priv user
|
lappend proplist "$prefix$prefix<value>$value</value>\n"
|
||||||
}
|
lappend proplist "$prefix</property>\n"
|
||||||
set priv [string toupper $priv]
|
}
|
||||||
if {[string compare $priv INTERNAL] == 0} {
|
if [info exists proplist] {return $proplist}
|
||||||
set priv READ_ONLY
|
|
||||||
}
|
|
||||||
return $priv
|
|
||||||
}
|
}
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
proc getNodeNumType {nodepath} {
|
proc property_elements {path indent} {
|
||||||
set txt [hinfo $nodepath]
|
set prefix [string repeat " " $indent]
|
||||||
set l [split $txt ,]
|
set data [hlistprop $path]
|
||||||
set numtype [lindex $l 0]
|
set propList [split $data \n]
|
||||||
set numType [string totitle $numtype]
|
foreach prop $propList {
|
||||||
return $numType
|
set pl [split $prop =]
|
||||||
|
set key [string trim [lindex $pl 0]]
|
||||||
|
set value [string trim [lindex $pl 1]]
|
||||||
|
if {[string length $key] < 1} {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
lappend proplist "$prefix<property id=\"$key\">\n"
|
||||||
|
lappend proplist "$prefix$prefix<value>$value</value>\n"
|
||||||
|
lappend proplist "$prefix</property>\n"
|
||||||
|
}
|
||||||
|
if [info exists proplist] {return $proplist}
|
||||||
}
|
}
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
proc makeXMLHeader {nodepath indent} {
|
proc getgumtreexml {path} {
|
||||||
set status [catch {hgetprop $nodepath type} msg]
|
append result "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n"
|
||||||
if {$status != 0} {
|
append result "<hipadaba:SICS xmlns:hipadaba=\"http://www.psi.ch/sics/hipadaba\" >\n"
|
||||||
set nodetype UNSPECIFIED
|
|
||||||
} else {
|
if {[string compare $path "/" ] == 0} {
|
||||||
set nodetype [string tolower [sicssplit $msg]]
|
foreach n [hlist $path] {
|
||||||
|
set result [make_nodes $n $result 2]
|
||||||
}
|
}
|
||||||
set nodename [file tail $nodepath]
|
} else {
|
||||||
set prefix [string repeat " " $indent]
|
# set result [make_nodes $path $result 2]
|
||||||
switch $nodetype {
|
foreach n [hlist $path] {
|
||||||
instrument {
|
set result [make_nodes $path/$n $result 2]
|
||||||
append result "$prefix <Instrument xmlns:hipadaba=\"http://www.psi.ch/hipadaba\" label=\""
|
|
||||||
append result "$nodename\">\n"
|
|
||||||
}
|
|
||||||
part {
|
|
||||||
set numtype [getNodeNumType $nodepath]
|
|
||||||
if {[string compare $numtype None] == 0} {
|
|
||||||
append result "$prefix<part id=\"$nodename\">\n"
|
|
||||||
} else {
|
|
||||||
set priv [getNodePriv $nodepath]
|
|
||||||
append result "$prefix<part id=\"$nodename\" dataType=\"$numtype\" privilege=\"$priv\">\n"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
motor {
|
|
||||||
set priv [getNodePriv $nodepath]
|
|
||||||
append result "$prefix<device id=\"$nodename\" "
|
|
||||||
append result "deviceType=\"Motor\" dataType=\"Float\" privilege=\"$priv\">\n"
|
|
||||||
}
|
|
||||||
drivable {
|
|
||||||
set priv [getNodePriv $nodepath]
|
|
||||||
append result "$prefix<device id=\"$nodename\" "
|
|
||||||
append result "deviceType=\"Drivable\" dataType=\"Float\" privilege=\"$priv\">\n"
|
|
||||||
}
|
|
||||||
graphset {
|
|
||||||
append result "$prefix <Graphics label=\""
|
|
||||||
append result "$nodename\">\n"
|
|
||||||
}
|
|
||||||
commandset {
|
|
||||||
append result "$prefix <Commands label=\""
|
|
||||||
append result "$nodename\">\n"
|
|
||||||
}
|
|
||||||
graphdata {
|
|
||||||
set status [catch {hgetprop $nodepath viewer} msg]
|
|
||||||
if {$status == 0} {
|
|
||||||
set view [sicssplit $msg]
|
|
||||||
append result "$prefix<graphdata id=\"$nodename\" viewer=\"$view\">\n"
|
|
||||||
} else {
|
|
||||||
append result "$prefix<graphdata id=\"$nodename\">\n"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command {
|
|
||||||
set priv [getNodePriv $nodepath]
|
|
||||||
append result "$prefix<command id=\"$nodename\" privilege=\"$priv\">\n"
|
|
||||||
}
|
|
||||||
axis {
|
|
||||||
set status [catch {hgetprop $nodepath dim} msg]
|
|
||||||
if {$status == 0} {
|
|
||||||
set dim [sicssplit $msg]
|
|
||||||
} else {
|
|
||||||
set dim 0
|
|
||||||
}
|
|
||||||
set numtype [getNodeNumType $nodepath]
|
|
||||||
append result "$prefix<axis privilege=\"READ_ONLY\" dataType=\"$numtype\" "
|
|
||||||
append result "id=\"$nodename\" dim=\"$dim\"/>\n"
|
|
||||||
}
|
|
||||||
data {
|
|
||||||
set numtype [getNodeNumType $nodepath]
|
|
||||||
append result "$prefix<data privilege=\"READ_ONLY\" "
|
|
||||||
append result "dataType=\"$numtype\" id=\"$nodename\"/>\n"
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
set numtype [getNodeNumType $nodepath]
|
|
||||||
set priv [getNodePriv $nodepath]
|
|
||||||
append result "$prefix<property privilege=\"$priv\" dataType=\"$numtype\" id=\"$nodename\"/>\n"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return $result
|
}
|
||||||
|
|
||||||
|
append result "</hipadaba:SICS>\n"
|
||||||
}
|
}
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
proc makeXMLClose {nodepath indent} {
|
if {[info exists guminit] == 0} {
|
||||||
set status [catch {hgetprop $nodepath type} msg]
|
set guminit 1
|
||||||
if {$status != 0} {
|
Publish getgumtreexml Spy
|
||||||
set nodetype UNSPECIFIED
|
|
||||||
} else {
|
|
||||||
set nodetype [string tolower [sicssplit $msg]]
|
|
||||||
}
|
|
||||||
set nodename [file tail $nodepath]
|
|
||||||
set prefix [string repeat " " $indent]
|
|
||||||
switch $nodetype {
|
|
||||||
instrument {
|
|
||||||
append result "$prefix</Instrument>\n"
|
|
||||||
}
|
|
||||||
part {
|
|
||||||
append result "$prefix</part>\n"
|
|
||||||
}
|
|
||||||
drivable -
|
|
||||||
motor {
|
|
||||||
append result "$prefix</device>\n"
|
|
||||||
}
|
|
||||||
graphset {
|
|
||||||
append result "$prefix</Graphics>\n"
|
|
||||||
}
|
|
||||||
commandset {
|
|
||||||
append result "$prefix</Commands>\n"
|
|
||||||
}
|
|
||||||
graphdata {
|
|
||||||
append result "$prefix</graphdata>\n"
|
|
||||||
}
|
|
||||||
command {
|
|
||||||
append result "$prefix</command>\n"
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
append result ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
proc scanHdbDir {path indent} {
|
|
||||||
set txl [hlist $path]
|
|
||||||
if {[string compare $path "/"] == 0} {
|
|
||||||
set path ""
|
|
||||||
}
|
|
||||||
set nodelist [split $txl \n]
|
|
||||||
set result ""
|
|
||||||
foreach node $nodelist {
|
|
||||||
if {[string length $node] < 1} {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
set nodepath $path/$node
|
|
||||||
append result [makeXMLHeader $nodepath $indent]
|
|
||||||
append result [scanHdbDir $nodepath [expr $indent + 2]]
|
|
||||||
append result [makeXMLClose $nodepath $indent]
|
|
||||||
}
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
proc getgumtreexml {path } {
|
|
||||||
append result [makeGumHeader]
|
|
||||||
append result [scanHdbDir $path 0]
|
|
||||||
}
|
}
|
||||||
|
@ -7,20 +7,50 @@
|
|||||||
# Thus is should be possible to debug SICS Tcl scripts in a normal
|
# Thus is should be possible to debug SICS Tcl scripts in a normal
|
||||||
# standalone interpreter without the overhead of restarting SICS
|
# standalone interpreter without the overhead of restarting SICS
|
||||||
# all the time. It may even be possible to use one of the normal
|
# all the time. It may even be possible to use one of the normal
|
||||||
# Tcl debugfgers then....
|
# Tcl debuggers then....
|
||||||
#
|
#
|
||||||
# Mark Koennecke, February 2006
|
# Mark Koennecke, February 2006
|
||||||
|
#
|
||||||
|
# Revamped for use in testing SICS instruments.
|
||||||
|
# Mark Koennecke, November 2006
|
||||||
#------------------------------------------------------------------
|
#------------------------------------------------------------------
|
||||||
|
set host(amor) amor.psi.ch
|
||||||
|
set host(dmc) dmc.psi.ch
|
||||||
|
set host(focus) focus.psi.ch
|
||||||
|
set host(hrpt) hrpt.psi.ch
|
||||||
|
set host(mars) mars.psi.ch
|
||||||
|
set host(morpheus) morpheus.psi.ch
|
||||||
|
set host(narziss) narziss.psi.ch
|
||||||
|
set host(poldi) poldi.psi.ch
|
||||||
|
set host(rita2) rita2.psi.ch
|
||||||
|
set host(sans) sans.psi.ch
|
||||||
|
set host(sansli) sans2.psi.ch
|
||||||
|
set host(tasp) tasp.psi.ch
|
||||||
|
set host(trics) trics.psi.ch
|
||||||
|
set host(local) localhost
|
||||||
|
|
||||||
set socke [socket localhost 2911]
|
#-------------------------------------------------------------------
|
||||||
gets $socke
|
# initialize the socket before debugging. If local == 1, then a
|
||||||
puts $socke "Spy 007"
|
# connection to localhost is built
|
||||||
flush $socke
|
|
||||||
gets $socke
|
|
||||||
#------------------------------------------------------------------
|
#------------------------------------------------------------------
|
||||||
proc unknown args {
|
proc initSicsDebug {instrument} {
|
||||||
global socke
|
global socke host
|
||||||
append com "transact " [join $args]
|
catch {close $socke}
|
||||||
|
set status [catch {set compi $host($instrument)} msg]
|
||||||
|
if {$status != 0} {
|
||||||
|
error "Host for $instrument not found"
|
||||||
|
}
|
||||||
|
set socke [socket $compi 2911]
|
||||||
|
gets $socke
|
||||||
|
puts $socke "Spy 007"
|
||||||
|
flush $socke
|
||||||
|
gets $socke
|
||||||
|
}
|
||||||
|
#----------------------------------------------------------------
|
||||||
|
proc sicscommand args {
|
||||||
|
global socke
|
||||||
|
append com "transact " [join $args]
|
||||||
|
puts stdout "Sending: $com"
|
||||||
puts $socke $com
|
puts $socke $com
|
||||||
flush $socke
|
flush $socke
|
||||||
set reply ""
|
set reply ""
|
||||||
@ -29,14 +59,16 @@ proc unknown args {
|
|||||||
if {[string first TRANSACTIONFINISHED $line] >= 0} {
|
if {[string first TRANSACTIONFINISHED $line] >= 0} {
|
||||||
return $reply
|
return $reply
|
||||||
} else {
|
} else {
|
||||||
append reply $line
|
append reply $line "\n"
|
||||||
if {[string first "\n" $line] < 0} {
|
|
||||||
append reply \n
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#------------------------------------------------------------------
|
#------------------------------------------------------------------
|
||||||
|
proc unknown args {
|
||||||
|
return [sicscommand $args]
|
||||||
|
}
|
||||||
|
#------------------------------------------------------------------
|
||||||
proc clientput args {
|
proc clientput args {
|
||||||
puts stdout [join $args]
|
puts stdout [join $args]
|
||||||
}
|
}
|
||||||
|
#------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user