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
);
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_
+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"
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;
}