ev3dev_lang_rust/sensors/
light_sensor.rs

1//! LEGO EV3 light sensor.
2
3use super::{Sensor, SensorPort};
4use crate::{sensor_mode, Attribute, Device, Driver, Ev3Error, Ev3Result};
5use std::cell::Cell;
6
7/// LEGO EV3 light sensor.
8#[derive(Debug, Clone, Device, Sensor)]
9pub struct LightSensor {
10    driver: Driver,
11    reflect_scale: Cell<Option<f32>>,
12    ambient_scale: Cell<Option<f32>>,
13}
14
15impl LightSensor {
16    fn new(driver: Driver) -> Self {
17        Self {
18            driver,
19            reflect_scale: Cell::new(None),
20            ambient_scale: Cell::new(None),
21        }
22    }
23
24    findable!(
25        "lego-sensor",
26        ["lego-nxt-light"],
27        SensorPort,
28        "LightSensor",
29        "in"
30    );
31
32    sensor_mode!(
33        "REFLECT",
34        MODE_REFLECT,
35        "Reflected light. LED on",
36        set_mode_reflect,
37        is_mode_reflect
38    );
39    sensor_mode!(
40        "AMBIENT",
41        MODE_AMBIENT,
42        "Ambient light. LED off",
43        set_mode_ambient,
44        is_mode_ambient
45    );
46
47    /// A measurement of the light intensity, unscaled.
48    pub fn get_light_intensity(&self) -> Ev3Result<i32> {
49        self.get_value0()
50    }
51
52    /// A measurement of the reflected light intensity, as a percentage.
53    pub fn get_reflected_light_intensity(&self) -> Ev3Result<f32> {
54        let scale_field = self.reflect_scale.get();
55        let scale = match scale_field {
56            Some(s) => s,
57            None => {
58                let decimals = self.get_decimals()?;
59                let s = 10f32.powi(-decimals);
60                self.reflect_scale.set(Some(s));
61                s
62            }
63        };
64
65        Ok((self.get_value0()? as f32) * scale)
66    }
67
68    /// A measurement of the ambient light intensity, as a percentage.
69    pub fn get_ambient_light_intensity(&self) -> Ev3Result<f32> {
70        let scale_field = self.ambient_scale.get();
71        let scale = match scale_field {
72            Some(s) => s,
73            None => {
74                let decimals = self.get_decimals()?;
75                let s = 10f32.powi(-decimals);
76                self.ambient_scale.set(Some(s));
77                s
78            }
79        };
80
81        Ok((self.get_value0()? as f32) * scale)
82    }
83}