#include "includes.h"

// 多路滚动显示序号
volatile uint8_t Form_rollIdx = 0;

// 窗口ID
typedef enum 
{
	FORM_ID_START, 	// 启动界面
	FORM_ID_METER,	// 表盘显示
	FORM_ID_PWD,	// 输密码界面
	FORM_ID_000, 	// 主菜单
	FORM_ID_100, 	// PSN设置
	FORM_ID_200, 	// 储罐信息设置
	FORM_ID_210, 	// 储罐类型设置
	FORM_ID_220, 	// 介质设置
	FORM_ID_230, 	// 长度设置
	FORM_ID_240, 	// 直径设置
	FORM_ID_250, 	// 充装比设置
	FORM_ID_251, 	// 低液位百分比设置
	FORM_ID_260, 	// 密度设置
	FORM_ID_270, 	// 压力报警低点设置
	FORM_ID_271, 	// 压力报警高点设置
	FORM_ID_272, 	// 压力报警低点设置
	FORM_ID_273, 	// 压力报警高点设置
	FORM_ID_280, 	// 容积显示
	FORM_ID_285, 	// 4~20mA输出液位高度
	FORM_ID_300, 	// 上报周期设置
	FORM_ID_310, 	// 采集周期设置
	FORM_ID_320, 	// 发送周期设置
	FORM_ID_400, 	// 标定界面
	FORM_ID_410, 	// 电容标定
	FORM_ID_411, 	// C1（100pF）标定
	FORM_ID_412, 	// C2（400pF）标定
	FORM_ID_413, 	// 零点标定
	FORM_ID_420, 	// 压力标定
	FORM_ID_421, 	// 低压力标定
	FORM_ID_422, 	// 高压力标定
	FORM_ID_430, 	// 温度标定
	FORM_ID_431, 	// 低温度标定
	FORM_ID_432, 	// 高温度标定
	FORM_ID_500, 	// 量程设置
	FORM_ID_510, 	// 电容量程
	FORM_ID_511, 	// 底电容设置
	FORM_ID_512, 	// 增长电容设置
	FORM_ID_520, 	// 压力量程
	FORM_ID_521, 	// 压力低量程设置
	FORM_ID_522, 	// 压力高量程设置
	FORM_ID_530, 	// 温度量程
	FORM_ID_531, 	// 温度低量程设置
	FORM_ID_532, 	// 温度高量程设置
	FORM_ID_600, 	// 系统信息
	FORM_ID_700, 	// 查看真空度
} TForm_Id;

void Change_Form(TForm_Id formId);
uint32_t Comm_Sample();

// 主界面参数
typedef struct
{
	u8			blinkVisible;		// 闪烁状态：亮或熄
	u8			menuIdx[3];			// 各级菜单当前项
	u8			privilege;			// 操作权限：0-查询，1-设置参数，2-标定
	u8			meterPage;			// 表盘显示页面：测量页面、GPRS/GPS页面1、GPRS/GPS页面2、标定页面
	u8			infoPage;			// 信息显示页面：软件版本、硬件版本
	u8			caliIdx;			// 标定传感器路数
} TForm_Params;

TForm_Params formParam;

// 是否允许充装
volatile uint8_t Charge_Enabled = 0, last_Charge_Enabled = 0;
volatile uint32_t Charge_Pulse_Time = 0;

// 是否允许报警
volatile uint8_t Alarm_Enabled = 1, Low_Alarm_Enabled = 1, Leak_Alarm_Enabled = 1;
volatile uint8_t Press_Alarm_Enabled = 1, Low_Press_Alarm_Enabled = 1, ExtPress_Alarm_Enabled = 1, Low_ExtPress_Alarm_Enabled = 1;
volatile uint8_t Alarm_Output = 0, Low_Alarm_Output = 0, Leak_Alarm_Output = 0;
volatile uint8_t Press_Alarm_Output = 0, Low_Press_Alarm_Output = 0, ExtPress_Alarm_Output = 0, Low_ExtPress_Alarm_Output = 0;

// 是否匹配槽车
volatile uint8_t Truck_Matched = 0, Truck_Charging = 0;
volatile uint8_t Match_Charging = 1;			// 回持区间，未充满

// 充液泵控制
volatile uint32_t Pump_Stop_Time = 0;
volatile uint8_t Pump_Stop_posState = 0;
volatile uint32_t Pump_Stop_Longitude = 0, Pump_Stop_Latitude = 0;

// 手动启动充装
volatile uint8_t Manual_Charing = 0;

// 是否在测试界面
uint8_t MeterInSamplePage()
{
	return (formParam.meterPage == 3);
}

// 是否主界面
uint8_t MeterInMeterPage()
{
	return (formParam.meterPage == 0);
}

// 是否需要切换显示
uint8_t MeterNeedRoll()
{
	if(!dcBuff.sampleData.staPress.notConnect)
		return 1;
	if(!dcBuff.sampleData.staExtTempr[0].notConnect)
		return 1;
	if(!dcBuff.sampleData.staExtTempr[1].notConnect)
		return 1;
	if(dcBuff.sampleData.vacuum[0].staVacuum != VACUUM_STATUS_COMM_FAULT)
		return 1;
	
	MeterRollFirst();
	return 0;
}

// 切换显示
void MeterRoll()
{
	uint8_t idx = Form_rollIdx;
	
	Form_rollIdx=!Form_rollIdx;
//	uint8_t try_count = 4;
//	
//	while(try_count--)
//	{
//		if(++idx >= 2)
//			idx = 0;
//		if(idx == 0
//			|| (idx == 1 && !dcBuff.sampleData.staPress.notConnect)
//			|| (idx == 2 && !dcBuff.sampleData.staExtTempr[0].notConnect)
//			|| (idx == 3 && !dcBuff.sampleData.staExtTempr[1].notConnect)
//			|| (idx == 4 && dcBuff.sampleData.vacuum[0].staVacuum != VACUUM_STATUS_COMM_FAULT))
//		{
//			Form_rollIdx = idx;
//			return;
//		}
//	}
}

// 切换显示第一路（差压）
void MeterRollFirst()
{
	Form_rollIdx = 0;
}

// 检查当前显示单位是否合法，如不合法则移到最近的合法单位上, 不保存
void Check_L_Unit(u8 key)
{
//	while((dcBuff.configDisplay.op_USE_CAPACITY_SENSOR || dcBuff.configDisplay.op_USE_HEIGHT_LEVEL || dcBuff.configDisplay.op_USE_PCT_LEVEL) 
//				&& (dcBuff.configDisplay.L_Unit == UNIT_KPA || dcBuff.configDisplay.L_Unit == UNIT_MMH2O || dcBuff.configDisplay.L_Unit != UNIT_MMH2O))
//	{
//		if(key == KEY_UP)
//		{
//			if(dcBuff.configDisplay.L_Unit == UNIT_MMH2O)
//				dcBuff.configDisplay.L_Unit = UNIT_INH2O;
//			else
//				dcBuff.configDisplay.L_Unit++;
//		}
//		else
//		{
//			if(dcBuff.configDisplay.L_Unit == UNIT_INH2O)
//				dcBuff.configDisplay.L_Unit = UNIT_MMH2O;
//			else
//				dcBuff.configDisplay.L_Unit--;
//		}
//	}
}

// 显示容积百分比（指针）
void Meter_DispNeedle()
{
//	u8 needle;
//	
//	if(dcBuff.sampleData.staDPress.notConnect)
//    {
//	    Disp_WriteNeedle(0);
//    } 
//    else if(dcBuff.sampleData.staDPress.underFlow)
//    {
//	    Disp_WriteNeedle(0);
//    }
//    else if(dcBuff.sampleData.staDPress.overFlow)
//    {
//	    Disp_WriteNeedle(0);
//    }
//    else
//    {
//		// 差压：指针范围0~50，根据传感器量程不同（15/25/50KPa）, 表盘量程也不同（1500/2500/5000mmWC）
//		// 每一小格代表30/50/100mmWC
//	    needle = (u8) ((((uint16_t) KPa2mmH2O(dcBuff.sampleData.diff)) + dcBuff.configSensor.sensorDPress.highRange) / (dcBuff.configSensor.sensorDPress.highRange * 2));
//	    Disp_WriteNeedle(needle);
//    }	
}

// 显示差压数据: KPa
void Meter_DispDiffData()
{
	s8 text[10];

    Disp_Fld1PointOff();
	if(dcBuff.sampleData.staDPress.notConnect)
    {
	    Disp_Fld1Text("---");
    } 
//    else if(dcBuff.sampleData.staDPress.underFlow)
//    {
//	    Disp_Fld1Text("-EE");
//    }
//    else if(dcBuff.sampleData.staDPress.overFlow)
//    {
//	    Disp_Fld1Text("+EE");
//    }
    else
    {
		if(dcBuff.sampleData.diff >= 10000)	// 不显示小数
	    {
		    sprintf(text, "%d", (uint16_t) (dcBuff.sampleData.diff));
			Disp_Fld1Text(text);
		}
	    else if(dcBuff.sampleData.diff >= 1000)	// 显示1位小数
	    {
		    sprintf(text, "%d", (uint16_t) (dcBuff.sampleData.diff * 10));
			Disp_Fld1Text(text);
			Disp_Fld1PointOn(1);
		}
	    else if(dcBuff.sampleData.diff >= 100)	// 显示2位小数
	    {
		    sprintf(text, "%d", (uint16_t) (dcBuff.sampleData.diff * 100));
			Disp_Fld1Text(text);
			Disp_Fld1PointOn(2);
		}
	    else	// 显示3位小数
	    {
		    sprintf(text, "%05d", (uint16_t) (dcBuff.sampleData.diff * 1000));
			// 最少要显示4位数字
			if(text[0] == '0')
				Disp_Fld1Text(text + 1);
			else
				Disp_Fld1Text(text);
			Disp_Fld1PointOn(3);
		}
    }

	// 显示单位
	Disp_SwitchDiffUnit(UNIT_KPA);
}

