Skip to content

Commit

Permalink
Corrected and improved the statistics reported
Browse files Browse the repository at this point in the history
  • Loading branch information
dc42 committed Nov 21, 2020
1 parent 32ae514 commit 0dab7f6
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
19 changes: 14 additions & 5 deletions src/CanDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ inline CanDevice::CanTxBufferHeader *CanDevice::GetTxBuffer(uint32_t index) cons
dev.txBuffers = memStart;

dev.useFDMode = (config.dataSize > 8); // assume we want standard CAN if the max data size is 8
dev.messagesLost = dev.busOffCount = 0;
dev.messagesQueuedForSending = dev.messagesReceived = dev.messagesLost = dev.busOffCount = dev.txTimeouts = 0;
#ifdef RTOS
dev.rxBuffersWaiting.Clear();
dev.txBuffersWaiting.Clear();
Expand Down Expand Up @@ -535,6 +535,8 @@ void CanDevice::CopyMessageForTransmit(CanMessageBuffer *buffer, volatile CanTxB

f->T1.bit.FDF = buffer->fdMode;
f->T1.bit.BRS = buffer->useBrs;

++messagesQueuedForSending;
}

// Queue a message for sending via a buffer or FIFO. If the buffer isn't free, cancel the previous message (or oldest message in the fifo) and send it anyway.
Expand All @@ -555,6 +557,7 @@ void CanDevice::SendMessage(TxBufferNumber whichBuffer, uint32_t timeout, CanMes
delay(1);
}
while ((hw->REG(TXBRP) & trigMask) != 0 || READBITS(hw, TXFQS, TFQF));
++txTimeouts;
}

CopyMessageForTransmit(buffer, GetTxBuffer(putIndex));
Expand All @@ -573,6 +576,7 @@ void CanDevice::SendMessage(TxBufferNumber whichBuffer, uint32_t timeout, CanMes
delay(1);
}
while ((hw->REG(TXBRP) & trigMask) != 0);
++txTimeouts;
}
CopyMessageForTransmit(buffer, GetTxBuffer(bufferIndex));
hw->REG(TXBAR) = trigMask;
Expand Down Expand Up @@ -637,6 +641,8 @@ void CanDevice::CopyReceivedMessage(CanMessageBuffer *buffer, const volatile Can
buffer->msg.raw32[2] = data[2];
buffer->dataLength = dlc2len[f->R1.bit.DLC];
}

++messagesReceived;
}

// Receive a message in a buffer or fifo, with timeout. Returns true if successful, false if no message available even after the timeout period.
Expand Down Expand Up @@ -904,13 +910,16 @@ void CanDevice::UpdateLocalCanTiming(const CanTiming &timing) noexcept
| ((prescaler - 1) << CAN_(DBTP_DBRP_Pos));
}

void CanDevice::GetAndClearErrorCounts(unsigned int& rMessageLost, unsigned int& rBusOffCount) noexcept
void CanDevice::GetAndClearStats(unsigned int& rMessagesQueuedForSending, unsigned int& rMessagesReceived, unsigned int& rTxTimeouts, unsigned int& rMessagesLost, unsigned int& rBusOffCount) noexcept
{
AtomicCriticalSectionLocker lock;

rMessageLost = messagesLost;
rMessagesQueuedForSending = messagesQueuedForSending;
rMessagesReceived = messagesReceived;
rMessagesLost = messagesLost;
rBusOffCount = busOffCount;
messagesLost = busOffCount = 0;
rTxTimeouts = txTimeouts;
messagesQueuedForSending = messagesReceived = messagesLost = busOffCount = txTimeouts = 0;
}

#ifdef RTOS
Expand Down Expand Up @@ -987,7 +996,7 @@ void CanDevice::Interrupt() noexcept
Enable();
}

if (ir & (CAN_(IR_RF0L) || CAN_(IR_RF1L)))
if (ir & (CAN_(IR_RF0L) | CAN_(IR_RF1L)))
{
++messagesLost;
}
Expand Down
9 changes: 6 additions & 3 deletions src/CanDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class CanDevice

void SetLocalCanTiming(const CanTiming& timing) noexcept;

void GetAndClearErrorCounts(unsigned int& rMessagesLost, unsigned int& rBusOffCount) noexcept;
void GetAndClearStats(unsigned int& rMessagesQueuedForSending, unsigned int& rMessagesReceived, unsigned int& rTxTimeouts, unsigned int& rMessagesLost, unsigned int& rBusOffCount) noexcept;

#ifdef RTOS
void Interrupt() noexcept;
Expand All @@ -191,8 +191,8 @@ class CanDevice
volatile CanRxBufferHeader *GetRxFifo1Buffer(uint32_t index) const noexcept;
volatile CanRxBufferHeader *GetRxBuffer(uint32_t index) const noexcept;
CanTxBufferHeader *GetTxBuffer(uint32_t index) const noexcept;
static void CopyMessageForTransmit(CanMessageBuffer *buffer, volatile CanTxBufferHeader *f) noexcept;
static void CopyReceivedMessage(CanMessageBuffer *buffer, const volatile CanRxBufferHeader *f) noexcept;
void CopyMessageForTransmit(CanMessageBuffer *buffer, volatile CanTxBufferHeader *f) noexcept;
void CopyReceivedMessage(CanMessageBuffer *buffer, const volatile CanRxBufferHeader *f) noexcept;

Can *hw; // address of the CAN peripheral we are using

Expand All @@ -210,6 +210,9 @@ class CanDevice
CanStandardMessageFilterElement *rxStdFilter; //!< Standard filter List
CanExtendedMessageFilterElement *rxExtFilter; //!< Extended filter List

unsigned int messagesQueuedForSending;
unsigned int messagesReceived;
unsigned int txTimeouts;
unsigned int messagesLost; // count of received messages lost because the receive FIFO was full
unsigned int busOffCount; // count of the number of times we have reset due to bus off

Expand Down

0 comments on commit 0dab7f6

Please sign in to comment.