#!/bin/sh
# The next line restarts using tclsh since sh ignores the backslash \
exec oagwish "$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)]
APSDebugPath

#printsource
#showwidgetnameswithmouse

# $Log: not supported by cvs2svn $
# Revision 1.1.1.1  1996/03/25  18:53:09  evans
# Imported files.
#

# **************************** changebarr ******************************
proc changebarr {} {
    global barr barr1

    pv vset barr $barr1
    pv putw barr
    plot
}
# **************************** changeiarr ******************************
proc changeiarr {} {
    global iarr iarr1

    pv vset iarr $iarr1
    pv putw iarr
    plot
}
# **************************** errmsg **********************************
proc errmsg {string} {
    global errmsgnum

    if {![info exists errmsgnum]} {set errmsgnum 0}
    incr errmsgnum

    APSErrorDialog .errmsg -errorMessage $string -unique 1
#    tk_dialog .errmsg$errmsgnum Error $string error "" OK
#    puts [format "APS Demo: %s" $string]
}
# **************************** overviewtext ****************************
proc overviewtext {} {
    global name
    
    return "
$name

     This interface displays information about an IK record.

     The reset button writes the current IN and BRHO values to\
EPICS, gets the current values of the other fields, and updates the\
plots.

     A return in the entry fields writes the value of the field to\
EPICS and then does a reset.
"
}
# **************************** plot ************************************
proc plot {} {
    global barr1 iarr1 plotsize
    global in val brho imsl
    global linked
    
# Make plot frame
    if {![winfo exists .plotframe]} {
	frame .plotframe -relief raised -bd 2

	frame .barrframe
	frame .iarrframe
	pack .barrframe .iarrframe -in .plotframe -side left
    }
# Create the plots if not done
    if {![winfo exists .barrgraph]} {
	blt_graph .barrgraph -title "B vs. I" -width $plotsize -height $plotsize
	pack .barrgraph -in .barrframe
	.barrgraph legend configure -mapped 0
	.barrgraph xaxis configure -title I
	.barrgraph yaxis configure -title B
	.barrgraph element create barr -symbol circle -bg Red
	.barrgraph element create curr -symbol circle -bg Red -fg Red
    }
    if {![winfo exists .iarrgraph]} {
	blt_graph .iarrgraph -title "I vs. B" -width $plotsize -height $plotsize
	pack .iarrgraph -in .iarrframe
	.iarrgraph legend configure -mapped 0
	.iarrgraph xaxis configure -title B
	.iarrgraph yaxis configure -title I
	.iarrgraph element create iarr -symbol circle -bg Red
	.iarrgraph element create curr -symbol circle -bg Red -fg Red
    }
# Additional features
    SetZoom .barrgraph
    SetZoom .iarrgraph
    SetClosestPoint .barrgraph
    SetClosestPoint .iarrgraph
# Check if linked
    if {!$linked} {
	errmsg "Not linked"
	return
    }
# Update them internally
    set barr1 [lindex [pv vset barr] 0]
    set iarr1 [lindex [pv vset iarr] 0]
    .barrgraph element configure barr -xdata $iarr1 -ydata $barr1
    .iarrgraph element configure iarr -xdata $barr1 -ydata $iarr1
    if {[string compare $imsl "I"] == 0} {
	.barrgraph element configure curr -xdata $in -ydata [expr $val * $brho]
	.iarrgraph element configure curr -xdata [expr $val * $brho] -ydata $in
    } else {
	.barrgraph element configure curr -xdata $val -ydata [expr $in * $brho]
	.iarrgraph element configure curr -xdata [expr $in * $brho] -ydata $val
    }
}
# **************************** reset ***********************************
proc reset {} {
    global vals names nvals prec barr1 iarr1 prefix
    global errorCode linked

# Check if linked
    if {!$linked} {
	errmsg "Not linked"
	return
    }
# Do pvput on input variables to update EPICS to current values
    foreach xx {in brho} {
	global $xx
	pvput $xx [set $xx]
    }
# Do pvget on all variables to update current values to EPICS
	for {set ii 0} {$ii < $nvals} {incr ii} {
	set xx [lindex $vals $ii]
	global $xx
	pvget $xx
    }
# Set view
    set err [pv vdef barr "0 [expr round($npts)] $prec"]
    if {$err != 0} {
	errmsg "Error in vdef for BARR\n$errorCode"
    }
    set err [pv vdef iarr "0 [expr round($npts)] $prec"]
    if {$err != 0} {
	errmsg "Error in vdef for IARR\n$errorCode"
    }
# Plot
    plot
}
# **************************** setup ***********************************
proc setup {} {
    global vals names nvals prec barr1 iarr1 prefix
    global errorCode linked

# Make vals and names
    set vals  {val in brho imsl barr iarr path file npts nmax lin lbrh}
    set names {}
    set nvals [llength $vals]
    for {set ii 0} {$ii < $nvals} {incr ii} {
	set xx [lindex $vals $ii]
	global $xx
	set name "$prefix.[string toupper $xx]"
	set names [linsert $names end $name]
    }
# Link
    set link 0
    if {![pvlink $vals $names]} {
	errmsg "Cannot link\n$errorCode"
	return
    }
    set linked 1
# Set monitors (also does pvget)
#     for {set ii 0} {$ii < $nvals} {incr ii} {
# 	set xx [lindex $vals $ii]
# 	pvmon $xx
#     }
# Set view
    set err [pv vdef barr "0 [expr round($npts)] $prec"]
    if {$err != 0} {
	errmsg "Error in vdef for BARR\n$errorCode"
    }
    set err [pv vdef iarr "0 [expr round($npts)] $prec"]
    if {$err != 0} {
	errmsg "Error in vdef for IARR\n$errorCode"
    }
# Reset
    reset
# Set waveform quantities internally
#    set barr1 [lindex [pv vset barr] 0]
#    set iarr1 [lindex [pv vset iarr] 0]
# Make plots
#    plot
}

