#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 // Macro Definitions #define IVEC_ECU_CAN_QUEUE(name, buff) \ volatile IVEC_ECU_CANQueue_s name = { \ .front = 0, \ .rear = 0, \ .size = (sizeof(buff) / sizeof(buff[0])), \ .element_size = sizeof(buff[0]), \ .buffer = 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.buffer[queue.front++], &data, sizeof(data)); \ queue.front %= queue.size; \ } while (0) #define IVEC_ECU_CAN_DEQUEUE(queue, data) do { \ memcpy(&data, &queue.buffer[queue.rear++], sizeof(data)); \ queue.rear %= queue.size; \ } while (0) #define IVEC_ECU_CAN_IS_FULL(queue) ((queue.front - queue.rear) == (queue.size - 1) || \ (queue.front - queue.rear) == -1) #define IVEC_ECU_CAN_IS_EMPTY(queue) (queue.front == queue.rear) /* Private Variable */ typedef struct { uint32_t ulId; uint8_t ucData[8]; uint8_t ucLength; uint8_t resv[3]; } IVEC_ECU_CANBuff_s; typedef struct { uint16_t front; uint16_t rear; uint16_t size; uint8_t element_size; IVEC_ECU_CANBuff_s *buffer; } IVEC_ECU_CANQueue_s; // Function Prototypes void vMCU_FDCAN_RxFifo_Callback(uint32_t ulIdentifier, uint8_t *pucData, uint16_t usDataLength); uint8_t vMCAL_StoreMsgFromISRToQueue(uint32_t ulId, uint8_t *pucData, uint8_t ucLen); IVEC_EcuCommonErr_e vECU_CAN_Init(MCAN_Regs *pMCAN, IVEC_CanBaud_e eBaud); IVEC_EcuCommonErr_e vECU_CAN_DeInit(MCAN_Regs *pMCAN); IVEC_EcuCommonErr_e vECU_WriteDataOverCAN(uint8_t *pucBuf, uint32_t ulId, int iRetCode, uint32_t ulBufNum); IVEC_EcuCommonErr_e vECU_CAN_GetData(IVEC_ECU_CANBuff_s *pxBuff); IVEC_EcuCommonErr_e vECU_CAN_ReInit(MCAN_Regs *pMCAN, uint16_t usSpeed); IVEC_EcuCommonErr_e vECU_CAN_GetStatus(MCAN_Regs *pMCAN, uint16_t usSpeed); #endif /* IVEC_ECU_CAN_H_ */ //