Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb05f4c4

Browse files
committed
Updated dump Regex for Remote frames
1 parent0d76d94 commitb05f4c4

File tree

2 files changed

+84
-19
lines changed

2 files changed

+84
-19
lines changed

‎src/dump.rs

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
2626
usecrate::{
2727
id::{FdFlags,IdFlags},
28-
CanAnyFrame,CanDataFrame,CanFdFrame,CanFrame,ConstructionError,
28+
CanAnyFrame,CanDataFrame,CanFdFrame,CanFrame,CanRemoteFrame,ConstructionError,
2929
};
3030
use embedded_can::StandardId;
3131
use hex::FromHex;
@@ -43,15 +43,15 @@ use std::{
4343
/// A CAN log reader.
4444
pubstructReader<R>{
4545
rdr:R,
46-
line_buf:Vec<u8>,
46+
line_buf:String,
4747
}
4848

4949
impl<R: io::Read>Reader<R>{
5050
/// Creates an I/O buffered reader from a CAN log reader.
5151
pubfnfrom_reader(rdr:R) ->Reader<BufReader<R>>{
5252
Reader{
5353
rdr:BufReader::new(rdr),
54-
line_buf:Vec::new(),
54+
line_buf:String::new(),
5555
}
5656
}
5757
}
@@ -112,7 +112,9 @@ impl From<ConstructionError> for ParseError {
112112
lazy_static!{
113113
// Matches a candump line
114114
static refRE_DUMP:Regex =Regex::new(
115-
r"\s*\((?P<t_num>[0-9]+)\.(?P<t_mant>[0-9]*)\)\s+(?P<iface>\w+)\s+(?P<can_id>[0-9A-Fa-f]+)(((?P<fd_sep>\#\#)(?P<fd_flags>[0-9A-Fa-f]))|(?P<sep>\#))(?P<data>[0-9A-Fa-f\s]*)"
115+
// r"\s*\((?P<t_num>[0-9]+)\.(?P<t_mant>[0-9]*)\)\s+(?P<iface>\w+)\s+(?P<can_id>[0-9A-Fa-f]+)(((?P<fd_sep>\#\#)(?P<fd_flags>[0-9A-Fa-f]))|(?P<sep>\#))(?P<data>[0-9A-Fa-f\s]*)"
116+
// r"\s*\((?P<t_num>[0-9]+)\.(?P<t_mant>[0-9]*)\)\s+(?P<iface>\w+)\s+(?P<can_id>[0-9A-Fa-f]+)(((?P<fd_sep>\#\#)(?P<fd_flags>[0-9A-Fa-f]))|(\#(?P<data>[0-9A-Fa-f]*))|(\#R(?P<rlen>[0-9]*)))"
117+
r"\s*\((?P<t_num>[0-9]+)\.(?P<t_mant>[0-9]*)\)\s+(?P<iface>\w+)\s+(?P<can_id>[0-9A-Fa-f]+)\#(((?<remote>R)(?<rlen>[0-9]*))|(((?<fd_sep>\#)(?<fd_flags>[0-9A-Fa-f]))?(?<data>[0-9A-Fa-f]*)))"
116118
).unwrap();
117119
}
118120

@@ -125,17 +127,14 @@ impl<R: BufRead> Reader<R> {
125127
/// Advance state, returning next record.
126128
pubfnnext_record(&mutself) ->Result<Option<CanDumpRecord>,ParseError>{
127129
self.line_buf.clear();
128-
letbytes_read =self.rdr.read_until(b'\n',&mutself.line_buf)?;
130+
letnbytes =self.rdr.read_line(&mutself.line_buf)?;
129131

130-
ifbytes_read ==0{
132+
ifnbytes ==0{
131133
returnOk(None);
132134
}
133135

134-
let line = str::from_utf8(&self.line_buf[..bytes_read])
135-
.map_err(|_|ParseError::InvalidCanFrame)?;
136-
137136
let caps =RE_DUMP
138-
.captures(line)
137+
.captures(&self.line_buf)
139138
.ok_or(ParseError::UnexpectedEndOfLine)?;
140139

141140
let t_num:u64 = caps
@@ -156,8 +155,6 @@ impl<R: BufRead> Reader<R> {
156155
//.map(String::from)
157156
.ok_or(ParseError::InvalidDeviceName)?;
158157

159-
let is_fd_frame = caps.name("fd_sep").is_some();
160-
161158
letmut can_id:canid_t = caps
162159
.name("can_id")
163160
.and_then(|m| canid_t::from_str_radix(m.as_str(),16).ok())
@@ -166,15 +163,18 @@ impl<R: BufRead> Reader<R> {
166163
let can_data = caps
167164
.name("data")
168165
.map(|m| m.as_str().trim())
169-
.ok_or(ParseError::InvalidCanFrame)?;
166+
//.ok_or(ParseError::InvalidCanFrame)?;
167+
.unwrap_or_default();
168+
169+
let is_remote_frame = caps.name("remote").is_some();
170+
let is_fd_frame = caps.name("fd_sep").is_some();
170171

171172
letmut id_flags =IdFlags::empty();
172-
id_flags.set(IdFlags::RTR,"R" == can_data);
173+
id_flags.set(IdFlags::RTR,is_remote_frame);
173174
id_flags.set(IdFlags::EFF, can_id >=StandardId::MAX.as_raw()ascanid_t);
174-
// TODO: How are error frames saved?
175175
can_id |= id_flags.bits();
176176

177-
let data =matchid_flags.contains(IdFlags::RTR){
177+
let data =matchis_remote_frame{
178178
true =>vec![],
179179
false =>Vec::from_hex(can_data).map_err(|_|ParseError::InvalidCanFrame)?,
180180
};
@@ -185,8 +185,15 @@ impl<R: BufRead> Reader<R> {
185185
.and_then(|m| u8::from_str_radix(m.as_str(),16).ok())
186186
.map(FdFlags::from_bits_truncate)
187187
.ok_or(ParseError::InvalidCanFrame)?;
188-
189188
CanFdFrame::init(can_id,&data, fd_flags).map(CanAnyFrame::Fd)
189+
}elseif is_remote_frame{
190+
let rlen = caps
191+
.name("rlen")
192+
.and_then(|m| m.as_str().parse::<usize>().ok())
193+
.unwrap_or_default();
194+
CanRemoteFrame::init(can_id, rlen)
195+
.map(CanFrame::Remote)
196+
.map(CanAnyFrame::from)
190197
}else{
191198
CanDataFrame::init(can_id,&data)
192199
.map(CanFrame::Data)
@@ -264,7 +271,7 @@ mod test {
264271
#[test]
265272
fntest_extended_example(){
266273
let input:&[u8] =b"(1469439874.299591) can1 080080#\n\
267-
(1469439874.299654) can1 053701#7F";
274+
(1469439874.299654) can1 053701#00112233";
268275

269276
letmut reader =Reader::from_reader(input);
270277

@@ -278,6 +285,7 @@ mod test {
278285
assert_eq!(frame.is_remote_frame(),false);
279286
assert_eq!(frame.is_error_frame(),false);
280287
assert_eq!(frame.is_extended(),true);
288+
assert_eq!(frame.data().len(),0);
281289
assert_eq!(frame.data(),&[]);
282290
}else{
283291
panic!("Expected Normal frame, got FD");
@@ -292,14 +300,57 @@ mod test {
292300
assert_eq!(frame.is_remote_frame(),false);
293301
assert_eq!(frame.is_error_frame(),false);
294302
assert_eq!(frame.is_extended(),true);
295-
assert_eq!(frame.data(),&[0x7F]);
303+
assert_eq!(frame.data().len(),4);
304+
assert_eq!(frame.data(),&[0x00,0x11,0x22,0x33]);
296305
}else{
297306
panic!("Expected Normal frame, got FD");
298307
}
299308

300309
assert!(reader.next_record().unwrap().is_none());
301310
}
302311

312+
#[test]
313+
fntest_remote(){
314+
let input:&[u8] =b"(1469439874.299591) can0 080080#R\n\
315+
(1469439874.299654) can0 053701#R4";
316+
317+
letmut reader =Reader::from_reader(input);
318+
319+
let rec1 = reader.next_record().unwrap().unwrap();
320+
321+
assert_eq!(rec1.t_us,1469439874299591);
322+
assert_eq!(rec1.device,"can0");
323+
324+
ifletCanAnyFrame::Remote(frame) = rec1.frame{
325+
assert_eq!(frame.raw_id(),0x080080);
326+
assert!(!frame.is_data_frame());
327+
assert!(frame.is_remote_frame());
328+
assert!(!frame.is_error_frame());
329+
assert!(frame.is_extended());
330+
assert_eq!(frame.len(),0);
331+
assert_eq!(frame.data(),&[]);
332+
}else{
333+
panic!("Expected Remote frame");
334+
}
335+
336+
let rec2 = reader.next_record().unwrap().unwrap();
337+
assert_eq!(rec2.t_us,1469439874299654);
338+
assert_eq!(rec2.device,"can0");
339+
340+
ifletCanAnyFrame::Remote(frame) = rec2.frame{
341+
assert_eq!(frame.raw_id(),0x053701);
342+
assert!(!frame.is_data_frame());
343+
assert!(frame.is_remote_frame());
344+
assert!(!frame.is_error_frame());
345+
assert!(frame.is_extended());
346+
assert_eq!(frame.len(),4);
347+
}else{
348+
panic!("Expected Remote frame");
349+
}
350+
351+
assert!(reader.next_record().unwrap().is_none());
352+
}
353+
303354
// Issue #74
304355
#[test]
305356
fntest_extended_id_fd(){

‎src/frame.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,20 @@ impl AsRef<can_frame> for CanDataFrame {
752752
pubstructCanRemoteFrame(can_frame);
753753

754754
implCanRemoteFrame{
755+
/// Initializes a CAN data frame from raw parts.
756+
#[allow(dead_code)]
757+
pub(crate)fninit(can_id:canid_t,len:usize) ->Result<Self,ConstructionError>{
758+
match len{
759+
nif n <=CAN_MAX_DLEN =>{
760+
letmut frame =can_frame_default();
761+
frame.can_id = can_id;
762+
frame.can_dlc = nasu8;
763+
Ok(Self(frame))
764+
}
765+
_ =>Err(ConstructionError::TooMuchData),
766+
}
767+
}
768+
755769
/// Sets the data length code for the frame
756770
pubfnset_dlc(&mutself,dlc:usize) ->Result<(),ConstructionError>{
757771
if dlc <=CAN_MAX_DLEN{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp