// 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 "Isobus_Templates.hh"

namespace Isobus__Templates {

/* Prototypes of static functions */

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

/* Literal string constants */

static const unsigned char os_0_octets[] = { 255 };
static const OCTETSTRING os_0(1, os_0_octets);
static const unsigned char module_checksum[] = { 0xf6, 0xc6, 0x13, 0x4e, 0x7a, 0x8d, 0x0e, 0x01, 0x3e, 0x61, 0xab, 0xd4, 0xb7, 0x99, 0xf2, 0xe9 };

/* Global variable definitions */

TTCN_Module module_object("Isobus_Templates", __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 */

Isobus::CAN__frame__j1939_template t__message(const BITSTRING& prio__param, const BITSTRING& res__param, const BITSTRING& dp__param, const OCTETSTRING& pf__param, const OCTETSTRING& ps__param, const OCTETSTRING& sa__param, const Isobus::AnyIsoBusPdu_template& t__can__pdu)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 10, TTCN_Location::LOCATION_TEMPLATE, "t_message");
Isobus::CAN__frame__j1939_template ret_val;
{
Isobus::J1939_template& tmp_0 = ret_val.can__j1939();
tmp_0.prio() = prio__param;
tmp_0.res() = res__param;
tmp_0.dp() = dp__param;
tmp_0.pf() = pf__param;
tmp_0.ps() = ps__param;
tmp_0.sa() = sa__param;
}
ret_val.can__pdu() = t__can__pdu;
return ret_val;
}

Isobus::CAN__frame__j1939_template t__network__message(const BITSTRING& prio__param, const BITSTRING& res__param, const BITSTRING& dp__param, const OCTETSTRING& pf__param, const OCTETSTRING& ps__param, const OCTETSTRING& sa__param, const IsobusNMMessageTypes::NetworkMessage_template& t__networkMessage)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 22, TTCN_Location::LOCATION_TEMPLATE, "t_network_message");
Isobus::CAN__frame__j1939_template ret_val;
{
Isobus::J1939_template& tmp_1 = ret_val.can__j1939();
tmp_1.prio() = prio__param;
tmp_1.res() = res__param;
tmp_1.dp() = dp__param;
tmp_1.pf() = pf__param;
tmp_1.ps() = ps__param;
tmp_1.sa() = sa__param;
}
ret_val.can__pdu().networkMessage() = t__networkMessage;
return ret_val;
}

IsobusVTMessageTypes::ECU2VT_template t__GetMemoryReqX(const INTEGER& p__memoryRequired)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 34, TTCN_Location::LOCATION_TEMPLATE, "t_GetMemoryReqX");
IsobusVTMessageTypes::ECU2VT_template ret_val;
{
IsobusVTMessageTypes::GetMemoryReq_template& tmp_2 = ret_val.getMemoryReq();
tmp_2.vtfunction() = 194;
tmp_2.reserved2() = os_0;
tmp_2.memoryRequired() = p__memoryRequired;
tmp_2.reserved7() = os_0;
tmp_2.reserved8() = os_0;
}
return ret_val;
}

Isobus::AnyIsoBusPdu_template t__ecu2vt(const IsobusVTMessageTypes::ECU2VT_template& t__Message)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 44, TTCN_Location::LOCATION_TEMPLATE, "t_ecu2vt");
Isobus::AnyIsoBusPdu_template ret_val;
ret_val.ecu2vt() = t__Message;
return ret_val;
}

Isobus::AnyIsoBusPdu_template t__vt2ecu(const IsobusVTMessageTypes::VT2ECU_template& t__Message)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 48, TTCN_Location::LOCATION_TEMPLATE, "t_vt2ecu");
Isobus::AnyIsoBusPdu_template ret_val;
ret_val.vt2ecu() = t__Message;
return ret_val;
}

