#define  GLOBALS_APP_CAN
#include "../App_Headers/includes.h"
#include "../Library/TimeCtrl.h"
#include "../Library/FT_VehSpeedCalc.h"

#define   LED_P_NUMBER       0     //?????????
#define   LED_N_NUMBER       0     //?????????
#define   CAN_MAGS_NUMBER    10    //can????????
#define   OIL_MUMBER         0     //????????


INT8U led_P = 0,
      led_N = 0,
      can_num = 0,
      oil_num = 0;
      




void flash_1Hz_process(void)//500ms call         blink/flash
{
    Flash_1Hz = !(Flash_1Hz);
}

/*-------------------------------------------------------------------------
* Function Name  : App_Msg_Copy
* Description    : 
* Input          : None
* Output         : None
* Return         : None
* onther         : 
--------------------------------------------------------------------------*/
void App_Msg_Copy(CAN_message * CanMessage,INT16U* data)
{
    CanMessage->Msg[0] = data[0];
    CanMessage->Msg[0] = data[1];
    CanMessage->Msg[0] = data[2];
    CanMessage->Msg[0] = data[3];
    CanMessage->Msg[0] = data[4];
    CanMessage->Msg[0] = data[5];
    CanMessage->Msg[0] = data[6];
    CanMessage->Msg[0] = data[7];
    //bReturn = Api_CANSendFrame(pMsg->id,0,pMsg->Len,pMsg->Data);
}

/*-------------------------------------------------------------------------
* Function Name  : Write_CAN_Msg
* Description    : 
* Input          : None
* Output         : None
* Return         : None
* onther         : 
--------------------------------------------------------------------------*/
void Write_CAN_Msg(CAN_message * CanMessage,INT8U i,INT8U data)
{ 
    CanMessage->Msg[i] = data;  
}

void Clear_CAN_Msg(CAN_message * CanMessage)
{ 
    INT8U i = 0;
    
    for (i; i <= (CanMessage->Length - 1); i++) 
    {
      CanMessage->Msg[i]  = 0x00;
    }
    CanMessage->ID_EN = 1;
}

void Set_CAN_Msg(CAN_message * CanMessage)
{ 
    INT8U i = 0;
    
    for (i; i <= (CanMessage->Length - 1); i++) 
    {
      CanMessage->Msg[i]  = 0xFF;
    }
}

void Set_CAN_CRC(CAN_message * CanMessage){
    INT8U i;
    for(i = 1; i < CanMessage->Length; i++){
        CanMessage->Msg[0] ^= CanMessage->Msg[i];
    }
}

