QGC业务流程

任务传输

  • 任务传输包含两个部分:1 任务从界面到物理飞行器。2 从物理飞行器中上传任务,显示到界面。
  • 在界面上通过鼠标添加任务,其实添加的是VisualMissionItem的子类。这些子类会存储在PlanElementController的子类中。当点击上传按钮时,VisualMissionItem的子类会转换成MissionItem的子类存储PlanManage的子类中。然后通过mavlink协议发送到物理小车。
  • 下载流程是相反的。
  • 任务不仅可以下发到小车,也可以保存的文件。
    QGC业务流程_第1张图片
  • PlanManager的子类位于Vehicle中。PlanElementController的子类位于PlanMasterController中。
  • 界面上任务传输调用的最顶层的函数位于PlanMasterControlle中。
  • PlanElementController的子类中有当前活动的小车。
    任务的具体发送是通过小车中PlanManager::writeMissionItems
    任务的接收是通过PlanManager::_mavlinkMessageReceived函数接收的

信号传输

  • activeVehicleChanged
    原始产生对象:MultiVehicleManager
    产生方式:地面站有新的小车接入或工具栏手动切换小车
    注意:是通过父类再转一下。
    传输链:MultiVehicleManager----->PlanMasterController-------->MissionController、GeoFenceController、RallyPointControlle

相关类

PlanManager

PlanManager {

 typedef enum {
        AckNone,            ///< State machine is idle
        AckMissionCount,    ///< 从小车读取的任务个数
        AckMissionItem,     ///< 从小车读取一条任务
        AckMissionRequest,  ///< 小车请求一条任务
        AckMissionClearAll, ///<删除小车内的任务
        AckGuidedItem,      ///< MISSION_ACK expected in response to ArduPilot guided mode single item send
  } AckType_t;

  此类与小车的通信只在执行交易前创建,执行交易后关闭。

  将任务上传到小车:先给小车发我有多少条任务 mavlink_msg_mission_count_pack_chan。
                    然后小车发送获取任务的请求。收到请求后执行_handleMissionRequest()函数。在此函数内打包任务mavlink_msg_mission_item_int_pack_chan。

  将任务从小车下载:先给小车发送下载任务的请求mavlink_msg_mission_request_list_pack_chan。
                    然后小车发送当前一共有多少条任务的消息。收到消息后执行_handleMissionCount()。在此函数里解包个数,然后调用_requestNextMissionItem()逐条请求任务。
                    小车收到消息后,返回 MAVLINK_MSG_ID_MISSION_ITEM_INT消息。收到此消息后调用_handleMissionItem()

  void loadFromVehicle(void) {
      1 状态检查inProgress(): 当前没有正在进行上传,下载,删除
      2 设置状态变量:_retryCount重连次数,_setTransactionInProgress(TransactionRead)设置当前交易状态为读
      3 创建mavlink连接
      4 _requestList(void) {
             1 清除读缓存
             2 打包消息mavlink_msg_mission_request_list_pack_chan
             3 启动计时器检查状态
        }
   }

  当小车收到消息后,会发送MAVLINK_MSG_ID_MISSION_ITEM_INT消息。lanManager::_handleMissionItem(const mavlink_message_t& message)函数会被调用
  _handleMissionItem(const mavlink_message_t& message) {
     1 解包
     2 if (_itemIndicesToRead.count() == 0) {
         _readTransactionComplete();
       } else {
         _requestNextMissionItem();
      }
  }

}

PlanMasterController

PlanMasterController {
   此类用于连接:界面,PlanManager,PlanElementController

   // 控件被加载完就会被调用。它执行了如下功能:
   // 1 启动子控制器; 
   // 2 连接信号MultiVehicleManager::activeVehicleChanged------>PlanMasterController::_activeVehicleChanged
   //      2.1 PlanMasterController::_activeVehicleChanged槽函数会将PlanManager的子对象和PlanElementController子对象建立连接。
   //            2.1.1 PlanManager是跟小车通信的。当界面点击【上传】【下载】按钮时,其实调用的是PlanManager子对象。当子对象完成任务时以发送信号的方式告诉PlanMasterController。PlanMasterController控制PlanElementController刷新界面。
   //      2.2 emit PlanMasterController::_managerVehicleChanged(_managerVehicle),此信号在子控制器中绑定到对应的槽
   //      2.3 更新界面
   // 3 更新界面
    Q_INVOKABLE void start(void);

   // 若要操作非活动小车,需要调用次函数。一般先new 一个PlanMasterController, 然后调用PlanMasterController的接口发送数据。发送完自动删除PlanMasterController对象。
   // 此函数被static void sendPlanToVehicle(Vehicle* vehicle, const QString& filename)调用
   Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false);

   // 检测任务管理器状态
   Q_INVOKABLE int readyForSaveState(void) const { return _missionController.readyForSaveState(); }

   // 刷新界面
   Q_INVOKABLE void showPlanFromManagerVehicle(void);

    //  任务上传下载函数,这些函数会被qml直接调用,当点击指定的按钮时。这些函数从PlanElementController获取数据,通过PlanManager发送数据。
    Q_INVOKABLE void loadFromVehicle(void);                           // 从小车里加载任务
    Q_INVOKABLE void sendToVehicle(void);                             // 发送任务到小车
    Q_INVOKABLE void loadFromFile(const QString& filename);
    Q_INVOKABLE void saveToCurrent();
    Q_INVOKABLE void saveToFile(const QString& filename);
    Q_INVOKABLE void saveToKml(const QString& filename);
    Q_INVOKABLE void removeAll(void);                           // 清空的是界面,当软件启动时,或有活动的小车变化时会被    
    Q_INVOKABLE void removeAllFromVehicle(void);                // 将小车里的任务清除
}

你可能感兴趣的:(QGC4.2源代码梳理,java,算法,开发语言)