5#include <QtCore/QPointer>
18struct RequestIntervalData {
19 QPointer<MessageIntervalManager> manager;
25 QPointer<MessageIntervalManager> manager;
35 , _commandQueue(commandQueue)
36 , _reqMsgCoord(reqMsgCoord)
42 mavlink_message_interval_t data;
43 mavlink_msg_message_interval_decode(&message, &data);
45 const MavCompMsgId compMsgId = {message.compid, data.message_id};
46 const int32_t rate = (data.interval_us > 0) ? 1000000.0 / data.interval_us : data.interval_us;
48 if (!_mavlinkMsgIntervals.contains(compMsgId) || _mavlinkMsgIntervals.value(compMsgId) != rate) {
49 (void) _mavlinkMsgIntervals.insert(compMsgId, rate);
54void MessageIntervalManager::_requestMessageIntervalResultHandler(
void* resultHandlerData, MAV_RESULT result, RequestMessageResultHandlerFailureCode_t failureCode,
const mavlink_message_t& )
57 std::unique_ptr<RequestIntervalData> ctx(
static_cast<RequestIntervalData*
>(resultHandlerData));
58 if (!ctx || !ctx->manager) {
63 (void) ctx->manager->_unsupportedMessageIds.insert(ctx->compId, ctx->msgId);
67void MessageIntervalManager::_requestMessageInterval(uint8_t compId, uint16_t msgId)
69 if (_unsupportedMessageIds.contains(compId, msgId)) {
73 auto* ctx =
new RequestIntervalData{
this, compId, msgId};
75 &MessageIntervalManager::_requestMessageIntervalResultHandler,
78 MAVLINK_MSG_ID_MESSAGE_INTERVAL,
85 const MavCompMsgId compMsgId = {compId, msgId};
87 if (_mavlinkMsgIntervals.contains(compMsgId)) {
88 rate = _mavlinkMsgIntervals.value(compMsgId);
90 _requestMessageInterval(compId, msgId);
95void MessageIntervalManager::_setMessageRateCommandResultHandler(
void* resultHandlerData,
int ,
const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode)
97 std::unique_ptr<SetRateData> ctx(
static_cast<SetRateData*
>(resultHandlerData));
98 if (!ctx || !ctx->manager) {
103 ctx->manager->_requestMessageInterval(ctx->compId, ctx->msgId);
109 auto* ctx =
new SetRateData{
this, compId, msgId};
111 &MessageIntervalManager::_setMessageRateCommandResultHandler,
117 const float interval = (rate > 0) ? 1000000.0 / rate : rate;
122 MAV_CMD_SET_MESSAGE_INTERVAL,
123 static_cast<float>(msgId),
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
struct __mavlink_command_ack_t mavlink_command_ack_t
void sendCommandWithHandler(const MavCmdAckHandlerInfo_t *ackHandlerInfo, int compId, MAV_CMD command, float param1=0.0f, float param2=0.0f, float param3=0.0f, float param4=0.0f, float param5=0.0f, float param6=0.0f, float param7=0.0f)
void handleMessageInterval(const mavlink_message_t &message)
void mavlinkMsgIntervalsChanged(uint8_t compid, uint16_t msgId, int32_t rate)
void setMessageRate(uint8_t compId, uint16_t msgId, int32_t rate)
MessageIntervalManager(Vehicle *vehicle, MavCommandQueue *commandQueue, RequestMessageCoordinator *reqMsgCoord)
int32_t getMessageRate(uint8_t compId, uint16_t msgId)
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)
Callback info bundle for sendMavCommandWithHandler.
@ MavCmdResultCommandResultOnly
commandResult specifies full success/fail info
@ RequestMessageNoFailure