Line data Source code
1 : // Copyright 2024 Accenture.
2 :
3 : #include "can/canframes/CANFrame.h"
4 :
5 : #include "can/canframes/CanId.h"
6 :
7 : #include <etl/error_handler.h>
8 :
9 : namespace can
10 : {
11 : // define const variables for GCC
12 : // #ifdef __GNUC__
13 : uint8_t const CANFrame::SENDER_MASK;
14 : uint8_t const CANFrame::CAN_OVERHEAD_BITS;
15 : uint8_t const CANFrame::MAX_FRAME_LENGTH;
16 : uint32_t const CANFrame::MAX_FRAME_ID;
17 : uint32_t const CANFrame::MAX_FRAME_ID_EXTENDED;
18 :
19 : // #endif
20 :
21 59 : CANFrame::CANFrame() : _id(0U), _timestamp(0U), _payloadLength(0U)
22 : {
23 59 : (void)memset(_payload, 0, sizeof(_payload));
24 59 : }
25 :
26 1 : CANFrame::CANFrame(uint32_t const id) : _id(id), _timestamp(0U), _payloadLength(0U)
27 : {
28 1 : (void)memset(_payload, 0xFF, sizeof(_payload));
29 1 : }
30 :
31 15 : CANFrame::CANFrame(uint32_t const id, uint8_t const* const payload, uint8_t const length)
32 15 : : _id(id), _timestamp(0U), _payloadLength(length)
33 : {
34 15 : ETL_ASSERT(
35 : length <= MAX_FRAME_LENGTH,
36 : ETL_ERROR_GENERIC("CAN frame length must be smaller than maximum length"));
37 :
38 14 : (void)memcpy(_payload, payload, static_cast<size_t>(length));
39 14 : }
40 :
41 6 : CANFrame::CANFrame(
42 : uint32_t const rawId,
43 : uint8_t const* const payload,
44 : uint8_t const length,
45 6 : bool const isExtendedId)
46 6 : : _id(CanId::id(rawId, isExtendedId)), _timestamp(0U), _payloadLength(length)
47 : {
48 6 : ETL_ASSERT(
49 : rawId <= MAX_FRAME_ID_EXTENDED,
50 : ETL_ERROR_GENERIC("CAN frame id must be smaller than the maximum allowed one"));
51 :
52 5 : ETL_ASSERT(
53 : length <= MAX_FRAME_LENGTH,
54 : ETL_ERROR_GENERIC("CAN frame length must be smaller than maximum length"));
55 :
56 4 : (void)memcpy(_payload, payload, static_cast<size_t>(length));
57 4 : }
58 :
59 25 : void CANFrame::setPayloadLength(uint8_t const length)
60 : {
61 : // only accept a payload length less or equal the maximum
62 25 : if (length <= MAX_FRAME_LENGTH)
63 : {
64 24 : _payloadLength = length;
65 : }
66 25 : }
67 :
68 29 : bool operator==(CANFrame const& frame1, CANFrame const& frame2)
69 : {
70 29 : if (frame1._id != frame2._id)
71 : {
72 2 : return false;
73 : }
74 27 : if (frame1._payloadLength != frame2._payloadLength)
75 : {
76 2 : return false;
77 : }
78 145 : for (uint8_t i = 0U; i < frame1._payloadLength; ++i)
79 : {
80 121 : if (frame1._payload[i] != frame2._payload[i])
81 : {
82 1 : return false;
83 : }
84 : }
85 24 : return true;
86 : }
87 :
88 : } // namespace can
|