#ifndef CAN_RECV_LIB_H_
#define CAN_RECV_LIB_H_

typedef struct {
    uint32_t ID;                                        //ID;
    uint16_t Peroid;                                    //报文周期，单位ms;
    uint16_t TimeoutMax;                                //最大超时时间，单位ms;
    uint16_t TimeoutLv[3];                              //分级超时时间，填0不启用，最大值不超过TimeoutMax，例TimeoutLv[0] = 100，在该报文100ms没收到时会调用FrameTimeoutFunc(1);
    uint8_t RecoverContinueCnts;                        //报文超时后连续收到RecoverContinueCnts条判定报文恢复，报文周期不超过Peroid*1.2，填0或1为收到1条报文即判定报文恢复;
    void (*FrameAnalysisFunc)(uint8_t *data);          //收到报文时会调用该回调函数;
    void (*FrameTimeoutFunc)(uint8_t Lv);              //TimeoutMax超时时会调用FrameTimeoutFunc(0),TimeoutLv[0]超时时调用FrameTimeoutFunc(1),TimeoutLv[1]超时时调用FrameTimeoutFunc(2),TimeoutLv[2]超时时调用FrameTimeoutFunc(3);
    uint8_t (*FrameGetCheckSum)(uint8_t *data);           //接收报文时调用该函数，返回1表示checksum正确，0表示错误，如果错误，则不会调用FrameAnalysisFunc函数
}INIT_CAN_FRAME;

typedef struct {
    uint32_t ID;        
    uint8_t Data[64];
    uint8_t DataLen;
    uint8_t FrameValid;
}RECV_CAN_FRAME;

typedef struct {
    uint32_t ID;        
    uint8_t Data[256];
    uint8_t DataLen;
}Multiple_CAN_FRAME;

typedef struct {
    uint32_t ID;        
    uint8_t Data[64];	
    uint8_t DataLen;	
}Core_CAN_FRAME;

typedef enum {
    CAN_FRAME_STATE_NORMAL,
    CAN_FRAME_STATE_TIME_OUT,
}CAN_FRAME_STATE;

extern uint8_t *GetCanRecvModuleVersion(void);                  //获取版本号
extern void InitCanFrame(uint8_t n, INIT_CAN_FRAME *data);      //初始化Can接收报文参数
extern void RecvCanFrame(RECV_CAN_FRAME *data);                 //Can接收中断中调用
extern uint8_t GetCanFrameState(uint32_t ID);                   //获取CAN当前状态
extern uint16_t GetCanFrameAliveTime(uint32_t ID);              //获取CAN剩余时间
extern void CanRecvLibTimerCall(uint32_t n);                     //定时调用，例1ms调用一次，参数填1
extern void AnalysisCanData(void);                             //定时调用
extern void ResetAllCanFrameTime(void);                        //复位所有Can报文的超时时间，用于首次上电或Busoff恢复后调用
extern uint8_t GetAllCanFrameTimeout(void);                     //获取所有报文是否全部超时

extern uint8_t GetCheckSumRightCnts(uint32_t ID);               //获取checksum正确计数器，最大5
extern uint8_t GetCheckSumErrorCnts(uint32_t ID);               //获取checksum错误计数器，最大10


#endif 
