linuxcnc-hal-sys 0.3.0

Generated, unsafe Rust bindings to the LinuxCNC HAL submodule
Documentation
//! Error handling example

use linuxcnc_hal_sys::*;
use signal_hook::iterator::Signals;
use std::convert::TryInto;
use std::{ffi::CString, mem, thread, time::Duration};

fn main() {
    unsafe {
        let name = CString::new("pins").unwrap();

        let ret = hal_init(name.as_ptr().cast());

        // Check that component was created successfully
        let component_id = match ret {
            x if x == -(EINVAL as i32) => panic!("Failed to initialise component"),
            x if x == -(ENOMEM as i32) => panic!("Not enough memory to initialise component"),
            id if id > 0 => id,
            code => unreachable!("Hit unreachable error code {}", code),
        };

        println!("Component registered with ID {}", component_id);

        let mut signals =
            Signals::new(&[signal_hook::consts::SIGTERM, signal_hook::consts::SIGINT]).unwrap();

        let storage = hal_malloc(mem::size_of::<*mut f64>().try_into().unwrap()) as *mut *mut f64;

        if storage.is_null() {
            panic!("Failed to allocate storage");
        }

        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,
            component_id,
        );

        // Check that pin was registered successfully
        match ret {
            0 => println!("Pin registered successfully"),
            x if x == -(EINVAL as i32) => panic!("Failed to register pin"),
            x if x == -(EPERM as i32) => {
                panic!("HAL is locked. Register pins before calling hal_ready()`")
            }
            x if x == -(ENOMEM as i32) => panic!("Failed to register pin"),
            code => unreachable!("Hit unreachable error code {}", code),
        }

        let ret = hal_ready(component_id);

        // Check that component is ready
        match ret {
            0 => println!("Component is ready"),
            x if x == -(EINVAL as i32) => panic!("HAL component was not found or is already ready"),
            code => unreachable!("Hit unreachable error code {}", code),
        }

        while !signals.pending().any(|signal| match signal {
            signal_hook::consts::SIGTERM
            | signal_hook::consts::SIGINT
            | signal_hook::consts::SIGKILL => true,
            _ => false,
        }) {
            println!("Input {:?}", **storage);

            thread::sleep(Duration::from_millis(500));
        }
    }
}