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

namespace CAN__matrix__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[] = { 0, 0, 1, 39 };
static const OCTETSTRING os_0(4, os_0_octets);
static const unsigned char module_checksum[] = { 0x73, 0xda, 0x2e, 0xbd, 0x00, 0xb7, 0xfa, 0x8a, 0x3b, 0x04, 0x1a, 0xfc, 0x10, 0x66, 0x1b, 0xdf };

/* Global variable definitions */

TTCN_Module module_object("CAN_matrix_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 */

CAN__matrix__messages::CAN__MatrixUnion_template t__message__Frame5__2__parm(const INTEGER& parameter1, const INTEGER& parameter2)
{
TTCN_Location current_location("CAN_matrix_templates.ttcn", 23, TTCN_Location::LOCATION_TEMPLATE, "t_message_Frame5_2_parm");
CAN__matrix__messages::CAN__MatrixUnion_template ret_val;
ret_val.can__id() = os_0;
{
CAN__matrix__messages::CAN__MESSAGE__TESTFRAME5__msg__type_template& tmp_0 = ret_val.can__pdu().message__MyTestframe5();
tmp_0.test__unsig__9__bit__2__padded__integer__big__endian__coded() = parameter1;
tmp_0.test__sig__5__bit__integer__big__endian__coded() = parameter2;
}
return ret_val;
}


/* Bodies of static functions */

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

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


} /* end of namespace */
