#include "Common_Interface.h"
#include "Key.h"
#include "ODOReset.h"
#include "Services_ODO.h"
#include "Services_ODO_Internal.h"
#include "Services_Interval.h"
#include "Services_TripA.h"
#include "RTE_LINE_IN.h"
#include "Communication_Over_CAN.h"
#include "Gauge_Display.h"
#include "Telltales_user.h"
#define ODO_RESET_MASK_ALL  0xFFu /*按键保持长按下 车速有效 所有门开*/
#define ODO_RESET_MASK_1    0x7Fu /*车速有效 所有门开*/
#define ODO_RESET_MASK_2    0x80u /*按键保持长按下*/
#define ODO_RESET_MASK_3    0xBFu /*按键保持长按下 所有门开*/

uint32_t Factory_ClearOdo_Display_Flag = 0;
uint8_t OEMResetReqCheck(void); /*清零触发逻辑*/
uint8_t GeelyReset(void);       /*主机厂复位(按键,报文,诊断):返回值 0ok,1>500km,2>3time  */
/*****************非BackUp变量区******************************/
static uint8_t Mes2A4rCnt=0u;
//static uint8_t Mes2A4rCntBak=0u;
uint8_t KeepTime=0u;
uint16_t GeelyReseReq=0u;

uint8_t Req_Chk = 0u;/*请求检查标志*/
uint8_t Req_1 = 0u;/*请求计数1*/
uint8_t Req_0 = 0u;/*请求计数0*/
/*************************************************************/
void Factory_ClearOdo(void) 
{ 
  uint8_t c3,c4,k1;
  
  if(Common_Get_IG_Sts()==1u)
  {
//    c1= (Common_Get_Act_E_Speed()>=8000u)?1u:0u;
//    c2= (Common_Get_Act_E_Speed_Valid())?1u:0u;
    c3= (Common_Get_Act_V_Speed() >= 1800u)?1u:0u;
    c4= ((Get_ID_18FA40F4_Sig_BMSBattSOC( ) * 4 / 10) >= 99u)?1u:0u;
    
  if ((c3) && (c4))
   {
     k1=(Get_Line_In_TRIP_Switch())?0u:1u;

     
      if(k1) 
      {        
         if(KeepTime<=100u) /*按键保持计时*/
         {
           KeepTime++;
         }       
         if(KeepTime==100u) /*清除一次防止 反复清除*/
         { 
           Factory_ClearOdo_Display_Flag = 1;
           Data_Clear_TripA();              /*小计*/
           Services_ODO_ClearFactory();     /*总计*/
           Services_ODO_ClearFactory1();    /*程序内部使用,里程备份增加专用里程,非显示里程*/
           Data_interval_Geely_Reset_TYW(); /*保养*/
         }
      }
      else
      {
        KeepTime=0u; 
      }
   } 
   else
   {
    KeepTime=0u; 
   }
 }    
}



uint8_t OEMResetReqCheck(void)
{

  return 0;
}

/*==================================
【Geely MMI信号清零逻辑严格判断逻辑】
CAN接收到信号后会产生循环计数,如果
本函数检测到备份的值与滚动值不一致,
则判断为收到一帧有效信号,相反如果
备份值相同则代表没有收到新的信号。
【判断信号值】
如果收到的是‘1’则累计,如果收到‘0’信
号时判断收到的1的数量,只有收到连续的
3帧MMI_OdometerClearReq为1 且本帧
MMI_OdometerClearReq为0才会清零,不连
续的‘1’或信号间隔超过120ms也不清零。
==================================*/
void GeelyResetByMMI_CB20ms(void)
{
  
  
}
/*主机厂复位:总计、小计、保养、平均油耗*/
uint8_t GeelyReset(void)
{
  _DataTripAInputStruct  m_TripApara;
  uint8_t m8=0u;
  m8 = Services_ODO_Clear();
  /*清零结果 0=ok,1=500km,2=3次*/
  if(m8==0u)
  {
    /*保养里程清零*/
    Data_interval_Geely_Reset();               
    /*小计里程*/ 
    m_TripApara.V_Speed_Valid=1u;
    m_TripApara.Act_V_Speed = 0u;/*87505*/ /*87505-1*/
    m_TripApara.MileageRollingCnt = Data_MileageRollingCounter_Read();
    Data_TripA_Set_Para(&m_TripApara);
    Data_Clear_TripA();
    /*平均油耗清零*/
//    Data_Average_Fuel_Consumption_Reset();
  }
  return m8;
}


/*吉利按键清大计*/
void GeelyResetByTrip_CB50ms(uint8_t IgnSt)
{
  if(IgnSt)
  {
    if(GeelyReseReq!=0u)
    {   
      if(GeelyReseReq<80u)/*前4s*/
      {
         if(OEMResetReqCheck()&ODO_RESET_MASK_3)/*按键保持长按下 所有门开*/
         {
           GeelyReseReq++;
         }
         else
         {
           GeelyReseReq=0u;
         }
      }
      else/*4s后在检测*/
      {
        if(OEMResetReqCheck()==ODO_RESET_MASK_ALL)/*满足清零条件车速<2 所有门开 按键*/
        { 
          if(GeelyReseReq<=400u)/*持续20s*/
          {
           GeelyReseReq++;
          }  
          
          if(GeelyReseReq==400u)
          {
           (void)GeelyReset();/*主机厂清零*/
           GeelyReseReq=0u;
          }
        }
        else
        {
         GeelyReseReq=0u;
        }         
      } 

    }
  }
  else
  {
    /*OFF 下检测主机厂清零请求*/ 
    if(OEMResetReqCheck()>=ODO_RESET_MASK_2)/*OFF下判断到按键被按下*/
    {
      GeelyReseReq=1u;
    }
    else
    {
      GeelyReseReq=0u;
    }
  }
}

void CanHook_2A4(void);
void CanHook_2A4(void)
{
  /*收到报文时发出通知*/
  Mes2A4rCnt++;
}

uint8_t GetDoorSta(void)
{
  union
  {
   uint8_t req;
   struct
   {
     uint8_t bit_1 :1;
     uint8_t bit_2 :1;
     uint8_t bit_3 :1;
     uint8_t bit_4 :1;
     uint8_t bit_5 :1;
     uint8_t bit_6 :1;


   }Group;   
  }m8;
  m8.Group.bit_1 = 0;//Get_Door_Open_Stats_FL_Status();
  m8.Group.bit_2 = 0;//Get_Door_Open_Stats_FR_Status();
  m8.Group.bit_3 = 0;//Get_Door_Open_Stats_RR_Status();
  m8.Group.bit_4 = 0;//Get_Door_Open_Stats_RL_Status();
  m8.Group.bit_5 = 0;//Get_Door_Open_Stats_TR_Status();
  m8.Group.bit_6 = 0;//Get_Door_Open_Stats_HO_Status(); 
  m8.req&=0x3FU;
  return m8.req;
}