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

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;
}
unsigned int count_flag_a =0;
unsigned int speed_value = 0;
unsigned int KeyAuto = 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(KeyAuto == 0)
        {
            Key.StepAuto = Key.StepAuto==1 ? 0 : 1;
            KeyAuto = 1;

        }
    }
    else
    {
        KeyAuto = 0;
    }

    if(pSB1 == 1){
        if((Key.PushTime_1 > T_50ms) && (!Key.StepAuto)){
            //count_flag_a = 1;
             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) && (!Key.StepAuto)){
            //count_flag_a = 0;
             if(Key.CAN_Step > 0){
                 Key.CAN_Step--;
             }else{
                 Key.CAN_Step = STEP_MAX;
             }
        }
        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;

//uint16_t VSpeed(uint16_t speed)
//{
//    return (speed * 108)/100;
//}
#define VSpeed(speed)  ((speed * 100)/108)
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*/
{
    switch(Key.CAN_Step)
    {
        case 0:
        {
            CurValueStr[WHEEL_SPEED_REAR      ].val = 0;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 0;          //水温
            CurValueStr[MIL_Lamp              ].val = 0;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 1;          //ABS指示灯
            CurValueStr[CENACC                ].val = 1;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 0;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 0;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 1;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 0;          //ABS禁用指示灯
        }
        break;
        case 1:
        {  
            CurValueStr[WHEEL_SPEED_REAR      ].val = 17;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 0;          //水温
            CurValueStr[MIL_Lamp              ].val = 1;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 1;          //ABS指示灯
            CurValueStr[CENACC                ].val = 1;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 0;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 0;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 1;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 0;          //ABS禁用指示灯
        }break;
        case 2:
        {   
            CurValueStr[WHEEL_SPEED_REAR      ].val = 36;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 0;          //水温
            CurValueStr[MIL_Lamp              ].val = 0;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 1;          //ABS指示灯
            CurValueStr[CENACC                ].val = 1;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 3;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 0;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 1;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 0;          //ABS禁用指示灯
        }break;
        case 3:
        {
            CurValueStr[WHEEL_SPEED_REAR      ].val = 54;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 0;          //水温
            CurValueStr[MIL_Lamp              ].val = 0;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 1;          //ABS指示灯
            CurValueStr[CENACC                ].val = 1;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 3;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 0;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 1;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 0;          //ABS禁用指示灯
        }break;
        case 4:
        {
            CurValueStr[WHEEL_SPEED_REAR      ].val = 73;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 160;          //水温
            CurValueStr[MIL_Lamp              ].val = 0;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 1;          //ABS指示灯
            CurValueStr[CENACC                ].val = 1;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 0;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 0;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 0;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 0;          //ABS禁用指示灯
        }break;
        case 5:
        {
            CurValueStr[WHEEL_SPEED_REAR      ].val = 199;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 0;          //水温
            CurValueStr[MIL_Lamp              ].val = 0;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 1;          //ABS指示灯
            CurValueStr[CENACC                ].val = 0;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 0;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 9;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 1;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 0;          //ABS禁用指示灯
        }break;
        case 6:
        {
            CurValueStr[WHEEL_SPEED_REAR      ].val = 199;          //前轮
            CurValueStr[RPM_CAN               ].val = 0;          //后轮
            CurValueStr[TH2OC                 ].val = 160;          //水温
            CurValueStr[MIL_Lamp              ].val = 1;          //发动机故障灯
            CurValueStr[ABS_LAMP              ].val = 0;          //ABS指示灯
            CurValueStr[CENACC                ].val = 0;          //发动机无法启动指示灯
            CurValueStr[AtcLamp               ].val = 3;          //ASR报警灯
            CurValueStr[HHGLevel              ].val = 9;          //加热手柄指示灯
            CurValueStr[CSTAMPLAT             ].val = 0;          //支架指示灯
            CurValueStr[ABS_ABSLevel          ].val = 1;          //ABS禁用指示灯
        }break;
    }
}


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)
{
    ;
}