#!/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 filename ""
set steps 10
#set warnValue 32010
#set stopValue 33535
set runControlPV B:BM:RampMonitorRC
APSParseArguments {filename steps runControlPV}

set lastPing 0
set pingTimeout 20
proc PingRunControl {args} {
    global runControlPV lastPing pcasID
    set sec [clock seconds]
    if {[expr $lastPing + 2] > $sec} {
        return
    } else {
        set lastPing $sec
    }

    catch {APSRunControlPing} status
    switch $status {
        RUNCONTROL_OK {}
        RUNCONTROL_ABORT {
            catch {exec kill $pcasID}
            puts stderr "BMRamMon was aborted."
	    exit 1
        }
        RUNCONTROL_TIMEOUT -
        RUNCONTROL_ERROR {
            catch {exec kill $pcasID}
            puts stderr "Unable to ping runcontrol record of $runControlPV: $status."
	    exit 1
        }
    }
}


set currAvePV B:BM:CurrentWFAve

if [catch {APScavput -list=$runControlPV.CLR=1 -pend=20} result] {
    puts stderr "[exec date] error clear run control $runControlPV record: $result"
    exit
}

if [catch {APSRunControlInit -pv $runControlPV \
	       -description "BM Ramp monitor" \
	       -timeout [expr $pingTimeout * 1000] } result] {
    puts stderr "[exec date] Unable to initialize runcontrol for PAR timing feedforward, the runcontrol record may not be cleared, press the clear button on the medm screen to clear the record and restart: $result"
    exit
}

APSRunControlLogMessage -message "Running" -severity 0

PingRunControl 

#ramp state B:BM:sPSVoltageWF
#AFG gain: B:BM:VoltageRT.GAIN
if ![string length $filename] {
    set filename BMcurrentMon-[clock format [clock seconds] -format %Y-%m%d].sdds
}
#exec cavput -list=B:BM:CurrentWFAveWarn=32010,B:BM:CurrentWFAveStop=33535

if ![file exist $filename] {
    set fd [open $filename "w+"]
    puts $fd "SDDS1"
    puts $fd "&column name=Time, type=double, &end"
    puts $fd "&column name=B:BM:sPSVoltageWFAve, type=double, &end"
    puts $fd "&column name=B:BM:sCurrentWFAve, type=double, &end"
    puts $fd "&column name=B:BM:VoltageRT.GAIN, type=double, &end"
    puts $fd "&column name=It:Ddg4chan0.GATE, type=short, &end"
    puts $fd "&column name=B:BM:PSVoltageWFAve, type=double, &end"
    puts $fd "&column name=B:BM:CurrentWFAve, type=double, &end"
    puts $fd "&data mode=ascii, no_row_counts=1, &end"
} else {
    set fd [open $filename "a+"]
}
if ![file exist $filename.scalars] {
    exec sddsmakedataset $filename.scalars -col=ControlName,type=string -data=B:BM:VoltageRT.GAIN,It:Ddg4chan0.GATE \
	-col=Readback,type=string -data=AFGGain,RampState 
}
set tmpRoot /tmp/[APSTmpString]

set step 0
while {1} {
    PingRunControl
    if [catch {exec sddswmonitor -step=1 $tmpRoot.0 -scalars=$filename.scalars -erase \
		   -pvnames=B:BM:sPSVoltageWF,B:BM:sCurrentWF -pend=30} result] {
	puts stderr "Error reading Booster voltage/current ramp: $result"
	exit 1
    }
    if [catch {exec sddswmonitor -step=1 $tmpRoot.1 -scalars=$filename.scalars -erase \
		   -pvnames=B:BM:PSVoltageWF,B:BM:CurrentWF -pend=30} result] {
	puts stderr "Error reading Booster voltage/current ramp1: $result"
	exit 1
    }
    if [catch {exec sddsprocess $tmpRoot.1 -pipe=out \
		   -process=B:BM:PSVoltageWF,ave,AveVoltage1 \
		   -process=B:BM:CurrentWF,ave,AveCurrent1 \
		   | sdds2stream -pipe=in -par=AveVoltage1,AveCurrent1 } valList] {
	puts stderr "Error processing voltage change1: $result"
	exit 1
    }
    set vol [lindex $valList 0]
    set curr [lindex $valList 1]
    if [catch {APScavput -list=B:BM:CurrentWFAve=$curr -pend=10} result] {
	puts stderr "Error setting current average PV: $result"
    }
    if [catch {exec sddsprocess $tmpRoot.0 -pipe=out  \
		   -process=B:BM:sPSVoltageWF,ave,AveVoltage \
		   -process=B:BM:sCurrentWF,ave,AveCurrent \
	       | sdds2stream -pipe=in -par=StartTime,AveVoltage,AveCurrent,B:BM:VoltageRT.GAIN,It:Ddg4chan0.GATE} result] {
	puts stderr "Error processing voltage change: $result"
	exit 1
    }
    set gate [lindex $result 4]
    switch $gate {
	Enabled {
	    set gateVal 1
	}
	Disabled {
	    set gateVal 0
	}
	default {
	    set gateVal [format %0.f $gate]
	}
    }	
    puts $fd "[lindex $result 0] [lindex $result 1] [lindex $result 2] [lindex $result 3] $gateVal $vol $curr"
    if [catch {APScavget -list=B:BM:CurrentWFAveWarn,B:BM:CurrentWFAveStop -printErrors} warnStop] {
	puts stderr "Error reading warn and stop value: $warnStop"
	exit 1
    }
    set warnValue [lindex $warnStop 0]
    set stopValue [lindex $warnStop 1]
    puts "[exec date] average current now: $curr (warn: $warnValue; stop: $stopValue)"
    if {$curr>$stopValue} {
	if [catch {APScavget -list=It:Ddg4chan0.GATE -pend=10 -num} rampState] {
            puts stderr "Error reading BM ramp state: $rampState"
            exit 1
        }
	
        if $rampState {
            #puts "Average current is higher than reference ($stopValue), stop BM ramp..."
	    if [catch {APScavput -list=It:Ddg4chan0.GATE=0 -pend=30} result] {
		puts stderr "Error disable BM ramp: $result"
                exit 1
            }
            puts "BM ramp stopped."
        }
	
    } elseif {$curr>$warnValue} {
	puts "Warning, the average BM current is higher than the warning value ($warnValue)!"
	#puts $fd "[lindex $result 0] [lindex $result 1] [lindex $result 2] [lindex $result 3] [format %.0f [lindex $result 4]] $vol $curr"
    }
    after 1000
    incr step
}

exit 0
