use linuxcnc_hal_sys::*;
use signal_hook::iterator::Signals;
use std::alloc::{alloc, GlobalAlloc, Layout};
use std::ptr::null_mut;
use std::{convert::TryInto, ffi::c_void, os::raw::c_long};
use std::{ffi::CString, mem, thread, time::Duration};
static mut COMP_ID: i32 = 0;
#[repr(C)]
#[derive(Debug)]
struct TestArgs {
foo: u32,
bar: bool,
arr: [u8; 5],
}
#[no_mangle]
pub unsafe extern "C" fn rtapi_app_main() -> i32 {
println!("HELLO FROM RUST");
rtapi_logger::init().unwrap();
let name = CString::new("rttest").unwrap();
let id = hal_init(name.as_ptr().cast());
log::info!("Component ID {}", id);
COMP_ID = id;
let export_result = {
let ptr_size = mem::size_of::<TestArgs>().try_into().unwrap();
let arg = hal_malloc(ptr_size) as *mut TestArgs;
*arg = TestArgs {
foo: 1234,
bar: true,
arr: [10, 11, 12, 13, 14],
};
let arg_ptr = arg as *mut c_void;
let fn_name = CString::new("rttest.rtapi-fn").unwrap();
hal_export_funct(
fn_name.as_ptr().cast(),
Some(test_fn),
arg_ptr,
true as i32,
false as i32,
COMP_ID,
)
};
if export_result != 0 {
eprintln!("Failed to export fn {}", export_result);
return export_result;
}
let storage = hal_malloc(mem::size_of::<*mut f64>().try_into().unwrap()) as *mut *mut f64;
let pin_name = CString::new("pins.input-1").unwrap();
let ret = hal_pin_float_new(pin_name.as_ptr().cast(), hal_pin_dir_t_HAL_IN, storage, id);
let ret = hal_ready(id);
log::info!("Component ID {} is ready: {}", COMP_ID, ret);
ret
}
#[no_mangle]
pub unsafe extern "C" fn test_fn(arg: *mut c_void, period: c_long) {
let arg: &mut TestArgs = &mut *(arg as *mut TestArgs);
let period: i64 = period.into();
log::debug!("Test fn {:?}, {}", arg, period);
}
#[no_mangle]
pub unsafe extern "C" fn rtapi_app_exit() -> i32 {
println!("Exiting...");
let code = hal_exit(COMP_ID);
log::debug!("Exit code {}", code);
code
}