// 显示差压数据: inH2O
void Meter_DispinH2OData()
{
	Meter_DispDiffData();
//	s8 text[10];
//	float inH2O = KPa2mmH2O(dcBuff.sampleData.diff) / 25.4;

//    Disp_Fld1PointOff();
//	if(dcBuff.sampleData.staDPress.notConnect)
//    {
//	    Disp_Fld1Text("---");
//    } 
//    else if(dcBuff.sampleData.staDPress.underFlow)
//    {
//	    Disp_Fld1Text("-EE");
//    }
//    else if(dcBuff.sampleData.staDPress.overFlow)
//    {
//	    Disp_Fld1Text("+EE");
//    }
//    else
//    {
//		if(inH2O >= 10000)	// 不显示小数
//	    {
//		    sprintf(text, "%d", (uint16_t) (inH2O));
//			Disp_Fld1Text(text);
//		}
//	    else if(inH2O >= 1000)	// 显示1位小数
//	    {
//		    sprintf(text, "%d", (uint16_t) (inH2O * 10));
//			Disp_Fld1Text(text);
//			Disp_Fld1PointOn(1);
//		}
//	    else	// 显示2位小数
//	    {
//		    sprintf(text, "%05d", (uint16_t) (inH2O * 100));
//			// 最少要显示3位数字
//			if(text[0] == '0')
//			{
//				if(text[1] == '0')
//					Disp_Fld1Text(text + 2);
//				else
//					Disp_Fld1Text(text + 1);
//			}
//			else
//				Disp_Fld1Text(text);
//			Disp_Fld1PointOn(2);
//		}
//    }

//	// 显示单位
//	Disp_SwitchDiffUnit(UNIT_INH2O);
}	

// 显示差压数据: mmH2O
void Meter_DispmmH2OData()
{
	Meter_DispDiffData();
//	s8 text[10];
//	float mmH2O = KPa2mmH2O(dcBuff.sampleData.diff);

//    Disp_Fld1PointOff();
//	if(dcBuff.sampleData.staDPress.notConnect)
//    {
//	    Disp_Fld1Text("---");
//    } 
//    else if(dcBuff.sampleData.staDPress.underFlow)
//    {
//	    Disp_Fld1Text("-EE");
//    }
//    else if(dcBuff.sampleData.staDPress.overFlow)
//    {
//	    Disp_Fld1Text("+EE");
//    }
//    else
//    {
//		// 不显示小数
//		sprintf(text, "%d", (uint16_t) (mmH2O));
//		Disp_Fld1Text(text);
//    }

//	// 显示单位
	Disp_SwitchDiffUnit(UNIT_MMH2O);
}	

// 显示压力数据
void Meter_DispPres1Data()
{
	s8 text[10];

    Disp_Fld1PointOff();
	if(dcBuff.sampleData.staPress.notConnect)
    {
	    Disp_Fld1Text("---");
    } 
//    else if(dcBuff.sampleData.staPress.underFlow)
//    {
//	    Disp_Fld1Text("-EE");
//    }
//    else if(dcBuff.sampleData.staPress.overFlow)
//    {
//	    Disp_Fld1Text("+EE");
//    }
    else
    {
		sprintf(text, "%03d", (uint16_t) ((dcBuff.sampleData.pressure + 5) / 10));
		Disp_Fld1Text(text);
		Disp_Fld1PointOn(2);
    }
		
	// 显示单位
	Disp_SwitchPresUnit(UNIT_MPA);
}	

// 显示温度数据
void Meter_DispTemp1Data()
{
	s8 text[10];

	if(dcBuff.sampleData.staExtTempr[0].notConnect)
    {
	    Disp_Fld1Text("---");
    } 
//    else if(dcBuff.sampleData.staExtTempr[0].underFlow)
//    {
//	    Disp_Fld1Text("-EE");
//    }
//    else if(dcBuff.sampleData.staExtTempr[0].overFlow)
//    {
//	    Disp_Fld1Text("+EE");
//    }
    else
    {
		// 不显示小数
		sprintf(text, "%d", dcBuff.sampleData.extTempr[0]);
		Disp_Fld1Text(text);
    }
		
	// 显示单位
	Disp_SwitchTempUnit(UNIT_C);
}	

// 显示温度数据
void Meter_DispTemp2Data()
{
	s8 text[10];

	if(dcBuff.sampleData.staExtTempr[1].notConnect)
    {
	    Disp_Fld1Text("---");
    } 
//    else if(dcBuff.sampleData.staExtTempr[1].underFlow)
//    {
//	    Disp_Fld1Text("-EE");
//    }
//    else if(dcBuff.sampleData.staExtTempr[1].overFlow)
//    {
//	    Disp_Fld1Text("+EE");
//    }
    else
    {
		// 不显示小数
		sprintf(text, "%d", dcBuff.sampleData.extTempr[1]);
		Disp_Fld1Text(text);
    }
		
	// 显示单位
	Disp_SwitchTempUnit(UNIT_C);
}

// 显示真空数据
void Meter_DispVacuData()
{
//	s8 text[10];

//	// 隐藏真空显示
//	if(dcBuff.configBottle.hideVacu)
//		return;
//	
//	// 如无真空计则不显示
//	if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_COMM_FAULT)
//		return;
//	
//	if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_FAULT || dcBuff.sampleData.vacuum[0].vacuum > 99.99999999)
//	    Disp_Fld1Text("+EE");
//    else if(dcBuff.sampleData.vacuum[0].vacuum > 0.00999999)
//    {
//		sprintf(text, "%04d", (uint16_t) (dcBuff.sampleData.vacuum[0].vacuum * 100));
//		// 至少要显示三位数字
//		if(text[0] == '0')
//			Disp_Fld1Text(text + 1);
//		else
//			Disp_Fld1Text(text);
//		Disp_Fld1PointOn(2);
//    }
//	else
//	    Disp_Fld1Text("-EE");
//		
//	// 显示单位
//	Disp_SwitchVacuUnit(UNIT_PA);
}	

// 刷新状态信息：gprs信号，联网，电池电量
void Meter_RefreshStatus()
{
	Disp_WriteBattery((dcBuff.dtuData.batPct + 12) / 25);
	Disp_WriteStrength((dcBuff.dtuData.rssi + 12) / 25);
	Disp_WriteCommunication(!VCC_POWER_STATUS() && dcBuff.dtuData.batLow);
	Disp_WriteAlarm(0);
	Disp_WriteError(0);
	Disp_WriteFill(Charge_Enabled || (Manual_Charing && Truck_Matched));
	Disp_WritePower(VCC_POWER_STATUS());
	Disp_WriteGPS(dcBuff.dtuData.posState);
	Disp_WriteRF(0);
}
	
void Meter_DispData()
{
//	if(dcBuff.configDisplay.L_Unit == UNIT_KPA)
		Meter_DispDiffData();
//	else if(dcBuff.configDisplay.L_Unit == UNIT_MMH2O)
//		Meter_DispmmH2OData();
//	else
//		Meter_DispinH2OData();
}

void Meter_Disp()
{
	s8 text[7] = "";
	
	// 清屏
	Disp_Clear();
	
	Meter_RefreshStatus();
	if(formParam.meterPage == 0)
	{
//		Meter_DispNeedle();

//		if(!dcBuff.configDisplay.op_DISP_MMWC_ONLY)		
//			Disp_SwitchSource(dcBuff.configBottle.source);	   // 显示液源
		
		if(Form_rollIdx == 0)
			Meter_DispData();
		else //if(Form_rollIdx == 1)
			Meter_DispPres1Data();
//		else if(Form_rollIdx == 2)
//			Meter_DispTemp1Data();
//		else if(Form_rollIdx == 3)
//			Meter_DispTemp2Data();
//		else
//			Meter_DispVacuData();
		
		// 显示第几路温度传感器
//		if(dcBuff.sampleData.staExtTempr[1].status != SENSOR_STATUS_NOCONNECT)
//		{
//			if(Form_rollIdx == 2)
//				Disp_ChannelOn(1);
//			else if(Form_rollIdx == 3)
//				Disp_ChannelOn(2);
//		}
	}
	else if(formParam.meterPage == 1)
	{
		// 电池电压
		sprintf(text, "%03d", dcBuff.dtuData.batVoltage / 10);
		Disp_Fld1Text(text);
	}
	else if(formParam.meterPage == 2)
	{
		// 启动代码
		sprintf(text, "%d", SYS_RSTSTS);
		Disp_Fld1Text(text);
	}
	else	// 显示测量值
	{
		if(Form_rollIdx == 0)
			Meter_DispDiffData();
		else //if(Form_rollIdx == 1)
			Meter_DispPres1Data();
//		else if(Form_rollIdx == 2)
//			Meter_DispTemp1Data();
//		else if(Form_rollIdx == 3)
//			Meter_DispTemp2Data();
//		else
//			Meter_DispVacuData();

		// 提示测试界面
		Disp_WriteAlarm(1);
		Disp_WriteError(1);
		Disp_WriteFill(0);

		// 显示第几路温度传感器
//		if(dcBuff.sampleData.staExtTempr[1].status != SENSOR_STATUS_NOCONNECT)
//		{
//			if(Form_rollIdx == 2)
//				Disp_ChannelOn(1);
//			else if(Form_rollIdx == 3)
//				Disp_ChannelOn(2);	
//		}
	}
}

// ********************************************
// 以下为窗口界面实现
// ********************************************

// 查询菜单
const char menu_000_items[][5] =
{
	"PSN", "PARA", "PERI", "CALI", "RANG", "INFO",
};

// 设置菜单
const char menu_001_items[][5] =
{
	"PARA",
};

// 标定菜单
const char menu_002_items[][5] =
{
	"PSN", "PERI", "CALI", "RANG",
};

// 储罐信息菜单
const char menu_200_items[][4][5] =
{
	{"DP-H", "DP-L", "P-H", "P-L"}
//	{"TYPE", "SRC", "LEN", "DIE", "PCT", "LPCT", "DENS", "ALAR", "ALAH", "VOL", "4-20"},
//	{"TYPE", "SRC", "LEN", "DIE", "PCT", "LPCT", "DENS", "VOL"}
};

// 储罐类型选项
const char menu_210_items[][5] =
{
	"STAN", "LIE", "BALL"
};

