Separate scs entries from manager

This commit is contained in:
Stefano Calabretti
2022-02-23 19:18:28 +01:00
parent 38be086307
commit 5026bc515c
3 changed files with 74 additions and 62 deletions
+6
View File
@@ -146,4 +146,10 @@ HalStatus MMR_CAN_SendScs(
CanId senderId 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_ #endif // !INC_MMR_CAN_SCS_MANAGER_H_
+57
View File
@@ -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;
}
+11 -62
View File
@@ -1,15 +1,8 @@
#include "mmr_can_scs_manager.h" #include "mmr_can_scs_manager.h"
static MmrCanScsEntry __scsEntries[MMR_CAN_SCS_ENTRIES_COUNT]; static void maybeIncrementRtr(MmrCanScsEntry *entry);
static void maybeIncrementRTR(MmrCanScsEntry *entry);
static MmrCanScsEntry* putEntry(MmrCanHeader header);
static MmrCanScsEntry* clearEntry(MmrCanHeader header);
static MmrCanScsEntry* findEntry(MmrCanHeader header);
static TimerRange getCurrentTime(); static TimerRange getCurrentTime();
HalStatus sendScs(CanHandle *hcan, MmrCanHeader header); static HalStatus sendScs(CanHandle *hcan, MmrCanHeader header);
static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry); static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry);
@@ -19,12 +12,12 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) {
} }
header.messageType = MMR_CAN_MESSAGE_TYPE_SCS; header.messageType = MMR_CAN_MESSAGE_TYPE_SCS;
MmrCanScsEntry *entry = findEntry(header); MmrCanScsEntry *entry = MMR_CAN_FindScsEntry(header);
if (entry == NULL) { if (entry == NULL) {
return false; return false;
} }
clearEntry(header); MMR_CAN_ClearScsEntry(header);
return true; return true;
} }
@@ -50,7 +43,7 @@ HalStatus MMR_CAN_SendScs(
.messageType = MMR_CAN_MESSAGE_TYPE_SCS, .messageType = MMR_CAN_MESSAGE_TYPE_SCS,
}; };
if (putEntry(header) == NULL) { if (MMR_CAN_PutScsEntry(header) == NULL) {
return HAL_ERROR; return HAL_ERROR;
} }
@@ -59,10 +52,7 @@ HalStatus MMR_CAN_SendScs(
HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) { HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan) {
static int counter = 0; MmrCanScsEntry *entry = MMR_CAN_GetNextScsEntry();
MmrCanScsEntry *entry = &__scsEntries[counter++];
counter %= MMR_CAN_SCS_ENTRIES_COUNT;
if (MMR_CAN_HeaderToBits(entry->header) == 0) { if (MMR_CAN_HeaderToBits(entry->header) == 0) {
return HAL_OK; 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 = { MmrCanPacket packet = {
.header = header, .header = header,
.length = 0, .length = 0,
@@ -89,8 +79,8 @@ HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) {
} }
MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) { static MmrCanScsCheckResult checkScs(MmrCanScsEntry *entry) {
maybeIncrementRTR(entry); maybeIncrementRtr(entry);
return return
entry->rtr == 1 ? MMR_CAN_SCS_CHECK_RTR : entry->rtr == 1 ? MMR_CAN_SCS_CHECK_RTR :
entry->rtr > 1 ? MMR_CAN_SCS_CHECK_ERROR : 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(); return __mmr_can_tickProvider();
} }
void maybeIncrementRTR(MmrCanScsEntry *entry) { static void maybeIncrementRtr(MmrCanScsEntry *entry) {
TimerRange now = getCurrentTime(); TimerRange now = getCurrentTime();
TimerRange delay = now - entry->counter; TimerRange delay = now - entry->counter;
@@ -111,44 +101,3 @@ void maybeIncrementRTR(MmrCanScsEntry *entry) {
entry->rtr++; 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;
}