Isobus::AnyIsoBusPdu_template t__GetMemoryReq__pdu(const INTEGER& p__memoryRequired)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 52, TTCN_Location::LOCATION_TEMPLATE, "t_GetMemoryReq_pdu");
Isobus::AnyIsoBusPdu_template ret_val;
ret_val.ecu2vt().getMemoryReq() = t__GetMemoryReq(p__memoryRequired);
return ret_val;
}

IsobusVTMessageTypes::ButtonActivationReq_template t__ButtonActivationReq(const IsobusVTMessageTypes::e__ButtonActivationReq__KeyAactivationCode_template& p__keyAactivationCode, const INTEGER_template& p__objectID, const INTEGER_template& p__parentObjectID, const INTEGER_template& p__buttonKeyCode)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 57, TTCN_Location::LOCATION_TEMPLATE, "t_ButtonActivationReq");
IsobusVTMessageTypes::ButtonActivationReq_template ret_val;
ret_val.vtfunction() = 1;
ret_val.keyAactivationCode() = p__keyAactivationCode;
ret_val.objectID() = p__objectID;
ret_val.parentObjectID() = p__parentObjectID;
ret_val.buttonKeyCode() = p__buttonKeyCode;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::ButtonActivationRes_template t__ButtonActivationRes(const IsobusVTMessageTypes::e__ButtonActivationRes__KeyAactivationCode_template& p__keyAactivationCode, const INTEGER_template& p__objectID, const INTEGER_template& p__parentObjectID, const INTEGER_template& p__buttonKeyCode)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 70, TTCN_Location::LOCATION_TEMPLATE, "t_ButtonActivationRes");
IsobusVTMessageTypes::ButtonActivationRes_template ret_val;
ret_val.vtfunction() = 1;
ret_val.keyAactivationCode() = p__keyAactivationCode;
ret_val.objectID() = p__objectID;
ret_val.parentObjectID() = p__parentObjectID;
ret_val.buttonKeyCode() = p__buttonKeyCode;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::PointingEventReq_template t__PointingEventReq(const INTEGER_template& p__x__position, const INTEGER_template& p__y__position, const IsobusVTMessageTypes::e__PointingEvent__touchState_template& p__touchState)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 84, TTCN_Location::LOCATION_TEMPLATE, "t_PointingEventReq");
IsobusVTMessageTypes::PointingEventReq_template ret_val;
ret_val.vtfunction() = 2;
ret_val.x__position() = p__x__position;
ret_val.y__position() = p__y__position;
ret_val.touchState() = p__touchState;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::PointingEventRes_template t__PointingEventRes(const INTEGER_template& p__x__position, const INTEGER_template& p__y__position, const IsobusVTMessageTypes::e__PointingEvent__touchState_template& p__touchState)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 96, TTCN_Location::LOCATION_TEMPLATE, "t_PointingEventRes");
IsobusVTMessageTypes::PointingEventRes_template ret_val;
ret_val.vtfunction() = 2;
ret_val.x__position() = p__x__position;
ret_val.y__position() = p__y__position;
ret_val.touchState() = p__touchState;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTSelectInputObjectReq_template t__VTSelectInputObjectReq(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::e__VTSelectInputObject__selection_template& p__selection, const BOOLEAN_template& p__objectIsOpenForDataInput, const BOOLEAN_template& p__reserved)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 108, TTCN_Location::LOCATION_TEMPLATE, "t_VTSelectInputObjectReq");
IsobusVTMessageTypes::VTSelectInputObjectReq_template ret_val;
ret_val.vtfunction() = 3;
ret_val.objectID() = p__objectID;
ret_val.selection() = p__selection;
{
IsobusVTMessageTypes::VTSelectInputObject__Bitmask_template& tmp_3 = ret_val.bitmask();
tmp_3.objectIsOpenForDataInput() = p__objectIsOpenForDataInput;
tmp_3.reserved1() = p__reserved;
tmp_3.reserved2() = p__reserved;
tmp_3.reserved3() = p__reserved;
tmp_3.reserved4() = p__reserved;
tmp_3.reserved5() = p__reserved;
tmp_3.reserved6() = p__reserved;
tmp_3.reserved7() = p__reserved;
}
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTSelectInputObjectReq__v3AndPrior_template t__VTSelectInputObjectReq__v3AndPrior(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::e__VTSelectInputObject__selection_template& p__selection)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 132, TTCN_Location::LOCATION_TEMPLATE, "t_VTSelectInputObjectReq_v3AndPrior");
IsobusVTMessageTypes::VTSelectInputObjectReq__v3AndPrior_template ret_val;
ret_val.vtfunction() = 3;
ret_val.objectID() = p__objectID;
ret_val.selection() = p__selection;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTSelectInputObjectReq__v4AndLater_template t__VTSelectInputObjectReq__v4AndLater(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::e__VTSelectInputObject__selection_template& p__selection, const IsobusVTMessageTypes::VTSelectInputObject__v4AndLater__Bitmask_template& p__bitmask)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 144, TTCN_Location::LOCATION_TEMPLATE, "t_VTSelectInputObjectReq_v4AndLater");
IsobusVTMessageTypes::VTSelectInputObjectReq__v4AndLater_template ret_val;
ret_val.vtfunction() = 3;
ret_val.objectID() = p__objectID;
ret_val.selection() = p__selection;
ret_val.bitmask() = p__bitmask;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTSelectInputObjectRes_template t__VTSelectInputObjectRes(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::e__VTSelectInputObject__selection_template& p__selection, const BOOLEAN_template& p__objectIsOpenForDataInput, const BOOLEAN_template& p__reserved)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 157, TTCN_Location::LOCATION_TEMPLATE, "t_VTSelectInputObjectRes");
IsobusVTMessageTypes::VTSelectInputObjectRes_template ret_val;
ret_val.vtfunction() = 3;
ret_val.objectID() = p__objectID;
ret_val.selection() = p__selection;
{
IsobusVTMessageTypes::VTSelectInputObject__Bitmask_template& tmp_4 = ret_val.bitmask();
tmp_4.objectIsOpenForDataInput() = p__objectIsOpenForDataInput;
tmp_4.reserved1() = p__reserved;
tmp_4.reserved2() = p__reserved;
tmp_4.reserved3() = p__reserved;
tmp_4.reserved4() = p__reserved;
tmp_4.reserved5() = p__reserved;
tmp_4.reserved6() = p__reserved;
tmp_4.reserved7() = p__reserved;
}
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTSelectInputObjectRes__v4AndPrior_template t__VTSelectInputObjectRes__v4AndPrior(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::e__VTSelectInputObject__selection_template& p__selection)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 181, TTCN_Location::LOCATION_TEMPLATE, "t_VTSelectInputObjectRes_v4AndPrior");
IsobusVTMessageTypes::VTSelectInputObjectRes__v4AndPrior_template ret_val;
ret_val.vtfunction() = 3;
ret_val.objectID() = p__objectID;
ret_val.selection() = p__selection;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTSelectInputObjectRes__v5AndLater_template t__VTSelectInputObjectRes__v5AndLater(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::e__VTSelectInputObject__selection_template& p__selection, const IsobusVTMessageTypes::VTSelectInputObject__v4AndLater__Bitmask_template& p__bitmask)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 193, TTCN_Location::LOCATION_TEMPLATE, "t_VTSelectInputObjectRes_v5AndLater");
IsobusVTMessageTypes::VTSelectInputObjectRes__v5AndLater_template ret_val;
ret_val.vtfunction() = 3;
ret_val.objectID() = p__objectID;
ret_val.selection() = p__selection;
ret_val.bitmask() = p__bitmask;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTESCReq_template t__VTESCReq(const INTEGER_template& p__objectID, const IsobusVTMessageTypes::VTESC__ErrorCodes_template& p__errorCodes)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 206, TTCN_Location::LOCATION_TEMPLATE, "t_VTESCReq");
IsobusVTMessageTypes::VTESCReq_template ret_val;
ret_val.vtfunction() = 4;
ret_val.objectID() = p__objectID;
ret_val.errorCodes() = p__errorCodes;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTESCRes_template t__VTESCRes(const INTEGER_template& p__objectID)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 218, TTCN_Location::LOCATION_TEMPLATE, "t_VTESCRes");
IsobusVTMessageTypes::VTESCRes_template ret_val;
ret_val.vtfunction() = 4;
ret_val.objectID() = p__objectID;
ret_val.reserved4() = os_0;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTChangeNumericValueReq_template t__VTChangeNumericValueReq(const INTEGER_template& p__objectID, const OCTETSTRING_template& p__value)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 229, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeNumericValueReq");
IsobusVTMessageTypes::VTChangeNumericValueReq_template ret_val;
ret_val.vtfunction() = 5;
ret_val.objectID() = p__objectID;
ret_val.reserved4() = os_0;
ret_val.value__() = p__value;
return ret_val;
}

IsobusVTMessageTypes::VTChangeNumericValueRes_template t__VTChangeNumericValueRes(const INTEGER_template& p__objectID, const OCTETSTRING_template& p__value)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 238, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeNumericValueRes");
IsobusVTMessageTypes::VTChangeNumericValueRes_template ret_val;
ret_val.vtfunction() = 5;
ret_val.objectID() = p__objectID;
ret_val.reserved4() = os_0;
ret_val.value__() = p__value;
return ret_val;
}

IsobusVTMessageTypes::VTChangeActiveMaskReq_template t__VTChangeActiveMaskReq(const INTEGER_template& p__activeMaskOrWindowMaskOrKeyGroupObjectID, const IsobusVTMessageTypes::VTChangeActiveMasErrorcodes_template& p__errorCodes, const INTEGER_template& p__objectIDcontainingError, const INTEGER_template& p__parentObjectIDofErrorObjectID)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 247, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeActiveMaskReq");
IsobusVTMessageTypes::VTChangeActiveMaskReq_template ret_val;
ret_val.vtfunction() = 6;
ret_val.activeMaskOrWindowMaskOrKeyGroupObjectID() = p__activeMaskOrWindowMaskOrKeyGroupObjectID;
ret_val.errorCodes() = p__errorCodes;
ret_val.objectIDcontainingError() = p__objectIDcontainingError;
ret_val.parentObjectIDofErrorObjectID() = p__parentObjectIDofErrorObjectID;
return ret_val;
}

