#!/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 lastPing 0
set runControlPV B:SwapSyncRC
set pingTimeout 20
proc PingRunControl {args} {
    global runControlPV lastPing
    set sec [clock seconds]
    if {[expr $lastPing + 2] > $sec} {
        return
    } else {
        set lastPing $sec
    }

    catch {APSRunControlPing} status
    switch $status {
        RUNCONTROL_OK {}
        RUNCONTROL_ABORT {
            return -code error "BRampSwapSync was aborted."
        }
        RUNCONTROL_TIMEOUT -
        RUNCONTROL_ERROR {
            return -code error "Unable to ping runcontrol record of $runControlPV: $status."
        }
    }
}

proc SwapSync {args} {
    set magnet ""
    APSParseArguments {magnet}
    global varList errorCode
    eval global $varList
    
    if [set ${magnet}NewT] {
        if [pv getw ${magnet}Error] {
            puts stderr "Error reading error: $errorCode"
            return
        }
        if [set ${magnet}Error] {
            puts stderr "[exec date] $magnet error state=[set ${magnet}Error]"
            return
        }
        set ${magnet}Swap 1
        set BSync 1
        if [pv putw ${magnet}Swap] {
            puts stderr "Error swap $magnet: $errorCode"
            return
        }
        if [pv putw BSync] {
            puts stderr "Error sync $magnet: $errorCode"
            return
        }
    }
}

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 "BRamp Swap/Sync Server" \
	       -timeout [expr $pingTimeout * 1000] } result] {
    puts stderr "[exec date] Unable to initialize runcontrol BRamp Swap/Sync, 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
foreach magnet {"BM" "SD" "QF" "QD"} var {"BM" "SD" "QF" "QD"} {
    lappend pvList B:${magnet}:VoltageRT.NEWT
    lappend varList ${var}NewT
    lappend pvList B:${magnet}:VoltageRT.SWAP
    lappend varList ${var}Swap
    lappend pvList B:${magnet}:VoltageRT.ERRC
    lappend varList ${var}Error
}
#add SD-U pvs
lappend pvList B:SD-U:CurrentRT.NEWT 
lappend varList SDUNewT
lappend pvList B:SD-U:CurrentRT.SWAP
lappend varList SDUSwap
lappend pvList B:SD-U:CurrentRT.ERRC
lappend varList SDUError
#add SF-U pvs
lappend pvList B:SF-U:CurrentRT.NEWT 
lappend varList SFUNewT
lappend pvList B:SF-U:CurrentRT.SWAP
lappend varList SFUSwap
lappend pvList B:SF-U:CurrentRT.ERRC
lappend varList SFUError

lappend pvList B:PSAFG100SyncBO
lappend varList BSync

PingRunControl

if [pv linkw $varList $pvList 30] {
    puts stderr "Error link pvs: $errorCode"
    exit 1
}

foreach magnet {"BM" "SFU" "SD" "QF" "QD" "SDU"} {
    pv umon ${magnet}NewT "SwapSync -magnet $magnet"
}

while { 1 } {
    if [catch {PingRunControl} result] {
        puts stderr "$result"
        catch {exec cavput -list=$runControlPV.ABRT=1 -pend=20} result
        exec cawait -waitFor=$runControlPV.RUN,equal=0 -pend=30
        catch {exec cavput -list=$runControlPV.CLR=1 -pend=20} result
        exit 1
    }
    APSWaitWithUpdate -waitSeconds 10 -updateInterval 1
}
exit