/*zh:
0CFF7902
0CFF7C02
18FFDC01
18FEDCD5
18FEDED5
*/
void Format_CAN_Msg() 
{
    CanMsg_112.ID       = 0x112;
    CanMsg_103.ID       = 0x103;
    CanMsg_116.ID       = 0x116;
    CanMsg_113.ID       = 0x113;
    CanMsg_104.ID       = 0x104;
    CanMsg_12F.ID       = 0x12F;
    CanMsg_331.ID       = 0x331;
    CanMsg_012.ID       = 0x012;
    CanMsg_115.ID       = 0x115;
    CanMsg_117.ID       = 0x117;
    CanMsg_317.ID       = 0x317;
    // CanMsg_480.ID       = 0x480;
    // CanMsg_021.ID       = 0x021;
    CanMsg_0A33FFE3.ID       = 0x0A33FFE3;
    CanMsg_0A10FFE0.ID       = 0x0A10FFE0;
    CanMsg_0A10FFE1.ID       = 0x0A10FFE1;
    CanMsg_0A20FFE2.ID       = 0x0A20FFE2;
    CanMsg_0A30FFE8.ID       = 0x0A30FFE8;
    CanMsg_0A31FFE3.ID       = 0x0A31FFE3;
    CanMsg_0A30FFE3.ID       = 0x0A30FFE3;
    CanMsg_0A32FFE4.ID       = 0x0A32FFE4;
    CanMsg_0A37FFE3.ID       = 0x0A37FFE3;
    CanMsg_0A18FFE0.ID       = 0x0A18FFE0;
    CanMsg_0A40FFE2.ID       = 0x0A40FFE2;

    CanMsg_112.Length   = 8;
    CanMsg_103.Length   = 8;
    CanMsg_116.Length   = 8;
    CanMsg_113.Length   = 8;
    CanMsg_104.Length   = 8;
    CanMsg_12F.Length   = 8;
    CanMsg_331.Length   = 8;
    CanMsg_012.Length   = 8;
    CanMsg_115.Length   = 8;
    CanMsg_117.Length   = 8;
    CanMsg_317.Length   = 8;
    // CanMsg_480.Length   = 8;
    // CanMsg_021.Length   = 8;
    CanMsg_0A33FFE3.Length       = 8;
    CanMsg_0A10FFE0.Length       = 8;
    CanMsg_0A10FFE1.Length       = 8;
    CanMsg_0A20FFE2.Length       = 8;
    CanMsg_0A30FFE8.Length       = 8;
    CanMsg_0A31FFE3.Length       = 8;
    CanMsg_0A30FFE3.Length       = 8;
    CanMsg_0A32FFE4.Length       = 8;
    CanMsg_0A37FFE3.Length       = 8;
    CanMsg_0A18FFE0.Length       = 8;
    CanMsg_0A40FFE2.Length       = 8;


    CanMsg_112.ID_EN    = 1;
    CanMsg_103.ID_EN    = 1;
    CanMsg_116.ID_EN    = 1;
    CanMsg_113.ID_EN    = 1;
    CanMsg_104.ID_EN    = 1;
    CanMsg_12F.ID_EN    = 1;
    CanMsg_331.ID_EN    = 1;
    CanMsg_012.ID_EN    = 1;
    CanMsg_115.ID_EN    = 1;
    CanMsg_117.ID_EN    = 1;
    CanMsg_317.ID_EN    = 1;
    // CanMsg_480.ID_EN    = 1;
    // CanMsg_021.ID_EN    = 1;
    CanMsg_0A33FFE3.ID_EN       = 1;
    CanMsg_0A10FFE0.ID_EN       = 1;
    CanMsg_0A10FFE1.ID_EN       = 1;
    CanMsg_0A20FFE2.ID_EN       = 1;
    CanMsg_0A30FFE8.ID_EN       = 1;
    CanMsg_0A31FFE3.ID_EN       = 1;
    CanMsg_0A30FFE3.ID_EN       = 1;
    CanMsg_0A32FFE4.ID_EN       = 1;
    CanMsg_0A37FFE3.ID_EN       = 1;
    CanMsg_0A18FFE0.ID_EN       = 1;
    CanMsg_0A40FFE2.ID_EN       = 1;
} 

void Disable_CAN_Tx(void)
{
    CanMsg_112.ID_EN    = 0;
    CanMsg_103.ID_EN    = 0;
    CanMsg_116.ID_EN    = 0;
    CanMsg_113.ID_EN    = 0;
    CanMsg_104.ID_EN    = 0;
    CanMsg_12F.ID_EN    = 0;
    CanMsg_331.ID_EN    = 0;
    CanMsg_012.ID_EN    = 0;
    CanMsg_115.ID_EN    = 0;
    CanMsg_117.ID_EN    = 0;
    CanMsg_317.ID_EN    = 0;
    // CanMsg_480.ID_EN    = 0;
    // CanMsg_021.ID_EN    = 0;
    CanMsg_0A33FFE3.ID_EN       = 0;
}       

void Set_Pin(INT16U pin)
{

}
            

/*-------------------------------------------------------------------------
* Function Name  : App_Can_Proc
* Description    : 
* Input          : None
* Output         : None
* Return         : None
* onther         : 
--------------------------------------------------------------------------*/