// 介质选项
const char menu_220_items[][5] =
{
	"LNG", "O2", "N2", "AR", "CO2", "H2", "CNG", "HE", "C2H4", "LPG", "NH3", "PENT", "POPO"
};

// 上报周期菜单
const char menu_300_items[][5] =
{
	"CAPT", "SEND"
};

// 标定菜单
const char menu_400_items[][5][5] =
{
	{"DIFF", "PRS1", "PRS2", "TEP1", "TEP2"},
	//{"CAP", "PRS1", "PRS2", "TEP1", "TEP2"}
	{"PRS1", "PRS2", "TEP1", "TEP2"}
};

// 电容标定菜单
const char menu_410_items[][3][5] =
{
	{"LO", "HIGH", "OFFS"}, // 低点、高点、偏移（零点）
	{"C1", "C2"}
};

// 压力标定菜单
const char menu_420_items[][5] =
{
	"LO", "HIGH"
};

// 温度标定菜单
const char menu_430_items[][2][5] =
{
	{"LO", "HIGH"},
	{"CALT", "CALR"}
};

// 量程菜单
const char menu_500_items[][4][5] =
{
	{"DIFF", "PRS1", "PRS2", "TEP1"},
	{"CAP",  "PRS1", "PRS2", "TEP1"}
};

// 电容量程菜单
const char menu_510_items[][2][5] =
{
	{"LO", "HIGH"},
	{"BASE", "REF"}
};

// 压力量程菜单
const char menu_520_items[][5] =
{
	"LO", "HIGH"
};

// 温度量程菜单
const char menu_530_items[][5] =
{
	"LO", "HIGH"
};

// 函数类型定义：事件
typedef	void (*TEvent)(void);
typedef	void (*TKeyEvent)(u8);
	
// 窗口控件结构
typedef struct
{
	// 控件
	TButton		Button1;	// 按钮：自动测量
	TEditBox	Edit2;		// 编辑框：输入（与选择框二选一）
	TSelectBox	Select3;	// 选择框：输入（与编辑框二选一）
	TButton		Button4;	// 按钮：YES
	TButton		Button5;	// 按钮：ESC

	// 事件
	TEvent		OnButton1;	// 按钮1回调函数
	TEvent		OnButton4;	// 按钮4回调函数
	TEvent		OnButton5;	// 按钮5回调函数
	TEvent		OnTimeOut;	// 超时回调函数（自动返回主界面）
	TEvent		OnDrawOthers;// 绘制屏幕上除控件以外的其它文字或符号，直接调用底层函数实现
	TKeyEvent	OnKey;		 // 默认按键处理
	
	// 属性
	u8			cursorId;	// 当前控件：0-无，1-Button1，2-Edit2, 3-Select3，4-Button4, 5-Button5
} TForm;

volatile u32 		Form_timer = 0;		// 最近动作时间,用于超时处理
volatile u16		Form_timeout = 10;	// 超时时间
volatile u8			Form_timeouted = 0;	// 是否已执行超时动作

// 窗口结构
TForm form;

void Form_ResetTimer()
{
    S_RTC_TIME_DATA_T sRTC;

	// 获取当前时间
	RTC_GetDateAndTime(&sRTC);
	// 计算自上次gps定位以来的时间
	Form_timer = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
			sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
	Form_timeouted = 0;
}

// 设置焦点控件
void Form_SetFocus()
{
	if(form.cursorId == 1)
		Button_SetFocus(&form.Button1);
	else if(form.cursorId == 2)
		EditBox_SetFocus(&form.Edit2);
	else if(form.cursorId == 3)
		SelectBox_SetFocus(&form.Select3);
	else if(form.cursorId == 4)
		Button_SetFocus(&form.Button4);
	else if(form.cursorId == 5)
		Button_SetFocus(&form.Button5);
	else
		Disp_ClearCursor();
}

// 切换到第一个控件
void Form_FocusFirst()
{
	if(!form.Edit2.hide)
		form.cursorId = 2;
	else if(!form.Select3.hide)
		form.cursorId = 3;
	else if(!form.Button4.hide)
		form.cursorId = 4;
	else if(!form.Button5.hide)
		form.cursorId = 5;
	else if(!form.Button1.hide)
		form.cursorId = 1;
	else
		form.cursorId = 0;
	
	// 设置焦点控件
	Form_SetFocus();
}

// 切换到下一个控件
void Form_FocusNext()
{
	if(form.cursorId == 1)
	{
		if(!form.Edit2.hide)
			form.cursorId = 2;
		else if(!form.Select3.hide)
			form.cursorId = 3;
		else if(!form.Button4.hide)
			form.cursorId = 4;
		else if(!form.Button5.hide)
			form.cursorId = 5;
	}
	else if(form.cursorId == 2)
	{
		if(!form.Select3.hide)
			form.cursorId = 3;
		else if(!form.Button4.hide)
			form.cursorId = 4;
		else if(!form.Button5.hide)
			form.cursorId = 5;
		else if(!form.Button1.hide)
			form.cursorId = 1;
	}
	else if(form.cursorId == 3)
	{
		if(!form.Button4.hide)
			form.cursorId = 4;
		else if(!form.Button5.hide)
			form.cursorId = 5;
		else if(!form.Button1.hide)
			form.cursorId = 1;
		else if(!form.Edit2.hide)
			form.cursorId = 2;
	}
	else if(form.cursorId == 4)
	{
		if(!form.Button5.hide)
			form.cursorId = 5;
		else if(!form.Button1.hide)
			form.cursorId = 1;
		else if(!form.Edit2.hide)
			form.cursorId = 2;
		else if(!form.Select3.hide)
			form.cursorId = 3;
	}
	else if(form.cursorId == 5)
	{
		if(!form.Button1.hide)
			form.cursorId = 1;
		else if(!form.Edit2.hide)
			form.cursorId = 2;
		else if(!form.Select3.hide)
			form.cursorId = 3;
		else if(!form.Button4.hide)
			form.cursorId = 4;
	}

	// 设置焦点控件
	Form_SetFocus();
}

void Form_OnKey(u8 key)
{	
	if(form.cursorId == 1 && Button_OnKey(&form.Button1, key) != KEY_INVALID)
	{
		if(key == KEY_FUNC)
			Form_FocusNext();
		else if(key == KEY_SET && form.OnButton1 != NULL)
			form.OnButton1();
		
		return;
	}
	if(form.cursorId == 2 && EditBox_OnKey(&form.Edit2, key) != KEY_INVALID)
	{
		if(key == KEY_FUNC)
			Form_FocusNext();
		
		return;
	}
	if(form.cursorId == 3 && SelectBox_OnKey(&form.Select3, key) != KEY_INVALID)
	{
		if(key == KEY_FUNC)
			Form_FocusNext();
		
		return;
	}
	if(form.cursorId == 4 && Button_OnKey(&form.Button4, key) != KEY_INVALID)
	{
		if(key == KEY_FUNC)
			Form_FocusNext();
		else if(key == KEY_SET && form.OnButton4 != NULL)
			form.OnButton4();
		
		return;
	}
	if(form.cursorId == 5 && Button_OnKey(&form.Button5, key) != KEY_INVALID)
	{
		if(key == KEY_FUNC)
			Form_FocusNext();
		else if(key == KEY_SET && form.OnButton5 != NULL)
			form.OnButton5();
		
		return;
	}
	
	if(form.OnKey != NULL)
		form.OnKey(key);
}

// 刷新控件
void Form_RefreshCtrls()
{
	if(!form.Button1.hide && form.cursorId == 1)
		Button_Refresh(&form.Button1);
	if(!form.Edit2.hide && form.cursorId == 2)
		EditBox_Refresh(&form.Edit2);
	if(!form.Select3.hide && form.cursorId == 3)
		SelectBox_Refresh(&form.Select3);
	if(!form.Button4.hide && form.cursorId == 4)
		Button_Refresh(&form.Button4);
	if(!form.Button5.hide && form.cursorId == 5)
		Button_Refresh(&form.Button5);
}

void Form_Refresh()
{
	if(form.OnDrawOthers != NULL)
		form.OnDrawOthers();
	Form_RefreshCtrls();
	
	// 实际写屏
	HT1621_Refresh();		
}

void Form_OnTimer()
{
    S_RTC_TIME_DATA_T sRTC;

	// 切换闪烁状态
    formParam.blinkVisible = !formParam.blinkVisible;
	Disp_SetBlinkVisible(formParam.blinkVisible);
	
	// 处理超时
	if(form.OnTimeOut != NULL && !Form_timeouted)
	{
		// 获取当前时间
		RTC_GetDateAndTime(&sRTC);
		// 计算自上次gps定位以来的时间
		if(Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
				sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second) >= Form_timer + Form_timeout)
		{
			Form_timeouted = 1;
			form.OnTimeOut();
		}
	}	
	
	Form_Refresh();
}
// ********************************************
// 以下为各个功能界面函数
// ********************************************

// 默认超时：查看30秒，设置60秒，标定120秒
#define OPERATE_TIMEOUT	(formParam.privilege == 0 ? 30 : (formParam.privilege == 1 ? 60 : 120))	
#define METER_DISP_TIMEOUT 10	// 正常界面：4秒钟休眠
#define METER_TEST_TIMEOUT 60	// 测试界面：1分钟休眠

// 超时：进入主界面
void Form_Return2Meter()
{
	formParam.menuIdx[0] = 0;
	formParam.menuIdx[1] = 0;
	formParam.menuIdx[2] = 0;
	formParam.meterPage = 0;
	Change_Form(FORM_ID_METER);
}

// 启动界面进入，或功能界面返回到设置菜单
void Form_Return2_000()
{
	formParam.menuIdx[1] = 0;
	formParam.menuIdx[2] = 0;
	Change_Form(FORM_ID_000);
}

// ********************************************
// 启动界面
// ********************************************
void Form_Start_OnDrawOthers()
{
	char range[10];
	
	// 显示差压量程
	sprintf(range, "%3d", dcBuff.configSensor.sensorDPress.highRange);
	Disp_Fld1Text(range);
	Disp_SwitchDiffUnit(UNIT_KPA);
}

