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

#
# $Log: not supported by cvs2svn $
# Revision 1.14  2005/09/30 02:01:39  emery
# Changed the number of graphs per line and graph size
# to fill out the 24 inch displays better. Note that
# on a smaller display graphs will no be visible.
#
# Revision 1.13  2004/10/06 02:13:39  emery
# Changed display height so that all BPLDs are displayed.
#
# Revision 1.12  2003/09/03 16:28:29  soliday
# Added package require BLT command.
#
# Revision 1.11  2003/03/18 18:32:42  emery
# Removed dependence on ID sector database, and use
# bpld database only.
#
# Revision 1.10  2002/11/20 21:34:01  emery
# Indented code and use data from sector.sdds file to determine
# bpm used in digital bplds.
#
# Revision 1.9  2002/09/17 19:37:09  soliday
# BLT was updated and some commands had to be changed.
#
# Revision 1.8  2001/11/14 16:26:18  borland
# Reduced the size of the individual graphs so they all fit on one page.
#
# Revision 1.7  2001/05/15 19:29:45  soliday
# Added support for digital BPLDs.
#
# Revision 1.6  2000/03/18 00:11:04  emery
# Indented code.
#
# Revision 1.5  1999/11/05 16:39:54  soliday
# There is a memory problem with blt vectors so I removed them.
#
# Revision 1.4  1999/05/25 16:04:03  soliday
# Changed graph option -mapped no to -hide yes because of change in BLT
#
# Revision 1.3  1999/03/19 15:49:39  soliday
# removed package require command
#
# Revision 1.2  1998/06/29 23:35:36  borland
# Now changes the background to red if the beam is outside the BPLD limits.
#
# Revision 1.1  1998/06/29 23:10:08  borland
# First version per R. Soliday.
#
#

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)]
APSDebugPath
#lappend auto_path $blt_library

set CVSRevisionAuthor "\$Revision: 1.15 $ \$Author: soliday $"
wm geometry . +10+10
APSApplication . -name "Storage Ring Beam Position Limit Detectors" -version $CVSRevisionAuthor\
  -overview "SRBPLD Displays the position of the beam in the Storage Ring\
	with axis limits given by the Beam Position Limit Detectors.  A white dot\
	indicates that the beam is in the safe zone.  A yellow dot indicates the\
	beam is between 0.3 mm and 0.1 mm from the trip point.  A red dot indicates the\
	beam is 0.1 mm or closer to the trip point.  A red background indicates the\
   beam is outside the trip limits."

package require BLT 

#
# Creates a new graph
#
proc displayGraph {args} {
    set minX -1
    set maxX 1
    set minY -1
    set maxY 1
    set Xpos 0
    set Ypos 0
    set Title "No Title"
    set Name [APSUniqueName a]
    set width 190
    set height 150
    APSStrictParseArguments {minX maxX minY maxY Title Name Xpos Ypos Frame}
    blt::graph .$Name -cursor crosshair -width $width -height $height -bg black \
      -title $Title -topmargin 5 -rightmargin 5 -bottommargin 25 \
      -leftmargin 25 -fg white -plotbackground #737373
    .$Name xaxis configure -color white -background black -max $maxX -min $minX
    .$Name yaxis configure -color white -background black -max $maxY -min $minY
    .$Name element create dot -xdata $Xpos -ydata $Ypos \
      -symbol circle -color white
    .$Name legend configure -hide yes
    pack .$Name -in $Frame -side left
    return
}

#
# Changes the plot of an existing graph
#
proc modifyGraph {Name Xpos Ypos minX maxX minY maxY} {
    #.$Name element configure dot -xdata $Xpos -ydata $Ypos
    set leftX [expr $Xpos - $minX]
    set rightX [expr $maxX - $Xpos]
    set bottomY [expr $Ypos - $minY]
    set topY [expr $maxY - $Ypos]
    set background black
    if {$leftX <= 0 || $rightX <= 0 || $bottomY <=0 || $topY <= 0} {
        set warning grey
        set background red
    } elseif {$leftX <= .1 || $rightX <= .1 || $bottomY <=.1 || $topY <= .1} {
        set warning red
    } elseif {$leftX <= .3 || $rightX <= .3 || $bottomY <=.3 || $topY <= .3} {
        set warning yellow
    } else {
        set warning white
    }
    .$Name element delete dot
    .$Name element create dot -xdata $Xpos -ydata $Ypos -symbol circle -color $warning
    #.$Name element configure dot$Name -color $warning -xdata $Xpos -ydata $Ypos
    .$Name configure -fg $warning -bg $background
}

#
# Check the command line arguments
#
set args $argv
set detector all
APSStrictParseArguments {detector}
if {[string compare $detector all] == 0} {
    set DetectorList [exec sdds2stream /home/helios/oagData/sr/BPLDs/sectors.sdds -col=Sector]
} else {
    set DetectorList $detector
}

