45.QT boot工具导入xml动态创建状态机Apple的学习笔记

admin 2023年3月6日20:08:27评论11 views字数 2079阅读6分55秒阅读模式

一,前言

基于stm32的uds Boot调试成功--Apple的学习笔记已经实现了单片机bootloader代码,测试用自己写的canoe CAPL脚本对bootloader进行测试。但是我的目的是玩玩QT上位机工具制作,那么每个主机厂bootloader都不太一样,我的目标是做一个通用的boot上位机工具。

二,代码架构设计

首先uds按顺序发命令,而这个顺序应该通过配置文件可以设置,那么首先想到的就是xml,一般游戏开发或工具类的等都喜欢用此小型数据库。而且还能专门做工具界面来生成xml文件。
接着就是按顺序发命令,这个顺序理解为状态机,通过状态机不断运行,从开始直至结束。那么在c++中常用的就是map依次扫描,而xml的信息就可以存储到map中。那么就变成了命令可以动态可配置,符合我要做一个通用的boot上位机的功能需求。

三,xml结构体设计

写代码无非就是数据结构设计加逻辑,我现在等于用了数据和逻辑分离的设计思想来解决bootloader工具可以支持任意主机厂,因为uds和tp协议是一样的,主要是数据内容不同。暂时xml设计为如下样式,ServiceType就是我代码要实现的每个独立的类。
  <Step1>    <CanID>F_IDCanID>    <ServiceType>SID10ServiceType>    <Request>10,03Request>    <Response>50,03Response>    <Delay_ms>0Delay_ms>  Step1>  <Step2>    <CanID>P_IDCanID>    <ServiceType>SID10ServiceType>    <Request>10,02Request>    <Response>50,02Response>    <Delay_ms>0Delay_ms>  Step2>  <Step3>    <CanID>F_IDCanID>    <ServiceType>SID27ServiceType>    <Request>27,09Request>    <Response>67,09,seedResponse>    <Delay_ms>0Delay_ms>  Step3>

四,c++状态机设计

至于c++状态机设计网上太多了,这是经典的。主要用context上下文调度来切换state到下一个state,这个看上去有点像单片机的FreeRTOS切换任务一样。
我先加入了3条服务,用来搭建和验证框架的。如下为读取xml的ServiceType来创建任务类的map数组。context start后,则调用
_context->Update(msg);按map顺序调用状态机了。
void CanListener::contextEnable(){    _context = new FsmState::Context();
// 根据xml创建状态机 getXMLandCreateState();
// 开始状态机 _context->Start(_startType);}void CanListener::getXMLandCreateState(){ QMap::iterator iter = xmlreader::instance().getCmdInfBegin(); _startType = iter.key().toStdString();//iter.value().ServiceType.toStdString(); while (iter != xmlreader::instance().getCmdInfEnd()) { // 通过xml的ServiceType来创建任务类的map数组 _step = iter.key(); QString ServiceType = iter.value().ServiceType; if(ServiceType == "SID10") { _context->CreateState(new SID10(), "SID10","",_step.toStdString()); } else if(ServiceType == "SID27") { _context->CreateState(new SID27(), "SID27","",_step.toStdString()); } else if(ServiceType == "SID31") { _context->CreateState(new SID31(), "SID31","",_step.toStdString()); } else { //add later } iter++; }}

五,验证截图

如下截图,解析xml成功,且报文发送的顺序正确,但是rx报文的时间不会更新,之后要修改的。

45.QT boot工具导入xml动态创建状态机--Apple的学习笔记
image.png

六,小结

闲着没事,就喜欢创造发明小工具,还有很多功能没加,且听下回分解~

45.QT boot工具导入xml动态创建状态机--Apple的学习笔记


作者:applecai
链接:https://www.jianshu.com/p/a3f6b7c0a68f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文始发于微信公众号(汇编语言):45.QT boot工具导入xml动态创建状态机--Apple的学习笔记

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月6日20:08:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   45.QT boot工具导入xml动态创建状态机Apple的学习笔记https://cn-sec.com/archives/1253895.html

发表评论

匿名网友 填写信息