/*
 * @Description: 
 * @Author: yangsw
 * @Date: 2022-06-24 16:55:07
 * @LastEditTime: 2023-11-22 09:41:01
 * @LastEditors: LiDa
 * @Reference: 
 */
#ifndef H_SVC_PULSE_H
#define H_SVC_PULSE_H

#include "pulse/bsp/bsp_pulse.h"

#define  PLUSE_FLOW_ROTATE_FORWARD      1
#define  PLUSE_FLOW_ROTATE_REVERSAL     2
//单位：ms
#define  PLUSE_LOW_TIME_MIN         		35//59<<<<<<<<<<<<22.2.8yess
#define  PLUSE_LOW_TIME_MAX         		80
#define  PLUSE_NEG_LOW_TIME_MIN         100//123<<<<<<<<<<<<22.2.8yess
#define  PLUSE_NEG_LOW_TIME_MAX         140

//单位：L
//#define  PLUSE_EQU         	           1

//公称口径      Q3/Q1        Q2/Q1      Q3（m3/h）   Q4（m3/h）     
//DN15          ≥100        =1.6        2.5         Q3*1.25
//DN20          ≥100        =1.6        4.0         Q3*1.25
//DN25          ≥100        =1.6        6.3         Q3*1.25

#define DN15            1
#ifdef DN15
    #define PLUSE_LARGE_ALARM_FLOW       3125    //2.5*1.25*1000
    #define PLUSE_NEG_ALARM_FLOW         40
    #define MAX_USAGE_5MIN               261
    #define MAX_USAGE_30MIN              1563
#elif  DN20
    #define PLUSE_LARGE_ALARM_FLOW       5000    //4*1.25*1000
    #define PLUSE_NEG_ALARM_FLOW         64    
    #define MAX_USAGE_5MIN               417
    #define MAX_USAGE_30MIN              2500
#elif  DN25
    #define PLUSE_LARGE_ALARM_FLOW      7875    //4*1.25*1000
    #define PLUSE_NEG_ALARM_FLOW        126   
    #define MAX_USAGE_5MIN              657
    #define MAX_USAGE_30MIN             3938
#endif

#define Pulse_Flow_Max_Numb              20
typedef enum{
    /*没有错误*/
    E_PULSE_NO_ERR=0, 
    /*脉宽错误*/
    E_PULSE_WIDTH_ERR=1, 
		/*缺下降沿*/
		E_PULSE_LOST_Falling_ERR=2,  
		/*缺上升沿*/
		E_PULSE_LOST_Rising_ERR=3,
}E_Pulse_Err_State;

typedef struct
{
    /*流速，单位：1L/h*/
    gw_u32 u32QusmLH;
    /*流量方向*/
    gw_u8 u8FLowDir;
    /*脉冲宽度*/
    gw_u32 PulseWidth;
    /*脉冲当量*/
    gw_u16 PulseEqu;
} SR_PULSE_FLOW_T;

typedef struct{       
    /*不过流的最小脉冲间隔时间*/ 
    gw_u16 u16LargePulseMinCycleTime;  
		/*不返流的最小脉冲间隔时间*/ 
    gw_u16 u16NegPulseMinCycleTime;  
    /*大流持续时间计时开始*/ 
    gw_u8  u8StartLargeFLowTimeEnable;
    /*返流持续时间计时开始*/ 
    gw_u8  u8StartNegFLowTimeEnable;
    /*大流已持续时间，单位：s*/ 
    gw_u32 u32LargeFLowTime;   
    /*反流已持续时间，单位：s*/  
    gw_u32 u32NegFLowTime;       
    /*正向用气量，单位：L，计算*/
    //gw_u32 u32PosUsageFLow;     
    /*反向用气量，单位：L    */   
    //gw_u32 u32NegUsageFLow;      
    /*大流开始时间，单位：s*/ 
    gw_u32  u32LargeFLowStartTime;
    /*返流开始时间，单位：s*/ 
    gw_u32  u32NegFLowStartTime;
    /*最大流量，单位：L*/ 
    gw_u16 u16LargeFLowMax;  
    /*最大返流量，单位：L*/ 
    gw_u16 u16NegFLowMax;  
		/*新流量产生*/ 
    E_Result_Check  PulseDetState;  
		
		E_Pulse_Err_State PulseErrState;
      
    //触发顺序标志：先下降沿中断，然后上升沿中断
    gw_u8  u8Edge_First; 
    //脉冲低电平计时
    gw_u8  u8PulseLowTime;     
    /*上升沿时间戳ms*/  
    gw_u32 u16Risingms;       
    /*下降沿时间戳ms*/
    gw_u32 u16Fallingms;   
    /*当前脉冲的时间*/
    //gw_u32 u32NowTime;        
    /*当前脉冲的时间ms*/
    gw_u16 u16NowTimeMs;       
    /*上一个脉冲的时间*/
    //gw_u32 u32LastTime;       
    /*上一个脉冲的时间ms*/   
    gw_u16 u16LastTimeMs;   		
    //脉冲周期计时
    gw_u32 u32PulseCycleTime;   		
		//错误脉冲宽度
	gw_u32 PulseWidthErr; 		
		/*上一次流量方向*/ 
    gw_u8  u8FLowDirLast;    
		/*新流量产生*/  	
		/*读取位置*/  
	gw_u8 rear;     
		/*写入位置*/  
	gw_u8 fornt;	 
		/*流量数组*/
	SR_PULSE_FLOW_T Pulse_Flow[Pulse_Flow_Max_Numb];
    //lida add
  gw_u8 u8second;
  gw_u8 u32subsecondbuf;
  gw_u32 u32subsecond;
  gw_u8 u8lastsecond;
  gw_u8 exti_wakeFlag;
}S_Pulse; 

