#define  GLOBALS_APP_TEST
#include "../App_Headers/includes.h"
#include "../Library/TimeCtrl.h"

#define STEP_MAX        34//步数

void All_Lamp_TurnOn(void);

void APP_Test_Init(void){
    Key.StepAuto = null;
    Key.CAN_Step = null;
    Key.CAN_Step = null;

   // CurValueStr[ENUM_BatteryCurrent].val = 0;
    //CurValueStr[CoolTemp].val = 0;
    //CurValueStr[VehSpeed].val = 0;
    //CurValueStr[AD_Blue].val = 0;

   // CurValueStr[ENUM_BatteryCurrent].fval = Value_Plus;
    //CurValueStr[CoolTemp].fval = Value_Plus;
    //CurValueStr[VehSpeed].fval = Value_Plus;
    //CurValueStr[AD_Blue].fval = Value_Plus;

    //CanMessageID18F00029.Msg[1] = 0x7D;

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

    EOLMode = 1;
    EOLStep = 0;
    EOLError = 0;
    MP5_Flag = 0;
}
unsigned int Self_propelled_flag = 0;//自走
unsigned int Key_Dodging_flag = 1;//按键打点
unsigned int speed_value = 0;
void APP_Button_Proc(void){
    /*if(Key.PushTime_1 > T_3s){
        Key.StepAuto = 1;
    }
    if(Key.PushTime_2 > T_3s){
        Key.StepAuto = 2;
    }*/      
    
    if((Key.PushTime_2 > T_2s) && (Key.PushTime_1 > T_2s)){
        if(Key_Dodging_flag)
        {
            Key_Dodging_flag = 0;
        }
        else
        {
            Key_Dodging_flag = 1;
        }
    }
    
    if(pSB1 == 1){
        if(Key.PushTime_1 > T_50ms){
            if(Key_Dodging_flag)
            {
                Key.CAN_Step++;
            }
        if(EOLStep ==0 )//扩展会话
        {
            CurValueStr[UDS0                  ].val = 0x02;
            CurValueStr[UDS1                  ].val = 0x10;
            CurValueStr[UDS2                  ].val = 0x03;
            CurValueStr[UDS3                  ].val = 0x55;
            CurValueStr[UDS4                  ].val = 0x55;
            CurValueStr[UDS5                  ].val = 0x55;
            CurValueStr[UDS6                  ].val = 0x55;
            CurValueStr[UDS7                  ].val = 0x55;
        }

            // Key.CAN_Step++;
            // if(Key.CAN_Step > STEP_MAX){
            //     Key.CAN_Step = 0;
            // }
        }
        Key.PushTime_1 = null;
    }
    
    if(pSB2 == 1){
        if(Key.PushTime_2 > T_50ms){
            if(Key_Dodging_flag==1)
            {
                Key.CAN_Step--;
            }
        MP5_Flag = 0;
        }
        Key.PushTime_2 = null;

    }
}




#define  TirePressure(value)  CurValueStr[ENUM_TirePressure_LF].val = value; CurValueStr[ENUM_TirePressure_RF].val = value; CurValueStr[ENUM_TirePressure_LR].val = value; CurValueStr[ENUM_TirePressure_RR].val = value;  

#define  TireTemp(value)      CurValueStr[ENUM_TireTemp_LF    ].val = value; CurValueStr[ENUM_TireTemp_RF    ].val = value; CurValueStr[ENUM_TireTemp_LR    ].val = value; CurValueStr[ENUM_TireTemp_RR    ].val = value;

