socketCanTransceiver
Overview
This module implements ICanTransceiver
interface using Linux SocketCAN stack.
The module communicates over an existing Linux CAN network interface, which can designate a physical or a virtual CAN device. The particular network interface name to use is passed as a configuration parameter.
Architecture
The SocketCanTransceiver
object opens a POSIX socket in the non-blocking mode and periodically
tries to send and receive CAN frames through it. The frames to be sent are queued in the
::io::MemoryQueue<>
, where they are put by the write()
method and stored as memory copies
of CAHFrame
objects. The code makes basic checks at compile time that the CANFrame
object
can safely be duplicated using std::memcpy()
. The queueing also makes sure that the
IFilteredCANFrameSentListener
callbacks will be called in the proper task context.
Integration
The transceiver static configuration (a SocketCanTransceiver::DeviceConfig
object) is passed
to the SocketCanTransceiver
constructor by reference. The configuration object shall be valid
during the lifetime on the SocketCanTransceiver
object.
All the methods of the SocketCanTransceiver
object, except for the constructor, the destructor,
and the write()
method, shall be called in the same task context (normally the CAN task
context), to avoid race conditions in state changes. The listener callbacks registered via the
ICanTransceiver
interface will be called in the same task context. Calling the write()
method from the listener callbacks is safe.
The method run()
needs to be periodically called in order to trigger the actual sending and
receiving of CAN frames.