;+
; Project     : SOLAR-B - EIS
;
; Name        : EIS_CPT_CHECK_RASTER
;
; Purpose     : Checks various raster parameters are in range.
;
; Explanation : Checks :
;                 - coarse mirror encoder position.
;                 - fine mirror position.
;                 - loop counter
;                 - data compression parameter
;                 - number of exposures
;                 - ASRC parameters
;                 - raster repeats
;                 - slit/slot position and direction
;                 - number of data extraction windows
;                 - data extraction windows
;                 - event control flags
;                 - hunter raster
;
; Use         : < result = eis_cpt_check_raster ( engineering_parameters, raster_detail) >
;
; Inputs      : engineering_parameters  : STRUCTURE of type EIS_engineering_parameters.
;               raster_detail           : STRUCTURE of type EIS_raster_detail.
;
; Opt. Inputs : None.
;
; Outputs     : result   : status flag
;                       0 : if checks failed.
;                       1 : checks OK.
;
; Opt. Outputs: None.
;
; Keywords    : None.
;
; Calls       : None.
;
; Common      : None.
;
; Restrictions: None.
;
; Side effects: None.
;
; Category    : EIS_CPT.
;
; Prev. Hist. : None.
;
; Written     : Martin Carter RAL 17/12/04
;
; Modified    : Version 0.0, 17/12/04, MKC
;               Version 0.1, 02/03/05, MKC
;                 Modified check on ASRC skip.
;                 Corrected logic.
;               Version 0.2, 03/04/05, MKC
;                 Added check on number of data extraction windows.
;               Version 0.3, 11/04/05, MKC
;                 Added check on data extraction windows.
;                 Corrected range for no. of exposures per raster position.
;               Version 0.4, 22/06/05, MKC
;                 Moved some of the checks to eis cpt check engineering parameters.
;                 Added check for multiple event control flags.
;                 Changed some of the checks since using UINT values.
;                 Removed check on coarse mirror position.
;               Version 0.5, 28/06/05, MKC
;                 Implemented case of AEC and XRT flare flags.
;               Version 0.6, 12/09/05, MKC
;                 Added check that raster ID valid.
;               Version 0.7, 08/12/06, MKC
;                 Removed check on compression parameter range.
;                 The parameters take spceific hex values rather than 0-7 as previously assumed.
;                 See MDP ICU interface document : NAO/SLB-EIS/SP/MDP3.4
;               Version 0.8, 12/01/07, MKC
;                 Removed number of exposures per raster position tag from raster detail.
;               Version 0.9, 20/09/07, MKC
;                 Corrected bug in fine mirror end position calculation.
;               Version 1.0, 26/02/08, MKC
;                 Added extra checks on fine mirror position.
;               Version 1.1, 11/06/08, MKC
;                 Use eis cpt fine mirror range routine.
;                 Added check that ASRC not used for hunter raster.
;
; Version     : 1.1, 11/06/08
;-
;**********************************************************

