#ifndef __CAN_DRV_EX_H__
#define __CAN_DRV_EX_H__


#ifdef __cplusplus
  extern "C" {
#endif

#define ERR_NO_CAN_DRIVER_LOAD -1000000


#define DEV_LIST_SHOW_TCAN_ONLY 0x01
#define DEV_LIST_SHOW_UNCONNECT 0x02

/***************************************************************/
/* Define Makros                                               */
/***************************************************************/
#define CAN_FEATURE_LOM          0x0001  // Silent Mode (LOM = Listen only Mode)
#define CAN_FEATURE_ARD          0x0002  // Automatic Retransmission disable
#define CAN_FEATURE_TX_ACK       0x0004  // TX ACK (Gesendete Nachrichten bestätigen)
#define CAN_FEATURE_ERROR_MSGS   0x0008  // Error Messages Support
#define CAN_FEATURE_FD_HARDWARE  0x0010  // CAN-FD Hardware
#define CAN_FEATURE_FIFO_OV_MODE 0x0020  // FIFO OV Mode (Auto Clear, OV CAN Messages)
#define CAN_FEATURE_ECU_FLASH    0x0040  // Hardware beschleunigung für ISO-TP ECU-Flash programmierung
#define CAN_FEATURE_CAN_TEST     0x4000  // Tiny-CAN Tester Firmware
#define CAN_FEATURE_HW_TIMESTAMP 0x8000  // Hardware Time Stamp

// (V)alue (T)ype
#define VT_BYTE         0x01
#define VT_UBYTE        0x02
#define VT_WORD         0x03
#define VT_UWORD        0x04
#define VT_LONG         0x05
#define VT_ULONG        0x06

#define VT_BYTE_ARRAY   0x07
#define VT_UBYTE_ARRAY  0x08
#define VT_WORD_ARRAY   0x09
#define VT_UWORD_ARRAY  0x0A
#define VT_LONG_ARRAY   0x0B
#define VT_ULONG_ARRAY  0x0C

#define VT_BYTE_RANGE_ARRAY   0x0D
#define VT_UBYTE_RANGE_ARRAY  0x0E
#define VT_WORD_RANGE_ARRAY   0x0F
#define VT_UWORD_RANGE_ARRAY  0x10
#define VT_LONG_RANGE_ARRAY   0x11
#define VT_ULONG_RANGE_ARRAY  0x12

#define VT_HBYTE  0x40
#define VT_HWORD  0x41
#define VT_HLONG  0x42

#define VT_STREAM    0x80
#define VT_STRING    0x81
#define VT_POINTER   0x82
#define VT_REVISION  0x83
#define VT_DATE      0x84

// MHS (EV)ent (S)ource
#define MHS_EVS_STATUS  1
#define MHS_EVS_PNP     2
#define MHS_EVS_OBJECT  3

#define MHS_EVS_DIN     4
#define MHS_EVS_ENC     5
#define MHS_EVS_KEY     6


#define MHS_TERMINATE 0x80000000


// <*> neu
#define CAN_DATA_ST_IDLE             0
#define CAN_DATA_ST_RUN              1
#define CAN_DATA_ST_FINISH           2
#define CAN_DATA_ST_ERR_ACK_TIMEOUT  -1
#define CAN_DATA_ST_ERR_NACK         -2
#define CAN_DATA_ST_ERR_OVERFLOW     -3     
#define CAN_DATA_ST_ERR_ISOTP        -4

// ISO-TP Flags
#define CAN_DATA_ISOTP_29BIT_ID      0x01
#define CAN_DATA_ISOTP_EXTEND_ADDR   0x02
#define CAN_DATA_ISOTP_TX_PADDING    0x04
#define CAN_DATA_ISOTP_LISTEN_MODE   0x08


// <*> neu
#define TCAN_INFO_KEY_HW_SNR         0x00000000  // Hardware Snr
#define TCAN_INFO_KEY_HW_ID_STR      0x00000001  // Hardware ID String 
#define TCAN_INFO_KEY_HW_BIOS_STR    0x00000002  // Bios ID String
#define TCAN_INFO_KEY_HW_REVISION    0x00000003  // Hardware Revision    
#define TCAN_INFO_KEY_HW_DATE        0x00000004  // Fertigungsdatum
#define TCAN_INFO_KEY_HW_VARIANT_STR 0x00000005  // Hardware Variante  

#define TCAN_INFO_KEY_HW_CAN_COUNT   0x00008000 // Anzahl CAN Interfaces   
#define TCAN_INFO_KEY_HW_CAN_DRV     0x00008010 // Treiber              
#define TCAN_INFO_KEY_HW_CAN_OPTO    0x00008020 // Opto                 
#define TCAN_INFO_KEY_HW_CAN_TERM    0x00008030 // Term                 
#define TCAN_INFO_KEY_HW_CAN_HS      0x00008040 // HighSpeed                
#define TCAN_INFO_KEY_HW_I2C_CNT     0x00008100 // Anzahl I2C Interfaces
#define TCAN_INFO_KEY_HW_SPI_CNT     0x00008200 // Anzahl SPI Interfaces   

#define TCAN_INFO_KEY_FW_ID          0x00001000  // ID                   
#define TCAN_INFO_KEY_FW_ID_STR      0x00001001  // ID String            
#define TCAN_INFO_KEY_FW_VERSION     0x00001002  // Version              
#define TCAN_INFO_KEY_FW_VERSION_STR 0x00001003  // Version String       
#define TCAN_INFO_KEY_FW_AUTOR       0x00001004  // Autor                
#define TCAN_INFO_KEY_FW_OPTIOS      0x00001005  // Optionen             
#define TCAN_INFO_KEY_FW_SNR         0x00001006  // Snr                            

#define TCAN_INFO_KEY_FW_CAN_FLAGS   0x00008001 // CAN Features Flags 
#define TCAN_INFO_KEY_FW_CAN_FLAGS2  0x00008002 // CAN Features Flags2 // <*>
#define TCAN_INFO_KEY_FW_CAN_CLOCK1  0x00008003
#define TCAN_INFO_KEY_FW_CAN_CLOCK2  0x00008004
#define TCAN_INFO_KEY_FW_CAN_CLOCK3  0x00008005
#define TCAN_INFO_KEY_FW_CAN_CLOCK4  0x00008006
#define TCAN_INFO_KEY_FW_CAN_CLOCK5  0x00008007
#define TCAN_INFO_KEY_FW_CAN_CLOCK6  0x00008008
#define TCAN_INFO_KEY_FW_PUFFER_CNT  0x00008050 // Anzahl Interval Puffer
#define TCAN_INFO_KEY_FW_FILTER_CNT  0x00008060 // Anzahl Filter    

#define TCAN_INFO_KEY_OPEN_INDEX     0x01000001
#define TCAN_INFO_KEY_HARDWARE_ID    0x01000002
#define TCAN_INFO_KEY_HARDWARE       0x01000003
#define TCAN_INFO_KEY_VENDOR         0x01000004

#define TCAN_INFO_KEY_DEVICE_NAME    0x01000005
#define TCAN_INFO_KEY_SERIAL_NUMBER  0x01000006

#define TCAN_INFO_KEY_CAN_FEATURES   0x01000007
#define TCAN_INFO_KEY_CAN_CHANNELS   0x01000008
#define TCAN_INFO_KEY_RX_FILTER_CNT  0x01000009 
#define TCAN_INFO_KEY_TX_BUFFER_CNT  0x0100000A
#define TCAN_INFO_KEY_CAN_CLOCKS     0x0100000B
#define TCAN_INFO_KEY_CAN_CLOCK1     0x0100000C
#define TCAN_INFO_KEY_CAN_CLOCK2     0x0100000D
#define TCAN_INFO_KEY_CAN_CLOCK3     0x0100000E
#define TCAN_INFO_KEY_CAN_CLOCK4     0x0100000F
#define TCAN_INFO_KEY_CAN_CLOCK5     0x01000010
#define TCAN_INFO_KEY_CAN_CLOCK6     0x01000011


#define TCAN_INFO_KEY_API_VERSION   0x02000001
#define TCAN_INFO_KEY_DLL           0x02000002
#define TCAN_INFO_KEY_CFG_APP       0x02000003

/***************************************************************/
/*  Typen                                                      */
/***************************************************************/
#pragma pack(push, 1)
struct TModulFeatures
  {
  uint32_t CanClock;           // Clock-Frequenz des CAN-Controllers, muss nicht mit
                               // der Clock-Frequenz des Mikrocontrollers übereinstimmen
  uint32_t Flags;              // Unterstützte Features des Moduls:
                               //  Bit  0 -> Silent Mode (LOM = Listen only Mode)
                               //       1 -> Automatic Retransmission disable
                               //       2 -> TX ACK (Gesendete Nachrichten bestätigen)
                               //      15 -> Hardware Time Stamp
  uint32_t CanChannelsCount;   // Anzahl der CAN Schnittstellen, reserviert für
                               // zukünftige Module mit mehr als einer Schnittstelle
  uint32_t HwRxFilterCount;    // Anzahl der zur Verfügung stehenden Receive-Filter
  uint32_t HwTxPufferCount;    // Anzahl der zur Verfügung stehenden Transmit Puffer mit Timer
  };
#pragma pack(pop)

#pragma pack(push, 1)
struct TCanDevicesList
  {
  uint32_t TCanIdx;            // Ist das Device geöffnet ist der Wert auf dem Device-Index
                               // gesetzt, ansonsten ist der Wert auf "INDEX_INVALID" gesetzt.
  uint32_t HwId;               // Ein 32 Bit Schlüssel der die Hardware eindeutig Identifiziert.
                               // Manche Module müssen erst geöffnet werden damit dieser Wert
                               // gesetzt wird
  char DeviceName[255];        // Nur Linux: entspricht den Device Namen des USB-Devices,
                               //            z.B. /dev/ttyUSB0
  char SerialNumber[16];       // Seriennummer des Moduls
  char Description[64];                 // Modul Bezeichnung, z.B. "Tiny-CAN IV-XL",
                                        // muss in den USB-Controller programmiert sein,
                                        // was zur Zeit nur bei den Modulen Tiny-CAN II-XL,
                                        // IV-XL u. M1 der Fall ist.
  struct TModulFeatures ModulFeatures;  // Unterstützte Features des Moduls, nur gültig
                                        // wenn HwId > 0
  };
#pragma pack(pop)

#pragma pack(push, 1)
struct TCanDeviceInfo
  {
  uint32_t HwId;               // Ein 32 Bit Schlüssel der die Hardware eindeutig Identifiziert.
  uint32_t FirmwareVersion;    // Version der Firmware des Tiny-CAN Moduls
  uint32_t FirmwareInfo;       // Informationen zum Stand der Firmware Version
                               //   0 = Unbekannt
                               //   1 = Firmware veraltet, Device kann nicht geöffnet werden
                               //   2 = Firmware veraltet, Funktionsumfang eingeschränkt
                               //   3 = Firmware veraltet, keine Einschränkungen
                               //   4 = Firmware auf Stand
                               //   5 = Firmware neuer als Erwartet
  char SerialNumber[16];       // Seriennummer des Moduls
  char Description[64];        // Modul Bezeichnung, z.B. "Tiny-CAN IV-XL"
  struct TModulFeatures ModulFeatures; // Unterstützte Features des Moduls
  };
#pragma pack(pop)


#pragma pack(push, 1)
struct TCanInfoVar   // <*> geändert von TInfoVar in TCanInfoVar
  {
  uint32_t Key;      // Variablen Schlüssel
  uint32_t Type;     // Variablen Type
  uint32_t Size;     // (Max)Größe der Variable in Byte
  char Data[255];    // Wert der Variable
  };
#pragma pack(pop)

#pragma pack(push, 1)
struct TCanInfoVarList
  {
  uint32_t Size;
  struct TCanInfoVar *List;
  };
#pragma pack(pop)

typedef struct _TMhsEvent TMhsEvent;

#pragma pack(push, 1)
struct _TMhsEvent
  {
  volatile uint32_t Events;
  volatile uint32_t EventsMask;
  volatile int32_t Waiting;
#ifdef __WIN32__
// ****** Windows
  uint32_t WinEventCount;
  HANDLE WinEvent[3];
  CRITICAL_SECTION EventLock;
#else
// ****** Linux
  pthread_cond_t Cond;
  pthread_mutex_t Mutex;
#endif
  };
#pragma pack(pop)

/***************************************************************/
/*  Callback Funktionstypen                                    */
/***************************************************************/
typedef int32_t (DRV_CALLBACK_TYPE *TCanGetDataBlockCB)(uint8_t *tx_data, uint16_t tx_limit, void *user_data);

#ifdef CAN_API_TRUE_FUNC

int32_t CanExGetDeviceCount(int32_t flags);
int32_t CanExGetDeviceList(struct TCanDevicesList **devices_list, int32_t flags);
int32_t CanExGetDeviceListPerform(int32_t flags);
int32_t CanExGetDeviceListGet(struct TCanDevicesList *item);

int32_t CanExGetDeviceInfo(uint32_t index, struct TCanDeviceInfo *device_info,
  struct TCanInfoVar **hw_info, uint32_t *hw_info_size);
int32_t CanExGetDeviceInfoPerform(uint32_t index, struct TCanDeviceInfo *device_info);
int32_t CanExGetDeviceInfoGet(struct TCanInfoVar *item);
void CanExDataFree(void **data);
int32_t CanExCreateDevice(uint32_t *index, char *options);
int32_t CanExDestroyDevice(uint32_t *index);
int32_t CanExCreateFifo(uint32_t index, uint32_t size, TMhsEvent *event_obj, uint32_t event, uint32_t channels);
int32_t CanExBindFifo(uint32_t fifo_index, uint32_t device_index, uint32_t bind);
TMhsEvent *CanExCreateEvent(void);
int32_t CanExSetObjEvent(uint32_t index, uint32_t source, TMhsEvent *event_obj, uint32_t event);
void CanExSetEvent(TMhsEvent *event_obj, uint32_t event);
void CanExSetEventAll(uint32_t event);
void CanExResetEvent(TMhsEvent *event_obj, uint32_t event);
uint32_t CanExWaitForEvent(TMhsEvent *event_obj, uint32_t timeout);
int32_t CanExInitDriver(char *options);
int32_t CanExSetOptions(uint32_t index, char *options);
int32_t CanExSetAsByte(uint32_t index, const char *name, char value);
int32_t CanExSetAsWord(uint32_t index, const char *name, int16_t value);
int32_t CanExSetAsLong(uint32_t index, const char *name, int32_t value);
int32_t CanExSetAsUByte(uint32_t index, const char *name, unsigned char value);
int32_t CanExSetAsUWord(uint32_t index, const char *name, uint16_t value);
int32_t CanExSetAsULong(uint32_t index, const char *name, uint32_t value);
int32_t CanExSetAsString(uint32_t index, const char *name, char *value);
int32_t CanExGetAsByte(uint32_t index, const char *name, char *value);
int32_t CanExGetAsWord(uint32_t index, const char *name, int16_t *value);
int32_t CanExGetAsLong(uint32_t index, const char *name, int32_t *value);
int32_t CanExGetAsUByte(uint32_t index, const char *name, unsigned char *value);
int32_t CanExGetAsUWord(uint32_t index, const char *name, uint16_t *value);
int32_t CanExGetAsULong(uint32_t index, const char *name, uint32_t *value);
int32_t CanExGetAsString(uint32_t index, const char *name, char **str);
int32_t CanExGetAsStringCopy(uint32_t index, const char *name, char *dest, uint32_t *dest_size);
// **** CAN-FD
int32_t CanFdTransmit(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count);
int32_t CanFdReceive(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count);
// *** <*> neu
int32_t CanExSetAsData(uint32_t index, const char *name, void *data, uint32_t size);
int32_t CanExSetDataPtr(uint32_t index, const char *name, void *data_ptr, uint32_t size);
int32_t CanExSetDataBlockCB(uint32_t index, TCanGetDataBlockCB func, void *user_data);

int32_t CanExGetInfoList(uint32_t dev_idx, const char *name, struct TCanInfoVarList **devices_info, int32_t flags); // <*> neu
int32_t CanExGetInfoListPerform(uint32_t dev_idx, const char *name, int32_t flags);
int32_t CanExGetInfoListGet(uint32_t list_idx, struct TCanInfoVar *item);

#endif

#if !(defined(CAN_API_TRUE_FUNC)) || defined(CAN_DRV_INCLUDE)

/***************************************************************/
/*  Funktionstypen                                             */
/***************************************************************/
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceCount)(int32_t flags);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceList)(struct TCanDevicesList **devices_list, int32_t flags);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceListPerform)(int32_t flags);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceListGet)(struct TCanDevicesList *item);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceInfo)(uint32_t index, struct TCanDeviceInfo *device_info,
  struct TCanInfoVar **hw_info, uint32_t *hw_info_size);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceInfoPerform)(uint32_t index, struct TCanDeviceInfo *device_info);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetDeviceInfoGet)(struct TCanInfoVar *item);
