Upgrade.c 6.9 KB
#include <stdio.h>
#include "JZsdkLib.h"
#include <string.h>

#include "BaseConfig.h"


#define UPGRADE_FILE_DIR "/root/ugradeFile"
#define UPGRADE_FILE_STATUS_A "/root/ugradeFile/upgrade_status_a"
#define UPGRADE_FILE_STATUS_B "/root/ugradeFile/upgrade_status_b"

#define REMOTE_UPGRADE_FILE_DIR "/root/ugradeFile/remote_ugradeFile.tar"

static int Upgrade_DownLoadFlag = JZ_FLAGCODE_OFF;

T_JZsdkFileHandle Upgrade_FileHandle = NULL;
static unsigned char g_CheckCode[128] = {0};
static int g_CheckCodeFlag =JZ_FLAGCODE_OFF;
static int g_UpgradeCheckFlag = JZ_FLAGCODE_OFF;

typedef enum T_UpgradeType
{
    UPGRADE_ONLY_HOST = 0, //仅本机进行升级
    UPGRADE_ONLY_SLAVE = 1, //仅从机进行升级
    UPGRADE_BOTH_HOST_SLAVE = 2, //主机和从机都进行升级
} T_UpgradeType;

/*****************
 * 
 *  获取升级状态
 * 
 * 
 * ***************/
T_JZsdkReturnCode Upgrade_GetStatus(int *status)
{
    *status = Upgrade_DownLoadFlag;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *   升级包下载
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageDownload_Start()
{
    T_JZsdkReturnCode ret;

    if (Upgrade_DownLoadFlag == JZ_FLAGCODE_ON)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Start: upgrade package is downloading");
        return JZ_ERROR_SYSTEM_MODULE_CODE_IS_BUSY;
    }
    
    ret = JZsdk_Osal_FileOpen(REMOTE_UPGRADE_FILE_DIR, "wb", &Upgrade_FileHandle);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Start: JZsdk_Osal_FileOpen failed");
        return ret;
    }

    Upgrade_DownLoadFlag = JZ_FLAGCODE_ON;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *  升级包下载中
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageDownload_Trans(unsigned char *buf, unsigned int len)
{
    T_JZsdkReturnCode ret;

    if (Upgrade_DownLoadFlag == JZ_FLAGCODE_OFF)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Trans: upgrade package is not downloading");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    //下载升级包
    int realLen = 0;
    ret = JZsdk_Osal_FileWrite(Upgrade_FileHandle, buf, len, &realLen);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Trans: JZsdk_Osal_FileWrite failed");
        return ret;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *  升级包下载结束
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageDownload_Stop()
{
    T_JZsdkReturnCode ret;

    if (Upgrade_DownLoadFlag == JZ_FLAGCODE_OFF)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Stop: upgrade package is not downloading");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    JZsdk_Osal_FileSync(Upgrade_FileHandle);

    ret = JZsdk_Osal_FileClose(Upgrade_FileHandle);

    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Stop: JZsdk_Osal_FileClose failed");
        return ret;
    }

    Upgrade_FileHandle = NULL;

    Upgrade_DownLoadFlag = JZ_FLAGCODE_OFF;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/*******************
 * 
 *  升级包校验码录入
 * 
 * 
 * ********************/
T_JZsdkReturnCode Upgrade_PackageCheckCodeSave(unsigned char *CheckCode, int CheckFlag, int len)
{
    memcpy(g_CheckCode, CheckCode, len);
    g_CheckCodeFlag = CheckFlag;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *  升级包校验
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageCheck()
{
    T_JZsdkReturnCode ret;

    switch (g_CheckCodeFlag)
    {
        case JZSDK_CHECK_SUM_TYPE_MD5:
        {
            JZSDK_LOG_INFO("升级文件使用md5校验码");
            //1、获取文件的md5校验码
            ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_MD5, REMOTE_UPGRADE_FILE_DIR, g_CheckCode, 32);
        }
        break;

        case JZSDK_CHECK_SUM_TYPE_SRC32:
        {
            JZSDK_LOG_INFO("升级文件使用src32校验码");
            //1、获取文件的src32校验码
            ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, REMOTE_UPGRADE_FILE_DIR, g_CheckCode, 4);
        }
        break;
        
        default:
        {
            JZSDK_LOG_ERROR("opus保存校验码类型错误");
            ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }
        break;
    }

    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("升级文件校验失败");
        JZsdk_Osal_delete(REMOTE_UPGRADE_FILE_DIR);  
        Upgrade_DownLoadFlag = JZ_FLAGCODE_OFF;

        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

static T_JZsdkReturnCode Ugrade_Way1()
{
    //往t60s发送升级固件

    //1、发送准备升级指令

    //2、发送校验码

    //3、上传文件

    //4、传输文件

    //5、关闭上传

    //6、等候校验结果

    //开始自身升级

    //调用升级脚本

    //------------重启--------------
}

/************************************
 * 
 *  升级包解析
 * 
 * 
 * *************************************/
T_JZsdkReturnCode Upgrade_PackageParse()
{
    T_JZsdkReturnCode ret;
    unsigned char cmd[128] = {0};
    
    //分析是否存在升级包
    if (JZsdk_check_file_exists(REMOTE_UPGRADE_FILE_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageParse: upgrade file not exists");
        return JZ_ERROR_SYSTEM_MODULE_CODE_NO_UPGRADE_FILE;
    }

    //分解升级包
    memset(cmd, 0, sizeof(cmd));
    sprintf(cmd, "tar -xvf %s -C %s", REMOTE_UPGRADE_FILE_DIR, UPGRADE_FILE_DIR);
    ret = JZsdk_RunSystemCmd(cmd);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageParse: RunSystemCmd failed");
        return ret;
    }
}


/****************************
 * 
 *  升级
 * 
 * 
 * ******************************/
T_JZsdkReturnCode Upgrade_PackageUpgrade()
{
    T_JZsdkReturnCode ret;
    
    //校验成功的情况,则开始解析升级包
    ret = Upgrade_PackageParse();
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("解析升级包失败");
        return ret;
    }

    //退出当前进程,并通知设备升级
    FILE *logFile = fopen("/root/JZ_UpgradeLog.txt", "w");
    if (logFile == NULL)
    {
        JZSDK_LOG_ERROR("JZ_UpgradeLog error");
        return 1;
    }
    
    fprintf(logFile, "UPGRADE_NEEDED\n");
    fflush(logFile);
    fclose(logFile);

    JZSDK_LOG_INFO("执行升级脚本");

    //退出程序
    exit(0);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/********************************
 * 
 *  升级模块初始化
 *   
 * 
 * ************************************/
T_JZsdkReturnCode Upgrade_Init()
{
    T_JZsdkReturnCode ret;

}