# **********************************************************************
# **************************** main ************************************
# **********************************************************************

set name "IK Display"
set version "\$Revision: 1.2 $ \$Author: evans $"
set overview [overviewtext]
set prec 10
set prefix "TestI:IK"
set plotsize 300
set linked 0

APSApplication . -name $name -version $version -overview $overview \
  -contextHelp "Sorry, there is no context help available for this widget."

# Set up EPICS (Must be done after .mainframe is created)
setup

# Prefix
frame .frame5 -relief raised -bd 2
pack .frame5 -in .userFrame -side top -padx 5 -pady 5

APSLabeledEntry .prefixentry -parent .frame5 -label "Record:" -textVariable prefix -width 34
bind .frame5.prefixentry.entry <Return> {setup}

# Make frame for other entries and outputs
frame .frame0 -relief raised -bd 2
pack .frame0 -in .userFrame -side top -padx 5 -pady 5

frame .frame1
pack .frame1 -in .frame0 -side left -padx 5 -pady 5

# Inputs
frame .frame1.1 -relief raised -bd 2
pack .frame1.1 -in .frame1 -side top -padx 5 -pady 5

frame .imslframe
pack .imslframe -in .frame1.1 -side top -fill x

label .imsllabel -text ".IMSL:"
pack .imsllabel -in .imslframe -side left
radiobutton .imslibutton -text "I" -value "I" -variable imsl -command {pvput imsl [set imsl]; reset}
radiobutton .imslkbutton -text "K" -value "K" -variable imsl -command {pvput imsl [set imsl]; reset}
pack .imslibutton .imslkbutton -in .imslframe -side left

APSLabeledEntry .inentry -parent .frame1.1 -label ".IN:" -textVariable in -width 25
bind .frame1.1.inentry.entry <Return> {pvput in [set in]; reset}
APSLabeledEntry .brhoentry -parent .frame1.1 -label ".BRHO:" -textVariable brho -width 25
bind .frame1.1.brhoentry.entry <Return> {pvput brho [set brho]; reset}

# Arrays
frame .frame1.2 -relief raised -bd 2
pack .frame1.2 -in .frame1 -side top -padx 5 -pady 5

APSLabeledEntry .nptsentry -parent .frame1.2 -label ".NPTS:" -textVariable npts -width 25
bind .frame1.2.nptsentry.entry <Return> {pvput npts [set npts]; reset}
APSLabeledEntry .barrentry1 -parent .frame1.2 -label ".BARR:" -textVariable barr1 -width 25
bind .frame1.2.barrentry1.entry <Return> {changebarr}
APSLabeledEntry .iarrentry1 -parent .frame1.2 -label ".IARR:" -textVariable iarr1 -width 25
bind .frame1.2.iarrentry1.entry <Return> {changeiarr}

frame .frame2
pack .frame2 -in .frame0 -side left -padx 5 -pady 5

# Fixed Values
frame .frame2.1 -relief raised -bd 2
pack .frame2.1 -in .frame2 -side top -padx 5 -pady 5

APSLabeledOutput .pathoutput -parent .frame2.1 -label ".PATH:" -textVariable path -width 25
APSLabeledOutput .fileoutput -parent .frame2.1 -label ".FILE:" -textVariable file -width 25
APSLabeledOutput .nmaxoutput -parent .frame2.1 -label ".NMAX:" -textVariable nmax -width 25
APSLabeledOutput .linoutput -parent .frame2.1 -label ".LIN:" -textVariable lin -width 25
APSLabeledOutput .lbrhoutput -parent .frame2.1 -label ".LBRH:" -textVariable lbrh -width 25
#APSLabeledOutput .barroutput -parent .frame2.1 -label ".BARR:" -textVariable barr -width 25
#APSLabeledOutput .iarroutput -parent .frame2.1 -label ".IARR:" -textVariable iarr -width 25

# Outputs
frame .frame2.2 -relief raised -bd 2
pack .frame2.2 -in .frame2 -side top -padx 5 -pady 5

APSLabeledOutput .valentry -parent .frame2.2 -label ".VAL:" -textVariable val -width 25

# Make plots
plot
pack .plotframe -in .userFrame -side top -padx 5 -pady 5

# Make bottom frame for buttons
frame .framelast
pack .framelast -in .userFrame -side top -padx 5 -pady 5

button .resetbutton -text Reset -command {reset}
pack .resetbutton -in .framelast

# **************************** Emacs Editing Sequences *****************
# Local Variables:
# mode: tcl
# End:
