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

#
# $Log: not supported by cvs2svn $
#
#

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

APSStandardSetup

proc CreateLTS_PSDeviceFile {args} {
    set outputFile ""
    set basic 1
    APSParseArguments {outputFile basic}
    
    if [catch {sdds load /home/helios/OAG/oagData/deviceConfig/lts/LTS_PS-Conditioning.xref data} results] {
	puts stderr $results
	exit 1
    }
    
    set names [lindex $data(Column.ControlName) 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
    set degauss_letters "B C D E F"
    lappend degauss_parameters ConditioningMinutes
    lappend degauss_parameters ConditioningSeconds
    lappend degauss_parameters ConditioningPeriod
    lappend degauss_parameters ConditioningMaxCurrent
    lappend degauss_parameters ConditioningCycles
    foreach name $names {
	puts -nonewline [format %3.0f [expr $num * 100.0 / $total]]%
	flush stdout
	set nameNoPS [os editstring %/:PS// $name]
	if {[lsearch -exact "LTS:G LTS:RAW" $name] == -1} {
            if {([lsearch -exact "aLTS:H5 aLTS:V5 aLTS:Q6 aLTS:Q7 aLTS:Q8 aLTS:Q9" $name] != -1) } {
                if {![pv linkw "${name}:DegaussC.PROC" "${name}:DegaussC.PROC" 1]} {
                    lappend controlname "${name}:DegaussC.PROC" "${name}:DegaussC.PROC" "${name}:DegaussC.PROC"
                    lappend devicename $nameNoPS $nameNoPS $nameNoPS
                    lappend operation "StartConditioning" "StopConditioning" "QueryConditioning"
                    lappend direction o o q
                    lappend valuestring 1 0 1
                } else {
                    puts "\n${name}:DegaussC.PROC : not found"
                    exit 1
                }
            } else {
                if {![pv linkw "${name}:StdSU.PROC" "${name}:StdSU.PROC" 1]} {
                    lappend controlname "${name}:StdSU.PROC" "${name}:StdSU.PROC" "${name}:StdSU.PROC"
                    lappend devicename $nameNoPS $nameNoPS $nameNoPS
                    lappend operation "StartConditioning" "StopConditioning" "QueryConditioning"
                    lappend direction o o q
                    lappend valuestring 1 0 1
                } else {
                    puts "\n${name}:StdSU.PROC : not found"
                    exit 1
                }
            }
	}
	if {[string compare "LTS:G" $name] == 0} {
            if {![pv linkw "${name}:ResetSQ" "${name}:ResetSQ" 1]} {
                lappend controlname "${name}:ResetSQ"
                lappend devicename $nameNoPS
                lappend operation "TurnOn"
                lappend direction o
                lappend valuestring 1
            } else {
                puts "\n${name}:ResetSQ : not found"
                exit 1
            }
        } elseif {([lsearch -exact "LTS:H5 LTS:V5 LTS:Q6 LTS:Q7 LTS:Q8 LTS:Q9 LTS:Alpha" $name] != -1) } {
            if {![pv linkw "${name}:ResetBO" "${name}:ResetBO" 1]} {
                lappend controlname "${name}:ResetBO"
                lappend devicename $nameNoPS
                lappend operation "TurnOn"
                lappend direction o
                lappend valuestring 1
            } else {
                puts "\n${name}:ResetBO : not found"
                exit 1
            }
        } else {
            if {![pv linkw "${name}:ResetSEQ" "${name}:ResetSEQ" 1]} {
                lappend controlname "${name}:ResetSEQ"
                lappend devicename $nameNoPS
                lappend operation "TurnOn"
                lappend direction o
                lappend valuestring 1
            } else {
                puts "\n${name}:ResetSEQ : not found"
                exit 1
            }
        }
	if {![pv linkw "${name}:OffBO" "${name}:OffBO" 1]} {
	    lappend controlname "${name}:OffBO"
	    lappend devicename $nameNoPS
	    lappend operation "TurnOff"
	    lappend direction o
	    lappend valuestring 1
	} else {
	    puts "\n${name}:OffBO : not found"
	    exit 1
	}

	if {[string compare "LTS:G" $name] == 0} {
            if {![pv linkw "${name}:StatusCC" "${name}:StatusCC" 1]} {
                lappend controlname "${name}:StatusCC"
                lappend devicename $nameNoPS
                lappend operation "QueryOn"
                lappend direction q
                lappend valuestring 0
            } else {
                puts "\n${name}:StatusCC : not found"
                exit 1
            }
	} elseif {[string compare "LTS:Alpha" $name] == 0} {
            if {![pv linkw "${name}:readyCC" "${name}:readyCC" 1]} {
                lappend controlname "${name}:readyCC"
                lappend devicename $nameNoPS
                lappend operation "QueryOn"
                lappend direction q
                lappend valuestring 0
            } else {
                puts "\n${name}:readyCC : not found"
                exit 1
            }
        } else {
            if {![pv linkw "${name}:StatusCALC" "${name}:StatusCALC" 1]} {
                lappend controlname "${name}:StatusCALC"
                lappend devicename $nameNoPS
                lappend operation "QueryOn"
                lappend direction q
                lappend valuestring 0
            } else {
                puts "\n${name}:StatusCALC : not found"
                exit 1
            }
        }
	if {[lsearch -exact "LTS:RAW" $name] != -1} {
            incr num
            puts -nonewline \b\b\b\b
            continue
        }
	if {[string compare "LTS:G" $name] == 0} {
	    if {![pv linkw "${name}:VoltageAO" "${name}:VoltageAO" 1]} {
		lappend controlname "${name}:VoltageAO"
		lappend devicename $nameNoPS
		lappend operation "SetVoltage"
		lappend direction o
		lappend valuestring ""
	    } else {
		puts "\n${name}:VoltageAO : not found"
		exit 1
	    }
	    if {![pv linkw "${name}:DacAI" "${name}:DacAI" 1]} {
		lappend controlname "${name}:DacAI"
		lappend devicename $nameNoPS
		lappend operation "ReadVoltage"
		lappend direction i
		lappend valuestring ""
	    } else {
		puts "\n${name}:DacAI : not found"
		exit 1
	    }
        } elseif {([lsearch -exact "LTS:H5 LTS:V5 LTS:Q6 LTS:Q7 LTS:Q8 LTS:Q9" $name] != -1) } {
	    if {![pv linkw "${name}:CurrentAO" "${name}:CurrentAO" 1]} {
		lappend controlname "${name}:CurrentAO"
		lappend devicename $nameNoPS
		lappend operation "SetCurrent"
		lappend direction o
		lappend valuestring ""
	    } else {
		puts "\n${name}:CurrentAO : not found"
		exit 1
	    }
	    if {![pv linkw "${name}:CurrentAI" "${name}:CurrentAI" 1]} {
		lappend controlname "${name}:CurrentAI"
		lappend devicename $nameNoPS
		lappend operation "ReadCurrent"
		lappend direction i
		lappend valuestring ""
	    } else {
		puts "\n${name}:CurrentAI : not found"
		exit 1
	    }
	    if {!$basic} {
                if {([lsearch -exact "aLTS:H5 aLTS:V5" $name] != -1) } {
                    foreach letter $degauss_letters parameter $degauss_parameters {
                        global "${name}:DegaussC.${letter}"
                        if {![pv linkw "${name}:DegaussC.${letter}" "${name}:DegaussC.${letter}" 1]} {
                            lappend controlname "${name}:DegaussC.${letter}" "${name}:DegaussC.${letter}"
                            lappend devicename $nameNoPS $nameNoPS
                            lappend operation Set${parameter} Read${parameter}
                            lappend direction o i
                            #lappend valuestring [set "${name}:DegaussC.${letter}"] ""
                            lappend valuestring "" ""
			    continue
                        }
                        puts "\n${name}:DegaussC.${letter} : not found"
                        exit 1
                    }
                } elseif {([lsearch -exact "aLTS:Q6 aLTS:Q7 aLTS:Q8 aLTS:Q9 LTS:Alpha" $name] != -1) } {
                    foreach letter $letters parameter $parameters {
                        global "${name}:DegaussC.${letter}"
                        if {![pv linkw "${name}:DegaussC.${letter}" "${name}:DegaussC.${letter}" 1]} {
                            lappend controlname "${name}:DegaussC.${letter}" "${name}:DegaussC.${letter}"
                            lappend devicename $nameNoPS $nameNoPS
                            lappend operation Set${parameter} Read${parameter}
                            lappend direction o i
                            #lappend valuestring [set "${name}:DegaussC.${letter}"] ""
                            lappend valuestring "" ""
			    continue
                        }
                        puts "\n${name}:DegaussC.${letter} : not found"
                        exit 1
                    }
                } elseif {([lsearch -glob $name "*H?"] != -1) || \
		    ([lsearch -glob $name "*V?"] != -1)} {
                    foreach letter $degauss_letters parameter $degauss_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 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
                    }
                } else {
		    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 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
		    }
                }
            }
	} else {
	    if {![pv linkw "${name}:CurrentAO" "${name}:CurrentAO" 1]} {
		lappend controlname "${name}:CurrentAO"
		lappend devicename $nameNoPS
		lappend operation "SetCurrent"
		lappend direction o
		lappend valuestring ""
	    } else {
		puts "\n${name}:CurrentAO : not found"
		exit 1
	    }
            if {[string compare "LTS:Alpha" $name] == 0} {
                if {![pv linkw "${name}:CurrentAI" "${name}:CurrentAI" 1]} {
                    lappend controlname "${name}:CurrentAI"
                    lappend devicename $nameNoPS
                    lappend operation "ReadCurrent"
                    lappend direction i
                    lappend valuestring ""
                } else {
                    puts "\n${name}:CurrentAI : not found"
                    exit 1
                }
            } else {
                if {![pv linkw "${name}:DacAI" "${name}:DacAI" 1]} {
                    lappend controlname "${name}:DacAI"
                    lappend devicename $nameNoPS
                    lappend operation "ReadCurrent"
                    lappend direction i
                    lappend valuestring ""
                } else {
                    puts "\n${name}:DacAI : not found"
                    exit 1
                }
            }
	    if {!$basic} {
		if {([lsearch -glob $name "*H?"] != -1) || \
		    ([lsearch -glob $name "*V?"] != -1)} {
		    foreach letter $degauss_letters parameter $degauss_parameters {
			global "${name}:StdSU.${letter}"
			if {![pv linkw "${name}:StdSU.${letter}" "${name}:StdSU.${letter}" 1]} {
			    lappend controlname "${name}:StdSU.${letter}" "${name}:StdSU.${letter}"
			    lappend devicename $nameNoPS $nameNoPS
			    lappend operation Set${parameter} Read${parameter}
			    lappend direction o i
			    #lappend valuestring [set "${name}:StdSU.${letter}"] ""
			    lappend valuestring "" ""
			    continue
			}
			puts "\n${name}:StdSU.${letter} : not found"
			exit 1
		    }
		} else {
		    foreach letter $letters parameter $parameters {
			global "${name}:StdSU.${letter}"
			if {![pv linkw "${name}:StdSU.${letter}" "${name}:StdSU.${letter}" 1]} {
			    lappend controlname "${name}:StdSU.${letter}" "${name}:StdSU.${letter}"
			    lappend devicename $nameNoPS $nameNoPS
			    lappend operation Set${parameter} Read${parameter}
			    lappend direction o i
			    #lappend valuestring [set "${name}:StdSU.${letter}"] ""
			    lappend valuestring "" ""
			    continue
			}
			puts "\n${name}:StdSU.${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) PSOps
    set output(ColumnNames) "ControlName DeviceName Operation Direction ValueString"
    set output(Column.ControlName) [list $controlname]
    set output(Column.DeviceName) [list $devicename]
    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: CreateLTS_PSDeviceFile <output> \[-basic <0|1>\]\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}
set outputFile [lindex $argv 0]
set args [lrange $argv 1 end]

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

CreateLTS_PSDeviceFile -outputFile $outputFile -basic $basic