#define MAX_ERRORCNT  10
typedef struct{
  gw_u16 u16error_risingTime;
  gw_u16 u16error_FallingTime;   
	/*下降沿丢失错误计数*/  		
  gw_u16 u16perror_count;
  gw_u16 u16perror_subcount;
  // gw_u16 u16perror_sencount;
	/*脉宽错误计数*/   
  gw_u16 u16perror_pulsecount; 
  gw_u16 u16perror_width[MAX_ERRORCNT];
  gw_u16 u16perror_FallTime[MAX_ERRORCNT];
  gw_u16 u16perror_RiseTime[MAX_ERRORCNT];    

  gw_u16 u16perror_subsecond[MAX_ERRORCNT];
  gw_u16 u16perror_second[MAX_ERRORCNT]; 

}S_Pulse_ErrorCheck; 

S_Pulse_ErrorCheck* Svc_Pulse_ErrorCheck_GetData(void);

gw_u8 Svc_Pulse_Get_Low_Time (void);

gw_u32 Svc_Pulse_Get_Cycle_Time (void);

void Svc_Pulse_Clear_Cycle_Time (void);

void Svc_Pulse_Low_Start_Time (void);
void Svc_Pulse_Low_Stop_Time (void);
void Svc_Pulse_Low_Time (void);
void Svc_Pulse_Start_Neg_FLow_Time (void);
void Svc_Pulse_Stop_Neg_FLow_Time (void);
void Svc_Pulse_Start_Large_FLow_Time (void);
void Svc_Pulse_Stop_Large_FLow_Time (void);

void Svc_Pulse_Init(void);
void Svc_Pulse_Var_Init(void);
void Svc_Pulse_Refresh_Time (gw_u32 * u32TimeS,gw_u16 * u16TimeMs);
gw_u32 Svc_Pulse_Refresh_TimeMs (void);
void Svc_Pulse_Update_Flow_Usage(SR_PULSE_FLOW_T *FlowData);

void Svc_Pulse_Timer_Callback (void); 
void Svc_Pulse_Flow_Timer_Callback (void);
gw_u8 Svc_Pluse_Det(void);
static void Svc_Pulse_Flow_Check(void);

S_Pulse Svc_Pulse_Get_Info(void);
void Svc_Pulse_Deal(void);
E_Result_Check Svc_Pulse_Is_Busy(void);
void Svc_Pulse_Set_Cur_State(E_Result_Check pulse_state);
void Svc_Pulse_Set_Error_State(E_Pulse_Err_State pulse_state);
void Svc_Pulse_Error_State_Printf(void);
void Svc_Pulse_GetN(void);
void Svc_Pulse_Core_Reset(void);
void Svc_Pulse_Clear_Run_State(void);
void Svc_Pulse_Clear_Calibrate_State(void);
void Svc_Exti10_15_Set_Flag(void);
gw_u8 Svc_Exti10_15_Check_Flag_State(void);
void Svc_Exti10_15_Clear_Flag(void);

#endif