ni_syscfg/
resources.rs

1use std::marker::PhantomData;
2
3use crate::error::{api_status, NiSysCfgApiStatus, Result};
4use crate::handles::close_handle;
5use crate::parameters::{BusType, ReadableParameter};
6use crate::session::Session;
7use ni_syscfg_sys::*;
8
9/// The hardware resource list is an iterator provided by [crate::Session::find_hardware].
10///
11/// Iterate through it to access [HardwareResource].
12pub struct HardwareResourceList<'a> {
13    handle: NISysCfgEnumResourceHandle,
14    session: &'a Session,
15}
16
17impl<'a> Drop for HardwareResourceList<'a> {
18    fn drop(&mut self) {
19        //ignore result in drop.
20        let _ = close_handle(self.handle);
21    }
22}
23
24impl<'a> HardwareResourceList<'a> {
25    pub fn from_handle(handle: NISysCfgEnumResourceHandle, session: &'a Session) -> Self {
26        Self { handle, session }
27    }
28}
29
30impl<'a> Iterator for HardwareResourceList<'a> {
31    type Item = HardwareResource;
32
33    fn next(&mut self) -> Option<Self::Item> {
34        unsafe {
35            let mut resource_handle = std::ptr::null_mut();
36            let result = api_status(NISysCfgNextResource(
37                *self.session.handle(),
38                self.handle,
39                &mut resource_handle,
40            ));
41
42            match result {
43                Ok(NiSysCfgApiStatus::EndOfEnum) => None,
44                Ok(_) => Some(HardwareResource::from_handle(resource_handle)),
45                Err(_) => None,
46            }
47        }
48    }
49}
50
51pub struct HardwareResource {
52    handle: NISysCfgResourceHandle,
53}
54
55pub struct ResourceParameter<T: ReadableParameter> {
56    id: i32,
57    phantom: PhantomData<T>,
58}
59impl HardwareResource {
60    pub fn from_handle(handle: NISysCfgResourceHandle) -> Self {
61        Self { handle }
62    }
63
64    pub fn name(&self) -> Result<String> {
65        String::read_resource_indexed_parameter(
66            self.handle,
67            NISysCfgIndexedProperty_NISysCfgIndexedPropertyExpertUserAlias,
68            0,
69        )
70    }
71
72    pub fn get_parameter<T: ReadableParameter>(
73        &self,
74        parameter: ResourceParameter<T>,
75    ) -> Result<T> {
76        T::read_resource_parameter(self.handle, parameter.id)
77    }
78
79    //Specific parameters follow.
80    pub fn connects_to_bus_type(&self) -> Result<BusType> {
81        BusType::read_resource_parameter(
82            self.handle,
83            NISysCfgResourceProperty_NISysCfgResourcePropertyConnectsToBusType,
84        )
85    }
86}
87
88impl Drop for HardwareResource {
89    fn drop(&mut self) {
90        //ignore result in drop.
91        let _ = close_handle(self.handle);
92    }
93}