ev3dev_lang_rust/sensors/
gyro_sensor.rs

1//! LEGO EV3 gyro sensor.
2
3use super::{Sensor, SensorPort};
4use crate::{sensor_mode, Attribute, Device, Driver, Ev3Error, Ev3Result};
5
6/// LEGO EV3 gyro sensor.
7#[derive(Debug, Clone, Device, Sensor)]
8pub struct GyroSensor {
9    driver: Driver,
10}
11
12impl GyroSensor {
13    fn new(driver: Driver) -> Self {
14        Self { driver }
15    }
16
17    findable!(
18        "lego-sensor",
19        ["lego-ev3-gyro"],
20        SensorPort,
21        "GyroSensor",
22        "in"
23    );
24    sensor_mode!(
25        "GYRO-ANG",
26        MODE_GYRO_ANG,
27        "Angle",
28        set_mode_gyro_ang,
29        is_mode_gyro_ang
30    );
31    sensor_mode!(
32        "GYRO-RATE",
33        MODE_GYRO_RATE,
34        "Rotational Speed",
35        set_mode_gyro_rate,
36        is_mode_gyro_rate
37    );
38    sensor_mode!(
39        "GYRO-FAS",
40        MODE_GYRO_FAS,
41        "Raw sensor value ???",
42        set_mode_gyro_fas,
43        is_mode_gyro_fas
44    );
45    sensor_mode!(
46        "GYRO-G&A",
47        MODE_GYRO_G_AND_A,
48        "Angle and Rotational Speed",
49        set_mode_gyro_g_and_a,
50        is_mode_gyro_g_and_a
51    );
52    sensor_mode!(
53        "GYRO-CAL",
54        MODE_GYRO_CAL,
55        "Calibration ???",
56        set_mode_gyro_cal,
57        is_mode_gyro_cal
58    );
59    sensor_mode!(
60        "TILT-RATE",
61        MODE_TILT_RATE,
62        "Rotational Speed (2nd axis)",
63        set_mode_tilt_rate,
64        is_mode_tilt_rate
65    );
66    sensor_mode!(
67        "TILT-ANG",
68        MODE_TILT_ANG,
69        "Angle (2nd axis)",
70        set_mode_tilt_ang,
71        is_mode_tilt_ang
72    );
73
74    /// Gets the angle, ranging from -32768 to 32767
75    /// Fails if it has been set in the wrong mode
76    pub fn get_angle(&self) -> Ev3Result<i32> {
77        match self.get_mode()?.as_ref() {
78            GyroSensor::MODE_GYRO_G_AND_A => self.get_value0(),
79            GyroSensor::MODE_GYRO_ANG => self.get_value0(),
80            mode => Ev3Result::Err(Ev3Error::InternalError {
81                msg: format!("Cannot get angle while in {mode} mode"),
82                // Returns error
83            }),
84        }
85    }
86
87    /// Gets the rotational speed value, ranging from -440 to 440
88    /// Fails is it has been set in the wrong mode:
89    /// for example, fails if we ask for rotational speed while in MODE_GYRO_ANG mode
90    pub fn get_rotational_speed(&self) -> Ev3Result<i32> {
91        match self.get_mode()?.as_ref() {
92            GyroSensor::MODE_GYRO_RATE => self.get_value0(),
93            GyroSensor::MODE_GYRO_G_AND_A => self.get_value1(),
94            mode => Ev3Result::Err(Ev3Error::InternalError {
95                msg: format!("Cannot get rotational speed while in {mode} mode"),
96                // Returns error
97            }),
98        }
99    }
100}