QGC软件件架构

软件架构图

此图来源阿木实验室,QGC的源码架构基本没变。
QGC软件件架构_第1张图片

  1. QGCApplication创建QGCToolbox类成员变量。
  2. QGCToolbox创建不同的Manager类。QGCToolbox是给C++代码调用这些Manager类的入口。
  3. QGroundControlQmlGlbal会引用QGCToolbox创建的Manager类。
    引用的方式是存储了Manager类的指针。
    QGroundControlQmlGlbal将这些Manager类的指针封装成属性,用于QML中访问。
    它在QGCApplication::_initCommon()中被注册成了单例。
  4. Vehicle是由MultiVehicleManager来创建管理的。
  5. Vehicle有MissionManager.GeoFenceManager,RallyPointManager的类成员变量。这三个类用和Vehicle对接,从Vehicle上传,下载任务。
  6. RallyPointController,GeoFenceController,MissionController,这三个类用于UI显示操作。
  7. 上面和任务相关的类的交互工做是在PlanMasterController类内完成的。
    MissionManager掌管的数据需要转换才能用于MissionController进行显示。

Vehicle创建流程

  1. LinkManager管理实际的物理连接,如串口,tcp,蓝牙等。它内部有定时器,用于链接的刷新。
  2. 物理连接连接好后,实际物理链接获取到的数据会发送到MAVLINKProtocol类内进行解析。
  3. 若解析出Mavlink协议的心跳,且ID号为新的,则创建小车。

程序的启动流程

  1. 使用共享内存的方式保证只能有单个程序运行(RunGuard)。
  2. 创建QGCApplication,在构造函数中new出QTCToolbox。
  3. 调用QGCApplication::_initCommon注册用于qml的c++类。
  4. QGCApplication::_initForNormalAppBoot创建UI,并初始化工具类。

程序产生的文件

  • AppSettings界面的配置结果
    C:\Users\WenlouYin\AppData\Roaming\QGroundControl.org

  • 日志,任务,参数缓存,视频,照片
    我的文档/QGroundControl Daily
    我的文档/QGroundControl

  • 地图缓存位置

QGC依赖的库

  • libs/eigen
    Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。
  • libs/Frameworks/SDL2.framework
    Android OpenSSL support
  • libs/libevents
    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
  • libs/mavlink
    软件层面,数据打包解包工具
  • libs/Microsoft
    微软的相关库,msvcp140.dll vcruntime140.dll
  • libs/msinttypes
    用vs的c99编译需要的头文件。
  • libs/OpenSSL
    应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
  • libs/qmdnsengine
    用于Qt应用程序的多播DNS库。
  • libs/qmlglsink
    用于GStreamer的视频在qml界面中播放。 https://blog.ztluo.dev/post/0042-qmlglsink-in-qquickwidget/
  • libs/qtandroidserialport
    安卓串口库
  • libs/sdl2
    SDL是一个开放源代码的跨平台多媒体开发库。对多媒体处理,如视频渲染,音频播放,鼠标/键盘控制等操作。
  • libs/shapelib
    此库用于读写无人机任务规划的文件。
  • libs/thirdParty
  • libs/xz-embedded
    读(.xz格式)文件的库。
  • libs/zlib
    压缩库。

日志框架

qgc的日志框架是基于qt的日志框架。涉及的类有两个QGCLoggingCategory和QGCLoggingCategoryRegister。QGCLoggingCategory在构造函数中将构造函数的参数注册到QGCLoggingCategoryRegister里。QGCLoggingCategoryRegister用来管理日志数据的是否打印。QGCLoggingCategoryRegister的相关函数会被AppMessages.qml调用。

QGC软件件架构_第2张图片

添加新的日志

  1. 在头文件中先申明:Q_DECLARE_LOGGING_CATEGORY(FirmwareUpgradeLog)
  2. 在cpp文件中调用:QGC_LOGGING_CATEGORY(FirmwareUpgradeLog, “FirmwareUpgradeLog”)
  3. 写日志: qCDebug(FirmwareUpgradeLog) << “open:” << portName;

你可能感兴趣的:(QGC4.2源代码梳理,经验分享)