#ifndef SYSTEM_MONITOR_H
#define SYSTEM_MONITOR_H

#include "System_Monitor.h"
#include "TYW_stdint.h"


typedef struct
{
    uint8_t SumCnt;
    uint16_t DebounceTimer;
    uint32_t ActVoltage;
    uint8_t FinalSts;
    uint8_t ActSts;
} MonitorStruct;


/*
     0 ----1st-------6500   不可运行   1
  6500 ----2st-------7000   回差段     2

  7000 ----3st-------9000   低压段     3
  9000 ----4st-------9500   回差段     4
  9500-----5st------16000   正常段     5
  16000----6st------16500   回差段     6

  16500----7st------18000   高压段     7
  18000----8st------18500   回差段     8
  18500----9st------65535   高压段     9

    0-----6.5   不可运行--ALL----------限制
  6.5-----9     除电机外均可运行--------正常
    9-----16.5  均可运行---------------正常
 16.5-----18.5  只有CAN可运行----------限制
 18.8-----65535 不可运行--ALL----------限制

6.5-18.5  CAN 可运行区间

*/



/*电源运行状态*/
#define   SYS_OPR_STAT_RUN           ((System_FUN_KL30_Status_Get() > 1u)&&(System_FUN_KL30_Status_Get() < 7u ))
#define   SYS_OPR_STAT_HALT          ((System_FUN_KL30_Status_Get() == 1u) || (System_FUN_KL30_Status_Get() >= 7u))

#define   SYS_OPR_STAT_LIM_LVP       (System_FUN_KL30_Status_Get() == 1U)
#define   SYS_OPR_STAT_LIM_OVP       (System_FUN_KL30_Status_Get() >= 7u)

/*仪表工作状态*/
#define   SYS_OPR_STAT_IGN_ON        (System_FUN_KL15_Status_Get() == 1U)
#define   SYS_OPR_STAT_IGN_OFF       (System_FUN_KL15_Status_Get() == 0U)


/*网络管理电源工作状态*/
#define   SYS_OPR_STAT_IGN_ON_NM     (System_NM_KL15_Status_Get() == 1U)
#define   SYS_OPR_STAT_IGN_OFF_NM    (System_NM_KL15_Status_Get() == 0U)

/*网络管理电源运行状态*/
#define   SYS_OPR_STAT_RUN_NM        ((System_NM_KL30_Status_Get() > 1u) && (System_NM_KL30_Status_Get() < 9u ))
#define   SYS_OPR_STAT_HALT_NM       ((System_NM_KL30_Status_Get() == 9u) || (System_NM_KL30_Status_Get() == 1u))


static uint8_t System_Calc_FunRange(uint16_t u16Vol);
static uint8_t System_Calc_NMRange(uint16_t u16Vol);

uint8_t Read_KL30_ConvertFinish(void);

static void System_Fun_Process(void);
static void System_NM_Process(void);
void Sys_LogicProcess(void);
void Sys_Status_Update_Service ( void );

uint16_t Sys_Read_KL30_Voltage(void);
uint16_t Sys_Read_KL15_Voltage(void);
uint8_t Sys_Read_KL30_Valid(void);
uint8_t Sys_Read_KL15_Valid(void);

uint16_t Sys_Force_Read_KL30_Voltage(void);
uint16_t Sys_Force_Read_KL15_Voltage(void);

uint8_t System_FUN_KL30_Status_Get(void);
uint8_t System_FUN_KL15_Status_Get(void);
uint8_t System_NM_KL15_Status_Get(void);
uint8_t System_NM_KL30_Status_Get(void);

uint8_t System_LINE_KL15(void);

void Sys_Set_DebounceTimer(uint16_t u16NMKL30, uint16_t u16NMKL15, uint16_t u16FUNKL30, uint16_t u16FUNKL15);
/*void Sys_Set_VolRange(uint16_t FUN_Vol[], uint16_t NM_Vol[]);*/
void Sys_Set_VolRange(const uint16_t FUN_Vol[], const uint16_t  NM_Vol[]);
void System_Monitor_KL30Init(void);
void System_Monitor_WakeupInit(void);
void System_Fast_WakeUp(void);

void Sys_KL30_Init (void);
void Sys_WakeUp_Init (void);
void Sys_BlockDelay(uint32_t u32Ms);

void Sys_Rolling(void);
void Sys_RollingClear(void);
uint32_t Sys_Get_ms_Rolling_Counter(void);

#endif