#!/bin/sh
# \
exec oagwish "$0" "$@"

# $Log: not supported by cvs2svn $
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 allowAllSectors 0
set steeringType ID
set sector ""
APSStrictParseArguments {allowAllSectors steeringType sector}
set CVSRevisionAuthor "\$Revision: 1.0 $ \$Author: shang $"

#if sector is given, then only brought up the sector steering dialog.

set otherDisplay :0.0
set steerType $steeringType
#change parsing argument steerType to have better name (steeringType), however, to advoid introduce bugs, the following code still use the
#old one -- steerType 
set Steering(steerType) $steerType
set Steering(givenSector) $sector
set SteeringStatus Ready.
if [string length $sector] {
    set SteeringStatus$sector ""
    APSApplication . -name "APSUBeamlineSteering -steeringType $steerType -sector $sector" \
	-overview "provides convenience controls for ${steerType}$sector steering."
    APSScrolledStatus .status -parent .userFrame -width 60\
        -textVariable SteeringStatus$sector
} else {
    APSApplication . -name "APSUBeamlineSteering -steeringType $steerType" \
	-overview "provides convenience controls for ${steerType} steering."
    APSScrolledStatus .status -parent .userFrame -width 60\
        -textVariable SteeringStatus 
}
set tcl_precision 6


proc SetSteeringStatus {text} {
    global SteeringStatus
    set SteeringStatus "[clock format [clock seconds] -format %H:%M:%S]: $text"
    update
#    bell
}

proc SetSectorStatus {text args} {
    set sector ""
    APSParseArguments {sector}
    global SteeringStatus$sector
    set SteeringStatus$sector "[clock format [clock seconds] -format %H:%M:%S]: $text"
    update
}
proc EnableDisableSectors {args} {
    global Steering allowAllSectors

    for {set sector 1} {$sector<=40} {incr sector} {
	set sectorf [format %02d $sector]
	if [lsearch -exact Steering(sectorList) $sector]<0 {
	    if !$allowAllSectors {
		APSDisableButton $Steering(S$sectorf.button)
	    } else {
		APSEnableButton $Steering(S$sectorf.button)
	    }
	}
    }
}

proc MakeSectorsWidget {widget args} {
    global Steering allowAllSectors

    set parent ""
    APSParseArguments {parent}
    
    set Steering(deltaLimit) 5
    set Steering(waitTime) 1
    
    set w $parent$widget
    APSFrame $widget -parent $parent \
      -label "Storage Ring $Steering(steerType) selection for steering." \
      -contextHelp {sector selection frame} 

    if !$allowAllSectors {
        set sectorList $Steering(sectorList)
    }
    
    for {set quad 1} {$quad<5} {incr quad} {
        set start [expr ($quad-1)*10+1]
        set end   [expr $start+9]
        set buttonList {}
        set valueList {}
        APSFrame .sector$quad -parent $w.frame 
        $w.frame.sector$quad.frame configure -relief flat
        for {set sector $start} {$sector<=$end} {incr sector} {
            set cbLabel $sector
            if {$sector<10} {set cbLabel "0$sector"}
            APSButton .sector$sector -parent $w.frame.sector$quad.frame \
              -text "$cbLabel" \
              -command "SteeringDialog -sector $sector" \
              -contextHelp "Brings up dialog box for ID$cbLabel steering."
	    set Steering(S[format %02d $sector].button) $w.frame.sector$quad.frame.sector$sector.button
            if !$allowAllSectors {
                if [expr -1 == [lsearch $sectorList $sector]] {
                    APSDisableButton $w.frame.sector$quad.frame.sector$sector.button
                }
            }
        }
    }
    global allowAllSectors
    set Steering(saveUBOP) 1
    
    APSRadioButtonFrame .all -parent $parent -label "Allow all sectors?" -buttonList {Yes No} -orientation horizontal \
	-valueList {1 0} -variable allowAllSectors -commandList {EnableDisableSectors EnableDisableSectors}
    APSRadioButtonFrame .ubop -parent $parent -label "Save UBOP after steering?" -buttonList {Yes No} -orientation horizontal \
	-valueList {1 0} -variable  Steering(saveUBOP)
    
    set width 10
 
    APSFrame .adt -parent $parent
    APSButton .adt -parent $parent.adt.frame -text "SR BPM AdjustedCC ADT (difference mode)" \
	-command "exec adt -f /home/helios/OAG/oagData/ADTFiles/srBpm/sr.bpm.lowPass1s.adjusted.pv -a /home/helios/OAG/oagData/ADTFiles/srBpm -z 3 -d  &"
    
}

