pro rescale_y_event,event

; When          Who   What
; Dec 10, 1998  AEE   Added option for plotting either DACS (.recs) or 
;                     ECS (.QKL and .REL) packets.
;                     NOTE: 'TMPCKTS' environment variable should be set before
;                     running IDL. Example: 
;                     setenv TMPCKTS /net/lasco6/data/packets
; Dec 11, 1998  AEE   Changed menu format and fixed y-range for initial single 
;                     plots.
; Jan 26, 1999  AEE   Fixed for Y2K problem.
;
;
; @(#)wplot_fp.pro	1.2 11/24/98 :LASCO IDL LIBRARY
;
COMMON WPLOT_FP_COMMON, hk2, time2, gap_ind2, hk2_word

widget_control,event.id,get_uvalue=event_id
widget_control,event.top,get_uvalue=main_uvalue
widget_control,main_uvalue.parent_base,get_uvalue=parent_uvalue
case event_id of
	0: begin
		parent_uvalue.yaxis_scaling=1
		;ASSIGN NEW MIN AND MAX VALUES
		if (main_uvalue.n_full_cols gt 0) then begin
		for i=0,main_uvalue.n_full_cols-1 do begin
			for j=0,main_uvalue.n_rows-1 do begin
				plot_number=i*main_uvalue.n_rows+j
				widget_control,get_value=test,main_uvalue.minimum(i,j)
				parent_uvalue.yminima(plot_number)=test

				widget_control,get_value=test,main_uvalue.maximum(i,j)
				parent_uvalue.ymaxima(plot_number)=test

				endfor;j
			endfor;i
		endif else i=0
		if (main_uvalue.n_extra_plots gt 0) then begin
			for j=0,main_uvalue.n_extra_plots-1 do begin
				plot_number=i*main_uvalue.n_rows+j
				widget_control,main_uvalue.minimum(i,j),$
					get_value=parent_uvalue.yminima(plot_number)
				widget_control,main_uvalue.maximum(i,j),$
					get_value=parent_uvalue.ymaxima(plot_number)
				endfor;j
			endif
				widget_control,main_uvalue.parent_base,$
					set_uvalue=parent_uvalue


	        	WIDGET_CONTROL, /HOUR
	        	IF (DATATYPE(hk2) EQ 'INT') THEN $ 
                                WIDGET_CONTROL,parent_uvalue.diag,SET_VALUE='Must read in packet files first.' $
                	ELSE $
                   		DO_PLOT_NONOP, parent_uvalue
				parent_uvalue.plot_done=1


				
		end
	1: begin
		parent_uvalue.yaxis_scaling=0
	        	WIDGET_CONTROL, /HOUR
	        	IF (DATATYPE(hk2) EQ 'INT') THEN $
                   	  WIDGET_CONTROL,parent_uvalue.diag,SET_VALUE='Must read in packet files first.' $
                	ELSE $
                   		DO_PLOT_NONOP, parent_uvalue
				parent_uvalue.plot_done=1

		end
	2: begin
		;DO NOTHING, JUST EXIT
		end
	else: print,'bad case in rescale_y_event'
	endcase

widget_control,event.top,/destroy

end; PROCEDURE



pro rescale_y_axes,nplots,nonopv

if (nplots gt 9) then begin
	print,'Number of Plots Exceeded Maximum (9)'
	goto,quit_here
	endif

if (nplots le 0) then begin
	print,'No Plots Selected'
	goto,quit_here
	endif
	

rescale_base=widget_base(/column,xpad=50,ypad=50,title='Rescale Plot Y Axes')
main_text_base=widget_base(rescale_base,/row,space=50)
	if (nplots le 3) then n_rows=nplots $
	else $
	if (nplots eq 4) then n_rows=2 $
	else n_rows=3
	n_full_cols=nplots/n_rows
	n_extra_plots=nplots mod n_rows

	n_cols=n_full_cols
	if (n_extra_plots gt 0) then n_cols=n_cols+1

col=intarr(n_cols)&minimum=lonarr(n_cols,n_rows)&maximum=lonarr(n_cols,n_rows)

if (n_full_cols gt 0) then begin
for i=0,n_full_cols-1 do begin
	col(i)=widget_base(main_text_base,/column,space=50)
	for j=0,n_rows-1 do begin
		plot_number=i*n_rows+j
		junk=widget_base(col(i),/column,frame=5)
		title_string="Plot "+$
			strcompress(string(plot_number),/remove_all)+" Min"
		minimum(i,j)=cw_field(junk,/float,/column,$
			title=title_string,value=nonopv.yminima(plot_number))
		title_string="Plot "+$
			strcompress(string(plot_number),/remove_all)+" Max"
		maximum(i,j)=cw_field(junk,/float,/column,$
			title=title_string,value=nonopv.ymaxima(plot_number))
		;widget_control,minimum(i,j),sensitive=0
		;widget_control,maximum(i,j),sensitive=0

		endfor
	endfor
  endif $
  else i=0
	if (n_extra_plots gt 0) then begin
		col(i)=widget_base(main_text_base,/column,space=50)

		for j=0,n_extra_plots-1 do begin
			junk=widget_base(col(i),/column,frame=5)
			title_string="Plot "+$
				strcompress(string(i*n_rows+j),/remove_all)+" Min"
			minimum(i,j)=cw_field(junk,/integer,/column,$
				title=title_string,value=nonopv.yminima(i*n_rows+j))
			title_string="Plot "+$
				strcompress(string(i*n_rows+j),/remove_all)+" Max"
			maximum(i,j)=cw_field(junk,/integer,/column,$
				title=title_string,value=nonopv.ymaxima(i*n_rows+j))
			endfor
	endif


replot_new=widget_button(rescale_base,value='REPLOT WITH NEW Y VALUES',uvalue=0)
replot_default=widget_button(rescale_base,value='REPLOT WITH DEFAULT Y VALUES',uvalue=1)
cancel=widget_button(rescale_base,value='CANCEL',uvalue=2)

widget_control,rescale_base,/realize

main_uvalue={$
	rescale_base:rescale_base,	$
	minimum:minimum,		$
	maximum:maximum,		$
	n_cols:n_cols,			$
	n_rows:n_rows,			$
	nplots:nplots,			$
	n_extra_plots:n_extra_plots,	$
	n_full_cols:n_full_cols,	$
        diag: nonopv.diag,              $
	parent_base:nonopv.base		$
	}
widget_control,rescale_base,set_uvalue=main_uvalue
widget_control,rescale_base,group_leader=nonopv.base
XMANAGER, 'rescale_y_axes', rescale_base, EVENT_HANDLER='rescale_y_event'

quit_here:
end









function determine_range,v
	range=intarr(n_elements(v))
	index=where((v ge 2.781) AND (v le 2.981),num)
	if (num gt 0) then range(index)=0

	index=where((v ge 2.2971) AND (v le 2.497),num)
	if (num gt 0) then range(index)=1

	index=where((v ge 1.816) AND (v le 2.016),num)
	if (num gt 0) then range(index)=2

	index=where((v ge 1.334) AND (v le 1.534),num)
	if (num gt 0) then range(index)=3

	index=where((v ge 0.855) AND (v le 1.055),num)
	if (num gt 0) then range(index)=4

	index=where((v ge 0.379) AND (v le 0.579),num)
	if (num gt 0) then range(index)=5

	index=where((v ge -0.090) AND (v le 0.110),num)
	if (num gt 0) then range(index)=6

	index=where((v ge -0.482) AND (v le -0.282),num)
	if (num gt 0) then range(index)=7
	return,range
end;FUNCTION

	



function get_relays,v,offset
		zstate=intarr(n_elements(v))
		ystate=intarr(n_elements(v))
		xstate=intarr(n_elements(v))
		gain=intarr(n_elements(v))

		index=where((v ge 4.7) AND (v le 5.1),num)
		if (num gt 0) then begin
			zstate(index)=1
			ystate(index)=1
			xstate(index)=1
			gain(index)=1
			endif
					
		index=where((v ge 3.4) AND (v le 3.9),num)
		if (num gt 0) then begin
			zstate(index)=1
			ystate(index)=1
			xstate(index)=1
			gain(index)=0
			endif
			
		index=where((v ge 2.4) AND (v le 3.0),num)
		if (num gt 0) then begin			
			zstate(index)=1
			ystate(index)=1
			xstate(index)=0
			gain(index)=1
			endif

		index=where((v ge 1.6) AND (v le 2.1),num)
		if (num gt 0) then begin			
			zstate(index)=1
			ystate(index)=1
			xstate(index)=0
			gain(index)=0
			endif

		index=where((v ge 0.9) AND (v le 1.5),num)
		if (num gt 0) then begin			
			zstate(index)=1
			ystate(index)=0
			xstate(index)=1
			gain(index)=1
			endif

		index=where((v ge 0.25) AND (v le 0.8),num)
		if (num gt 0) then begin
			zstate(index)=1
			ystate(index)=0
			xstate(index)=1
			gain(index)=0
			endif

		index=where((v ge -0.31) AND (v le 0.20),num)
		if (num gt 0) then begin			
			zstate(index)=1
			ystate(index)=0
			xstate(index)=0
			gain(index)=1
			endif

		index=where((v ge -0.740) AND (v le -0.32),num)
		if (num gt 0) then begin			
			zstate(index)=1
			ystate(index)=0
			xstate(index)=0
			gain(index)=0
			endif

		index=where((v ge -1.129) AND (v le -0.741),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=1
			xstate(index)=1
			gain(index)=1
			endif

		index=where((v ge -1.557) AND (v le -1.130),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=1
			xstate(index)=1
			gain(index)=0
			endif

		index=where((v ge -1.946) AND (v le -1.558),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=1
			xstate(index)=0
			gain(index)=1
			endif

		index=where((v ge -2.260) AND (v le -1.947),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=1
			xstate(index)=0
			gain(index)=0
			endif

		index=where((v ge -2.260) AND (v le -1.947),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=1
			xstate(index)=0
			gain(index)=0
			endif

		index=where((v ge -2.555) AND (v le -2.261),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=0
			xstate(index)=1
			gain(index)=1
			endif

		index=where((v ge -2.860) AND (v le -2.556),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=0
			xstate(index)=1
			gain(index)=0
			endif

		index=where((v ge -3.135) AND (v le -2.861),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=0
			xstate(index)=0
			gain(index)=1
			endif

		index=where((v ge -3.500) AND (v le -3.136),num)
		if (num gt 0) then begin						
			zstate(index)=0
			ystate(index)=0
			xstate(index)=0
			gain(index)=0
			endif

			case offset of 
				0: begin
					v=zstate
					end
				1: begin
					v=ystate
					end
				2: begin
					v=xstate
					end
				3: begin
					v=gain
					end
				else: print,'bad relay offset
				endcase
	v=v*0.5+0.25
	return,v

end



function calibrate,hk2,offset,pkt_sel
;  IF (pkt_sel eq 'DACS') THEN $
;    offvolt=15+48-1-1 $
;  ELSE $
;    offvolt=15+48-1-1-9

   offvolt=15+48-1-1-9

			v=hk2(offset,*)
			;print,'before calibration: v(0)=',v(0)
case offset of
	70+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='OCC 1 Voltage'
			end
	71+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='OCC 2 Voltage'
			end
	72+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='OCC 3 Voltage'
			end
	73+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			y=117.845-404.951*v+913.864*v*v
			y=y-1319.820*v*v*v+993.059*v*v*v*v-309.394*v*v*v*v*v
			v=y
			title='PARB Temp (C)'
			end
	87+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			y=117.845-404.951*v+913.864*v*v
			y=y-1319.820*v*v*v+993.059*v*v*v*v-309.394*v*v*v*v*v
			v=y
			title='ZAPB Temp (C)'

			end
	88+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			y=(v-0.5775)/0.0021
			v=y
			title='AUX Temp (C)'
			end
	74+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*2.0
			title='Z Micrometer Voltage'
			end
	75+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*2.0
			title='Y Micrometer Voltage'
			end
	76+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*2.0
			title='X Micrometer Voltage'
			end
	78+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*24.1388
			title='PZT 1 Voltage'
			end
	79+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*24.1641
			title='PZT 2 Voltage'
			end
	80+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*24.1513
			title='PZT 3 Voltage'
			end
	81+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='CLR DAC Voltage'
			end
	82+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='Z Offset DAC Voltage'
			end
	84+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='Y Offset DAC Voltage'
			end
	85+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='X Offset DAC Voltage'
			end
	83+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='Range DAC Voltage'
			end
	90+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='-5V Reference Voltage'
			end
	89+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='ADC Ground Voltage'
			end
	91+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*2.0
			title='X Integrator Voltage'
			end
	92+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*2.0
			title='Y Integrator Voltage'
			end
	93+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959*2.0
			title='Z Integrator Voltage'
			end


	0 : begin
			v=hk2(86+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=get_relays(v,0)
		title='Z Mode Relay, 0.75=ON, 0.25=OFF'
		end
	1 : begin
			v=hk2(86+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=get_relays(v,1)
		title='Y Mode Relay, 0.75=ON, 0.25=OFF'
		end
	2 : begin
			v=hk2(86+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=get_relays(v,3)
		title='X Mode Relay, 0.75=ON, 0.25=OFF'
		end
	3 : begin
			v=hk2(86+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=get_relays(v,3)
		title='OCC Gain Relay, 0.75=ON, 0.25=OFF'
		end
	4 : begin
			v=hk2(81+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=round(2047.981+(v/0.0024436))
		title='CLR DAC (MUX)'
		end
	5 : begin
			v=hk2(82+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=round(255.362+(v/0.0195537))
		title='Z Offset DAC (MUX)'
		end
	6 : begin
			v=hk2(84+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=round(2046.794+(v/0.0024444))
		title='Y Offset DAC (MUX)'
		end
	7 : begin
			v=hk2(85+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=round(2047.392+(v/0.0024438))
		title='X Offset DAC (MUX)'
		end
	8 : begin
			v=hk2(83+offvolt,*)
		v=((float(v)-2048.)/(2003.))*4.9959
		v=determine_range(v)
		title='Range DAC (MUX)'
		end
	9 : begin
		v=hk2(85+offvolt,*)
		x_mux=((float(v)-2048.)/(2003.))*4.9959
		v=hk2(76+offvolt,*)
		x_mic=((float(v)-2048.)/(2003.))*4.9959
		v=x_mux-(x_mic*2)
		title="X Control Loop Error (calc)"
		end
	10 : begin
		v=hk2(84+offvolt,*)
		x_mux=((float(v)-2048.)/(2003.))*4.9959
		v=hk2(75+offvolt,*)
		x_mic=((float(v)-2048.)/(2003.))*4.9959
		v=x_mux-(x_mic*2)
		title="Y Control Loop Error (calc)"
		end
	11 : begin
		v=hk2(81+offvolt,*)
		x_mux=((float(v)-2048.)/(2003.))*4.9959
		v=hk2(74+offvolt,*)
		x_mic=((float(v)-2048.)/(2003.))*4.9959
		v=x_mux-(x_mic*2)
		title="Z Control Loop Error (calc)"
		end
	77+offvolt: begin
			v=((float(v)-2048.)/(2003.))*4.9959
			title='Z Control Loop Error (meas)'
			end

	63: begin
			title='CLR DAC (digital)'
			end
	64: begin
			title='Z Offset DAC (digital)'
			end
	65: begin
			title='Y Offset DAC (digital)'
			end
	66: begin
			title='X Offset DAC (digital)'
			end
	67: begin
			title='Range DAC (digital)'
			end
	80: begin
			title='Laser Line Ref DAC'
			end
	81: begin
			title='Laser Line Inter-Order Spacing'
			end
	70: begin
			title='Previous Command Received'
			v=ishft(v,-8) AND 31
			end
	71: begin
			title='Check and Correct P/F (0.75=Pass)'
			v=ishft(v,-8) AND 1
			v=v*0.5+0.25
			end
	77: begin
			title='Number of FP LO Scans/Error Code'
			v=v AND 'ff'xl
			end




	44+offvolt : begin
			title='Command Wavelength (Angstrom)'
			int_part=v
			frac_part=hk2(45+offvolt,*)
			v=float(int_part)+float(frac_part)/10000.0
			end
	85 : begin
			title='Angstroms Physical per DAC'
			v=float(v)/1000.0
			end


	
	else: print,'error in calibration routine case!'
	endcase

output={data:v,title:title}
return,output


end; FUNCTION




FUNCTION GET_PCKT_NAMES, startt, stopt

   IF (stopt EQ '') THEN BEGIN
      GET_UTC, utc
      utc = ANYTIM2CAL(utc, FORM=8)
      stopt = STRMID(utc,2,2)+STRMID(utc,4,2)+STRMID(utc,6,2)+'_'+STRMID(utc,8,2)
   ENDIF
   y0 = FIX(STRMID(startt, 0, 2)) & y1 = FIX(STRMID(stopt, 0, 2))
   m0 = FIX(STRMID(startt, 2, 2)) & m1 = FIX(STRMID(stopt, 2, 2))
   d0 = FIX(STRMID(startt, 4, 2)) & d1 = FIX(STRMID(stopt, 4, 2))
   h0 = FIX(STRMID(startt, 7, 2)) & h1 = FIX(STRMID(stopt, 7, 2))
   m0 = m0 > 1 & m1 = m1 > 1
   d0 = d0 > 1 & d1 = d1 > 1

   arr = '000000_00'

   YEAR0 = ((y0 + 50) MOD 100) + 1950
   YEAR1 = ((y1 + 50) MOD 100) + 1950

   MONTHS = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
;   DAY = (JULDAY(1, 1, y0+1900) + 1) MOD 7
;   DAY1_NEXT_YEAR = (JULDAY(1, 1, y0+1900+1) + 1) MOD 7

   DAY = (JULDAY(1, 1, YEAR0) + 1) MOD 7
   DAY1_NEXT_YEAR = (JULDAY(1, 1, YEAR0+1) + 1) MOD 7

   case ((DAY1_NEXT_YEAR + 7 - DAY) mod 7) of
        2 :
        1 : MONTHS(1) = 28      ; Not a leap year
        else: MONTHS(8) = 19    ; 1752
        endcase

;   FOR y=y0, y1 DO BEGIN
    FOR y= YEAR0, YEAR1 DO BEGIN
     nm0 = 1
     nm1 = 12
;     IF (y EQ y0) THEN nm0 = m0
     IF (y EQ YEAR0) THEN nm0 = m0
;     IF (y EQ d1) THEN nm1 = m1
     IF (y EQ YEAR1) THEN nm1 = m1
;     FOR m=m0, m1 DO BEGIN
     FOR m=nm0, nm1 DO BEGIN
       nd0 = 1
       nd1 = months(m-1)
       IF (m EQ m0) THEN nd0 = d0
       IF (m EQ m1) THEN nd1 = d1
       FOR d=nd0, nd1 DO BEGIN
         nh0 = 0
         nh1 = 23
         IF (d EQ d0) THEN nh0 = h0
         IF (d EQ d1) THEN nh1 = h1
         FOR h=nh0, nh1 DO BEGIN
;            add = STRMID(STRING(100+y,FORM='(i3)'),1,2) + $
            add = STRMID(STRING(y,FORM='(i4.4)'),2,2) + $
                  STRMID(STRING(100+m,FORM='(i3)'),1,2) + $
                  STRMID(STRING(100+d,FORM='(i3)'),1,2) + '_' + $
                  STRMID(STRING(100+h,FORM='(i3)'),1,2)
            arr = [arr, add]
         ENDFOR
       ENDFOR
     ENDFOR
   ENDFOR

   len = N_ELEMENTS(arr)
   IF (len LE 1) THEN RETURN, arr
   RETURN, arr(1:N_ELEMENTS(arr)-1)
END

PRO DO_PLOT_NONOP, nonopv

COMMON WPLOT_FP_COMMON, hk2, time2, gap_ind2, hk2_word
COMMON DEBUG, v

; IF (nonopv.pkt_sel eq 'DACS') THEN $ 
;  dacs_offset = 12+6 $ 	;** 12 bytes put on by dacs, 6 for RT Hdr
;ELSE $
;  dacs_offset = 0

   dacs_offset = 0

   ind = WHERE(nonopv.selected GE 1, num)
;  print,nonopv.fields(ind)
   IF (nonopv.single) THEN nnum = 1 ELSE nnum = num
   CASE (1) OF
      (nnum LE 3) : p = [0,1,nnum,0,1]
      (nnum EQ 4) : p = [0,2,2,0,1]
      ( (nnum GT 4) AND (nnum LE 6) ): p = [0,2,3,0,1]
      (nnum GT 6) : p = [0,3,3,0,1]
   ENDCASE
   !P.MULTI = p
   !P.FONT = 5


   IF (num EQ 1) THEN ttitle = nonopv.fields(ind(0)) ELSE ttitle="FP Operational Parameters"

   IF (nonopv.single and nonopv.yaxis_scaling eq 0) THEN BEGIN
     minmax=0.0
     FOR i=0, num-1 DO BEGIN
      j = ind(i)
      hk = hk2
      ;** offs is in bytes
      offset = nonopv.offs(j)

      cal_data = calibrate(hk2_word,offset,nonopv.pkt_sel)

       v=cal_data.data
       minmax= [minmax,min(v),max(v)]
     END
     minmax=minmax(1:n_elements(minmax)-1)
   ENDIF

   FOR i=0, num-1 DO BEGIN
      j = ind(i)
      hk = hk2
      ;** offs is in bytes 
      offset = nonopv.offs(j)

	;print,'offset=',offset
	;print,hk2_word(*,0)
      cal_data = calibrate(hk2_word,offset,nonopv.pkt_sel)

	v=cal_data.data
	ttitle=cal_data.title
	;print,ttitle
        time = time2
        gap_ind = gap_ind2
    
if (nonopv.yaxis_scaling eq 0) then begin
	if (n_elements(where(v eq v(0))) eq n_elements(v)) then $
		y_plot_range=[v(0)-1,v(0)+1] $
	else y_plot_range=[min(v),max(v)]
endif $
else y_plot_range=[nonopv.yminima(i),nonopv.ymaxima(i)]

		if (nonopv.xaxis_scaling eq 1) then begin
			widget_control,nonopv.tmin_field,get_value=tmin
			widget_control,nonopv.tmax_field,get_value=tmax
			print,tmin,tmax
			tmin=tmin*3600.0
			tmin=tmin*1000.
			tmax=tmax*3600.
			tmax=tmax*1000.
			low_index=where(abs(time.time-tmin) eq $
				min(abs(time.time-tmin)))
			high_index=where(abs(time.time-tmax) eq $
				min(abs(time.time-tmax)))

			print,'low_index=',low_index
			print,'high_index=',high_index

			endif $
		else begin
			low_index=0
			high_index=n_elements(time)-1
			endelse	


      IF (nonopv.single) THEN BEGIN
         IF (nonopv.yaxis_scaling eq 0) THEN $ 
            y_plot_range= [min(minmax),max(minmax)]
         IF (i EQ 0) THEN $
            UTPLOT, time, v, TITLE=ttitle, /NODATA, XSTYLE=1, /ynozero, $
               yrange=y_plot_range, $
		TIMERANGE=[time(low_index),time(high_index)]
         FOR k=0, N_ELEMENTS(gap_ind)-2 DO BEGIN
            ind0 = gap_ind(k)+1 & ind1 = gap_ind(k+1)
            IF (ind1 GT ind0) THEN $
               OUTPLOT, time(ind0:ind1), v(ind0:ind1), COLOR=((j MOD 9)+1)
         ENDFOR
         XYOUTS, .7, 0.95-((i+1)*.02), COLOR=((j MOD 9)+1), /NORMAL, '____'
         XYOUTS, .75, 0.95-((i+1)*.02), COLOR=((j MOD 9)+1), /NORMAL, nonopv.fields(j) 
      ENDIF ELSE BEGIN
;         if sub_zero then !y.range = sz_range
;         UTPLOT, time, v, TITLE=nonopv.fields(j), /NODATA, XSTYLE=1, /ynozero, $
         UTPLOT, time, v, TITLE=ttitle, /NODATA, XSTYLE=1, /ynozero, $
		yrange=y_plot_range, $
            TIMERANGE=[time(low_index),time(high_index)]
         FOR k=0, N_ELEMENTS(gap_ind)-2 DO BEGIN
            ind0 = gap_ind(k)+1 & ind1 = gap_ind(k+1)
            IF (ind1 GT ind0) THEN $
               OUTPLOT, time(ind0:ind1), v(ind0:ind1)
         ENDFOR
         ;!y.range = [-10, 40]
      ENDELSE

	nonopv.yminima(i)=y_plot_range(0)
	nonopv.ymaxima(i)=y_plot_range(1)
	widget_control,nonopv.base,set_uvalue=nonopv

   ENDFOR
END

PRO READ_PKT_FILE, fname,first,hk2,hk2_len,pkt_type


;   NOTE: 'TMPCKTS' environment variable should be set before running IDL. Like
;         setenv TMPCKTS /net/lasco6/data/packets

    IF(pkt_type eq 'DACS') THEN $ ;  .recs files
      h2 = READALLHK(fname) $
    ELSE $ ; .QKL and .REL files
      h2 = READALLHK(fname,/ECS)
    
    hk2_size = SIZE(h2)
    IF(hk2_size(0) eq 0) THEN RETURN  ; File not found.
    IF (first) THEN BEGIN
      hk2_len = hk2_size(1)
      hk2 = REFORM(h2, hk2_size(1)*hk2_size(2))
      first = 0
    ENDIF ELSE $
      hk2 = [hk2, REFORM(h2, hk2_size(1)*hk2_size(2))]
    PRINT,'Processing file '+fname+':',hk2_size(2),'  records'

  RETURN
END


PRO WPLOT_FP_EVENT, event

COMMON WPLOT_FP_COMMON, hk2, time2, gap_ind2, hk2_word
WIDGET_CONTROL, event.id, GET_UVALUE=uval
WIDGET_CONTROL, event.top, GET_UVALUE=nonopv   ; get structure from UVALUE


    CASE (uval) OF

	'QUIT' : BEGIN	;** exit program
		WIDGET_CONTROL, /DESTROY, nonopv.base
                hk2= 0 & hk2_word=0
		GOTO, done
	    END
        'PTYPE': BEGIN
                  IF(nonopv.pkt_types(event.index) ne nonopv.pkt_sel) THEN BEGIN
                    hk2= 0 & hk2_word=0 
                    erase
                    nonopv.pkt_sel= nonopv.pkt_types(event.index)
                  END
            END
	'READ' : BEGIN
                WIDGET_CONTROL, /HOUR
                WIDGET_CONTROL, nonopv.startt, GET_VALUE=startt & startt = startt(0)
                WIDGET_CONTROL, nonopv.stopt, GET_VALUE=stopt & stopt = stopt(0)
                startt = STRTRIM(startt, 2)
                stopt  = STRTRIM(stopt , 2)
                pckt_names = GET_PCKT_NAMES(startt, stopt)

                first = 1
                hk2_len= 0
                pf=''
                WIDGET_CONTROL,nonopv.diag,SET_VALUE='Reading packets files....'
                FOR i=0, N_ELEMENTS(pckt_names)-1 DO BEGIN
                  fn=pckt_names(i)
                  IF(nonopv.pkt_sel eq 'DACS') THEN BEGIN
                    READ_PKT_FILE, fn,first,hk2,hk2_len,nonopv.pkt_sel
                  ENDIF ELSE BEGIN  ; .QKL files
                    fn=strmid(fn,0,strpos(fn,'_'))
                    IF (fn ne pf) THEN BEGIN 
                      pf=fn
                      READ_PKT_FILE, fn,first,hk2,hk2_len,nonopv.pkt_sel
                    ENDIF 
                  ENDELSE
                ENDFOR

	        IF (hk2_len GT 0) THEN BEGIN
			
                  hk2 = REFORM(hk2, hk2_len, N_ELEMENTS(hk2)/hk2_len)
                  hk2 = getfphkn(hk2,2,/ecs)

;		  IF (nonopv.pkt_sel eq 'DACS') THEN BEGIN
;                    hk2=getfphkn(hk2,2)
;                    dacs_offset = 12+6 ;* 12 bytes put on by dacs, 6 for RT Hdr
;                  ENDIF ELSE BEGIN
;                    dacs_offset = 0 ; for .QKL files
;                  ENDELSE

                   dacs_offset = 0 

                  offset = dacs_offset+6 	;** TAI timestamp put on by S/C is first word of packet
						;** after 6 byte pckt hdr
                   ;offset = 0
                   time2 = TAI2UTC(OBT2TAI(hk2(offset:offset+5, *)))

                   ;** throw out invalid data and sort data by S/C time
                   utc1990 = STR2UTC('1990/1/1')
                   utc2050 = STR2UTC('2050/1/1')
                   good = WHERE( (time2.mjd GT utc1990.mjd) AND (time2.mjd LT utc2050.mjd) )
                   ind = SORT(time2(good).mjd)
                   hk2 = hk2(*,good(ind))
                   time2 = time2(good(ind))

                   ;** don't plot in data gaps 
                   tai = UTC2TAI(time2)
                   time_shift = SHIFT(tai, -1)
                   time_diff  = tai - time_shift
                   gap_ind = WHERE(time_diff LT -60)	;** define gaps as 60 sec apart
                   IF (gap_ind(0) GE 0) THEN $
                      gap_ind2 = [0, gap_ind, N_ELEMENTS(time2)-1] $
                   ELSE $
                      gap_ind2 = [0, N_ELEMENTS(time2)-1]
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE=''
                ENDIF ELSE BEGIN ; no data 
                   path= GETENV('TMPCKTS')
                   IF(path eq '') THEN path= './'
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='No packets files. Check path and/or time range. Current path is "' + path +'".  Is TMPCKTS set correctly?'
                ENDELSE
		;help,hk2
		n_hk2=size(hk2)
		hk2_word=lonarr(n_hk2(1)/2,n_hk2(2))
		;help,hk2_word
;		for k=0,n_hk2(2)-1 do begin
;			i=0
;			j=0
;			while (i lt n_hk2(1)/2) do begin
;;				hk2_word(i,k)=ishft(fix(hk2(j,k)),8) OR fix(hk2(j+1,k))
;				;print,i,hk2(j),hk2(j+1),hk2_word(i)
;				i=i+1
;				j=j+2
;				endwhile
;			endfor

		index=indgen(n_hk2(1)/2)
		even=index*2
		odd=index*2+1
			
		for i=0,n_hk2(2)-1 do begin
			hk2_word(*,i)=ishft(fix(hk2(even,i)),8) OR fix(hk2(odd,i))
			endfor

		close,1
;		openw,1,'hk2_word_test.txt'
;		for i=0,n_hk2(1)/2-1 do begin
;			printf,1,i,hk2_word(i)
;			end
;		close,1

		nonopv.plot_done=0 ;keep track of procedure status
	    END

	'PLOT' : BEGIN
                WIDGET_CONTROL,nonopv.diag,SET_VALUE=''
		nonopv.xaxis_scaling=0
		nonopv.yaxis_scaling=0

	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
			nonopv.plot_done=1
		widget_control,nonopv.tmin_field,$
			set_value=float(!x.crange(0))/3600.
		widget_control,nonopv.tmax_field,$
			set_value=float(!x.crange(1))/3600.


	    END

	'PRINT' : BEGIN
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(HK2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE BEGIN
                   SET_PLOT, 'PS'
                   DEVICE, /INCHES, XSIZE = 9.5, YSIZE = 7.5, $
                       /LANDSCAPE,  BITS_PER_PIXEL=8, FILENAME = '/tmp/test.ps'
                   DO_PLOT_NONOP, nonopv
                   DEVICE, /CLOSE
                   SPAWN, 'lp /tmp/test.ps'
                   SET_PLOT, 'X'
                   SPAWN, '/bin/rm /tmp/test.ps'
                ENDELSE
	    END

	'SAVE' : BEGIN
	        WIDGET_CONTROL, /HOUR
                IF (DATATYPE(HK2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE BEGIN
                   img = TVRD()
                   TVLCT, r, g, b, /GET
                   file = CDSPICKFILE(PATH='/net/lasco6/data/ftp/pub/lasco/hk/', GET_PATH=dir, $
                   FILE='nonop_temps.gif', /WRITE)
                   IF (file NE '') THEN WRITE_GIF, dir+file, img, r, g, b
                ENDELSE
	    END


	'SINGLE' : BEGIN
                IF (event.select) THEN BEGIN
                   nonopv.single = 1
                ENDIF ELSE BEGIN
                   nonopv.single = 0
                ENDELSE
	    END

	'SELECT' : BEGIN
                ind = WHERE(nonopv.button_id EQ event.id)
                IF (event.select) THEN BEGIN
                   PRINT, 'Selected ', nonopv.fields(ind)
                   nonopv.selected(ind) = 1
                ENDIF ELSE BEGIN
                   PRINT, 'De-selected ', nonopv.fields(ind)
                   nonopv.selected(ind) = 0
                ENDELSE
	    END

	'TEMPS': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,2 do begin
			widget_control,$
				nonopv.button_id(nonopv.temp_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.temp_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'PZTS': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,2 do begin
			widget_control,$
				nonopv.button_id(nonopv.pzt_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.pzt_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'OCCS': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,2 do begin
			widget_control,$
				nonopv.button_id(nonopv.occ_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.occ_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'ERRORS': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,3 do begin
			widget_control,$
				nonopv.button_id(nonopv.error_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.error_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'CMD_DACS': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,4 do begin
			widget_control,$
				nonopv.button_id(nonopv.dac_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.dac_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'CANDC': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,4 do begin
			widget_control,$
				nonopv.button_id(nonopv.candc_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.candc_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'CMDS': begin
		 for i=0,n_elements(nonopv.button_id)-1 do begin
			widget_control,nonopv.button_id(i),set_button=0
			nonopv.selected(i)=0
			endfor
		for i=0,1 do begin
			widget_control,$
				nonopv.button_id(nonopv.cmd_buttons(i)),$
				set_button=1
			nonopv.selected(nonopv.cmd_buttons(i))=1
			endfor
	        WIDGET_CONTROL, /HOUR
	        IF (DATATYPE(hk2) EQ 'INT') THEN $
                   WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                ELSE $
                   DO_PLOT_NONOP, nonopv
		end

	'REPLOT_NEW':begin
			print,'replot_new'
		if (nonopv.plot_done eq 1) then begin
			nonopv.xaxis_scaling=1
	        	WIDGET_CONTROL, /HOUR
	        	IF (DATATYPE(hk2) EQ 'INT') THEN $
                           WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
                	ELSE $
                   		DO_PLOT_NONOP, nonopv
				nonopv.plot_done=1
			endif $
		else WIDGET_CONTROL,nonopv.diag,SET_VALUE='MUST DO PLOT BEFORE REPLOT'
			end

	'REPLOT_DEFAULT': begin
			print,'replot_default'
		if (nonopv.plot_done eq 1) then begin
			nonopv.xaxis_scaling=0
	        	WIDGET_CONTROL, /HOUR
	        	IF (DATATYPE(hk2) EQ 'INT') THEN $
                                WIDGET_CONTROL,nonopv.diag,SET_VALUE='Must read in packet files first.' $
               		ELSE $
                   		DO_PLOT_NONOP, nonopv
				nonopv.plot_done=1
			widget_control,nonopv.tmin_field,$
				set_value=float(!x.crange(0))/3600.
			widget_control,nonopv.tmax_field,$
				set_value=float(!x.crange(1))/3600.
			endif $
			else WIDGET_CONTROL,nonopv.diag,SET_VALUE='MUST DO PLOT BEFORE REPLOT'
			end
	'REPLOT_Y_AXES': begin
			print,'replot_y_axes'
		if (nonopv.plot_done eq 1) then begin

   			ind = WHERE(nonopv.selected GE 1, num)
   			IF (nonopv.single) THEN nnum = 1 ELSE nnum = num
			rescale_y_axes,nnum,nonopv
			endif $
			else WIDGET_CONTROL,nonopv.diag,SET_VALUE='MUST DO PLOT BEFORE REPLOT'
			end






	ELSE : BEGIN
	    END

   ENDCASE

  WIDGET_CONTROL, event.top, SET_UVALUE=nonopv

done:
END

;-----------------------------------------------------------------------

PRO WPLOT_FP

    hk2=0
    hk2_word=0 

    num = 47
    fields = STRARR(num) & pckts = INTARR(num) & offs = INTARR(num) & cnvrs = INTARR(num)

    pkt_sel= 'DACS'
;    IF (pkt_sel eq 'DACS') THEN $ 
;       offset=15+48-1-1 $ ; NEM
;    ELSE $ 
;       offset=15+48-1-1-9

     offset=15+48-1-1-9

	temp_buttons=intarr(3)
	pzt_buttons=intarr(3)
	occ_buttons=intarr(3)
	error_buttons=intarr(4)
	dac_buttons=intarr(5)
	candc_buttons=intarr(5)
	cmd_buttons=intarr(2)


    i=0   & fields(i)='PZT 1 Voltage' & pckts(i)=2 & offs(i)= 78+offset & pzt_buttons(0)=i 
    i=i+1 & fields(i)='PZT 2 Voltage' & pckts(i)=2 & offs(i)= 79+offset & pzt_buttons(1)=i
    i=i+1 & fields(i)='PZT 3 Voltage' & pckts(i)=2 & offs(i)= 80+offset & pzt_buttons(2)=i
    i=i+1 & fields(i)='OCC 1 Voltage' & pckts(i)=2 & offs(i)= 70+offset & occ_buttons(0)=i
    i=i+1 & fields(i)='OCC 2 Voltage' & pckts(i)=2 & offs(i)= 71+offset & occ_buttons(1)=i
    i=i+1 & fields(i)='OCC 3 Voltage' & pckts(i)=2 & offs(i)= 72+offset & occ_buttons(2)=i
    i=i+1 & fields(i)='PARB Temp' & pckts(i)=2 & offs(i)= 73+offset & temp_buttons(0)=i
    i=i+1 & fields(i)='ZAPB Temp' & pckts(i)=2 & offs(i)= 87+offset & temp_buttons(1)=i
    i=i+1 & fields(i)='AUX Temp' & pckts(i)=2 & offs(i)= 88+offset & temp_buttons(2)=i
    i=i+1 & fields(i)='Z Micrometer Voltage' & pckts(i)=2 & offs(i)= 74+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Y Micrometer Voltage' & pckts(i)=2 & offs(i)= 75+offset & cnvrs(i)=5
    i=i+1 & fields(i)='X Micrometer Voltage' & pckts(i)=2 & offs(i)= 76+offset & cnvrs(i)=5
    i=i+1 & fields(i)='-5V Reference Voltage' & pckts(i)=2 & offs(i)= 90+offset & cnvrs(i)=5
    i=i+1 & fields(i)='ADC Ground Voltage' & pckts(i)=2 & offs(i)= 89+offset & cnvrs(i)=5
    i=i+1 & fields(i)='X Integrator Voltage' & pckts(i)=2 & offs(i)= 91+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Y Integrator Voltage' & pckts(i)=2 & offs(i)= 92+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Z Integrator Voltage' & pckts(i)=2 & offs(i)= 93+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Z Mode Relay' & pckts(i)=2 & offs(i)= 0 & cnvrs(i)=5
    i=i+1 & fields(i)='Y Mode Relay' & pckts(i)=2 & offs(i)= 1 & cnvrs(i)=5
    i=i+1 & fields(i)='X Mode Relay' & pckts(i)=2 & offs(i)= 2 & cnvrs(i)=5
    i=i+1 & fields(i)='OCC Gain Relay' & pckts(i)=2 & offs(i)= 3 & cnvrs(i)=5
    i=i+1 & fields(i)='CLR DAC (MUX)' & pckts(i)=2 & offs(i)= 4 & cnvrs(i)=5
    i=i+1 & fields(i)='Z Offset DAC (MUX)' & pckts(i)=2 & offs(i)= 5 & cnvrs(i)=5
    i=i+1 & fields(i)='Y Offset DAC (MUX)' & pckts(i)=2 & offs(i)= 6 & cnvrs(i)=5
    i=i+1 & fields(i)='X Offset DAC (MUX)' & pckts(i)=2 & offs(i)= 7 & cnvrs(i)=5
    i=i+1 & fields(i)='Range DAC (MUX)   ' & pckts(i)=2 & offs(i)= 8 & cnvrs(i)=5
    i=i+1 & fields(i)='CLR DAC Voltage     ' & pckts(i)=2 & offs(i)= 81+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Z Offset DAC Voltage' & pckts(i)=2 & offs(i)= 82+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Y Offset DAC Voltage' & pckts(i)=2 & offs(i)= 84+offset & cnvrs(i)=5
    i=i+1 & fields(i)='X Offset DAC Voltage' & pckts(i)=2 & offs(i)= 85+offset & cnvrs(i)=5
    i=i+1 & fields(i)='Range DAC Voltage   ' & pckts(i)=2 & offs(i)= 83+offset & cnvrs(i)=5
    i=i+1 & fields(i)='X Loop Error       ' & pckts(i)=2 & offs(i)= 9 & error_buttons(0)=i
    i=i+1 & fields(i)='Y Loop Error       ' & pckts(i)=2 & offs(i)= 10 & error_buttons(1)=i
    i=i+1 & fields(i)='Z Loop Error (calc)' & pckts(i)=2 & offs(i)= 11 & error_buttons(2)=i
    i=i+1 & fields(i)='Z Loop Error (meas)' & pckts(i)=2 & offs(i)= 77+offset & error_buttons(3)=i
    i=i+1 & fields(i)='CLR DAC (digital)' & pckts(i)=2 & offs(i)= 63 & dac_buttons(0)=i
    i=i+1 & fields(i)='Z Offset DAC (digital)' & pckts(i)=2 & offs(i)= 64 & dac_buttons(1)=i
    i=i+1 & fields(i)='Y Offset (digital)' & pckts(i)=2 & offs(i)= 65 & dac_buttons(2)=i
    i=i+1 & fields(i)='X Offset (digital)' & pckts(i)=2 & offs(i)= 66 & dac_buttons(3)=i
    i=i+1 & fields(i)='Range DAC (digital)' & pckts(i)=2 & offs(i)= 67 & dac_buttons(4)=i

    i=i+1 & fields(i)='Observation Wavelength' & pckts(i)=2 & offs(i)= 44+offset & cmd_buttons(1)=i
    i=i+1 & fields(i)='Check and Correct P/F' & pckts(i)=2 & offs(i)= 71 & candc_buttons(0)=i
    i=i+1 & fields(i)='Num LO Scans/E Code' & pckts(i)=2 & offs(i)= 77 & candc_buttons(1)=i
    i=i+1 & fields(i)='Angstroms Physical per DAC' & pckts(i)=2 & offs(i)= 85 & candc_buttons(4)=i
    i=i+1 & fields(i)='Laser Line Ref DAC' & pckts(i)=2 & offs(i)= 80 & candc_buttons(2)=i
    i=i+1 & fields(i)='Laser Line Inter-Order Spacing' & pckts(i)=2 & offs(i)= 81 & candc_buttons(3)=i
    i=i+1 & fields(i)='Previous Command Received' & pckts(i)=2 & offs(i)= 70 & cmd_buttons(0)=i



   
    button_id = LONARR(N_ELEMENTS(fields))
    selected = BYTARR(N_ELEMENTS(fields))
    selected(0:2) = 1
    cnvrt = 1
    single = 0

    LOADCT, 0
    TVLCT, 255,0,0, 1      ;** load red into entry 1
    TVLCT, 0,255,0, 2      ;** load green into entry 2
    TVLCT, 142,229,238, 3  ;** load blue into entry 3
    TVLCT, 255,255,0,4     ;** load yellow into entry 4
    TVLCT, 200,0,0, 5      ;** load dull red into entry 5
    TVLCT, 0,200,0, 6      ;** load dull green into entry 6
    TVLCT, 0,206,237, 7    ;** load dull blue into entry 7
    TVLCT, 200,200,0,8     ;** load dull yellow into entry 8
    TVLCT, 255,255,255, 9  ;** load white into entry 9

    ;********************************************************************
    ;** SET UP WIDGETS **************************************************

    base = WIDGET_BASE(/ROW, TITLE='C1 Fabry Perot Operational Parameters', /FRAME)
;, X_SCROLL_SIZE=960,Y_SCROLL_SIZE=700)

    font='-adobe-times-bold-r-normal--14-140-75-75-p-77-iso8859-1'

    col1 = WIDGET_BASE(base, /COLUMN)
	draw_col=widget_base(base,/column)

    col2 = WIDGET_BASE(col1, /COLUMN, /FRAME)
    row = WIDGET_BASE(col2, /ROW)
    lab = WIDGET_LABEL(row, VALUE='START :')
    GET_UTC, utc
    utc = ANYTIM2CAL(utc, FORM=8)
    str = STRMID(utc,2,2)+STRMID(utc,4,2)+STRMID(utc,6,2)+'_00'
    startt = WIDGET_TEXT(row, XSIZE=10, VALUE=str, /EDITABLE, UVALUE='START')
    row = WIDGET_BASE(col2, /ROW)
    lab = WIDGET_LABEL(row, VALUE='STOP  :')
    stopt = WIDGET_TEXT(row, XSIZE=10, /EDITABLE, UVALUE='STOP')
;    junk = WIDGET_BUTTON(col2, VALUE='READ PACKETS', UVALUE='READ')
    rd= WIDGET_BASE(col2, /ROW)
    pkt_types= ['DACS','ECS']    ; DACS: .recs files; ECS: .QKL+.REL files.
    pkt_disp= ['DACS (.recs)','ECS (.QKL+.REL)']
    junk = WIDGET_BUTTON(rd, VALUE='READ PACKETS', UVALUE='READ')
    pkt_id= CW_BSELECTOR(rd,UVALUE='PTYPE',pkt_disp)

    col2 = WIDGET_BASE(col1, /COLUMN, /NONEXCLUSIVE, /FRAME, $
           /SCROLL, X_SCROLL_SIZE=200, Y_SCROLL_SIZE=400)
    FOR i=0, N_ELEMENTS(fields)-1 DO BEGIN
       button_id(i) = WIDGET_BUTTON(col2, VALUE=fields(i), UVALUE='SELECT')
    ENDFOR

    col2 = WIDGET_BASE(col1, /COLUMN, /NONEXCLUSIVE, /FRAME)
    sing = WIDGET_BUTTON(col2, VALUE='Plot all on single plot', UVALUE='SINGLE')

    junk = WIDGET_BUTTON(col1, VALUE='PLOT', UVALUE='PLOT')
    junk = WIDGET_BUTTON(col1, VALUE='PRINT', UVALUE='PRINT')
    junk = WIDGET_BUTTON(col1, VALUE='SAVE AS GIF', UVALUE='SAVE')
    junk = WIDGET_BUTTON(col1, VALUE='QUIT', UVALUE='QUIT')

    draw = WIDGET_DRAW(draw_col, XSIZE=700, YSIZE=600, RETAIN=2, /FRAME)
    WIDGET_CONTROL, draw, GET_VALUE=win      ; find out window's index no.

        diagbase= widget_base(draw_col,/row)
        msg='                                                         '
        msg= msg+msg+msg+'  '
        diag= WIDGET_LABEL(diagbase,value=msg,FONT=font)
	buttons_row=widget_base(draw_col,/row)
	draw_col_left=widget_base(buttons_row,/column,/frame)
        left1=widget_base(draw_col_left,/row)
        junk=widget_button(left1,value='PLOT TEMPS',uvalue='TEMPS')
        junk=widget_button(left1,value="PLOT PZT'S",uvalue='PZTS')
        junk=widget_button(left1,value="PLOT OCC'S",uvalue='OCCS')
        junk=widget_button(left1,value="PLOT ERRORS",uvalue='ERRORS')
        left2=widget_base(draw_col_left,/row)
	junk=widget_button(left2,$
		value="PLOT COMMAND DACS",uvalue='CMD_DACS')
	junk=widget_button(left2,value="PLOT C&C DATA",uvalue='CANDC')
	junk=widget_button(left2,$
		value="PLOT COMMAND DATA",uvalue='CMDS')

	draw_col_right=widget_base(buttons_row,/column,/frame, $
        /scroll,x_scroll_size=325,y_scroll_size=40) ;325
	junk=widget_label(draw_col_right,value='RESCALING OPTIONS')
        right1=widget_base(draw_col_right,/row)
	tmin_field=cw_field(right1, xsize=10, $
;		title='Time Min (Hours)',/floating)
               title='Time (Hours): Min',/floating)
	tmax_field=cw_field(right1, xsize=10, $
;		title='Time Max (Hours)',/floating)
               title='Max',/floating)
;        right2=widget_base(draw_col_right,/row)
;	replot_new_t=widget_button(right2,$
       replot_new_t=widget_button(draw_col_right,$
		value='REPLOT WITH NEW TIME RANGE',$
		uvalue='REPLOT_NEW')
;	replot_default_t=widget_button(right2,$
       replot_default_t=widget_button(draw_col_right,$ 
		value='REPLOT WITH FULL TIME RANGE',$
		uvalue='REPLOT_DEFAULT')
	replot_y_values=widget_button(draw_col_right,$
		value='RESCALE PLOT Y AXES',$
		uvalue='REPLOT_Y_AXES')

	yminima=fltarr(9)
	ymaxima=fltarr(9)



    ;********************************************************************
    ;** REALIZE THE WIDGETS *********************************************

    WIDGET_CONTROL, /REAL, base

    FOR i=0, N_ELEMENTS(button_id)-1 DO $
       WIDGET_CONTROL, button_id(i), SET_BUTTON=selected(i)
    WIDGET_CONTROL, sing, SET_BUTTON=single

    ;********************************************************************
    ;** Create a structure that will be carried around as the UVALUE of the main base (BASE)
    nonopv = { $
	base:base, 			$
	win:win, 			$
	fields:fields, 			$
	button_id:button_id, 		$
	startt:startt, 			$
	stopt:stopt, 			$
	pckts:pckts, 			$
        pkt_sel: pkt_sel,               $
        pkt_types: pkt_types,           $
	offs:offs, 			$
	cnvrs:cnvrs, 			$
	cnvrt:cnvrt, 			$
	single:single, 			$
	selected:selected, 		$
	temp_buttons:temp_buttons,	$
	pzt_buttons:pzt_buttons,	$
	occ_buttons:occ_buttons,	$
	error_buttons:error_buttons,	$
	dac_buttons:dac_buttons,	$
	candc_buttons:candc_buttons,	$
	cmd_buttons:cmd_buttons,	$
	tmin_field:tmin_field,		$
	tmax_field:tmax_field,		$
	plot_done:0,			$
	xaxis_scaling:0,		$
	yminima:yminima,		$
	ymaxima:ymaxima,		$
        diag: diag,                     $
	yaxis_scaling:0			$
    }

    ; Load the structure into the main base's UVALUE for one way trip to handler
    WIDGET_CONTROL, base, SET_UVALUE=nonopv


    XMANAGER, 'WPLOT_FP', base, EVENT_HANDLER='WPLOT_FP_EVENT'

RETURN
END
