【平头哥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屏幕显示升级时的固件下载进度。
|