void App_Can_Proc(void)
{
    unsigned char i;
    unsigned int gMsg;

    for(i = 0; i < CAN_List_Num; i++){
        Message_Value_Calculate(CAN_List[i]);
    }

    // if((Key.Flag_1==0) || (Key.Flag_2==0))
    // {
    //     bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_112);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_112);  
    //     bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_103);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_103);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_116);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_116);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_12F);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_12F);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_113);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_113);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_104);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_104);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_331);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_331);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_012);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_012);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_115);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_115);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_117);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_117);  
    //       bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_317);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_317);  


    // }






    // else if(Key.Flag_1==1)
    // {
    if(GetCtrlTime(CANMsgSend_10ms) >= 10)
    {
        ClearCtrlTime(CANMsgSend_10ms);           
        bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_112);
        Clear_CAN_Msg((CAN_message *)&CanMsg_112);  
        bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_103);
        Clear_CAN_Msg((CAN_message *)&CanMsg_103);  
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_116);
        Clear_CAN_Msg((CAN_message *)&CanMsg_116);  
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_113);
        Clear_CAN_Msg((CAN_message *)&CanMsg_113);  
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_104);
        Clear_CAN_Msg((CAN_message *)&CanMsg_104);  

    }
    if(GetCtrlTime(CANMsgSend_20ms) >= 20){
        ClearCtrlTime(CANMsgSend_20ms);
 
    bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_12F);
        Clear_CAN_Msg((CAN_message *)&CanMsg_12F);  
    }

    if(GetCtrlTime(CANMsgSend_50ms) >= 50){
        ClearCtrlTime(CANMsgSend_50ms);      
        
     bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_331);
        Clear_CAN_Msg((CAN_message *)&CanMsg_331); 
    }

    if(GetCtrlTime(CANMsgSend_100ms) >= 100){
        ClearCtrlTime(CANMsgSend_100ms);    
      
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_012);
        Clear_CAN_Msg((CAN_message *)&CanMsg_012);  
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_115);
        Clear_CAN_Msg((CAN_message *)&CanMsg_115);  
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_117);
        Clear_CAN_Msg((CAN_message *)&CanMsg_117);  
          bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_317);
        Clear_CAN_Msg((CAN_message *)&CanMsg_317);  

    // if(electricityclose == 0)
    // {
    //     bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_020);
    //     Clear_CAN_Msg((CAN_message *)&CanMsg_020);
    // } 
    // bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_202);
    // Clear_CAN_Msg((CAN_message *)&CanMsg_202); 
    // bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_280);
    // Clear_CAN_Msg((CAN_message *)&CanMsg_280); 
    // bReturn = Api_CANSendFrame((CAN_message *)&CanMsg_021);
    // Clear_CAN_Msg((CAN_message *)&CanMsg_021);
    }

    if(GetCtrlTime(CANMsgSend_200ms) >= 200){
    ClearCtrlTime(CANMsgSend_200ms);
    // 

    }

    if(GetCtrlTime(CANMsgSend_500ms) >= 500){
        flash_1Hz_process();
     

        ClearCtrlTime(CANMsgSend_500ms);    
    }

    if(GetCtrlTime(CANMsgSend_1s) >= 1000){

        ClearCtrlTime(CANMsgSend_1s);

    }
    
    if(GetCtrlTime(CANMsgSend_10s) >= 10000){

        ClearCtrlTime(CANMsgSend_10s);
       
    }
