ev3dev_lang_rust/sensors/
light_sensor.rs1use super::{Sensor, SensorPort};
4use crate::{sensor_mode, Attribute, Device, Driver, Ev3Error, Ev3Result};
5use std::cell::Cell;
6
7#[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 pub fn get_light_intensity(&self) -> Ev3Result<i32> {
49 self.get_value0()
50 }
51
52 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 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}