#!/bin/sh
# \
exec oagwish "$0" "$@"

set auto_path [linsert $auto_path 0 /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0  /usr/local/oag/lib_patch/$env(HOST_ARCH)]
APSDebugPath
APSStandardSetup

set bpmType {};				# 0 or 2 to indicate whether P0 or P2 bpm in use
set p0p2pv {SRFB:dsp2:RMSuseP1sC.RVAL};	# pv name for P0/P2 switch pv
set xList {};				# list of sectors for in use bpms in x plane
set yList {};				# list of sectors for in use bpms in y plane
set sddsFileName {/home/helios/oagData/ADTFiles/srOther/sr.bpm.error.rmscalc.pv};
	# file name for the adt sdds file that is created

################################################################################

# connect to pv and return value
proc GetPvInfo {pvName} {
	global pvValue
	
	if {[catch {pv linkw pvValue $pvName} errmsg]} {
		APSAlertBox .alert -errorMessage  "Error linking to $pvName \n$errmsg"
		exit
	} 
	
	if {[pv stat pvValue errmsgarray]} {
		APSAlertBox .alert -errorMessage  "Error with connection to $pvName as follows: \nState: $errmsgarray(state)\nSeverity: $errmsgarray(severity)\nStatus: $errmsgarray(status)"
		exit
	}
	
	if {[catch {pv getw pvValue 30} errmsg]} {
		APSAlertBox .alert -errorMessage  "Error getting value from $pvName \n$errmsg"
		exit
	}
	
	if {![info exists pvValue]} {
		APSAlertBox .alert -errorMessage  "Unable to store value of $pvName."
		exit
	}
	
	set returnval $pvValue
	pv unlink pvValue
	return $returnval
}

# check if bpm is in use for x plane and add to list if true
proc CheckX {sector} {
	global bpmType
	global xList
	set pvName {}
	append pvName "SRFB:S" $sector ":P" $bpmType ":x:IncludeInRmsC.RVAL"
	set include [expr int([GetPvInfo $pvName])]
	if $include {lappend xList $sector}
}

# check if bpm is in use for y plane and add to list if true
proc CheckY {sector} {
	global bpmType
	global yList
	set pvName {}
	append pvName "SRFB:S" $sector ":P" $bpmType ":y:IncludeInRmsC.RVAL"
	set include [expr int([GetPvInfo $pvName])]
	if $include {lappend yList $sector}
}

