//#include "UDS_Common.h"
#include "CAN_CH0_CAN_Communication_Matrix.h"
//#include "include.h"
//#include "UDS_Common.h"
//#include "IC_Configuration.h"

//#include "RTE_CAN.h"
//#include "TYW_stdint.h"
#include <string.h>
//#include <EOL_Para.h>
//#include <DataProcess_Common.h>
//#include <CAN_Signal_Select.h>
#include "g_includes.h"


#pragma alignvar(8)
static uint32_t pRXBuff[CAN_RX_MSG_Block * CAN_CH0_ID_TOTAL_MAX];
//#pragma alignvar(8)
//static uint32_t pTXBuff[CAN_TX_MSG_Block * CAN_CH0_ID_SEND_TOTAL];

uint32_t pRXBuff_CH0[CAN_RX_MSG_Block * CAN_CH0_ID_TOTAL_MAX];


uint8_t COM_APP_Process(st_CAN_Msg *Msg);

void COM_CAN_Init(void)
{
    memset(pRXBuff, 0, sizeof(pRXBuff));
    CAN_CH0_CanMsgOp.CAN_MSG_Analysis = ( st_CANMsgStruct * )pRXBuff;
    //CAN_CH0_CanMsgTxOp.CanMsg         = pTXBuff;
    Can_RX_BuffInit(&CAN_CH0_CanMsgOp, CAN_CH0_CAN_MSG_CONST_ARRAY, CAN_CH0_ID_TOTAL_MAX);
    //Can_TX_BuffInit(&CAN_CH0_CanMsgTxOp, CAN_CH0_CANSendAttr, CAN_CH0_ID_SEND_TOTAL, Can_Write);
    //CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Disable);
    CAN_RX_SetEnable(&CAN_CH0_CanMsgOp, CAN_N_RX_Enable);


}

void COM_RX_Process(void)
{
    CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp, 5u);
}

uint8_t BusOffEvent;
/**
  *获取busoff状态
  *@return busoff状态 0正常,1异常
  */
uint8_t getBUS_OFF_Status(void)
{
    return BusOffEvent;
}
typedef enum
{
    BUSSOFF_CH_CH0,
    BUSSOFF_CH_SUM,
}BUSSSOFF_CH_enum;

static RSCAN0BusoffMonitorStruct     RSCAN0Busoff[BUSSOFF_CH_SUM];

void Can_CH0_BusOffRecover(void);
void Can_CH0_BusOff_Fun(void);


void Can_CH0_BusOff_Fun(void)
{
    if ((RSCAN0_CH0_Get_Busoff_Status() != 0U))
    {
        RSCAN0_CH0_Abort(0);
    
        if (RSCAN0Busoff[BUSSOFF_CH_CH0].Status == RSCAN0_BUS_STABLE)
        {
            RSCAN0Busoff[BUSSOFF_CH_CH0].Status = RSCAN0_BUS_OFF_LV1;
        }

        if (RSCAN0Busoff[BUSSOFF_CH_CH0].Status == RSCAN0_BUS_OFF_LV1)
        {
            RSCAN0Busoff[BUSSOFF_CH_CH0].Timer++;
            if (RSCAN0Busoff[BUSSOFF_CH_CH0].Timer >= (RSCAN0_BUS_OFF_LV1_RECOVERY_TIME / 10U))
            {
                RSCAN0Busoff[BUSSOFF_CH_CH0].Timer = 0U;

                RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt++;
                if (RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt >= 10U)
                {
               
                    RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt = 0U;

                    RSCAN0Busoff[BUSSOFF_CH_CH0].Status = RSCAN0_BUS_OFF_LV2;
                }
                RSCAN0_CH0_Busoff_Recover( );
            }
        }
        else if (RSCAN0Busoff[BUSSOFF_CH_CH0].Status == RSCAN0_BUS_OFF_LV2)
        {
            RSCAN0Busoff[BUSSOFF_CH_CH0].Timer++;

            if (RSCAN0Busoff[BUSSOFF_CH_CH0].Timer >= (RSCAN0_BUS_OFF_LV2_RECOVERY_TIME / 10U))
            {
                RSCAN0Busoff[BUSSOFF_CH_CH0].Timer = 0U;
                RSCAN0_CH0_Busoff_Recover( );
            }
        }
        else
        {

        }
    }
    else                                          /* 总线正常,没有Bus-off发生/**/
    {
        Can_CH0_BusOffRecover();
    }
}

void Can_BusOff_Fun(void)
{
    Can_CH0_BusOff_Fun();
}

void Can_BusOffRecover(void)
{   
    Can_CH0_BusOffRecover();
}

void Can_CH0_BusOffRecover(void)
{
    RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt = 0u;
    RSCAN0Busoff[BUSSOFF_CH_CH0].Status = 0u;
    RSCAN0Busoff[BUSSOFF_CH_CH0].Timer = 0u;
}