17static_assert(
RTCMMAVLinkPacket::kFragmentLen == MAVLINK_MSG_GPS_RTCM_DATA_FIELD_DATA_LEN);
24 return [weakLink = std::weak_ptr<LinkInterface>(link)](
const GPSRTCMPacket& packet) {
26 qCWarning(RTCMMAVLinkLog) <<
"RTCM packet exceeds MAVLink payload limit";
29 const auto target = weakLink.lock();
30 if (!target || !target->isConnected() || !target->mavlinkChannelIsSet()) {
33 mavlink_gps_rtcm_data_t payload{};
34 payload.flags = packet.flags;
35 payload.len =
static_cast<uint8_t
>(packet.data.size());
36 if (!packet.data.isEmpty()) {
37 std::memcpy(payload.data, packet.data.constData(), packet.data.size());
43 target->sendMessageThreadSafe(message);
51 : _outputProvider(vehicleLinkOutputs())
53 qCDebug(RTCMMAVLinkLog) <<
this;
58 qCDebug(RTCMMAVLinkLog) <<
this;
64 QList<std::shared_ptr<LinkInterface>> links;
65 QList<Output> outputs;
70 auto* vehicles = manager->vehicles();
71 for (
int index = 0; index < vehicles->count(); ++index) {
72 auto* vehicle = vehicles->value<
Vehicle*>(index);
73 if (!vehicle || !vehicle->vehicleLinkManager()) {
77 if (!link || !link->isConnected() || link->isLogReplay() || links.contains(link)) {
80 outputs.append(makeOutput(link));
81 links.append(std::move(link));
89 _outputProvider = std::move(provider);
98 _sequenceId = packed.nextSequenceId;
99 const auto outputs = _outputProvider ? _outputProvider() : QList<Output>();
100 quint64 submitted = 0;
101 for (
const auto& output : outputs) {
105 for (
const auto& packet : packed.packets) {
106 if (!output(packet)) {
109 submitted += packet.data.size();
112 _submittedBytes += submitted;
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
static int getComponentId()
static MAVLinkProtocol * instance()
static MultiVehicleManager * instance()
Pure GPS_RTCM_DATA fragmentation; no vehicle, link, or application dependencies.
static PackResult pack(QByteArrayView data, uint8_t sequenceId)
static constexpr qsizetype kFragmentLen
quint64 submitToOutputs(QByteArrayView data)
std::function< bool(const GPSRTCMPacket &)> Output
Admits one packet to a vehicle link; admission only, not physical delivery or receiver acknowledgemen...
void setOutputProvider(OutputProvider provider)
static OutputProvider vehicleLinkOutputs()
The distinct primary links of live vehicles, excluding log replay. Outputs hold their link weakly.
std::function< QList< Output >()> OutputProvider
RTCMMAVLink()
Submits to vehicleLinkOutputs() until setOutputProvider() replaces them.
WeakLinkInterfacePtr primaryLink() const
VehicleLinkManager * vehicleLinkManager()