Use this Rust interface to interact with NI FPGAs! See NI's documentation about the FPGA C interface for more information.
This interface supports reading and writing the following types, both indvidually and in fixed-sized arrays:
Clusters are supported via a derive macro. Arrays of Clusters are not guaranteed to be supported. ```rust
struct PWMConfig { period: u16, min_high: u16, } ```
Enums are supported via a derive macro. Arrays of Enums are also supported. One of u8
, u16
, u32
, or u64
will be chosen as a backing type depending on the number of variants.
```rust
enum SPIDebugState { Idle, CheckWindow, CheckAvailable, SetFIFOMark, EnableSPI, StuffFIFO, CheckMark, ShuffleData, Disable, } ```
FXP types are currently unsupported.
Register offset can be found by introspecting /boot/user.lvbitx
on a roboRIO. This file is also present in first-rust-competition/cross-images images.
```rust use nifpga::Session; use nifpga_macros::{Cluster, Enum};
struct PWMConfig { period: u16, min_high: u16, }
struct AnalogTriggerOutput { inhysteresis: bool, overlimit: bool, rising: bool, falling: bool, }
enum SPIDebugState { Idle, CheckWindow, CheckAvailable, SetFIFOMark, EnableSPI, StuffFIFO, CheckMark, ShuffleData, Disable, }
fn main() -> Result<(), ni_fpga::Error> { let session = Session::open( "/boot/user.lvbitx", "264D0BA312FF00B741D4742415E1D470", "RIO0", )?;
println!("Input voltage: {:?}", session.read::<u16>(99174)?);
println!("{:#?}", session.read::<PWMConfig>(98536)?);
println!("{:#?}", session.read::<[AnalogTriggerOutput; 8]>(98424)?);
println!("{:#?}", session.read::<SPIDebugState>(99314)?);
Ok(())
} ```
Contributions are welcome and appreciated. Look at open issues to find tasks to work on. We especially need help with: * Creating an automated testing strategy * Handling fixed-point numeric types * Improving documentation * Adding support for IRQs and FIFOs (see NI API reference)