#ifndef _SYSTEM_STATUS_MONITOR_H_
#define _SYSTEM_STATUS_MONITOR_H_

#include "CRG.h"
#include "API.h"
#include "Communication_Over_CAN.h"
#include "Analog_Signal_Conversion.h"
#include "CAN_Communication_Matrix.h"
#include "Non_volatile_Memorys.h"
extern volatile uint8_t SysPowerStatus;
extern volatile uint8_t SysOperatingStatus;

/******************************************************************************
ϵͳ״̬�б�
******************************************************************************/

/*=================================================================================================================================
             ��Դ״̬            |               ����״̬                |                        |
         (SysPowerStatus)        |         (SysOperatingStatus)          |        ϵͳ״̬        |              ˵��
  -------------------------------+---------------------------------------|                        |
    OVP  |  LVP  |  LIM  |  RUN  |  OFF  |  ACC  |  IGN  |  CRK  |  ERR  |                        |
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |   X   |       |       |       |       |       | SYS_PWR_STAT_NORMAL    | ��Դ��ѹ����
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
     X   |   X   |   X   |       |       |       |       |       |       | SYS_PWR_STAT_ABNORMAL  | ��Դ��ѹ�쳣
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |   X   |       |       |       |       |       |       | SYS_PWR_STAT_LIMIT     | ��Դ��ѹ��,���ֹ�������
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |   X   |       |       |       |       |       |       |       | SYS_PWR_STAT_LVP       | ��Դ��ѹ����,��ѹ����״̬
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
     X   |       |       |       |       |       |       |       |       | SYS_PWR_STAT_OVP       | ��Դ��ѹ����,��ѹ����״̬
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
     X   |   X   |       |       |       |       |       |       |       | SYS_PWR_STAT_PROTECT   | ��Դ��ѹ���߻����,����״̬
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |   X   |   X   |       |       |       |       |       | SYS_PWR_STAT_UNPROTECT | �DZ���״̬
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |   X   |   X   |   X   |   X   |       | SYS_OPR_STAT_RUN       | ϵͳ��������
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |       |       |       |       |   X   | SYS_OPR_STAT_HALT      | ϵͳֹͣ����
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |   X   |       |       |       |       | SYS_OPR_STAT_OFF       | ���е�Դ�ر�
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |       |   X   |   X   |       |       | SYS_OPR_STAT_ACC_ON    | ACC��Դ����
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |       |       |   X   |   X   |       | SYS_OPR_STAT_IGN_ON    | IGN��Դ����
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |   X   |   X   |       |       |       | SYS_OPR_STAT_IGN_OFF   | IGN��Դ�ر�
  -------+-------+-------+-------+-------+-------+-------+-------+-------+------------------------+--------------------------------
         |       |       |       |       |       |       |   X   |       | SYS_OPR_STAT_CRANK     | ���������
  ---------------------------------------------------------------------------------------------------------------------------------
  1. ���ڵ�Դ��ѹ�����������з�Χ��,�Ž���[SYS_PWR_STAT_NORMAL]״̬,��������״̬�ͱ���״̬������[SYS_PWR_STAT_ABNORMAL]״̬
  2. [SYS_PWR_STAT_UNPROTECT]״̬������Դ��ѹ����״̬������״̬,��Ե�[SYS_PWR_STAT_PROTECT]״̬�������ѹ����ѹ����״̬
  3. [SYS_OPR_STAT_RUN]״̬�����ǽ��ڵ�Դ��ѹ��������½���,Ҳ�����ǵ�Դ��ѹ����״̬������״̬���ɽ���,��ȡ����ϵͳ����״̬������,
     ��һ״ֱ̬���������ڵ�ǰ������ϵͳ�Ƿ���������,��������ϵͳ������������ʱ,����[SYS_OPR_STAT_HALT]״̬
  4. [SYS_OPR_STAT_OFF]״̬��ӳԿ�״���OFFλ��,��[SYS_OPR_STAT_IGN_OFF]״̬��ͬ����,���ACC״̬��ⱻʹ��ʱ,Կ��ת��ACCλ�ú�,����
     ��[SYS_OPR_STAT_OFF]״̬,����ʱ����IGN��Դδ����[SYS_OPR_STAT_IGN_OFF]״̬����Ч
  5. [SYS_OPR_STAT_RUN]״̬��ָ��Դ��ѹ����,ϵͳ������������,���ǵ�ָIGN������״̬
  6. �����Ҫ��� ACC �� CRANK ״̬,������ϵͳ����״̬��������ʹ����صļ�⹦��
  =================================================================================================================================*/
