22 if (_imageHandshake.packets != 0) {
26 constexpr mavlink_data_transmission_handshake_t data = {
28 MAVLINK_DATA_STREAM_IMG_JPEG,
32 (void) mavlink_msg_data_transmission_handshake_encode_chan(system_id, component_id, chan, &message, &data);
39 constexpr mavlink_data_transmission_handshake_t data{};
40 (void) mavlink_msg_data_transmission_handshake_encode_chan(system_id, component_id, chan, &message, &data);
45 switch (message.msgid) {
46 case MAVLINK_MSG_ID_DATA_TRANSMISSION_HANDSHAKE:
48 if (_imageHandshake.packets > 0) {
49 qCWarning(ImageProtocolManagerLog) <<
"DATA_TRANSMISSION_HANDSHAKE: Previous image transmission incomplete.";
52 mavlink_msg_data_transmission_handshake_decode(&message, &_imageHandshake);
53 qCDebug(ImageProtocolManagerLog) << QStringLiteral(
"DATA_TRANSMISSION_HANDSHAKE: type(%1) width(%2) height (%3)").arg(_imageHandshake.type).arg(_imageHandshake.width).arg(_imageHandshake.height);
56 static constexpr uint32_t kMaxImageSize = 1u * 1024u * 1024u;
57 if (_imageHandshake.size == 0 || _imageHandshake.payload == 0 || _imageHandshake.packets == 0) {
58 qCWarning(ImageProtocolManagerLog) <<
"DATA_TRANSMISSION_HANDSHAKE: Invalid field(s) - size:" << _imageHandshake.size
59 <<
"payload:" << _imageHandshake.payload <<
"packets:" << _imageHandshake.packets;
63 if (_imageHandshake.size > kMaxImageSize) {
64 qCWarning(ImageProtocolManagerLog) <<
"DATA_TRANSMISSION_HANDSHAKE: Image size exceeds limit. size:" << _imageHandshake.size;
68 if (_imageHandshake.payload >
sizeof(mavlink_encapsulated_data_t::data)) {
69 qCWarning(ImageProtocolManagerLog) <<
"DATA_TRANSMISSION_HANDSHAKE: payload exceeds ENCAPSULATED_DATA data field size. payload:" << _imageHandshake.payload;
74 _imageBytes.resize(_imageHandshake.size,
'\0');
77 case MAVLINK_MSG_ID_ENCAPSULATED_DATA:
79 if (_imageHandshake.packets == 0) {
80 qCWarning(ImageProtocolManagerLog) <<
"ENCAPSULATED_DATA: received with no prior DATA_TRANSMISSION_HANDSHAKE.";
84 mavlink_encapsulated_data_t encapsulatedData;
85 mavlink_msg_encapsulated_data_decode(&message, &encapsulatedData);
87 const uint32_t bytePosition =
static_cast<uint32_t
>(encapsulatedData.seqnr) * _imageHandshake.payload;
88 if (bytePosition >= _imageHandshake.size) {
89 qCWarning(ImageProtocolManagerLog) <<
"ENCAPSULATED_DATA: seqnr is past end of image size. seqnr:" << encapsulatedData.seqnr <<
"_imageHandshake.size:" << _imageHandshake.size;
94 const uint32_t bytesRemaining = _imageHandshake.size - bytePosition;
95 const uint32_t bytesToCopy = qMin(
static_cast<uint32_t
>(_imageHandshake.payload), bytesRemaining);
97 (void) memcpy(_imageBytes.data() + bytePosition, encapsulatedData.data, bytesToCopy);
100 _imageHandshake.packets--;
101 if (_imageHandshake.packets == 0) {