#!/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)]
APSStandardSetup

set args $argv
set rootname ""
set userDescription ""
set topup 1
set displayRunControl 0
set test 0
APSParseArguments {rootname userDescription topup displayRunControl test}

set collected 0
set first 1
proc CollectData {args} {
    global InjectionState global rootname userDescription topup dataDir MuxFile0 ScopeFile0
    global injectValue collected first test
    
    if {!$test && [string compare $InjectionState $injectValue]!=0} {
        #do nothing
        return
    }
    
    puts "[exec date] Injecting..."
    
    #from injecting (1) to 0 (done), collect data
    if $topup {
        if [catch {exec sendHP9000ScopeCommand -ring SR -command ":RUN" } result] {
            puts stderr "collectUserOpsKickerWaveforms11c: error starting HP9000 scope."
        }
        if !$test {
	    for {set i 0} {$i<5} {incr i} {
		if [catch {APSRunControlPing} result] {
		    puts stderr "Error: APSRunControlPing \#2, Run control denied: $result"
		    exit 1
		}
		after 1000
	    }
	}
    }
    
    puts "[exec date] Collecting Kicker waveforms from HP9000..."
    #to save time: do not process data for non-topup
    if [catch {APSCollectHP9000Data -dataDir $dataDir -rootname $rootname -ring SR -userDescription $userDescription \
                 -statusCallback puts -clipLastHalf 0 -process $topup -setupMux 0} result] {
        puts stderr  "collectUserOpsKickerWaveforms10: error collecting kicker waveforms: $result"
        #  exit 1
        
    }
    if !$test {
	if [catch {APSRunControlPing} result] {
	    puts stderr "Error: APSRunControlPing \#3, Run control denied: $result"
	    exit 1
	}
    }
    set collected 1
    if !$topup {
        #only collect one data for nontopup injection
        exit 0
    }
}

if $topup {
    puts "Logging topup kicker waveforms..."
    set injectPV  Mt:TopUpWarning2InjectorM.VAL
    set injectValue InjectWarn
    set RCtimeout 30
} else {
    puts "Logging non-topup kicker waveforms..."
    set RCtimeout 30
    set injectPV Mt:Ddg3chan0.GATE
    set injectValue Enabled
}

set dataDir /home/helios/oagData/sr/scope/archiveData1
set RCPV SR:UserOpsKickerLogRC
if [catch {exec cavget -list=$RCPV.RUN -pend=20 } running] {
    puts stderr error "error checking logging runcontrol: $running"
    exit 1
}
if !$test {
    if $running {
	if [catch {exec cavput -list=$RCPV.ABRT=1 -pend=20} result] {
	    puts stderr "Error1 abort $RCPV: $result"
	    exit 1
	}
	if [catch {exec cawait -waitFor=$RCPV.RUN,equalTo=0 -pend=20} result] {
	    puts stderr "Error2 aborting $RCPV: $result"
	    exit 1
	}
    }
    catch {APScavput -list=$RCPV.CLR=1}
    
    if [catch {APSRunControlInit -pv $RCPV \
		   -description $userDescription \
		   -timeout [expr $RCtimeout * 1000]} result] {
	puts stderr $result
	#  exit 1
    }
    
    if $displayRunControl {
        catch {exec medm -x -cleanup -attach -dg +500+50 -macro RCPV=$RCPV \
		   ./sr/psApp/APSRunControlSingle.adl &}
    }
    
    if [catch {APSRunControlPing} result] {
	puts stderr "SRTopupBucketAssignment3: APSRunControlPing \#1, Run control denied: $result"
	# exit 1
    }
}

if [catch {APSReadHPScopeMeasSpec \
             -file $dataDir/$rootname.spec} result] {
   puts stderr "Error reading scope spec: $result"
   exit 1
}

set doPrompt 0

set runID [APSTmpString]
if {[llength $MainSetupScript]} {
    puts "[exec date] Doing main setup for measurement."
    if [catch {eval $MainSetupScript -ID $runID -mode setup -doPrompt $doPrompt} result] {
        catch {eval $MainSetupScript -ID $runID -mode cleanup}
        APSMpReturn error "APSMpCollectHP9000ScopeData3: $MainSetupScript: $result"
    }
} else {
    set MainSetupScript APSNoOp
}
if !$test {
    if [catch {APSRunControlPing} result] {
	puts stderr "SRTopupBucketAssignment3: APSRunControlPing \#1, Run control denied: $result"
	# exit 1
    }
}
set MuxFile0 [lindex $MuxFile 0]
set ScopeFile0 [lindex $ScopeFile 0]
set SetupScript0 [lindex $SetupScript 0]
if ![file exists $dataDir/$MuxFile0] {
    puts stderr "Error: mux file $dataDir/$MuxFile0 does not exist!"
    exit 1
}
if ![file exists $dataDir/$ScopeFile0] {
    puts stderr "Error: scope file $dataDir/$ScopeFile0 does not exist!"
    exit 1
}

if [catch {exec sddscasr -restore $dataDir/$MuxFile0 } result] {
    puts stderr "collectUserOpsKickerWaveforms1a: error setup mux0: $result"
}
if !$test {
    if [catch {APSRunControlPing} result] {
	puts stderr "SRTopupBucketAssignment3: APSRunControlPing \#1, Run control denied: $result"
	# exit 1
    }
}

#if [catch {exec restoreHP9000State -ring SR  -filename $dataDir/$ScopeFile0} result] {
#    puts stderr  "collectUserOpsKickerWaveforms1b: error setup scope0: $result"
#}
if [catch {exec hp9000ScopeSocketCommand -ring SR -restore $dataDir/$ScopeFile0} result] {
    puts stderr "collectUserOpsKickerWaveforms1b: error setup scope0: $result"
}

if !$test {
    if [catch {APSRunControlPing} result] {
	puts stderr "SRTopupBucketAssignment3: APSRunControlPing \#1, Run control denied: $result"
	# exit 1
    }
}

if [catch {exec sendHP9000ScopeCommand -ring SR -command ":RUN" } result] {
    puts stderr "colcollectUserOpsKickerWaveforms11c: error starting HP9000 scope."
}

if !$test {
    if [catch {APSRunControlPing} result] {
	puts stderr "SRTopupBucketAssignment3: APSRunControlPing \#1, Run control denied: $result"
	# exit 1
    }
}

if [pv linkw InjectionState $injectPV 30] {
    puts stderr "Error setup link for $injectPV: $errorCode"
}


#pv umon InjectionState CollectData
set first 1

if [pv getw InjectionState] {
    puts stderr "Error reading $injectPV : $errorCode"
    exit 1
}
if $test {
    CollectData
    exit 0
}
set prevValue $InjectionState
pv umon InjectionState CollectData
while {1} {
    if [catch {APSRunControlPing} result] {
        puts stderr  "exit collectUserOpsKickerWaveforms because of  $result"
        exit 1
    }
    APSWaitWithUpdate -waitSeconds 10 -updateInterval 1
}
exit 0



