#ifndef PRIMARYCOMM_H_
#define PRIMARYCOMM_H_

//------------------------------------------------------------------------------
#include <stdint.h>

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// primary operative address
//------------------------------------------------------------------------------
#define OP_ADDR_AUX                             (0x01)
#define OP_ADDR_FAN                             (0x02)
#define OP_ADDR_RELAY                           (0x03)
#define OP_ADDR_IO_EXTEND                       (0x04)
#define OP_ADDR_BROADCAST                       (0xFF)

//------------------------------------------------------------------------------
// primary send packet command
//------------------------------------------------------------------------------
#define CMD_QUERY_FW_VER                        (0x01)
#define CMD_QUERY_HW_VER                        (0x02)
#define CMD_QUERY_GPIO_IN                       (0x0a)
#define CMD_CONFIG_GPIO_OUTPUT                  (0x86)
#define CMD_CONFIG_RTC                          (0x87)
#define CMD_CONFIG_MODEL_NAME                   (0x83)
#define CMD_UPDATE_START                        (0xe0)
#define CMD_UPDATE_ABORT                        (0xe1)
#define CMD_UPDATE_TRANSFER                     (0xe2)
#define CMD_UPDATE_FINISH                       (0xe3)

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

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

    uint8_t Emergency_Btn;
    uint8_t Button[2];
    uint8_t Key[4];
} Gpio_in;

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

typedef struct RTC {
    uint8_t RtcData[14];
} Rtc;

int Query_FW_Ver(uint8_t fd, uint8_t targetAddr, Ver *Ret_Buf);
int Query_HW_Ver(uint8_t fd, uint8_t targetAddr, Ver *Ret_Buf);
int Query_Gpio_Input(uint8_t fd, uint8_t targetAddr, Gpio_in *Ret_Buf);

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

int Update_Start(uint8_t fd, uint8_t targetAddr, uint32_t crc32);
int Update_Abord(uint8_t fd, uint8_t targetAddr);
int Update_Transfer(uint8_t fd, uint8_t targetAddr, uint32_t startAddr, uint8_t *data, uint16_t length);
int Update_Finish(uint8_t fd, uint8_t targetAddr);


#endif /* PRIMARYCOMM_H_ */