// 无控件，4秒超时
void Form_Start_Create()
{
	memset(&form, 0, sizeof(form));

	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Hide(&form.Select3);
	Button_Hide(&form.Button4);
	Button_Hide(&form.Button5);

	Form_timeout = 4;	// 4秒超时

	// 事件回调
	form.OnDrawOthers = Form_Start_OnDrawOthers;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 主界面
// ********************************************

void Form_Meter_OnDrawOthers()
{
	// 显示表盘全部数据
	Meter_Disp();
	
	// 贴片厂测试软件打开
//	Disp_WriteAlarm(1);
//	Disp_WriteError(1);
//	Disp_WriteFill(1);
//	Disp_WritePower(1);
//	Disp_WriteGPS(1);
//	Disp_WriteRF(1);
}

// 主界面超时
void Form_Meter_OnTimeOut()
{
	if(formParam.meterPage == 3)
	{
		formParam.meterPage = 0;
		Form_timeout = METER_DISP_TIMEOUT;
		
		// 刷新屏幕
		xSemaphoreGive(Key_Semaphore);
	}
	// 允许休眠
	LCD_Disabled = 1;
}

void Form_Meter_OnKey(u8 key)
{
	// 按FUNC键进入查询或设置界面
	if(key == KEY_FUNC)
	{
		formParam.privilege = 0;
		Change_Form(FORM_ID_PWD);
	}
	// 防过充	
	else if(key == KEY_SET)
	{
//		if(IS_ALARM_ON() && formParam.meterPage == 0)
//		{
//			// 手动关闭报警
//			KZ_ALARM_OFF();

//			if(dcBuff.configDisplay.op_ALARM_OUTPUT && Alarm_Output)
//				Alarm_Enabled = 0;
//			if(dcBuff.configDisplay.op_LOW_ALARM_OUTPUT && Low_Alarm_Output)
//				Low_Alarm_Enabled = 0;
//			if(dcBuff.configDisplay.op_LEAK_ALARM_OUTPUT && Leak_Alarm_Output)
//				Leak_Alarm_Enabled = 0;
//			if(dcBuff.configDisplay.op_PRESS_ALARM_OUTPUT && Press_Alarm_Output)
//				Press_Alarm_Enabled = 0;
//			if(dcBuff.configDisplay.op_LOW_PRESS_ALARM_OUTPUT && Low_Press_Alarm_Output)
//				Low_Press_Alarm_Enabled = 0;
//			if(dcBuff.powerInfo.hardVer.major == 232 && ExtPress_Alarm_Output)
//				ExtPress_Alarm_Enabled = 0;
//			if(dcBuff.powerInfo.hardVer.major == 232 && Low_ExtPress_Alarm_Output)
//				Low_ExtPress_Alarm_Enabled = 0;

//			Alarm_Output = 0;
//			Low_Alarm_Output = 0;
//			Leak_Alarm_Output = 0;
//			Press_Alarm_Output = 0;
//			Low_Press_Alarm_Output = 0;
//			ExtPress_Alarm_Output = 0;
//			Low_ExtPress_Alarm_Output = 0;
//		}

//		if(dcBuff.configDisplay.op_LOW_ALARM_OUTPUT && formParam.meterPage == 0)
//		{
//			// 手动关闭报警
//			if(Low_Alarm_Enabled && IS_ALARM_ON())
//			{
//				Low_Alarm_Enabled = 0;
//				KZ_ALARM_OFF();
//			}
//		}
//		if(dcBuff.configDisplay.op_LEAK_ALARM_OUTPUT && formParam.meterPage == 0)
//		{
//			// 手动关泄露报警
//			if(Leak_Alarm_Enabled && IS_ALARM_ON())
//			{
//				Leak_Alarm_Enabled = 0;
//				KZ_ALARM_OFF();
//			}
//		}
//		if(dcBuff.configDisplay.op_ANTI_OVERFILL && formParam.meterPage == 0)
//		{
//			// 手动开关充装
//			Charge_Enabled = !Charge_Enabled;
//			if(Charge_Enabled)
//				Wakeup_SetAlarm(1);
//			
//			// 采集数据
//			Sample_Notify();
//		}
		
//		if(formParam.meterPage == 3 && MeterNeedRoll())
if(formParam.meterPage == 3)
			MeterRoll();	// 切换显示第几路
	}
	else if(key == KEY_UP)///if(key == KEY_DOWN)
	{
		if(formParam.meterPage >= 3)
			formParam.meterPage = 0;
		else
			formParam.meterPage++;
		if(formParam.meterPage == 3)
		{
			MeterRollFirst();	// 默认在第1路
			Form_timeout = METER_TEST_TIMEOUT;	
		}
		else
			Form_timeout = METER_DISP_TIMEOUT;

			
	}
//	else if(key == KEY_UP)
//	{
//		if(formParam.meterPage == 0)
//		{
//			if(dcBuff.configDisplay.L_Unit == UNIT_MMH2O)
//				dcBuff.configDisplay.L_Unit = UNIT_INH2O;
//			else
//				dcBuff.configDisplay.L_Unit++;
//			// 保存
//			Config_SaveConfig();
//			// 检查合法性
//			Check_L_Unit(key);
//		}
//	}
}

// 无控件
void Form_Meter_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Hide(&form.Select3);
	Button_Hide(&form.Button4);
	Button_Hide(&form.Button5);
	
	Form_timeout = METER_DISP_TIMEOUT;
	// 事件回调
	form.OnDrawOthers = Form_Meter_OnDrawOthers;
	form.OnTimeOut = Form_Meter_OnTimeOut;
	form.OnKey = Form_Meter_OnKey;
}

// ********************************************
// 输密码界面
// ********************************************
// 确认按钮
void Form_Pwd_OnButton4()
{
	// 不输入密码，进入查询界面
	if(strcmp(form.Edit2.text, "oooo") == 0)
	{
		formParam.privilege = 0;
		Form_Return2_000();
	}
	// 输入密码1：设置储罐参数
	else if(strcmp(form.Edit2.text, dcBuff.configDisplay.pwd1) == 0)
	{
		formParam.privilege = 1;
		//Form_Return2_000();
		Change_Form(FORM_ID_200);	// 一级菜单只有一项，直接进入二级菜单（储罐参数设置）
	}
	// 输入密码2：设置标定等参数
	else if(strcmp(form.Edit2.text, dcBuff.configDisplay.pwd2) == 0)
	{
		formParam.privilege = 2;
		Form_Return2_000();
	}
	// 输入密码3：查看真空度
	else if(strcmp(form.Edit2.text, "2323") == 0)
	{
		formParam.privilege = 0;
		Change_Form(FORM_ID_700);
	}
	// 输入错误密码：返回主界面
	else
		Form_Return2Meter();
}

void Form_Pwd_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, "oooo");
	SelectBox_Hide(&form.Select3);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_Pwd_OnButton4;
	form.OnButton5 = Form_Return2Meter;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 设置菜单界面
// ********************************************
// 确认按钮
void Form_000_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[0] = form.Select3.idx;
	
	if(formParam.privilege == 0)
	{
		switch(form.Select3.idx)
		{
			case 0:	// 设置PSN
				Change_Form(FORM_ID_100);
				break;
			case 1:	// 设置储罐参数
				Change_Form(FORM_ID_200);
				break;
			case 2:	// 设置上报周期
				Change_Form(FORM_ID_300);
				break;
			case 3:	// 标定
				if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)		
					Change_Form(FORM_ID_400);
				else
					Change_Form(FORM_ID_410);				
				break;
			case 4:	// 量程
				if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)		
					Change_Form(FORM_ID_500);
				else
					Change_Form(FORM_ID_510);
				break;
			case 5:	// 信息
				Change_Form(FORM_ID_600);
				break;
			default:
				break;
		}
	}
	else if(formParam.privilege == 1) // 这个地方不会执行到，因为一级菜单只有一项，故直接进入二级菜单
	{
		switch(form.Select3.idx)
		{
			case 0:	// 设置储罐参数
				Change_Form(FORM_ID_200);
				break;
			default:
				break;
		}
	}
	else
	{
		switch(form.Select3.idx)
		{
			case 0:	// 设置PSN
				Change_Form(FORM_ID_100);
				break;
			case 1:	// 设置上报周期
				Change_Form(FORM_ID_300);
				break;
			case 2:	// 标定
				if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)			
					Change_Form(FORM_ID_400);
				else
					Change_Form(FORM_ID_410);
				break;
			case 3:	// 量程
				if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)			
					Change_Form(FORM_ID_500);
				else
					Change_Form(FORM_ID_510);
				break;
			default:
				break;
		}
	}
}

