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


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

proc CreateLTP_PAR_PTB_PSDeviceFile {args} {
    set outputFile ""
    set basic 1
    APSParseArguments {outputFile basic}
    
    if [catch {sdds load /home/helios/OAG/oagData/deviceConfig/par/LTP_PAR_PTB_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
    foreach name $names {
	puts -nonewline [format %3.0f [expr $num * 100.0 / $total]]%
	flush stdout
	if {[lsearch -exact "P1IK P2IK P4EK" $name] != -1} {
	    if {![pv linkw "${name}:OnBO" "${name}:OnBO" 1]} {
		lappend controlname "${name}:OnBO" "${name}:OnBO"
		lappend devicename $nameNoPS $nameNoPS
		lappend operation "TurnOn" "TurnOff"
		lappend direction o o
		lappend valuestring 1 0
	    } else {
		puts "\n${name}:OnBO : not found"
		exit 1
	    }
	    if {![pv linkw "${name}:ResetBO" "${name}:ResetBO" 1]} {
		lappend controlname "${name}:ResetBO"
		lappend devicename $nameNoPS
		lappend operation "Reset"
		lappend direction o
		lappend valuestring 1
	    } else {
		puts "\n${name}:ResetBO : not found"
		exit 1
	    }
	} else {
	    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 operation "StartConditioning" "StopConditioning" "QueryConditioning"
		lappend direction o o q
		lappend valuestring 1 0 1
	    } else {
		if {[lsearch -exact "P:ISP" $name] == -1} {
		    puts "\n${name}:StandardizeSUB.PROC : not found"
		    exit 1
		}
	    }
	    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 operation "TurnOn"
		    lappend direction o
		    lappend valuestring 1
		} else {
		    puts "\n${name}:OnSEQ : 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 {![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 "P1IK P2IK P4EK P:ISP" $name] != -1} {
	    if {![pv linkw "${name}:VoltageSetSendAO" "${name}:VoltageSetSendAO" 1]} {
		lappend controlname "${name}:VoltageSetSendAO"
		lappend devicename $nameNoPS
		lappend operation "SetVoltage"
		lappend direction o
		lappend valuestring ""
	    } else {
		puts "\n${name}:VoltageSetSendAO : 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
	    }
	} 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 {![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} {
		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
		}
	    }
	}
	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: CreateLTP_PAR_PTB_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: CreateLTP_PAR_PTB_PSDeviceFile <output> \[-basic <0|1>\]\n[join [split $CVSRevisionAuthor $] ""]"
    exit 1
}

CreateLTP_PAR_PTB_PSDeviceFile -outputFile $outputFile -basic $basic
