ev3dev_lang_rust/sensors/
gyro_sensor.rs1use super::{Sensor, SensorPort};
4use crate::{sensor_mode, Attribute, Device, Driver, Ev3Error, Ev3Result};
5
6#[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 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 }),
84 }
85 }
86
87 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 }),
98 }
99 }
100}