#include "System_Status_Monitor.h"

#pragma MESSAGE DISABLE C4000
#pragma MESSAGE DISABLE C4001

volatile uint8_t        SysPowerStatus;
volatile uint8_t        SysOperatingStatus;

uint8_t                 SysStatUpdateMode;

SysPwrModeStruct        SysPwrMode;
SysSignalStatusStruct   SysKL15Signal;

/******************************************************************************
��������Sys_Status_Init
��  �ܣ�ϵͳ״̬��ʼ��
        �����״��ϵ�ʱ��ʼ��һ��
��  ������
����ֵ����
******************************************************************************/
void Sys_Status_Init(void)
{
  SysStatUpdateMode      = 0xFF;

  SysPowerStatus         = 0x00;
  SysOperatingStatus     = 0x00;

  SysPwrMode.Mode        = SYS_PWR_NORMAL_MODE;
  SysPwrMode.LVPTimer    = 0;
  SysPwrMode.LimitTimer  = 0;
  SysPwrMode.NormalTimer = 0;
  SysPwrMode.OVPTimer    = 0;

  SysKL15Signal.Status   = SYS_SIG_STAT_INACTIVE;
  SysKL15Signal.Timer    = 0;
}

/******************************************************************************
��������Sys_Status_Update_Mode_Set
��  �ܣ�ϵͳ״̬����ģʽ����
��  ����Mode������ģʽ SYS_STAT_UPDATE_MODE_NORMAL   - ��������ģʽ
                       SYS_STAT_UPDATE_MODE_WAKEUP   - ���ߺ��Ѹ���ģʽ
                       SYS_STAT_UPDATE_MODE_RECOVERY - ��ѹ�쳣������ָ�ģʽ
                       SYS_STAT_UPDATE_MODE_INIT     - ��ʼ��ģʽ
����ֵ����
******************************************************************************/
void Sys_Status_Update_Mode_Set(uint8_t Mode)
{
  if (Mode != SysStatUpdateMode)              //������ģʽ�����仯ʱ,�������ж�ʱ��
  {
    SysPwrMode.LVPTimer    = 0;
    SysPwrMode.LimitTimer  = 0;
    SysPwrMode.NormalTimer = 0;
    SysPwrMode.OVPTimer    = 0;

    SysKL15Signal.Timer    = 0;

    SysStatUpdateMode      = Mode;
  }
}