void Form_000_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	if(formParam.privilege == 0)
		SelectBox_Create(&form.Select3, 0, 4, 6, menu_000_items, formParam.menuIdx[0]);
	else if(formParam.privilege == 1)
		SelectBox_Create(&form.Select3, 0, 4, 1, menu_001_items, formParam.menuIdx[0]);
	else
		SelectBox_Create(&form.Select3, 0, 4, 4, menu_002_items, formParam.menuIdx[0]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_000_OnButton4;
	form.OnButton5 = Form_Return2Meter;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 设置PSN界面
// ********************************************
// 确认按钮
void Form_100_OnButton4()
{
	char psn[20];
	u16 serial;
	
	// 保存PSN
	strcpy(psn, form.Edit2.text);
	
	serial = atoi(psn + 10);
	dcBuff.configBottle.PSN[5] = serial & 0xFF;
	dcBuff.configBottle.PSN[4] = serial >> 8;
	
	psn[10] = 0;
	dcBuff.configBottle.PSN[3] = atoi(psn + 8);
	psn[8] = 0;
	dcBuff.configBottle.PSN[2] = atoi(psn + 6);
	psn[6] = 0;
	dcBuff.configBottle.PSN[1] = atoi(psn + 4);
	psn[4] = 0;
	dcBuff.configBottle.PSN[0] = atoi(psn + 2);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_000();
}

void Form_100_Create()
{
	char psn[20];
	
	// 显示13位PSN号
	sprintf(psn, "20%02d%02d%02d%02d%03d", dcBuff.configBottle.PSN[0], dcBuff.configBottle.PSN[1], 
		dcBuff.configBottle.PSN[2], dcBuff.configBottle.PSN[3],
		(dcBuff.configBottle.PSN[4] << 8) | dcBuff.configBottle.PSN[5]);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 13, psn);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_100_OnButton4;
	form.OnButton5 = Form_Return2_000;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 储罐参数设置界面
// ********************************************

// 确认按钮
void Form_200_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[1] = form.Select3.idx;
	
	switch(form.Select3.idx) //apex
	{
		case 0:	// 类型
			//Change_Form(FORM_ID_210);
			Change_Form(FORM_ID_273);
			break;
		case 1:	// 液源
			//Change_Form(FORM_ID_220);
			Change_Form(FORM_ID_272);
			break;
		case 2:	// 长度
			Change_Form(FORM_ID_271);//压力报警高点设置
		//	Change_Form(FORM_ID_230);
			break;
		case 3:	// 直径
		//	Change_Form(FORM_ID_240); 
		Change_Form(FORM_ID_270);
			break;
		case 4:	// 充装比
			Change_Form(FORM_ID_250);
			break;
		case 5:	// 低液位百分比
			Change_Form(FORM_ID_251);
			break;
		case 6:	// 密度
			Change_Form(FORM_ID_260);
			break;
		case 7:	// 压力报警低点
			if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)
				Change_Form(FORM_ID_270);
			else// 容积
				Change_Form(FORM_ID_280);
			break;
		case 8:	// 压力报警高点
			if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)
				Change_Form(FORM_ID_271);
			break;		
		case 9:	// 容积
			if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)
				Change_Form(FORM_ID_280);
			break;
		case 10:// 4~20mA输出液位高度
			if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)
				Change_Form(FORM_ID_285);
			break;
		default:
			break;
	}
}

void Form_200_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, /*dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY ? 8 : 11*/4, 
		menu_200_items[dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY], formParam.menuIdx[1]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_200_OnButton4;
	if(formParam.privilege == 0)
		form.OnButton5 = Form_Return2_000;
	else // 无一级菜单
		form.OnButton5 = Form_Return2Meter;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回上级菜单
void Form_Return2_200()
{
	formParam.menuIdx[2] = 0;
	Change_Form(FORM_ID_200);
}

// ********************************************
// 储罐类型设置界面
// ********************************************
// 确认按钮
void Form_210_OnButton4()
{
	// 保存类型
	dcBuff.configBottle.type = form.Select3.idx;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					
	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_210_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 3, menu_210_items, dcBuff.configBottle.type);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		SelectBox_ReadOnly(&form.Select3);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_210_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 液源设置界面
// ********************************************
// 确认按钮
void Form_220_OnButton4()
{
	// 保存液源
	dcBuff.configBottle.source = form.Select3.idx;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_220_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 13, menu_220_items, dcBuff.configBottle.source);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		SelectBox_ReadOnly(&form.Select3);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_220_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 储罐长度设置界面
// ********************************************
// 确认按钮
void Form_230_OnButton4()
{
	// 保存长度
	dcBuff.configBottle.len = atoi(form.Edit2.text);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_230_Create()
{
	char len[8];
	sprintf(len, "%05d", dcBuff.configBottle.len);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 5, len);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_230_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 储罐直径设置界面
// ********************************************
// 确认按钮
void Form_240_OnButton4()
{
	// 保存直径
	dcBuff.configBottle.diameter = atoi(form.Edit2.text);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_240_Create()
{
	char diameter[8];
	sprintf(diameter, "%05d", dcBuff.configBottle.diameter);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 5, diameter);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_240_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 充装比设置界面
// ********************************************
// 确认按钮
void Form_250_OnButton4()
{
	// 保存充装比
	dcBuff.configBottle.fullPct = atoi(form.Edit2.text) * 100;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_250_Create()
{
	char fullPct[8];
	sprintf(fullPct, "%02d", dcBuff.configBottle.fullPct / 100);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 2, 2, fullPct);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_250_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 低液位百分比设置界面
// ********************************************
// 确认按钮
void Form_251_OnButton4()
{
	// 保存充装比
	dcBuff.configBottle.emptyPct = atoi(form.Edit2.text) * 100;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_251_Create()
{
	char emptyPct[8];
	sprintf(emptyPct, "%02d", dcBuff.configBottle.emptyPct / 100);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 2, 2, emptyPct);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_251_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 液体密度设置界面
// ********************************************
// 确认按钮
void Form_260_OnButton4()
{
	// 保存密度
	Config_SetDensity(dcBuff.configBottle.source, atoi(form.Edit2.text) * 0.001);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_260_Create()
{
	char density[8];
	sprintf(density, "%04d", (uint16_t) (Config_GetDensity(dcBuff.configBottle.source) * 1000));
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, density);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_260_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 压力报警低点设置界面
// ********************************************
void Form_DispPoint3()
{
	Disp_Fld1PointOff();
	if(form.cursorId == 2)
		Disp_Fld1PointOn(3);
}

void Form_DispPoint2()
{
	Disp_Fld1PointOff();
	if(form.cursorId == 2)
		Disp_Fld1PointOn(2);
}

void Form_DispPoint1()
{
	Disp_Fld1PointOff();
	if(form.cursorId == 2)
		Disp_Fld1PointOn(1);
}

// 确认按钮
void Form_270_OnButton4()
{
	// 保存报警参数
	dcBuff.configBottle.warnPress = atoi(form.Edit2.text);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_270_Create()
{
	char warnPress[8];
	sprintf(warnPress, "%04d", dcBuff.configBottle.warnPress);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, warnPress);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	//form.OnDrawOthers = Form_DispPoint3;
	form.OnButton4 = Form_270_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 压力报警高点设置界面
// ********************************************

// 确认按钮
void Form_271_OnButton4()
{
	// 保存报警参数
	dcBuff.configBottle.warnPressH = atoi(form.Edit2.text) ;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_271_Create()
{
	char warnPressH[8];
	sprintf(warnPressH, "%04d", dcBuff.configBottle.warnPressH);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, warnPressH);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	//form.OnDrawOthers = Form_DispPoint3;
	form.OnButton4 = Form_271_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// 确认按钮
void Form_272_OnButton4()
{
	// 保存报警参数
	dcBuff.configBottle.emptyPct = atoi(form.Edit2.text) ;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}

void Form_272_Create()
{
	char emptyPct[8];
	sprintf(emptyPct, "%04d", dcBuff.configBottle.emptyPct);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, emptyPct);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnDrawOthers = Form_DispPoint2;
	form.OnButton4 = Form_272_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// 确认按钮
void Form_273_OnButton4()
{
	// 保存报警参数
	dcBuff.configBottle.fullPct = atoi(form.Edit2.text) ;
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_200();
}
void Form_273_Create()
{
	char fullPct[8];
	sprintf(fullPct, "%04d", dcBuff.configBottle.fullPct);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, fullPct);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnDrawOthers = Form_DispPoint2;
	form.OnButton4 = Form_273_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}
// ********************************************
// 储罐容积显示界面
// ********************************************
void Form_280_Create()
{
	char volumeTotal[8];

	Calculate_Theoretical_Params();
	sprintf(volumeTotal, "%06d", Theoretical_Param.v);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 6, volumeTotal);
	SelectBox_Hide(&form.Select3);
	Button_Hide(&form.Button4);
	EditBox_ReadOnly(&form.Edit2);
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_Return2_200;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 4~20mA输出液位高度设置界面
// ********************************************

void Form_285_OnButton1()
{
	// 自动采集差压值
	if(Comm_Sample())
		sprintf(form.Edit2.text, "%05d", (uint16_t) KPa2mmH2O(dcBuff.sampleData.diff));

	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_285_OnButton4()
{
	dcBuff.configSensor.levelOutMMWC = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_200();
}

void Form_285_Create()
{
	char mmWC[10];
	
	sprintf(mmWC, "%05d", dcBuff.configSensor.levelOutMMWC);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 5, mmWC);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 1)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_285_OnButton1;
	form.OnButton4 = Form_285_OnButton4;
	form.OnButton5 = Form_Return2_200;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 周期设置界面
// ********************************************

// 确认按钮
void Form_300_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[1] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 采集周期
			Change_Form(FORM_ID_310);
			break;
		case 1:	// 发送周期
			Change_Form(FORM_ID_320);
			break;
		default:
			break;
	}
}

void Form_300_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 2, menu_300_items, formParam.menuIdx[1]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_300_OnButton4;
	form.OnButton5 = Form_Return2_000;
	form.OnTimeOut = Form_Return2Meter;
}

void Form_Return2_300()
{
	formParam.menuIdx[2] = 0;
	Change_Form(FORM_ID_300);
}

// ********************************************
// 采集周期设置界面
// ********************************************
// 确认按钮
void Form_310_OnButton4()
{
	// 保存周期
	dcBuff.configData.intervalSample = atoi(form.Edit2.text);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_300();
}

void Form_310_Create()
{
	char intervalSample[8];
	sprintf(intervalSample, "%04d", dcBuff.configData.intervalSample);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 4, intervalSample);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_310_OnButton4;
	form.OnButton5 = Form_Return2_300;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 上报周期设置界面
// ********************************************
// 确认按钮
void Form_320_OnButton4()
{
	// 保存周期
	dcBuff.configData.intervalTrans = atoi(form.Edit2.text);
	dcBuff.configBottle.updateFlag = 1;	// 参数更新标志					

	// 保存
	Config_SaveConfig();

	// 返回上级菜单
	Form_Return2_300();
}

void Form_320_Create()
{
	char intervalTrans[8];
	sprintf(intervalTrans, "%06d", dcBuff.configData.intervalTrans);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 4, 6, intervalTrans);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_320_OnButton4;
	form.OnButton5 = Form_Return2_300;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 标定界面
// ********************************************

// 确认按钮
void Form_400_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[1] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	
			if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR) // 差压标定
				Change_Form(FORM_ID_410);
			else // 压力1标定
			{
				formParam.caliIdx = 0;
				Change_Form(FORM_ID_420);
			}
			break;
		case 1:	
			if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR) // 压力1标定
			{
				formParam.caliIdx = 0;
				Change_Form(FORM_ID_420);
			}
			else // 压力2标定
			{
				formParam.caliIdx = 1;
				Change_Form(FORM_ID_420);
			}
			break;
		case 2:	
			if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR) // 压力2标定
			{
				formParam.caliIdx = 1;
				Change_Form(FORM_ID_420);
			}
			else // 温度1标定
			{
				formParam.caliIdx = 0;
				Change_Form(FORM_ID_430);
			}
			break;
		case 3:
			if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR) // 温度1标定
			{
				formParam.caliIdx = 0;
				Change_Form(FORM_ID_430);
			}
			else // 温度2标定
			{
				formParam.caliIdx = 1;
				Change_Form(FORM_ID_430);
			}
			break;
		case 4:
			if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR) // 温度2标定
			{
				formParam.caliIdx = 1;
				Change_Form(FORM_ID_430);
			}
			break;
		default:
			break;
	}
}

