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

namespace IsobusMessageTypes {

/* Literal string constants */

static const unsigned char module_checksum[] = { 0x1a, 0x22, 0xb5, 0x85, 0xce, 0x2b, 0xc9, 0x77, 0x44, 0xc6, 0xff, 0x1c, 0xa5, 0x82, 0xcd, 0x02 };

/* Global variable definitions */

const TTCN_RAWdescriptor_t INT24nb_raw_ = {24,SG_NO,ORDER_MSB,ORDER_LSB,ORDER_LSB,ORDER_LSB,EXT_BIT_NO,ORDER_LSB,ORDER_LSB,TOP_BIT_INHERITED,0,0,0,8,0,NULL,-1,CharCoding::UNKNOWN,NULL,false};
const XERdescriptor_t       INT24nb_xer_ = { {"INT24nb>\n", "INT24nb>\n"}, {9, 9}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t INT24nb_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t INT24nb_descr_ = { "@IsobusMessageTypes.INT24nb", &INTEGER_ber_, &INT24nb_raw_, &INTEGER_text_, &INT24nb_xer_, &INTEGER_json_, &INT24nb_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       PGN_xer_ = { {"PGN>\n", "PGN>\n"}, {5, 5}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t PGN_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t PGN_descr_ = { "@IsobusMessageTypes.PGN", &INTEGER_ber_, &INT24nb_raw_, &INTEGER_text_, &PGN_xer_, &INTEGER_json_, &PGN_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const TTCN_RAWdescriptor_t BIT21_raw_ = {21,SG_NO,ORDER_LSB,ORDER_LSB,ORDER_LSB,ORDER_LSB,EXT_BIT_NO,ORDER_LSB,ORDER_LSB,TOP_BIT_INHERITED,0,0,0,8,0,NULL,21,CharCoding::UNKNOWN,NULL,false};
const XERdescriptor_t       BIT21_xer_ = { {"BIT21>\n", "BIT21>\n"}, {7, 7}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t BIT21_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t BIT21_descr_ = { "@IsobusMessageTypes.BIT21", &BITSTRING_ber_, &BIT21_raw_, NULL, &BIT21_xer_, &BITSTRING_json_, &BIT21_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const TTCN_RAWdescriptor_t INT2_raw_ = {16,SG_NO,ORDER_LSB,ORDER_LSB,ORDER_LSB,ORDER_LSB,EXT_BIT_NO,ORDER_LSB,ORDER_LSB,TOP_BIT_INHERITED,0,0,0,8,0,NULL,-1,CharCoding::UNKNOWN,NULL,false};
const XERdescriptor_t       INT2_xer_ = { {"INT2>\n", "INT2>\n"}, {6, 6}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t INT2_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t INT2_descr_ = { "@IsobusMessageTypes.INT2", &INTEGER_ber_, &INT2_raw_, &INTEGER_text_, &INT2_xer_, &INTEGER_json_, &INT2_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const TTCN_RAWdescriptor_t INT3_raw_ = {24,SG_NO,ORDER_LSB,ORDER_LSB,ORDER_LSB,ORDER_LSB,EXT_BIT_NO,ORDER_LSB,ORDER_LSB,TOP_BIT_INHERITED,0,0,0,8,0,NULL,-1,CharCoding::UNKNOWN,NULL,false};
const XERdescriptor_t       INT3_xer_ = { {"INT3>\n", "INT3>\n"}, {6, 6}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t INT3_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t INT3_descr_ = { "@IsobusMessageTypes.INT3", &INTEGER_ber_, &INT3_raw_, &INTEGER_text_, &INT3_xer_, &INTEGER_json_, &INT3_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
TTCN_Module module_object("IsobusMessageTypes", __DATE__, __TIME__, module_checksum, NULL, NULL, 0U, 4294967295U, 4294967295U, 4294967295U, NULL, 0LU, 0, NULL, 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);

} /* end of namespace */
