Files
sics/site_ansto/instrument/server_config.tcl
Ferdi Franceschini 16e744be12 Moved MakeDrive to instrument specific configuration.
This lets us make run and drive wrappers for the fermi motors on pelican
by renaming the SICS run and drive.
2013-04-09 14:15:55 +10:00

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