# frcrs
frcrs is a robotics control framework designed to streamline the development of control systems for FRC robots. It provides a highly modular architecture, focusing on creating independent and reusable subsystems to simplify the overall control structure of the robot.

# Features
- Modular Subsystem Structure: Each robot subsystem (e.g., Drivetrain, Shooter) is separated into individual modules, promoting clean, maintainable code.
- Easy Integration: Easily integrate into a runnable robot, will build with no hassle
- Asynchronous: Asynchronous tasks, allowing efficient control of subsystems in real-time scenarios.
# Subsystem Overview
The main design principle of frcrs is to split robot functionality into independent subsystems. Each subsystem is responsible for controlling a specific part of the robot, such as the drivetrain, shooter, or intake mechanism.

- Subsystems: Implemented using Rust structs, subsystems encapsulate the hardware interface and logic for a specific component of the robot.
- Controllers: Subsystems are controlled via Joystick or other input mechanisms, which can be passed into the subsystems as needed.
- Communication: Subsystems communicate with each other through shared ownership patterns, using Rc<RefCell<>> to manage state in a safe and efficient way.
# Example Usage
Here’s an example of how a subsystem might be implemented in frcrs:

```rust
use frcrs::ctre::SRX;
use crate::constants;

pub struct Drivetrain {
    left: SRX,
    right: SRX
}

impl Drivetrain {
    pub fn new() -> Self {
        Self {
            left: SRX::new(constants::drivetrain::LEFT),
            right: SRX::new(constants::drivetrain::RIGHT)
        }
    }

    pub fn drive(&self, left: f64, right: f64) {
        self.left.set(-left);
        self.right.set(-right);
    }
}
```
See an example [here](https://github.com/Team-2502/frcrs-template/tree/disco)
# Getting Started
1. Clone the Repository
    ```bash
    git clone https://github.com/Team-2502/frcrs.git
    cd frcrs
    ```
2. Ensure that you have Rust and cargo installed. You can install Rust [here](https://www.rust-lang.org/tools/install)
3. Install Java 17, the same for FRC
4. Install rust target
   ```bash
   rustup target add arm-unknown-linux-gnueabi
   ```
6. Install toolchain
   ```bash
   git clone https://github.com/wpilibsuite/allwpilib.git
   cd allwpipib
   ./gradlew installRoborioToolchain
   ```
7. Add directory to path `$HOME/.gradle/toolchains/frc/YYYY/roborio/bin` where `YYYY` is the year of the toolchain
8. Build frcrs with `cargo build --release --target arm-unknown-linux-gnueabi`
9. Create robotcode, see an example [here](https://github.com/Team-2502/frcrs-template/tree/disco)
10. Deploy your code, see deploy crate for deployment. An example toml is here
    ```toml
    [deploy]
    team_number = 2502
    executable = "target/arm-unknown-linux-gnueabi/release/robotcode"
    lib = "javastub.jar"
    frontend = "talon-board/out"
    frontend_dest = "/home/lvuser/talon-board/out"
    ```

# Contributing
We welcome contributions! If you have suggestions for improvements or find bugs, feel free to create an issue or submit a pull request.

1. Fork the repository
2. Create a feature branch
3. Commit your changes
4. Push to the branch
5. Open a pull request

# License
This project is licensed under the MIT License - see the LICENSE file for details.
