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

#
# $Log: not supported by cvs2svn $
# Revision 1.13  2004/10/11 15:07:28  soliday
# Added missing call to APSStandardSetup
#
# Revision 1.12  2002/04/25 15:08:16  soliday
# The LTP and PTB dipole PVs have changed.
#
# Revision 1.11  2001/06/18 15:15:39  soliday
# I added the Standardization entries for the LU supplies.
#
# Revision 1.10  2000/09/28 17:04:11  soliday
# Added LU QueryConditioning command.
#
# Revision 1.9  2000/07/05 21:53:15  soliday
# Fixed a bug with the recent changes.
#
# Revision 1.8  2000/07/05 21:10:13  soliday
# Changed the DeviceType parameter.
#
# Revision 1.7  2000/07/05 20:47:39  soliday
# Added the Undulator correctors.
#
# Revision 1.6  2000/07/05 20:37:42  soliday
# Added Undulator magnets.
#
# Revision 1.5  2000/05/01 20:07:50  soliday
# New version for new power supplies.
#
# Revision 1.4  2000/03/23 16:43:52  soliday
# Fixed bug with setcurrent operation
#
# Revision 1.3  2000/03/23 16:25:12  soliday
# Fixed bug with turn off procedure
#
# Revision 1.2  2000/03/13 17:54:13  soliday
# Modified QueryOn to look for 0 instead of 1
#
# Revision 1.1  2000/03/06 21:25:48  soliday
# First version
#
#
#

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.14 $ \$Author: soliday $"

APSStandardSetup