IsobusVTMessageTypes::VTChangeActiveMaskRes_template t__VTChangeActiveMaskRes(const INTEGER_template& p__activeMaskObjectID)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 260, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeActiveMaskRes");
IsobusVTMessageTypes::VTChangeActiveMaskRes_template ret_val;
ret_val.vtfunction() = 6;
ret_val.activeMaskObjectID() = p__activeMaskObjectID;
ret_val.reserved4() = os_0;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTChangeSoftKeyMaskReq_template t__VTChangeSoftKeyMaskReq(const INTEGER_template& p__dataOrAlarmMaskObjectID, const INTEGER_template& p__softKeyMaskObjectID, const IsobusVTMessageTypes::VTChangeSoftKeyMaskErrorCodes_template& p__errorCodes)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 271, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeSoftKeyMaskReq");
IsobusVTMessageTypes::VTChangeSoftKeyMaskReq_template ret_val;
ret_val.vtfunction() = 7;
ret_val.dataOrAlarmMaskObjectID() = p__dataOrAlarmMaskObjectID;
ret_val.softKeyMaskObjectID() = p__softKeyMaskObjectID;
ret_val.errorCodes() = p__errorCodes;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTChangeSoftKeyMaskRes_template t__VTChangeSoftKeyMaskRes(const INTEGER_template& p__dataOrAlarmMaskObjectID, const INTEGER_template& p__softKeyMaskObjectID)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 284, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeSoftKeyMaskRes");
IsobusVTMessageTypes::VTChangeSoftKeyMaskRes_template ret_val;
ret_val.vtfunction() = 7;
ret_val.dataOrAlarmMaskObjectID() = p__dataOrAlarmMaskObjectID;
ret_val.softKeyMaskObjectID() = p__softKeyMaskObjectID;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::VTChangeStringValueReq_template t__VTChangeStringValueReq(const INTEGER_template& p__inputStringOrStringVariableObjectID, const OCTETSTRING_template& p__enteredStringValue)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 296, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeStringValueReq");
IsobusVTMessageTypes::VTChangeStringValueReq_template ret_val;
ret_val.vtfunction() = 8;
ret_val.inputStringOrStringVariableObjectID() = p__inputStringOrStringVariableObjectID;
ret_val.numberOfBytes() = p__enteredStringValue.lengthof();
ret_val.enteredStringValue() = p__enteredStringValue;
return ret_val;
}

