// 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 UnifiedDiagnosticServicestest_HH
#define UnifiedDiagnosticServicestest_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>
#include "UnifiedDiagnosticServices_Template.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 UnifiedDiagnosticServicestest {

/* Type definitions */

typedef COMPONENT MTC__CT;
typedef COMPONENT_template MTC__CT_template;

/* Function prototypes */

extern verdicttype testcase_tc__encdec__DiagnosticSessionControlRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__DiagnosticSessionControlResponse(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__ECUResetRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__ECUResetResponse(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__SecurityAccessRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__SecurityAccessResponse(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__CommunicationControlRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__CommunicationControlResponse(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__TesterPresentRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__ReadDataByIdentifierRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__ReadDataByIdentifierResponse(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__WriteDataByIdentifierRequest(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__WriteDataByIdentifierResponse(boolean has_timer, double timer_value);
extern verdicttype testcase_tc__encdec__NegativeResponseCode(boolean has_timer, double timer_value);

/* Global variable declarations */

extern const TTCN_Typedescriptor_t& MTC__CT_descr_;
extern TTCN_Module module_object;

} /* end of namespace */

#endif
