#ifndef _LCDCOMM_H_DEF
#define _LCDCOMM_H_DEF

/*------------------------------- 头文件 --------------------------------------
*/
 
/*------------------------------- 宏定义 --------------------------------------
*/

enum
{
	MAIN,			// 主板
	FACE,			// 面板
	GPRS,			// GPRS
	PDA,			// PDA
	PDA_MAINTAIN,	// PDA维护
	HMI_COMM_TYPE,
};

enum
{
	TEST_LED,		// LED测试
	TEST_LCD,		// LCD测试
	TEST_NUM,
};

enum
{
	RMT_PAIR,		// 遥控器配对
	RMT_CLRPAIR,	// 遥控器清除配对
	RMT_SUM,
};

// H:横向，V:竖向，P:正序，N:负序
enum
{
	LCD_HP,			// 横向正序
	LCD_HN,			// 横向负序
	LCD_VP,			// 竖向正序
	LCD_VN,			// 竖向负序
	LCD_DISP_NUM,
};

#define FRAME_NUMBER	5		// 接收、发送帧缓冲区列表总数:5条
#define UART_FRAME_LEN	256		// 单帧总长度

#define HMI_RECV_EN()		{GPIO_R485_OE1_OFF();}                  
#define HMI_SEND_EN()		{GPIO_R485_OE1_ON();}
#define HMI_EN_INIT()		{GPIO_R485_OE1_INIT();}


#define SCREEN_LINE_BYTES  20  //屏幕每行字节数
#define SCREEN_ROWS           5    //屏幕的共多少行
#define SCREEN_BYTES        (SCREEN_LINE_BYTES*SCREEN_ROWS)

#define LCD_MAX_LED      32  // lcd 液晶面板最大灯个数
/*按键定义*/
#define HA_KEY_ENTER	1
#define HA_KEY_ESC		2  // 老版本6键，ENTER=2 ESC=1
#define HA_KEY_UP		3
#define HA_KEY_DOWN		4
#define HA_KEY_LEFT		5
#define HA_KEY_RIGHT	6
#define HA_KEY_ADD		7
#define HA_KEY_SUB		8
#define HA_KEY_RST		9   //区号
//2019-9
#define HA_KEY_YUK		10
#define HA_KEY_HZ		11
#define HA_KEY_FZ		12



#define NO_KEY          0xff
#define KE_KEY_LONG_BIT	(0x80)

#define KE_KEY_MASK  0x7f

#define LCD_BUF_BYTES (160*160/8/4)

/*hmi发来的命令*/
#define HMI_CMD_POLL  				0x00 /*查询命令*/
#define HMI_CMD_INIT_LCD			0x01/*初始化lcd*/
#define HMI_CMD_CLEAR_SCREEN  		0x02/*清全屏*/
#define HMI_CMD_WRITE_SINGLE		0x03/*写数据*/
#define HMI_CMD_WRITE_DATAS			0x04/*写连续数据*/
#define HMI_CMD_WRITE_DOTS			0x05/*写点阵数据*/

#define HMI_CMD_BLIGHT				0x08/*背光控制*/
#define HMI_CMD_LED  				0x09/*面板灯状态*/
#define HMI_CMD_TESTLCD				0x0A/*对比度设置*/
#define HMI_CMD_WIRELESS  			0x0B/*遥控器*/
#define HMI_CMD_LEDRUN  			0x0C/*跑马灯*/
#define HMI_CMD_LCDRUN  			0x0D/*LCD测试*/
#define HMI_CMD_GPRS				0x0E  /*GPRS*/
#define HMI_CMD_DOWN  				0x0F/*数据下载*/

#define HMI_CMD_LINE				0x10/*划线*/

#define HMI_CMD_RESPOND				0x20// 响应面板帧

#define DRV_CMD_TEMP            	0x18 /*lcd驱动板上电报文*/
#define DRV_CMD_POWERON          	0x19 /*lcd驱动板上电报文*/
#define DRV_CMD_KEY                 0x1A /*lcd驱动板上送按键状态*/
#define DRV_CMD_YX					0x1B /*遥信*/
#define DRV_CMD_SET					0x1C /*定值*/
#define DRV_CMD_YKQ					0x1D /*遥控器*/
#define DRV_CMD_GPRS				0x1E/*GPRS*/
#define DRV_CMD_DOWN				0x1F /*下载报文应答*/    

