This lets us make run and drive wrappers for the fermi motors on pelican by renaming the SICS run and drive.
325 lines
8.9 KiB
Tcl
325 lines
8.9 KiB
Tcl
# SICS common configuration
|
|
|
|
# Author: Ferdi Franceschini (ffr@ansto.gov.au)
|
|
|
|
#set sicsroot /usr/local/sics
|
|
VarMake opal_simulation Text internal
|
|
|
|
opal_simulation true
|
|
|
|
VarMake detector_simulation Text internal
|
|
detector_simulation false
|
|
|
|
VarMake hmm_simulation Text internal
|
|
hmm_simulation false
|
|
|
|
VarMake environment_simulation Text internal
|
|
environment_simulation false
|
|
|
|
VarMake counter_simulation Text internal
|
|
counter_simulation false
|
|
|
|
VarMake motor_simulation Text internal
|
|
motor_simulation false
|
|
|
|
VarMake chopper_simulation Text internal
|
|
chopper_simulation false
|
|
|
|
VarMake velsel_simulation Text internal
|
|
velsel_simulation false
|
|
|
|
VarMake plc_simulation Text internal
|
|
plc_simulation false
|
|
|
|
VarMake rfgen_simulation Text internal
|
|
rfgen_simulation false
|
|
|
|
VarMake goniometer_simulation Text internal
|
|
goniometer_simulation false
|
|
|
|
VarMake magnetic_simulation Text internal
|
|
magnetic_simulation false
|
|
|
|
VarMake sics_fullsimulation Text internal
|
|
|
|
source util/utility.tcl
|
|
source util/script_context_util.tcl
|
|
|
|
proc syncbackup {file} {
|
|
backup motorSave
|
|
backup $file
|
|
backup motorSave
|
|
}
|
|
publish syncbackup Spy
|
|
if {[info exists env(SICS_SIMULATION)] != 1} {
|
|
set sicsroot ../
|
|
source sics_ports.tcl
|
|
sics_fullsimulation false
|
|
} else {
|
|
switch $env(SICS_SIMULATION) {
|
|
"full" {
|
|
set sicsroot ../
|
|
source sics_ports.tcl
|
|
sics_fullsimulation true
|
|
}
|
|
"script_validator" {
|
|
VarMake sics_script_validator Text internal
|
|
sics_script_validator true
|
|
set sicsroot ../script_validator/
|
|
source script_validator_ports.tcl
|
|
sics_fullsimulation true
|
|
MakeSync localhost [expr [get_portnum $serverport ]-10] spy 007 ../log/syncfile.tcl
|
|
}
|
|
default {
|
|
error "ERROR: SICS_SIMULATION must be full or script_validator, not $env(SICS_SIMULATION)"
|
|
}
|
|
}
|
|
}
|
|
|
|
if {[string trim [lindex [split [sics_fullsimulation] =] 1]] == "true"} {
|
|
opal_simulation true
|
|
detector_simulation true
|
|
hmm_simulation true
|
|
counter_simulation true
|
|
environment_simulation true
|
|
motor_simulation true
|
|
chopper_simulation true
|
|
velsel_simulation true
|
|
plc_simulation true
|
|
rfgen_simulation true
|
|
goniometer_simulation true
|
|
magnetic_simulation true
|
|
}
|
|
|
|
set cfParent config
|
|
|
|
#WARNING Make sure there are no spaces after the back-slashes
|
|
array set cfPath [list\
|
|
parameters $cfParent/parameters\
|
|
source $cfParent/source\
|
|
anticollider $cfParent/anticollider\
|
|
motors $cfParent/motors\
|
|
optics $cfParent/optics\
|
|
counter $cfParent/counter\
|
|
chopper $cfParent/chopper\
|
|
environment $cfParent/environment\
|
|
hmm $cfParent/hmm\
|
|
scan $cfParent/scan\
|
|
velsel $cfParent/velsel\
|
|
nexus $cfParent/nexus\
|
|
hipadaba $cfParent/hipadaba\
|
|
plc $cfParent/plc\
|
|
commands $cfParent/commands\
|
|
beamline $cfParent/beamline\
|
|
goniometer $cfParent/goniometer\
|
|
tasmad $cfParent/tasmad\
|
|
robots $cfParent/robots\
|
|
]
|
|
|
|
ServerOption LogFileBaseName $sicsroot/log/serverlog
|
|
|
|
installprotocolhandler
|
|
|
|
|
|
ServerOption statusfile $sicsroot/log/status.tcl
|
|
ServerOption RedirectFile $sicsroot/log/stdout
|
|
ServerOption LogFileDir $sicsroot/log
|
|
ServerOption QuieckPort [get_portnum $quieckport ]
|
|
ServerOption ServerPort [get_portnum $serverport ]
|
|
ServerOption InterruptPort [get_portnum $interruptport ]
|
|
ServerOption TelWord sicslogin
|
|
ServerOption TelnetPort [get_portnum $telnetport ]
|
|
ServerOption ReadUserPasswdTimeout 600000
|
|
ServerOption AcceptTimeOut 10
|
|
ServerOption ReadTimeOut 10
|
|
SicsUser manager ansto 1
|
|
SicsUser user sydney 2
|
|
SicsUser spy 007 3
|
|
|
|
MakeDataNumber SicsDataNumber $sicsroot/DataNumber
|
|
|
|
#Instrument specific configs must set the Instrument variable
|
|
::utility::mkVar SicsDataPrefix Text internal
|
|
SicsDataPrefix [SplitReply [Instrument]]
|
|
|
|
::utility::mkVar SicsDataPostFix Text manager
|
|
SicsDataPostFix nx.hdf
|
|
|
|
foreach {var val klass priv} {
|
|
program_name "SICS" entry manager
|
|
run_mode "normal" entry user
|
|
} {
|
|
::utility::mkVar $var Text $priv $var true $klass true true
|
|
$var $val
|
|
}
|
|
|
|
::utility::mkVar SicsDataPath Text internal
|
|
SicsDataPath $sicsroot/data/
|
|
SicsDataPath lock
|
|
::utility::mkVar Title Text user title true experiment true true
|
|
::utility::mkVar SampleDescription Text user description true sample true true
|
|
::utility::mkVar SampleName Text user name true sample true true
|
|
::utility::mkVar SampleTitle Text user short_title true sample true true
|
|
::utility::mkVar User Text user name true user true true
|
|
::utility::mkVar Email Text user email true user true true
|
|
::utility::mkVar Phone Text user phone true user true true
|
|
::utility::mkVar starttime Text user start true experiment true true
|
|
|
|
exe batchpath ../batch
|
|
exe syspath ../batch
|
|
|
|
|
|
::utility::mkVar dataFileName Text user file_name true experiment true true
|
|
|
|
##
|
|
# @brief Internal action command procedure
|
|
proc _action {drivecmd obj action args} {
|
|
if [ catch {
|
|
if { [SplitReply [sicslist $obj type]] != "ActionObject" } {
|
|
error "ERROR: $obj must be an ActionObject"
|
|
}
|
|
$obj act $action
|
|
$drivecmd $obj 1
|
|
} message ] {
|
|
if {$::errorCode=="NONE"} {return $message}
|
|
return -code error $message
|
|
}
|
|
}
|
|
|
|
##
|
|
# @brief Non-blocking action command
|
|
proc action {obj action args} {
|
|
if [ catch {
|
|
_action run $obj $action $args
|
|
} message ] {
|
|
if {$::errorCode=="NONE"} {return $message}
|
|
return -code error $message
|
|
}
|
|
}
|
|
publish action user
|
|
|
|
##
|
|
# @brief Blocking action command, this will wait for the action to complete.
|
|
proc waitaction {obj action args} {
|
|
if [ catch {
|
|
_action drive $obj $action $args
|
|
} message ] {
|
|
if {$::errorCode=="NONE"} {return $message}
|
|
return -code error $message
|
|
}
|
|
}
|
|
publish waitaction user
|
|
|
|
proc server_set_sobj_attributes {} {
|
|
if [ catch {
|
|
foreach m [lrange [sicslist type Motor] 1 end] {
|
|
$m movecount 500
|
|
}
|
|
motor_set_sobj_attributes
|
|
::utility::set_motor_attributes
|
|
#XXX::utility::set_histomem_attributes
|
|
::utility::set_sobj_attributes
|
|
::utility::set_envcontrol_attributes
|
|
::plc::set_sobj_attributes
|
|
::counter::set_sobj_attributes
|
|
::nexus::set_sobj_attributes
|
|
::histogram_memory::set_sobj_attributes
|
|
::utility::set_chopper_attributes
|
|
::utility::set_sct_object_attributes
|
|
## TODO move the following to the new ansto gumxml.tcl
|
|
sicslist setatt getgumtreexml privilege internal
|
|
clientput "serverport [get_portnum $::serverport]"
|
|
} message ] {
|
|
if {$::errorCode=="NONE"} {return $message}
|
|
return -code error $message
|
|
}
|
|
}
|
|
|
|
proc server_init {} {
|
|
global AUTOSAVE_STATE
|
|
|
|
set catch_status [ catch {
|
|
::source::isc_initialize
|
|
::counter::isc_initialize
|
|
::histogram_memory::isc_initialize
|
|
::scan::isc_initialize
|
|
::anticollider::init
|
|
::commands::isc_initialize
|
|
::nexus::isc_initialize
|
|
########
|
|
# Parameters set above the restore command will be clobbered by
|
|
# the values in the status.tcl file
|
|
if [file exists $::sicsroot/log/status.tcl ] {
|
|
restore
|
|
}
|
|
file_status "UNKNOWN"
|
|
|
|
MakeStateMon hmscan
|
|
sicslist setatt sics_suid privilege readonly
|
|
sicslist setatt sics_suid klass data
|
|
sicslist setatt sics_suid kind hobj
|
|
sicslist setatt sics_suid mutable true
|
|
sicslist setatt sics_suid data true
|
|
sicslist setatt sics_suid control true
|
|
sicslist setatt sics_suid nxsave true
|
|
sicslist setatt sics_suid long_name sics_suid
|
|
|
|
set AUTOSAVE_STATE "DISABLED"
|
|
|
|
if [file exists ../extraconfig.tcl] {
|
|
fileeval ../extraconfig.tcl
|
|
}
|
|
server_set_sobj_attributes
|
|
buildHDB instrument_dictionary
|
|
|
|
} message ]
|
|
handle_exception $catch_status $message
|
|
}
|
|
|
|
proc doAutosave {} {
|
|
global AUTOSAVE_STATE
|
|
|
|
# Reset the AUTOSAVE_STATE variable in case some naughty user sets it directly
|
|
set AUTOSAVE_STATE "ENABLED"
|
|
set HMSTATE [SplitReply [hmm configure daq]]
|
|
set FSTATE [SplitReply [file_status]]
|
|
#broadcast CALLED: [info level 0], HMSTATE = $HMSTATE, FSTATE = $FSTATE
|
|
if { $FSTATE != "UNKNOWN" && $FSTATE != "OPEN" && $HMSTATE == "Started"} {
|
|
set saveIndex [SplitReply [autosaveIndex] ]
|
|
broadcast autosave $saveIndex
|
|
save $saveIndex "autosave"
|
|
}
|
|
}
|
|
publish doAutosave user
|
|
proc autosave { {interval 300} } {
|
|
global AUTOSAVE_STATE
|
|
|
|
if {$interval == "check"} {
|
|
if { $AUTOSAVE_STATE == "ENABLED" } {
|
|
return "AUTOSAVE $AUTOSAVE_STATE [sicspoll intervall doAutosave]"
|
|
} else {
|
|
return "AUTOSAVE $AUTOSAVE_STATE"
|
|
}
|
|
} elseif {[string is integer $interval]} {
|
|
if {$interval <= 0} {
|
|
if { $AUTOSAVE_STATE == "ENABLED" } {
|
|
sicspoll del doAutosave
|
|
set AUTOSAVE_STATE "DISABLED"
|
|
}
|
|
} else {
|
|
if {$AUTOSAVE_STATE == "DISABLED"} {
|
|
sicspoll add doAutosave script $interval doAutosave
|
|
# sicspoll listen # WARNING:When the listening client exits it leaves SICSPOLL task with a corrupt connection object.
|
|
set AUTOSAVE_STATE "ENABLED"
|
|
} else {
|
|
sicspoll intervall doAutosave $interval
|
|
}
|
|
}
|
|
} else {
|
|
return -code error "ERROR: Invalid argument in '[info level 0]', should be an integer or 'check'"
|
|
}
|
|
|
|
|
|
}
|
|
publish autosave user
|