#!/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 BoosterWF ""
proc SRInjectionStateChange {args} {
    global SRInjectionEnabled SRInjectionOccurred BoosterWF
    if {($SRInjectionEnabled == "Enabled") || ($SRInjectionOccurred == "Inject")} {
        set BoosterWF ",BoosterWF"
    } else {
        set BoosterWF ""
    }
}

#Prelink all the PVs
if {[pv linkw "SRInjectionEnabled SRInjectionOccurred" "S-INJ:InjectionEnabledM S-INJ:InjectionOccurredM" 5] == 1} {
    puts "Error: can't connect to S-INJ:InjectionEnabledM and/or S-INJ:InjectionOccurredM"
    APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
    exit
}
if {[pv mon "SRInjectionEnabled SRInjectionOccurred" SRInjectionStateChange] == 1} {
    puts "Error: can't monitor S-INJ:InjectionEnabledM and/or S-INJ:InjectionOccurredM"
    APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
    exit
}
if {[catch {APScavget -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16,32,64,128,256,BoosterWF -list=M -floatformat=%lf -printErrors} results]} {
    puts "Error: $results"
    APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
    exit
}

#Check if they are already being updated by another instance of timingSignalsDriver
after 1000
if {[catch {APScavget -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16,32,64,128,256,BoosterWF -list=M -floatformat=%lf -printErrors} results2]} {
    puts "Error: $results2"
    APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
    exit
}
if {$results != $results2} {
    #They are being updated by another instance of timingSignalsDriver
    exit
}

#Sync up with system clock
after [expr 1000 - [string trimleft [string range [clock clicks] end-5 end-3] 0]]
set lastSec [clock seconds]

while {1} {
    set sec [clock seconds]
    if {$sec != $lastSec} {
        if {![expr $sec % 256]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16,32,64,128,256,BoosterWF -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 128]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16,32,64,128,BoosterWF -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 64]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16,32,64,BoosterWF -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 32]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16,32${BoosterWF} -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 16]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8,16${BoosterWF} -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 8]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4,8${BoosterWF} -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 4]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2,4${BoosterWF} -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 2]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1,2${BoosterWF} -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {![expr $sec % 1]} {
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5,1${BoosterWF} -list=M=$sec} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } else {
            puts $sec
        }
        set lastSec $sec
    } else {
        update
        set t [expr 1000 - [string trimleft [string range [clock clicks] end-5 end-3] 0]]
        if {$t > 755} {
            after [expr $t - 750]
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25 -list=M=${sec}.75} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {$t > 505} {
            after [expr $t - 500]
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25,Point5 -list=M=${sec}.5} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } elseif {$t > 255} {
            after [expr $t - 250]
            if {[catch {APScavput -list=OAG:loggerPeriod -list=Point25 -list=M=${sec}.25} results]} {
                puts "Error: $results"
                APSSendEMail -address soliday@anl.gov -subject "timingSignalDriver problem" -message "Needs restart"
                exit
            }
        } else {
            after $t
        }
    }    
}
