#![warn(missing_docs)]
#![allow(non_camel_case_types)]
#![cfg_attr(not(features = "std"), no_std)]
#[cfg(not(feature = "float"))]
pub type float = f64;
#[cfg(feature = "float")]
pub type float = f32;
#[cfg(feature = "std")]
extern crate std;
#[cfg(not(feature = "std"))]
pub use core::ffi::c_int;
#[cfg(feature = "std")]
pub use std::os::raw::c_int;
#[cfg(not(feature = "std"))]
pub use core::ffi::c_uint;
#[cfg(feature = "std")]
pub use std::os::raw::c_uint;
#[cfg(not(feature = "std"))]
use core::mem::size_of;
#[cfg(feature = "std")]
use std::mem::size_of;
#[cfg(not(feature = "std"))]
use core::cmp::Ordering;
#[cfg(feature = "std")]
use std::cmp::Ordering;
#[cfg(not(feature = "std"))]
use core::ptr::{null, null_mut};
#[cfg(feature = "std")]
use std::ptr::{null, null_mut};
#[cfg(not(feature = "std"))]
use core::slice::{from_raw_parts, from_raw_parts_mut};
#[cfg(feature = "std")]
use std::slice::{from_raw_parts, from_raw_parts_mut};
extern "C" {
fn a_u32_sqrt(x: u32) -> u16;
fn a_u64_sqrt(x: u64) -> u32;
}
#[inline(always)]
pub fn u32_sqrt(x: u32) -> u16 {
unsafe { a_u32_sqrt(x) }
}
#[inline(always)]
pub fn u64_sqrt(x: u64) -> u32 {
unsafe { a_u64_sqrt(x) }
}
extern "C" {
fn a_f32_rsqrt(x: f32) -> f32;
fn a_f64_rsqrt(x: f64) -> f64;
}
#[inline(always)]
pub fn f32_rsqrt(x: f32) -> f32 {
unsafe { a_f32_rsqrt(x) }
}
#[inline(always)]
pub fn f64_rsqrt(x: f64) -> f64 {
unsafe { a_f64_rsqrt(x) }
}
extern "C" {
fn a_hash_bkdr_(pdata: *const u8, nbyte: usize, value: u32) -> u32;
fn a_hash_sdbm_(pdata: *const u8, nbyte: usize, value: u32) -> u32;
}
#[inline(always)]
pub fn hash_bkdr(block: &[u8], value: u32) -> u32 {
unsafe { a_hash_bkdr_(block.as_ptr(), block.len(), value) }
}
#[inline(always)]
pub fn hash_sdbm(block: &[u8], value: u32) -> u32 {
unsafe { a_hash_sdbm_(block.as_ptr(), block.len(), value) }
}
#[repr(C)]
pub struct crc8 {
pub table: [u8; 0x100],
}
extern "C" {
fn a_crc8m_init(table: *mut u8, poly: u8);
fn a_crc8l_init(table: *mut u8, poly: u8);
fn a_crc8(table: *const u8, pdate: *const u8, nbyte: usize, value: u8) -> u8;
}
impl crc8 {
#[inline(always)]
pub fn new_msb(poly: u8) -> Self {
let mut ctx: Self = Self { table: [0; 0x100] };
unsafe { a_crc8m_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn new_lsb(poly: u8) -> Self {
let mut ctx: Self = Self { table: [0; 0x100] };
unsafe { a_crc8l_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn gen_msb(&mut self, poly: u8) -> &mut Self {
unsafe { a_crc8m_init(self.table.as_mut_ptr(), poly) };
self
}
#[inline(always)]
pub fn gen_lsb(&mut self, poly: u8) -> &mut Self {
unsafe { a_crc8l_init(self.table.as_mut_ptr(), poly) };
self
}
#[inline(always)]
pub fn eval(self, block: &[u8], value: u8) -> u8 {
unsafe { a_crc8(self.table.as_ptr(), block.as_ptr(), block.len(), value) }
}
}
#[repr(C)]
pub struct crc16 {
pub table: [u16; 0x100],
eval: unsafe extern "C" fn(*const u16, *const u8, usize, u16) -> u16,
}
extern "C" {
fn a_crc16m_init(table: *mut u16, poly: u16);
fn a_crc16l_init(table: *mut u16, poly: u16);
fn a_crc16m(table: *const u16, pdate: *const u8, nbyte: usize, value: u16) -> u16;
fn a_crc16l(table: *const u16, pdate: *const u8, nbyte: usize, value: u16) -> u16;
}
impl crc16 {
#[inline(always)]
pub fn new_msb(poly: u16) -> Self {
let mut ctx: Self = Self {
table: [0; 0x100],
eval: a_crc16m,
};
unsafe { a_crc16m_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn new_lsb(poly: u16) -> Self {
let mut ctx: Self = Self {
table: [0; 0x100],
eval: a_crc16l,
};
unsafe { a_crc16l_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn gen_msb(&mut self, poly: u16) -> &mut Self {
unsafe { a_crc16m_init(self.table.as_mut_ptr(), poly) };
self.eval = a_crc16m;
self
}
#[inline(always)]
pub fn gen_lsb(&mut self, poly: u16) -> &mut Self {
unsafe { a_crc16l_init(self.table.as_mut_ptr(), poly) };
self.eval = a_crc16l;
self
}
#[inline(always)]
pub fn eval(self, block: &[u8], value: u16) -> u16 {
unsafe { (self.eval)(self.table.as_ptr(), block.as_ptr(), block.len(), value) }
}
}
#[repr(C)]
pub struct crc32 {
pub table: [u32; 0x100],
eval: unsafe extern "C" fn(*const u32, *const u8, usize, u32) -> u32,
}
extern "C" {
fn a_crc32m_init(table: *mut u32, poly: u32);
fn a_crc32l_init(table: *mut u32, poly: u32);
fn a_crc32m(table: *const u32, pdate: *const u8, nbyte: usize, value: u32) -> u32;
fn a_crc32l(table: *const u32, pdate: *const u8, nbyte: usize, value: u32) -> u32;
}
impl crc32 {
#[inline(always)]
pub fn new_msb(poly: u32) -> Self {
let mut ctx: Self = Self {
table: [0; 0x100],
eval: a_crc32m,
};
unsafe { a_crc32m_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn new_lsb(poly: u32) -> Self {
let mut ctx: Self = Self {
table: [0; 0x100],
eval: a_crc32l,
};
unsafe { a_crc32l_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn gen_msb(&mut self, poly: u32) -> &mut Self {
unsafe { a_crc32m_init(self.table.as_mut_ptr(), poly) };
self.eval = a_crc32m;
self
}
#[inline(always)]
pub fn gen_lsb(&mut self, poly: u32) -> &mut Self {
unsafe { a_crc32l_init(self.table.as_mut_ptr(), poly) };
self.eval = a_crc32l;
self
}
#[inline(always)]
pub fn eval(self, block: &[u8], value: u32) -> u32 {
unsafe { (self.eval)(self.table.as_ptr(), block.as_ptr(), block.len(), value) }
}
}
#[repr(C)]
pub struct crc64 {
pub table: [u64; 0x100],
eval: unsafe extern "C" fn(*const u64, *const u8, usize, u64) -> u64,
}
extern "C" {
fn a_crc64m_init(table: *mut u64, poly: u64);
fn a_crc64l_init(table: *mut u64, poly: u64);
fn a_crc64m(table: *const u64, pdate: *const u8, nbyte: usize, value: u64) -> u64;
fn a_crc64l(table: *const u64, pdate: *const u8, nbyte: usize, value: u64) -> u64;
}
impl crc64 {
#[inline(always)]
pub fn new_msb(poly: u64) -> Self {
let mut ctx: Self = Self {
table: [0; 0x100],
eval: a_crc64m,
};
unsafe { a_crc64m_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn new_lsb(poly: u64) -> Self {
let mut ctx: Self = Self {
table: [0; 0x100],
eval: a_crc64l,
};
unsafe { a_crc64l_init(ctx.table.as_mut_ptr(), poly) };
ctx
}
#[inline(always)]
pub fn gen_msb(&mut self, poly: u64) -> &mut Self {
unsafe { a_crc64m_init(self.table.as_mut_ptr(), poly) };
self.eval = a_crc64m;
self
}
#[inline(always)]
pub fn gen_lsb(&mut self, poly: u64) -> &mut Self {
unsafe { a_crc64l_init(self.table.as_mut_ptr(), poly) };
self.eval = a_crc64l;
self
}
#[inline(always)]
pub fn eval(self, block: &[u8], value: u64) -> u64 {
unsafe { (self.eval)(self.table.as_ptr(), block.as_ptr(), block.len(), value) }
}
}
#[allow(clippy::excessive_precision)]
const TAU: float = 6.28318530717958647692528676655900577;
#[repr(C)]
pub struct hpf {
pub alpha: float,
pub output: float,
pub input: float,
}
impl hpf {
#[inline(always)]
pub fn new(fc: float, ts: float) -> Self {
Self {
alpha: 1.0 / (TAU * fc * ts + 1.0),
output: 0.0,
input: 0.0,
}
}
#[inline(always)]
pub fn gen(&mut self, fc: float, ts: float) -> &mut Self {
self.alpha = 1.0 / (TAU * fc * ts + 1.0);
self
}
#[inline(always)]
pub fn iter(&mut self, x: float) -> float {
self.output = self.alpha * (self.output + x - self.input);
self.input = x;
self.output
}
#[inline(always)]
pub fn zero(&mut self) -> &mut Self {
self.output = 0.0;
self.input = 0.0;
self
}
}
#[allow(clippy::excessive_precision)]
const _1_TAU: float = 0.159154943091895335768883763372514362;
#[repr(C)]
pub struct lpf {
pub alpha: float,
pub output: float,
}
impl lpf {
#[inline(always)]
pub fn new(fc: float, ts: float) -> Self {
Self {
alpha: ts / (_1_TAU / fc + ts),
output: 0.0,
}
}
#[inline(always)]
pub fn gen(&mut self, fc: float, ts: float) -> &mut Self {
self.alpha = ts / (_1_TAU / fc + ts);
self
}
#[inline(always)]
pub fn iter(&mut self, x: float) -> float {
self.output *= 1.0 - self.alpha;
self.output += x * self.alpha;
self.output
}
#[inline(always)]
pub fn zero(&mut self) -> &mut Self {
self.output = 0.0;
self
}
}
pub mod mf {
use crate::c_int;
pub const NUL: c_int = 0;
pub const GAUSS: c_int = 1;
pub const GAUSS2: c_int = 2;
pub const GBELL: c_int = 3;
pub const SIG: c_int = 4;
pub const DSIG: c_int = 5;
pub const PSIG: c_int = 6;
pub const TRAP: c_int = 7;
pub const TRI: c_int = 8;
pub const LINS: c_int = 9;
pub const LINZ: c_int = 10;
pub const S: c_int = 11;
pub const Z: c_int = 12;
pub const PI: c_int = 13;
use crate::float;
extern "C" {
fn a_mf_gauss(x: float, sigma: float, c: float) -> float;
fn a_mf_gauss2(x: float, sigma1: float, c1: float, sigma2: float, c2: float) -> float;
fn a_mf_gbell(x: float, a: float, b: float, c: float) -> float;
fn a_mf_sig(x: float, a: float, c: float) -> float;
fn a_mf_dsig(x: float, a1: float, c1: float, a2: float, c2: float) -> float;
fn a_mf_psig(x: float, a1: float, c1: float, a2: float, c2: float) -> float;
fn a_mf_trap(x: float, a: float, b: float, c: float, d: float) -> float;
fn a_mf_tri(x: float, a: float, b: float, c: float) -> float;
fn a_mf_lins(x: float, a: float, b: float) -> float;
fn a_mf_linz(x: float, a: float, b: float) -> float;
fn a_mf_s(x: float, a: float, b: float) -> float;
fn a_mf_z(x: float, a: float, b: float) -> float;
fn a_mf_pi(x: float, a: float, b: float, c: float, d: float) -> float;
}
#[inline(always)]
pub fn gauss(x: float, sigma: float, c: float) -> float {
unsafe { a_mf_gauss(x, sigma, c) }
}
#[inline(always)]
pub fn gauss2(x: float, sigma1: float, c1: float, sigma2: float, c2: float) -> float {
unsafe { a_mf_gauss2(x, sigma1, c1, sigma2, c2) }
}
#[inline(always)]
pub fn gbell(x: float, a: float, b: float, c: float) -> float {
unsafe { a_mf_gbell(x, a, b, c) }
}
#[inline(always)]
pub fn sig(x: float, a: float, c: float) -> float {
unsafe { a_mf_sig(x, a, c) }
}
#[inline(always)]
pub fn dsig(x: float, a1: float, c1: float, a2: float, c2: float) -> float {
unsafe { a_mf_dsig(x, a1, c1, a2, c2) }
}
#[inline(always)]
pub fn psig(x: float, a1: float, c1: float, a2: float, c2: float) -> float {
unsafe { a_mf_psig(x, a1, c1, a2, c2) }
}
#[inline(always)]
pub fn trap(x: float, a: float, b: float, c: float, d: float) -> float {
unsafe { a_mf_trap(x, a, b, c, d) }
}
#[inline(always)]
pub fn tri(x: float, a: float, b: float, c: float) -> float {
unsafe { a_mf_tri(x, a, b, c) }
}
#[inline(always)]
pub fn lins(x: float, a: float, b: float) -> float {
unsafe { a_mf_lins(x, a, b) }
}
#[inline(always)]
pub fn linz(x: float, a: float, b: float) -> float {
unsafe { a_mf_linz(x, a, b) }
}
#[inline(always)]
pub fn s(x: float, a: float, b: float) -> float {
unsafe { a_mf_s(x, a, b) }
}
#[inline(always)]
pub fn z(x: float, a: float, b: float) -> float {
unsafe { a_mf_z(x, a, b) }
}
#[inline(always)]
pub fn pi(x: float, a: float, b: float, c: float, d: float) -> float {
unsafe { a_mf_pi(x, a, b, c, d) }
}
}
#[repr(C)]
pub struct pid {
pub kp: float,
pub ki: float,
pub kd: float,
pub summax: float,
pub summin: float,
pub sum: float,
pub outmax: float,
pub outmin: float,
pub out: float,
var: float,
pub fdb: float,
pub err: float,
}
impl Default for pid {
#[inline(always)]
fn default() -> Self {
Self {
kp: 0.0,
ki: 0.0,
kd: 0.0,
summax: float::INFINITY,
summin: -float::INFINITY,
sum: 0.0,
outmax: float::INFINITY,
outmin: -float::INFINITY,
out: 0.0,
var: 0.0,
fdb: 0.0,
err: 0.0,
}
}
}
extern "C" {
fn a_pid_kpid(ctx: *mut pid, kp: float, ki: float, kd: float);
fn a_pid_run(ctx: *mut pid, set: float, fdb: float) -> float;
fn a_pid_pos(ctx: *mut pid, set: float, fdb: float) -> float;
fn a_pid_inc(ctx: *mut pid, set: float, fdb: float) -> float;
fn a_pid_zero(ctx: *mut pid);
}
impl pid {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[inline(always)]
pub fn kpid(&mut self, kp: float, ki: float, kd: float) -> &mut Self {
unsafe { a_pid_kpid(self, kp, ki, kd) };
self
}
#[inline(always)]
pub fn run(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_run(self, set, fdb) }
}
#[inline(always)]
pub fn pos(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_pos(self, set, fdb) }
}
#[inline(always)]
pub fn inc(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_inc(self, set, fdb) }
}
#[inline(always)]
pub fn zero(&mut self) -> &mut Self {
unsafe { a_pid_zero(self) };
self
}
}
pub mod fuzzy {
use crate::c_uint;
pub const CAP: c_uint = 1;
pub const CAP_ALGEBRA: c_uint = 2;
pub const CAP_BOUNDED: c_uint = 3;
pub const CUP: c_uint = 4;
pub const CUP_ALGEBRA: c_uint = 5;
pub const CUP_BOUNDED: c_uint = 6;
pub const EQU: c_uint = 0;
}
#[repr(C)]
pub struct pid_fuzzy {
pub pid: pid,
me: *const float,
mec: *const float,
mkp: *const float,
mki: *const float,
mkd: *const float,
idx: *mut c_uint,
val: *mut float,
op: extern "C" fn(float, float) -> float,
pub kp: float,
pub ki: float,
pub kd: float,
order: c_uint,
block: c_uint,
}
impl Default for pid_fuzzy {
#[inline(always)]
fn default() -> Self {
Self {
pid: pid::default(),
me: null(),
mec: null(),
mkp: null(),
mki: null(),
mkd: null(),
idx: null_mut(),
val: null_mut(),
op: unsafe { a_pid_fuzzy_op(fuzzy::EQU) },
kp: 0.0,
ki: 0.0,
kd: 0.0,
order: 0,
block: 0,
}
}
}
extern "C" {
fn a_pid_fuzzy_op(op: c_uint) -> extern "C" fn(float, float) -> float;
fn a_pid_fuzzy_set_op(ctx: *mut pid_fuzzy, op: c_uint);
fn a_pid_fuzzy_rule(
ctx: *mut pid_fuzzy,
num: c_uint,
me: *const float,
mec: *const float,
mkp: *const float,
mki: *const float,
mkd: *const float,
);
fn a_pid_fuzzy_block(ctx: *mut pid_fuzzy) -> *mut u8;
fn a_pid_fuzzy_set_block(ctx: *mut pid_fuzzy, ptr: *mut u8, num: usize);
fn a_pid_fuzzy_kpid(ctx: *mut pid_fuzzy, kp: float, ki: float, kd: float);
fn a_pid_fuzzy_run(ctx: *mut pid_fuzzy, set: float, fdb: float) -> float;
fn a_pid_fuzzy_pos(ctx: *mut pid_fuzzy, set: float, fdb: float) -> float;
fn a_pid_fuzzy_inc(ctx: *mut pid_fuzzy, set: float, fdb: float) -> float;
fn a_pid_fuzzy_zero(ctx: *mut pid_fuzzy);
}
impl pid_fuzzy {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[inline(always)]
pub fn rule(
&mut self,
col: usize,
me: &[float],
mec: &[float],
mkp: &[float],
mki: &[float],
mkd: &[float],
) -> &mut Self {
unsafe {
a_pid_fuzzy_rule(
self,
col as c_uint,
me.as_ptr(),
mec.as_ptr(),
mkp.as_ptr(),
mki.as_ptr(),
mkd.as_ptr(),
)
};
self
}
#[inline(always)]
pub fn kpid(&mut self, kp: float, ki: float, kd: float) -> &mut Self {
unsafe { a_pid_fuzzy_kpid(self, kp, ki, kd) };
self
}
#[inline(always)]
#[allow(non_snake_case)]
pub const fn BLOCK(n: usize) -> usize {
size_of::<c_uint>() * n * 2 + size_of::<float>() * n * (2 + n)
}
#[inline(always)]
pub fn block(&mut self) -> &mut [u8] {
unsafe { from_raw_parts_mut(a_pid_fuzzy_block(self), Self::BLOCK(self.block as usize)) }
}
#[inline(always)]
pub fn set_block(&mut self, ptr: &mut [u8], num: usize) -> &mut Self {
unsafe { a_pid_fuzzy_set_block(self, ptr.as_mut_ptr(), num) };
self
}
#[inline(always)]
pub fn op(&mut self, op: c_uint) -> &mut Self {
unsafe { a_pid_fuzzy_set_op(self, op) };
self
}
#[inline(always)]
pub fn run(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_fuzzy_run(self, set, fdb) }
}
#[inline(always)]
pub fn pos(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_fuzzy_pos(self, set, fdb) }
}
#[inline(always)]
pub fn inc(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_fuzzy_inc(self, set, fdb) }
}
#[inline(always)]
pub fn zero(&mut self) -> &mut Self {
unsafe { a_pid_fuzzy_zero(self) };
self
}
}
#[repr(C)]
pub struct pid_neuro {
pub pid: pid,
pub k: float,
pub wp: float,
pub wi: float,
pub wd: float,
pub ec: float,
}
impl Default for pid_neuro {
#[inline(always)]
fn default() -> Self {
Self {
pid: pid::default(),
k: 0.0,
wp: 0.0,
wi: 0.0,
wd: 0.0,
ec: 0.0,
}
}
}
extern "C" {
fn a_pid_neuro_kpid(ctx: *mut pid_neuro, k: float, kp: float, ki: float, kd: float);
fn a_pid_neuro_wpid(ctx: *mut pid_neuro, wp: float, wi: float, wd: float);
fn a_pid_neuro_run(ctx: *mut pid_neuro, set: float, fdb: float) -> float;
fn a_pid_neuro_inc(ctx: *mut pid_neuro, set: float, fdb: float) -> float;
fn a_pid_neuro_zero(ctx: *mut pid_neuro);
}
impl pid_neuro {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[inline(always)]
pub fn kpid(&mut self, k: float, kp: float, ki: float, kd: float) -> &mut Self {
unsafe { a_pid_neuro_kpid(self, k, kp, ki, kd) };
self
}
#[inline(always)]
pub fn wpid(&mut self, wp: float, wi: float, wd: float) -> &mut Self {
unsafe { a_pid_neuro_wpid(self, wp, wi, wd) };
self
}
#[inline(always)]
pub fn run(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_neuro_run(self, set, fdb) }
}
#[inline(always)]
pub fn inc(&mut self, set: float, fdb: float) -> float {
unsafe { a_pid_neuro_inc(self, set, fdb) }
}
#[inline(always)]
pub fn zero(&mut self) -> &mut Self {
unsafe { a_pid_neuro_zero(self) };
self
}
}
#[repr(C)]
pub struct tf {
input: *mut float,
output: *mut float,
num_p: *const float,
den_p: *const float,
num_n: c_uint,
den_n: c_uint,
}
extern "C" {
fn a_tf_set_num(ctx: *mut tf, num_n: c_uint, num_p: *const float, input: *mut float);
fn a_tf_set_den(ctx: *mut tf, den_n: c_uint, den_p: *const float, output: *mut float);
fn a_tf_init(
ctx: *mut tf,
num_n: c_uint,
num_p: *const float,
input: *mut float,
den_n: c_uint,
den_p: *const float,
output: *mut float,
);
fn a_tf_iter(ctx: *const tf, x: float) -> float;
fn a_tf_zero(ctx: *const tf);
}
impl tf {
#[inline(always)]
pub fn new(num: &[float], input: &mut [float], den: &[float], output: &mut [float]) -> Self {
let mut ctx: Self = Self {
input: null_mut(),
output: null_mut(),
num_p: null(),
den_p: null(),
num_n: 0,
den_n: 0,
};
unsafe {
a_tf_init(
&mut ctx,
num.len() as c_uint,
num.as_ptr(),
input.as_mut_ptr(),
den.len() as c_uint,
den.as_ptr(),
output.as_mut_ptr(),
)
};
ctx
}
#[inline(always)]
pub fn iter(&mut self, x: float) -> float {
unsafe { a_tf_iter(self, x) }
}
#[inline(always)]
pub fn zero(&mut self) -> &mut Self {
unsafe { a_tf_zero(self) };
self
}
#[inline(always)]
pub fn input(&self) -> &[float] {
unsafe { from_raw_parts(self.input, self.num_n as usize) }
}
#[inline(always)]
pub fn num(&self) -> &[float] {
unsafe { from_raw_parts(self.num_p, self.num_n as usize) }
}
#[inline(always)]
pub fn set_num(&mut self, num: &[float], input: &mut [float]) -> &mut Self {
unsafe { a_tf_set_num(self, num.len() as c_uint, num.as_ptr(), input.as_mut_ptr()) };
self
}
#[inline(always)]
pub fn output(&self) -> &[float] {
unsafe { from_raw_parts(self.output, self.den_n as usize) }
}
#[inline(always)]
pub fn den(&self) -> &[float] {
unsafe { from_raw_parts(self.den_p, self.den_n as usize) }
}
#[inline(always)]
pub fn set_den(&mut self, den: &[float], output: &mut [float]) -> &mut Self {
unsafe { a_tf_set_den(self, den.len() as c_uint, den.as_ptr(), output.as_mut_ptr()) };
self
}
}
#[repr(C)]
pub struct trajbell {
pub t: float,
pub tv: float,
pub ta: float,
pub td: float,
pub taj: float,
pub tdj: float,
pub p0: float,
pub p1: float,
pub v0: float,
pub v1: float,
pub vm: float,
pub jm: float,
pub am: float,
pub dm: float,
}
impl Default for trajbell {
#[inline(always)]
fn default() -> Self {
Self {
t: 0.0,
tv: 0.0,
ta: 0.0,
td: 0.0,
taj: 0.0,
tdj: 0.0,
p0: 0.0,
p1: 0.0,
v0: 0.0,
v1: 0.0,
vm: 0.0,
jm: 0.0,
am: 0.0,
dm: 0.0,
}
}
}
extern "C" {
fn a_trajbell_gen(
ctx: *mut trajbell,
jm: float,
am: float,
vm: float,
p0: float,
p1: float,
v0: float,
v1: float,
) -> float;
fn a_trajbell_pos(ctx: *const trajbell, x: float) -> float;
fn a_trajbell_vel(ctx: *const trajbell, x: float) -> float;
fn a_trajbell_acc(ctx: *const trajbell, x: float) -> float;
fn a_trajbell_jer(ctx: *const trajbell, x: float) -> float;
}
impl trajbell {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[allow(clippy::too_many_arguments)]
#[inline(always)]
pub fn gen(
&mut self,
jm: float,
am: float,
vm: float,
p0: float,
p1: float,
v0: float,
v1: float,
) -> float {
unsafe { a_trajbell_gen(self, jm, am, vm, p0, p1, v0, v1) }
}
#[inline(always)]
pub fn pos(&mut self, x: float) -> float {
unsafe { a_trajbell_pos(self, x) }
}
#[inline(always)]
pub fn vel(&mut self, x: float) -> float {
unsafe { a_trajbell_vel(self, x) }
}
#[inline(always)]
pub fn acc(&mut self, x: float) -> float {
unsafe { a_trajbell_acc(self, x) }
}
#[inline(always)]
pub fn jer(&mut self, x: float) -> float {
unsafe { a_trajbell_jer(self, x) }
}
}
#[repr(C)]
pub struct trajpoly3 {
pub p: [float; 4],
pub v: [float; 3],
pub a: [float; 2],
}
extern "C" {
fn a_trajpoly3_gen(ctx: *mut trajpoly3, ts: float, p0: float, p1: float, v0: float, v1: float);
fn a_trajpoly3_pos(ctx: *const trajpoly3, x: float) -> float;
fn a_trajpoly3_vel(ctx: *const trajpoly3, x: float) -> float;
fn a_trajpoly3_acc(ctx: *const trajpoly3, x: float) -> float;
}
impl trajpoly3 {
#[inline(always)]
pub fn new(ts: float, p0: float, p1: float, v0: float, v1: float) -> Self {
let mut ctx: Self = Self {
p: [0.0; 4],
v: [0.0; 3],
a: [0.0; 2],
};
unsafe { a_trajpoly3_gen(&mut ctx, ts, p0, p1, v0, v1) };
ctx
}
#[inline(always)]
pub fn gen(&mut self, ts: float, p0: float, p1: float, v0: float, v1: float) -> &mut Self {
unsafe { a_trajpoly3_gen(self, ts, p0, p1, v0, v1) };
self
}
#[inline(always)]
pub fn pos(&mut self, x: float) -> float {
unsafe { a_trajpoly3_pos(self, x) }
}
#[inline(always)]
pub fn vel(&mut self, x: float) -> float {
unsafe { a_trajpoly3_vel(self, x) }
}
#[inline(always)]
pub fn acc(&mut self, x: float) -> float {
unsafe { a_trajpoly3_acc(self, x) }
}
}
#[repr(C)]
pub struct trajpoly5 {
pub p: [float; 6],
pub v: [float; 5],
pub a: [float; 4],
}
extern "C" {
fn a_trajpoly5_gen(
ctx: *mut trajpoly5,
ts: float,
p0: float,
p1: float,
v0: float,
v1: float,
a0: float,
a1: float,
);
fn a_trajpoly5_pos(ctx: *const trajpoly5, x: float) -> float;
fn a_trajpoly5_vel(ctx: *const trajpoly5, x: float) -> float;
fn a_trajpoly5_acc(ctx: *const trajpoly5, x: float) -> float;
}
impl trajpoly5 {
#[allow(clippy::too_many_arguments)]
#[inline(always)]
pub fn new(
ts: float,
p0: float,
p1: float,
v0: float,
v1: float,
a0: float,
a1: float,
) -> Self {
let mut ctx: Self = Self {
p: [0.0; 6],
v: [0.0; 5],
a: [0.0; 4],
};
unsafe { a_trajpoly5_gen(&mut ctx, ts, p0, p1, v0, v1, a0, a1) };
ctx
}
#[allow(clippy::too_many_arguments)]
#[inline(always)]
pub fn gen(
&mut self,
ts: float,
p0: float,
p1: float,
v0: float,
v1: float,
a0: float,
a1: float,
) -> &mut Self {
unsafe { a_trajpoly5_gen(self, ts, p0, p1, v0, v1, a0, a1) };
self
}
#[inline(always)]
pub fn pos(&mut self, x: float) -> float {
unsafe { a_trajpoly5_pos(self, x) }
}
#[inline(always)]
pub fn vel(&mut self, x: float) -> float {
unsafe { a_trajpoly5_vel(self, x) }
}
#[inline(always)]
pub fn acc(&mut self, x: float) -> float {
unsafe { a_trajpoly5_acc(self, x) }
}
}
#[repr(C)]
pub struct trajpoly7 {
pub p: [float; 8],
pub v: [float; 7],
pub a: [float; 6],
pub j: [float; 5],
}
extern "C" {
fn a_trajpoly7_gen(
ctx: *mut trajpoly7,
ts: float,
p0: float,
p1: float,
v0: float,
v1: float,
a0: float,
a1: float,
j0: float,
j1: float,
);
fn a_trajpoly7_pos(ctx: *const trajpoly7, x: float) -> float;
fn a_trajpoly7_vel(ctx: *const trajpoly7, x: float) -> float;
fn a_trajpoly7_acc(ctx: *const trajpoly7, x: float) -> float;
fn a_trajpoly7_jer(ctx: *const trajpoly7, x: float) -> float;
}
impl trajpoly7 {
#[allow(clippy::too_many_arguments)]
#[inline(always)]
pub fn new(
ts: float,
p0: float,
p1: float,
v0: float,
v1: float,
a0: float,
a1: float,
j0: float,
j1: float,
) -> Self {
let mut ctx: Self = Self {
p: [0.0; 8],
v: [0.0; 7],
a: [0.0; 6],
j: [0.0; 5],
};
unsafe { a_trajpoly7_gen(&mut ctx, ts, p0, p1, v0, v1, a0, a1, j0, j1) };
ctx
}
#[allow(clippy::too_many_arguments)]
#[inline(always)]
pub fn gen(
&mut self,
ts: float,
p0: float,
p1: float,
v0: float,
v1: float,
a0: float,
a1: float,
j0: float,
j1: float,
) -> &mut Self {
unsafe { a_trajpoly7_gen(self, ts, p0, p1, v0, v1, a0, a1, j0, j1) };
self
}
#[inline(always)]
pub fn pos(&mut self, x: float) -> float {
unsafe { a_trajpoly7_pos(self, x) }
}
#[inline(always)]
pub fn vel(&mut self, x: float) -> float {
unsafe { a_trajpoly7_vel(self, x) }
}
#[inline(always)]
pub fn acc(&mut self, x: float) -> float {
unsafe { a_trajpoly7_acc(self, x) }
}
#[inline(always)]
pub fn jer(&mut self, x: float) -> float {
unsafe { a_trajpoly7_jer(self, x) }
}
}
#[repr(C)]
pub struct trajtrap {
pub t: float,
pub p0: float,
pub p1: float,
pub v0: float,
pub v1: float,
pub vc: float,
pub ta: float,
pub td: float,
pub pa: float,
pub pd: float,
pub ac: float,
pub de: float,
}
impl Default for trajtrap {
#[inline(always)]
fn default() -> Self {
Self {
t: 0.0,
p0: 0.0,
p1: 0.0,
v0: 0.0,
v1: 0.0,
vc: 0.0,
ta: 0.0,
td: 0.0,
pa: 0.0,
pd: 0.0,
ac: 0.0,
de: 0.0,
}
}
}
extern "C" {
fn a_trajtrap_gen(
ctx: *mut trajtrap,
vm: float,
ac: float,
de: float,
p0: float,
p1: float,
v0: float,
v1: float,
) -> float;
fn a_trajtrap_pos(ctx: *const trajtrap, x: float) -> float;
fn a_trajtrap_vel(ctx: *const trajtrap, x: float) -> float;
fn a_trajtrap_acc(ctx: *const trajtrap, x: float) -> float;
}
impl trajtrap {
#[inline(always)]
pub fn new() -> Self {
Self::default()
}
#[allow(clippy::too_many_arguments)]
#[inline(always)]
pub fn gen(
&mut self,
vm: float,
ac: float,
de: float,
p0: float,
p1: float,
v0: float,
v1: float,
) -> float {
unsafe { a_trajtrap_gen(self, vm, ac, de, p0, p1, v0, v1) }
}
#[inline(always)]
pub fn pos(&mut self, x: float) -> float {
unsafe { a_trajtrap_pos(self, x) }
}
#[inline(always)]
pub fn vel(&mut self, x: float) -> float {
unsafe { a_trajtrap_vel(self, x) }
}
#[inline(always)]
pub fn acc(&mut self, x: float) -> float {
unsafe { a_trajtrap_acc(self, x) }
}
}
#[repr(C)]
pub struct version {
pub major: c_uint,
pub minor: c_uint,
pub third: c_uint,
pub extra: c_uint,
pub alpha: [u8; 4],
}
impl Default for version {
#[inline(always)]
fn default() -> Self {
Self {
major: 0,
minor: 0,
third: 0,
extra: 0,
alpha: [b'.', 0, 0, 0],
}
}
}
extern "C" {
static a_version_major: c_uint;
static a_version_minor: c_uint;
static a_version_patch: c_uint;
static a_version_tweak: u32;
fn a_version_set_alpha(ctx: *mut version, alpha: *const u8);
fn a_version_alpha(ctx: *const version, alpha: &mut [u8; 5]);
fn a_version_parse(ctx: *mut version, ver: *const u8) -> c_uint;
fn a_version_tostr(ctx: *const version, p: *mut u8, n: usize) -> c_int;
fn a_version_cmp(ctx: *const version, rhs: *const version) -> c_int;
fn a_version_lt(ctx: *const version, rhs: *const version) -> bool;
fn a_version_gt(ctx: *const version, rhs: *const version) -> bool;
fn a_version_le(ctx: *const version, rhs: *const version) -> bool;
fn a_version_ge(ctx: *const version, rhs: *const version) -> bool;
fn a_version_eq(ctx: *const version, rhs: *const version) -> bool;
fn a_version_check(major: c_uint, minor: c_uint, patch: c_uint) -> c_int;
}
impl version {
#[inline(always)]
pub fn new(major: c_uint, minor: c_uint, third: c_uint) -> Self {
Self {
major,
minor,
third,
..Default::default()
}
}
#[inline(always)]
pub fn set_alpha(&mut self, alpha: &[u8]) {
unsafe { a_version_set_alpha(self, alpha.as_ptr()) }
}
#[inline(always)]
pub fn alpha(&self, alpha: &mut [u8; 5]) {
unsafe { a_version_alpha(self, alpha) }
}
#[inline(always)]
pub fn parse(&mut self, ver: &str) -> c_uint {
unsafe { a_version_parse(self, ver.as_ptr()) }
}
#[inline(always)]
pub fn tostr(&mut self, ver: &mut [u8]) -> c_int {
unsafe { a_version_tostr(self, ver.as_mut_ptr(), ver.len()) }
}
#[inline(always)]
pub fn check(major: c_uint, minor: c_uint, patch: c_uint) -> c_int {
unsafe { a_version_check(major, minor, patch) }
}
#[inline(always)]
pub fn major() -> c_uint {
unsafe { a_version_major }
}
#[inline(always)]
pub fn minor() -> c_uint {
unsafe { a_version_minor }
}
#[inline(always)]
pub fn patch() -> c_uint {
unsafe { a_version_patch }
}
#[inline(always)]
pub fn tweak() -> u32 {
unsafe { a_version_tweak }
}
}
impl PartialOrd for version {
#[inline(always)]
fn partial_cmp(&self, other: &version) -> Option<Ordering> {
let ok: c_int = unsafe { a_version_cmp(self, other) };
if ok > 0 {
return Some(Ordering::Greater);
}
if ok < 0 {
return Some(Ordering::Less);
}
Some(Ordering::Equal)
}
#[inline(always)]
fn lt(&self, other: &version) -> bool {
unsafe { a_version_lt(self, other) }
}
#[inline(always)]
fn gt(&self, other: &version) -> bool {
unsafe { a_version_gt(self, other) }
}
#[inline(always)]
fn le(&self, other: &version) -> bool {
unsafe { a_version_le(self, other) }
}
#[inline(always)]
fn ge(&self, other: &version) -> bool {
unsafe { a_version_ge(self, other) }
}
}
impl PartialEq for version {
#[inline(always)]
fn eq(&self, other: &version) -> bool {
unsafe { a_version_eq(self, other) }
}
}