IsobusVTMessageTypes::VTChangeStringValueRes_template t__VTChangeStringValueRes(const INTEGER_template& p__inputStringOrStringVariableObjectID)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 306, TTCN_Location::LOCATION_TEMPLATE, "t_VTChangeStringValueRes");
IsobusVTMessageTypes::VTChangeStringValueRes_template ret_val;
ret_val.vtfunction() = 8;
ret_val.reserved2() = os_0;
ret_val.reserved3() = os_0;
ret_val.inputStringOrStringVariableObjectID() = p__inputStringOrStringVariableObjectID;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::GetSupportedWidecharsReq_template t__GetSupportedWidecharsReq(const IsobusVTMessageTypes::e__Codeplane& p__codeplane, const OCTETSTRING& p__firstWideCharInInquiryRange, const OCTETSTRING& p__lastWideCharInInquiryRange)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 318, TTCN_Location::LOCATION_TEMPLATE, "t_GetSupportedWidecharsReq");
IsobusVTMessageTypes::GetSupportedWidecharsReq_template ret_val;
ret_val.vtfunction() = 193;
ret_val.codeplane() = p__codeplane;
ret_val.firstWideCharInInquiryRange() = p__firstWideCharInInquiryRange;
ret_val.lastWideCharInInquiryRange() = p__lastWideCharInInquiryRange;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::GetSupportedWidecharsRes_template t__GetSupportedWidecharsRes(const IsobusVTMessageTypes::e__Codeplane& p__codeplane, const OCTETSTRING& p__firstWideCharInInquiryRange, const OCTETSTRING& p__lastWideCharInInquiryRange, const INTEGER& p__numberOfRanges, const IsobusVTMessageTypes::WideCharRangeArray& p__wideCharRangeArray)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 327, TTCN_Location::LOCATION_TEMPLATE, "t_GetSupportedWidecharsRes");
IsobusVTMessageTypes::GetSupportedWidecharsRes_template ret_val;
ret_val.vtfunction() = 193;
ret_val.codeplane() = p__codeplane;
ret_val.firstWideCharInInquiryRange() = p__firstWideCharInInquiryRange;
ret_val.lastWideCharInInquiryRange() = p__lastWideCharInInquiryRange;
ret_val.numberOfRanges() = p__numberOfRanges;
ret_val.wideCharRangeArray() = p__wideCharRangeArray;
return ret_val;
}

IsobusVTMessageTypes::GetMemoryReq_template t__GetMemoryReq(const INTEGER& p__memoryRequired)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 340, TTCN_Location::LOCATION_TEMPLATE, "t_GetMemoryReq");
IsobusVTMessageTypes::GetMemoryReq_template ret_val;
ret_val.vtfunction() = 194;
ret_val.reserved2() = os_0;
ret_val.memoryRequired() = p__memoryRequired;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusVTMessageTypes::GetMemoryRes_template t__GetMemoryRes(const IsobusVTMessageTypes::e__GetMemoryResVersionNumber& p__versionNumber, const IsobusVTMessageTypes::e__GetMemoryResStatus& p__status)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 348, TTCN_Location::LOCATION_TEMPLATE, "t_GetMemoryRes");
IsobusVTMessageTypes::GetMemoryRes_template ret_val;
ret_val.vtfunction() = 194;
ret_val.versionNumber() = p__versionNumber;
ret_val.status() = p__status;
ret_val.reserved4() = os_0;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