void Form_400_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	// 3线制温度传感器无须标定(从v84开始，不区分2线/3线制)
	// SelectBox_Create(&form.Select3, 1, 4, dcBuff.configDisplay.op_PT100_3LINE ? 3 : 5, menu_400_items[dcBuff.configDisplay.op_USE_CAPACITY_SENSOR], formParam.menuIdx[1]);
	SelectBox_Create(&form.Select3, 0, 4, dcBuff.configDisplay.op_USE_CAPACITY_SENSOR ? 4 : 5, menu_400_items[dcBuff.configDisplay.op_USE_CAPACITY_SENSOR], formParam.menuIdx[1]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_400_OnButton4;
	form.OnButton5 = Form_Return2_000;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_400()
{
	formParam.menuIdx[2] = 0;
	Change_Form(FORM_ID_400);
}

// ********************************************
// 电容标定界面
// ********************************************

// 确认按钮
void Form_410_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[2] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// C1电容标定
			Change_Form(FORM_ID_411);
			break;
		case 1:	// C2电容标定
			Change_Form(FORM_ID_412);
			break;
		case 2:	// 偏移（零点）标定
			Change_Form(FORM_ID_413);
			break;
		default:
			break;
	}
}

void Form_410_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, dcBuff.configDisplay.op_USE_CAPACITY_SENSOR ? 2 : 3, 
			menu_410_items[dcBuff.configDisplay.op_USE_CAPACITY_SENSOR], formParam.menuIdx[2]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_410_OnButton4;
	if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)		
		form.OnButton5 = Form_Return2_400;
	else	
		form.OnButton5 = Form_Return2_000;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_410()
{
	Change_Form(FORM_ID_410);
}

// ********************************************
// C1电容标定界面
// ********************************************

void Form_411_OnButton1()
{
	// 自动采集电容AD值
	if(Comm_Sample())
		sprintf(form.Edit2.text, "%04d", dcBuff.sampleData.adDPress);

	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_411_OnButton4()
{
	// 保存C1
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		dcBuff.configSensor.sensorDPress.zeroValue = atoi(form.Edit2.text);
	else	
		dcBuff.configSensor.sensorCap.c1ADC = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_410();
}

void Form_411_Create()
{
	char c1[10];
	
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		sprintf(c1, "%04d", dcBuff.configSensor.sensorDPress.zeroValue);
	else
		sprintf(c1, "%04d", dcBuff.configSensor.sensorCap.c1ADC);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, c1);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_411_OnButton1;
	form.OnButton4 = Form_411_OnButton4;
	form.OnButton5 = Form_Return2_410;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// C2电容标定界面
// ********************************************

// 确认按钮
void Form_412_OnButton4()
{
	// 保存C2
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		dcBuff.configSensor.sensorDPress.fullValue = atoi(form.Edit2.text);
	else
		dcBuff.configSensor.sensorCap.c2ADC = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_410();
}

void Form_412_Create()
{
	char c2[10];
	
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		sprintf(c2, "%04d", dcBuff.configSensor.sensorDPress.fullValue);
	else
		sprintf(c2, "%04d", dcBuff.configSensor.sensorCap.c2ADC);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, c2);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_411_OnButton1;
	form.OnButton4 = Form_412_OnButton4;
	form.OnButton5 = Form_Return2_410;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 偏移（零点）标定界面
// ********************************************

// 确认按钮
void Form_413_OnButton4()
{
	int32_t range = dcBuff.configSensor.sensorDPress.fullValue - dcBuff.configSensor.sensorDPress.zeroValue;
	dcBuff.configSensor.sensorDPress.zeroValue = atoi(form.Edit2.text);
	dcBuff.configSensor.sensorDPress.fullValue = dcBuff.configSensor.sensorDPress.zeroValue + range;
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_410();
}

void Form_413_Create()
{
	char c1[10];
	
	sprintf(c1, "%04d", dcBuff.configSensor.sensorDPress.zeroValue);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, c1);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_411_OnButton1;
	form.OnButton4 = Form_413_OnButton4;
	form.OnButton5 = Form_Return2_410;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 压力标定界面
// ********************************************

// 确认按钮
void Form_420_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[2] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 低压力标定
			Change_Form(FORM_ID_421);
			break;
		case 1:	// 高压力标定
			Change_Form(FORM_ID_422);
			break;
		default:
			break;
	}
}

void Form_420_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 2, menu_420_items, formParam.menuIdx[2]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_420_OnButton4;
	form.OnButton5 = Form_Return2_400;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_420()
{
	Change_Form(FORM_ID_420);
}

// ********************************************
// 低压力标定界面
// ********************************************

void Form_421_OnButton1()
{
	// 自动采集压力AD值
	if(Comm_Sample())
	{
		if(formParam.caliIdx == 0)
			sprintf(form.Edit2.text, "%04d", dcBuff.sampleData.adPress);
		else
			sprintf(form.Edit2.text, "%04d", dcBuff.sampleData.adExtPress[0]);
	}

	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_421_OnButton4()
{
	// 保存低压力
	if(formParam.caliIdx == 0)
		dcBuff.configSensor.sensorPress.zeroValue = atoi(form.Edit2.text);
	else
		dcBuff.configSensor.sensorEPress[0].zeroValue = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_420();
}

void Form_421_Create()
{
	char press[10];
	
	if(formParam.caliIdx == 0)
		sprintf(press, "%04d", dcBuff.configSensor.sensorPress.zeroValue);
	else
		sprintf(press, "%04d", dcBuff.configSensor.sensorEPress[0].zeroValue);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, press);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_421_OnButton1;
	form.OnButton4 = Form_421_OnButton4;
	form.OnButton5 = Form_Return2_420;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 高压力标定界面
// ********************************************

// 确认按钮
void Form_422_OnButton4()
{
	// 保存高压力
	if(formParam.caliIdx == 0)
		dcBuff.configSensor.sensorPress.fullValue = atoi(form.Edit2.text);
	else
		dcBuff.configSensor.sensorEPress[0].fullValue = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_420();
}

void Form_422_Create()
{
	char press[10];
	
	if(formParam.caliIdx == 0)
		sprintf(press, "%04d", dcBuff.configSensor.sensorPress.fullValue);
	else
		sprintf(press, "%04d", dcBuff.configSensor.sensorEPress[0].fullValue);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, press);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_421_OnButton1;
	form.OnButton4 = Form_422_OnButton4;
	form.OnButton5 = Form_Return2_420;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 温度标定界面
// ********************************************
// 确认按钮
void Form_430_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[2] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 低温标定
			Change_Form(FORM_ID_431);
			break;
		case 1:	// 高温标定
			Change_Form(FORM_ID_432);
			break;
		default:
			break;
	}
}

void Form_430_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	if(formParam.caliIdx == 0)
		SelectBox_Create(&form.Select3, 0, 4, 2, menu_430_items[dcBuff.configDisplay.op_USE_PT100_SENSOR], formParam.menuIdx[2]);
	else
		SelectBox_Create(&form.Select3, 0, 4, 2, menu_430_items[1], formParam.menuIdx[2]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_430_OnButton4;
	form.OnButton5 = Form_Return2_400;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_430()
{
	Change_Form(FORM_ID_430);
}

// ********************************************
// 低温标定界面
// ********************************************

void Form_431_OnButton1()
{
	// 自动采集温度AD值
	if(Comm_Sample())
		sprintf(form.Edit2.text, "%04d", dcBuff.sampleData.adExtTempr[formParam.caliIdx]);

	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_431_OnButton4()
{
	if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)
		// 保存低温度
		dcBuff.configSensor.sensorMTempr[formParam.caliIdx].zeroValue = atoi(form.Edit2.text);
	else
		// 保存校准温度
		dcBuff.configSensor.sensorPTempr[formParam.caliIdx].calibrateT = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_430();
}

void Form_431_Create()
{
	char tempr[10];
	
	if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)
		sprintf(tempr, "%04d", dcBuff.configSensor.sensorMTempr[formParam.caliIdx].zeroValue);
	else
		sprintf(tempr, "%04d", dcBuff.configSensor.sensorPTempr[formParam.caliIdx].calibrateT);

	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, tempr);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)	
			Button_Create(&form.Button1, 0, 5, " AUT");
		else
			Button_Hide(&form.Button1);	
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)	
		form.OnButton1 = Form_431_OnButton1;
	else	
		form.OnDrawOthers = Form_DispPoint1;
	form.OnButton4 = Form_431_OnButton4;
	form.OnButton5 = Form_Return2_430;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 高温标定界面
// ********************************************

void Form_432_OnButton1()
{
	// 自动采集温度AD值
	if(Comm_Sample())
	{
		if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)
			sprintf(form.Edit2.text, "%04d", dcBuff.sampleData.adExtTempr[formParam.caliIdx]);
		else
		{
			if(dcBuff.configDisplay.op_DIFF_RESIST)		
				sprintf(form.Edit2.text, "%04d", (int16_t) dcBuff.sampleData.adExtTempr[formParam.caliIdx]); // 显示：Ω
			else
				sprintf(form.Edit2.text, "%04d", (int16_t) PT100_CalResit(dcBuff.sampleData.adExtTempr[formParam.caliIdx], 0)); // 显示：Ω
		}		
	}

	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_432_OnButton4()
{
	if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)
		// 保存高温度
		dcBuff.configSensor.sensorMTempr[formParam.caliIdx].fullValue = atoi(form.Edit2.text);
	else
		// 保存校准电阻
		dcBuff.configSensor.sensorPTempr[formParam.caliIdx].calibrateR = atoi(form.Edit2.text) * 10; // 保存：0.1Ω

	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_430();
}

