module ItsRSUsSimulator_TestSystem {
    
  // LibIts
  import from ITS_Container language "ASN.1:1997" all;
  import from DSRC language "ASN.1:1997" all;
    
  // LibItsGeoNetworking
  import from LibItsGeoNetworking_TestSystem all;
  import from LibItsGeoNetworking_TypesAndValues all;
    
  // AtsRSUsSimulator
  import from ItsRSUsSimulator_TypesAndValues all;
  import from ItsRSUsSimulator_Pics all;
  import from ItsRSUsSimulator_Pixits all;
    
  /**
   * @desc Test component for ITS Network and Transport layer
   */
  type component ItsRSUsSimulator extends ItsGeoNetworking {
    /**
     * @desc RSUsimulator configuration port
     */
    port ConfigRsuSimulatorPort cfPort; 
    /**
     * @desc RSU position
     */
    var LongPosVector vc_longPosVectorRsu;
    /**
     * @desc RSU Geonetworking area
     */
    var GeoArea vc_geoArea;
    /**
     * @desc Supported sent messages templates: one or more from CAM, DENM, MAPEM, SPATEM, IVIM, SSEM
     * @see PICS_GENERATE_xxx
     */
    var template (value) RsuMessagesValueList vc_rsuMessagesValueList := {};
    /**
     * @desc Current RSU identifier
     */
    var integer vc_rsu_id := PX_RSU_ID - 1;
    /**
     * @desc DENM event counter: one RSU can send one or mode different DENM
     */
    var integer vc_denmEventCounter := 0;
    /**
     * @desc DENM sequence number index
     */
    var SequenceNumber vc_sequenceNumber := 0;
    /**
     * @desc TODO
     */
    var MsgCount vc_msgIssueRevision := 0;
    /**
     * @desc List of MovementState per intersection and per RSU 
     */
    var template (value) MovementListPerIntersectionRsu vc_states;
    /**
     * @desc The SPATEM message to use in SignalGroupParmList
     */
    var integer vc_signalGroupParmId := 0; // TODO Use a PIXIT 
    /**
     * @desc Current SPATEM state
     */
    var integer vc_spatemStatesId := 0;
    /**
     * @desc TimeMark of the begining of a new SPATEM phase
     */
    var TimeMark vc_currentPhaseStartTime := 36001;
    /**
     * @desc Estimated TimeMark of the end of the current SPATEM phase
     */
    var TimeMark vc_endPhaseStartTime := 0;
    /**
     * @desc Repetition duration times of SPATEM phases
     */
    /* TODO To be removed
     * var SpatemRepetionDuration vc_repitition_duration := { 
     PICS_SPATEM_REPITITION_DURATION_STATE_1, 
     PICS_SPATEM_REPITITION_DURATION_STATE_2, 
     PICS_SPATEM_REPITITION_DURATION_STATE_3 
     };
    */
    var integer vc_spatemStatesNum := 3; // Two states
        
    var boolean vc_beacon := PICS_GENERATE_BEACON;
    var boolean vc_cam    := PICS_GENERATE_CAM;
    var boolean vc_denm   := PICS_GENERATE_DENM;
    var boolean vc_ivim   := PICS_GENERATE_IVIM;
    var boolean vc_mapem  := PICS_GENERATE_MAPEM;
    var boolean vc_spatem := PICS_GENERATE_SPATEM;
    //var boolean vc_evcsn := PICS_GENERATE_EVCSN;
    timer tc_beacon := PICS_BEACON_FREQUENCY;
    timer tc_cam    := PICS_CAM_FREQUENCY;
    timer tc_denm   := PICS_DENM_FREQUENCY;
    timer tc_mapem  := PICS_MAPEM_FREQUENCY;
    timer tc_spatem := PICS_SPATEM_FREQUENCY;
    timer tc_ivim   := PICS_IVIM_FREQUENCY;
    //timer tc_evcsn   := PICS_EVCSN_FREQUENCY;
        
  } // End of component ItsRSUsSimulator
    
    /**
     * @desc Test system component for ITS Network and Transport layer
     */
  type component ItsRSUsSimulatorSystem extends ItsGeoNetworkingSystem {
    port ConfigRsuSimulatorPort cfPort; 
  }
    
  type record of record {
    boolean          detected,
    ItsRSUsSimulator component_,
    integer          stationId,
    integer          detectionCounter
    } VehiclesSimulator;
    
  group configRsuSimulatorTypes {
        
    type record CfInitialize {
      integer i
    } with {
      variant "FIELDORDER(msb)"
      }
        
    type charstring CfEvent;
        
    type boolean CfResult;
        
    type union CfEventInd {
      anytype empty
    }
                
  } with {
    variant ""
  } // End of group configRsuSimulatorTypes 
    
  group configRsuSimulatorPort {
        
    /**
     * @desc Configuration RSUsimulator port
     */
    type port ConfigRsuSimulatorPort message {
      out 
      CfInitialize, CfResult, UtGnResults; 
      in 
      CfEvent, CfEventInd, UtGnInitialize
      } // End of ConfigRsuSimulatorPort
        
  } // End of group configRsuSimulatorPort 
    
} // End of module ItsRSUsSimulator_TestSystem 
