lvbitfile2rust

Crates.iolvbitfile2rust
lib.rslvbitfile2rust
version0.1.1
sourcesrc
created_at2020-08-23 09:03:02.516141
updated_at2020-08-23 15:34:21.537406
descriptionGenerate Rust register maps (`struct`s) from lvbitx files - in the spirit of svd2rust
homepage
repositoryhttps://github.com/first-rust-competition/lvbitfile2rust
max_upload_size
id279754
size16,131
Connor Worley (connorworley)

documentation

README

lvbitfile2rust

crates.io docs.rs CI

lvbitfile2rust generates static register maps from lvbitx files.

Invoking from the command line

cargo install lvbitfile2rust
lvbitfile2rust-cli /boot/user.lvbitx | rustfmt > rio.rs

Invoking as a macro

mod rio {
    use lvbitfile2rust_macros::lvbitfile2rust;
    lvbitfile2rust!("/boot/user.lvbitx");
}

Generated code

lvbitfile2rust generates code with a similar interface to code generated by svd2rust. The generated code contains a struct named Peripherals with an associated function named take. Calling take will attempt to open an FPGA session and return a Peripherals instance. The Peripherals instance contains fields for each register described by the input bitfile. These fields contain instances of structs corresponding to each register, with read and possibly write methods. In practice, the interface is rather straightforward to use:

use ni_fpga::fxp::UnsignedFXP;

mod rio {
    use lvbitfile2rust_macros::lvbitfile2rust;
    lvbitfile2rust!("/boot/user.lvbitx");
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Turn PWM on if the RSL is on!
    // My scope tells me the RSL blinks at 5Hz in teleop mode!
    let peripherals = rio::Peripherals::take("RIO0")?;
    loop {
        let leds = peripherals.LEDs.read()?;
        peripherals.PWM_Hdr0.write(&{
            if leds.RSL {
                UnsignedFXP::max_value()
            } else {
                UnsignedFXP::min_value()
            }
        })?;
    }
}

Generated code will depend on ni-fpga and ni-fpga-macros if the input bitfile uses Clusters or Enums.

Commit count: 12

cargo fmt