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

Commit752e936

Browse files
committed
CanFdFrame forces the FDF flag on
1 parentd2a243a commit752e936

File tree

5 files changed

+53
-14
lines changed

5 files changed

+53
-14
lines changed

‎CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The change log for the Rust [socketcan](https://crates.io/crates/socketcan) libr
66
##Unreleased features
77

88
- Added FdFlags::FDF bit mask for CANFD_FDF
9+
- The FDF flag is forced on when creating a CanFdFrame.
910
- Updates to dump module:
1011
- Re-implemented with text parsing
1112
- Parses FdFlags field properly

‎Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name ="socketcan"
3-
version ="3.4.1-pre.0"
3+
version ="3.5.0-pre.0"
44
edition ="2021"
55
rust-version ="1.70"
66
authors = [

‎src/dump.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ mod test {
393393
assert!(!frame.is_extended());
394394
assert!(!frame.is_brs());
395395
assert!(!frame.is_esi());
396-
assert_eq!(0, frame.flags().bits());
396+
assert_eq!(0x04, frame.flags().bits());
397397
assert_eq!(frame.dlc(),0);
398398
assert_eq!(frame.len(),0);
399399
assert_eq!(frame.data().len(),0);
@@ -412,7 +412,7 @@ mod test {
412412
assert!(!frame.is_extended());
413413
assert!(frame.is_brs());
414414
assert!(!frame.is_esi());
415-
assert_eq!(1, frame.flags().bits());
415+
assert_eq!(0x05, frame.flags().bits());
416416
assert_eq!(frame.dlc(),1);
417417
assert_eq!(frame.len(),1);
418418
assert_eq!(frame.data().len(),1);

‎src/frame.rs

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use std::{
4242

4343
// TODO: Remove these on the next major ver update.
4444
pubusecrate::id::{
45-
id_from_raw, id_is_extended, id_to_canid_t,FdFlags,IdFlags,CANFD_BRS,CANFD_ESI,
45+
id_from_raw, id_is_extended, id_to_canid_t,FdFlags,IdFlags,CANFD_BRS,CANFD_ESI,CANFD_FDF,
4646
CANFD_MAX_DLEN,CAN_EFF_FLAG,CAN_EFF_MASK,CAN_ERR_FLAG,CAN_ERR_MASK,CAN_MAX_DLEN,
4747
CAN_RTR_FLAG,CAN_SFF_MASK,ERR_MASK_ALL,ERR_MASK_NONE,
4848
};
@@ -1014,7 +1014,7 @@ impl EmbeddedFrame for CanErrorFrame {
10141014
}
10151015

10161016
/// A slice into the actual data.
1017-
/// An error frame can alwaysacess the full 8-byte data payload.
1017+
/// An error frame can alwaysaccess the full 8-byte data payload.
10181018
fndata(&self) ->&[u8]{
10191019
&self.0.data[..]
10201020
}
@@ -1119,6 +1119,9 @@ const VALID_EXT_DLENGTHS: [usize; 7] = [12, 16, 20, 24, 32, 48, 64];
11191119
/// Payload data that is greater than 8 bytes and whose data length does
11201120
/// not match a valid CANFD data length is padded with 0 bytes to the
11211121
/// next higher valid CANFD data length.
1122+
///
1123+
/// Note:
1124+
/// - The FDF flag is forced on when created.
11221125
#[derive(Clone,Copy)]
11231126
pubstructCanFdFrame(canfd_frame);
11241127

@@ -1139,7 +1142,7 @@ impl CanFdFrame {
11391142
nif n <=CANFD_MAX_DLEN =>{
11401143
letmut frame =canfd_frame_default();
11411144
frame.can_id = can_id;
1142-
frame.flags = fd_flags.bits();
1145+
frame.flags =(fd_flags |FdFlags::FDF).bits();
11431146
frame.data[..n].copy_from_slice(data);
11441147
frame.len =Self::next_valid_ext_dlen(n)asu8;
11451148
Ok(Self(frame))
@@ -1270,7 +1273,7 @@ impl EmbeddedFrame for CanFdFrame {
12701273

12711274
/// A slice into the actual data.
12721275
///
1273-
///For normal CAN frames the slice will always be <= 8 bytes in length.
1276+
///This should only be one of the valid CAN FD data lengths.
12741277
fndata(&self) ->&[u8]{
12751278
&self.0.data[..(self.0.lenasusize)]
12761279
}
@@ -1310,7 +1313,9 @@ impl Frame for CanFdFrame {
13101313
implDefaultforCanFdFrame{
13111314
/// The default FD frame has all fields and data set to zero, and all flags off.
13121315
fndefault() ->Self{
1313-
Self(canfd_frame_default())
1316+
letmut frame =canfd_frame_default();
1317+
frame.flags |=CANFD_FDFasu8;
1318+
Self(frame)
13141319
}
13151320
}
13161321

@@ -1337,14 +1342,16 @@ impl From<CanDataFrame> for CanFdFrame {
13371342

13381343
letmut fdframe =canfd_frame_default();
13391344
fdframe.can_id = frame.id_word();
1345+
fdframe.flags =CANFD_FDFasu8;
13401346
fdframe.len = nasu8;
13411347
fdframe.data[..n].copy_from_slice(&frame.data()[..n]);
13421348
Self(fdframe)
13431349
}
13441350
}
13451351

13461352
implFrom<canfd_frame>forCanFdFrame{
1347-
fnfrom(frame:canfd_frame) ->Self{
1353+
fnfrom(mutframe:canfd_frame) ->Self{
1354+
frame.flags |=CANFD_FDFasu8;
13481355
Self(frame)
13491356
}
13501357
}
@@ -1685,15 +1692,42 @@ mod tests {
16851692
}
16861693

16871694
#[test]
1688-
fntest_frame_to_fd(){
1689-
let frame =CanDataFrame::new(STD_ID,DATA).unwrap();
1695+
fntest_to_fd_frame(){
1696+
let data_frame =CanDataFrame::new(STD_ID,DATA).unwrap();
1697+
1698+
let frame =CanFdFrame::from(data_frame);
16901699

1691-
let frame =CanFdFrame::from(frame);
16921700
assert_eq!(STD_ID, frame.id());
16931701
assert!(frame.is_standard());
16941702
assert!(frame.is_data_frame());
16951703
assert!(!frame.is_remote_frame());
16961704
assert!(!frame.is_error_frame());
1697-
assert_eq!(DATA, frame.data());
1705+
assert!(frame.flags().contains(FdFlags::FDF));
1706+
assert_eq!(frame.len(),DATA_LEN);
1707+
assert_eq!(frame.data().len(),DATA_LEN);
1708+
assert_eq!(frame.data(),DATA);
1709+
1710+
let fdframe =canfd_frame_default();
1711+
let frame =CanFdFrame::from(fdframe);
1712+
assert!(frame.flags().contains(FdFlags::FDF));
1713+
}
1714+
1715+
#[test]
1716+
fntest_fd_to_data_frame(){
1717+
let fdframe =CanFdFrame::new(STD_ID,DATA).unwrap();
1718+
assert!(fdframe.flags().contains(FdFlags::FDF));
1719+
1720+
let frame =CanDataFrame::try_from(fdframe).unwrap();
1721+
1722+
assert_eq!(STD_ID, frame.id());
1723+
assert_eq!(frame.len(),DATA_LEN);
1724+
assert_eq!(frame.data().len(),DATA_LEN);
1725+
assert_eq!(frame.data(),DATA);
1726+
1727+
// Make sure FD flags turned off
1728+
letmut fdframe =canfd_frame_default();
1729+
crate::as_bytes_mut(&mut fdframe)[..size_of::<can_frame>()]
1730+
.clone_from_slice(crate::as_bytes(&frame.0));
1731+
assert_eq!(fdframe.flags,0);
16981732
}
16991733
}

‎src/id.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ pub use libc::{
2222
CAN_MAX_DLEN,CAN_RTR_FLAG,CAN_SFF_MASK,
2323
};
2424

25+
// TODO: This was sent upstream to libc 2024-12-27
26+
/// Mark CAN FD for dual use of struct canfd_frame
27+
pubconstCANFD_FDF: libc::c_int =0x04;
28+
2529
/// An error mask that will cause SocketCAN to report all errors
2630
pubconstERR_MASK_ALL:u32 =CAN_ERR_MASK;
2731

@@ -51,7 +55,7 @@ bitflags! {
5155
constESI =CANFD_ESIasu8;
5256
/// Mark CAN FD for dual use of struct canfd_frame
5357
/// Added in Linux kernel v5.14
54-
constFDF =0x04u8;// TODO: Sent upstream to libc 2024-12-27
58+
constFDF =CANFD_FDFasu8;
5559
}
5660
}
5761

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp