Merging release 2.0 branch with CVS trunk
r2601 | ffr | 2008-05-30 10:26:57 +1000 (Fri, 30 May 2008) | 2 lines
This commit is contained in:
committed by
Douglas Clowes
parent
4a937e1608
commit
0749b0effa
@@ -32,11 +32,107 @@ set instrument_dictionary [subst {
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXinstrument type instrument}
|
||||
}
|
||||
instrument/status {
|
||||
instrument/aperture {
|
||||
privilege spy
|
||||
sobj {@any plc}
|
||||
sobj {@any aperture}
|
||||
datatype @none
|
||||
property {data false control true nxsave false klass @none type part}
|
||||
property {data true control true nxsave false klass NXaperture type part}
|
||||
}
|
||||
instrument/attenuator {
|
||||
privilege spy
|
||||
sobj {@any attenuator}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXattenuator type part}
|
||||
}
|
||||
instrument/beam_stop {
|
||||
privilege spy
|
||||
sobj {@any beam_stop}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXbeam_stop type part}
|
||||
}
|
||||
instrument/bending_magnet {
|
||||
privilege spy
|
||||
sobj {@any bending_magnet}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXbending_magnet type part}
|
||||
}
|
||||
instrument/crystal {
|
||||
privilege spy
|
||||
sobj {@any crystal}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXcrystal type part}
|
||||
}
|
||||
instrument/disk_chopper {
|
||||
privilege spy
|
||||
sobj {@any disk_chopper}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXdisk_chopper type part}
|
||||
}
|
||||
instrument/fermi_chopper {
|
||||
privilege spy
|
||||
sobj {@any fermi_chopper}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXfermi_chopper type part}
|
||||
}
|
||||
instrument/filter {
|
||||
privilege spy
|
||||
sobj {@any filter}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXfilter type part}
|
||||
}
|
||||
instrument/flipper {
|
||||
privilege spy
|
||||
sobj {@any flipper}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXflipper type part}
|
||||
}
|
||||
instrument/guide {
|
||||
privilege spy
|
||||
sobj {@any guide}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXguide type part}
|
||||
}
|
||||
instrument/insertion_device {
|
||||
privilege spy
|
||||
sobj {@any insertion_device}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXinsertion_device type part}
|
||||
}
|
||||
instrument/mirror {
|
||||
privilege spy
|
||||
sobj {@any mirror}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXmirror type part}
|
||||
}
|
||||
instrument/moderator {
|
||||
privilege spy
|
||||
sobj {@any moderator}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXmoderator type part}
|
||||
}
|
||||
instrument/polarizer {
|
||||
privilege spy
|
||||
sobj {@any polarizer}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXpolarizer type part}
|
||||
}
|
||||
instrument/positioner {
|
||||
privilege spy
|
||||
sobj {@any positioner}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXpositioner type part}
|
||||
}
|
||||
instrument/source {
|
||||
privilege spy
|
||||
sobj {@any source}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXsource type part}
|
||||
}
|
||||
instrument/velocity_selector {
|
||||
privilege spy
|
||||
sobj {@any velocity_selector}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXvelocity_selector type part}
|
||||
}
|
||||
instrument/detector {
|
||||
privilege spy
|
||||
@@ -44,29 +140,17 @@ set instrument_dictionary [subst {
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXdetector type part}
|
||||
}
|
||||
sample {
|
||||
privilege spy
|
||||
sobj {@any sample}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXsample type part}
|
||||
}
|
||||
instrument/collimator {
|
||||
privilege spy
|
||||
sobj {@any collimator}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXcollimator type part}
|
||||
}
|
||||
monitor {
|
||||
privilege spy
|
||||
sobj {@any monitor}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXmonitor type part}
|
||||
}
|
||||
instrument/monochromator {
|
||||
privilege spy
|
||||
sobj {@any monochromator @any crystal}
|
||||
sobj {@any monochromator}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXcrystal type part}
|
||||
property {data true control true nxsave false klass NXmonochromator type part}
|
||||
}
|
||||
instrument/slits {
|
||||
privilege spy
|
||||
@@ -74,17 +158,17 @@ set instrument_dictionary [subst {
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXfilter type part}
|
||||
}
|
||||
user {
|
||||
sample {
|
||||
privilege spy
|
||||
sobj {@any user}
|
||||
sobj {@any sample @any environment}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXuser type part}
|
||||
property {data true control true nxsave false klass NXsample type part}
|
||||
}
|
||||
experiment {
|
||||
monitor {
|
||||
privilege spy
|
||||
sobj {@any experiment}
|
||||
sobj {@any monitor}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXnote type part}
|
||||
property {data true control true nxsave false klass NXmonitor type part}
|
||||
}
|
||||
data {
|
||||
privilege spy
|
||||
@@ -92,6 +176,43 @@ set instrument_dictionary [subst {
|
||||
datatype @none
|
||||
property {data true control false nxsave false klass NXdata type part datatype UNKNOWN currentfiletype UNKNOWN}
|
||||
}
|
||||
event_data {
|
||||
privilege spy
|
||||
sobj {@any event_data}
|
||||
datatype @none
|
||||
property {data true control false nxsave false klass NXevent_data type part datatype UNKNOWN currentfiletype UNKNOWN}
|
||||
}
|
||||
user {
|
||||
privilege spy
|
||||
sobj {@any user}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXuser type part}
|
||||
}
|
||||
process {
|
||||
privilege spy
|
||||
sobj {@any process}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXprocess type part}
|
||||
}
|
||||
characterization {
|
||||
privilege spy
|
||||
sobj {@any characterization}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXcharacterization type part}
|
||||
}
|
||||
|
||||
experiment {
|
||||
privilege spy
|
||||
sobj {@any experiment}
|
||||
datatype @none
|
||||
property {data true control true nxsave false klass NXnote type part}
|
||||
}
|
||||
instrument/status {
|
||||
privilege spy
|
||||
sobj {@any plc}
|
||||
datatype @none
|
||||
property {data false control true nxsave false klass @none type part}
|
||||
}
|
||||
data/data_set {
|
||||
privilege spy
|
||||
datatype @none
|
||||
|
||||
@@ -15,8 +15,384 @@ InstallHdb
|
||||
|
||||
namespace eval ::hdb {
|
||||
namespace export buildHDB attlist
|
||||
|
||||
set NXlog_template {
|
||||
NXlog {
|
||||
$name {
|
||||
$paramarr(time)
|
||||
$paramarr(value)
|
||||
$paramarr(raw_value)
|
||||
$paramarr(description)
|
||||
$paramarr(average_value)
|
||||
$paramarr(average_value_error)
|
||||
$paramarr(minimum_value)
|
||||
$paramarr(maximum_value)
|
||||
$paramarr(duration)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set NXnote_template {
|
||||
NXnote {
|
||||
$name {
|
||||
$paramarr(author)
|
||||
$paramarr(date)
|
||||
$paramarr(type)
|
||||
$paramarr(file_name)
|
||||
$paramarr(description)
|
||||
$paramarr(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set NXbeam_template {
|
||||
$name {
|
||||
$paramarr(distance)
|
||||
$paramarr(incident_energy)
|
||||
$paramarr(final_energy)
|
||||
$paramarr(energy_transfer)
|
||||
$paramarr(incident_wavelength)
|
||||
$paramarr(incident_wavelength_spread)
|
||||
$paramarr(incident_beam_divergence)
|
||||
$paramarr(final_wavelength)
|
||||
$paramarr(incident_polarization)
|
||||
$paramarr(final_polarization)
|
||||
$paramarr(final_wavelength_spread)
|
||||
$paramarr(final_beam_divergence)
|
||||
$paramarr(flux)
|
||||
}
|
||||
}
|
||||
|
||||
# NOTE: paramarr(offset) was added for Quokka's DetPosYOffsetmm parameter
|
||||
set NXgeometry_template {
|
||||
NXgeometry {
|
||||
geometry {
|
||||
sobjlist {$paramarr(geomdescription)}
|
||||
NXshape {
|
||||
shape {
|
||||
sobjlist {$paramarr(shape) $paramarr(size)}
|
||||
}
|
||||
}
|
||||
NXtranslation {
|
||||
position {
|
||||
sobjlist {$paramarr(position) $paramarr(offset) $paramarr(coordinate_scheme)}
|
||||
NXgeometry {
|
||||
geometry {
|
||||
link {
|
||||
target {$paramarr(refpos)}
|
||||
nxalias {$paramarr(position)}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NXorientation {
|
||||
orientation {
|
||||
sobjlist {$paramarr(orientation)}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set NXaperture_template [subst -novariables {
|
||||
NXaperture {
|
||||
$name {
|
||||
sobjlist {$paramarr(material) $paramarr(description)}
|
||||
[ set NXgeometry_template ]
|
||||
}
|
||||
}
|
||||
} ]
|
||||
|
||||
set NXvelocity_selector_template [subst -novariables {
|
||||
NXvelocity_selector {
|
||||
$name {
|
||||
sobjlist {
|
||||
$paramarr(type)
|
||||
$paramarr(rotation_speed)
|
||||
$paramarr(radius)
|
||||
$paramarr(spwidth)
|
||||
$paramarr(length)
|
||||
$paramarr(num)
|
||||
$paramarr(twist)
|
||||
$paramarr(table)
|
||||
$paramarr(height)
|
||||
$paramarr(width)
|
||||
$paramarr(wavelength)
|
||||
$paramarr(wavelength_spread)
|
||||
}
|
||||
[ set NXgeometry_template ]
|
||||
}
|
||||
}
|
||||
} ]
|
||||
}
|
||||
|
||||
proc ::hdb::MakeLog {name klass paramlist} {
|
||||
variable NXlog_template
|
||||
array set paramarr $paramlist
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXlog_template
|
||||
::hdb::subtree_macro $name $klass $newtable
|
||||
}
|
||||
proc ::hdb::MakeNote {name klass paramlist} {
|
||||
variable NXnote_template
|
||||
array set paramarr $paramlist
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXnote_template
|
||||
::hdb::subtree_macro $name $klass $newtable
|
||||
}
|
||||
proc ::hdb::MakeBeam {name klass paramlist} {
|
||||
variable NXbeam_template
|
||||
array set paramarr $paramlist
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXbeam_template
|
||||
::hdb::subtree_macro $name $klass $newtable
|
||||
}
|
||||
|
||||
proc ::hdb:MakeEnvironment {name klass paramlist} {
|
||||
variable NXenvironment_template
|
||||
array set paramarr $paramlist
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXenvironment_template
|
||||
::hdb::subtree_macro $name $klass $newtable
|
||||
}
|
||||
|
||||
proc ::hdb::MakeGeometry {name klass paramlist} {
|
||||
variable NXgeometry_template
|
||||
array set paramarr $paramlist
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXgeometry_template
|
||||
::hdb::subtree_macro $name $klass $newtable
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Generates an hdb subtree macro from a named list of SICS objects.
|
||||
#
|
||||
# NOTE: Currently the only SICS objects supported are 'sicsvariable' and 'macro'.
|
||||
# @param name, This is the name of the aperture.
|
||||
# @paramlist, A name value list of aperture parameters. All parameters are optional.
|
||||
proc ::hdb::MakeAperture {name paramlist} {
|
||||
array set paramarr $paramlist
|
||||
variable NXaperture_template
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXaperture_template
|
||||
::hdb::subtree_macro $name instrument $newtable
|
||||
}
|
||||
|
||||
proc ::hdb::MakeVelocity_Selector {name paramlist} {
|
||||
variable NXvelocity_selector_template
|
||||
array set paramarr $paramlist
|
||||
set newtable [list]
|
||||
prune_NX newtable $NXvelocity_selector_template
|
||||
::hdb::subtree_macro $name instrument $newtable
|
||||
}
|
||||
|
||||
##
|
||||
# @brief This simplifies a NeXus-class template by removing unnecessary branches.
|
||||
# A NeXus-class template is a keyed-list which has Tcl variables for some of the nodes,
|
||||
# if the Tcl variables aren't defined for some branch then that branch is removed.
|
||||
# All other variables are expanded in place, also all 'sobjlists' are split up into type
|
||||
# specific lists. This is intended as a helper function for commands which generate
|
||||
# NeXus-class keyed lists from a simple set of optional parameters.
|
||||
#
|
||||
# @param NXklist, This is a keyed list representation of the NeXus class which will be augmented
|
||||
# with the pruned nx_template. Note this can just be an empty list.
|
||||
# @param nx_template, The NeXus-class template which will be pruned.
|
||||
# @param path, (optional, default="") Parent path in recursive calls.
|
||||
# @param node, (optional, default="") Current node in recursive calls.
|
||||
# @param level, (optional,default=1) The location of the template parameters in the callstack.
|
||||
proc prune_NX {NXklist nx_template {path ""} {node ""} {level 1}} {
|
||||
upvar $NXklist newtable
|
||||
# puts "[info level 0]\nCallstack depth = [info level]\nRecursion depth = [expr $level-1]"
|
||||
if {$path == ""} {
|
||||
set currpath $node
|
||||
} else {
|
||||
set currpath $path/$node
|
||||
}
|
||||
foreach {n v} $nx_template {
|
||||
switch $n {
|
||||
"sobjlist" {
|
||||
set has_sobj 0
|
||||
foreach var $v {
|
||||
if {[string index $var 0] == "$"} {
|
||||
set vn [string range $var 1 end]
|
||||
upvar $level $vn lvar
|
||||
if [info exists lvar] {
|
||||
foreach sobj $lvar {
|
||||
lappend [getatt $sobj type]_list $sobj
|
||||
}
|
||||
set has_sobj 1
|
||||
}
|
||||
} else {
|
||||
foreach sobj $var {
|
||||
lappend [getatt $sobj type]_list $sobj
|
||||
}
|
||||
set has_sobj 1
|
||||
}
|
||||
}
|
||||
if {$has_sobj} {
|
||||
if [info exists sicsvariable_list] {
|
||||
::utility::tabset newtable $currpath/sicsvariable [subst {{$sicsvariable_list}}]
|
||||
}
|
||||
if [info exists macro_list] {
|
||||
::utility::tabset newtable $currpath/macro [subst {{$macro_list}}]
|
||||
}
|
||||
} else {
|
||||
}
|
||||
}
|
||||
"link" {
|
||||
set linktarget ""
|
||||
array set linkinfo $v
|
||||
if {[string index $linkinfo(target) 0] == "$"} {
|
||||
set vn [string range $linkinfo(target) 1 end]
|
||||
upvar $level $vn lvar
|
||||
if [info exists lvar] {
|
||||
set linktarget $lvar
|
||||
}
|
||||
} else {
|
||||
set linktarget $linkinfo(target)
|
||||
}
|
||||
if {[string index $linkinfo(nxalias) 0] == "$"} {
|
||||
set vn [string range $linkinfo(nxalias) 1 end]
|
||||
upvar $level $vn avar
|
||||
if [info exists avar] {
|
||||
set linkname $avar
|
||||
}
|
||||
} else {
|
||||
set linkname $linkinfo(nxalias)
|
||||
}
|
||||
if {$linktarget != ""} {
|
||||
::utility::tabset newtable $currpath/link/target [subst {{$linktarget}}]
|
||||
::utility::tabset newtable $currpath/link/nxalias [subst {{$linkname}}]
|
||||
}
|
||||
}
|
||||
default {
|
||||
if {[string range $n 0 1] == "NX"} {
|
||||
set node $n
|
||||
} elseif {[string index $n 0] == "$"} {
|
||||
set vn [string range $n 1 end]
|
||||
upvar $level $vn lvar
|
||||
if [info exists lvar] {
|
||||
set node $lvar
|
||||
} else {
|
||||
}
|
||||
} else {
|
||||
set node $n
|
||||
}
|
||||
prune_NX newtable $v $currpath $node [expr $level+1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Make an aperture
|
||||
#
|
||||
# @param args optional name and description variables
|
||||
#proc MakeAperture {apname nxgeometry args} {
|
||||
# set nxaperture [::hdb::NXaperture $apname $nxgeometry $args]
|
||||
# ::hdb::subtree_macro $apname instrument $nxaperture
|
||||
#}
|
||||
|
||||
##
|
||||
# @brief Generate a subtree macro procedure
|
||||
#
|
||||
# @param Name of the subtree macro
|
||||
# @klass Category which the macro belongs to (usually a NeXus class)
|
||||
# @klist A keyed list which describes the subtree.
|
||||
proc ::hdb::subtree_macro {name klass klist} {
|
||||
set st_macroname ${name}_subtree_macro
|
||||
proc ::hdb::$st_macroname {} "return [list $klist]"
|
||||
::hdb::set_subtree_props ::hdb::$st_macroname $klass
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Publish an hdb_subtree macro and initialise it's property list
|
||||
#
|
||||
# @param st_name The name of the hdb_subtree macro
|
||||
# @param klass Where should the subtree be placed in the hdb heirarchy
|
||||
# @param control (optional, default=true) Add it to the control interface?
|
||||
# @param privilege (optional, default=user) Modification privilege.
|
||||
proc ::hdb::set_subtree_props {st_name klass {control "true"} {privilege "user"} } {
|
||||
publish $st_name mugger
|
||||
sicslist setatt $st_name klass $klass
|
||||
sicslist setatt $st_name control $control
|
||||
sicslist setatt $st_name privilege $privilege
|
||||
sicslist setatt $st_name kind "hdb_subtree"
|
||||
sicslist setatt $st_name long_name "@none"
|
||||
sicslist setatt $st_name data "true"
|
||||
sicslist setatt $st_name nxsave "true"
|
||||
}
|
||||
|
||||
# @brief Add a subtree to a given hipadaba path.
|
||||
#
|
||||
# @param hpath, Basepath for subtree
|
||||
# @param object, SICS object name
|
||||
# @param subtree, A nested Tcl list which represents the subtree
|
||||
# @param type, the SICS object type if we are adding SICS object node. Optional, default = @none.
|
||||
# @param makenode, type of node to make. Optional, default = @none.
|
||||
proc ::hdb::add_subtree {hpath subtree {object @none} {type @none} {makenode @none}} {
|
||||
set ::errorInfo ""
|
||||
set SICStypes {sicsvariable macro}
|
||||
if [catch {
|
||||
switch $makenode {
|
||||
"@none" {
|
||||
foreach {n v} $subtree {
|
||||
if {[lsearch -exact $::nexus_classes $n] != -1} {
|
||||
add_subtree $hpath $v $object $n NXclass
|
||||
} elseif {[lsearch -exact $SICStypes $n] != -1} {
|
||||
add_subtree $hpath $v $object $n sicsobject
|
||||
} elseif {$n=="link"} {
|
||||
add_subtree $hpath $v $object $n link
|
||||
} else {
|
||||
error "ERROR:Unknown type, '$n'"
|
||||
}
|
||||
}
|
||||
}
|
||||
"NXclass" {
|
||||
foreach {item val} $subtree {
|
||||
add_hpath $hpath $item
|
||||
hsetprop $hpath/$item klass $type
|
||||
add_subtree $hpath/$item $val $object
|
||||
}
|
||||
}
|
||||
"sicsobject" {
|
||||
foreach item $subtree {
|
||||
if {$item==$object} {
|
||||
error "ERROR: Infinite recursion, cannot add $item as a node to it's own hdb subtree"
|
||||
}
|
||||
set objtype [getatt $item type]
|
||||
if {$type != $objtype} {
|
||||
error "ERROR: Specified type of '$type' doesn't match actual type, '$objtype', for $item"
|
||||
}
|
||||
sobjadd $hpath $item
|
||||
}
|
||||
}
|
||||
"link" {
|
||||
set target [::utility::tabget subtree target]
|
||||
set nxalias [::utility::tabget subtree nxalias]
|
||||
foreach l $nxalias t $target {
|
||||
set refname [getatt $t long_name]
|
||||
::hdb::add_hpath $hpath $refname
|
||||
hsetprop $hpath/$refname data "true"
|
||||
hsetprop $hpath/$refname nxsave "false"
|
||||
hsetprop $hpath/$refname control "false"
|
||||
|
||||
hsetprop $hpath/$refname link $t
|
||||
hsetprop $hpath/$refname nxalias ${l}_posref
|
||||
hsetprop $hpath/$refname type nxvgroup
|
||||
hsetprop $hpath/$refname klass @none
|
||||
}
|
||||
}
|
||||
default {
|
||||
error "ERROR: Unknown node type, $makenode"
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $hpath}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
##
|
||||
# @brief Add an hdb path to the hdb tree at the given basePath
|
||||
#
|
||||
@@ -87,103 +463,113 @@ proc ::hdb::add_feedback {hpath sobj name} {
|
||||
proc ::hdb::add_node {basePath args} {
|
||||
global nodeindex
|
||||
array unset arg_array
|
||||
array set arg_array $args;
|
||||
|
||||
if {[info exists arg_array(path)] && [info exists arg_array(prop_list)]} {
|
||||
add_hpath $basePath $arg_array(path)
|
||||
if {$basePath == "/"} {
|
||||
set node_path /$arg_array(path)
|
||||
} else {
|
||||
set node_path $basePath/$arg_array(path)
|
||||
}
|
||||
# if {[info exists arg_array(prop_list)]} {
|
||||
foreach {prop pval} $arg_array(prop_list) {
|
||||
hsetprop $node_path $prop $pval
|
||||
if [ catch {
|
||||
array set arg_array $args
|
||||
if {[info exists arg_array(path)] && [info exists arg_array(prop_list)]} {
|
||||
add_hpath $basePath $arg_array(path)
|
||||
if {$basePath == "/"} {
|
||||
set node_path /$arg_array(path)
|
||||
} else {
|
||||
set node_path $basePath/$arg_array(path)
|
||||
}
|
||||
# }
|
||||
return $node_path
|
||||
}
|
||||
# if {[info exists arg_array(prop_list)]} {
|
||||
foreach {prop pval} $arg_array(prop_list) {
|
||||
hsetprop $node_path $prop $pval
|
||||
}
|
||||
# }
|
||||
return $node_path
|
||||
}
|
||||
|
||||
if {![info exists arg_array(dlen)]} {
|
||||
set arg_array(dlen) ""
|
||||
}
|
||||
set gp_path [file dirname $arg_array(node)]
|
||||
set node_name [file tail $arg_array(node)]
|
||||
if {$gp_path != "."} {
|
||||
add_hpath $basePath $gp_path
|
||||
set basePath $basePath/$gp_path
|
||||
hsetprop $basePath type part
|
||||
}
|
||||
if {[lsearch [hlist $basePath] $node_name] == -1} {
|
||||
#TODO allow hdb nodes of type drivable countable environment
|
||||
array set attribute [attlist $node_name]
|
||||
switch $arg_array(kind) {
|
||||
command {
|
||||
# A command is a macro, node=macro name
|
||||
set command $node_name
|
||||
set cmd_path [add_command $basePath $command]
|
||||
set node_path $cmd_path
|
||||
# The extra arguments for add_node are supplied by the command parameters
|
||||
# and command feedback procedures.
|
||||
if {[string length [info procs ${command}_parameters]] > 0} {
|
||||
${command}_parameters add_node $cmd_path
|
||||
} else {
|
||||
$command -map param ::hdb::add_cmd_par $cmd_path
|
||||
if {![info exists arg_array(dlen)]} {
|
||||
set arg_array(dlen) ""
|
||||
}
|
||||
set gp_path [file dirname $arg_array(node)]
|
||||
set node_name [file tail $arg_array(node)]
|
||||
if {$gp_path != "."} {
|
||||
add_hpath $basePath $gp_path
|
||||
set basePath $basePath/$gp_path
|
||||
hsetprop $basePath type part
|
||||
}
|
||||
if {[lsearch [hlist $basePath] $node_name] == -1} {
|
||||
#TODO allow hdb nodes of type drivable countable environment
|
||||
array set attribute [attlist $node_name]
|
||||
switch $arg_array(kind) {
|
||||
command {
|
||||
# A command is a macro, node=macro name
|
||||
set command $node_name
|
||||
set cmd_path [add_command $basePath $command]
|
||||
set node_path $cmd_path
|
||||
# The extra arguments for add_node are supplied by the command parameters
|
||||
# and command feedback procedures.
|
||||
if {[string length [info procs ${command}_parameters]] > 0} {
|
||||
${command}_parameters add_node $cmd_path
|
||||
} else {
|
||||
$command -map param ::hdb::add_cmd_par $cmd_path
|
||||
}
|
||||
if {[string length [info procs ${command}_feedback]] > 0} {
|
||||
add_hpath $cmd_path feedback
|
||||
hsetprop $cmd_path/feedback type part
|
||||
${command}_feedback add_node $cmd_path/feedback
|
||||
} else {
|
||||
add_hpath $cmd_path feedback
|
||||
hsetprop $cmd_path/feedback type part
|
||||
$command -map feedback ::hdb::add_feedback $cmd_path/feedback
|
||||
}
|
||||
}
|
||||
if {[string length [info procs ${command}_feedback]] > 0} {
|
||||
add_hpath $cmd_path feedback
|
||||
hsetprop $cmd_path/feedback type part
|
||||
${command}_feedback add_node $cmd_path/feedback
|
||||
} else {
|
||||
add_hpath $cmd_path feedback
|
||||
hsetprop $cmd_path/feedback type part
|
||||
$command -map feedback ::hdb::add_feedback $cmd_path/feedback
|
||||
hobj {
|
||||
hattach $basePath $node_name $arg_array(long_name)
|
||||
set node_path $basePath/$arg_array(long_name)
|
||||
hsetprop $node_path data [getatt $node_name data]
|
||||
hsetprop $node_path control [getatt $node_name control]
|
||||
hsetprop $node_path nxsave [getatt $node_name nxsave]
|
||||
hsetprop $node_path mutable [getatt $node_name mutable]
|
||||
hsetprop $node_path klass [getatt $node_name klass]
|
||||
if [info exists attribute(hdbchain)] {
|
||||
foreach pmot [split $attribute(hdbchain) ,] {
|
||||
hchain $node_path [getatt $pmot hdb_path]
|
||||
}
|
||||
}
|
||||
foreach child [hlist $node_path] {
|
||||
hsetprop $node_path/$child data false
|
||||
hsetprop $node_path/$child control [getatt $node_name control]
|
||||
hsetprop $node_path/$child nxsave false
|
||||
hsetprop $node_path/$child klass [getatt $node_name klass]
|
||||
}
|
||||
}
|
||||
script - getset {
|
||||
# A r/w pair of scripts, node = a node path
|
||||
set node_path $basePath/[getatt $node_name long_name]
|
||||
set data_type [getatt $node_name dtype]
|
||||
set data_length [getatt $node_name dlen]
|
||||
if {[getatt $node_name access] == "read_only"} {
|
||||
hmakescript $node_path $node_name hdbReadOnly $data_type $data_length
|
||||
} else {
|
||||
hmakescript $node_path $node_name $node_name $data_type $data_length
|
||||
}
|
||||
hsetprop $node_path sicsdev $node_name
|
||||
hsetprop $node_path nxalias $node_name
|
||||
hsetprop $node_path data [getatt $node_name data]
|
||||
hsetprop $node_path control [getatt $node_name control]
|
||||
hsetprop $node_path klass [getatt $node_name klass]
|
||||
hsetprop $node_path sdsinfo [getatt $node_name sdsinfo]
|
||||
hsetprop $node_path savecmd [getatt $node_name savecmd]
|
||||
#hmakescript $node_path $arg_array(rscript) $arg_array(wscript) $arg_array(dtype) $arg_array(dlen)
|
||||
}
|
||||
}
|
||||
hobj {
|
||||
hattach $basePath $node_name $arg_array(long_name)
|
||||
set node_path $basePath/$arg_array(long_name)
|
||||
hsetprop $node_path data [getatt $node_name data]
|
||||
hsetprop $node_path control [getatt $node_name control]
|
||||
hsetprop $node_path nxsave [getatt $node_name nxsave]
|
||||
hsetprop $node_path klass [getatt $node_name klass]
|
||||
foreach child [hlist $node_path] {
|
||||
hsetprop $node_path/$child data false
|
||||
hsetprop $node_path/$child control [getatt $node_name control]
|
||||
hsetprop $node_path/$child nxsave false
|
||||
hsetprop $node_path/$child klass [getatt $node_name klass]
|
||||
if {[info exists attribute(units)]} {
|
||||
hsetprop $node_path units $attribute(units)
|
||||
}
|
||||
if {[info exists arg_array(prop_list)]} {
|
||||
foreach {prop pval} $arg_array(prop_list) {
|
||||
hsetprop $node_path $prop $pval
|
||||
}
|
||||
}
|
||||
script {
|
||||
# A r/w pair of scripts, node = a node path
|
||||
set node_path $basePath/[getatt $node_name long_name]
|
||||
set data_type [getatt $node_name dtype]
|
||||
set data_length [getatt $node_name dlen]
|
||||
if {[getatt $node_name access] == "read_only"} {
|
||||
hmakescript $node_path $node_name hdbReadOnly $data_type $data_length
|
||||
} else {
|
||||
hmakescript $node_path $node_name $node_name $data_type $data_length
|
||||
}
|
||||
hsetprop $node_path sicsdev $node_name
|
||||
hsetprop $node_path nxalias $node_name
|
||||
hsetprop $node_path data true
|
||||
hsetprop $node_path control false
|
||||
hsetprop $node_path klass [getatt $node_name klass]
|
||||
hsetprop $node_path sdsinfo [getatt $node_name sdsinfo]
|
||||
hsetprop $node_path savecmd [getatt $node_name savecmd]
|
||||
#hmakescript $node_path $arg_array(rscript) $arg_array(wscript) $arg_array(dtype) $arg_array(dlen)
|
||||
}
|
||||
sicslist setatt $node_name hdb_path $node_path
|
||||
return $node_path
|
||||
}
|
||||
if {[info exists attribute(units)]} {
|
||||
hsetprop $node_path units $attribute(units)
|
||||
}
|
||||
if {[info exists arg_array(prop_list)]} {
|
||||
foreach {prop pval} $arg_array(prop_list) {
|
||||
hsetprop $node_path $prop $pval
|
||||
}
|
||||
}
|
||||
sicslist setatt $node_name hdb_path $node_path
|
||||
return $node_path
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,10 +604,15 @@ proc ::hdb::add_command {basePath command} {
|
||||
# @param sicsobj SICS object name
|
||||
# @return a list of name value pairs for the sicsobj attributes
|
||||
proc ::hdb::attlist {sicsobj} {
|
||||
foreach att [tolower_sicslist $sicsobj] {
|
||||
lappend atts [split [string range $att 0 end-1] =]
|
||||
if [ catch {
|
||||
foreach att [tolower_sicslist $sicsobj] {
|
||||
lappend atts [split [string range $att 0 end-1] =]
|
||||
}
|
||||
return [join $atts]
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
return [join $atts]
|
||||
}
|
||||
|
||||
|
||||
@@ -273,109 +664,108 @@ proc ::hdb::sobjadd {hpath sobj args} {
|
||||
# TODO Check if args parameter needs to be here, it might be there in case the function is called
|
||||
# with more than two arguments.
|
||||
array unset sobjatt
|
||||
array set sobjatt [attlist $sobj]
|
||||
sicslist setatt $sobj id $sobj
|
||||
switch $sobjatt(type) {
|
||||
motor - configurablevirtualmotor {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
set node_path [add_node $hpath node $sobj long_name $sobjatt(long_name) kind $sobjatt(kind)]
|
||||
if {[catch {hsetprop $node_path savecmd $sobjatt(savecmd)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sdsinfo $sobjatt(sdsinfo)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path nxalias $sobjatt(nxalias)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
}
|
||||
macro {
|
||||
# access attribute = ro,rw
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] != -1} {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
} else {
|
||||
set node_path [add_node $hpath kind $sobjatt(kind) node $sobj priv $sobjatt(privilege) ]
|
||||
if [info exists sobjatt(mutable)] {
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
if [ catch {
|
||||
array set sobjatt [attlist $sobj]
|
||||
sicslist setatt $sobj id $sobj
|
||||
switch $sobjatt(type) {
|
||||
motor - configurablevirtualmotor {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
}
|
||||
}
|
||||
sicsvariable {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
set node_path [add_node $hpath node $sobj long_name $sobjatt(long_name) kind $sobjatt(kind)]
|
||||
if {[catch {hsetprop $node_path sicsdev $sobj} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path nxalias $sobj} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path savecmd $sobjatt(savecmd)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sdsinfo $sobjatt(sdsinfo)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path privilege $sobjatt(privilege)} err]} {clientput $err error}
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
}
|
||||
node {
|
||||
}
|
||||
singlecounter {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
histmem {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
set node_path [add_node $hpath node $sobj long_name $sobjatt(long_name) kind $sobjatt(kind)]
|
||||
if {[catch {hsetprop $node_path savecmd $sobjatt(savecmd)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sdsinfo $sobjatt(sdsinfo)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path nxalias $sobjatt(nxalias)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sicsdev $sobj} err]} {clientput $err error}
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
}
|
||||
macro {
|
||||
# access attribute = ro,rw
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] != -1} {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
} elseif {$sobjatt(kind) == "hdb_subtree"} {
|
||||
add_subtree $hpath [$sobj]
|
||||
} else {
|
||||
set node_path [add_node $hpath kind $sobjatt(kind) node $sobj priv $sobjatt(privilege) ]
|
||||
if [info exists sobjatt(mutable)] {
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
}
|
||||
}
|
||||
}
|
||||
sicsvariable {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
set node_path [add_node $hpath node $sobj long_name $sobjatt(long_name) kind $sobjatt(kind)]
|
||||
if {[catch {hsetprop $node_path sicsdev $sobj} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path nxalias $sobj} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path savecmd $sobjatt(savecmd)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sdsinfo $sobjatt(sdsinfo)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path privilege $sobjatt(privilege)} err]} {clientput $err error}
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
}
|
||||
node {
|
||||
}
|
||||
singlecounter {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
histmem {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
set node_path [add_node $hpath node $sobj long_name $sobjatt(long_name) kind $sobjatt(kind)]
|
||||
if {[catch {hsetprop $node_path savecmd $sobjatt(savecmd)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sdsinfo $sobjatt(sdsinfo)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path nxalias $sobjatt(nxalias)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
if {[catch {hsetprop $node_path sicsdev $sobj} err]} {clientput $err error}
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
}
|
||||
nxscript {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
sicsdata {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
scanobject {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
environment_controller {
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
}
|
||||
nxscript {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
sicsdata {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
scanobject {
|
||||
# TODO
|
||||
todo_msg "$sobjatt(type) case, add $sobj to $hpath"
|
||||
}
|
||||
environment_controller {
|
||||
if {[info exists sobjatt(group)]} {
|
||||
set hpath [add_hpath $hpath $sobjatt(group)]
|
||||
if {[catch {hsetprop $hpath type part} err]} {clientput $err error}
|
||||
}
|
||||
if {[lsearch [hlist $hpath] $sobjatt(long_name)] == -1} {
|
||||
set node_path [add_node $hpath node $sobj long_name $sobjatt(long_name) kind $sobjatt(kind)]
|
||||
if {[catch { hsetprop $node_path savecmd $sobjatt(savecmd)} err]} {clientput $err error}
|
||||
if {[catch { hsetprop $node_path sdsinfo $sobjatt(sdsinfo)} err]} {clientput $err error}
|
||||
if {[catch { hsetprop $node_path nxalias $sobjatt(nxalias)} err]} {clientput $err error}
|
||||
if {[catch { hsetprop $node_path mutable $sobjatt(mutable)} err]} {clientput $err error}
|
||||
hmakescript $node_path/target "$sobj target" hdbReadOnly float
|
||||
hsetprop $node_path/target data false
|
||||
hsetprop $node_path/target control true
|
||||
} else {
|
||||
clientput "ERROR: $hpath/$sobjatt(long_name) for $sobj exists" error
|
||||
}
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
proc ::hdb::write_poll {pollnode val} {
|
||||
hsetprop $pollnode poll_interval $val
|
||||
sicspoll intervall $pollnode $val
|
||||
}
|
||||
proc ::hdb::read_poll {pollnode} {
|
||||
return [getatt $pollnode]
|
||||
}
|
||||
|
||||
##
|
||||
@@ -388,12 +778,17 @@ proc ::hdb::sobjadd {hpath sobj args} {
|
||||
# @param given_klass A klass in instdict_specification.tcl
|
||||
# @see sobjadd
|
||||
proc ::hdb::sobjtypeadd {hpath sobjtype given_klass} {
|
||||
foreach {sobj} [sobjlist $sobjtype $given_klass] {
|
||||
array unset sobjatt
|
||||
array set sobjatt [attlist $sobj]
|
||||
if {[info exists sobjatt(privilege)] && $sobjatt(privilege) != "internal"} {
|
||||
sobjadd $hpath $sobj
|
||||
if [ catch {
|
||||
foreach {sobj} [sobjlist $sobjtype $given_klass] {
|
||||
array unset sobjatt
|
||||
array set sobjatt [attlist $sobj]
|
||||
if {[info exists sobjatt(privilege)] && $sobjatt(privilege) != "internal"} {
|
||||
sobjadd $hpath $sobj
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,18 +848,23 @@ proc ::hdb::prune {instdict} {
|
||||
proc ::hdb::buildHDB {instDict} {
|
||||
#TODO add data control nxsave nxtyp properties
|
||||
upvar #0 $instDict dictionary
|
||||
prune dictionary
|
||||
foreach {n v} $dictionary {
|
||||
array unset varr
|
||||
array set varr $v
|
||||
array unset property_array
|
||||
array set property_array $varr(property)
|
||||
add_node / path $n prop_list $varr(property)
|
||||
if {[info exists varr(sobj)]} {
|
||||
foreach {sicstype sobj_klass} $varr(sobj) {
|
||||
if [ catch {
|
||||
prune dictionary
|
||||
foreach {n v} $dictionary {
|
||||
array unset varr
|
||||
array set varr $v
|
||||
array unset property_array
|
||||
array set property_array $varr(property)
|
||||
add_node / path $n prop_list $varr(property)
|
||||
if {[info exists varr(sobj)]} {
|
||||
foreach {sicstype sobj_klass} $varr(sobj) {
|
||||
sobjtypeadd /$n $sicstype $sobj_klass
|
||||
}
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,14 +11,15 @@ set boolean {true false}
|
||||
#}
|
||||
|
||||
# SICS OBJECTS MUST PROVIDE THE FOLLOWING INFORMATION
|
||||
set sobj_klass_list {@none aperture attenuator collimator command crystal data detector entry experiment graphics instrument monitor monochromator plc sample scan user}
|
||||
set sobj_klass_list {@none aperture attenuator collimator command crystal data detector entry environment experiment graphics instrument monitor monochromator plc sample scan sensor user}
|
||||
set sobj_sicstype_list {environment_controller sicsvariable macro motor configurablevirtualmotor singlecounter histmem nxscript sicsdata scanobject}
|
||||
# Different kinds of things are added to the hdb in different ways.
|
||||
# command: This is something a client can run with hset /a/b/c start, it may have parameters and feedback.
|
||||
# Parameters and feedback should be made available in 'ilists' named after the command.
|
||||
# script: Supplies an rscript and a wscript to attach to a node for hgets and hsets.
|
||||
# hobj: Something that can be hattached to a node. {motor sicsvariable histmem}.
|
||||
set sobj_kind_list {command hobj script}
|
||||
# hdb_subtree: Is a macro which returns a keyed list that describes a hdb subtree.
|
||||
set sobj_kind_list {command hobj script hdb_subtree}
|
||||
set sobj_interfacelist [subst {drivable {$boolean} countable {$boolean} callback {$boolean} environment {$boolean} }]
|
||||
|
||||
set privilege_list {spy user manager read_only internal}
|
||||
|
||||
Reference in New Issue
Block a user