Skip to content

Commit b547752

Browse files
authored
Merge pull request #2610 from mavlink/pr-add-libmavlike
Integrate parts of libmav into MAVSDK and add MavlinkDirect plugin
2 parents 743ca7d + fefa769 commit b547752

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+9170
-21
lines changed

cmake/generate_embedded_xml.cmake

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# CMake script to embed MAVLink XML files as C++ string constants
2+
# Usage: cmake -DMINIMAL_XML_PATH=<path> -DSTANDARD_XML_PATH=<path> -DCOMMON_XML_PATH=<path> -DARDUPILOTMEGA_XML_PATH=<path> -DOUTPUT_HEADER=<path> -P generate_embedded_xml.cmake
3+
4+
if(NOT MINIMAL_XML_PATH)
5+
message(FATAL_ERROR "MINIMAL_XML_PATH must be specified")
6+
endif()
7+
8+
if(NOT STANDARD_XML_PATH)
9+
message(FATAL_ERROR "STANDARD_XML_PATH must be specified")
10+
endif()
11+
12+
if(NOT COMMON_XML_PATH)
13+
message(FATAL_ERROR "COMMON_XML_PATH must be specified")
14+
endif()
15+
16+
if(NOT ARDUPILOTMEGA_XML_PATH)
17+
message(FATAL_ERROR "ARDUPILOTMEGA_XML_PATH must be specified")
18+
endif()
19+
20+
if(NOT OUTPUT_HEADER)
21+
message(FATAL_ERROR "OUTPUT_HEADER must be specified")
22+
endif()
23+
24+
# Function to read and escape XML content
25+
function(read_and_escape_xml XML_PATH CONSTANT_NAME ESCAPED_VAR)
26+
if(NOT EXISTS "${XML_PATH}")
27+
message(FATAL_ERROR "XML file not found: ${XML_PATH}")
28+
endif()
29+
30+
file(READ "${XML_PATH}" XML_CONTENT)
31+
32+
# Escape the XML content for C++ string literal
33+
string(REPLACE "\\" "\\\\" XML_CONTENT "${XML_CONTENT}")
34+
string(REPLACE "\"" "\\\"" XML_CONTENT "${XML_CONTENT}")
35+
string(REPLACE "\n" "\\n\"\n \"" XML_CONTENT "${XML_CONTENT}")
36+
37+
set(${ESCAPED_VAR} " const char* ${CONSTANT_NAME} = \n \"${XML_CONTENT}\";" PARENT_SCOPE)
38+
endfunction()
39+
40+
# Read and escape all XML files
41+
read_and_escape_xml("${MINIMAL_XML_PATH}" "MINIMAL_XML" MINIMAL_XML_CONSTANT)
42+
read_and_escape_xml("${STANDARD_XML_PATH}" "STANDARD_XML" STANDARD_XML_CONSTANT)
43+
read_and_escape_xml("${COMMON_XML_PATH}" "COMMON_XML" COMMON_XML_CONSTANT)
44+
read_and_escape_xml("${ARDUPILOTMEGA_XML_PATH}" "ARDUPILOTMEGA_XML" ARDUPILOTMEGA_XML_CONSTANT)
45+
46+
# Generate the header file content
47+
set(HEADER_CONTENT
48+
"// This file is auto-generated by generate_embedded_xml.cmake
49+
// Do not edit manually
50+
51+
#pragma once
52+
53+
namespace mav_embedded {
54+
${MINIMAL_XML_CONSTANT}
55+
56+
${STANDARD_XML_CONSTANT}
57+
58+
${COMMON_XML_CONSTANT}
59+
60+
${ARDUPILOTMEGA_XML_CONSTANT}
61+
}
62+
")
63+
64+
# Write the header file
65+
file(WRITE "${OUTPUT_HEADER}" "${HEADER_CONTENT}")
66+
67+
message(STATUS "Generated embedded XML header: ${OUTPUT_HEADER}")
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
# mavsdk::MavlinkDirect Class Reference
2+
`#include: mavlink_direct.h`
3+
4+
----
5+
6+
7+
Enable direct MAVLink communication using libmav.
8+
9+
10+
## Data Structures
11+
12+
13+
struct [MavlinkMessage](structmavsdk_1_1_mavlink_direct_1_1_mavlink_message.md)
14+
15+
## Public Types
16+
17+
18+
Type | Description
19+
--- | ---
20+
enum [Result](#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864) | Possible results returned for action requests.
21+
std::function< void([Result](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864))> [ResultCallback](#classmavsdk_1_1_mavlink_direct_1ae166c4e87888a21c8e3a6a5858628cb4) | Callback type for asynchronous [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md) calls.
22+
std::function< void([MavlinkMessage](structmavsdk_1_1_mavlink_direct_1_1_mavlink_message.md))> [MessageCallback](#classmavsdk_1_1_mavlink_direct_1a20acd4068f45cbde53afc55eb292692d) | Callback type for subscribe_message.
23+
[Handle](classmavsdk_1_1_handle.md)< [MavlinkMessage](structmavsdk_1_1_mavlink_direct_1_1_mavlink_message.md) > [MessageHandle](#classmavsdk_1_1_mavlink_direct_1aa4a3a6b305c89ef6a0cde3cb47b5c6a3) | [Handle](classmavsdk_1_1_handle.md) type for subscribe_message.
24+
25+
## Public Member Functions
26+
27+
28+
Type | Name | Description
29+
---: | --- | ---
30+
&nbsp; | [MavlinkDirect](#classmavsdk_1_1_mavlink_direct_1aa52aa19602ee54074c6a9285ae7aae6c) ([System](classmavsdk_1_1_system.md) & system) | Constructor. Creates the plugin for a specific [System](classmavsdk_1_1_system.md).
31+
&nbsp; | [MavlinkDirect](#classmavsdk_1_1_mavlink_direct_1a4b968c477c05001538a84816ffe531fb) (std::shared_ptr< [System](classmavsdk_1_1_system.md) > system) | Constructor. Creates the plugin for a specific [System](classmavsdk_1_1_system.md).
32+
&nbsp; | [~MavlinkDirect](#classmavsdk_1_1_mavlink_direct_1a3cb749215b130d7e829b54cefdfe3b75) () override | Destructor (internal use only).
33+
&nbsp; | [MavlinkDirect](#classmavsdk_1_1_mavlink_direct_1a558285b9e08cfd038de9d5dc3b9111bb) (const [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md) & other) | Copy constructor.
34+
[Result](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864) | [send_message](#classmavsdk_1_1_mavlink_direct_1ac81f7a568b426575eb2d12116e5faeef) ([MavlinkMessage](structmavsdk_1_1_mavlink_direct_1_1_mavlink_message.md) message)const | Send a MAVLink message directly to the system.
35+
[MessageHandle](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1aa4a3a6b305c89ef6a0cde3cb47b5c6a3) | [subscribe_message](#classmavsdk_1_1_mavlink_direct_1a0fd42307f0b5e2ad427437c7a9309c9a) (std::string message_name, const [MessageCallback](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a20acd4068f45cbde53afc55eb292692d) & callback) | Subscribe to incoming MAVLink messages.
36+
void | [unsubscribe_message](#classmavsdk_1_1_mavlink_direct_1a2ae1167e995caf0b7b8a5193cf5dbf52) ([MessageHandle](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1aa4a3a6b305c89ef6a0cde3cb47b5c6a3) handle) | Unsubscribe from subscribe_message.
37+
[Result](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864) | [load_custom_xml](#classmavsdk_1_1_mavlink_direct_1a9deb1c72b084d1b2369a133c0260bd46) (std::string xml_content)const | Load custom MAVLink message definitions from XML.
38+
const [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md) & | [operator=](#classmavsdk_1_1_mavlink_direct_1a909f97b32d832d00488c695940760b63) (const [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md) &)=delete | Equality operator (object is not copyable).
39+
40+
41+
## Constructor & Destructor Documentation
42+
43+
44+
### MavlinkDirect() {#classmavsdk_1_1_mavlink_direct_1aa52aa19602ee54074c6a9285ae7aae6c}
45+
```cpp
46+
mavsdk::MavlinkDirect::MavlinkDirect(System &system)
47+
```
48+
49+
50+
Constructor. Creates the plugin for a specific [System](classmavsdk_1_1_system.md).
51+
52+
The plugin is typically created as shown below:
53+
54+
```cpp
55+
auto mavlink_direct = MavlinkDirect(system);
56+
```
57+
58+
**Parameters**
59+
60+
* [System](classmavsdk_1_1_system.md)& **system** - The specific system associated with this plugin.
61+
62+
### MavlinkDirect() {#classmavsdk_1_1_mavlink_direct_1a4b968c477c05001538a84816ffe531fb}
63+
```cpp
64+
mavsdk::MavlinkDirect::MavlinkDirect(std::shared_ptr< System > system)
65+
```
66+
67+
68+
Constructor. Creates the plugin for a specific [System](classmavsdk_1_1_system.md).
69+
70+
The plugin is typically created as shown below:
71+
72+
```cpp
73+
auto mavlink_direct = MavlinkDirect(system);
74+
```
75+
76+
**Parameters**
77+
78+
* std::shared_ptr< [System](classmavsdk_1_1_system.md) > **system** - The specific system associated with this plugin.
79+
80+
### ~MavlinkDirect() {#classmavsdk_1_1_mavlink_direct_1a3cb749215b130d7e829b54cefdfe3b75}
81+
```cpp
82+
mavsdk::MavlinkDirect::~MavlinkDirect() override
83+
```
84+
85+
86+
Destructor (internal use only).
87+
88+
89+
### MavlinkDirect() {#classmavsdk_1_1_mavlink_direct_1a558285b9e08cfd038de9d5dc3b9111bb}
90+
```cpp
91+
mavsdk::MavlinkDirect::MavlinkDirect(const MavlinkDirect &other)
92+
```
93+
94+
95+
Copy constructor.
96+
97+
98+
**Parameters**
99+
100+
* const [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md)& **other** -
101+
102+
## Member Typdef Documentation
103+
104+
105+
### typedef ResultCallback {#classmavsdk_1_1_mavlink_direct_1ae166c4e87888a21c8e3a6a5858628cb4}
106+
107+
```cpp
108+
using mavsdk::MavlinkDirect::ResultCallback = std::function<void(Result)>
109+
```
110+
111+
112+
Callback type for asynchronous [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md) calls.
113+
114+
115+
### typedef MessageCallback {#classmavsdk_1_1_mavlink_direct_1a20acd4068f45cbde53afc55eb292692d}
116+
117+
```cpp
118+
using mavsdk::MavlinkDirect::MessageCallback = std::function<void(MavlinkMessage)>
119+
```
120+
121+
122+
Callback type for subscribe_message.
123+
124+
125+
### typedef MessageHandle {#classmavsdk_1_1_mavlink_direct_1aa4a3a6b305c89ef6a0cde3cb47b5c6a3}
126+
127+
```cpp
128+
using mavsdk::MavlinkDirect::MessageHandle = Handle<MavlinkMessage>
129+
```
130+
131+
132+
[Handle](classmavsdk_1_1_handle.md) type for subscribe_message.
133+
134+
135+
## Member Enumeration Documentation
136+
137+
138+
### enum Result {#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864}
139+
140+
141+
Possible results returned for action requests.
142+
143+
144+
Value | Description
145+
--- | ---
146+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864a88183b946cc5f0e8c96b2e66e1c74a7e"></span> `Unknown` | Unknown result.
147+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864a505a83f220c02df2f85c3810cd9ceb38"></span> `Success` | Request succeeded.
148+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864a902b0d55fddef6f8d651fe1035b7d4bd"></span> `Error` | Error.
149+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864ad5e88abe375e264803a6f6b436e769e6"></span> `InvalidMessage` | Invalid MAVLink message.
150+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864a55f2db628c561fd08618598c69b3278d"></span> `InvalidField` | Invalid field name or value.
151+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864a094a6f6b0868122a9dd008cb91c083e4"></span> `ConnectionError` | Connection error.
152+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864a1119faf72ba0dfb23aeea644fed960ad"></span> `NoSystem` | No system connected.
153+
<span id="classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864ac85a251cc457840f1e032f1b733e9398"></span> `Timeout` | Request timed out.
154+
155+
## Member Function Documentation
156+
157+
158+
### send_message() {#classmavsdk_1_1_mavlink_direct_1ac81f7a568b426575eb2d12116e5faeef}
159+
```cpp
160+
Result mavsdk::MavlinkDirect::send_message(MavlinkMessage message) const
161+
```
162+
163+
164+
Send a MAVLink message directly to the system.
165+
166+
This allows sending any MAVLink message with full control over the message content.
167+
168+
169+
This function is blocking.
170+
171+
**Parameters**
172+
173+
* [MavlinkMessage](structmavsdk_1_1_mavlink_direct_1_1_mavlink_message.md) **message** -
174+
175+
**Returns**
176+
177+
&emsp;[Result](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864) - Result of request.
178+
179+
### subscribe_message() {#classmavsdk_1_1_mavlink_direct_1a0fd42307f0b5e2ad427437c7a9309c9a}
180+
```cpp
181+
MessageHandle mavsdk::MavlinkDirect::subscribe_message(std::string message_name, const MessageCallback &callback)
182+
```
183+
184+
185+
Subscribe to incoming MAVLink messages.
186+
187+
This provides direct access to incoming MAVLink messages. Use an empty string in message_name to subscribe to all messages, or specify a message name (e.g., "HEARTBEAT") to filter for specific message types.
188+
189+
**Parameters**
190+
191+
* std::string **message_name** -
192+
* const [MessageCallback](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a20acd4068f45cbde53afc55eb292692d)& **callback** -
193+
194+
**Returns**
195+
196+
&emsp;[MessageHandle](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1aa4a3a6b305c89ef6a0cde3cb47b5c6a3) -
197+
198+
### unsubscribe_message() {#classmavsdk_1_1_mavlink_direct_1a2ae1167e995caf0b7b8a5193cf5dbf52}
199+
```cpp
200+
void mavsdk::MavlinkDirect::unsubscribe_message(MessageHandle handle)
201+
```
202+
203+
204+
Unsubscribe from subscribe_message.
205+
206+
207+
**Parameters**
208+
209+
* [MessageHandle](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1aa4a3a6b305c89ef6a0cde3cb47b5c6a3) **handle** -
210+
211+
### load_custom_xml() {#classmavsdk_1_1_mavlink_direct_1a9deb1c72b084d1b2369a133c0260bd46}
212+
```cpp
213+
Result mavsdk::MavlinkDirect::load_custom_xml(std::string xml_content) const
214+
```
215+
216+
217+
Load custom MAVLink message definitions from XML.
218+
219+
This allows loading custom MAVLink message definitions at runtime, extending the available message types beyond the built-in definitions.
220+
221+
222+
This function is blocking.
223+
224+
**Parameters**
225+
226+
* std::string **xml_content** -
227+
228+
**Returns**
229+
230+
&emsp;[Result](classmavsdk_1_1_mavlink_direct.md#classmavsdk_1_1_mavlink_direct_1a63864e376328d1fe2ef7d667aa61f864) - Result of request.
231+
232+
### operator=() {#classmavsdk_1_1_mavlink_direct_1a909f97b32d832d00488c695940760b63}
233+
```cpp
234+
const MavlinkDirect & mavsdk::MavlinkDirect::operator=(const MavlinkDirect &)=delete
235+
```
236+
237+
238+
Equality operator (object is not copyable).
239+
240+
241+
**Parameters**
242+
243+
* const [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md)& -
244+
245+
**Returns**
246+
247+
&emsp;const [MavlinkDirect](classmavsdk_1_1_mavlink_direct.md) & -

docs/en/cpp/api_reference/namespacemavsdk.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Namespace for all mavsdk types.
3030
* [mavsdk::LogFiles](classmavsdk_1_1_log_files.md)
3131
* [mavsdk::LogStreaming](classmavsdk_1_1_log_streaming.md)
3232
* [mavsdk::ManualControl](classmavsdk_1_1_manual_control.md)
33+
* [mavsdk::MavlinkDirect](classmavsdk_1_1_mavlink_direct.md)
3334
* [mavsdk::MavlinkPassthrough](classmavsdk_1_1_mavlink_passthrough.md)
3435
* [mavsdk::Mavsdk](classmavsdk_1_1_mavsdk.md)
3536
* [mavsdk::Mission](classmavsdk_1_1_mission.md)

0 commit comments

Comments
 (0)