mavlink_convert.h
Go to the documentation of this file.
1 
6 /*
7  * Copyright 2015,2016 Vladimir Ermakov.
8  *
9  * This file is part of the mavros package and subject to the license terms
10  * in the top-level LICENSE file of the mavros repository.
11  * https://github.com/mavlink/mavros/tree/master/LICENSE.md
12  */
13 
14 #pragma once
15 
16 #include <algorithm>
17 #include <mavros_msgs/Mavlink.h>
18 #include <mavconn/mavlink_dialect.h>
19 
20 namespace mavros_msgs {
21 namespace mavlink {
22 
23 using ::mavlink::mavlink_message_t;
24 
25 // [[[cog:
26 // FIELD_NAMES = [
27 // "magic",
28 // "len",
29 // "incompat_flags",
30 // "compat_flags",
31 // "seq",
32 // "sysid",
33 // "compid",
34 // "msgid",
35 // "checksum",
36 // ]
37 // ]]]
38 // [[[end]]] (checksum: d41d8cd98f00b204e9800998ecf8427e)
39 
40 // NOTE(vooon): Ignore impossible warning as
41 // memcpy() should work with unaligned pointers without any trouble.
42 //
43 // warning: taking address of packed member of ‘mavlink::__mavlink_message’ may result in an unaligned pointer value
44 #pragma GCC diagnostic push
45 #pragma GCC diagnostic ignored "-Waddress-of-packed-member"
46 
57 inline bool convert(const mavros_msgs::Mavlink &rmsg, mavlink_message_t &mmsg)
58 {
59  if (rmsg.payload64.size() > sizeof(mmsg.payload64) / sizeof(mmsg.payload64[0])) {
60  return false;
61  }
62 
63  if (!rmsg.signature.empty() && rmsg.signature.size() != sizeof(mmsg.signature)) {
64  return false;
65  }
66 
67  // [[[cog:
68  // for f in FIELD_NAMES:
69  // cog.outl("mmsg.%s = rmsg.%s;" % (f, f))
70  // ]]]
71  mmsg.magic = rmsg.magic;
72  mmsg.len = rmsg.len;
73  mmsg.incompat_flags = rmsg.incompat_flags;
74  mmsg.compat_flags = rmsg.compat_flags;
75  mmsg.seq = rmsg.seq;
76  mmsg.sysid = rmsg.sysid;
77  mmsg.compid = rmsg.compid;
78  mmsg.msgid = rmsg.msgid;
79  mmsg.checksum = rmsg.checksum;
80  // [[[end]]] (checksum: 2ef42a7798f261bfd367bf4157b11ec0)
81  std::copy(rmsg.payload64.begin(), rmsg.payload64.end(), mmsg.payload64);
82  std::copy(rmsg.signature.begin(), rmsg.signature.end(), mmsg.signature);
83 
84  return true;
85 }
86 
95 inline bool convert(const mavlink_message_t &mmsg, mavros_msgs::Mavlink &rmsg, uint8_t framing_status = mavros_msgs::Mavlink::FRAMING_OK)
96 {
97  const size_t payload64_len = (mmsg.len + 7) / 8;
98 
99  rmsg.framing_status = framing_status;
100 
101  // [[[cog:
102  // for f in FIELD_NAMES:
103  // cog.outl("rmsg.%s = mmsg.%s;" % (f, f))
104  // ]]]
105  rmsg.magic = mmsg.magic;
106  rmsg.len = mmsg.len;
107  rmsg.incompat_flags = mmsg.incompat_flags;
108  rmsg.compat_flags = mmsg.compat_flags;
109  rmsg.seq = mmsg.seq;
110  rmsg.sysid = mmsg.sysid;
111  rmsg.compid = mmsg.compid;
112  rmsg.msgid = mmsg.msgid;
113  rmsg.checksum = mmsg.checksum;
114  // [[[end]]] (checksum: 4f0a50d2fcd7eb8823aea3e0806cd698)
115  rmsg.payload64 = mavros_msgs::Mavlink::_payload64_type(mmsg.payload64, mmsg.payload64 + payload64_len);
116 
117  // copy signature block only if message is signed
118  if (mmsg.incompat_flags & MAVLINK_IFLAG_SIGNED)
119  rmsg.signature = mavros_msgs::Mavlink::_signature_type(mmsg.signature, mmsg.signature + sizeof(mmsg.signature));
120  else
121  rmsg.signature.clear();
122 
123  return true;
124 }
125 
126 #pragma GCC diagnostic pop
127 
128 } // namespace mavlink
129 } // namespace mavros_msgs


mavros_msgs
Author(s): Vladimir Ermakov
autogenerated on Tue Jun 13 2023 02:17:47