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
9pub struct HardwareResourceList<'a> {
13 handle: NISysCfgEnumResourceHandle,
14 session: &'a Session,
15}
16
17impl<'a> Drop for HardwareResourceList<'a> {
18 fn drop(&mut self) {
19 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 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 let _ = close_handle(self.handle);
92 }
93}