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

Commitaa092d2

Browse files
committed
Merge branch 1.7.0 w/ CAN FD support from#16
1 parentd882020 commitaa092d2

File tree

12 files changed

+1013
-221
lines changed

12 files changed

+1013
-221
lines changed

‎Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ vcan_tests = ["netlink"]
2222
utils = ["clap","anyhow"]
2323

2424
[dependencies]
25-
embedded-hal ="1.0.0-alpha.8"
25+
embedded-hal ="=1.0.0-alpha.8"
2626
nb ="1"
2727
byte_conv ="0.1.1"
2828
hex ="0.4"

‎examples/blocking.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
use anyhow::Context;
99
use clap::Parser;
1010

11-
use socketcan::{CanSocket,CanFrame};
12-
use embedded_hal::can::{blocking::Can,Frame,Id,StandardId};
11+
12+
use socketcan::{Frame,CanSocketasCanSocketT,CanNormalSocketasCanSocket,CanNormalFrameasCanFrame};
13+
use embedded_hal::can::{blocking::Can,FrameasEmbeddedFrame,Id,StandardId};
1314

1415

1516
#[derive(Parser)]

‎examples/echo.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
use anyhow::Context;
99
use clap::Parser;
1010

11-
use socketcan::{CanSocket,CanFrame};
12-
use embedded_hal::can::{blocking::Can,Frame,Id,StandardId};
11+
use socketcan::{Frame,CanSocketasCanSocketT,CanNormalSocketasCanSocket,CanNormalFrameasCanFrame};
12+
use embedded_hal::can::{blocking::Can,FrameasEmbeddedFrame,Id,StandardId};
1313

1414
use std::sync::atomic::{AtomicBool,Ordering};
1515
use std::sync::Arc;

‎examples/nonblocking.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
use anyhow::Context;
99
use clap::Parser;
1010

11-
use socketcan::{CanSocket,CanFrame};
12-
use embedded_hal::can::{nb::Can,Frame,Id,StandardId};
11+
use socketcan::{Frame,CanSocketasCanSocketT,CanNormalSocketasCanSocket,CanNormalFrameasCanFrame};
12+
use embedded_hal::can::{nb::Can,FrameasEmbeddedFrame,Id,StandardId};
1313
use nb::block;
1414

1515

‎src/constants.rs

Lines changed: 0 additions & 55 deletions
This file was deleted.

‎src/dump.rs

Lines changed: 109 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
1515
use std::{fs, io, path};
1616
use hex::FromHex;
17+
usecrate::{CanNormalFrame,CanFdFrame, frame::{CANFD_BRS,CANFD_ESI}};
1718

1819
// cannot be generic, because from_str_radix is not part of any Trait
1920
fnparse_raw(bytes:&[u8],radix:u32) ->Option<u64>{
@@ -55,7 +56,7 @@ pub struct CanDumpRecords<'a, R: 'a> {
5556
pubstructCanDumpRecord<'a>{
5657
pubt_us:u64,
5758
pubdevice:&'astr,
58-
pubframe:super::CanFrame,
59+
pubframe:super::CanAnyFrame,
5960
}
6061

6162
#[derive(Debug)]
@@ -126,16 +127,24 @@ impl<R: io::BufRead> Reader<R> {
126127
let device =::std::str::from_utf8(f).map_err(|_|ParseError::InvalidDeviceName)?;
127128

128129
// 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)?;
131131

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)?;
135134
let(can_id,mut can_data) = can_raw.split_at(sep_idx);
136135

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+
letmut fd_flags:u8 =0;
138+
let is_fd_frame =ifletSome(&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
139148
ifletSome(&b'\n') = can_data.last(){
140149
can_data =&can_data[..can_data.len() -1];
141150
};
@@ -147,16 +156,27 @@ impl<R: io::BufRead> Reader<R> {
147156
}else{
148157
Vec::from_hex(&can_data).map_err(|_|ParseError::InvalidCanFrame)?
149158
};
150-
let frame =super::CanFrame::init((parse_raw(can_id,16)
151-
.ok_or
152-
153-
154-
(ParseError::InvalidCanFrame))?
155-
asu32,
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)?asu32,
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)?asu32,
173+
&data,
174+
false,// TODO: is extended?
175+
rtr,
176+
false
177+
)
178+
.map(|frame|super::CanAnyFrame::Normal(frame))
179+
}?;
160180

