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

set args $argv
set type ID
set USDS ""
set sectorList 1
set abort 0
set all 0
APSStrictParseArguments {type USDS sectorList abort all}

switch $type {
    ID -
    BM -
    CU {
	#ok
    }
    default {
	puts stderr "invalid steering type provided - $type"
	exit 1
    }
}

if $all {
    set sectorList ""
    switch $type {
	ID {
	    for {set sector 1} {$sector<=35} {incr sector} {
		lappend sectorList $sector
	    }
	}
	BM {
	    set sectorList {1 2 5 6 7 8 9 10 11 12 13 14 16 17 19 20 23 33 35}
	    set sectorList [join [exec sdds2stream -col=Sector /home/helios/oagData/sr/BMs/sectors.sdds]]
	}
	CU {
	    set sectorList {2 6 11 12 13 15 16 21 22 23 24 25 28 31 32 34}
	    set sectorList [join [exec sdds2stream -col=Sector /home/helios/oagData/sr/IDs/CUSteering.sdds]]
	}
    }
}

proc StartAbortSteeringServer {args} {
    set abort 0
    set sector ""
    set type ID
    set timeout 300
    APSParseArguments {abort sector type timeout} 
    set sectorf [format %02d $sector]
    global posLimit angleLimit
    switch $type {
	ID {
	    set knobFile /home/helios/oagData/sr/knobs/IDbump/lattices/default/ID$sectorf.cokn
	}
	BM {
	    set knobFile /home/helios/oagData/sr/knobs/BMbump/lattices/default/BM$sectorf.cokn
	}
	CU {
	    set knobFile /home/helios/oagData/sr/knobs/CUbump/lattices/default/CU$sectorf.cokn
	}
    }
    
    if ![file exist $knobFile] {
	puts stderr "Error1: $knobFile does not exist!"
	exit 1
    }
    set knobNames [exec sdds2stream -par=ControlName $knobFile]
    set readbackNames [exec sdds2stream -par=SetRbvPV $knobFile]
    set runControlPVs [exec sdds2stream -par=RunControlPV $knobFile]
    set pauseList [exec sdds2stream -par=WaitTime $knobFile]
    set limitList [exec sdds2stream -par=DeltaLimit $knobFile]
    set limitPVList [exec sdds2stream -par=SetValueLimitPV $knobFile]
    set pausePVList [exec sdds2stream -par=SetValueWaitTimePV $knobFile]
    set runcontrolList [exec sdds2stream -par=RunControlPV $knobFile]
    if !$abort {
	if [catch {exec cavget -list=[join $runcontrolList ,] -list=.RUN -printErrors -pend=10} runList] {
	    puts stderr "Error checking steering servers: $runList"
	    exit 1
	}
	set running 0
	foreach knob $knobNames run $runList runcontrol $runcontrolList {
	    if {$run} {
		puts "$knob is already running, abort it before starting it"
		incr $running
		continue
	    }
	}
	if {$running} {
	    puts stderr "S$sector $type steering servers are already running, abort it before restart it!"
	    continue
	}
	while {1} {
	    if [catch {exec cavget -list=[join $runcontrolList ,] -list=.RUN -printErrors -pend=10} runList] {
		puts stderr "Error checking steering servers: $runList"
		exit 1
	    }
	    set aborted 1
	    foreach run $runList {
		if $run {
		    set aborted 0
		}
	    }
	    if $aborted {
		break
	    }
	    after 1000
	}
	
	catch {exec daq-pv-group-mgr --input-sdds-file $knobFile --runtime 0 & } results
	after 5000
	#wait for steering server starts
	set timeout0 [expr [clock seconds]+$timeout]
	while {[clock seconds]<$timeout0} {
	    set done 1
	    if [catch {exec cavget -list=[join $runcontrolList ,] -list=.RUN -printErrors -pend=10} runList] {
		puts stderr "Error checking steering servers: $runList"
		exit 1
	    }
	    foreach run $runList {
		if !$run {
		    set done 0
		}
	    }
	    if $done {
		break
	    }
	    after 1000
	}
	set putList ""
	foreach name $readbackNames pva $knobNames limit $limitList limitPV $limitPVList pause $pauseList pausePV $pausePVList {
	    lappend putList ${pva}:ServerRunningM=1
	    lappend putList $limitPV=$limit
	    lappend putList $pausePV=$pause
	}
	exec cavput -list=[join $putList ,] -pend=10
	puts "S$sectorf $type steering server started."
    } else {
	#use runcontrol to abort
	if [catch {exec cavput -list=[join $runControlPVs ,] -list=.ABRT=1 -pend=10} result] {
	    puts stderr "Error aborting S$sectorf $type steering server: $result"
	    exit 1
	}
	after 1000
	   
	if [catch {exec cavput -list=[join $runControlPVs ,] -list=.ABRT=1 -pend=10} result] {
	    puts stderr "Error aborting S$sectorf $type steering server: $result"
	    exit 1
	}
	exec cavput -list=[join $knobNames ,] -list=:ServerRunningM=0
	if {0} {
	set fileroot [file root $knobFile]
	if [catch {exec ps -fed | grep daq-pv-group | grep $fileroot} results] {
	    continue
	}
	set jobList [split $results "\n"]
	# puts $jobList
	foreach job $jobList {
	    if [regexp "grep" $job] {
		continue
	    }
	    set pid [scan $job "sr%ld"]
	    if [catch {expr $pid / 2} result] {
		continue
	    } else {
		puts $pid
		catch {exec kill -9 $pid }
	    }
	}
	}
	puts "S$sectorf $type steering server aborted."
    }
}

foreach sector $sectorList {
    puts "working on $type sector $sector ..."
    StartAbortSteeringServer -sector $sector -type $type -abort $abort
}

puts "done."
flush stderr
flush stdout

exit 0
