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