// This C++ source file was generated by the TTCN-3 compiler
// of the TTCN-3 Test Executor version CRL 113 200/6 R6A
// for Lénárd Nagy (elnrnag@elx78355y6x) on Thu Oct 24 10:29:40 2019

// Copyright (c) 2000-2019 Ericsson Telecom AB

// Do not edit this file unless you know what you are doing.

/* Including header files */

#include "UnifiedDiagnosticServices_Template.hh"

namespace UnifiedDiagnosticServices__Template {

/* Prototypes of static functions */

static void pre_init_module();
static void post_init_module();

/* Literal string constants */

static const unsigned char bs_4_bits[] = { 0 },
bs_6_bits[] = { 0 },
bs_7_bits[] = { 0 },
bs_0_bits[] = { 64 },
bs_1_bits[] = { 32 },
bs_2_bits[] = { 96 },
bs_3_bits[] = { 16 },
bs_5_bits[] = { 80 };
static const BITSTRING bs_4(1, bs_4_bits),
bs_6(2, bs_6_bits),
bs_7(7, bs_7_bits),
bs_0(7, bs_0_bits),
bs_1(7, bs_1_bits),
bs_2(7, bs_2_bits),
bs_3(7, bs_3_bits),
bs_5(7, bs_5_bits);
static const unsigned char os_0_octets[] = { 16 },
os_2_octets[] = { 17 },
os_12_octets[] = { 34 },
os_4_octets[] = { 39 },
os_6_octets[] = { 40 },
os_14_octets[] = { 46 },
os_8_octets[] = { 62 },
os_1_octets[] = { 80 },
os_3_octets[] = { 81 },
os_13_octets[] = { 98 },
os_5_octets[] = { 103 },
os_7_octets[] = { 104 },
os_15_octets[] = { 110 },
os_16_octets[] = { 127 },
os_9_octets[] = { 128, 0 },
os_10_octets[] = { 128, 1 },
os_11_octets[] = { 128, 2 };
static const OCTETSTRING os_0(1, os_0_octets),
os_2(1, os_2_octets),
os_12(1, os_12_octets),
os_4(1, os_4_octets),
os_6(1, os_6_octets),
os_14(1, os_14_octets),
os_8(1, os_8_octets),
os_1(1, os_1_octets),
os_3(1, os_3_octets),
os_13(1, os_13_octets),
os_5(1, os_5_octets),
os_7(1, os_7_octets),
os_15(1, os_15_octets),
os_16(1, os_16_octets),
os_9(2, os_9_octets),
os_10(2, os_10_octets),
os_11(2, os_11_octets);
static const unsigned char module_checksum[] = { 0x7f, 0xa0, 0xbc, 0x66, 0x30, 0x00, 0x1b, 0x64, 0x4d, 0x53, 0x23, 0x92, 0xf5, 0xb2, 0x2a, 0x2a };

/* Global variable definitions */

static UnifiedDiagnosticServices::DefaultSessionRequest_template template_t__DefaultSessionRequest;
const UnifiedDiagnosticServices::DefaultSessionRequest_template& t__DefaultSessionRequest = template_t__DefaultSessionRequest;
static UnifiedDiagnosticServices::ProgrammingSessionRequest_template template_t__ProgrammingSessionRequest;
const UnifiedDiagnosticServices::ProgrammingSessionRequest_template& t__ProgrammingSessionRequest = template_t__ProgrammingSessionRequest;
static UnifiedDiagnosticServices::ExtendedDiagnosticSessionRequest_template template_t__ExtendedDiagnosticSessionRequest;
const UnifiedDiagnosticServices::ExtendedDiagnosticSessionRequest_template& t__ExtendedDiagnosticSessionRequest = template_t__ExtendedDiagnosticSessionRequest;
static UnifiedDiagnosticServices::SafetySystemDiagnosticSessionRequest_template template_t__SafetySystemDiagnosticSessionRequest;
const UnifiedDiagnosticServices::SafetySystemDiagnosticSessionRequest_template& t__SafetySystemDiagnosticSessionRequest = template_t__SafetySystemDiagnosticSessionRequest;
static UnifiedDiagnosticServices::HardResetRequest_template template_t__HardResetRequest;
const UnifiedDiagnosticServices::HardResetRequest_template& t__HardResetRequest = template_t__HardResetRequest;
static UnifiedDiagnosticServices::KeyOffOnResetRequest_template template_t__KeyOffOnResetRequest;
const UnifiedDiagnosticServices::KeyOffOnResetRequest_template& t__KeyOffOnResetRequest = template_t__KeyOffOnResetRequest;
static UnifiedDiagnosticServices::SoftResetRequest_template template_t__SoftResetRequest;
const UnifiedDiagnosticServices::SoftResetRequest_template& t__SoftResetRequest = template_t__SoftResetRequest;
static UnifiedDiagnosticServices::EnableRapidPowerShutDownRequest_template template_t__EnableRapidPowerShutDownRequest;
const UnifiedDiagnosticServices::EnableRapidPowerShutDownRequest_template& t__EnableRapidPowerShutDownRequest = template_t__EnableRapidPowerShutDownRequest;
static UnifiedDiagnosticServices::DisableRapidPowerShutDownRequest_template template_t__DisableRapidPowerShutDownRequest;
const UnifiedDiagnosticServices::DisableRapidPowerShutDownRequest_template& t__DisableRapidPowerShutDownRequest = template_t__DisableRapidPowerShutDownRequest;
static UnifiedDiagnosticServices::HardResetResponse_template template_t__HardResetResponse;
const UnifiedDiagnosticServices::HardResetResponse_template& t__HardResetResponse = template_t__HardResetResponse;
static UnifiedDiagnosticServices::KeyOffOnResetResponse_template template_t__KeyOffOnResetResponse;
const UnifiedDiagnosticServices::KeyOffOnResetResponse_template& t__KeyOffOnResetResponse = template_t__KeyOffOnResetResponse;
static UnifiedDiagnosticServices::SoftResetResponse_template template_t__SoftResetResponse;
const UnifiedDiagnosticServices::SoftResetResponse_template& t__SoftResetResponse = template_t__SoftResetResponse;
static UnifiedDiagnosticServices::DisableRapidPowerShutDownResponse_template template_t__DisableRapidPowerShutDownResponse;
const UnifiedDiagnosticServices::DisableRapidPowerShutDownResponse_template& t__DisableRapidPowerShutDownResponse = template_t__DisableRapidPowerShutDownResponse;
static UnifiedDiagnosticServices::SendKeyResponse0_template template_t__sendKeyResponse0;
const UnifiedDiagnosticServices::SendKeyResponse0_template& t__sendKeyResponse0 = template_t__sendKeyResponse0;
static UnifiedDiagnosticServices::SendKeyResponse1_template template_t__sendKeyResponse1;
const UnifiedDiagnosticServices::SendKeyResponse1_template& t__sendKeyResponse1 = template_t__sendKeyResponse1;
static UnifiedDiagnosticServices::ReadDataByIdentifierRequest1_template template_t__ReadDataByIdentifierRequest1;
const UnifiedDiagnosticServices::ReadDataByIdentifierRequest1_template& t__ReadDataByIdentifierRequest1 = template_t__ReadDataByIdentifierRequest1;
static UnifiedDiagnosticServices::ReadDataByIdentifierRequest2_template template_t__ReadDataByIdentifierRequest2;
const UnifiedDiagnosticServices::ReadDataByIdentifierRequest2_template& t__ReadDataByIdentifierRequest2 = template_t__ReadDataByIdentifierRequest2;
static UnifiedDiagnosticServices::ReadDataByIdentifierRequest3_template template_t__ReadDataByIdentifierRequest3;
const UnifiedDiagnosticServices::ReadDataByIdentifierRequest3_template& t__ReadDataByIdentifierRequest3 = template_t__ReadDataByIdentifierRequest3;
static UnifiedDiagnosticServices::WriteDataByIdentifierResponse1_template template_t__WriteDataByIdentifierResponse1;
const UnifiedDiagnosticServices::WriteDataByIdentifierResponse1_template& t__WriteDataByIdentifierResponse1 = template_t__WriteDataByIdentifierResponse1;
static UnifiedDiagnosticServices::WriteDataByIdentifierResponse2_template template_t__WriteDataByIdentifierResponse2;
const UnifiedDiagnosticServices::WriteDataByIdentifierResponse2_template& t__WriteDataByIdentifierResponse2 = template_t__WriteDataByIdentifierResponse2;
static UnifiedDiagnosticServices::WriteDataByIdentifierResponse3_template template_t__WriteDataByIdentifierResponse3;
const UnifiedDiagnosticServices::WriteDataByIdentifierResponse3_template& t__WriteDataByIdentifierResponse3 = template_t__WriteDataByIdentifierResponse3;
TTCN_Module module_object("UnifiedDiagnosticServices_Template", __DATE__, __TIME__, module_checksum, pre_init_module, NULL, 0U, 4294967295U, 4294967295U, 4294967295U, NULL, 0LU, 0, post_init_module, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

static const RuntimeVersionChecker ver_checker(  current_runtime_version.requires_major_version_6,
  current_runtime_version.requires_minor_version_6,
  current_runtime_version.requires_patch_level_0,  current_runtime_version.requires_runtime_1);

/* Bodies of functions, altsteps and testcases */

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__diagnosticSessionControlRequestSID(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::DiagnosticSessionRequestType_template& p__diagnosticSessionType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 24, TTCN_Location::LOCATION_TEMPLATE, "t_diagnosticSessionControlRequestSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::DiagnosticSessionControlRequestSID_template& tmp_0 = ret_val.diagnosticSessionControlRequestSID();
tmp_0.sid() = os_0;
tmp_0.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_0.diagnosticSessionType() = p__diagnosticSessionType;
}
return ret_val;
}

UnifiedDiagnosticServices::DefaultSessionResponse_template t__DefaultSessionResponse(const OCTETSTRING& p__p2ServerMax, const OCTETSTRING& p__p2StarServerMax)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 37, TTCN_Location::LOCATION_TEMPLATE, "t_DefaultSessionResponse");
UnifiedDiagnosticServices::DefaultSessionResponse_template ret_val;
ret_val.diagnosticSessionType() = bs_0;
ret_val.p2ServerMax() = p__p2ServerMax;
ret_val.p2StarServerMax() = p__p2StarServerMax;
return ret_val;
}

