#!/bin/sh
# \
exec oagwish "$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 sectorList {36 37 38 40} 
set sectorVarList {s36 s37 s38 s40}
set cavityList {1 2 3 4} 
set cavityVarList {cav1 cav2 cav3 cav4} 

set ControlStatus "Select Storage Ring Cavities to Detune."
set CVSRevisionAuthor "\$Revision: 1.6 $ \$Author: emery $"

# Make the menu and status the storage ring cavity detuning application.

proc MakeRMMeasurementMenuAndStatus {} {
        
    global ControlStatus CVSRevisionAuthor 
    
    APSApplication . -name "Storage Ring Cavity Detuning Utility" -version "$CVSRevisionAuthor (sereno)" \
      -overview "This application is used to detune selected cavities in the storage ring by changing
the tuning loop offsets by a specified amount."

    APSScrolledStatus .status -parent .userFrame -textVariable ControlStatus -width 50 -packOption {-side top}
}

# This procedure makes the PTB corrector selection widgets.

proc MakeRMMeasurementFrameWidget {widget args} {

    global ControlStatus
    set parent ""
    APSParseArguments {parent}
    
    APSFrame $widget -parent $parent \
      -height 30 \
      -packOption {-side left -expand 1}
    
    set w $parent$widget.frame
    MakeRFDetuningCheckButtonFrameWidget .correctorOnOffFrame -parent $w
}

# This procedure makes the plane and corrector selection widgets.

proc MakeRFDetuningCheckButtonFrameWidget {widget args} {

    global ControlStatus sectorList sectorVarList cavityList cavityVarList changeInSetpoint
    global s36 s37 s38 s40 cav1 cav2 cav3 cav4 
    set parent ""
    APSParseArguments {parent}
    
    APSFrame $widget -parent $parent -label "Corrector Selection" -width 50 \
      -height 30 \
      -packOption {-side left -expand 1}

    set w $parent$widget.frame
    
    APSCheckButtonFrame .planeFrame -parent $w -label "Sector" \
      -packOption {-side top} \
      -buttonList $sectorList -variableList "$sectorVarList" \
      -orientation horizontal \
      -allNone 1 \
      -contextHelp "These checkbuttons are used to select the RF sector number."

    APSCheckButtonFrame .corrFrame -parent $w -label "Cavity\nNumber" \
      -packOption {-side top} \
      -buttonList $cavityList -variableList "$cavityVarList" \
      -allNone 1 \
      -contextHelp "These checkbuttons are used to select the cavity number."

    APSLabeledEntry .setpointChangeFrame -parent $w -width 10 \
      -textVariable changeInSetpoint \
      -packOption {-side left} \
      -label "Cavity Setpoint Change: " \
      -contextHelp "Amount by which the cavity feedback setpoints will be changed by."

    APSButton .setgain -parent $w \
      -text "Set" \
      -command {ChangeRFCavitySetpoints -statusCallback SetStatus} \
      -packOption {-side left} \
      -contextHelp "This button sets the cavity feedback setpoint change given by the variable changeInSetpoint."
}

# This procedure makes the cavput command that changes the RF cavity setpoints.  Returns 0 if nothing is selected.
# Returns 1 if a change is made.

proc ChangeRFCavitySetpoints {args} {

    global ControlStatus sectorList sectorVarList cavityList cavityVarList changeInSetpoint
    global s36 s37 s38 s40 cav1 cav2 cav3 cav4 
    APSParseArguments {statusCallback}

    if {$statusCallback!=""} {
        $statusCallback "Changing selected cavity setpoints by $changeInSetpoint..."
    }

    set cavputCommandList ""

    set setpointPV(36,1) SRF:S36:FB1:pidSpCh0AO
    set setpointPV(36,2) SRF:S36:FB1:pidSpCh1AO
    set setpointPV(36,3) SRF:S36:FB2:pidSpCh0AO
    set setpointPV(36,4) SRF:S36:FB2:pidSpCh1AO
    set setpointPV(37,1) SRF:S37:FB1:pidSpCh0AO
    set setpointPV(37,2) SRF:S37:FB1:pidSpCh1AO
    set setpointPV(37,3) SRF:S37:FB2:pidSpCh0AO
    set setpointPV(37,4) SRF:S37:FB2:pidSpCh1AO
    set setpointPV(38,1) SRF:S38:FB1:pidSpCh0AO
    set setpointPV(38,2) SRF:S38:FB1:pidSpCh1AO
    set setpointPV(38,3) SRF:S38:FB2:pidSpCh0AO
    set setpointPV(38,4) SRF:S38:FB2:pidSpCh1AO
    set setpointPV(40,1) SRF:S40:FB1:pidSpCh0AO
    set setpointPV(40,2) SRF:S40:FB1:pidSpCh1AO
    set setpointPV(40,3) SRF:S40:FB2:pidSpCh0AO
    set setpointPV(40,4) SRF:S40:FB2:pidSpCh1AO

    set sectorIndex 0
    set cavityIndex 0
    set sectorFlag 1
    set cavityFlag 1

    foreach sector $sectorList {
        if {[subst $[lindex $sectorVarList $sectorIndex]]==1} {
            set sectorFlag 0
        }
        incr sectorIndex
    }

    foreach cavity $cavityList {
        if {[subst $[lindex $cavityVarList $cavityIndex]]==1} {
            set cavityFlag 0
        }
        incr cavityIndex
    }

    if {$sectorFlag && !$cavityFlag} {
        if {$statusCallback!=""} {
            $statusCallback "No RF sectors selected."
        }
        return 0
    } elseif {!$sectorFlag && $cavityFlag} {
        if {$statusCallback!=""} {
            $statusCallback "No RF cavities selected."
        }
        return 0
    } elseif {$sectorFlag && $cavityFlag} {
        if {$statusCallback!=""} {
            $statusCallback "No RF sectors or cavities selected."
        }
        return 0
    }

    set sectorIndex 0

    foreach sector $sectorList {
        if {[subst $[lindex $sectorVarList $sectorIndex]]==1} {
            set cavityIndex 0
            foreach cavity $cavityList {
                if {[subst $[lindex $cavityVarList $cavityIndex]]==1} {
                    lappend cavputCommandList [subst [join {$setpointPV($sector,$cavity) = $changeInSetpoint} {}]]
                }
                incr cavityIndex
            }
        }
        incr sectorIndex
    }

    set cavputCommand [join $cavputCommandList {,}]
    set cavputCommand [subst [join {-list= $cavputCommand} {}]]
    set cavputCommand "cavput $cavputCommand -deltaMode -pendIOTime=30"

    eval exec $cavputCommand

    if {$statusCallback!=""} {
        $statusCallback "Done."
    }
    return 1
}

proc SetStatus {text} {
    global ControlStatus
    set ControlStatus $text
    update
}

# Build Application

set changeInSetpoint 0.0

MakeRMMeasurementMenuAndStatus
MakeRMMeasurementFrameWidget .ptbCorrectorWidgets -parent .userFrame
