2525
2626use crate :: {
2727 id:: { FdFlags , IdFlags } ,
28- CanDataFrame , CanFdFrame ,
28+ CanAnyFrame , CanDataFrame , CanFdFrame , CanFrame , ConstructionError ,
2929} ;
3030use embedded_can:: StandardId ;
3131use hex:: FromHex ;
3232use libc:: canid_t;
33- use std:: { fs, io, path} ;
33+ use std:: { fs, io, path, str } ;
3434
3535// cannot be generic, because from_str_radix is not part of any Trait
3636fn parse_raw ( bytes : & [ u8 ] , radix : u32 ) ->Option < u64 > {
37- :: std :: str:: from_utf8 ( bytes)
37+ str:: from_utf8 ( bytes)
3838. ok ( )
3939. and_then ( |s| u64:: from_str_radix ( s, radix) . ok ( ) )
4040}
@@ -80,7 +80,7 @@ pub struct CanDumpRecord<'a> {
8080/// The name of the device
8181pub device : & ' a str ,
8282/// The parsed frame
83- pub frame : super :: CanAnyFrame ,
83+ pub frame : CanAnyFrame ,
8484}
8585
8686#[ derive( Debug ) ]
@@ -97,7 +97,7 @@ pub enum ParseError {
9797/// Invalid CAN frame
9898InvalidCanFrame ,
9999/// Error creating the frame
100- ConstructionError ( super :: ConstructionError ) ,
100+ ConstructionError ( ConstructionError ) ,
101101}
102102
103103impl From < io:: Error > for ParseError {
@@ -106,8 +106,8 @@ impl From<io::Error> for ParseError {
106106}
107107}
108108
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 {
111111ParseError :: ConstructionError ( e)
112112}
113113}
@@ -155,7 +155,7 @@ impl<R: io::BufRead> Reader<R> {
155155let f = field_iter. next ( ) . ok_or ( ParseError :: UnexpectedEndOfLine ) ?;
156156
157157// 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 ) ?;
159159
160160// parse packet
161161let can_raw = field_iter. next ( ) . ok_or ( ParseError :: UnexpectedEndOfLine ) ?;
@@ -164,7 +164,7 @@ impl<R: io::BufRead> Reader<R> {
164164. iter ( )
165165. position ( |& c| c ==b'#' )
166166. 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) ;
168168
169169// determine frame type (FD or classical) and skip separator(s)
170170let mut fd_flags =FdFlags :: empty ( ) ;
@@ -186,32 +186,26 @@ impl<R: io::BufRead> Reader<R> {
186186 can_data =& can_data[ ..can_data. len ( ) -1 ] ;
187187} ;
188188
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 ) ;
191193// TODO: How are error frames saved?
194+ can_id |= id_flags. bits ( ) ;
192195
193- let data =if flags . contains ( IdFlags :: RTR ) {
194- Vec :: new ( )
196+ let data =if id_flags . contains ( IdFlags :: RTR ) {
197+ vec ! [ ]
195198} else {
196199Vec :: from_hex ( can_data) . map_err ( |_|ParseError :: InvalidCanFrame ) ?
197200} ;
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 )
205205} 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)
215209} ?;
216210
217211Ok ( Some ( CanDumpRecord {
@@ -223,7 +217,7 @@ impl<R: io::BufRead> Reader<R> {
223217}
224218
225219impl < R : io:: Read > Iterator for CanDumpRecords < ' _ , io:: BufReader < R > > {
226- type Item =Result < ( u64 , super :: CanAnyFrame ) , ParseError > ;
220+ type Item =Result < ( u64 , CanAnyFrame ) , ParseError > ;
227221
228222fn next ( & mut self ) ->Option < Self :: Item > {
229223// lift Option:
@@ -235,6 +229,8 @@ impl<R: io::Read> Iterator for CanDumpRecords<'_, io::BufReader<R>> {
235229}
236230}
237231
232+ /////////////////////////////////////////////////////////////////////////////
233+
238234#[ cfg( test) ]
239235mod test{
240236use super :: * ;
@@ -248,37 +244,33 @@ mod test {
248244
249245let mut reader =Reader :: from_reader ( input) ;
250246
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" ) ;
266260}
267261
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" ) ;
282274}
283275
284276assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;
@@ -291,82 +283,88 @@ mod test {
291283
292284let mut reader =Reader :: from_reader ( input) ;
293285
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" ) ;
309299}
310300
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" ) ;
325313}
326314
327315assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;
328316}
329317
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+
330332#[ test]
331333fn test_fd ( ) {
332334let input: & [ u8 ] =b"(1469439874.299591) can1 080##0\n \
333335 (1469439874.299654) can1 701##17F";
334336
335337let mut reader =Reader :: from_reader ( input) ;
336338
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" ) ;
353353}
354354
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" ) ;
370368}
371369
372370assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;