use std::ffi::c_int; use fl2k_ampliphase::{fl2k_dev_t, fl2k_get_device_count, fl2k_open, fl2k_close}; enum FL2KError { InvalidParam, NoDevice, NotFound, Busy, Timeout, NoMem, Unknown(c_int) } fn handle_return_value(val : c_int) -> Result<(), FL2KError> { match val { #![allow(non_snake_case)] fl2k_error_FL2K_SUCCESS => Ok(()), fl2k_error_FL2K_TRUE => Ok(()), fl2k_error_FL2K_ERROR_INVALID_PARAM => Err(FL2KError::InvalidParam), fl2k_error_FL2K_ERROR_NO_DEVICE => Err(FL2KError::NoDevice), fl2k_error_FL2K_ERROR_NOT_FOUND => Err(FL2KError::NotFound), fl2k_error_FL2K_ERROR_BUSY => Err(FL2KError::Busy), fl2k_error_FL2K_ERROR_TIMEOUT => Err(FL2KError::Timeout), fl2k_error_FL2K_ERROR_NO_MEM => Err(FL2KError::NoMem), v => Err(FL2KError::Unknown(v)), } } pub fn get_device_count() -> u32 { unsafe { fl2k_get_device_count() } } struct FL2K { device : *mut fl2k_dev_t, } impl FL2K { pub fn open(device_index : u32) -> Result { unsafe { let mut fl2k = FL2K { device: std::mem::zeroed() }; handle_return_value(fl2k_open(&mut fl2k.device, device_index))?; Ok(fl2k) } } pub fn close(self) -> Result<(), FL2KError> { unsafe { handle_return_value(fl2k_close(self.device))?; } Ok(()) } }