void Form_432_Create()
{
	char tempr[10];
	
	if(formParam.caliIdx == 0 && !dcBuff.configDisplay.op_USE_PT100_SENSOR)
		sprintf(tempr, "%04d", dcBuff.configSensor.sensorMTempr[formParam.caliIdx].fullValue);
	else
		sprintf(tempr, "%04d", dcBuff.configSensor.sensorPTempr[formParam.caliIdx].calibrateR / 10); // 显示：Ω

	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, tempr);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	if(formParam.caliIdx == 0 && dcBuff.configDisplay.op_USE_PT100_SENSOR)	
	{
		//form.OnDrawOthers = Form_DispPoint1;	// 不显示小数点
	}	
	form.OnButton1 = Form_432_OnButton1;
	form.OnButton4 = Form_432_OnButton4;
	form.OnButton5 = Form_Return2_430;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 量程设置界面
// ********************************************

// 确认按钮
void Form_500_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[1] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 电容量程
			Change_Form(FORM_ID_510);
			break;
		case 1:	// 压力量程
		case 2:
			formParam.caliIdx = form.Select3.idx - 1;
			Change_Form(FORM_ID_520);
			break;
		case 3:	// 温度量程
			formParam.caliIdx = form.Select3.idx - 3;
			Change_Form(FORM_ID_530);
			break;
		default:
			break;
	}
}

void Form_500_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	// PT100温度传感器不设置量程
	SelectBox_Create(&form.Select3, 0, 4, dcBuff.configDisplay.op_USE_PT100_SENSOR ? 3 : 4, menu_500_items[dcBuff.configDisplay.op_USE_CAPACITY_SENSOR], formParam.menuIdx[1]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_500_OnButton4;
	form.OnButton5 = Form_Return2_000;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_500()
{
	formParam.menuIdx[2] = 0;
	Change_Form(FORM_ID_500);
}

// ********************************************
// 电容设置界面
// ********************************************

// 确认按钮
void Form_510_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[2] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 底电容设置
			Change_Form(FORM_ID_511);
			break;
		case 1:	// 增长电容设置
			Change_Form(FORM_ID_512);
			break;
		default:
			break;
	}
}

void Form_510_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 2, menu_510_items[dcBuff.configDisplay.op_USE_CAPACITY_SENSOR], formParam.menuIdx[2]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_510_OnButton4;
	if(!dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)			
		form.OnButton5 = Form_Return2_500;
	else	
		form.OnButton5 = Form_Return2_000;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_510()
{
	Change_Form(FORM_ID_510);
}

// ********************************************
// 底电容设置界面
// ********************************************

void Form_511_OnButton1()
{
	// 自动采集电容值
	if(Comm_Sample())
		sprintf(form.Edit2.text, "%04d", (int16_t) (dcBuff.sampleData.diff * 10));

	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_511_OnButton4()
{
	// 保存底电容
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		dcBuff.configSensor.sensorDPress.lowRange = atoi(form.Edit2.text);
	else
		dcBuff.configSensor.sensorCap.baseC = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_510();
}

void Form_511_Create()
{
	char baseC[10];
	
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		sprintf(baseC, "%04d", dcBuff.configSensor.sensorDPress.lowRange);
	else
		sprintf(baseC, "%04d", dcBuff.configSensor.sensorCap.baseC);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, baseC);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)	
			Button_Hide(&form.Button1);
		else
			Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_511_OnButton1;
	form.OnButton4 = Form_511_OnButton4;
	form.OnButton5 = Form_Return2_510;
	form.OnTimeOut = Form_Return2Meter;
	if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		form.OnDrawOthers = Form_DispPoint1;
}

// ********************************************
// 增长电容设置界面
// ********************************************

void Form_512_OnButton1()
{
	const float e = e_Src[dcBuff.configBottle.source];
	uint32_t d = dcBuff.configBottle.diameter;
	uint16_t refC;
	
	if(dcBuff.configBottle.type == BOTTLE_TYPE_STAND)
		d = dcBuff.configBottle.len + dcBuff.configBottle.lenExtra * 2 + dcBuff.configBottle.diameter / 2;

	// 自动计算增长电容
	refC = (uint16_t) (Adc_Sensor_Tables[0].k * (d - Adc_Sensor_Tables[0].nl_len) * (e - 1) * 10);
	sprintf(form.Edit2.text, "%04d", refC);
	
	form.cursorId = 2;
	Form_SetFocus();
}

// 确认按钮
void Form_512_OnButton4()
{
	// 保存底电容
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		dcBuff.configSensor.sensorDPress.highRange = atoi(form.Edit2.text);
	else
		dcBuff.configSensor.sensorCap.refC = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_510();
}

void Form_512_Create()
{
	char refC[10];
	
	if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		sprintf(refC, "%04d", dcBuff.configSensor.sensorDPress.highRange);
	else
		sprintf(refC, "%04d", dcBuff.configSensor.sensorCap.refC);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	EditBox_Create(&form.Edit2, 0, 4, 4, refC);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
	{
		if(!dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
			Button_Hide(&form.Button1);
		else
			Button_Create(&form.Button1, 0, 5, " AUT");
		Button_Create(&form.Button4, 0, 5, " YES");
	}
	else
	{
		Button_Hide(&form.Button1);
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_512_OnButton1;
	form.OnButton4 = Form_512_OnButton4;
	form.OnButton5 = Form_Return2_510;
	form.OnTimeOut = Form_Return2Meter;
	if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
		form.OnDrawOthers = Form_DispPoint1;
}

// ********************************************
// 压力量程设置界面
// ********************************************
// 确认按钮
void Form_520_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[2] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 压力低量程设置
			Change_Form(FORM_ID_521);
			break;
		case 1:	// 压力高量程设置
			Change_Form(FORM_ID_522);
			break;
		default:
			break;
	}
}

void Form_520_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 2, menu_520_items, formParam.menuIdx[2]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_520_OnButton4;
	form.OnButton5 = Form_Return2_500;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_520()
{
	Change_Form(FORM_ID_520);
}

// ********************************************
// 压力低量程设置界面
// ********************************************
// 确认按钮
void Form_521_OnButton4()
{
	// 保存压力低量程
	if(formParam.caliIdx == 0)
		dcBuff.configSensor.sensorPress.lowRange = atoi(form.Edit2.text) * 10;
	else
		dcBuff.configSensor.sensorEPress[0].lowRange = atoi(form.Edit2.text) * 10;
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_520();
}

void Form_521_Create()
{
	char range[10];
	
	if(formParam.caliIdx == 0)
		sprintf(range, "%03d", dcBuff.configSensor.sensorPress.lowRange / 10);
	else
		sprintf(range, "%03d", dcBuff.configSensor.sensorEPress[0].lowRange / 10);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 3, 3, range);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnDrawOthers = Form_DispPoint3;
	form.OnButton4 = Form_521_OnButton4;
	form.OnButton5 = Form_Return2_520;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 压力高量程设置界面
// ********************************************
// 确认按钮
void Form_522_OnButton4()
{
	// 保存压力高量程
	if(formParam.caliIdx == 0)
		dcBuff.configSensor.sensorPress.highRange = atoi(form.Edit2.text) * 10;
	else
		dcBuff.configSensor.sensorEPress[0].highRange = atoi(form.Edit2.text) * 10;
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_520();
}

void Form_522_Create()
{
	char range[10];
	
	if(formParam.caliIdx == 0)
		sprintf(range, "%03d", dcBuff.configSensor.sensorPress.highRange / 10);
	else
		sprintf(range, "%03d", dcBuff.configSensor.sensorEPress[0].highRange / 10);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 3, 3, range);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnDrawOthers = Form_DispPoint3;
	form.OnButton4 = Form_522_OnButton4;
	form.OnButton5 = Form_Return2_520;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 温度量程设置界面
// ********************************************
// 确认按钮
void Form_530_OnButton4()
{
	// 保存选项序号
	formParam.menuIdx[2] = form.Select3.idx;
	
	switch(form.Select3.idx)
	{
		case 0:	// 温度低量程设置
			Change_Form(FORM_ID_531);
			break;
		case 1:	// 温度高量程设置
			Change_Form(FORM_ID_532);
			break;
		default:
			break;
	}
}

void Form_530_Create()
{
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Hide(&form.Edit2);
	SelectBox_Create(&form.Select3, 0, 4, 2, menu_530_items, formParam.menuIdx[2]);
	Button_Create(&form.Button4, 0, 5, " YES");
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_530_OnButton4;
	form.OnButton5 = Form_Return2_500;
	form.OnTimeOut = Form_Return2Meter;
}

// 返回按钮
void Form_Return2_530()
{
	Change_Form(FORM_ID_530);
}

// ********************************************
// 温度低量程设置界面
// ********************************************
void Form_531_OnDrawOthers()
{
	Disp_DispChar(0, '-');
}

// 确认按钮
void Form_531_OnButton4()
{
	// 保存温度低量程
	dcBuff.configSensor.sensorMTempr[formParam.caliIdx].lowRange = -atoi(form.Edit2.text);

	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_530();
}

void Form_531_Create()
{
	char range[10];
	
	sprintf(range, "%03d", -dcBuff.configSensor.sensorMTempr[formParam.caliIdx].lowRange);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 3, 3, range);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnDrawOthers = Form_531_OnDrawOthers;
	form.OnButton4 = Form_531_OnButton4;
	form.OnButton5 = Form_Return2_530;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 温度高量程设置界面
// ********************************************
// 确认按钮
void Form_532_OnButton4()
{
	// 保存温度高量程
	dcBuff.configSensor.sensorMTempr[formParam.caliIdx].highRange = atoi(form.Edit2.text);
	
	// 保存
	Config_SaveConfig();
	
	// 返回上级菜单
	Form_Return2_530();
}