proc CreateLTP_ToEndPSDeviceFile {args} {
    set outputFile ""
    set basic 1
    APSParseArguments {outputFile basic}
    
    if [catch {sdds load /home/helios/OAG/oagData/deviceConfig/linac/LTP_ToEndPS-Conditioning.xref data} results] {
	puts stderr $results
	exit 1
    }
    
    set names [lindex $data(Column.ControlName) 0]
    set enames [lindex $data(Column.ElementName) 0]

    set total [llength $names]
    set num 0
    set letters "B C D E F G H"
    lappend parameters ConditioningLowerLimit
    lappend parameters ConditioningUpperLimit
    lappend parameters ConditioningMinutes
    lappend parameters ConditioningSeconds
    lappend parameters ConditioningCycles
    lappend parameters ConditioningEndpoint
    lappend parameters ConditioningApproach
    foreach name $names ename $enames {
	puts -nonewline [format %3.0f [expr $num * 100.0 / $total]]%
	flush stdout
	if {![pv linkw "${name}:StandardizeSUB.PROC" "${name}:StandardizeSUB.PROC" 1]} {
	    lappend controlname "${name}:StandardizeSUB.PROC" "${name}:StandardizeSUB.PROC" "${name}:StandardizeSUB.PROC"
	    set nameNoPS [os editstring %/:PS// $name]
	    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
	} else {
	    puts "\n${name}:StandardizeSUB.PROC : not found"
	    exit 1
	}
	if {[string range $name 0 3] != "LEA:"} {
	    if {($name == "LTP:B1") || 
		($name == "PTB:B1") || 
		($name == "PTB:B2")} {
		if {![pv linkw "${name}:OnSEQ" "${name}:OnSEQ" 1]} {
		    lappend controlname "${name}:OnSEQ"
		    lappend devicename $nameNoPS
                    lappend elementname $ename
		    lappend operation "TurnOn"
		    lappend direction o
		    lappend valuestring 1
		} else {
		    puts "\n${name}:OnSEQ : not found"
		    exit 1
		}		
		if {![pv linkw "${name}:ResetSEQ" "${name}:ResetSEQ" 1]} {
		    lappend controlname "${name}:ResetSEQ"
		    lappend devicename $nameNoPS
                    lappend elementname $ename
		    lappend operation "Reset"
		    lappend direction o
		    lappend valuestring 1
		} else {
		    puts "\n${name}:ResetSEQ : not found"
		    exit 1
		}
	    } else {
		if {![pv linkw "${name}:ResetSEQ" "${name}:ResetSEQ" 1]} {
		    lappend controlname "${name}:ResetSEQ"
		    lappend devicename $nameNoPS
                    lappend elementname $ename
		    lappend operation "TurnOn"
		    lappend direction o
		    lappend valuestring 1
		} else {
		    puts "\n${name}:ResetSEQ : not found"
		    exit 1
		}
	    }
	} else {
	    set nameNoPS [os editstring %/:PS// $name]
	    if {![pv linkw "${name}:OnBO" "${name}:OnBO" 1]} {
		lappend controlname "${name}:OnBO"
		lappend devicename $nameNoPS
                lappend elementname $ename
		lappend operation "TurnOn"
		lappend direction o
		lappend valuestring 1
	    } else {
		puts "\n${name}:OnBO : not found"
		exit 1
	    }
	}
	if {![pv linkw "${name}:OffBO" "${name}:OffBO" 1]} {
	    lappend controlname "${name}:OffBO"
	    lappend devicename $nameNoPS
            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}:StatusCALC" "${name}:StatusCALC" 1]} {
	    lappend controlname "${name}:StatusCALC"
	    lappend devicename $nameNoPS
            lappend elementname $ename
	    lappend operation "QueryOn"
	    lappend direction q
	    lappend valuestring 0
	} else {
	    puts "\n${name}:StatusCALC : not found"
	    exit 1
	}
        if {![pv linkw "${name}:CurrentAO" "${name}:CurrentAO" 1]} {
            lappend controlname "${name}:CurrentAO"
            lappend devicename $nameNoPS
            lappend elementname $ename
            lappend operation "SetCurrent"
            lappend direction o
            lappend valuestring ""
        } else {
            puts "\n${name}:CurrentAO : not found"
            exit 1
        }
	if {[string range $name 0 3] != "LEA:"} {
	    if {![pv linkw "${name}:DacAI" "${name}:DacAI" 1]} {
		lappend controlname "${name}:DacAI"
		lappend devicename $nameNoPS
                lappend elementname $ename
		lappend operation "ReadCurrent"
		lappend direction i
		lappend valuestring ""
	    } else {
		puts "\n${name}:DacAI : not found"
		exit 1
	    }
	} elseif {([string range $name 0 4] == "LEA:Q") || ([string range $name 0 5] == "LEA:BD") } {
	    if {![pv linkw "${name}:DacAI" "${name}:DacAI" 1]} {
		lappend controlname "${name}:DacAI"
		lappend devicename $nameNoPS
                lappend elementname $ename
		lappend operation "ReadCurrent"
		lappend direction i
		lappend valuestring ""
	    } else {
		puts "\n${name}:DacAI : not found"
		exit 1
	    }
	} else {
	    if {![pv linkw "${name}:DacAO" "${name}:DacAO" 1]} {
		lappend controlname "${name}:DacAO"
		lappend devicename $nameNoPS
                lappend elementname $ename
		lappend operation "ReadCurrent"
		lappend direction i
		lappend valuestring ""
	    } else {
		puts "\n${name}:DacAO : not found"
		exit 1
	    }
	}
	if {!$basic} {
	    foreach letter $letters parameter $parameters {
		global "${name}:StandardizeSUB.${letter}"
		if {![pv linkw "${name}:StandardizeSUB.${letter}" "${name}:StandardizeSUB.${letter}" 1]} {
		    lappend controlname "${name}:StandardizeSUB.${letter}" "${name}:StandardizeSUB.${letter}"
		    lappend devicename $nameNoPS $nameNoPS
                    lappend elementname $ename
		    lappend operation Set${parameter} Read${parameter}
		    lappend direction o i
		    #lappend valuestring [set "${name}:StandardizeSUB.${letter}"] ""
		    lappend valuestring "" ""
		    continue
		}
		puts "\n${name}:StandardizeSUB.${letter} : not found"
		exit 1
	    }
	}

	incr num
	puts -nonewline \b\b\b\b
	continue
    }
    puts "100% done"
    set output(ParameterNames) "DeviceType"
    set output(Parameter.DeviceType) LTPToEndPSOps
    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
    }
}

if {[llength $argv] < 1} {
    puts stderr "usage: CreateLTP_ToEndPSDeviceFile <output> \[-basic <0|1>\]\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}
set outputFile [lindex $argv 0]
set args [lrange $argv 1 end]

set basic 1
if [APSStrictParseArguments {basic}] {
    puts stderr "usage: CreateLTP_ToEndPSDeviceFile <output> \[-basic <0|1>\]\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}

CreateLTP_ToEndPSDeviceFile -outputFile $outputFile -basic $basic
