#ifndef IVEC_ECU_CAN_H_ #define IVEC_ECU_CAN_H_ #include "../Core/Include/ivec_mcal_mcan.h" #include "../ivec_ECU/ivec_ecu_common/inc/ivec_ecu_common.h" #include "stdint.h" #include #include #include #define ecuMAX_FILTERS_u8 mcalMAX_FILTERS_u8 // Macro Definitions #define IVEC_ECU_CAN_QUEUE(name, buff) \ volatile IVEC_ECU_CANQueue_s name = { \ .u16Front = 0, \ .u16Rear = 0, \ .u16Size = (sizeof(buff) / sizeof(buff[0])), \ .u8ElementSize = sizeof(buff[0]), \ .pxBuffer = buff, \ } #define IVEC_ECU_CAN_FLUSH(name) do { \ name.front = 0; \ name.rear = 0; \ memset(name.buffer, 0x00, name.size); \ } while (0) #define IVEC_ECU_CAN_ENQUEUE(queue, data) do { \ memcpy(&queue.pxBuffer[queue.u16Front++], &data, sizeof(data)); \ queue.u16Front %= queue.u16Size; \ } while (0) #define IVEC_ECU_CAN_DEQUEUE(queue, data) do { \ memcpy(&data, &queue.pxBuffer[queue.u16Rear++], sizeof(data)); \ queue.u16Rear %= queue.u16Size; \ } while (0) #define IVEC_ECU_CAN_IS_FULL(queue) ((queue.u16Front - queue.u16Rear) == (queue.u16Size - 1) || \ (queue.u16Front - queue.u16Rear) == -1) #define IVEC_ECU_CAN_IS_EMPTY(queue) (queue.u16Front == queue.u16Rear) /* Private Variable */ typedef struct { uint32_t u32UlId; uint8_t u8Data[8]; uint8_t u8Length; uint8_t u8Resv[3]; } IVEC_ECU_CANBuff_s; typedef struct { uint16_t u16Front; uint16_t u16Rear; uint16_t u16Size; uint8_t u8ElementSize; IVEC_ECU_CANBuff_s *pxBuffer; } IVEC_ECU_CANQueue_s; typedef enum { /* data */ IVEC_ECU_CAN_SPEED_125 = 125, IVEC_ECU_CAN_SPEED_150 = 150, IVEC_ECU_CAN_SPEED_250 = 250, IVEC_ECU_CAN_SPEED_500 = 500, IVEC_ECU_CAN_SPEED_1000 = 1000, }IVEC_EcuCANSpeed_e; typedef struct { IVEC_McalCanHandle_s __xCanHandle; MCAN_Regs *pMCAN; uint8_t __u8Init; IVEC_EcuCANSpeed_e u16Speed; int32_t i32MaskCount; int32_t i32FilterCount; uint32_t u32MaskValues[ecuMAX_FILTERS_u8]; uint32_t u32FilterValues[ecuMAX_FILTERS_u8]; }IVEC_EcuCANHandle_s; // Function Prototypes void vMCU_FDCANRxFifoCallback(uint32_t u32Identifier, uint8_t *pu8data, uint16_t u16DataLength); uint8_t u8MCAL_StoreMsgFromISRToQueue(uint32_t u32UlId, uint8_t* pu8Data, uint8_t u8Len); IVEC_EcuCommonErr_e xECU_CANInit(IVEC_EcuCANHandle_s *xCANhandle); IVEC_EcuCommonErr_e xECU_CANDeInit(IVEC_EcuCANHandle_s *xCANhandle); IVEC_EcuCommonErr_e xECU_WriteDataOverCAN(IVEC_EcuCANHandle_s *xCanHandle, uint8_t* pu8Buf, uint32_t u32Id, int i32RetCode, uint32_t u32BufNum); IVEC_EcuCommonErr_e xECU_CANGetData(IVEC_EcuCANHandle_s *xCanHandle, IVEC_ECU_CANBuff_s *pxBuff); IVEC_EcuCommonErr_e xECU_CANReInit(IVEC_EcuCANHandle_s *xCANhandle); IVEC_EcuCommonErr_e xECU_CANGetStatus(IVEC_EcuCANHandle_s *xCANhandle); #endif /* IVEC_ECU_CAN_H_ */ //