#define UART_FRAME_TYPE_Wireless	0x24 //遥控器运行模式
#define UART_FRAME_TYPE_RM_TEST	0x25//遥控器测试

#define LIGHT_ON  1
#define LIGHT_OFF 0

#define LCD_INTRUST_ADD 1
#define LCD_INTRUST_SUB 0

#define LCD_KEY_MASK 0x07
#define LCD_KEY_MAX (LCD_KEY_MASK+1)

/*发给驱动板的指令缓冲区*/
#define LCD_MAX_INST_MASK 0x07   //发给驱动板的指令最大缓冲个数
#define LCD_MAX_INST_BUFS (LCD_MAX_INST_MASK+1)   //发给驱动板的指令最大缓冲个数
/*发给驱动板的数据定义*/
#define LCD_MAX_CONTINUE_MASK   0x7f
#define LCD_MAX_CONTINUE_BUFS   (LCD_MAX_CONTINUE_MASK+1)

#define LCD_MAX_DOT_MASK   0x3f
#define LCD_MAX_DOT_BUFS   (LCD_MAX_CONTINUE_MASK+1)


#define	UART_FRAME_MAXCNT		8  //最大帧数
/*------------------------------ 类型结构 -------------------------------------
*/

/*******主界面图形定义******************/

typedef struct  D_UNIT			//4 个字节 整个菜单信息，最大菜单号，域数统计，410
{								//主要是为了出错处理
	WORD  sx;
	WORD  sy;
	WORD  yx_di;
	WORD  yx_attrib;
	BYTE  yx_value;
	//BYTE  yx_save;
	DWORD   addr_close;
	DWORD   addr_open;
	DWORD   addr_third;
}D_UNIT_DEF;

typedef struct  YC_UNIT			//4 个字节 整个菜单信息，最大菜单号，域数统计，410
{								//主要是为了出错处理
	WORD  sx;
	WORD  sy;
	WORD  yc_di;
	BYTE  fmtstr[34];
}YC_UNIT_DEF;

#define MAX_YX_UNITS 80
#define MAX_YC_UNITS 80
typedef struct  MainImage			//4 个字节 整个菜单信息，最大菜单号，域数统计，410
{								//主要是为了出错处理
	char *pBuf;
	unsigned short  sImageX;
	unsigned short  sImageY;
	uint32_t   lnImageAddr;

	unsigned short sYxNum;
	unsigned short sYcNum;
	D_UNIT_DEF  tYxUnits[MAX_YX_UNITS];
	YC_UNIT_DEF  tYcUnits[MAX_YC_UNITS];
} MAIN_IMAGE_DEF;



typedef struct LCD_KEY
{
	BYTE tail;
	BYTE head;
	BYTE  keybuf[LCD_KEY_MAX];
}LCD_KEY_DEF;

typedef struct INST	//单个数据结构
{
	BYTE cmd;
	BYTE len;
	BYTE para[UART_FRAME_LEN];
}INST_DEF;
typedef struct LCD_INST_BUF
{
	BYTE tail;
	BYTE head;
	INST_DEF tInst[LCD_MAX_INST_BUFS];

}LCD_INST_BUF_DEF;


typedef struct CONTINUE_DATA  //连续数据结构
{
	BYTE x;
	BYTE y;
	BYTE attrib;
	BYTE dat[24];
}CONTINUE_DATA_DEF;


typedef struct CONTINUE_DATA_BUF //连续数据结构缓冲区
{
	BYTE tail;
	BYTE head;
	BYTE index;
	CONTINUE_DATA_DEF tBuf[LCD_MAX_CONTINUE_BUFS];
}CONTINUE_DATA_BUF_DEF;


typedef struct DOT_DATA_DEF  //连续数据结构
{
	short x;
	short y;
	short w;
	short ex;
	BYTE num;
	BYTE mode;
	BYTE dat[230];
}DOT_DATA_DEF;


typedef struct dot_DATA_BUF // 点阵数据
{
	BYTE tail;
	BYTE head;
	DOT_DATA_DEF  dot[LCD_MAX_DOT_BUFS];
}DOT_DATA_BUF_DEF;


