1#![forbid(unsafe_code)]
2pub 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}