set tmpRoot /tmp/[APSTmpString]
proc SteeringDialog {args} {
    global Steering  otherDisplay errorCode tmpRoot 

    set sector ""
    set parent ""
    APSParseArguments {sector parent}
    if ![string length $sector] {
        APSAlertBox [APSUniqueName .] -errorMessage \
          "No sector variable specified in $Steering(steerType) SteeringDialog"
        return 1
    }
    set sectorf [format %02d $sector]
    
    if !$Steering(S$sectorf.configLoaded) {
	if [catch {LoadSteeringConfig -sector $sector} result] {
	    APSAlertBox .alert -errorMessage "Error loading config for S$sectorf: $result"
	    exit
	}
	set Steering(S$sectorf.configLoaded)  1
    }
    set border 2
    global SteeringStatus$sector
    set SteeringStatus$sector Ready
    if ![string length $parent] {
	set dialogFrame .dialog$sector.userFrame
	APSDialogBox .dialog$sector  \
	    -name "$Steering(steerType) $sectorf Dialog" \
	    -contextHelp "Dialog box for steering in $Steering(steerType) $sectorf."
	APSScrolledStatus .status -parent $dialogFrame -width 60\
	    -textVariable SteeringStatus$sector
	set parent $dialogFrame
    }
    APSFrame .parameters -parent $parent
    $parent.parameters.frame configure -relief flat
    
    set w $parent.parameters.frame
    if {$Steering(steerType)=="BM"} {
	#BM only has yp steering
	set planeList y
	set wList $w
    } else {
	APSFrameGrid .grid -parent $w -xList {x1 x2}
	set w1 $w.grid.x1
	set w2 $w.grid.x2
	set planeList {x y}
	set wList [list $w1 $w2]
    }
    set width 15
    foreach plane $planeList win $wList {
	APSLabel .l1 -parent $win -text "     $plane plane bpm setpoint"
	set i  0
	foreach bpm $Steering(S$sectorf.${plane}p.bpmList) {
	    APSLabeledOutput .bpm$i -parent $win -label "[format %10s $bpm] setpoint(um)  " -width $width \
		-textVariable Steering(S$sectorf.${plane}p.$bpm.var) 
	    incr i
	}
	APSLabel .l -parent $win -text ""
	APSLabel .l2 -parent $win -text "     $plane plane corr setpoint"
	set i 0
	foreach corr $Steering(S$sectorf.${plane}p.corrList) {
	    APSLabeledOutput .corr$i -parent $win -label "[format %10s $corr] setpoint(A)  " -width $width \
		-textVariable Steering(S$sectorf.${plane}p.$corr.var) 
	    incr i
	}
    }
    
    APSFrame .exec -parent $parent -label "Steering(Knob) execution"
    set w $parent.exec.frame
    APSLabel .t -parent $w -text "                                           Steer       Status       StepSize   Accumulated  Total-Accu.  LowLimit    HighLimit"
    set index 1
    foreach type $Steering(typeList) units $Steering(unitsList) {
	set Steering(S$sectorf.$type.accuValue) 0
	set label "$type ($units):"
	set Steering(S$sectorf.$type.steerButtons) ""
	APSFrame .f$index -parent $w
	set w1 $w.f$index.frame
	$w1 configure -bd 0
	APSButton .${type}zero -parent $w1 -packOption "-side right" -text "Zero Accum" -command "ChangeKnob -value zero -sector $sector -type $type"
	lappend Steering(S$sectorf.$type.steerButtons)  $w1.${type}zero.button
	
	APSButton .${type}limit -parent $w1 -packOption "-side right" -text Limits -command "ChangeLimitWidget -sector $sector -type $type"
	
	APSLabeledEntryFrame .$type -parent $w1 -label "[format %20s $label]" -orientation horizontal -variableList \
			     [list Steering(S$sectorf.$type.status) Steering(S$sectorf.$type.StepSize) Steering(S$sectorf.$type.accuValue) Steering(S$sectorf.$type.readback) Steering(S$sectorf.$type.llimit) Steering(S$sectorf.$type.hlimit)] -width 12 
	
	foreach ii {1 3 4 5 6} {
	    $w1.$type.frame.entry$ii configure -disabledforeground black
	    $w1.$type.frame.entry$ii configure -state disable
	}
	
	if [regexp "x" $type] {
	    APSButton .add -parent $w1.$type -packOption "-side right" -text "Out " -command "ChangeKnob -value 1 -sector $sector -type $type" \
		-contextHelp "steer $type by 1 $units"
	} else {
	     APSButton .add -parent $w1.$type -packOption "-side right" -text " Up " -command "ChangeKnob -value 1 -sector $sector -type $type" \
		-contextHelp "steer $type by 1 $units"
	}
	lappend Steering(S$sectorf.$type.steerButtons) $w1.$type.add.button
	
	if [regexp "x" $type] {
	    APSButton .minus -parent $w1.$type -packOption "-side right" -text " In "  -command "ChangeKnob -value -1  -sector $sector -type $type" \
		-contextHelp "steer $type by -1 $units"
	
	} else {
	    APSButton .minus -parent $w1.$type -packOption "-side right" -text "Down"  -command "ChangeKnob -value -1  -sector $sector -type $type" \
		-contextHelp "steer $type by -1 $units"
	}
	lappend Steering(S$sectorf.$type.steerButtons) $w1.$type.minus.button
	APSButton .${type}show -parent $w1.$type -packOption "-side right" -text "$Steering(S$sectorf.$type.knobName)" -highlight 1 -highlightColor blue -command "ShowKnob -sector $sector -type $type" -contextHelp "display the knob structure."
	if $index==2 {
	    APSLabel .l1 -parent $w -text " "
	    APSLabel .l2 -parent $w -text " "
	}
	incr index
    }
    APSButton .medm -parent $w -text "SR BPM AdjustedCC ADT (difference mode)" \
	-command "exec adt -f /home/helios/OAG/oagData/ADTFiles/srBpm/sr.bpm.lowPass1s.adjusted.pv -a /home/helios/OAG/oagData/ADTFiles/srBpm -z 3 -s $sector -d &"
}


