Files
BionxControl/lib/mhs_can_drv.c

3270 lines
82 KiB
C

/***************************************************************************
Interface zur Tiny-CAN API
-------------------
begin : 11.10.2011
last modify : 04.05.2023
copyright : (C) 2011 - 2023 by MHS-Elektronik GmbH & Co. KG, Germany
author : Klaus Demlehner, klaus@mhs-elektronik.de
***************************************************************************/
#define CAN_DRV_INCLUDE
#include "can_drv.h"
#ifdef __WIN32__
#include <string.h>
#include <stdlib.h>
#if defined(MHS_DRV_DEBUG_OUTPUT)
#include <stdio.h>
#include <string.h>
#endif
#else
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <dlfcn.h>
#if defined(LINUX_HAVE_GET_API_DRIVER_PATH)
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h> /* PATH_MAX */
#endif
#if defined(MHS_DRV_DEBUG_OUTPUT) || defined(LINUX_HAVE_GET_API_DRIVER_PATH)
#include <string.h>
#endif
#endif
#ifdef CAN_API_TRUE_FUNC
static TCanInitDriver PCanInitDriver = NULL;
static TCanDownDriver PCanDownDriver = NULL;
static TCanSetOptions PCanSetOptions = NULL;
static TCanDeviceOpen PCanDeviceOpen = NULL;
static TCanDeviceClose PCanDeviceClose = NULL;
static TCanSetMode PCanSetMode = NULL;
static TCanTransmit PCanTransmit = NULL;
static TCanTransmitClear PCanTransmitClear = NULL;
static TCanTransmitGetCount PCanTransmitGetCount = NULL;
static TCanTransmitSet PCanTransmitSet = NULL;
static TCanReceive PCanReceive = NULL;
static TCanReceiveClear PCanReceiveClear = NULL;
static TCanReceiveGetCount PCanReceiveGetCount = NULL;
static TCanSetSpeed PCanSetSpeed = NULL;
static TCanSetSpeedUser PCanSetSpeedUser = NULL;
static TCanDrvInfo PCanDrvInfo = NULL;
static TCanDrvHwInfo PCanDrvHwInfo = NULL;
static TCanSetFilter PCanSetFilter = NULL;
static TCanGetDeviceStatus PCanGetDeviceStatus = NULL;
static TCanSetPnPEventCallback PCanSetPnPEventCallback = NULL;
static TCanSetStatusEventCallback PCanSetStatusEventCallback = NULL;
static TCanSetRxEventCallback PCanSetRxEventCallback = NULL;
static TCanSetEvents PCanSetEvents = NULL;
static TCanEventStatus PCanEventStatus = NULL;
// EX-Funktionen
static TCanExGetDeviceCount PCanExGetDeviceCount = NULL;
static TCanExGetDeviceList PCanExGetDeviceList = NULL;
static TCanExGetDeviceListPerform PCanExGetDeviceListPerform = NULL;
static TCanExGetDeviceListGet PCanExGetDeviceListGet = NULL;
static TCanExGetDeviceInfo PCanExGetDeviceInfo = NULL;
static TCanExGetDeviceInfoPerform PCanExGetDeviceInfoPerform = NULL;
static TCanExGetDeviceInfoGet PCanExGetDeviceInfoGet = NULL;
static TCanExDataFree PCanExDataFree = NULL;
static TCanExCreateDevice PCanExCreateDevice = NULL;
static TCanExDestroyDevice PCanExDestroyDevice = NULL;
static TCanExCreateFifo PCanExCreateFifo = NULL;
static TCanExBindFifo PCanExBindFifo = NULL;
static TCanExCreateEvent PCanExCreateEvent = NULL;
static TCanExSetObjEvent PCanExSetObjEvent = NULL;
static TCanExSetEvent PCanExSetEvent = NULL;
static TCanExSetEventAll PCanExSetEventAll = NULL;
static TCanExResetEvent PCanExResetEvent = NULL;
static TCanExWaitForEvent PCanExWaitForEvent = NULL;
static TCanExInitDriver PCanExInitDriver = NULL;
static TCanExSetOptions PCanExSetOptions = NULL;
static TCanExSetAsByte PCanExSetAsByte = NULL;
static TCanExSetAsWord PCanExSetAsWord = NULL;
static TCanExSetAsLong PCanExSetAsLong = NULL;
static TCanExSetAsUByte PCanExSetAsUByte = NULL;
static TCanExSetAsUWord PCanExSetAsUWord = NULL;
static TCanExSetAsULong PCanExSetAsULong = NULL;
static TCanExSetAsString PCanExSetAsString = NULL;
static TCanExGetAsByte PCanExGetAsByte = NULL;
static TCanExGetAsWord PCanExGetAsWord = NULL;
static TCanExGetAsLong PCanExGetAsLong = NULL;
static TCanExGetAsUByte PCanExGetAsUByte = NULL;
static TCanExGetAsUWord PCanExGetAsUWord = NULL;
static TCanExGetAsULong PCanExGetAsULong = NULL;
static TCanExGetAsString PCanExGetAsString = NULL;
static TCanExGetAsStringCopy PCanExGetAsStringCopy = NULL;
// **** CAN-FD
static TCanFdTransmit PCanFdTransmit = NULL;
static TCanFdReceive PCanFdReceive = NULL;
// **** <*> neu
static TCanExSetAsData PCanExSetAsData = NULL;
static TCanExSetDataPtr PCanExSetDataPtr = NULL;
static TCanExSetDataBlockCB PCanExSetDataBlockCB = NULL;
static TCanExGetInfoList PCanExGetInfoList = NULL;
static TCanExGetInfoListPerform PCanExGetInfoListPerform = NULL;
static TCanExGetInfoListGet PCanExGetInfoListGet = NULL;
static TMhsCanGetApiHandle PMhsCanGetApiHandle = NULL;
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
static TCanExIoOpen PCanExIoOpen = NULL;
static TCanExIoClose PCanExIoClose = NULL;
static TCanExIoWrite PCanExIoWrite = NULL;
static TCanExIoRead PCanExIoRead = NULL;
#endif
#else
int32_t DRV_CALLBACK_TYPE DefCanInitDriver(char *options);
void DRV_CALLBACK_TYPE DefCanDownDriver(void);
int32_t DRV_CALLBACK_TYPE DefCanSetOptions(char *options);
int32_t DRV_CALLBACK_TYPE DefCanDeviceOpen(uint32_t index, char *parameter);
int32_t DRV_CALLBACK_TYPE DefCanDeviceClose(uint32_t index);
int32_t DRV_CALLBACK_TYPE DefCanSetMode(uint32_t index, unsigned char can_op_mode, uint16_t can_command);
int32_t DRV_CALLBACK_TYPE DefCanTransmit(uint32_t index, struct TCanMsg *msg, int32_t count);
void DRV_CALLBACK_TYPE DefCanTransmitClear(uint32_t index);
uint32_t DRV_CALLBACK_TYPE DefCanTransmitGetCount(uint32_t index);
int32_t DRV_CALLBACK_TYPE DefCanTransmitSet(uint32_t index, uint16_t cmd,
uint32_t time);
int32_t DRV_CALLBACK_TYPE DefCanReceive(uint32_t index, struct TCanMsg *msg, int32_t count);
void DRV_CALLBACK_TYPE DefCanReceiveClear(uint32_t index);
uint32_t DRV_CALLBACK_TYPE DefCanReceiveGetCount(uint32_t index);
int32_t DRV_CALLBACK_TYPE DefCanSetSpeed(uint32_t index, uint16_t speed);
int32_t DRV_CALLBACK_TYPE DefCanSetSpeedUser(uint32_t index, uint32_t value);
char * DRV_CALLBACK_TYPE DefCanDrvInfo(void);
char * DRV_CALLBACK_TYPE DefCanDrvHwInfo(uint32_t index);
int32_t DRV_CALLBACK_TYPE DefCanSetFilter(uint32_t index, struct TMsgFilter *msg_filter);
int32_t DRV_CALLBACK_TYPE DefCanGetDeviceStatus(uint32_t index, struct TDeviceStatus *status);
void DRV_CALLBACK_TYPE DefCanSetPnPEventCallback(void (DRV_CALLBACK_TYPE *event)(uint32_t index, int32_t status));
void DRV_CALLBACK_TYPE DefCanSetStatusEventCallback(void (DRV_CALLBACK_TYPE *event)
(uint32_t index, struct TDeviceStatus *device_status));
void DRV_CALLBACK_TYPE DefCanSetRxEventCallback(void (DRV_CALLBACK_TYPE *event)(uint32_t index,
struct TCanMsg *msg, int32_t count));
void DRV_CALLBACK_TYPE DefCanSetEvents(uint16_t events);
uint32_t DRV_CALLBACK_TYPE DefCanEventStatus(void);
// EX-Funktionen
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceCount(int32_t flags);
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceList(struct TCanDevicesList **devices_list, int32_t flags);
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceListPerform(int32_t flags);
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceListGet(struct TCanDevicesList *item);
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceInfo(uint32_t index, struct TCanDeviceInfo *device_info,
struct TCanInfoVar **hw_info, uint32_t *hw_info_size);
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceInfoPerform(uint32_t index, struct TCanDeviceInfo *device_info);
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceInfoGet(struct TCanInfoVar *item);
void DRV_CALLBACK_TYPE DefCanExDataFree(void **data);
int32_t DRV_CALLBACK_TYPE DefCanExCreateDevice(uint32_t *index, char *options);
int32_t DRV_CALLBACK_TYPE DefCanExDestroyDevice(uint32_t *index);
int32_t DRV_CALLBACK_TYPE DefCanExCreateFifo(uint32_t index, uint32_t size, TMhsEvent *event_obj, uint32_t event, uint32_t channels);
int32_t DRV_CALLBACK_TYPE DefCanExBindFifo(uint32_t fifo_index, uint32_t device_index, uint32_t bind);
TMhsEvent * DRV_CALLBACK_TYPE DefCanExCreateEvent(void);
int32_t DRV_DRV_CALLBACK_TYPE_TYPE DefCanExSetObjEvent(uint32_t index, uint32_t source, TMhsEvent *event_obj, uint32_t event);
void DRV_CALLBACK_TYPE DefCanExSetEvent(TMhsEvent *event_obj, uint32_t event);
void DRV_CALLBACK_TYPE DefCanExSetEventAll(uint32_t event);
void DRV_CALLBACK_TYPE DefCanExResetEvent(TMhsEvent *event_obj, uint32_t event);
uint32_t DRV_CALLBACK_TYPE DefCanExWaitForEvent(TMhsEvent *event_obj, uint32_t timeout);
int32_t DRV_CALLBACK_TYPE DefCanExInitDriver(char *options);
int32_t DRV_CALLBACK_TYPE DefCanExSetOptions(uint32_t index, char *options);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsByte(uint32_t index, char *name, char value);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsWord(uint32_t index, char *name, int16_t value);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsLong(uint32_t index, char *name, int32_t value);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsUByte(uint32_t index, char *name, unsigned char value);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsUWord(uint32_t index, char *name, uint16_t value);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsULong(uint32_t index, char *name, uint32_t value);
int32_t DRV_CALLBACK_TYPE DefCanExSetAsString(uint32_t index, char *name, char *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsByte(uint32_t index, char *name, char *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsWord(uint32_t index, char *name, int16_t *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsLong(uint32_t index, char *name, int32_t *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsUByte(uint32_t index, char *name, unsigned char *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsUWord(uint32_t index, char *name, uint16_t *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsULong(uint32_t index, char *name, uint32_t *value);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsString(uint32_t index, char *name, char **str);
int32_t DRV_CALLBACK_TYPE DefCanExGetAsStringCopy(uint32_t index, char *name, char *dest, uint32_t *dest_size);
// **** CAN-FD
int32_t DRV_CALLBACK_TYPE DefCanFdTransmit(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count);
int32_t DRV_CALLBACK_TYPE DefCanFdReceive(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count);
// **** <*> neu
int32_t DRV_CALLBACK_TYPE DefCanExSetAsData(uint32_t index, char *name, void *data, uint32_t size);
int32_t DRV_CALLBACK_TYPE DefCanExSetDataPtr(uint32_t index, char *name, void *data_ptr, uint32_t size);
int32_t DRV_CALLBACK_TYPE DefCanExSetDataBlockCB(uint32_t index, TCanGetDataBlockCB func, void *user_data);
int32_t DRV_CALLBACK_TYPE DefCanExGetInfoList(uint32_t dev_idx, const char *name, struct TCanInfoVarList **devices_info, int32_t flags);
int32_t DRV_CALLBACK_TYPE DefCanExGetInfoListPerform(uint32_t dev_idx, const char *name, int32_t flags);
int32_t DRV_CALLBACK_TYPE DefCanExGetInfoListGet(uint32_t list_idx, struct TCanInfoVar *item);
int32_t DRV_CALLBACK_TYPE DefMhsCanGetApiHandle(void **api_handle);
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
int32_t DRV_CALLBACK_TYPE CanExIoOpen(uint32_t index, const char *name, uint32_t *io_id);
int32_t DRV_CALLBACK_TYPE CanExIoClose(uint32_t io_id);
int32_t DRV_CALLBACK_TYPE CanExIoWrite(uint32_t io_id, void *data, uint32_t *size, uint32_t timeout);
int32_t DRV_CALLBACK_TYPE CanExIoRead(uint32_t io_id, void *data, uint32_t *size, uint32_t timeout);
#endif
TCanInitDriver CanInitDriver = DefCanInitDriver;
TCanDownDriver CanDownDriver = DefCanDownDriver;
TCanSetOptions CanSetOptions = DefCanSetOptions;
TCanDeviceOpen CanDeviceOpen = DefCanDeviceOpen;
TCanDeviceClose CanDeviceClose = DefCanDeviceClose;
TCanSetMode CanSetMode = DefCanSetMode;
TCanTransmit CanTransmit = DefCanTransmit;
TCanTransmitClear CanTransmitClear = DefCanTransmitClear;
TCanTransmitGetCount CanTransmitGetCount = DefCanTransmitGetCount;
TCanTransmitSet CanTransmitSet = DefCanTransmitSet;
TCanReceive CanReceive = DefCanReceive;
TCanReceiveClear CanReceiveClear = DefCanReceiveClear;
TCanReceiveGetCount CanReceiveGetCount = DefCanReceiveGetCount;
TCanSetSpeed CanSetSpeed = DefCanSetSpeed;
TCanSetSpeedUser CanSetSpeedUser = DefCanSetSpeedUser;
TCanDrvInfo CanDrvInfo = DefCanDrvInfo;
TCanDrvHwInfo CanDrvHwInfo = DefCanDrvHwInfo;
TCanSetFilter CanSetFilter = DefCanSetFilter;
TCanGetDeviceStatus CanGetDeviceStatus = DefCanGetDeviceStatus;
TCanSetPnPEventCallback CanSetPnPEventCallback = DefCanSetPnPEventCallback;
TCanSetStatusEventCallback CanSetStatusEventCallback = DefCanSetStatusEventCallback;
TCanSetRxEventCallback CanSetRxEventCallback = DefCanSetRxEventCallback;
TCanSetEvents CanSetEvents = DefCanSetEvents;
TCanEventStatus CanEventStatus = DefCanEventStatus;
// EX-Funktionen
TCanExGetDeviceCount CanExGetDeviceCount = DefCanExGetDeviceCount;
TCanExGetDeviceList CanExGetDeviceList = DefCanExGetDeviceList;
TCanExGetDeviceListPerform CanExGetDeviceListPerform = DefCanExGetDeviceListPerform;
TCanExGetDeviceListGet CanExGetDeviceListGet = DefCanExGetDeviceListGet;
TCanExGetDeviceInfo CanExGetDeviceInfo = DefCanExGetDeviceInfo;
TCanExGetDeviceInfoPerform CanExGetDeviceInfoPerform = DefCanExGetDeviceInfoPerform;
TCanExGetDeviceInfoGet CanExGetDeviceInfoGet = DefCanExGetDeviceInfoGet;
TCanExDataFree CanExDataFree = DefCanExDataFree;
TCanExCreateDevice CanExCreateDevice = DefCanExCreateDevice;
TCanExDestroyDevice CanExDestroyDevice = DefCanExDestroyDevice;
TCanExCreateFifo CanExCreateFifo = DefCanExCreateFifo;
TCanExBindFifo CanExBindFifo = DefCanExBindFifo;
TCanExCreateEvent CanExCreateEvent = DefCanExCreateEvent;
TCanExSetObjEvent CanExSetObjEvent = DefCanExSetObjEvent;
TCanExSetEvent CanExSetEvent = DefCanExSetEvent;
TCanExSetEventAll CanExSetEventAll = DefCanExSetEventAll;
TCanExResetEvent CanExResetEvent = DefCanExResetEvent;
TCanExWaitForEvent CanExWaitForEvent = DefCanExWaitForEvent;
TCanExInitDriver CanExInitDriver = DefCanExInitDriver;
TCanExSetOptions CanExSetOptions = DefCanExSetOptions;
TCanExSetAsByte CanExSetAsByte = DefCanExSetAsByte;
TCanExSetAsWord CanExSetAsWord = DefCanExSetAsWord;
TCanExSetAsLong CanExSetAsLong = DefCanExSetAsLong;
TCanExSetAsUByte CanExSetAsUByte = DefCanExSetAsUByte;
TCanExSetAsUWord CanExSetAsUWord = DefCanExSetAsUWord;
TCanExSetAsULong CanExSetAsULong = DefCanExSetAsULong;
TCanExSetAsString CanExSetAsString = DefCanExSetAsString;
TCanExGetAsByte CanExGetAsByte = DefCanExGetAsByte;
TCanExGetAsWord CanExGetAsWord = DefCanExGetAsWord;
TCanExGetAsLong CanExGetAsLong = DefCanExGetAsLong;
TCanExGetAsUByte CanExGetAsUByte = DefCanExGetAsUByte;
TCanExGetAsUWord CanExGetAsUWord = DefCanExGetAsUWord;
TCanExGetAsULong CanExGetAsULong = DefCanExGetAsULong;
TCanExGetAsString CanExGetAsString = DefCanExGetAsString;
TCanExGetAsStringCopy CanExGetAsStringCopy = DefCanExGetAsStringCopy;
// **** CAN-FD
TCanFdTransmit CanFdTransmit = DefCanFdTransmit;
TCanFdReceive CanFdReceive = DefCanFdReceive;
// <*> neu
TCanExSetAsData CanExSetAsData = DefCanExSetAsData;
TCanExSetDataPtr CanExSetDataPtr = DefCanExSetDataPtr;
TCanExSetDataBlockCB CanExSetDataBlockCB = DefCanExSetDataBlockCB;
TCanExGetInfoList CanExGetInfoList = DefCanExGetInfoList;
TCanExGetInfoListPerform CanExGetInfoListPerform = DefCanExGetInfoListPerform;
TCanExGetInfoListGet CanExGetInfoListGet = DefCanExGetInfoListGet;
TMhsCanGetApiHandle MhsCanGetApiHandle = DefMhsCanGetApiHandle;
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
TCanExIoOpen CanExIoOpen = DefCanExIoOpen;
TCanExIoClose CanExIoClose = DefCanExIoClose;
TCanExIoWrite CanExIoWrite = DefCanExIoWrite;
TCanExIoRead CanExIoRead = DefCanExIoRead;
#endif
#endif
#ifdef LINUX_HAVE_GET_API_DRIVER_PATH
static char *DriverFileName = NULL;
#endif
#ifdef __WIN32__
static HINSTANCE DriverHandle = 0; // Handle to DLL
static char *DriverFileName = NULL;
#if _MSC_VER >= 1500
#define INTERLOCK_TYPE_CONV
#else
#define INTERLOCK_TYPE_CONV (volatile LPLONG)
#endif
#else
static void *DriverHandle = NULL;
#endif
#ifdef DRV_REF_LOCKING
#ifdef __WIN32__
// ****** Windows
static volatile LONG TCanDrvRefCounter = 0;
#define CAN_DRV_REF() (void)InterlockedIncrement(INTERLOCK_TYPE_CONV&TCanDrvRefCounter)
#define CAN_DRV_UNREF() (void)InterlockedDecrement(INTERLOCK_TYPE_CONV&TCanDrvRefCounter)
#else
// ****** Linux
static volatile uint32_t TCanDrvRefCounter = 0;
#define CAN_DRV_REF() (void) __sync_fetch_and_add(&TCanDrvRefCounter, 1)
#define CAN_DRV_UNREF() (void) __sync_fetch_and_sub(&TCanDrvRefCounter, 1)
#endif
#else
#define CAN_DRV_REF()
#define CAN_DRV_UNREF()
#endif
#ifdef __WIN32__
// ****** Windows
#define mhs_sleep(x) Sleep(x)
#define MhsGetProcAddress(h, s) (void *)GetProcAddress((h), (LPCSTR)(s))
#else
// ****** Linux
#define mhs_sleep(x) usleep((x) * 1000)
#define MhsGetProcAddress(h, s) dlsym((h), (s))
#endif
#if defined(__WIN32__) || defined(LINUX_HAVE_GET_API_DRIVER_PATH)
#ifdef __GNUC__
#define SafeSprintf snprintf
#endif
#ifdef __WIN32__
#ifndef __GNUC__
#if defined(_MSC_VER) && _MSC_VER >= 1500
#define SafeSprintf(dst, dst_max, format, ...) _snprintf_s(dst, dst_max, _TRUNCATE, format, __VA_ARGS__)
#else
#define SafeSprintf _snprintf
#endif
#endif
#endif
#define MhsSafeFree(d) do { \
if ((d)) \
{ \
free((d)); \
(d) = NULL; \
} \
} while(0)
static char *GetApiDriverWithPath(const char *driver_file);
#endif
/***************************************************************/
/* Treiber DLL laden */
/***************************************************************/
int32_t LoadDriver(const char *file_name)
{
int32_t error;
error = 0;
UnloadDriver();
#ifdef __WIN32__
if (!(DriverFileName = GetApiDriverWithPath(file_name)))
{
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("Fehler bei GetApiDriverWithPath\n\r");
#endif
return(-100);
}
DriverHandle = LoadLibraryA(DriverFileName);
#ifdef MHS_DRV_DEBUG_OUTPUT
if (DriverHandle)
printf("API driver file \"%s\" loaded.\n\r", DriverFileName);
else
printf("Error load: %s\n\r", DriverFileName);
#endif
#else
#ifdef LINUX_HAVE_GET_API_DRIVER_PATH
if (!(DriverFileName = GetApiDriverWithPath(file_name)))
{
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("Fehler bei GetApiDriverWithPath\n\r");
#endif
return(-100);
}
DriverHandle = dlopen(DriverFileName, RTLD_LAZY);
#else
DriverHandle = dlopen(file_name, RTLD_LAZY);
#endif
#ifdef MHS_DRV_DEBUG_OUTPUT
if (DriverHandle)
printf("API driver file \"%s\" loaded.\n\r", DriverFileName);
else
printf("Error load: %s\n\r, ", dlerror());
#endif
#endif
if (DriverHandle)
{
#ifdef CAN_API_TRUE_FUNC
if (!(PCanInitDriver = (TCanInitDriver)MhsGetProcAddress(DriverHandle, "CanInitDriver")))
error = -1;
else if (!(PCanDownDriver = (TCanDownDriver)MhsGetProcAddress(DriverHandle, "CanDownDriver")))
error = -2;
else if (!(PCanSetOptions = (TCanSetOptions)MhsGetProcAddress(DriverHandle, "CanSetOptions")))
error = -3;
else if (!(PCanDeviceOpen = (TCanDeviceOpen)MhsGetProcAddress(DriverHandle, "CanDeviceOpen")))
error = -4;
else if (!(PCanDeviceClose = (TCanDeviceClose)MhsGetProcAddress(DriverHandle, "CanDeviceClose")))
error = -5;
else if (!(PCanSetMode = (TCanSetMode)MhsGetProcAddress(DriverHandle, "CanSetMode")))
error = -6;
else if (!(PCanTransmit = (TCanTransmit)MhsGetProcAddress(DriverHandle, "CanTransmit")))
error = -7;
else if (!(PCanTransmitClear = (TCanTransmitClear)MhsGetProcAddress(DriverHandle, "CanTransmitClear")))
error = -8;
else if (!(PCanTransmitGetCount = (TCanTransmitGetCount)MhsGetProcAddress(DriverHandle, "CanTransmitGetCount")))
error = -9;
else if (!(PCanTransmitSet = (TCanTransmitSet)MhsGetProcAddress(DriverHandle, "CanTransmitSet")))
error = -10;
else if (!(PCanReceive = (TCanReceive)MhsGetProcAddress(DriverHandle, "CanReceive")))
error = -11;
else if (!(PCanReceiveClear = (TCanReceiveClear)MhsGetProcAddress(DriverHandle, "CanReceiveClear")))
error = -12;
else if (!(PCanReceiveGetCount = (TCanReceiveGetCount)MhsGetProcAddress(DriverHandle, "CanReceiveGetCount")))
error = -13;
else if (!(PCanSetSpeed = (TCanSetSpeed)MhsGetProcAddress(DriverHandle, "CanSetSpeed")))
error = -14;
else if (!(PCanSetSpeedUser = (TCanSetSpeedUser)MhsGetProcAddress(DriverHandle, "CanSetSpeedUser")))
error = -15;
else if (!(PCanDrvInfo = (TCanDrvInfo)MhsGetProcAddress(DriverHandle, "CanDrvInfo")))
error = -16;
else if (!(PCanDrvHwInfo = (TCanDrvHwInfo)MhsGetProcAddress(DriverHandle, "CanDrvHwInfo")))
error = -17;
else if (!(PCanSetFilter = (TCanSetFilter)MhsGetProcAddress(DriverHandle, "CanSetFilter")))
error = -18;
else if (!(PCanGetDeviceStatus = (TCanGetDeviceStatus)MhsGetProcAddress(DriverHandle, "CanGetDeviceStatus")))
error = -19;
else if (!(PCanSetPnPEventCallback = (TCanSetPnPEventCallback)MhsGetProcAddress(DriverHandle, "CanSetPnPEventCallback")))
error = -20;
else if (!(PCanSetStatusEventCallback = (TCanSetStatusEventCallback)MhsGetProcAddress(DriverHandle, "CanSetStatusEventCallback")))
error = -21;
else if (!(PCanSetRxEventCallback = (TCanSetRxEventCallback)MhsGetProcAddress(DriverHandle, "CanSetRxEventCallback")))
error = -22;
else if (!(PCanSetEvents = (TCanSetEvents)MhsGetProcAddress(DriverHandle, "CanSetEvents")))
error = -23;
else if (!(PCanEventStatus = (TCanEventStatus)MhsGetProcAddress(DriverHandle, "CanEventStatus")))
error = -24;
// EX-Funktionen
else if (!(PCanExGetDeviceCount = (TCanExGetDeviceCount)MhsGetProcAddress(DriverHandle, "CanExGetDeviceCount")))
error = -25;
else if (!(PCanExGetDeviceList = (TCanExGetDeviceList)MhsGetProcAddress(DriverHandle, "CanExGetDeviceList")))
error = -26;
else if (!(PCanExGetDeviceListPerform = (TCanExGetDeviceListPerform)MhsGetProcAddress(DriverHandle, "CanExGetDeviceListPerform")))
error = -27;
else if (!(PCanExGetDeviceListGet = (TCanExGetDeviceListGet)MhsGetProcAddress(DriverHandle, "CanExGetDeviceListGet")))
error = -28;
else if (!(PCanExGetDeviceInfo = (TCanExGetDeviceInfo)MhsGetProcAddress(DriverHandle, "CanExGetDeviceInfo")))
error = -29;
else if (!(PCanExGetDeviceInfoPerform = (TCanExGetDeviceInfoPerform)MhsGetProcAddress(DriverHandle, "CanExGetDeviceInfoPerform")))
error = -30;
else if (!(PCanExGetDeviceInfoGet = (TCanExGetDeviceInfoGet)MhsGetProcAddress(DriverHandle, "CanExGetDeviceInfoGet")))
error = -31;
else if (!(PCanExDataFree = (TCanExDataFree)MhsGetProcAddress(DriverHandle, "CanExDataFree")))
error = -32;
else if (!(PCanExCreateDevice = (TCanExCreateDevice)MhsGetProcAddress(DriverHandle, "CanExCreateDevice")))
error = -33;
else if (!(PCanExDestroyDevice = (TCanExDestroyDevice)MhsGetProcAddress(DriverHandle, "CanExDestroyDevice")))
error = -34;
else if (!(PCanExCreateFifo = (TCanExCreateFifo)MhsGetProcAddress(DriverHandle, "CanExCreateFifo")))
error = -35;
else if (!(PCanExBindFifo = (TCanExBindFifo)MhsGetProcAddress(DriverHandle, "CanExBindFifo")))
error = -36;
else if (!(PCanExCreateEvent = (TCanExCreateEvent)MhsGetProcAddress(DriverHandle, "CanExCreateEvent")))
error = -37;
else if (!(PCanExSetObjEvent = (TCanExSetObjEvent)MhsGetProcAddress(DriverHandle, "CanExSetObjEvent")))
error = -38;
else if (!(PCanExSetEvent = (TCanExSetEvent)MhsGetProcAddress(DriverHandle, "CanExSetEvent")))
error = -39;
else if (!(PCanExResetEvent = (TCanExResetEvent)MhsGetProcAddress(DriverHandle, "CanExResetEvent")))
error = -40;
else if (!(PCanExWaitForEvent = (TCanExWaitForEvent)MhsGetProcAddress(DriverHandle, "CanExWaitForEvent")))
error = -41;
else if (!(PCanExInitDriver = (TCanExInitDriver)MhsGetProcAddress(DriverHandle, "CanExInitDriver")))
error = -42;
else if (!(PCanExSetOptions = (TCanExSetOptions)MhsGetProcAddress(DriverHandle, "CanExSetOptions")))
error = -43;
else if (!(PCanExSetAsByte = (TCanExSetAsByte)MhsGetProcAddress(DriverHandle, "CanExSetAsByte")))
error = -44;
else if (!(PCanExSetAsWord = (TCanExSetAsWord)MhsGetProcAddress(DriverHandle, "CanExSetAsWord")))
error = -45;
else if (!(PCanExSetAsLong = (TCanExSetAsLong)MhsGetProcAddress(DriverHandle, "CanExSetAsLong")))
error = -46;
else if (!(PCanExSetAsUByte = (TCanExSetAsUByte)MhsGetProcAddress(DriverHandle, "CanExSetAsUByte")))
error = -47;
else if (!(PCanExSetAsUWord = (TCanExSetAsUWord)MhsGetProcAddress(DriverHandle, "CanExSetAsUWord")))
error = -48;
else if (!(PCanExSetAsULong = (TCanExSetAsULong)MhsGetProcAddress(DriverHandle, "CanExSetAsULong")))
error = -49;
else if (!(PCanExSetAsString = (TCanExSetAsString)MhsGetProcAddress(DriverHandle, "CanExSetAsString")))
error = -50;
else if (!(PCanExGetAsByte = (TCanExGetAsByte)MhsGetProcAddress(DriverHandle, "CanExGetAsByte")))
error = -51;
else if (!(PCanExGetAsWord = (TCanExGetAsWord)MhsGetProcAddress(DriverHandle, "CanExGetAsWord")))
error = -52;
else if (!(PCanExGetAsLong = (TCanExGetAsLong)MhsGetProcAddress(DriverHandle, "CanExGetAsLong")))
error = -53;
else if (!(PCanExGetAsUByte = (TCanExGetAsUByte)MhsGetProcAddress(DriverHandle, "CanExGetAsUByte")))
error = -54;
else if (!(PCanExGetAsUWord = (TCanExGetAsUWord)MhsGetProcAddress(DriverHandle, "CanExGetAsUWord")))
error = -55;
else if (!(PCanExGetAsULong = (TCanExGetAsULong)MhsGetProcAddress(DriverHandle, "CanExGetAsULong")))
error = -56;
else if (!(PCanExGetAsString = (TCanExGetAsString)MhsGetProcAddress(DriverHandle, "CanExGetAsString")))
error = -57;
else if (!(PCanExGetAsStringCopy = (TCanExGetAsStringCopy)MhsGetProcAddress(DriverHandle, "CanExGetAsStringCopy")))
error = -58;
else if (!(PCanExSetEventAll = (TCanExSetEventAll)MhsGetProcAddress(DriverHandle, "CanExSetEventAll")))
error = -59;
// **** CAN-FD
#ifdef STRICT_CAN_FD_SUPPORT
else if (!(PCanFdTransmit = (TCanFdTransmit)MhsGetProcAddress(DriverHandle, "CanFdTransmit")))
error = -60;
else if (!(PCanFdReceive = (TCanFdReceive)MhsGetProcAddress(DriverHandle, "CanFdReceive")))
error = -61;
#else
PCanFdTransmit = (TCanFdTransmit)MhsGetProcAddress(DriverHandle, "CanFdTransmit");
PCanFdReceive = (TCanFdReceive)MhsGetProcAddress(DriverHandle, "CanFdReceive");
#endif
// ****** <*> neu
#ifdef STRICT_ECU_FLASH_SUPPORT
if (!(PCanExSetAsData = (TCanExSetAsData)MhsGetProcAddress(DriverHandle, "CanExSetAsData")))
error = -62;
if (!(PCanExSetDataPtr = (TCanExSetDataPtr)MhsGetProcAddress(DriverHandle, "CanExSetDataPtr")))
error = -63;
if (!(PCanExSetDataBlockCB = (TCanExSetDataBlockCB)MhsGetProcAddress(DriverHandle, "CanExSetDataBlockCB")))
error = -64;
#else
PCanExSetAsData = (TCanExSetAsData)MhsGetProcAddress(DriverHandle, "CanExSetAsData");
PCanExSetDataPtr = (TCanExSetDataPtr)MhsGetProcAddress(DriverHandle, "CanExSetDataPtr");
PCanExSetDataBlockCB = (TCanExSetDataBlockCB)MhsGetProcAddress(DriverHandle, "CanExSetDataBlockCB");
#endif
// ****** <*> neu2
PCanExGetInfoList = (TCanExGetInfoList)MhsGetProcAddress(DriverHandle, "CanExGetInfoList");
PCanExGetInfoListPerform = (TCanExGetInfoListPerform)MhsGetProcAddress(DriverHandle, "CanExGetInfoListPerform");
PCanExGetInfoListGet = (TCanExGetInfoListGet)MhsGetProcAddress(DriverHandle, "CanExGetInfoListGet");
PMhsCanGetApiHandle = (TMhsCanGetApiHandle)MhsGetProcAddress(DriverHandle, "MhsCanGetApiHandle");
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
PCanExIoOpen = (TCanExIoOpen)MhsGetProcAddress(DriverHandle, "CanExIoOpen");
PCanExIoClose = (TCanExIoClose)MhsGetProcAddress(DriverHandle, "CanExIoClose");
PCanExIoWrite = (TCanExIoWrite)MhsGetProcAddress(DriverHandle, "CanExIoWrite");
PCanExIoRead = (TCanExIoRead)MhsGetProcAddress(DriverHandle, "CanExIoRead");
#endif
#else
if (!(CanInitDriver = (TCanInitDriver)MhsGetProcAddress(DriverHandle, "CanInitDriver")))
error = -1;
else if (!(CanDownDriver = (TCanDownDriver)MhsGetProcAddress(DriverHandle, "CanDownDriver")))
error = -2;
else if (!(CanSetOptions = (TCanSetOptions)MhsGetProcAddress(DriverHandle, "CanSetOptions")))
error = -3;
else if (!(CanDeviceOpen = (TCanDeviceOpen)MhsGetProcAddress(DriverHandle, "CanDeviceOpen")))
error = -4;
else if (!(CanDeviceClose = (TCanDeviceClose)MhsGetProcAddress(DriverHandle, "CanDeviceClose")))
error = -5;
else if (!(CanSetMode = (TCanSetMode)MhsGetProcAddress(DriverHandle, "CanSetMode")))
error = -7;
else if (!(CanTransmit = (TCanTransmit)MhsGetProcAddress(DriverHandle, "CanTransmit")))
error = -10;
else if (!(CanTransmitClear = (TCanTransmitClear)MhsGetProcAddress(DriverHandle, "CanTransmitClear")))
error = -11;
else if (!(CanTransmitGetCount = (TCanTransmitGetCount)MhsGetProcAddress(DriverHandle, "CanTransmitGetCount")))
error = -12;
else if (!(CanTransmitSet = (TCanTransmitSet)MhsGetProcAddress(DriverHandle, "CanTransmitSet")))
error = -13;
else if (!(CanReceive = (TCanReceive)MhsGetProcAddress(DriverHandle, "CanReceive")))
error = -14;
else if (!(CanReceiveClear = (TCanReceiveClear)MhsGetProcAddress(DriverHandle, "CanReceiveClear")))
error = -15;
else if (!(CanReceiveGetCount = (TCanReceiveGetCount)MhsGetProcAddress(DriverHandle, "CanReceiveGetCount")))
error = -16;
else if (!(CanSetSpeed = (TCanSetSpeed)MhsGetProcAddress(DriverHandle, "CanSetSpeed")))
error = -17;
else if (!(CanSetSpeedUser = (TCanSetSpeedUser)MhsGetProcAddress(DriverHandle, "CanSetSpeedUser")))
error = -18;
else if (!(CanDrvInfo = (TCanDrvInfo)MhsGetProcAddress(DriverHandle, "CanDrvInfo")))
error = -19;
else if (!(CanDrvHwInfo = (TCanDrvHwInfo)MhsGetProcAddress(DriverHandle, "CanDrvHwInfo")))
error = -20;
else if (!(CanSetFilter = (TCanSetFilter)MhsGetProcAddress(DriverHandle, "CanSetFilter")))
error = -21;
else if (!(CanGetDeviceStatus = (TCanGetDeviceStatus)MhsGetProcAddress(DriverHandle, "CanGetDeviceStatus")))
error = -22;
else if (!(CanSetPnPEventCallback = (TCanSetPnPEventCallback)MhsGetProcAddress(DriverHandle, "CanSetPnPEventCallback")))
error = -23;
else if (!(CanSetStatusEventCallback = (TCanSetStatusEventCallback)MhsGetProcAddress(DriverHandle, "CanSetStatusEventCallback")))
error = -24;
else if (!(CanSetRxEventCallback = (TCanSetRxEventCallback)MhsGetProcAddress(DriverHandle, "CanSetRxEventCallback")))
error = -25;
else if (!(CanSetEvents = (TCanSetEvents)MhsGetProcAddress(DriverHandle, "CanSetEvents")))
error = -26;
else if (!(CanEventStatus = (TCanEventStatus)MhsGetProcAddress(DriverHandle, "CanEventStatus")))
error = -27;
// EX-Funktionen
else if (!(CanExGetDeviceCount = (TCanExGetDeviceCount)MhsGetProcAddress(DriverHandle, "CanExGetDeviceCount")))
error = -28;
else if (!(CanExGetDeviceList = (TCanExGetDeviceList)MhsGetProcAddress(DriverHandle, "CanExGetDeviceList")))
error = -29;
else if (!(CanExGetDeviceListPerform = (TCanExGetDeviceListPerform)MhsGetProcAddress(DriverHandle, "CanExGetDeviceListPerform")))
error = -57;
else if (!(CanExGetDeviceListGet = (TCanExGetDeviceListGet)MhsGetProcAddress(DriverHandle, "CanExGetDeviceListGet")))
error = -58;
else if (!(CanExGetDeviceInfo = (TCanExGetDeviceInfo)MhsGetProcAddress(DriverHandle, "CanExGetDeviceInfo")))
error = -30;
else if (!(CanExGetDeviceInfoPerform = (TCanExGetDeviceInfoPerform)MhsGetProcAddress(DriverHandle, "CanExGetDeviceInfoPerform")))
error = -59;
else if (!(CanExGetDeviceInfoGet = (TCanExGetDeviceInfoGet)MhsGetProcAddress(DriverHandle, "CanExGetDeviceInfoGet")))
error = -60;
else if (!(CanExDataFree = (TCanExDataFree)MhsGetProcAddress(DriverHandle, "CanExDataFree")))
error = -31;
else if (!(CanExCreateDevice = (TCanExCreateDevice)MhsGetProcAddress(DriverHandle, "CanExCreateDevice")))
error = -32;
else if (!(CanExDestroyDevice = (TCanExDestroyDevice)MhsGetProcAddress(DriverHandle, "CanExDestroyDevice")))
error = -33;
else if (!(CanExCreateFifo = (TCanExCreateFifo)MhsGetProcAddress(DriverHandle, "CanExCreateFifo")))
error = -34;
else if (!(CanExBindFifo = (TCanExBindFifo)MhsGetProcAddress(DriverHandle, "CanExBindFifo")))
error = -35;
else if (!(CanExCreateEvent = (TCanExCreateEvent)MhsGetProcAddress(DriverHandle, "CanExCreateEvent")))
error = -36;
else if (!(CanExSetObjEvent = (TCanExSetObjEvent)MhsGetProcAddress(DriverHandle, "CanExSetObjEvent")))
error = -37;
else if (!(CanExSetEvent = (TCanExSetEvent)MhsGetProcAddress(DriverHandle, "CanExSetEvent")))
error = -38;
else if (!(CanExResetEvent = (TCanExResetEvent)MhsGetProcAddress(DriverHandle, "CanExResetEvent")))
error = -39;
else if (!(CanExWaitForEvent = (TCanExWaitForEvent)MhsGetProcAddress(DriverHandle, "CanExWaitForEvent")))
error = -40;
else if (!(CanExInitDriver = (TCanExInitDriver)MhsGetProcAddress(DriverHandle, "CanExInitDriver")))
error = -41;
else if (!(CanExSetOptions = (TCanExSetOptions)MhsGetProcAddress(DriverHandle, "CanExSetOptions")))
error = -42;
else if (!(CanExSetAsByte = (TCanExSetAsByte)MhsGetProcAddress(DriverHandle, "CanExSetAsByte")))
error = -43;
else if (!(CanExSetAsWord = (TCanExSetAsWord)MhsGetProcAddress(DriverHandle, "CanExSetAsWord")))
error = -44;
else if (!(CanExSetAsLong = (TCanExSetAsLong)MhsGetProcAddress(DriverHandle, "CanExSetAsLong")))
error = -45;
else if (!(CanExSetAsUByte = (TCanExSetAsUByte)MhsGetProcAddress(DriverHandle, "CanExSetAsUByte")))
error = -46;
else if (!(CanExSetAsUWord = (TCanExSetAsUWord)MhsGetProcAddress(DriverHandle, "CanExSetAsUWord")))
error = -47;
else if (!(CanExSetAsULong = (TCanExSetAsULong)MhsGetProcAddress(DriverHandle, "CanExSetAsULong")))
error = -48;
else if (!(CanExSetAsString = (TCanExSetAsString)MhsGetProcAddress(DriverHandle, "CanExSetAsString")))
error = -49;
else if (!(CanExGetAsByte = (TCanExGetAsByte)MhsGetProcAddress(DriverHandle, "CanExGetAsByte")))
error = -50;
else if (!(CanExGetAsWord = (TCanExGetAsWord)MhsGetProcAddress(DriverHandle, "CanExGetAsWord")))
error = -51;
else if (!(CanExGetAsLong = (TCanExGetAsLong)MhsGetProcAddress(DriverHandle, "CanExGetAsLong")))
error = -52;
else if (!(CanExGetAsUByte = (TCanExGetAsUByte)MhsGetProcAddress(DriverHandle, "CanExGetAsUByte")))
error = -53;
else if (!(CanExGetAsUWord = (TCanExGetAsUWord)MhsGetProcAddress(DriverHandle, "CanExGetAsUWord")))
error = -54;
else if (!(CanExGetAsULong = (TCanExGetAsULong)MhsGetProcAddress(DriverHandle, "CanExGetAsULong")))
error = -55;
else if (!(CanExGetAsString = (TCanExGetAsString)MhsGetProcAddress(DriverHandle, "CanExGetAsString")))
error = -56;
else if (!(CanExGetAsStringCopy = (TCanExGetAsStringCopy)MhsGetProcAddress(DriverHandle, "CanExGetAsStringCopy")))
error = -61;
else if (!(CanExSetEventAll = (TCanExSetEventAll)MhsGetProcAddress(DriverHandle, "CanExSetEventAll")))
error = -62;
#ifdef STRICT_CAN_FD_SUPPORT
else if (!(CanFdTransmit = (TCanFdTransmit)MhsGetProcAddress(DriverHandle, "CanFdTransmit")))
error = -63;
else if (!(CanFdReceive = (TCanFdReceive)MhsGetProcAddress(DriverHandle, "CanFdReceive")))
error = -64;
#else
if (!(CanFdTransmit = (TCanFdTransmit)MhsGetProcAddress(DriverHandle, "CanFdTransmit")))
CanFdTransmit = DefCanFdTransmit;
if (!(CanFdReceive = (TCanFdReceive)MhsGetProcAddress(DriverHandle, "CanFdReceive")))
CanFdReceive = DefCanFdReceive;
#endif
// **** <*> neu
#ifdef STRICT_ECU_FLASH_SUPPORT
if (!(CanExSetAsData = (TCanExSetAsData)MhsGetProcAddress(DriverHandle, "CanExSetAsData")))
error = -65;
if (!(CanExSetDataPtr = (TCanExSetDataPtr)MhsGetProcAddress(DriverHandle, "CanExSetDataPtr")))
error = -66;
if (!(CanExSetDataBlockCB = (TCanExSetDataBlockCB)MhsGetProcAddress(DriverHandle, "CanExSetDataBlockCB")))
error = -64;
#else
if (!(CanExSetAsData = (TCanExSetAsData)MhsGetProcAddress(DriverHandle, "CanExSetAsData")))
CanExSetAsData = DefCanExSetAsData;
if (!(CanExSetDataPtr = (TCanExSetDataPtr)MhsGetProcAddress(DriverHandle, "CanExSetDataPtr")))
CanExSetDataPtr = DefCanExSetDataPtr;
if (!(CanExSetDataBlockCB = (TCanExSetDataBlockCB)MhsGetProcAddress(DriverHandle, "CanExSetDataBlockCB")))
CanExSetDataBlockCB = DefCanExSetDataBlockCB;
#endif
if (!(CanExGetInfoList = (TCanExGetInfoList)MhsGetProcAddress(DriverHandle, "CanExGetInfoList")))
CanExGetInfoList = DefCanExGetInfoList;
if (!(CanExGetInfoListPerform = (TCanExGetInfoListPerform)MhsGetProcAddress(DriverHandle, "CanExGetInfoListPerform")))
CanExGetInfoListPerform = DefCanExGetInfoListPerform;
if (!(CanExGetInfoListGet = (TCanExGetInfoListGet)MhsGetProcAddress(DriverHandle, "CanExGetInfoListGet")))
CanExGetInfoListGet = DefCanExGetInfoListGet;
if (!(MhsCanGetApiHandle = (TMhsCanGetApiHandle)MhsGetProcAddress(DriverHandle, "MhsCanGetApiHandle")))
MhsCanGetApiHandle = DefMhsCanGetApiHandle;
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
if (!(CanExIoOpen = (TCanExIoOpen)MhsGetProcAddress(DriverHandle, "CanExIoOpen")))
CanExIoOpen = DefCanExIoOpen;
if (!(CanExIoClose = (TCanExIoClose)MhsGetProcAddress(DriverHandle, "CanExIoClose")))
CanExIoClose = DefCanExIoClose;
if (!(CanExIoWrite = (TCanExIoWrite)MhsGetProcAddress(DriverHandle, "CanExIoWrite")))
CanExIoWrite = DefCanExIoWrite;
if (!(CanExIoRead = (TCanExIoRead)MhsGetProcAddress(DriverHandle, "CanExIoRead")))
CanExIoRead = DefCanExIoRead;
#endif
#endif
}
else
error = -100;
if (error)
UnloadDriver();
return(error);
}
/***************************************************************/
/* Treiber DLL entladen */
/***************************************************************/
void UnloadDriver(void)
{
#ifdef __WIN32__
HINSTANCE driver_handle;
#else
void *driver_handle;
#endif
driver_handle = DriverHandle;
DriverHandle = NULL;
#ifdef __WIN32__
MhsSafeFree(DriverFileName);
#endif
if (driver_handle)
CanDownDriver();
#ifdef CAN_API_TRUE_FUNC
PCanInitDriver = NULL;
PCanDownDriver = NULL;
PCanSetOptions = NULL;
PCanDeviceOpen = NULL;
PCanDeviceClose = NULL;
PCanSetMode = NULL;
PCanTransmit = NULL;
PCanTransmitClear = NULL;
PCanTransmitGetCount = NULL;
PCanTransmitSet = NULL;
PCanReceive = NULL;
PCanReceiveClear = NULL;
PCanReceiveGetCount = NULL;
PCanSetSpeed = NULL;
PCanSetSpeedUser = NULL;
PCanDrvInfo = NULL;
PCanDrvHwInfo = NULL;
PCanSetFilter = NULL;
PCanGetDeviceStatus = NULL;
PCanSetPnPEventCallback = NULL;
PCanSetStatusEventCallback = NULL;
PCanSetRxEventCallback = NULL;
PCanSetEvents = NULL;
PCanEventStatus = NULL;
// EX-Funktionen
PCanExGetDeviceCount = NULL;
PCanExGetDeviceList = NULL;
PCanExGetDeviceListPerform = NULL;
PCanExGetDeviceListGet = NULL;
PCanExGetDeviceInfo = NULL;
PCanExGetDeviceInfoPerform = NULL;
PCanExGetDeviceInfoGet = NULL;
PCanExDataFree = NULL;
PCanExCreateDevice = NULL;
PCanExDestroyDevice = NULL;
PCanExCreateFifo = NULL;
PCanExBindFifo = NULL;
PCanExCreateEvent = NULL;
PCanExSetObjEvent = NULL;
PCanExSetEvent = NULL;
PCanExSetEventAll = NULL;
PCanExResetEvent = NULL;
PCanExWaitForEvent = NULL;
PCanExInitDriver = NULL;
PCanExSetOptions = NULL;
PCanExSetAsByte = NULL;
PCanExSetAsWord = NULL;
PCanExSetAsLong = NULL;
PCanExSetAsUByte = NULL;
PCanExSetAsUWord = NULL;
PCanExSetAsULong = NULL;
PCanExSetAsString = NULL;
PCanExGetAsByte = NULL;
PCanExGetAsWord = NULL;
PCanExGetAsLong = NULL;
PCanExGetAsUByte = NULL;
PCanExGetAsUWord = NULL;
PCanExGetAsULong = NULL;
PCanExGetAsString = NULL;
PCanExGetAsStringCopy = NULL;
// **** CAN-FD
PCanFdTransmit = NULL;
PCanFdReceive = NULL;
// <*> neu
PCanExSetAsData = NULL;
PCanExSetDataPtr = NULL;
PCanExSetDataBlockCB = NULL;
PCanExGetInfoList = NULL;
PCanExGetInfoListPerform = NULL;
PCanExGetInfoListGet = NULL;
PMhsCanGetApiHandle = NULL;
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
PCanExIoOpen = NULL;
PCanExIoClose = NULL;
PCanExIoWrite = NULL;
PCanExIoRead = NULL;
#endif
#else
CanInitDriver = DefCanInitDriver;
CanDownDriver = DefCanDownDriver;
CanSetOptions = DefCanSetOptions;
CanDeviceOpen = DefCanDeviceOpen;
CanDeviceClose = DefCanDeviceClose;
CanSetMode = DefCanSetMode;
CanTransmit = DefCanTransmit;
CanTransmitClear = DefCanTransmitClear;
CanTransmitGetCount = DefCanTransmitGetCount;
CanTransmitSet = DefCanTransmitSet;
CanReceive = DefCanReceive;
CanReceiveClear = DefCanReceiveClear;
CanReceiveGetCount = DefCanReceiveGetCount;
CanSetSpeed = DefCanSetSpeed;
CanSetSpeedUser = DefCanSetSpeedUser;
CanDrvInfo = DefCanDrvInfo;
CanDrvHwInfo = DefCanDrvHwInfo;
CanSetFilter = DefCanSetFilter;
CanGetDeviceStatus = DefCanGetDeviceStatus;
CanSetPnPEventCallback = DefCanSetPnPEventCallback;
CanSetStatusEventCallback = DefCanSetStatusEventCallback;
CanSetRxEventCallback = DefCanSetRxEventCallback;
CanSetEvents = DefCanSetEvents;
CanEventStatus = DefCanEventStatus;
// EX-Funktionen
CanExGetDeviceCount = DefCanExGetDeviceCount;
CanExGetDeviceList = DefCanExGetDeviceList;
CanExGetDeviceListPerform = DefCanExGetDeviceListPerform;
CanExGetDeviceListGet = DefCanExGetDeviceListGet;
CanExGetDeviceInfo = DefCanExGetDeviceInfo;
CanExGetDeviceInfoPerform = DefCanExGetDeviceInfoPerform;
CanExGetDeviceInfoGet = DefCanExGetDeviceInfoGet;
CanExDataFree = DefCanExDataFree;
CanExCreateDevice = DefCanExCreateDevice;
CanExDestroyDevice = DefCanExDestroyDevice;
CanExCreateFifo = DefCanExCreateFifo;
CanExBindFifo = DefCanExBindFifo;
CanExCreateEvent = DefCanExCreateEvent;
CanExSetObjEvent = DefCanExSetObjEvent;
CanExSetEvent = DefCanExSetEvent;
CanExSetEventAll = DefCanExSetEventAll;
CanExResetEvent = DefCanExResetEvent;
CanExWaitForEvent = DefCanExWaitForEvent;
CanExInitDriver = DefCanExInitDriver;
CanExSetOptions = DefCanExSetOptions;
CanExSetAsByte = DefCanExSetAsByte;
CanExSetAsWord = DefCanExSetAsWord;
CanExSetAsLong = DefCanExSetAsLong;
CanExSetAsUByte = DefCanExSetAsUByte;
CanExSetAsUWord = DefCanExSetAsUWord;
CanExSetAsULong = DefCanExSetAsULong;
CanExSetAsString = DefCanExSetAsString;
CanExGetAsByte = DefCanExGetAsByte;
CanExGetAsWord = DefCanExGetAsWord;
CanExGetAsLong = DefCanExGetAsLong;
CanExGetAsUByte = DefCanExGetAsUByte;
CanExGetAsUWord = DefCanExGetAsUWord;
CanExGetAsULong = DefCanExGetAsULong;
CanExGetAsString = DefCanExGetAsString;
CanExGetAsStringCopy = DefCanExGetAsStringCopy;
CanFdTransmit = DefCanFdTransmit;
CanFdReceive = DefCanFdReceive;
// <*> neu
CanExSetAsData = DefCanExSetAsData;
CanExSetDataPtr = DefCanExSetDataPtr;
CanExSetDataBlockCB = DefCanExSetDataBlockCB;
CanExGetInfoList = DefCanExGetInfoList;
CanExGetInfoListPerform = DefCanExGetInfoListPerform;
CanExGetInfoListGet = DefCanExGetInfoListGet;
MhsCanGetApiHandle = DefMhsCanGetApiHandle;
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
CanExIoOpen = DefCanExIoOpen;
CanExIoClose = DefCanExIoClose;
CanExIoWrite = DefCanExIoWrite;
CanExIoRead = DefCanExIoRead;
#endif
#endif
if (driver_handle)
{
#ifdef __WIN32__
FreeLibrary(driver_handle);
#else
dlclose(driver_handle);
#endif
}
}
#ifdef CAN_API_TRUE_FUNC
/***************************************************************/
/* API Funktionen */
/***************************************************************/
int32_t CanInitDriver(char *options)
{
if (PCanInitDriver)
return((PCanInitDriver)(options));
else
return(ERR_NO_CAN_DRIVER_LOAD);
}
void CanDownDriver(void)
{
#ifdef DRV_REF_LOCKING
uint32_t cnt, i;
#endif
if (PCanDownDriver)
{
// **** Alle Events sperren
if (PCanSetEvents) // CanSetEvents(0);
(PCanSetEvents)(0);
if (PCanExSetEventAll) // CanExSetEventAll(MHS_TERMINATE);
(PCanExSetEventAll)(MHS_TERMINATE);
#ifdef DRV_REF_LOCKING
for (i = 5; i; i--)
{
cnt = 100;
while (TCanDrvRefCounter)
{
mhs_sleep(25);
if (!--cnt)
break;
}
mhs_sleep(1);
if (!TCanDrvRefCounter)
break;
}
TCanDrvRefCounter = 0;
#endif
(PCanDownDriver)();
}
}
int32_t CanSetOptions(char *options)
{
int32_t err;
if ((DriverHandle) && (PCanSetOptions))
{
CAN_DRV_REF();
err = (PCanSetOptions)(options);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanDeviceOpen(uint32_t index, char *parameter)
{
int32_t err;
if ((DriverHandle) && (PCanDeviceOpen))
{
CAN_DRV_REF();
err = (PCanDeviceOpen)(index, parameter);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanDeviceClose(uint32_t index)
{
int32_t err;
if ((DriverHandle) && (PCanDeviceClose))
{
CAN_DRV_REF();
err = (PCanDeviceClose)(index);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanSetMode(uint32_t index, unsigned char can_op_mode, uint16_t can_command)
{
int32_t err;
if ((DriverHandle) && (PCanSetMode))
{
CAN_DRV_REF();
err = (PCanSetMode)(index, can_op_mode, can_command);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanTransmit(uint32_t index, struct TCanMsg *msg, int32_t count)
{
int32_t err;
if ((DriverHandle) && (PCanTransmit))
{
CAN_DRV_REF();
err = (PCanTransmit)(index, msg, count);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
void CanTransmitClear(uint32_t index)
{
if ((DriverHandle) && (PCanTransmitClear))
{
CAN_DRV_REF();
(PCanTransmitClear)(index);
CAN_DRV_UNREF();
}
}
uint32_t CanTransmitGetCount(uint32_t index)
{
int32_t res;
res = 0;
if ((DriverHandle) && (PCanTransmitGetCount))
{
CAN_DRV_REF();
res = (PCanTransmitGetCount)(index);
CAN_DRV_UNREF();
}
return(res);
}
int32_t CanTransmitSet(uint32_t index, uint16_t cmd, uint32_t time)
{
int32_t err;
if ((DriverHandle) && (PCanTransmitSet))
{
CAN_DRV_REF();
err = (PCanTransmitSet)(index, cmd, time);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanReceive(uint32_t index, struct TCanMsg *msg, int32_t count)
{
int32_t err;
if ((DriverHandle) && (PCanReceive))
{
CAN_DRV_REF();
err = (PCanReceive)(index, msg, count);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
void CanReceiveClear(uint32_t index)
{
if ((DriverHandle) && (PCanReceiveClear))
{
CAN_DRV_REF();
(PCanReceiveClear)(index);
CAN_DRV_UNREF();
}
}
uint32_t CanReceiveGetCount(uint32_t index)
{
uint32_t res;
res = 0;
if ((DriverHandle) && (PCanReceiveGetCount))
{
CAN_DRV_REF();
res = (PCanReceiveGetCount)(index);
CAN_DRV_UNREF();
}
return(res);
}
int32_t CanSetSpeed(uint32_t index, uint16_t speed)
{
int32_t err;
if ((DriverHandle) && (PCanSetSpeed))
{
CAN_DRV_REF();
err = (PCanSetSpeed)(index, speed);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanSetSpeedUser(uint32_t index, uint32_t value)
{
int32_t err;
if ((DriverHandle) && (PCanSetSpeedUser))
{
CAN_DRV_REF();
err = (PCanSetSpeedUser)(index, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
char *CanDrvInfo(void)
{
char *res;
res = NULL;
if ((DriverHandle) && (PCanDrvInfo))
{
CAN_DRV_REF();
res = (PCanDrvInfo)();
CAN_DRV_UNREF();
}
return(res);
}
char *CanDrvHwInfo(uint32_t index)
{
char *res;
res = NULL;
if ((DriverHandle) && (PCanDrvHwInfo))
{
CAN_DRV_REF();
res = (PCanDrvHwInfo)(index);
CAN_DRV_UNREF();
}
return(res);
}
int32_t CanSetFilter(uint32_t index, struct TMsgFilter *msg_filter)
{
int32_t err;
if ((DriverHandle) && (PCanSetFilter))
{
CAN_DRV_REF();
err = (PCanSetFilter)(index, msg_filter);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanGetDeviceStatus(uint32_t index, struct TDeviceStatus *status)
{
int32_t err;
err = 0;
if ((DriverHandle) && (PCanGetDeviceStatus))
{
CAN_DRV_REF();
err = (PCanGetDeviceStatus)(index, status);
CAN_DRV_UNREF();
}
else
{
if (status)
{
status->CanStatus = CAN_STATUS_UNBEKANNT;
status->FifoStatus = FIFO_STATUS_UNBEKANNT;
status->DrvStatus = DRV_NOT_LOAD;
}
}
return(err);
}
void CanSetPnPEventCallback(void (DRV_CALLBACK_TYPE *event)(uint32_t index, int32_t status))
{
if ((DriverHandle) && (PCanSetPnPEventCallback))
{
CAN_DRV_REF();
(PCanSetPnPEventCallback)(event);
CAN_DRV_UNREF();
}
}
void CanSetStatusEventCallback(void (DRV_CALLBACK_TYPE *event)
(uint32_t index, struct TDeviceStatus *device_status))
{
if ((DriverHandle) && (PCanSetStatusEventCallback))
{
CAN_DRV_REF();
(PCanSetStatusEventCallback)(event);
CAN_DRV_UNREF();
}
}
void CanSetRxEventCallback(void (DRV_CALLBACK_TYPE *event)(uint32_t index,
struct TCanMsg *msg, int32_t count))
{
if ((DriverHandle) && (PCanSetRxEventCallback))
{
CAN_DRV_REF();
(PCanSetRxEventCallback)(event);
CAN_DRV_UNREF();
}
}
void CanSetEvents(uint16_t events)
{
if ((DriverHandle) && (PCanSetEvents))
{
CAN_DRV_REF();
(PCanSetEvents)(events);
CAN_DRV_UNREF();
}
}
uint32_t CanEventStatus(void)
{
int32_t err;
if ((DriverHandle) && (PCanEventStatus))
{
CAN_DRV_REF();
err = (PCanEventStatus)();
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
// EX-Funktionen
int32_t CanExGetDeviceCount(int32_t flags)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceCount))
{
CAN_DRV_REF();
err = (PCanExGetDeviceCount)(flags);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetDeviceList(struct TCanDevicesList **devices_list, int32_t flags)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceList))
{
CAN_DRV_REF();
err = (PCanExGetDeviceList)(devices_list, flags);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetDeviceListPerform(int32_t flags)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceListPerform))
{
CAN_DRV_REF();
err = (PCanExGetDeviceListPerform)(flags);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetDeviceListGet(struct TCanDevicesList *item)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceListGet))
{
CAN_DRV_REF();
err = (PCanExGetDeviceListGet)(item);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetDeviceInfo(uint32_t index, struct TCanDeviceInfo *device_info,
struct TCanInfoVar **hw_info, uint32_t *hw_info_size)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceInfo))
{
CAN_DRV_REF();
err = (PCanExGetDeviceInfo)(index, device_info, hw_info, hw_info_size);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetDeviceInfoPerform(uint32_t index, struct TCanDeviceInfo *device_info)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceInfoPerform))
{
CAN_DRV_REF();
err = (PCanExGetDeviceInfoPerform)(index, device_info);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetDeviceInfoGet(struct TCanInfoVar *item)
{
int32_t err;
if ((DriverHandle) && (PCanExGetDeviceInfoGet))
{
CAN_DRV_REF();
err = (PCanExGetDeviceInfoGet)(item);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
void CanExDataFree(void **data)
{
if ((DriverHandle) && (PCanExDataFree))
{
CAN_DRV_REF();
(PCanExDataFree)(data);
CAN_DRV_UNREF();
}
}
int32_t CanExCreateDevice(uint32_t *index, char *options)
{
int32_t err;
if ((DriverHandle) && (PCanExCreateDevice))
{
CAN_DRV_REF();
err = (PCanExCreateDevice)(index, options);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExDestroyDevice(uint32_t *index)
{
int32_t err;
if ((DriverHandle) && (PCanExDestroyDevice))
{
CAN_DRV_REF();
err = (PCanExDestroyDevice)(index);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExCreateFifo(uint32_t index, uint32_t size, TMhsEvent *event_obj, uint32_t event, uint32_t channels)
{
int32_t err;
if ((DriverHandle) && (PCanExCreateFifo))
{
CAN_DRV_REF();
err = (PCanExCreateFifo)(index, size, event_obj, event, channels);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExBindFifo(uint32_t fifo_index, uint32_t device_index, uint32_t bind)
{
int32_t err;
if ((DriverHandle) && (PCanExBindFifo))
{
CAN_DRV_REF();
err = (PCanExBindFifo)(fifo_index, device_index, bind);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
TMhsEvent *CanExCreateEvent(void)
{
TMhsEvent *event;
event = NULL;
if ((DriverHandle) && (PCanExCreateEvent))
{
CAN_DRV_REF();
event = (PCanExCreateEvent)();
CAN_DRV_UNREF();
}
return(event);
}
int32_t CanExSetObjEvent(uint32_t index, uint32_t source, TMhsEvent *event_obj, uint32_t event)
{
int32_t err;
if ((DriverHandle) && (PCanExSetObjEvent))
{
CAN_DRV_REF();
err = (PCanExSetObjEvent)(index, source, event_obj, event);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
void CanExSetEvent(TMhsEvent *event_obj, uint32_t event)
{
if ((DriverHandle) && (PCanExSetEvent))
{
CAN_DRV_REF();
(PCanExSetEvent)(event_obj, event);
CAN_DRV_UNREF();
}
}
void CanExSetEventAll(uint32_t event)
{
if ((DriverHandle) && (PCanExSetEventAll))
{
CAN_DRV_REF();
(PCanExSetEventAll)(event);
CAN_DRV_UNREF();
}
}
void CanExResetEvent(TMhsEvent *event_obj, uint32_t event)
{
if ((DriverHandle) && (PCanExResetEvent))
{
CAN_DRV_REF();
(PCanExResetEvent)(event_obj, event);
CAN_DRV_UNREF();
}
}
uint32_t CanExWaitForEvent(TMhsEvent *event_obj, uint32_t timeout)
{
uint32_t res;
res = MHS_TERMINATE;
if ((DriverHandle) && (PCanExWaitForEvent))
{
CAN_DRV_REF();
res = (PCanExWaitForEvent)(event_obj, timeout);
CAN_DRV_UNREF();
}
return(res);
}
int32_t CanExInitDriver(char *options)
{
if ((DriverHandle) && (PCanExInitDriver))
return((PCanExInitDriver)(options));
else
return(ERR_NO_CAN_DRIVER_LOAD);
}
int32_t CanExSetOptions(uint32_t index, char *options)
{
int32_t err;
if ((DriverHandle) && (PCanExSetOptions))
{
CAN_DRV_REF();
err = (PCanExSetOptions)(index, options);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsByte(uint32_t index, const char *name, char value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsByte))
{
CAN_DRV_REF();
err = (PCanExSetAsByte)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsWord(uint32_t index, const char *name, int16_t value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsWord))
{
CAN_DRV_REF();
err = (PCanExSetAsWord)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsLong(uint32_t index, const char *name, int32_t value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsLong))
{
CAN_DRV_REF();
err = (PCanExSetAsLong)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsUByte(uint32_t index, const char *name, unsigned char value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsUByte))
{
CAN_DRV_REF();
err = (PCanExSetAsUByte)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsUWord(uint32_t index, const char *name, uint16_t value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsUWord))
{
CAN_DRV_REF();
err = (PCanExSetAsUWord)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsULong(uint32_t index, const char *name, uint32_t value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsULong))
{
CAN_DRV_REF();
err = (PCanExSetAsULong)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetAsString(uint32_t index, const char *name, char *value)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsString))
{
CAN_DRV_REF();
err = (PCanExSetAsString)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsByte(uint32_t index, const char *name, char *value)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsByte))
{
CAN_DRV_REF();
err = (PCanExGetAsByte)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsWord(uint32_t index, const char *name, int16_t *value)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsWord))
{
CAN_DRV_REF();
err = (PCanExGetAsWord)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsLong(uint32_t index, const char *name, int32_t *value)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsLong))
{
CAN_DRV_REF();
err = (PCanExGetAsLong)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsUByte(uint32_t index, const char *name, unsigned char *value)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsUByte))
{
CAN_DRV_REF();
err = (PCanExGetAsUByte)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsUWord(uint32_t index, const char *name, uint16_t *value)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsUWord))
{
CAN_DRV_REF();
err = (PCanExGetAsUWord)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsULong(uint32_t index, const char *name, uint32_t *value)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsULong))
{
CAN_DRV_REF();
err = (PCanExGetAsULong)(index, name, value);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsString(uint32_t index, const char *name, char **str)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsString))
{
CAN_DRV_REF();
err = (PCanExGetAsString)(index, name, str);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetAsStringCopy(uint32_t index, const char *name, char *dest, uint32_t *dest_size)
{
int32_t err;
if ((DriverHandle) && (PCanExGetAsStringCopy))
{
CAN_DRV_REF();
err = (PCanExGetAsStringCopy)(index, name, dest, dest_size);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
// <*> neu
int32_t CanExSetAsData(uint32_t index, const char *name, void *data, uint32_t size)
{
int32_t err;
if ((DriverHandle) && (PCanExSetAsData))
{
CAN_DRV_REF();
err = (PCanExSetAsData)(index, name, data, size);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetDataPtr(uint32_t index, const char *name, void *data_ptr, uint32_t size)
{
int32_t err;
if ((DriverHandle) && (PCanExSetDataPtr))
{
CAN_DRV_REF();
err = (PCanExSetDataPtr)(index, name, data_ptr, size);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExSetDataBlockCB(uint32_t index, TCanGetDataBlockCB func, void *user_data)
{
int32_t err;
if ((DriverHandle) && (PCanExSetDataBlockCB))
{
CAN_DRV_REF();
err = (PCanExSetDataBlockCB)(index, func, user_data);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetInfoList(uint32_t dev_idx, const char *name, struct TCanInfoVarList **devices_info, int32_t flags)
{
int32_t err;
if ((DriverHandle) && (PCanExGetInfoList))
{
CAN_DRV_REF();
err = (PCanExGetInfoList)(dev_idx, name, devices_info, flags);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetInfoListPerform(uint32_t dev_idx, const char *name, int32_t flags)
{
int32_t err;
if ((DriverHandle) && (PCanExGetInfoListPerform))
{
CAN_DRV_REF();
err = (PCanExGetInfoListPerform)(dev_idx, name, flags);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExGetInfoListGet(uint32_t list_idx, struct TCanInfoVar *item)
{
int32_t err;
if ((DriverHandle) && (PCanExGetInfoListGet))
{
CAN_DRV_REF();
err = (PCanExGetInfoListGet)(list_idx, item);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t MhsCanGetApiHandle(void **api_handle)
{
int32_t err;
if ((DriverHandle) && (PMhsCanGetApiHandle))
{
CAN_DRV_REF();
err = (PMhsCanGetApiHandle)(api_handle);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
// **** CAN-FD
int32_t CanFdTransmit(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count)
{
int32_t err;
if (!DriverHandle)
err = ERR_NO_CAN_DRIVER_LOAD;
else if (PCanFdTransmit)
{
CAN_DRV_REF();
err = (PCanFdTransmit)(index, fd_msg, count);
CAN_DRV_UNREF();
}
else
#ifdef STRICT_CAN_FD_SUPPORT
err = ERR_NO_CAN_DRIVER_LOAD;
#else
err = -1; // <*>
#endif
return(err);
}
int32_t CanFdReceive(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count)
{
int32_t err;
if (!DriverHandle)
err = ERR_NO_CAN_DRIVER_LOAD;
else if (PCanFdReceive)
{
CAN_DRV_REF();
err = (PCanFdReceive)(index, fd_msg, count);
CAN_DRV_UNREF();
}
else
#ifdef STRICT_CAN_FD_SUPPORT
err = ERR_NO_CAN_DRIVER_LOAD;
#else
err = -1; // <*>
#endif
return(err);
}
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
int32_t CanExIoOpen(uint32_t index, const char *name, uint32_t *io_id)
{
int32_t err;
if ((DriverHandle) && (PCanExIoOpen))
{
CAN_DRV_REF();
err = (PCanExIoOpen)(index, name, io_id);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExIoClose(uint32_t io_id)
{
int32_t err;
if ((DriverHandle) && (PCanExIoClose))
{
CAN_DRV_REF();
err = (PCanExIoClose)(io_id);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExIoWrite(uint32_t io_id, void *data, uint32_t *size, uint32_t timeout)
{
int32_t err;
if ((DriverHandle) && (PCanExIoWrite))
{
CAN_DRV_REF();
err = (PCanExIoWrite)(io_id, data, size, timeout);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
int32_t CanExIoRead(uint32_t io_id, void *data, uint32_t *size, uint32_t timeout)
{
int32_t err;
if ((DriverHandle) && (PCanExIoRead))
{
CAN_DRV_REF();
err = (PCanExIoRead)(io_id, data, size, timeout);
CAN_DRV_UNREF();
}
else
err = ERR_NO_CAN_DRIVER_LOAD;
return(err);
}
#endif
#else
/***************************************************************/
/* Default Call */
/***************************************************************/
void DefDriverProcedure(int32_t func)
{
(void)func;
}
/***************************************************************/
/* Default Funktionen */
/***************************************************************/
int32_t DRV_CALLBACK_TYPE DefCanInitDriver(char *options)
{
(void)options;
DefDriverProcedure(1);
return(0);
}
void DRV_CALLBACK_TYPE DefCanDownDriver(void)
{
// DefDriverProcedure(1);
}
int32_t DRV_CALLBACK_TYPE DefCanSetOptions(char *options)
{
(void)options;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanDeviceOpen(uint32_t index, char *parameter)
{
(void)index;
(void)parameter;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanDeviceClose(uint32_t index)
{
(void)index;
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanSetMode(uint32_t index, unsigned char can_op_mode, uint16_t can_command)
{
(void)index;
(void)can_op_mode;
(void)can_command;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanSet(uint32_t index, uint16_t obj_index, uint16_t obj_sub_index, void *data, int32_t size)
{
(void)index;
(void)obj_index;
(void)obj_sub_index;
(void)data;
(void)size;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanGet(uint32_t index, uint16_t obj_index, uint16_t obj_sub_index, void *data, int32_t size)
{
(void)index;
(void)obj_index;
(void)obj_sub_index;
(void)data;
(void)size;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanTransmit(uint32_t index, struct TCanMsg *msg, int32_t count)
{
(void)index;
(void)msg;
(void)count;
DefDriverProcedure(1);
return(0);
}
void DRV_CALLBACK_TYPE DefCanTransmitClear(uint32_t index)
{
(void)index;
DefDriverProcedure(1);
}
uint32_t DRV_CALLBACK_TYPE DefCanTransmitGetCount(uint32_t index)
{
(void)index;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanTransmitSet(uint32_t index, uint16_t cmd, uint32_t time)
{
(void)index;
(void)cmd;
(void)time;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanReceive(uint32_t index, struct TCanMsg *msg, int32_t count)
{
(void)index;
(void)msg;
(void)count;
DefDriverProcedure(1);
return(0);
}
void DRV_CALLBACK_TYPE DefCanReceiveClear(uint32_t index)
{
(void)index;
DefDriverProcedure(1);
}
uint32_t DRV_CALLBACK_TYPE DefCanReceiveGetCount(uint32_t index)
{
(void)index;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanSetSpeed(uint32_t index, uint16_t speed)
{
(void)index;
(void)speed;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanSetSpeedUser(uint32_t index, uint32_t value)
{
(void)index;
(void)value;
DefDriverProcedure(1);
return(0);
}
char * DRV_CALLBACK_TYPE DefCanDrvInfo(void)
{
DefDriverProcedure(1);
return(NULL);
}
char * DRV_CALLBACK_TYPE DefCanDrvHwInfo(uint32_t index)
{
(void)index;
DefDriverProcedure(1);
return(NULL);
}
int32_t DRV_CALLBACK_TYPE DefCanSetFilter(uint32_t index, struct TMsgFilter *msg_filter)
{
(void)index;
(void)msg_filter;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanGetDeviceStatus(uint32_t index, struct TDeviceStatus *status)
{
(void)index;
(void)status;
status->CanStatus = CAN_STATUS_UNBEKANNT;
status->FifoStatus = FIFO_STATUS_UNBEKANNT;
status->DrvStatus = DRV_NOT_LOAD;
return(0);
}
void DRV_CALLBACK_TYPE DefCanSetPnPEventCallback(void (DRV_CALLBACK_TYPE *event)(uint32_t index, int32_t status))
{
(void)event;
DefDriverProcedure(1);
}
void DRV_CALLBACK_TYPE DefCanSetStatusEventCallback(void (DRV_CALLBACK_TYPE *event)
(uint32_t index, struct TDeviceStatus *device_status))
{
(void)event;
DefDriverProcedure(1);
}
void DRV_CALLBACK_TYPE DefCanSetRxEventCallback(void (DRV_CALLBACK_TYPE *event)(uint32_t index,
struct TCanMsg *msg, int32_t count))
{
(void)event;
DefDriverProcedure(1);
}
void DRV_CALLBACK_TYPE DefCanSetEvents(uint16_t events)
{
(void)events;
DefDriverProcedure(1);
}
uint32_t DRV_CALLBACK_TYPE DefCanEventStatus(void)
{
DefDriverProcedure(1);
return(1);
}
// EX-Funktionen
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceCount(int32_t flags)
{
(void)flags;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceList(struct TCanDevicesList **devices_list, int32_t flags)
{
(void)devices_list;
(void)flags;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceListPerform(int32_t flags)
{
(void)flags;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceListGet(struct TCanDevicesList *item)
{
(void)item;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceInfo(uint32_t index, struct TCanDeviceInfo *device_info,
struct TCanInfoVar **hw_info, uint32_t *hw_info_size)
{
(void)index;
(void)device_info;
(void)hw_info;
(void)hw_info_size;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceInfoPerform(uint32_t index, struct TCanDeviceInfo *device_info)
{
(void)index;
(void)device_info;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetDeviceInfoGet(struct TCanInfoVar *item)
{
(void)item;
DefDriverProcedure(1);
return(0);
}
void DRV_CALLBACK_TYPE DefCanExDataFree(void **data)
{
(void)data;
DefDriverProcedure(1);
}
int32_t DRV_CALLBACK_TYPE DefCanExCreateDevice(uint32_t *index, char *options)
{
(void)index;
(void)options;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExDestroyDevice(uint32_t *index)
{
(void)index;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExCreateFifo(uint32_t index, uint32_t size, TMhsEvent *event_obj, uint32_t event, uint32_t channels)
{
(void)index;
(void)size;
(void)event_obj;
(void)event;
(void)channels;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExBindFifo(uint32_t fifo_index, uint32_t device_index, uint32_t bind)
{
(void)fifo_index;
(void)device_index;
(void)bind;
DefDriverProcedure(1);
return(0);
}
TMhsEvent * DRV_CALLBACK_TYPE DefCanExCreateEvent(void)
{
DefDriverProcedure(1);
return(NULL);
}
int32_t DRV_DRV_CALLBACK_TYPE_TYPE DefCanExSetObjEvent(uint32_t index, uint32_t source, TMhsEvent *event_obj, uint32_t event)
{
(void)index;
(void)source;
(void)event_obj;
(void)event;
DefDriverProcedure(1);
return(0);
}
void DRV_CALLBACK_TYPE DefCanExSetEvent(TMhsEvent *event_obj, uint32_t event)
{
(void)event_obj;
(void)event;
DefDriverProcedure(1);
}
void DRV_CALLBACK_TYPE DefCanExSetEventAll(uint32_t event)
{
(void)event;
DefDriverProcedure(1);
}
void DRV_CALLBACK_TYPE DefCanExResetEvent(TMhsEvent *event_obj, uint32_t event)
{
(void)event_obj;
(void)event;
DefDriverProcedure(1);
}
uint32_t DRV_CALLBACK_TYPE DefCanExWaitForEvent(TMhsEvent *event_obj, uint32_t timeout)
{
(void)event_obj;
(void)timeout;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExInitDriver(char *options)
{
(void)options;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetOptions(uint32_t index, char *options)
{
(void)index;
(void)options;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsByte(uint32_t index, char *name, char value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsWord(uint32_t index, char *name, int16_t value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsLong(uint32_t index, char *name, int32_t value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsUByte(uint32_t index, char *name, unsigned char value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsUWord(uint32_t index, char *name, uint16_t value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsULong(uint32_t index, char *name, uint32_t value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExSetAsString(uint32_t index, char *name, char *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsByte(uint32_t index, char *name, char *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsWord(uint32_t index, char *name, int16_t *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsLong(uint32_t index, char *name, int32_t *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsUByte(uint32_t index, char *name, unsigned char *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsUWord(uint32_t index, char *name, uint16_t *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsULong(uint32_t index, char *name, uint32_t *value)
{
(void)index;
(void)name;
(void)value;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsString(uint32_t index, char *name, char **str)
{
(void)index;
(void)name;
(void)str;
DefDriverProcedure(1);
return(0);
}
int32_t DRV_CALLBACK_TYPE DefCanExGetAsStringCopy(uint32_t index, char *name, char *dest, uint32_t *dest_size)
{
(void)index;
(void)name;
(void)dest;
(void)dest_size;
DefDriverProcedure(1);
return(0);
}
// **** CAN-FD
int32_t DefCanFdTransmit(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count)
{
(void)index;
(void)fd_msg;
(void)count;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanFdReceive(uint32_t index, struct TCanFdMsg *fd_msg, int32_t count)
{
(void)index;
(void)fd_msg;
(void)count;
DefDriverProcedure(1);
return(0);
}
// **** <*> neu
int32_t DefCanExSetAsData(uint32_t index, char *name, void *data, uint32_t size);
{
(void)index;
(void)name;
(void)data;
(void)size;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExSetDataPtr(uint32_t index, char *name, void *data_ptr, uint32_t size);
{
(void)index;
(void)name;
(void)data_ptr;
(void)size;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExSetDataBlockCB(uint32_t index, TCanGetDataBlockCB func, void *user_data)
{
(void)index;
(void)func;
(void)user_data;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExGetInfoList(uint32_t dev_idx, const char *name, struct TCanInfoVarLists *devices_info, int32_t flags)
{
(void)dev_idx;
(void)name;
(void)devices_info;
(void)flags;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExGetInfoListPerform(uint32_t dev_idx, const char *name, int32_t flags)
{
(void)dev_idx;
(void)name;
(void)flags;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExGetInfoListGet(uint32_t list_idx, struct TCanInfoVar *item)
{
(void)list_idx;
(void)item;
DefDriverProcedure(1);
return(0);
}
int32_t DefMhsCanGetApiHandle(void **api_handle)
{
(void)api_handle;
DefDriverProcedure(1);
return(0);
}
#ifdef ENABLE_EX_IO_SUPPORT // <*> neu
int32_t DefCanExIoOpen(uint32_t index, const char *name, uint32_t *io_id)
{
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExIoClose(uint32_t io_id)
{
(void)io_id;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExIoWrite(uint32_t io_id, void *data, uint32_t *size, uint32_t timeout)
{
(void)io_id;
(void)data;
(void)size;
(void)timeout;
DefDriverProcedure(1);
return(0);
}
int32_t DefCanExIoRead(uint32_t io_id, void *data, uint32_t *size, uint32_t timeout)
{
(void)io_id;
(void)data;
(void)size;
(void)timeout;
DefDriverProcedure(1);
return(0);
}
#endif
#endif
/***************************************************************/
/* API Treiber Path ermitteln */
/***************************************************************/
#ifndef __WIN32__ // Linux
#define MAX_PATH_LEN 255
#define DIR_SEPARATOR '/'
#define DIR_SEPARATOR_STR "/"
/**************************************************************************/
/* C O N S T A N T E N - Linux */
/**************************************************************************/
static const char API_DRIVER_DLL[] = {"libmhstcan.so"};
static const char API_PATH_CFG_FILE[] = {"/etc/tiny_can/api.path"};
#define HAVE_API_DRV_DEFAULT_PATH
static const char API_DRV_DEFAULT_PATH[] = {"/opt/tiny_can/can_api"};
#ifdef __LP64__
static const char API_DRIVER_X64_DIR[] = {"x64"};
#else
static const char API_DRIVER_X32_DIR[] = {"x32"};
#endif
#else
#define MAX_PATH_LEN 255
#define DIR_SEPARATOR '\\'
#define DIR_SEPARATOR_STR "\\"
/**************************************************************************/
/* C O N S T A N T E N - Windows */
/**************************************************************************/
#ifdef _WIN64
static const char REG_TINY_CAN_API[] = {"Software\\Wow6432Node\\Tiny-CAN\\API"};
#else
static const char REG_TINY_CAN_API[] = {"Software\\Tiny-CAN\\API"};
#endif
static const char REG_TINY_CAN_API_PATH_ENTRY[] = {"PATH"};
static const char API_DRIVER_DLL[] = {"mhstcan.dll"};
#ifdef _WIN64
static const char API_DRIVER_X64_DIR[] = {"x64"};
#endif
//typedef char *(*TCanDrvInfoCB)(void);
#endif
/**************************************************************************/
/* F U N K T I O N E N */
/**************************************************************************/
#if defined(__WIN32__) || defined(LINUX_HAVE_GET_API_DRIVER_PATH)
static char *MhsStpCpy(char *dest, const char *src)
{
register char *d = dest;
register const char *s = src;
do
*d++ = *s;
while (*s++);
return(d - 1);
}
static char *MhsStrDup(const char *str)
{
size_t len;
char *new_str;
if (str)
{
len = strlen(str) + 1;
new_str = (char *)malloc(len);
if (!new_str)
return(NULL);
memcpy(new_str, str, len);
return(new_str);
}
else
return(NULL);
}
static char *MhsStrconcat(const char *string1, ...)
{
size_t l;
va_list args;
char *s, *concat, *ptr;
if (!string1)
return(NULL);
l = 1 + strlen(string1);
va_start(args, string1);
s = va_arg(args, char*);
while (s)
{
l += strlen(s);
s = va_arg(args, char*);
}
va_end(args);
concat = (char *)malloc(l);
if (!concat)
return(NULL);
ptr = concat;
ptr = MhsStpCpy(ptr, string1);
va_start (args, string1);
s = va_arg(args, char*);
while (s)
{
ptr = MhsStpCpy(ptr, s);
s = va_arg(args, char*);
}
va_end(args);
return(concat);
}
static char *MhsCreateFileName(const char *dir, const char *sub_dir, const char *file_name)
{
if (!dir)
return(MhsStrDup(file_name));
if (!file_name)
return(NULL);
if (strchr(file_name, DIR_SEPARATOR))
return(MhsStrDup(file_name));
else
{
if (sub_dir)
{
if (dir[strlen(dir)-1] == DIR_SEPARATOR)
{
if (sub_dir[strlen(sub_dir)-1] == DIR_SEPARATOR)
return(MhsStrconcat(dir, sub_dir, file_name, NULL));
else
return(MhsStrconcat(dir, sub_dir, DIR_SEPARATOR_STR, file_name, NULL));
}
else
{
if (sub_dir[strlen(sub_dir)-1] == DIR_SEPARATOR)
return(MhsStrconcat(dir, DIR_SEPARATOR_STR, sub_dir, file_name, NULL));
else
return(MhsStrconcat(dir, DIR_SEPARATOR_STR, sub_dir, DIR_SEPARATOR_STR, file_name, NULL));
}
}
else
{
if (dir[strlen(dir)-1] == DIR_SEPARATOR)
return(MhsStrconcat(dir, file_name, NULL));
else
return(MhsStrconcat(dir, DIR_SEPARATOR_STR, file_name, NULL));
}
}
}
static int32_t TestApi(const char *file_name)
{
#ifdef __WIN32__
HINSTANCE driver_handle;
#else
void *driver_handle;
#endif
TCanDrvInfo drv_info_cb;
drv_info_cb = NULL;
#ifdef __WIN32__
driver_handle = LoadLibraryA(file_name);
#else
driver_handle = dlopen(file_name, RTLD_LAZY);
#endif
if (driver_handle)
{
drv_info_cb = (TCanDrvInfo)MhsGetProcAddress(driver_handle, "CanDrvInfo");
#ifdef __WIN32__
FreeLibrary(driver_handle);
#else
dlclose(driver_handle);
#endif
}
#if defined(MHS_DRV_DEBUG_OUTPUT) && (!defined(__WIN32__))
else
printf("Error load: %s\n\r, ", dlerror());
#endif
if (drv_info_cb)
return(0);
else
return(-1);
}
#endif
#ifdef __WIN32__
static char *MhsRegGetString(HKEY key, const char *value_name)
{
DWORD type, data_size;
char *str;
type = 0;
data_size = 0;
if ((!key) || (!value_name))
return(NULL);
// Länge des Strings ermitteln
if (RegQueryValueExA(key, value_name, 0, &type, NULL, &data_size) != ERROR_SUCCESS)
return(NULL);
// Wert ist String ?
if (type != REG_SZ)
return(NULL);
str = malloc(data_size+1);
if (!str)
return(NULL);
// String lesen
if (RegQueryValueExA(key, value_name, 0, &type, (LPBYTE)str, &data_size) != ERROR_SUCCESS)
{
free(str);
return(NULL);
}
str[data_size] = '\0';
return(str);
}
static char *MhsRegReadStringEntry(const char *path, const char *entry)
{
HKEY key;
char *value;
value = NULL;
// HKEY_CURRENT_USER ?
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, path, 0, KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) // KEY_READ
{
value = MhsRegGetString(key, entry);
RegCloseKey(key);
}
return(value);
}
/* <*> raus
static int32_t TestApi(const char *file_name)
{
HINSTANCE driver_dll;
TCanDrvInfo drv_info_cb;
drv_info_cb = NULL;
driver_dll = LoadLibraryA(file_name);
if (driver_dll)
{
drv_info_cb = (TCanDrvInfo)(void *)GetProcAddress(driver_dll, (LPCSTR)"CanDrvInfo");
FreeLibrary(driver_dll);
}
if (drv_info_cb)
return(0);
else
return(-1);
} */
static char *GetApiDriverWithPath(const char *driver_file)
{
char *path, *file_name;
char app_file[MAX_PATH_LEN];
char app_path[MAX_PATH_LEN];
char *ptr;
file_name = NULL;
if ((!driver_file ) || (!strlen(driver_file)))
driver_file = API_DRIVER_DLL;
if (strchr(driver_file, DIR_SEPARATOR))
return(MhsStrDup(driver_file));
if ((path = MhsRegReadStringEntry(REG_TINY_CAN_API, REG_TINY_CAN_API_PATH_ENTRY)))
{
#ifdef _WIN64
file_name = MhsCreateFileName(path, API_DRIVER_X64_DIR, driver_file);
#else
file_name = MhsCreateFileName(path, NULL, driver_file);
#endif
if (TestApi(file_name))
MhsSafeFree(file_name);
free(path);
}
if (!file_name)
{
// Programm Path ermitteln
GetModuleFileNameA(GetModuleHandle(NULL), app_file, MAX_PATH_LEN);
GetFullPathNameA(app_file, sizeof(app_file), app_path, &ptr);
app_path[ptr-app_path] = '\0';
file_name = MhsCreateFileName(app_path, NULL, driver_file);
if (TestApi(file_name))
MhsSafeFree(file_name);
}
return(file_name);
}
#else
#ifdef LINUX_HAVE_GET_API_DRIVER_PATH
static char *GetAppPath(void)
{
char buf[MAX_PATH_LEN];
char *path, *ptr;
int fd;
size_t n;
path = NULL;
SafeSprintf(buf, (MAX_PATH_LEN - 1), "/proc/%d/cmdline", getpid());
fd = open(buf, O_RDONLY);
if (fd > -1)
{
if ((n = read(fd, buf, 200)) > 0)
{
buf[n] = '\0';
path = (char *)malloc(PATH_MAX);
if (!realpath(buf, path))
MhsSafeFree(path);
else
{
ptr = strrchr(path, DIR_SEPARATOR);
if (ptr)
*ptr = '\0';
else
MhsSafeFree(path);
}
}
close(fd);
}
return(path);
}
static char *ReadPathFromCfgFile(void)
{
char buf[MAX_PATH_LEN];
char *path;
int fd;
size_t n;
path = NULL;
fd = open(API_PATH_CFG_FILE, O_RDONLY);
if (fd > -1)
{
if ((n = read(fd, buf, 200)) > 0)
{
buf[n] = '\0';
path = MhsStrDup(buf);
}
close(fd);
}
return(path);
}
static char *GetApiDriverWithPath(const char *driver_file)
{
char *path, *file_name;
file_name = NULL;
if ((!driver_file ) || (!strlen(driver_file)))
driver_file = API_DRIVER_DLL;
if (strchr(driver_file, DIR_SEPARATOR))
return(MhsStrDup(driver_file));
// **** 1. Pfad vom Konfig File
if ((path = ReadPathFromCfgFile()))
{
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("driver path from config file: %s\n\r", path);
#endif
#ifdef __LP64__
file_name = MhsCreateFileName(path, API_DRIVER_X64_DIR, driver_file);
#else
file_name = MhsCreateFileName(path, API_DRIVER_X32_DIR, driver_file);
#endif
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("1. API driver with full path: %s\n\r", file_name);
#endif
if (TestApi(file_name))
{
MhsSafeFree(file_name);
file_name = MhsCreateFileName(path, NULL, driver_file);
if (TestApi(file_name))
MhsSafeFree(file_name);
}
free(path);
}
#ifdef HAVE_API_DRV_DEFAULT_PATH
// **** 2. Default API Pfad
if (!file_name)
{
#ifdef __LP64__
file_name = MhsCreateFileName(API_DRV_DEFAULT_PATH, API_DRIVER_X64_DIR, driver_file);
#else
file_name = MhsCreateFileName(API_DRV_DEFAULT_PATH, API_DRIVER_X32_DIR, driver_file);
#endif
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("2. API driver with full path: %s\n\r", file_name);
#endif
if (TestApi(file_name))
MhsSafeFree(file_name);
}
if (!file_name)
{
file_name = MhsCreateFileName(API_DRV_DEFAULT_PATH, NULL, driver_file);
if (TestApi(file_name))
MhsSafeFree(file_name);
}
#endif
// **** 3. Pfad gleich APP Pfad
if (!file_name)
{
if ((path = GetAppPath()))
{
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("application path: %s\n\r", path);
#endif
file_name = MhsCreateFileName(path, NULL, driver_file);
#ifdef MHS_DRV_DEBUG_OUTPUT
printf("3. API driver with full path: %s\n\r", file_name);
#endif
if (TestApi(file_name))
MhsSafeFree(file_name);
free(path);
}
}
if (!file_name)
file_name = MhsStrDup(driver_file);
return(file_name);
}
#endif
#endif