diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index c5bee49..134e825 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -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); /** diff --git a/Src/mmr_can_header.c b/Src/mmr_can_header.c index 7298c45..b47fc38 100644 --- a/Src/mmr_can_header.c +++ b/Src/mmr_can_header.c @@ -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, + }; } diff --git a/Src/mmr_can_receive.c b/Src/mmr_can_receive.c index 3627f2f..a182662 100644 --- a/Src/mmr_can_receive.c +++ b/Src/mmr_can_receive.c @@ -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; } diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index 3f8c9bb..4370363 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -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; } } diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index d3ab377..f9a8b0f 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -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); }