// This C++ header 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.

#ifndef IsobusMessageTypes_HH
#define IsobusMessageTypes_HH

#ifdef TITAN_RUNTIME_2
#error Generated code does not match with used runtime.\
 Code was generated without -R option but -DTITAN_RUNTIME_2 was used.
#endif

/* Header file includes */

#include <TTCN3.hh>

#if TTCN3_VERSION != 60600
#error Version mismatch detected.\
 Please check the version of the TTCN-3 compiler and the base library.\
 Run make clean and rebuild the project if the version of the compiler changed recently.
#endif

#ifndef LINUX
#error This file should be compiled on LINUX
#endif

namespace IsobusMessageTypes {

/* Type definitions */

typedef INTEGER INT24nb;
typedef INTEGER_template INT24nb_template;
typedef INTEGER PGN;
typedef INTEGER_template PGN_template;
typedef BITSTRING BIT21;
typedef BITSTRING_template BIT21_template;
typedef INTEGER INT2;
typedef INTEGER_template INT2_template;
typedef INTEGER INT3;
typedef INTEGER_template INT3_template;

/* Global variable declarations */

extern const TTCN_RAWdescriptor_t INT24nb_raw_;
extern const XERdescriptor_t INT24nb_xer_;
extern const TTCN_OERdescriptor_t INT24nb_oer_;
extern const TTCN_Typedescriptor_t INT24nb_descr_;
extern const XERdescriptor_t PGN_xer_;
extern const TTCN_OERdescriptor_t PGN_oer_;
extern const TTCN_Typedescriptor_t PGN_descr_;
extern const TTCN_RAWdescriptor_t BIT21_raw_;
extern const XERdescriptor_t BIT21_xer_;
extern const TTCN_OERdescriptor_t BIT21_oer_;
extern const TTCN_Typedescriptor_t BIT21_descr_;
extern const TTCN_RAWdescriptor_t INT2_raw_;
extern const XERdescriptor_t INT2_xer_;
extern const TTCN_OERdescriptor_t INT2_oer_;
extern const TTCN_Typedescriptor_t INT2_descr_;
extern const TTCN_RAWdescriptor_t INT3_raw_;
extern const XERdescriptor_t INT3_xer_;
extern const TTCN_OERdescriptor_t INT3_oer_;
extern const TTCN_Typedescriptor_t INT3_descr_;
extern TTCN_Module module_object;

} /* end of namespace */

#endif
