#ifndef CAN_RECV_LIB_H_
#define CAN_RECV_LIB_H_

typedef struct {
    uint32_t ID;                                        //ID;
    uint16_t Peroid;                                    //闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘缁樺殟闁稿矉濡囩粔鍫曟煙妞嬪骸鍘撮柡浣规崌瀵剟濡堕崱妤婁紦婵炶揪绲界搾鍗�;
    uint16_t TimeoutMax;                                //闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呭摜绱撴担鍝勪户闁荤噥浜獮澶屸偓锝庡亜椤忚埖绻涢幓鎺旂劸闁告挶鍔戦獮蹇涙倻閼恒儲娅㈤柡澶屽仩濞夋洟宕犲锟�;
    uint16_t TimeoutLv[3];                              //闂備浇娉曢崰鏇€€佸⿰鍛厹闂佸灝顑呴鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鏌ㄧ€ｎ偒妲梺鍝勫暙閻栧ジ寮幘璇茬闁硅櫣鍋熺粈澶愭⒑鐠恒劌鏋戦柡瀣煼楠炲繘鏁撻敓锟�0闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤搹鐟板絼闂佹寧绻傜换鎴犫偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘鑸靛仒婵°倕鍠氶弳婊堟煙妞嬪骸鍘撮柡浣规崌瀵剟濡堕崱妤婁紦闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呭摜绱掗幓鎺斿床meoutMax闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘辩摋imeoutLv[0] = 100闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌ら崫鍕偓浠嬵敋濮樿泛绠熼悗锝庡亜椤忓爼姊虹捄銊ユ瀾闁哄顭烽獮蹇涙晸閿燂拷100ms濠电偛鐭夌换婵嬪极閹惧墎鐭撻柛婵勫労閺嗘粓鏌熼悜鑺ユ暠婵＄偛鍊块弻銊╂偄閸涘﹦浼勯梺褰掝棑閸忔﹢寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋旈柛鐐叉ameTimeoutFunc(1);
    uint8_t RecoverContinueCnts;                        //闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呯ǹ銆掑銉ュ姢妞ゆ帗鐓￠獮蹇涙煥鐎ｎ偒妲梻浣芥硶閸犳劙寮告繝姘闁绘垼濮ら弲鎼佹煛閸屾ê鈧牜鈧艾缍婇弻銊╂偄閸涘﹦浼勯梺褰掝棑閸忔﹢寮幘鍓佺煋闁告縿鍎洪弳婊堟煙妞嬪篃绡筩overContinueCnts闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌涘▎妯轰函妞ゆ梹鍔欓獮蹇涙倻閼恒儲娅㈤梺鍝勫€堕崐鏍偓姘秺閺屻劑鎮㈤幆鏉款嚋闂佽鍘归崹钘夘焽婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佺厧鎼崐浠嬵敋濠婂牆绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撹矊eroid*1.2闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘炬嫹0闂備浇娉曢崰鎰板几婵犳艾绠柨鐕傛嫹1婵炴垶鎸诲浠嬪极閹惧墎鐭撻柛婵勫労閺嗘粓鏌熼崙銈嗗1闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤幆鏉款嚋缂佺虎鍙冮弨杈┾偓姘秺閺屻劑鎮㈠畡鏉跨紦闁荤姳娴囬～澶屸偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘瀵哥懝闁靛缂氶崚鎺楁⒒閸碍娅嗛悗姘炬嫹;
    void (*FrameAnalysisFunc)(uint8_t *data);          //闂備浇娉曢崰鎾剁懅缂佺偓婢橀ˇ鎵偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘璇叉闁靛牆妫楅鍫曟煛閸愩劎鍩ｉ柡浣规崌瀵剟濡堕崱妤婁紦闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｆ瀵版挻绻涚仦绋垮⒉闁活煈鍙冮弻銊╂偄閸涘﹦浼勯梺褰掝棑閸忔﹢寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌娅愰柟鍑ゆ嫹;
    void (*FrameTimeoutFunc)(uint8_t Lv);              //TimeoutMax闂備浇娉曢崰鎰板几婵犳艾绠梺鍨儐椤ρ囨煛閸愩劎鍩ｉ柡浣规崌瀵剟濡堕崱妤婁紦闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呭摜绱掓潏鈺傛＊ameTimeoutFunc(0),TimeoutLv[0]闂備浇娉曢崰鎰板几婵犳艾绠梺鍨儐椤ρ囨煛閸愩劎鍩ｉ柡浣规崌瀵剟濡堕崱妤婁紦闂備浇娉曢崰鎰板几婵犳艾绠紒瀣垫磸ameTimeoutFunc(1),TimeoutLv[1]闂備浇娉曢崰鎰板几婵犳艾绠梺鍨儐椤ρ囨煛閸愩劎鍩ｉ柡浣规崌瀵剟濡堕崱妤婁紦闂備浇娉曢崰鎰板几婵犳艾绠紒瀣垫磸ameTimeoutFunc(2),TimeoutLv[2]闂備浇娉曢崰鎰板几婵犳艾绠梺鍨儐椤ρ囨煛閸愩劎鍩ｉ柡浣规崌瀵剟濡堕崱妤婁紦闂備浇娉曢崰鎰板几婵犳艾绠紒瀣垫磸ameTimeoutFunc(3);
    uint8_t (*FrameGetCheckSum)(uint8_t *data);           //闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呭摜绱掓径濠冨暈闁哥偛顭烽獮蹇涙倻閼恒儲娅㈤梺鍝勫€堕崐鏍偓姘秺瀵噣宕奸弴鐔告闂佸搫鍊堕崐鏍偓姘秺閺屻劑鎮㈤搹鐟板絼闁荤姴娲㈤崕宕囦焊閵娾晛绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鏁撻敓锟�1闂備浇娉曢崰鎰板几婵犳艾绠瀣昂娴犳矞hecksum闂備浇娉曢崰鎰板几婵犳艾绠瀣岸閳ь剚锕㈤弻銊╂偄閸涘﹦浼勯梺鐟板殩閹凤拷0闂備浇娉曢崰鎰板几婵犳艾绠瀣昂娴犳盯姊虹捄銊ユ瀾闁哄顭烽獮蹇涙倻閼恒儲娅㈤梺鍝勫€堕崐鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸搫鍊堕崐鏍偓姘秺閹煎綊骞愭惔鈥崇哎闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘鳖儝rameAnalysisFunc闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘炬嫹
}INIT_CAN_FRAME;

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

