From d22f9539b353b07002964c49b17cc8d7a0e72152 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 2 Feb 2022 18:44:06 +0100 Subject: [PATCH 01/28] Add send scs --- Inc/mmr_can.h | 2 ++ Src/mmr_can_send_scs.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 Src/mmr_can_send_scs.c diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index 6304c4c..0544c05 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -95,4 +95,6 @@ MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings(); HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet); HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result); +HalStatus MMR_CAN_SendSCS(CanHandle *hcan, MmrCanMessageId scsId, CanMailbox *mailbox, CanId senderId); + #endif /* INC_MMR_CAN_H_ */ diff --git a/Src/mmr_can_send_scs.c b/Src/mmr_can_send_scs.c new file mode 100644 index 0000000..7e8a489 --- /dev/null +++ b/Src/mmr_can_send_scs.c @@ -0,0 +1,21 @@ +#include "mmr_can.h" + + +HalStatus MMR_CAN_SendSCS( + CanHandle *hcan, + MmrCanMessageId scsId, + CanMailbox *mailbox, + CanId senderId +) { + MmrCanPacket packet = { + .header = { + .senderId = senderId, + .messageId = scsId, + .priority = MMR_CAN_MESSAGE_PRIORITY_HIGH, + }, + .mailbox = mailbox, + .length = 0, + }; + + return MMR_CAN_Send(hcan, packet); +} \ No newline at end of file -- 2.52.0 From f7b5c0315eeba7300b96071cb556c4846cacbeae Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Thu, 3 Feb 2022 18:55:52 +0100 Subject: [PATCH 02/28] Create scs dict --- Inc/mmr_can_scs_dict.h | 27 +++++++++++++++++++++++++++ Src/mmr_can_scs_dict.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 Inc/mmr_can_scs_dict.h create mode 100644 Src/mmr_can_scs_dict.c diff --git a/Inc/mmr_can_scs_dict.h b/Inc/mmr_can_scs_dict.h new file mode 100644 index 0000000..c9fde57 --- /dev/null +++ b/Inc/mmr_can_scs_dict.h @@ -0,0 +1,27 @@ +#ifndef INC_MMR_CAN_SCS_H_ +#define INC_MMR_CAN_SCS_H_ + +#ifndef MMR_CAN_SCS_DICTIONARY_SIZE +#define MMR_CAN_SCS_DICTIONARY_SIZE 5 +#endif + +#include +#include "mmr_can.h" + + +typedef struct { + uint32_t key; + uint32_t delayStart; +} MmrCanScsDictEntry; + +typedef MmrCanScsDictEntry MmrCanScsDictionary[MMR_SCS_DICTIONARY_SIZE]; +typedef void(*MmrCanScsDictAction)(MmrCanScsDictEntry *entry); + + +uint32_t MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry); +void MMR_CAN_ScsDictRemove(uint32_t key); +void MMR_CAN_ScsDictForeach(MmrCanScsDictAction action); + +uint32_t MMR_CAN_ScsGetKey(MmrCanMessage *message); + +#endif // !INC_MMR_CAN_SCS_H_ diff --git a/Src/mmr_can_scs_dict.c b/Src/mmr_can_scs_dict.c new file mode 100644 index 0000000..e40ad36 --- /dev/null +++ b/Src/mmr_can_scs_dict.c @@ -0,0 +1,30 @@ +#include "mmr_can_scs.h" + +static MmrCanScsDictionary _dictionary; + + +uint32_t MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry) { + _dictionary[entry.key % MMR_CAN_SCS_DICTIONARY_SIZE] = entry.delayStart; +} + +void MMR_CAN_ScsDictRemove(uint32_t key) { + _dictionary[key] = {}; +} + +void MMR_CAN_ScsDictForeach(MmrCanScsDictAction action) { + int i = 0; + for (; i < MMR_CAN_SCS_DICTIONARY_SIZE; i++) { + MmrCanScsDictEntry entry = _dictionary[i]; + if (entry.key != 0) { + action(&entry); + } + } +} + + +uint32_t MMR_CAN_ScsMessageAsKey(MmrCanMessage *message) { + uint16_t upperHalf = message->header.messageId; + uint16_t lowerHalf = message->header.messageType; + + return (upperHalf << 16) | lowerHalf; +} \ No newline at end of file -- 2.52.0 From e4a0988111db0573e8cf921341b436211148ff81 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Thu, 3 Feb 2022 19:29:58 +0100 Subject: [PATCH 03/28] Fix compilation errors --- Inc/mmr_can_header.h | 9 +++++---- Inc/mmr_can_message_id.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index 7a5cf88..7e22dcf 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -22,7 +22,7 @@ typedef enum { MMR_CAN_MESSAGE_ACK = B_(0001), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME = B_(0010), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END = B_(0011), - MMR_CAN_MESSAGE_TYPE_NORMAL = B_(1000), + MMR_CAN_MESSAGE_TYPE_NORMAL = B_(0100), } MmrCanMessageType; @@ -40,9 +40,10 @@ typedef enum { */ typedef struct { MmrCanMessagePriority priority : 3; - MmrCanMessageId messageId : 10; - uint32_t senderId : 12; - MmrCanMessageType messageType : 4; + uint16_t messageId : 10; + uint16_t senderId : 10; + uint8_t seqNumber : 3; + MmrCanMessageType messageType : 3; } MmrCanHeader; diff --git a/Inc/mmr_can_message_id.h b/Inc/mmr_can_message_id.h index 68d1082..e41740d 100644 --- a/Inc/mmr_can_message_id.h +++ b/Inc/mmr_can_message_id.h @@ -1,6 +1,7 @@ #ifndef INC_MMR_CAN_MESSAGE_ID_H_ #define INC_MMR_CAN_MESSAGE_ID_H_ +#include #include #include "mmr_can_binary_literals.h" -- 2.52.0 From 92b6ca84953749669e0b7a9745a1c721b733d86a Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Thu, 3 Feb 2022 19:35:39 +0100 Subject: [PATCH 04/28] Fix compile error --- Inc/mmr_can_scs_dict.h | 4 ++-- Src/mmr_can_scs_dict.c | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Inc/mmr_can_scs_dict.h b/Inc/mmr_can_scs_dict.h index c9fde57..9999226 100644 --- a/Inc/mmr_can_scs_dict.h +++ b/Inc/mmr_can_scs_dict.h @@ -14,11 +14,11 @@ typedef struct { uint32_t delayStart; } MmrCanScsDictEntry; -typedef MmrCanScsDictEntry MmrCanScsDictionary[MMR_SCS_DICTIONARY_SIZE]; +typedef MmrCanScsDictEntry MmrCanScsDictionary[MMR_CAN_SCS_DICTIONARY_SIZE]; typedef void(*MmrCanScsDictAction)(MmrCanScsDictEntry *entry); -uint32_t MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry); +void MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry); void MMR_CAN_ScsDictRemove(uint32_t key); void MMR_CAN_ScsDictForeach(MmrCanScsDictAction action); diff --git a/Src/mmr_can_scs_dict.c b/Src/mmr_can_scs_dict.c index e40ad36..e22a605 100644 --- a/Src/mmr_can_scs_dict.c +++ b/Src/mmr_can_scs_dict.c @@ -1,14 +1,14 @@ -#include "mmr_can_scs.h" +#include "mmr_can_scs_dict.h" static MmrCanScsDictionary _dictionary; -uint32_t MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry) { - _dictionary[entry.key % MMR_CAN_SCS_DICTIONARY_SIZE] = entry.delayStart; +void MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry) { + _dictionary[entry.key % MMR_CAN_SCS_DICTIONARY_SIZE] = entry; } void MMR_CAN_ScsDictRemove(uint32_t key) { - _dictionary[key] = {}; + _dictionary[key] = (MmrCanScsDictEntry){}; } void MMR_CAN_ScsDictForeach(MmrCanScsDictAction action) { @@ -27,4 +27,4 @@ uint32_t MMR_CAN_ScsMessageAsKey(MmrCanMessage *message) { uint16_t lowerHalf = message->header.messageType; return (upperHalf << 16) | lowerHalf; -} \ No newline at end of file +} -- 2.52.0 From 783cd454d0547a21cbd4612e6e9fe508592f3233 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sat, 12 Feb 2022 10:44:37 +0100 Subject: [PATCH 05/28] Change default include --- Inc/mmr_can_includes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Inc/mmr_can_includes.h b/Inc/mmr_can_includes.h index b502eb7..b299c3e 100644 --- a/Inc/mmr_can_includes.h +++ b/Inc/mmr_can_includes.h @@ -1,7 +1,7 @@ #ifndef INC_MMR_CAN_INCLUDES_H_ #define INC_MMR_CAN_INCLUDES_H_ -#include "main.h" +#include "stm32f3xx_hal.h" #ifndef CAN #define CAN -- 2.52.0 From 9e84d09e589682aed04f227485c43b1b1d922f72 Mon Sep 17 00:00:00 2001 From: nicolagutierrez Date: Sat, 12 Feb 2022 10:44:47 +0100 Subject: [PATCH 06/28] Add Timer SCS manager --- Inc/mmr_can.h | 1 + Inc/mmr_can_timer_scs.h | 60 ++++++++++++++++++++++++++++++++++ Src/mmr_can_timer_scs.c | 72 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 Inc/mmr_can_timer_scs.h create mode 100644 Src/mmr_can_timer_scs.c diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index 0544c05..75b7499 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -8,6 +8,7 @@ #include "mmr_can_types.h" #include "mmr_can_optimize.h" #include "mmr_can_binary_literals.h" +#include "mmr_can_timer_scs.h" #ifndef MMR_CAN_RX_FIFO #define MMR_CAN_RX_FIFO CAN_RX_FIFO0 diff --git a/Inc/mmr_can_timer_scs.h b/Inc/mmr_can_timer_scs.h new file mode 100644 index 0000000..6a13ba9 --- /dev/null +++ b/Inc/mmr_can_timer_scs.h @@ -0,0 +1,60 @@ +#ifndef INC_MMR_CAN_TIMER_SCS_H_ +#define INC_MMR_CAN_TIMER_SCS_H_ + +#include "mmr_can_message_id.h" +#include "mmr_can_types.h" + + +/** + * Scs_timer represents the max number of counter + * that need to checked w/current time + */ +#ifndef MMR_SCS_NR_TIMERS +#define MMR_SCS_NR_TIMERS 5 +#endif + +/** + * It depends on how many bits the board devotes to the timer + * Check the datasheet + */ +typedef uint32_t TimerRange; + + + +typedef struct { + MmrCanMessageId scsId; + CanId receiverId; + TimerRange counter; +} MmrTimerSCS; + + +/** + * @brief Represents the base-struct to manage a single RTR + * and allows to interface with the associated SCS's timer + */ +typedef struct { + MmrCanMessageId scsId; + CanId receiverId; + int rtr; +} RTRresponse; + + + +/** + * All time units are to be considered as microseconds ( 1ms ) + */ +bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId); +bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange currentTime); + +/** + * @brief The delay is taken individually so that the 'manager' + * can first check the ACK and eventually reset the associated arr_timer + * + * @param rtrResponse the 'manager' will have to manage an array of struct RTRresponse + * @param currentTime from __HAL_TIM_GET_COUNTER(&htimX) or directly from the CNT register + * @param thresholdDelay by rules 500ms + */ +bool MMR_CAN_GetTimerSCS(RTRresponse *rtrResponse, TimerRange currentTime, TimerRange thresholdDelay); + + +#endif // !INC_MMR_CAN_TIMER_SCS_H_ \ No newline at end of file diff --git a/Src/mmr_can_timer_scs.c b/Src/mmr_can_timer_scs.c new file mode 100644 index 0000000..6331b5b --- /dev/null +++ b/Src/mmr_can_timer_scs.c @@ -0,0 +1,72 @@ +#include "mmr_can.h" + +static MmrTimerSCS arr_timer[MMR_SCS_NR_TIMERS] = {}; + +static MmrTimerSCS* findTimer(MmrCanMessageId scsId, CanId receiverId); + + +void MMR_CAN_InitTimerSCS() { + for (int i = 0; i < MMR_SCS_NR_TIMERS; i++) + { + arr_timer[i].scsId = 0; + arr_timer[i].receiverId = 0; + arr_timer[i].counter = 0; + } +} + + +bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId) { + MmrTimerSCS *timer = findTimer(scsId, receiverId); + if (timer == NULL) { + return false; + } + + timer->scsId = 0; + timer->receiverId = 0; + timer->counter = 0; + return true; +} + + +bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange currentTime) { + MmrTimerSCS *timer = findTimer(scsId, receiverId); + if (timer == NULL) { + return false; + } + + timer->scsId = scsId; + timer->receiverId = receiverId; + timer->counter = currentTime; + return true; +} + + +bool MMR_CAN_GetTimerSCS(RTRresponse *rtrResponse, TimerRange currentTime, TimerRange thresholdDelay) { + MmrTimerSCS *timer = findTimer( + rtrResponse->scsId, + rtrResponse->receiverId + ); + + if (timer == NULL) { + return false; + } + + if (currentTime - timer->counter >= thresholdDelay) { + rtrResponse->rtr++; + } + return true; +} + + +MmrTimerSCS* findTimer(MmrCanMessageId scsId, CanId receiverId) { + int i = 0; + for (; i < MMR_SCS_NR_TIMERS; i++) { + MmrTimerSCS *timer = arr_timer + i; + + if (timer->scsId == scsId && arr_timer->receiverId == receiverId) { + return timer; + } + } + + return NULL; +} -- 2.52.0 From f6d5dca5ee2e3437b3a01405b3b75ffa712fff25 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sat, 12 Feb 2022 10:47:33 +0100 Subject: [PATCH 07/28] Remove unused files --- Inc/mmr_can_scs_dict.h | 27 --------------------------- Src/mmr_can_scs_dict.c | 30 ------------------------------ 2 files changed, 57 deletions(-) delete mode 100644 Inc/mmr_can_scs_dict.h delete mode 100644 Src/mmr_can_scs_dict.c diff --git a/Inc/mmr_can_scs_dict.h b/Inc/mmr_can_scs_dict.h deleted file mode 100644 index 9999226..0000000 --- a/Inc/mmr_can_scs_dict.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef INC_MMR_CAN_SCS_H_ -#define INC_MMR_CAN_SCS_H_ - -#ifndef MMR_CAN_SCS_DICTIONARY_SIZE -#define MMR_CAN_SCS_DICTIONARY_SIZE 5 -#endif - -#include -#include "mmr_can.h" - - -typedef struct { - uint32_t key; - uint32_t delayStart; -} MmrCanScsDictEntry; - -typedef MmrCanScsDictEntry MmrCanScsDictionary[MMR_CAN_SCS_DICTIONARY_SIZE]; -typedef void(*MmrCanScsDictAction)(MmrCanScsDictEntry *entry); - - -void MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry); -void MMR_CAN_ScsDictRemove(uint32_t key); -void MMR_CAN_ScsDictForeach(MmrCanScsDictAction action); - -uint32_t MMR_CAN_ScsGetKey(MmrCanMessage *message); - -#endif // !INC_MMR_CAN_SCS_H_ diff --git a/Src/mmr_can_scs_dict.c b/Src/mmr_can_scs_dict.c deleted file mode 100644 index e22a605..0000000 --- a/Src/mmr_can_scs_dict.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "mmr_can_scs_dict.h" - -static MmrCanScsDictionary _dictionary; - - -void MMR_CAN_ScsDictPut(MmrCanScsDictEntry entry) { - _dictionary[entry.key % MMR_CAN_SCS_DICTIONARY_SIZE] = entry; -} - -void MMR_CAN_ScsDictRemove(uint32_t key) { - _dictionary[key] = (MmrCanScsDictEntry){}; -} - -void MMR_CAN_ScsDictForeach(MmrCanScsDictAction action) { - int i = 0; - for (; i < MMR_CAN_SCS_DICTIONARY_SIZE; i++) { - MmrCanScsDictEntry entry = _dictionary[i]; - if (entry.key != 0) { - action(&entry); - } - } -} - - -uint32_t MMR_CAN_ScsMessageAsKey(MmrCanMessage *message) { - uint16_t upperHalf = message->header.messageId; - uint16_t lowerHalf = message->header.messageType; - - return (upperHalf << 16) | lowerHalf; -} -- 2.52.0 From 2469d96127413eceb44766b9562dbb7e3baf3d23 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sat, 12 Feb 2022 11:44:45 +0100 Subject: [PATCH 08/28] Fix bugs --- Src/mmr_can_message_id.c | 1 + Src/mmr_can_send.c | 9 ++++++--- Src/mmr_can_send_scs.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Src/mmr_can_message_id.c b/Src/mmr_can_message_id.c index d224d92..61f1162 100644 --- a/Src/mmr_can_message_id.c +++ b/Src/mmr_can_message_id.c @@ -1,3 +1,4 @@ +#include #include "mmr_can_message_id.h" diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index 4e02a7d..2ff5374 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -28,6 +28,7 @@ HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { TransmissionParams tp = { .handle = hcan, .packet = &packet, + .headers.mmr = packet.header, .headers.tx = { .IDE = CAN_ID_EXT, .RTR = CAN_RTR_DATA, @@ -72,11 +73,13 @@ static HalStatus sendSingleMultiFrame(TransmissionParams *tp) { uint8_t length = computeNextMessageLength(tp->packet); - tp->packet->length -= length; - tp->packet->data += length; tp->headers.tx.DLC = length; + tp->packet->length -= length; - return send(tp); + HalStatus result = send(tp); + + tp->packet->data += length; + return result; } diff --git a/Src/mmr_can_send_scs.c b/Src/mmr_can_send_scs.c index 7e8a489..9df0218 100644 --- a/Src/mmr_can_send_scs.c +++ b/Src/mmr_can_send_scs.c @@ -18,4 +18,4 @@ HalStatus MMR_CAN_SendSCS( }; return MMR_CAN_Send(hcan, packet); -} \ No newline at end of file +} -- 2.52.0 From 4ac0afc01071275b3288f48281e7b381bb266e45 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Tue, 15 Feb 2022 19:33:22 +0100 Subject: [PATCH 09/28] Add documentation --- Inc/mmr_can.h | 69 +++++++++++++++++++++++++++++++++++++++- Inc/mmr_can_header.h | 20 +++++++++--- Inc/mmr_can_message_id.h | 26 ++++++++++++++- Inc/mmr_can_optimize.h | 10 ++++++ Inc/mmr_can_timer_scs.h | 4 +-- Inc/mmr_can_types.h | 5 ++- Inc/mmr_can_util.h | 42 ++++++++++++++++++++++-- 7 files changed, 164 insertions(+), 12 deletions(-) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index 75b7499..996e8cd 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -66,6 +66,43 @@ typedef struct { } MmrCanFilterSettings; +/** + * @brief + * A packet that can be sent over a CAN + * network. + * + * @example + * typedef struct { + * int x; + * int y; + * } Point; + * + * HalStatus send(Point point) { + * static CanMailbox mailbox = 0; + * + * MmrCanPacket packet = { + * .header = { + * .priority = MMR_CAN_MESSAGE_PRIORITY_NORMAL, + * .messageId = MMR_CAN_EXAMPLES_POINT, + * .senderId = 0xXXX, + * }, + * .mailbox = &mailbox, + * .data = (uint8_t*)&point, + * .length = sizeof(point), + * }; + * + * return MMR_CAN_Send(&hcan, packet); + * } + * + * int main() { + * Point p = {10, 20}; + * if (send(p) != HAL_OK) { + * Error_Handler(); + * } + * + * // 'p' has been sent. + * } + */ typedef struct { MmrCanHeader header; CanMailbox *mailbox; @@ -76,7 +113,37 @@ typedef struct { /** * @brief - * Represents a CAN message + * A message received over a CAN network. + * + * @example + * typedef struct { + * int x; + * int y; + * } Point; + * + * HalStatus receive(Point *result) { + * MmrCanMessage message = { + * .store = result, + * }; + * + * HalStatus result = MMR_CAN_Receive(&hcan, &message); + * bool isAPoint = message.header.messageId == MMR_CAN_EXAMPLES_POINT; + * if (!isAPoint) { + * return HAL_ERROR; + * } + * + * return result; + * } + * + * int main() { + * Point p = {}; + * if (receive(&p) != HAL_OK) { + * Error_Handler(); + * } + * + * // here 'p' has been populated and can + * // be used. + * } */ typedef struct { MmrCanHeader header; diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index 7e22dcf..f442eea 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -12,11 +12,10 @@ * portion of the CAN bus message (that is, the lower 5 bits * of the standard id) * - * They are used to check if a message is either standalone - * or split into multiple frames + * They are used to check if a message is either standalone, an + * acknowledgement or split into multiple frames * - * When the priority and id fields are the same, multi-frame - * messages have a higher priority over normal ones + * Constants with lower values have an higher priority. */ typedef enum { MMR_CAN_MESSAGE_ACK = B_(0001), @@ -47,7 +46,20 @@ typedef struct { } MmrCanHeader; +/** + * @brief + * Converts an MmrCanHeader to bits. + * That is, a 32bits integer with the first + * 3 bits set to zero and the remaining 29 containing the + * extended id + */ uint32_t *MMR_CAN_HeaderToBits(MmrCanHeader *header); + +/** + * @brief + * Converts a 32bits integer to an MmrCanHeader. + * The left-most 3 bits must be of padding. + */ MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits); bool MMR_CAN_IsMultiFrame(MmrCanHeader *header); diff --git a/Inc/mmr_can_message_id.h b/Inc/mmr_can_message_id.h index e41740d..d917f8d 100644 --- a/Inc/mmr_can_message_id.h +++ b/Inc/mmr_can_message_id.h @@ -24,10 +24,34 @@ typedef enum { } MmrCanMessageIdType; +/** + * @brief + * Returns the 3 bits representing + * the MmrCanMessageIdType. + */ uint8_t MMR_CAN_GetMessageIdType(MmrCanMessageId msgId); + +/** + * @brief + * Returns the 7 bits representing + * the message id's subtype. + */ uint8_t MMR_CAN_GetMessageIdSubtype(MmrCanMessageId msgId); +/** + * @brief + * Tells wether the provided message + * is of the given id type. + * + * E.g. if a message is an SCS. + */ bool MMR_CAN_IsMessageIdOfType(MmrCanMessageId msgId, MmrCanMessageIdType type); + +/** + * @brief + * Tells wether the given message id is + * represents an SCS. + */ bool MMR_CAN_IsMessageIdSCS(MmrCanMessageId msgId); @@ -50,7 +74,7 @@ enum MmrCanMessageId { MMR_CAN_MESSAGE_ID_SCS_AS_READY, MMR_CAN_MESSAGE_ID_SCS_AS_DRIVING, MMR_CAN_MESSAGE_ID_SCS_AS_OFF, - + MMR_CAN_MESSAGE_ID_SCS_AM_MANUAL_DRIVING, MMR_CAN_MESSAGE_ID_SCS_AM_ACCELERATION, MMR_CAN_MESSAGE_ID_SCS_AM_SKIDPAD, diff --git a/Inc/mmr_can_optimize.h b/Inc/mmr_can_optimize.h index a3094b2..341b77c 100644 --- a/Inc/mmr_can_optimize.h +++ b/Inc/mmr_can_optimize.h @@ -2,6 +2,16 @@ #define INC_MMR_CAN_OPTIMIZE_H_ #ifdef __GNUC__ +/** + * @brief + * Tells the compiler that the given method + * must always be inlined. + * + * @example + * static always_inline int min(int a, int b) { + * return a < b ? a : b; + * } + */ #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline diff --git a/Inc/mmr_can_timer_scs.h b/Inc/mmr_can_timer_scs.h index 6a13ba9..d9bcf29 100644 --- a/Inc/mmr_can_timer_scs.h +++ b/Inc/mmr_can_timer_scs.h @@ -41,7 +41,7 @@ typedef struct { /** - * All time units are to be considered as microseconds ( 1ms ) + * All time units are to be considered as milliseconds (1ms) */ bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId); bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange currentTime); @@ -57,4 +57,4 @@ bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange cur bool MMR_CAN_GetTimerSCS(RTRresponse *rtrResponse, TimerRange currentTime, TimerRange thresholdDelay); -#endif // !INC_MMR_CAN_TIMER_SCS_H_ \ No newline at end of file +#endif // !INC_MMR_CAN_TIMER_SCS_H_ diff --git a/Inc/mmr_can_types.h b/Inc/mmr_can_types.h index f490cb6..3b7f115 100644 --- a/Inc/mmr_can_types.h +++ b/Inc/mmr_can_types.h @@ -8,6 +8,7 @@ typedef uint32_t CanId; typedef uint32_t CanMailbox; /** + * @brief * A filter mask for the CANbus. * It acts like a subnet mask, filtering the ids that * do not match it. @@ -20,12 +21,14 @@ typedef uint32_t CanMailbox; typedef uint32_t CanFilterMask; /** + * @brief * Stores a value from CAN_filter_FIFO * That is, CAN_FILTER_FIFOx */ typedef uint8_t CanFilterFifo; -/** +/** + * @brief * Represents a filter bank. * The values must be in the range [0, 27] */ diff --git a/Inc/mmr_can_util.h b/Inc/mmr_can_util.h index 06929e9..723dfa3 100644 --- a/Inc/mmr_can_util.h +++ b/Inc/mmr_can_util.h @@ -4,16 +4,52 @@ #include #include +/** + * @brief + * Returns the size of the given array. + * + * This only works on static arrays declared + * within the current scope, that is: + * int main() { + * int arr[] = {1, 2, 3}; + * int len = sizeofarray(arr); + * } + */ #define sizeofarray(array) \ (sizeof(array) / sizeof(*(array))) +/** + * @brief + * Returns the length of a statically, non const ptr, declared + * string. + * That is: + * int main() { + * char str[] = "abc"; + * int len = stringArrayLength(str); + * } + */ #define stringArrayLength(array) \ stringBufferLength((array), sizeofarray(array)) +/** + * @brief + * Returns the length of a string buffer. + * Its format must be in bytes, so it could be: + * const char* + * char* + * uint8_t* + * etc... + */ #define stringBufferLength(pbuffer, maxLen) \ strnlen((const char*)(pbuffer), maxLen) -#define min(a, b) ((a) < (b) ? a : b); +/** + * @brief + * Returns the minimum between the + * two given values. + * E.g. min(1, 2) == 1 // true + */ +#define min(a, b) ((a) < (b) ? a : b) #define mask(value, bits) (value & bits) #define convertTo(resultType, lvalue) (*interpretAs(resultType*, &(lvalue))) #define interpretAs(resultType, lvalue) ((resultType)(lvalue)) @@ -26,10 +62,10 @@ * Either * - Error: the computation resulted in error * - Pending: the computation is still undergoing - * - Completed: the computation has completed succesfully + * - Completed: the computation has completed successfully * and its results can be read * - * Asynchronous logig can be easily implemented using State Machines + * Asynchronous logic can be easily implemented using State Machines */ typedef enum { MMR_ASYNC_RESULT_ERROR, -- 2.52.0 From 607817389c0827bf55434bf3edb04d0d613d3332 Mon Sep 17 00:00:00 2001 From: Nicola Gutierrez Date: Thu, 17 Feb 2022 17:22:27 +0100 Subject: [PATCH 10/28] Add SCS manager bozza --- Inc/mmr_can_scs_manager.h | 37 ++++++++++++++++++++++++ Inc/mmr_can_timer_scs.h | 17 +---------- Src/mmr_can_scs_manager.c | 61 +++++++++++++++++++++++++++++++++++++++ Src/mmr_can_send_scs.c | 6 ++++ Src/mmr_can_timer_scs.c | 30 +++++++------------ 5 files changed, 115 insertions(+), 36 deletions(-) create mode 100644 Inc/mmr_can_scs_manager.h create mode 100644 Src/mmr_can_scs_manager.c diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h new file mode 100644 index 0000000..17b9184 --- /dev/null +++ b/Inc/mmr_can_scs_manager.h @@ -0,0 +1,37 @@ +#ifndef INC_MMR_CAN_SCS_MANAGER_H_ +#define INC_MMR_CAN_SCS_MANAGER_H_ + +#include "mmr_can.h" +#include "mmr_can_timer_scs.h" + +/** + * TODO: + * - GetCurrentTime + * - ACK + * - Reset timer + * - Setup method + */ + + +/** + * @brief Represents the base-struct to manage a single RTR + * and allows to interface with the associated SCS's timer + */ +typedef struct { + MmrCanMessageId scsId; + CanId receiverId; + int rtr; +} RTRresponse; + + +/** + * It is used to iterate the RTRresponse array in the CheckSCS function + */ +static int counter; + + +bool MMR_CAN_SetRTRresponse(MmrCanMessageId scsId, CanId receiverId, int rtr); +TimerRange MMR_CAN_GetCurrentTime(); +void MMR_CAN_CheckSCS(); // What is necessary to do ritrasmission (mmr_can_send_scs) + +#endif // !INC_MMR_CAN_SCS_MANAGER_H_ \ No newline at end of file diff --git a/Inc/mmr_can_timer_scs.h b/Inc/mmr_can_timer_scs.h index d9bcf29..170922f 100644 --- a/Inc/mmr_can_timer_scs.h +++ b/Inc/mmr_can_timer_scs.h @@ -4,7 +4,6 @@ #include "mmr_can_message_id.h" #include "mmr_can_types.h" - /** * Scs_timer represents the max number of counter * that need to checked w/current time @@ -19,8 +18,6 @@ */ typedef uint32_t TimerRange; - - typedef struct { MmrCanMessageId scsId; CanId receiverId; @@ -28,18 +25,6 @@ typedef struct { } MmrTimerSCS; -/** - * @brief Represents the base-struct to manage a single RTR - * and allows to interface with the associated SCS's timer - */ -typedef struct { - MmrCanMessageId scsId; - CanId receiverId; - int rtr; -} RTRresponse; - - - /** * All time units are to be considered as milliseconds (1ms) */ @@ -54,7 +39,7 @@ bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange cur * @param currentTime from __HAL_TIM_GET_COUNTER(&htimX) or directly from the CNT register * @param thresholdDelay by rules 500ms */ -bool MMR_CAN_GetTimerSCS(RTRresponse *rtrResponse, TimerRange currentTime, TimerRange thresholdDelay); +bool MMR_CAN_GetTimerSCS(MmrCanMessageId scsId, CanId receiverId, int *rtr, TimerRange currentTime, TimerRange thresholdDelay); #endif // !INC_MMR_CAN_TIMER_SCS_H_ diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c new file mode 100644 index 0000000..3ab9a2a --- /dev/null +++ b/Src/mmr_can_scs_manager.c @@ -0,0 +1,61 @@ +#include "mmr_can_scs_manager.h" + +static RTRresponse arr_scs[MMR_SCS_NR_TIMERS]; + +static RTRresponse* findResponse(MmrCanMessageId scsId, CanId receiverId); + + +bool SetRTRresponse(MmrCanMessageId scsId, CanId receiverId, int rtr) +{ + RTRresponse *response = findResponse(0, 0); + if (response == NULL) return false; + + response->scsId = scsId; + response->receiverId = receiverId; + response->rtr = 0; + + return MMR_CAN_SetTimerSCS(response->scsId, response->receiverId, MMR_CAN_GetCurrentTime); +} + +void CheckSCS() +{ + if (counter>=MMR_SCS_NR_TIMERS) counter=0; + + RTRresponse *_rtrResponse = &arr_scs[counter]; + + if(!MMR_CAN_GetTimerSCS(_rtrResponse->scsId, _rtrResponse->receiverId, &_rtrResponse->rtr, MMR_CAN_GetCurrentTime, 500)) + { + // do something + } + + counter++; + + if (_rtrResponse->rtr==1) + { + // Return ritrasmission + } + + if (_rtrResponse->rtr>1) + { + // Return Safe State + } +} + + +TimerRange MMR_CAN_GetCurrentTime() +{ + return 0; //TODO: HAL.... +} + +RTRresponse* findResponse(MmrCanMessageId scsId, CanId receiverId) { + int i = 0; + for (; i < MMR_SCS_NR_TIMERS; i++) { + RTRresponse *response = arr_scs + i; + + if (response->scsId == scsId && response->receiverId == receiverId) { + return response; + } + } + + return NULL; +} \ No newline at end of file diff --git a/Src/mmr_can_send_scs.c b/Src/mmr_can_send_scs.c index 9df0218..fd70002 100644 --- a/Src/mmr_can_send_scs.c +++ b/Src/mmr_can_send_scs.c @@ -1,4 +1,5 @@ #include "mmr_can.h" +#include "mmr_can_scs_manager.h" HalStatus MMR_CAN_SendSCS( @@ -16,6 +17,11 @@ HalStatus MMR_CAN_SendSCS( .mailbox = mailbox, .length = 0, }; + + if(!MMR_CAN_SetRTRresponse()) + { + // do something + } return MMR_CAN_Send(hcan, packet); } diff --git a/Src/mmr_can_timer_scs.c b/Src/mmr_can_timer_scs.c index 6331b5b..76ba3cd 100644 --- a/Src/mmr_can_timer_scs.c +++ b/Src/mmr_can_timer_scs.c @@ -1,6 +1,6 @@ -#include "mmr_can.h" +#include "mmr_can_timer_scs.h" -static MmrTimerSCS arr_timer[MMR_SCS_NR_TIMERS] = {}; +static MmrTimerSCS arr_timer[MMR_SCS_NR_TIMERS]; static MmrTimerSCS* findTimer(MmrCanMessageId scsId, CanId receiverId); @@ -17,9 +17,7 @@ void MMR_CAN_InitTimerSCS() { bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId) { MmrTimerSCS *timer = findTimer(scsId, receiverId); - if (timer == NULL) { - return false; - } + if (timer == NULL) return false; timer->scsId = 0; timer->receiverId = 0; @@ -29,10 +27,8 @@ bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId) { bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange currentTime) { - MmrTimerSCS *timer = findTimer(scsId, receiverId); - if (timer == NULL) { - return false; - } + MmrTimerSCS *timer = findTimer(0, 0); + if (timer == NULL) return false; timer->scsId = scsId; timer->receiverId = receiverId; @@ -41,18 +37,12 @@ bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange cur } -bool MMR_CAN_GetTimerSCS(RTRresponse *rtrResponse, TimerRange currentTime, TimerRange thresholdDelay) { - MmrTimerSCS *timer = findTimer( - rtrResponse->scsId, - rtrResponse->receiverId - ); - - if (timer == NULL) { - return false; - } +bool MMR_CAN_GetTimerSCS(MmrCanMessageId scsId, CanId receiverId, int *rtr, TimerRange currentTime, TimerRange thresholdDelay) { + MmrTimerSCS *timer = findTimer(scsId, receiverId); + if (timer == NULL) return false; if (currentTime - timer->counter >= thresholdDelay) { - rtrResponse->rtr++; + rtr++; } return true; } @@ -63,7 +53,7 @@ MmrTimerSCS* findTimer(MmrCanMessageId scsId, CanId receiverId) { for (; i < MMR_SCS_NR_TIMERS; i++) { MmrTimerSCS *timer = arr_timer + i; - if (timer->scsId == scsId && arr_timer->receiverId == receiverId) { + if (timer->scsId == scsId && timer->receiverId == receiverId) { return timer; } } -- 2.52.0 From 2e4a409a9230729dc0664ff17658f722083e5860 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Thu, 17 Feb 2022 18:55:16 +0100 Subject: [PATCH 11/28] Refactor --- Inc/mmr_can.h | 4 +- Inc/mmr_can_header.h | 2 +- Inc/mmr_can_scs_manager.h | 56 +++++++++---- Inc/mmr_can_timer_scs.h | 45 ----------- Src/mmr_can_scs_manager.c | 162 ++++++++++++++++++++++++++++---------- Src/mmr_can_send_scs.c | 27 ------- Src/mmr_can_timer_scs.c | 62 --------------- 7 files changed, 160 insertions(+), 198 deletions(-) delete mode 100644 Inc/mmr_can_timer_scs.h delete mode 100644 Src/mmr_can_send_scs.c delete mode 100644 Src/mmr_can_timer_scs.c diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index 996e8cd..c3441d0 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -8,7 +8,7 @@ #include "mmr_can_types.h" #include "mmr_can_optimize.h" #include "mmr_can_binary_literals.h" -#include "mmr_can_timer_scs.h" +#include "mmr_can_scs_manager.h" #ifndef MMR_CAN_RX_FIFO #define MMR_CAN_RX_FIFO CAN_RX_FIFO0 @@ -163,6 +163,4 @@ MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings(); HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet); HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result); -HalStatus MMR_CAN_SendSCS(CanHandle *hcan, MmrCanMessageId scsId, CanMailbox *mailbox, CanId senderId); - #endif /* INC_MMR_CAN_H_ */ diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index f442eea..79d5d9f 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -18,7 +18,7 @@ * Constants with lower values have an higher priority. */ typedef enum { - MMR_CAN_MESSAGE_ACK = B_(0001), + MMR_CAN_MESSAGE_TYPE_ACK = B_(0001), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME = B_(0010), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END = B_(0011), MMR_CAN_MESSAGE_TYPE_NORMAL = B_(0100), diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index 17b9184..43301cf 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -2,15 +2,32 @@ #define INC_MMR_CAN_SCS_MANAGER_H_ #include "mmr_can.h" -#include "mmr_can_timer_scs.h" + /** - * TODO: - * - GetCurrentTime - * - ACK - * - Reset timer - * - Setup method + * Scs_timer represents the max number of counter + * that need to checked w/current time */ +#ifndef MMR_CAN_SCS_ENTRIES_COUNT +#define MMR_CAN_SCS_ENTRIES_COUNT 5 +#endif + + +/** + * @brief + * Maximum timeout before first retransmission, + * in milliseconds + */ +#ifndef MMR_CAN_MAX_TIMEOUT +#define MMR_CAN_MAX_TIMEOUT 500 +#endif + + +/** + * It depends on how many bits the board devotes to the timer + * Check the datasheet + */ +typedef uint32_t TimerRange; /** @@ -18,20 +35,25 @@ * and allows to interface with the associated SCS's timer */ typedef struct { - MmrCanMessageId scsId; - CanId receiverId; + MmrCanHeader header; + TimerRange counter; int rtr; -} RTRresponse; +} MmrCanScsEntry; -/** - * It is used to iterate the RTRresponse array in the CheckSCS function - */ -static int counter; +typedef enum { + MMR_CAN_SCS_CHECK_OK, + MMR_CAN_SCS_CHECK_RTR, + MMR_CAN_SCS_CHECK_ERROR, +} MmrCanScsCheckResult; -bool MMR_CAN_SetRTRresponse(MmrCanMessageId scsId, CanId receiverId, int rtr); -TimerRange MMR_CAN_GetCurrentTime(); -void MMR_CAN_CheckSCS(); // What is necessary to do ritrasmission (mmr_can_send_scs) +bool MMR_CAN_MaybeHandleACK(MmrCanHeader header); +HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan); +HalStatus MMR_CAN_SendSCS( + CanHandle *hcan, + MmrCanMessageId scsId, + CanId senderId +); -#endif // !INC_MMR_CAN_SCS_MANAGER_H_ \ No newline at end of file +#endif // !INC_MMR_CAN_SCS_MANAGER_H_ diff --git a/Inc/mmr_can_timer_scs.h b/Inc/mmr_can_timer_scs.h deleted file mode 100644 index 170922f..0000000 --- a/Inc/mmr_can_timer_scs.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef INC_MMR_CAN_TIMER_SCS_H_ -#define INC_MMR_CAN_TIMER_SCS_H_ - -#include "mmr_can_message_id.h" -#include "mmr_can_types.h" - -/** - * Scs_timer represents the max number of counter - * that need to checked w/current time - */ -#ifndef MMR_SCS_NR_TIMERS -#define MMR_SCS_NR_TIMERS 5 -#endif - -/** - * It depends on how many bits the board devotes to the timer - * Check the datasheet - */ -typedef uint32_t TimerRange; - -typedef struct { - MmrCanMessageId scsId; - CanId receiverId; - TimerRange counter; -} MmrTimerSCS; - - -/** - * All time units are to be considered as milliseconds (1ms) - */ -bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId); -bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange currentTime); - -/** - * @brief The delay is taken individually so that the 'manager' - * can first check the ACK and eventually reset the associated arr_timer - * - * @param rtrResponse the 'manager' will have to manage an array of struct RTRresponse - * @param currentTime from __HAL_TIM_GET_COUNTER(&htimX) or directly from the CNT register - * @param thresholdDelay by rules 500ms - */ -bool MMR_CAN_GetTimerSCS(MmrCanMessageId scsId, CanId receiverId, int *rtr, TimerRange currentTime, TimerRange thresholdDelay); - - -#endif // !INC_MMR_CAN_TIMER_SCS_H_ diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 3ab9a2a..37ad9c4 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -1,61 +1,137 @@ #include "mmr_can_scs_manager.h" -static RTRresponse arr_scs[MMR_SCS_NR_TIMERS]; +static MmrCanScsEntry __scsEntries[MMR_CAN_SCS_ENTRIES_COUNT]; -static RTRresponse* findResponse(MmrCanMessageId scsId, CanId receiverId); +static void maybeIncrementRTR(MmrCanScsEntry *entry); + +static MmrCanScsEntry* putEntry(MmrCanHeader header); +static MmrCanScsEntry* clearEntry(MmrCanHeader header); +static MmrCanScsEntry* findEntry(MmrCanHeader header); + +static TimerRange getCurrentTime(); +static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); +static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry); -bool SetRTRresponse(MmrCanMessageId scsId, CanId receiverId, int rtr) -{ - RTRresponse *response = findResponse(0, 0); - if (response == NULL) return false; +bool MMR_CAN_MaybeHandleACK(MmrCanHeader header) { + if (header.messageType != MMR_CAN_MESSAGE_TYPE_ACK) { + return false; + } - response->scsId = scsId; - response->receiverId = receiverId; - response->rtr = 0; + header.messageType = MMR_CAN_MESSAGE_TYPE_NORMAL; + MmrCanScsEntry *entry = findEntry(header); + if (entry == NULL) { + return false; + } - return MMR_CAN_SetTimerSCS(response->scsId, response->receiverId, MMR_CAN_GetCurrentTime); -} - -void CheckSCS() -{ - if (counter>=MMR_SCS_NR_TIMERS) counter=0; - - RTRresponse *_rtrResponse = &arr_scs[counter]; - - if(!MMR_CAN_GetTimerSCS(_rtrResponse->scsId, _rtrResponse->receiverId, &_rtrResponse->rtr, MMR_CAN_GetCurrentTime, 500)) - { - // do something - } - - counter++; - - if (_rtrResponse->rtr==1) - { - // Return ritrasmission - } - - if (_rtrResponse->rtr>1) - { - // Return Safe State - } + clearEntry(header); + return true; } -TimerRange MMR_CAN_GetCurrentTime() -{ +HalStatus MMR_CAN_SendSCS( + CanHandle *hcan, + MmrCanMessageId scsId, + CanId senderId +) { + MmrCanHeader header = { + .senderId = senderId, + .messageId = scsId, + .priority = MMR_CAN_MESSAGE_PRIORITY_HIGH, + }; + + putEntry(header); + return sendScs(hcan, header); +} + + +HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { + static int counter = 0; + MmrCanScsEntry *entry = &__scsEntries[counter++ % MMR_CAN_SCS_ENTRIES_COUNT]; + + switch (checkScs(entry)) { + case MMR_CAN_SCS_CHECK_ERROR: return HAL_ERROR; + case MMR_CAN_SCS_CHECK_OK: return HAL_OK; + default: break; + } + + entry->counter = getCurrentTime(); + return sendScs(hcan, entry->header); +} + + +HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { + static CanMailbox scsMailbox = 0; + MmrCanPacket packet = { + .header = header, + .mailbox = &scsMailbox, + .length = 0, + }; + + return MMR_CAN_Send(hcan, packet); +} + + +MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { + maybeIncrementRTR(entry); + return + entry->rtr == 1 ? MMR_CAN_SCS_CHECK_RTR : + entry->rtr > 1 ? MMR_CAN_SCS_CHECK_ERROR : + MMR_CAN_SCS_CHECK_OK; +} + + +TimerRange getCurrentTime() { return 0; //TODO: HAL.... } -RTRresponse* findResponse(MmrCanMessageId scsId, CanId receiverId) { - int i = 0; - for (; i < MMR_SCS_NR_TIMERS; i++) { - RTRresponse *response = arr_scs + i; - if (response->scsId == scsId && response->receiverId == receiverId) { - return response; +void maybeIncrementRTR(MmrCanScsEntry *entry) { + TimerRange delay = + getCurrentTime() - entry->counter; + + if (delay >= MMR_CAN_MAX_TIMEOUT) { + entry->rtr++; + } +} + + +MmrCanScsEntry* putEntry(MmrCanHeader header) { + MmrCanScsEntry *entry = findEntry((MmrCanHeader){}); + if (entry == NULL) { + return NULL; + } + + *entry = (MmrCanScsEntry){ + .header = header, + .counter = getCurrentTime(), + }; + + return entry; +} + +MmrCanScsEntry* clearEntry(MmrCanHeader header) { + MmrCanScsEntry *entry = findEntry(header); + if (entry == NULL) { + return NULL; + } + + *entry = (MmrCanScsEntry){}; + return entry; +} + +MmrCanScsEntry* findEntry(MmrCanHeader header) { + uint32_t *target = MMR_CAN_HeaderToBits(&header); + uint32_t i = 0; + + for (; i < MMR_CAN_SCS_ENTRIES_COUNT; i++) { + MmrCanScsEntry *entry = __scsEntries + i; + uint32_t *curr = MMR_CAN_HeaderToBits(&entry->header); + + if (*curr == *target) { + return entry; } } return NULL; -} \ No newline at end of file +} diff --git a/Src/mmr_can_send_scs.c b/Src/mmr_can_send_scs.c deleted file mode 100644 index fd70002..0000000 --- a/Src/mmr_can_send_scs.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "mmr_can.h" -#include "mmr_can_scs_manager.h" - - -HalStatus MMR_CAN_SendSCS( - CanHandle *hcan, - MmrCanMessageId scsId, - CanMailbox *mailbox, - CanId senderId -) { - MmrCanPacket packet = { - .header = { - .senderId = senderId, - .messageId = scsId, - .priority = MMR_CAN_MESSAGE_PRIORITY_HIGH, - }, - .mailbox = mailbox, - .length = 0, - }; - - if(!MMR_CAN_SetRTRresponse()) - { - // do something - } - - return MMR_CAN_Send(hcan, packet); -} diff --git a/Src/mmr_can_timer_scs.c b/Src/mmr_can_timer_scs.c deleted file mode 100644 index 76ba3cd..0000000 --- a/Src/mmr_can_timer_scs.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "mmr_can_timer_scs.h" - -static MmrTimerSCS arr_timer[MMR_SCS_NR_TIMERS]; - -static MmrTimerSCS* findTimer(MmrCanMessageId scsId, CanId receiverId); - - -void MMR_CAN_InitTimerSCS() { - for (int i = 0; i < MMR_SCS_NR_TIMERS; i++) - { - arr_timer[i].scsId = 0; - arr_timer[i].receiverId = 0; - arr_timer[i].counter = 0; - } -} - - -bool MMR_CAN_ClearTimerSCS(MmrCanMessageId scsId, CanId receiverId) { - MmrTimerSCS *timer = findTimer(scsId, receiverId); - if (timer == NULL) return false; - - timer->scsId = 0; - timer->receiverId = 0; - timer->counter = 0; - return true; -} - - -bool MMR_CAN_SetTimerSCS(MmrCanMessageId scsId, CanId receiverId, TimerRange currentTime) { - MmrTimerSCS *timer = findTimer(0, 0); - if (timer == NULL) return false; - - timer->scsId = scsId; - timer->receiverId = receiverId; - timer->counter = currentTime; - return true; -} - - -bool MMR_CAN_GetTimerSCS(MmrCanMessageId scsId, CanId receiverId, int *rtr, TimerRange currentTime, TimerRange thresholdDelay) { - MmrTimerSCS *timer = findTimer(scsId, receiverId); - if (timer == NULL) return false; - - if (currentTime - timer->counter >= thresholdDelay) { - rtr++; - } - return true; -} - - -MmrTimerSCS* findTimer(MmrCanMessageId scsId, CanId receiverId) { - int i = 0; - for (; i < MMR_SCS_NR_TIMERS; i++) { - MmrTimerSCS *timer = arr_timer + i; - - if (timer->scsId == scsId && timer->receiverId == receiverId) { - return timer; - } - } - - return NULL; -} -- 2.52.0 From d0f8521b3bef9b75befb650b46103ad3bb4e31f5 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Thu, 17 Feb 2022 22:39:51 +0100 Subject: [PATCH 12/28] Use same naming convention --- Inc/mmr_can_scs_manager.h | 4 ++-- Src/mmr_can_scs_manager.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index 43301cf..3e224cc 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -48,9 +48,9 @@ typedef enum { } MmrCanScsCheckResult; -bool MMR_CAN_MaybeHandleACK(MmrCanHeader header); +bool MMR_CAN_MaybeHandleAck(MmrCanHeader header); HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan); -HalStatus MMR_CAN_SendSCS( +HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, CanId senderId diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 37ad9c4..adc5564 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -13,7 +13,7 @@ static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry); -bool MMR_CAN_MaybeHandleACK(MmrCanHeader header) { +bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) { if (header.messageType != MMR_CAN_MESSAGE_TYPE_ACK) { return false; } @@ -29,7 +29,7 @@ bool MMR_CAN_MaybeHandleACK(MmrCanHeader header) { } -HalStatus MMR_CAN_SendSCS( +HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, CanId senderId -- 2.52.0 From 21b406a27082e9df382bf8a5a5bf9b53165d9bbc Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sat, 19 Feb 2022 10:40:12 +0100 Subject: [PATCH 13/28] Add tick provider --- Inc/mmr_can.h | 4 ++++ Src/mmr_can.c | 8 ++++++++ Src/mmr_can_scs_manager.c | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index c3441d0..b1a0a79 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -30,6 +30,7 @@ #define MMR_CAN_MAX_DATA_LENGTH 8 #endif +typedef uint32_t (*MmrCanTickProvider)(); typedef uint8_t CanRxBuffer[MMR_CAN_MAX_DATA_LENGTH]; @@ -155,6 +156,9 @@ typedef struct { MMR_CAN_FilterConfig(phcan, MMR_CAN_GetDefaultFilterSettings()) +extern MmrCanTickProvider __mmr_can_tickProvider; + +void MMR_CAN_Init(MmrCanTickProvider tickProvider); HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan); HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings); CanFilterMask MMR_CAN_AlignStandardMask(CanFilterMask baseMask); diff --git a/Src/mmr_can.c b/Src/mmr_can.c index 6d4af6b..0a59c9c 100644 --- a/Src/mmr_can.c +++ b/Src/mmr_can.c @@ -2,6 +2,14 @@ #include "mmr_can_util.h" +MmrCanTickProvider __mmr_can_tickProvider; + + +void MMR_CAN_Init(MmrCanTickProvider tickProvider) { + __mmr_can_tickProvider = tickProvider; +} + + /** * @brief * Initializes the filter using the values diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index adc5564..f66df49 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -82,7 +82,7 @@ MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { TimerRange getCurrentTime() { - return 0; //TODO: HAL.... + return __mmr_can_tickProvider(); } -- 2.52.0 From e26751d5d460162665f3b4adb96526d713484b66 Mon Sep 17 00:00:00 2001 From: Nicola Gutierrez Date: Sat, 19 Feb 2022 11:48:51 +0100 Subject: [PATCH 14/28] Update header --- Inc/mmr_can.h | 1 + Inc/mmr_can_header.h | 7 +++++++ Inc/mmr_can_message_id.h | 7 ------- Inc/mmr_can_scs_manager.h | 6 ++++++ Src/mmr_can_header.c | 4 ++++ Src/mmr_can_message_id.c | 6 ------ Src/mmr_can_scs_manager.c | 19 ++++++++++++++++--- Src/mmr_can_send.c | 20 +++++++++++++++++++- 8 files changed, 53 insertions(+), 17 deletions(-) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index b1a0a79..d248046 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -165,6 +165,7 @@ CanFilterMask MMR_CAN_AlignStandardMask(CanFilterMask baseMask); MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings(); HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet); +HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet); HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result); #endif /* INC_MMR_CAN_H_ */ diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index 79d5d9f..c5bee49 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -18,6 +18,7 @@ * Constants with lower values have an higher priority. */ typedef enum { + MMR_CAN_MESSAGE_TYPE_SCS = B_(0000), MMR_CAN_MESSAGE_TYPE_ACK = B_(0001), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME = B_(0010), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END = B_(0011), @@ -62,6 +63,12 @@ uint32_t *MMR_CAN_HeaderToBits(MmrCanHeader *header); */ MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits); + +/** + * @brief + * Tells wether the given header represents an SCS. + */ +bool MMR_CAN_IsHeaderScs(MmrCanHeader header); bool MMR_CAN_IsMultiFrame(MmrCanHeader *header); bool MMR_CAN_IsMultiFrameEnd(MmrCanHeader *header); diff --git a/Inc/mmr_can_message_id.h b/Inc/mmr_can_message_id.h index d917f8d..0f332f1 100644 --- a/Inc/mmr_can_message_id.h +++ b/Inc/mmr_can_message_id.h @@ -47,13 +47,6 @@ uint8_t MMR_CAN_GetMessageIdSubtype(MmrCanMessageId msgId); */ bool MMR_CAN_IsMessageIdOfType(MmrCanMessageId msgId, MmrCanMessageIdType type); -/** - * @brief - * Tells wether the given message id is - * represents an SCS. - */ -bool MMR_CAN_IsMessageIdSCS(MmrCanMessageId msgId); - enum MmrCanMessageId { // SCS diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index 3e224cc..ee77d17 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -50,6 +50,12 @@ typedef enum { bool MMR_CAN_MaybeHandleAck(MmrCanHeader header); HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan); + +HalStatus MMR_CAN_SendAck( + CanHandle *hcan, + MmrCanHeader originalHeader +); + HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, diff --git a/Src/mmr_can_header.c b/Src/mmr_can_header.c index 8ceb707..7298c45 100644 --- a/Src/mmr_can_header.c +++ b/Src/mmr_can_header.c @@ -11,6 +11,10 @@ MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits) { } +bool MMR_CAN_IsHeaderScs(MmrCanHeader header) { + return header.messageType == MMR_CAN_MESSAGE_TYPE_SCS; +} + bool MMR_CAN_IsMultiFrame(MmrCanHeader *header) { return header->messageType == MMR_CAN_MESSAGE_TYPE_MULTI_FRAME; } diff --git a/Src/mmr_can_message_id.c b/Src/mmr_can_message_id.c index 61f1162..82c0cc7 100644 --- a/Src/mmr_can_message_id.c +++ b/Src/mmr_can_message_id.c @@ -1,12 +1,6 @@ #include #include "mmr_can_message_id.h" - -bool MMR_CAN_IsMessageIdSCS(MmrCanMessageId msgId) { - return MMR_CAN_IsMessageIdOfType(msgId, MMR_CAN_MESSAGE_ID_TYPE_SCS); -} - - bool MMR_CAN_IsMessageIdOfType( MmrCanMessageId msgId, MmrCanMessageIdType type diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index f66df49..3f8c9bb 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -18,7 +18,7 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) { return false; } - header.messageType = MMR_CAN_MESSAGE_TYPE_NORMAL; + header.messageType = MMR_CAN_MESSAGE_TYPE_SCS; MmrCanScsEntry *entry = findEntry(header); if (entry == NULL) { return false; @@ -29,6 +29,15 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) { } +HalStatus MMR_CAN_SendAck( + CanHandle *hcan, + MmrCanHeader originalHeader +) { + originalHeader.messageType = MMR_CAN_MESSAGE_TYPE_ACK; + return sendScs(hcan, originalHeader); +} + + HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, @@ -38,9 +47,13 @@ HalStatus MMR_CAN_SendScs( .senderId = senderId, .messageId = scsId, .priority = MMR_CAN_MESSAGE_PRIORITY_HIGH, + .messageType = MMR_CAN_MESSAGE_TYPE_SCS, }; - putEntry(header); + if (putEntry(header) == NULL) { + return HAL_ERROR; + } + return sendScs(hcan, header); } @@ -68,7 +81,7 @@ HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { .length = 0, }; - return MMR_CAN_Send(hcan, packet); + return MMR_CAN_SendNoTamper(hcan, packet); } diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index 2ff5374..d3ab377 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -36,14 +36,32 @@ HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { .TransmitGlobalTime = DISABLE, }, }; - syncHeaders(&tp); + syncHeaders(&tp); return packet.length <= MMR_CAN_MAX_DATA_LENGTH ? sendNormal(&tp) : sendMulti(&tp); } +HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet) { + TransmissionParams tp = { + .handle = hcan, + .packet = &packet, + .headers.mmr = packet.header, + .headers.tx = { + .IDE = CAN_ID_EXT, + .RTR = CAN_RTR_DATA, + .DLC = packet.length, + .TransmitGlobalTime = DISABLE, + }, + }; + + syncHeaders(&tp); + return send(&tp); +} + + static HalStatus sendNormal(TransmissionParams *tp) { setMessageType(tp, MMR_CAN_MESSAGE_TYPE_NORMAL); return send(tp); -- 2.52.0 From 7190dbcdf9a502fa53f88b144020789fd5a2c971 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sat, 19 Feb 2022 12:59:05 +0100 Subject: [PATCH 15/28] Fix header bit translation --- Inc/mmr_can_header.h | 4 ++-- Src/mmr_can_header.c | 19 +++++++++++++++---- Src/mmr_can_receive.c | 10 +++++++--- Src/mmr_can_scs_manager.c | 12 ++++++++---- Src/mmr_can_send.c | 8 +++++--- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index c5bee49..134e825 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -54,14 +54,14 @@ typedef struct { * 3 bits set to zero and the remaining 29 containing the * extended id */ -uint32_t *MMR_CAN_HeaderToBits(MmrCanHeader *header); +uint32_t MMR_CAN_HeaderToBits(MmrCanHeader header); /** * @brief * Converts a 32bits integer to an MmrCanHeader. * The left-most 3 bits must be of padding. */ -MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits); +MmrCanHeader MMR_CAN_HeaderFromBits(uint32_t bits); /** diff --git a/Src/mmr_can_header.c b/Src/mmr_can_header.c index 7298c45..b47fc38 100644 --- a/Src/mmr_can_header.c +++ b/Src/mmr_can_header.c @@ -2,12 +2,23 @@ #include "mmr_can_util.h" #include "mmr_can_optimize.h" -uint32_t *MMR_CAN_HeaderToBits(MmrCanHeader *header) { - return (uint32_t*)header; +uint32_t MMR_CAN_HeaderToBits(MmrCanHeader header) { + return 0 + | ((uint32_t)header.priority << 26) + | ((uint32_t)header.messageId << 23) + | ((uint32_t)header.senderId << 13) + | ((uint32_t)header.seqNumber << 3) + | ((uint32_t)header.messageType); } -MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits) { - return (MmrCanHeader*)bits; +MmrCanHeader MMR_CAN_HeaderFromBits(uint32_t bits) { + return (MmrCanHeader) { + .priority = bits >> 26, + .messageId = bits >> 23, + .senderId = bits >> 13, + .seqNumber = bits >> 3, + .messageType = bits, + }; } diff --git a/Src/mmr_can_receive.c b/Src/mmr_can_receive.c index 3627f2f..a182662 100644 --- a/Src/mmr_can_receive.c +++ b/Src/mmr_can_receive.c @@ -64,10 +64,14 @@ static HalStatus receiveAll(ReceptionParams *rp) { static HalStatus receiveOne(ReceptionParams *rp) { - HalStatus status = - HAL_CAN_GetRxMessage(rp->handle, rp->fifo, &(rp->headers.rx), rp->result); + HalStatus status = HAL_CAN_GetRxMessage( + rp->handle, + rp->fifo, + &rp->headers.rx, + rp->result + ); - rp->headers.mmr = convertTo(MmrCanHeader, rp->headers.rx.ExtId); + rp->headers.mmr = MMR_CAN_HeaderFromBits(rp->headers.rx.ExtId); return status; } diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 3f8c9bb..4370363 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -9,7 +9,7 @@ static MmrCanScsEntry* clearEntry(MmrCanHeader header); static MmrCanScsEntry* findEntry(MmrCanHeader header); static TimerRange getCurrentTime(); -static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); +HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry); @@ -62,6 +62,10 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { static int counter = 0; MmrCanScsEntry *entry = &__scsEntries[counter++ % MMR_CAN_SCS_ENTRIES_COUNT]; + if (MMR_CAN_HeaderToBits(entry->header) == 0) { + return HAL_OK; + } + switch (checkScs(entry)) { case MMR_CAN_SCS_CHECK_ERROR: return HAL_ERROR; case MMR_CAN_SCS_CHECK_OK: return HAL_OK; @@ -134,14 +138,14 @@ MmrCanScsEntry* clearEntry(MmrCanHeader header) { } MmrCanScsEntry* findEntry(MmrCanHeader header) { - uint32_t *target = MMR_CAN_HeaderToBits(&header); + uint32_t target = MMR_CAN_HeaderToBits(header); uint32_t i = 0; for (; i < MMR_CAN_SCS_ENTRIES_COUNT; i++) { MmrCanScsEntry *entry = __scsEntries + i; - uint32_t *curr = MMR_CAN_HeaderToBits(&entry->header); + uint32_t curr = MMR_CAN_HeaderToBits(entry->header); - if (*curr == *target) { + if (curr == target) { return entry; } } diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index d3ab377..f9a8b0f 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -24,6 +24,9 @@ static void setMessageType(TransmissionParams *header, MmrCanMessageType type); static void syncHeaders(TransmissionParams *tp); +static CanMailbox __mailbox; + + HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { TransmissionParams tp = { .handle = hcan, @@ -57,7 +60,6 @@ HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet) { }, }; - syncHeaders(&tp); return send(&tp); } @@ -108,13 +110,13 @@ static HalStatus send(TransmissionParams *tp) { tp->handle, &tp->headers.tx, tp->packet->data, - tp->packet->mailbox + &__mailbox ); } static void syncHeaders(TransmissionParams *tp) { - tp->headers.tx.ExtId = *MMR_CAN_HeaderToBits(&tp->headers.mmr); + tp->headers.tx.ExtId = MMR_CAN_HeaderToBits(tp->headers.mmr); } -- 2.52.0 From 9dfb76b9de834fd89ab34fb2ca618ac928dc4e1c Mon Sep 17 00:00:00 2001 From: Nicola Gutierrez Date: Sat, 19 Feb 2022 13:56:15 +0100 Subject: [PATCH 16/28] Test HandleNext OK --- Src/mmr_can_scs_manager.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 4370363..3f0970f 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -60,7 +60,10 @@ HalStatus MMR_CAN_SendScs( HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { static int counter = 0; - MmrCanScsEntry *entry = &__scsEntries[counter++ % MMR_CAN_SCS_ENTRIES_COUNT]; + + MmrCanScsEntry *entry = &__scsEntries[counter]; + counter++; + counter %= MMR_CAN_SCS_ENTRIES_COUNT; if (MMR_CAN_HeaderToBits(entry->header) == 0) { return HAL_OK; @@ -104,8 +107,8 @@ TimerRange getCurrentTime() { void maybeIncrementRTR(MmrCanScsEntry *entry) { - TimerRange delay = - getCurrentTime() - entry->counter; + TimerRange now = getCurrentTime(); + TimerRange delay = now - entry->counter; if (delay >= MMR_CAN_MAX_TIMEOUT) { entry->rtr++; -- 2.52.0 From 81f64d0b17f2c41d1b366fe96bac7c2366113ee5 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sun, 20 Feb 2022 12:44:13 +0100 Subject: [PATCH 17/28] Remove linting --- .clang-format | 211 ------------------------------ .github/workflows/cpp-linting.yml | 19 --- 2 files changed, 230 deletions(-) delete mode 100644 .clang-format delete mode 100644 .github/workflows/cpp-linting.yml diff --git a/.clang-format b/.clang-format deleted file mode 100644 index a6e0111..0000000 --- a/.clang-format +++ /dev/null @@ -1,211 +0,0 @@ -Language: Cpp -AccessModifierOffset: -1 -AlignAfterOpenBracket: AlwaysBreak # BlockIndent -AlignArrayOfStructures: None -AlignConsecutiveMacros: None -AlignConsecutiveAssignments: None -AlignConsecutiveBitFields: None -AlignConsecutiveDeclarations: None -AlignEscapedNewlines: Left -AlignOperands: AlignAfterOperator -AlignTrailingComments: true -AllowAllArgumentsOnNextLine: false -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortEnumsOnASingleLine: false -AllowShortBlocksOnASingleLine: Empty -AllowShortCaseLabelsOnASingleLine: true -AllowShortFunctionsOnASingleLine: Empty -AllowShortLambdasOnASingleLine: Empty -AllowShortIfStatementsOnASingleLine: Never -AllowShortLoopsOnASingleLine: false -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: true -AlwaysBreakTemplateDeclarations: Yes -AttributeMacros: - - __capability -BinPackArguments: false -BinPackParameters: false -BraceWrapping: - AfterCaseLabel: false - AfterClass: false - AfterControlStatement: MultiLine - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - AfterExternBlock: false - BeforeCatch: true - BeforeElse: true - BeforeLambdaBody: false - BeforeWhile: true - IndentBraces: false - SplitEmptyFunction: true - SplitEmptyRecord: true - SplitEmptyNamespace: true -BreakBeforeBinaryOperators: NonAssignment -BreakBeforeConceptDeclarations: true -BreakBeforeBraces: Custom -BreakBeforeInheritanceComma: false -BreakInheritanceList: BeforeColon -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -BreakConstructorInitializers: BeforeColon -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: true -ColumnLimit: 80 -CommentPragmas: '^ IWYU pragma:' -QualifierAlignment: Left -CompactNamespaces: false -ConstructorInitializerIndentWidth: 2 -ContinuationIndentWidth: 2 -Cpp11BracedListStyle: true -DeriveLineEnding: true -DerivePointerAlignment: false -DisableFormat: false -EmptyLineAfterAccessModifier: Never -EmptyLineBeforeAccessModifier: LogicalBlock -ExperimentalAutoDetectBinPacking: false -PackConstructorInitializers: NextLine -BasedOnStyle: '' -ConstructorInitializerAllOnOneLineOrOnePerLine: false -AllowAllConstructorInitializersOnNextLine: true -FixNamespaceComments: true -ForEachMacros: - - foreach - - Q_FOREACH - - BOOST_FOREACH -IfMacros: - - KJ_IF_MAYBE -IncludeBlocks: Regroup -IncludeCategories: - - Regex: '^' - Priority: 2 - SortPriority: 0 - CaseSensitive: false - - Regex: '^<.*\.h>' - Priority: 1 - SortPriority: 0 - CaseSensitive: false - - Regex: '^<.*' - Priority: 2 - SortPriority: 0 - CaseSensitive: false - - Regex: '.*' - Priority: 3 - SortPriority: 0 - CaseSensitive: false -IncludeIsMainRegex: '([-_](test|unittest))?$' -IncludeIsMainSourceRegex: '' -IndentAccessModifiers: false -IndentCaseLabels: true -IndentCaseBlocks: false -IndentGotoLabels: false -IndentPPDirectives: None -IndentExternBlock: Indent -IndentRequires: false -IndentWidth: 2 -IndentWrappedFunctionNames: false -InsertTrailingCommas: Wrapped -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: false -LambdaBodyIndentation: Signature -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 2 -NamespaceIndentation: None -ObjCBinPackProtocolList: Never -ObjCBlockIndentWidth: 2 -ObjCBreakBeforeNestedBlockParam: true -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 2 -PenaltyBreakBeforeFirstCallParameter: 1 -PenaltyBreakComment: 300 -PenaltyBreakFirstLessLess: 120 -PenaltyBreakString: 1000 -PenaltyBreakTemplateDeclaration: 10 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 200 -PenaltyIndentedWhitespace: 0 -PointerAlignment: Right -PPIndentWidth: -1 -RawStringFormats: - - Language: Cpp - Delimiters: - - cc - - CC - - cpp - - Cpp - - CPP - - 'c++' - - 'C++' - CanonicalDelimiter: '' - BasedOnStyle: google - - Language: TextProto - Delimiters: - - pb - - PB - - proto - - PROTO - EnclosingFunctions: - - EqualsProto - - EquivToProto - - PARSE_PARTIAL_TEXT_PROTO - - PARSE_TEST_PROTO - - PARSE_TEXT_PROTO - - ParseTextOrDie - - ParseTextProtoOrDie - - ParseTestProto - - ParsePartialTestProto - CanonicalDelimiter: pb - BasedOnStyle: google -ReferenceAlignment: Pointer -ReflowComments: true -ShortNamespaceLines: 1 -SortIncludes: CaseSensitive -SortJavaStaticImport: Before -SortUsingDeclarations: true -SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -SpaceBeforeCaseColon: false -SpaceBeforeCpp11BracedList: true -SpaceBeforeCtorInitializerColon: true -SpaceBeforeInheritanceColon: true -SpaceBeforeParens: ControlStatements -SpaceAroundPointerQualifiers: Default -SpaceBeforeRangeBasedForLoopColon: true -SpaceInEmptyBlock: false -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 2 -SpacesInAngles: Never -SpacesInConditionalStatement: false -SpacesInContainerLiterals: false -SpacesInCStyleCastParentheses: false -SpacesInLineCommentPrefix: - Minimum: 1 - Maximum: -1 -SpacesInParentheses: false -SpacesInSquareBrackets: false -SpaceBeforeSquareBrackets: false -BitFieldColonSpacing: Both -Standard: Auto -StatementAttributeLikeMacros: - - Q_EMIT -StatementMacros: - - Q_UNUSED - - QT_REQUIRE_VERSION -TabWidth: 8 -UseCRLF: false -UseTab: Never -WhitespaceSensitiveMacros: - - STRINGIZE - - PP_STRINGIZE - - BOOST_PP_STRINGIZE - - NS_SWIFT_NAME - - CF_SWIFT_NAME diff --git a/.github/workflows/cpp-linting.yml b/.github/workflows/cpp-linting.yml deleted file mode 100644 index 27a3a9f..0000000 --- a/.github/workflows/cpp-linting.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: cpp-linting -on: - pull_request: - -jobs: - cpp-linter: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: shenxianpeng/cpp-linter-action@master - id: linter - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - style: file - - - name: Result - if: steps.linter.outputs.checks-failed > 0 - run: exit 1 \ No newline at end of file -- 2.52.0 From dd53c8f4ccd360c23b860d98f95d9f659a7b090d Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Sun, 20 Feb 2022 12:49:00 +0100 Subject: [PATCH 18/28] Remove indents --- Src/mmr_can_header.c | 18 +++++++++--------- Src/mmr_can_receive.c | 9 +++++---- Src/mmr_can_scs_manager.c | 12 ++++++------ Src/mmr_can_send.c | 4 ++-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/Src/mmr_can_header.c b/Src/mmr_can_header.c index b47fc38..760f800 100644 --- a/Src/mmr_can_header.c +++ b/Src/mmr_can_header.c @@ -4,20 +4,20 @@ uint32_t MMR_CAN_HeaderToBits(MmrCanHeader header) { return 0 - | ((uint32_t)header.priority << 26) - | ((uint32_t)header.messageId << 23) - | ((uint32_t)header.senderId << 13) - | ((uint32_t)header.seqNumber << 3) - | ((uint32_t)header.messageType); + | ((uint32_t)header.priority << 26) + | ((uint32_t)header.messageId << 23) + | ((uint32_t)header.senderId << 13) + | ((uint32_t)header.seqNumber << 3) + | ((uint32_t)header.messageType); } MmrCanHeader MMR_CAN_HeaderFromBits(uint32_t bits) { return (MmrCanHeader) { - .priority = bits >> 26, + .priority = bits >> 26, .messageId = bits >> 23, - .senderId = bits >> 13, - .seqNumber = bits >> 3, - .messageType = bits, + .senderId = bits >> 13, + .seqNumber = bits >> 3, + .messageType = bits, }; } diff --git a/Src/mmr_can_receive.c b/Src/mmr_can_receive.c index a182662..7f774c8 100644 --- a/Src/mmr_can_receive.c +++ b/Src/mmr_can_receive.c @@ -55,7 +55,8 @@ static HalStatus receiveAll(ReceptionParams *rp) { do { rp->result += MMR_CAN_MAX_DATA_LENGTH; status |= receiveOne(rp); - } while ( + } + while ( headerIsMultiFrame(&rp->headers.mmr, targetId) && status == HAL_OK ); @@ -66,9 +67,9 @@ static HalStatus receiveAll(ReceptionParams *rp) { static HalStatus receiveOne(ReceptionParams *rp) { HalStatus status = HAL_CAN_GetRxMessage( rp->handle, - rp->fifo, - &rp->headers.rx, - rp->result + rp->fifo, + &rp->headers.rx, + rp->result ); rp->headers.mmr = MMR_CAN_HeaderFromBits(rp->headers.rx.ExtId); diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 3f0970f..fd56bd5 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -47,11 +47,11 @@ HalStatus MMR_CAN_SendScs( .senderId = senderId, .messageId = scsId, .priority = MMR_CAN_MESSAGE_PRIORITY_HIGH, - .messageType = MMR_CAN_MESSAGE_TYPE_SCS, + .messageType = MMR_CAN_MESSAGE_TYPE_SCS, }; if (putEntry(header) == NULL) { - return HAL_ERROR; + return HAL_ERROR; } return sendScs(hcan, header); @@ -66,13 +66,13 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { counter %= MMR_CAN_SCS_ENTRIES_COUNT; if (MMR_CAN_HeaderToBits(entry->header) == 0) { - return HAL_OK; + return HAL_OK; } switch (checkScs(entry)) { - case MMR_CAN_SCS_CHECK_ERROR: return HAL_ERROR; - case MMR_CAN_SCS_CHECK_OK: return HAL_OK; - default: break; + case MMR_CAN_SCS_CHECK_ERROR: return HAL_ERROR; + case MMR_CAN_SCS_CHECK_OK: return HAL_OK; + default: break; } entry->counter = getCurrentTime(); diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index f9a8b0f..5d00e7d 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -31,7 +31,7 @@ HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { TransmissionParams tp = { .handle = hcan, .packet = &packet, - .headers.mmr = packet.header, + .headers.mmr = packet.header, .headers.tx = { .IDE = CAN_ID_EXT, .RTR = CAN_RTR_DATA, @@ -51,7 +51,7 @@ HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet) { TransmissionParams tp = { .handle = hcan, .packet = &packet, - .headers.mmr = packet.header, + .headers.mmr = packet.header, .headers.tx = { .IDE = CAN_ID_EXT, .RTR = CAN_RTR_DATA, -- 2.52.0 From f5c8353245756e717ba1b86ced4ee56dc57be374 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 13:21:34 +0100 Subject: [PATCH 19/28] Add documentation --- Inc/mmr_can.h | 19 ++++++++ Inc/mmr_can_events.h | 11 +++++ Inc/mmr_can_header.h | 16 +++++-- Inc/mmr_can_includes.h | 10 +++++ Inc/mmr_can_message_id.h | 14 ++++++ Inc/mmr_can_optimize.h | 6 +++ Inc/mmr_can_queue.h | 14 ------ Inc/mmr_can_scs_manager.h | 95 +++++++++++++++++++++++++++++++++++++-- Inc/mmr_can_types.h | 6 +++ Inc/mmr_can_util.h | 6 +++ Src/mmr_can_send.c | 26 +++++------ 11 files changed, 189 insertions(+), 34 deletions(-) delete mode 100644 Inc/mmr_can_queue.h diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index d248046..b68e16c 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -1,3 +1,9 @@ +/** + * @file mmr_can.h + * @brief + * Main header for the mmr_can library. + */ + #ifndef INC_MMR_CAN_H_ #define INC_MMR_CAN_H_ @@ -30,7 +36,13 @@ #define MMR_CAN_MAX_DATA_LENGTH 8 #endif + typedef uint32_t (*MmrCanTickProvider)(); + +/** + * @brief + * A buffer large enough to hold a CAN payload. + */ typedef uint8_t CanRxBuffer[MMR_CAN_MAX_DATA_LENGTH]; @@ -156,8 +168,15 @@ typedef struct { MMR_CAN_FilterConfig(phcan, MMR_CAN_GetDefaultFilterSettings()) +/** + * @brief + * A function that provides the current tick. + * Used to track the delay between message + * and acknowledgment. + */ extern MmrCanTickProvider __mmr_can_tickProvider; + void MMR_CAN_Init(MmrCanTickProvider tickProvider); HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan); HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings); diff --git a/Inc/mmr_can_events.h b/Inc/mmr_can_events.h index b8dba1f..be7cd88 100644 --- a/Inc/mmr_can_events.h +++ b/Inc/mmr_can_events.h @@ -1,3 +1,14 @@ +/** + * @file mmr_can_events.h + * @brief + * This header provides a set of utilities for working + * with interrupts. + * + * The recommended way of readings the CAN bus is + * via polling, altought interrupt may be used for + * monitoring critical messages. + */ + #ifndef INC_MMR_CAN_EVENTS_H_ #define INC_MMR_CAN_EVENTS_H_ diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index 134e825..f7a1743 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -1,3 +1,13 @@ +/** + * @file mmr_can_header.h + * @brief + * This file defines the header used for the can message, + * along with its utilities. + * + * With header is intended the ExtendedId portion + * of the can message. + */ + #ifndef INC_MMR_CAN_HEADER_H_ #define INC_MMR_CAN_HEADER_H_ @@ -49,7 +59,7 @@ typedef struct { /** * @brief - * Converts an MmrCanHeader to bits. + * Serializes an MmrCanHeader to bits. * That is, a 32bits integer with the first * 3 bits set to zero and the remaining 29 containing the * extended id @@ -58,8 +68,8 @@ uint32_t MMR_CAN_HeaderToBits(MmrCanHeader header); /** * @brief - * Converts a 32bits integer to an MmrCanHeader. - * The left-most 3 bits must be of padding. + * Deserializes a 32bits integer to an MmrCanHeader. + * The 3 left-most bits must be of padding. */ MmrCanHeader MMR_CAN_HeaderFromBits(uint32_t bits); diff --git a/Inc/mmr_can_includes.h b/Inc/mmr_can_includes.h index b299c3e..233f6bc 100644 --- a/Inc/mmr_can_includes.h +++ b/Inc/mmr_can_includes.h @@ -1,3 +1,13 @@ +/** + * @file mmr_can_includes.h + * @brief + * This header contains the include macros + * related to the external can_bus drivers. + * + * These may be changed based on the board that is + * being used. + */ + #ifndef INC_MMR_CAN_INCLUDES_H_ #define INC_MMR_CAN_INCLUDES_H_ diff --git a/Inc/mmr_can_message_id.h b/Inc/mmr_can_message_id.h index 0f332f1..26844f9 100644 --- a/Inc/mmr_can_message_id.h +++ b/Inc/mmr_can_message_id.h @@ -1,3 +1,17 @@ +/** + * @file mmr_can_message_id.h + * @brief + * This header contains the message id declarations. + * + * Message ids identify a message, allowing the receiver + * to take appropriate action when parsing one. + * + * For example, a can packet with message id set to + * MMR_CAN_MESSAGE_ID_POINT might be interpreted as + * a message carrying a struct Point { int x; int y; };, + * and thus deserialized accordingly. + */ + #ifndef INC_MMR_CAN_MESSAGE_ID_H_ #define INC_MMR_CAN_MESSAGE_ID_H_ diff --git a/Inc/mmr_can_optimize.h b/Inc/mmr_can_optimize.h index 341b77c..10c5841 100644 --- a/Inc/mmr_can_optimize.h +++ b/Inc/mmr_can_optimize.h @@ -1,3 +1,9 @@ +/** + * @file mmr_can_optimize.h + * @brief + * Low level optimization utilities. + */ + #ifndef INC_MMR_CAN_OPTIMIZE_H_ #define INC_MMR_CAN_OPTIMIZE_H_ diff --git a/Inc/mmr_can_queue.h b/Inc/mmr_can_queue.h deleted file mode 100644 index 11f3b0a..0000000 --- a/Inc/mmr_can_queue.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef INC_MMR_CAN_QUEUE_H_ -#define INC_MMR_CAN_QUEUE_H_ - -#include -#include "mmr_can.h" - -#define MMR_CAN_QUEUE_SIZE 10 - -typedef struct { - MmrCanMessage messages[MMR_CAN_QUEUE_SIZE]; - size_t count; -} MmrCanQueue; - -#endif /* INC_MMR_CAN_QUEUE_H_ */ diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index ee77d17..e72f2e9 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -1,3 +1,10 @@ +/** + * @file mmr_can_scs_manager.h + * @brief + * Provides utilities for managing the scs messages, + * such as transmission, retransmission and timeout error. + */ + #ifndef INC_MMR_CAN_SCS_MANAGER_H_ #define INC_MMR_CAN_SCS_MANAGER_H_ @@ -5,8 +12,9 @@ /** - * Scs_timer represents the max number of counter - * that need to checked w/current time + * @brief + * The maximum number of scs messages that + * can be tracked at any given time. */ #ifndef MMR_CAN_SCS_ENTRIES_COUNT #define MMR_CAN_SCS_ENTRIES_COUNT 5 @@ -24,6 +32,7 @@ /** + * @brief * It depends on how many bits the board devotes to the timer * Check the datasheet */ @@ -31,31 +40,111 @@ typedef uint32_t TimerRange; /** - * @brief Represents the base-struct to manage a single RTR + * @brief + * Represents the base-struct to manage a single RTR * and allows to interface with the associated SCS's timer */ typedef struct { + /** + * @brief + * The header used to index this entry. + */ MmrCanHeader header; + + /** + * @brief + * The time at which this message was sent, + * represented as milliseconds since the board + * was turned on. + */ TimerRange counter; + + /** + * @brief + * Number of retransmissions for this message. + * + * == 0 -> No retransmission occurred. + * >= 1 -> The scs was retransmitted. + */ int rtr; } MmrCanScsEntry; +/** + * @brief + * The results of an scsCheck operation. + */ typedef enum { + /** + * @brief No timeout error. + */ MMR_CAN_SCS_CHECK_OK, + + /** + * @brief The message should be retransmitted. + */ MMR_CAN_SCS_CHECK_RTR, + + /** + * @brief + * The message has timed out and has already been + * retransmitted, fail. + */ MMR_CAN_SCS_CHECK_ERROR, } MmrCanScsCheckResult; +/** + * @brief + * Tries to handle an acknowledgment for a particular scs. + * + * This function MUST be called every time a + * message is received, as it might potentially be an + * ACK. + * + * @param header The header to check. + * @return true The message was an ACK and was cleared accordingly. + * @return false The message wasn't an ACK. + */ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header); + +/** + * @brief + * Checks the array with the stored scs messages and + * retransmits the message if no ack was received. + * + * This function MUST be called at every loop. + * + * @param hcan The interface to use. + * @return HalStatus + * The result of the operation. + * HAL_ERROR should immediately be handled as a safe state. + */ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan); +/** + * @brief + * Send an acknowledgment packet based on the + * given scs header. + * + * @param hcan The can interface to use. + * @param originalHeader The scs header to acknowledge. + * @return HalStatus The result of the operation. + */ HalStatus MMR_CAN_SendAck( CanHandle *hcan, MmrCanHeader originalHeader ); +/** + * @brief + * Sends an Scs message. + * + * @param hcan The can interface to use. + * @param scsId The MMR_CAN_MESSAGE_ID_SCS_xx id. + * @param senderId The id of this board. + * @return HalStatus The result of the operation. + */ HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, diff --git a/Inc/mmr_can_types.h b/Inc/mmr_can_types.h index 3b7f115..657e379 100644 --- a/Inc/mmr_can_types.h +++ b/Inc/mmr_can_types.h @@ -1,3 +1,9 @@ +/** + * @file mmr_can_types.h + * @brief + * Basic type definitions for the can. + */ + #ifndef INC_MMR_CAN_TYPES_H_ #define INC_MMR_CAN_TYPES_H_ diff --git a/Inc/mmr_can_util.h b/Inc/mmr_can_util.h index 723dfa3..ef043da 100644 --- a/Inc/mmr_can_util.h +++ b/Inc/mmr_can_util.h @@ -1,3 +1,9 @@ +/** + * @file mmr_can_util.h + * @brief + * Utility functions and macros. + */ + #ifndef INC_MMR_CAN_UTIL_H_ #define INC_MMR_CAN_UTIL_H_ diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index 5d00e7d..f92599d 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -14,6 +14,7 @@ typedef struct { } TransmissionParams; +static TransmissionParams buildParams(CanHandle *hcan, MmrCanPacket packet); static HalStatus send(TransmissionParams *tp); static HalStatus sendNormal(TransmissionParams *tp); static HalStatus sendMulti(TransmissionParams *tp); @@ -28,17 +29,8 @@ static CanMailbox __mailbox; HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { - TransmissionParams tp = { - .handle = hcan, - .packet = &packet, - .headers.mmr = packet.header, - .headers.tx = { - .IDE = CAN_ID_EXT, - .RTR = CAN_RTR_DATA, - .DLC = packet.length, - .TransmitGlobalTime = DISABLE, - }, - }; + TransmissionParams tp = + buildParams(hcan, packet); syncHeaders(&tp); return packet.length <= MMR_CAN_MAX_DATA_LENGTH @@ -48,7 +40,15 @@ HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet) { - TransmissionParams tp = { + TransmissionParams tp = + buildParams(hcan, packet); + + return send(&tp); +} + + +static TransmissionParams buildParams(CanHandle *hcan, MmrCanPacket packet) { + return (TransmissionParams) { .handle = hcan, .packet = &packet, .headers.mmr = packet.header, @@ -59,8 +59,6 @@ HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet) { .TransmitGlobalTime = DISABLE, }, }; - - return send(&tp); } -- 2.52.0 From 86475b11535b7c6797dde98e9dea0914b20fad7a Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 18:50:53 +0100 Subject: [PATCH 20/28] Improve docs --- Inc/mmr_can.h | 54 +++++++++++++++++++++++++++++++++++++-- Inc/mmr_can_events.h | 8 ++++++ Inc/mmr_can_scs_manager.h | 7 +---- Src/mmr_can.c | 2 +- Src/mmr_can_events.c | 8 +----- 5 files changed, 63 insertions(+), 16 deletions(-) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index b68e16c..cd9cbec 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -177,14 +177,64 @@ typedef struct { extern MmrCanTickProvider __mmr_can_tickProvider; -void MMR_CAN_Init(MmrCanTickProvider tickProvider); +/** + * @brief + * Sets the tick provider. + * + * @param tickProvider + * The function to use when fetching the current tick. + */ +void MMR_CAN_SetTickProvider(MmrCanTickProvider tickProvider); + +/** + * @brief + * Configures the filters with the default configuration + * and starts the can interface. + */ HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan); + +/** + * @brief + * Configures the filters. + * + * @param hcan The interface to use. + * @param settings The settings to use when configuring the filters. + * @return HalStatus The result of the operation. + */ HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings); -CanFilterMask MMR_CAN_AlignStandardMask(CanFilterMask baseMask); + +/** + * @brief + * Provides the default configuration for + * the filters. + */ MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings(); +/** + * @brief + * Sends a can packet over the network. + * Based on the data length, the packet may be split + * into multiple frames. + * + * It is not recommended to send more than 8 bytes, as the + * 'multiple frames' feature has not been fully implemented yet. + */ HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet); + +/** + * @brief + * Sends a can packet over the network as is, without + * changing the data that is provided. + * + * This can prevent the sudden change of the header's message type when + * using MMR_CAN_Send. + */ HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet); + +/** + * @brief + * Receives a can message from the network. + */ HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result); #endif /* INC_MMR_CAN_H_ */ diff --git a/Inc/mmr_can_events.h b/Inc/mmr_can_events.h index be7cd88..6b4a6d2 100644 --- a/Inc/mmr_can_events.h +++ b/Inc/mmr_can_events.h @@ -25,6 +25,14 @@ typedef struct { #define MMR_CAN_CreateEventList(handlers) \ (const MmrCanEventList) { handlers, sizeofarray(handlers) } + +/** + * @brief + * Activates the CAN rx interrupts + * + * When one is fired, the callbacks provided inside the + * MmrCanEventList will be invoked + */ HalStatus MMR_CAN_InitRxHandlers(CanHandle *hcan, const MmrCanEventList *rxEvents); diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index e72f2e9..08a1b32 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -115,7 +115,6 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header); * * This function MUST be called at every loop. * - * @param hcan The interface to use. * @return HalStatus * The result of the operation. * HAL_ERROR should immediately be handled as a safe state. @@ -127,9 +126,7 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan); * Send an acknowledgment packet based on the * given scs header. * - * @param hcan The can interface to use. - * @param originalHeader The scs header to acknowledge. - * @return HalStatus The result of the operation. + * @param originalHeader The scs header to acknowledge. */ HalStatus MMR_CAN_SendAck( CanHandle *hcan, @@ -140,10 +137,8 @@ HalStatus MMR_CAN_SendAck( * @brief * Sends an Scs message. * - * @param hcan The can interface to use. * @param scsId The MMR_CAN_MESSAGE_ID_SCS_xx id. * @param senderId The id of this board. - * @return HalStatus The result of the operation. */ HalStatus MMR_CAN_SendScs( CanHandle *hcan, diff --git a/Src/mmr_can.c b/Src/mmr_can.c index 0a59c9c..e9b1991 100644 --- a/Src/mmr_can.c +++ b/Src/mmr_can.c @@ -5,7 +5,7 @@ MmrCanTickProvider __mmr_can_tickProvider; -void MMR_CAN_Init(MmrCanTickProvider tickProvider) { +void MMR_CAN_SetTickProvider(MmrCanTickProvider tickProvider) { __mmr_can_tickProvider = tickProvider; } diff --git a/Src/mmr_can_events.c b/Src/mmr_can_events.c index 5e0a3f9..1fe9e09 100644 --- a/Src/mmr_can_events.c +++ b/Src/mmr_can_events.c @@ -10,13 +10,7 @@ static void __invokeAll(const MmrCanEventList *events, const MmrCanMessage *even static void __maybeInvoke(const MmrCanEventHandler handler, const MmrCanMessage *event); -/** - * @brief - * Activates the CAN rx interrupts - * - * When one is fired, the callbacks provided inside the - * MmrCanEventList will be invoked - */ + HalStatus MMR_CAN_InitRxHandlers(CanHandle *hcan, const MmrCanEventList *rxEvents) { _rxEvents = rxEvents; return HAL_CAN_ActivateNotification(hcan, MMR_CAN_RX_INTERRUPT); -- 2.52.0 From a0e9e902ebf30f4a4ae83e28321100ddb82f8307 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 18:53:57 +0100 Subject: [PATCH 21/28] Remove pointer --- Inc/mmr_can_header.h | 4 ++-- Src/mmr_can_header.c | 8 ++++---- Src/mmr_can_receive.c | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index f7a1743..4bf9698 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -79,7 +79,7 @@ MmrCanHeader MMR_CAN_HeaderFromBits(uint32_t bits); * Tells wether the given header represents an SCS. */ bool MMR_CAN_IsHeaderScs(MmrCanHeader header); -bool MMR_CAN_IsMultiFrame(MmrCanHeader *header); -bool MMR_CAN_IsMultiFrameEnd(MmrCanHeader *header); +bool MMR_CAN_IsMultiFrame(MmrCanHeader header); +bool MMR_CAN_IsMultiFrameEnd(MmrCanHeader header); #endif /* INC_MMR_CAN_HEADER_H_ */ diff --git a/Src/mmr_can_header.c b/Src/mmr_can_header.c index 760f800..bf05a3e 100644 --- a/Src/mmr_can_header.c +++ b/Src/mmr_can_header.c @@ -26,10 +26,10 @@ bool MMR_CAN_IsHeaderScs(MmrCanHeader header) { return header.messageType == MMR_CAN_MESSAGE_TYPE_SCS; } -bool MMR_CAN_IsMultiFrame(MmrCanHeader *header) { - return header->messageType == MMR_CAN_MESSAGE_TYPE_MULTI_FRAME; +bool MMR_CAN_IsMultiFrame(MmrCanHeader header) { + return header.messageType == MMR_CAN_MESSAGE_TYPE_MULTI_FRAME; } -bool MMR_CAN_IsMultiFrameEnd(MmrCanHeader *header) { - return header->messageType == MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END; +bool MMR_CAN_IsMultiFrameEnd(MmrCanHeader header) { + return header.messageType == MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END; } diff --git a/Src/mmr_can_receive.c b/Src/mmr_can_receive.c index 7f774c8..c38f85c 100644 --- a/Src/mmr_can_receive.c +++ b/Src/mmr_can_receive.c @@ -41,7 +41,7 @@ HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result) { } result->header = rp.headers.mmr; - if (MMR_CAN_IsMultiFrame(&rp.headers.mmr)) { + if (MMR_CAN_IsMultiFrame(rp.headers.mmr)) { status |= receiveAll(&rp); } @@ -57,7 +57,7 @@ static HalStatus receiveAll(ReceptionParams *rp) { status |= receiveOne(rp); } while ( - headerIsMultiFrame(&rp->headers.mmr, targetId) && status == HAL_OK + headerIsMultiFrame(rp->headers.mmr, targetId) && status == HAL_OK ); return status; @@ -77,9 +77,9 @@ static HalStatus receiveOne(ReceptionParams *rp) { } -static always_inline bool headerIsMultiFrame(MmrCanHeader *header, CanId targetId) { +static always_inline bool headerIsMultiFrame(MmrCanHeader header, CanId targetId) { return MMR_CAN_IsMultiFrame(header) && !MMR_CAN_IsMultiFrameEnd(header) && - header->senderId == targetId; + header.senderId == targetId; } -- 2.52.0 From 7dc7835d48457df265c1a9463f43c27ae45b0d55 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 18:55:00 +0100 Subject: [PATCH 22/28] Remove mailbox --- Inc/mmr_can.h | 4 ---- Src/mmr_can_scs_manager.c | 5 +---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index cd9cbec..540271a 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -91,15 +91,12 @@ typedef struct { * } Point; * * HalStatus send(Point point) { - * static CanMailbox mailbox = 0; - * * MmrCanPacket packet = { * .header = { * .priority = MMR_CAN_MESSAGE_PRIORITY_NORMAL, * .messageId = MMR_CAN_EXAMPLES_POINT, * .senderId = 0xXXX, * }, - * .mailbox = &mailbox, * .data = (uint8_t*)&point, * .length = sizeof(point), * }; @@ -118,7 +115,6 @@ typedef struct { */ typedef struct { MmrCanHeader header; - CanMailbox *mailbox; uint8_t *data; uint8_t length; } MmrCanPacket; diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index fd56bd5..f577643 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -62,8 +62,7 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { static int counter = 0; MmrCanScsEntry *entry = &__scsEntries[counter]; - counter++; - counter %= MMR_CAN_SCS_ENTRIES_COUNT; + ++counter %= MMR_CAN_SCS_ENTRIES_COUNT; if (MMR_CAN_HeaderToBits(entry->header) == 0) { return HAL_OK; @@ -81,10 +80,8 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { - static CanMailbox scsMailbox = 0; MmrCanPacket packet = { .header = header, - .mailbox = &scsMailbox, .length = 0, }; -- 2.52.0 From 6ba13f7737fc3a3ae1c3f09708b1033b6047a811 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 18:55:59 +0100 Subject: [PATCH 23/28] Remove useless comment --- Inc/mmr_can.h | 4 ---- Src/mmr_can.c | 6 ------ 2 files changed, 10 deletions(-) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index 540271a..b02a940 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -192,10 +192,6 @@ HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan); /** * @brief * Configures the filters. - * - * @param hcan The interface to use. - * @param settings The settings to use when configuring the filters. - * @return HalStatus The result of the operation. */ HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings); diff --git a/Src/mmr_can.c b/Src/mmr_can.c index e9b1991..f5ae36a 100644 --- a/Src/mmr_can.c +++ b/Src/mmr_can.c @@ -10,12 +10,6 @@ void MMR_CAN_SetTickProvider(MmrCanTickProvider tickProvider) { } -/** - * @brief - * Initializes the filter using the values - * from MMR_CAN_GetDefaultFilterSettings, and then - * starts the CAN - */ HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan) { return MMR_CAN_FilterConfigDefault(hcan) | -- 2.52.0 From 588f8f139675c9c2e43eaa02f989e50fcfa7ba22 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 18:56:46 +0100 Subject: [PATCH 24/28] Add newline --- Src/mmr_can_message_id.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/mmr_can_message_id.c b/Src/mmr_can_message_id.c index 82c0cc7..eeb4c0f 100644 --- a/Src/mmr_can_message_id.c +++ b/Src/mmr_can_message_id.c @@ -1,6 +1,7 @@ #include #include "mmr_can_message_id.h" + bool MMR_CAN_IsMessageIdOfType( MmrCanMessageId msgId, MmrCanMessageIdType type -- 2.52.0 From 38be08630751319bb3efaaa96966a2d7928f6b95 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 18:59:57 +0100 Subject: [PATCH 25/28] Fix compile errors --- Src/mmr_can_receive.c | 4 ++-- Src/mmr_can_scs_manager.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Src/mmr_can_receive.c b/Src/mmr_can_receive.c index c38f85c..a3639ff 100644 --- a/Src/mmr_can_receive.c +++ b/Src/mmr_can_receive.c @@ -17,7 +17,7 @@ typedef struct { static HalStatus receiveOne(ReceptionParams *rp); static HalStatus receiveAll(ReceptionParams *rp); -static bool headerIsMultiFrame(MmrCanHeader *header, CanId targetId); +static bool headerIsMultiFrame(MmrCanHeader header, CanId targetId); /** @@ -77,7 +77,7 @@ static HalStatus receiveOne(ReceptionParams *rp) { } -static always_inline bool headerIsMultiFrame(MmrCanHeader header, CanId targetId) { +static bool headerIsMultiFrame(MmrCanHeader header, CanId targetId) { return MMR_CAN_IsMultiFrame(header) && !MMR_CAN_IsMultiFrameEnd(header) && diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index f577643..db3218c 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -61,8 +61,8 @@ HalStatus MMR_CAN_SendScs( HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { static int counter = 0; - MmrCanScsEntry *entry = &__scsEntries[counter]; - ++counter %= MMR_CAN_SCS_ENTRIES_COUNT; + MmrCanScsEntry *entry = &__scsEntries[counter++]; + counter %= MMR_CAN_SCS_ENTRIES_COUNT; if (MMR_CAN_HeaderToBits(entry->header) == 0) { return HAL_OK; -- 2.52.0 From 5026bc515c0e4275d2fe99cbb559d4ab4c3cb683 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 19:18:28 +0100 Subject: [PATCH 26/28] Separate scs entries from manager --- Inc/mmr_can_scs_manager.h | 6 ++++ Src/mmr_can_scs_entries.c | 57 ++++++++++++++++++++++++++++++ Src/mmr_can_scs_manager.c | 73 ++++++--------------------------------- 3 files changed, 74 insertions(+), 62 deletions(-) create mode 100644 Src/mmr_can_scs_entries.c diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index 08a1b32..6a2bcad 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -146,4 +146,10 @@ HalStatus MMR_CAN_SendScs( CanId senderId ); + +MmrCanScsEntry* MMR_CAN_GetNextScsEntry(); +MmrCanScsEntry* MMR_CAN_PutScsEntry(MmrCanHeader header); +MmrCanScsEntry* MMR_CAN_ClearScsEntry(MmrCanHeader header); +MmrCanScsEntry* MMR_CAN_FindScsEntry(MmrCanHeader header); + #endif // !INC_MMR_CAN_SCS_MANAGER_H_ diff --git a/Src/mmr_can_scs_entries.c b/Src/mmr_can_scs_entries.c new file mode 100644 index 0000000..037cd75 --- /dev/null +++ b/Src/mmr_can_scs_entries.c @@ -0,0 +1,57 @@ +#include "mmr_can_scs_manager.h" + +static MmrCanScsEntry __scsEntries[MMR_CAN_SCS_ENTRIES_COUNT]; + + +MmrCanScsEntry* MMR_CAN_GetNextScsEntry() { + static int counter = 0; + + MmrCanScsEntry *entry = __scsEntries + counter; + counter++; + counter %= MMR_CAN_SCS_ENTRIES_COUNT; + + return entry; +} + + +MmrCanScsEntry* MMR_CAN_PutScsEntry(MmrCanHeader header) { + MmrCanScsEntry *entry = findEntry((MmrCanHeader){}); + if (entry == NULL) { + return NULL; + } + + *entry = (MmrCanScsEntry){ + .header = header, + .counter = getCurrentTime(), + }; + + return entry; +} + + +MmrCanScsEntry* MMR_CAN_ClearScsEntry(MmrCanHeader header) { + MmrCanScsEntry *entry = findEntry(header); + if (entry == NULL) { + return NULL; + } + + *entry = (MmrCanScsEntry){}; + return entry; +} + + +MmrCanScsEntry* MMR_CAN_FindScsEntry(MmrCanHeader header) { + uint32_t target = MMR_CAN_HeaderToBits(header); + uint32_t i = 0; + + for (; i < MMR_CAN_SCS_ENTRIES_COUNT; i++) { + MmrCanScsEntry *entry = __scsEntries + i; + uint32_t curr = MMR_CAN_HeaderToBits(entry->header); + + if (curr == target) { + return entry; + } + } + + return NULL; +} diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index db3218c..7f92e21 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -1,15 +1,8 @@ #include "mmr_can_scs_manager.h" -static MmrCanScsEntry __scsEntries[MMR_CAN_SCS_ENTRIES_COUNT]; - -static void maybeIncrementRTR(MmrCanScsEntry *entry); - -static MmrCanScsEntry* putEntry(MmrCanHeader header); -static MmrCanScsEntry* clearEntry(MmrCanHeader header); -static MmrCanScsEntry* findEntry(MmrCanHeader header); - +static void maybeIncrementRtr(MmrCanScsEntry *entry); static TimerRange getCurrentTime(); -HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); +static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry); @@ -19,12 +12,12 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) { } header.messageType = MMR_CAN_MESSAGE_TYPE_SCS; - MmrCanScsEntry *entry = findEntry(header); + MmrCanScsEntry *entry = MMR_CAN_FindScsEntry(header); if (entry == NULL) { return false; } - clearEntry(header); + MMR_CAN_ClearScsEntry(header); return true; } @@ -50,7 +43,7 @@ HalStatus MMR_CAN_SendScs( .messageType = MMR_CAN_MESSAGE_TYPE_SCS, }; - if (putEntry(header) == NULL) { + if (MMR_CAN_PutScsEntry(header) == NULL) { return HAL_ERROR; } @@ -59,10 +52,7 @@ HalStatus MMR_CAN_SendScs( HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { - static int counter = 0; - - MmrCanScsEntry *entry = &__scsEntries[counter++]; - counter %= MMR_CAN_SCS_ENTRIES_COUNT; + MmrCanScsEntry *entry = MMR_CAN_GetNextScsEntry(); if (MMR_CAN_HeaderToBits(entry->header) == 0) { return HAL_OK; @@ -79,7 +69,7 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { } -HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { +static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { MmrCanPacket packet = { .header = header, .length = 0, @@ -89,8 +79,8 @@ HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { } -MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { - maybeIncrementRTR(entry); +static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { + maybeIncrementRtr(entry); return entry->rtr == 1 ? MMR_CAN_SCS_CHECK_RTR : entry->rtr > 1 ? MMR_CAN_SCS_CHECK_ERROR : @@ -98,12 +88,12 @@ MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { } -TimerRange getCurrentTime() { +static TimerRange getCurrentTime() { return __mmr_can_tickProvider(); } -void maybeIncrementRTR(MmrCanScsEntry *entry) { +static void maybeIncrementRtr(MmrCanScsEntry *entry) { TimerRange now = getCurrentTime(); TimerRange delay = now - entry->counter; @@ -111,44 +101,3 @@ void maybeIncrementRTR(MmrCanScsEntry *entry) { entry->rtr++; } } - - -MmrCanScsEntry* putEntry(MmrCanHeader header) { - MmrCanScsEntry *entry = findEntry((MmrCanHeader){}); - if (entry == NULL) { - return NULL; - } - - *entry = (MmrCanScsEntry){ - .header = header, - .counter = getCurrentTime(), - }; - - return entry; -} - -MmrCanScsEntry* clearEntry(MmrCanHeader header) { - MmrCanScsEntry *entry = findEntry(header); - if (entry == NULL) { - return NULL; - } - - *entry = (MmrCanScsEntry){}; - return entry; -} - -MmrCanScsEntry* findEntry(MmrCanHeader header) { - uint32_t target = MMR_CAN_HeaderToBits(header); - uint32_t i = 0; - - for (; i < MMR_CAN_SCS_ENTRIES_COUNT; i++) { - MmrCanScsEntry *entry = __scsEntries + i; - uint32_t curr = MMR_CAN_HeaderToBits(entry->header); - - if (curr == target) { - return entry; - } - } - - return NULL; -} -- 2.52.0 From 62e0e3ae63312b314cde994d19833627e88e6d38 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 19:25:09 +0100 Subject: [PATCH 27/28] Refactor --- Inc/mmr_can.h | 9 ++++++++- Inc/{mmr_can_scs_manager.h => mmr_can_scs.h} | 0 Src/mmr_can.c | 5 +++++ Src/mmr_can_scs_entries.c | 13 ++++++++----- Src/mmr_can_scs_manager.c | 13 +++---------- 5 files changed, 24 insertions(+), 16 deletions(-) rename Inc/{mmr_can_scs_manager.h => mmr_can_scs.h} (100%) diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index b02a940..945d31d 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -14,7 +14,7 @@ #include "mmr_can_types.h" #include "mmr_can_optimize.h" #include "mmr_can_binary_literals.h" -#include "mmr_can_scs_manager.h" +#include "mmr_can_scs.h" #ifndef MMR_CAN_RX_FIFO #define MMR_CAN_RX_FIFO CAN_RX_FIFO0 @@ -182,6 +182,13 @@ extern MmrCanTickProvider __mmr_can_tickProvider; */ void MMR_CAN_SetTickProvider(MmrCanTickProvider tickProvider); +/** + * @brief + * Returns the current tick by calling the + * configured tick provider. + */ +uint32_t MMR_CAN_GetCurrentTick(); + /** * @brief * Configures the filters with the default configuration diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs.h similarity index 100% rename from Inc/mmr_can_scs_manager.h rename to Inc/mmr_can_scs.h diff --git a/Src/mmr_can.c b/Src/mmr_can.c index f5ae36a..4d9686e 100644 --- a/Src/mmr_can.c +++ b/Src/mmr_can.c @@ -10,6 +10,11 @@ void MMR_CAN_SetTickProvider(MmrCanTickProvider tickProvider) { } +uint32_t MMR_CAN_GetCurrentTick() { + return __mmr_can_tickProvider(); +} + + HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan) { return MMR_CAN_FilterConfigDefault(hcan) | diff --git a/Src/mmr_can_scs_entries.c b/Src/mmr_can_scs_entries.c index 037cd75..f3c9a86 100644 --- a/Src/mmr_can_scs_entries.c +++ b/Src/mmr_can_scs_entries.c @@ -1,4 +1,7 @@ -#include "mmr_can_scs_manager.h" +#include "mmr_can_scs.h" + +#define EMPTY_HEADER ((MmrCanHeader){}) +#define EMPTY_ENTRY ((MmrCanScsEntry){}) static MmrCanScsEntry __scsEntries[MMR_CAN_SCS_ENTRIES_COUNT]; @@ -15,14 +18,14 @@ MmrCanScsEntry* MMR_CAN_GetNextScsEntry() { MmrCanScsEntry* MMR_CAN_PutScsEntry(MmrCanHeader header) { - MmrCanScsEntry *entry = findEntry((MmrCanHeader){}); + MmrCanScsEntry *entry = MMR_CAN_FindScsEntry(EMPTY_HEADER); if (entry == NULL) { return NULL; } *entry = (MmrCanScsEntry){ .header = header, - .counter = getCurrentTime(), + .counter = MMR_CAN_GetCurrentTick(), }; return entry; @@ -30,12 +33,12 @@ MmrCanScsEntry* MMR_CAN_PutScsEntry(MmrCanHeader header) { MmrCanScsEntry* MMR_CAN_ClearScsEntry(MmrCanHeader header) { - MmrCanScsEntry *entry = findEntry(header); + MmrCanScsEntry *entry = MMR_CAN_FindScsEntry(header); if (entry == NULL) { return NULL; } - *entry = (MmrCanScsEntry){}; + *entry = EMPTY_ENTRY; return entry; } diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 7f92e21..30cea5d 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -1,7 +1,6 @@ -#include "mmr_can_scs_manager.h" +#include "mmr_can_scs.h" static void maybeIncrementRtr(MmrCanScsEntry *entry); -static TimerRange getCurrentTime(); static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry); @@ -64,7 +63,7 @@ HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { default: break; } - entry->counter = getCurrentTime(); + entry->counter = MMR_CAN_GetCurrentTick(); return sendScs(hcan, entry->header); } @@ -87,14 +86,8 @@ static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { MMR_CAN_SCS_CHECK_OK; } - -static TimerRange getCurrentTime() { - return __mmr_can_tickProvider(); -} - - static void maybeIncrementRtr(MmrCanScsEntry *entry) { - TimerRange now = getCurrentTime(); + TimerRange now = MMR_CAN_GetCurrentTick(); TimerRange delay = now - entry->counter; if (delay >= MMR_CAN_MAX_TIMEOUT) { -- 2.52.0 From 1bd591c1ac8280f56e18d9d0691d9b41a06463cc Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 23 Feb 2022 19:26:59 +0100 Subject: [PATCH 28/28] Fix include guards --- Inc/mmr_can_scs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Inc/mmr_can_scs.h b/Inc/mmr_can_scs.h index 6a2bcad..778ca88 100644 --- a/Inc/mmr_can_scs.h +++ b/Inc/mmr_can_scs.h @@ -5,8 +5,8 @@ * such as transmission, retransmission and timeout error. */ -#ifndef INC_MMR_CAN_SCS_MANAGER_H_ -#define INC_MMR_CAN_SCS_MANAGER_H_ +#ifndef INC_MMR_CAN_SCS_H_ +#define INC_MMR_CAN_SCS_H_ #include "mmr_can.h" @@ -152,4 +152,4 @@ MmrCanScsEntry* MMR_CAN_PutScsEntry(MmrCanHeader header); MmrCanScsEntry* MMR_CAN_ClearScsEntry(MmrCanHeader header); MmrCanScsEntry* MMR_CAN_FindScsEntry(MmrCanHeader header); -#endif // !INC_MMR_CAN_SCS_MANAGER_H_ +#endif // !INC_MMR_CAN_SCS_H_ -- 2.52.0