# write the sdds configuration file
proc CreateSdds {} {
	global bpmType
	global xList
	global yList
	global sddsFileName
	if [catch {sdds open $sddsFileName w SDDS_BINARY} result] {
		APSAlertBox .alert -errormessage "Unable to open $sddsFileName for writing: $result"
		exit
	} else {
		set fd $result
	}
	
	# define parameters and columns
	sdds defineParameter $fd User -type SDDS_STRING
	sdds defineParameter $fd InstallLocation -type SDDS_STRING
	sdds defineParameter $fd ADTFileType -type SDDS_STRING
	sdds defineParameter $fd ADTNArrays -type SDDS_SHORT
	sdds defineParameter $fd ADTNAreas -type SDDS_SHORT
	sdds defineParameter $fd ADTLatticeFile -type SDDS_STRING
	sdds defineParameter $fd ADTHeading -type SDDS_STRING
	sdds defineParameter $fd ADTUnits -type SDDS_STRING
	sdds defineParameter $fd ADTUnitsPerDiv -type SDDS_DOUBLE
	sdds defineParameter $fd ADTScaleFactor -type SDDS_DOUBLE
	sdds defineParameter $fd ADTCenterVal -type SDDS_DOUBLE
	sdds defineParameter $fd ADTZoomArea -type SDDS_SHORT
	sdds defineParameter $fd ADTColor -type SDDS_STRING
	sdds defineColumn $fd ControlName -type SDDS_STRING
	sdds defineColumn $fd ControlType -type SDDS_STRING
	sdds defineColumn $fd ControlMode -type SDDS_STRING
	sdds defineColumn $fd StatusName -type SDDS_STRING
	sdds defineColumn $fd BPMName -type SDDS_STRING
	
	sdds writeLayout $fd
	
	sdds startPage $fd 160
	
	sdds setParameter $fd User "gfystro"
	sdds setParameter $fd InstallLocation "/home/helios/oagData/ADTFiles/srOther/sr.bpm.error.rmscalc.pv"
	sdds setParameter $fd ADTFileType "ADTPV"
	sdds setParameter $fd ADTNArrays 2
	sdds setParameter $fd ADTNAreas 2
	sdds setParameter $fd ADTLatticeFile "sr.lat"
	sdds setParameter $fd ADTHeading "SR RMS Motion Calc Horizontal"
	sdds setParameter $fd ADTUnits "mm"
	sdds setParameter $fd ADTUnitsPerDiv 5.000000e-03
	sdds setParameter $fd ADTScaleFactor 1.000000e+00
	sdds setParameter $fd ADTCenterVal 0.000000e+00
	sdds setParameter $fd ADTZoomArea 1
	sdds setParameter $fd ADTColor "Red"
	
		set xControlName {}
		set xControlType {}
		set xControlMode {}
		set xStatusName {}
		set xBPMName {}
	foreach sector $xList {	
		set cn {}
		set ct {pv}
		set cm {RO}
		set sn {}
		set bn {}
		
		append cn "S" $sector ":P" $bpmType ":msAve:x:ErrorCC"
		append sn "S" $sector ":P" $bpmType ":ms.XAVS"
		append bn "S" $sector ":P" $bpmType
		
		lappend xControlName $cn
		lappend xControlType $ct
		lappend xControlMode $cm
		lappend xStatusName $sn
		lappend xBPMName $bn
		
	}
	
	eval sdds setColumn $fd ControlName $xControlName
	eval sdds setColumn $fd ControlType $xControlType
	eval sdds setColumn $fd ControlMode $xControlMode
	eval sdds setColumn $fd StatusName $xStatusName
	eval sdds setColumn $fd BPMName $xBPMName

	sdds writePage $fd
	
	
	sdds startPage $fd 160
	
	sdds setParameter $fd User "gfystro"
	sdds setParameter $fd InstallLocation ""
	sdds setParameter $fd ADTFileType "ADTPV"
	sdds setParameter $fd ADTNArrays 2
	sdds setParameter $fd ADTNAreas 2
	sdds setParameter $fd ADTLatticeFile "sr.lat"
	sdds setParameter $fd ADTHeading "SR RMS Motion Calc Vertical"
	sdds setParameter $fd ADTUnits "mm"
	sdds setParameter $fd ADTUnitsPerDiv 5.000000e-03
	sdds setParameter $fd ADTScaleFactor 1.000000e+00
	sdds setParameter $fd ADTCenterVal 0.000000e+00
	sdds setParameter $fd ADTZoomArea 1
	sdds setParameter $fd ADTColor "Blue"
	
		set yControlName {}
		set yControlType {}
		set yControlMode {}
		set yStatusName {}
		set yBPMName {}
	foreach sector $yList {	
		set cn {}
		set ct {pv}
		set cm {RO}
		set sn {}
		set bn {}
		
		append cn "S" $sector ":P" $bpmType ":msAve:y:ErrorCC"
		append sn "S" $sector ":P" $bpmType ":ms.YAVS"
		append bn "S" $sector ":P" $bpmType
		
		lappend yControlName $cn
		lappend yControlType $ct
		lappend yControlMode $cm
		lappend yStatusName $sn
		lappend yBPMName $bn
		
	}
	
	eval sdds setColumn $fd ControlName $yControlName
	eval sdds setColumn $fd ControlType $yControlType
	eval sdds setColumn $fd ControlMode $yControlMode
	eval sdds setColumn $fd StatusName $yStatusName
	eval sdds setColumn $fd BPMName $yBPMName
	
	sdds writePage $fd
	
	sdds close $fd
}

################################################################################

########## checking whether P0 or P2 bpms in use - start
if {[catch {pv linkw p0check $p0p2pv} errmsg]} {
	APSAlertBox .alert -errorMessage "Error linking to $p0p2pv \n$errmsg"
	exit
} 
if {[pv stat p0check errmsgarray]} {
	APSAlertBox .alert -errorMessage  "Error with connection to $p0p2pv as follows: \nState: $errmsgarray(state)\nSeverity: $errmsgarray(severity)\nStatus: $errmsgarray(status)"
	exit
}

if {[catch {pv getw p0check} errmsg]} {
	APSAlertBox .alert -errorMessage  "Error getting value from $p0p2pv \n$errmsg"
	exit
}

if {![info exists p0check]} {
	APSAlertBox .alert -errorMessage  "Unable to store value of $p0p2pv."
	exit
}

if {[expr int($p0check)]} {
	set bpmType 2
} else {
	set bpmType 0
}

pv unlink p0check
########## checking whether P0 or P2 bpms in use - end

########## send 40 sectors A & B to each CheckX and CheckY - start
for {set i 1} {$i <= 40} {incr i} {
	set sector {}
	append sector $i A
	CheckX $sector
	CheckY $sector
	
	set sector {}
	append sector $i B
	CheckX $sector
	CheckY $sector
}
########## send 40 sectors A & B to each CheckX and CheckY - end

CreateSdds

#set launchAdt "adt -f $sddsFileName &"
#eval exec $launchAdt

exit