unsigned int lost_flag = 0;
unsigned int CAN_init_flag = 0;
unsigned int CAN_lost_flag = 0;
unsigned int water_value = 0;
void APP_ICM_Proc(void)  /*zh321*/  /*FS04*/
{
    //if(Self_propelled_flag==1)
    {
        {
        CurValueStr[ENUM_VSpeed                  ].val = 1;
        CurValueStr[ECM_FaultIndicator           ].val = 1;
        CurValueStr[ECM_StautsInvalid            ].val = 1;
        CurValueStr[ECM_MotorOver                ].val = 1;
        CurValueStr[ECM_ReadyIndicator           ].val = 1;
        CurValueStr[ECM_ChargeStatus             ].val = 1;
        CurValueStr[ECM_CruiseStatus             ].val = 1;
        CurValueStr[ECM_GearPositionStatus       ].val = 1;
        CurValueStr[PFC_Relag                    ].val = 1;
        CurValueStr[LLC_UnderOutput              ].val = 1;
        CurValueStr[LLC_OverOutput               ].val = 1;
        CurValueStr[LLC_OutPut                   ].val = 1;
        CurValueStr[PFC_LLC_Interal_Communication].val = 1;
        CurValueStr[LLC_Temp                     ].val = 1;
        CurValueStr[Battery_status               ].val = 1;
        CurValueStr[Battery_Current              ].val = 1;
        CurValueStr[Battery_SOC                  ].val = 1;



            #if 1                       
            switch(Key.CAN_Step)
            {
                case 1:
                {   

                }break;

                case 2:
                {   
                    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 = 1;
                    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 = -25;
                    CurValueStr[Battery_SOC                  ].val = 10;

                }break;
                case 3:
                {   

                    CurValueStr[ENUM_VSpeed                  ].val = 305;
                    CurValueStr[ECM_FaultIndicator           ].val = 0;
                    CurValueStr[ECM_StautsInvalid            ].val = 0;
                    CurValueStr[ECM_MotorOver                ].val = 1;
                    CurValueStr[ECM_ReadyIndicator           ].val = 0;
                    CurValueStr[ECM_ChargeStatus             ].val = 0;
                    CurValueStr[ECM_CruiseStatus             ].val = 0;
                    CurValueStr[ECM_GearPositionStatus       ].val = 2;
                    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 = -50;
                    CurValueStr[Battery_SOC                  ].val = 45;                                   

                }break;
                case 4:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 615;
                    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 = 3;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 1;
                    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 = -75;
                    CurValueStr[Battery_SOC                  ].val = 65;                                   
                }break;
                case 5:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 925;
                    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 = 4;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 0;
                    CurValueStr[LLC_OverOutput               ].val = 1;
                    CurValueStr[LLC_OutPut                   ].val = 0;
                    CurValueStr[PFC_LLC_Interal_Communication].val = 0;
                    CurValueStr[LLC_Temp                     ].val = 0;
                    CurValueStr[Battery_status               ].val = 0x10;
                    CurValueStr[Battery_Current              ].val = -100;
                    CurValueStr[Battery_SOC                  ].val = 85;     


                }break;
                case 6:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1230;
                    CurValueStr[ECM_FaultIndicator           ].val = 0x01;
                    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 = 5;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 0;
                    CurValueStr[LLC_OverOutput               ].val = 1;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;                            
                }break;
                case 7:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1535;
                    CurValueStr[ECM_FaultIndicator           ].val = 0;
                    CurValueStr[ECM_StautsInvalid            ].val = 0;
                    CurValueStr[ECM_MotorOver                ].val = 0;
                    CurValueStr[ECM_ReadyIndicator           ].val = 0;
                    CurValueStr[ECM_ChargeStatus             ].val = 1;
                    CurValueStr[ECM_CruiseStatus             ].val = 0;
                    CurValueStr[ECM_GearPositionStatus       ].val = 5;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 0;
                    CurValueStr[LLC_OverOutput               ].val = 1;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;                           
                }break;
                case 8:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1740;
                    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 = 5;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 0;
                    CurValueStr[LLC_OverOutput               ].val = 1;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;                                
                }break;
                case 9:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1840;
                    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 = 1;
                    CurValueStr[ECM_GearPositionStatus       ].val = 5;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 0;
                    CurValueStr[LLC_OverOutput               ].val = 1;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;                              

                }break;
                case 10:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1840;
                    CurValueStr[ECM_FaultIndicator           ].val = 0;
                    CurValueStr[ECM_StautsInvalid            ].val = 0;
                    CurValueStr[ECM_MotorOver                ].val = 0;
                    CurValueStr[ECM_ReadyIndicator           ].val = 1;
                    CurValueStr[ECM_ChargeStatus             ].val = 0;
                    CurValueStr[ECM_CruiseStatus             ].val = 0;
                    CurValueStr[ECM_GearPositionStatus       ].val = 5;
                    CurValueStr[PFC_Relag                    ].val = 0;
                    CurValueStr[LLC_UnderOutput              ].val = 0;
                    CurValueStr[LLC_OverOutput               ].val = 1;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;                            

                }break;
                case 11:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1840;
                    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 = 5;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;                                 
                }break;
                #if 0
                case 12:
                {   
                    CurValueStr[ENUM_VSpeed                  ].val = 1840;
                    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 = 2;
                    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 = -100;
                    CurValueStr[Battery_SOC                  ].val = 100;      
                }break;
                
                case 12:
                {   
                    CurValueStr[ENUM_VSpeed         ].val = speed_value;//车速
                    CurValueStr[ENUM_RSpeed         ].val = 12000;
                    CurValueStr[ENUM_WaterTemp      ].val = water_value;//水温
                    if(direction_espeed==1)
                    {
                        CurValueStr[ISG_Power      ].val = 0;
                        CurValueStr[ISG_Power_Enable      ].val = 0;
                        CurValueStr[TCS_Warning_Lamp      ].val = 1;
                        CurValueStr[TCS_Work_Mode      ].val = 0;                              
                    }
                    else
                    {
                        CurValueStr[ISG_Ready      ].val = 1; 
                        CurValueStr[TCS_Warning_Lamp      ].val = 0;
                        CurValueStr[TCS_Work_Mode      ].val = 1;                                                 
                    }      
                }break;
                #endif
            }
            #endif
        }
    }
}


