#!/bin/sh  
# \
  exec oagtclsh "$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)]

#Input:  /home/helios/oagData/pvdata/iocRecNamesOAG.sdds
#        /home/helios/oagData/sr/BPLD/BPLD_Config/config.sdds
#        /home/helios/oagData/sr/BPLD/BPLD_Config/BMLimits.sdds
#
#Output: ../requestFiles/SRBPLD.req
#        ../requestFiles/SRBPLD.req.set
#        ../requestFiles/SRBPLD.req.sr


APSStandardSetup

set rootname SRBPLD
set install 0
set start 0
set usage {usage: makeSRBPLDOffsetAndLImitReqFile [-output <filename> | -install <1|0>]}
set output "../requestFiles/${rootname}.req"
set recordFile /home/helios/oagData/pvdata/iocRecNamesOAG.sdds

#there are 35 IDs, 18 BPLDs, 1, 3, 5, ... 35
#for BM, there are additional sectors 37 and 39
set configFile /home/helios/oagData/sr/BPLD/BPLD_Config/config.sdds
set BPLDLimits /home/helios/oagData/sr/BPLD/BPLD_Config/BMLimits.sdds
set nameList [exec sdds2stream -col=Name $BPLDLimits]
set xLimits [exec sdds2stream -col=xLimit $BPLDLimits]
set yLimits [exec sdds2stream -col=yLimit $BPLDLimits]
foreach name $nameList x $xLimits y $yLimits {
    set limit($name.X) [expr $x*1000]
    set limit($name.Y) [expr $y*1000]
    #puts "$name x=$x y=$y xLimit=$limit($name.X) yLimit=$limit($name.Y)"
}
set tmpRoot /tmp/[APSTmpString]

set fileList1 ""
set fileList2 ""
for {set sector 1} {$sector<40} {incr sector 2} {
    if [catch {exec sddsprocess $configFile $tmpRoot.$sector -filter=col,BPLDSector,$sector,$sector } result] {
        puts stderr "Error1: $result"
    }
    APSAddToTmpFileList -ID bpld -fileList $tmpRoot.$sector
    set deviceList [exec sdds2stream -col=DeviceName $tmpRoot.$sector]
    set indexList [exec sdds2stream -col=BPLDIndex $tmpRoot.$sector]
    
    set pvList ""
    set valList ""
    set descList ""
    set unitsList ""
    set beamList ""
    set cateList ""
    foreach device $deviceList index $indexList {
        set name [string range $device 3 end]
        foreach plane {X Y} {
            #BM limit
            lappend pvList S[format %02d $sector]-LMPS:BM_${plane}${index}_TH-SP
            #  puts "$limit($name.$plane)"
            lappend valList $limit($name.$plane)
            lappend descList "$device $plane Limit"
            lappend unitsList um
            lappend beamList S[format %02d $sector]
            lappend cateList "BM_BPLD_Limit"
        }
    }
    #ID limit PVs
    foreach ID {ID1 ID2} {
        foreach pl {H V} offset {1000 500} {
            foreach nm {1 2 3} shape {Diamond1 Diamond2 Rect} {
                lappend pvList S[format %02d $sector]-LMPS:BPLD:${ID}:AIOL-${pl}${nm}-SP
                lappend valList $offset
                lappend descList "S[format %02d $sector] $ID $pl $shape Offset Limit"
                lappend unitsList um
                lappend beamList S[format %02d $sector]
                lappend cateList "ID_BPLD_Limit"
            }
            #angle 
            lappend pvList S[format %02d $sector]-LMPS:BPLD:${ID}:AIAL_${pl}-SP
            lappend valList 250
            lappend descList "S[format %02d $sector] $ID $pl Rect Angle Limit"
            lappend unitsList urad
            lappend beamList S[format %02d $sector]
            lappend cateList "ID_BPLD_Limit"
        }
    }
    
    if [catch {exec sddsmakedataset -pipe=out \
                 -col=ControlName,type=string -data=[join $pvList ,] \
                 -col=ValueString,type=string -data=[join $valList ,] \
                 -col=Description,type=string "-data=[join $descList ,]" \
                 -col=ReadbackUnits,type=string "-data=[join $unitsList ,]" \
                 -col=Beamline,type=string -data=[join $beamList ,] \
                 -col=Category,type=string "-data=[join $cateList ,]" \
                 | sddsprocess -pipe \
                 -define=col,Tolerance,0 \
                 -print=col,ControlType,pv \
                 -print=col,IsNumerical,y,type=character \
                 -print=col,OpsIntervention,n,type=character \
                 -print=col,IsReadOnly,n,type=character \
                 -print=col,IsProtected,y,type=character \
                 -print=col,Provider,ca \
                 -print=col,ExpectNumeric,y,type=character \
                 -print=col,ExpectFieldType,scalar \
                 -define=col,ExpectElements,1,type=long \
                 -print=para,InstallLocation,/home/helios/oagData/SCR/requestFiles/SRBPLD.req \
                 | sddsconvert -pipe -ascii \
                 | tee $tmpRoot.$sector.set \
                 | sddsconvert -pipe=in -del=col,ValueString $tmpRoot.$sector.pv } result] {
        return -code error "Erro creating BPLD req file for sector $sector: $result"
    }
    lappend fileList1 $tmpRoot.$sector.pv
    lappend fileList2 $tmpRoot.$sector.set
}

if [catch {eval exec sddscombine $fileList1 -pipe=out -merge -overwrite | \
             sddsconvert -pipe=in $output -ascii -delete=par,NumberCombined} result] {
    puts stderr "Error creating $output : $result"
    exit 1
}

exec sddsprocess $output $output.sr \
  -reprint=col,Category,BPLD -reprint=column,Beamline,SR "-delete=parameter,*"

if [catch {eval exec sddscombine $fileList2 -merge -pipe=out | \
             sddsconvert -pipe -ascii | \
             sddsprocess -pipe=in $output.set \
             "-match=col,Beamline=S01,Beamline=S03,|,Beamline=S05,|" \
             -delete=par,NumberCombined \
             -reprint=para,InstallLocation,/home/oxygen/DIAG/oagData/SCR/requestFiles/$rootname.req.set } result] {
    puts stderr "Error creating $output.set : $result"
    #exit 1
}
eval file delete $fileList1
eval file delete $fileList2
