@@ -63,7 +63,7 @@ impl MavProfile {
63
63
// it is a bitmask
64
64
if dsp == "bitmask" {
65
65
// find the corresponding enum
66
- for mut enm in self . enums . values_mut ( ) {
66
+ for enm in self . enums . values_mut ( ) {
67
67
if enm. name == * enum_name {
68
68
// this is the right enum
69
69
enm. bitfield = Some ( field. mavtype . rust_primitive_type ( ) ) ;
@@ -121,28 +121,6 @@ impl MavProfile {
121
121
. collect ( )
122
122
}
123
123
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
-
146
124
fn emit_rust ( & self ) -> TokenStream {
147
125
//TODO verify that id_width of u8 is OK even in mavlink v1
148
126
let id_width = format_ident ! ( "u32" ) ;
@@ -152,17 +130,15 @@ impl MavProfile {
152
130
let enum_names = self . emit_enum_names ( ) ;
153
131
let struct_names = self . emit_struct_names ( ) ;
154
132
let enums = self . emit_enums ( ) ;
155
- let msg_ids = self . emit_msg_ids ( ) ;
156
- let msg_crc = self . emit_msg_crc ( ) ;
157
133
158
134
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 ) ;
164
140
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 ) ;
166
142
let mav_message_serialize = self . emit_mav_message_serialize ( & enum_names) ;
167
143
168
144
quote ! {
@@ -179,7 +155,7 @@ impl MavProfile {
179
155
#[ allow( unused_imports) ]
180
156
use bitflags:: bitflags;
181
157
182
- use crate :: { Message , error:: * , bytes:: Bytes , bytes_mut:: BytesMut } ;
158
+ use crate :: { Message , MessageData , error:: * , bytes:: Bytes , bytes_mut:: BytesMut } ;
183
159
184
160
#[ cfg( feature = "serde" ) ]
185
161
use serde:: { Serialize , Deserialize } ;
@@ -203,11 +179,7 @@ impl MavProfile {
203
179
}
204
180
}
205
181
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 {
211
183
quote ! {
212
184
#[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
213
185
#[ cfg_attr( feature = "serde" , serde( tag = "type" ) ) ]
@@ -221,14 +193,13 @@ impl MavProfile {
221
193
& self ,
222
194
enums : & [ TokenStream ] ,
223
195
structs : & [ TokenStream ] ,
224
- ids : & [ TokenStream ] ,
225
196
) -> TokenStream {
226
197
let id_width = format_ident ! ( "u32" ) ;
227
198
228
199
quote ! {
229
200
fn parse( version: MavlinkVersion , id: #id_width, payload: & [ u8 ] ) -> Result <Self , ParserError > {
230
201
match id {
231
- #( #ids => #structs:: deser( version, payload) . map( Self :: #enums) , ) *
202
+ #( #structs :: ID => #structs:: deser( version, payload) . map( Self :: #enums) , ) *
232
203
_ => {
233
204
Err ( ParserError :: UnknownMessage { id } )
234
205
} ,
@@ -237,16 +208,11 @@ impl MavProfile {
237
208
}
238
209
}
239
210
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 {
246
212
quote ! {
247
213
fn extra_crc( id: #id_width) -> u8 {
248
214
match id {
249
- #( #ids => #crc , ) *
215
+ #( #structs :: ID => #structs :: EXTRA_CRC , ) *
250
216
_ => {
251
217
0
252
218
} ,
@@ -255,46 +221,32 @@ impl MavProfile {
255
221
}
256
222
}
257
223
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 {
264
225
quote ! {
265
226
fn message_name( & self ) -> & ' static str {
266
227
match self {
267
- #( Self :: #enums( ..) => #enum_names , ) *
228
+ #( Self :: #enums( ..) => #structs :: NAME , ) *
268
229
}
269
230
}
270
231
}
271
232
}
272
233
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 {
274
235
let id_width = format_ident ! ( "u32" ) ;
275
236
quote ! {
276
237
fn message_id( & self ) -> #id_width {
277
238
match self {
278
- #( Self :: #enums( ..) => #ids , ) *
239
+ #( Self :: #enums( ..) => #structs :: ID , ) *
279
240
}
280
241
}
281
242
}
282
243
}
283
244
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 {
294
246
quote ! {
295
247
fn message_id_from_name( name: & str ) -> Result <u32 , & ' static str > {
296
248
match name {
297
- #( #enum_names => Ok ( #ids ) , ) *
249
+ #( #structs :: NAME => Ok ( #structs :: ID ) , ) *
298
250
_ => {
299
251
Err ( "Invalid message name." )
300
252
}
@@ -306,17 +258,12 @@ impl MavProfile {
306
258
fn emit_mav_message_default_from_id (
307
259
& self ,
308
260
enums : & [ TokenStream ] ,
309
- ids : & [ TokenStream ] ,
261
+ structs : & [ TokenStream ] ,
310
262
) -> 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
-
316
263
quote ! {
317
264
fn default_message_from_id( id: u32 ) -> Result <Self , & ' static str > {
318
265
match id {
319
- #( #ids => Ok ( Self :: #enums( #data_name :: default ( ) ) ) , ) *
266
+ #( #structs :: ID => Ok ( Self :: #enums( #structs :: default ( ) ) ) , ) *
320
267
_ => {
321
268
Err ( "Invalid message id." )
322
269
}
@@ -621,6 +568,9 @@ impl MavMessage {
621
568
622
569
fn emit_rust ( & self ) -> TokenStream {
623
570
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 ) ;
624
574
let ( name_types, msg_encoded_len) = self . emit_name_types ( ) ;
625
575
626
576
let deser_vars = self . emit_deserialize_vars ( ) ;
@@ -645,17 +595,26 @@ impl MavMessage {
645
595
impl #msg_name {
646
596
pub const ENCODED_LEN : usize = #msg_encoded_len;
647
597
#const_default
598
+ }
599
+
600
+ #default_impl
648
601
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 > {
650
611
#deser_vars
651
612
}
652
613
653
- pub fn ser( & self , version: MavlinkVersion , bytes: & mut [ u8 ] ) -> usize {
614
+ fn ser( & self , version: MavlinkVersion , bytes: & mut [ u8 ] ) -> usize {
654
615
#serialize_vars
655
616
}
656
617
}
657
-
658
- #default_impl
659
618
}
660
619
}
661
620
}
0 commit comments