#ifndef __BSP_LTDC_H
#define __BSP_LTDC_H

#ifdef __cplusplus
	extern "C" {
#endif
#include "main.h"
#include "stm32f4xx.h"
#include "ltdc.h"
// #include "fonts.h"

#define LCD_BUF_ADDRESS 0xD0000000
#define LCD_PIXFORMAT	LTDC_PIXEL_FORMAT_ARGB8888
#define LTDC_BACKLAYERCOLOR			0X00000000	
// #define LCD_DEFAULT_FONT        Font16 
 	
// extern LTDC_HandleTypeDef *Ltdc_Handler;
extern uint8_t *DISP_BUF[2];

typedef struct  
{	
	uint16_t pixel_width;   // 像素宽
	uint16_t pixel_height;  // 像素高
	// uint16_t width;			//LCD 宽度
	// uint16_t height;			//LCD 高度

	// uint8_t  dir;			//横屏还是竖屏控制：0，竖屏；1，横屏。
	// uint8_t  pixelsize;			//像素大小。

	uint8_t hbp;  //HSYNC后的无效像素
	uint8_t vbp;  //VSYNC后的无效行数
	uint8_t hsw;  	//HSYNC宽度
	uint8_t vsw;   //VSYNC宽度
	uint8_t hfp;  	//HSYNC前的无效像素
	uint8_t vfp;  	//VSYNC前的无效行数

	uint16_t id;				//LCD ID	
	uint16_t activelayer;				//LCD ID	
	// uint32_t layeraddr[2];   // Layer0 Addr
	// uint32_t layer_1_Addr;   // Layer1 Addr

}MY_LTDC_TypeDef; 	  

//LCD参数
extern MY_LTDC_TypeDef my_ltdc;	//管理LCD重要参数

//LCD的画笔颜色和背景色	   
extern uint32_t  POINT_COLOR;//默认红色    
extern uint32_t  BACK_COLOR; //背景颜色.默认为白色

#define	LTDC_DISP_ON() HAL_GPIO_WritePin(LTDC_BL_GPIO_Port,LTDC_BL_Pin,SET); 	//LCD背光	PB5

// typedef struct
// {
//   /*根据液晶数据手册的参数配置*/
//   uint8_t hbp;  //HSYNC后的无效像素
//   uint8_t vbp;  //VSYNC后的无效行数

//   uint8_t hsw;  	//HSYNC宽度
//   uint8_t vsw;   //VSYNC宽度

//   uint8_t hfp;  	//HSYNC前的无效像素
//   uint8_t vfp;  	//VSYNC前的无效行数
  
//   uint8_t comment_clock_2byte; //rgb565/argb4444等双字节像素时推荐使用的液晶时钟频率
//   uint8_t comment_clock_4byte; //Argb8888等四字节像素时推荐使用的液晶时钟频率

//   uint8_t dir;          //0,竖屏;1,横屏;
//   uint8_t activelayer; // 0，第一层；1 第二层

//   uint16_t lcd_pixel_width; //液晶分辨率，宽
//   uint16_t lcd_pixel_height;//液晶分辨率，高

//   // uint8_t pixel_format;  // 像素格式
//   // uint8_t pixel_bytes;     // 像素字节数

// }LCD_PARAM_TypeDef;

/** 
  * @brief  LCD color  
  */ 

#if LCD_PIXFORMAT == LTDC_PIXEL_FORMAT_ARGB8888 || LCD_PIXFORMAT == LTDC_PIXEL_FORMAT_RGB888
#define LTDC_COLOR_BLUE          ((uint32_t)0xFF0000FF)
#define LTDC_COLOR_GREEN         ((uint32_t)0xFF00FF00)
#define LTDC_COLOR_RED           ((uint32_t)0xFFFF0000)
#else
#define LTDC_COLOR_BLUE          ((uint16_t)0x001F)
#define LTDC_COLOR_GREEN         ((uint16_t)0x07E0)
#define LTDC_COLOR_RED           ((uint16_t)0xF800)
#endif



uint16_t LTDC_PanelID_Read(void);

void LTDC_Init(void);
uint8_t LTDC_Clk_Set(uint32_t pllsain, uint32_t pllsair ,uint32_t pllsaidivr);

// void LCD_LayerInit(uint16_t LayerIndex, 
// 		uint16_t sx,uint16_t sy,uint16_t width,uint16_t height,
// 		uint8_t alpha,uint8_t alpha0,uint8_t bfac1,uint8_t bfac2,
// 		uint32_t Layer_Address,uint32_t PixelFormat,uint32_t color);
void LTDC_Layer_Window_Config(uint8_t layerx,uint16_t sx,uint16_t sy,uint16_t width,uint16_t height);//LTDC层窗口设置
void LTDC_Layer_Parameter_Config(uint8_t layerx,uint32_t bufaddr,uint8_t pixformat,uint8_t alpha,uint8_t alpha0,uint8_t bfac1,uint8_t bfac2,uint32_t bkcolor);//LTDC基本参数设置
void LTDC_Layer_Switch(uint8_t layerx,uint8_t on_off);	//层开关


void LTDC_Enable_Line_IT(uint16_t line);	


// void LTDC_Select_Layer(uint8_t layerx);			//层选择
// void LTDC_Display_Dir(uint8_t dir);				//显示方向控制

// void LTDC_Clear(uint32_t color);
// void LTDC_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color);
// void LTDC_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color);

// void LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency);
// void LCD_LayerInit(uint16_t LayerIndex, uint32_t FB_Address,uint32_t PixelFormat);
// void LTDC_Draw_Point(uint16_t x,uint16_t y,uint32_t color);
// uint32_t LTDC_Read_Point(uint16_t x,uint16_t y);

#ifdef __cplusplus
	}
