{ *************************************************************************** }
MODULE mod_tst_task ;
{  Created  21-MAR-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE }
{ *************************************************************************** }
INCLUDE
  mod_handle_console,
  mod_handle_tracing,
  mod_io_allocation_handling,
  mod_def_hardware_tables,
  mod_coor_caltrg_execute,
  mod_tst_common,
  mod_tst_init,
  mod_tst_caltrg_random,
  mod_tst_chtcr_proms,
  mod_tst_ctfe_proms,
  mod_tst_ctfe_fend,
  mod_tst_get_param,
  $KERNEL ;                                        { from ELN$:RTLOBJECT.OLB  }
{ *************************************************************************** }
EXPORT
  hard_test_mode,
  init_test_mode,
  quit_test_mode ;
{ *************************************************************************** }
IMPORT

  lock_console,                       {from module MOD_HANDLE_CONSOLE         }
  unlock_console,                     {from module MOD_HANDLE_CONSOLE         }

  handle_trc_err,                     {from module MOD_HANDLE_TRACING         }
  handle_trc_sta,                     {from module MOD_HANDLE_TRACING         }
  handle_trc_sys,                     {from module MOD_HANDLE_TRACING         }
  handle_exception,                   {from module MOD_HANDLE_TRACING         }
  set_sys_window,                     {from module MOD_HANDLE_TRACING         }
  set_trc_exc_mode,                   {from module MOD_HANDLE_TRACING         }

  allocate_trigger,                   {from module MOD_IO_ALLOCATION_HADLLING }
  deallocate_trigger,                 {from module MOD_IO_ALLOCATION_HADLLING }

  eta_polarity,                       {from module MOD_DEF_HARDWARE_TABLES    }
  eta_magnitude,                      {from module MOD_DEF_HARDWARE_TABLES    }
  phi_value,                          {from module MOD_DEF_HARDWARE_TABLES    }

  do_find_dac_byte,                   {from module MOD_COOR_CALTRG_EXECUTE    }

 {test_type,}                         {from module MOD_TST_COMMON             }
  CALTRG_Rand, Front_End, Lookup, CHTCR, Init, Find_DAC,
  testtag,                            {from module MOD_TST_COMMON             }
  reqstd_test,                        {from module MOD_TST_COMMON             }
 {reqstd_loop,}                       {from module MOD_TST_COMMON             }
  iotest,                             {from module MOD_TST_COMMON             }
  seed,                               {from module MOD_TST_COMMON             }
  low_eta_pol, hig_eta_pol,           {from module MOD_TST_COMMON             }
  low_eta_mag, hig_eta_mag,           {from module MOD_TST_COMMON             }
  low_phi, hig_phi,                   {from module MOD_TST_COMMON             }

  init_hardware_test_tables,          {from module MOD_TST_COMMON             }

  power_up_init,                      {from module MOD_TST_INIT               }

  get_hard_test_parameters,           {from module MOD_TST_GET_PARAM          }
  get_param_test_caltrg_random,       {from module MOD_TST_GET_PARAM          }
  get_param_test_ctfe_fend,           {from module MOD_TST_GET_PARAM          }
  get_param_test_ctfe_proms,          {from module MOD_TST_GET_PARAM          }
  get_param_test_chtcr_proms,         {from module MOD_TST_GET_PARAM          }
  get_param_find_dac,                 {from module MOD_TST_GET_PARAM          }

  hardware_test_caltrg_random,        {from module MOD_TST_CALTRG_RANDOM      }
  hardware_test_chtcr_proms,          {from module MOD_TST_CHTCR_PROMS        }
  hardware_test_ctfe_fend,            {from module MOD_TST_CTFE_FEND          }
  hardware_test_ctfe_proms,           {from module MOD_TST_CTFE_PROMS         }

  KER$NAME_OBJECT ;                   {from module $KERNEL                    }

{ *************************************************************************** }
{ *************************************************************************** }

VAR

  hard_test_mode : INTEGER := 0 ;
  proc_hard_test : PROCESS ;
  name_hard_test : NAME ;
  allocate_IO    : BOOLEAN ;

{ *************************************************************************** }
{ *************************************************************************** }
PROCESS_BLOCK block_hard_test ;

BEGIN

  init_hardware_test_tables ;

  seed := 12345 ; {for random numbers: set to a known state when task created }