typedef void (DRV_CALLBACK_TYPE *TCanExDataFree)(void **data);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExCreateDevice)(uint32_t *index, char *options);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExDestroyDevice)(uint32_t *index);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExCreateFifo)(uint32_t index, uint32_t size, TMhsEvent *event_obj,
                 uint32_t event, uint32_t channels);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExBindFifo)(uint32_t fifo_index, uint32_t device_index,
                 uint32_t bind);
typedef TMhsEvent * (DRV_CALLBACK_TYPE *TCanExCreateEvent)(void);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetObjEvent)(uint32_t index, uint32_t source, TMhsEvent *event_obj, uint32_t event);
typedef void (DRV_CALLBACK_TYPE *TCanExSetEvent)(TMhsEvent *event_obj, uint32_t event);
typedef void (DRV_CALLBACK_TYPE *TCanExSetEventAll)(uint32_t event);
typedef void (DRV_CALLBACK_TYPE *TCanExResetEvent)(TMhsEvent *event_obj, uint32_t event);
typedef uint32_t (DRV_CALLBACK_TYPE *TCanExWaitForEvent)(TMhsEvent *event_obj, uint32_t timeout);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExInitDriver)(char *options);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetOptions)(uint32_t index, const char *options);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsByte)(uint32_t index, const char *name, char value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsWord)(uint32_t index, const char *name, int16_t value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsLong)(uint32_t index, const char *name, int32_t value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsUByte)(uint32_t index, const char *name, unsigned char value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsUWord)(uint32_t index, const char *name, uint16_t value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsULong)(uint32_t index, const char *name, uint32_t value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsString)(uint32_t index, const char *name, char *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsByte)(uint32_t index, const char *name, char *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsWord)(uint32_t index, const char *name, int16_t *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsLong)(uint32_t index, const char *name, int32_t *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsUByte)(uint32_t index, const char *name, unsigned char *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsUWord)(uint32_t index, const char *name, uint16_t *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsULong)(uint32_t index, const char *name, uint32_t *value);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsString)(uint32_t index, const char *name, char **str);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetAsStringCopy)(uint32_t index, const char *name, char *dest, uint32_t *dest_size);
// ****** CAN-FD
typedef int32_t (DRV_CALLBACK_TYPE *TCanFdTransmit)(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count);
typedef int32_t (DRV_CALLBACK_TYPE *TCanFdReceive)(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count);
// ***** <*>
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetAsData)(uint32_t index, const char *name, void *data, uint32_t size);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetDataPtr)(uint32_t index, const char *name, void *data_ptr, uint32_t size);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExSetDataBlockCB)(uint32_t index, TCanGetDataBlockCB func, void *user_data);
// ***** <*> neu 2
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetInfoList)(uint32_t dev_idx, const char *name, struct TCanInfoVarList **devices_info, int32_t flags); // <*> neu
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetInfoListPerform)(uint32_t dev_idx, const char *name, int32_t flags);
typedef int32_t (DRV_CALLBACK_TYPE *TCanExGetInfoListGet)(uint32_t list_idx, struct TCanInfoVar *item);

