#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "touch.h"
/************************************************
 ALIENTEK 阿波罗STM32F429开发板实验30
 触摸屏实验-HAL库函数版
 技术支持：www.openedv.com
 淘宝店铺：http://eboard.taobao.com  
 关注微信公众平台微信号："正点原子"，免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者：正点原子 @ALIENTEK
************************************************/

//清空屏幕并在右上角显示"RST"
void Load_Drow_Dialog(void)
{
	LCD_Clear(WHITE);//清屏   
	//LCD_Clear(RED);//清屏
 	//POINT_COLOR=BLUE;//设置字体为蓝色 
	LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
  	POINT_COLOR=RED;//设置画笔蓝色 
}
////////////////////////////////////////////////////////////////////////////////
//电容触摸屏专有部分
//画水平线
//x0,y0:坐标
//len:线长度
//color:颜色
void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
{
	if(len==0)return;
	LCD_Fill(x0,y0,x0+len-1,y0,color);	
}
//画实心圆
//x0,y0:坐标
//r:半径
//color:颜色
void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
{											  
	u32 i;
	u32 imax = ((u32)r*707)/1000+1;
	u32 sqmax = (u32)r*(u32)r+(u32)r/2;
	u32 x=r;
	gui_draw_hline(x0-r,y0,2*r,color);
	for (i=1;i<=imax;i++) 
	{
		if ((i*i+x*x)>sqmax)// draw lines from outside  
		{
 			if (x>imax) 
			{
				gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
				gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
			}
			x--;
		}
		// draw lines from inside (center)  
		gui_draw_hline(x0-x,y0+i,2*x,color);
		gui_draw_hline(x0-x,y0-i,2*x,color);
	}
}  
//两个数之差的绝对值 
//x1,x2：需取差值的两个数
//返回值：|x1-x2|
u16 my_abs(u16 x1,u16 x2)
{			 
	if(x1>x2)return x1-x2;
	else return x2-x1;
}  
//画一条粗线
//(x1,y1),(x2,y2):线条的起始坐标
//size：线条的粗细程度
//color：线条的颜色
void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
{
	u16 t; 
	int xerr=0,yerr=0,delta_x,delta_y,distance; 
	int incx,incy,uRow,uCol; 
	if(x1<size|| x2<size||y1<size|| y2<size)return; 
	delta_x=x2-x1; //计算坐标增量 
	delta_y=y2-y1; 
	uRow=x1; 
	uCol=y1; 
	if(delta_x>0)incx=1; //设置单步方向 
	else if(delta_x==0)incx=0;//垂直线 
	else {incx=-1;delta_x=-delta_x;} 
	if(delta_y>0)incy=1; 
	else if(delta_y==0)incy=0;//水平线 
	else{incy=-1;delta_y=-delta_y;} 
	if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 
	else distance=delta_y; 
	for(t=0;t<=distance+1;t++ )//画线输出 
	{  
		gui_fill_circle(uRow,uCol,size,color);//画点 
		xerr+=delta_x ; 
		yerr+=delta_y ; 
		if(xerr>distance) 
		{ 
			xerr-=distance; 
			uRow+=incx; 
		} 
		if(yerr>distance) 
		{ 
			yerr-=distance; 
			uCol+=incy; 
		} 
	}  
}   
////////////////////////////////////////////////////////////////////////////////
//5个触控点的颜色(电容触摸屏用)												 
const u16 POINT_COLOR_TBL[5]={RED,GREEN,BLUE,BROWN,GRED};  
//电阻触摸屏测试函数
void rtp_test(void)
{
	u8 key;
	u8 i=0;	  
	while(1)
	{
	 	key=KEY_Scan(0);
		tp_dev.scan(0); 		 
		if(tp_dev.sta&TP_PRES_DOWN)			//触摸屏被按下
		{	
		 	if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
			{	
				if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
				else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);		//画图	  			   
			}
		}else delay_ms(10);	//没有按键按下的时候 	    
		if(key==KEY0_PRES)	//KEY0按下,则执行校准程序
		{
			LCD_Clear(WHITE);	//清屏
		    TP_Adjust();  		//屏幕校准 
			TP_Save_Adjdata();	 
			Load_Drow_Dialog();
		}
		i++;
		if(i%20==0)LED0=!LED0;
	}
}
//电容触摸屏测试函数
void ctp_test(void)
{
	u8 t=0;
	u8 i=0;	  	    
 	u16 lastpos[5][2];		//最后一次的数据 
	while(1)
	{
		tp_dev.scan(0);
		for(t=0;t<5;t++)
		{
			if((tp_dev.sta)&(1<<t))
			{
        //printf("X坐标:%d,Y坐标:%d\r\n",tp_dev.x[0],tp_dev.y[0]);
				if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)
				{
					if(lastpos[t][0]==0XFFFF)
					{
						lastpos[t][0] = tp_dev.x[t];
						lastpos[t][1] = tp_dev.y[t];
					}
                    
					lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2,POINT_COLOR_TBL[t]);//画线
					lastpos[t][0]=tp_dev.x[t];
					lastpos[t][1]=tp_dev.y[t];
					if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<20)
					{
						Load_Drow_Dialog();//清除
					}
				}
			}else lastpos[t][0]=0XFFFF;
		}
		
		delay_ms(5);i++;
		
		if(i%20==0)LED0=!LED0;
		
	}	
}

