pub mod fopid;
pub mod grunwald;
pub mod tustin_approx;
pub use fopid::{Fopid, FopidAutoTune, FopidAutoTuneResult, FopidConfig};
pub use grunwald::{FracDifferentiator, FracIntegrator, GrunwaldLeibniz};
pub use tustin_approx::{design_tustin_frac, TustinFrac};
#[derive(Debug, Clone, PartialEq)]
pub enum FracError {
InvalidOrder,
InvalidSampleTime,
WindowTooSmall,
InvalidConfig(&'static str),
TuningFailed,
}
impl core::fmt::Display for FracError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
FracError::InvalidOrder => write!(f, "fractional order is invalid or out of range"),
FracError::InvalidSampleTime => write!(f, "sample time must be positive and finite"),
FracError::WindowTooSmall => write!(f, "window/order must be at least 2"),
FracError::InvalidConfig(msg) => write!(f, "invalid configuration: {}", msg),
FracError::TuningFailed => write!(f, "auto-tuning failed to find a valid solution"),
}
}
}