/*
 * @Description:
 * @Author: yangsw
 * @Date: 2022-06-24 16:55:07
 * @LastEditTime: 2022-08-17 15:58:28
 * @LastEditors: 002389 yangsw@lierda.com
 * @Reference:
 */
#ifndef H_SVC_PULSE_H
#define H_SVC_PULSE_H

#include "../bsp/bsp_pulse_uart.h"

#define MEASURE_CNT 3
#define MEASURE_TIME_MAX_DIFF 300

#define MAX_QUERY_NUM 20 // 最大查询天数/月数

#define PLUSE_FLOW_ROTATE_FORWARD 1
#define PLUSE_FLOW_ROTATE_REVERSAL 2

#define HIGHT_TEMP_THRESHOLD 5000     //高温报警阈值   
#define LOW_TEMP_THRESHOLD   0      //低温报警阈值

typedef enum
{
    E_Pulse_Mode_Normal = 0x00,      // 正常测量模式
    E_Pulse_Mode_Usage = 0x01,       // 累计流量模式
    E_Pulse_Mode_Calculte = 0x02,    // 流量计算模式
    E_Pulse_Mode_Calibra = 0x03,     // 流量校准模式
    E_Pulse_Mode_Sleep = 0x04,       // 休眠模式
    E_Pulse_Mode_Zerocorrect = 0x05, // 零流量校准模式
} E_Pulse_Mode;

typedef struct
{
    gw_u8 pu8Query_StartDay[3]; // 查询起始时间
    gw_u8 u8Query_DayNum;
    gw_u8 pu8Day_Usage[MAX_QUERY_NUM];
} S_Pulse_Day_History;

typedef struct
{
    gw_u8 pu8Query_StartMonth[2];
    gw_u8 u8Query_MonthNum;
    gw_u8 puMonth_Usage[MAX_QUERY_NUM];
} S_Pulse_Month_History;

typedef struct
{
    /*模块工作模式*/
    E_Pulse_Mode ePulseMode;
    /*设备ID*/
    gw_u8 pu8Pulse_Devic_Id[4];
    /*制造商ID*/
    gw_u8 pu8Pulse_Manufac_Id[4];
    /*设备类型*/
    gw_u8 u8Pulse_Devic_Type;
    /*软件版本*/
    gw_u16 u16Pulse_Sw_Ver;
    /*硬件版本*/
    gw_u16 u16Pulse_Hw_Ver;
    /*管段代码*/
    gw_u8 u8PipeMode;
    /*声路总长 0.1mm*/
    gw_u16 u16SonicLength;
    /*有效声路长度 0.1mm*/
    gw_u16 u16ActiveSonicLength;
    /*有效内径 0.1mm*/
    gw_u16 u16Diameter;
    /*始动流速 0.001L/h*/
    gw_u16 u16SatrtSpeed;
    /*通信波特率*/
    gw_u16 u16Baudrate;
    /*运行时间*/
    gw_u32 u32Runtime;
    /*零点参数*/
    gw_u32 u32ZeroPara;
    /*零点测试模式 0x01：进入，0x00：退出*/
    gw_u8 u8ZeroModeEn;
    /*日志开关 0x01：开启，0x00：关闭*/
    gw_u8 u8DebugEn;
    /*修正点个数*/
    gw_u8 u8CorrPointNum;
    /*流量点A-G 扩大了1000，单位ml/h，系数A-G，扩大1000000*/
    gw_s32 s32CorrPoint[7][2];
    S_Pulse_Day_History s_pulse_day_history;
    S_Pulse_Month_History s_pulse_month_history;
} S_Pulse_Para;

typedef struct
{
    /*异常大流持续流量*/
    gw_s32 s32LargeFlow;
    /*三次正常才清除大流*/
    gw_u8 u8LargeCnt;
    /*异常小流持续流量*/
    gw_s32 s32SmallFlow;
    /*三次正常才清除大流*/
    gw_u8 u8SmallCnt;
    /*异常反流持续流量*/
    gw_s32 s32NegFlow;
    /*三次正常才清除大流*/
    gw_u8 u8NegCnt;
    /*空管次数*/
    gw_u8 u8EmptyCnt;
    /*非空管次数*/
    gw_u8 u8UnEmptyCnt;
} S_Err_Flow;

typedef struct
{
    /*瞬时流速，单位：L/h*/
    gw_s32 s32Flow;
    /*累计正流量，单位：L*/
    gw_u32 u32Usage;
    /*累计负流量，单位：L*/
    gw_u32 u32UsageRe;
    /*高精度累计流量，单位：mL*/
    gw_s32 s32Usage_mL;
    /*高精度瞬时流速，单位：0.001L/h*/
    gw_s32 s32Flow_mL;
    /*水温，单位：0.01℃*/
    gw_s16 s16WaterTemp;
    /*飞行时间差*/
    gw_u32 s32TimeDiffC;
    /*测量时间间隔，单位s*/
    gw_u8 u8TimeMeasureCnt;
    /*告警*/
    gw_u8 u8PulseAlarm;
    /*高精度校准流量，单位：mL*/
    gw_s32 s32CalibraUsage;
    /*流量方向，1正向，-1反向，0静水*/
    gw_s8 s8FlowDir;
    /*上位机设置表读数*/
    gw_u32 u32BaseUsage;
    S_Pulse_Para s_pulse_para;
    S_Err_Flow s_err_flow;
} S_Pulse;

#define PIPE_LEN 0.055         // 上下游换能器的距离，单位m
#define PIPE_CROSS_AREA 94.625 // 管段横截面积，单位mm^2

void Svc_Pulse_Init(void);
S_Pulse *Svc_Pulse_Get_Data(void);
void Svc_Pulse_Timer_1s_Callback(void);
void Svc_Pulse_Flow_Check(S_Pulse *ps_pulse_data);
void Svc_Pulse_Usage_Record(S_Pulse *ps_pulse_data);
void Svc_Pulse_Alarm_Record(S_Pulse *ps_pulse_data);
gw_u16 Svc_Pulse_Get_WaterTemp(void);
void Svc_Pulse_Temp_Check(S_Pulse *ps_pulse_data);
#endif