Skip to content

Commit f1dd325

Browse files
committed
mavlink-core: support for recv_raw in Connections
1 parent 137c77a commit f1dd325

File tree

7 files changed

+162
-7
lines changed

7 files changed

+162
-7
lines changed

mavlink-core/Cargo.toml

+15-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ embedded-io-async = { version = "0.6.1", optional = true }
2626
serde = { version = "1.0.115", optional = true, features = ["derive"] }
2727
serde_arrays = { version = "0.1.0", optional = true }
2828
serial = { version = "0.4", optional = true }
29-
tokio = { version = "1.0", default-features = false, features = ["io-util", "net", "sync", "fs"], optional = true }
29+
tokio = { version = "1.0", default-features = false, features = [
30+
"io-util",
31+
"net",
32+
"sync",
33+
"fs",
34+
], optional = true }
3035
sha2 = { version = "0.10", optional = true }
3136
async-trait = { version = "0.1.18", optional = true }
3237
tokio-serial = { version = "5.4.4", default-features = false, optional = true }
@@ -44,7 +49,14 @@ tokio-serial = { version = "5.4.4", default-features = false, optional = true }
4449
"serde" = ["dep:serde", "dep:serde_arrays"]
4550
"tokio-1" = ["dep:tokio", "dep:async-trait", "dep:tokio-serial"]
4651
"signing" = ["dep:sha2"]
47-
default = ["std", "tcp", "udp", "direct-serial", "serde"]
52+
default = ["std", "tcp", "udp", "direct-serial", "serde", "tokio-1"]
4853

4954
[dev-dependencies]
50-
tokio = { version = "1.0", default-features = false, features = ["io-util", "net", "sync", "fs", "macros", "rt"] }
55+
tokio = { version = "1.0", default-features = false, features = [
56+
"io-util",
57+
"net",
58+
"sync",
59+
"fs",
60+
"macros",
61+
"rt",
62+
] }

mavlink-core/src/async_connection/direct_serial.rs

+33-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ use std::io;
66
use tokio::sync::Mutex;
77
use tokio_serial::{SerialPort, SerialPortBuilderExt, SerialStream};
88

9-
use crate::{async_peek_reader::AsyncPeekReader, MavHeader, MavlinkVersion, Message};
9+
use crate::{
10+
async_peek_reader::AsyncPeekReader, read_v1_raw_message_async, read_v2_raw_message_async,
11+
read_v2_raw_message_async_signed, MAVLinkRawMessage, MAVLinkV2MessageRaw, MavHeader,
12+
MavlinkVersion, Message,
13+
};
1014

1115
#[cfg(not(feature = "signing"))]
1216
use crate::{read_versioned_msg_async, write_versioned_msg_async};
@@ -74,6 +78,34 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncSerialConnection {
7478
result
7579
}
7680

81+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
82+
let mut port = self.port.lock().await;
83+
#[cfg(not(feature = "signing"))]
84+
let result = match self.protocol_version {
85+
MavlinkVersion::V1 => {
86+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(port.deref_mut()).await?)
87+
}
88+
MavlinkVersion::V2 => {
89+
MAVLinkRawMessage::V2(read_v2_raw_message_async::<M, _>(port.deref_mut()).await?)
90+
}
91+
};
92+
#[cfg(feature = "signing")]
93+
let result = match self.protocol_version {
94+
MavlinkVersion::V1 => {
95+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(port.deref_mut()).await?)
96+
}
97+
MavlinkVersion::V2 => MAVLinkRawMessage::V2(
98+
read_v2_raw_message_async_signed::<M, _>(
99+
port.deref_mut(),
100+
self.signing_data.as_ref(),
101+
)
102+
.await?,
103+
),
104+
};
105+
106+
Ok(result)
107+
}
108+
77109
async fn send(
78110
&self,
79111
header: &MavHeader,

mavlink-core/src/async_connection/file.rs

+32
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ use super::AsyncMavConnection;
66
use crate::error::{MessageReadError, MessageWriteError};
77

88
use crate::{async_peek_reader::AsyncPeekReader, MavHeader, MavlinkVersion, Message};
9+
use crate::{
10+
read_v1_raw_message_async, read_v2_raw_message_async, read_v2_raw_message_async_signed,
11+
MAVLinkRawMessage, MAVLinkV2MessageRaw,
12+
};
913

1014
use tokio::fs::File;
1115
use tokio::io;
@@ -64,6 +68,34 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncFileConnection {
6468
}
6569
}
6670

71+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
72+
let mut file = self.file.lock().await;
73+
#[cfg(not(feature = "signing"))]
74+
let result = match self.protocol_version {
75+
MavlinkVersion::V1 => {
76+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(file.deref_mut()).await?)
77+
}
78+
MavlinkVersion::V2 => {
79+
MAVLinkRawMessage::V2(read_v2_raw_message_async::<M, _>(file.deref_mut()).await?)
80+
}
81+
};
82+
#[cfg(feature = "signing")]
83+
let result = match self.protocol_version {
84+
MavlinkVersion::V1 => {
85+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(file.deref_mut()).await?)
86+
}
87+
MavlinkVersion::V2 => MAVLinkRawMessage::V2(
88+
read_v2_raw_message_async_signed::<M, _>(
89+
file.deref_mut(),
90+
self.signing_data.as_ref(),
91+
)
92+
.await?,
93+
),
94+
};
95+
96+
Ok(result)
97+
}
98+
6799
async fn send(&self, _header: &MavHeader, _data: &M) -> Result<usize, MessageWriteError> {
68100
Ok(0)
69101
}

