#ifndef CAN_INF_H_
#define CAN_INF_H_
#include "platmacro.h"

#define CAN_INF_MAX_FILETER_NUM  128

typedef enum{
    CAN_OBJ_ID_1,
    CAN_OBJ_ID_2,
    CAN_OBJ_ID_3,
    CAN_OBJ_ID_MAX,
}CAN_OBJ_ID_ENUM;

// can状态枚举
typedef enum{
    CAN_STATE_DOWN = 0,
    CAN_STATE_UP,
    CAN_STATE_UNKNOWN,
    CAN_STATE_MAX,
}CAN_STATE_ENUM;

typedef struct
{
    uint32_t canObjId;
    uint32_t canBitRate;
}CAN_INF_CFG_STRU;


/**
 * @brief       can初始化
 * @param[in]   CAN_INF_CFG_STRU *pCanInitCfg can初始化配置
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_init(CAN_INF_CFG_STRU *pCanInitCfg);

/**
 * @brief       设置can滤波
 * @param[in]   CAN_INF_FILTER_STRU *pCanFilter 过滤配置
 * @param[in]   uint32_t filterNum  滤波配置数量
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_canFilterConfig(uint32_t canObjId, CanFilter *pCanFilter, uint32_t filterNum);

/**
 * @brief       发送CAN数据
 * @param[in]   uint32_t canObjId
 * @param[in]   CanMsg *txMsg can数据
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_sendMsg(uint32_t canObjId, CanMsg *txMsg);

/**
 * @brief       接收CAN数据
 * @param[in]   uint32_t canObjId
 * @param[in]   CanMsg *rxMsg can数据
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_recvMsg(uint32_t canObjId, CanMsg *rxMsg);

/**
 * @brief       获取can状态(检测bus off)
 * @param[in]   uint32_t canObjId   canID
 * @param[out]  int *state          状态
 * @return      int32_t
 * @retval      1: up; 0: down; -1: unknown
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2024-02-01           QZY        创建初始版本          \n
*/
int32_t canInf_getState(uint32_t canObjId, int *state);

/**
 * @brief       重启can
 * @param[in]   uint32_t canObjId
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2024-02-01           QZY        创建初始版本          \n
*/
int32_t canInf_reOpen(uint32_t canObjId);

#endif