/******************************************************************************
��������Sys_Status_Update_Service
��  �ܣ�ϵͳ״̬���·���
��  ������
����ֵ����
*******************************************************************************
ע  �⣺�÷������ڲ�ͬ�Ĺ���ģʽ����Ҫ���ղ�ͬ�����ڵ���
        SYS_STAT_UPDATE_MODE_NORMAL   ģʽ��,ÿ  20ms ����һ��
        SYS_STAT_UPDATE_MODE_WAKEUP   ģʽ��,���ϸ�Ҫ�����ʱ��
        SYS_STAT_UPDATE_MODE_RECOVERY ģʽ��,ÿ 100ms ����һ��
        SYS_STAT_UPDATE_MODE_INIT     ģʽ��,�ڳ�ʼ���׶ε���һ��
******************************************************************************/
void Sys_Status_Update_Service(void)
{
  uint8_t   i;
  uint8_t   LVPCnt;
  uint8_t   LimitCnt;
  uint8_t   NormalCnt;
  uint8_t   OVPCnt;
  uint16_t  Voltage;
  uint16_t  RocBackup;
  uint16_t  Counter;
  uint8_t   OpStatus;

  if (SysStatUpdateMode == SYS_STAT_UPDATE_MODE_NORMAL) //��������ģʽ
  {
    //if ((ANALOG_KL15_VOLTAGE_VALID == 0))
    //  return;                             //�����ڵ�Դ��ѹ��Ч������²Ž���״̬����

    //��������ģʽ��,���Ȼ�ȡ��Դ״̬
    //Voltage = 0;                          //��ȡ��Դ��ѹ
    //Voltage = ANALOG_KL15_VOLTAGE;
    if ((ANALOG_KL30_VOLTAGE_VALID == 0) || (ANALOG_KL15_VOLTAGE_VALID == 0))
      return;                             //�����ڵ�Դ��ѹ��Ч������²Ž���״̬����
    
    //��������ģʽ��,���Ȼ�ȡ��Դ״̬
    Voltage = 0;                          //��ȡ��Դ��ѹ
    
    #if SYS_POWERED_BY_KL30_ONLY
      Voltage = ANALOG_KL30_VOLTAGE;
    #else
      if (ANALOG_KL15_VOLTAGE > ANALOG_KL30_VOLTAGE)
        Voltage = ANALOG_KL15_VOLTAGE;
      else
        Voltage = ANALOG_KL30_VOLTAGE;
    #endif
    
    switch (SysPwrMode.Mode)              //��Դ״̬ת��
    {
      case SYS_PWR_LVP_MODE     :
        if (NVM_CONFIG_POWER == 1)
        {
          if (Voltage >= 32000)           //�����ѹ������ֵ
          {
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer++;
          }
          else if (Voltage >= 18000)      //��������
          {
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage >= 16000)      //�˳���ѹ��ֵ
          {
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
          else
          {
            SysPwrMode.LimitTimer  = 0;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
        }
        else
        {
          if (Voltage >= 18000)           //�����ѹ������ֵ
          {
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer++;
          }
          else if (Voltage >= 9500)       //��������
          {
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage >= 7000)       //�˳���ѹ��ֵ
          {
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
          else
          {
            SysPwrMode.LimitTimer  = 0;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
        }
        if (SysPwrMode.OVPTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_OVP_MODE;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        else if (SysPwrMode.NormalTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_NORMAL_MODE;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        else if (SysPwrMode.LimitTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_LIMIT_MODE;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        break;

      case SYS_PWR_LIMIT_MODE   :
        if (NVM_CONFIG_POWER == 1)
        {
          if (Voltage >= 32000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer++;
          }
          else if (Voltage >= 18000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage < 15500)       //�����ѹ������ֵ 
          {
            SysPwrMode.LVPTimer++;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
          else
          {
            SysPwrMode.LVPTimer    = 0;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
        }
        else
        {
          if (Voltage >= 18000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer++;
          }
          else if (Voltage >= 9500)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.NormalTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage < 6500)        //�����ѹ������ֵ 
          {
            SysPwrMode.LVPTimer++;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
          else
          {
            SysPwrMode.LVPTimer    = 0;
            SysPwrMode.NormalTimer = 0;
            SysPwrMode.OVPTimer    = 0;
          }
        }
        if (SysPwrMode.OVPTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_OVP_MODE;
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        else if (SysPwrMode.NormalTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_NORMAL_MODE;
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        else if (SysPwrMode.LVPTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_LVP_MODE;
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        break;

      case SYS_PWR_NORMAL_MODE  :
        if (NVM_CONFIG_POWER == 1)
        {
          if (Voltage < 15500)
          {
            SysPwrMode.LVPTimer++;
            SysPwrMode.LimitTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage < 17000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.LimitTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage >= 32000)
          {
            SysPwrMode.LVPTimer   = 0;
            SysPwrMode.LimitTimer = 0;
            SysPwrMode.OVPTimer++;
          }
          else
          {
            SysPwrMode.LVPTimer   = 0;
            SysPwrMode.LimitTimer = 0;
            SysPwrMode.OVPTimer   = 0;
          }
        }
        else
        {
          if (Voltage < 6500)
          {
            SysPwrMode.LVPTimer++;
            SysPwrMode.LimitTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage < 9000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.LimitTimer++;
            SysPwrMode.OVPTimer = 0;
          }
          else if (Voltage >= 18000)
          {
            SysPwrMode.LVPTimer   = 0;
            SysPwrMode.LimitTimer = 0;
            SysPwrMode.OVPTimer++;
          }
          else
          {
            SysPwrMode.LVPTimer   = 0;
            SysPwrMode.LimitTimer = 0;
            SysPwrMode.OVPTimer   = 0;
          }
        }
        if (SysPwrMode.LVPTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_LVP_MODE;
          SysPwrMode.LVPTimer   = 0;
          SysPwrMode.LimitTimer = 0;
          SysPwrMode.OVPTimer   = 0;
        }
        else if (SysPwrMode.LimitTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_LIMIT_MODE;
          SysPwrMode.LVPTimer   = 0;
          SysPwrMode.LimitTimer = 0;
          SysPwrMode.OVPTimer   = 0;
        }
        else if (SysPwrMode.OVPTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_OVP_MODE;
          SysPwrMode.LVPTimer   = 0;
          SysPwrMode.LimitTimer = 0;
          SysPwrMode.OVPTimer   = 0;
        }
        break;

      case SYS_PWR_OVP_MODE     :
        if (NVM_CONFIG_POWER == 1)
        {
          if (Voltage < 15500)
          {
            SysPwrMode.LVPTimer++;
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
          }
          else if (Voltage < 17000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
          }
          else if (Voltage < 32200)
          {
            SysPwrMode.LVPTimer   = 0;
            SysPwrMode.LimitTimer = 0;
            SysPwrMode.NormalTimer++;
          }
          else
          {
            SysPwrMode.LVPTimer    = 0;
            SysPwrMode.LimitTimer  = 0;
            SysPwrMode.NormalTimer = 0;
          }
        }
        else
        {
          if (Voltage < 6500)
          {
            SysPwrMode.LVPTimer++;
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
          }
          else if (Voltage < 9000)
          {
            SysPwrMode.LVPTimer = 0;
            SysPwrMode.LimitTimer++;
            SysPwrMode.NormalTimer++;
          }
          else if (Voltage < 18200)
          {
            SysPwrMode.LVPTimer   = 0;
            SysPwrMode.LimitTimer = 0;
            SysPwrMode.NormalTimer++;
          }
          else
          {
            SysPwrMode.LVPTimer    = 0;
            SysPwrMode.LimitTimer  = 0;
            SysPwrMode.NormalTimer = 0;
          }
        }      
        if (SysPwrMode.LVPTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_LVP_MODE;
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
        }
        else if (SysPwrMode.LimitTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_LIMIT_MODE;
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
        }
        else if (SysPwrMode.NormalTimer >= SYS_PWR_DEBOUNCE_TIME / 20)
        {
          SysPwrMode.Mode = SYS_PWR_NORMAL_MODE;
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
        }
        break;

      default :
        SysPwrMode.Mode = SYS_PWR_NORMAL_MODE;
        SysPwrMode.LVPTimer    = 0;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
        SysPwrMode.OVPTimer    = 0;
        break;
    }

    if (SysPwrMode.Mode == SYS_PWR_LVP_MODE)                   //���µ�Դ��־
      SysPowerStatus = SYS_PWR_STATUS_BIT_LVP;      /////////////��ѹģʽû��
    else if (SysPwrMode.Mode == SYS_PWR_LIMIT_MODE) /////////////��ѹģʽû��
      SysPowerStatus = SYS_PWR_STATUS_BIT_LIM;      /////////////��ѹģʽû��
    else if (SysPwrMode.Mode == SYS_PWR_OVP_MODE)   /////////////��ѹģʽû��
     SysPowerStatus = SYS_PWR_STATUS_BIT_OVP;       /////////////��ѹģʽû��
    else 
     SysPowerStatus = SYS_PWR_STATUS_BIT_RUN;

  //����ϵͳ����״̬
  #if SYS_RUNNING_IN_LIMIT_MODE
    if (SYS_PWR_STAT_UNPROTECT)
  #else
    if (SYS_PWR_STAT_NORMAL)
  #endif
    {
      OpStatus = SYS_OPR_STATUS_BIT_OFF;
      //SysOperatingStatus = SYS_OPR_STATUS_BIT_OFF;

      //ACC״̬���
      #if SYS_ACC_MODE_DET_ENABLE
        if (Sys_ACC_Status_Detect())
          OpStatus = SYS_OPR_STATUS_BIT_ACC;
	      //SysOperatingStatus = SYS_OPR_STATUS_BIT_ACC;
      #endif

      //IGN״̬���
      if (SysKL15Signal.Status == SYS_SIG_STAT_ACTIVE)
      {
        if (ANALOG_KL15_VOLTAGE < SYS_OFF_THRESHOLD)
        {
          SysKL15Signal.Timer++;
          if (SysKL15Signal.Timer >= SYS_OPR_DEBOUNCE_TIME / 20)
          {
            SysKL15Signal.Status = SYS_SIG_STAT_INACTIVE;
            SysKL15Signal.Timer  = 0;
          }
        }
        else
          SysKL15Signal.Timer = 0;
      }
      else
      {
        if (ANALOG_KL15_VOLTAGE >= SYS_ON_THRESHOLD)
        {
          SysKL15Signal.Timer++;
          if (SysKL15Signal.Timer >= SYS_OPR_DEBOUNCE_TIME / 20)
          {
            SysKL15Signal.Status = SYS_SIG_STAT_ACTIVE;
            SysKL15Signal.Timer  = 0;
          }
        }
        else
          SysKL15Signal.Timer  = 0;
      }

      if (SysKL15Signal.Status)
	      OpStatus = SYS_OPR_STATUS_BIT_IGN;
      //SysOperatingStatus = SYS_OPR_STATUS_BIT_IGN;

      //START״̬���
      #if SYS_CRANK_MODE_DET_ENABLE
        if (Sys_Crank_Status_Detect())
  	      OpStatus = SYS_OPR_STATUS_BIT_CRK;
        //SysOperatingStatus = SYS_OPR_STATUS_BIT_CRK;
      #endif
      SysOperatingStatus = OpStatus;
    }
    else
      SysOperatingStatus = SYS_OPR_STATUS_BIT_ERR;
  }
  else if (SysStatUpdateMode == SYS_STAT_UPDATE_MODE_WAKEUP) //���Ѹ���ģʽ
  {
    //��IGN��Դ����5�μ��,��������5�ξ���������ֵ����ΪIGN ON
    for (i = 0; i < 5; i++)
    {
      Analog_KL15_Voltage_Conversion();
      if (ANALOG_KL15_VOLTAGE < SYS_ON_THRESHOLD)
        return;
    }

    //Ĭ�ϵ�ԴΪ����״̬,���Ѻ��ʼ����Դ״̬
    LVPCnt    = 0;
    LimitCnt  = 0;
    NormalCnt = 0;
    OVPCnt    = 0;

    for (;;)
    {
      Voltage = 0;

    #if SYS_POWERED_BY_KL30_ONLY
      Analog_KL30_Voltage_Conversion();
      Voltage = ANALOG_KL30_VOLTAGE;  
    #else
      Analog_KL30_Voltage_Conversion();
      Analog_KL15_Voltage_Conversion();
      if (ANALOG_KL15_VOLTAGE > ANALOG_KL30_VOLTAGE)
        Voltage = ANALOG_KL15_VOLTAGE;
      else
        Voltage = ANALOG_KL30_VOLTAGE;
    #endif
      if (NVM_CONFIG_POWER == 1)
      {  
        if (Voltage < 15500)
        {
          LVPCnt++;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage < 17000)
        {
          LVPCnt    = 0;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage >= 32000)
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt = 0;
          OVPCnt++;
        }
        else
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt++;
          OVPCnt    = 0;
        }
      }
      else
      {  
        if (Voltage < 6500)
        {
          LVPCnt++;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage < 9000)
        {
          LVPCnt    = 0;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage >= 18000)
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt = 0;
          OVPCnt++;
        }
        else
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt++;
          OVPCnt    = 0;
        }
      }
      
      if (LVPCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_LVP_MODE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_LVP;
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
        return;
      }

      if (LimitCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_LIMIT_MODE;
        SysKL15Signal.Status = SYS_SIG_STAT_ACTIVE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_LIM;
      #if SYS_RUNNING_IN_LIMIT_MODE
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_IGN;
      #else
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
      #endif
        return;
      }

      if (NormalCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_NORMAL_MODE;
        SysKL15Signal.Status = SYS_SIG_STAT_ACTIVE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_RUN;
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_IGN;
        return;
      }

      if (OVPCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_OVP_MODE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_OVP;
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
        return;
      }
    }
  }
  else if (SysStatUpdateMode == SYS_STAT_UPDATE_MODE_RECOVERY) //�쳣�����ָ�����ģʽ
  {
    Voltage = 0;

  #if SYS_POWERED_BY_KL30_ONLY
    Analog_KL30_Voltage_Conversion();
    Voltage = ANALOG_KL30_VOLTAGE;  
  #else
    Analog_KL30_Voltage_Conversion();
    Analog_KL15_Voltage_Conversion();
    if (ANALOG_KL15_VOLTAGE > ANALOG_KL30_VOLTAGE)
      Voltage = ANALOG_KL15_VOLTAGE;
    else
      Voltage = ANALOG_KL30_VOLTAGE;
  #endif

    //�쳣�����ָ�����ģʽ��ֻ�Ե�Դ״̬���м��
    if (SysPwrMode.Mode == SYS_PWR_LVP_MODE)
    {
      if (NVM_CONFIG_POWER == 1)
      {  
        if (Voltage >= 32000)
        {
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
          SysPwrMode.OVPTimer++;
        }
        else if (Voltage >= 18000)
        {
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
          SysPwrMode.OVPTimer = 0;
        }
        else if (Voltage >= 16000)
        {
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        else
        {
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
      }
      else
      {  
        if (Voltage >= 18000)
        {
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
          SysPwrMode.OVPTimer++;
        }
        else if (Voltage >= 9500)
        {
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
          SysPwrMode.OVPTimer = 0;
        }
        else if (Voltage >= 7000)
        {
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
        else
        {
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
          SysPwrMode.OVPTimer    = 0;
        }
      }
      if (SysPwrMode.OVPTimer >= SYS_PWR_DEBOUNCE_TIME / 100)
      {
        SysPwrMode.Mode = SYS_PWR_OVP_MODE;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
        SysPwrMode.OVPTimer    = 0;
      }
      else if (SysPwrMode.NormalTimer >= SYS_PWR_DEBOUNCE_TIME / 100)
      {
        SysPwrMode.Mode = SYS_PWR_NORMAL_MODE;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
        SysPwrMode.OVPTimer    = 0;
      }
      else if (SysPwrMode.LimitTimer >= SYS_PWR_DEBOUNCE_TIME / 100)
      {
        SysPwrMode.Mode = SYS_PWR_LIMIT_MODE;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
        SysPwrMode.OVPTimer    = 0;
      }
    }
    else if (SysPwrMode.Mode == SYS_PWR_OVP_MODE)
    {
      if (NVM_CONFIG_POWER == 1)
      {    
        if (Voltage < 15500)
        {
          SysPwrMode.LVPTimer++;
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
        }
        else if (Voltage < 17000)
        {
          SysPwrMode.LVPTimer = 0;
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
        }
        else if (Voltage < 32200)
        {
          SysPwrMode.LVPTimer   = 0;
          SysPwrMode.LimitTimer = 0;
          SysPwrMode.NormalTimer++;
        }
        else
        {
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
        }
      }
      else
      {    
        if (Voltage < 6500)
        {
          SysPwrMode.LVPTimer++;
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
        }
        else if (Voltage < 9000)
        {
          SysPwrMode.LVPTimer = 0;
          SysPwrMode.LimitTimer++;
          SysPwrMode.NormalTimer++;
        }
        else if (Voltage < 18200)
        {
          SysPwrMode.LVPTimer   = 0;
          SysPwrMode.LimitTimer = 0;
          SysPwrMode.NormalTimer++;
        }
        else
        {
          SysPwrMode.LVPTimer    = 0;
          SysPwrMode.LimitTimer  = 0;
          SysPwrMode.NormalTimer = 0;
        }
      }      
      if (SysPwrMode.LVPTimer >= SYS_PWR_DEBOUNCE_TIME / 100)
      {
        SysPwrMode.Mode = SYS_PWR_LVP_MODE;
        SysPwrMode.LVPTimer    = 0;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
      }
      else if (SysPwrMode.LimitTimer >= SYS_PWR_DEBOUNCE_TIME / 100)
      {
        SysPwrMode.Mode = SYS_PWR_LIMIT_MODE;
        SysPwrMode.LVPTimer    = 0;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
      }
      else if (SysPwrMode.NormalTimer >= SYS_PWR_DEBOUNCE_TIME / 100)
      {
        SysPwrMode.Mode = SYS_PWR_NORMAL_MODE;
        SysPwrMode.LVPTimer    = 0;
        SysPwrMode.LimitTimer  = 0;
        SysPwrMode.NormalTimer = 0;
      }
    }

    if (SysPwrMode.Mode == SYS_PWR_LVP_MODE)                    //���µ�Դ��־
      SysPowerStatus       = SYS_PWR_STATUS_BIT_LVP;
    else if (SysPwrMode.Mode == SYS_PWR_LIMIT_MODE)
    {
      SysKL15Signal.Status = SYS_SIG_STAT_INACTIVE;
      SysPowerStatus       = SYS_PWR_STATUS_BIT_LIM;
    #if SYS_RUNNING_IN_LIMIT_MODE
      SysOperatingStatus   = SYS_OPR_STATUS_BIT_OFF;
    #else
      SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
    #endif
    }
    else if (SysPwrMode.Mode == SYS_PWR_OVP_MODE)
      SysPowerStatus       = SYS_PWR_STATUS_BIT_OVP;
    else
    {
      SysKL15Signal.Status = SYS_SIG_STAT_INACTIVE;
      SysPowerStatus       = SYS_PWR_STATUS_BIT_RUN;
      SysOperatingStatus   = SYS_OPR_STATUS_BIT_OFF;
    }
  }
  else                                                          //��ʼ������ģʽ
  {
    //�ϵ���ʱ150ms,�ȴ���Դ��ѹ�ȶ�
    RocBackup = API_ROLLING_COUNTER;
    do
    {
      Counter  = API_ROLLING_COUNTER;
      Counter -= RocBackup;
    }
    while (Counter < (150000 / API_INT_CYCLE));

    //Ĭ�ϵ�ԴΪ����״̬,��ʼ����Դ״̬
    LVPCnt    = 0;
    LimitCnt  = 0;
    NormalCnt = 0;
    OVPCnt    = 0;

    for (;;)
    {
      Voltage = 0;
      
    #if SYS_POWERED_BY_KL30_ONLY
      Analog_KL30_Voltage_Conversion();
      Voltage = ANALOG_KL30_VOLTAGE;
    #else
      Analog_KL15_Voltage_Conversion();
      Analog_KL30_Voltage_Conversion();
      if (ANALOG_KL15_VOLTAGE > ANALOG_KL30_VOLTAGE)
        Voltage = ANALOG_KL15_VOLTAGE;
      else
        Voltage = ANALOG_KL30_VOLTAGE;
    #endif
      if (NVM_CONFIG_POWER == 1)
      { 
        if (Voltage < 15500)
        {
          LVPCnt++;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage < 17000)
        {
          LVPCnt    = 0;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage >= 32000)
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt = 0;
          OVPCnt++;
        }
        else
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt++;
          OVPCnt    = 0;
        }
      }
      else
      { 
        if (Voltage < 6500)
        {
          LVPCnt++;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage < 9000)
        {
          LVPCnt    = 0;
          LimitCnt++;
          NormalCnt = 0;
          OVPCnt    = 0;
        }
        else if (Voltage >= 18000)
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt = 0;
          OVPCnt++;
        }
        else
        {
          LVPCnt    = 0;
          LimitCnt  = 0;
          NormalCnt++;
          OVPCnt    = 0;
        }
      }
      if (LVPCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_LVP_MODE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_LVP;
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
        return;
      }

      if (LimitCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_LIMIT_MODE;
        SysKL15Signal.Status = SYS_SIG_STAT_INACTIVE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_LIM;
      #if SYS_RUNNING_IN_LIMIT_MODE
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_OFF;
      #else
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
      #endif
        return;
      }

      if (NormalCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_NORMAL_MODE;
        SysKL15Signal.Status = SYS_SIG_STAT_INACTIVE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_RUN;
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_OFF;
        return;
      }

      if (OVPCnt >= 5)
      {
        SysPwrMode.Mode      = SYS_PWR_OVP_MODE;
        SysPowerStatus       = SYS_PWR_STATUS_BIT_OVP;
        SysOperatingStatus   = SYS_OPR_STATUS_BIT_ERR;
        return;
      }
    }
  }
}

/******************************************************************************
��������Sys_ACC_Status_Detect
��  �ܣ�ACC״̬���
��  ������
����ֵ��0 - ACC�ر� 1 - ACC����
******************************************************************************/
uint8_t Sys_ACC_Status_Detect(void)
{
  /* if ((PEPS_PowerModeValidity == 0x02) && (PEPS_PowerMode == 0x01))
    return 1;
  else
    return 0;*/
}
 
/******************************************************************************
��������Sys_Crank_Status_Detect
��  �ܣ�CRANK״̬���
��  ������
����ֵ��0 - CRANK�ر� 1 - CRANK����
******************************************************************************/
uint8_t Sys_Crank_Status_Detect(void)
{
  /* if ((PEPS_PowerModeValidity == 0x02) && (PEPS_PowerMode == 0x04))
    return 1;
  else
    return 0;    */
}