UnifiedDiagnosticServices::ProgrammingSessionResponse_template t__ProgrammingSessionResponse(const OCTETSTRING& p__p2ServerMax, const OCTETSTRING& p__p2StarServerMax)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 43, TTCN_Location::LOCATION_TEMPLATE, "t_ProgrammingSessionResponse");
UnifiedDiagnosticServices::ProgrammingSessionResponse_template ret_val;
ret_val.diagnosticSessionType() = bs_1;
ret_val.p2ServerMax() = p__p2ServerMax;
ret_val.p2StarServerMax() = p__p2StarServerMax;
return ret_val;
}

UnifiedDiagnosticServices::ExtendedDiagnosticSessionResponse_template t__ExtendedDiagnosticSessionResponse(const OCTETSTRING& p__p2ServerMax, const OCTETSTRING& p__p2StarServerMax)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 49, TTCN_Location::LOCATION_TEMPLATE, "t_ExtendedDiagnosticSessionResponse");
UnifiedDiagnosticServices::ExtendedDiagnosticSessionResponse_template ret_val;
ret_val.diagnosticSessionType() = bs_2;
ret_val.p2ServerMax() = p__p2ServerMax;
ret_val.p2StarServerMax() = p__p2StarServerMax;
return ret_val;
}

UnifiedDiagnosticServices::SafetySystemDiagnosticSessionResponse_template t__SafetySystemDiagnosticSessionResponse(const OCTETSTRING& p__p2ServerMax, const OCTETSTRING& p__p2StarServerMax)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 55, TTCN_Location::LOCATION_TEMPLATE, "t_SafetySystemDiagnosticSessionResponse");
UnifiedDiagnosticServices::SafetySystemDiagnosticSessionResponse_template ret_val;
ret_val.diagnosticSessionType() = bs_3;
ret_val.p2ServerMax() = p__p2ServerMax;
ret_val.p2StarServerMax() = p__p2StarServerMax;
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__diagnosticSessionControlResponseSID(const UnifiedDiagnosticServices::DiagnosticSessionResponseType_template& p__diagnosticSessionType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 61, TTCN_Location::LOCATION_TEMPLATE, "t_diagnosticSessionControlResponseSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::DiagnosticSessionControlResponseSID_template& tmp_1 = ret_val.diagnosticSessionControlResponseSID();
tmp_1.sid() = os_1;
tmp_1.reserved() = bs_4;
tmp_1.diagnosticSessionType() = p__diagnosticSessionType;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__ecuResetRequestTypeSID(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::ECUResetRequestType_template& p__resetType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 94, TTCN_Location::LOCATION_TEMPLATE, "t_ecuResetRequestTypeSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::ECUResetRequestSID_template& tmp_2 = ret_val.ecuResetRequestSID();
tmp_2.sid() = os_2;
tmp_2.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_2.resetType() = p__resetType;
}
return ret_val;
}

