1use crate::register_access::sps30::{DEV_ADDR, Register, StatusRegisterBits};
2use crate::Sps30;
3use crate::types::{AirInfo, Error, StatusRegisterResult};
4use byteorder::{BigEndian, ByteOrder};
5use embedded_hal::blocking::{delay, i2c};
6
7impl<I2C, D, E> Sps30<I2C, D>
8where I2C: i2c::Read<Error = E> + i2c::Write<Error = E>,
9D: delay::DelayMs<u8> {
10 pub fn new_sps30(i2c: I2C, delay: D) -> Self {
12 Sps30 {
13 i2c,
14 delay,
15 address: DEV_ADDR,
16 }
17 }
18
19 pub fn destroy(self) -> I2C {
21 self.i2c
22 }
23
24 pub fn start_measurement(&mut self) -> Result<(), Error<E>> {
27 let mut data: [u8; 5] = [0; 5];
28 data[..2].clone_from_slice(&Register::START_MEASUREMENT[..2]);
29 data[2] = 0x03;
30
31 self.write_data(&mut data)?;
32 self.delay.delay_ms(20);
33
34 Ok(())
35 }
36
37 pub fn stop_measurement(&mut self) -> Result<(), Error<E>> {
40 let mut data: [u8; 2] = Register::STOP_MEASUREMENT;
41
42 self.write_data(&mut data)?;
43 self.delay.delay_ms(20);
44
45 Ok(())
46 }
47
48 pub fn read_data_ready_flag(&mut self) -> Result<bool, Error<E>> {
51 let mut data: [u8; 2] = Register::READ_DATA_READY_FLAG;
52 self.write_data(&mut data)?;
53
54 let mut buffer: [u8; 3] = [0; 3];
55 self.read_data(&mut buffer)?;
56
57 if buffer[1] == 0 {
58 Ok(false)
59 } else {
60 Ok(true)
61 }
62 }
63
64 pub fn read_measured_values(&mut self) -> Result<AirInfo, Error<E>> {
67 let mut data: [u8; 2] = Register::READ_MEASURED_VALUES;
68 self.write_data(&mut data)?;
69
70 let mut buffer: [u8; 60] = [0; 60];
71 self.read_data(&mut buffer)?;
72
73 let air_info: AirInfo = AirInfo {
74 mass_pm1_0: BigEndian::read_f32(&buffer[0..]),
75 mass_pm2_5: BigEndian::read_f32(&buffer[4..]),
76 mass_pm4_0: BigEndian::read_f32(&buffer[4 * 2..]),
77 mass_pm10: BigEndian::read_f32(&buffer[4 * 3..]),
78 number_pm0_5: BigEndian::read_f32(&buffer[4 * 4..]),
79 number_pm1_0: BigEndian::read_f32(&buffer[4 * 5..]),
80 number_pm2_5: BigEndian::read_f32(&buffer[4 * 6..]),
81 number_pm4_0: BigEndian::read_f32(&buffer[4 * 7..]),
82 number_pm10: BigEndian::read_f32(&buffer[4 * 8..]),
83 typical_size: BigEndian::read_f32(&buffer[4 * 9..]),
84 };
85
86 Ok(air_info)
87 }
88
89 pub fn sleep(&mut self) -> Result<(), Error<E>> {
92 let mut data: [u8; 2] = Register::SLEEP;
93
94 self.write_data(&mut data)?;
95 self.delay.delay_ms(5);
96
97 Ok(())
98 }
99
100 pub fn wake_up(&mut self) -> Result<(), Error<E>> {
103 let mut data: [u8; 2] = Register::WAKE_UP;
104
105 self.write_data(&mut [])?;
106 self.write_data(&mut data)?;
107 self.delay.delay_ms(5);
108
109 Ok(())
110 }
111
112 pub fn start_fan_cleaning(&mut self) -> Result<(), Error<E>> {
116 let mut data: [u8; 2] = Register::START_FAN_CLEANING;
117
118 self.write_data(&mut data)?;
119 self.delay.delay_ms(5);
120
121 Ok(())
122 }
123
124 pub fn read_auto_cleaning_interval(&mut self) -> Result<u32, Error<E>> {
127 let mut data: [u8; 2] = Register::READ_WRITE_AUTO_CLEANING_INTERVAL;
128
129 self.write_data(&mut data)?;
130 self.delay.delay_ms(5);
131
132 let mut buffer: [u8; 6] = [0; 6];
133 self.read_data(&mut buffer)?;
134
135 Ok(BigEndian::read_u32(&buffer))
136 }
137
138 pub fn write_auto_cleaning_interval(&mut self, n: u32) -> Result<(), Error<E>> {
141 let mut data: [u8; 8] = [0; 8];
142 data[..2].clone_from_slice(&Register::READ_WRITE_AUTO_CLEANING_INTERVAL[..2]);
143 BigEndian::write_u32(&mut data[2..], n);
144
145 self.write_data(&mut data)?;
146 self.delay.delay_ms(20);
147
148 Ok(())
149 }
150
151 pub fn read_device_product_type(&mut self) -> Result<[u8; 8], Error<E>> {
154 let mut data: [u8; 2] = Register::READ_DEVICE_PRODUCT_TYPE;
155 self.write_data(&mut data)?;
156
157 let mut buffer: [u8; 12] = [0; 12];
158 self.read_data(&mut buffer)?;
159
160 let mut res: [u8; 8] = [0; 8];
161 res[..8].clone_from_slice(&buffer[..8]);
162
163 Ok(res)
164 }
165
166 pub fn read_device_serial_number(&mut self) -> Result<[u8; 32], Error<E>> {
169 let mut data: [u8; 2] = Register::READ_DEVICE_SERIAL_NUMBER;
170 self.write_data(&mut data)?;
171
172 let mut buffer: [u8; 48] = [0; 48];
173 self.read_data(&mut buffer)?;
174
175 let mut res: [u8; 32] = [0; 32];
176 res[..32].clone_from_slice(&buffer[..32]);
177
178 Ok(res)
179 }
180
181 pub fn read_firmware_version(&mut self) -> Result<(u8, u8), Error<E>> {
184 let mut data: [u8; 2] = Register::READ_FIRMWARE_VERSION;
185 self.write_data(&mut data)?;
186
187 let mut buffer: [u8; 3] = [0; 3];
188 self.read_data(&mut buffer)?;
189
190 Ok((buffer[0], buffer[1]))
191 }
192
193 pub fn read_device_status_register(&mut self) -> Result<StatusRegisterResult, Error<E>> {
196 let mut data: [u8; 2] = Register::READ_DEVICE_STATUS_REGISTER;
197 self.write_data(&mut data)?;
198
199 let mut buffer: [u8; 6] = [0; 6];
200 self.read_data(&mut buffer)?;
201
202 let res = BigEndian::read_u32(&buffer);
203
204 let status_speed: bool = {
205 (res & StatusRegisterBits::SPEED) != 0
206 };
207
208 let status_laser: bool = {
209 (res & StatusRegisterBits::LASER) != 0
210 };
211
212 let status_fan: bool = {
213 (res & StatusRegisterBits::FAN) != 0
214 };
215
216 Ok(StatusRegisterResult{
217 speed: status_speed,
218 laser: status_laser,
219 fan: status_fan,
220 })
221 }
222
223 pub fn clear_device_status_register(&mut self) -> Result<(), Error<E>> {
226 let mut data: [u8; 2] = Register::CLEAR_DEVICE_STATUS_REGISTER;
227
228 self.write_data(&mut data)?;
229 self.delay.delay_ms(5);
230
231 Ok(())
232 }
233
234 pub fn device_reset(&mut self) -> Result<(), Error<E>> {
237 let mut data: [u8; 2] = Register::DEVICE_RESET;
238
239 self.write_data(&mut data)?;
240 self.delay.delay_ms(100);
241
242 Ok(())
243 }
244}