#define   SYS_PWR_STAT_NORMAL               (SysPowerStatus & 0x01)
#define   SYS_PWR_STAT_ABNORMAL             (SysPowerStatus & 0x0E)
#define   SYS_PWR_STAT_LIMIT                (SysPowerStatus & 0x02)
#define   SYS_PWR_STAT_LVP                  (SysPowerStatus & 0x04)
#define   SYS_PWR_STAT_OVP                  (SysPowerStatus & 0x08)
#define   SYS_PWR_STAT_PROTECT              (SysPowerStatus & 0x0C)
#define   SYS_PWR_STAT_UNPROTECT            (SysPowerStatus & 0x03)

#define   SYS_OPR_STAT_RUN                  (SysOperatingStatus & 0x0F)
#define   SYS_OPR_STAT_HALT                 (SysOperatingStatus & 0x80)
#define   SYS_OPR_STAT_OFF                  (SysOperatingStatus & 0x01)
#define   SYS_OPR_STAT_ACC_ON               (SysOperatingStatus & 0x06)
#define   SYS_OPR_STAT_IGN_ON               (SysOperatingStatus & 0x0C)
#define   SYS_OPR_STAT_IGN_OFF              (SysOperatingStatus & 0x03)
#define   SYS_OPR_STAT_CRANK                (SysOperatingStatus & 0x08)

/******************************************************************************
ϵͳ״̬����ģʽ
******************************************************************************/
#define   SYS_STAT_UPDATE_MODE_NORMAL       0x00
#define   SYS_STAT_UPDATE_MODE_WAKEUP       0x01
#define   SYS_STAT_UPDATE_MODE_RECOVERY     0x02
#define   SYS_STAT_UPDATE_MODE_INIT         0x03

/******************************************************************************
��Դ״̬λ����
******************************************************************************/

/*====================================================================
     Bit 0   | SYS_PWR_STATUS_BIT_RUN | ��������״̬
  -----------+------------------------+-------------------------------
     Bit 1   | SYS_PWR_STATUS_BIT_LIM | ��ѹ��,���޵�Դ״̬
  -----------+------------------------+-------------------------------
     Bit 2   | SYS_PWR_STATUS_BIT_LVP | ��ѹ����״̬
  -----------+------------------------+-------------------------------
     Bit 3   | SYS_PWR_STATUS_BIT_OVP | ��ѹ����״̬
  -----------+------------------------+-------------------------------
   Bit 4 - 7 | RSVD.                  | ����λ
  ====================================================================*/

#define   SYS_PWR_STATUS_BIT_RUN            0x01
#define   SYS_PWR_STATUS_BIT_LIM            0x02
#define   SYS_PWR_STATUS_BIT_LVP            0x04
#define   SYS_PWR_STATUS_BIT_OVP            0x08

/******************************************************************************
��Դģʽ
******************************************************************************/
#define   SYS_PWR_NORMAL_MODE               0x00
#define   SYS_PWR_LVP_MODE                  0x01
#define   SYS_PWR_LIMIT_MODE                0x02
#define   SYS_PWR_OVP_MODE                  0x03