#endif

#ifndef CAN_API_TRUE_FUNC
/***************************************************************/
/*  Tiny-CAN API Funktionen                                    */
/***************************************************************/
extern TCanExGetDeviceCount CanExGetDeviceCount;
extern TCanExGetDeviceList CanExGetDeviceList;
extern TCanExGetDeviceListPerform CanExGetDeviceListPerform;
extern TCanExGetDeviceListGet CanExGetDeviceListGet;
extern TCanExGetDeviceInfo CanExGetDeviceInfo;
extern TCanExGetDeviceInfoPerform CanExGetDeviceInfoPerform;
extern TCanExGetDeviceInfoGet CanExGetDeviceInfoGet;
extern TCanExDataFree CanExDataFree;
extern TCanExCreateDevice CanExCreateDevice;
extern TCanExDestroyDevice CanExDestroyDevice;
extern TCanExCreateFifo CanExCreateFifo;
extern TCanExBindFifo CanExBindFifo;
extern TCanExCreateEvent CanExCreateEvent;
extern TCanExSetObjEvent CanExSetObjEvent;
extern TCanExSetEvent CanExSetEvent;
extern TCanExSetEventAll CanExSetEventAll;
extern TCanExResetEvent CanExResetEvent;
extern TCanExWaitForEvent CanExWaitForEvent;
extern TCanExInitDriver CanExInitDriver;
extern TCanExSetOptions CanExSetOptions;
extern TCanExSetAsByte CanExSetAsByte;
extern TCanExSetAsWord CanExSetAsWord;
extern TCanExSetAsLong CanExSetAsLong;
extern TCanExSetAsUByte CanExSetAsUByte;
extern TCanExSetAsUWord CanExSetAsUWord;
extern TCanExSetAsULong CanExSetAsULong;
extern TCanExSetAsString CanExSetAsString;
extern TCanExGetAsByte CanExGetAsByte;
extern TCanExGetAsWord CanExGetAsWord;
extern TCanExGetAsLong CanExGetAsLong;
extern TCanExGetAsUByte CanExGetAsUByte;
extern TCanExGetAsUWord CanExGetAsUWord;
extern TCanExGetAsULong CanExGetAsULong;
extern TCanExGetAsString CanExGetAsString;
extern TCanExGetAsStringCopy CanExGetAsStringCopy;

// ****** CAN-FD
extern TCanFdTransmit CanFdTransmit;
extern TCanFdReceive CanFdReceive;
// **** <*> neu
extern TCanExSetAsData CanExSetAsData;
extern TCanExSetDataPtr CanExSetDataPtr;
extern TCanExSetDataBlockCB CanExSetDataBlockCB;

extern TCanExGetInfoList CanExGetInfoList;
extern TCanExGetInfoListPerform CanExGetInfoListPerform;
extern TCanExGetInfoListGet CanExGetInfoListGet;

#endif

#ifdef __cplusplus
  }
#endif

#endif
