module ItsAutoInterop_Templates {
    
  // 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 IEEE1609dot2BaseTypes language "ASN.1:1997" all;
  import from IEEE1609dot2 language "ASN.1:1997" all;
  import from EtsiTs103097Module language "ASN.1:1997" all;
    
    
  // LibItsCommon
  import from LibCommon_DataStrings all;
  import from LibItsExternal_TypesAndValues all;
    
  // LibItsGeoNetworking
  import from LibItsGeoNetworking_TestSystem all;
  import from LibItsGeoNetworking_Templates all;
  import from LibItsGeoNetworking_TypesAndValues all;
    
  // LibItsBtp
  import from LibItsBtp_Templates all;
    
  // LibItsCam
  import from LibItsCam_Templates all;
    
  // LibItsDenm
  import from LibItsDenm_Templates all;
    
  // LibItsSecurity
  import from LibItsSecurity_TypesAndValues all;
    
  // ItsInterop
  import from ItsAutoInterop_TypesAndValues all;
  import from ItsAutoInterop_Pics all;
  import from ItsAutoInterop_TestSystem all;
    
  group eutGeoNetworkingTemplates {
        
    /**
     * @desc    Re-send template for inter-EUT message exchanges
     * @param   p_geoNetworkingInd GeoNetworking message indication received on GeoNetworking protocol port
     */
    template (value) EutGeoNetworking m_forward_geoNetworkingInd(
                                                                 in template (value) GeoNetworkingInd p_geoNetworkingInd
                                                                 ) := {
    msg                     := valueof(p_geoNetworkingInd.msgIn),
    macDestinationAddress   := valueof(p_geoNetworkingInd.macDestinationAddress),
    ssp                     := omit,
    its_aid                 := omit
    } // End of template m_forward_geoNetworkingInd
        
    /**
     * @desc    Receive template for EUT GeoNetworking packet (GeonetworkingPort Primitive)
     * @param   p_geoNwMsg GeoNetworking packet to be received
     */
    template (present) EutGeoNetworking mw_eutGeoNwInd(
                                                       template (present) GeoNetworkingPdu p_geoNwMsg
                                                       ) := {
    msg                     := p_geoNwMsg,
    macDestinationAddress   := ?,
    ssp                     := *,
    its_aid                 := *
    } // End of template mw_eutGeoNwInd
        
    /**
     * @desc    Receive template for EUT GeoNetworking packet (GeonetworkingPort Primitive)
     * @param   p_geoNwMsg              GeoNetworking packet to be received
     * @param   p_llDestinationAdress   Link-layer destination address
     */
    template(present)  EutGeoNetworking mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                template (present) GeoNetworkingPdu p_geoNwMsg,
                                                                                template (present) MacAddress p_llDestinationAdress
                                                                                ) modifies mw_eutGeoNwInd := {
    macDestinationAddress := p_llDestinationAdress
    } // End of template mw_eutGeoNwInd_withLinkLayerDestination
        
  } // End of group eutGeoNetworkingTemplates
    
  group geoNetworkingTemplates {
        
    /**
     * @desc    Conversion template from ThreeDLocation to LongPosVector for distance calculus
     * @param   p_position ThreeDLocation 
     */
    template (value) LongPosVector m_longPosVector(
                                                   in template (value) ThreeDLocation p_position
                                                   ) modifies m_dummyLongPosVector := {
    latitude    := valueof(p_position.latitude),
    longitude   := valueof(p_position.longitude)
    } // End of template mw_denm_stationId
        
    /**
     * @desc    Dummy template for long position vector
     */
    template (present) LongPosVector mw_dummyLongPosVector := {
    gnAddr := mw_gnAddressMid(?),
    timestamp_ := ?,
    latitude := ?,
    longitude := ?,
    pai := ?,
    speed := ?,
    heading := ?
    }
        
    /**
     * @desc    Receive template for the destinationArea which indicates the TARGET_GEOAREA
     * @param   p_gnAddress GN_Address to be contained in the long position vector
     */
    template (present) LongPosVector mw_longPosVector( 
                                                      template (value) ThreeDLocation p_position
                                                       ) modifies mw_dummyLongPosVector := { // TODO use mw_longPosVectorAny instead of mw_dummyLongPosVector
    latitude    := valueof(p_position.latitude),
    longitude   := valueof(p_position.longitude)
    } // End of template mw_longPosVector
        
    /**
     * @desc    Receive template for GeoNetworking CAM Packet
     * @param   p_sourceLongPosVec    Source position vector of destination
     * @param   p_hopLimit            Sequence number of GeoUnicast packet
     * @param   p_nextHeader          Expected next header
     * @param   p_cam                 Expected CA message 
     */
    template (present) GnNonSecuredPacket mw_geoNwShbPacketWithNextHeaderAndPayload(
                                                                                    template (present) LongPosVector p_sourceLongPosVec := ?,
                                                                                    template (present) UInt8 p_hopLimit := ?,
                                                                                    template (present) NextHeader p_nextHeader := ?,
                                                                                    template (present) octetstring p_payload := ?
                                                                                    ) modifies mw_geoNwShbPacket := {
    commonHeader := mw_commonHeaderWithHopLimit(
                                                p_nextHeader,
                                                m_shbHeaderType,
                                                p_hopLimit
                                                ),
    payload := p_payload
    } // End of template mw_geoNwShbPacketWithNextHeaderAndPayload
        
  } // End of group geoNetworkingTemplates
    
  group camTemplates {
        
    /**
     * @desc    Receive template for CAM station ID
     * @param   p_basicVehicleContainer CA basic vehicle container
     * @param   p_stationId             Vehicle station ID
     * @param   p_referencePosition     Expected reference position
     */
    template (present) CAM mw_cam_stationId(
                                            template (present) BasicVehicleContainerHighFrequency p_basicVehicleContainer := mw_HF_BV_speed(?),
                                            template (present) StationID p_stationId := ?,
                                            template (present) ReferencePosition p_referencePosition := ?
                                            ) modifies mw_camMsg_HF_BV := {
    header := {
      stationID := p_stationId
    }, 
    cam := {
      camParameters := {
        basicContainer := {
          stationType := ?,
          referencePosition := p_referencePosition
        }
      }
    }
    } // End of template mw_cam_stationId
        
  } // End of group camTemplates
    
  group denmTemplates {
        
    /**
     * @desc    Receive template for DENM station ID
     * @param   p_stationId Vehicle station ID
     * @param   p_denm      Expected DENM packet
     */
    template (present) DENM mw_denm_stationId(
                                              template (present) StationID p_stationId := ?,
                                              template (present) DecentralizedEnvironmentalNotificationMessage p_denm := ?
                                              ) := mw_denmPdu(p_denm, p_stationId); // End of template mw_denm_stationId
        
    /**
     * @desc    Receive template for Management Container
     * @param   p_actionID              The expected action id
     * @param   p_referenceTime         The reference time (Default: any)
     * @param   p_isNegation            The expected negation flag (Default: false)
     * @param   p_validityDuration      The expected validity duration (Default: any or omit)
     * @param   p_transmissionInterval  The expected transmission interval (Default: any or omit)
     */
    template (present) ManagementContainer mw_denmMgmtCon_with_relevances(
                                                                          template (present) ActionID p_actionID := ?,
                                                                          template (present) ITS_Container.StationType p_stationType := ?,
                                                                          template (present) TimestampIts p_referenceTime := ?,
                                                                          template ValidityDuration p_validityDuration := *, // In ASN.1, a DEFAULT value constraint could be replaced by an omit
                                                                          template TransmissionInterval p_transmissionInterval := *,
                                                                          template Termination p_termination := *,
                                                                          template (present) RelevanceDistance p_relevanceDistance := ?,
                                                                          template (present) RelevanceTrafficDirection p_relevanceTrafficDirection := ?,
                                                                          template (present) ReferencePosition p_eventPosition := ?
                                                                          ) modifies mw_denmMgmtCon := {
    eventPosition               := p_eventPosition,
    relevanceDistance           := p_relevanceDistance,
    relevanceTrafficDirection   := p_relevanceTrafficDirection
    } // End of tamplate mw_denmMgmtCon_with_relevances
        
    /**
     * @desc    Receive template for Management Container
     * @param   p_actionID              The expected action id
     * @param   p_referenceTime         The reference time (Default: any)
     * @param   p_isNegation            The expected negation flag (Default: false)
     * @param   p_validityDuration      The expected validity duration (Default: any or omit)
     * @param   p_transmissionInterval  The expected transmission interval (Default: any or omit)
     */
    template (present) ManagementContainer mw_denmMgmtCon_with_relevances_position(
                                                                                   template (present) ActionID p_actionID := ?,
                                                                                   template (present) ITS_Container.StationType p_stationType := ?,
                                                                                   template (present) TimestampIts p_referenceTime := ?,
                                                                                   template ValidityDuration p_validityDuration := *, // In ASN.1, a DEFAULT value constraint could be replaced by an omit
                                                                                   template TransmissionInterval p_transmissionInterval := *,
                                                                                   template Termination p_termination := *,
                                                                                   template (present) ReferencePosition p_eventPosition := ?
                                                                                   ) modifies mw_denmMgmtCon := {
    eventPosition               := p_eventPosition
    } // End of tamplate mw_denmMgmtCon_with_relevances_position
        
    /**
     * @desc    Receive template for the test system position
     * @param   p_longitude The longitude (Default: Test system's longitude)
     * @param   p_latitude  The latitude (Default: Test system's latitude)
     * @see     m_posConfidenceEllipse
     * @see     m_elevation
     */
    template (present) ReferencePosition mw_referencePosition(
                                                              template (present) ThreeDLocation p_location := ?
                                                              ) := {
    latitude := p_location.latitude,
    longitude := p_location.longitude,
    positionConfidenceEllipse := ?,
    altitude := ? // FIXME Create a convertion function SecElevation to intteger for p_location.elevation
    } // End of tamplate mw_referencePosition
        
  } // End of group denmTemplates
    
  group hmiPrimitiveTemplates {
        
    /**
     * @desc Initializes the EUT's HMI.
     */
    template (value) HmiInitialize m_hmiInitialize := {
    hashedId8 := '0000000000000000'O
    }
        
    /**
     * @desc    Value template for NeighborEventInd matching
     * @param   p_mid       MID value
     * @param   p_stationId Vehicle station ID
     */
    template (value) HmiNeighborEventInd m_hmiNeighborEventInd(
                                                               in Oct6    p_mid,
                                                               in UInt32  p_stationId 
                                                               ) := {
    mid         := p_mid,
    stationId   := p_stationId
    } // End of template m_hmiNeighborEventInd
        
    /**
     * @desc    Value template for NeighborEventInd matching
     * @param   p_mid       MID value
     * @param   p_stationId Vehicle station ID
     */
    template (present) HmiNeighborEventInd mw_hmiNeighborEventInd(
                                                                  template (present) Oct6    p_mid := ?,
                                                                  template (present) UInt32  p_stationId := ? 
                                                                  ) := {
    mid         := p_mid,
    stationId   := p_stationId
    } // End of template mw_hmiNeighborEventInd
        
    /**
     * @desc    Received indication generic template HMI indications
     */
    template (present) HmiSignageEventInd mw_hmiSignageEventInd := {
    countryCode                             := ?,
    trafficSignPictogramClass               := *,
    trafficSignPictogramNature              := *, 
    ambientOrRoadConditionPictogramClass    := *,
    ambientOrRoadConditionPictogramNature   := *
    } // End of template mw_hmiSignageEventInd
        
    /**
     * @desc    Received indication template for Road Work Warning/Speed limit
     */
    template (present) HmiSignageEventInd mw_hmiSignageEventInd_roadworks_limitedspeed(
                                                                                       template (present) integer p_seed := 30
                                                                                       ) modifies mw_hmiSignageEventInd := {
    ambientOrRoadConditionPictogramClass    := e_roadCondition,
    ambientOrRoadConditionPictogramNature   := (1..9)
    } // End of template mw_hmiSignageEventInd_roadworks_limitedspeed
        
    /**
     * @desc    Received indication template for Road Hazard Signals
     */
    template (present) HmiSignageEventInd mw_hmiSignageEventInd_roadHazardSignal modifies mw_hmiSignageEventInd := {
    ambientOrRoadConditionPictogramClass    := e_roadCondition,
    ambientOrRoadConditionPictogramNature   := (1..9)
    } // End of template mw_hmiSignageEventInd_roadHazardSignal
        
    /**
     * @desc    Received indication template for Stationary Vehicle Information
     */
    template (present) HmiSignageEventInd mw_hmiSignageEventInd_stationaryVehicleWarning modifies mw_hmiSignageEventInd := {
    ambientOrRoadConditionPictogramClass    := e_roadCondition,
    ambientOrRoadConditionPictogramNature   := (1..9)
    } // End of template mw_hmiSignageEventInd_stationaryVehicleWarning
        
    /**
     * @desc    Received indication template for Forward Collision Risk
     */
    template (present) HmiSignageEventInd mw_hmiSignageEventInd_forwardCollisionRisk modifies mw_hmiSignageEventInd := {
    trafficSignPictogramClass               := e_dangerWarning,
    trafficSignPictogramNature              := (1..9)
    } // End of template mw_hmiSignageEventInd_forwardCollisionRisk
        
    /**
     * @desc    Received indication template for Lateral Collision Risk
     */
    template (present) HmiSignageEventInd mw_hmiSignageEventInd_lateralCollisionRisk modifies mw_hmiSignageEventInd := {
    trafficSignPictogramClass               := e_dangerWarning,
    trafficSignPictogramNature              := (1..9)
    } // End of template mw_hmiSignageEventInd_lateralCollisionRisk
        
  } // End of group hmiPrimitiveTemplates
    
  group utPrimitiveTemplates {
        
  } // End of group utPrimitiveTemplates
    
} // End of module ItsAutoInterop_Templates
