#!/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 $"

APSStandardSetup

proc CreateBTS_PSDeviceFile {args} {
    global magnetPVs
    set outputFile ""
    APSParseArguments {outputFile}
    
    if {[catch {APSGetMagnetPVNamesAndInfo -arrayName magnetPVs -beamline BTS} names]} {
        puts "Error: $names"
        exit
    }

    

    foreach name $names {
        if {[llength $magnetPVs(${name}.startConditioningPV)]} {
            lappend output "$name StartConditioning o 1 $magnetPVs(${name}.startConditioningPV)"
            lappend output "$name StopConditioning o 0 $magnetPVs(${name}.startConditioningPV)"
            lappend output "$name QueryConditioning q 1 $magnetPVs(${name}.startConditioningPV)"
        }
        lappend output "$name TurnOn o $magnetPVs(${name}.turnOnValue) $magnetPVs(${name}.turnOnPV)"
        lappend output "$name TurnOff o $magnetPVs(${name}.turnOffValue) $magnetPVs(${name}.turnOffPV)"
        
        if {[lindex [split $magnetPVs(${name}.statusPV) ":"] end] == "OnOffStatusM"} {
            lappend output "$name QueryOn q ON $magnetPVs(${name}.statusPV)"
        } elseif {[lindex [split $magnetPVs(${name}.statusPV) ":"] end] == "OnOffM"} {
            lappend output "$name QueryOn q \"Power On\" $magnetPVs(${name}.statusPV)"
        } else {
            lappend output "$name QueryOn q $magnetPVs(${name}.statusOnValue) $magnetPVs(${name}.statusPV)"
        }
        
        if {[llength $magnetPVs(${name}.setCurrentPV)]} {
            lappend output "$name SetCurrent o \"\" $magnetPVs(${name}.setCurrentPV)"
            lappend output "$name ReadCurrent i \"\" $magnetPVs(${name}.readCurrentPV)"
            lappend output "$name ReadCurrentSetpoint i \"\" $magnetPVs(${name}.setCurrentPV)"
        }
        if {[llength $magnetPVs(${name}.setVoltagePV)]} {
            lappend output "$name SetVoltage o \"\" $magnetPVs(${name}.setVoltagePV)"
        }
        if {[llength $magnetPVs(${name}.readVoltagePV)]} {
            lappend output "$name ReadVoltage i \"\" $magnetPVs(${name}.readVoltagePV)"
        }
    }
    set names [exec sdds2stream /home/helios/oagData/bts/magnetConditioning/degauss.config -col=ControlName]
    foreach name $names {
        set pv [lindex [split $magnetPVs(${name}.startConditioningPV) .] 0]
        lappend output "$name SetConditioningMinutes o \"\" ${pv}.B"
        lappend output "$name ReadConditioningMinutes i \"\" ${pv}.B"
        lappend output "$name SetConditioningSeconds o \"\" ${pv}.C"
        lappend output "$name ReadConditioningSeconds i \"\" ${pv}.C"
        lappend output "$name SetConditioningPeriod o \"\" ${pv}.D"
        lappend output "$name ReadConditioningPeriod i \"\" ${pv}.D"
        lappend output "$name SetConditioningMaxCurrent o \"\" ${pv}.E"
        lappend output "$name ReadConditioningMaxCurrent i \"\" ${pv}.E"
        lappend output "$name SetConditioningCycles o \"\" ${pv}.F"
        lappend output "$name ReadConditioningCycles i \"\" ${pv}.F"
    }
    set names [exec sdds2stream /home/helios/oagData/bts/magnetConditioning/triDegauss.config -col=ControlName]
    foreach name $names {
        set pv [lindex [split $magnetPVs(${name}.startConditioningPV) .] 0]
        lappend output "$name SetConditioningFirstPeakCurrent o \"\" ${pv}.B"
        lappend output "$name ReadConditioningFirstPeakCurrent i \"\" ${pv}.B"
        lappend output "$name SetConditioningCycles o \"\" ${pv}.C"
        lappend output "$name ReadConditioningCycles i \"\" ${pv}.C"
        lappend output "$name SetConditioningLastPeakCurrent o \"\" ${pv}.D"
        lappend output "$name ReadConditioningLastPeakCurrent i \"\" ${pv}.D"
        lappend output "$name SetConditioningOutputInterval o \"\" ${pv}.E"
        lappend output "$name ReadConditioningOutputInterval i \"\" ${pv}.E"
        lappend output "$name SetConditioningMaxStepSize o \"\" ${pv}.F"
        lappend output "$name ReadConditioningMaxStepSize i \"\" ${pv}.F"
    }
if {0} {
    set names [exec sdds2stream /home/helios/oagData/bts/magnetConditioning/standardize.config -col=ControlName]
    foreach name $names {
        set pv [lindex [split $magnetPVs(${name}.startConditioningPV) .] 0]
        lappend output "$name SetConditioningLowerLimit o \"\" ${pv}.B"
        lappend output "$name ReadConditioningLowerLimit i \"\" ${pv}.B"
        lappend output "$name SetConditioningUpperLimit o \"\" ${pv}.C"
        lappend output "$name ReadConditioningUpperLimit i \"\" ${pv}.C"
        lappend output "$name SetConditioningMinutes o \"\" ${pv}.D"
        lappend output "$name ReadConditioningMinutes i \"\" ${pv}.D"
        lappend output "$name SetConditioningSeconds o \"\" ${pv}.E"
        lappend output "$name ReadConditioningSeconds i \"\" ${pv}.E"
        lappend output "$name SetConditioningCycles o \"\" ${pv}.F"
        lappend output "$name ReadConditioningCycles i \"\" ${pv}.F"
        lappend output "$name SetConditioningEndpoint o \"\" ${pv}.G"
        lappend output "$name ReadConditioningEndpoint i \"\" ${pv}.G"
        lappend output "$name SetConditioningApproach o \"\" ${pv}.H"
        lappend output "$name ReadConditioningApproach i \"\" ${pv}.H"
    }
}
    set names [exec sdds2stream /home/helios/oagData/bts/magnetConditioning/standardizeDwell.config -col=ControlName]
    foreach name $names {
        set pv [lindex [split $magnetPVs(${name}.startConditioningPV) .] 0]
        lappend output "$name SetConditioningLowerLimit o \"\" ${pv}.B"
        lappend output "$name ReadConditioningLowerLimit i \"\" ${pv}.B"
        lappend output "$name SetConditioningUpperLimit o \"\" ${pv}.C"
        lappend output "$name ReadConditioningUpperLimit i \"\" ${pv}.C"
        lappend output "$name SetConditioningRampRate o \"\" ${pv}.D"
        lappend output "$name ReadConditioningRampRate i \"\" ${pv}.D"
        lappend output "$name SetConditioningTransitionPercentage o \"\" ${pv}.E"
        lappend output "$name ReadConditioningTransitionPercentage i \"\" ${pv}.E"
        lappend output "$name SetConditioningCycles o \"\" ${pv}.F"
        lappend output "$name ReadConditioningCycles i \"\" ${pv}.F"
        lappend output "$name SetConditioningEndpoint o \"\" ${pv}.G"
        lappend output "$name ReadConditioningEndpoint i \"\" ${pv}.G"
        lappend output "$name SetConditioningApproach o \"\" ${pv}.H"
        lappend output "$name ReadConditioningApproach i \"\" ${pv}.H"
        lappend output "$name SetConditioningDwellTime o \"\" ${pv}.I"
        lappend output "$name ReadConditioningDwellTime i \"\" ${pv}.I"
    }
    foreach line $output {
        lappend dnList [lindex $line 0]
        lappend oList [lindex $line 1]
        lappend dList [lindex $line 2]
        lappend vsList [lindex $line 3]
        lappend cnList [lindex $line 4]
    }
    set data(ParameterNames) "DeviceType InstallLocation"
    set data(Parameter.DeviceType) PSOps
    set data(Parameter.InstallLocation) /home/helios/oagData/deviceConfig/booster/BTSOps.pvTable
    set data(ColumnNames) "DeviceName Operation Direction ValueString ControlName "
    set data(Column.DeviceName) [list $dnList]
    set data(Column.Operation) [list $oList]
    set data(Column.Direction) [list $dList]
    set data(Column.ValueString) [list $vsList]
    set data(Column.ControlName) [list $cnList]

    if [catch {sdds save $outputFile data} results] {
        puts stderr "unable to save $outputFile: $results"
        exit 1
    }
    exec sddssort $outputFile -col=ControlName -col=Operation -nowarn
    file delete ${outputFile}~
   
}

if {[llength $argv] < 1} {
    puts stderr "usage: CreateBTS_PSDeviceFile <output>"
    exit 1
}
set outputFile [lindex $argv 0]

CreateBTS_PSDeviceFile -outputFile $outputFile
