1835|1

291

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

【平头哥RVB2601创意应用开发】实践5-FOTA升级显示下载进度 [复制链接]

 

1 FOTA

FOTA(Firmware Over-The-Air),即移动终端的空中下载软件升级,指通过云端升级技术,为具有连网功能的设备提供固件升级服务,用户使用网络以按需、易扩展的方式获取智能终端系统升级包,并通过FOTA进行云端升级,完成系统修复和优化。

RVB2601具有连网功能,并且平头哥OOC社区提供云服务,可以实现板子的控制升级功能。

RVB2601官方例程提供了一个FOTA的例程,相关使用方法可以参考这篇:

RVB2601应用开发实战系列四:FOTA镜像升级

官方例程实现了基础的FOTA功能,为了使升级过程能更加直观的显示,我在FOTA例程的基础上,将升级时固件下载进度和当前的版本号显示在了OLED屏幕上。

2 代码修改

在FOTA例程的基础上,先将U8g2图形显示库移植进去(参考这篇:【平头哥RVB2601创意应用开发】实践2-移植U8g2图形库

然后再修改进度条的显示。

2.1 升级时显示下载进度条

2.2 获取下载进度百分比

fota.c中

新加如下函数

int download_percent = 0;
int get_download_percent()
{
    return download_percent;
}

修改已有的函数

static void fota_task(void *arg)
{
    //省略部分...
    else if (fota->status == FOTA_DOWNLOAD) {
            //LOGD(TAG, "fota_task FOTA_DOWNLOAD! f:%d t:%d", fota->from->size, fota->to->offset);
            if (fota->from->size > 0) {
                static int fota_download_per = 101;
                int percent =  fota->to->offset * 100 / fota->from->size;
                if (fota_download_per != percent) {
                    LOGD(TAG, "FOTA:%d%%", percent);
                    fota_download_per = percent;
                    download_percent = percent;//<-----------加这一句
                }
            }
//省略部分...

cop_fota.c中

int app_fota_is_downloading(int *percent)
{
    if (g_fota_handle == NULL) {
        return 0;
    }
​
    if (fota_get_status(g_fota_handle) == FOTA_DOWNLOAD) 
    {
        *percent = get_download_percent();
        return 1;
    }
    return 0;
}

2.3 进度条显示函数

之前移植U8g2库时,已有一个进度条的测试函数,在此基础上进行修改:

void testDrawProcessPercent(u8g2_t *u8g2, int percent)
{
    u8g2_ClearBuffer(u8g2); 
        
    char buff[20];
    int i = percent/100.0*70+10;
    sprintf(buff,"%d%%",(int)(i/80.0*100));
    
    u8g2_SetFont(u8g2,u8g2_font_ncenB12_tf);
    u8g2_DrawStr(u8g2,24,32,"RVB2601");//字符显示
    
    u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
    u8g2_DrawStr(u8g2,100,49,buff);//当前进度显示
    
    u8g2_DrawRBox(u8g2,16,40,i,10,4);//圆角填充框矩形框
    u8g2_DrawRFrame(u8g2,16,40,80,10,4);//圆角矩形
    
    u8g2_SendBuffer(u8g2);
    aos_msleep(100);
}

2.4 OLED任务

在创建一个OLED任务,当检测到在下载固件时,显示下载的进度。

static void oled_task(void *arg)
{
    u8g2_t u8g2;
    u8g2Init(&u8g2);
    
    u8g2_SetFont(&u8g2,u8g2_font_unifont_t_symbols);
    
    int i = 0;
    int percent = 0;
    while (1) 
    {
        //LOGD(TAG, "Hello world! YoC");
        
        u8g2_FirstPage(&u8g2);
        do
        {
            //draw(&u8g2);
            if (!app_fota_is_downloading(&percent))
            {
                testShowVersion(&u8g2);
            }
            else
            {
                i++;
                testDrawProcessPercent(&u8g2, percent);
                if (i == 100) i=0;
            }
            
        } while (u8g2_NextPage(&u8g2));
    }
}

 

3 测试

测试效果如下:


 

4 总结

本篇介绍了在FOTA例程的基础上,利用OLED屏幕显示升级时的固件下载进度。

最新回复

看来平头哥RVB2601的空中下载软件升级应该是很容易实现的   详情 回复 发表于 2022-4-24 09:16
点赞 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

看来平头哥RVB2601的空中下载软件升级应该是很容易实现的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表