void Message_ClearDatas(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char len, unsigned char Format){
    unsigned char pBit, pByte, i;

    pBit = StartBit;
    pByte = StartByte;

    switch(Format){
        case Motorola:{
            for(i = 0; i < len; i++){
                __RESET_WATCHDOG();
                Message->Msg[pByte] &= ~(1 << pBit);
                pBit++;
                if(pBit >= 8){
                    pBit = 0;
                    if(pByte > 0){
                        pByte--;
                    }else{
                        break;
                    }
                }
            }
        }break;

        case Intel:{
            for(i = 0; i < len; i++){
                __RESET_WATCHDOG();
                Message->Msg[pByte] &= ~(1 << pBit);
                pBit++;
                if(pBit >= 8){
                    pBit = 0;
                    if(pByte < 7){
                        pByte++;
                    }else{
                        break;
                    }
                }
            }
        }break;

        default:{
            ;
        }
    }
}

void Message_FillDatas(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char len, unsigned char Format, unsigned long MessageValue){
    unsigned char pBit, pByte, i;

    pBit = StartBit;
    pByte = StartByte;
    MessageValue = MessageValue << pBit;

    switch(Format){
        case Motorola:{
            for(i = 0; i < len; i++){
                __RESET_WATCHDOG();
                Message->Msg[pByte] |= MessageValue & (1 << pBit);
                pBit++;
                if(pBit >= 8){
                    pBit = 0;
                    if(pByte > 0){
                        pByte--;
                        MessageValue = MessageValue >> 8;
                    }else{
                        break;
                    }
                }
            }
        }break;

        case Intel:{
            for(i = 0; i < len; i++){
                __RESET_WATCHDOG();
                Message->Msg[pByte] |= MessageValue & (1 << pBit);
                pBit++;
                if(pBit >= 8){
                    pBit = 0;
                    if(pByte < 7){
                        pByte++;
                        MessageValue = MessageValue >> 8;
                    }else{
                        break;
                    }
                }
            }
        }break;

        default:{
            ;
        }
    }
}



void Message_Value_Calculate(s_CAN_List list)
{

    CAN_message *CanMessage;
    INT8U Start_Byte, Start_Bit, len, Offset_Flag, Format_Flag;
    INT16U Offset, Factor_1, Factor_2, CurValue, Value_Flag;

    INT32U temp;
    INT32U Message_Clear;
    INT8U  Byte_Count;
    INT8U  i;

    CanMessage = list.canMsg;
    Start_Byte = list.StartByte;
    Start_Bit = list.StartBit;
    len = list.SignalLen;
    Offset_Flag = list.fOffset;
    Format_Flag = list.fFormat;
    Offset = list.Offset;
    Factor_1 = list.Factor_1;
    Factor_2 = list.Factor_2;

    CurValue = list.CurValue->val;
    Value_Flag = list.CurValue->fval;



    temp = CurValue;

    //璁＄畻鍋忕Щ锟??
    if(Offset != 0){
        if(Offset_Flag  == Offset_Minus){
            if(Value_Flag == Value_Minus){
                if(temp > Offset){
                    temp = 0;               //閿欒??锛屾墍瑕佸疄鐜扮殑鍊煎皬浜庣墿鐞嗘渶灏忥拷?
                }else{
                    temp = Offset - temp;
                }
            }else if(Value_Flag == Value_Plus){
                temp += Offset;
            }else{;}
        }else if(Offset_Flag  == Offset_Plus){
            if(temp < Offset){
                temp = 0;               //閿欒??锛屾墍瑕佸疄鐜扮殑鍊煎皬浜庣墿鐞嗘渶灏忥拷?
            }else{
                temp -= Offset;
            }
        }
        
    }

    temp = temp * Factor_1 / Factor_2;
    //temp = temp << Start_Bit;

    Byte_Count = len / 8;
    if((len % 8) != 0){
        Byte_Count += 1;
    }

    //娓呰剰鏁版嵁
    Message_ClearDatas(CanMessage, Start_Byte, Start_Bit, len, Format_Flag);
    Message_FillDatas(CanMessage, Start_Byte, Start_Bit, len, Format_Flag, temp);
    
}




void FT_VehSpeedCalc(unsigned char spd){
    unsigned long wTemp;

    wTemp = spd;

    
}


/*zh:*/
/*------------------------------------------------------------------------------------------------
 * function name : Bits_Operation
 * parameter value range : StartByte(0~7)     StartBit(0~7)     Length(1~8)     Value(0~255)
 * notice : Do not span bytes.
 * author : zhouhang
 * date :2022.01.18
--------------------------------------------------------------------------------------------------*/        
void Bits_Operation(CAN_message *Message, unsigned char StartByte, unsigned char StartBit, unsigned char Length, unsigned char Value)  /*Do not span bytes*/
{
    unsigned char i;
    
    for (i = 0; i < Length; i++)
    {
        Message->Msg[StartByte] &= (~(1 << (i + StartBit)));
    }

    Message->Msg[StartByte] |= (Value << StartBit);
}

/*:zh*/


void All_Lamp_TurnOn(void)
{
    ;
}