From d22f9539b353b07002964c49b17cc8d7a0e72152 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Wed, 2 Feb 2022 18:44:06 +0100 Subject: [PATCH 1/2] 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 From f7b5c0315eeba7300b96071cb556c4846cacbeae Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Thu, 3 Feb 2022 18:55:52 +0100 Subject: [PATCH 2/2] 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