rust_servo/
lib.rs

1use engine::Engine;
2use pid::pid_controller::PidController;
3
4pub mod engine;
5pub mod pid;
6pub mod servo;
7
8// Dummy interface controller that measures an external process variable.
9struct InterfaceController {
10    out_amp: f64,
11}
12impl InterfaceController {
13    fn new() -> Self {
14        Self { out_amp: 0.0 }
15    }
16    fn read(&self) -> f64 {
17        0.0
18    }
19
20    fn set(&mut self, amp: f64) {
21        self.out_amp = amp;
22    }
23}
24// Example invocation of a PID controller
25#[allow(dead_code)]
26fn main() {
27    let goal_set_point = 100.0;
28    let pid_controller = PidController::new(goal_set_point);
29
30    // Prepare reader
31    let mut controller = InterfaceController::new();
32    // Spin up a servo engine to do our heavy lifting
33    let mut engine = Engine::new(pid_controller);
34    loop {
35        // Read in the current process value
36        let val = controller.read();
37
38        // Calculate the control output based on the current process value
39        let control_output = engine.next(val);
40
41        // Adjust the controller
42        controller.set(val + control_output.value);
43
44        // Wait one second before re-reading
45        std::thread::sleep(std::time::Duration::from_secs(1));
46    }
47}