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;
        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;
        
    } // 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 { };
        
        type charstring CfEvent;
        
        type boolean CfResult;
        
        type union CfEventInd {
            anytype empty
        }
                
    } with {
        encode "ConfigTester"
    }// End of group configRsuSimulatorTypes 
    
    group configRsuSimulatorPort {
        
        
        /**
         * @desc Configuration RSUsimulator port
         */
        type port ConfigRsuSimulatorPort message {
            out 
                CfInitialize, CfResult; 
            in 
                CfEvent, CfEventInd
        } // End of ConfigRsuSimulatorPort
        
    } // End of group configRsuSimulatorPort 
    
} // End of module ItsRSUsSimulator_TestSystem 