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

#
# $Log: not supported by cvs2svn $
# Revision 1.8  2000/09/28 17:04:47  soliday
# This is valid for Sept 28 2000
#
# Revision 1.7  2000/09/25 20:10:24  soliday
# Added QueryReady field.
#
# Revision 1.6  2000/07/26 18:14:07  soliday
# Added some specific code for L3 raw power supply
#
# Revision 1.5  2000/07/25 15:11:36  soliday
# Added new L3 power supplies
#
# Revision 1.4  2000/06/26 15:40:16  soliday
# Added QueryOn and QueryOff to Raw power supplies.
#
# Revision 1.3  2000/06/26 15:16:59  soliday
# Added Raw Power supplies.
#
# Revision 1.2  2000/05/01 20:08:15  soliday
# New version for new PV names.
#
# Revision 1.1  2000/03/02 16:50:37  borland
# First version, by R. Soliday.
#
#

#output file: PSOps.pvTable

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)]
set CVSRevisionAuthor "\$Revision: 1.9 $ \$Author: soliday $"
APSStandardSetup
proc CreateLinacPSDeviceFile {args} {
    set outputFile ""
    set force 0
    set aliases 0
    APSParseArguments {outputFile force aliases}
    
    if [catch {sdds load /home/helios/OAG/oagData/deviceConfig/linac/LinacPS-Conditioning.xref data} results] {
        puts stderr $results
        exit 1
    }
    
    set names [lindex $data(Column.ControlName) 0]
    set enames [lindex $data(Column.ElementName) 0]
    set tails [lindex $data(Column.ConditioningTail) 0]
    set resetTails [lindex $data(Column.ResetTail) 0]
    set onTails [lindex $data(Column.OnTail) 0]

    set total [llength $names]
    set num 0
    set StdSULetters "B C D E F"
    lappend StdSUParameters ConditioningMinutes
    lappend StdSUParameters ConditioningSeconds
    lappend StdSUParameters ConditioningPeriod
    lappend StdSUParameters ConditioningMaxCurrent
    lappend StdSUParameters ConditioningCycles
    set Std1SULetters "B C D E F G H"
    lappend Std1SUParameters ConditioningLowerLimit
    lappend Std1SUParameters ConditioningUpperLimit
    lappend Std1SUParameters ConditioningMinutes
    lappend Std1SUParameters ConditioningSeconds
    lappend Std1SUParameters ConditioningCycles
    lappend Std1SUParameters ConditioningEndpoint
    lappend Std1SUParameters ConditioningApproach
    set stdSULetters "B C D E F G H"
    lappend stdSUParameters ConditioningLowerLimit
    lappend stdSUParameters ConditioningUpperLimit
    lappend stdSUParameters ConditioningMinutes
    lappend stdSUParameters ConditioningSeconds
    lappend stdSUParameters ConditioningCycles
    lappend stdSUParameters ConditioningEndpoint
    lappend stdSUParameters ConditioningApproach
    set degaussSULetters "B C D E F"
    lappend degaussSUParameters ConditioningMinutes
    lappend degaussSUParameters ConditioningSeconds
    lappend degaussSUParameters ConditioningPeriod
    lappend degaussSUParameters ConditioningMaxCurrent
    lappend degaussSUParameters ConditioningCycles
    set StandardizeSUBLetters "B C D E F G H"
    lappend StandardizeSUBParameters ConditioningLowerLimit
    lappend StandardizeSUBParameters ConditioningUpperLimit
    lappend StandardizeSUBParameters ConditioningMinutes
    lappend StandardizeSUBParameters ConditioningSeconds
    lappend StandardizeSUBParameters ConditioningCycles
    lappend StandardizeSUBParameters ConditioningEndpoint
    lappend StandardizeSUBParameters ConditioningApproach
    set DegaussCLetters "B C D E F"
    lappend DegaussCParameters ConditioningMinutes
    lappend DegaussCParameters ConditioningSeconds
    lappend DegaussCParameters ConditioningPeriod
    lappend DegaussCParameters ConditioningMaxCurrent
    lappend DegaussCParameters ConditioningCycles
    set ConditionCLetters "B C D E F"
    lappend ConditionCParameters ConditioningMinutes
    lappend ConditionCParameters ConditioningSeconds
    lappend ConditionCParameters ConditioningPeriod
    lappend ConditionCParameters ConditioningMaxCurrent
    lappend ConditionCParameters ConditioningCycles

    foreach name $names ename $enames tail $tails resetTail $resetTails TurnOnTail $onTails {
        puts -nonewline [format %3.0f [expr $num * 100.0 / $total]]%
        flush stdout
        set status readyCC
        set statusVal 1
        #	set status StatusCC
        #	set ready ReadyCC
        #	set statusVal 0
        #	set readyVal 1
        if {"L3:SM:SC1:HZ:PS" == $name} {
            set devname L3:SC1:HZ
        } elseif {"L3:SM:SC1:VL:PS" == $name} {
            set devname L3:SC1:VL
        } elseif {"L3:BM:US" == $name} {
            set devname L3:BM1
        } elseif {"L3:BM2T" == $name} {
            set devname L3:BM2
        } elseif {"L3:BM:DS" == $name} {
            set devname L3:BM3
        } elseif {"L3:BM4T" == $name} {
            set devname L3:BM4
        } else {
            set devname $name
        }
        if {"L3:Raw" == $name} {
            set status PsEnableBO
            set statusVal "1-Enabled"
        }
        if {![llength $tail]} {
            if {(![pv linkw "${name}${TurnOnTail}" "${name}${TurnOnTail}" 2]) || ($force)} {
                lappend controlname "${name}${TurnOnTail}"
                lappend devicename $devname
                lappend elementname $ename
                lappend operation "TurnOn"
                lappend direction o
                lappend valuestring 1
            } else {
                puts "\n${name}${TurnOnTail} : not found"
                exit 1
            }
            if {(![pv linkw "${name}:OffBO" "${name}:OffBO" 2]) || ($force)} {
                lappend controlname "${name}:OffBO"
                lappend devicename $devname
                lappend elementname $ename
                lappend operation "TurnOff"
                lappend direction o
                lappend valuestring 1
            } else {
                puts "\n${name}:OffBO : not found"
                exit 1
            }
            if {(![pv linkw "${name}:${status}" "${name}:${status}" 2]) || ($force)} {
                lappend controlname "${name}:$status" "${name}:$status"
                lappend devicename $devname $devname
                lappend elementname $ename $ename
                lappend operation "QueryOn" "QueryOff"
                lappend direction q nq
                lappend valuestring $statusVal $statusVal
            } else {
                puts "\n${name}:${status} : not found"
                exit 1
            }
            #	    if {(![pv linkw "${name}:ReadyCC" "${name}:ReadyCC" 1]) || ($force)} {
            #		lappend controlname "${name}:$ready"
            #		lappend devicename $devname
            #                lappend elementname $ename
            #		lappend operation "QueryReady"
            #		lappend direction q
            #		lappend valuestring $readyVal
            #	    } else {
            #		puts "\n${name}:ReadyCC : not found"
            #		exit 1
            #	    }

            incr num
            puts -nonewline \b\b\b\b
            continue
        }
        set suffix ".PROC"

        if {(![pv linkw "${name}:${tail}${suffix}" "${name}:${tail}${suffix}" 1]) || ($force)} {
            lappend controlname "${name}:${tail}${suffix}" "${name}:${tail}${suffix}" "${name}:${tail}${suffix}"
            if {$name != "L5:AM1:PS2"} {
                set nameNoPS [os editstring %/:PS// $devname]
            } else {
                set nameNoPS [os editstring %/:PS2// $devname]
            }
            lappend devicename $nameNoPS $nameNoPS $nameNoPS
            lappend elementname $ename $ename $ename
            lappend operation "StartConditioning" "StopConditioning" "QueryConditioning"
            lappend direction o o q
            lappend valuestring 1 0 1
            if {$tail == "ConditionC"} {
                set currentTail SetDacCurrentC
                set readCurrentTail MeasCurrentM
                set TurnOffTail SupplyOnOffC
                set TurnOnTail SupplyOnOffC
                set QueryOnOffTail SupplyOnOffM
                if {(![pv linkw "${name}:${TurnOnTail}" "${name}:${TurnOnTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${TurnOnTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "TurnOn"
                    lappend direction o
                    lappend valuestring 1
                } else {
                    puts "\n${name}${TurnOnTail} : not found"
                    exit 1
                }
                if {(![pv linkw "${name}:${TurnOffTail}" "${name}:${TurnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${TurnOffTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "TurnOff"
                    lappend direction o
                    lappend valuestring 0
                } else {
                    puts "\n${name}:${TurnOffTail} : not found"
                    exit 1
                }
                if {(![pv linkw "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}"
                    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename $ename
                    lappend operation "QueryOn" "QueryOff"
                    lappend direction q nq
                    lappend valuestring "On" "On"
                }

            } elseif {($tail == "StandardizeSUB") || ($tail == "DegaussC")} {
                set currentTail CurrentAO
                set readCurrentTail CurrentAI
                set TurnOffTail OffBO
                set QueryOnOffTail readyCC
                #		set QueryReadyTail ReadyCC
                if {(![pv linkw "${name}${TurnOnTail}" "${name}${TurnOnTail}" 2]) || ($force)} {
                    lappend controlname "${name}${TurnOnTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "TurnOn"
                    lappend direction o
                    lappend valuestring 1
                } else {
                    puts "\n${name}${TurnOnTail} : not found"
                    exit 1
                }
                if {(![pv linkw "${name}:${TurnOffTail}" "${name}:${TurnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${TurnOffTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "TurnOff"
                    lappend direction o
                    lappend valuestring 1
                } else {
                    puts "\n${name}:${TurnOffTail} : not found"
                    exit 1
                }
                if {(![pv linkw "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}"
                    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename $ename
                    lappend operation "QueryOn" "QueryOff"
                    lappend direction q nq
                    lappend valuestring 1 1
                } else {
                    set QueryOnOffTail StatusCALC
                    if {(![pv linkw "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}" 2]) || ($force)} {
                        lappend controlname "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}"
                        lappend devicename $nameNoPS $nameNoPS
                        lappend elementname $ename $ename
                        lappend operation "QueryOn" "QueryOff"
                        lappend direction q nq
                        lappend valuestring 0 0
                    } else {   
                        puts "\n${name}:${QueryOnOffTail} : not found"
                        #exit 1
                    }
                    #exit 1
                }
                #		if {(![pv linkw "${name}:${QueryReadyTail}" "${name}:${QueryReadyTail}" 1]) || ($force)} {
                #		    lappend controlname "${name}:${QueryReadyTail}"
                #		    lappend devicename $nameNoPS
                #                    lappend elementname $ename
                #		    lappend operation "QueryReady"
                #		    lappend direction q
                #		    lappend valuestring 1
                #		} else {
                #		    puts "\n${name}:${QueryReadyTail} : not found"
                #		    exit 1
                #		}
            } elseif {($tail == "StdSU") || ($tail == "Std1SU")} {
                set currentTail CurrentAO
                set readCurrentTail CurrentAI
                set TurnOffTail OffBO
                set QueryOnOffTail readyCC
                #		set QueryOnOffTail StatusCC
                #		if {[string range $name 0 4] == "L1:PG"} {
                #		    set QueryOnOffTail OnBI
                #		}
                #		set QueryReadyTail ReadyCC
                if {(![pv linkw "${name}${TurnOnTail}" "${name}${TurnOnTail}" 2]) || ($force)} {
                    lappend controlname "${name}${TurnOnTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "TurnOn"
                    lappend direction o
                    lappend valuestring 1
                } else {
                    puts "\n${name}${TurnOnTail} : not found"
                    exit 1
                }
                if {(![pv linkw "${name}:${TurnOffTail}" "${name}:${TurnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${TurnOffTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "TurnOff"
                    lappend direction o
                    lappend valuestring 1
                } else {
                    puts "\n${name}:${TurnOffTail} : not found"
                    exit 1
                }
                if {(![pv linkw "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}"
                    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename $ename
                    lappend operation "QueryOn" "QueryOff"
                    lappend direction q nq
                    lappend valuestring 1 1
                } else {
                    set QueryOnOffTail StatusCALC
                    if {(![pv linkw "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}" 2]) || ($force)} {
                        lappend controlname "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}"
                        lappend devicename $nameNoPS $nameNoPS
                        lappend elementname $ename $ename
                        lappend operation "QueryOn" "QueryOff"
                        lappend direction q nq
                        lappend valuestring 1 1
                    } else {
                        puts "\n${name}:${QueryOnOffTail} : not found"
                        exit 1
                    }
                }
                #		if {(![pv linkw "${name}:${QueryReadyTail}" "${name}:${QueryReadyTail}" 2]) || ($force)} {
                #		    lappend controlname "${name}:${QueryReadyTail}"
                #		    lappend devicename $nameNoPS
                #                    lappend elementname $ename
                #		    lappend operation "QueryReady"
                #		    lappend direction q
                #		    lappend valuestring 1
                #		} else {
                #		    puts "\n${name}:${QueryReadyTail} : not found"
                #		    exit 1
                #		}
            } else {
                set currentTail setCurrentAO
                set readCurrentTail measCurrentAI
                set TurnOnOffTail $TurnOnTail
                set QueryOnOffTail readyCC
                #		set QueryOnOffTail enableBI
                #		set QueryReadyTail readyCC
                if {(![pv linkw "${name}${TurnOnOffTail}" "${name}${TurnOnOffTail}" 2]) || ($force)} {
                    lappend controlname "${name}${TurnOnOffTail}" "${name}${TurnOnOffTail}"
                    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename $ename
                    lappend operation "TurnOn" "TurnOff"
                    lappend direction o o
                    lappend valuestring On Off
                } else {
                    puts "\n${name}${TurnOnOffTail} : not found"
                    exit 1
                }
                if {![pv linkw "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}" 2]} {
                    lappend controlname "${name}:${QueryOnOffTail}" "${name}:${QueryOnOffTail}"
                    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename $ename
                    lappend operation "QueryOn" "QueryOff"
                    lappend direction q nq
                    lappend valuestring 1 1
                }
                #		if {![pv linkw "${name}:${QueryReadyTail}" "${name}:${QueryReadyTail}" 1]} {
                #		    lappend controlname "${name}:${QueryReadyTail}"
                #		    lappend devicename $nameNoPS
                #                    lappend elementname $ename
                #		    lappend operation "QueryReady"
                #		    lappend direction q
                #		    lappend valuestring 1
                #		} else {
                #		    puts "\n${name}:${QueryReadyTail} : not found"
                #		    exit 1
                #		}
            }
            if {(![pv linkw "${name}:${currentTail}" "${name}:${currentTail}" 2]) || ($force)} {
                lappend controlname "${name}:${currentTail}"
                lappend devicename $nameNoPS
                lappend elementname $ename
                lappend operation "SetCurrent"
                lappend direction o
                lappend valuestring ""
            } else {
                puts "\n${name}:${currentTail} : not found"
                exit 1
            }
            if {![pv linkw "${name}:${readCurrentTail}" "${name}:${readCurrentTail}" 2]} {
                lappend controlname "${name}:${readCurrentTail}"
                lappend devicename $nameNoPS
                lappend elementname $ename
                lappend operation "ReadCurrent"
                lappend direction i
                lappend valuestring ""
            } else {
                if {($tail == "StdSU") || ($tail == "Std1SU") ||
                    ($tail == "StandardizeSUB") || ($tail == "DegaussC")} {
                    puts "\n${name}:${readCurrentTail} : not found"
                    exit 1
                }
                set readCurrentTail measCurrAI
                if {![pv linkw "${name}:${readCurrentTail}" "${name}:${readCurrentTail}" 2]} {
                    lappend controlname "${name}:${readCurrentTail}"
                    lappend devicename $nameNoPS
                    lappend elementname $ename
                    lappend operation "ReadCurrent"
                    lappend direction o
                    lappend valuestring ""
                } else {
                    puts "\n${name}:${readCurrentTail} : not found"
                    exit 1
                }
            }
            set letterList [set ${tail}Letters]
            set parameterList [set ${tail}Parameters]
            foreach letter $letterList parameter $parameterList {
                global "${name}:${tail}.${letter}"
                if {(![pv linkw "${name}:${tail}.${letter}" "${name}:${tail}.${letter}" 2]) || ($force)} {
                    lappend controlname "${name}:${tail}.${letter}" "${name}:${tail}.${letter}"
                    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename $ename
                    lappend operation Set${parameter} Read${parameter}
                    lappend direction o i
                    #lappend valuestring [set "${name}:${tail}.${letter}"] ""
                    lappend valuestring "" ""
                    continue
                }
                puts "\n${name}:${tail}.${letter} : not found"
                exit 1
            }
            incr num
            puts -nonewline \b\b\b\b
            continue
        }
        puts "\n${name}:${tail}.PROC : not found"
        exit 1
    }
    puts "100% done"

    #Add back in PV aliases.
    foreach alias "L1:QM1 L1:QM2 L1:RG1:QM4 L1:SC1:HZ L1:SC1:VL L1:SC2:HZ L1:SC2:VL L1:RG1:SC3:HZ L1:RG1:SC3:VL" \
      real "L1:Q1 L1:Q2 L1:RG1:Q4 L1:H1 L1:V1 L1:H2 L1:V2 L1:RG1:H3 L1:RG1:V3" {
          foreach c $controlname dn $devicename o $operation d $direction v $valuestring {
              if {$dn == $real} {
                  lappend controlname $c
                  lappend devicename $alias
                  lappend elementname $alias
                  lappend operation $o
                  lappend direction $d
                  lappend valuestring $v
              }
          }
      }

    set output(ParameterNames) "DeviceType"
    set output(Parameter.DeviceType) LinacPS
    set output(ColumnNames) "ControlName DeviceName ElementName Operation Direction ValueString"
    set output(Column.ControlName) [list $controlname]
    set output(Column.DeviceName) [list $devicename]
    set output(Column.ElementName) [list $elementname]
    set output(Column.Operation) [list $operation]
    set output(Column.Direction) [list $direction]
    set output(Column.ValueString) [list $valuestring]
    
    if [catch {sdds save $outputFile output} results] {
        puts stderr "unable to save $outputFile: $results"
        exit 1
    }
}

set outputFile [lindex $argv 0]
set args [lrange $argv 1 end]
set aliases ""
if {[APSStrictParseArguments {aliases}] || ![string length $aliases]} {
    puts stderr "usage: CreateLinacPSDeviceFile  <output> -aliases <0|1>\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}

CreateLinacPSDeviceFile -outputFile $outputFile -aliases $aliases
