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

namespace Isotp {

/* Prototypes of static functions */

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

/* Literal string constants */

static const unsigned char module_checksum[] = { 0x42, 0x28, 0x33, 0xe2, 0x7b, 0x11, 0xa0, 0xad, 0x1e, 0x99, 0x72, 0x44, 0x09, 0x2a, 0xac, 0x60 };

/* Global variable definitions */

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

SocketCAN__Types::SocketCAN__write__isotp__result_template a__SocketCAN__write__isotp__result(const SocketCAN__Types::SocketCAN__Result_template& p__result)
{
TTCN_Location current_location("Isotp.ttcn", 26, TTCN_Location::LOCATION_TEMPLATE, "a_SocketCAN_write_isotp_result");
SocketCAN__Types::SocketCAN__write__isotp__result_template ret_val;
ret_val.result() = p__result;
return ret_val;
}

SocketCAN__Types::SocketCAN__receive__isotp__pdu_template a__SocketCAN__receive__isotp__pdu(const INTEGER_template& p__id, const OCTETSTRING_template& , const OCTETSTRING_template& p__isotp__pdu)
{
TTCN_Location current_location("Isotp.ttcn", 32, TTCN_Location::LOCATION_TEMPLATE, "a_SocketCAN_receive_isotp_pdu");
SocketCAN__Types::SocketCAN__receive__isotp__pdu_template ret_val;
ret_val.id() = p__id;
ret_val.ifr() = ANY_VALUE;
ret_val.pdu() = p__isotp__pdu;
return ret_val;
}


/* Bodies of static functions */

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

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


} /* end of namespace */
