A port of WPILib and REVLib to Rust for use in the FIRST Robotics Competition. This project intends to investigate the use of Rust to prevent simple logic errors like commanding a subsystem of the robot to do two seperate things at the same time by using the borrow checker. This project also experiments with allowing parts of the robotrs ecosystem to be used outside of FRC. This also aims to make it easier for teams to use shared code by using cargo instead of gradle and a custom dependency managment system.
The hal-sys, ctre, nt, and revlib packages all download libraries and the
binaries necessary at compile time. All code related to the downloading of
these libs can be found in the build-system directory and the build.rs of the 4
crates mentioned earlier.
- Install the compiler toolchain by running the
installRoboRioToolchaintask in allwpilib or downloading from Github and putting thebindirectory on the path. - First, install
cargo-generate using
cargo install cargo-generate. Then, generate from the template usingcargo generate https://github.com/BlueZeeKing/robotrs.gitRemember to change the project name inCargo.toml - Deploy your code by first installing the deployment tool:
cargo install cargo-deploy --git https://github.com/BlueZeeKing/robotrs.git
Then running it in the root directory:
cargo deploy [TEAM NUMBER]
- Install the compiler toolchain the same way as in cargo generate step 0
- Create a new binary Rust crate with
cargo new <NAME> - Add the following to the ./.cargo/config.toml file
[target.arm-unknown-linux-gnueabi]
linker = "arm-frc2023-linux-gnueabi-gcc"
rustflags = ["-C", "target-cpu=cortex-a9"]
[build]
target = "arm-unknown-linux-gnueabi"
[env]
LIBS_OUT_DIR = { value = "target/lib", relative = true }- Add the required dependencies to the
Cargo.tomlfile. For example:
[dependencies]
robotrs = { git = "https://github.com/BlueZeeKing/robotrs.git", tag="v0.1.0" }
revlib = { git = "https://github.com/BlueZeeKing/robotrs.git", tag="v0.1.0" }
ctre = { git = "https://github.com/BlueZeeKing/robotrs.git", tag="v0.1.0" }
anyhow = "1.0.75" # This is an error handling library that is used extensively- Add a
rust-toolchain.tomlfile to the root of the project with the following contents:
[toolchain]
channel = "nightly"
targets = ["arm-unknown-linux-gnueabi"]- In the
src/main.rsfile run the scheduler with closure that produces a struct that implements theAsyncRobottrait. For example:
fn main() {
robotrs::scheduler::RobotScheduler::start_robot(|| example::Robot::new());
}- Deploy your code by first installing the deployment tool:
cargo install cargo-deploy --git https://github.com/BlueZeeKing/robotrs.git
Then running it:
cargo deploy [TEAM NUMBER]