/* USER CODE BEGIN Header */
/* you can remove the copyright */

/*
 *  Copyright 2020-2023 Yuntu Microelectronics co.,ltd
 *  All rights reserved.
 * 
 *  YUNTU Confidential. This software is owned or controlled by YUNTU and may only be
 *  used strictly in accordance with the applicable license terms. By expressly
 *  accepting such terms or by downloading, installing, activating and/or otherwise
 *  using the software, you are agreeing that you have read, and that you agree to
 *  comply with and are bound by, such license terms. If you do not agree to be
 *  bound by the applicable license terms, then you may not retain, install,
 *  activate or otherwise use the software. The production use license in
 *  Section 2.3 is expressly granted for this software.
 * 
 * @file main.c
 * @brief 
 * 
 */

/* USER CODE END Header */
#include "Mcal.h"
/* Includes ------------------------------------------------------------------*/

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define CAN_ID_TYPE_FD_FRAME_MASK 		(0x40000000U)
#define CAN_ID_TYPE_EXTENDED_FRAME_MASK (0x80000000U)
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#ifdef CAN_INTERMITTENT_TXRX
#undef CAN_INTERMITTENT_TXRX
#endif
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint8 sduDataA1[8] = {0xF7, 0xE6, 0x05, 0xC4, 0xB3, 0xA2, 0x91, 0x80};
uint8 sduDataA2[8] = {0x78, 0x69, 0x5A, 0x4B, 0x0C, 0x2D, 0x1E, 0x0F};
uint8 sduDataA3[8] = {0xF7, 0xE6, 0xD5, 0xC4, 0xB3, 0xA2, 0x91, 0x80};
uint8 sduDataA4[8] = {0x15, 0xD2, 0xA1, 0xF3, 0x47, 0x13, 0xBC, 0x29};

uint8 sduDataA7[8] = {0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87};
uint8 sduDataA8[8] = {0x78, 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8};
uint8 sduDataA9[8] = {0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98};
uint8 sduDataA10[8]= {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88};

uint8 sduData64[64] = 
	{	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
		0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
		0x33, 0xcc, 0x33, 0xcc, 0x33, 0xcc, 0x33, 0xcc,
		0x33, 0xcc, 0x33, 0xcc, 0x33, 0xcc, 0x33, 0xcc,
		0xAA, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55,
		0xAA, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55};

uint8 sduData16[16] = 
	{	0xfa, 0x33, 0x31, 0x05, 0x77, 0xf8, 0x12, 0x89,
		0x33, 0x2c, 0xad, 0x69, 0x02, 0xdb, 0x35, 0x12};

uint8 sduData24[64] = 
	{	
		0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
		0x2a, 0xde, 0x8f, 0xdc, 0x16, 0x80, 0x43, 0xc5,
		0x36, 0xc2, 0xbb, 0x9a, 0x78, 0x56, 0x34, 0x12};
 
Can_PduType pduInfo0 = {
    .swPduHandle = 1,
    .id = 0x18FF0101U | CAN_ID_TYPE_EXTENDED_FRAME_MASK,
    .length = 8U,
    .sdu = sduDataA1,
};

Can_PduType pduInfo1 = {
    .swPduHandle = 10,
	  .id = 0x675U,
    .length = 8U,
    .sdu = sduDataA1,
};

Can_PduType pduInfo2 = {
    .swPduHandle = 11,
    .id = 0x502U,
    .length = 8U,
    .sdu = sduDataA2,
};

Can_PduType pduInfo3 = {
    .swPduHandle = 12,
	.id = 0x503U,
    .length = 8U,
    .sdu = sduDataA3,
};

Can_PduType pduInfo4 = {
    .swPduHandle = 20,
	.id = 0x168U,
    .length = 8U,
    .sdu = sduDataA4,
};

Can_PduType pduInfo5 = {
    .swPduHandle = 25,
#if(CAN_FD_USAGE == STD_ON)
	.id = 0x3E4U | CAN_ID_TYPE_FD_FRAME_MASK,
    .length = 64U,
#else
    .id = 0x3E4U,
    .length = 8U,
#endif
    .sdu = sduData64,
};

