#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_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);
// 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_ */