UnifiedDiagnosticServices::EnableRapidPowerShutDownResponse_template t__EnableRapidPowerShutDownResponse(const OCTETSTRING& p__powerDownTime)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 120, TTCN_Location::LOCATION_TEMPLATE, "t_EnableRapidPowerShutDownResponse");
UnifiedDiagnosticServices::EnableRapidPowerShutDownResponse_template ret_val;
ret_val.resetType() = bs_3;
ret_val.powerDownTime() = p__powerDownTime;
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__ecuResetResponseTypeSID(const UnifiedDiagnosticServices::ECUResetResponseType_template& p__resetType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 129, TTCN_Location::LOCATION_TEMPLATE, "t_ecuResetResponseTypeSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::ECUResetResponseSID_template& tmp_3 = ret_val.ecuResetResponseSID();
tmp_3.sid() = os_3;
tmp_3.reserved() = bs_4;
tmp_3.resetType() = p__resetType;
}
return ret_val;
}

UnifiedDiagnosticServices::RequestSeedRequest0_template t__requestSeedRequest0(const OCTETSTRING& p__securityAccessDataRecord)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 142, TTCN_Location::LOCATION_TEMPLATE, "t_requestSeedRequest0");
UnifiedDiagnosticServices::RequestSeedRequest0_template ret_val;
ret_val.securityAccessType() = bs_0;
ret_val.securityAccessDataRecord() = p__securityAccessDataRecord;
return ret_val;
}