int main(void)
{
	u8 key;
	u8 m=1;
	  //u8 AUTO=0;
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
    LCD_Init();                     //初始化LCD
		tp_dev.init();				          //触摸屏初始化
	
#if 1
	
	  while(1)
		{
			key=KEY_Scan(0); 	  //得到键值
			if(key==2)  m++;    //KEY1下翻
			else if(key==4) m--;//KEY4上翻
			switch(m)			
			{			
				//case 0:	
				//LCD_Clear(0xFFFF);
				//break;
				case 1:	
				LCD_Clear(0xF800);
				break;					
				case 2:	
				LCD_Clear(0x07E0);
				break;								
				case 3:	
				LCD_Clear(0x001F);
				break;			
				case 4:	
				LCD_Clear(0x8410);
				break;		
				case 5:
				LCD_Clear(0xFFFF);
				break;
				case 6:
				LCD_Clear(0x0000);
				break;
				case 7:
				display_HDBK(800,480,0x0000,0xFFFF);
				break;
				case 8:
				display_colorbar_H();
				break;
				case 9:
				display_colorbar_V();
				break;
				case 10:
				qipan_display1(800,480,80,80);
				break;
				case 11:
				display_crosstalk(800,480,150,150);
				break;
				case 12:
				display_gray_H();
				break;
				case 13:
				display_gray_V();
				break;
				case 14:	
				//display_pic();
				LCD_Clear(0xFFFF);
				break;	
				case 15:
				{
				LCD_Clear(0xFFFF);
				POINT_COLOR=RED;
				LCD_ShowString(30,50,200,16,16,"Apollo STM32F429"); 
				LCD_ShowString(30,70,200,16,16,"TFT MODULE TEST");	
				LCD_ShowString(30,90,200,16,16,"WKS70WV001-WCT");
				LCD_ShowString(30,110,200,16,16,"2016/10/16");	 
				if(tp_dev.touchtype!=0XFF) LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
				delay_ms(1000);
				Load_Drow_Dialog();	 	

				if(tp_dev.touchtype&0X80)ctp_test();//电容屏测试
				else rtp_test(); 	
				}
				break;
					
			}
			
			if(m==16) m=1;
			if(m==0)  m=15;
			
		}
	
	#endif	
	
	
	
	
	
	
	
#if 0
	
	  while(1)
		{
			key=KEY_Scan(0); 	  //得到键值
			if(key==2)  m++;    //KEY1下翻
			else if(key==4) m--;//KEY4上翻
			switch(m)			
			{			
				//case 0:	
				//LCD_Clear(0xFFFF);
				//break;
				case 1:	
				LCD_Clear(0xF800);
				break;					
				case 2:	
				LCD_Clear(0x07E0);
				break;								
				case 3:	
				LCD_Clear(0x001F);
				break;			
				case 4:	
				LCD_Clear(0x8410);
				break;		
				case 5:
				LCD_Clear(0xFFE0);
				break;
				case 7:
				LCD_Clear(0x07FF);
				break;	
				case 8:
				LCD_Clear(0xF81F);
				break;
				case 9:
				LCD_Clear(0xFFFF);
				break;
				case 10:
				LCD_Clear(0x0000);
				break;
				case 11:
				display_HDBK(800,480,0x0000,0xFFFF);
				break;
				case 12:
				display_colorbar_H();
				break;
				case 13:
				display_colorbar_V();
				break;
				case 14:
				qipan_display1(800,480,80,80);
				break;
				case 15:
				display_crosstalk(800,480,150,150);
				break;
				case 16:
				display_gray_H();
				break;
				case 17:
				display_gray_V();
				break;
				case 18:	
				display_pic();
				//LCD_Clear(0xFFFF);
				break;	
				case 19:
				{

				POINT_COLOR=RED;
				LCD_ShowString(30,50,200,16,16,"Apollo STM32F429"); 
				LCD_ShowString(30,70,200,16,16,"TFT MODULE TEST");	
				LCD_ShowString(30,90,200,16,16,"WKS70WV001-WCT");
				LCD_ShowString(30,110,200,16,16,"2016/10/16");	 
	
				if(tp_dev.touchtype!=0XFF) LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示

				delay_ms(1000);
				Load_Drow_Dialog();	 	

				if(tp_dev.touchtype&0X80)ctp_test();//电容屏测试
				else rtp_test(); 	
				}
				break;
					
			}
			
			if(m==20) m=1;
			if(m==0)  m=19;
			
		}
	
	#endif
		
		

		
		
		#if 0
	
		display_pic();
		delay_ms(1000);
		display_HDBK(800,480,0x0000,0xFFFF);
		delay_ms(1000);
		display_colorbar_H();
		delay_ms(1000);
		display_colorbar_V();
		delay_ms(1000);
		qipan_display1(800,480,80,80);
		delay_ms(1000);
		display_crosstalk(800,480,150,150);
		delay_ms(1000);
		display_gray_H();
		delay_ms(1000);
		display_gray_V();
		delay_ms(1000);
		LCD_Clear(0xF800);
		delay_ms(1000);
		LCD_Clear(0x07E0);
		delay_ms(1000);
		LCD_Clear(0x001F);
		delay_ms(1000);
		LCD_Clear(0x8410);
		delay_ms(1000);
		LCD_Clear(0xFFE0);
		delay_ms(1000);
		LCD_Clear(0x07FF);
		delay_ms(1000);
		LCD_Clear(0xF81F);
		delay_ms(1000);
		LCD_Clear(0x0000);
		delay_ms(1000);
		LCD_Clear(0xFFFF);
		delay_ms(1000);
		
	
		
		POINT_COLOR=RED;
		LCD_ShowString(30,50,200,16,16,"Apollo STM32F429"); 
		LCD_ShowString(30,70,200,16,16,"TFT MODULE TEST");	
		LCD_ShowString(30,90,200,16,16,"WKS70WV001-WCT");
		LCD_ShowString(30,110,200,16,16,"2016/10/16");	 
		
    	if(tp_dev.touchtype!=0XFF) LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示

		delay_ms(1500);
		Load_Drow_Dialog();	 	

		if(tp_dev.touchtype&0X80) ctp_test();//电容屏测试
		else rtp_test(); 										//电阻屏测试  
	#endif

}
