# SICS common configuration # Author: Ferdi Franceschini (ffr@ansto.gov.au) #set sicsroot /usr/local/sics VarMake sicsdebug Int Mugger sicsdebug 0 set telnetport 60001 set interruptport 60002 set serverport 60003 set quieckport 60004 # Simulation flags, possible values = true or false # true: The simulated driver will be used. # false: The real driver will be used. # icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) # fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) foreach {simflag icsval fakedev} { opal_simulation false true detector_simulation false true hmm_simulation false true environment_simulation false true counter_simulation false false motor_simulation false false chopper_simulation false false velsel_simulation false false plc_simulation false true rfgen_simulation false false goniometer_simulation false true magnetic_simulation false true } { dict set SIMFLAG_VAL $simflag ICSVAL $icsval dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev VarMake $simflag Text internal } VarMake sics_simulation 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 ../ sics_simulation false dict for {simflag d} $SIMFLAG_VAL { $simflag [dict get $d ICSVAL] } if [file exists hostport_config.tcl] { fileeval hostport_config.tcl } else { #TODO SICS-587 Abort with error when all instruments have been refactored. clientput WARNING: hostport_config.tcl is missing # sics_exitus } } else { if [file exists hostport_config_test.tcl] { fileeval hostport_config_test.tcl } else { #TODO SICS-587 Abort with error when all instruments have been refactored. clientput ERROR: hostport_config_test.tcl is missing sics_exitus } set SIMENV [split $env(SICS_SIMULATION) ":" ] if {[llength $SIMENV] == 2} { set SICSIM [lindex $SIMENV 0] set SOCKOFFSET [lindex $SIMENV 1] set telnetport [expr {$telnetport + $SOCKOFFSET}] set interruptport [expr {$interruptport + $SOCKOFFSET}] set serverport [expr {$serverport + $SOCKOFFSET}] set quieckport [expr {$quieckport + $SOCKOFFSET}] } else { set SICSIM $SIMENV } switch $SICSIM { "full" { set sicsroot ../ sics_simulation true } "fakedev" { set sicsroot ../ sics_simulation fakedev } "script_validator" { VarMake sics_script_validator Text internal sics_script_validator true set sicsroot ../script_validator/ set syncport $serverport set telnetport [expr {$telnetport + 10}] set interruptport [expr {$interruptport + 10}] set serverport [expr {$serverport + 10}] set quieckport [expr {$quieckport + 10}] sics_simulation true MakeSync localhost $syncport spy 007 ../log/syncfile.tcl } default { error "ERROR: SICS_SIMULATION must be full, script_validator, or fakedev, not $SICSIM" sics_exitus } } # Set obj_simulation flags for each SICS_SIMULATION mode switch $SICSIM { "full" - "simdriv" - "script_validator" { dict for {simflag d} $SIMFLAG_VAL { $simflag true } } "fakedev" { dict for {simflag d} $SIMFLAG_VAL { $simflag [dict get $d FAKEDEV] } } } } fileeval util/config_reader.tcl if [file exists ../sics_config.ini] { set config_dict [config_reader::parse_file ../sics_config.ini] } 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 $quieckport ServerOption ServerPort $serverport ServerOption InterruptPort $interruptport ServerOption TelWord sicslogin ServerOption TelnetPort $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 { 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 $::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 } foreach var [sicslist match *fb_status] { $var IDLE } 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 # return -1 if logged in as spy proc set_rights {level} { array set rights {1 manager manager 1 2 user user 2 3 spy spy 3} array set password {manager ansto user sydney spy 007} set myrights [SplitReply [config myrights] ] if {$myrights == $rights(spy)} { return -1 } # Convert 'level' to a name if it is passed as an integer if { [string is integer $level] } { set level $rights($level) } config rights $level $password($level) return $myrights } proc autosave { {interval 300} } { global AUTOSAVE_STATE set as_error 0 set myrights [set_rights manager] if {$myrights == -1} { return -code error "ERROR: You are not authorized for this operation" } set interval [string tolower $interval] if {$interval == "check" || $interval == "status"} { 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 { set as_error 1 } set_rights $myrights if {$as_error} { return -code error "ERROR: Invalid argument in '[info level 0]', should be an integer or 'check'" } } publish autosave user