UnifiedDiagnosticServices::SendKeyRequest0_template t__sendKeyRequest0(const OCTETSTRING& p__securityKey)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 147, TTCN_Location::LOCATION_TEMPLATE, "t_sendKeyRequest0");
UnifiedDiagnosticServices::SendKeyRequest0_template ret_val;
ret_val.securityAccessType() = bs_1;
ret_val.securityKey() = p__securityKey;
return ret_val;
}

UnifiedDiagnosticServices::RequestSeedRequest1_template t__requestSeedRequest1(const OCTETSTRING& p__securityAccessDataRecord)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 152, TTCN_Location::LOCATION_TEMPLATE, "t_requestSeedRequest1");
UnifiedDiagnosticServices::RequestSeedRequest1_template ret_val;
ret_val.securityAccessType() = bs_2;
ret_val.securityAccessDataRecord() = p__securityAccessDataRecord;
return ret_val;
}

UnifiedDiagnosticServices::SendKeyRequest1_template t__sendKeyRequest1(const OCTETSTRING& p__securityKey)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 157, TTCN_Location::LOCATION_TEMPLATE, "t_sendKeyRequest1");
UnifiedDiagnosticServices::SendKeyRequest1_template ret_val;
ret_val.securityAccessType() = bs_3;
ret_val.securityKey() = p__securityKey;
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__securityAccessRequest(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::SecurityAccessRequestType_template& p__securityAccessType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 162, TTCN_Location::LOCATION_TEMPLATE, "t_securityAccessRequest");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::SecurityAccessRequestSID_template& tmp_4 = ret_val.securityAccessRequestSID();
tmp_4.sid() = os_4;
tmp_4.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_4.securityAccessType() = p__securityAccessType;
}
return ret_val;
}

UnifiedDiagnosticServices::RequestSeedResponse0_template t__requestSeedResponse0(const OCTETSTRING& p__securitySeed)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 176, TTCN_Location::LOCATION_TEMPLATE, "t_requestSeedResponse0");
UnifiedDiagnosticServices::RequestSeedResponse0_template ret_val;
ret_val.securityAccessType() = bs_0;
ret_val.securitySeed() = p__securitySeed;
return ret_val;
}

UnifiedDiagnosticServices::RequestSeedResponse1_template t__requestSeedResponse1(const OCTETSTRING& p__securitySeed)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 185, TTCN_Location::LOCATION_TEMPLATE, "t_requestSeedResponse1");
UnifiedDiagnosticServices::RequestSeedResponse1_template ret_val;
ret_val.securityAccessType() = bs_2;
ret_val.securitySeed() = p__securitySeed;
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__SecurityAccessResponseSID(const UnifiedDiagnosticServices::SecurityAccessResponseType_template& p__securityAccessType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 194, TTCN_Location::LOCATION_TEMPLATE, "t_SecurityAccessResponseSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::SecurityAccessResponseSID_template& tmp_5 = ret_val.securityAccessResponseSID();
tmp_5.sid() = os_5;
tmp_5.reserved() = bs_4;
tmp_5.securityAccessType() = p__securityAccessType;
}
return ret_val;
}

UnifiedDiagnosticServices::CommunicationType_template t__communicationType(const UnifiedDiagnosticServices::e__DisableEnable& p__disableEnable, const UnifiedDiagnosticServices::e__CommunicationMessages& p__communicationMessages)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 206, TTCN_Location::LOCATION_TEMPLATE, "t_communicationType");
UnifiedDiagnosticServices::CommunicationType_template ret_val;
ret_val.disableEnable() = p__disableEnable;
ret_val.reserved() = bs_6;
ret_val.communicationMessages() = p__communicationMessages;
return ret_val;
}

UnifiedDiagnosticServices::CommunicationControlRequestType_template t__EnableRxAndTxRequest(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::CommunicationType_template& p__communicationType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 216, TTCN_Location::LOCATION_TEMPLATE, "t_EnableRxAndTxRequest");
UnifiedDiagnosticServices::CommunicationControlRequestType_template ret_val;
{
UnifiedDiagnosticServices::EnableRxAndTxRequest_template& tmp_6 = ret_val.enableRxAndTxRequest();
tmp_6.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_6.controlType() = bs_7;
tmp_6.communicationType() = p__communicationType;
}
return ret_val;
}

UnifiedDiagnosticServices::CommunicationControlRequestType_template t__EnableRxAndDisableTxRequest(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::CommunicationType_template& p__communicationType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 226, TTCN_Location::LOCATION_TEMPLATE, "t_EnableRxAndDisableTxRequest");
UnifiedDiagnosticServices::CommunicationControlRequestType_template ret_val;
{
UnifiedDiagnosticServices::EnableRxAndDisableTxRequest_template& tmp_7 = ret_val.enableRxAndDisableTxRequest();
tmp_7.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_7.controlType() = bs_0;
tmp_7.communicationType() = p__communicationType;
}
return ret_val;
}

UnifiedDiagnosticServices::CommunicationControlRequestType_template t__DisableRxAndEnableTxRequest(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::CommunicationType_template& p__communicationType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 236, TTCN_Location::LOCATION_TEMPLATE, "t_DisableRxAndEnableTxRequest");
UnifiedDiagnosticServices::CommunicationControlRequestType_template ret_val;
{
UnifiedDiagnosticServices::DisableRxAndEnableTxRequest_template& tmp_8 = ret_val.disableRxAndEnableTxRequest();
tmp_8.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_8.controlType() = bs_1;
tmp_8.communicationType() = p__communicationType;
}
return ret_val;
}