proc LoadSteeringConfig {args} {
    set sector ""
    APSParseArguments {sector}
    global Steering tmpRoot errorCode
    set sectorf [format %02d $sector]
    set steerType $Steering(steerType)
    set Steering(S$sectorf.configFile) /home/helios/oagData/sr/knobs/${steerType}bump/lattices/default/${steerType}${sectorf}.cokn
    SetSteeringStatus "Loading S$sectorf config... "
    SetSteeringStatus "Loading S$sectorf config (file $Steering(S$sectorf.configFile) )... "
    set file $Steering(S$sectorf.configFile)
    set pages [exec sdds2stream -npages=bar $file]
    set parnames [exec sddsquery -par $file]
    set otherPVList ""
    set otherVarList ""
    for {set page 1} {$page<=$pages} {incr page} {
	set type [exec sdds2stream -page=$page -par=KnobType $file]
	if [catch {exec sddsconvert $file -pipe=out -from=$page -to=$page \
		       | tee $tmpRoot.S$sectorf.$type.config \
		       | sddsprintout -pipe=in $tmpRoot.S$sectorf.$type.print \
		       -par=ControlName,label=KnobName -par=KnobType,label=SteeringType \
		       -col=ControlName,format=%30s -col=Weight,format=%15.6f } result] {
	    return -code error "Error printing file: $result"
	}
	APSAddToTmpFileList -ID idstring -fileList "$tmpRoot.S$sectorf.$type.print $tmpRoot.S$sectorf.$type.config"
	if [lsearch -exact "Gain" $parnames]>=0 {
	    Steering(S$sectorf.$type.gain) [exec sdds2stream -par=Gain -page=$page $file]
	} else {
	    set Steering(S$sectorf.$type.Gain) 1.0
	}
	if [lsearch -exact  $parnames "StepSize"]>=0 {
	    set Steering(S$sectorf.$type.StepSize) [format %.1f [exec sdds2stream -par=StepSize -page=$page $file]]
	} else {
	    set Steering(S$sectorf.$type.StepSize) 5.0
	}
	#change the step size to zero by Greg requestion, users shall provide step size
	set Steering(S$sectorf.$type.StepSize) 0.0
	set Steering(S$sectorf.$type.config) $tmpRoot.S$sectorf.$type.config
	set Steering(S$sectorf.$type.setPV) [exec sdds2stream -par=SetValuePV -page=$page $file]
	set Steering(S$sectorf.$type.readbackPV) [exec sdds2stream -par=SetRbvPV -page=$page $file]
	set Steering(S$sectorf.$type.statusPV) [exec sdds2stream -par=SetStatusPV -page=$page $file]
	set Steering(S$sectorf.$type.modePV) [exec sdds2stream -par=SetModePV -page=$page $file]
	set Steering(S$sectorf.$type.knobName) [exec sdds2stream -par=ControlName -page=$page $file]
	set Steering(S$sectorf.$type.deltaPV) [exec sdds2stream -par=SetValueLimitPV -page=$page $file]
	lappend otherPVList $Steering(S$sectorf.$type.setPV)
	lappend otherVarList Steering(S$sectorf.$type.set)
	lappend otherPVList $Steering(S$sectorf.$type.readbackPV)
	lappend otherVarList Steering(S$sectorf.$type.readback)
	lappend otherPVList $Steering(S$sectorf.$type.statusPV)
	lappend otherVarList Steering(S$sectorf.$type.status)
	lappend otherPVList $Steering(S$sectorf.$type.modePV)
	lappend otherVarList Steering(S$sectorf.$type.mode)
	lappend otherPVList $Steering(S$sectorf.$type.deltaPV)
	lappend otherVarList Steering(S$sectorf.$type.delta)
#	set Steering(S$sectorf.$type.knobAccu) 0
	
	set Steering(S$sectorf.$type.print) $tmpRoot.S$sectorf.$type.print
	set Steering(S$sectorf.$type.pvList) [join [exec sdds2stream -col=ControlName -page=$page $file]]
	set Steering(S$sectorf.$type.weightList) [join [exec sdds2stream -col=Weight -page=$page $file]]
	set deviceList [join [exec sdds2stream -col=DeviceName -page=$page $file]]
	set Steering(S$sectorf.$type.deviceList) [lsort $deviceList]
	#x and xp use the same pvs, but different coefficients
	#y and yp use the same pvs, but different coefficients
	foreach device $deviceList weight $Steering(S$sectorf.$type.weightList) {
	    set Steering(S$sectorf.$type.$device.weight) $weight
	}
	
	if {$type=="xp" || $type=="yp"} {
	    set varList ""
	    set bpmList ""
	    set corrList ""
	    foreach pv $Steering(S$sectorf.$type.pvList) device $deviceList {
		lappend varList Steering(S$sectorf.$type.$device.var)
		if [regexp "CurrentC" $pv] {
		    lappend corrList $device
		} else {
		    lappend bpmList $device
		}
	    }
	    set Steering(S$sectorf.$type.bpmList) $bpmList
	    set Steering(S$sectorf.$type.corrList) $corrList
	    set Steering(S$sectorf.$type.varList) $varList
	    if [pv linkw $varList $Steering(S$sectorf.$type.pvList) 30] {
		return -code error "Error link pvs: $errorCode"
	    }
	    pv getw $varList
	}
    }
    if [string compare $steerType "BM"]!=0 {
	#foreach plane {x y} {
	 #   if {$Steering(S$sectorf.$plane.deviceList)!=$Steering(S$sectorf.${plane}p.deviceList)} {
	#	return -code error "Error the device list of $plane and ${plane}p are not the same: $result"
	 #   }
	#}
    }
    foreach plane $Steering(planeList) {
	foreach bpm $Steering(S$sectorf.${plane}p.bpmList) {
	    if [pv umon Steering(S$sectorf.${plane}p.$bpm.var)]!=0 {
		APSAlertBox .alert -errorMessage "umon error $errorCode"
		exit
	    }
	}
	foreach corr $Steering(S$sectorf.${plane}p.corrList) {
	    if [pv umon Steering(S$sectorf.${plane}p.$corr.var)]!=0 {
		APSAlertBox .alert -errorMessage "umon error $errorCode"
		exit
	    }
	}
    }
  #  puts $otherPVList
   # pv linkw $otherVarList $otherPVList 
    set errorCode ""
    if [pv linkw $otherVarList $otherPVList 30] {
	APSAlertBox .alert -errorMessage "pv linkw error: $errorCode; you need check if the steering server is started for sector $sectorf."
	SetSteeringStatus "Knob creating for S$sectorf failed, you need check if the steering server is started for sector $sectorf."
        puts stderr "pv linkw error: $errorCode; you need check if the steering server is started for sector $sectorf."
        puts stderr "doing some cavget"
        puts stderr "[exec cavget -list=[join $otherPVList ,] -label]"
    } else {
	SetSteeringStatus "set knob mode to delta mode..."
	foreach type $Steering(typeList) {
	    set Steering(S$sectorf.$type.mode) add
	    set Steering(S$sectorf.$type.mode) 0
	    pv putw Steering(S$sectorf.$type.mode)
	    if [pv umon Steering(S$sectorf.$type.readback)]!=0 {
		APSAlertBox .alert -errorMessage "umon error for Steering(S$sectorf.$type.readback)  $errorCode"
		exit
	    }
	    if [pv umon Steering(S$sectorf.$type.status)]!=0 {
		APSAlertBox .alert -errorMessage "umon error for Steering(S$sectorf.$type.status)  $errorCode"
		exit
	    }
	    set hLimit [exec cavget -list=$Steering(S$sectorf.$type.readbackPV).DRVH -pend=10]
	    set lLimit [exec cavget -list=$Steering(S$sectorf.$type.readbackPV).DRVL -pend=10]
	    set Steering(S$sectorf.$type.hlimit) $hLimit
	    set Steering(S$sectorf.$type.llimit) $lLimit
	    pv linkw Steering(S$sectorf.$type.hlimit) $Steering(S$sectorf.$type.readbackPV).DRVH
	    pv linkw Steering(S$sectorf.$type.llimit) $Steering(S$sectorf.$type.readbackPV).DRVL
	    if [pv umon Steering(S$sectorf.$type.hlimit)]!=0 {
		APSAlertBox .alert -errorMessage "umon error for Steering(S$sectorf.$type.hlimit)  $errorCode"
		exit
	    }
	    if [pv umon Steering(S$sectorf.$type.llimit)]!=0 {
		APSAlertBox .alert -errorMessage "umon error for Steering(S$sectorf.$type.llimit)  $errorCode"
		exit
	    }
	}
    }
    #reading steering limit
    
    SetSteeringStatus "S$sectorf config loaded"
    set Steering(S$sectorf.configLoaded) 1
}

