Skip to content

Commit

Permalink
Simplify code by using a templated function processRxFrame.
Browse files Browse the repository at this point in the history
  • Loading branch information
aentinger committed Jan 10, 2023
1 parent 630bc30 commit 3cb26d3
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 35 deletions.
36 changes: 2 additions & 34 deletions src/Node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,50 +113,18 @@ void Node::processRxQueue()
const auto [extended_can_id, payload_size, payload, rx_timestamp_us] =
static_cast<CircularBufferCan *>(_canard_rx_queue.get())->dequeue();

CanardFrame rx_frame;
rx_frame.extended_can_id = extended_can_id;
rx_frame.payload_size = payload_size;
rx_frame.payload = reinterpret_cast<const void *>(payload.data());

processRxFrame(&rx_frame, rx_timestamp_us);
processRxFrame(extended_can_id, payload_size, payload, rx_timestamp_us);
}
else
{
const auto [extended_can_id, payload_size, payload, rx_timestamp_us] =
static_cast<CircularBufferCanFd *>(_canard_rx_queue.get())->dequeue();

CanardFrame rx_frame;
rx_frame.extended_can_id = extended_can_id;
rx_frame.payload_size = payload_size;
rx_frame.payload = reinterpret_cast<const void *>(payload.data());

processRxFrame(&rx_frame, rx_timestamp_us);
processRxFrame(extended_can_id, payload_size, payload, rx_timestamp_us);
}
}
}

void Node::processRxFrame(CanardFrame const * frame, CanardMicrosecond const rx_timestamp_us)
{
CanardRxTransfer transfer;
CanardRxSubscription * rx_subscription;
int8_t const result = canardRxAccept(&_canard_hdl,
rx_timestamp_us,
frame,
0, /* redundant_transport_index */
&transfer,
&rx_subscription);

if(result == 1)
{
/* Obtain the pointer to the subscribed object and in invoke its reception callback. */
impl::SubscriptionBase * sub_ptr = static_cast<impl::SubscriptionBase *>(rx_subscription->user_reference);
sub_ptr->onTransferReceived(transfer);

/* Free dynamically allocated memory after processing. */
_canard_hdl.memory_free(&_canard_hdl, transfer.payload);
}
}

void Node::processTxQueue(CanFrameTxFunc const tx_func)
{
for(CanardTxQueueItem * tx_queue_item = const_cast<CanardTxQueueItem *>(canardTxPeek(&_canard_tx_queue));
Expand Down
6 changes: 5 additions & 1 deletion src/Node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,12 @@ class Node
static void o1heap_free (CanardInstance * const ins, void * const pointer);

void processRxQueue();
void processRxFrame(CanardFrame const * frame, CanardMicrosecond const rx_timestamp_us);
void processTxQueue(CanFrameTxFunc const tx_func);
template<size_t MTU_BYTES>
void processRxFrame(uint32_t const extended_can_id,
size_t const payload_size,
std::array<uint8_t, MTU_BYTES> const & payload,
CanardMicrosecond const rx_timestamp_us);
};

/**************************************************************************************
Expand Down
31 changes: 31 additions & 0 deletions src/Node.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,34 @@ ServiceClient<T_REQ> Node::create_service_client(CanardPortID const port_id,

return clt;
}

template<size_t MTU_BYTES>
void Node::processRxFrame(uint32_t const extended_can_id,
size_t const payload_size,
std::array<uint8_t, MTU_BYTES> const & payload,
CanardMicrosecond const rx_timestamp_us)
{
CanardFrame rx_frame;
rx_frame.extended_can_id = extended_can_id;
rx_frame.payload_size = payload_size;
rx_frame.payload = reinterpret_cast<const void *>(payload.data());

CanardRxTransfer rx_transfer;
CanardRxSubscription * rx_subscription;
int8_t const result = canardRxAccept(&_canard_hdl,
rx_timestamp_us,
&rx_frame,
0, /* redundant_transport_index */
&rx_transfer,
&rx_subscription);

if(result == 1)
{
/* Obtain the pointer to the subscribed object and in invoke its reception callback. */
impl::SubscriptionBase * sub_ptr = static_cast<impl::SubscriptionBase *>(rx_subscription->user_reference);
sub_ptr->onTransferReceived(rx_transfer);

/* Free dynamically allocated memory after processing. */
_canard_hdl.memory_free(&_canard_hdl, rx_transfer.payload);
}
}

0 comments on commit 3cb26d3

Please sign in to comment.