This repository has been archived on 2026-02-22. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
can/Inc/mmr_can_header.h
T
2022-02-19 12:59:05 +01:00

76 lines
1.8 KiB
C

#ifndef INC_MMR_CAN_HEADER_H_
#define INC_MMR_CAN_HEADER_H_
#include <stdbool.h>
#include "mmr_can_util.h"
#include "mmr_can_binary_literals.h"
#include "mmr_can_message_id.h"
/**
* @brief
* These values can be appended to the extended-id
* portion of the CAN bus message (that is, the lower 5 bits
* of the standard id)
*
* They are used to check if a message is either standalone, an
* acknowledgement or split into multiple frames
*
* 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),
MMR_CAN_MESSAGE_TYPE_NORMAL = B_(0100),
} MmrCanMessageType;
typedef enum {
MMR_CAN_MESSAGE_PRIORITY_LOW = B_(0010),
MMR_CAN_MESSAGE_PRIORITY_NORMAL = B_(0001),
MMR_CAN_MESSAGE_PRIORITY_HIGH = B_(0000),
} MmrCanMessagePriority;
/**
* @brief
* This struct encodes the values stored inside the
* extended id field of a CAN packet.
*/
typedef struct {
MmrCanMessagePriority priority : 3;
uint16_t messageId : 10;
uint16_t senderId : 10;
uint8_t seqNumber : 3;
MmrCanMessageType messageType : 3;
} MmrCanHeader;
/**
* @brief
* Converts an MmrCanHeader to bits.
* That is, a 32bits integer with the first
* 3 bits set to zero and the remaining 29 containing the
* extended id
*/
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);
/**
* @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);
#endif /* INC_MMR_CAN_HEADER_H_ */