proc ChangeLimitWidget {args} {
    set sector ""
    set type ""
    APSParseArguments {sector type}
    global Steering
    set width 15
    set border 2
   
    set steerType $Steering(steerType)
    set sectorf [format %02d $sector]
    set dialogFrame .dialog${steerType}$sectorf$type.userFrame
    if [winfo exist .dialog${steerType}$sectorf$type] {
	destroy .dialog${steerType}$sectorf$type
    }
    APSDialogBox .dialog${steerType}$sectorf$type  \
	-name "${steerType}$sectorf$type limit Dialog" \
	-contextHelp "Dialog box for steering limit of ${steerType}$sectorf$type."
    APSFrame .parameters -parent $dialogFrame 
    $dialogFrame.parameters.frame configure -relief flat
    set w $dialogFrame.parameters.frame
    set Steering(S$sectorf.$type.hlimitNew) $Steering(S$sectorf.$type.hlimit)
    set Steering(S$sectorf.$type.llimitNew) $Steering(S$sectorf.$type.llimit)
    APSLabeledEntry .hlimit -parent $w -label "${steerType}$sectorf$type high limit:" \
	-textVariable Steering(S$sectorf.$type.hlimitNew) -width $width
    APSLabeledEntry .llimit -parent $w -label "${steerType}$sectorf$type low limit:" \
	-textVariable Steering(S$sectorf.$type.llimitNew) -width $width
    APSLabeledOutput .status -parent $w -label "${steerType}$sectorf$type steering status:" \
	-textVariable Steering(S$sectorf.$type.status) -width $width
    APSButton .change -parent $w -text "Change Limit" -command "ChangeLimit -sector $sector -type $type"
    APSButton .reset -parent $w -text "Reset Status" -command "ResetStatus -sector $sector -type $type"
}

