【开源项目】X-TRACK源码分析


processon框架图

X-TRACK阅读笔记

整体架构

APP-HAL-HARDWARE

USER/APP/Common/HAL下的HAL文件声明HAL的接口,具体实现在App/HAL/下或者Simulator/LVGL.Simulator/HAL/

Main函数

HAL::HAL_Init();
lv_Init();
APP_Init();	// 重点

APP_Init函数

static AppFactory factory;
static PageManager manager(&factory);
DataProc_Init();
manager.Install("LiveMap",     "Pages/LiveMap");

在此函数中,有两个重点:一是定义PageManager,并对页面进行管理;二是初始化DataCenter,实现数据的传递。

理解要点: X-TRACK将App/Common/DataProc下的每个DP_XXX,以及App/Pages/下的每个页面都视为一个Account。(这些Account会在DataProc_Init()中被定义,被DataCenter所管理)

PageManager框架

在这里插入图片描述

DataCenter框架

在这里插入图片描述

通过manager.Push("Page/StartUp")开始页面的调度

PageManager

需要关心的只有几个方法:

manager.Install("xxx")
manager.Push("xxx") // 将xxx入栈到栈顶,实则会显示xxx页面

APP/Utils/PageManager下实现了PageManager,并提供了几个public接口,包括页面注册:Install(会调用Register), Uninstall;页面调度:Push, Pop,Replace,最终都会调用SwitchTo(PageBase*, bool, PageBase::Stash_t*);

SwitchTo()中会

  1. 调用StateUpdate(_PagePrv), StateUpdate(_PageCurrent)更新页面

PageManager的其它方法不用特别关心,其内部使用了状态机进行页面的切换。我们只需根据App/Pages/下的模板Template定义我们自己的页面。模板的结构是:

自定义页面

初略的页面框架:

在这里插入图片描述

详细的页面框架:
在这里插入图片描述

实现如下onViewXXX()函数:

virtual void onViewLoad() {}  /* Page load start */
virtual void onViewDidLoad() {}  /* Page load end */

virtual void onViewWillAppear() {}/* Page appear animation start */
virtual void onViewDidAppear() {}  /* Page appear animation end  */

virtual void onViewWillDisappear() {}/* Page disappear animation start */
virtual void onViewDidDisappear() {} /* Page disappear animation end */

virtual void onViewUnload() {}  /* Page unload start */
virtual void onViewDidUnload() {}  /* Page unload end */

问题

  1. App/Pages/Dialate/*中的Dialate.*, DialateModel.*, DialteView.*分别有什么用?特别是ModelView

View应该是创建并管理页面各个wigdet的,由View.Create(lv_ojb_t _root)可知,_root充当该页面的根节点,其它的各个lv组件都是_root的子节点,如btn、label等。

Model是用于获取数据的

  1. 搞懂页面之间的消息传递机制(或者页面的数据怎么从硬件上获取到的?)

每个页面类/对象有一个方法Update(),其会更新页面上的各个数据,它会在onTimerUpdate()中被调用,又会被onViewDidAppear()中被使用(创建一个定时器)

three
two
one
lv_timer_del()
onViewWillDisappear()
删除定时器
Update()
最终被调用
更新页面数据
onTimerUpdate()
被周期性调用
onViewDidAppear()
创建定时器
StateUpdate()
利用状态机调用onViewXXX函数
SwitchTo()
manager.Push()
manager.Install()
加载并注册页面
  1. DataProc.cppDataProc_Init()函数内的宏
    在这里插入图片描述

订阅-发布机制的核心:每个人都有一个账户,有一个代理。每个账户要设置一个事件回调函数onEvent(),供Pull(), Notify()调用,但会传入不同的事件类型,比如Account::EVENT_SUB_PULLAccount::EVENT_NOTIFY

数据分发机制有点没懂:相关代码:DataProc.cpp, DataCenter.*, Account.*

成员变量
注册许多accounts到center
center
AccountMain
DataProc_Init()
accounts
AddAccount()
RemoveAccount()
SearchAccount()
Subscirbe()
Commit()
Publish()
Pull()
Notify()
Center
UserData
publishers
subscribers

Account对象的Pull(pub,data,size),Notify(pub,data,size)函数都会调用pub->priv.eventCallback(pub,para)

而在App/Common/DataProc/下的每个DP_XXX.cpp都包含一个account对象,其会在DATA_PROC_INIT_DEF(Clock)中调用account->SetEventCallback(onEvent)设置事件回调函数。而在回调函数中,就可以通过判断传入的参数,返回订阅者需要的数据(通过调用HAL层提供的接口)。

此外,DialplateModel::Init()中也会创建account,并像上面一样,设置回调函数。

页面的分析

以Diplate页面为例

StatusBar

在任何页面都显示,不会被遮挡,因为位于lv_layer_top()
在这里插入图片描述

Startup页面

在这里插入图片描述

Dilaplate页面

在这里插入图片描述

void DialplateView::Create(lv_obj_t* root)设计页面的布局,及动画设置

页面的布局
BottomInfo_Create(root);
TopInfo_Create(root);
BtnCont_Create(root);
动画的设置

核心:成员lv_anim_timeline_t* anim_timeline;

通过宏定义ANIM_DEF定义多个动画:lv_anim_timeline_wrapper_t类型

调用

LiveMap页面

在这里插入图片描述

SystemInfos页面

在这里插入图片描述

  • 25
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Node-RED 是一个基于 Node.js 构建的开源流程编排工具,它具有简单易用的特点,可以帮助用户快速搭建、管理和部署流程应用。Node-RED 的源码分析是指对其代码库进行深入剖析,以便了解其内部结构和工作原理。 首先,Node-RED 的源码主要由 JavaScript 编写,大部分代码都是围绕 Node.js 运行时环境展开。其核心功能是基于事件驱动的管道式数据处理,通过流程图的方式将各种节点(Node)串联起来,形成一个数据处理流程。因此,在源码分析中,需要重点关注事件驱动机制、节点的定义与扩展、消息传递机制等方面的实现细节。 其次,Node-RED 采用了 Express 框架来搭建 Web 服务,并通过 WebSocket 实现了实时通信。在源码分析中,需要深入了解其 Web 服务的实现方式,以及与客户端的交互方式和消息传递机制。此外,还需要对其对外部插件和节点的支持机制进行分析,以便了解其扩展性和定制化能力。 最后,在源码分析中还需要深入了解 Node-RED 的核心模块以及各种节点的实现方式,比如文件操作、网络请求、数据库操作等,以及其对于不同数据格式的处理能力。同时,还需要关注其错误处理、安全机制、性能优化等方面的实现方式。 总的来说,Node-RED 的源码分析是一个复杂而全面的工作,需要对 JavaScript 和 Node.js 相关技术有深入的了解,以便更好地理解其内部结构和工作原理,为进一步的定制和扩展工作提供有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值