1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use crate::{AllChannelMeasurement, BitFlags, Error, Register, Tcs3472, DEVICE_ADDRESS};
use embedded_hal::blocking::i2c;
impl<I2C, E> Tcs3472<I2C>
where
I2C: i2c::WriteRead<Error = E>,
{
#[allow(clippy::wrong_self_convention)]
pub fn is_rgbc_status_valid(&mut self) -> Result<bool, Error<E>> {
let status = self.read_register(Register::STATUS)?;
Ok((status & BitFlags::RGBC_VALID) != 0)
}
pub fn read_clear_channel(&mut self) -> Result<u16, Error<E>> {
self.read_channel(Register::CDATA)
}
pub fn read_red_channel(&mut self) -> Result<u16, Error<E>> {
self.read_channel(Register::RDATA)
}
pub fn read_green_channel(&mut self) -> Result<u16, Error<E>> {
self.read_channel(Register::GDATA)
}
pub fn read_blue_channel(&mut self) -> Result<u16, Error<E>> {
self.read_channel(Register::BDATA)
}
fn read_channel(&mut self, first_register: u8) -> Result<u16, Error<E>> {
let mut cdata = [0; 2];
self.read_registers(first_register, &mut cdata)?;
Ok((u16::from(cdata[1])) << 8 | u16::from(cdata[0]))
}
pub fn read_all_channels(&mut self) -> Result<AllChannelMeasurement, Error<E>> {
let mut data = [0; 8];
self.read_registers(Register::CDATA, &mut data)?;
Ok(AllChannelMeasurement {
clear: u16::from(data[1]) << 8 | u16::from(data[0]),
red: u16::from(data[3]) << 8 | u16::from(data[2]),
green: u16::from(data[5]) << 8 | u16::from(data[4]),
blue: u16::from(data[7]) << 8 | u16::from(data[6]),
})
}
pub fn read_device_id(&mut self) -> Result<u8, Error<E>> {
self.read_register(Register::ID)
}
fn read_register(&mut self, register: u8) -> Result<u8, Error<E>> {
let command = BitFlags::CMD | register;
let mut data = [0];
self.i2c
.write_read(DEVICE_ADDRESS, &[command], &mut data)
.map_err(Error::I2C)?;
Ok(data[0])
}
fn read_registers(&mut self, first_register: u8, mut data: &mut [u8]) -> Result<(), Error<E>> {
let command = BitFlags::CMD | BitFlags::CMD_AUTO_INC | first_register;
self.i2c
.write_read(DEVICE_ADDRESS, &[command], &mut data)
.map_err(Error::I2C)
}
}