Files
sics/site_ansto/instrument/server_config.tcl
Ferdi Franceschini d778dd2bfe sicshipacaba.c
SICS-418 Make sure hnotify sends messages as hdbevents when using the
JSON protocl

site_ansto/instrument/config/hmm/hmm_object.tcl
Initialise the hmm object to make sure the read type is set.

nxscripts_common_1.tcl
Set the read type when saving the hmm data.

server_config.tcl
Fix the autosave command so that you can enable/disable autosave while
the histogram memory is running.

protocol.c
Reduce noise in log files when using the JSON protocol.  Don't log
messages generated during macro execution (ie within a TCL proc).

motor.c:MotorStatus
Abort the current operation, the scan command and batch files when a
motor object returns a hardware fault status value.

motor_dmc2280.c
set driver status to HWFault when the driver is in the error state.

r3251 | ffr | 2011-09-23 08:49:00 +1000 (Fri, 23 Sep 2011) | 25 lines
2012-11-15 17:16:12 +11:00

322 lines
8.8 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 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
}
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
MakeDrive
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_sctobj_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