typedef struct {
    uint32_t recv_id;        
    uint8_t recv_data[8];
    uint8_t Len;
    uint8_t Count;
} RECV_CAN_MSG;
typedef struct {
    uint32_t ID;        
    uint8_t Data[128];	
    uint8_t DataLen;	
}Multiple_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);      //闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫰鍋婂妤呮⒑鐠恒劌鏋戦柡瀣煼楠炲繒绮欓。鍣夐梻浣芥硶閸犳劙寮告繝姘闁绘垼濮ら弲鍝ョ磼婢跺﹥鍟為柛鐐差煼楠炲繘鎮滈懞銉︽婵炴挻鍝庨崕鎾敋濠婂牆绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘炬嫹
extern void RecvCanFrame(RECV_CAN_FRAME *data);                 //Can闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈠畡鏉跨紦闁荤姳娴囬～澶屸偓姘秺閺屻劑鎮㈠畡鏉跨紦缂佺偓婢橀ˇ鎵偓姘秺閺屻劑鎮㈤崨濠勪紕闂佺懓鍤栭幏锟�
extern uint8_t GetCanFrameState(uint32_t ID);                   //闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫭婢樼徊绶続N闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫭婢橀·鍛存煟濡灝鐓愰柍褜鍓ㄩ幏锟�
extern uint16_t GetCanFrameAliveTime(uint32_t ID);              //闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫭婢樼徊绶続N闂佸憡鎸撮弲鐘诲极閹捐妫橀柕鍫濇椤忓爼鏌￠崘銊у煟闁轰焦鎹囧顒勫Χ閸℃浼�
extern void CanRecvLibTimerCall(uint32_t n);                     //闂備浇娉曢崰鎰板几婵犳艾绠梺鍨儐椤ρ囨⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佹椿鍙庨崑鎾剁礊閸ヮ剙绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘炬嫹1ms闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘愁潐缁嬪鍩€椤掑嫭鐓ラ柣鏃囶嚙閳诲繘鏌ㄥ┑鍡欑閻庢艾缍婇弻銊╂偄閸涘﹦浼勯梺褰掝棑閸忔﹢寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鏁撻敓锟�1
extern void AnalysisCanData(void);                             //闂備浇娉曢崰鎰板几婵犳艾绠梺鍨儐椤ρ囨⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸搫鍊堕崐鏍偓姘炬嫹
extern void ResetAllCanFrameTime(void);                        //闂備浇娉曢崰鎰板几婵犳艾绠柧姘€荤粔鎾⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸搫鍊堕崐鏍偓姘鳖儚an闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呯ǹ銆掑銉ュ姢婵炲牊鍨圭划鐢垫喆閸曨偒浼撻梺鍝勫暢閸╂牕顪冮崒鐐寸叆闁绘梻枪閻忓﹪鏌ㄥ☉妯肩劯闁轰焦鎹囧顒勫Χ閸℃浼撻梻浣芥硶閸犳劙寮告繝姘闁绘垼濮ら弲鎼佹⒒閸愨晛鍔堕柟娲讳邯楠炲繘鎮滈懞銉︽闁哄鐗嗛崯浼淬€傞鈧獮蹇涙倻閼恒儲娅㈢紓浣戒含閻ｎ摴off闂備浇娉曢崰鏇€€佸⿰鍫燁棃闁冲搫鍊搁鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸搫鍊堕崐鏍偓姘秺閺屻劑鎮ら崒娑橆伓
extern uint8_t GetAllCanFrameTimeout(void);                     //闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫭婢樼徊鍧楁⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸憡鐟崑鍛村船婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈠ú缁樺仴闂佸憡鍨崐鏍偓姘秺瀹曟濡搁埡鍌涙闂佸搫鍊堕崐鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸湱鍏橀弨鍗烆渻閿燂拷

extern uint8_t GetCheckSumRightCnts(uint32_t ID);               //闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫭婢樼徊绺瀐ecksum闂備浇娉曢崰鎰板几婵犳艾绠瀣岸閳ь剚锕㈤弻銊╂偄閸涘﹦浼勯梺褰掝棑閸忔﹢寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸搫鍊堕崐鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘缁樻櫢闁跨噦鎷�5
extern uint8_t GetCheckSumErrorCnts(uint32_t ID);               //闂備浇娉曢崰鎰板几婵犳艾绠€瑰嫭婢樼徊绺瀐ecksum闂備浇娉曢崰鎰板几婵犳艾绠柣鎴ｅГ閺呮悂鏌￠崒妯衡偓鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佸綊顥撻崗姗€寮幘璇叉闁靛牆妫楅鍫曟⒑鐠恒劌鏋戦柡瀣煼楠炲繘鎮滈懞銉︽闂佸搫鍊堕崐鏍偓姘秺閺屻劑鎮㈤崨濠勪紕闂佺懓鍤栭幏锟�10


#endif 
