14
14
15
15
use std:: { fs, io, path} ;
16
16
use hex:: FromHex ;
17
+ use crate :: { CanNormalFrame , CanFdFrame , frame:: { CANFD_BRS , CANFD_ESI } } ;
17
18
18
19
// cannot be generic, because from_str_radix is not part of any Trait
19
20
fn parse_raw ( bytes : & [ u8 ] , radix : u32 ) ->Option < u64 > {
@@ -55,7 +56,7 @@ pub struct CanDumpRecords<'a, R: 'a> {
55
56
pub struct CanDumpRecord < ' a > {
56
57
pub t_us : u64 ,
57
58
pub device : & ' a str ,
58
- pub frame : super :: CanFrame ,
59
+ pub frame : super :: CanAnyFrame ,
59
60
}
60
61
61
62
#[ derive( Debug ) ]
@@ -126,16 +127,24 @@ impl<R: io::BufRead> Reader<R> {
126
127
let device =:: std:: str:: from_utf8 ( f) . map_err ( |_|ParseError :: InvalidDeviceName ) ?;
127
128
128
129
// parse packet
129
- let can_raw = field_iter. next ( )
130
- . ok_or ( ParseError :: UnexpectedEndOfLine ) ?;
130
+ let can_raw = field_iter. next ( ) . ok_or ( ParseError :: UnexpectedEndOfLine ) ?;
131
131
132
- let sep_idx = can_raw. iter ( )
133
- . position ( |& c| c ==b'#' )
134
- . ok_or ( ParseError :: InvalidCanFrame ) ?;
132
+ let sep_idx =
133
+ can_raw. iter ( ) . position ( |& c| c ==b'#' ) . ok_or ( ParseError :: InvalidCanFrame ) ?;
135
134
let ( can_id, mut can_data) = can_raw. split_at ( sep_idx) ;
136
135
137
- // cut of linefeed and skip seperator
138
- can_data =& can_data[ 1 ..] ;
136
+ // determine frame type (FD or classical) and skip separator(s)
137
+ let mut fd_flags: u8 =0 ;
138
+ let is_fd_frame =if let Some ( & b'#' ) = can_data. get ( 1 ) {
139
+ fd_flags = can_data[ 2 ] ;
140
+ can_data =& can_data[ 3 ..] ;
141
+ true
142
+ } else {
143
+ can_data =& can_data[ 1 ..] ;
144
+ false
145
+ } ;
146
+
147
+ // cut of linefeed
139
148
if let Some ( & b'\n' ) = can_data. last ( ) {
140
149
can_data =& can_data[ ..can_data. len ( ) -1 ] ;
141
150
} ;
@@ -147,16 +156,27 @@ impl<R: io::BufRead> Reader<R> {
147
156
} else {
148
157
Vec :: from_hex ( & can_data) . map_err ( |_|ParseError :: InvalidCanFrame ) ?
149
158
} ;
150
- let frame =super :: CanFrame :: init ( ( parse_raw ( can_id, 16 )
151
- . ok_or
152
-
153
-
154
- ( ParseError :: InvalidCanFrame ) ) ?
155
- as u32 ,
156
- & data,
157
- rtr,
158
- // FIXME: how are error frames saved?
159
- false ) ?;
159
+ let frame: super :: CanAnyFrame =if is_fd_frame{
160
+ CanFdFrame :: init (
161
+ parse_raw ( can_id, 16 ) . ok_or ( ParseError :: InvalidCanFrame ) ?as u32 ,
162
+ & data,
163
+ false , // TODO: is extended?
164
+ // FIXME: how are error frames saved?
165
+ false ,
166
+ fd_flags& CANFD_BRS ==CANFD_BRS ,
167
+ fd_flags& CANFD_ESI ==CANFD_ESI
168
+ )
169
+ . map ( |frame|super :: CanAnyFrame :: Fd ( frame) )
170
+ } else {
171
+ CanNormalFrame :: init (
172
+ parse_raw ( can_id, 16 ) . ok_or ( ParseError :: InvalidCanFrame ) ?as u32 ,
173
+ & data,
174
+ false , // TODO: is extended?
175
+ rtr,
176
+ false
177
+ )
178
+ . map ( |frame|super :: CanAnyFrame :: Normal ( frame) )
179
+ } ?;
160
180
161
181
Ok ( Some ( CanDumpRecord {
162
182
t_us,
@@ -167,7 +187,7 @@ impl<R: io::BufRead> Reader<R> {
167
187
}
168
188
169
189
impl < ' a , R : io:: Read > Iterator for CanDumpRecords < ' a , io:: BufReader < R > > {
170
- type Item =Result < ( u64 , super :: CanFrame ) , ParseError > ;
190
+ type Item =Result < ( u64 , super :: CanAnyFrame ) , ParseError > ;
171
191
172
192
fn next ( & mut self ) ->Option < Self :: Item > {
173
193
// lift Option:
@@ -181,10 +201,9 @@ impl<'a, R: io::Read> Iterator for CanDumpRecords<'a, io::BufReader<R>> {
181
201
182
202
#[ cfg( test) ]
183
203
mod test{
184
- use super :: Reader ;
185
- use embedded_hal:: can:: Frame ;
186
- use crate :: util:: hal_id_to_raw;
187
-
204
+ use super :: * ;
205
+ use crate :: { Frame , CanAnyFrame , CanNormalFrame as CanFrame , util:: hal_id_to_raw} ;
206
+ use embedded_hal:: can:: Frame as EmbeddedFrame ;
188
207
189
208
#[ test]
190
209
fn test_simple_example ( ) {
@@ -198,26 +217,83 @@ mod test {
198
217
199
218
assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
200
219
assert_eq ! ( rec1. device, "can1" ) ;
201
- assert_eq ! ( hal_id_to_raw( rec1. frame. id( ) ) , 0x080 ) ;
202
- assert_eq ! ( rec1. frame. is_remote_frame( ) , false ) ;
203
- assert_eq ! ( rec1. frame. is_error( ) , false ) ;
204
- assert_eq ! ( rec1. frame. is_extended( ) , false ) ;
205
- assert_eq ! ( rec1. frame. data( ) , & [ ] ) ;
220
+
221
+ if let CanAnyFrame :: Normal ( frame) = rec1. frame {
222
+ assert_eq ! ( hal_id_to_raw( rec1. frame. id( ) ) , 0x080 ) ;
223
+ assert_eq ! ( frame. is_rtr( ) , false ) ;
224
+ assert_eq ! ( frame. is_error( ) , false ) ;
225
+ assert_eq ! ( frame. is_extended( ) , false ) ;
226
+ assert_eq ! ( frame. data( ) , & [ ] ) ;
227
+ }
228
+ else {
229
+ panic ! ( "Expected Normal frame, got FD" ) ;
230
+ }
206
231
}
207
232
208
233
{
209
234
let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
210
235
assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
211
236
assert_eq ! ( rec2. device, "can1" ) ;
212
- assert_eq ! ( hal_id_to_raw( rec2. frame. id( ) ) , 0x701 ) ;
213
- assert_eq ! ( rec2. frame. is_remote_frame( ) , false ) ;
214
- assert_eq ! ( rec2. frame. is_error( ) , false ) ;
215
- assert_eq ! ( rec2. frame. is_extended( ) , false ) ;
216
- assert_eq ! ( rec2. frame. data( ) , & [ 0x7F ] ) ;
237
+
238
+ if let CanAnyFrame :: Normal ( frame) = rec2. frame {
239
+ assert_eq ! ( hal_id_to_raw( rec2. frame. id( ) ) , 0x701 ) ;
240
+ assert_eq ! ( frame. is_rtr( ) , false ) ;
241
+ assert_eq ! ( frame. is_error( ) , false ) ;
242
+ assert_eq ! ( frame. is_extended( ) , false ) ;
243
+ assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
244
+ }
245
+ else {
246
+ panic ! ( "Expected Normal frame, got FD" ) ;
247
+ }
217
248
}
218
249
219
250
assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;
220
251
}
221
252
253
+ #[ test]
254
+ fn test_fd ( ) {
255
+ let input: & [ u8 ] =b"(1469439874.299591) can1 080##0\n \
256
+ (1469439874.299654) can1 701##17F";
222
257
258
+ let mut reader =Reader :: from_reader ( input) ;
259
+
260
+ {
261
+ let rec1 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
262
+
263
+ assert_eq ! ( rec1. t_us, 1469439874299591 ) ;
264
+ assert_eq ! ( rec1. device, "can1" ) ;
265
+ if let CanAnyFrame :: Fd ( frame) = rec1. frame {
266
+ assert_eq ! ( frame. id( ) , 0x080 ) ;
267
+ assert_eq ! ( frame. is_remote_frame( ) , false ) ;
268
+ assert_eq ! ( frame. is_error( ) , false ) ;
269
+ assert_eq ! ( frame. is_extended( ) , false ) ;
270
+ assert_eq ! ( frame. is_brs( ) , false ) ;
271
+ assert_eq ! ( frame. is_esi( ) , false ) ;
272
+ assert_eq ! ( frame. data( ) , & [ ] ) ;
273
+ }
274
+ else {
275
+ panic ! ( "Expected FD frame, got Normal" ) ;
276
+ }
277
+ }
278
+
279
+ {
280
+ let rec2 = reader. next_record ( ) . unwrap ( ) . unwrap ( ) ;
281
+ assert_eq ! ( rec2. t_us, 1469439874299654 ) ;
282
+ assert_eq ! ( rec2. device, "can1" ) ;
283
+ if let CanAnyFrame :: Fd ( frame) = rec2. frame {
284
+ assert_eq ! ( frame. id( ) , 0x701 ) ;
285
+ assert_eq ! ( frame. is_remote_frame( ) , false ) ;
286
+ assert_eq ! ( frame. is_error( ) , false ) ;
287
+ assert_eq ! ( frame. is_extended( ) , false ) ;
288
+ assert_eq ! ( frame. is_brs( ) , true ) ;
289
+ assert_eq ! ( frame. is_esi( ) , false ) ;
290
+ assert_eq ! ( frame. data( ) , & [ 0x7F ] ) ;
291
+ }
292
+ else {
293
+ panic ! ( "Expected FD frame, got Normal" ) ;
294
+ }
295
+ }
296
+
297
+ assert ! ( reader. next_record( ) . unwrap( ) . is_none( ) ) ;
298
+ }
223
299
}