161181
Ok(Some(CanDumpRecord{
162182
t_us,
@@ -167,7 +187,7 @@ impl<R: io::BufRead> Reader<R> {
167187
}
168188

169189
impl<'a,R: io::Read>IteratorforCanDumpRecords<'a, io::BufReader<R>>{
170-
typeItem =Result<(u64,super::CanFrame),ParseError>;
190+
typeItem =Result<(u64,super::CanAnyFrame),ParseError>;
171191

172192
fnnext(&mutself) ->Option<Self::Item>{
173193
// lift Option:
@@ -181,10 +201,9 @@ impl<'a, R: io::Read> Iterator for CanDumpRecords<'a, io::BufReader<R>> {
181201

182202
#[cfg(test)]
183203
mod test{
184-
usesuper::Reader;
185-
use embedded_hal::can::Frame;
186-
usecrate::util::hal_id_to_raw;
187-
204+
usesuper::*;
205+
usecrate::{Frame,CanAnyFrame,CanNormalFrameasCanFrame, util::hal_id_to_raw};
206+
use embedded_hal::can::FrameasEmbeddedFrame;
188207

189208
#[test]
190209
fntest_simple_example(){
@@ -198,26 +217,83 @@ mod test {
198217

199218
assert_eq!(rec1.t_us,1469439874299591);
200219
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+
ifletCanAnyFrame::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+
}
206231
}
207232

208233
{
209234
let rec2 = reader.next_record().unwrap().unwrap();
210235
assert_eq!(rec2.t_us,1469439874299654);
211236
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+
ifletCanAnyFrame::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+
}
217248
}
218249

219250
assert!(reader.next_record().unwrap().is_none());
220251
}
221252

253+
#[test]
254+
fntest_fd(){
255+
let input:&[u8] =b"(1469439874.299591) can1 080##0\n\
256+
(1469439874.299654) can1 701##17F";
222257

258+
letmut 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+
ifletCanAnyFrame::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+
ifletCanAnyFrame::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+
}
223299
}

‎src/err.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
11
// information from https://raw.githubusercontent.com/torvalds/linux/master/
22
// /include/uapi/linux/can/error.h
33

4-
usesuper::CanFrame;
5-
use embedded_hal::can::Frame;
4+
usecrate::Frame;
65
use std::{
76
convert::TryFrom,
87
error,
98
fmt,
109
io,
1110
};
1211

13-
1412
#[inline]
1513
/// Helper function to retrieve a specific byte of frame data or returning an
1614
/// `Err(..)` otherwise.
17-
fnget_data(frame:&CanFrame,idx:u8) ->Result<u8,CanErrorDecodingFailure>{
18-
Ok(*(frame.data()
19-
.get(idxasusize)
20-
.ok_or(CanErrorDecodingFailure::NotEnoughData(idx)))?)
15+
fnget_data(frame:&implFrame,idx:u8) ->Result<u8,CanErrorDecodingFailure>{
16+
Ok(*frame.data().get(idxasusize).ok_or(CanErrorDecodingFailure::NotEnoughData(idx))?)
2117
}
2218

2319

2420
/// Error decoding a CanError from a CanFrame.
2521
#[derive(Copy,Clone,Debug)]
2622
pubenumCanErrorDecodingFailure{
27-
/// The suppliedCanFrame did not have the error bit set.
23+
/// The suppliedCANFrame did not have the error bit set.
2824
NotAnError,
2925

3026
/// The error type is not known and cannot be decoded.
@@ -429,7 +425,7 @@ impl TryFrom<u8> for TransceiverError {
429425
}
430426

431427
implCanError{
432-
pubfnfrom_frame(frame:&CanFrame) ->Result<Self,CanErrorDecodingFailure>{
428+
pubfnfrom_frame(frame:&implFrame) ->Result<Self,CanErrorDecodingFailure>{
433429
if !frame.is_error(){
434430
returnErr(CanErrorDecodingFailure::NotAnError);
435431
}
@@ -462,7 +458,7 @@ pub trait ControllerSpecificErrorInformation {
462458
fnget_ctrl_err(&self) ->Option<&[u8]>;
463459
}
464460

465-
implControllerSpecificErrorInformationforCanFrame{
461+
impl<T:Frame>ControllerSpecificErrorInformationforT{
466462
#[inline]
467463
fnget_ctrl_err(&self) ->Option<&[u8]>{
468464
let data =self.data();
@@ -530,4 +526,3 @@ impl From<io::Error> for CanSocketOpenError {
530526
}
531527
}
532528

533-

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp