Skip to content

b-camacho/canopeners

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

canopeners

Incomplete, but easy to use implementation of the CANOpen standard in Rust.

Examples

All examples are blocking. Set timeouts with conn.set_{read_write}_timeout.

Send a single message:

Conn::new("vcan0").map(|conn| {
    let nmt = Nmt::new(canopeners::NmtFunction::StartRemoteNode, 10);
    conn.send(&Message::Nmt(nmt)).unwrap();
})

Write bytes to object dictionary on a remote node:

Conn::new("vcan0").map(|mut conn| {
    conn.sdo_write(
    /* remote node id */ 0x10, 
    /* index */ 0x1000,
    /* sub index */ 1,
    /* data, can be any length */ &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    .unwrap();
})

Read bytes from object dictionary on a remote node:

Conn::new("vcan0").map(|mut conn| {
    let res = conn.sdo_read(
    /* remote node id */ 0x10, 
    /* index */ 0x1000,
    /* sub index */ 1)
    .unwrap();
    dbg!(res);
})

Building

nix develop
cargo build

if you'd rather use your system cargo, just cargo build will work too

Testing

setup_vcan.sh sets up a virtual CAN bus. tests/ rely on this

TODO

  • enum for all message types (can't use impl trait as function return type)
  • send/receive SDO
  • stateless example over vcan
  • segmented SDO
  • porcelain wrappers for easy send/receive over SDO
  • finish replacing manual bit manipulation with binrw
  • package.nix
  • convert simple.rs example into tests
  • fix cargo warns
  • fix clippy lints
  • add send_acked for all message types
  • Node impl sending TPDOs based on SYNC msgs
  • extended ID support

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published