#ifndef USER_DISPLAY_PRESENT
#define USER_DISPLAY_PRESENT

#include "type.h"

typedef enum {UNIT_INH2O, UNIT_KPA, UNIT_MMH2O} TDiffUnit;
typedef enum {UNIT_MPA} TPresUnit;
typedef enum {UNIT_C} TTempUnit;
typedef enum {UNIT_PA} TVacuUnit;
typedef enum {SOURCE_LNG, SOURCE_O2, SOURCE_N2, SOURCE_AR, SOURCE_CO2, 
	SOURCE_H2, SOURCE_CNG, SOURCE_HE, SOURCE_C2H4, SOURCE_LPG, SOURCE_NH3,
	SOURCE_PENT, SOURCE_POPO} TDispSource; // 戊烷，聚醚多元醇

// 显示一个8段码
// pos: Fld1为0~4（从左到右，真值表1~5)
void Disp_DispChar(u8 pos, char c);
	
// 显示差压（液位）数据
void Disp_Fld1Text(s8 *text);
// 显示小数点
void Disp_Fld1PointOn(u8 pos);
void Disp_Fld1PointOff();

// 显示单位切换
void Disp_SwitchDiffUnit(TDiffUnit unit);
void Disp_SwitchPresUnit(TPresUnit unit);
void Disp_SwitchTempUnit(TTempUnit unit);
void Disp_SwitchVacuUnit(TVacuUnit unit);	
void Disp_Fld1UnitOff();

// 显示通道切换
void Disp_ChannelOn(uint8_t channel);
void Disp_ChannelOff();
	
// 显示液源
void Disp_SwitchSource(TDispSource src);

// 写指针数据
void Disp_WriteNeedle(u8 val);
// 写电量数据
void Disp_WriteBattery(u8 val);
// 写信号强度
void Disp_WriteStrength(u8 val);
// 写通讯状态（是否发送数据）
void Disp_WriteCommunication(u8 val);
// 写告警状态
void Disp_WriteAlarm(u8 val);
// 写错误状态
void Disp_WriteError(u8 val);
// 写充装状态
void Disp_WriteFill(u8 val);
// 写充电状态
void Disp_WritePower(u8 val);
// 写RF状态
void Disp_WriteRF(u8 val);
// 写GPS状态
void Disp_WriteGPS(u8 val);

// 清屏
void Disp_Clear();

// 设置闪烁
void Disp_SetBlinkVisible(u8 visible);
void Disp_Fld1Blink(u8 blink);
void Disp_BatteryBlink(u8 blink);
// ********************************************
// 以下为窗口界面实现
// ********************************************

// 设置焦点显示
void Disp_SetCursor(u8 pos, u8 width);
void Disp_ClearCursor();

// 选择框函数
typedef struct
{
	u8		pos;		// 显示位置（0~3，0为差压显示最左边，3位差压显示最右边）
	u8		width;		// 显示位数
	u8		count;		// 选项个数（最多10个可选项）
	u8		idx;		// 当前选项
	u8		read_only;	// 只读
	u8		hide;		// 隐藏
	char	items[13][5];	// 可选项内容（每个可选项最长4个字符）
} TSelectBox;

// 刷新显示
void SelectBox_Refresh(TSelectBox *pBox);
// 创建选择框
void SelectBox_Create(TSelectBox *pBox, u8 pos, u8 width, u8 count, const char items[][5], u8 idx);
// 设置只读属性
void SelectBox_ReadOnly(TSelectBox *pBox);
// 设置隐藏属性
void SelectBox_Hide(TSelectBox *pBox);
// 选择框处理按键
u8 SelectBox_OnKey(TSelectBox *pBox, u8 key);
// 选择框获得焦点
void SelectBox_SetFocus(TSelectBox *pBox);

// 编辑框函数
typedef struct
{
	u8 pos;			// 显示位置
	u8 width;		// 显示位数
	u8 len;			// 编辑数据长度（如len>width，则需向左滚动才能输入完整的数据）
	u8 left_idx;	// 编辑框最左位的数据idx
	u8 curr_idx;	// 光标所在数据idx
	u8	read_only;	// 只读
	u8		hide;	// 隐藏
	char text[20];	// 编辑内容
} TEditBox;

// 刷新显示
void EditBox_Refresh(TEditBox *pEdit);
// 创建编辑框
void EditBox_Create(TEditBox *pEdit, u8 pos, u8 width, u8 len, char *text);
// 设置只读属性
void EditBox_ReadOnly(TEditBox *pEdit);
// 设置隐藏属性
void EditBox_Hide(TEditBox *pEdit);
// 编辑框处理按键
u8 EditBox_OnKey(TEditBox *pEdit, u8 key);
// 编辑框获得焦点
void EditBox_SetFocus(TEditBox *pEdit);

// 按钮函数
typedef struct
{
	u8		pos;			// 显示位置
	u8		width;			// 显示位数
	u8		hide;			// 隐藏
	char	caption[5];		// 标题
} TButton;

// 刷新显示
void Button_Refresh(TButton *pButton);
// 创建按钮
void Button_Create(TButton *pButton, u8 pos, u8 width, char *caption);
// 设置隐藏属性
void Button_Hide(TButton *pButton);
// 按钮处理按键
u8 Button_OnKey(TButton *pButton, u8 key);
// 按钮获得焦点
void Button_SetFocus(TButton *pButton);

#endif
