/*************************************************************************** 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 #include #if defined(MHS_DRV_DEBUG_OUTPUT) #include #include #endif #else #include #include #include #include #include #if defined(LINUX_HAVE_GET_API_DRIVER_PATH) #include #include #include #include #include /* PATH_MAX */ #endif #if defined(MHS_DRV_DEBUG_OUTPUT) || defined(LINUX_HAVE_GET_API_DRIVER_PATH) #include #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