#!/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 CreateLEA_PSDeviceFile {args} {
    set outputFile ""
    set basic 1
    APSParseArguments {outputFile basic}
    
    if [catch {sdds load /home/helios/OAG/oagData/deviceConfig/lea/LEA_PS-Conditioning.xref data} results] {
	puts stderr $results
	exit 1
    }
    
    set names [lindex $data(Column.ControlName) 0]
    set condSuffix [lindex $data(Column.ConditionSuffix) 0]
    set turnOnSuffix [lindex $data(Column.TurnOnSuffix) 0]
    set turnOffSuffix [lindex $data(Column.TurnOffSuffix) 0]
    set statusSuffix [lindex $data(Column.StatusSuffix) 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 cs $condSuffix on $turnOnSuffix off $turnOffSuffix ss $statusSuffix {
	puts -nonewline [format %3.0f [expr $num * 100.0 / $total]]%
	flush stdout
	set nameNoPS [os editstring %/:PS// $name]

        if {![pv linkw "${name}:${cs}.PROC" "${name}:${cs}.PROC" 1]} {
            lappend controlname "${name}:${cs}.PROC" "${name}:${cs}.PROC" "${name}:${cs}.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}:${cs}.PROC : not found"
            exit 1
        }
        if {![pv linkw "${name}:${on}" "${name}:${on}" 1]} {
            lappend controlname "${name}:${on}"
            lappend devicename $nameNoPS
            lappend operation "TurnOn"
            lappend direction o
            lappend valuestring 1
        } else {
            puts "\n${name}:${on} : not found"
            exit 1
        }
        if {![pv linkw "${name}:${off}" "${name}:${off}" 1]} {
            lappend controlname "${name}:${off}"
            lappend devicename $nameNoPS
            lappend operation "TurnOff"
            lappend direction o
            lappend valuestring 1
        } else {
            puts "\n${name}:${off} : not found"
            exit 1
        }
        if {![pv linkw "${name}:${ss}" "${name}:${ss}" 1]} {
            lappend controlname "${name}:${ss}"
            lappend devicename $nameNoPS
            lappend operation "QueryOn"
            lappend direction q
            lappend valuestring 0
        } else {
            puts "\n${name}:${ss} : not found"
            exit 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 -glob $name "*H?"] != -1) || \
                  ([lsearch -glob $name "*V?"] != -1)} {
                foreach letter $degauss_letters parameter $degauss_parameters {
                    global "${name}:${cs}.${letter}"
                    if {![pv linkw "${name}:${cs}.${letter}" "${name}:${cs}.${letter}" 1]} {
                        lappend controlname "${name}:${cs}.${letter}" "${name}:${cs}.${letter}"
                        lappend devicename $nameNoPS $nameNoPS
                        lappend operation Set${parameter} Read${parameter}
                        lappend direction o i
                        lappend valuestring "" ""
                        continue
                    }
                    puts "\n${name}:${cs}.${letter} : not found"
                    exit 1
                }
            } else {
                foreach letter $letters parameter $parameters {
                    global "${name}:${cs}.${letter}"
                    if {![pv linkw "${name}:${cs}.${letter}" "${name}:${cs}.${letter}" 1]} {
                        lappend controlname "${name}:${cs}.${letter}" "${name}:${cs}.${letter}"
                        lappend devicename $nameNoPS $nameNoPS
                        lappend operation Set${parameter} Read${parameter}
                        lappend direction o i
                        lappend valuestring "" ""
                        continue
                    }
                    puts "\n${name}:${cs}.${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: CreateLEA_PSDeviceFile <output> \[-basic <0|1>\]\n"
    exit 1
}
set outputFile [lindex $argv 0]
set args [lrange $argv 1 end]

set basic 0
if [APSStrictParseArguments {basic}] {
    puts stderr "usage: CreateLEA_PSDeviceFile <output> \[-basic <0|1>\]\n"
    exit 1
}

CreateLEA_PSDeviceFile -outputFile $outputFile -basic $basic