Can_PduType pduInfo6 = {
    .swPduHandle = 26,
#if(CAN_FD_USAGE == STD_ON)
	.id = 0x1AA66007U | CAN_ID_TYPE_EXTENDED_FRAME_MASK | CAN_ID_TYPE_FD_FRAME_MASK,
    .length = 21U,
#else
    .id = 0x1AA66007U | CAN_ID_TYPE_EXTENDED_FRAME_MASK,
    .length = 8U,
#endif
    .sdu = sduData24,
};

Can_PduType pduInfo7 = {
    .swPduHandle = 47,
    .id = 0x0D000000U | CAN_ID_TYPE_EXTENDED_FRAME_MASK,
    .length = 8U,
    .sdu = sduDataA1,
};

Can_PduType pduInfo8 = {
    .swPduHandle = 48,
    .id = 0x105U,
    .length = 8U,
    .sdu = sduData24,
};

Can_PduType pduInfo9 = {
    .swPduHandle = 49,
    .id = 0x1A8U ,
    .length = 8U,
    .sdu = sduDataA9,
};

Can_PduType pduInfo10 = {
    .swPduHandle = 93,
#if(CAN_FD_USAGE == STD_ON)
    .id = 0x7F0U | CAN_ID_TYPE_FD_FRAME_MASK,
#else
    .id = 0x7E0U,
#endif
    .length = 8U,
    .sdu = sduDataA10,
};

