module ItsRSUsSimulator_TypesAndValues {
    
    // LibCommon
    import from LibCommon_BasicTypesAndValues all;
    
    // LibIts
    import from ITS_Container language "ASN.1:1997" all;
    import from CAM_PDU_Descriptions language "ASN.1:1997" all;
    import from DENM_PDU_Descriptions language "ASN.1:1997" all;
    import from MAPEM_PDU_Descriptions language "ASN.1:1997" all;
    import from SPATEM_PDU_Descriptions language "ASN.1:1997" all;
    import from IVIM_PDU_Descriptions language "ASN.1:1997" all;
    import from IVI language "ASN.1:1997" all;
    import from SSEM_PDU_Descriptions language "ASN.1:1997" all;
    import from DSRC language "ASN.1:1997" all;
    import from EfcDsrcApplication language "ASN.1:1997" all;
    
    // LibItsGeoNetworking
    import from LibItsGeoNetworking_TypesAndValues all;
    
    /**
     * @desc Data structures used to build IS messages & event for a specific RSU
     */
    group rsiSimulatordataStructures {
        
        /**
         * @desc This is the list of DENM events hosted by a single RSU
         */
        type record of DENM DENMs;
        
        /**
         * @desc This is the list of SPATEM events hosted by a single RSU
         */
        type record of SPATEM SPATEMs;
        
        /**
         * @desc TODO
         */
        type record of UInt32 SpatemRepetionDuration;
        
        /**
         * @desc Defines the list of messages to be sent by a single RSU
         * @member cam      CAM message that a RSU shall send
         * @member denms    List of DENM events that a RSU shall send
         */
        type record RsuMessagesValue {
            octetstring    beacon optional,
            CAM            cam optional,
            DENMs          denms optional,
            MAPEM          mapem optional,
            SPATEMs        spatems optional,
            IVIM           ivim optional,
            SSEM           ssem optional
        } // End of type RsuMessagesValue
        
        /**
         * @desc List of the RSU settings (for future usage (e.g. dynamic change of the RSU ID)
         */
        type record of RsuMessagesValue RsuMessagesValueList;
        
        type record DenmParmContainers { 
            ManagementContainer managementContainer,
            SituationContainer  situationContainer,
            LocationContainer   locationContainer
        } // End of type DenmParmContainers
        
        /**
         * @desc This is the list of DENM dynamic parameters for the different events hosted by a single RSU
         */
        type record of DenmParmContainers DenmParmContainersList;
        
        /**
         * @desc This is the list of DENM dynamic parameters for the different events hosted for all RSUs
         */
        type record of DenmParmContainersList DenmParmContainersListRsu;
        
    } // End of group rsiSimulatordataStructures
    
