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() } }; }