ev3dev_rs/pupdevices/
gyro_sensor.rs1use crate::{
2 attribute::AttributeName,
3 error::Ev3Result,
4 parameters::SensorPort,
5 sensor_driver::{SensorDriver, SensorMode::*, SensorType},
6};
7
8pub struct GyroSensor {
24 driver: SensorDriver,
25}
26
27impl GyroSensor {
28 pub fn new(port: SensorPort) -> Ev3Result<Self> {
33 let driver = SensorDriver::new(SensorType::Gyro, port)?;
34 Ok(Self { driver })
35 }
36
37 pub fn heading(&self) -> Ev3Result<i16> {
39 match self.driver.mode.get() {
40 GyroAngle | GyroAngleAndRate => {
41 Ok(self.driver.read_attribute(AttributeName::Value0)?.parse()?)
42 }
43 _ => {
44 self.driver.set_mode(GyroAngleAndRate)?;
45 Ok(self.driver.read_attribute(AttributeName::Value0)?.parse()?)
46 }
47 }
48 }
49
50 pub fn angular_velocity(&self) -> Ev3Result<i16> {
52 match self.driver.mode.get() {
53 GyroRate => Ok(self.driver.read_attribute(AttributeName::Value0)?.parse()?),
54 GyroAngleAndRate => Ok(self.driver.read_attribute(AttributeName::Value1)?.parse()?),
55 _ => {
56 self.driver.set_mode(GyroAngleAndRate)?;
57 Ok(self.driver.read_attribute(AttributeName::Value1)?.parse()?)
58 }
59 }
60 }
61
62 pub fn heading_and_velocity(&self) -> Ev3Result<(i16, i16)> {
75 if self.driver.mode.get() != GyroAngleAndRate {
76 self.driver.set_mode(GyroAngleAndRate)?;
77 }
78
79 let heading = self.driver.read_attribute(AttributeName::Value0)?.parse()?;
80 let velocity = self.driver.read_attribute(AttributeName::Value1)?.parse()?;
81
82 Ok((heading, velocity))
83 }
84
85 pub fn tilt(&self) -> Ev3Result<i16> {
87 if self.driver.mode.get() != GyroTiltAngle {
88 self.driver.set_mode(GyroTiltAngle)?;
89 }
90
91 Ok(self.driver.read_attribute(AttributeName::Value0)?.parse()?)
92 }
93
94 pub fn tilt_velocity(&self) -> Ev3Result<i16> {
96 if self.driver.mode.get() != GyroTiltRate {
97 self.driver.set_mode(GyroTiltRate)?;
98 }
99
100 Ok(self.driver.read_attribute(AttributeName::Value0)?.parse()?)
101 }
102}