/*
*********************************************************************************************************
*
*	模块名称 : 触摸测试界面。
*	文件名称 : touch_test.c
*	版    本 : V1.0
*	说    明 : 测试屏是否有缺陷，触摸是否准确
*	修改记录 :
*		版本号  日期        作者     说明
*		V1.0    2013-01-01 armfly  正式发布
*
*	Copyright (C), 2012-2013, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#include "bsp.h"			/* printf函数定向输出到串口，所以必须包含这个文件 */

#include "main_menu.h"
#include "images.h"
#include "param.h"

/* 返回按钮的坐标(屏幕右下角) */
#define BUTTON_RET_H	32
#define BUTTON_RET_W	60
#define	BUTTON_RET_X	(g_LcdWidth - BUTTON_RET_W - 4)
#define	BUTTON_RET_Y	(g_LcdHeight - BUTTON_RET_H - 4)

/*
*********************************************************************************************************
*	函 数 名: TestTouch
*	功能说明: 触摸测试
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void TestTouch(void)
{
	uint8_t ucKeyCode;		/* 按键代码 */
	uint8_t ucTouch;		/* 触摸事件 */
	uint8_t fRefresh;		/* 刷屏请求标志,1表示需要刷新 */
	FONT_T tFont, tFontBtn;	/* 定义一个字体结构体变量，用于设置字体参数 */
	char buf[64];
	uint16_t usAdcX, usAdcY;
	int16_t tpX, tpY;

	BUTTON_T tBtn;

	LCD_ClrScr(CL_BLUE);  	/* 清屏，背景蓝色 */

	/* 设置字体参数 */
	{
		tFont.FontCode = FC_ST_16;	/* 字体代码 16点阵 */
		tFont.FrontColor = CL_WHITE;	/* 字体颜色 */
		tFont.BackColor = CL_BLUE;	/* 文字背景颜色 */
		tFont.Space = 0;				/* 文字间距，单位 = 像素 */
	}
	
	{
		tFontBtn.FontCode = FC_ST_16;
		tFontBtn.BackColor = CL_MASK;		/* 背景透明 */
		tFontBtn.FrontColor = CL_BLACK;
		tFontBtn.Space = 0;
	}
	
	LCD_SetBackLight(g_tParam.ucBackLight);			/* 设置背光亮度 */	
	
	fRefresh = 1;	/* 1表示需要刷新LCD */
	while (1)
	{
		bsp_Idle();

		if (fRefresh)
		{
			fRefresh = 0;

			/* 实时刷新触摸ADC采样值和转换后的坐标 */
			{
				LCD_DispStr(5, 3, "触摸屏 按键 摇杆 LED指示灯测试", &tFont);			/* 在(8,3)坐标处显示一串汉字 */

				/* 显示TFT控制器型号和屏幕分辨率 */
				LCD_GetChipDescribe(buf);	/* 读取TFT驱动芯片型号 */
				sprintf(&buf[strlen(buf)], "   %d x %d", LCD_GetWidth(), LCD_GetHeight());
				LCD_DispStr(5, 23, buf, &tFont);			/* 在(8,3)坐标处显示一串汉字 */

				if (g_ChipID == IC_8875)
				{
					/* 设置颜色，绿底红字 */
					RA8875_SetFrontColor(CL_RED);
					RA8875_SetBackColor(CL_GREEN);

					/* RA8875_DispStr 函数是利用RA8875外部字库芯片显示字符串，支持ASCII和汉字 */

					/* 原生16点阵 */
					RA8875_SetFont(RA_FONT_16, 0, 0);
					RA8875_SetTextZoom(RA_SIZE_X1, RA_SIZE_X1);
					RA8875_DispStr(5, 40, "RA8875外置字库芯片OK");
				}

				/* 读取并显示当前X轴和Y轴的ADC采样值 */
				usAdcX = TOUCH_ReadAdcX();
				usAdcY = TOUCH_ReadAdcY();
				sprintf(buf, "触摸ADC值 X = %4d, Y = %4d   ", usAdcX, usAdcY);
				LCD_DispStr(5, 60, buf, &tFont);

				/* 读取并显示当前触摸坐标 */
				tpX = TOUCH_GetX();
				tpY = TOUCH_GetY();
				sprintf(buf, "触摸坐标  X = %4d, Y = %4d   ", tpX, tpY);
				LCD_DispStr(5, 80, buf, &tFont);

				/* 在触笔所在位置显示一个小圈 */
				if ((tpX > 0) && (tpY > 0))
				{
					LCD_DrawCircle(tpX, tpY, 2, CL_YELLOW);
				}
			}

			/* 显示图标阵列 */
			{
				tBtn.Font = &tFontBtn;

				tBtn.Left = BUTTON_RET_X;
				tBtn.Top = BUTTON_RET_Y;
				tBtn.Height = BUTTON_RET_H;
				tBtn.Width = BUTTON_RET_W;
				tBtn.Focus = 0;	/* 失去焦点 */
				tBtn.pCaption = "返回";
				LCD_DrawButton(&tBtn);
			}

			/* 在屏幕边沿绘制2个矩形框(用于检测面板边缘像素是否正常) */
			LCD_DrawRect(0, 0, LCD_GetHeight(), LCD_GetWidth(), CL_WHITE);
			LCD_DrawRect(2, 2, LCD_GetHeight() - 4, LCD_GetWidth() - 4, CL_YELLOW);
			
			/* 显示背光值 */			
			sprintf(buf, "当前背光亮度: %3d", g_tParam.ucBackLight);
			LCD_DispStr(5, 130, buf, &tFont);			
		}

		ucTouch = TOUCH_GetKey(&tpX, &tpY);	/* 读取触摸事件 */
		if (ucTouch != TOUCH_NONE)
		{
			switch (ucTouch)
			{
				case TOUCH_DOWN:		/* 触笔按下事件 */
					BEEP_KeyTone();		/* 按键提示音 */
					if (TOUCH_InRect(tpX, tpY, BUTTON_RET_X, BUTTON_RET_Y, BUTTON_RET_H, BUTTON_RET_W))
					{
					    tBtn.Font = &tFontBtn;

						tBtn.Left = BUTTON_RET_X;
						tBtn.Top = BUTTON_RET_Y;
						tBtn.Height = BUTTON_RET_H;
						tBtn.Width = BUTTON_RET_W;
						tBtn.Focus = 1;	/* 焦点 */
						tBtn.pCaption = "返回";
						LCD_DrawButton(&tBtn);
					}

					/* 在触笔所在位置显示一个小圈 */
					if ((tpX > 0) && (tpY > 0))
					{
						LCD_DrawCircle(tpX, tpY, 3, CL_RED);
					}
					break;

				case TOUCH_MOVE:		/* 触笔移动事件 */
					/* 实时刷新触摸ADC采样值和转换后的坐标 */
					{
						/* 读取并显示当前X轴和Y轴的ADC采样值 */
						usAdcX = TOUCH_ReadAdcX();
						usAdcY = TOUCH_ReadAdcY();
						sprintf(buf, "触摸ADC值 X = %4d, Y = %4d   ", usAdcX, usAdcY);
						LCD_DispStr(5, 60, buf, &tFont);

						/* 读取并显示当前触摸坐标 */
						tpX = TOUCH_GetX();
						tpY = TOUCH_GetY();
						sprintf(buf, "触摸坐标  X = %4d, Y = %4d   ", tpX, tpY);
						LCD_DispStr(5, 80, buf, &tFont);

						/* 在触笔所在位置显示一个小圈 */
						if ((tpX > 0) && (tpY > 0))
						{
							LCD_DrawCircle(tpX, tpY, 2, CL_YELLOW);
						}
					}
					break;

				case TOUCH_RELEASE:		/* 触笔释放事件 */
					/* 在触笔所在位置显示一个小圈 */
					if ((tpX > 0) && (tpY > 0))
					{
						LCD_DrawCircle(tpX, tpY, 4, CL_WHITE);
					}

					if (TOUCH_InRect(tpX, tpY, BUTTON_RET_X, BUTTON_RET_Y, BUTTON_RET_H, BUTTON_RET_W))
					{
						tBtn.Font = &tFontBtn;

						tBtn.Left = BUTTON_RET_X;
						tBtn.Top = BUTTON_RET_Y;
						tBtn.Height = BUTTON_RET_H;
						tBtn.Width = BUTTON_RET_W;
						tBtn.Focus = 1;	/* 焦点 */
						tBtn.pCaption = "返回";
						LCD_DrawButton(&tBtn);
						
						SaveParam();	/* 保存参数 */
						return;		/* 返回 */
					}
					else	/* 按钮失去焦点 */
					{
						tBtn.Font = &tFontBtn;

						tBtn.Left = BUTTON_RET_X;
						tBtn.Top = BUTTON_RET_Y;
						tBtn.Height = BUTTON_RET_H;
						tBtn.Width = BUTTON_RET_W;
						tBtn.Focus = 0;	/* 焦点 */
						tBtn.pCaption = "返回";
						LCD_DrawButton(&tBtn);

					}
			}
		}

		ucKeyCode = bsp_GetKey();	/* 读取键值, 无键按下时返回 KEY_NONE = 0 */
		if (ucKeyCode != KEY_NONE)
		{
			/* 有键按下 */
			switch (ucKeyCode)
			{
				case KEY_DOWN_K1:			/* K1键按下 */
					LCD_DispStr(5, 110, "K1键按下    ", &tFont);	
					bsp_LedOn(1);	/* 点亮LED1 */
					break;
				
				case KEY_UP_K1:				/* K1键松开 */
					LCD_DispStr(5, 110, "K1键松开    ", &tFont);					
					bsp_LedOff(1);	/* 熄灭LED1 */
					break;				

				case KEY_DOWN_K2:			/* K2键按下 */
					LCD_DispStr(5, 110, "K2键按下    ", &tFont);	
					bsp_LedOn(2);	/* 点亮LED2 */				
					break;
				
				case KEY_UP_K2:				/* K2键松开 */
					LCD_DispStr(5, 110, "K2键松开    ", &tFont);
					bsp_LedOff(2);	/* 熄灭LED2 */
					break;				

				case KEY_DOWN_K3:			/* K3键按下 */
					LCD_DispStr(5, 110, "K3键按下    ", &tFont);	
					bsp_LedOn(3);	/* 点亮LED3 */				
					break;
				
				case KEY_UP_K3:				/* K3键松开 */
					LCD_DispStr(5, 110, "K3键松开    ", &tFont);	
					bsp_LedOff(3);	/* 熄灭LED3 */				
					break;				

				case JOY_DOWN_U:			/* 摇杆UP键按下 */
					LCD_DispStr(5, 110, "摇杆上键按下", &tFont);	
					if (g_tParam.ucBackLight < 255)
					{
						g_tParam.ucBackLight++;
					}
					LCD_SetBackLight(g_tParam.ucBackLight);		/* 设置背光亮度 */	
					fRefresh = 1;
					break;

				case JOY_DOWN_D:			/* 摇杆DOWN键按下 */
					LCD_DispStr(5, 110, "摇杆下键按下", &tFont);
					if (g_tParam.ucBackLight > 0)
					{
						g_tParam.ucBackLight--;
					}
					LCD_SetBackLight(g_tParam.ucBackLight);		/* 设置背光亮度 */
					fRefresh = 1;
					break;

				case JOY_DOWN_L:			/* 摇杆LEFT键按下 */
					LCD_DispStr(5, 110, "摇杆左键按下", &tFont);
					break;

				case JOY_DOWN_R:			/* 摇杆RIGHT键按下 */
					LCD_DispStr(5, 110, "摇杆右键按下", &tFont);
					break;

				case JOY_DOWN_OK:			/* 摇杆OK键按下 */
					LCD_DispStr(5, 110, "摇杆OK键按下", &tFont);
					bsp_LedOn(4);	/* 点亮LED4 */				
					break;
				
				case JOY_UP_OK:				/* 摇杆OK键松开 */
					LCD_DispStr(5, 110, "摇杆OK键松开    ", &tFont);
					bsp_LedOff(4);	/* 熄灭LED4 */					
					break;					

				default:
					/* 其他的键值不处理 */
					break;
			}
		}
	}
}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
