LCOV - code coverage report
Current view: top level - cpp2can/src/can/transceiver - AbstractCANTransceiver.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 45 45 100.0 %
Date: 2025-01-20 13:53:09 Functions: 8 8 100.0 %

          Line data    Source code
       1             : // Copyright 2024 Accenture.
       2             : 
       3             : #include "can/transceiver/AbstractCANTransceiver.h"
       4             : 
       5             : #include <bsp/timer/SystemTimer.h>
       6             : #include <interrupts/SuspendResumeAllInterruptsScopedLock.h>
       7             : 
       8             : #include <platform/config.h>
       9             : 
      10             : #include <cstring>
      11             : 
      12             : namespace can
      13             : {
      14             : using interrupts::SuspendResumeAllInterruptsScopedLock;
      15             : 
      16          48 : AbstractCANTransceiver::AbstractCANTransceiver(uint8_t const busId)
      17          48 : : _filter()
      18          48 : , _listeners()
      19          48 : , _sentListener(nullptr)
      20          48 : , _sentListeners()
      21          48 : , _baudrate(0U)
      22          48 : , _state(State::CLOSED)
      23          48 : , _busId(busId)
      24          48 : , _stateListener(nullptr)
      25          48 : , _transceiverState(ICANTransceiverStateListener::CANTransceiverState::ACTIVE)
      26          48 : {}
      27             : 
      28          13 : void AbstractCANTransceiver::addCANFrameListener(ICANFrameListener& listener)
      29             : {
      30          13 :     ESR_UNUSED const SuspendResumeAllInterruptsScopedLock lock;
      31          16 :     if (!_listeners.contains_node(listener))
      32             :     {
      33          10 :         _listeners.push_back(listener);
      34          10 :         listener.getFilter().acceptMerger(_filter);
      35             :     }
      36          13 : }
      37             : 
      38           3 : void AbstractCANTransceiver::addVIPCANFrameListener(ICANFrameListener& listener)
      39             : {
      40           3 :     ESR_UNUSED const SuspendResumeAllInterruptsScopedLock lock;
      41           4 :     if (!_listeners.contains_node(listener))
      42             :     {
      43           2 :         _listeners.push_front(listener);
      44           2 :         listener.getFilter().acceptMerger(_filter);
      45             :     }
      46           3 : }
      47             : 
      48          12 : void AbstractCANTransceiver::removeCANFrameListener(ICANFrameListener& listener)
      49             : {
      50          12 :     ESR_UNUSED const SuspendResumeAllInterruptsScopedLock lock;
      51          12 :     _listeners.remove(listener);
      52          12 : }
      53             : 
      54           6 : void AbstractCANTransceiver::addCANFrameSentListener(IFilteredCANFrameSentListener& listener)
      55             : {
      56           6 :     ESR_UNUSED const SuspendResumeAllInterruptsScopedLock lock;
      57          11 :     _sentListeners.push_front(listener);
      58           6 : }
      59             : 
      60           5 : void AbstractCANTransceiver::removeCANFrameSentListener(IFilteredCANFrameSentListener& listener)
      61             : {
      62           5 :     ESR_UNUSED const SuspendResumeAllInterruptsScopedLock lock;
      63           5 :     _sentListeners.remove(listener);
      64           5 : }
      65             : 
      66           5 : void AbstractCANTransceiver::notifyListeners(CANFrame const& frame)
      67             : {
      68           5 :     if (_state == State::CLOSED)
      69             :     {
      70             :         return; // don't receive messages in state CLOSED
      71             :     }
      72             : 
      73          19 :     for (auto& listener : _listeners)
      74             :     {
      75          15 :         if (listener.getFilter().match(frame.getId()))
      76             :         {
      77           7 :             listener.frameReceived(frame);
      78             :         }
      79             :     }
      80             : }
      81             : 
      82          22 : void AbstractCANTransceiver::notifySentListeners(can::CANFrame const& frame)
      83             : {
      84          22 :     if (_sentListeners.empty())
      85             :     {
      86             :         return;
      87             :     }
      88             : 
      89           4 :     const_cast<can::CANFrame&>(frame).setTimestamp(getSystemTimeUs32Bit());
      90           9 :     for (auto& sentListener : _sentListeners)
      91             :     {
      92           5 :         sentListener.canFrameSent(frame);
      93             :     }
      94             : }
      95             : 
      96             : } // namespace can

Generated by: LCOV version 1.14