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

#
# $Log: not supported by cvs2svn $
# wrote by Hairong Shang (Nov. 2007)

set outputDir /home/helios/oagData/controlFiles/Linac/conditioning


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)]

package require sdds

proc CreateStandardizeConfig {args} {
    global outputDir
    set stList {L1:PG1:SM L1:RG1:LFA L1:RG2:LFA L2:QM1 L2:QM2 L2:QM3 L2:QM4 L2:QM5 L2:QM6 L2:QM7 L2:QM8 L3:AM1 L3:BM:US L3:BM:DS L3:QM1 L3:QM2 L3:QM3 L3:QM4 L3:QM5 L3:QM6 L4:QM1 L4:QM2 L4:QM3 L4:QM4 L4:QM5 L4:QM6 L4:QM7 L5:QM1 L5:QM2 L5:QM3 L5:QM4 L5:AM1:PS2}
    set suffixList1 {Std1SU Std1SU Std1SU}
    set suffixList2 [APSReplicateItem -item StandardizeSUB -number [expr [llength $stList]-4]]
    set suffixList [concat $suffixList1 $suffixList2 stdSU]
    
    set devList ""
    set rootList ""
    set appList ""
    foreach pv $stList {
        lappend devList dev
        lappend appList below
        if [regexp {L1} $pv] {
            lappend rootList L1
        } elseif [regexp {L2:} $pv] {
            lappend rootList L2
        } elseif [regexp {L3:} $pv] {
            lappend rootList L3
        } elseif [regexp {L4:} $pv] {
            lappend rootList L4
        } elseif [regexp {L5:} $pv] {
            lappend rootList L5
        } else {
            puts $pv
        }
    }
   
    set stData(ColumnNames) "ControlName Beamline SuffixName ControlType To From Minutes Seconds NumCycles Approach Finish"
    set stData(ColumnInfo.ControlName) "type SDDS_STRING"
    set stData(ColumnInfo.Beamline) "type SDDS_STRING"
    set stData(ColumnInfo.SuffixName) "type SDDS_STRING"
    set stData(ColumnInfo.ControlType) "type SDDS_STRING"
    set stData(ColumnInfo.To) "type SDDS_DOUBLE units A"
    set stData(ColumnInfo.From) "type SDDS_DOUBLE units A"
    set stData(ColumnInfo.Minutes) "type SDDS_LONG"
    set stData(ColumnInfo.Seconds) "type SDDS_LONG"
    set stData(ColumnInfo.NumCycles) "type SDDS_LONG"
    set stData(ColumnInfo.Approach) "type SDDS_STRING"
    set stData(ColumnInfo.Finish) "type SDDS_DOUBLE"
    set stData(Column.ControlName) [list $stList]
    set stData(Column.Beamline) [list $rootList]
    set stData(Column.SuffixName) [list $suffixList]
    set stData(Column.ControlType) [list $devList]
    set stData(Column.Approach) [list $appList]
    
    set pvList ""
    foreach pv $stList suff $suffixList {
        lappend pvList ${pv}:$suff
    }
    
    if [catch {exec cavget -list=[join $pvList ,] -list=.D -printErrors} minuteList] {
        puts stderr "Error1: $minuteList"
        exit 1
    }

    if [catch {exec cavget -list=[join $pvList ,] -list=.E -printErrors} secondList] {
        puts stderr "Error2: $secondList"
        exit 1
    }

    if [catch {exec cavget -list=[join $pvList ,] -list=.B -printErrors} fromList] {
        puts stderr "Error3: $fromList"
        exit 1
    }
    
    if [catch {exec cavget -list=[join $pvList ,] -list=.C -printErrors} toList] {
        puts stderr "Error4: $toList"
        exit 1
    }
    
    if [catch {exec cavget -list=[join $pvList ,] -list=.F -printErrors} cycleList] {
        puts stderr "Error5: $cycleList"
        exit 1
    } 

    if [catch {exec cavget -list=[join $pvList ,] -list=.G -printErrors} finishList] {
        puts stderr "Error6: $finishList"
        exit 1
    }
    

    set stData(Column.To) [list $toList]
    set stData(Column.From) [list $fromList]
    set stData(Column.Minutes) [list $minuteList]
    set stData(Column.Seconds) [list $secondList]
    set stData(Column.NumCycles) [list $cycleList]
    set stData(Column.Finish) [list $finishList]
    
    set filename [APSNextGenerationedName -name LinacStd.sdds-0000 -separator - -directory $outputDir -newFile 1]
    set oldDir [pwd]
    cd $outputDir
    if [catch {sdds save $filename stData} result] {
        puts stderr $result
        exit 1
    }
    catch {exec rm LinacStd.sdds}
    catch {exec ln -s $filename LinacStd.sdds}
    unset stData
}

