Fix header bit translation

This commit is contained in:
Stefano Calabretti
2022-02-19 12:59:05 +01:00
parent e26751d5d4
commit 7190dbcdf9
5 changed files with 37 additions and 16 deletions
+2 -2
View File
@@ -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);
/**
+15 -4
View File
@@ -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,
};
}
+7 -3
View File
@@ -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;
}
+8 -4
View File
@@ -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;
}
}
+5 -3
View File
@@ -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);
}