Can_PduType Feedback_pduInfo0 = {
    .swPduHandle = 7U,
	.id = 0x268U,
    .length = 8U,
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo1 = {
    .swPduHandle = 2U,
	.id = 0x775U,
    .length = 8U,
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo2 = {
    .swPduHandle = 4U,
#if(CAN_FD_USAGE == STD_ON)
	.id = 0x4E4U | CAN_ID_TYPE_FD_FRAME_MASK,
    .length = 16U,
#else
    .id = 0x4E4U,
    .length = 8U,
#endif
    .sdu = sduData16,
};

Can_PduType Feedback_pduInfo3 = {
    .swPduHandle = 9U,
	.id = 0x603U,
    .length = 8U,
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo4 = {
    .swPduHandle = 77U,
#if(CAN_FD_USAGE == STD_ON)
	.id = 0x1CC88007U | CAN_ID_TYPE_EXTENDED_FRAME_MASK | CAN_ID_TYPE_FD_FRAME_MASK,
    .length = 24U,
#else
    .id = 0x1CC88007U | CAN_ID_TYPE_EXTENDED_FRAME_MASK,
    .length = 8U,
#endif
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo7 = {
    .swPduHandle = 57U,
	.id = 0x10856699U | CAN_ID_TYPE_EXTENDED_FRAME_MASK,
    .length = 8U,
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo8 = {
    .swPduHandle = 58U,
	.id = 0x205U,
    .length = 8U,
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo9 = {
    .swPduHandle = 59U,
	.id = 0x305U,
    .length = 8U,
    .sdu = NULL_PTR,
};

Can_PduType Feedback_pduInfo10 = {
    .swPduHandle = 60U,
	.id = 0x2A8U,
    .length = 8U,
    .sdu = NULL_PTR,
};

Std_ReturnType TestResult[32];
uint8 tmp_i = 0;
volatile uint32 time1 = 0;
volatile uint32 time2 = 0;
uint8 Key3ScanTime = 0;
boolean Key3Status = 0;
uint8 Key2ScanTime = 0;
boolean Key2Status = 0;
uint32 tempSent, tempReceived, handleNum, handleAcc;
uint8  tempTestSignal = 0;
boolean  signCan0Busoff = FALSE;
boolean  signCan1Busoff = FALSE;
uint8   loopCycle;

/* USER CODE END PV */

/* Private function declare --------------------------------------------------*/
/* USER CODE BEGIN PFDC */
MCU_CONFIG_PB
extern const Port_ConfigType Port_Config;

void CanTransmitCallOut(PduIdType TxPduId)
{
    handleAcc = TxPduId;
    tempSent ++;
}

boolean CanReceiveCallOut(uint8 Hrh, Can_IdType CanId, uint8 CanDataLegth, const uint8* CanSduPtr)
{
    uint8 tempi, Data[8];
#if(CAN_FD_USAGE == STD_ON)
    uint8 Data64[64];
#endif
    if(4 == Hrh)
    {
        if(0x168U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo0.id = 0x268U;
            Feedback_pduInfo0.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjDoor, &Feedback_pduInfo0);     /* Can0 standard Can frame*/
        }
        if(0x16AU == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo0.id = 0x26AU;
            Feedback_pduInfo0.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjDoor, &Feedback_pduInfo0);     /* Can0 standard Can frame*/
        }
        if(0x16CU == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo0.id = 0x26CU;
            Feedback_pduInfo0.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjDoor, &Feedback_pduInfo0);     /* Can0 standard Can frame*/
        }
        if(0x16DU == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo0.id = 0x26DU;
            Feedback_pduInfo0.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjDoor, &Feedback_pduInfo0);     /* Can0 standard Can frame*/
        }
    }
    if(3 == Hrh)
    {
        if(0x675U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo1.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjTemperature, &Feedback_pduInfo1);     /* Can3 standard Can frame*/
        }       
    }
    if(6 == Hrh)
    {
        if(0x3E4U == (CanId & 0x1fffffffU))
        {
#if(CAN_FD_USAGE == STD_ON)
            for(tempi = 0; tempi < 64; tempi ++)
            {
                Data64[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo2.sdu = Data64;
            Data64[0] -= 0x88U;
#else
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo2.sdu = Data;
            Data[0] -= 0x88U;
#endif
            Can_Write(CanConf_CanHardwareObject_ObjEpbi, &Feedback_pduInfo2);           /* Can2 standard CanFd frame*/
        }
    }
    if(5 == Hrh)
    {
        if(0x503U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo3.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjInfoTrans2, &Feedback_pduInfo3);     /* Can1 standard Can frame*/
        }
         if(0x1AA66007U == (CanId & 0x1fffffffU))
        {
#if(CAN_FD_USAGE == STD_ON)
            for(tempi = 0; tempi < 24; tempi ++)
            {
                Data64[tempi] = CanSduPtr[tempi] - 0x18U;
            }
            Feedback_pduInfo4.sdu = Data64;
#else
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi] - 0x18U;
            }  
            Feedback_pduInfo4.sdu = Data;
#endif
            Can_Write(CanConf_CanHardwareObject_ObjInfoTrans1, &Feedback_pduInfo4); 
        }
    }
    if(7 == Hrh)
    {
        if(0x0D000000U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi];
            }
            Feedback_pduInfo7.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjTemperature, &Feedback_pduInfo7);     /* Can1 standard Can frame*/
        }
    }
    if(2 == Hrh)
    {
        if(0x105U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi] + 0x10U;
            }
            Feedback_pduInfo8.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjEpbi, &Feedback_pduInfo8);     /* Can1 standard Can frame*/
        }
    }
    if(1 == Hrh)
    {
        if(0x205U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi] + 0x20U;
            }
            Feedback_pduInfo9.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjInfoTrans2, &Feedback_pduInfo9);     /* Can1 standard Can frame*/
        }
    }
    if(0 == Hrh)
    {
        if(0x1A8U == (CanId & 0x1fffffffU))
        {
            for(tempi = 0; tempi < 8; tempi ++)
            {
                Data[tempi] = CanSduPtr[tempi] + 0x08U;
            }
            Feedback_pduInfo10.sdu = Data;
            Can_Write(CanConf_CanHardwareObject_ObjWindow, &Feedback_pduInfo10);     /* Can1 standard Can frame*/
        }
    }
    return TRUE;   
}

void CanBusoff0(void)
{
    signCan0Busoff = TRUE;  /*if Can0 busoff */
}

void CanBusoff1(void)
{
    signCan1Busoff = TRUE;  /*if Can1 busoff */
}

/* USER CODE END PFDC */
static void Board_Init(void);

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */


/**
 * @brief  The application entry point.
 * @retval int
 */