mavlink-core/src/async_connection/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use tokio::io;
22

3-
use crate::{MavFrame, MavHeader, MavlinkVersion, Message};
3+
use crate::{MAVLinkRawMessage, MAVLinkV2MessageRaw, MavFrame, MavHeader, MavlinkVersion, Message};
44

55
#[cfg(feature = "tcp")]
66
mod tcp;
@@ -24,6 +24,8 @@ pub trait AsyncMavConnection<M: Message + Sync + Send> {
2424
/// Yield until a valid frame is received, ignoring invalid messages.
2525
async fn recv(&self) -> Result<(MavHeader, M), crate::error::MessageReadError>;
2626

27+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError>;
28+
2729
/// Send a mavlink message
2830
async fn send(
2931
&self,

mavlink-core/src/async_connection/tcp.rs

+33-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
33
use super::{get_socket_addr, AsyncMavConnection};
44
use crate::async_peek_reader::AsyncPeekReader;
5-
use crate::{MavHeader, MavlinkVersion, Message};
5+
use crate::{
6+
read_v1_raw_message, read_v1_raw_message_async, read_v2_raw_message_async,
7+
read_v2_raw_message_async_signed, MAVLinkRawMessage, MAVLinkV2MessageRaw, MavHeader,
8+
MavlinkVersion, Message,
9+
};
610

711
use core::ops::DerefMut;
812
use tokio::io;
@@ -112,6 +116,34 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncTcpConnection {
112116
result
113117
}
114118

119+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
120+
let mut reader = self.reader.lock().await;
121+
#[cfg(not(feature = "signing"))]
122+
let result = match self.protocol_version {
123+
MavlinkVersion::V1 => {
124+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(reader.deref_mut()).await?)
125+
}
126+
MavlinkVersion::V2 => {
127+
MAVLinkRawMessage::V2(read_v2_raw_message_async::<M, _>(reader.deref_mut()).await?)
128+
}
129+
};
130+
#[cfg(feature = "signing")]
131+
let result = match self.protocol_version {
132+
MavlinkVersion::V1 => {
133+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(reader.deref_mut()).await?)
134+
}
135+
MavlinkVersion::V2 => MAVLinkRawMessage::V2(
136+
read_v2_raw_message_async_signed::<M, _>(
137+
reader.deref_mut(),
138+
self.signing_data.as_ref(),
139+
)
140+
.await?,
141+
),
142+
};
143+
144+
Ok(result)
145+
}
146+
115147
async fn send(
116148
&self,
117149
header: &MavHeader,

mavlink-core/src/async_connection/udp.rs

+39-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ use tokio::{
99
sync::Mutex,
1010
};
1111

12-
use crate::{async_peek_reader::AsyncPeekReader, MavHeader, MavlinkVersion, Message};
12+
use crate::{
13+
async_peek_reader::AsyncPeekReader, read_v1_raw_message_async, read_v2_raw_message_async,
14+
read_v2_raw_message_async_signed, MAVLinkRawMessage, MAVLinkV2MessageRaw, MavHeader,
15+
MavlinkVersion, Message,
16+
};
1317

1418
use super::{get_socket_addr, AsyncMavConnection};
1519

@@ -176,6 +180,40 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncUdpConnection {
176180
}
177181
}
178182

183+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
184+
let mut reader = self.reader.lock().await;
185+
loop {
186+
#[cfg(not(feature = "signing"))]
187+
let result = match self.protocol_version {
188+
MavlinkVersion::V1 => MAVLinkRawMessage::V1(
189+
read_v1_raw_message_async::<M, _>(reader.deref_mut()).await?,
190+
),
191+
MavlinkVersion::V2 => MAVLinkRawMessage::V2(
192+
read_v2_raw_message_async::<M, _>(reader.deref_mut()).await?,
193+
),
194+
};
195+
#[cfg(feature = "signing")]
196+
let result = match self.protocol_version {
197+
MavlinkVersion::V1 => MAVLinkRawMessage::V1(
198+
read_v1_raw_message_async::<M, _>(reader.deref_mut()).await?,
199+
),
200+
MavlinkVersion::V2 => MAVLinkRawMessage::V2(
201+
read_v2_raw_message_async_signed::<M, _>(
202+
reader.deref_mut(),
203+
self.signing_data.as_ref(),
204+
)
205+
.await?,
206+
),
207+
};
208+
if self.server {
209+
if let addr @ Some(_) = reader.reader_ref().last_recv_address {
210+
self.writer.lock().await.dest = addr;
211+
}
212+
}
213+
return Ok(result);
214+
}
215+
}
216+
179217
async fn send(
180218
&self,
181219
header: &MavHeader,

mavlink-core/src/lib.rs

+7
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,13 @@ pub enum MavlinkVersion {
127127
V2,
128128
}
129129

130+
/// MAVLink raw message types wrapper
131+
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
132+
pub enum MAVLinkRawMessage {
133+
V1(MAVLinkV1MessageRaw),
134+
V2(MAVLinkV2MessageRaw),
135+
}
136+
130137
/// Message framing marker for mavlink v1
131138
pub const MAV_STX: u8 = 0xFE;
132139

0 commit comments

Comments
 (0)