can-types

Crates.iocan-types
lib.rscan-types
version0.9.1
sourcesrc
created_at2024-06-23 19:02:10.179133
updated_at2024-07-17 14:05:34.863354
descriptionA library for encoding/decoding simple CAN bus data structures
homepagehttps://github.com/natkeo559/can-types
repositoryhttps://github.com/natkeo559/can-types
max_upload_size
id1281376
size99,081
(natkeo559)

documentation

https://docs.rs/can-types

README

A rust crate for encoding or decoding various Controller Area Network (CAN) data types, including the SAE J1939 standard.

Supported CAN Protocols

This crate provides decoding capabilities for Controller Area Network (CAN) protocols utilizing both 11-bit and 29-bit identifiers.

  • CAN 2.0 (Classical CAN): Commonly used in automotive applications and industrial automation.
  • SAE J1939: Commonly used in heavy-duty trucks and buses.

no_std Support

This crate supports no_std, meaning it can be used in resource-constrained environments like embedded systems and IoT devices, allowing for minimal memory usage without compromising functionality.

To enable no_std, use the --no-default-features flag:

$ cargo add can_types --no-default-features

no_std limitations:

  • This mode does not support generating String or string slice hexadecimal representations of the provided data structures.

Examples

Hex to J1939 Identifier

let id_a = IdJ1939::try_from_hex("0CF00400")?;

assert_eq!(3, id_a.priority());
assert_eq!(SourceAddr::Some(0), id_a.source_address());
assert_eq!(Some(Addr::PrimaryEngineController), id_a.source_address().lookup());

Decode J1939 PGN

let id_a = IdJ1939::try_from_hex("18FEF200")?;

assert_eq!(CommunicationMode::Broadcast, id_a.pgn().communication_mode());
assert_eq!(GroupExtension::Some(242), id_a.pgn().group_extension());
 
let id_b = IdJ1939::try_from_hex("0C00290B")?;
        
// SA 11 = Brakes
assert_eq!(SourceAddr::Some(11), id_b.source_address());
assert_eq!(Some(Addr::Brakes), id_b.source_address().lookup());

assert_eq!(PduFormat::Pdu1(0), id_b.pgn().pdu_format());
assert_eq!(CommunicationMode::P2P, id_b.pgn().communication_mode());
assert_eq!(GroupExtension::None, id_b.pgn().group_extension());

// DA 41 = Retarder, Exhaust, Engine
assert_eq!(DestinationAddr::Some(41), id_b.pgn().destination_address());
assert_eq!(Some(Addr::RetarderExhaustEngine1), id_b.pgn().destination_address().lookup());   
Commit count: 50

cargo fmt