Isobus::AnyIsoBusPdu_template t__WorkingSetMaintenanceReq__pdu(const IsobusVTMessageTypes::WorkingSetMaintenanceBitMask& p__bitMask, const IsobusVTMessageTypes::e__WorkingSetMaintenanceVersionNumber& p__versionNumber)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 359, TTCN_Location::LOCATION_TEMPLATE, "t_WorkingSetMaintenanceReq_pdu");
Isobus::AnyIsoBusPdu_template ret_val;
ret_val.ecu2vt().workingSetMaintenanceReq() = t__WorkingSetMaintenanceReq(p__bitMask, p__versionNumber);
return ret_val;
}

IsobusVTMessageTypes::WorkingSetMaintenanceReq_template t__WorkingSetMaintenanceReq(const IsobusVTMessageTypes::WorkingSetMaintenanceBitMask& p__bitMask, const IsobusVTMessageTypes::e__WorkingSetMaintenanceVersionNumber& p__versionNumber)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 365, TTCN_Location::LOCATION_TEMPLATE, "t_WorkingSetMaintenanceReq");
IsobusVTMessageTypes::WorkingSetMaintenanceReq_template ret_val;
ret_val.vtfunction() = 255;
ret_val.bitMask() = p__bitMask;
ret_val.versionNumber() = p__versionNumber;
ret_val.reserved4() = os_0;
ret_val.reserved5() = os_0;
ret_val.reserved6() = os_0;
ret_val.reserved7() = os_0;
ret_val.reserved8() = os_0;
return ret_val;
}

IsobusNMMessageTypes::N__SP__Response_template t__N__SP__Response(const IsobusNMMessageTypes::e__PortNumber_template& t__fromPort, const IsobusNMMessageTypes::e__PortNumber_template& t__toPort, const IsobusNMMessageTypes::N__SP__Response_requestedParametrics_template& requestedParametrics__param)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 378, TTCN_Location::LOCATION_TEMPLATE, "t_N_SP_Response");
IsobusNMMessageTypes::N__SP__Response_template ret_val;
ret_val.msgFunction() = 132;
{
IsobusNMMessageTypes::PortPair_template& tmp_5 = ret_val.portPair();
tmp_5.fromPort() = t__fromPort;
tmp_5.toPort() = t__toPort;
}
ret_val.requestedParametrics() = requestedParametrics__param;
return ret_val;
}

Isobus::AnyIsoBusPdu_template t__N__SP__Response__pdu(const IsobusNMMessageTypes::e__PortNumber_template& t__fromPort, const IsobusNMMessageTypes::e__PortNumber_template& t__toPort, const IsobusNMMessageTypes::N__SP__Response_requestedParametrics_template& t__requestedParametrics__param)
{
TTCN_Location current_location("Isobus_Templates.ttcn", 386, TTCN_Location::LOCATION_TEMPLATE, "t_N_SP_Response_pdu");
Isobus::AnyIsoBusPdu_template ret_val;
ret_val.networkMessage().n__SP__Response() = t__N__SP__Response(t__fromPort, t__toPort, t__requestedParametrics__param);
return ret_val;
}


/* Bodies of static functions */

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

static void post_init_module()
{
TTCN_Location current_location("Isobus_Templates.ttcn", 0, TTCN_Location::LOCATION_UNKNOWN, "Isobus_Templates");
Isobus::module_object.post_init_module();
}


} /* end of namespace */