UnifiedDiagnosticServices::CommunicationControlRequestType_template t__DisableRxAndTxRequest(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit, const UnifiedDiagnosticServices::CommunicationType_template& p__communicationType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 246, TTCN_Location::LOCATION_TEMPLATE, "t_DisableRxAndTxRequest");
UnifiedDiagnosticServices::CommunicationControlRequestType_template ret_val;
{
UnifiedDiagnosticServices::DisableRxAndTxRequest_template& tmp_9 = ret_val.disableRxAndTxRequest();
tmp_9.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_9.controlType() = bs_2;
tmp_9.communicationType() = p__communicationType;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__communicationControlRequest(const UnifiedDiagnosticServices::CommunicationControlRequestType_template& p__communicationControlRequestType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 256, TTCN_Location::LOCATION_TEMPLATE, "t_communicationControlRequest");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::CommunicationControlRequestSID_template& tmp_10 = ret_val.communicationControlRequestSID();
tmp_10.sid() = os_6;
tmp_10.communicationControlRequestType() = p__communicationControlRequestType;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__communicationControlResponse(const UnifiedDiagnosticServices::e__ControlType_template& p__controlType)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 268, TTCN_Location::LOCATION_TEMPLATE, "t_communicationControlResponse");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::CommunicationControlResponseSID_template& tmp_11 = ret_val.communicationControlResponseSID();
tmp_11.sid() = os_7;
tmp_11.reserved() = bs_4;
tmp_11.controlType() = p__controlType;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__testerPresentRequest(const UnifiedDiagnosticServices::SuppressPosRspMsgIndicationBitType& p__suppressPosRspMsgIndicationBit)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 280, TTCN_Location::LOCATION_TEMPLATE, "t_testerPresentRequest");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::TesterPresentRequestSID_template& tmp_12 = ret_val.testerPresentRequestSID();
tmp_12.sid() = os_8;
tmp_12.suppressPosRspMsgIndicationBit() = p__suppressPosRspMsgIndicationBit;
tmp_12.zero() = bs_7;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__ReadDataByIdentifierRequestSID(const UnifiedDiagnosticServices::ReadDataByIdentifierRequest_template& p__readDataByIdentifierRequest)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 308, TTCN_Location::LOCATION_TEMPLATE, "t_ReadDataByIdentifierRequestSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::ReadDataByIdentifierRequestSID_template& tmp_13 = ret_val.readDataByIdentifierRequestSID();
tmp_13.sid() = os_12;
tmp_13.readDataByIdentifierRequest() = p__readDataByIdentifierRequest;
}
return ret_val;
}

UnifiedDiagnosticServices::ReadDataByIdentifierResponse1_template t__ReadDataByIdentifierResponse1(const OCTETSTRING& p__readDataByIdentifierResponse)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 319, TTCN_Location::LOCATION_TEMPLATE, "t_ReadDataByIdentifierResponse1");
UnifiedDiagnosticServices::ReadDataByIdentifierResponse1_template ret_val;
ret_val.identifier() = os_9;
ret_val.readDataByIdentifierResponse() = p__readDataByIdentifierResponse;
return ret_val;
}

UnifiedDiagnosticServices::ReadDataByIdentifierResponse2_template t__ReadDataByIdentifierResponse2(const OCTETSTRING& p__readDataByIdentifierResponse)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 324, TTCN_Location::LOCATION_TEMPLATE, "t_ReadDataByIdentifierResponse2");
UnifiedDiagnosticServices::ReadDataByIdentifierResponse2_template ret_val;
ret_val.identifier() = os_10;
ret_val.readDataByIdentifierResponse() = p__readDataByIdentifierResponse;
return ret_val;
}

UnifiedDiagnosticServices::ReadDataByIdentifierResponse3_template t__ReadDataByIdentifierResponse3(const OCTETSTRING& p__readDataByIdentifierResponse)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 329, TTCN_Location::LOCATION_TEMPLATE, "t_ReadDataByIdentifierResponse3");
UnifiedDiagnosticServices::ReadDataByIdentifierResponse3_template ret_val;
ret_val.identifier() = os_11;
ret_val.readDataByIdentifierResponse() = p__readDataByIdentifierResponse;
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__ReadDataByIdentifierResponseSID(const UnifiedDiagnosticServices::ReadDataByIdentifierResponse_template& p__readDataByIdentifierResponse)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 334, TTCN_Location::LOCATION_TEMPLATE, "t_ReadDataByIdentifierResponseSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::ReadDataByIdentifierResponseSID_template& tmp_14 = ret_val.readDataByIdentifierResponseSID();
tmp_14.sid() = os_13;
tmp_14.readDataByIdentifierResponse() = p__readDataByIdentifierResponse;
}
return ret_val;
}

UnifiedDiagnosticServices::WriteDataByIdentifierRequest1_template t__WriteDataByIdentifierRequest1(const OCTETSTRING& p__dataRecord)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 344, TTCN_Location::LOCATION_TEMPLATE, "t_WriteDataByIdentifierRequest1");
UnifiedDiagnosticServices::WriteDataByIdentifierRequest1_template ret_val;
ret_val.identifier() = os_9;
ret_val.dataRecord() = p__dataRecord;
return ret_val;
}

UnifiedDiagnosticServices::WriteDataByIdentifierRequest2_template t__WriteDataByIdentifierRequest2(const OCTETSTRING& p__dataRecord)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 349, TTCN_Location::LOCATION_TEMPLATE, "t_WriteDataByIdentifierRequest2");
UnifiedDiagnosticServices::WriteDataByIdentifierRequest2_template ret_val;
ret_val.identifier() = os_10;
ret_val.dataRecord() = p__dataRecord;
return ret_val;
}

UnifiedDiagnosticServices::WriteDataByIdentifierRequest3_template t__WriteDataByIdentifierRequest3(const OCTETSTRING& p__dataRecord)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 354, TTCN_Location::LOCATION_TEMPLATE, "t_WriteDataByIdentifierRequest3");
UnifiedDiagnosticServices::WriteDataByIdentifierRequest3_template ret_val;
ret_val.identifier() = os_11;
ret_val.dataRecord() = p__dataRecord;
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template t__WriteDataByIdentifierRequestSID(const UnifiedDiagnosticServices::WriteDataByIdentifierRequest_template& p__writeDataByIdentifierRequest)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 359, TTCN_Location::LOCATION_TEMPLATE, "t_WriteDataByIdentifierRequestSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__requests_template ret_val;
{
UnifiedDiagnosticServices::WriteDataByIdentifierRequestSID_template& tmp_15 = ret_val.writeDataByIdentifierRequestSID();
tmp_15.sid() = os_14;
tmp_15.writeDataByIdentifierRequest() = p__writeDataByIdentifierRequest;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__WriteDataByIdentifierResponseSID(const UnifiedDiagnosticServices::WriteDataByIdentifierResponse_template& p__writeDataByIdentifierResponse)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 384, TTCN_Location::LOCATION_TEMPLATE, "t_WriteDataByIdentifierResponseSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::WriteDataByIdentifierResponseSID_template& tmp_16 = ret_val.writeDataByIdentifierResponseSID();
tmp_16.sid() = os_15;
tmp_16.writeDataByIdentifierResponse() = p__writeDataByIdentifierResponse;
}
return ret_val;
}

UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template t__NegativeResponseCodeSID(const UnifiedDiagnosticServices::e__RequestSID& p__requestSID, const UnifiedDiagnosticServices::e__ResponseCode& p__responseCode)
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 393, TTCN_Location::LOCATION_TEMPLATE, "t_NegativeResponseCodeSID");
UnifiedDiagnosticServices::TopLevelMessage__UDS__responses_template ret_val;
{
UnifiedDiagnosticServices::NegativeResponseCodeSID_template& tmp_17 = ret_val.negativeResponseCodeSID();
tmp_17.sid() = os_16;
tmp_17.requestSID() = p__requestSID;
tmp_17.responseCode() = p__responseCode;
}
return ret_val;
}


/* Bodies of static functions */

static void pre_init_module()
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 0, TTCN_Location::LOCATION_UNKNOWN, "UnifiedDiagnosticServices_Template");
UnifiedDiagnosticServices::module_object.pre_init_module();
}

