#ifndef DISPLAYPADDESCPDOWNLOAD_H_
#define DISPLAYPADDESCPDOWNLOAD_H_


#include "gType.h" 
#include "GraphBase.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "my_string.h"
#include "Device.h"
#include "EpDevice.h"
#include "StaticText.h"


class TDisplayPadDescpDownload{
	public:
		static constexpr unsigned short hList[12] = {72,72,72,72,	44,72,34,34,	34,34,34,34};
		static constexpr unsigned short wList[12] = {800,290,290,290,	290,290,290,290,	290,290,290,290};
		static constexpr TLv Lv = {
			.Caption.Left = 0,
			.Caption.Top = 36,
			.Caption.Width = 800,
			.Caption.Heigh = 32,
			.Caption.Right = 800 -0 -1,
			.Caption.Bottom = 36 + 32,
			
			.Grid.Left = {0,0,0,0,	0,0,0,0,	0,0,0,0},
			.Grid.Right = {wList[0]-1,wList[1]-1,wList[2]-1,wList[3]-1,	wList[4]-1,wList[5]-1,wList[6]-1,wList[7]-1,	wList[8]-1,wList[9]-1,wList[10]-1,wList[11]-1},
			.Grid.Top[0] = (36 + 32 +2),
			.Grid.Top[1] = (36 + 32 +2) + (2 + hList[0]),
			.Grid.Top[2] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]),
			.Grid.Top[3] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]),
			.Grid.Top[4] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]),
			.Grid.Top[5] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]),
			.Grid.Top[6] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]),
			.Grid.Top[7] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]),
			.Grid.Top[8] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]),
			.Grid.Top[9] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + (2 + hList[8]),
			.Grid.Top[10] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + (2 + hList[8]) + (2 + hList[9]),
			.Grid.Top[11] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + (2 + hList[8]) + (2 + hList[9]) + (2 + hList[10]),
				
			.Grid.Bottom[0] = (36 + 32 +2) + hList[0],
			.Grid.Bottom[1] = (36 + 32 +2) + (2 + hList[0]) + hList[1],
			.Grid.Bottom[2] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + hList[2],
			.Grid.Bottom[3] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + hList[3],
			.Grid.Bottom[4] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + hList[4],
			.Grid.Bottom[5] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + hList[5],
			.Grid.Bottom[6] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + hList[6],
			.Grid.Bottom[7] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + hList[7],
			.Grid.Bottom[8] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + hList[8],
			.Grid.Bottom[9] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + (2 + hList[8]) + hList[9],
			.Grid.Bottom[10] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + (2 + hList[8]) + (2 + hList[9]) + hList[10],
			.Grid.Bottom[11] = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + (2 + hList[3]) + (2 + hList[4]) + (2 + hList[5]) + (2 + hList[6]) + (2 + hList[7]) + (2 + hList[8]) + (2 + hList[9]) + (2 + hList[10]) + hList[11],
			
			.Grid.UsingCount = 5,
			
			.Panel.Active = 1,
			.Panel.ItemType = piMemo,
			.Panel.Left = wList[1] + 6,
			.Panel.Top = (36 + 32 +2) + hList[0] +6,
			.Panel.Width = 502,
			.Panel.Heigh = 220,
			.Panel.Right = wList[1] + 6 + 502 -1,
			.Panel.Bottom = (36 + 32 +2) + hList[0] +6 + 220 -1,
			
			.PanelSmall.Active = 1,
			.PanelSmall.Left = wList[1] + 6,
			.PanelSmall.Top = (36 + 32 +2) + hList[0] +6 + 220 -1 + 1,
			.PanelSmall.Width = 502,
			.PanelSmall.Heigh = 72,
			.PanelSmall.Right = wList[1] + 6 + 502 -1,
			.PanelSmall.Bottom = (36 + 32 +2) + hList[0] +6 + 220 -1 + 1 + 72 -1,
		};
		static constexpr TPoint TipPoint ={
			.x = 16,
			.y = (36 + 32 +2) + (2 + hList[0]) + (2 + hList[1]) + (2 + hList[2]) + 6,
		}; 
		typedef enum{
			Idle =0,
			Writing =1,
			Finished
		}TState;	
	public:
		int Downloading;
		unsigned char DpPort;
		unsigned char DpAddr;
		unsigned char StartPort;
		unsigned char EndPort;
		unsigned char StartAddr;
		unsigned char EndAddr;
		unsigned char Dump0;
		unsigned char Dump1;
	
		struct{
			unsigned char SenSmoker;
			unsigned char SenTemper;
			unsigned char HandPadReport;
			unsigned char ModuleIn;
			unsigned char ModuleInout;
			void Reset(){
				SenSmoker =1;
				SenTemper =1;
				HandPadReport =1;
				ModuleIn =1;
				ModuleInout =1;
			}
		}SelectedList;
	
		class TCtlPanel1	*pPanel;

		TRect Bound;	
		TRect Content;
	
		struct{
			unsigned char Transmiting;
			unsigned char RetryTimes;
			unsigned char WritingPort;
			unsigned char WritingAddr;
			unsigned int WroteCount;
			unsigned int FailCount;
			unsigned int Total;
			unsigned int WasteTime;
			unsigned int TotalRetryTimes;
			void Reset(){
				WritingPort =0;
				WritingAddr =0;
				WroteCount =0;
				FailCount =0;
				Total =0;
				WasteTime = 0;
				TotalRetryTimes = 0;
			}
		}RunData;
		
		TState State;
	
		struct{
			unsigned char InxMin;
			unsigned char InxMax;
			unsigned char Inx;
			unsigned char InxItem;
			void Reset(){
				Inx = 0;
				InxMin = 0;
				InxMax =2;
				InxItem =0;
			}
		}Tag;
		
		struct{
			unsigned char HasSend;
			unsigned char WaitTick;
			unsigned char RecResult;
			unsigned char RecSta;
			void Reset(){
				HasSend =0;
				WaitTick =0;
				RecResult = 0;
				RecSta = 0;
			}
		}RpyData;
	
		unsigned char IsPermission;
		unsigned char PermissionCmd;
	
		unsigned char IsShow;
		unsigned char WriteResult;

		unsigned int  fAddr;
		
		unsigned char Data[12];
		char Text[12];
		unsigned char DescpData[36];
	public:
		TDisplayPadDescpDownload(){
			IsShow = 0;
			State = Idle;
		};
		void Init();
		void RenderBackGround(void);

		void DrawSelf(void);
		void Show();
		void FullRedraw(int Prm);
		void DrawItemTypeSelected();
		void DrawPadList();
		void DrawFixText();

		void DrawWriteResult();
			
		void DelayMs(unsigned int aMs);
		
		void CheckScope();
		void DoTransmiting();
	
		void PermissionCmdReturnDraw();
		void PermissionCmdGO();
		
		void ClearSelected(void);
		void Check4Selected();
		
		void InitWriteData();
		void PushInnerCanData(unsigned char aCmd, unsigned char *pBuf);

		TGuiMsgReturn KeyIn(unsigned char aKey);
			
		void SendCmdWriteOnePoint(unsigned char aPort, unsigned char aAddr);
		void SendCmdWriteAbort(unsigned char aPort, unsigned char aAddr);
		
		void Task1000Ms();
		void ExtReset();
		int ExtRequst(unsigned char Prm);
};


#endif
