#ifndef OTA_H
#define OTA_H
#ifdef __cplusplus
extern "C" {
#endif

#define SIZE_1K                 	(1024)                      ///< 1K 字节大小             
#define MD5_CHKSUM_LEN              (16)                        ///< MD5校验和长度           
#define MD5_CHKSUM_STR_LEN          (MD5_CHKSUM_LEN * 2 + 1)    ///< MD5校验和字符串格式长度 
#define NO_OTA_STATUS_VAL_TAG       (0)                         ///< 状态默认值              


/**
 * 系统启动模式定义
 */
typedef enum
{
    NORMAL_SETUP                = 0x1234,                       ///< 普通启动模式
    RECOVERY_SETUP,                                             ///< 恢复模式
    SYSTEM_OTA,                                                 ///< OTA升级模式
    SYSTEM_OTA_OK,
} SETUP_MODE;

/**
 * OTA状态命令定义
 */
typedef enum
{
    OTA_CURRENT_VERSION         = 0,                            ///< 当前系统版本号
    OTA_CURRENT_SETUP_MODE,                                     ///< 当前系统启动模式
    OTA_CURRENT_REBOOT_TIME,                                    ///< 当前系统未正常启动次数
    OTA_DOWNLOAD_FILE,                                          ///< OTA升级包下载状态
    OTA_DOWNLOAD_PROGRESS,                                      ///< OTA升级包下载进度
    OTA_VERIFY_FILE,                                            ///< 文件校验结果
    OTA_VERIFY_PARTITION,                                       ///< OTA分区校验结果
    OTA_DECOMPRESS_FILE,                                        ///< OTA当前进度：解压文件
    OTA_UPGRADE_READY,                                          ///< OTA更新准备完成
    OTA_UPGRADE_START,                                          ///< OTA更新开始
    OTA_UPGRADE_PARTITION,                                      ///< OTA写入分区数据
    OTA_RECOVERY_START,                                         ///< OTA恢复模式启动
    OTA_REREQ_OTA_NOW,                                          ///< OTA请求立即执行OTA更新系统
    OTA_REBOOT_SYSTEM,                                          ///< OTA准备重启系统
    OTA_SUCCESED,                                               ///< OTA执行成功
    OTA_UNKNOWN_CMD,                                            ///< 位置OTA状态命令
    OTA_ERR_CODE,                                               ///< OTA过程异常
    OTA_DISK_FULL,                                              ///< 存储空间不足
} OTA_STATUS_TYPE;


/**
 * OTA模式
 */
typedef enum
{
    OTA_MODE_NORMAL             = 9029,                         ///< 普通OTA更新模式
    OTA_MODE_FORCE_NOW,                                         ///< 强制OTA更新模式
    OTA_MODE_RECOVERY,                                          ///< OTA恢复模式
} OTA_MODE;


/**
 * OTA操作命令
 */
typedef enum
{
    OTA_CMD_DOWNLOAD            = 1234,                         ///< 下载OTA升级包
    OTA_CMD_USED_LOCAL_IMAGE,                                   ///< 从上次备份的OTA升级包升级
    OTA_CMD_EXEC,                                               ///< 开始OTA更新系统
} OTA_CMD;



/**
 * OTA级包信息
 * 
 */
typedef struct
{
    char            url[SIZE_1K];                               ///< URL, Base64编码
    char            md5[MD5_CHKSUM_STR_LEN];                    ///< OTA升级包MD5校验和
    unsigned int    size;                                       ///< OTA升级包文件大小    
} OTA_FILE_INFO, *POTA_FILE_INFO;

/**
 * 控制中心控制命令协议
 * 
 * @see OTA_CMD
 * @see OTA_MODE
 * @see OTA_FILE_INFO
 */
typedef struct
{
    int             version;                                    ///< OTA版本号
    OTA_CMD         otaCmd;                                     ///< OTA命令
    OTA_MODE        otaMode;                                    ///< OTA模式
    OTA_FILE_INFO   otaFileInfo;                                ///< OTA升级包信息
} OTA_DATA_INFO, *POTA_DATA_INFO;

/**
 * OTA状态信息协议
 * 
 * @see OTA_STATUS_TYPE
 */
typedef struct
{
    OTA_STATUS_TYPE     status;                                 ///< 状态命令
    int                 val;                                    ///< 状态值
} OTA_RSP_STATUS, *POTA_RSP_STATUS;

static inline const char* otaStatusName(OTA_STATUS_TYPE type)
{
    switch(type)
    {
        case OTA_CURRENT_VERSION:
            return ("OTA_CURRENT_VERSION");
        case OTA_CURRENT_SETUP_MODE:
            return ("OTA_CURRENT_SETUP_MODE");
        case OTA_CURRENT_REBOOT_TIME:
            return ("OTA_CURRENT_REBOOT_TIME");
        case OTA_DOWNLOAD_FILE:
            return ("OTA_DOWNLOAD_FILE");
        case OTA_DOWNLOAD_PROGRESS:
            return ("OTA_DOWNLOAD_PROGRESS"); 
        case OTA_VERIFY_FILE:
            return ("OTA_VERIFY_FILE"); 
        case OTA_VERIFY_PARTITION:
            return ("OTA_VERIFY_PARTITION"); 
        case OTA_DECOMPRESS_FILE:
            return ("OTA_DECOMPRESS_FILE"); 
        case OTA_UPGRADE_READY:
            return ("OTA_UPGRADE_READY");
        case OTA_UPGRADE_START:
            return ("OTA_UPGRADE_START"); 
        case OTA_UPGRADE_PARTITION:
            return ("OTA_UPGRADE_PARTITION"); 
        case OTA_RECOVERY_START:
            return ("OTA_RECOVERY_START");
        case OTA_REREQ_OTA_NOW:
            return ("OTA_REREQ_OTA_NOW");
        case OTA_REBOOT_SYSTEM:
            return ("OTA_REBOOT_SYSTEM"); 
        case OTA_SUCCESED:
            return ("OTA_SUCCESED");
        case OTA_UNKNOWN_CMD:
            return ("OTA_UNKNOWN_CMD");
        case OTA_ERR_CODE:
            return ("OTA_ERR_CODE"); 
        default:
            return ("Unknown Type"); 
    }
}
#ifdef __cplusplus
}
#endif                    
#endif

