QGC源码分析——MavCmdInfoCommon.json加载的流程分析(保存了mavlink中航点或指令的常用信息)

1. SJON文件介绍

.json文件介绍

JSON是全称为JavaScript Object Notation,是一种有条理,易于访问的存储信息的方法。

它为我们提供了一个可读的数据集合,我们可以通过合理的方式来访问这些数据。JSON文件可以存储简单的数据结构和对象。

JSON文件在许多不同的编程API中都被支持。如今,JSON已被用于许多Web应用程序来进行数据交换,并且它们实际上不会在硬盘驱动器上保存“.JSON”文件,可以在互联网连接的计算机之间进行数据交换。某些应用程序允许用户将其保存在“.JSON”文件中。

在MavCmdInfoCommon.json 中保存了航点或者命令信息, 如返航点的信息
在这里插入图片描述
在调试中,增加一个返航点时的断点,信息都能对上,另外说明下 “id” 就是 “command”

// MissionCommandDialog.qml 中
在这里插入图片描述
在 //MissionItemEditor.qml 中调用

之后在 //PlanView.qml 中调用

2. 流程分析

2.1 搜“MavCmdInfoCommon” 发现此函数有三处

  • 其一是 基类FirmwarePlugin.cc 中:
//FirmwarePlugin\FirmwarePlugin.cc:194
QString FirmwarePlugin::missionCommandOverrides(MAV_TYPE vehicleType) const
{
    
    
    switch (vehicleType) {
    
    
    case MAV_TYPE_GENERIC:
        return QStringLiteral(":/json/MavCmdInfoCommon.json");
    ...
}

        missionCommandOverrides是一个有内容的虚函数,可以被子类重写(override ):

//FirmwarePlugin.h
    virtual QString missionCommandOverrides(MAV_TYPE vehicleType) const;
  • 其二是子类APM中:它继承了FirmwarePlugin
class APMFirmwarePlugin : public FirmwarePlugin
{
    
    
}
//FirmwarePlugin\APM\APMFirmwarePlugin.cc:776
QString APMFirmwarePlugin::missionCommandOverrides(MAV_TYPE vehicleType) const
{
    
    
    switch (vehicleType) {
    
    
    case MAV_TYPE_GENERIC:
        return QStringLiteral(":/json/APM/MavCmdInfoCommon.json");
    }
}

        重写父类:

QString  missionCommandOverrides     (MAV_TYPE vehicleType) const override;
  • 其三是PX4中:
//FirmwarePlugin\PX4\PX4FirmwarePlugin.cc:303
QString PX4FirmwarePlugin::missionCommandOverrides(MAV_TYPE vehicleType) const
{
    
    
    switch (vehicleType) {
    
    
    case MAV_TYPE_GENERIC:
        return QStringLiteral(":/json/PX4/MavCmdInfoCommon.json");
    ...
}

2.2 missionCommandOverrides被 setToolbox 调用

//MissionCommandTree.cc:57
void MissionCommandTree::setToolbox(QGCToolbox* toolbox)
{
    
    
	...
	QString overrideFile = plugin->missionCommandOverrides(vehicleType); ///--[Mark]
	...
	_staticCommandTree[firmwareType][vehicleType] = new MissionCommandList(overrideFile, firmwareType == MAV_AUTOPILOT_GENERIC && vehicleType == MAV_TYPE_GENERIC /* baseCommandList */, this);

}

2.3 MissionCommandTree::setToolbox 被调用

至此,往上应用基本相似,最终在main.cc中实例化。

//src\QGCToolbox.cc:97
void QGCToolbox::setChildToolboxes(void)
{
    
    
    ...
    _missionCommandTree->setToolbox(this);
}

2.4 setChildToolboxes 被 QGCApplication 调用

//src\QGCApplication.cc:331
QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)
{
    
    
	...
    _toolbox->setChildToolboxes();
}

2.5 QGCApplication 在 mian.cc 中的实例化

//src\main.cc:343
int main(int argc, char *argv[])
{
    
    
    QGCApplication* app = new QGCApplication(argc, argv, runUnitTests);
}

3. 流程总结

大致流程如下:

new QGCApplication
_toolbox->setChildToolboxes
_missionCommandTree->setToolbox
plugin->missionCommandOverrides
mian.cc
QGCApplication::QGCApplication
QGCToolbox::setChildToolboxes
MissionCommandTree::setToolbox
FirmwarePlugin::missionCommandOverrides
PX4FirmwarePlugin::missionCommandOverrides
APMFirmwarePlugin::missionCommandOverrides
MavCmdInfoCommon.json

猜你喜欢

转载自blog.csdn.net/qq_16504163/article/details/107465222