if {[catch {exec sdds2stream /home/helios/oagData/sr/BPLDs/sectors.sdds -col=Sector,IsDigital,Channel1,Channel2} results]} {
    APSAlertBox [APSUniqueName .] -errorMessage "$results"
    exit    
}
foreach "sector isDigital channel1 channel2" $results {
    set digital($sector) $isDigital
    set chan1($sector) $channel1
    set chan2($sector) $channel2
}
#
# For each detector set up the variables
#
foreach Detector $DetectorList {
    if {$digital($Detector)} {
        set Number($Detector) S${Detector}B:$chan1($Detector):dbpld
        set Number2($Detector) S[expr ${Detector} + 1]A:$chan2($Detector):dbpld
        lappend pvList $Number($Detector):xliveAI.VAL $Number($Detector):yliveAI.VAL\
          $Number2($Detector):xliveAI.VAL $Number2($Detector):yliveAI.VAL\
          $Number($Detector):xhiAI.VAL $Number($Detector):xloAI.VAL\
          $Number($Detector):yhiAI.VAL $Number($Detector):yloAI.VAL\
          $Number2($Detector):xhiAI.VAL $Number2($Detector):xloAI.VAL\
          $Number2($Detector):yhiAI.VAL $Number2($Detector):yloAI.VAL 	
        lappend tclVarList X1$Detector Y1$Detector X2$Detector Y2$Detector\
          XUp$Detector XLow$Detector YUp$Detector YLow$Detector\
          X2Up$Detector X2Low$Detector Y2Up$Detector Y2Low$Detector
    } else {
        set Number($Detector) S${Detector}BPLD
        lappend pvList $Number($Detector):CH1xAveAI.VAL $Number($Detector):CH1yAveAI.VAL\
          $Number($Detector):CH2xAveAI.VAL $Number($Detector):CH2yAveAI.VAL\
          $Number($Detector):xUpTripLimitAI.VAL $Number($Detector):xLowTripLimitAI.VAL\
          $Number($Detector):yUpTripLimitAI.VAL $Number($Detector):yLowTripLimitAI.VAL 
        lappend tclVarList X1$Detector Y1$Detector X2$Detector Y2$Detector\
          XUp$Detector XLow$Detector YUp$Detector YLow$Detector
    }
}

#
# Link all the variables
#
if [pv linkw $tclVarList $pvList]!=0 {
    APSAlertBox [APSUniqueName .] -errorMessage "Problem with connection: $errorInfo"
    exit 
}

#
# For each detector call displayGraph to make a new graph
#
set limit 6
set GraphNumber $limit
set GraphFrame firstRow
foreach Detector $DetectorList {
    if {$GraphNumber == $limit} {
        set GraphFrame [APSUniqueName .]
        frame $GraphFrame -bg black
        pack $GraphFrame -in .userFrame -side top -expand true -fill x
        set GraphNumber 1
    }
    incr GraphNumber
    if {$digital($Detector)} {
        set minX [set XLow$Detector]
        set maxX [set XUp$Detector]
        set minY [set YLow$Detector]
        set maxY [set YUp$Detector]
        displayGraph -minX $minX -maxX $maxX -minY $minY\
          -maxY $maxY -Title "S${Detector}B:$chan1($Detector)" \
          -Xpos [set X1$Detector] -Ypos [set Y1$Detector]\
          -Name graph1$Detector -Frame $GraphFrame  
        set minX [set X2Low$Detector]
        set maxX [set X2Up$Detector]
        set minY [set Y2Low$Detector]
        set maxY [set Y2Up$Detector]
        displayGraph -minX $minX -maxX $maxX -minY $minY\
          -maxY $maxY -Title "S[expr ${Detector} + 1]A:$chan1($Detector)" \
          -Xpos [set X2$Detector] -Ypos [set Y2$Detector]\
          -Name graph2$Detector -Frame $GraphFrame  
    } else {
        set minX [set XLow$Detector]
        set maxX [set XUp$Detector]
        set minY [set YLow$Detector]
        set maxY [set YUp$Detector]
        displayGraph -minX $minX -maxX $maxX -minY $minY\
          -maxY $maxY -Title "S${Detector}BPLD:CH1" -Xpos [set X1$Detector] -Ypos [set Y1$Detector]\
          -Name graph1$Detector -Frame $GraphFrame  
        displayGraph -minX $minX -maxX $maxX -minY $minY\
          -maxY $maxY -Title "S${Detector}BPLD:CH2" -Xpos [set X2$Detector] -Ypos [set Y2$Detector]\
          -Name graph2$Detector -Frame $GraphFrame  
    }
}

#
# Update graph values every two seconds
#
while 1 {
    update
    eval global $tclVarList 
    if [pv getw $tclVarList]!=0 {
        APSAlertBox [APSUniqueName .] -errorMessage "Problem with connection: $errorInfo"
        exit
    }
    foreach Detector $DetectorList {
        if {$digital($Detector)} {
            set minX [set XLow$Detector]
            set maxX [set XUp$Detector]
            set minY [set YLow$Detector]
            set maxY [set YUp$Detector]
            modifyGraph graph1$Detector [set X1$Detector] [set Y1$Detector] $minX $maxX $minY $maxY
            set minX [set X2Low$Detector]
            set maxX [set X2Up$Detector]
            set minY [set Y2Low$Detector]
            set maxY [set Y2Up$Detector]
            modifyGraph graph2$Detector [set X2$Detector] [set Y2$Detector] $minX $maxX $minY $maxY
        } else {
            set minX [set XLow$Detector]
            set maxX [set XUp$Detector]
            set minY [set YLow$Detector]
            set maxY [set YUp$Detector]
            modifyGraph graph1$Detector [set X1$Detector] [set Y1$Detector] $minX $maxX $minY $maxY
            modifyGraph graph2$Detector [set X2$Detector] [set Y2$Detector] $minX $maxX $minY $maxY
        }
    }
    APSWaitWithUpdate -waitSeconds 2
}