proc ChangeLimit {args} {
    set sector ""
    set type ""
    APSParseArguments {sector type}
    global Steering
    set steerType $Steering(steerType)
    set sectorf [format %02d $sector]
    SetSteeringStatus "Change $steerType$sectorf$type steering limit..."
    exec caput  $Steering(S$sectorf.$type.readbackPV).DRVH $Steering(S$sectorf.$type.hlimitNew)
    exec caput  $Steering(S$sectorf.$type.readbackPV).DRVL $Steering(S$sectorf.$type.llimitNew)
    SetSteeringStatus "done."
    
}
proc ResetStatus {args} {
    set sector ""
    set type ""
    APSParseArguments {sector type}
    global Steering
    set steerType $Steering(steerType)
    set sectorf [format %02d $sector]
    SetSteeringStatus "Reset $steerType$sectorf$type steering status..."
    exec caput $Steering(S$sectorf.$type.statusPV) 0
    SetSteeringStatus "done."
}

proc ShowKnob {args} {
    set sector ""
    set type ""
    APSParseArguments {sector type} 
    global Steering
    set sectorf [format %02d $sector]
    set file $Steering(S$sectorf.$type.print)
     APSFileDisplayWindow [APSUniqueName .] \
      -fileName $file -deleteOnClose 0 -height 15 \
      -comment "$Steering(S$sectorf.$type.knobName) structure"
}


proc EnableDisableSteerButton {args} {
    set sector ""
    set type ""
    set disable 0
    APSParseArguments {sector type disable}
    global Steering
    set sectorf [format %02d $sector]
    foreach button $Steering(S$sectorf.$type.steerButtons) {
	if $disable {
	    APSDisableButton $button
	} else {
	    APSEnableButton $button
	}
    }
}

proc ChangeKnob {args} {
    set sector ""
    set type ""
    set value ""
    APSParseArguments {sector type value}
    if {$value=="zero"} {
	if ![APSYesNoPopUp "Are you sure to zero the steering for $type[format %02d $sector]?"] {
	    SetSectorStatus "zero steering is cancelled." -sector $sector
	    return
	}
    }
    EnableDisableSteerButton -sector $sector -type $type -disable 1
    global Steering
    set sectorf [format %02d $sector]
    pv getw Steering(S$sectorf.$type.readback)
    set hLimit $Steering(S$sectorf.$type.hlimit)
    set lLimit $Steering(S$sectorf.$type.llimit)
   
    set value0 $Steering(S$sectorf.$type.readback)
    if {$Steering(S$sectorf.$type.StepSize)<0} {
	set Steering(S$sectorf.$type.StepSize) [expr -1.0*$Steering(S$sectorf.$type.StepSize)]
    }
    
    if {$value=="zero"} {
	# zero current steering
	set value [expr -1.0*$Steering(S$sectorf.$type.accuValue)]
    } else {
	set value [expr $Steering(S$sectorf.$type.Gain)*$Steering(S$sectorf.$type.StepSize)*$value]
    }
    
    if $value==0.0 {
	SetSectorStatus  "Steering value is 0, ignore!" -sector $sector
	EnableDisableSteerButton -sector $sector -type $type -disable 0
	return
    }
    set steeringUnit [string toupper [string index $type 0]][string range $type 1 end]
    if [catch {exec checkBPLDLimits -steeringType $Steering(steerType) -sector $sector -steeringUnit $steeringUnit \
		   -steeringValue $value } result] {
	SetSectorStatus "Error request steering: $result\nSteering is cancelled" -sector $sector
	EnableDisableSteerButton -sector $sector -type $type -disable 0
	return
    } else {
	SetSectorStatus "Prechecking: $result" -sector $sector
    }
    set newValue [expr $value0 + $value]
    if {$newValue<$lLimit || $newValue > $hLimit} {
	SetSectorStatus "Steering request for Sector $sector $type is out of range! Only partial steering will be performed" -sector $sector
	set waitfor 3
	set waitfor "all good"
    } else {
	set waitfor "all good"
    }
    set Steering(S$sectorf.$type.set) $value
    #log steering event
    pv putw Steering(S$sectorf.$type.set)
    after 3000
    update
    #wait for status
   # puts "wait for status : $waitfor"
   # exec cawait  -timeLimit=20 -waitFor=$Steering(S$sectorf.$type.statusPV),equalTo=$waitfor
    pv getw Steering(S$sectorf.$type.delta)
    update
    
    for {set i 0} {$i<300} {incr i} {
	pv getw Steering(S$sectorf.$type.status)
	SetSectorStatus "$Steering(S$sectorf.$type.status)" -sector $sector
	update
	if {$Steering(S$sectorf.$type.status)==$waitfor} {
	    break
	}
	if {$Steering(S$sectorf.$type.status)=="updating"} {
	    after 1000
	    update
	} else {
	    break
	}
    }
    pv getw Steering(S$sectorf.$type.readback)
    pv getw Steering(S$sectorf.$type.status)
    update
    
    set value1 [expr $Steering(S$sectorf.$type.readback)-$value0]
    set type1 [string toupper [string index $type 0]][string range $type 1 end]
    catch {exec cavput -delta -list=S{$sectorf}${Steering}-Steering:${type1}:RunAccumM=$value1 -pend=5} result
    set Steering(S$sectorf.$type.accuValue) [expr $Steering(S$sectorf.$type.accuValue) + $value1]
    global env
    set steerType $Steering(steerType)
   
    if [catch {exec logMessage -sourceId=steeringAudit -tag=applicationName APSUBeamlineSteering-$steerType \
		   -tag=user $env(USER) -tag=host $env(HOSTNAME) -tag=steerItem S${sectorf}${steerType}:$type \
		   -tag=steerValue \"[format %0.1f $value1]\" \
		   -tag=accumulatedSteer \"[format %0.1f $Steering(S$sectorf.$type.readback)]\" \
	       }  result] {
	puts stderr "Error log message: $result"
    }
    
    SetSectorStatus "steering S$sectorf $type status: $Steering(S$sectorf.$type.status)" -sector $sector
    if [regexp {p} $type] {
	set unit urad
    } else {
	set unit um
    }
    SetSectorStatus "steering S$sectorf $type requested steering $value $unit, actual steered $value1 $unit." -sector $sector
    if $Steering(saveUBOP) {
	SetSectorStatus "Making UBOP save..." -sector $sector
	if [catch {APSSRSaveSteeringToOps -description "S$sectorf $type steered $value1 $unit by $env(USER) on $env(HOSTNAME)." } result] {
	    	SetSectorStatus "Error making UBOP save: $result"
	}
	SetSectorStatus "done." -sector $sector
    }
    if {$waitfor==0 && $value!=$value1} {
	SetSectorStatus "S$sector $type steering failed: setpoint and readback do not agree" -sector $sector
	APSAlertBox .alert -errorMessage "S$sector $type steering failed: setpoint and readback do not agree"
    }
    EnableDisableSteerButton -sector $sector -type $type -disable 0
    return
   
}


set Steering(sectorList) ""
if !$allowAllSectors {
    switch $steerType {
	ID {
	    set sectorList  [join [exec sdds2stream -col=Sector /home/helios/oagData/sr/IDs/sectors.sdds]]
	    lappend sectorList 28
	    lappend sectorList 29   
	    set Steering(sectorList) [lsort -integer $sectorList]
	    set Steering(typeList) {xp yp x y}
	    set Steering(unitsList) {urad urad um um}
	    set Steering(planeList) {x y}
	}
	BM {
	    set Steering(sectorList) {1 2 5 6 7 8 9 10 11 12 13 14 16 17 19 20 23 33 35}
	    set Steering(sectorList)  [join [exec sdds2stream -col=Sector /home/helios/oagData/sr/BMs/sectors.sdds]]
	    set Steering(typeList) {yp}
	    set Steering(unitsList) {urad}
	    set Steering(planeList) y
	}
	CU {
	    set Steering(sectorList) {2 6 11 12 13 15 16 21 22 23 24 25 28 31 32 34}
	    set Steering(sectorList) [join [exec sdds2stream -col=Sector /home/helios/oagData/sr/IDs/CUSteering.sdds]]
	    set Steering(typeList) {xp yp x y}
	    set Steering(unitsList) {urad urad um um}
	    set Steering(planeList) {x y}
	}
	default {
	    return -code "Unknonw steer type provided - $steerType!"
	}
    }
}

set Steering(steerType) $steerType

for {set sector 1} {$sector<=40} {incr sector} {
    set sectorf [format %02d $sector]
    set Steering(S$sectorf.configLoaded) 0
    if $allowAllSectors {
	lappend Steering(sectorList) $sector
    }
}

if ![string length $Steering(givenSector)] {
    MakeSectorsWidget .sectors -parent .userFrame
} else {
    SteeringDialog -sector $Steering(givenSector) -parent .userFrame
}

return