int main(void)
{
    /* USER CODE BEGIN 1 */
    Mcu_Init(&Mcu_Config);
    Mcu_InitClock(0);
#if (MCU_NO_PLL == STD_OFF)
    while ( MCU_PLL_LOCKED != Mcu_GetPllStatus() )
    {
    /* Busy wait until the System PLL is locked */
    }
    Mcu_DistributePllClock();
#endif
    /* USER CODE END 1 */ 
    Board_Init();
    /* USER CODE BEGIN 2 */
#if (CAN_FIXED_PB_CONFIG == STD_OFF)
    Can_Init(&Can_Config);
#else
    Can_Init(NULL_PTR);
#endif
    Platform_Init(NULL_PTR);    
    Can_SetControllerMode(CanConf_CanController_BCAN, CAN_CS_STARTED);      /*set Can0 to started*/
    Can_SetControllerMode(CanConf_CanController_DCAN, CAN_CS_STARTED);      /*set Can1 to started*/
    Can_SetControllerMode(CanConf_CanController_PCAN, CAN_CS_STARTED);      /*set Can2 to started*/
    Can_SetControllerMode(CanConf_CanController_infoCAN, CAN_CS_STARTED);   /*set Can3 to started*/
  /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
  while (1)
  {
    time1++;
    {
        if(time1 % 50000U == 0U)
        {
            sduDataA1[3] += 0x10;
            sduDataA2[6] += 2; 		
            sduDataA3[1] += 0x27; 	
            sduDataA4[5] += 0x4E; 
            sduData16[12] += 5; 
            sduData24[2] += 0x1A; 	
            sduData64[1] ++;	
            sduDataA9[7] += 0x10;
            sduDataA8[6] += 0x42;
            sduDataA7[5] -= 0x36;
        }
    }
    if(time1 > 200000U)
    {
        time1 = 0;
#ifdef CAN_INTERMITTENT_TXRX
        if(loopCycle == 200)
        {
#if (CAN_FIXED_PB_CONFIG == STD_OFF)
            Can_Init(&Can_Config);
#else
            Can_Init(NULL_PTR);
#endif
            Can_SetControllerMode(CanConf_CanController_BCAN, CAN_CS_STARTED);      /*set Can0 to started*/
            Can_SetControllerMode(CanConf_CanController_DCAN, CAN_CS_STARTED);      /*set Can1 to started*/
            Can_SetControllerMode(CanConf_CanController_PCAN, CAN_CS_STARTED);      /*set Can2 to started*/
            Can_SetControllerMode(CanConf_CanController_infoCAN, CAN_CS_STARTED);   /*set Can3 to started*/
        }
        if(loopCycle == 100)
        {
            Can_SetControllerMode(CanConf_CanController_BCAN, CAN_CS_STOPPED);      /*set Can0 to started*/
            Can_SetControllerMode(CanConf_CanController_DCAN, CAN_CS_STOPPED);      /*set Can1 to started*/
            Can_SetControllerMode(CanConf_CanController_PCAN, CAN_CS_STOPPED);      /*set Can2 to started*/
            Can_SetControllerMode(CanConf_CanController_infoCAN, CAN_CS_STOPPED);   /*set Can3 to started*/
            Can_DeInit();
        }
#endif
        if(loopCycle >= 200)
        {
            loopCycle = 0;
        }
        Can_Write(CanConf_CanHardwareObject_ObjEpbi, &pduInfo10);       /*  CAN2R1 0x7F0        */
        Can_Write(CanConf_CanHardwareObject_ObjEpbi, &pduInfo6);        /*  CAN2R1 0x1AA66007U  resp CAN1R0 0x1CC88007U */
        Can_Write(CanConf_CanHardwareObject_ObjWindow, &pduInfo1);      /*  CAN0R0 0x675U       resp CAN3R0 0x775U      */
        Can_Write(CanConf_CanHardwareObject_ObjWindow, &pduInfo7);      /*  CAN0R0 0x0D000000U  resp CAN3R0 0x10856699U */
        Can_Write(CanConf_CanHardwareObject_ObjDoor, &pduInfo0);        /*  CAN0R0 0x18FF0101U  */
        Can_Write(CanConf_CanHardwareObject_ObjInfoTrans1, &pduInfo5);  /*  CAN1R0 0x3E4U       resp CAN2R1 0x4E4U      */
        Can_Write(CanConf_CanHardwareObject_ObjInfoTrans2, &pduInfo2);  /*  CAN1R1 0x502U       */
        Can_Write(CanConf_CanHardwareObject_ObjTransmission, &pduInfo3);/*  CAN2R0 0x503U       resp CAN1R1 0x603U      */
        Can_Write(CanConf_CanHardwareObject_ObjInfoTrans1, &pduInfo8);  /*  CAN1R0 0x105U       resp CAN2R1 0x205U and CAN1R1 0x305U */
        Can_Write(CanConf_CanHardwareObject_ObjTemperature, &pduInfo9); /*  CAN3R0 0x1A8U       resp CAN0R0 0x2A8   */
        pduInfo4.id = 0x168U;
        pduInfo4.sdu = sduDataA2;
        Can_Write(CanConf_CanHardwareObject_ObjPm2d5, &pduInfo4);       /*  CAN3R0 0x168U       resp CAN0R0 0x268   */
        pduInfo4.id = 0x16AU;
        pduInfo4.sdu = sduDataA3;
        Can_Write(CanConf_CanHardwareObject_ObjPm2d5, &pduInfo4);       /*  CAN3R0 0x16AU       resp CAN0R0 0x26A   */
        pduInfo4.id = 0x16CU;
        pduInfo4.sdu = sduDataA4;
        Can_Write(CanConf_CanHardwareObject_ObjPm2d5, &pduInfo4);       /*  CAN3R0 0x16CU       resp CAN0R0 0x26C   */
        pduInfo4.id = 0x16DU;
        pduInfo4.sdu = sduDataA1;
        Can_Write(CanConf_CanHardwareObject_ObjPm2d5, &pduInfo4);       /*  CAN3R0 0x16DU       */
        loopCycle ++;        
    }
    if((time1 % 2000U) == 0U)
    {
        time1 ++;
#if (CAN_TX_PROCESS_HAS_POLLING == STD_ON)
#if (CAN_MAIN_FUNCTION_RW_PERIOD_OPTION_NUM == 1U)
        Can_MainFunction_Write();
#elif (CAN_MAIN_FUNCTION_RW_PERIOD_OPTION_NUM > 1U)
        Can_MainFunction_Write_Write2ms();
        Can_MainFunction_Write_Write10ms();
        Can_MainFunction_Write_Read2ms();
        Can_MainFunction_Write_Read10ms();
#endif
#endif
#if (CAN_RX_PROCESS_HAS_POLLING == STD_ON)
#if (CAN_MAIN_FUNCTION_RW_PERIOD_OPTION_NUM == 1U)
        Can_MainFunction_Read();
#elif (CAN_MAIN_FUNCTION_RW_PERIOD_OPTION_NUM > 1U)
        Can_MainFunction_Read_Write2ms();
        Can_MainFunction_Read_Write10ms();
        Can_MainFunction_Read_Read2ms();
        Can_MainFunction_Read_Read10ms();
#endif
#endif
        Can_MainFunction_Mode();
#if (CAN_BUSOFF_PROCESS_HAS_POLLING == STD_ON)        
        Can_MainFunction_BusOff();
#endif
        if(signCan0Busoff == TRUE)
        {
            signCan0Busoff = FALSE;
            Can_SetControllerMode(CanConf_CanController_BCAN, CAN_CS_STARTED);
        }
        if(signCan1Busoff == TRUE)
        {
            signCan1Busoff = FALSE;
            Can_SetControllerMode(CanConf_CanController_DCAN, CAN_CS_STARTED);
        }
    }
    /* USER CODE END WHILE */
        /* USER CODE BEGIN 3 */    
  }
  /* USER CODE END 3 */
}

static void Board_Init(void)
{
    Port_Init(&Port_Config);
}

/* USER CODE BEGIN 4 */
/* USER CODE END 4 */