Skip to content

PurdueElectricRacing/can_decode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

can_decode

Decode and encode CAN frames into messages/signals in a fast and easy way.

Crates.io Docs.rs

Features

  • Parse DBC (CAN Database) files
  • Decode CAN messages into signals with physical values
  • Encode signal values back into raw CAN messages
  • Support for both standard and extended CAN IDs
  • Handle big-endian and little-endian byte ordering
  • Support for signed and unsigned signal values
  • Apply scaling factors and offsets (and inverse for encoding)

Decoding Example

use can_decode::Parser;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
	// Load a DBC file
	let parser = Parser::from_dbc_file(Path::new("my_can_database.dbc"))?;

	// Decode a CAN message
	let msg_id = 0x123;
	let data = [0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0];

	if let Some(decoded) = parser.decode_msg(msg_id, &data) {
		println!("Message: {}", decoded.name);
		for (signal_name, signal) in &decoded.signals {
			println!("  {}: {} {}", signal_name, signal.value, signal.unit);
		}
	}
	Ok(())
}

Encoding Example

use can_decode::Parser;
use std::path::Path;
use std::collections::HashMap;

fn main() -> Result<(), Box<dyn std::error::Error>> {
	let parser = Parser::from_dbc_file(Path::new("my_can_database.dbc"))?;

	// Encode a CAN message from signal values
	let mut signal_values = HashMap::from([
		("EngineSpeed".to_string(), 2500.0),
		("ThrottlePosition".to_string(), 45.5),
	]);

	if let Some(data) = parser.encode_msg(0x123, &signal_values) {
		println!("Encoded CAN data: {:02X?}", data);
	}

	// Or encode by message name
	if let Some((msg_id, data)) = parser.encode_msg_by_name("EngineData", &signal_values) {
		println!("Message ID: {:#X}, Data: {:02X?}", msg_id, data);
	}
	Ok(())
}

Installation

Add the following to your Cargo.toml:

[dependencies]
can_decode = "0.4"

About

Decode and encode CAN frames into messages/signals in a fast and easy way.

Topics

Resources

Stars

Watchers

Forks

Languages