static void post_init_module()
{
TTCN_Location current_location("UnifiedDiagnosticServices_Template.ttcn", 0, TTCN_Location::LOCATION_UNKNOWN, "UnifiedDiagnosticServices_Template");
UnifiedDiagnosticServices::module_object.post_init_module();
current_location.update_lineno(8);
#line 8 "UnifiedDiagnosticServices_Template.ttcn"
template_t__DefaultSessionRequest.diagnosticSessionType() = bs_0;
current_location.update_lineno(12);
#line 12 "UnifiedDiagnosticServices_Template.ttcn"
template_t__ProgrammingSessionRequest.diagnosticSessionType() = bs_1;
current_location.update_lineno(16);
#line 16 "UnifiedDiagnosticServices_Template.ttcn"
template_t__ExtendedDiagnosticSessionRequest.diagnosticSessionType() = bs_2;
current_location.update_lineno(20);
#line 20 "UnifiedDiagnosticServices_Template.ttcn"
template_t__SafetySystemDiagnosticSessionRequest.diagnosticSessionType() = bs_3;
current_location.update_lineno(74);
#line 74 "UnifiedDiagnosticServices_Template.ttcn"
template_t__HardResetRequest.resetType() = bs_0;
current_location.update_lineno(78);
#line 78 "UnifiedDiagnosticServices_Template.ttcn"
template_t__KeyOffOnResetRequest.resetType() = bs_1;
current_location.update_lineno(82);
#line 82 "UnifiedDiagnosticServices_Template.ttcn"
template_t__SoftResetRequest.resetType() = bs_2;
current_location.update_lineno(86);
#line 86 "UnifiedDiagnosticServices_Template.ttcn"
template_t__EnableRapidPowerShutDownRequest.resetType() = bs_3;
current_location.update_lineno(90);
#line 90 "UnifiedDiagnosticServices_Template.ttcn"
template_t__DisableRapidPowerShutDownRequest.resetType() = bs_5;
current_location.update_lineno(108);
#line 108 "UnifiedDiagnosticServices_Template.ttcn"
template_t__HardResetResponse.resetType() = bs_0;
current_location.update_lineno(112);
#line 112 "UnifiedDiagnosticServices_Template.ttcn"
template_t__KeyOffOnResetResponse.resetType() = bs_1;
current_location.update_lineno(116);
#line 116 "UnifiedDiagnosticServices_Template.ttcn"
template_t__SoftResetResponse.resetType() = bs_2;
current_location.update_lineno(125);
#line 125 "UnifiedDiagnosticServices_Template.ttcn"
template_t__DisableRapidPowerShutDownResponse.resetType() = bs_5;
current_location.update_lineno(181);
#line 181 "UnifiedDiagnosticServices_Template.ttcn"
template_t__sendKeyResponse0.securityAccessType() = bs_1;
current_location.update_lineno(190);
#line 190 "UnifiedDiagnosticServices_Template.ttcn"
template_t__sendKeyResponse1.securityAccessType() = bs_3;
current_location.update_lineno(293);
#line 293 "UnifiedDiagnosticServices_Template.ttcn"
template_t__ReadDataByIdentifierRequest1.identifier() = os_9;
current_location.update_lineno(298);
#line 298 "UnifiedDiagnosticServices_Template.ttcn"
template_t__ReadDataByIdentifierRequest2.identifier() = os_10;
current_location.update_lineno(303);
#line 303 "UnifiedDiagnosticServices_Template.ttcn"
template_t__ReadDataByIdentifierRequest3.identifier() = os_11;
current_location.update_lineno(369);
#line 369 "UnifiedDiagnosticServices_Template.ttcn"
template_t__WriteDataByIdentifierResponse1.identifier() = os_9;
current_location.update_lineno(374);
#line 374 "UnifiedDiagnosticServices_Template.ttcn"
template_t__WriteDataByIdentifierResponse2.identifier() = os_10;
current_location.update_lineno(379);
#line 379 "UnifiedDiagnosticServices_Template.ttcn"
template_t__WriteDataByIdentifierResponse3.identifier() = os_11;
}


} /* end of namespace */
