;+
; Project     : SOHO - CDS           
;                                                                   
; Name        : ENG_MON_EVENT
;                                                   
; Purpose     : Services the widget events from ENG_MON_MENU.
;                                                   
; Explanation : Used within the engineering monitor program.
;                                                   
; Use         : Only used by XMANAGER to service ENG_MON_MENU
;       
; Inputs      : ev  -  structure of event generated
;                                                   
; Opt. Inputs : None
;                                                   
; Outputs     : None
;                                                   
; Opt. Outputs: None
;                                                   
; Keywords    : None
;
; Calls       : None
;                                                   
; Restrictions: None
;                                                   
; Side effects: None
;                                                   
; Category    : Telemetry
;                                                   
; Prev. Hist. : None
;
; Written     : C D Pike, RAL, 29-Sep-94
;                                                   
; Modified    : Increase possible size of data arrays to 50000.  CDP, 20-Apr-95
;               Pick up array size from common.  CDP, 8-Nov-97
;               Fix for disappearanve of xbackregister in IDL v5. CDP, 12-Apr-99
;               Version 5, 19-Jul-2005, William Thompson, GSFC
;                       Changed delay to 0 to speed up.
;
; Version     : Version 5, 19-Jul-2005
;-                                       

PRO eng_mon_event, ev

;
;  common for communication
;
@emon.com

;
;  determine the type of widget event to be serviced
;
type = TAG_NAMES(ev, /structure)

;
;  trap timer events for reading routine input_engab to act
;
if (type EQ 'WIDGET_TIMER') then begin
   input_engAB, ev.top
   if reading then widget_control, dummy_label, timer=0.0
   return
endif


;
;  if it is a button then retrieve the user value 
;
IF (type EQ 'WIDGET_BUTTON') THEN BEGIN
   WIDGET_CONTROL, ev.id, GET_UVALUE=uvalue


;
;  begin to act depending on the identification of the widget
;

;
;  if a top level DONE was requested, everything dies
;                 ====

   if (uvalue EQ 'Done') then begin

     DEVICE, WINDOW_STATE=STATE
     IF N_ELEMENTS(STATE) GT 32 THEN FOR I_WIN=32,N_ELEMENTS(STATE)-1 DO $
                IF STATE(I_WIN) THEN WDELETE, I_WIN
     WIDGET_CONTROL, /destroy, ev.top
   endif 


;
;  want to SELECT data files
;          ======
  
   IF (uvalue EQ 'TMFILE') THEN BEGIN
      cds_files_in,file_name
      file_seq_no = 0
      num_data_files = n_elements(file_name)
      widget_control, msg_widg,set_v=' ',/append
      for i=0,num_data_files-1 do begin
         widget_control, msg_widg,set_v=file_name(i),/append
      endfor
      widget_control, msg_widg,set_v=' ',/append
   endif

;
;  want Eng A packets
;       =====
  
   IF (uvalue EQ 'ENGA') THEN BEGIN
      wanted_packets = 'A'
      widget_control, ab_ids(0), set_button=1
   endif

;
;  want Eng B packets
;       =====
  
   IF (uvalue EQ 'ENGB') THEN BEGIN
      wanted_packets = 'B'
      widget_control, ab_ids(1), set_button=1
   endif

;
;  want to IDENTIFY parameter names
;          ========
  
   IF (uvalue EQ 'PARMS') THEN BEGIN
      widget_control, main_base, sens=0
      sel_parm_menu
      xmanager,"sel_parm",sel_parm_base
   endif

;
;  want to PLOT parameter values
;          ====
  
   IF (uvalue EQ 'PLOT') THEN BEGIN
      if n_elements(ut_data) gt 0 then begin
         widget_control, main_base, sens=0
         DEVICE, WINDOW_STATE=STATE
         IF N_ELEMENTS(STATE) GT 32 THEN FOR I_WIN=32,N_ELEMENTS(STATE)-1 DO $
                  IF STATE(I_WIN) THEN WDELETE, I_WIN
         sel_plot_menu
         xmanager,"sel_plot",sel_plot_base
      endif else begin
         flash_msg, msg_widg, 'No data read yet.'
      endelse
   endif

;
;  want to READ the telemetry files
;          ====
  
   if (uvalue EQ 'READ') THEN BEGIN
      if not reading then begin
         if n_elements(wanted_parms) gt 0 then begin
            if num_data_files gt 0 then begin
               emon_sensitive,0
               nparm_data = 0L
               ut_data = strarr(array_size)
               parm_data = lonarr(n_elements(wanted_parms),array_size)
               file_seq_no = 0
               openr, eng_lun, file_name(file_seq_no), /get_lun, error=err
               if err ne 0 then begin
                  flash_msg,msg_widg,$
                    '** Failed to open telemetry file. ** '+file_name(file_seq_no)
                  emon_sensitive,1
               endif else begin
;                  xbackregister, 'input_engAB', ev.top
                  reading = 1
                  dummy_label = widget_base(ev.top)
                  widget_control,dummy_label,timer=0.0
               endelse
            endif else begin
               bell
               flash_msg, msg_widg, 'No telemetry files selected yet.'
            endelse
         endif else begin
            flash_msg, msg_widg, 'No parameters selected yet.'
         endelse
      endif
   endif

;
;  want to STOP reading telemetry
;          ===
  
   IF (uvalue EQ 'STOP') THEN BEGIN
      if reading then begin
;         xbackregister, /unregister, 'input_engAB', ev.top
         widget_control, dummy_label, /destroy
         free_lun, eng_lun
         widget_control, msg_widg, set_val='Data taking has been STOPPED.'
         n = where(ut_data ne '')
         if n(0) ge 0 then begin
            ut_data = ut_data(n)
            parm_data = parm_data(*,n)
         endif
         reading = 0
         emon_sensitive,1
      endif else begin
         flash_msg, msg_widg, 'Data not being read!'
      endelse
   endif

;
;  want some HELP
;            ====
  
   if (uvalue EQ 'HELP') THEN BEGIN
      widg_help, 'emon.hlp'
   endif


ENDIF

END


