drone_controller/src/lib.rs

116 lines
2.5 KiB
Rust
Raw Normal View History

2026-03-15 23:42:55 +00:00
use nalgebra::{self as na, Quaternion, Unit};
pub mod config;
pub mod controller;
pub mod input;
pub mod stacked;
pub use config::*;
pub use controller::*;
pub use input::*;
pub use stacked::*;
#[unsafe(no_mangle)]
pub extern "C" fn create(c: config::ControllerConfig) -> *mut StackedController {
return Box::into_raw(Box::new(StackedController::new(c)));
}
#[unsafe(no_mangle)]
2026-03-16 01:00:31 +00:00
pub unsafe extern "C" fn destroy(ptr: *mut StackedController) {
2026-03-15 23:42:55 +00:00
assert!(!ptr.is_null());
let _x = unsafe { Box::from_raw(ptr) };
}
#[repr(C)]
pub struct MotorThrottles {
pub values: [f32; 4],
}
#[repr(C)]
pub struct Vec3C {
pub x: f32,
pub y: f32,
pub z: f32,
}
impl Into<na::Vector3<f32>> for Vec3C {
fn into(self) -> na::Vector3<f32> {
na::vector![self.x, self.y, self.z]
}
}
#[unsafe(no_mangle)]
pub extern "C" fn get_throttles(ptr: *mut StackedController) -> MotorThrottles {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
return MotorThrottles {
values: controller.get_motor_throttles(),
};
}
#[unsafe(no_mangle)]
pub extern "C" fn set_cur_time(ptr: *mut StackedController, time: f32) {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
controller.set_time(time);
}
#[unsafe(no_mangle)]
pub extern "C" fn set_input(ptr: *mut StackedController, inp: Input) {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
controller.set_input(inp);
}
#[unsafe(no_mangle)]
pub extern "C" fn set_cur_rot(ptr: *mut StackedController, parts: Vec3C, scalar: f32) {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
let quat: na::UnitQuaternion<f32> =
na::UnitQuaternion::from_quaternion(Quaternion::from_parts(scalar, parts.into()));
controller.set_rotation(quat);
}
#[unsafe(no_mangle)]
pub extern "C" fn set_cur_angvel(ptr: *mut StackedController, angvel: Vec3C) {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
controller.set_angular_velocity(angvel.into());
}
#[unsafe(no_mangle)]
pub extern "C" fn set_cur_linvel(ptr: *mut StackedController, vel: Vec3C) {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
controller.set_linvel(vel.into());
}
#[unsafe(no_mangle)]
pub extern "C" fn set_cur_pos(ptr: *mut StackedController, pos: Vec3C) {
let controller = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
controller.set_pos(pos.into());
}