# 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 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