#ifndef PRIMARYCOMM_H_
#define PRIMARYCOMM_H_

extern struct Address
{
	unsigned char Aux;
	unsigned char Fan;
	unsigned char Relay;
	unsigned char IoExtend;
	unsigned char Broadcast;
}Addr;

extern struct Command
{
	unsigned char query_FW_Ver; 		//0x01
	unsigned char query_HW_Ver;		//0x02
	unsigned char query_Gpio_In;		//0x0a

	unsigned char config_Model_Name;			//0x83
	unsigned char config_Gpio_Output;	//0x86
	unsigned char config_Rtc_Data;		//0x87

	unsigned char update_Start;		//0xe0
	unsigned char update_Abort;		//0xe1
	unsigned char update_Transfer;		//0xe2
	unsigned char update_Finish;		//0xe3

}Cmd;

typedef struct Verion
{
	char Version_FW[16];
	char Version_HW[16];
}Ver;

typedef struct GPIO_IN
{
	unsigned char AC_Connector;
	unsigned char AC_MainBreaker;
	unsigned char SPD;
	unsigned char Door_Open;
	unsigned char GFD[2];
	unsigned char AC_Drop;
	unsigned char Emergency_IO;

	unsigned char Emergency_Btn;
	unsigned char Button[2];
	unsigned char Key[4];
}Gpio_in;

typedef struct GPIO_OUT
{
	unsigned char Button_LED[2];
	unsigned char System_LED[4];
	unsigned char AC_Connector;
	unsigned char AC_Breaker;
}Gpio_out;

typedef struct RTC
{
	unsigned char RtcData[14];
}Rtc;

extern unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf);
extern unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf);
extern unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf);

extern unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf);
extern unsigned char Config_Rtc_Data(unsigned char fd, unsigned char targetAddr, Rtc *Set_Buf);
unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname);
// 13 bytes
// year : 4, month : 2, day : 2, hour : 2, min : 2, sec : 2
//extern unsigned char Config_RTC();

extern unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32);
extern unsigned char Update_Abord(unsigned char fd, unsigned char targetAddr);
extern unsigned char Update_Transfer(unsigned char fd, unsigned char targetAddr, unsigned int startAddr, unsigned char *data, unsigned short int length);
extern unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr);


#endif /* PRIMARYCOMM_H_ */