dwf 0.2.2

Digilent WaveForms library Rust wrapper
Documentation
use crate::analog::analog_in::AnalogIn;
use crate::device_info::{DeviceId, DeviceInfo};
use crate::dwf;
use crate::{check_call, Result};
use std::ffi::c_int;

use std::mem;

pub struct Device {
    handle: dwf::HDWF,
}

impl Device {
    pub fn open(index: i32) -> Result<Device> {
        unsafe {
            let mut handle = mem::MaybeUninit::uninit();
            check_call(dwf::FDwfDeviceOpen(index as c_int, handle.as_mut_ptr()))?;
            let handle = handle.assume_init();

            Ok(Device { handle })
        }
    }

    pub fn reset(&self) -> Result<()> {
        unsafe {
            check_call(dwf::FDwfDeviceReset(self.handle as dwf::HDWF))?;
        }
        Ok(())
    }

    pub fn get_handle(&self) -> dwf::HDWF {
        self.handle
    }

    pub fn analog_in(&self) -> AnalogIn {
        AnalogIn::new(self)
    }
}

impl Default for Device {
    fn default() -> Self {
        Device::open(-1).unwrap()
    }
}

impl Drop for Device {
    fn drop(&mut self) {
        unsafe {
            check_call(dwf::FDwfDeviceClose(self.handle as c_int)).unwrap();
        }
    }
}

impl DeviceId for Device {
    fn get_device_id(&self) -> c_int {
        self.handle - 1
    }
}

impl DeviceInfo for Device {}