forked from jerry73204/realsense-rust
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoptions.rs
141 lines (128 loc) · 4.21 KB
/
options.rs
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//! Extension trait for runtime configuration.
use crate::{
common::*,
error::{ErrorChecker, Result},
kind::Rs2Option,
};
/// The extension trait extracts runtime configuration from implemented type.
pub trait ToOptions {
fn to_options(&self) -> Result<HashMap<Rs2Option, OptionHandle>> {
let options_ptr = self.options_ptr();
unsafe {
let list_ptr = {
let mut checker = ErrorChecker::new();
let list_ptr =
sys::rs2_get_options_list(options_ptr.as_ptr(), checker.inner_mut_ptr());
checker.check()?;
list_ptr
};
let len = {
let mut checker = ErrorChecker::new();
let len = sys::rs2_get_options_list_size(list_ptr, checker.inner_mut_ptr());
checker.check()?;
len
};
let handles = (0..len)
.map(|index| {
let mut checker = ErrorChecker::new();
let val =
sys::rs2_get_option_from_list(list_ptr, index, checker.inner_mut_ptr());
checker.check()?;
let option = Rs2Option::from_u32(val).unwrap();
let handle = OptionHandle {
ptr: options_ptr,
option,
};
Result::Ok((option, handle))
})
.collect::<Result<HashMap<_, _>>>()?;
Ok(handles)
}
}
fn options_ptr(&self) -> NonNull<sys::rs2_options>;
}
/// A handle pointing to the option value.
#[derive(Debug, Clone)]
pub struct OptionHandle {
ptr: NonNull<sys::rs2_options>,
option: Rs2Option,
}
impl OptionHandle {
pub fn value(&self) -> Result<f32> {
unsafe {
let mut checker = ErrorChecker::new();
let val = sys::rs2_get_option(
self.ptr.as_ptr(),
self.option as sys::rs2_option,
checker.inner_mut_ptr(),
);
checker.check()?;
Ok(val)
}
}
pub fn set_value(&self, value: f32) -> Result<()> {
unsafe {
let mut checker = ErrorChecker::new();
sys::rs2_set_option(
self.ptr.as_ptr(),
self.option as sys::rs2_option,
value,
checker.inner_mut_ptr(),
);
checker.check()?;
Ok(())
}
}
pub fn is_read_only(&self) -> Result<bool> {
unsafe {
let mut checker = ErrorChecker::new();
let val = sys::rs2_is_option_read_only(
self.ptr.as_ptr(),
self.option as sys::rs2_option,
checker.inner_mut_ptr(),
);
checker.check()?;
Ok(val != 0)
}
}
pub fn name<'a>(&'a self) -> Result<&'a str> {
unsafe {
let mut checker = ErrorChecker::new();
let ptr = sys::rs2_get_option_name(
self.ptr.as_ptr(),
self.option as sys::rs2_option,
checker.inner_mut_ptr(),
);
checker.check()?;
let desc = CStr::from_ptr(ptr).to_str().unwrap();
Ok(desc)
}
}
pub fn option_description<'a>(&'a self) -> Result<&'a str> {
unsafe {
let mut checker = ErrorChecker::new();
let ptr = sys::rs2_get_option_description(
self.ptr.as_ptr(),
self.option as sys::rs2_option,
checker.inner_mut_ptr(),
);
checker.check()?;
let desc = CStr::from_ptr(ptr).to_str().unwrap();
Ok(desc)
}
}
pub fn value_description<'a>(&'a self, value: f32) -> Result<&'a str> {
unsafe {
let mut checker = ErrorChecker::new();
let ptr = sys::rs2_get_option_value_description(
self.ptr.as_ptr(),
self.option as sys::rs2_option,
value,
checker.inner_mut_ptr(),
);
checker.check()?;
let desc = CStr::from_ptr(ptr).to_str().unwrap();
Ok(desc)
}
}
}