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

一,前言

基于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就是我代码要实现的每个独立的类。

        
          F_ID
          SID10
          10,03
          50,03
          0
        
        
          P_ID
          SID10
          10,02
          50,02
          0
        
        
          F_ID
          SID27
          27,09
          67,09,seed
          0
        

四,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报文的时间不会更新,之后要修改的。


image.png

六,小结

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

你可能感兴趣的:(45.QT boot工具导入xml动态创建状态机--Apple的学习笔记)