Skip to content

Commit 12a811d

Browse files
qwerty19106patrickelectric
authored andcommitted
Add MessageData trait to allow serialize ***_DATA structs into MAVLinkV[1|2]MessageRaw
1 parent b81a2a0 commit 12a811d

File tree

4 files changed

+175
-115
lines changed

4 files changed

+175
-115
lines changed

build/parser.rs

Lines changed: 36 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl MavProfile {
6363
// it is a bitmask
6464
if dsp == "bitmask" {
6565
// find the corresponding enum
66-
for mut enm in self.enums.values_mut() {
66+
for enm in self.enums.values_mut() {
6767
if enm.name == *enum_name {
6868
// this is the right enum
6969
enm.bitfield = Some(field.mavtype.rust_primitive_type());
@@ -121,28 +121,6 @@ impl MavProfile {
121121
.collect()
122122
}
123123

124-
/// A list of message IDs
125-
fn emit_msg_ids(&self) -> Vec<TokenStream> {
126-
self.messages
127-
.values()
128-
.map(|msg| {
129-
let msg_id = msg.id;
130-
quote!(#msg_id)
131-
})
132-
.collect()
133-
}
134-
135-
/// CRC values needed for mavlink parsing
136-
fn emit_msg_crc(&self) -> Vec<TokenStream> {
137-
self.messages
138-
.values()
139-
.map(|msg| {
140-
let ec = extra_crc(msg);
141-
quote!(#ec)
142-
})
143-
.collect()
144-
}
145-
146124
fn emit_rust(&self) -> TokenStream {
147125
//TODO verify that id_width of u8 is OK even in mavlink v1
148126
let id_width = format_ident!("u32");
@@ -152,17 +130,15 @@ impl MavProfile {
152130
let enum_names = self.emit_enum_names();
153131
let struct_names = self.emit_struct_names();
154132
let enums = self.emit_enums();
155-
let msg_ids = self.emit_msg_ids();
156-
let msg_crc = self.emit_msg_crc();
157133

158134
let mav_message = self.emit_mav_message(&enum_names, &struct_names);
159-
let mav_message_parse = self.emit_mav_message_parse(&enum_names, &struct_names, &msg_ids);
160-
let mav_message_crc = self.emit_mav_message_crc(&id_width, &msg_ids, &msg_crc);
161-
let mav_message_name = self.emit_mav_message_name(&enum_names);
162-
let mav_message_id = self.emit_mav_message_id(&enum_names, &msg_ids);
163-
let mav_message_id_from_name = self.emit_mav_message_id_from_name(&enum_names, &msg_ids);
135+
let mav_message_parse = self.emit_mav_message_parse(&enum_names, &struct_names);
136+
let mav_message_crc = self.emit_mav_message_crc(&id_width, &struct_names);
137+
let mav_message_name = self.emit_mav_message_name(&enum_names, &struct_names);
138+
let mav_message_id = self.emit_mav_message_id(&enum_names, &struct_names);
139+
let mav_message_id_from_name = self.emit_mav_message_id_from_name(&struct_names);
164140
let mav_message_default_from_id =
165-
self.emit_mav_message_default_from_id(&enum_names, &msg_ids);
141+
self.emit_mav_message_default_from_id(&enum_names, &struct_names);
166142
let mav_message_serialize = self.emit_mav_message_serialize(&enum_names);
167143

168144
quote! {
@@ -179,7 +155,7 @@ impl MavProfile {
179155
#[allow(unused_imports)]
180156
use bitflags::bitflags;
181157

182-
use crate::{Message, error::*, bytes::Bytes, bytes_mut::BytesMut};
158+
use crate::{Message, MessageData, error::*, bytes::Bytes, bytes_mut::BytesMut};
183159

184160
#[cfg(feature = "serde")]
185161
use serde::{Serialize, Deserialize};
@@ -203,11 +179,7 @@ impl MavProfile {
203179
}
204180
}
205181

206-
fn emit_mav_message(
207-
&self,
208-
enums: &Vec<TokenStream>,
209-
structs: &Vec<TokenStream>,
210-
) -> TokenStream {
182+
fn emit_mav_message(&self, enums: &[TokenStream], structs: &[TokenStream]) -> TokenStream {
211183
quote! {
212184
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
213185
#[cfg_attr(feature = "serde", serde(tag = "type"))]
@@ -221,14 +193,13 @@ impl MavProfile {
221193
&self,
222194
enums: &[TokenStream],
223195
structs: &[TokenStream],
224-
ids: &[TokenStream],
225196
) -> TokenStream {
226197
let id_width = format_ident!("u32");
227198

228199
quote! {
229200
fn parse(version: MavlinkVersion, id: #id_width, payload: &[u8]) -> Result<Self, ParserError> {
230201
match id {
231-
#(#ids => #structs::deser(version, payload).map(Self::#enums),)*
202+
#(#structs::ID => #structs::deser(version, payload).map(Self::#enums),)*
232203
_ => {
233204
Err(ParserError::UnknownMessage { id })
234205
},
@@ -237,16 +208,11 @@ impl MavProfile {
237208
}
238209
}
239210

240-
fn emit_mav_message_crc(
241-
&self,
242-
id_width: &Ident,
243-
ids: &[TokenStream],
244-
crc: &[TokenStream],
245-
) -> TokenStream {
211+
fn emit_mav_message_crc(&self, id_width: &Ident, structs: &[TokenStream]) -> TokenStream {
246212
quote! {
247213
fn extra_crc(id: #id_width) -> u8 {
248214
match id {
249-
#(#ids => #crc,)*
215+
#(#structs::ID => #structs::EXTRA_CRC,)*
250216
_ => {
251217
0
252218
},
@@ -255,46 +221,32 @@ impl MavProfile {
255221
}
256222
}
257223

258-
fn emit_mav_message_name(&self, enums: &Vec<TokenStream>) -> TokenStream {
259-
let enum_names = enums.iter().map(|enum_name| {
260-
let name = enum_name.to_string();
261-
quote!(#name)
262-
});
263-
224+
fn emit_mav_message_name(&self, enums: &[TokenStream], structs: &[TokenStream]) -> TokenStream {
264225
quote! {
265226
fn message_name(&self) -> &'static str {
266227
match self {
267-
#(Self::#enums(..) => #enum_names,)*
228+
#(Self::#enums(..) => #structs::NAME,)*
268229
}
269230
}
270231
}
271232
}
272233

273-
fn emit_mav_message_id(&self, enums: &Vec<TokenStream>, ids: &Vec<TokenStream>) -> TokenStream {
234+
fn emit_mav_message_id(&self, enums: &[TokenStream], structs: &[TokenStream]) -> TokenStream {
274235
let id_width = format_ident!("u32");
275236
quote! {
276237
fn message_id(&self) -> #id_width {
277238
match self {
278-
#(Self::#enums(..) => #ids,)*
239+
#(Self::#enums(..) => #structs::ID,)*
279240
}
280241
}
281242
}
282243
}
283244

284-
fn emit_mav_message_id_from_name(
285-
&self,
286-
enums: &[TokenStream],
287-
ids: &[TokenStream],
288-
) -> TokenStream {
289-
let enum_names = enums.iter().map(|enum_name| {
290-
let name = enum_name.to_string();
291-
quote!(#name)
292-
});
293-
245+
fn emit_mav_message_id_from_name(&self, structs: &[TokenStream]) -> TokenStream {
294246
quote! {
295247
fn message_id_from_name(name: &str) -> Result<u32, &'static str> {
296248
match name {
297-
#(#enum_names => Ok(#ids),)*
249+
#(#structs::NAME => Ok(#structs::ID),)*
298250
_ => {
299251
Err("Invalid message name.")
300252
}
@@ -306,17 +258,12 @@ impl MavProfile {
306258
fn emit_mav_message_default_from_id(
307259
&self,
308260
enums: &[TokenStream],
309-
ids: &[TokenStream],
261+
structs: &[TokenStream],
310262
) -> TokenStream {
311-
let data_name = enums.iter().map(|enum_name| {
312-
let name = format_ident!("{}_DATA", enum_name.to_string());
313-
quote!(#name)
314-
});
315-
316263
quote! {
317264
fn default_message_from_id(id: u32) -> Result<Self, &'static str> {
318265
match id {
319-
#(#ids => Ok(Self::#enums(#data_name::default())),)*
266+
#(#structs::ID => Ok(Self::#enums(#structs::default())),)*
320267
_ => {
321268
Err("Invalid message id.")
322269
}
@@ -621,6 +568,9 @@ impl MavMessage {
621568

622569
fn emit_rust(&self) -> TokenStream {
623570
let msg_name = self.emit_struct_name();
571+
let id = self.id;
572+
let name = self.name.clone();
573+
let extra_crc = extra_crc(self);
624574
let (name_types, msg_encoded_len) = self.emit_name_types();
625575

626576
let deser_vars = self.emit_deserialize_vars();
@@ -645,17 +595,26 @@ impl MavMessage {
645595
impl #msg_name {
646596
pub const ENCODED_LEN: usize = #msg_encoded_len;
647597
#const_default
598+
}
599+
600+
#default_impl
648601

649-
pub fn deser(_version: MavlinkVersion, _input: &[u8]) -> Result<Self, ParserError> {
602+
impl MessageData for #msg_name {
603+
type Message = MavMessage;
604+
605+
const ID: u32 = #id;
606+
const NAME: &'static str = #name;
607+
const EXTRA_CRC: u8 = #extra_crc;
608+
const ENCODED_LEN: usize = #msg_encoded_len;
609+
610+
fn deser(_version: MavlinkVersion, _input: &[u8]) -> Result<Self, ParserError> {
650611
#deser_vars
651612
}
652613

653-
pub fn ser(&self, version: MavlinkVersion, bytes: &mut [u8]) -> usize {
614+
fn ser(&self, version: MavlinkVersion, bytes: &mut [u8]) -> usize {
654615
#serialize_vars
655616
}
656617
}
657-
658-
#default_impl
659618
}
660619
}
661620
}

0 commit comments

Comments
 (0)