    /**
     * @desc Data structures used to set up IS messages & event according to the track configuration
     */
    group picsDataStructures {
        
        /**
         * @desc CAM setup
         */
        group camDataStructures {
            
            /**
             * @desc Describe the parameter for each CAM event
             */
            type record RsuParm {
                LongPosVector                 longPosVector,
                StationID                     stationID,
                ITS_Container.StationType     stationType,
                VehicleRole                   vehicleRole,
                GeoShape                      geoShape,
                union {
                    UInt16                    radius
                } geoParms,
                PathHistory                   pathHistory
            } // End of type CamParm
            
            /**
             * @desc List of CAM parms per RSU
             * <pre>
             *     vc_longPosVectorRsu := PICS_RSU_PARAMS[PX_RSU_ID - 1].longPosVector;
             * </pre>
             */
            type record of RsuParm RsuParmList;
            
            /**
             * @desc List of simulated vehicle positions for UC6
             */
            //type record of ReferencePosition Usecase6VehiclePositions;
            
        } // End of group camDataStructures
        
        /**
         * @desc MAPEM setup
         */
        group mapemDataStructures {
            
            /**
             * @desc Describe the parameter for each MAPEM event
             */
            type record MapemParm {
                IntersectionGeometryList intersections optional,
                RoadSegmentList          roadSegments optional
            } // End of type MapemParm
            
            /** 
             * @desc List of MAPEM parms per RSU
             * <pre>
             *     v_intersection := PICS_MAPEM_PARMS_RSUs[PX_RSU_ID - 1].intersections[v_idx];
             * </pre>
             */
            type record of MapemParm MapemParmListRsu;
            
        } // End of group mapemDataStructures
        
        /**
         * @desc SPATEM setup
         */
        group spatemDataStructures {
            /**
             * @desc Describe the parameter for each SPATEM event
             */
            type record SignalGroupParm {
                SignalGroupID         signalGroupID,
                IntersectionStateList intersections
            } // End of type SignalGroupParm
            
            /** 
             * @desc List of SignalGroup parms for one RSU
             * <pre>
             *     v_movementEvent := PICS_SPATEM_PARMS_RSU_1[v_signalGroupID].states[v_idx];
             * </pre>
             */
            type record of SignalGroupParm SignalGroupParmList;
            
            /** 
             * @desc List of all RSUs SignalGroups parms
             * <pre>
             *     v_movementEvent := PICS_SPATEM_PARMS_RSU_1[PX_RSU_ID - 1].states[v_idx];
             * </pre>
             */
            type record of SignalGroupParmList SpatemParmRsu;
            
            type record of MovementList MovementListPerIntersection;
            
            type record of MovementListPerIntersection MovementListPerIntersectionRsu;
            
        } // End of group spatemDataStructures
        
        /**
         * @desc IVIM setup
         */
        group ivimDataStructures {
            
            type record length (1 .. 8) of IviContainer IviContainers;
            
            /**
             * @desc Describe the parameter for each IVIM event
             */
            type record IvimParm {
                Provider                 provider optional,
                IviIdentificationNumber  iviIdentificationNumber optional,
                IviContainers            iviContainers optional
            } // End of type IvimParm
            
            /** 
             * @desc List of IVIM parms per RSU
             * <pre>
             *     v_provider := PICS_IVIM_PARMS_RSUs[PX_RSU_ID - 1].povider;
             * </pre>
             */
            type record of IvimParm IvimParmListRsu;
            
        } // End of group ivimDataStructures
        
        /**
         * @desc DENM setup
         */
        group denmDataStructures {
            
            /**
             * @desc Describe the parameter for each DENM event
             */
            type record DenmParm {
                ReferencePosition             eventPosition,
                CauseCodeType                 causeCodeType,
                EventHistory                  eventHistory,
                Traces                        traces,
                RoadWorksContainerExtended    roadWorksContainerExtended optional
            } // End of type DenmParm
            
            /**
             * @desc List of DENM events per use case
             * @see <wiki URL>
             * <pre>
             *     v_denmParm := PICS_DENM_PARMS_UC1_RWW[PX_ETSI_ZONE_ID - 1][vc_eventId];
             *     vc_eventId := (vc_eventId + 1) mod lengthof(PICS_DENM_PARMS_UC1_RWW)
             * </pre>
             */
            type record of DenmParm DenmEventsParmsPerZone;
            
            /**
             * @desc List of DENM events per use case
             * @see <wiki URL>
             * <pre>
             *     v_denmParm := PICS_DENM_PARMS_UC1_RWW[vc_eventId];
             *     vc_eventId := (vc_eventId + 1) mod lengthof(PICS_DENM_PARMS_UC1_RWW)
             * </pre>
             */
            type record of DenmEventsParmsPerZone DenmEventsParmsUseCase;
            
            /**
             * @desc  List of DENM events per use case and per RSUs
             * <pre>
             *     v_denmParm := PICS_DENM_EVENTS_RSU[PX_RSU_ID - 1][PX_ETSI_USE_CASE_ID - 1][vc_eventId];
             *     vc_eventId := (vc_eventId + 1) mod lengthof(PICS_DENM_EVENTS_RSU[PX_RSU_ID - 1][PX_ETSI_USE_CASE_ID - 1])
             * </pre>
             */
            type record of DenmEventsParmsUseCase DenmEventsParmsUseCaseRsu;
            
        } // End of group denmDataStructures
        
    } // End of group picsDataStructures
    
} // End of module ItsRSUsSimulator_TypesAndValues