Skip to content

Commit 1b9a274

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

File tree

7 files changed

+114
-7
lines changed

7 files changed

+114
-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

+21-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ 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+
MAVLinkRawMessage, MAVLinkV2MessageRaw, MavHeader, MavlinkVersion, Message,
12+
};
1013

1114
#[cfg(not(feature = "signing"))]
1215
use crate::{read_versioned_msg_async, write_versioned_msg_async};
@@ -74,6 +77,23 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncSerialConnection {
7477
result
7578
}
7679

80+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
81+
let mut port = self.port.lock().await;
82+
#[cfg(not(feature = "signing"))]
83+
let result = match self.protocol_version {
84+
MavlinkVersion::V1 => {
85+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(port.deref_mut()).await?)
86+
}
87+
MavlinkVersion::V2 => {
88+
MAVLinkRawMessage::V2(read_v2_raw_message_async::<M, _>(port.deref_mut()).await?)
89+
}
90+
};
91+
#[cfg(feature = "signing")]
92+
let result = todo!();
93+
94+
Ok(result)
95+
}
96+
7797
async fn send(
7898
&self,
7999
header: &MavHeader,

mavlink-core/src/async_connection/file.rs

+20
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ 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, MAVLinkRawMessage, MAVLinkV2MessageRaw,
11+
};
912

1013
use tokio::fs::File;
1114
use tokio::io;
@@ -64,6 +67,23 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncFileConnection {
6467
}
6568
}
6669

70+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
71+
let mut file = self.file.lock().await;
72+
#[cfg(not(feature = "signing"))]
73+
let result = match self.protocol_version {
74+
MavlinkVersion::V1 => {
75+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(file.deref_mut()).await?)
76+
}
77+
MavlinkVersion::V2 => {
78+
MAVLinkRawMessage::V2(read_v2_raw_message_async::<M, _>(file.deref_mut()).await?)
79+
}
80+
};
81+
#[cfg(feature = "signing")]
82+
let result = todo!();
83+
84+
Ok(result)
85+
}
86+
6787
async fn send(&self, _header: &MavHeader, _data: &M) -> Result<usize, MessageWriteError> {
6888
Ok(0)
6989
}

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

+21-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
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, MAVLinkRawMessage,
7+
MAVLinkV2MessageRaw, MavHeader, MavlinkVersion, Message,
8+
};
69

710
use core::ops::DerefMut;
811
use tokio::io;
@@ -112,6 +115,23 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncTcpConnection {
112115
result
113116
}
114117

118+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
119+
let mut reader = self.reader.lock().await;
120+
#[cfg(not(feature = "signing"))]
121+
let result = match self.protocol_version {
122+
MavlinkVersion::V1 => {
123+
MAVLinkRawMessage::V1(read_v1_raw_message_async::<M, _>(reader.deref_mut()).await?)
124+
}
125+
MavlinkVersion::V2 => {
126+
MAVLinkRawMessage::V2(read_v2_raw_message_async::<M, _>(reader.deref_mut()).await?)
127+
}
128+
};
129+
#[cfg(feature = "signing")]
130+
let result = todo!();
131+
132+
Ok(result)
133+
}
134+
115135
async fn send(
116136
&self,
117137
header: &MavHeader,

mavlink-core/src/async_connection/udp.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ 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+
MAVLinkRawMessage, MAVLinkV2MessageRaw, MavHeader, MavlinkVersion, Message,
15+
};
1316

1417
use super::{get_socket_addr, AsyncMavConnection};
1518

@@ -176,6 +179,29 @@ impl<M: Message + Sync + Send> AsyncMavConnection<M> for AsyncUdpConnection {
176179
}
177180
}
178181

182+
async fn recv_raw(&self) -> Result<MAVLinkRawMessage, crate::error::MessageReadError> {
183+
let mut reader = self.reader.lock().await;
184+
loop {
185+
#[cfg(not(feature = "signing"))]
186+
let result = match self.protocol_version {
187+
MavlinkVersion::V1 => MAVLinkRawMessage::V1(
188+
read_v1_raw_message_async::<M, _>(reader.deref_mut()).await?,
189+
),
190+
MavlinkVersion::V2 => MAVLinkRawMessage::V2(
191+
read_v2_raw_message_async::<M, _>(reader.deref_mut()).await?,
192+
),
193+
};
194+
#[cfg(feature = "signing")]
195+
let result = todo!();
196+
if self.server {
197+
if let addr @ Some(_) = reader.reader_ref().last_recv_address {
198+
self.writer.lock().await.dest = addr;
199+
}
200+
}
201+
return Ok(result);
202+
}
203+
}
204+
179205
async fn send(
180206
&self,
181207
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)