25
25
26
26
use crate :: {
27
27
id:: { FdFlags , IdFlags } ,
28
- CanDataFrame , CanFdFrame ,
28
+ CanAnyFrame , CanDataFrame , CanFdFrame , CanFrame , ConstructionError ,
29
29
} ;
30
30
use embedded_can:: StandardId ;
31
31
use hex:: FromHex ;
32
32
use libc:: canid_t;
33
- use std:: { fs, io, path} ;
33
+ use std:: { fs, io, path, str } ;
34
34
35
35
// cannot be generic, because from_str_radix is not part of any Trait
36
36
fn parse_raw ( bytes : & [ u8 ] , radix : u32 ) ->Option < u64 > {
37
- :: std :: str:: from_utf8 ( bytes)
37
+ str:: from_utf8 ( bytes)
38
38
. ok ( )
39
39
. and_then ( |s| u64:: from_str_radix ( s, radix) . ok ( ) )
40
40
}
@@ -80,7 +80,7 @@ pub struct CanDumpRecord<'a> {
80
80
/// The name of the device
81
81
pub device : & ' a str ,
82
82
/// The parsed frame
83
- pub frame : super :: CanAnyFrame ,
83
+ pub frame : CanAnyFrame ,
84
84
}
85
85
86
86
#[ derive( Debug ) ]
@@ -97,7 +97,7 @@ pub enum ParseError {
97
97
/// Invalid CAN frame
98
98
InvalidCanFrame ,
99
99
/// Error creating the frame
100
- ConstructionError ( super :: ConstructionError ) ,
100
+ ConstructionError ( ConstructionError ) ,
101
101
}
102
102
103
103
impl From < io:: Error > for ParseError {
@@ -106,8 +106,8 @@ impl From<io::Error> for ParseError {
106
106
}
107
107
}
108
108
109
- impl From < super :: ConstructionError > for ParseError {
110
- fn from ( e : super :: ConstructionError ) ->ParseError {
109
+ impl From < ConstructionError > for ParseError {
110
+ fn from ( e : ConstructionError ) ->ParseError {
111
111
ParseError :: ConstructionError ( e)
112
112
}
113
113
}
@@ -155,7 +155,7 @@ impl<R: io::BufRead> Reader<R> {
155
155
let f = field_iter. next ( ) . ok_or ( ParseError :: UnexpectedEndOfLine ) ?;
156
156
157
157
// device name
158
- let device =:: std :: str:: from_utf8 ( f) . map_err ( |_|ParseError :: InvalidDeviceName ) ?;
158
+ let device = str:: from_utf8 ( f) . map_err ( |_|ParseError :: InvalidDeviceName ) ?;
159
159
160
160
// parse packet
161
161
let can_raw = field_iter. next ( ) . ok_or ( ParseError :: UnexpectedEndOfLine ) ?;
@@ -164,7 +164,7 @@ impl<R: io::BufRead> Reader<R> {
164
164
. iter ( )
165
165
. position ( |& c| c ==b'#' )
166
166
. ok_or ( ParseError :: InvalidCanFrame ) ?;
167
- let ( can_id , mut can_data) = can_raw. split_at ( sep_idx) ;
167
+ let ( can_id_str , mut can_data) = can_raw. split_at ( sep_idx) ;
168
168
169
169
// determine frame type (FD or classical) and skip separator(s)
170
170
let mut fd_flags =FdFlags :: empty ( ) ;
@@ -186,32 +186,26 @@ impl<R: io::BufRead> Reader<R> {
186
186
can_data =& can_data[ ..can_data. len ( ) -1 ] ;
187
187
} ;
188
188
189
- let mut flags =IdFlags :: empty ( ) ;
190
- flags. set ( IdFlags :: RTR , b"R" == can_data) ;
189
+ let mut can_id =( parse_raw ( can_id_str, 16 ) . ok_or ( ParseError :: InvalidCanFrame ) ?) as canid_t ;
190
+ let mut id_flags =IdFlags :: empty ( ) ;
191
+ id_flags. set ( IdFlags :: RTR , b"R" == can_data) ;
192
+ id_flags. set ( IdFlags :: EFF , can_id >=StandardId :: MAX . as_raw ( ) as canid_t ) ;
191
193
// TODO: How are error frames saved?
194
+ can_id |= id_flags. bits ( ) ;
192
195
193
- let data =if flags . contains ( IdFlags :: RTR ) {
194
- Vec :: new ( )
196
+ let data =if id_flags . contains ( IdFlags :: RTR ) {
197
+ vec ! [ ]
195
198
} else {
196
199
Vec :: from_hex ( can_data) . map_err ( |_|ParseError :: InvalidCanFrame ) ?
197
200
} ;
198
- let frame: super :: CanAnyFrame =if is_fd_frame{
199
- CanFdFrame :: init (
200
- parse_raw ( can_id, 16 ) . ok_or ( ParseError :: InvalidCanFrame ) ?as canid_t | flags. bits ( ) ,
201
- & data,
202
- fd_flags,
203
- )
204
- . map ( super :: CanAnyFrame :: Fd )
201
+
202
+ let frame: CanAnyFrame =if is_fd_frame{
203
+ CanFdFrame :: init ( can_id, & data, fd_flags)
204
+ . map ( CanAnyFrame :: Fd )
205
205
} else {
206
- // TODO: Check for other frame types?
207
- // is extended?
208
- let can_id =parse_raw ( can_id, 16 ) . ok_or ( ParseError :: InvalidCanFrame ) ?;
209
- if can_id >=StandardId :: MAX . as_raw ( ) as u64 {
210
- flags. set ( IdFlags :: EFF , true ) ;
211
- }
212
- CanDataFrame :: init ( can_idas canid_t | flags. bits ( ) , & data)
213
- . map ( super :: CanFrame :: Data )
214
- . map ( |f| f. into ( ) )
206
+ CanDataFrame :: init ( can_id, & data)
207
+ . map ( CanFrame :: Data )
208
+ . map ( CanAnyFrame :: from)
215
209
} ?;
216
210
217
211
Ok ( Some ( CanDumpRecord {
@@ -223,7 +217,7 @@ impl<R: io::BufRead> Reader<R> {
223
217
}
224
218
225
219
impl < R : io:: Read > Iterator for CanDumpRecords < ' _ , io:: BufReader < R > > {
226
- type Item =Result < ( u64 , super :: CanAnyFrame ) , ParseError > ;
220
+ type Item =Result < ( u64 , CanAnyFrame ) , ParseError > ;
227
221
228
222
fn next ( & mut self ) ->Option < Self :: Item > {
229
223
// lift Option:
@@ -235,6 +229,8 @@ impl<R: io::Read> Iterator for CanDumpRecords<'_, io::BufReader<R>> {
235
229
}
236
230
}
237
231
232
+ /////////////////////////////////////////////////////////////////////////////
233
+
238
234
#[ cfg( test) ]
239
235
mod test{
240
236
use super :: * ;
@@ -248,37 +244,33 @@ mod test {
248
244
249
245
let mut reader =Reader :: from_reader ( input) ;
250
246
251
- {
252
- let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
253
-
254
- assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
255
- assert_eq ! ( rec1. device, "can1" ) ;
256
-
257
- if let CanAnyFrame :: Normal ( frame) = rec1. frame {
258
- assert_eq ! ( frame. raw_id( ) , 0x080 ) ;
259
- assert ! ( !frame. is_remote_frame( ) ) ;
260
- assert ! ( !frame. is_error_frame( ) ) ;
261
- assert ! ( !frame. is_extended( ) ) ;
262
- assert_eq ! ( frame. data( ) , & [ ] ) ;
263
- } else {
264
- panic ! ( "Expected Normal frame, got FD" ) ;
265
- }
247
+ let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
248
+
249
+ assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
250
+ assert_eq ! ( rec1. device, "can1" ) ;
251
+
252
+ if let CanAnyFrame :: Normal ( frame) = rec1. frame {
253
+ assert_eq ! ( frame. raw_id( ) , 0x080 ) ;
254
+ assert ! ( !frame. is_remote_frame( ) ) ;
255
+ assert ! ( !frame. is_error_frame( ) ) ;
256
+ assert ! ( !frame. is_extended( ) ) ;
257
+ assert_eq ! ( frame. data( ) , & [ ] ) ;
258
+ } else {
259
+ panic ! ( "Expected Normal frame, got FD" ) ;
266
260
}
267
261
268
- {
269
- let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
270
- assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
271
- assert_eq ! ( rec2. device, "can1" ) ;
272
-
273
- if let CanAnyFrame :: Normal ( frame) = rec2. frame {
274
- assert_eq ! ( frame. raw_id( ) , 0x701 ) ;
275
- assert ! ( !frame. is_remote_frame( ) ) ;
276
- assert ! ( !frame. is_error_frame( ) ) ;
277
- assert ! ( !frame. is_extended( ) ) ;
278
- assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
279
- } else {
280
- panic ! ( "Expected Normal frame, got FD" ) ;
281
- }
262
+ let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
263
+ assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
264
+ assert_eq ! ( rec2. device, "can1" ) ;
265
+
266
+ if let CanAnyFrame :: Normal ( frame) = rec2. frame {
267
+ assert_eq ! ( frame. raw_id( ) , 0x701 ) ;
268
+ assert ! ( !frame. is_remote_frame( ) ) ;
269
+ assert ! ( !frame. is_error_frame( ) ) ;
270
+ assert ! ( !frame. is_extended( ) ) ;
271
+ assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
272
+ } else {
273
+ panic ! ( "Expected Normal frame, got FD" ) ;
282
274
}
283
275
284
276
assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;
@@ -291,82 +283,88 @@ mod test {
291
283
292
284
let mut reader =Reader :: from_reader ( input) ;
293
285
294
- {
295
- let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
296
-
297
- assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
298
- assert_eq ! ( rec1. device, "can1" ) ;
299
-
300
- if let CanAnyFrame :: Normal ( frame) = rec1. frame {
301
- assert_eq ! ( frame. raw_id( ) , 0x080080 ) ;
302
- assert_eq ! ( frame. is_remote_frame( ) , false ) ;
303
- assert_eq ! ( frame. is_error_frame( ) , false ) ;
304
- assert_eq ! ( frame. is_extended( ) , true ) ;
305
- assert_eq ! ( frame. data( ) , & [ ] ) ;
306
- } else {
307
- panic ! ( "Expected Normal frame, got FD" ) ;
308
- }
286
+ let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
287
+
288
+ assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
289
+ assert_eq ! ( rec1. device, "can1" ) ;
290
+
291
+ if let CanAnyFrame :: Normal ( frame) = rec1. frame {
292
+ assert_eq ! ( frame. raw_id( ) , 0x080080 ) ;
293
+ assert_eq ! ( frame. is_remote_frame( ) , false ) ;
294
+ assert_eq ! ( frame. is_error_frame( ) , false ) ;
295
+ assert_eq ! ( frame. is_extended( ) , true ) ;
296
+ assert_eq ! ( frame. data( ) , & [ ] ) ;
297
+ } else {
298
+ panic ! ( "Expected Normal frame, got FD" ) ;
309
299
}
310
300
311
- {
312
- let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
313
- assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
314
- assert_eq ! ( rec2. device, "can1" ) ;
315
-
316
- if let CanAnyFrame :: Normal ( frame) = rec2. frame {
317
- assert_eq ! ( frame. raw_id( ) , 0x053701 ) ;
318
- assert_eq ! ( frame. is_remote_frame( ) , false ) ;
319
- assert_eq ! ( frame. is_error_frame( ) , false ) ;
320
- assert_eq ! ( frame. is_extended( ) , true ) ;
321
- assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
322
- } else {
323
- panic ! ( "Expected Normal frame, got FD" ) ;
324
- }
301
+ let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
302
+ assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
303
+ assert_eq ! ( rec2. device, "can1" ) ;
304
+
305
+ if let CanAnyFrame :: Normal ( frame) = rec2. frame {
306
+ assert_eq ! ( frame. raw_id( ) , 0x053701 ) ;
307
+ assert_eq ! ( frame. is_remote_frame( ) , false ) ;
308
+ assert_eq ! ( frame. is_error_frame( ) , false ) ;
309
+ assert_eq ! ( frame. is_extended( ) , true ) ;
310
+ assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
311
+ } else {
312
+ panic ! ( "Expected Normal frame, got FD" ) ;
325
313
}
326
314
327
315
assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;
328
316
}
329
317
318
+ // Issue #74
319
+ #[ test]
320
+ fn test_extended_id_fd ( ) {
321
+ let input: & [ u8 ] =
322
+ b"(1234.567890) can0 12345678##500112233445566778899AABBCCDDEEFF" ;
323
+
324
+ let mut reader =Reader :: from_reader ( input) ;
325
+ let rec = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
326
+ let frame =CanFdFrame :: try_from ( rec. frame ) . unwrap ( ) ;
327
+
328
+ assert ! ( frame. is_extended( ) ) ;
329
+ assert_eq ! ( 0x12345678 , frame. raw_id( ) ) ;
330
+ }
331
+
330
332
#[ test]
331
333
fn test_fd ( ) {
332
334
let input: & [ u8 ] =b"(1469439874.299591) can1 080##0\n \
333
335
(1469439874.299654) can1 701##17F";
334
336
335
337
let mut reader =Reader :: from_reader ( input) ;
336
338
337
- {
338
- let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
339
-
340
- assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
341
- assert_eq ! ( rec1. device, "can1" ) ;
342
- if let CanAnyFrame :: Fd ( frame) = rec1. frame {
343
- assert_eq ! ( frame. raw_id( ) , 0x080 ) ;
344
- assert ! ( !frame. is_remote_frame( ) ) ;
345
- assert ! ( !frame. is_error_frame( ) ) ;
346
- assert ! ( !frame. is_extended( ) ) ;
347
- assert ! ( !frame. is_brs( ) ) ;
348
- assert ! ( !frame. is_esi( ) ) ;
349
- assert_eq ! ( frame. data( ) , & [ ] ) ;
350
- } else {
351
- panic ! ( "Expected FD frame, got Normal" ) ;
352
- }
339
+ let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
340
+
341
+ assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
342
+ assert_eq ! ( rec1. device, "can1" ) ;
343
+ if let CanAnyFrame :: Fd ( frame) = rec1. frame {
344
+ assert_eq ! ( frame. raw_id( ) , 0x080 ) ;
345
+ assert ! ( !frame. is_remote_frame( ) ) ;
346
+ assert ! ( !frame. is_error_frame( ) ) ;
347
+ assert ! ( !frame. is_extended( ) ) ;
348
+ assert ! ( !frame. is_brs( ) ) ;
349
+ assert ! ( !frame. is_esi( ) ) ;
350
+ assert_eq ! ( frame. data( ) , & [ ] ) ;
351
+ } else {
352
+ panic ! ( "Expected FD frame, got Normal" ) ;
353
353
}
354
354
355
- {
356
- let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
357
- assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
358
- assert_eq ! ( rec2. device, "can1" ) ;
359
- if let CanAnyFrame :: Fd ( frame) = rec2. frame {
360
- assert_eq ! ( frame. raw_id( ) , 0x701 ) ;
361
- assert ! ( !frame. is_remote_frame( ) ) ;
362
- assert ! ( !frame. is_error_frame( ) ) ;
363
- assert ! ( !frame. is_extended( ) ) ;
364
- assert ! ( frame. is_brs( ) ) ;
365
- assert ! ( !frame. is_esi( ) ) ;
366
- assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
367
- } else {
368
- panic ! ( "Expected FD frame, got Normal" ) ;
369
- }
355
+ let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
356
+ assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
357
+ assert_eq ! ( rec2. device, "can1" ) ;
358
+ if let CanAnyFrame :: Fd ( frame) = rec2. frame {
359
+ assert_eq ! ( frame. raw_id( ) , 0x701 ) ;
360
+ assert ! ( !frame. is_remote_frame( ) ) ;
361
+ assert ! ( !frame. is_error_frame( ) ) ;
362
+ assert ! ( !frame. is_extended( ) ) ;
363
+ assert ! ( frame. is_brs( ) ) ;
364
+ assert ! ( !frame. is_esi( ) ) ;
365
+ assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
366
+ } else {
367
+ panic ! ( "Expected FD frame, got Normal" ) ;
370
368
}
371
369
372
370
assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;