// }

    //REV 0
    /*CanMessageID0CF80AF0.Msg[0] = 0x98;
    CanMessageID0CF80AF0.Msg[1] = 0x3A;
    
    CanMessageID18F816F3.Msg[3] |= 0x10; */

    

    //CurValueStr[ENUM_VSpeed         ].val = 0;
    // CurValueStr[ENUM_VSpeed                  ].val = 0;
    // CurValueStr[ECM_FaultIndicator           ].val = 0;
    // CurValueStr[ECM_StautsInvalid            ].val = 0;
    // CurValueStr[ECM_MotorOver                ].val = 0;
    // CurValueStr[ECM_ReadyIndicator           ].val = 0;
    // CurValueStr[ECM_ChargeStatus             ].val = 0;
    // CurValueStr[ECM_CruiseStatus             ].val = 0;
    // CurValueStr[ECM_GearPositionStatus       ].val = 0;
    // CurValueStr[PFC_Relag                    ].val = 0;
    // CurValueStr[LLC_UnderOutput              ].val = 0;
    // CurValueStr[LLC_OverOutput               ].val = 0;
    // CurValueStr[LLC_OutPut                   ].val = 0;
    // CurValueStr[PFC_LLC_Interal_Communication].val = 0;
    // CurValueStr[LLC_Temp                     ].val = 0;
    // CurValueStr[Battery_status               ].val = 0;
    // CurValueStr[Battery_Current              ].val = 0;
    // CurValueStr[Battery_SOC                  ].val = 0;
    // CurValueStr[Vspeed                       ].val = 0;
    // CurValueStr[hour                         ].val = 0;
    // CurValueStr[minute                       ].val = 0;
    // CurValueStr[electricity                  ].val = 0;
    // CurValueStr[fault                        ].val = 0;
    // CurValueStr[Energy_recovery              ].val = 0;
    // CurValueStr[Energy_recovery_level        ].val = 0;
    // CurValueStr[Side_brackets                ].val = 0;
    // CurValueStr[TCS_close                    ].val = 0;
    // CurValueStr[TCS_crotrul                  ].val = 0;
    // CurValueStr[TCS_mode                     ].val = 0;
    // CurValueStr[TCS_light                    ].val = 0;
    // CurValueStr[GPS                          ].val = 0;
    // CurValueStr[signal_4G                    ].val = 0;
    // CurValueStr[Battery_over                 ].val = 0;
    // CurValueStr[Motor_overheating            ].val = 0;
    // CurValueStr[Cruise_control               ].val = 0;
    // CurValueStr[Gear                         ].val = 0;
    // CurValueStr[Bluetooth_phone              ].val = 0;
    // CurValueStr[year                         ].val = 0;
    // CurValueStr[Power                       ].val = 0;
    // CurValueStr[Vvspeed_L                         ].val = 0;


    //         CurValueStr[Vvspeed_L                  ].val = 0;
    //                 CurValueStr[Power                      ].val = 0;
    //                 CurValueStr[Electricity_H              ].val = 0;
    //                 CurValueStr[Electricity_L              ].val = 0;
    //                 CurValueStr[Cruise_H                  ].val = 0;
    //                 CurValueStr[Cruise                    ].val = 0;
    //                 CurValueStr[Power_Tem                    ].val = 0;
    //                 CurValueStr[Gear                       ].val =0;
    //                 CurValueStr[ABS_off                    ].val=0;
    //                 CurValueStr[Ready                      ].val=0;
    //                 CurValueStr[Charge                     ].val=0;
    //                 CurValueStr[Charge_H                   ].val=0;
    //                 CurValueStr[ABS                         ].val=0;
    //                 CurValueStr[Tubro                         ].val=0;
    //                 CurValueStr[Malfunction                         ].val=0;
    //                 CurValueStr[Support                         ].val=0;
    //                 CurValueStr[L_Power                         ].val=0;
    //                 CurValueStr[Throttle_117                        ].val=0;
    //                 CurValueStr[Throttle_317                         ].val=0;
    //                 CurValueStr[RaiseHead                           ].val=0;
    //                 CurValueStr[LeftHand                           ].val=0;
    //                  CurValueStr[Parking                          ].val=0;



    // CurValueStr[ENUM_VSpeed                  ].fval = Value_Plus;
    // CurValueStr[ECM_FaultIndicator           ].fval = Value_Plus;
    // CurValueStr[ECM_StautsInvalid            ].fval = Value_Plus;
    // CurValueStr[ECM_MotorOver                ].fval = Value_Plus;
    // CurValueStr[ECM_ReadyIndicator           ].fval = Value_Plus;
    // CurValueStr[ECM_ChargeStatus             ].fval = Value_Plus;
    // CurValueStr[ECM_CruiseStatus             ].fval = Value_Plus;
    // CurValueStr[ECM_GearPositionStatus       ].fval = Value_Plus;
    // CurValueStr[PFC_Relag                    ].fval = Value_Plus;
    // CurValueStr[LLC_UnderOutput              ].fval = Value_Plus;
    // CurValueStr[LLC_OverOutput               ].fval = Value_Plus;
    // CurValueStr[LLC_OutPut                   ].fval = Value_Plus;
    // CurValueStr[PFC_LLC_Interal_Communication].fval = Value_Plus;
    // CurValueStr[LLC_Temp                     ].fval = Value_Plus;
    // CurValueStr[Battery_status               ].fval = Value_Plus;
    // CurValueStr[Battery_Current              ].fval = Value_Plus;
    // CurValueStr[Battery_SOC                  ].fval = Value_Plus;
    // CurValueStr[Vspeed                       ].fval = Value_Plus;
    // CurValueStr[hour                         ].fval = Value_Plus;
    // CurValueStr[minute                       ].fval = Value_Plus;
    // CurValueStr[electricity                  ].fval = Value_Plus;
    // CurValueStr[fault                        ].fval = Value_Plus;
    // CurValueStr[Energy_recovery_level        ].fval = Value_Plus;
    // CurValueStr[Side_brackets                ].fval = Value_Plus;
    // CurValueStr[TCS_close                    ].fval = Value_Plus;
    // CurValueStr[TCS_crotrul                  ].fval = Value_Plus;
    // CurValueStr[TCS_mode                     ].fval = Value_Plus;
    // CurValueStr[TCS_light                    ].fval = Value_Plus;
    // CurValueStr[GPS                          ].fval = Value_Plus;
    // CurValueStr[signal_4G                    ].fval = Value_Plus;
    // CurValueStr[Battery_over                 ].fval = Value_Plus;
    // CurValueStr[Motor_overheating            ].fval = Value_Plus;
    // CurValueStr[Cruise_control               ].fval = Value_Plus;
    // CurValueStr[Gear                         ].fval = Value_Plus;
    // CurValueStr[Bluetooth_phone              ].fval = Value_Plus;
    // CurValueStr[year                         ].fval = Value_Plus;
    // CurValueStr[Power                        ].fval = Value_Plus;
    // CurValueStr[Vvspeed_L                         ].fval = Value_Plus;
   // CurVehSpeed = 0;

    //LDW Open
    //CanMessageID18FE5BE8.Msg[0] |= 0x40;
    //FCW Open
  //  CanMessageID0CF02FA0.Msg[0] |= 0x03;
    //AutoLwBm Open
//    CanMessageID18FF0B21.Msg[5] |= 0x10;

}

