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
//! Common utility functions for sensors.
/// Common utility functions for sensors.
#[macro_export]
macro_rules! sensor {
() => {
/// Reading the file will give the unscaled raw values in the `value<N>` attributes.
/// Use `bin_data_format`, `num_values` and the individual sensor documentation to determine how to interpret the data.
pub fn get_bin_data(&self) -> Ev3Result<String> {
self.get_attribute("bin_data").get()
}
/// Returns the format of the values in `bin_data` for the current mode. Possible values are:
// * u8: Unsigned 8-bit integer (byte)
// * s8: Signed 8-bit integer (sbyte)
// * u16: Unsigned 16-bit integer (ushort)
// * s16: Signed 16-bit integer (short)
// * s16_be: Signed 16-bit integer, big endian
// * s32: Signed 32-bit integer (int)
// * s32_be: Signed 32-bit integer, big endian
// * float: IEEE 754 32-bit floating point (float)
pub fn get_bin_data_format(&self) -> Ev3Result<String> {
self.get_attribute("bin_data_format").get()
}
/// Returns the number of decimal places for the values in the `value<N>` attributes of the current mode.
pub fn get_decimals(&self) -> Ev3Result<i32> {
self.get_attribute("decimals").get()
}
/// Returns the firmware version of the sensor if available.
/// Currently only NXT/I2C sensors support this.
pub fn get_fw_version(&self) -> Ev3Result<String> {
self.get_attribute("fw_version").get()
}
/// Returns the current mode.
/// See the individual sensor documentation for a description of the modes available for each type of sensor.
pub fn get_mode(&self) -> Ev3Result<String> {
self.get_attribute("mode").get()
}
/// Sets the sensor to that mode.
/// See the individual sensor documentation for a description of the modes available for each type of sensor.
pub fn set_mode(&self, mode: &str) -> Ev3Result<()> {
self.get_attribute("mode").set_str_slice(mode)
}
/// Returns a list of the valid modes for the sensor.
pub fn get_modes(&self) -> Ev3Result<Vec<String>> {
self.get_attribute("modes").get_vec()
}
/// Returns the number of `value<N>` attributes that will return a valid value for the current mode.
pub fn get_num_values(&self) -> Ev3Result<i32> {
self.get_attribute("num_values").get()
}
/// Returns the polling period of the sensor in milliseconds.
/// Returns `-EOPNOTSUPP` if changing polling is not supported.
/// Note: Setting poll_ms too high can cause the input port autodetection to fail.
/// If this happens, use the mode attribute of the port to force the port to `nxt-i2c mode`. Values must not be negative.
pub fn get_poll_ms(&self) -> Ev3Result<i32> {
self.get_attribute("poll_ms").get()
}
/// Sets the polling period of the sensor in milliseconds.
/// Setting to 0 disables polling.
/// Note: Setting poll_ms too high can cause the input port autodetection to fail.
/// If this happens, use the mode attribute of the port to force the port to `nxt-i2c mode`. Values must not be negative.
pub fn set_poll_ms(&self, poll_ms: i32) -> Ev3Result<()> {
self.get_attribute("poll_ms").set(poll_ms)
}
/// Returns the units of the measured value for the current mode. May return empty string if units are unknown.
pub fn get_units(&self) -> Ev3Result<String> {
self.get_attribute("units").get()
}
/// Returns the current `value0` value if available.
pub fn get_value0(&self) -> Ev3Result<i32> {
self.get_attribute("value0").get()
}
/// Returns the current `value1` value if available.
pub fn get_value1(&self) -> Ev3Result<i32> {
self.get_attribute("value1").get()
}
/// Returns the current `value2` value if available.
pub fn get_value2(&self) -> Ev3Result<i32> {
self.get_attribute("value2").get()
}
/// Returns the current `value3` value if available.
pub fn get_value3(&self) -> Ev3Result<i32> {
self.get_attribute("value3").get()
}
/// Returns the current `value4` value if available.
pub fn get_value4(&self) -> Ev3Result<i32> {
self.get_attribute("value4").get()
}
/// Returns the current `value5` value if available.
pub fn get_value5(&self) -> Ev3Result<i32> {
self.get_attribute("value5").get()
}
/// Returns the current `value6` value if available.
pub fn get_value6(&self) -> Ev3Result<i32> {
self.get_attribute("value6").get()
}
/// Returns the current `value7` value if available.
pub fn get_value7(&self) -> Ev3Result<i32> {
self.get_attribute("value7").get()
}
/// Returns a space delimited string representing sensor-specific text values. Returns `-EOPNOTSUPP` if a sensor does not support text values.
pub fn get_text_value(&self) -> Ev3Result<String> {
self.get_attribute("text_value").get()
}
};
}