QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
RequestMessageCoordinator.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QElapsedTimer>
4#include <QtCore/QList>
5#include <QtCore/QMap>
6#include <QtCore/QObject>
7#include <QtCore/QPointer>
8
10#include "VehicleTypes.h"
11
12class MavCommandQueue;
13class Vehicle;
14
19
20class RequestMessageCoordinator : public QObject, public VehicleTypes
21{
22 Q_OBJECT
23
24public:
25 RequestMessageCoordinator(Vehicle* vehicle, MavCommandQueue* commandQueue);
27
31 void requestMessage(RequestMessageResultHandler resultHandler, void* resultHandlerData,
32 int compId, int messageId,
33 float param1 = 0.0f, float param2 = 0.0f, float param3 = 0.0f, float param4 = 0.0f, float param5 = 0.0f);
34
37 void handleReceivedMessage(const mavlink_message_t& message);
38
40 void stop();
41
45 void cancelRequests(void* resultHandlerData);
46
48
49private:
50 typedef struct RequestMessageInfo {
51 QPointer<Vehicle> vehicle; // QPointer automatically becomes null when Vehicle is destroyed
52 RequestMessageCoordinator* coordinator = nullptr; // Back-pointer so the static ack handler can reach the instance.
53 int compId = 0;
54 int msgId = 0;
55 float param1 = 0.0f;
56 float param2 = 0.0f;
57 float param3 = 0.0f;
58 float param4 = 0.0f;
59 float param5 = 0.0f;
60 RequestMessageResultHandler resultHandler = nullptr;
61 void* resultHandlerData = nullptr;
62 bool commandAckReceived = false; // We keep track of the ack/message being received since the order in which this will come in is random
63 bool messageReceived = false; // We only delete the allocated RequestMessageInfo when both the message is received and we get the ack
64 QElapsedTimer messageWaitElapsedTimer; // Elapsed time since we started waiting message to show up
65 mavlink_message_t message;
66 } RequestMessageInfo_t;
67
68 void _removeInfo(int compId, int msgId);
69 bool _duplicate(int compId, int msgId) const;
70 void _sendNow(RequestMessageInfo_t* info);
71 void _sendNextFromQueue(int compId);
72
73 static void _cmdResultHandler(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode);
74
77 static void _noOpResultHandler(void* resultHandlerData, MAV_RESULT commandResult, RequestMessageResultHandlerFailureCode_t failureCode, const mavlink_message_t& message);
78
79 Vehicle* _vehicle = nullptr;
80 MavCommandQueue* _commandQueue = nullptr;
81
82 QMap<int /* compId */, QMap<int /* msgId */, RequestMessageInfo_t*>> _infoMap; // Active requests awaiting response
83 QMap<int /* compId */, QList<RequestMessageInfo_t*>> _queueMap; // Per-component queue waiting for active request to finish
84};
struct __mavlink_message mavlink_message_t
struct __mavlink_command_ack_t mavlink_command_ack_t
Owns the COMMAND_LONG / COMMAND_INT send/retry/ack pipeline for a single Vehicle.
Coordinates MAV_CMD_REQUEST_MESSAGE workflows: per-component queueing, ack/message correlation,...
void handleReceivedMessage(const mavlink_message_t &message)
void cancelRequests(void *resultHandlerData)
static QString failureCodeToString(RequestMessageResultHandlerFailureCode_t failureCode)
void requestMessage(RequestMessageResultHandler resultHandler, void *resultHandlerData, int compId, int messageId, float param1=0.0f, float param2=0.0f, float param3=0.0f, float param4=0.0f, float param5=0.0f)
void stop()
Clear pending state without firing callbacks (used during vehicle shutdown).
void(* RequestMessageResultHandler)(void *resultHandlerData, MAV_RESULT commandResult, RequestMessageResultHandlerFailureCode_t failureCode, const mavlink_message_t &message)
Callback for requestMessage — delivered when the ack/message pair resolves or a failure occurs.
RequestMessageResultHandlerFailureCode_t