aboutsummaryrefslogtreecommitdiffstats
path: root/src/fl2k.rs
blob: 7bade50281727d77a2f990de5d0cba08f33f2c74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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<Self, FL2KError> {
        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(())
    }
}