#ifndef __UPGRADE_H__
#define __UPGRADE_H__

#include <c_types.h>

#define SPI_FLASH_SEC_SIZE      4096
#define LIMIT_ERASE_SIZE		0x10000

#define USER_BIN1               0x00
#define USER_BIN2               0x01

#define UPGRADE_FLAG_IDLE       0x00
#define UPGRADE_FLAG_START      0x01
#define UPGRADE_FLAG_FINISH     0x02

#define UPGRADE_FW_BIN1         0x00
#define UPGRADE_FW_BIN2         0x01

typedef void (*upgrade_states_check_callback)(void * arg);

//#define UPGRADE_SSL_ENABLE

struct upgrade_server_info {
	uint8 ip[4];
	uint16 port;

	uint8 upgrade_flag;

	uint8 pre_version[16];
	uint8 upgrade_version[16];

	uint32 check_times;
	uint8 *url;

	upgrade_states_check_callback check_cb;
	struct espconn *pespconn;
};

#define UPGRADE_FLAG_IDLE       0x00
#define UPGRADE_FLAG_START      0x01
#define UPGRADE_FLAG_FINISH     0x02

void system_upgrade_init();
void system_upgrade_deinit();
bool system_upgrade(uint8 *data, uint16 len);

#ifdef UPGRADE_SSL_ENABLE
bool system_upgrade_start_ssl(struct upgrade_server_info *server);	// not supported now
#else
bool system_upgrade_start(struct upgrade_server_info *server);
#endif
#endif