FUNCTION eis_cpt_check_raster, engineering_parameters, raster_detail

  ; check raster ID valid

  IF UINT(raster_detail.raster_id)  EQ '0000'XU OR $
     UINT(raster_detail.raster_id)  EQ 'FFFF'XU THEN BEGIN

    eis_cpt_message, 'ERROR, INVALID RASTER IDENTIFIER : '+STRING(raster_detail.raster_id,FORMAT='("0x",Z8.8)')

    GOTO, error

  ENDIF

  ; check loop counter in range

  IF raster_detail.number_of_mirror_positions EQ 0 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER NUMBER OF MIRROR POSITIONS MUST BE GREATER THAN 0'

    GOTO, error

  ENDIF

  ; get number of exposures per raster position

  dummy = WHERE(raster_detail.exposure_times NE 0, nexp)

  ; check number of exposures per raster position

  IF nexp EQ 0 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER INVALID no exposures for raster'

    GOTO, error

  ENDIF

  ; check ASRC parameters
  ; check either both zero or both non-zero

  IF raster_detail.ASRC_step NE 0 XOR raster_detail.ASRC_skip NE 0 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER INVALID ASRC CONTROL'

    GOTO, error

  ENDIF

  IF raster_detail.ASRC_step LT -127 OR raster_detail.ASRC_step GT 127 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER INVALID ASRC step'

    GOTO, error

  ENDIF

  ; check number of raster repeats

  IF raster_detail.number_of_raster_repeats LT 1 OR raster_detail.number_of_raster_repeats GT 4095 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER INVALID number of raster repeats'

    GOTO, error

  ENDIF

  ; check ASRC skip

  IF raster_detail.ASRC_skip GT 255 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER INVALID ASRC skip'

    GOTO, error

  ENDIF

  ; check fine mirror range for initial raster will not be exceeded

  fine_mirror_range = eis_cpt_fine_mirror_range(raster_detail)

  ; check fine mirror position within range

  IF fine_mirror_range[0] LT engineering_parameters.mechanism_control.fine_mirror_range[0] OR $
     fine_mirror_range[0] GT engineering_parameters.mechanism_control.fine_mirror_range[1] OR $
     fine_mirror_range[1] LT engineering_parameters.mechanism_control.fine_mirror_range[0] OR $
     fine_mirror_range[1] GT engineering_parameters.mechanism_control.fine_mirror_range[1] THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER FINE_MIRROR_POSITION OUT OF RANGE'

    GOTO, error

  ENDIF

  ; check fine mirror range of final raster (after ASRC) will not be exceeded

  fine_mirror_range = eis_cpt_fine_mirror_range(raster_detail, /ASRC)

  ; check fine mirror position within range

  IF fine_mirror_range[0] LT engineering_parameters.mechanism_control.fine_mirror_range[0] OR $
     fine_mirror_range[0] GT engineering_parameters.mechanism_control.fine_mirror_range[1] OR $
     fine_mirror_range[1] LT engineering_parameters.mechanism_control.fine_mirror_range[0] OR $
     fine_mirror_range[1] GT engineering_parameters.mechanism_control.fine_mirror_range[1] THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER FINE_MIRROR_POSITION OUT OF RANGE AFTER ASRC'

    GOTO, error

  ENDIF

  ; check slit/slot encoder in range

  IF raster_detail.slit_slot GT 3 THEN BEGIN

    eis_cpt_message, 'ERROR, SLIT_SLOT_AUTO ENCODER POSITION OUT OF RANGE'

    GOTO, error

  ENDIF

  ; check number of data extraction windows

  IF raster_detail.number_of_data_extraction_windows GT 25 THEN BEGIN

    eis_cpt_message, 'ERROR, RUN_RASTER INVALID number of data extraction windows'

    GOTO, error

  ENDIF

  ; get hardware window

  hardware_window = eis_cpt_hardware_window(raster_detail)

  ; check data extraction windows

  FOR k = 0, raster_detail.number_of_data_extraction_windows-1 DO $
    IF NOT eis_cpt_check_window(hardware_window, raster_detail.data_extraction_windows[k], engineering_parameters.CAM_readout_parameters) THEN GOTO, error

  ; check for multiple event control flags

  controls = 0

  IF raster_detail.XRT_flare_control_flag THEN controls = controls + 1

  IF raster_detail.EIS_flare_control_flag THEN controls = controls + 1

  IF raster_detail.EIS_event_control_flag THEN controls = controls + 1

  IF raster_detail.AEC_control_flag       THEN controls = controls + 1

  ; AEC and XRT flare may be enabled together else only one flag active

  IF controls GT 1 AND $
    (controls NE 2 AND raster_detail.XRT_flare_control_flag AND raster_detail.AEC_control_flag) THEN BEGIN

    eis_cpt_message, 'ERROR, MULTIPLE EVENT CONTROLS ACTIVE'

    GOTO, error

  ENDIF

  ; check EIS flare control

  IF raster_detail.EIS_flare_control_flag THEN BEGIN

    ; check EIS flare control windows

    number_EIS_flare_windows = TOTAL(raster_detail.data_extraction_windows[0:raster_detail.number_of_data_extraction_windows-1].EIS_flare_line_flag)

    IF number_EIS_flare_windows EQ 0 THEN BEGIN

      eis_cpt_message, 'ERROR, NO EIS FLARE WINDOW DEFINED'

      GOTO, error

    ENDIF ELSE IF number_EIS_flare_windows GT 1 THEN BEGIN

      eis_cpt_message, 'ERROR, MULITPLE EIS FLARE WINDOWS DEFINED'

      GOTO, error

    ENDIF

  ENDIF

  ; check EIS event control

  IF raster_detail.EIS_event_control_flag THEN BEGIN

    ; check EIS event control windows

    number_EIS_event_windows = TOTAL(raster_detail.data_extraction_windows[0:raster_detail.number_of_data_extraction_windows-1].EIS_event_line_flag)

    IF number_EIS_event_windows EQ 0 THEN BEGIN

      eis_cpt_message, 'ERROR, NO EIS EVENT WINDOW DEFINED'

      GOTO, error

    ENDIF ELSE IF number_EIS_event_windows GT 1 THEN BEGIN

      eis_cpt_message, 'ERROR, MULITPLE EIS EVENT WINDOWS DEFINED'

      GOTO, error

    ENDIF

  ENDIF

  ; check AEC control

  IF raster_detail.AEC_control_flag THEN BEGIN

    ; check AEC control windows

    number_AEC_windows = TOTAL(raster_detail.data_extraction_windows[0:raster_detail.number_of_data_extraction_windows-1].EIS_AEC_line_flag)

    IF number_AEC_windows EQ 0 THEN BEGIN

      eis_cpt_message, 'ERROR, NO AEC WINDOW DEFINED'

      GOTO, error

    ENDIF ELSE IF number_AEC_windows GT 1 THEN BEGIN

      eis_cpt_message, 'ERROR, MULTIPLE AEC WINDOWS DEFINED'

      GOTO, error

    ENDIF

  ENDIF

  ; check ASRC not used for hunter raster

  IF raster_detail.ASRC_step NE 0 AND $
    (raster_detail.XRT_flare_control_flag OR $
     raster_detail.EIS_flare_control_flag OR $
     raster_detail.EIS_event_control_flag) THEN BEGIN

    eis_cpt_message, 'ERROR, ASRC USED FOR HUNTER STUDY'

    GOTO, error

  ENDIF

  ; return OK flag

  RETURN, 1

error :

  ; issue routine name

  MESSAGE, 'ERROR', /INFORMATIONAL

  ; return error flag

  RETURN, 0

END