/******************************************************************************
��Դ״̬����
******************************************************************************/
/*#if (Power_Mod == Power_Version_24)
#define   SYS_LVP_ENTER_THRESHOLD           15500      //�����ѹ������ֵ  6500
#define   SYS_LVP_EXIT_THRESHOLD            16000      //�˳���ѹ������ֵ  7000

#define   SYS_LIMIT_ENTER_THRESHOLD         17000      //ϵͳ��ѹ�ر���ֵ
#define   SYS_LIMIT_EXIT_THRESHOLD          18000      //ϵͳ����������ֵ

#define   SYS_OVP_EXIT_THRESHOLD            32200     //�˳���ѹ������ֵ   17500
#define   SYS_OVP_ENTER_THRESHOLD           32000     //�����ѹ������ֵ

#else
#define   SYS_LVP_ENTER_THRESHOLD           6500      //�����ѹ������ֵ  6500
#define   SYS_LVP_EXIT_THRESHOLD            7000      //�˳���ѹ������ֵ  7000

#define   SYS_LIMIT_ENTER_THRESHOLD         9000      //ϵͳ��ѹ�ر���ֵ
#define   SYS_LIMIT_EXIT_THRESHOLD          9500      //ϵͳ����������ֵ

#define   SYS_OVP_EXIT_THRESHOLD            18200     //�˳���ѹ������ֵ   17500
#define   SYS_OVP_ENTER_THRESHOLD           18000     //�����ѹ������ֵ
#endif
*/
#define   SYS_PWR_DEBOUNCE_TIME              2000     //��Դ״̬����ʱ��(ms)

#define   SYS_POWERED_BY_KL30_ONLY            0       //0 - KL15 �� KL30 ͬʱ���ڹ���
//1 - ���� KL30 ����

/******************************************************************************
�ź�״̬
******************************************************************************/
#define   SYS_SIG_STAT_INACTIVE             0x00
#define   SYS_SIG_STAT_ACTIVE               0x01

/******************************************************************************
����״̬λ����
******************************************************************************/

/*====================================================================
     Bit 0   | SYS_OPR_STATUS_BIT_OFF | ���е�Դ�ر�
  -----------+------------------------+-------------------------------
     Bit 1   | SYS_OPR_STATUS_BIT_ACC | ACC��Դ����
  -----------+------------------------+-------------------------------
     Bit 2   | SYS_OPR_STATUS_BIT_IGN | IGN��Դ����
  -----------+------------------------+-------------------------------
     Bit 3   | SYS_OPR_STATUS_BIT_CRK | ���������
  -----------+------------------------+-------------------------------
   Bit 4 - 6 | RSVD.                  | ����λ
  -----------+------------------------+-------------------------------
     Bit 7   | SYS_OPR_STATUS_BIT_ERR | ����״̬����(����,��Դ��ѹ�쳣)
  ====================================================================*/

#define   SYS_OPR_STATUS_BIT_OFF            0x01
#define   SYS_OPR_STATUS_BIT_ACC            0x02
#define   SYS_OPR_STATUS_BIT_IGN            0x04
#define   SYS_OPR_STATUS_BIT_CRK            0x08
#define   SYS_OPR_STATUS_BIT_ERR            0x80

/******************************************************************************
����״̬����
******************************************************************************/
#define   SYS_OFF_THRESHOLD                 5500      //��Դ(KL15)�ر���ֵ
#define   SYS_ON_THRESHOLD                  6000      //��Դ(KL15)������ֵ

#define   SYS_OPR_DEBOUNCE_TIME             120       //����״̬�������ʱ��(ms)

#define   SYS_RUNNING_IN_LIMIT_MODE         1         //��Դ����ģʽ�³�������
#define   SYS_ACC_MODE_DET_ENABLE           0         //ACCģʽ���ʹ��(IGN OFFʱ)
#define   SYS_CRANK_MODE_DET_ENABLE         0         //CRANKģʽ���ʹ��

/******************************************************************************
��Դģʽ��ؽṹ����
******************************************************************************/
typedef struct
{
  uint8_t   Mode;
  uint8_t   LVPTimer;
  uint8_t   LimitTimer;
  uint8_t   NormalTimer;
  uint8_t   OVPTimer;
} SysPwrModeStruct;

/******************************************************************************
�ź�״̬���ṹ����
******************************************************************************/
typedef struct
{
  uint8_t   Status;
  uint8_t   Timer;
} SysSignalStatusStruct;

/******************************************************************************
��������
******************************************************************************/
void Sys_Status_Init(void);
void Sys_Status_Update_Mode_Set(uint8_t Mode);
void Sys_Status_Update_Service(void);

uint8_t Sys_ACC_Status_Detect(void);
uint8_t Sys_Crank_Status_Detect(void);

#endif