/*初始化状态定义*/
typedef struct INIT_DATA
{
	bool flag;
	BYTE para[LCD_MAX_LED];
}PARA_DEF;

/*初始化状态定义*/
typedef struct LINE_DATA
{
	bool flag;
	BYTE para[10];
}LINE_DEF;


/*背光灯状态缓冲区*/
typedef struct LIGHT
{
	bool flag;
	BYTE light;
}LIGHT_DEF;

typedef struct LCDINTRUST
{
	bool flag;
	BYTE byAddOrSub;
}LCDINTRUST_DEF;

typedef struct TELE
{
	bool flag;
	BYTE cmd;
}TELE_DEF;

typedef struct LCD_COMM
{
	bool bRecv;
	BYTE ReSend;
	bool bClrScreen;
	bool b_init_OK;
	bool bTestLed;
	bool bTestLcd;
	bool bTeleMatch;
	bool bTeleClrMatch;
	bool bLcdUpdate;
	bool bLedUpdate;
	bool bLock;
	bool bFreshLed;
	PARA_DEF tInit;
	LIGHT_DEF tLight;
	LCDINTRUST_DEF tLcdIntrust;
	LCD_INST_BUF_DEF tInstBuf;
	CONTINUE_DATA_BUF_DEF  tContinue;
	LCD_KEY_DEF tKey;	
	TELE_DEF tTele;
	bool bCall;	
	bool bRefresh;
	BYTE lcdbuf[LCD_BUF_BYTES];  //备份液晶显示缓冲区，在发送时判断，没有改变的不发送，提高刷新速断，高位代表刷新标志
	BYTE lcdattrib[LCD_BUF_BYTES];  //备份液晶显示缓冲区，在发送时判断，没有改变的不发送，提高刷新速断，高位代表刷新标志
	MAIN_IMAGE_DEF tImage;
	DOT_DATA_BUF_DEF tDot;
}LCD_COMM_DEF;

struct hmi
{
	u8 tail[2];		//接收、发送缓冲区存入帧位置
	u8 head[2];		//接收、发送缓冲区取出帧位置
	u8 num[2];		//接收、发送缓冲区有效帧数量
	u8 sendlen[FRAME_NUMBER];	//发送帧长度
	u8 recvbuf[FRAME_NUMBER][UART_FRAME_LEN];
	u8 sendbuf[FRAME_NUMBER][UART_FRAME_LEN];
	//考虑通道强占的情况
};

typedef struct UART_COMM
{
	u8		cTypeCounter;	//接受帧类型	
	u8		cRecvLenth; 	//通道A 接收到数据计数器
	u8		cRecvCnt;		//有效数据记数
	u8		cSendLenth;
	u8		cSendCnt;
	u8 		sum;
	u8		recvsum;
	u8    	bSend;
	u32        dTWait;
	u8          bData;
	u8		s_head;
	u8		s_tail;
	u8		s_buf[UART_FRAME_MAXCNT][UART_FRAME_LEN];	
	u8		r_head;
	u8		r_tail;
	u8		r_buf[UART_FRAME_MAXCNT][UART_FRAME_LEN];		
}UART_COMM;

/*------------------------------ 变量声明 -------------------------------------
*/
extern DWORD dHMIDiStatus;
extern LCD_COMM_DEF g_tLcdComm;
extern UART_COMM g_tUartHMI;
extern int g_hmi_type;

/*------------------------------ 函数声明 -------------------------------------
*/
void Add_Continue_Data(BYTE x,BYTE y,BYTE *pdat,BYTE len,BYTE mode);
void Add_Clear_Screen(void);
void add_led_test(u8 test_no);
BYTE  Get_Key(void);
void lcdcomm_init(void);
void HMI_Comm_App(void);
void HMI_Board_Recv(int len,BYTE *para);
void add_rmt_pair(u8 pair);
int hzk_exit(void);
void HMI_add_inst_frame(BYTE cmd,BYTE *para,BYTE len)  ;
void lcd_DrawImage(short x,short y,BYTE *pd,unsigned char model);	//画图标，index为索引值，与按键的属性定义一致
int mainimage_exit(void);

#endif