void Form_532_Create()
{
	char range[10];
	
	sprintf(range, "%03d", dcBuff.configSensor.sensorMTempr[formParam.caliIdx].highRange);
	
	memset(&form, 0, sizeof(form));
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 3, 3, range);
	SelectBox_Hide(&form.Select3);
	if(formParam.privilege == 2)
		Button_Create(&form.Button4, 0, 5, " YES");
	else
	{
		Button_Hide(&form.Button4);
		EditBox_ReadOnly(&form.Edit2);
	}
	Button_Create(&form.Button5, 0, 5, " ESC");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton4 = Form_532_OnButton4;
	form.OnButton5 = Form_Return2_530;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 系统信息界面
// ********************************************
// 复位按钮
void Form_600_OnButton5()
{
	// 复位
	 VCC_GSM_OFF();
	 delay_ms(200);
	 NVIC_SystemReset();	
}

void Form_600_OnKey(u8 key)
{
	if(key == KEY_DOWN)
	{
		if(formParam.infoPage >= 1)
			formParam.infoPage = 0;
		else
			formParam.infoPage++;
		
		if(formParam.infoPage == 0)
			sprintf(form.Edit2.text, "%02d%02d", dcBuff.displayInfo.softDate.month, dcBuff.displayInfo.softDate.day);
		else
			sprintf(form.Edit2.text, "%3d", dcBuff.displayInfo.softVer.minor);
	}
}

void Form_600_Create()
{
	char version[8];
	
	memset(&form, 0, sizeof(form));

	// 默认显示软件版本
	formParam.infoPage = 0;
	
	sprintf(version, "%02d%02d", dcBuff.displayInfo.softDate.month, dcBuff.displayInfo.softDate.day);

	// 控件
	Button_Create(&form.Button1, 0, 5, " ESC");
	EditBox_Create(&form.Edit2, 0, 4, 4, version);
	EditBox_ReadOnly(&form.Edit2);
	SelectBox_Hide(&form.Select3);
	Button_Hide(&form.Button4);
	Button_Create(&form.Button5, 0, 5, " RST");
	
	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnButton1 = Form_Return2_000;
	form.OnButton5 = Form_600_OnButton5;
	form.OnTimeOut = Form_Return2Meter;
	form.OnKey = Form_600_OnKey;
}

// ********************************************
// 查看真空度界面
// ********************************************
void Form_700_OnDrawOthers()
{
	// 提示真空度
	Disp_SwitchVacuUnit(UNIT_PA);
	// 显示小数点
	Disp_Fld1PointOff();
	if(form.cursorId == 2)
	{
		if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_OK
			&& dcBuff.sampleData.vacuum[0].vacuum > 0.00999999
			&& dcBuff.sampleData.vacuum[0].vacuum <= 99.99999999)
		{
			Disp_Fld1PointOn(2);
		}
	}
}

void Form_700_OnButton5()
{
	s8 text[10];

	while(Sample_Busy())
		osDelay(1);

	Config_Vacuum_Request = 1;	// 强制测量真空度
	Config_Sample_Request = 1;
	// 采集数据
	Sample_Notify();
	while(Config_Sample_Request)
		osDelay(1);

	if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_COMM_FAULT)
	    strcpy(text, " ---");
	else if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_FAULT || dcBuff.sampleData.vacuum[0].vacuum > 99.99999999)
	    strcpy(text, " +EE");
    else if(dcBuff.sampleData.vacuum[0].vacuum > 0.00999999)
    {
		sprintf(text, " %04d", (uint16_t) (dcBuff.sampleData.vacuum[0].vacuum * 100));
		// 至少要显示3位数字
		if(text[1] == '0')
			text[1] = ' ';
    }
	else
	    strcpy(text, " -EE");

	strcpy(form.Edit2.text, text);
	
	form.cursorId = 2; 			// 光标到返回按钮
	Form_SetFocus();
}

void Form_700_Create()
{
	s8 text[10];
	
	memset(&form, 0, sizeof(form));	

	if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_COMM_FAULT)
	    strcpy(text, " ---");
	else if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_FAULT || dcBuff.sampleData.vacuum[0].vacuum > 99.99999999)
	    strcpy(text, " +EE");
    else if(dcBuff.sampleData.vacuum[0].vacuum > 0.00999999)
    {
		sprintf(text, " %04d", (uint16_t) (dcBuff.sampleData.vacuum[0].vacuum * 100));
		// 至少要显示3位数字
		if(text[1] == '0')
			text[1] = ' ';
    }
	else
	    strcpy(text, " -EE");
	
	// 控件
	Button_Hide(&form.Button1);
	EditBox_Create(&form.Edit2, 0, 5, 5, text);
	EditBox_ReadOnly(&form.Edit2);
	SelectBox_Hide(&form.Select3);
	Button_Create(&form.Button4, 0, 5, " ESC");
	Button_Create(&form.Button5, 0, 5, " AUT");

	Form_timeout = OPERATE_TIMEOUT;
	
	// 事件回调
	form.OnDrawOthers = Form_700_OnDrawOthers;
	form.OnButton4 = Form_Return2Meter;
	form.OnButton5 = Form_700_OnButton5;
	form.OnTimeOut = Form_Return2Meter;
}

// ********************************************
// 切换各个功能界面
// ********************************************
void Change_Form(TForm_Id formId)
{
	// 清屏
	Disp_Clear();
	
	switch(formId)
	{
		case FORM_ID_START: 		// 启动界面
			Form_Start_Create();
			break;
		case FORM_ID_METER:		// 表盘显示
			Form_Meter_Create();
			break;
		case FORM_ID_PWD:		// 输入密码
			Form_Pwd_Create();
			break;
		case FORM_ID_000: 	// 设置菜单
			Form_000_Create();
			break;
		case FORM_ID_100: 	// PSN设置
			Form_100_Create();
			break;
		case FORM_ID_200: 	// 储罐信息设置
			Form_200_Create();
			break;
		case FORM_ID_210: 	// 储罐类型设置
			Form_210_Create();
			break;
		case FORM_ID_220: 	// 介质设置
			Form_220_Create();
			break;
		case FORM_ID_230: 	// 长度设置
			Form_230_Create();
			break;
		case FORM_ID_240: 	// 直径设置
			Form_240_Create();
			break;
		case FORM_ID_250: 	// 充装比设置
			Form_250_Create();
			break;
		case FORM_ID_251: 	// 低液位百分比设置
			Form_251_Create();
			break;
		case FORM_ID_260: 	// 密度设置
			Form_260_Create();
			break;
		case FORM_ID_270: 	// 压力报警低点设置
			Form_270_Create();
			break;
		case FORM_ID_271: 	// 压力报警高点设置
			Form_271_Create();
			break;
		case FORM_ID_272: 	// 压力报警低点设置
			Form_272_Create();
			break;
		case FORM_ID_273: 	// 压力报警高点设置
			Form_273_Create();
			break;
		case FORM_ID_280: 	// 容积显示
			Form_280_Create();
			break;
		case FORM_ID_285: 	// 4~20mA输出液位高度
			Form_285_Create();
			break;
		case FORM_ID_300: 	// 上报周期设置
			Form_300_Create();
			break;
		case FORM_ID_310: 	// 采集周期设置
			Form_310_Create();
			break;
		case FORM_ID_320: 	// 发送周期设置
			Form_320_Create();
			break;
		case FORM_ID_400: 	// 标定界面
			Form_400_Create();
			break;
		case FORM_ID_410: 	// 电容标定
			Form_410_Create();
			break;
		case FORM_ID_411: 	// C1（100pF）标定
			Form_411_Create();
			break;
		case FORM_ID_412: 	// C2（400pF）标定
			Form_412_Create();
			break;
		case FORM_ID_413: 	// 偏移（零点）标定
			Form_413_Create();
			break;
		case FORM_ID_420: 	// 压力标定
			Form_420_Create();
			break;
		case FORM_ID_421: 	// 低压力标定
			Form_421_Create();
			break;
		case FORM_ID_422: 	// 高压力标定
			Form_422_Create();
			break;
		case FORM_ID_430: 	// 温度标定
			Form_430_Create();
			break;
		case FORM_ID_431: 	// 低温度标定
			Form_431_Create();
			break;
		case FORM_ID_432: 	// 高温度标定
			Form_432_Create();
			break;
		case FORM_ID_500: 	// 量程设置
			Form_500_Create();
			break;
		case FORM_ID_510: 	// 电容量程
			Form_510_Create();
			break;
		case FORM_ID_511: 	// 底电容设置
			Form_511_Create();
			break;
		case FORM_ID_512: 	// 增长电容设置
			Form_512_Create();
			break;
		case FORM_ID_520: 	// 压力量程
			Form_520_Create();
			break;
		case FORM_ID_521: 	// 压力低量程设置
			Form_521_Create();
			break;
		case FORM_ID_522: 	// 压力高量程设置
			Form_522_Create();
			break;
		case FORM_ID_530: 	// 温度量程
			Form_530_Create();
			break;
		case FORM_ID_531: 	// 温度低量程设置
			Form_531_Create();
			break;
		case FORM_ID_532: 	// 温度高量程设置
			Form_532_Create();
			break;
		case FORM_ID_600: 	// 系统信息
			Form_600_Create();
			break;
		case FORM_ID_700: 	// 查看真空度
			Form_700_Create();
			break;
		default:
			break;
	}
	
	// 第一个控件设置焦点
	Form_FocusFirst();
	
	// 重置超时计数
	Form_ResetTimer();
}

void Form_Start()
{
	// 初始化
	memset(&formParam, 0, sizeof(formParam));

	// 检查合法性
	Check_L_Unit(KEY_UP);
	
	// 启动界面
	Change_Form(FORM_ID_START);
}

uint32_t Comm_Sample()
{
	while(Sample_Busy())
		osDelay(1);

	Config_Sample_Request = 1;
	// 采集数据
	Sample_Notify();

	while(Config_Sample_Request)
		osDelay(1);

	return TRUE;
}
