Skip to main content

use_control/
lib.rs

1#![forbid(unsafe_code)]
2//! Thin facade for the `use-control` workspace.
3//!
4//! The crate reexports the focused control-system crates directly so consumers
5//! can opt into one dependency while still using the smaller APIs.
6//!
7//! # Examples
8//!
9//! ```rust
10//! use use_control::*;
11//!
12//! let mut controller = PidController::new(PidGains {
13//!     kp: 2.0,
14//!     ki: 0.0,
15//!     kd: 0.0,
16//! })
17//! .unwrap();
18//! let output = controller.update(5.0, 3.0, 0.5).unwrap();
19//! let signal = ControlSignal::new(output).unwrap().clamp(0.0, 10.0).unwrap();
20//!
21//! assert_eq!(signal.value(), 4.0);
22//! assert_eq!(classify_gain(0.8, 1.0).unwrap(), Stability::Stable);
23//! ```
24
25pub use use_control_error;
26pub use use_control_error::*;
27pub use use_control_signal;
28pub use use_control_signal::*;
29pub use use_feedback;
30pub use use_feedback::*;
31pub use use_pid;
32pub use use_pid::*;
33pub use use_setpoint;
34pub use use_setpoint::*;
35pub use use_stability;
36pub use use_stability::*;
37pub use use_system_response;
38pub use use_system_response::*;
39
40#[cfg(test)]
41mod tests {
42    use super::{
43        ControlSignal, FeedbackDirection, FeedbackLoop, PidController, PidGains, Setpoint,
44        Stability, StepResponsePoint, classify_gain, deadband, first_order_response, saturate,
45    };
46
47    #[test]
48    fn facade_reexports_workspace_apis() {
49        let loop_gain = FeedbackLoop::new(0.5, FeedbackDirection::Negative).unwrap();
50        assert_eq!(loop_gain.apply(10.0, 2.0), 9.0);
51
52        let mut controller = PidController::new(PidGains {
53            kp: 2.0,
54            ki: 0.0,
55            kd: 0.0,
56        })
57        .unwrap();
58        assert_eq!(controller.update(5.0, 3.0, 0.5).unwrap(), 4.0);
59
60        let setpoint = Setpoint::new(10.0, 0.2).unwrap();
61        assert!(setpoint.is_reached(9.9));
62
63        assert_eq!(deadband(0.05, 0.1).unwrap(), 0.0);
64        assert_eq!(
65            ControlSignal::new(12.0)
66                .unwrap()
67                .clamp(0.0, 10.0)
68                .unwrap()
69                .value(),
70            10.0
71        );
72        assert_eq!(saturate(-7.0, 5.0).unwrap(), -5.0);
73
74        let response = first_order_response(0.0, 1.0, 1.0, 1.0).unwrap();
75        assert!(response > 0.0);
76        assert_eq!(classify_gain(0.8, 1.0).unwrap(), Stability::Stable);
77
78        let point = StepResponsePoint {
79            time: 0.5,
80            value: response,
81        };
82        assert_eq!(point.time, 0.5);
83    }
84}