diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index b1a0a79..d248046 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -165,6 +165,7 @@ CanFilterMask MMR_CAN_AlignStandardMask(CanFilterMask baseMask); MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings(); HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet); +HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet); HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result); #endif /* INC_MMR_CAN_H_ */ diff --git a/Inc/mmr_can_header.h b/Inc/mmr_can_header.h index 79d5d9f..c5bee49 100644 --- a/Inc/mmr_can_header.h +++ b/Inc/mmr_can_header.h @@ -18,6 +18,7 @@ * Constants with lower values have an higher priority. */ typedef enum { + MMR_CAN_MESSAGE_TYPE_SCS = B_(0000), MMR_CAN_MESSAGE_TYPE_ACK = B_(0001), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME = B_(0010), MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END = B_(0011), @@ -62,6 +63,12 @@ uint32_t *MMR_CAN_HeaderToBits(MmrCanHeader *header); */ MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits); + +/** + * @brief + * Tells wether the given header represents an SCS. + */ +bool MMR_CAN_IsHeaderScs(MmrCanHeader header); bool MMR_CAN_IsMultiFrame(MmrCanHeader *header); bool MMR_CAN_IsMultiFrameEnd(MmrCanHeader *header); diff --git a/Inc/mmr_can_message_id.h b/Inc/mmr_can_message_id.h index d917f8d..0f332f1 100644 --- a/Inc/mmr_can_message_id.h +++ b/Inc/mmr_can_message_id.h @@ -47,13 +47,6 @@ uint8_t MMR_CAN_GetMessageIdSubtype(MmrCanMessageId msgId); */ bool MMR_CAN_IsMessageIdOfType(MmrCanMessageId msgId, MmrCanMessageIdType type); -/** - * @brief - * Tells wether the given message id is - * represents an SCS. - */ -bool MMR_CAN_IsMessageIdSCS(MmrCanMessageId msgId); - enum MmrCanMessageId { // SCS diff --git a/Inc/mmr_can_scs_manager.h b/Inc/mmr_can_scs_manager.h index 3e224cc..ee77d17 100644 --- a/Inc/mmr_can_scs_manager.h +++ b/Inc/mmr_can_scs_manager.h @@ -50,6 +50,12 @@ typedef enum { bool MMR_CAN_MaybeHandleAck(MmrCanHeader header); HalStatus MMR_CAN_HandleNextScs(CanHandle *hcan); + +HalStatus MMR_CAN_SendAck( + CanHandle *hcan, + MmrCanHeader originalHeader +); + HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, diff --git a/Src/mmr_can_header.c b/Src/mmr_can_header.c index 8ceb707..7298c45 100644 --- a/Src/mmr_can_header.c +++ b/Src/mmr_can_header.c @@ -11,6 +11,10 @@ MmrCanHeader *MMR_CAN_HeaderFromBits(uint32_t *bits) { } +bool MMR_CAN_IsHeaderScs(MmrCanHeader header) { + return header.messageType == MMR_CAN_MESSAGE_TYPE_SCS; +} + bool MMR_CAN_IsMultiFrame(MmrCanHeader *header) { return header->messageType == MMR_CAN_MESSAGE_TYPE_MULTI_FRAME; } diff --git a/Src/mmr_can_message_id.c b/Src/mmr_can_message_id.c index 61f1162..82c0cc7 100644 --- a/Src/mmr_can_message_id.c +++ b/Src/mmr_can_message_id.c @@ -1,12 +1,6 @@ #include #include "mmr_can_message_id.h" - -bool MMR_CAN_IsMessageIdSCS(MmrCanMessageId msgId) { - return MMR_CAN_IsMessageIdOfType(msgId, MMR_CAN_MESSAGE_ID_TYPE_SCS); -} - - bool MMR_CAN_IsMessageIdOfType( MmrCanMessageId msgId, MmrCanMessageIdType type diff --git a/Src/mmr_can_scs_manager.c b/Src/mmr_can_scs_manager.c index f66df49..3f8c9bb 100644 --- a/Src/mmr_can_scs_manager.c +++ b/Src/mmr_can_scs_manager.c @@ -18,7 +18,7 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) { return false; } - header.messageType = MMR_CAN_MESSAGE_TYPE_NORMAL; + header.messageType = MMR_CAN_MESSAGE_TYPE_SCS; MmrCanScsEntry *entry = findEntry(header); if (entry == NULL) { return false; @@ -29,6 +29,15 @@ bool MMR_CAN_MaybeHandleAck(MmrCanHeader header) { } +HalStatus MMR_CAN_SendAck( + CanHandle *hcan, + MmrCanHeader originalHeader +) { + originalHeader.messageType = MMR_CAN_MESSAGE_TYPE_ACK; + return sendScs(hcan, originalHeader); +} + + HalStatus MMR_CAN_SendScs( CanHandle *hcan, MmrCanMessageId scsId, @@ -38,9 +47,13 @@ HalStatus MMR_CAN_SendScs( .senderId = senderId, .messageId = scsId, .priority = MMR_CAN_MESSAGE_PRIORITY_HIGH, + .messageType = MMR_CAN_MESSAGE_TYPE_SCS, }; - putEntry(header); + if (putEntry(header) == NULL) { + return HAL_ERROR; + } + return sendScs(hcan, header); } @@ -68,7 +81,7 @@ HalStatus sendScs(CanHandle *hcan, MmrCanHeader header) { .length = 0, }; - return MMR_CAN_Send(hcan, packet); + return MMR_CAN_SendNoTamper(hcan, packet); } diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index 2ff5374..d3ab377 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -36,14 +36,32 @@ HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet) { .TransmitGlobalTime = DISABLE, }, }; - syncHeaders(&tp); + syncHeaders(&tp); return packet.length <= MMR_CAN_MAX_DATA_LENGTH ? sendNormal(&tp) : sendMulti(&tp); } +HalStatus MMR_CAN_SendNoTamper(CanHandle *hcan, MmrCanPacket packet) { + TransmissionParams tp = { + .handle = hcan, + .packet = &packet, + .headers.mmr = packet.header, + .headers.tx = { + .IDE = CAN_ID_EXT, + .RTR = CAN_RTR_DATA, + .DLC = packet.length, + .TransmitGlobalTime = DISABLE, + }, + }; + + syncHeaders(&tp); + return send(&tp); +} + + static HalStatus sendNormal(TransmissionParams *tp) { setMessageType(tp, MMR_CAN_MESSAGE_TYPE_NORMAL); return send(tp);