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

Commit9ecc402

Browse files
committed
- 'CanAnyFrame' implements 'From' trait for 'CanDataFrame', etc.
- 'CanFdSocket' implements 'TryFrom' trait for 'CanSocket'
1 parentb0a5fdb commit9ecc402

File tree

6 files changed

+145
-37
lines changed

6 files changed

+145
-37
lines changed

‎CHANGELOG.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ The change log for the Rust [socketcan](https://crates.io/crates/socketcan) libr
55

66
##Unreleased features
77

8+
-`CanAnyFrame` implements`From` trait for`CanDataFrame`,`CanRemoteFrame`, and`CanErrorFrame`.
9+
-`CanFdSocket` implementa`TryFrom` trait for`CanSocket`
810
- Added FdFlags::FDF bit mask for CANFD_FDF
911
- The FDF flag is forced on when creating a CanFdFrame.
1012
- Updates to dump module:
@@ -14,12 +16,15 @@ The change log for the Rust [socketcan](https://crates.io/crates/socketcan) libr
1416
- CANFD_FDF bit flag recognized on input
1517
- Fixed reading remote frames
1618
- Now reads remote length
17-
-`CanDumpRecord` removed lifetime, made`device` field an owned`String`, and is clonable.
19+
-`CanDumpRecord` changes:
20+
- Removed lifetime and made`device` field an owned`String`
21+
- Implmentd `Clone` and `Display` traits.
1822
- `dump::Reader` is now an Iterator itself
19-
-
23+
-Returns full `CanDumpRecord` items
2024
- New unit tests
2125
-[#59](https://github.com/socketcan-rs/socketcan-rs/issues/59) Embedded Hal for CanFdSocket
2226

27+
2328
##[Version 3.4.0](https://github.com/socketcan-rs/socketcan-rs/compare/v3.3.1..v3.4.0) (2024-12-26)
2429

2530
- Re-implemented CAN raw sockets using[socket2](https://crates.io/crates/socket2)

‎Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ futures = "0.3"
8080
name ="rcan"
8181
required-features = ["utils"]
8282

83+
[[example]]
84+
name ="playlog"
85+
required-features = ["dump"]
86+
8387
[[example]]
8488
name ="tokio_send"
8589
required-features = ["tokio"]

‎examples/playlog.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// socketcan/examples/replay_log.rs
2+
//
3+
// This file is part of the Rust 'socketcan-rs' library.
4+
//
5+
// Licensed under the MIT license:
6+
// <LICENSE or http://opensource.org/licenses/MIT>
7+
// This file may not be copied, modified, or distributed except according
8+
// to those terms.
9+
//
10+
// @author Frank Pagliughi <fpagliughi@mindspring.com>
11+
// @date Dec 28, 2024
12+
//
13+
//! Reads a `candump` log file and sends the frames out to the CANbus.
14+
//!
15+
//! This implementation requires a CAN FD interface to allow for all possible
16+
//!
17+
18+
use anyhow::{Context,Result};
19+
use clap::{arg,ArgAction,Command};
20+
use socketcan::{dump::Reader,CanAnyFrame,CanFdSocket,Socket};
21+
use std::process;
22+
23+
// Make the app version the same as the package.
24+
constVERSION:&str =env!("CARGO_PKG_VERSION");
25+
26+
// Open the interface, then iterate through the records in the file
27+
// sending them out to the bus.
28+
fnplay(filename:&str,iface:&str) ->Result<()>{
29+
let sock =CanFdSocket::open(iface)
30+
.with_context(||format!("Failed to open FD socket on interface '{}'", iface))?;
31+
32+
let reader =Reader::from_file(filename)
33+
.with_context(||format!("Error opening log file '{}'", filename))?;
34+
35+
for recin reader{
36+
let rec = rec?;
37+
println!("{}", rec);
38+
39+
useCanAnyFrame::*;
40+
match rec.frame{
41+
Normal(frame) => sock.write_frame(&frame)?,
42+
Remote(frame) => sock.write_frame(&frame)?,
43+
Fd(frame) => sock.write_frame(&frame)?,
44+
_ =>(),
45+
}
46+
}
47+
48+
Ok(())
49+
}
50+
51+
// --------------------------------------------------------------------------
52+
53+
fnmain(){
54+
let opts =Command::new("can")
55+
.author("Frank Pagliughi")
56+
.version(VERSION)
57+
.about("SocketCAN example to play a candump file")
58+
.disable_help_flag(true)
59+
.arg(
60+
arg!(--help"Print help information")
61+
.short('?')
62+
.action(ArgAction::Help)
63+
.global(true),
64+
)
65+
.arg(arg!(<iface>"The CAN interface to use, like 'can0', 'vcan0', etc").required(true))
66+
.arg(arg!(<file>"The candump log file to read").required(true))
67+
.get_matches();
68+
69+
let iface = opts.get_one::<String>("iface").unwrap();
70+
let filename = opts.get_one::<String>("file").unwrap();
71+
72+
ifletErr(err) =play(filename, iface){
73+
eprintln!("{}", err);
74+
process::exit(1);
75+
}
76+
}

‎src/dump.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,13 @@ impl fmt::Display for CanDumpRecord {
9393

9494
useCanAnyFrame::*;
9595
matchself.frame{
96+
Remote(frame)if frame.len() ==0 => f.write_str("#R"),
97+
Remote(frame) =>write!(f,"#R{}", frame.dlc()),
98+
Error(_frame) => f.write_str(""),
9699
Normal(frame) =>{
97100
letmut parts = frame.data().iter().map(|v|format!("{:02X}", v));
98101
write!(f,"#{}", parts.join(""))
99102
}
100-
Remote(frame)if frame.len() ==0 => f.write_str("#R"),
101-
Remote(frame) =>{
102-
write!(f,"#R{}", frame.dlc())
103-
}
104-
Error(_frame) => f.write_str(""),
105103
Fd(frame) =>{
106104
letmut parts = frame.data().iter().map(|v|format!("{:02X}", v));
107105
write!(f,"##{}", parts.join(""))
@@ -146,11 +144,6 @@ impl<R: BufRead> Reader<R> {
146144
CanDumpRecords{src:self}
147145
}
148146

149-
/// Returns an iterator over all records
150-
// pub fn iter(&mut self) -> CanDumpIter<R> {
151-
// CanDumpIter { src: self }
152-
// }
153-
154147
/// Advance state, returning next record.
155148
pubfnnext_record(&mutself) ->Result<Option<CanDumpRecord>,ParseError>{
156149
self.buf.clear();
@@ -175,7 +168,6 @@ impl<R: BufRead> Reader<R> {
175168

176169
let t_us =match ts.split_once('.'){
177170
Some((num, mant)) =>{
178-
// parse number and multiply
179171
let num = num
180172
.parse::<u64>()
181173
.map_err(|_|ParseError::InvalidTimestamp)?;

‎src/frame.rs

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,12 @@ impl EmbeddedFrame for CanAnyFrame {
319319

320320
impl fmt::UpperHexforCanAnyFrame{
321321
fnfmt(&self,f:&mut fmt::Formatter<'_>) -> fmt::Result{
322+
useCanAnyFrame::*;
322323
matchself{
323-
Self::Normal(frame) => frame.fmt(f),
324-
Self::Remote(frame) => frame.fmt(f),
325-
Self::Error(frame) => frame.fmt(f),
326-
Self::Fd(frame) => frame.fmt(f),
324+
Normal(frame) => frame.fmt(f),
325+
Remote(frame) => frame.fmt(f),
326+
Error(frame) => frame.fmt(f),
327+
Fd(frame) => frame.fmt(f),
327328
}
328329
}
329330
}
@@ -339,10 +340,21 @@ impl From<CanFrame> for CanAnyFrame {
339340
}
340341
}
341342

342-
implFrom<can_frame>forCanAnyFrame{
343-
fnfrom(frame:can_frame) ->Self{
344-
let frame =CanFrame::from(frame);
345-
frame.into()
343+
implFrom<CanDataFrame>forCanAnyFrame{
344+
fnfrom(frame:CanDataFrame) ->Self{
345+
Self::Normal(frame)
346+
}
347+
}
348+
349+
implFrom<CanRemoteFrame>forCanAnyFrame{
350+
fnfrom(frame:CanRemoteFrame) ->Self{
351+
Self::Remote(frame)
352+
}
353+
}
354+
355+
implFrom<CanErrorFrame>forCanAnyFrame{
356+
fnfrom(frame:CanErrorFrame) ->Self{
357+
Self::Error(frame)
346358
}
347359
}
348360

@@ -352,6 +364,13 @@ impl From<CanFdFrame> for CanAnyFrame {
352364
}
353365
}
354366

367+
implFrom<can_frame>forCanAnyFrame{
368+
fnfrom(frame:can_frame) ->Self{
369+
let frame =CanFrame::from(frame);
370+
frame.into()
371+
}
372+
}
373+
355374
implFrom<canfd_frame>forCanAnyFrame{
356375
fnfrom(frame:canfd_frame) ->Self{
357376
let frame =CanFdFrame::from(frame);
@@ -373,29 +392,32 @@ impl AsPtr for CanAnyFrame {
373392
typeInner =c_void;
374393

375394
fnas_ptr(&self) ->*constSelf::Inner{
395+
useCanAnyFrame::*;
376396
matchself{
377-
CanAnyFrame::Normal(frame) => frame.as_ptr()as*constSelf::Inner,
378-
CanAnyFrame::Remote(frame) => frame.as_ptr()as*constSelf::Inner,
379-
CanAnyFrame::Error(frame) => frame.as_ptr()as*constSelf::Inner,
380-
CanAnyFrame::Fd(frame) => frame.as_ptr()as*constSelf::Inner,
397+
Normal(frame) => frame.as_ptr()as*constSelf::Inner,
398+
Remote(frame) => frame.as_ptr()as*constSelf::Inner,
399+
Error(frame) => frame.as_ptr()as*constSelf::Inner,
400+
Fd(frame) => frame.as_ptr()as*constSelf::Inner,
381401
}
382402
}
383403

384404
fnas_mut_ptr(&mutself) ->*mutSelf::Inner{
405+
useCanAnyFrame::*;
385406
matchself{
386-
CanAnyFrame::Normal(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
387-
CanAnyFrame::Remote(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
388-
CanAnyFrame::Error(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
389-
CanAnyFrame::Fd(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
407+
Normal(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
408+
Remote(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
409+
Error(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
410+
Fd(frame) => frame.as_mut_ptr()as*mutSelf::Inner,
390411
}
391412
}
392413

393414
fnsize(&self) ->usize{
415+
useCanAnyFrame::*;
394416
matchself{
395-
CanAnyFrame::Normal(frame) => frame.size(),
396-
CanAnyFrame::Remote(frame) => frame.size(),
397-
CanAnyFrame::Error(frame) => frame.size(),
398-
CanAnyFrame::Fd(frame) => frame.size(),
417+
Normal(frame) => frame.size(),
418+
Remote(frame) => frame.size(),
419+
Error(frame) => frame.size(),
420+
Fd(frame) => frame.size(),
399421
}
400422
}
401423
}
@@ -826,11 +848,10 @@ impl TryFrom<CanFdFrame> for CanDataFrame {
826848
typeError =ConstructionError;
827849

828850
fntry_from(frame:CanFdFrame) ->Result<Self,Self::Error>{
829-
if frame.len() >CAN_MAX_DLEN{
830-
returnErr(ConstructionError::TooMuchData);
851+
match frame.len(){
852+
nif n >CAN_MAX_DLEN =>Err(ConstructionError::TooMuchData),
853+
n =>CanDataFrame::init(frame.id_word(),&frame.data()[..n]),
831854
}
832-
833-
CanDataFrame::init(frame.id_word(),&frame.data()[..(frame.0.lenasusize)])
834855
}
835856
}
836857

‎src/socket.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,16 @@ impl From<OwnedFd> for CanFdSocket {
807807
}
808808
}
809809

810+
implTryFrom<CanSocket>forCanFdSocket{
811+
typeError =IoError;
812+
813+
fntry_from(sock:CanSocket) -> std::result::Result<Self,Self::Error>{
814+
letCanSocket(sock2) = sock;
815+
let sock =CanFdSocket::set_fd_mode(sock2,true)?;
816+
Ok(CanFdSocket(sock))
817+
}
818+
}
819+
810820
implIntoRawFdforCanFdSocket{
811821
fninto_raw_fd(self) ->RawFd{
812822
self.0.into_raw_fd()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp