#!/bin/sh
# \
exec oagwish -f "$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)]
APSDebugPath

set CVSRevisionAuthor borland

APSApplication . -name wiggleSrBeam -version $CVSRevisionAuthor \
  -overview ""

set mainStatus "Ready."
APSScrolledStatus .status -parent .userFrame -textVariable mainStatus -width 40

set correctorName S1A:H1
set amplitude 10
set period 15
set steps 10
set periods 100
set caWaveAbortVariable 0

APSLabeledEntry .corname -parent .userFrame -textVariable correctorName \
        -label "Corrector (e.g., S1A:H1): "
APSLabeledEntry .amplitude -parent .userFrame -textVariable amplitude  \
        -label "Amplitude (A): "
APSLabeledEntry .period -parent .userFrame -textVariable period \
        -label "Period (sec): "
APSLabeledEntry .steps -parent .userFrame -textVariable steps \
        -label "Steps per period: " 
APSLabeledEntry .periods -parent .userFrame -textVariable periods \
        -label "Periods to do: "

APSFrame .buttons -parent .userFrame -label "" 
set w .userFrame.buttons.frame
APSButton .go -parent $w -text Go -command "GoWiggleBeam"
APSButton .stop -parent $w -text Stop -command "StopWigglingBeam"

proc setMainStatus {text} {
    global mainStatus
    set mainStatus $text
    update
}

proc GoWiggleBeam {} {
    global correctorName amplitude period steps periods
    set pvName [string trim $correctorName]:CurrentAO
    if {[catch {exec cavget  -list=$pvName -pend=10 } origValue] || \
        [string compare $origValue ?]==0} {
        setMainStatus "Corrector doesn't exist"
        return
    }
    setMainStatus "$correctorName now wiggling about $origValue"
    global corVariable caWaveAbortVariable
    set caWaveAbortVariable 0
    APScaWave -pvList $pvName -variableList corVariable \
      -amplitudeList $amplitude -period $period -stepsPerPeriod $steps \
      -periods $periods -abortVariable caWaveAbortVariable \
      -postStepCallback "update; APSNoOp"
    if [catch {exec cavput -list=$pvName=$origValue} result] {
        setMainStatus "Problem reseting corrector: $result"
    } else {
        setMainStatus "$correctorName set to $origValue"
    }
}

proc StopWigglingBeam {} {
    global caWaveAbortVariable
    setMainStatus "Aborting..."
    set caWaveAbortVariable 1
}