#endif
#endif


/*
    // 配置LTDC行中断
    LTDC->LIPCR =my_lcd.vsw+my_lcd.vbp+my_lcd.pixel_height-1;//配置行中断的行数为最后一行
    // LTDC->IER |=LTDC_IER_LIE;   //使能LTDC行中断
    // LTDC->SRCR |= (1<<1); 

    // 行中断结束 自动改写寄存器 SRCR
    // while(LTDC->SRCR &  LTDC_SRCR_IMR) {
    //     if(disp->driver->wait_cb) disp->driver->wait_cb(disp->driver);
    // }
*/



// //画笔颜色
// #define WHITE_RGB565			0xFFFF
// #define BLACK_RGB565			0x0000	  
// #define BLUE_RGB565				0x001F  
// #define BRED_RGB565				0XF81F
// #define GRED_RGB565				0XFFE0
// #define GBLUE_RGB565			0X07FF
// #define RED_RGB565				0xF800
// #define MAGENTA_RGB565			0xF81F
// #define GREEN_RGB565			0x07E0
// #define CYAN_RGB565				0x7FFF
// #define YELLOW_RGB565			0xFFE0
// #define BROWN_RGB565			0XBC40 //棕色
// #define BRRED_RGB565			0XFC07 //棕红色
// #define GRAY_RGB565				0X8430 //灰色
// #define LGRAY_RGB565			0XC618 //浅灰色(PANNEL),窗体背景色

// //画笔颜色 ARGB8888
// #define LTDC_COLOR_BLUE          ((uint32_t)0xFF0000FF)
// #define LTDC_COLOR_GREEN         ((uint32_t)0xFF00FF00)
// #define LTDC_COLOR_RED           ((uint32_t)0xFFFF0000)
// #define LTDC_COLOR_CYAN          ((uint32_t)0xFF00FFFF)
// #define LTDC_COLOR_MAGENTA       ((uint32_t)0xFFFF00FF)
// #define LTDC_COLOR_YELLOW        ((uint32_t)0xFFFFFF00)
// #define LTDC_COLOR_LIGHTBLUE     ((uint32_t)0xFF8080FF)
// #define LTDC_COLOR_LIGHTGREEN    ((uint32_t)0xFF80FF80)
// #define LTDC_COLOR_LIGHTRED      ((uint32_t)0xFFFF8080)
// #define LTDC_COLOR_LIGHTCYAN     ((uint32_t)0xFF80FFFF)
// #define LTDC_COLOR_LIGHTMAGENTA  ((uint32_t)0xFFFF80FF)
// #define LTDC_COLOR_LIGHTYELLOW   ((uint32_t)0xFFFFFF80)
// #define LTDC_COLOR_DARKBLUE      ((uint32_t)0xFF000080)
// #define LTDC_COLOR_DARKGREEN     ((uint32_t)0xFF008000)
// #define LTDC_COLOR_DARKRED       ((uint32_t)0xFF800000)
// #define LTDC_COLOR_DARKCYAN      ((uint32_t)0xFF008080)
// #define LTDC_COLOR_DARKMAGENTA   ((uint32_t)0xFF800080)
// #define LTDC_COLOR_DARKYELLOW    ((uint32_t)0xFF808000)
// #define LTDC_COLOR_WHITE         ((uint32_t)0xFFFFFFFF)
// #define LTDC_COLOR_LIGHTGRAY     ((uint32_t)0xFFD3D3D3)
// #define LTDC_COLOR_GRAY          ((uint32_t)0xFF808080)
// #define LTDC_COLOR_DARKGRAY      ((uint32_t)0xFF404040)
// #define LTDC_COLOR_BLACK         ((uint32_t)0xFF000000)
// #define LTDC_COLOR_BROWN         ((uint32_t)0xFFA52A2A)
// #define LTDC_COLOR_ORANGE        ((uint32_t)0xFFFFA500)
// #define LTDC_COLOR_TRANSPARENT   ((uint32_t)0xFF000000)