proc CreateDegaussConfig {args} {
    global outputDir
    set L1:PG1List {L1:PG1:SM:SC1H L1:PG1:SM:SC1V L1:PG1:SC1:HZ L1:PG1:SC1:VL L1:PG1:SC2:HZ L1:PG1:SC2:VL}
    set L1:PG1SuffList [APSReplicateItem -item StdSU -number [llength ${L1:PG1List}]]
    set L1:RG1List {L1:RG1:LFA:TRM L1:RG1:SC1:HZ L1:RG1:SC1:VL L1:RG1:SC2:HZ L1:RG1:SC2:VL L1:RG1:SC3:HZ L1:RG1:SC3:VL L1:RG1:QM1  L1:RG1:QM2  L1:RG1:QM3  L1:RG1:QM4}
    set L1:RG1SuffList [APSReplicateItem -item StdSU -number [llength ${L1:RG1List}]]
    set L1:RG2List {L1:RG2:LFA:TRM L1:RG2:SC1:HZ L1:RG2:SC1:VL L1:RG2:SC2:HZ L1:RG2:SC2:VL L1:RG2:SC3:HZ L1:RG2:SC3:VL L1:RG2:QM1  L1:RG2:QM2  L1:RG2:QM3  L1:RG2:QM4}
    set L1:RG2SuffList [APSReplicateItem -item StdSU -number [llength ${L1:RG2List}]]
    set L1List {L1:SC1:HZ L1:SC1:VL L1:SC2:HZ L1:SC2:VL L1:SC3:HZ L1:SC3:VL L1:QM1  L1:QM2  L1:QM3  L1:QM4 L1:QM5}
    set L1SuffList [APSReplicateItem -item StdSU -number [llength $L1List]]
    
    set L2List {L2:SC1:HZ:PS L2:SC1:VL:PS L2:SC2:HZ:PS L2:SC2:VL:PS L2:SC3:HZ:PS L2:SC3:VL:PS L2:SC4:HZ:PS L2:SC4:VL:PS}
    set L2SuffList [APSReplicateItem -item degaussSU -number [llength $L2List]]

    set L3List {L3:SM:SC1:HZ:PS L3:SM:SC1:VL:PS L3:SC1:HZ:PS L3:SC1:VL:PS L2:SC3:HZ:PS L3:SC2:VL:PS}
    set L3SuffList [concat [APSReplicateItem -item degaussSU -number [expr [llength $L3List] -1]] DegaussC]
    set L4List {L4:SC1:HZ:PS L4:SC1:VL:PS L4:SC2:HZ:PS L4:SC2:VL:PS L4:SC3:HZ:PS L4:SC3:VL:PS L4:SC4:HZ:PS L4:SC4:VL:PS}
    set L4SuffList [APSReplicateItem -item degaussSU -number [llength $L4List]]
    
    set L5List {L5:SC1:HZ:PS L5:SC1:VL:PS L5:SC2:HZ:PS L5:SC2:VL:PS L5:SC3:HZ:PS L5:SC3:VL:PS L5:SC4:HZ:PS L5:SC4:VL:PS}
    set L5SuffList [APSReplicateItem -item degaussSU -number [llength $L5List]]

    set degList [concat ${L1:PG1List} ${L1:RG1List} ${L1:RG2List} $L1List $L2List $L3List $L4List $L5List]
    set degSuffList [concat ${L1:PG1SuffList} ${L1:RG1SuffList} ${L1:RG2SuffList} $L1SuffList $L2SuffList $L3SuffList $L4SuffList $L5SuffList]
    set rootList ""
    set pvList ""
    set devList ""
    foreach root {L1:PG1 L1:RG1 L1:RG2 L1 L2 L3 L4 L5} {
        foreach pv [set ${root}List] suff [set ${root}SuffList] {
            lappend pvList ${pv}:$suff
            lappend devList dev
            lappend rootList $root
        }
    }
   
    set degData(ColumnNames) {ControlName Beamline SuffixName ControlType DecayMinutes DecaySeconds PeriodSeconds NumDecay MaxCurrent}
    set degData(ColumnInfo.ControlName) "type SDDS_STRING"
    set degData(ColumnInfo.Beamline) "type SDDS_STRING"
    set degData(ColumnInfo.SuffixName) "type SDDS_STRING"
    set degData(ColumnInfo.ControlType) "type SDDS_STRING"
    set degData(ColumnInfo.DecayMinutes) "type SDDS_LONG"
    set degData(ColumnInfo.DecaySeconds) "type SDDS_LONG"
    set degData(ColumnInfo.PeriodSeconds) "type SDDS_LONG"
    set degData(ColumnInfo.NumDecay) "type SDDS_LONG"
    set degData(ColumnInfo.MaxCurrent) "type SDDS_DOUBLE units A"
    set degData(Column.ControlName) [list $degList]
    set degData(Column.Beamline) [list $rootList]
    set degData(Column.SuffixName) [list $degSuffList]
    set degData(Column.ControlType) [list $devList]

    if [catch {exec cavget -list=[join $pvList ,] -list=.B -printErrors} minList] {
        puts stderr "DegError1: $minList"
        exit 1
    }
    if [catch {exec cavget -list=[join $pvList ,] -list=.C -printErrors} secList] {
        puts stderr "DegError1: $secList"
        exit 1
    }
    if [catch {exec cavget -list=[join $pvList ,] -list=.F -printErrors} numList] {
        puts stderr "DegError1: $numList"
        exit 1
    }
    if [catch {exec cavget -list=[join $pvList ,] -list=.E -printErrors} maxList] {
        puts stderr "DegError1: $maxList"
        exit 1
    }
    if [catch {exec cavget -list=[join $pvList ,] -list=.D -printErrors} periodList] {
        puts stderr "DegError1: $periodList"
        exit 1
    }
    set degData(ColumnInfo.DecayMinutes) [list $minList]
    set degData(ColumnInfo.DecaySeconds) [list $secList]
    set degData(ColumnInfo.PeriodSeconds) [list $periodList]
    set degData(ColumnInfo.NumDecay) [list $numList]
    set degData(ColumnInfo.MaxCurrent) [list $maxList]
   
    set filename [APSNextGenerationedName -name LinacDegauss.sdds-0000 -separator - -directory $outputDir -newFile 1]
    set oldDir [pwd]
    cd $outputDir
    #can not use sdds save --- got "Segmentation fault" always
    #puts $filename
    #if [catch {sdds save $filename degData} result] {
    #    puts stderr $result
    #    exit 1
    #}
   
    set fid [open $filename w]
    puts $fid "SDDS1"
    puts $fid "&column name=ControlName, type=string,  &end"
    puts $fid "&column name=Beamline, type=string,  &end"
    puts $fid "&column name=SuffixName, type=string,  &end"
    puts $fid "&column name=ControlType, type=string,  &end"
    puts $fid "&column name=DecayMinutes, type=long, &end"
    puts $fid "&column name=DecaySeconds, type=long, &end"
    puts $fid "&column name=PeriodSeconds, type=long, &end"
    puts $fid "&column name=NumDecay, type=long, &end"
    puts $fid "&column name=MaxCurrent, units=A, type=double, &end"
    puts $fid "&data mode=ascii, no_row_counts=1, &end"
    puts "[llength $pvList] [llength $rootList] [llength $degList] [llength $devList] [llength $minList]"
    foreach nm $degList root $rootList suff $degSuffList dev $devList min $minList sec $secList period $periodList num $numList max $maxList {
        puts $fid "\"$nm\" \"$root\" \"$suff\" \"$dev\" \"$min\" \"$sec\" \"$period\" \"$num\" \"$max\""

    }
    puts $fid ""
    close $fid
    
    unset degData   
    catch {exec rm LinacDegauss.sdds}
    catch {exec ln -s $filename LinacDegauss.sdds} 
    cd $oldDir
}

CreateStandardizeConfig 
CreateDegaussConfig

exit 