ready_for_test:

  testtag := 'test%' ;

  get_hard_test_parameters ( REQSTD_TEST := reqstd_test ) ;

  CASE reqstd_test OF

    CALTRG_Rand    : get_param_test_caltrg_random ;

    Front_End      : get_param_test_ctfe_fend ;

    Lookup         : get_param_test_ctfe_proms ;

    CHTCR          : get_param_test_chtcr_proms ;

    Init           : ;

    Find_DAC       : get_param_find_dac ;

    OTHERWISE BEGIN
      handle_trc_err ( TAG := 'HRD/TST%'+testtag,
                   MESSAGE := ' Unexpected Harware Test Option ' ) ;
      GOTO ready_for_test ;
    END ;{otherwise}

  END ;{case reqstd_Test}


  ESTABLISH ( exchand_hardware_test ) ;

  get_hard_test_parameters ( ALLOCATE_IO := allocate_IO ) ;
  IF ( allocate_IO = TRUE ) 
  THEN allocate_trigger ( TAGEXT := testtag, CALLER_ID := iotest ) ;

  CASE reqstd_test OF

    CALTRG_Rand    : hardware_test_caltrg_random ;

    Front_End      : hardware_test_ctfe_fend ;

    Lookup         : hardware_test_ctfe_proms ;

    CHTCR          : hardware_test_chtcr_proms ;
  
    Init           : power_up_init ;

    Find_DAC       : invoke_find_dac ;

  END ;{case reqstd_Test}

  IF ( allocate_IO = TRUE ) 
  THEN deallocate_trigger ( TAGEXT := testtag ) ;

  GOTO ready_for_test ;


END ;
{ **************************************************************************** }
PROCEDURE invoke_find_dac ;

VAR
  eta_sign_range : SET OF eta_polarity ; 
  eta_magn_range : SET OF eta_magnitude ;
  phi_range      : SET OF phi_value ;    
BEGIN

  eta_sign_range := [low_eta_pol..hig_eta_pol] ; 
  eta_magn_range := [low_eta_mag..hig_eta_mag] ;
  phi_range      := [low_phi..hig_phi] ;

  do_find_dac_byte ( TAGEXT := testtag, 
             ETA_SIGN_RANGE := eta_sign_range,
             ETA_MAGN_RANGE := eta_magn_range,
                  PHI_RANGE := phi_range,
                      PARAM := iotest ) ;

END ;
{ *************************************************************************** }
PROCEDURE init_test_mode ;

VAR
  status : INTEGER ;

BEGIN

  IF ( hard_test_mode = 0 )
  THEN BEGIN

    CREATE_PROCESS ( proc_hard_test, block_hard_test, STATUS := status ) ;
    handle_trc_sta ( TAG := 'CRE/PRC%test%', STATUS := status ) ;

    KER$NAME_OBJECT ( name_hard_test, 'HARD TEST', proc_hard_test,
                      STATUS := status ) ;
    handle_trc_sta ( TAG := 'NAM/PRC%test%', STATUS := status ) ;

    { lower the priority of the process to allow trics messages  }
    SET_PROCESS_PRIORITY ( proc_hard_test, 9, STATUS := status );
    handle_trc_sta ( TAG := 'SET/PIO%hardtest%', STATUS := status ) ;

    hard_test_mode := 1 ;

    NEW (iotest) ;

  END ;

END ;
{ *************************************************************************** }
PROCEDURE quit_test_mode ;

VAR
  status : INTEGER ;

BEGIN

  IF ( hard_test_mode = 1  )
  THEN BEGIN

    set_sys_window ( INPUT_LINE := -1 ) ;

    lock_console ;
    SIGNAL ( proc_hard_test, STATUS := status ) ;
    unlock_console ;
    handle_trc_sta ( TAG := 'SIG/PRC%test%', STATUS := status ) ;

    DELETE ( name_hard_test, STATUS := status ) ;
    handle_trc_sta ( TAG := 'DEL/NAM%test%', STATUS := status ) ;

    hard_test_mode := 0 ;

    DISPOSE (iotest) ;

    deallocate_trigger ( TAGEXT := testtag ) ;

  END ;

END ;
{ *************************************************************************** }
{ **************************************************************************** }
FUNCTION exchand_hardware_test OF TYPE EXCEPTION_HANDLER ;

BEGIN
  set_trc_exc_mode ( TRUE ) ;

  deallocate_trigger ( TAGEXT := testtag ) ;

  exchand_hardware_test := handle_exception ( TAG := 'HTT/EXC%'+testtag+'%', 
                                         EXC_CODE := signal_args.name ) ;

  handle_trc_sys ( TAG := 'HTT/EXC%'+testtag, MESSAGE := 'Override: Debugging');
  exchand_hardware_test := FALSE ;
  
  set_trc_exc_mode ( FALSE ) ;
END ;
{ *************************************************************************** }
{ *************************************************************************** }
END .
