文章目录
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. 流程总结
大致流程如下: