23#ifndef CO_DRIVER_TARGET_H
24#define CO_DRIVER_TARGET_H
34#ifndef CO_SINGLE_THREAD
41#ifdef CO_DRIVER_CUSTOM
42#include "CO_driver_custom.h"
51#ifdef CO_SINGLE_THREAD
52#define CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE 0
54#define CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE CO_CONFIG_FLAG_CALLBACK_PRE
56#define CO_CONFIG_GLOBAL_FLAG_TIMERNEXT CO_CONFIG_FLAG_TIMERNEXT
59#define CO_CONFIG_NMT \
60 (CO_CONFIG_NMT_CALLBACK_CHANGE | CO_CONFIG_NMT_MASTER | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE \
61 | CO_CONFIG_GLOBAL_FLAG_TIMERNEXT)
64#ifndef CO_CONFIG_HB_CONS
65#define CO_CONFIG_HB_CONS \
66 (CO_CONFIG_HB_CONS_ENABLE | CO_CONFIG_HB_CONS_CALLBACK_CHANGE | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE \
67 | CO_CONFIG_GLOBAL_FLAG_TIMERNEXT | CO_CONFIG_GLOBAL_FLAG_OD_DYNAMIC)
72 (CO_CONFIG_EM_PRODUCER | CO_CONFIG_EM_PROD_CONFIGURABLE | CO_CONFIG_EM_PROD_INHIBIT | CO_CONFIG_EM_HISTORY \
73 | CO_CONFIG_EM_STATUS_BITS | CO_CONFIG_EM_CONSUMER | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE \
74 | CO_CONFIG_GLOBAL_FLAG_TIMERNEXT)
77#ifndef CO_CONFIG_SDO_SRV
78#define CO_CONFIG_SDO_SRV \
79 (CO_CONFIG_SDO_SRV_SEGMENTED | CO_CONFIG_SDO_SRV_BLOCK | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE \
80 | CO_CONFIG_GLOBAL_FLAG_TIMERNEXT | CO_CONFIG_GLOBAL_FLAG_OD_DYNAMIC)
83#ifndef CO_CONFIG_SDO_SRV_BUFFER_SIZE
84#define CO_CONFIG_SDO_SRV_BUFFER_SIZE 900
87#ifndef CO_CONFIG_SDO_CLI
88#define CO_CONFIG_SDO_CLI \
89 (CO_CONFIG_SDO_CLI_ENABLE | CO_CONFIG_SDO_CLI_SEGMENTED | CO_CONFIG_SDO_CLI_BLOCK | CO_CONFIG_SDO_CLI_LOCAL \
90 | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE | CO_CONFIG_GLOBAL_FLAG_TIMERNEXT | CO_CONFIG_GLOBAL_FLAG_OD_DYNAMIC)
94#define CO_CONFIG_TIME \
95 (CO_CONFIG_TIME_ENABLE | CO_CONFIG_TIME_PRODUCER | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE \
96 | CO_CONFIG_GLOBAL_FLAG_OD_DYNAMIC)
100#define CO_CONFIG_LSS \
101 (CO_CONFIG_LSS_SLAVE | CO_CONFIG_LSS_SLAVE_FASTSCAN_DIRECT_RESPOND | CO_CONFIG_LSS_MASTER \
102 | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE)
106#define CO_CONFIG_GFC (CO_CONFIG_GFC_ENABLE | CO_CONFIG_GFC_CONSUMER | CO_CONFIG_GFC_PRODUCER)
109#ifndef CO_CONFIG_SRDO
110#define CO_CONFIG_SRDO \
111 (CO_CONFIG_SRDO_ENABLE | CO_CONFIG_SRDO_CHECK_TX | CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE \
112 | CO_CONFIG_GLOBAL_FLAG_TIMERNEXT)
116#define CO_CONFIG_GTW \
117 (CO_CONFIG_GTW_ASCII | CO_CONFIG_GTW_ASCII_SDO | CO_CONFIG_GTW_ASCII_NMT | CO_CONFIG_GTW_ASCII_LSS \
118 | CO_CONFIG_GTW_ASCII_LOG | CO_CONFIG_GTW_ASCII_ERROR_DESC | CO_CONFIG_GTW_ASCII_PRINT_HELP \
119 | CO_CONFIG_GTW_ASCII_PRINT_LEDS)
120#define CO_CONFIG_GTW_BLOCK_DL_LOOP 3
121#define CO_CONFIG_GTWA_COMM_BUF_SIZE 2000
122#define CO_CONFIG_GTWA_LOG_BUF_SIZE 10000
125#ifndef CO_CONFIG_CRC16
126#define CO_CONFIG_CRC16 (CO_CONFIG_CRC16_ENABLE)
129#ifndef CO_CONFIG_FIFO
130#define CO_CONFIG_FIFO \
131 (CO_CONFIG_FIFO_ENABLE | CO_CONFIG_FIFO_ALT_READ | CO_CONFIG_FIFO_CRC16_CCITT | CO_CONFIG_FIFO_ASCII_COMMANDS \
132 | CO_CONFIG_FIFO_ASCII_DATATYPES)
136#if (CO_CONFIG_DEBUG) & CO_CONFIG_DEBUG_COMMON
139#define CO_DEBUG_COMMON(msg) log_printf(LOG_DEBUG, DBG_CO_DEBUG, msg);
166#ifndef CO_DRIVER_MULTI_INTERFACE
167#define CO_DRIVER_MULTI_INTERFACE 0
186#ifndef CO_DRIVER_ERROR_REPORTING
187#define CO_DRIVER_ERROR_REPORTING 1
195#if __BYTE_ORDER == __LITTLE_ENDIAN
196#define CO_LITTLE_ENDIAN
197#define CO_SWAP_16(x) x
198#define CO_SWAP_32(x) x
199#define CO_SWAP_64(x) x
203#define CO_SWAP_16(x) bswap_16(x)
204#define CO_SWAP_32(x) bswap_32(x)
205#define CO_SWAP_64(x) bswap_64(x)
211typedef uint_fast8_t bool_t;
212typedef float float32_t;
213typedef double float64_t;
224static inline uint16_t
225CO_CANrxMsg_readIdent(
void* rxMsg) {
226 CO_CANrxMsg_t* rxMsgCasted = (CO_CANrxMsg_t*)rxMsg;
227 return (uint16_t)(rxMsgCasted->ident & CAN_SFF_MASK);
231CO_CANrxMsg_readDLC(
void* rxMsg) {
232 CO_CANrxMsg_t* rxMsgCasted = (CO_CANrxMsg_t*)rxMsg;
233 return (uint8_t)(rxMsgCasted->DLC);
236static inline uint8_t*
237CO_CANrxMsg_readData(
void* rxMsg) {
238 CO_CANrxMsg_t* rxMsgCasted = (CO_CANrxMsg_t*)rxMsg;
239 return (uint8_t*)(rxMsgCasted->data);
247 void (*CANrx_callback)(
void* object,
void* message);
249 struct timespec timestamp;
258 volatile bool_t bufferFull;
259 volatile bool_t syncFlag;
264#define CO_CAN_MSG_SFF_MAX_COB_ID (1 << CAN_SFF_ID_BITS)
270} CO_CANptrSocketCan_t;
275 char ifName[IFNAMSIZ];
277#if CO_DRIVER_ERROR_REPORTING > 0 || defined CO_DOXYGEN
285 CO_CANinterface_t* CANinterfaces;
286 uint32_t CANinterfaceCount;
289 struct can_filter* rxFilter;
290 uint32_t rxDropCount;
293 uint16_t CANerrorStatus;
294 volatile bool_t CANnormal;
295 volatile uint16_t CANtxCount;
297#if CO_DRIVER_MULTI_INTERFACE > 0 || defined CO_DOXYGEN
299 uint32_t rxIdentToIndex[CO_CAN_MSG_SFF_MAX_COB_ID];
300 uint32_t txIdentToIndex[CO_CAN_MSG_SFF_MAX_COB_ID];
305#ifndef CO_STORAGE_PATH_MAX
306#define CO_STORAGE_PATH_MAX 255
315 char filename[CO_STORAGE_PATH_MAX];
320#ifdef CO_SINGLE_THREAD
321#define CO_LOCK_CAN_SEND(CAN_MODULE) \
322 { (void)CAN_MODULE; }
323#define CO_UNLOCK_CAN_SEND(CAN_MODULE) \
324 { (void)CAN_MODULE; }
325#define CO_LOCK_EMCY(CAN_MODULE) \
326 { (void)CAN_MODULE; }
327#define CO_UNLOCK_EMCY(CAN_MODULE) \
328 { (void)CAN_MODULE; }
329#define CO_LOCK_OD(CAN_MODULE) \
330 { (void)CAN_MODULE; }
331#define CO_UNLOCK_OD(CAN_MODULE) \
332 { (void)CAN_MODULE; }
333#define CO_MemoryBarrier()
337#define CO_LOCK_CAN_SEND(CAN_MODULE)
338#define CO_UNLOCK_CAN_SEND(CAN_MODULE)
341extern pthread_mutex_t CO_EMCY_mutex;
344CO_LOCK_EMCY(CO_CANmodule_t* CANmodule) {
346 return pthread_mutex_lock(&CO_EMCY_mutex);
350CO_UNLOCK_EMCY(CO_CANmodule_t* CANmodule) {
352 (void)pthread_mutex_unlock(&CO_EMCY_mutex);
356extern pthread_mutex_t CO_OD_mutex;
359CO_LOCK_OD(CO_CANmodule_t* CANmodule) {
361 return pthread_mutex_lock(&CO_OD_mutex);
365CO_UNLOCK_OD(CO_CANmodule_t* CANmodule) {
367 (void)pthread_mutex_unlock(&CO_OD_mutex);
371#define CO_MemoryBarrier() \
372 { __sync_synchronize(); }
375#define CO_FLAG_READ(rxNew) ((rxNew) != NULL)
376#define CO_FLAG_SET(rxNew) \
378 CO_MemoryBarrier(); \
381#define CO_FLAG_CLEAR(rxNew) \
383 CO_MemoryBarrier(); \
389#if CO_DRIVER_MULTI_INTERFACE > 0 || defined CO_DOXYGEN
416 struct timespec* timestamp);
456bool_t
CO_CANrxFromEpoll(CO_CANmodule_t* CANmodule,
struct epoll_event* ev, CO_CANrxMsg_t* buffer, int32_t* msgIndex);
CANopenNode Linux socketCAN Error handling.
bool_t CO_CANrxFromEpoll(CO_CANmodule_t *CANmodule, struct epoll_event *ev, CO_CANrxMsg_t *buffer, int32_t *msgIndex)
Receives CAN messages from matching epoll event.
Definition CO_driver.c:823
CO_ReturnError_t CO_CANtxBuffer_setInterface(CO_CANmodule_t *CANmodule, uint16_t ident, const void *CANptrTx)
Set which interface should be used for message buffer transmission.
CO_ReturnError_t CO_CANmodule_addInterface(CO_CANmodule_t *CANmodule, int can_ifindex)
Add socketCAN interface to can driver.
bool_t CO_CANrxBuffer_getInterface(CO_CANmodule_t *CANmodule, uint16_t ident, const void **const CANptrRx, struct timespec *timestamp)
Check on which interface the last message for one message buffer was received.
socketCAN interface error handling
Definition CO_error.h:98