#ifndef H_SVC_LCD_H
#define H_SVC_LCD_H

#include "../bsp/bsp_lcd.h"

#define NormalListNum           (E_Lcd_Display_Err_12 + 1)
#define NoOperationCnt 6 // 无操作倒计时
#define RefreshTime 2    // 单位s，刷新时间，每 RefreshTime 秒刷新屏幕，防止重复刷新屏幕导致闪屏

#define WAIT_REFRESH_TIME       6//等待刷新计数

#define Lcd_Err_Num 13  //错误代码数量

typedef enum
{
    E_Lcd_Display_Usage = 0,            // 累计用量
    E_Lcd_Display_Flow,                 // 流速
    E_Lcd_Display_Temp,                 // 温度
    E_Lcd_Display_timediff,             // 时差
    E_Lcd_Display_SN1,                  // 表号1
    E_Lcd_Display_SN2,                  // 表号2
    E_Lcd_Display_Date,                 // 日期
    E_Lcd_Display_Time,                 // 时间
    E_Lcd_Display_Vol,                  // 电池电压
    E_Lcd_Display_Err_0,                // 错误代码 - 电量低
    E_Lcd_Display_Err_1,                // 错误代码 - 电量不足
    E_Lcd_Display_Err_2,                // 错误代码 - 反流
    E_Lcd_Display_Err_3,                // 错误代码 - 存储异常
    E_Lcd_Display_Err_4,                // 错误代码 - 大流
    E_Lcd_Display_Err_5,                // 错误代码 - 小流
    E_Lcd_Display_Err_6,                // 错误代码 - 高温
    E_Lcd_Display_Err_7,                // 错误代码 - 低温
    E_Lcd_Display_Err_8,                // 错误代码 - 掉电
    E_Lcd_Display_Err_9,                // 错误代码 - 空管
    E_Lcd_Display_Err_10,               // 错误代码 - 时间芯片异常
    E_Lcd_Display_Err_11,               // 错误代码 - 温度传感器异常
    E_Lcd_Display_Err_12,               // 错误代码 - 按键异常
} E_Lcd_Display;

extern E_Lcd_Display Normal_List[];
extern E_Lcd_Display Delivery_List[];
extern E_Lcd_Display Calibration_List[];

typedef enum
{
    E_Lcd_Err_Power_Low     = ((gw_u32)1 << 1),     // 电量低
    E_Lcd_Err_Power_Solow   = ((gw_u32)1 << 2),     // 电量不足
    E_Lcd_Reveres_Flow      = ((gw_u32)1 << 3),     // 反流
    E_Lcd_Save_Abn          = ((gw_u32)1 << 4),     // 存储异常
    E_Lcd_Large_Flow        = ((gw_u32)1 << 5),     // 超流异常
    E_Lcd_Small_Flow        = ((gw_u32)1 << 6),     // 微小流量
    E_Lcd_Temp_Hight        = ((gw_u32)1 << 7),     // 高温
    E_Lcd_Temp_Low          = ((gw_u32)1 << 8),     // 低温
    E_Lcd_Power_Down        = ((gw_u32)1 << 9),     // 掉电
    E_Lcd_Blank_Pipe        = ((gw_u32)1 << 10),     // 空管
    E_Lcd_Time_Chip         = ((gw_u32)1 << 11),     // 时间芯片异常
    E_Lcd_Temp_Sensor       = ((gw_u32)1 << 12),     // 温度传感器异常
    E_Lcd_Key_Abn           = ((gw_u32)1 << 13),     //按键
} E_Lcd_Err; // lcd显示错误代码类型

typedef enum
{
    E_Lcd_NONE = 1, // 上告类型
    E_Lcd_Pd_SUCC,  // 开机成功
    E_Lcd_Pd_FAIL,  // 开机失败
    E_Lcd_RSRP,     // 信号强度
    E_Lcd_CrG_SUC,  // 搜索网络成功
    E_Lcd_CrG_FAIL, // 搜索网络失败
    E_Lcd_CGt_SUC,  // 网络附着成功
    E_Lcd_CGt_FAIL, // 网络附着失败
    E_Lcd_CN_SUCC,  // 连接成功
    E_Lcd_CN_FAIL,  // 连接失败
    E_Lcd_UP_SUCC,  // 上告成功
    E_Lcd_UP_FAIL,  // 上告失败
} E_Lcd_Comm;       // lcd显示通讯过程

typedef struct
{
    gw_u8 u8SwitchTimeCnt; // 轮显切换时间计数
    gw_u8 u8NorIndex;      // 轮显（界面）当前索引
    gw_u8 u8DelIndex;      // 轮显（界面）当前索引
    gw_u8 u8CalIndex;      // 轮显（界面）当前索引
    gw_u8 u8RsrpIndex;     // 信号符号索引
    gw_u16 u16RsrpTimeCnt; // 信号符号闪烁计数
    gw_u32 u32Err;         // 需显示的错误码
    gw_u8 u8State;         // 0-处于息屏状态  1-显屏
    gw_u8 u8NoOpsCnt;      // 无操作计数
} S_Lcd;

#define Svc_Lcd_Display_All() Bsp_Lcd_Display_All() //全显
#define Svc_Lcd_Display_Clear_Num() Bsp_Lcd_Display_Clear_Num() //清数字区

S_Lcd *Svc_Lcd_Get_Data(void);
void Svc_Lcd_Init_Config(void);
void Svc_Lcd_Init(void);
void Svc_Lcd_Rest_Screen(void);
void Svc_Lcd_Cnt_Deal(void);
void Svc_Lcd_Into_Lp_Deal(void);
void Svc_Lcd_NoOpsCnt_Set(void);
void Svc_Lcd_Set_Index(gw_u8 u8Index);
void Svc_Lcd_Set_WaitTime(gw_u16 u16Time);
void Svc_Lcd_Display_Const_Symbol(void);
void Svc_Lcd_Display_Err(gw_u8 u8Err);
void Svc_Lcd_Display_Ver(void);
void Svc_Lcd_Display_Bat(void);
void Svc_Lcd_Display_Usage(gw_u32 u32Usage);
void Svc_Lcd_Display_Temp(gw_s16 s16Temp);
void Svc_Lcd_Display_Meter_Number(gw_u8 u8Index);
void Svc_Lcd_Display_Date(gw_u8 u8Time[]);
void Svc_Lcd_Display_Time(gw_u8 u8Time[]);
void Svc_Lcd_Display_Battery_Vol(gw_u16 u16Vol);
void Svc_Lcd_Display_Bat(void);
void Svc_Lcd_Display_Time_Diff(gw_s32 s32timediff);
void Svc_Lcd_Display_Clear_All(void);
void Lcd_Display(E_Lcd_Display e_lcd_display);

void Svc_Lcd_Display_Set_Err(E_Lcd_Err e_err);
void Svc_Lcd_Display_Clear_Err(E_Lcd_Err e_err);
void Svc_Lcd_Display_Upload_Reason(gw_u8 u8e_up, gw_u16 u16Time);
void Svc_Lcd_Display_Comm_Process(E_Lcd_Comm e_comm, gw_u16 u16Time);
void Svc_Lcd_Display_OTA_Process(gw_u16 u16Num);
void Svc_Lcd_Switch_Display(void);
void Svc_Lcd_Refresh_Now(void);
void Svc_Lcd_Display_RSRP_Level(void);
void Svc_Lcd_Display_Signal_Blink(void);
void Svc_Lcd_Signal_Blink_Ctn(void);
void Svc_Lcd_Display_EnUpdata(void);
void Svc_Lcd_Display_EnIr(void);

#endif