1#![no_std]
2#![doc = include_str!("../README.md")]
3pub mod prelude;
4pub mod register;
5
6#[cfg(feature = "passthrough")]
7use core::cell::RefCell;
8#[cfg(feature = "passthrough")]
9use core::cell::RefMut;
10use core::fmt::Debug;
11use embedded_hal::delay::DelayNs;
12use embedded_hal::i2c::{I2c, SevenBitAddress};
13use embedded_hal::spi::SpiDevice;
14use half::f16;
15use st_mems_bus::{BusOperation, EmbAdvFunctions, MemBankFunctions, i2c::*};
16
17use prelude::*;
18
19pub struct Lsm6dsv16x<B, T> {
27 pub bus: B,
29 pub tim: T,
30}
31
32#[derive(Debug)]
34pub enum Error<B> {
35 Bus(B),
37 UnexpectedValue,
39 FailedToReadMemBank,
40 FailedToSetMemBank(MemBank),
41}
42
43impl<B> From<B> for Error<B>
44where
45 B: Debug,
46{
47 fn from(bus_error: B) -> Self {
48 Error::Bus(bus_error)
49 }
50}
51
52impl<P, T> Lsm6dsv16x<I2cBus<P>, T>
53where
54 P: I2c,
55 T: DelayNs,
56{
57 pub fn new_i2c(i2c: P, address: I2CAddress, tim: T) -> Self {
59 let bus = st_mems_bus::i2c::I2cBus::new(i2c, address as SevenBitAddress);
61 Self { bus, tim }
62 }
63}
64impl<B, T> Lsm6dsv16x<B, T>
65where
66 B: BusOperation,
67 T: DelayNs,
68{
69 pub fn from_bus(bus: B, tim: T) -> Self {
73 Self { bus, tim }
74 }
75}
76
77impl<P, T> Lsm6dsv16x<st_mems_bus::spi::SpiBus<P>, T>
78where
79 P: SpiDevice,
80 T: DelayNs,
81{
82 pub fn new_spi(spi: P, tim: T) -> Self {
84 let bus = st_mems_bus::spi::SpiBus::new(spi);
86 Self { bus, tim }
87 }
88}
89
90impl<B, T> MemBankFunctions<MemBank> for Lsm6dsv16x<B, T>
91where
92 B: BusOperation,
93 T: DelayNs,
94{
95 type Error = Error<B::Error>;
96
97 fn mem_bank_set(&mut self, val: MemBank) -> Result<(), Self::Error> {
99 let mut func_cfg_access =
100 FuncCfgAccess::read(self).map_err(|_| Error::FailedToReadMemBank)?;
101
102 func_cfg_access.set_shub_reg_access(((val as u8) & 0x02) >> 1);
103 func_cfg_access.set_emb_func_reg_access(val as u8 & 0x01);
104 func_cfg_access
105 .write(self)
106 .map_err(|_| Error::FailedToSetMemBank(val))
107 }
108 fn mem_bank_get(&mut self) -> Result<MemBank, Self::Error> {
110 let func_cfg_access = FuncCfgAccess::read(self).map_err(|_| Error::FailedToReadMemBank)?;
111 let value =
112 (func_cfg_access.shub_reg_access() << 1) + func_cfg_access.emb_func_reg_access();
113
114 let val = match value {
115 0 => MemBank::MainMemBank,
116 1 => MemBank::EmbedFuncMemBank,
117 2 => MemBank::SensorHubMemBank,
118 _ => MemBank::MainMemBank,
119 };
120
121 Ok(val)
122 }
123}
124
125impl<B, T> EmbAdvFunctions for Lsm6dsv16x<B, T>
126where
127 B: BusOperation,
128 T: DelayNs,
129{
130 type Error = Error<B::Error>;
131
132 fn ln_pg_write(&mut self, address: u16, buf: &[u8], len: u8) -> Result<(), Self::Error> {
140 let mut msb = ((address >> 8) & 0x0F) as u8;
141 let mut lsb = (address & 0xFF) as u8;
142
143 MemBank::operate_over_embed(self, |state| {
144 let mut page_rw = PageRw::read(state)?;
146 page_rw.set_page_read(0);
147 page_rw.set_page_write(1);
148 page_rw.write(state)?;
149
150 let mut page_sel = PageSel::read(state)?;
152 page_sel.set_page_sel(msb);
153 page_sel.write(state)?;
154
155 let mut page_address = PageAddress::from_bits(0);
157 page_address.set_page_addr(lsb);
158 page_address.write(state)?;
159
160 for i in 0..len {
161 state.write_to_register(
162 EmbReg::PageValue as u8,
163 &buf[i as usize..(i as usize + 1)],
164 )?;
165
166 lsb = lsb.wrapping_add(1);
167 if lsb == 0x00 {
169 msb += 1;
170 page_sel = PageSel::read(state)?;
171 page_sel.set_page_sel(msb);
172 page_sel.write(state)?;
173 }
174 }
175
176 page_sel = PageSel::read(state)?;
178 page_sel.set_page_sel(0);
179 page_sel.write(state)?;
180
181 page_rw = PageRw::read(state)?;
183 page_rw.set_page_read(0);
184 page_rw.set_page_write(0);
185 page_rw.write(state)
186 })
187 }
188
189 fn ln_pg_read(&mut self, address: u16, buf: &mut [u8], len: u8) -> Result<(), Self::Error> {
197 let mut msb = ((address >> 8) & 0x0F) as u8;
198 let mut lsb = (address & 0xFF) as u8;
199
200 MemBank::operate_over_embed(self, |state| {
201 let mut page_rw = PageRw::read(state)?;
203 page_rw.set_page_read(1);
204 page_rw.set_page_write(0);
205 page_rw.write(state)?;
206
207 let mut page_sel = PageSel::read(state)?;
209 page_sel.set_page_sel(msb);
210 page_sel.write(state)?;
211
212 let mut page_address = PageAddress::from_bits(0);
214 page_address.set_page_addr(lsb);
215 page_address.write(state)?;
216
217 for i in 0..len {
218 state.read_from_register(
219 EmbReg::PageValue as u8,
220 &mut buf[i as usize..(i as usize + 1)],
221 )?;
222
223 lsb = lsb.wrapping_add(1);
224 if lsb == 0x00 {
226 msb += 1;
227 page_sel = PageSel::read(state)?;
228 page_sel.set_page_sel(msb);
229 page_sel.write(state)?;
230 }
231 }
232
233 page_sel = PageSel::read(state)?;
235 page_sel.set_page_sel(0);
236 page_sel.write(state)?;
237
238 page_rw = PageRw::read(state)?;
240 page_rw.set_page_read(0);
241 page_rw.set_page_write(0);
242 page_rw.write(state)
243 })
244 }
245}
246
247impl<B: BusOperation, T: DelayNs> Lsm6dsv16x<B, T> {
248 pub fn write_to_register(&mut self, reg: u8, buf: &[u8]) -> Result<(), Error<B::Error>> {
249 self.bus.write_to_register(reg, buf).map_err(Error::Bus)
250 }
251
252 pub fn read_from_register(&mut self, reg: u8, buf: &mut [u8]) -> Result<(), Error<B::Error>> {
253 self.bus.read_from_register(reg, buf).map_err(Error::Bus)
254 }
255 pub fn xl_offset_on_out_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
259 let mut ctrl9 = Ctrl9::read(self)?;
260 ctrl9.set_usr_off_on_out(val);
261 ctrl9.write(self)?;
262 Ok(())
263 }
264 pub fn xl_offset_on_out_get(&mut self) -> Result<u8, Error<B::Error>> {
268 let val: u8 = Ctrl9::read(self).map(|reg| reg.usr_off_on_out())?;
269
270 Ok(val)
271 }
272 pub fn xl_offset_mg_set(&mut self, val: XlOffsetMg) -> Result<(), Error<B::Error>> {
274 let mut z_ofs_usr = ZOfsUsr::read(self)?;
275 let mut y_ofs_usr = YOfsUsr::read(self)?;
276 let mut x_ofs_usr = XOfsUsr::read(self)?;
277
278 let mut ctrl9 = Ctrl9::read(self)?;
279
280 if (val.x_mg < (0.0078125 * 127.0) && val.x_mg > (0.0078125 * -127.0))
281 && (val.y_mg < (0.0078125 * 127.0) && val.y_mg > (0.0078125 * -127.0))
282 && (val.z_mg < (0.0078125 * 127.0) && val.z_mg > (0.0078125 * -127.0))
283 {
284 ctrl9.set_usr_off_w(0);
285
286 let tmp = val.z_mg / 0.0078125;
287 z_ofs_usr.set_z_ofs_usr(tmp as u8);
288
289 let tmp = val.y_mg / 0.0078125;
290 y_ofs_usr.set_y_ofs_usr(tmp as u8);
291
292 let tmp = val.x_mg / 0.0078125;
293 x_ofs_usr.set_x_ofs_usr(tmp as u8);
294 } else if (val.x_mg < (0.125 * 127.0) && val.x_mg > (0.125 * -127.0))
295 && (val.y_mg < (0.125 * 127.0) && val.y_mg > (0.125 * -127.0))
296 && (val.z_mg < (0.125 * 127.0) && val.z_mg > (0.125 * -127.0))
297 {
298 ctrl9.set_usr_off_w(1);
299
300 let tmp = val.z_mg / 0.125;
301 z_ofs_usr.set_z_ofs_usr(tmp as u8);
302
303 let tmp = val.y_mg / 0.125;
304 y_ofs_usr.set_y_ofs_usr(tmp as u8);
305
306 let tmp = val.x_mg / 0.125;
307 x_ofs_usr.set_x_ofs_usr(tmp as u8);
308 } else {
309 ctrl9.set_usr_off_w(1);
310 z_ofs_usr.set_z_ofs_usr(0xFF);
311 y_ofs_usr.set_y_ofs_usr(0xFF);
312 x_ofs_usr.set_x_ofs_usr(0xFF);
313 }
314
315 z_ofs_usr.write(self)?;
316 y_ofs_usr.write(self)?;
317 x_ofs_usr.write(self)?;
318 ctrl9.write(self)
319 }
320 pub fn xl_offset_mg_get(&mut self) -> Result<XlOffsetMg, Error<B::Error>> {
322 let ctrl9 = Ctrl9::read(self)?;
323 let z_ofs_usr = ZOfsUsr::read(self)?;
324 let y_ofs_usr = YOfsUsr::read(self)?;
325 let x_ofs_usr = XOfsUsr::read(self)?;
326
327 let val = XlOffsetMg {
328 z_mg: if ctrl9.usr_off_w() == 0 {
329 z_ofs_usr.z_ofs_usr() as f32 * 0.0078125
330 } else {
331 z_ofs_usr.z_ofs_usr() as f32 * 0.125
332 },
333 y_mg: if ctrl9.usr_off_w() == 0 {
334 y_ofs_usr.y_ofs_usr() as f32 * 0.0078125
335 } else {
336 y_ofs_usr.y_ofs_usr() as f32 * 0.125
337 },
338 x_mg: if ctrl9.usr_off_w() == 0 {
339 x_ofs_usr.x_ofs_usr() as f32 * 0.0078125
340 } else {
341 x_ofs_usr.x_ofs_usr() as f32 * 0.125
342 },
343 };
344
345 Ok(val)
346 }
347 pub fn reset_set(&mut self, val: Reset) -> Result<(), Error<B::Error>> {
349 let mut ctrl3 = Ctrl3::read(self)?;
350 let mut func_cfg_access = FuncCfgAccess::read(self)?;
351
352 ctrl3.set_boot(((val as u8) & 0x04) >> 2);
353 ctrl3.set_sw_reset(((val as u8) & 0x02) >> 1);
354 func_cfg_access.set_sw_por(val as u8 & 0x01);
355
356 ctrl3.write(self)?;
357 func_cfg_access.write(self)
358 }
359 pub fn reset_get(&mut self) -> Result<Reset, Error<B::Error>> {
361 let ctrl3 = Ctrl3::read(self)?;
362 let func_cfg_access = FuncCfgAccess::read(self)?;
363
364 let value: u8 = (ctrl3.sw_reset() << 2) + (ctrl3.boot() << 1) + func_cfg_access.sw_por();
365 let val = Reset::try_from(value).unwrap_or(Reset::GlobalRst);
366
367 Ok(val)
368 }
369
370 pub fn device_id_get(&mut self) -> Result<u8, Error<B::Error>> {
375 WhoAmI::read(self).map(|reg| reg.into())
376 }
377 pub fn xl_data_rate_set(&mut self, val: Odr) -> Result<(), Error<B::Error>> {
379 let mut ctrl1 = Ctrl1::read(self)?;
380
381 ctrl1.set_odr_xl(val as u8 & 0x0F);
382 ctrl1.write(self)?;
383
384 let sel = (val as u8 >> 4) & 0x0F;
385 if sel != 0 {
386 let mut haodr = HaodrCfg::read(self)?;
387
388 haodr.set_haodr_sel(sel);
389 haodr.write(self)?;
390 }
391
392 Ok(())
393 }
394 pub fn xl_data_rate_get(&mut self) -> Result<Odr, Error<B::Error>> {
396 let ctrl1 = Ctrl1::read(self)?;
397 let haodr = HaodrCfg::read(self)?;
398 let sel = haodr.haodr_sel() << 4;
399 let odr = sel | ctrl1.odr_xl();
400
401 Ok(Odr::try_from(odr).unwrap_or_default())
402 }
403 pub fn xl_mode_set(&mut self, val: XlMode) -> Result<(), Error<B::Error>> {
405 let mut ctrl1 = Ctrl1::read(self)?;
406 ctrl1.set_op_mode_xl((val as u8) & 0x07);
407 ctrl1.write(self)
408 }
409 pub fn xl_mode_get(&mut self) -> Result<XlMode, Error<B::Error>> {
411 let ctrl1 = Ctrl1::read(self)?;
412
413 let val = XlMode::try_from(ctrl1.op_mode_xl()).unwrap_or_default();
414
415 Ok(val)
416 }
417 pub fn gy_data_rate_set(&mut self, val: Odr) -> Result<(), Error<B::Error>> {
419 let mut ctrl2 = Ctrl2::read(self)?;
420
421 ctrl2.set_odr_g((val as u8) & 0x0F);
422 ctrl2.write(self)?;
423
424 let sel = ((val as u8) >> 4) & 0x0F;
425 if sel != 0 {
426 let mut haodr = HaodrCfg::read(self)?;
427 haodr.set_haodr_sel(sel);
428 haodr.write(self)?;
429 }
430
431 Ok(())
432 }
433 pub fn gy_data_rate_get(&mut self) -> Result<Odr, Error<B::Error>> {
435 let ctrl2 = Ctrl2::read(self)?;
436 let haodr = HaodrCfg::read(self)?;
437 let sel = haodr.haodr_sel();
438 let odr = sel | ctrl2.odr_g();
439
440 Ok(Odr::try_from(odr).unwrap_or_default())
441 }
442 pub fn gy_mode_set(&mut self, val: GyMode) -> Result<(), Error<B::Error>> {
444 let mut ctrl2 = Ctrl2::read(self)?;
445 ctrl2.set_op_mode_g(val as u8 & 0x07);
446 ctrl2.write(self)
447 }
448 pub fn gy_mode_get(&mut self) -> Result<GyMode, Error<B::Error>> {
450 let ctrl2 = Ctrl2::read(self)?;
451
452 let val = GyMode::try_from(ctrl2.op_mode_g()).unwrap_or_default();
453 Ok(val)
454 }
455 pub fn auto_increment_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
460 let mut ctrl3 = Ctrl3::read(self)?;
461 ctrl3.set_if_inc(val);
462 ctrl3.write(self)
463 }
464 pub fn auto_increment_get(&mut self) -> Result<u8, Error<B::Error>> {
469 let val: u8 = Ctrl3::read(self).map(|reg| reg.if_inc())?;
470
471 Ok(val)
472 }
473 pub fn block_data_update_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
477 let mut ctrl3 = Ctrl3::read(self)?;
478 ctrl3.set_bdu(val);
479 ctrl3.write(self)
480 }
481 pub fn block_data_update_get(&mut self) -> Result<u8, Error<B::Error>> {
483 let val: u8 = Ctrl3::read(self).map(|reg| reg.bdu())?;
484
485 Ok(val)
486 }
487 pub fn odr_trig_cfg_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
492 if !(1..=3).contains(&val) {
493 return Err(Error::UnexpectedValue);
494 }
495
496 let mut odr_trig = OdrTrigCfg::read(self)?;
497
498 odr_trig.set_odr_trig_nodr(val);
499 odr_trig.write(self)
500 }
501 pub fn odr_trig_cfg_get(&mut self) -> Result<u8, Error<B::Error>> {
505 let odr_trig_nodr: u8 = OdrTrigCfg::read(self).map(|reg| reg.odr_trig_nodr())?;
506
507 Ok(odr_trig_nodr)
508 }
509 pub fn data_ready_mode_set(&mut self, val: DataReadyMode) -> Result<(), Error<B::Error>> {
513 let mut ctrl4 = Ctrl4::read(self)?;
514 ctrl4.set_drdy_pulsed((val as u8) & 0x1);
515 ctrl4.write(self)
516 }
517 pub fn data_ready_mode_get(&mut self) -> Result<DataReadyMode, Error<B::Error>> {
519 let ctrl4 = Ctrl4::read(self)?;
520 let val = DataReadyMode::try_from(ctrl4.drdy_pulsed()).unwrap_or_default();
521
522 Ok(val)
523 }
524 pub fn interrupt_enable_set(&mut self, val: InterruptMode) -> Result<(), Error<B::Error>> {
526 let mut func = FunctionsEnable::read(self)?;
527 func.set_interrupts_enable(val.enable);
528 func.write(self)?;
529
530 let mut cfg = TapCfg0::read(self)?;
531 cfg.set_lir(val.lir);
532 cfg.write(self)
533 }
534 pub fn interrupt_enable_get(&mut self) -> Result<InterruptMode, Error<B::Error>> {
538 let func = FunctionsEnable::read(self)?;
539 let cfg = TapCfg0::read(self)?;
540
541 let enable = func.interrupts_enable();
542 let lir = cfg.lir();
543
544 Ok(InterruptMode { enable, lir })
545 }
546 pub fn gy_full_scale_set(&mut self, val: GyFullScale) -> Result<(), Error<B::Error>> {
548 let mut ctrl6 = Ctrl6::read(self)?;
549
550 ctrl6.set_fs_g(val as u8 & 0xf);
551 ctrl6.write(self)
552 }
553 pub fn gy_full_scale_get(&mut self) -> Result<GyFullScale, Error<B::Error>> {
555 let ctrl6 = Ctrl6::read(self)?;
556
557 let val = GyFullScale::try_from(ctrl6.fs_g()).unwrap_or_default();
558
559 Ok(val)
560 }
561 pub fn xl_full_scale_set(&mut self, val: XlFullScale) -> Result<(), Error<B::Error>> {
563 let mut ctrl8 = Ctrl8::read(self)?;
564 ctrl8.set_fs_xl(val as u8 & 0x3);
565 ctrl8.write(self)
566 }
567 pub fn xl_full_scale_get(&mut self) -> Result<XlFullScale, Error<B::Error>> {
569 let ctrl8 = Ctrl8::read(self)?;
570
571 let val = XlFullScale::try_from(ctrl8.fs_xl()).unwrap_or_default();
572
573 Ok(val)
574 }
575 pub fn xl_dual_channel_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
580 let mut ctrl8 = Ctrl8::read(self)?;
581 ctrl8.set_xl_dualc_en(val);
582 ctrl8.write(self)
583 }
584 pub fn xl_dual_channel_get(&mut self) -> Result<u8, Error<B::Error>> {
589 let val: u8 = Ctrl8::read(self).map(|reg| reg.xl_dualc_en())?;
590
591 Ok(val)
592 }
593 pub fn xl_self_test_set(&mut self, val: XlSelfTest) -> Result<(), Error<B::Error>> {
595 let mut ctrl10 = Ctrl10::read(self)?;
596 ctrl10.set_st_xl(val as u8 & 0x3);
597 ctrl10.write(self)
598 }
599 pub fn xl_self_test_get(&mut self) -> Result<XlSelfTest, Error<B::Error>> {
601 let ctrl10 = Ctrl10::read(self)?;
602
603 let val = XlSelfTest::try_from(ctrl10.st_xl()).unwrap_or_default();
604
605 Ok(val)
606 }
607 pub fn gy_self_test_set(&mut self, val: GySelfTest) -> Result<(), Error<B::Error>> {
609 let mut ctrl10 = Ctrl10::read(self)?;
610 ctrl10.set_st_g((val as u8) & 0x3);
611 ctrl10.write(self)
612 }
613 pub fn gy_self_test_get(&mut self) -> Result<GySelfTest, Error<B::Error>> {
615 let ctrl10 = Ctrl10::read(self)?;
616
617 let val = GySelfTest::try_from(ctrl10.st_g()).unwrap_or_default();
618
619 Ok(val)
620 }
621 pub fn ois_xl_self_test_set(&mut self, val: OisXlSelfTest) -> Result<(), Error<B::Error>> {
623 let mut spi2_int_ois = Spi2IntOis::read(self)?;
624 spi2_int_ois.set_st_xl_ois((val as u8) & 0x3);
625 spi2_int_ois.write(self)
626 }
627 pub fn ois_xl_self_test_get(&mut self) -> Result<OisXlSelfTest, Error<B::Error>> {
629 let spi2_int_ois = Spi2IntOis::read(self)?;
630 let val = OisXlSelfTest::try_from(spi2_int_ois.st_xl_ois()).unwrap_or_default();
631
632 Ok(val)
633 }
634 pub fn ois_gy_self_test_set(&mut self, val: OisGySelfTest) -> Result<(), Error<B::Error>> {
636 let mut spi2_int_ois = Spi2IntOis::read(self)?;
637
638 spi2_int_ois.set_st_g_ois((val as u8) & 0x3);
639 spi2_int_ois.set_st_ois_clampdis(((val as u8) & 0x04) >> 2);
640
641 spi2_int_ois.write(self)
642 }
643 pub fn ois_gy_self_test_get(&mut self) -> Result<OisGySelfTest, Error<B::Error>> {
645 let spi2_int_ois = Spi2IntOis::read(self)?;
646
647 let val = match spi2_int_ois.st_g_ois() {
648 0 => OisGySelfTest::Disable,
649 1 => {
650 if spi2_int_ois.st_ois_clampdis() == 1 {
651 OisGySelfTest::ClampPos
652 } else {
653 OisGySelfTest::Positive
654 }
655 }
656 2 => {
657 if spi2_int_ois.st_ois_clampdis() == 1 {
658 OisGySelfTest::ClampNeg
659 } else {
660 OisGySelfTest::Negative
661 }
662 }
663 _ => OisGySelfTest::Disable,
664 };
665
666 Ok(val)
667 }
668 pub fn pin_int1_route_set(&mut self, val: &PinIntRoute) -> Result<(), Error<B::Error>> {
673 if val.drdy_temp == 1 {
675 return Err(Error::UnexpectedValue);
676 }
677
678 let mut int1_ctrl = Int1Ctrl::read(self)?;
680
681 int1_ctrl.set_int1_drdy_xl(val.drdy_xl);
683 int1_ctrl.set_int1_drdy_g(val.drdy_g);
684 int1_ctrl.set_int1_fifo_th(val.fifo_th);
685 int1_ctrl.set_int1_fifo_ovr(val.fifo_ovr);
686 int1_ctrl.set_int1_fifo_full(val.fifo_full);
687 int1_ctrl.set_int1_cnt_bdr(val.cnt_bdr);
688
689 int1_ctrl.write(self)?;
691
692 let mut md1_cfg = Md1Cfg::read(self)?;
694
695 md1_cfg.set_int1_shub(val.shub);
697 md1_cfg.set_int1_emb_func(val.emb_func);
698 md1_cfg.set_int1_6d(val.sixd);
699 md1_cfg.set_int1_single_tap(val.single_tap);
700 md1_cfg.set_int1_double_tap(val.double_tap);
701 md1_cfg.set_int1_wu(val.wakeup);
702 md1_cfg.set_int1_ff(val.freefall);
703 md1_cfg.set_int1_sleep_change(val.sleep_change);
704
705 md1_cfg.write(self)
707 }
708 pub fn pin_int1_route_get(&mut self) -> Result<PinIntRoute, Error<B::Error>> {
727 let int1_ctrl = Int1Ctrl::read(self)?;
729
730 let md1_cfg = Md1Cfg::read(self)?;
732
733 let val = PinIntRoute {
734 drdy_xl: int1_ctrl.int1_drdy_xl(),
735 drdy_g: int1_ctrl.int1_drdy_g(),
736 drdy_g_eis: 0,
737 drdy_temp: 0,
738 fifo_th: int1_ctrl.int1_fifo_th(),
739 fifo_ovr: int1_ctrl.int1_fifo_ovr(),
740 fifo_full: int1_ctrl.int1_fifo_full(),
741 cnt_bdr: int1_ctrl.int1_cnt_bdr(),
742 emb_func_endop: 0,
743 timestamp: 0,
744 shub: md1_cfg.int1_shub(),
745 emb_func: md1_cfg.int1_emb_func(),
746 sixd: md1_cfg.int1_6d(),
747 single_tap: md1_cfg.int1_single_tap(),
748 double_tap: md1_cfg.int1_double_tap(),
749 wakeup: md1_cfg.int1_wu(),
750 freefall: md1_cfg.int1_ff(),
751 sleep_change: md1_cfg.int1_sleep_change(),
752 drdy_ah_qvar: 0,
753 };
754
755 Ok(val)
756 }
757 pub fn pin_int2_route_set(&mut self, val: &PinIntRoute) -> Result<(), Error<B::Error>> {
759 let mut int2_ctrl = Int2Ctrl::read(self)?;
761
762 int2_ctrl.set_int2_drdy_xl(val.drdy_xl);
763 int2_ctrl.set_int2_drdy_g(val.drdy_g);
764 int2_ctrl.set_int2_fifo_th(val.fifo_th);
765 int2_ctrl.set_int2_fifo_ovr(val.fifo_ovr);
766 int2_ctrl.set_int2_fifo_full(val.fifo_full);
767 int2_ctrl.set_int2_cnt_bdr(val.cnt_bdr);
768 int2_ctrl.set_int2_drdy_g_eis(val.drdy_g_eis);
769 int2_ctrl.set_int2_emb_func_endop(val.emb_func_endop);
770
771 int2_ctrl.write(self)?;
772
773 let mut ctrl4 = Ctrl4::read(self)?;
775
776 ctrl4.set_int2_drdy_temp(val.drdy_temp);
777 ctrl4.write(self)?;
778
779 let mut ctrl7 = Ctrl7::read(self)?;
781
782 ctrl7.set_int2_drdy_ah_qvar(val.drdy_ah_qvar);
783 ctrl7.write(self)?;
784 let mut md2_cfg = Md2Cfg::read(self)?;
786
787 md2_cfg.set_int2_timestamp(val.timestamp);
788 md2_cfg.set_int2_emb_func(val.emb_func);
789 md2_cfg.set_int2_6d(val.sixd);
790 md2_cfg.set_int2_single_tap(val.single_tap);
791 md2_cfg.set_int2_double_tap(val.double_tap);
792 md2_cfg.set_int2_wu(val.wakeup);
793 md2_cfg.set_int2_ff(val.freefall);
794 md2_cfg.set_int2_sleep_change(val.sleep_change);
795
796 md2_cfg.write(self)
797 }
798 pub fn pin_int2_route_get(&mut self) -> Result<PinIntRoute, Error<B::Error>> {
802 let int2_ctrl = Int2Ctrl::read(self)?;
804 let ctrl4 = Ctrl4::read(self)?;
806 let ctrl7 = Ctrl7::read(self)?;
808 let md2_cfg = Md2Cfg::read(self)?;
810
811 let val = PinIntRoute {
812 drdy_xl: int2_ctrl.int2_drdy_xl(),
813 drdy_g: int2_ctrl.int2_drdy_g(),
814 fifo_th: int2_ctrl.int2_fifo_th(),
815 fifo_ovr: int2_ctrl.int2_fifo_ovr(),
816 fifo_full: int2_ctrl.int2_fifo_full(),
817 cnt_bdr: int2_ctrl.int2_cnt_bdr(),
818 drdy_g_eis: int2_ctrl.int2_drdy_g_eis(),
819 emb_func_endop: int2_ctrl.int2_emb_func_endop(),
820 timestamp: md2_cfg.int2_timestamp(),
821 emb_func: md2_cfg.int2_emb_func(),
822 sixd: md2_cfg.int2_6d(),
823 single_tap: md2_cfg.int2_single_tap(),
824 double_tap: md2_cfg.int2_double_tap(),
825 wakeup: md2_cfg.int2_wu(),
826 freefall: md2_cfg.int2_ff(),
827 sleep_change: md2_cfg.int2_sleep_change(),
828 drdy_ah_qvar: ctrl7.int2_drdy_ah_qvar(),
829 drdy_temp: ctrl4.int2_drdy_temp(),
830 shub: 0,
831 };
832
833 Ok(val)
834 }
835
836 pub fn emb_pin_int1_route_get(&mut self) -> Result<EmbPinIntRoute, Error<B::Error>> {
838 MemBank::operate_over_embed(self, |state| {
839 let emb_func_int1 = EmbFuncInt1::read(state)?;
840
841 let val = EmbPinIntRoute {
842 tilt: emb_func_int1.int1_tilt(),
843 sig_mot: emb_func_int1.int1_sig_mot(),
844 step_det: emb_func_int1.int1_step_detector(),
845 fsm_lc: emb_func_int1.int1_fsm_lc(),
846 };
847
848 Ok(val)
849 })
850 }
851
852 pub fn emb_pin_int1_route_set(&mut self, val: EmbPinIntRoute) -> Result<(), Error<B::Error>> {
854 MemBank::operate_over_embed(self, |state| {
855 let mut emb_func_int1 = EmbFuncInt1::read(state)?;
856
857 emb_func_int1.set_int1_tilt(val.tilt);
858 emb_func_int1.set_int1_sig_mot(val.sig_mot);
859 emb_func_int1.set_int1_step_detector(val.step_det);
860 emb_func_int1.set_int1_fsm_lc(val.fsm_lc);
861
862 emb_func_int1.write(state)
863 })?;
864
865 let mut md1_cfg = Md1Cfg::read(self)?;
866 md1_cfg.set_int1_emb_func(1);
867 md1_cfg.write(self)
868 }
869
870 pub fn emb_pin_int2_route_get(&mut self) -> Result<EmbPinIntRoute, Error<B::Error>> {
872 MemBank::operate_over_embed(self, |state| {
873 let emb_func_int2 = EmbFuncInt2::read(state)?;
874
875 let val = EmbPinIntRoute {
876 tilt: emb_func_int2.int2_tilt(),
877 sig_mot: emb_func_int2.int2_sig_mot(),
878 step_det: emb_func_int2.int2_step_detector(),
879 fsm_lc: emb_func_int2.int2_fsm_lc(),
880 };
881
882 Ok(val)
883 })
884 }
885
886 pub fn emb_pin_int2_route_set(&mut self, val: EmbPinIntRoute) -> Result<(), Error<B::Error>> {
888 MemBank::operate_over_embed(self, |state| {
889 let mut emb_func_int2 = EmbFuncInt2::read(state)?;
890
891 emb_func_int2.set_int2_tilt(val.tilt);
892 emb_func_int2.set_int2_sig_mot(val.sig_mot);
893 emb_func_int2.set_int2_step_detector(val.step_det);
894 emb_func_int2.set_int2_fsm_lc(val.fsm_lc);
895
896 emb_func_int2.write(state)
897 })?;
898
899 let mut md2_cfg = Md2Cfg::read(self)?;
900 md2_cfg.set_int2_emb_func(1);
901 md2_cfg.write(self)
902 }
903
904 pub fn embedded_int_cfg_get(&mut self) -> Result<EmbeddedIntConf, Error<B::Error>> {
906 let mut val = EmbeddedIntConf::Pulsed;
907
908 MemBank::operate_over_embed(self, |state| {
909 let page_rw = PageRw::read(state)?;
910 if page_rw.emb_func_lir() == 1 {
911 val = EmbeddedIntConf::Latched;
912 }
913
914 Ok(val)
915 })
916 }
917
918 pub fn embedded_int_cfg_set(&mut self, val: EmbeddedIntConf) -> Result<(), Error<B::Error>> {
920 MemBank::operate_over_embed(self, |state| {
921 let mut page_rw = PageRw::read(state)?;
922 match val {
923 EmbeddedIntConf::Latched => {
924 page_rw.set_emb_func_lir(1);
925 }
926 EmbeddedIntConf::Pulsed => {
927 page_rw.set_emb_func_lir(0);
928 }
929 };
930 page_rw.write(state)
931 })
932 }
933
934 pub fn embedded_status_get(&mut self) -> Result<EmbeddedStatus, Error<B::Error>> {
936 let status = EmbFuncStatusMainPage::read(self)?;
937 MemBank::operate_over_embed(self, |state| {
938 let src = EmbFuncSrc::read(state)?;
939
940 let val = EmbeddedStatus {
941 tilt: status.is_tilt(),
942 sig_mot: status.is_sigmot(),
943 fsm_lc: status.is_fsm_lc(),
944 step_count_inc: src.stepcounter_bit_set(),
945 step_count_overflow: src.step_overflow(),
946 step_on_delta_time: src.step_count_delta_ia(),
947 step_detector: src.step_detected(),
948 };
949
950 Ok(val)
951 })
952 }
953
954 pub fn all_sources_get(&mut self) -> Result<AllSources, Error<B::Error>> {
956 let mut functions_enable = FunctionsEnable::read(self)?;
957 functions_enable.set_dis_rst_lir_all_int(1);
958 functions_enable.write(self)?;
959
960 let fifo_status = FifoStatusReg::read(self)?;
961 let all_int_src = AllIntSrc::read(self)?;
962 let status_reg = StatusReg::read(self)?;
963
964 functions_enable = FunctionsEnable::read(self)?;
965 functions_enable.set_dis_rst_lir_all_int(0);
966 functions_enable.write(self)?;
967
968 let status_reg_ois = UiStatusRegOis::read(self)?;
969 let wake_up_src = WakeUpSrc::read(self)?;
970 let tap_src = TapSrc::read(self)?;
971 let d6d_src = D6dSrc::read(self)?;
972
973 let emb_func_status_mainpage = EmbFuncStatusMainPage::read(self)?;
974 let fsm_status_mainpage = FsmStatusMainPage::read(self)?;
975 let mlc_status_mainpage = MlcStatusMainPage::read(self)?;
976
977 let (emb_func_exec_status, emb_func_src) = MemBank::operate_over_embed(self, |state| {
979 let emb_func_exec_status = EmbFuncExecStatus::read(state)?;
980 let emb_func_src = EmbFuncSrc::read(state)?;
981 Ok((emb_func_exec_status, emb_func_src))
982 })?;
983
984 let status_shub = StatusMasterMainPage::read(self)?;
985
986 let val = AllSources {
987 drdy_xl: status_reg.xlda(),
988 drdy_gy: status_reg.gda(),
989 drdy_temp: status_reg.tda(),
990 drdy_ah_qvar: status_reg.ah_qvarda(),
991 drdy_eis: status_reg.gda_eis(),
992 drdy_ois: status_reg.ois_drdy(),
993 gy_settling: status_reg_ois.gyro_settling(),
994 timestamp: status_reg.timestamp_endcount(),
995 free_fall: all_int_src.ff_ia(),
996 wake_up: all_int_src.wu_ia(),
997 wake_up_z: wake_up_src.z_wu(),
998 wake_up_y: wake_up_src.y_wu(),
999 wake_up_x: wake_up_src.x_wu(),
1000 single_tap: tap_src.single_tap(),
1001 double_tap: tap_src.double_tap(),
1002 tap_z: tap_src.z_tap(),
1003 tap_y: tap_src.y_tap(),
1004 tap_x: tap_src.x_tap(),
1005 tap_sign: tap_src.tap_sign(),
1006 six_d: all_int_src.d6d_ia(),
1007 six_d_xl: d6d_src.xl(),
1008 six_d_xh: d6d_src.xh(),
1009 six_d_yl: d6d_src.yl(),
1010 six_d_yh: d6d_src.yh(),
1011 six_d_zl: d6d_src.zl(),
1012 six_d_zh: d6d_src.zh(),
1013 sleep_change: wake_up_src.sleep_change_ia(),
1014 sleep_state: wake_up_src.sleep_state(),
1015 step_detector: emb_func_src.step_detected(),
1016 step_count_inc: emb_func_src.stepcounter_bit_set(),
1017 step_count_overflow: emb_func_src.step_overflow(),
1018 step_on_delta_time: emb_func_src.step_count_delta_ia(),
1019 emb_func_stand_by: emb_func_exec_status.emb_func_endop(),
1020 emb_func_time_exceed: emb_func_exec_status.emb_func_exec_ovr(),
1021 tilt: emb_func_status_mainpage.is_tilt(),
1022 sig_mot: emb_func_status_mainpage.is_sigmot(),
1023 fsm_lc: emb_func_status_mainpage.is_fsm_lc(),
1024 fsm1: fsm_status_mainpage.is_fsm1(),
1025 fsm2: fsm_status_mainpage.is_fsm2(),
1026 fsm3: fsm_status_mainpage.is_fsm3(),
1027 fsm4: fsm_status_mainpage.is_fsm4(),
1028 fsm5: fsm_status_mainpage.is_fsm5(),
1029 fsm6: fsm_status_mainpage.is_fsm6(),
1030 fsm7: fsm_status_mainpage.is_fsm7(),
1031 fsm8: fsm_status_mainpage.is_fsm8(),
1032 mlc1: mlc_status_mainpage.is_mlc1(),
1033 mlc2: mlc_status_mainpage.is_mlc2(),
1034 mlc3: mlc_status_mainpage.is_mlc3(),
1035 mlc4: mlc_status_mainpage.is_mlc4(),
1036 sh_endop: status_shub.sens_hub_endop(),
1037 sh_slave0_nack: status_shub.slave0_nack(),
1038 sh_slave1_nack: status_shub.slave1_nack(),
1039 sh_slave2_nack: status_shub.slave2_nack(),
1040 sh_slave3_nack: status_shub.slave3_nack(),
1041 sh_wr_once: status_shub.wr_once_done(),
1042 fifo_bdr: fifo_status.counter_bdr_ia(),
1043 fifo_full: fifo_status.fifo_full_ia(),
1044 fifo_ovr: fifo_status.fifo_ovr_ia(),
1045 fifo_th: fifo_status.fifo_wtm_ia(),
1046 };
1047
1048 Ok(val)
1049 }
1050 pub fn flag_data_ready_get(&mut self) -> Result<DataReady, Error<B::Error>> {
1054 let status_reg = StatusReg::read(self)?;
1055
1056 let data_ready = DataReady {
1057 drdy_xl: status_reg.xlda(),
1058 drdy_gy: status_reg.gda(),
1059 drdy_temp: status_reg.tda(),
1060 };
1061
1062 Ok(data_ready)
1063 }
1064 pub fn int_ack_mask_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1066 MemBank::operate_over_embed(self, |state| IntAckMask::from_bits(val).write(state))
1067 }
1068 pub fn int_ack_mask_get(&mut self) -> Result<u8, Error<B::Error>> {
1070 MemBank::operate_over_embed(self, |state| {
1071 IntAckMask::read(state).map(|reg| reg.into_bits())
1072 })
1073 }
1074 pub fn temperature_raw_get(&mut self) -> Result<i16, Error<B::Error>> {
1076 OutTemp::read(self).map(|reg| reg.0)
1077 }
1078
1079 pub fn angular_rate_raw_get(&mut self) -> Result<[i16; 3], Error<B::Error>> {
1081 let val = OutXYZG::read(self)?;
1082
1083 Ok([val.x, val.y, val.z])
1084 }
1085 pub fn ois_angular_rate_raw_get(&mut self) -> Result<[i16; 3], Error<B::Error>> {
1089 let val = Spi2OutXYZGOis::read(self)?;
1090
1091 Ok([val.x, val.y, val.z])
1092 }
1093
1094 pub fn ois_eis_angular_rate_raw_get(&mut self) -> Result<[i16; 3], Error<B::Error>> {
1096 let val = UiOutXYZGOisEis::read(self)?;
1097
1098 Ok([val.x, val.y, val.z])
1099 }
1100
1101 pub fn acceleration_raw_get(&mut self) -> Result<[i16; 3], Error<B::Error>> {
1103 let val = OutXYZA::read(self)?;
1104
1105 Ok([val.x, val.y, val.z])
1106 }
1107 pub fn dual_acceleration_raw_get(&mut self) -> Result<[i16; 3], Error<B::Error>> {
1109 let val = UiOutXYZAOisDualc::read(self)?;
1110
1111 Ok([val.x, val.y, val.z])
1112 }
1113 pub fn ah_qvar_raw_get(&mut self) -> Result<i16, Error<B::Error>> {
1118 AhQvarOut::read(self).map(|reg| reg.0)
1119 }
1120 pub fn odr_cal_reg_get(&mut self) -> Result<i8, Error<B::Error>> {
1125 let val: i8 = InternalFreq::read(self).map(|reg| reg.freq_fine() as i8)?;
1126
1127 Ok(val)
1128 }
1129
1130 pub fn emb_function_dbg_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1132 let mut ctrl10 = Ctrl10::read(self)?;
1133 ctrl10.set_emb_func_debug(val);
1134 ctrl10.write(self)
1135 }
1136 pub fn emb_function_dbg_get(&mut self) -> Result<u8, Error<B::Error>> {
1138 let val: u8 = Ctrl10::read(self).map(|reg| reg.emb_func_debug())?;
1139
1140 Ok(val)
1141 }
1142 pub fn den_polarity_set(&mut self, val: DenPolarity) -> Result<(), Error<B::Error>> {
1144 let mut ctrl4 = Ctrl4::read(self)?;
1145 ctrl4.set_int2_in_lh((val as u8) & 0x1);
1146 ctrl4.write(self)
1147 }
1148 pub fn den_polarity_get(&mut self) -> Result<DenPolarity, Error<B::Error>> {
1150 let ctrl4 = Ctrl4::read(self)?;
1151
1152 let val = DenPolarity::try_from(ctrl4.int2_in_lh()).unwrap_or_default();
1153
1154 Ok(val)
1155 }
1156 pub fn den_conf_set(&mut self, val: DenConf) -> Result<(), Error<B::Error>> {
1158 let mut den = Den::read(self)?;
1159
1160 den.set_den_z(val.den_z);
1161 den.set_den_y(val.den_y);
1162 den.set_den_x(val.den_x);
1163
1164 den.set_lvl2_en((val.mode as u8) & 0x1);
1165 den.set_lvl1_en(((val.mode as u8) & 0x2) >> 1);
1166
1167 if val.stamp_in_gy_data == 1 && val.stamp_in_xl_data == 1 {
1168 den.set_den_xl_g(0);
1169 den.set_den_xl_en(1);
1170 } else if val.stamp_in_gy_data == 1 && val.stamp_in_xl_data == 0 {
1171 den.set_den_xl_g(0);
1172 den.set_den_xl_en(0);
1173 } else if val.stamp_in_gy_data == 0 && val.stamp_in_xl_data == 1 {
1174 den.set_den_xl_g(1);
1175 den.set_den_xl_en(0);
1176 } else {
1177 den.set_den_xl_g(0);
1178 den.set_den_xl_en(0);
1179 den.set_den_z(0);
1180 den.set_den_y(0);
1181 den.set_den_x(0);
1182 den.set_lvl2_en(0);
1183 den.set_lvl1_en(0);
1184 }
1185
1186 den.write(self)
1187 }
1188 pub fn den_conf_get(&mut self) -> Result<DenConf, Error<B::Error>> {
1190 let den = Den::read(self)?;
1191
1192 let mut val = DenConf {
1193 den_z: den.den_z(),
1194 den_y: den.den_y(),
1195 den_x: den.den_x(),
1196 stamp_in_gy_data: 0,
1197 stamp_in_xl_data: 0,
1198 mode: DenMode::DenNotDefined,
1199 };
1200
1201 if (den.den_x() | den.den_y() | den.den_z()) == 1 {
1202 if den.den_xl_g() == 0 && den.den_xl_en() == 1 {
1203 val.stamp_in_gy_data = 1;
1204 val.stamp_in_xl_data = 1;
1205 } else if den.den_xl_g() == 0 && den.den_xl_en() == 0 {
1206 val.stamp_in_gy_data = 1;
1207 val.stamp_in_xl_data = 0;
1208 } else {
1209 val.stamp_in_gy_data = 0;
1210 val.stamp_in_xl_data = 1;
1211 }
1212 }
1213
1214 match (den.lvl1_en() << 1) + den.lvl2_en() {
1215 3 => val.mode = DenMode::LevelTrigger,
1216 2 => val.mode = DenMode::LevelLatched,
1217 _ => val.mode = DenMode::DenNotDefined,
1218 }
1219
1220 Ok(val)
1221 }
1222 pub fn eis_gy_full_scale_set(&mut self, val: EisGyFullScale) -> Result<(), Error<B::Error>> {
1226 let mut ctrl_eis = CtrlEis::read(self)?;
1227 ctrl_eis.set_fs_g_eis(val as u8 & 0x7);
1228 ctrl_eis.write(self)
1229 }
1230 pub fn eis_gy_full_scale_get(&mut self) -> Result<EisGyFullScale, Error<B::Error>> {
1234 let ctrl_eis = CtrlEis::read(self)?;
1235 let val = EisGyFullScale::try_from(ctrl_eis.fs_g_eis()).unwrap_or_default();
1236
1237 Ok(val)
1238 }
1239 pub fn eis_gy_on_spi2_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1243 let mut ctrl_eis = CtrlEis::read(self)?;
1244 ctrl_eis.set_g_eis_on_g_ois_out_reg(val);
1245 ctrl_eis.write(self)
1246 }
1247 pub fn eis_gy_on_spi2_get(&mut self) -> Result<u8, Error<B::Error>> {
1251 let val: u8 = CtrlEis::read(self).map(|reg| reg.g_eis_on_g_ois_out_reg())?;
1252
1253 Ok(val)
1254 }
1255 pub fn gy_eis_data_rate_set(&mut self, val: GyEisDataRate) -> Result<(), Error<B::Error>> {
1257 let mut ctrl_eis = CtrlEis::read(self)?;
1258 ctrl_eis.set_odr_g_eis((val as u8) & 0x03);
1259 ctrl_eis.write(self)
1260 }
1261 pub fn gy_eis_data_rate_get(&mut self) -> Result<GyEisDataRate, Error<B::Error>> {
1263 let ctrl_eis = CtrlEis::read(self)?;
1264
1265 let val = GyEisDataRate::try_from(ctrl_eis.odr_g_eis()).unwrap_or_default();
1266
1267 Ok(val)
1268 }
1269 pub fn fifo_watermark_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1273 let mut fifo_ctrl1 = FifoCtrl1::read(self)?;
1274 fifo_ctrl1.set_wtm(val);
1275 fifo_ctrl1.write(self)
1276 }
1277 pub fn fifo_watermark_get(&mut self) -> Result<u8, Error<B::Error>> {
1281 let val: u8 = FifoCtrl1::read(self).map(|reg| reg.wtm())?;
1282
1283 Ok(val)
1284 }
1285 pub fn fifo_xl_dual_fsm_batch_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1288 let mut fifo_ctrl2 = FifoCtrl2::read(self)?;
1289 fifo_ctrl2.set_xl_dualc_batch_from_fsm(val);
1290 fifo_ctrl2.write(self)
1291 }
1292 pub fn fifo_xl_dual_fsm_batch_get(&mut self) -> Result<u8, Error<B::Error>> {
1294 let val: u8 = FifoCtrl2::read(self).map(|reg| reg.xl_dualc_batch_from_fsm())?;
1295
1296 Ok(val)
1297 }
1298 pub fn fifo_compress_algo_set(&mut self, val: FifoCompressAlgo) -> Result<(), Error<B::Error>> {
1300 let mut fifo_ctrl2 = FifoCtrl2::read(self)?;
1301 fifo_ctrl2.set_uncompr_rate((val as u8) & 0x03);
1302 fifo_ctrl2.write(self)
1303 }
1304 pub fn fifo_compress_algo_get(&mut self) -> Result<FifoCompressAlgo, Error<B::Error>> {
1308 let fifo_ctrl2 = FifoCtrl2::read(self)?;
1309
1310 let val = FifoCompressAlgo::try_from(fifo_ctrl2.uncompr_rate()).unwrap_or_default();
1311
1312 Ok(val)
1313 }
1314 pub fn fifo_virtual_sens_odr_chg_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1316 let mut fifo_ctrl2 = FifoCtrl2::read(self)?;
1317 fifo_ctrl2.set_odr_chg_en(val);
1318 fifo_ctrl2.write(self)
1319 }
1320 pub fn fifo_virtual_sens_odr_chg_get(&mut self) -> Result<u8, Error<B::Error>> {
1322 let val: u8 = FifoCtrl2::read(self).map(|reg| reg.odr_chg_en())?;
1323
1324 Ok(val)
1325 }
1326 pub fn fifo_compress_algo_real_time_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1330 let mut fifo_ctrl2 = FifoCtrl2::read(self)?;
1331 fifo_ctrl2.set_fifo_compr_rt_en(val);
1332 fifo_ctrl2.write(self)?;
1333
1334 MemBank::operate_over_embed(self, |state| {
1335 let mut emb_func_en_b = EmbFuncEnB::read(state)?;
1336 emb_func_en_b.set_fifo_compr_en(val);
1337 emb_func_en_b.write(state)
1338 })
1339 }
1340 pub fn fifo_compress_algo_real_time_get(&mut self) -> Result<u8, Error<B::Error>> {
1342 let val: u8 = FifoCtrl2::read(self).map(|reg| reg.fifo_compr_rt_en())?;
1343
1344 Ok(val)
1345 }
1346 pub fn fifo_stop_on_wtm_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1348 let mut fifo_ctrl2 = FifoCtrl2::read(self)?;
1349 fifo_ctrl2.set_stop_on_wtm(val);
1350 fifo_ctrl2.write(self)
1351 }
1352 pub fn fifo_stop_on_wtm_get(&mut self) -> Result<u8, Error<B::Error>> {
1354 let val: u8 = FifoCtrl2::read(self).map(|reg| reg.stop_on_wtm())?;
1355
1356 Ok(val)
1357 }
1358 pub fn fifo_xl_batch_set(&mut self, val: FifoBatch) -> Result<(), Error<B::Error>> {
1360 let mut fifo_ctrl3 = FifoCtrl3::read(self)?;
1361 fifo_ctrl3.set_bdr_xl((val as u8) & 0xF);
1362 fifo_ctrl3.write(self)
1363 }
1364 pub fn fifo_xl_batch_get(&mut self) -> Result<FifoBatch, Error<B::Error>> {
1366 let fifo_ctrl3 = FifoCtrl3::read(self)?;
1367 let val = FifoBatch::try_from(fifo_ctrl3.bdr_xl()).unwrap_or_default();
1368
1369 Ok(val)
1370 }
1371 pub fn fifo_gy_batch_set(&mut self, val: FifoBatch) -> Result<(), Error<B::Error>> {
1373 let mut fifo_ctrl3 = FifoCtrl3::read(self)?;
1374 fifo_ctrl3.set_bdr_gy((val as u8) & 0x0F);
1375 fifo_ctrl3.write(self)
1376 }
1377 pub fn fifo_gy_batch_get(&mut self) -> Result<FifoBatch, Error<B::Error>> {
1379 let fifo_ctrl3 = FifoCtrl3::read(self)?;
1380
1381 let val = FifoBatch::try_from(fifo_ctrl3.bdr_gy()).unwrap_or_default();
1382
1383 Ok(val)
1384 }
1385 pub fn fifo_mode_set(&mut self, val: FifoMode) -> Result<(), Error<B::Error>> {
1387 let mut fifo_ctrl4 = FifoCtrl4::read(self)?;
1388 fifo_ctrl4.set_fifo_mode((val as u8) & 0x07);
1389 fifo_ctrl4.write(self)
1390 }
1391 pub fn fifo_mode_get(&mut self) -> Result<FifoMode, Error<B::Error>> {
1393 let fifo_ctrl = FifoCtrl4::read(self)?;
1394 let fifo_mode = FifoMode::try_from(fifo_ctrl.fifo_mode()).unwrap_or_default();
1395
1396 Ok(fifo_mode)
1397 }
1398 pub fn fifo_gy_eis_batch_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1402 let mut fifo_ctrl4 = FifoCtrl4::read(self)?;
1403 fifo_ctrl4.set_g_eis_fifo_en(val);
1404 fifo_ctrl4.write(self)
1405 }
1406 pub fn fifo_gy_eis_batch_get(&mut self) -> Result<u8, Error<B::Error>> {
1408 let val: u8 = FifoCtrl4::read(self).map(|reg| reg.g_eis_fifo_en())?;
1409
1410 Ok(val)
1411 }
1412 pub fn fifo_temp_batch_set(&mut self, val: FifoTempBatch) -> Result<(), Error<B::Error>> {
1414 let mut fifo_ctrl4 = FifoCtrl4::read(self)?;
1415 fifo_ctrl4.set_odr_t_batch((val as u8) & 0x03);
1416 fifo_ctrl4.write(self)
1417 }
1418 pub fn fifo_temp_batch_get(&mut self) -> Result<FifoTempBatch, Error<B::Error>> {
1420 let fifo_ctrl4 = FifoCtrl4::read(self)?;
1421
1422 let val = FifoTempBatch::try_from(fifo_ctrl4.odr_t_batch()).unwrap_or_default();
1423
1424 Ok(val)
1425 }
1426 pub fn fifo_timestamp_batch_set(
1430 &mut self,
1431 val: FifoTimestampBatch,
1432 ) -> Result<(), Error<B::Error>> {
1433 let mut fifo_ctrl4 = FifoCtrl4::read(self)?;
1434 fifo_ctrl4.set_dec_ts_batch((val as u8) & 0x03);
1435 fifo_ctrl4.write(self)
1436 }
1437 pub fn fifo_timestamp_batch_get(&mut self) -> Result<FifoTimestampBatch, Error<B::Error>> {
1441 let fifo_ctrl4 = FifoCtrl4::read(self)?;
1442
1443 let val = FifoTimestampBatch::try_from(fifo_ctrl4.dec_ts_batch()).unwrap_or_default();
1444
1445 Ok(val)
1446 }
1447 pub fn fifo_batch_counter_threshold_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
1452 let mut counter_bdr = CounterBdrReg::read(self)?;
1453 counter_bdr.set_cnt_bdr_th(val);
1454 counter_bdr.write(self)
1455 }
1456 pub fn fifo_batch_counter_threshold_get(&mut self) -> Result<u16, Error<B::Error>> {
1461 let counter = CounterBdrReg::read(self)?;
1462
1463 Ok(counter.cnt_bdr_th())
1464 }
1465 pub fn fifo_batch_cnt_event_set(
1467 &mut self,
1468 val: FifoBatchCntEvent,
1469 ) -> Result<(), Error<B::Error>> {
1470 let mut counter_bdr_reg1 = CounterBdrReg::read(self)?;
1471 counter_bdr_reg1.set_trig_counter_bdr(val as u8 & 0x03);
1472 counter_bdr_reg1.write(self)
1473 }
1474 pub fn fifo_batch_cnt_event_get(&mut self) -> Result<FifoBatchCntEvent, Error<B::Error>> {
1476 let counter_bdr_reg1 = CounterBdrReg::read(self)?;
1477
1478 let val =
1479 FifoBatchCntEvent::try_from(counter_bdr_reg1.trig_counter_bdr()).unwrap_or_default();
1480
1481 Ok(val)
1482 }
1483 pub fn fifo_status_get(&mut self) -> Result<FifoStatus, Error<B::Error>> {
1485 let status = FifoStatusReg::read(self)?;
1486
1487 let fifo_status = FifoStatus {
1488 fifo_bdr: status.counter_bdr_ia(),
1489 fifo_ovr: status.fifo_ovr_ia(),
1490 fifo_full: status.fifo_full_ia(),
1491 fifo_th: status.fifo_wtm_ia(),
1492 fifo_level: status.diff_fifo(),
1493 };
1494
1495 Ok(fifo_status)
1496 }
1497 pub fn fifo_out_raw_get(&mut self) -> Result<FifoOutRaw, Error<B::Error>> {
1499 let fifo_data_out_tag = FifoDataOutTag::read(self)?;
1500 let tag_sensor = Tag::try_from(fifo_data_out_tag.tag_sensor()).unwrap_or_default();
1501 let cnt = fifo_data_out_tag.tag_cnt();
1502 let data = FifoDataOutXYZ::read(self)?;
1503
1504 Ok(FifoOutRaw {
1505 tag: tag_sensor,
1506 cnt,
1507 data: data.0,
1508 })
1509 }
1510 pub fn fifo_stpcnt_batch_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1512 MemBank::operate_over_embed(self, |state| {
1513 let mut emb_func_fifo_en_a = EmbFuncFifoEnA::read(state)?;
1514 emb_func_fifo_en_a.set_step_counter_fifo_en(val);
1515 emb_func_fifo_en_a.write(state)
1516 })
1517 }
1518 pub fn fifo_stpcnt_batch_get(&mut self) -> Result<u8, Error<B::Error>> {
1520 MemBank::operate_over_embed(self, |state| {
1521 EmbFuncFifoEnA::read(state).map(|reg| reg.step_counter_fifo_en())
1522 })
1523 }
1524 pub fn fifo_mlc_batch_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1526 MemBank::operate_over_embed(self, |state| {
1527 let mut emb_func_fifo_en_a = EmbFuncFifoEnA::read(state)?;
1528 emb_func_fifo_en_a.set_mlc_fifo_en(val);
1529 emb_func_fifo_en_a.write(state)
1530 })
1531 }
1532 pub fn fifo_mlc_batch_get(&mut self) -> Result<u8, Error<B::Error>> {
1534 MemBank::operate_over_embed(self, |state| {
1535 let emb_func_fifo_en_a = EmbFuncFifoEnA::read(state)?;
1536 Ok(emb_func_fifo_en_a.mlc_fifo_en())
1537 })
1538 }
1539 pub fn fifo_mlc_filt_batch_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1541 MemBank::operate_over_embed(self, |state| {
1542 let mut emb_func_fifo_en_b = EmbFuncFifoEnB::read(state)?;
1543 emb_func_fifo_en_b.set_mlc_filter_feature_fifo_en(val);
1544 emb_func_fifo_en_b.write(state)
1545 })
1546 }
1547 pub fn fifo_mlc_filt_batch_get(&mut self) -> Result<u8, Error<B::Error>> {
1550 MemBank::operate_over_embed(self, |state| {
1551 EmbFuncFifoEnB::read(state).map(|reg| reg.mlc_filter_feature_fifo_en())
1552 })
1553 }
1554 pub fn fifo_sh_batch_slave_set(&mut self, idx: u8, val: u8) -> Result<(), Error<B::Error>> {
1556 self.mem_bank_set(MemBank::SensorHubMemBank)?;
1557
1558 let mut buf = [0u8; 1];
1559 self.read_from_register(SnsHubReg::Slv0Config as u8 + idx * 3, &mut buf)?;
1560 let mut slv_config = Slv0Config::from_bits(buf[0]);
1561 slv_config.set_batch_ext_sens_0_en(val);
1562 self.write_to_register(SnsHubReg::Slv0Config as u8 + idx * 3, &[slv_config.into()])?;
1563
1564 self.mem_bank_set(MemBank::MainMemBank)
1565 }
1566 pub fn fifo_sh_batch_slave_get(&mut self, idx: u8) -> Result<u8, Error<B::Error>> {
1568 self.mem_bank_set(MemBank::SensorHubMemBank)?;
1569
1570 let mut buf = [0u8; 1];
1571 self.read_from_register(SnsHubReg::Slv0Config as u8 + idx * 3, &mut buf)?;
1572 let val: u8 = Slv0Config::from_bits(buf[0]).batch_ext_sens_0_en();
1573
1574 self.mem_bank_set(MemBank::MainMemBank)?;
1575
1576 Ok(val)
1577 }
1578 pub fn fifo_sflp_batch_set(&mut self, val: FifoSflpRaw) -> Result<(), Error<B::Error>> {
1580 MemBank::operate_over_embed(self, |state| {
1581 let mut emb_func_fifo_en_a = EmbFuncFifoEnA::read(state)?;
1582 emb_func_fifo_en_a.set_sflp_game_fifo_en(val.game_rotation);
1583 emb_func_fifo_en_a.set_sflp_gravity_fifo_en(val.gravity);
1584 emb_func_fifo_en_a.set_sflp_gbias_fifo_en(val.gbias);
1585 emb_func_fifo_en_a.write(state)
1586 })
1587 }
1588 pub fn fifo_sflp_batch_get(&mut self) -> Result<FifoSflpRaw, Error<B::Error>> {
1590 MemBank::operate_over_embed(self, |state| {
1591 let emb_func_fifo_en_a = EmbFuncFifoEnA::read(state)?;
1592
1593 let val = FifoSflpRaw {
1594 game_rotation: emb_func_fifo_en_a.sflp_game_fifo_en(),
1595 gravity: emb_func_fifo_en_a.sflp_gravity_fifo_en(),
1596 gbias: emb_func_fifo_en_a.sflp_gbias_fifo_en(),
1597 };
1598
1599 Ok(val)
1600 })
1601 }
1602 pub fn filt_anti_spike_set(&mut self, val: FiltAntiSpike) -> Result<(), Error<B::Error>> {
1604 let mut if_cfg = IfCfg::read(self)?;
1605 if_cfg.set_asf_ctrl((val as u8) & 0x01);
1606 if_cfg.write(self)
1607 }
1608 pub fn filt_anti_spike_get(&mut self) -> Result<FiltAntiSpike, Error<B::Error>> {
1610 let if_cfg = IfCfg::read(self)?;
1611 let val = FiltAntiSpike::try_from(if_cfg.asf_ctrl()).unwrap_or_default();
1612
1613 Ok(val)
1614 }
1615 pub fn filt_settling_mask_set(&mut self, val: FiltSettlingMask) -> Result<(), Error<B::Error>> {
1617 let mut ctrl4 = Ctrl4::read(self)?;
1619 ctrl4.set_drdy_mask(val.drdy);
1620 ctrl4.write(self)?;
1621
1622 let mut emb_func_cfg = EmbFuncCfg::read(self)?;
1624 emb_func_cfg.set_emb_func_irq_mask_xl_settl(val.irq_xl);
1625 emb_func_cfg.set_emb_func_irq_mask_g_settl(val.irq_g);
1626 emb_func_cfg.write(self)?;
1627
1628 let mut ui_int_ois = UiIntOis::read(self)?;
1630 ui_int_ois.set_drdy_mask_ois(val.ois_drdy);
1631 ui_int_ois.write(self)
1632 }
1633 pub fn filt_settling_mask_get(&mut self) -> Result<FiltSettlingMask, Error<B::Error>> {
1635 let emb_func_cfg = EmbFuncCfg::read(self)?;
1636 let ui_int_ois = UiIntOis::read(self)?;
1637 let ctrl4 = Ctrl4::read(self)?;
1638
1639 let val: FiltSettlingMask = FiltSettlingMask {
1640 irq_xl: emb_func_cfg.emb_func_irq_mask_xl_settl(),
1641 irq_g: emb_func_cfg.emb_func_irq_mask_g_settl(),
1642 drdy: ctrl4.drdy_mask(),
1643 ois_drdy: ui_int_ois.drdy_mask_ois(),
1644 };
1645
1646 Ok(val)
1647 }
1648 pub fn filt_ois_settling_mask_set(&mut self, ois_drdy: u8) -> Result<(), Error<B::Error>> {
1650 let mut spi2_int_ois = Spi2IntOis::read(self)?;
1651 spi2_int_ois.set_drdy_mask_ois(ois_drdy);
1652 spi2_int_ois.write(self)
1653 }
1654 pub fn filt_ois_settling_mask_get(&mut self) -> Result<FiltOisSettlingMask, Error<B::Error>> {
1656 let spi2_int_ois = Spi2IntOis::read(self)?;
1657 let val = FiltOisSettlingMask {
1658 ois_drdy: spi2_int_ois.drdy_mask_ois(),
1659 };
1660 Ok(val)
1661 }
1662 pub fn filt_gy_lp1_bandwidth_set(
1664 &mut self,
1665 val: FiltGyLp1Bandwidth,
1666 ) -> Result<(), Error<B::Error>> {
1667 let mut ctrl6 = Ctrl6::read(self)?;
1668 ctrl6.set_lpf1_g_bw((val as u8) & 0x0F);
1669 ctrl6.write(self)
1670 }
1671 pub fn filt_gy_lp1_bandwidth_get(&mut self) -> Result<FiltGyLp1Bandwidth, Error<B::Error>> {
1673 let ctrl6 = Ctrl6::read(self)?;
1674 let bandwidth = FiltGyLp1Bandwidth::try_from(ctrl6.lpf1_g_bw()).unwrap_or_default();
1675
1676 Ok(bandwidth)
1677 }
1678 pub fn filt_gy_lp1_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1680 let mut ctrl7 = Ctrl7::read(self)?;
1681 ctrl7.set_lpf1_g_en(val);
1682 ctrl7.write(self)
1683 }
1684 pub fn filt_gy_lp1_get(&mut self) -> Result<u8, Error<B::Error>> {
1686 Ctrl7::read(self).map(|reg| reg.lpf1_g_en())
1687 }
1688 pub fn filt_xl_lp2_bandwidth_set(
1690 &mut self,
1691 val: FiltXlLp2Bandwidth,
1692 ) -> Result<(), Error<B::Error>> {
1693 let mut ctrl8 = Ctrl8::read(self)?;
1694 ctrl8.set_hp_lpf2_xl_bw((val as u8) & 0x07);
1695 ctrl8.write(self)
1696 }
1697 pub fn filt_xl_lp2_bandwidth_get(&mut self) -> Result<FiltXlLp2Bandwidth, Error<B::Error>> {
1699 let ctrl8 = Ctrl8::read(self)?;
1700 let bandwidth =
1701 FiltXlLp2Bandwidth::try_from(ctrl8.hp_lpf2_xl_bw() & 0x07).unwrap_or_default();
1702
1703 Ok(bandwidth)
1704 }
1705 pub fn filt_xl_lp2_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1707 let mut ctrl9 = Ctrl9::read(self)?;
1708 ctrl9.set_lpf2_xl_en(val);
1709 ctrl9.write(self)
1710 }
1711 pub fn filt_xl_lp2_get(&mut self) -> Result<u8, Error<B::Error>> {
1713 let val: u8 = Ctrl9::read(self).map(|reg| reg.lpf2_xl_en())?;
1714
1715 Ok(val)
1716 }
1717 pub fn filt_xl_hp_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1719 let mut ctrl9 = Ctrl9::read(self)?;
1720 ctrl9.set_hp_slope_xl_en(val);
1721 ctrl9.write(self)
1722 }
1723 pub fn filt_xl_hp_get(&mut self) -> Result<u8, Error<B::Error>> {
1725 let val: u8 = Ctrl9::read(self).map(|reg| reg.hp_slope_xl_en())?;
1726
1727 Ok(val)
1728 }
1729 pub fn filt_xl_fast_settling_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1731 let mut ctrl9 = Ctrl9::read(self)?;
1732 ctrl9.set_xl_fastsettl_mode(val);
1733 ctrl9.write(self)
1734 }
1735 pub fn filt_xl_fast_settling_get(&mut self) -> Result<u8, Error<B::Error>> {
1737 let val: u8 = Ctrl9::read(self).map(|reg| reg.xl_fastsettl_mode())?;
1738
1739 Ok(val)
1740 }
1741 pub fn filt_xl_hp_mode_set(&mut self, val: FiltXlHpMode) -> Result<(), Error<B::Error>> {
1743 let mut ctrl9 = Ctrl9::read(self)?;
1744 ctrl9.set_hp_ref_mode_xl(val as u8 & 0x01);
1745 ctrl9.write(self)
1746 }
1747 pub fn filt_xl_hp_mode_get(&mut self) -> Result<FiltXlHpMode, Error<B::Error>> {
1749 let ctrl9 = Ctrl9::read(self)?;
1750
1751 let mode = FiltXlHpMode::try_from(ctrl9.hp_ref_mode_xl()).unwrap_or_default();
1752
1753 Ok(mode)
1754 }
1755 pub fn filt_wkup_act_feed_set(&mut self, val: FiltWkupActFeed) -> Result<(), Error<B::Error>> {
1759 let mut wake_up_ths = WakeUpThs::read(self)?;
1760 let mut tap_cfg0 = TapCfg0::read(self)?;
1761
1762 tap_cfg0.set_slope_fds((val as u8) & 0x01);
1763 tap_cfg0.write(self)?;
1764
1765 wake_up_ths.set_usr_off_on_wu(((val as u8) & 0x02) >> 1);
1766 wake_up_ths.write(self)
1767 }
1768 pub fn filt_wkup_act_feed_get(&mut self) -> Result<FiltWkupActFeed, Error<B::Error>> {
1772 let wake_up_ths = WakeUpThs::read(self)?;
1773 let tap_cfg0 = TapCfg0::read(self)?;
1774
1775 let result =
1776 FiltWkupActFeed::try_from((wake_up_ths.usr_off_on_wu() << 1) + tap_cfg0.slope_fds())
1777 .unwrap_or_default();
1778
1779 Ok(result)
1780 }
1781 pub fn mask_trigger_xl_settl_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
1785 let mut tap_cfg0 = TapCfg0::read(self)?;
1786 tap_cfg0.set_hw_func_mask_xl_settl(val & 0x01);
1787 tap_cfg0.write(self)
1788 }
1789 pub fn mask_trigger_xl_settl_get(&mut self) -> Result<u8, Error<B::Error>> {
1793 TapCfg0::read(self).map(|reg| reg.hw_func_mask_xl_settl())
1794 }
1795 pub fn filt_sixd_feed_set(&mut self, val: FiltSixdFeed) -> Result<(), Error<B::Error>> {
1797 let mut tap_cfg0 = TapCfg0::read(self)?;
1798 tap_cfg0.set_low_pass_on_6d((val as u8) & 0x01);
1799 tap_cfg0.write(self)
1800 }
1801 pub fn filt_sixd_feed_get(&mut self) -> Result<FiltSixdFeed, Error<B::Error>> {
1803 let reg = TapCfg0::read(self)?;
1804 let val = FiltSixdFeed::try_from(reg.low_pass_on_6d()).unwrap_or_default();
1805 Ok(val)
1806 }
1807 pub fn filt_gy_eis_lp_bandwidth_set(
1809 &mut self,
1810 val: FiltGyEisLpBandwidth,
1811 ) -> Result<(), Error<B::Error>> {
1812 let mut ctrl_eis = CtrlEis::read(self)?;
1813 ctrl_eis.set_lpf_g_eis_bw(val as u8 & 0x01);
1814 ctrl_eis.write(self)
1815 }
1816 pub fn filt_gy_eis_lp_bandwidth_get(
1818 &mut self,
1819 ) -> Result<FiltGyEisLpBandwidth, Error<B::Error>> {
1820 let ctrl_eis = CtrlEis::read(self)?;
1821
1822 let val = FiltGyEisLpBandwidth::try_from(ctrl_eis.lpf_g_eis_bw()).unwrap_or_default();
1823
1824 Ok(val)
1825 }
1826 pub fn filt_gy_ois_lp_bandwidth_set(
1830 &mut self,
1831 val: FiltGyOisLpBandwidth,
1832 ) -> Result<(), Error<B::Error>> {
1833 let mut ui_ctrl2_ois = UiCtrl2Ois::read(self)?;
1834
1835 ui_ctrl2_ois.set_lpf1_g_ois_bw((val as u8) & 0x03);
1836 ui_ctrl2_ois.write(self)
1837 }
1838 pub fn filt_gy_ois_lp_bandwidth_get(
1842 &mut self,
1843 ) -> Result<FiltGyOisLpBandwidth, Error<B::Error>> {
1844 let ui_ctrl2_ois = UiCtrl2Ois::read(self)?;
1845
1846 let val = FiltGyOisLpBandwidth::try_from(ui_ctrl2_ois.lpf1_g_ois_bw()).unwrap_or_default();
1847
1848 Ok(val)
1849 }
1850 pub fn filt_xl_ois_lp_bandwidth_set(
1854 &mut self,
1855 val: FiltXlOisLpBandwidth,
1856 ) -> Result<(), Error<B::Error>> {
1857 let mut ui_ctrl3_ois = UiCtrl3Ois::read(self)?;
1858 ui_ctrl3_ois.set_lpf_xl_ois_bw((val as u8) & 0x07);
1859 ui_ctrl3_ois.write(self)
1860 }
1861 pub fn filt_xl_ois_lp_bandwidth_get(
1865 &mut self,
1866 ) -> Result<FiltXlOisLpBandwidth, Error<B::Error>> {
1867 let reg = UiCtrl3Ois::read(self)?;
1868
1869 let val = FiltXlOisLpBandwidth::try_from(reg.lpf_xl_ois_bw()).unwrap_or_default();
1870
1871 Ok(val)
1872 }
1873 pub fn fsm_permission_set(&mut self, val: FsmPermission) -> Result<(), Error<B::Error>> {
1877 let mut func_cfg_access = FuncCfgAccess::read(self)?;
1878 func_cfg_access.set_fsm_wr_ctrl_en(val as u8 & 0x01);
1879 func_cfg_access.write(self)
1880 }
1881 pub fn fsm_permission_get(&mut self) -> Result<FsmPermission, Error<B::Error>> {
1883 let func_cfg_access = FuncCfgAccess::read(self)?;
1884
1885 match func_cfg_access.fsm_wr_ctrl_en() {
1886 0 => Ok(FsmPermission::ProtectCtrlRegs),
1887 1 => Ok(FsmPermission::WriteCtrlReg),
1888 _ => Ok(FsmPermission::ProtectCtrlRegs),
1889 }
1890 }
1891 pub fn fsm_permission_status(&mut self) -> Result<u8, Error<B::Error>> {
1896 let val: u8 = CtrlStatus::read(self).map(|reg| reg.fsm_wr_ctrl_status())?;
1897
1898 Ok(val)
1899 }
1900 pub fn fsm_mode_set(&mut self, val: FsmMode) -> Result<(), Error<B::Error>> {
1902 const PROPERTY_ENABLE: u8 = 1;
1903 const PROPERTY_DISABLE: u8 = 0;
1904
1905 MemBank::operate_over_embed(self, |state| {
1906 let mut emb_func_en_b = EmbFuncEnB::read(state)?;
1907 let mut fsm_enable = FsmEnable::read(state)?;
1908
1909 if (val.fsm1_en
1910 | val.fsm2_en
1911 | val.fsm3_en
1912 | val.fsm4_en
1913 | val.fsm5_en
1914 | val.fsm6_en
1915 | val.fsm7_en
1916 | val.fsm8_en)
1917 == PROPERTY_ENABLE
1918 {
1919 emb_func_en_b.set_fsm_en(PROPERTY_ENABLE);
1920 } else {
1921 emb_func_en_b.set_fsm_en(PROPERTY_DISABLE);
1922 }
1923
1924 fsm_enable.set_fsm1_en(val.fsm1_en);
1925 fsm_enable.set_fsm2_en(val.fsm2_en);
1926 fsm_enable.set_fsm3_en(val.fsm3_en);
1927 fsm_enable.set_fsm4_en(val.fsm4_en);
1928 fsm_enable.set_fsm5_en(val.fsm5_en);
1929 fsm_enable.set_fsm6_en(val.fsm6_en);
1930 fsm_enable.set_fsm7_en(val.fsm7_en);
1931 fsm_enable.set_fsm8_en(val.fsm8_en);
1932
1933 fsm_enable.write(state)?;
1934 emb_func_en_b.write(state)
1935 })
1936 }
1937 pub fn fsm_mode_get(&mut self) -> Result<FsmMode, Error<B::Error>> {
1939 MemBank::operate_over_embed(self, |state| {
1940 let fsm_enable = FsmEnable::read(state)?;
1941 Ok(FsmMode {
1942 fsm1_en: fsm_enable.fsm1_en(),
1943 fsm2_en: fsm_enable.fsm2_en(),
1944 fsm3_en: fsm_enable.fsm3_en(),
1945 fsm4_en: fsm_enable.fsm4_en(),
1946 fsm5_en: fsm_enable.fsm5_en(),
1947 fsm6_en: fsm_enable.fsm6_en(),
1948 fsm7_en: fsm_enable.fsm7_en(),
1949 fsm8_en: fsm_enable.fsm8_en(),
1950 })
1951 })
1952 }
1953 pub fn fsm_long_cnt_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
1957 MemBank::operate_over_embed(self, |state| FsmLongCounter(val).write(state))
1958 }
1959 pub fn fsm_long_cnt_get(&mut self) -> Result<u16, Error<B::Error>> {
1963 MemBank::operate_over_embed(self, |state| FsmLongCounter::read(state).map(|reg| reg.0))
1964 }
1965 pub fn fsm_out_get(&mut self) -> Result<[FsmOutsElement; 8], Error<B::Error>> {
1967 MemBank::operate_over_embed(self, |state| FsmOut::read(state).map(|reg| reg.0))
1968 }
1969 pub fn fsm_data_rate_set(&mut self, val: FsmDataRate) -> Result<(), Error<B::Error>> {
1971 MemBank::operate_over_embed(self, |state| {
1972 let mut fsm_odr = FsmOdr::read(state)?;
1973 fsm_odr.set_fsm_odr((val as u8) & 0x07);
1974 fsm_odr.write(state)
1975 })
1976 }
1977 pub fn fsm_data_rate_get(&mut self) -> Result<FsmDataRate, Error<B::Error>> {
1979 MemBank::operate_over_embed(self, |state| {
1981 let fsm_odr = FsmOdr::read(state)?;
1983 let val = FsmDataRate::try_from(fsm_odr.fsm_odr()).unwrap_or_default();
1985 Ok(val)
1986 })
1987 }
1988 pub fn sflp_game_gbias_set(&mut self, val: &SflpGbias) -> Result<(), Error<B::Error>> {
1994 let mut emb_func_en_saved: (EmbFuncEnA, EmbFuncEnB);
1995 let mut gbias_hf: [u16; 3] = [0; 3];
1996 let mut data_tmp: i32;
1997 let mut data_bytes: [u8; 4];
1998
1999 let sflp_odr = self.sflp_data_rate_get()?;
2000
2001 let k = match sflp_odr {
2002 SflpDataRate::_15hz => 0.04,
2003 SflpDataRate::_30hz => 0.02,
2004 SflpDataRate::_60hz => 0.01,
2005 SflpDataRate::_120hz => 0.005,
2006 SflpDataRate::_240hz => 0.0025,
2007 SflpDataRate::_480hz => 0.00125,
2008 };
2009
2010 gbias_hf[0] = self.npy_float_to_half(val.gbias_x * (core::f32::consts::PI / 180.0) / k);
2012 gbias_hf[1] = self.npy_float_to_half(val.gbias_y * (core::f32::consts::PI / 180.0) / k);
2013 gbias_hf[2] = self.npy_float_to_half(val.gbias_z * (core::f32::consts::PI / 180.0) / k);
2014
2015 let conf_saved = (Ctrl1::read(self)?, Ctrl2::read(self)?);
2018 self.xl_mode_set(XlMode::HighPerformanceMd)?;
2019 self.gy_mode_set(GyMode::HighPerformanceMd)?;
2020 if conf_saved.0.odr_xl() == Odr::Off as u8 {
2021 self.xl_data_rate_set(Odr::_120hz)?;
2022 }
2023
2024 let master_config = self.sh_master_get()?;
2026 self.sh_master_set(0)?;
2027
2028 emb_func_en_saved = MemBank::operate_over_embed(self, |state| {
2030 let tmp_emb_func_en_saved = (EmbFuncEnA::read(state)?, EmbFuncEnB::read(state)?);
2031 EmbFuncEnA::from_bits(0).write(state)?;
2032 EmbFuncEnB::from_bits(0).write(state)?;
2033 loop {
2034 let emb_func_sts = EmbFuncExecStatus::read(state)?;
2035 if emb_func_sts.emb_func_endop() == 1 {
2036 break;
2037 }
2038 }
2039
2040 Ok(tmp_emb_func_en_saved)
2041 })?;
2042
2043 let mut ctrl10 = Ctrl10::read(self)?;
2045 ctrl10.set_emb_func_debug(1);
2046 ctrl10.write(self)?;
2047
2048 MemBank::operate_over_embed(self, |state| {
2050 emb_func_en_saved.0.set_sflp_game_en(1); emb_func_en_saved.0.write(state)?;
2052 emb_func_en_saved.1.write(state)
2053 })?;
2054
2055 let xl_fs = self.xl_full_scale_get()?;
2056
2057 loop {
2058 let drdy = self.flag_data_ready_get()?;
2059 if drdy.drdy_xl == 1 {
2060 break;
2061 }
2062 }
2063
2064 let xl_data: [i16; 3] = self.acceleration_raw_get()?;
2065
2066 self.mem_bank_set(MemBank::SensorHubMemBank)?;
2068 for i in 0..3 {
2069 data_tmp = xl_data[i as usize] as i32;
2070 data_tmp <<= xl_fs as i32; data_bytes = data_tmp.to_le_bytes();
2072 self.write_to_register(SnsHubReg::SensorHub1 as u8 + 3 * i, &[data_bytes[0]])?;
2073 self.write_to_register(SnsHubReg::SensorHub2 as u8 + 3 * i, &[data_bytes[1]])?;
2074 self.write_to_register(SnsHubReg::SensorHub3 as u8 + 3 * i, &[data_bytes[2]])?;
2075 }
2076 for i in 0..3 {
2077 data_tmp = 0;
2078 data_bytes = data_tmp.to_le_bytes();
2079 self.write_to_register(SnsHubReg::SensorHub10 as u8 + 3 * i, &[data_bytes[0]])?;
2080 self.write_to_register(SnsHubReg::SensorHub11 as u8 + 3 * i, &[data_bytes[1]])?;
2081 self.write_to_register(SnsHubReg::SensorHub12 as u8 + 3 * i, &[data_bytes[2]])?;
2082 }
2083 self.mem_bank_set(MemBank::MainMemBank)?;
2084
2085 self.tim.delay_ms(1);
2087 MemBank::operate_over_embed(self, |state| {
2088 loop {
2089 let emb_func_sts = EmbFuncExecStatus::read(state)?;
2090 if emb_func_sts.emb_func_endop() == 1 {
2091 break;
2092 }
2093 }
2094 Ok(())
2095 })?;
2096
2097 SflpGameGbiasXYZ(gbias_hf).write(self)?;
2099
2100 conf_saved.0.write(self)?;
2102 conf_saved.1.write(self)?;
2103
2104 ctrl10.set_emb_func_debug(0);
2106 ctrl10.write(self)?;
2107
2108 self.sh_master_set(master_config)
2110 }
2111 pub fn fsm_ext_sens_sensitivity_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
2119 FsmExtSensitivity(val).write(self)
2120 }
2121 pub fn fsm_ext_sens_sensitivity_get(&mut self) -> Result<u16, Error<B::Error>> {
2129 FsmExtSensitivity::read(self).map(|reg| reg.0)
2130 }
2131 pub fn fsm_ext_sens_offset_set(
2136 &mut self,
2137 val: XlFsmExtSensOffset,
2138 ) -> Result<(), Error<B::Error>> {
2139 FsmExtOffXYZ([val.x, val.y, val.z]).write(self)
2140 }
2141 pub fn fsm_ext_sens_offset_get(&mut self) -> Result<XlFsmExtSensOffset, Error<B::Error>> {
2146 FsmExtOffXYZ::read(self).map(|reg| XlFsmExtSensOffset {
2147 x: reg.0[0],
2148 y: reg.0[1],
2149 z: reg.0[2],
2150 })
2151 }
2152 pub fn fsm_ext_sens_matrix_set(
2157 &mut self,
2158 val: XlFsmExtSensMatrix,
2159 ) -> Result<(), Error<B::Error>> {
2160 let buff: [u8; 12] = val.to_le_bytes();
2161
2162 FsmExtMatrix(buff).write(self)
2163 }
2164 pub fn fsm_ext_sens_matrix_get(&mut self) -> Result<XlFsmExtSensMatrix, Error<B::Error>> {
2169 let buff: [u8; 12] = FsmExtMatrix::read(self)?.0;
2170 Ok(XlFsmExtSensMatrix::from_le_bytes(buff))
2171 }
2172 pub fn fsm_ext_sens_z_orient_set(
2174 &mut self,
2175 val: FsmExtSensZOrient,
2176 ) -> Result<(), Error<B::Error>> {
2177 let mut ext_cfg_a = ExtCfgA::read(self)?;
2178 ext_cfg_a.set_ext_z_axis((val as u8) & 0x07);
2179 ext_cfg_a.write(self)
2180 }
2181 pub fn fsm_ext_sens_z_orient_get(&mut self) -> Result<FsmExtSensZOrient, Error<B::Error>> {
2183 let ext_cfg_a = ExtCfgA::read(self)?;
2184
2185 let orientation = match ext_cfg_a.ext_z_axis() {
2186 0x0 => FsmExtSensZOrient::ZEqY,
2187 0x1 => FsmExtSensZOrient::ZEqMinY,
2188 0x2 => FsmExtSensZOrient::ZEqX,
2189 0x3 => FsmExtSensZOrient::ZEqMinX,
2190 0x4 => FsmExtSensZOrient::ZEqMinZ,
2191 0x5 => FsmExtSensZOrient::ZEqZ,
2192 _ => FsmExtSensZOrient::ZEqY, };
2194
2195 Ok(orientation)
2196 }
2197 pub fn fsm_ext_sens_y_orient_set(
2199 &mut self,
2200 val: FsmExtSensYOrient,
2201 ) -> Result<(), Error<B::Error>> {
2202 let mut ext_cfg_a = ExtCfgA::read(self)?;
2203 ext_cfg_a.set_ext_y_axis((val as u8) & 0x7);
2204 ext_cfg_a.write(self)
2205 }
2206 pub fn fsm_ext_sens_y_orient_get(&mut self) -> Result<FsmExtSensYOrient, Error<B::Error>> {
2208 let ext_cfg_a = ExtCfgA::read(self)?;
2209 let val = FsmExtSensYOrient::try_from(ext_cfg_a.ext_y_axis()).unwrap_or_default();
2210
2211 Ok(val)
2212 }
2213 pub fn fsm_ext_sens_x_orient_set(
2215 &mut self,
2216 val: FsmExtSensXOrient,
2217 ) -> Result<(), Error<B::Error>> {
2218 let mut ext_cfg_b = ExtCfgB::read(self)?;
2219 ext_cfg_b.set_ext_x_axis((val as u8) & 0x7);
2220 ext_cfg_b.write(self)
2221 }
2222 pub fn fsm_ext_sens_x_orient_get(&mut self) -> Result<FsmExtSensXOrient, Error<B::Error>> {
2224 let ext_cfg_b = ExtCfgB::read(self)?;
2225 let val = FsmExtSensXOrient::try_from(ext_cfg_b.ext_x_axis()).unwrap_or_default();
2226
2227 Ok(val)
2228 }
2229 pub fn fsm_long_cnt_timeout_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
2234 FsmLcTimeout(val).write(self)
2235 }
2236 pub fn fsm_long_cnt_timeout_get(&mut self) -> Result<u16, Error<B::Error>> {
2241 FsmLcTimeout::read(self).map(|reg| reg.0)
2242 }
2243 pub fn fsm_number_of_programs_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2247 let mut fsm_programs = FsmPrograms::read(self)?;
2248 fsm_programs.set_fsm_n_prog(val);
2249 fsm_programs.write(self)
2250 }
2251 pub fn fsm_number_of_programs_get(&mut self) -> Result<u8, Error<B::Error>> {
2253 let val: u8 = FsmPrograms::read(self)?.fsm_n_prog();
2254 Ok(val)
2255 }
2256 pub fn fsm_start_address_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
2260 FsmStartAdd(val).write(self)
2261 }
2262 pub fn fsm_start_address_get(&mut self) -> Result<u16, Error<B::Error>> {
2266 FsmStartAdd::read(self).map(|reg| reg.0)
2267 }
2268 pub fn ff_time_windows_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2272 let mut wake_up_dur = WakeUpDur::read(self)?;
2274 wake_up_dur.set_ff_dur((val & 0x20) >> 5);
2275 wake_up_dur.write(self)?;
2276
2277 let mut free_fall = FreeFall::read(self)?;
2279 free_fall.set_ff_dur(val & 0x1F);
2280 free_fall.write(self)
2281 }
2282 pub fn ff_time_windows_get(&mut self) -> Result<u8, Error<B::Error>> {
2286 let wake_up_dur = WakeUpDur::read(self)?;
2287 let free_fall = FreeFall::read(self)?;
2288
2289 let val: u8 = (wake_up_dur.ff_dur() << 5) + free_fall.ff_dur();
2290
2291 Ok(val)
2292 }
2293 pub fn ff_thresholds_set(&mut self, val: FfThreshold) -> Result<(), Error<B::Error>> {
2295 let mut free_fall = FreeFall::read(self)?;
2296 free_fall.set_ff_ths((val as u8) & 0x7);
2297
2298 free_fall.write(self)
2299 }
2300 pub fn ff_thresholds_get(&mut self) -> Result<FfThreshold, Error<B::Error>> {
2302 let free_fall = FreeFall::read(self)?;
2303
2304 let val = FfThreshold::try_from(free_fall.ff_ths()).unwrap_or_default();
2305
2306 Ok(val)
2307 }
2308 pub fn mlc_set(&mut self, val: MlcMode) -> Result<(), Error<B::Error>> {
2313 MemBank::operate_over_embed(self, |state| {
2314 let mut emb_en_a = EmbFuncEnA::read(state)?;
2315 let mut emb_en_b = EmbFuncEnB::read(state)?;
2316
2317 match val {
2318 MlcMode::Off => {
2319 emb_en_a.set_mlc_before_fsm_en(0);
2320 emb_en_b.set_mlc_en(0);
2321 }
2322 MlcMode::On => {
2323 emb_en_a.set_mlc_before_fsm_en(0);
2324 emb_en_b.set_mlc_en(1);
2325 }
2326 MlcMode::OnBeforeFsm => {
2327 emb_en_a.set_mlc_before_fsm_en(1);
2328 emb_en_b.set_mlc_en(0);
2329 }
2330 }
2331
2332 emb_en_a.write(state)?;
2333 emb_en_b.write(state)
2334 })
2335 }
2336 pub fn mlc_get(&mut self) -> Result<MlcMode, Error<B::Error>> {
2341 MemBank::operate_over_embed(self, |state| {
2342 let emb_en_a = EmbFuncEnA::read(state)?;
2343 let emb_en_b = EmbFuncEnB::read(state)?;
2344
2345 let val = match (emb_en_a.mlc_before_fsm_en(), emb_en_b.mlc_en()) {
2346 (0, 0) => MlcMode::Off,
2347 (0, 1) => MlcMode::On,
2348 (1, _) => MlcMode::OnBeforeFsm,
2349 _ => MlcMode::Off,
2350 };
2351
2352 Ok(val)
2353 })
2354 }
2355 pub fn mlc_data_rate_set(&mut self, val: MlcDataRate) -> Result<(), Error<B::Error>> {
2357 MemBank::operate_over_embed(self, |state| {
2358 let mut mlc_odr = MlcOdr::read(state)?;
2359 mlc_odr.set_mlc_odr((val as u8) & 0x07);
2360 mlc_odr.write(state)
2361 })
2362 }
2363 pub fn mlc_data_rate_get(&mut self) -> Result<MlcDataRate, Error<B::Error>> {
2365 MemBank::operate_over_embed(self, |state| {
2366 let mlc_odr = MlcOdr::read(state)?;
2367 let val = MlcDataRate::try_from(mlc_odr.mlc_odr()).unwrap_or_default();
2368 Ok(val)
2369 })
2370 }
2371 pub fn mlc_out_get(&mut self) -> Result<MlcOut, Error<B::Error>> {
2373 MemBank::operate_over_embed(self, |state| {
2374 let mlc_outs = MlcSrc::read(state)?.0;
2375 Ok(MlcOut::from_le_bytes(mlc_outs))
2376 })
2377 }
2378 pub fn mlc_ext_sens_sensitivity_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
2386 MlcExtSensitivity(val).write(self)
2387 }
2388 pub fn mlc_ext_sens_sensitivity_get(&mut self) -> Result<u16, Error<B::Error>> {
2396 MlcExtSensitivity::read(self).map(|reg| reg.0)
2397 }
2398 pub fn ois_ctrl_mode_set(&mut self, val: OisCtrlMode) -> Result<(), Error<B::Error>> {
2400 let mut func_cfg_access = FuncCfgAccess::read(self)?;
2401 func_cfg_access.set_ois_ctrl_from_ui((val as u8) & 0x1);
2402 func_cfg_access.write(self)
2403 }
2404 pub fn ois_ctrl_mode_get(&mut self) -> Result<OisCtrlMode, Error<B::Error>> {
2406 let func_cfg_access = FuncCfgAccess::read(self)?;
2407
2408 let val = OisCtrlMode::try_from(func_cfg_access.ois_ctrl_from_ui()).unwrap_or_default();
2409
2410 Ok(val)
2411 }
2412 pub fn ois_reset_set(&mut self, val: i8) -> Result<(), Error<B::Error>> {
2416 let mut func_cfg_access = FuncCfgAccess::read(self)?;
2417
2418 func_cfg_access.set_spi2_reset(val as u8);
2419
2420 func_cfg_access.write(self)
2421 }
2422 pub fn ois_reset_get(&mut self) -> Result<i8, Error<B::Error>> {
2424 let val: i8 = FuncCfgAccess::read(self).map(|reg| reg.spi2_reset() as i8)?;
2425
2426 Ok(val)
2427 }
2428 pub fn ois_interface_pull_up_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2430 let mut pin_ctrl = PinCtrl::read(self)?;
2431 pin_ctrl.set_ois_pu_dis(val);
2432 pin_ctrl.write(self)
2433 }
2434 pub fn ois_interface_pull_up_get(&mut self) -> Result<u8, Error<B::Error>> {
2436 let val: u8 = PinCtrl::read(self).map(|reg| reg.ois_pu_dis())?;
2437
2438 Ok(val)
2439 }
2440 pub fn ois_handshake_from_ui_set(&mut self, val: OisHandshake) -> Result<(), Error<B::Error>> {
2449 let mut ui_handshake_ctrl = UiHandshakeCtrl::read(self)?;
2450 ui_handshake_ctrl.set_ui_shared_ack(val.ack);
2451 ui_handshake_ctrl.set_ui_shared_req(val.req);
2452 ui_handshake_ctrl.write(self)
2453 }
2454 pub fn ois_handshake_from_ui_get(&mut self) -> Result<OisHandshake, Error<B::Error>> {
2461 let ui_handshake_ctrl: UiHandshakeCtrl = UiHandshakeCtrl::read(self)?;
2462 let value = OisHandshake {
2463 ack: ui_handshake_ctrl.ui_shared_ack(),
2464 req: ui_handshake_ctrl.ui_shared_req(),
2465 };
2466 Ok(value)
2467 }
2468 pub fn ois_handshake_from_ois_set(&mut self, val: OisHandshake) -> Result<(), Error<B::Error>> {
2475 let mut spi2_handshake_ctrl: Spi2HandshakeCtrl = Spi2HandshakeCtrl::read(self)?;
2476 spi2_handshake_ctrl.set_spi2_shared_ack(val.ack);
2477 spi2_handshake_ctrl.set_spi2_shared_req(val.req);
2478 spi2_handshake_ctrl.write(self)
2479 }
2480 pub fn ois_handshake_from_ois_get(&mut self) -> Result<OisHandshake, Error<B::Error>> {
2488 let spi2_handshake_ctrl = Spi2HandshakeCtrl::read(self)?;
2489 let val = OisHandshake {
2490 ack: spi2_handshake_ctrl.spi2_shared_ack(),
2491 req: spi2_handshake_ctrl.spi2_shared_req(),
2492 };
2493
2494 Ok(val)
2495 }
2496 pub fn ois_shared_set(&mut self, val: [u8; 6]) -> Result<(), Error<B::Error>> {
2498 UiSpi2Shared(val).write(self)
2499 }
2500 pub fn ois_shared_get(&mut self) -> Result<[u8; 6], Error<B::Error>> {
2502 UiSpi2Shared::read(self).map(|reg| reg.0)
2503 }
2504 pub fn ois_on_spi2_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2508 let mut ui_ctrl1_ois = UiCtrl1Ois::read(self)?;
2509 ui_ctrl1_ois.set_spi2_read_en(val);
2510 ui_ctrl1_ois.write(self)
2511 }
2512 pub fn ois_on_spi2_get(&mut self) -> Result<u8, Error<B::Error>> {
2517 let val: u8 = UiCtrl1Ois::read(self).map(|reg| reg.spi2_read_en())?;
2518
2519 Ok(val)
2520 }
2521 pub fn ois_chain_set(&mut self, val: OisChain) -> Result<(), Error<B::Error>> {
2525 let mut ui_ctrl1_ois = UiCtrl1Ois::read(self)?;
2526 ui_ctrl1_ois.set_ois_g_en(val.gy);
2527 ui_ctrl1_ois.set_ois_xl_en(val.xl);
2528 ui_ctrl1_ois.write(self)
2529 }
2530 pub fn ois_chain_get(&mut self) -> Result<OisChain, Error<B::Error>> {
2532 let ui_ctrl1_ois = UiCtrl1Ois::read(self)?;
2533 let gy = ui_ctrl1_ois.ois_g_en();
2534 let xl = ui_ctrl1_ois.ois_xl_en();
2535
2536 let val = OisChain { gy, xl };
2537
2538 Ok(val)
2539 }
2540 pub fn ois_gy_full_scale_set(&mut self, val: OisGyFullScale) -> Result<(), Error<B::Error>> {
2542 let mut ui_ctrl2_ois = UiCtrl2Ois::read(self)?;
2543 ui_ctrl2_ois.set_fs_g_ois(val as u8 & 0x03);
2544 ui_ctrl2_ois.write(self)
2545 }
2546 pub fn ois_gy_full_scale_get(&mut self) -> Result<OisGyFullScale, Error<B::Error>> {
2548 let fs_g_ois = UiCtrl2Ois::read(self).map(|reg| reg.fs_g_ois())?;
2549
2550 let val = OisGyFullScale::try_from(fs_g_ois).unwrap_or_default();
2551
2552 Ok(val)
2553 }
2554 pub fn ois_xl_full_scale_set(&mut self, val: OisXlFullScale) -> Result<(), Error<B::Error>> {
2556 let mut ui_ctrl3_ois = UiCtrl3Ois::read(self)?;
2557 ui_ctrl3_ois.set_fs_xl_ois((val as u8) & 0x3);
2558 ui_ctrl3_ois.write(self)
2559 }
2560 pub fn ois_xl_full_scale_get(&mut self) -> Result<OisXlFullScale, Error<B::Error>> {
2562 let ui_ctrl3_ois = UiCtrl3Ois::read(self)?;
2563
2564 let val = OisXlFullScale::try_from(ui_ctrl3_ois.fs_xl_ois()).unwrap_or_default();
2565
2566 Ok(val)
2567 }
2568 pub fn threshold_6d_set(&mut self, val: SixDThreshold) -> Result<(), Error<B::Error>> {
2570 let mut tap_ths_6d = TapThs6d::read(self)?;
2571 tap_ths_6d.set_sixd_ths((val as u8) & 0x03);
2572 tap_ths_6d.write(self)
2573 }
2574 pub fn threshold_6d_get(&mut self) -> Result<SixDThreshold, Error<B::Error>> {
2576 let tap_ths_6d = TapThs6d::read(self)?;
2577
2578 let value = SixDThreshold::try_from(tap_ths_6d.sixd_ths()).unwrap_or_default();
2579
2580 Ok(value)
2581 }
2582 pub fn mode_4d_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2586 let mut reg = TapThs6d::read(self)?;
2587 reg.set_d4d_en(val);
2588 reg.write(self)
2589 }
2590 pub fn mode_4d_get(&mut self) -> Result<u8, Error<B::Error>> {
2594 let val: u8 = TapThs6d::read(self).map(|reg| reg.d4d_en())?;
2595
2596 Ok(val)
2597 }
2598 pub fn ah_qvar_zin_set(&mut self, val: AhQvarZin) -> Result<(), Error<B::Error>> {
2600 let mut ctrl7 = Ctrl7::read(self)?;
2601 ctrl7.set_ah_qvar_c_zin((val as u8) & 0x03);
2602 ctrl7.write(self)
2603 }
2604 pub fn ah_qvar_zin_get(&mut self) -> Result<AhQvarZin, Error<B::Error>> {
2606 let ctrl7 = Ctrl7::read(self)?;
2607
2608 let result = AhQvarZin::try_from(ctrl7.ah_qvar_c_zin()).unwrap_or_default();
2609
2610 Ok(result)
2611 }
2612 pub fn ah_qvar_mode_set(&mut self, val: AhQvarMode) -> Result<(), Error<B::Error>> {
2617 let mut ctrl7 = Ctrl7::read(self)?;
2618 ctrl7.set_ah_qvar_en(val.ah_qvar_en);
2619 ctrl7.write(self)
2620 }
2621 pub fn ah_qvar_mode_get(&mut self) -> Result<AhQvarMode, Error<B::Error>> {
2626 let ctrl7 = Ctrl7::read(self)?;
2627 let val = AhQvarMode {
2628 ah_qvar_en: ctrl7.ah_qvar_en(),
2629 };
2630
2631 Ok(val)
2632 }
2633 pub fn i3c_reset_mode_set(&mut self, val: I3cResetMode) -> Result<(), Error<B::Error>> {
2635 let mut pin_ctrl = PinCtrl::read(self)?;
2636 pin_ctrl.set_ibhr_por_en((val as u8) & 0x01);
2637 pin_ctrl.write(self)
2638 }
2639 pub fn i3c_reset_mode_get(&mut self) -> Result<I3cResetMode, Error<B::Error>> {
2643 let pin_ctrl = PinCtrl::read(self)?;
2644 let mode = I3cResetMode::try_from(pin_ctrl.ibhr_por_en()).unwrap_or_default();
2645 Ok(mode)
2646 }
2647 pub fn i3c_int_en_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2649 let mut ctrl5 = Ctrl5::read(self)?;
2650 ctrl5.set_int_en_i3c(val & 0x01);
2651 ctrl5.write(self)
2652 }
2653 pub fn i3c_int_en_get(&mut self) -> Result<u8, Error<B::Error>> {
2655 let val: u8 = Ctrl5::read(self).map(|reg| reg.int_en_i3c())?;
2656
2657 Ok(val)
2658 }
2659 pub fn i3c_ibi_time_set(&mut self, val: I3cIbiTime) -> Result<(), Error<B::Error>> {
2661 let mut ctrl5 = Ctrl5::read(self)?;
2662 ctrl5.set_bus_act_sel((val as u8) & 0x03);
2663 ctrl5.write(self)
2664 }
2665 pub fn i3c_ibi_time_get(&mut self) -> Result<I3cIbiTime, Error<B::Error>> {
2667 let ctrl5 = Ctrl5::read(self)?;
2668
2669 let val = I3cIbiTime::try_from(ctrl5.bus_act_sel()).unwrap_or_default();
2670
2671 Ok(val)
2672 }
2673 pub fn sh_master_interface_pull_up_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2675 let mut if_cfg = IfCfg::read(self)?;
2676 if_cfg.set_shub_pu_en(val);
2677 if_cfg.write(self)
2678 }
2679 pub fn sh_master_interface_pull_up_get(&mut self) -> Result<u8, Error<B::Error>> {
2681 let val: u8 = IfCfg::read(self).map(|reg| reg.shub_pu_en())?;
2682
2683 Ok(val)
2684 }
2685 pub fn sh_read_data_raw_get(&mut self, rbuf: &mut [u8]) -> Result<(), Error<B::Error>> {
2690 MemBank::operate_over_sensorhub(self, |state| SensorHub1::read_more(state, rbuf))
2691 }
2692 pub fn sh_slave_connected_set(&mut self, val: ShSlaveConnected) -> Result<(), Error<B::Error>> {
2694 MemBank::operate_over_sensorhub(self, |state| {
2695 let mut master_config = MasterConfig::read(state)?;
2696 master_config.set_aux_sens_on((val as u8) & 0x3);
2697 master_config.write(state)
2698 })
2699 }
2700 pub fn sh_slave_connected_get(&mut self) -> Result<ShSlaveConnected, Error<B::Error>> {
2702 MemBank::operate_over_sensorhub(self, |state| {
2703 let master_config = MasterConfig::read(state)?;
2704 let result =
2705 ShSlaveConnected::try_from(master_config.aux_sens_on()).unwrap_or_default();
2706 Ok(result)
2707 })
2708 }
2709 pub fn sh_master_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2711 MemBank::operate_over_sensorhub(self, |state| {
2712 let mut master_config = MasterConfig::read(state)?;
2713 master_config.set_master_on(val);
2714 master_config.write(state)
2715 })
2716 }
2717 pub fn sh_master_get(&mut self) -> Result<u8, Error<B::Error>> {
2719 MemBank::operate_over_sensorhub(self, |state| {
2720 let master_config = MasterConfig::read(state)?;
2721 let val: u8 = master_config.master_on();
2722 Ok(val)
2723 })
2724 }
2725 pub fn sh_pass_through_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2727 MemBank::operate_over_sensorhub(self, |state| {
2729 let mut master_config = MasterConfig::read(state)?;
2731 master_config.set_pass_through_mode(val);
2732 master_config.write(state)
2733 })
2734 }
2735 pub fn sh_pass_through_get(&mut self) -> Result<u8, Error<B::Error>> {
2737 MemBank::operate_over_sensorhub(self, |state| {
2738 let master_config = MasterConfig::read(state)?;
2739 let val: u8 = master_config.pass_through_mode();
2740 Ok(val)
2741 })
2742 }
2743 pub fn sh_syncro_mode_set(&mut self, val: ShSyncroMode) -> Result<(), Error<B::Error>> {
2745 MemBank::operate_over_sensorhub(self, |state| {
2746 let mut master_config = MasterConfig::read(state)?;
2747 master_config.set_start_config((val as u8) & 0x01);
2748 master_config.write(state)
2749 })
2750 }
2751 pub fn sh_syncro_mode_get(&mut self) -> Result<ShSyncroMode, Error<B::Error>> {
2753 MemBank::operate_over_sensorhub(self, |state| {
2754 let master_config = MasterConfig::read(state)?;
2755 let val = ShSyncroMode::try_from(master_config.start_config()).unwrap_or_default();
2756 Ok(val)
2757 })
2758 }
2759 pub fn sh_write_mode_set(&mut self, val: ShWriteMode) -> Result<(), Error<B::Error>> {
2763 MemBank::operate_over_sensorhub(self, |state| {
2764 let mut master_config = MasterConfig::read(state)?;
2765 master_config.set_write_once(val as u8 & 0x01);
2766 master_config.write(state)
2767 })
2768 }
2769 pub fn sh_write_mode_get(&mut self) -> Result<ShWriteMode, Error<B::Error>> {
2771 MemBank::operate_over_sensorhub(self, |state| {
2772 let write_once = MasterConfig::read(state)?.write_once();
2773 let mode = ShWriteMode::try_from(write_once).unwrap_or_default();
2774 Ok(mode)
2775 })
2776 }
2777 pub fn sh_reset_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2781 MemBank::operate_over_sensorhub(self, |state| {
2782 let mut master_config = MasterConfig::read(state)?;
2783 master_config.set_rst_master_regs(val);
2784 master_config.write(state)
2785 })
2786 }
2787 pub fn sh_reset_get(&mut self) -> Result<u8, Error<B::Error>> {
2791 MemBank::operate_over_sensorhub(self, |state| {
2792 let master_config = MasterConfig::read(state)?;
2793 Ok(master_config.rst_master_regs())
2794 })
2795 }
2796 pub fn sh_cfg_write(&mut self, val: ShCfgWrite) -> Result<(), Error<B::Error>> {
2798 MemBank::operate_over_sensorhub(self, |state| {
2800 let mut reg = Slv0Add::read(state)?;
2801 reg.set_slave0_add(val.slv0_add);
2802 reg.set_rw_0(0);
2803 reg.write(state)?;
2805
2806 let data_write_slv0 = DatawriteSlv0::from_bits(val.slv0_data);
2808 data_write_slv0.write(state)
2809 })
2810 }
2811 pub fn sh_data_rate_set(&mut self, val: ShDataRate) -> Result<(), Error<B::Error>> {
2813 MemBank::operate_over_sensorhub(self, |state| {
2814 let mut slv0_config = Slv0Config::read(state)?;
2815
2816 slv0_config.set_shub_odr((val as u8) & 0x07);
2817 slv0_config.write(state)
2818 })
2819 }
2820 pub fn sh_data_rate_get(&mut self) -> Result<ShDataRate, Error<B::Error>> {
2822 MemBank::operate_over_sensorhub(self, |state| {
2823 let slv0_config = Slv0Config::read(state)?;
2824 let rate = ShDataRate::try_from(slv0_config.shub_odr()).unwrap_or_default();
2825 Ok(rate)
2826 })
2827 }
2828 pub fn sh_slv_cfg_read(&mut self, idx: u8, val: &ShCfgRead) -> Result<(), Error<B::Error>> {
2838 self.mem_bank_set(MemBank::SensorHubMemBank)?;
2839 let mut arr: [u8; 1] = [0];
2840 let mut slv_add = Slv0Add::from_bits(arr[0]);
2841 slv_add.set_slave0_add(val.slv_add);
2842 slv_add.set_rw_0(1);
2843
2844 self.write_to_register(SnsHubReg::Slv0Add as u8 + (idx * 3), &[slv_add.into_bits()])?;
2845
2846 self.write_to_register(SnsHubReg::Slv0Subadd as u8 + (idx * 3), &[val.slv_subadd])?;
2847
2848 self.read_from_register(SnsHubReg::Slv0Config as u8 + (idx * 3), &mut arr)?;
2849 let mut slv_config = Slv0Config::from_bits(arr[0]);
2850 slv_config.set_slave0_numop(val.slv_len);
2851
2852 self.write_to_register(
2853 SnsHubReg::Slv0Config as u8 + (idx * 3),
2854 &[slv_config.into_bits()],
2855 )?;
2856
2857 self.mem_bank_set(MemBank::MainMemBank)
2858 }
2859 pub fn sh_status_get(&mut self) -> Result<StatusMaster, Error<B::Error>> {
2861 let status = StatusMasterMainPage::read(self)?;
2862 Ok(StatusMaster::from_bits(status.into_bits()))
2863 }
2864 pub fn ui_sdo_pull_up_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2866 let mut pin_ctrl = PinCtrl::read(self)?;
2867 pin_ctrl.set_sdo_pu_en(val);
2868 pin_ctrl.write(self)
2869 }
2870 pub fn ui_sdo_pull_up_get(&mut self) -> Result<u8, Error<B::Error>> {
2872 let val: u8 = PinCtrl::read(self).map(|reg| reg.sdo_pu_en())?;
2873
2874 Ok(val)
2875 }
2876 pub fn ui_i2c_i3c_mode_set(&mut self, val: UiI2cI3cMode) -> Result<(), Error<B::Error>> {
2878 let mut if_cfg = IfCfg::read(self)?;
2879 if_cfg.set_i2c_i3c_disable((val as u8) & 0x1);
2880 if_cfg.write(self)
2881 }
2882 pub fn ui_i2c_i3c_mode_get(&mut self) -> Result<UiI2cI3cMode, Error<B::Error>> {
2884 let reg = IfCfg::read(self)?;
2885
2886 let val = UiI2cI3cMode::try_from(reg.i2c_i3c_disable()).unwrap_or_default();
2887
2888 Ok(val)
2889 }
2890 pub fn spi_mode_set(&mut self, val: SpiMode) -> Result<(), Error<B::Error>> {
2892 let mut if_cfg = IfCfg::read(self)?;
2893 if_cfg.set_sim((val as u8) & 0x01);
2894 if_cfg.write(self)
2895 }
2896 pub fn spi_mode_get(&mut self) -> Result<SpiMode, Error<B::Error>> {
2898 let if_cfg = IfCfg::read(self)?;
2899
2900 let val = SpiMode::try_from(if_cfg.sim()).unwrap_or_default();
2901
2902 Ok(val)
2903 }
2904 pub fn ui_sda_pull_up_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2906 let mut if_cfg = IfCfg::read(self)?;
2907 if_cfg.set_sda_pu_en(val);
2908 if_cfg.write(self)
2909 }
2910 pub fn ui_sda_pull_up_get(&mut self) -> Result<u8, Error<B::Error>> {
2912 let val: u8 = IfCfg::read(self).map(|reg| reg.sda_pu_en())?;
2913
2914 Ok(val)
2915 }
2916 pub fn spi2_mode_set(&mut self, val: Spi2Mode) -> Result<(), Error<B::Error>> {
2920 let mut ui_ctrl1_ois = UiCtrl1Ois::read(self)?;
2921 ui_ctrl1_ois.set_sim_ois((val as u8) & 0x01);
2922 ui_ctrl1_ois.write(self)
2923 }
2924 pub fn spi2_mode_get(&mut self) -> Result<Spi2Mode, Error<B::Error>> {
2927 let ui_ctrl1_ois = UiCtrl1Ois::read(self)?;
2928
2929 let val = Spi2Mode::try_from(ui_ctrl1_ois.sim_ois()).unwrap_or_default();
2930
2931 Ok(val)
2932 }
2933 pub fn sigmot_mode_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2935 MemBank::operate_over_embed(self, |state| {
2936 let mut emb_func_en_a = EmbFuncEnA::read(state)?;
2937 emb_func_en_a.set_sign_motion_en(val);
2938 emb_func_en_a.write(state)
2939 })
2940 }
2941 pub fn sigmot_mode_get(&mut self) -> Result<u8, Error<B::Error>> {
2943 MemBank::operate_over_embed(self, |state| {
2944 EmbFuncEnA::read(state).map(|reg| reg.sign_motion_en())
2945 })
2946 }
2947 pub fn stpcnt_mode_set(&mut self, val: StpcntMode) -> Result<(), Error<B::Error>> {
2949 MemBank::operate_over_embed(self, |state| {
2950 let mut emb_func_en_a = EmbFuncEnA::read(state)?;
2951 let emb_func_en_b = EmbFuncEnB::read(state)?;
2952
2953 if val.false_step_rej == 1
2954 && emb_func_en_a.mlc_before_fsm_en() & emb_func_en_b.mlc_en() == 0
2955 {
2956 emb_func_en_a.set_mlc_before_fsm_en(1);
2957 }
2958
2959 emb_func_en_a.set_pedo_en(val.step_counter_enable);
2960 emb_func_en_a.write(state)
2961 })?;
2962
2963 let mut pedo_cmd_reg = PedoCmdReg::read(self)?;
2964 pedo_cmd_reg.set_fp_rejection_en(val.false_step_rej);
2965 pedo_cmd_reg.write(self)
2966 }
2967 pub fn stpcnt_mode_get(&mut self) -> Result<StpcntMode, Error<B::Error>> {
2969 let emb_func_en_a = MemBank::operate_over_embed(self, |state| EmbFuncEnA::read(state))?;
2970 let pedo_cmd_reg = PedoCmdReg::read(self)?;
2971
2972 let val = StpcntMode {
2973 false_step_rej: pedo_cmd_reg.fp_rejection_en(),
2974 step_counter_enable: emb_func_en_a.pedo_en(),
2975 };
2976
2977 Ok(val)
2978 }
2979 pub fn stpcnt_steps_get(&mut self) -> Result<u16, Error<B::Error>> {
2981 MemBank::operate_over_embed(self, |state| StepCounter::read(state).map(|reg| reg.0))
2982 }
2983 pub fn stpcnt_rst_step_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
2987 MemBank::operate_over_embed(self, |state| {
2988 let mut emb_func_src: EmbFuncSrc = EmbFuncSrc::read(state)?;
2989 emb_func_src.set_pedo_rst_step(val);
2990 emb_func_src.write(state)
2991 })
2992 }
2993 pub fn stpcnt_rst_step_get(&mut self) -> Result<u8, Error<B::Error>> {
2995 MemBank::operate_over_embed(self, |state| {
2996 EmbFuncSrc::read(state).map(|reg| reg.pedo_rst_step())
2997 })
2998 }
2999 pub fn stpcnt_debounce_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
3001 let mut pedo_deb_steps_conf = PedoDebStepsConf::read(self)?;
3002 pedo_deb_steps_conf.set_deb_step(val);
3003 pedo_deb_steps_conf.write(self)
3004 }
3005 pub fn stpcnt_debounce_get(&mut self) -> Result<u8, Error<B::Error>> {
3007 let val: u8 = PedoDebStepsConf::read(self)?.deb_step();
3008
3009 Ok(val)
3010 }
3011 pub fn stpcnt_period_set(&mut self, val: u16) -> Result<(), Error<B::Error>> {
3013 let reg = PedoScDeltaT(val);
3014 reg.write(self)
3015 }
3016 pub fn stpcnt_period_get(&mut self) -> Result<u16, Error<B::Error>> {
3018 PedoScDeltaT::read(self).map(|reg| reg.0)
3019 }
3020 pub fn sflp_game_rotation_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
3022 MemBank::operate_over_embed(self, |state| {
3023 let mut emb_func_en_a = EmbFuncEnA::read(state)?;
3024 emb_func_en_a.set_sflp_game_en(val);
3025 emb_func_en_a.write(state)
3026 })
3027 }
3028 pub fn sflp_game_rotation_get(&mut self) -> Result<u8, Error<B::Error>> {
3030 MemBank::operate_over_embed(self, |state| {
3031 let emb_func_en_a = EmbFuncEnA::read(state)?;
3032 Ok(emb_func_en_a.sflp_game_en())
3033 })
3034 }
3035 pub fn sflp_data_rate_set(&mut self, val: SflpDataRate) -> Result<(), Error<B::Error>> {
3037 MemBank::operate_over_embed(self, |state| {
3038 let mut sflp_odr = SflpOdr::read(state)?;
3039 sflp_odr.set_sflp_game_odr((val as u8) & 0x07);
3040 sflp_odr.write(state)
3041 })
3042 }
3043 pub fn sflp_data_rate_get(&mut self) -> Result<SflpDataRate, Error<B::Error>> {
3045 MemBank::operate_over_embed(self, |state| {
3046 let sflp = SflpOdr::read(state)?;
3047 let odr = SflpDataRate::try_from(sflp.sflp_game_odr()).unwrap_or_default();
3048 Ok(odr)
3049 })
3050 }
3051 pub fn tap_detection_set(&mut self, val: TapDetection) -> Result<(), Error<B::Error>> {
3053 let mut tap_cfg0 = TapCfg0::read(self)?;
3054 tap_cfg0.set_tap_x_en(val.tap_x_en);
3055 tap_cfg0.set_tap_y_en(val.tap_y_en);
3056 tap_cfg0.set_tap_z_en(val.tap_z_en);
3057 tap_cfg0.write(self)
3058 }
3059 pub fn tap_detection_get(&mut self) -> Result<TapDetection, Error<B::Error>> {
3061 let tap_cfg0 = TapCfg0::read(self)?;
3062
3063 let tap_detection = TapDetection {
3064 tap_x_en: tap_cfg0.tap_x_en(),
3065 tap_y_en: tap_cfg0.tap_y_en(),
3066 tap_z_en: tap_cfg0.tap_z_en(),
3067 };
3068
3069 Ok(tap_detection)
3070 }
3071 pub fn tap_thresholds_set(&mut self, val: TapThresholds) -> Result<(), Error<B::Error>> {
3073 let mut tap_cfg1 = TapCfg1::read(self)?;
3074 let mut tap_cfg2 = TapCfg2::read(self)?;
3075 let mut tap_ths_6d = TapThs6d::read(self)?;
3076
3077 tap_cfg1.set_tap_ths_x(val.x);
3078 tap_cfg2.set_tap_ths_y(val.y);
3079 tap_ths_6d.set_tap_ths_z(val.z);
3080
3081 tap_ths_6d.write(self)?;
3082 tap_cfg2.write(self)?;
3083 tap_cfg1.write(self)
3084 }
3085 pub fn tap_thresholds_get(&mut self) -> Result<TapThresholds, Error<B::Error>> {
3087 let tap_cfg1 = TapCfg1::read(self)?;
3088 let tap_cfg2 = TapCfg2::read(self)?;
3089 let tap_ths_6d = TapThs6d::read(self)?;
3090
3091 let thresholds = TapThresholds {
3092 x: tap_cfg1.tap_ths_x(),
3094 y: tap_cfg2.tap_ths_y(),
3095 z: tap_ths_6d.tap_ths_z(),
3096 };
3097
3098 Ok(thresholds)
3099 }
3100 pub fn tap_axis_priority_set(&mut self, val: TapAxisPriority) -> Result<(), Error<B::Error>> {
3102 let mut tap_cfg1 = TapCfg1::read(self)?;
3103 tap_cfg1.set_tap_priority((val as u8) & 0x7);
3104 tap_cfg1.write(self)
3105 }
3106 pub fn tap_axis_priority_get(&mut self) -> Result<TapAxisPriority, Error<B::Error>> {
3108 let tap_cfg1 = TapCfg1::read(self)?;
3109
3110 let val = TapAxisPriority::try_from(tap_cfg1.tap_priority()).unwrap_or_default();
3111
3112 Ok(val)
3113 }
3114 pub fn tap_time_windows_set(&mut self, val: TapTimeWindows) -> Result<(), Error<B::Error>> {
3128 let mut tap_dur = TapDur::read(self)?;
3129 tap_dur.set_shock(val.shock);
3130 tap_dur.set_quiet(val.quiet);
3131 tap_dur.set_dur(val.tap_gap);
3132 tap_dur.write(self)
3133 }
3134 pub fn tap_time_windows_get(&mut self) -> Result<TapTimeWindows, Error<B::Error>> {
3148 let tap_dur = TapDur::read(self)?;
3149
3150 let val = TapTimeWindows {
3151 shock: tap_dur.shock(),
3152 quiet: tap_dur.quiet(),
3153 tap_gap: tap_dur.dur(),
3154 };
3155
3156 Ok(val)
3157 }
3158 pub fn tap_mode_set(&mut self, val: TapMode) -> Result<(), Error<B::Error>> {
3160 let mut wake_up_ths = WakeUpThs::read(self)?;
3161 wake_up_ths.set_single_double_tap((val as u8) & 0x01);
3162 wake_up_ths.write(self)
3163 }
3164 pub fn tap_mode_get(&mut self) -> Result<TapMode, Error<B::Error>> {
3166 let wake_up_ths = WakeUpThs::read(self)?;
3167
3168 let val = TapMode::try_from(wake_up_ths.single_double_tap()).unwrap_or_default();
3169
3170 Ok(val)
3171 }
3172 pub fn tilt_mode_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
3174 MemBank::operate_over_embed(self, |state| {
3175 let mut emb_func_en_a = EmbFuncEnA::read(state)?;
3176 emb_func_en_a.set_tilt_en(val);
3177 emb_func_en_a.write(state)
3178 })
3179 }
3180 pub fn tilt_mode_get(&mut self) -> Result<u8, Error<B::Error>> {
3182 MemBank::operate_over_embed(self, |state| {
3184 EmbFuncEnA::read(state).map(|reg| reg.tilt_en())
3186 })
3188 }
3189 pub fn timestamp_raw_get(&mut self) -> Result<u32, Error<B::Error>> {
3191 Timestamp::read(self).map(|reg| reg.0)
3192 }
3193 pub fn timestamp_set(&mut self, val: u8) -> Result<(), Error<B::Error>> {
3195 let mut functions_enable = FunctionsEnable::read(self)?;
3196 functions_enable.set_timestamp_en(val);
3197 functions_enable.write(self)
3198 }
3199 pub fn timestamp_get(&mut self) -> Result<u8, Error<B::Error>> {
3203 let val: u8 = FunctionsEnable::read(self).map(|reg| reg.timestamp_en())?;
3204
3205 Ok(val)
3206 }
3207
3208 pub fn act_mode_set(&mut self, val: ActMode) -> Result<(), Error<B::Error>> {
3212 let mut functions_enable = FunctionsEnable::read(self)?;
3213 functions_enable.set_inact_en(val as u8 & 0x3);
3214 functions_enable.write(self)
3215 }
3216 pub fn act_mode_get(&mut self) -> Result<ActMode, Error<B::Error>> {
3218 let functions_enable = FunctionsEnable::read(self)?;
3219
3220 let val = ActMode::try_from(functions_enable.inact_en()).unwrap_or_default();
3221
3222 Ok(val)
3223 }
3224 pub fn act_from_sleep_to_act_dur_set(
3226 &mut self,
3227 val: ActFromSleepToActDur,
3228 ) -> Result<(), Error<B::Error>> {
3229 let mut inactivity_dur = InactivityDur::read(self)?;
3230 inactivity_dur.set_inact_dur((val as u8) & 0x3);
3231 inactivity_dur.write(self)
3232 }
3233 pub fn act_from_sleep_to_act_dur_get(
3235 &mut self,
3236 ) -> Result<ActFromSleepToActDur, Error<B::Error>> {
3237 let inactivity_dur = InactivityDur::read(self)?;
3238
3239 let val = ActFromSleepToActDur::try_from(inactivity_dur.inact_dur()).unwrap_or_default();
3240
3241 Ok(val)
3242 }
3243 pub fn act_sleep_xl_odr_set(&mut self, val: ActSleepXlOdr) -> Result<(), Error<B::Error>> {
3245 let mut inactivity_dur = InactivityDur::read(self)?;
3246 inactivity_dur.set_xl_inact_odr((val as u8) & 0x03);
3247 inactivity_dur.write(self)
3248 }
3249 pub fn act_sleep_xl_odr_get(&mut self) -> Result<ActSleepXlOdr, Error<B::Error>> {
3251 let inactivity_dur = InactivityDur::read(self)?;
3252
3253 let val = ActSleepXlOdr::try_from(inactivity_dur.xl_inact_odr()).unwrap_or_default();
3254
3255 Ok(val)
3256 }
3257 pub fn act_thresholds_set(&mut self, val: ActThresholds) -> Result<(), Error<B::Error>> {
3259 let mut inactivity_dur = InactivityDur::read(self)?;
3261 let mut inactivity_ths = InactivityThs::read(self)?;
3262 let mut wake_up_ths = WakeUpThs::read(self)?;
3263 let mut wake_up_dur = WakeUpDur::read(self)?;
3264
3265 inactivity_dur.set_wu_inact_ths_w(val.inactivity_cfg.wu_inact_ths_w());
3267 inactivity_dur.set_xl_inact_odr(val.inactivity_cfg.xl_inact_odr());
3268 inactivity_dur.set_inact_dur(val.inactivity_cfg.inact_dur());
3269
3270 inactivity_ths.set_inact_ths(val.inactivity_ths);
3271 wake_up_ths.set_wk_ths(val.threshold);
3272 wake_up_dur.set_wake_dur(val.duration);
3273
3274 inactivity_dur.write(self)?;
3276 inactivity_ths.write(self)?;
3277 wake_up_ths.write(self)?;
3278 wake_up_dur.write(self)
3279 }
3280 pub fn act_thresholds_get(&mut self) -> Result<ActThresholds, Error<B::Error>> {
3282 let inactivity_dur = InactivityDur::read(self)?;
3283 let inactivity_ths = InactivityThs::read(self)?;
3284 let wake_up_ths = WakeUpThs::read(self)?;
3285 let wake_up_dur = WakeUpDur::read(self)?;
3286
3287 let val = ActThresholds {
3288 inactivity_cfg: inactivity_dur,
3289 inactivity_ths: inactivity_ths.inact_ths(),
3290 threshold: wake_up_ths.wk_ths(),
3291 duration: wake_up_dur.wake_dur(),
3292 };
3293
3294 Ok(val)
3295 }
3296 pub fn act_wkup_time_windows_set(
3301 &mut self,
3302 val: ActWkupTimeWindows,
3303 ) -> Result<(), Error<B::Error>> {
3304 let mut wake_up_dur = WakeUpDur::read(self)?;
3305 wake_up_dur.set_wake_dur(val.shock);
3306 wake_up_dur.set_sleep_dur(val.quiet);
3307 wake_up_dur.write(self)
3308 }
3309 pub fn act_wkup_time_windows_get(&mut self) -> Result<ActWkupTimeWindows, Error<B::Error>> {
3314 let wake_up_dur = WakeUpDur::read(self)?;
3315
3316 let val = ActWkupTimeWindows {
3317 shock: wake_up_dur.wake_dur(),
3318 quiet: wake_up_dur.sleep_dur(),
3319 };
3320
3321 Ok(val)
3322 }
3323 pub fn npy_float_to_half(&mut self, f: f32) -> u16 {
3419 let half_float = f16::from_f32(f);
3422 half_float.to_bits()
3423 }
3424}
3425
3426pub fn from_sflp_to_mg(lsb: i16) -> f32 {
3427 (lsb as f32) * 0.061
3428}
3429
3430pub fn from_fs2_to_mg(lsb: i16) -> f32 {
3431 (lsb as f32) * 0.061
3432}
3433
3434pub fn from_fs4_to_mg(lsb: i16) -> f32 {
3435 (lsb as f32) * 0.122
3436}
3437
3438pub fn from_fs8_to_mg(lsb: i16) -> f32 {
3439 (lsb as f32) * 0.244
3440}
3441
3442pub fn from_fs16_to_mg(lsb: i16) -> f32 {
3443 (lsb as f32) * 0.488
3444}
3445
3446pub fn from_fs125_to_mdps(lsb: i16) -> f32 {
3447 (lsb as f32) * 4.375
3448}
3449
3450pub fn from_fs250_to_mdps(lsb: i16) -> f32 {
3451 (lsb as f32) * 8.750
3452}
3453
3454pub fn from_fs500_to_mdps(lsb: i16) -> f32 {
3455 (lsb as f32) * 17.50
3456}
3457
3458pub fn from_fs1000_to_mdps(lsb: i16) -> f32 {
3459 (lsb as f32) * 35.0
3460}
3461
3462pub fn from_fs2000_to_mdps(lsb: i16) -> f32 {
3463 (lsb as f32) * 70.0
3464}
3465
3466pub fn from_fs4000_to_mdps(lsb: i16) -> f32 {
3467 (lsb as f32) * 140.0
3468}
3469
3470pub fn from_lsb_to_celsius(lsb: i16) -> f32 {
3471 (lsb as f32) / 256.0 + 25.0
3472}
3473
3474pub fn from_lsb_to_nsec(lsb: u32) -> f32 {
3475 (lsb as f32) * 21750.0
3476}
3477
3478pub fn from_lsb_to_mv(lsb: i16) -> f32 {
3479 (lsb as f32) / 78.0
3480}
3481
3482pub fn from_half_to_single_precision(h: u16) -> u32 {
3491 let mut h_exp = h & 0x7c00;
3492 let f_sgn: u32 = ((h as u32) & 0x8000) << 16;
3493 match h_exp {
3494 0x0000 => {
3495 let mut h_sig = h & 0x03ff;
3497 if h_sig == 0 {
3499 return f_sgn;
3500 }
3501 h_sig <<= 1;
3503 while (h_sig & 0x0400) == 0 {
3504 h_sig <<= 1;
3505 h_exp += 1;
3506 }
3507
3508 let f_exp = ((127 - 15 - h_exp) as u32) << 23;
3509 let f_sig = ((h_sig & 0x03ff) as u32) << 13;
3510 f_sgn + f_exp + f_sig
3511 }
3512 0x7c00 => {
3513 f_sgn + 0x7f800000 + (((h & 0x03ff) as u32) << 13)
3516 }
3517 _ => {
3518 f_sgn + (((h & 0x7fff) as u32) << 13)
3520 }
3521 }
3522}
3523
3524#[cfg(feature = "passthrough")]
3525pub struct Lsm6dsv16xMaster<B, T> {
3526 pub sensor: RefCell<Lsm6dsv16x<B, T>>,
3527}
3528
3529#[cfg(feature = "passthrough")]
3530impl<B: BusOperation, T: DelayNs> Lsm6dsv16xMaster<B, T> {
3531 pub fn from_bus(bus: B, tim: T) -> Self {
3532 Self {
3533 sensor: RefCell::new(Lsm6dsv16x::from_bus(bus, tim)),
3534 }
3535 }
3536
3537 pub fn borrow_mut(&self) -> RefMut<Lsm6dsv16x<B, T>> {
3538 self.sensor.borrow_mut()
3539 }
3540
3541 pub fn as_passthrough<'a>(
3547 &'a self,
3548 address: SevenBitAddress,
3549 ) -> Lsm6dsv16xPassthrough<'a, B, T> {
3550 Lsm6dsv16xPassthrough {
3551 sensor: &self.sensor,
3552 slave_address: address,
3553 }
3554 }
3555}
3556
3557#[cfg(feature = "passthrough")]
3558pub struct Lsm6dsv16xPassthrough<'a, B, T> {
3563 sensor: &'a RefCell<Lsm6dsv16x<B, T>>,
3564 slave_address: SevenBitAddress,
3565}
3566
3567#[cfg(feature = "passthrough")]
3568impl<B, T> BusOperation for Lsm6dsv16xPassthrough<'_, B, T>
3570where
3571 B: BusOperation,
3572 T: DelayNs,
3573{
3574 type Error = Error<B::Error>;
3575
3576 fn read_bytes(&mut self, _rbuf: &mut [u8]) -> Result<(), Self::Error> {
3577 Err(Error::UnexpectedValue)
3578 }
3579
3580 fn write_bytes(&mut self, wbuf: &[u8]) -> Result<(), Self::Error> {
3581 let mut master = self.sensor.borrow_mut();
3582 for i in 1_u8..(wbuf.len() as u8) {
3583 let sh_cfg_write = ShCfgWrite {
3585 slv0_add: self.slave_address,
3586 slv0_subadd: wbuf[0] + i - 1,
3587 slv0_data: wbuf[i as usize],
3588 };
3589 master.sh_cfg_write(sh_cfg_write)?;
3590
3591 master.xl_data_rate_set(Odr::Off)?;
3593 master.sh_master_set(1)?;
3595 master.xl_data_rate_set(Odr::_120hz)?;
3597 master.acceleration_raw_get()?; let mut drdy = 0;
3601 while drdy == 0 {
3602 master.tim.delay_ms(20);
3603 drdy = master.flag_data_ready_get()?.drdy_xl;
3604 }
3605
3606 let mut end_op = 0;
3607 while end_op == 0 {
3608 master.tim.delay_ms(20);
3609 end_op = master.sh_status_get()?.sens_hub_endop();
3610 }
3611
3612 master.sh_master_set(0)?;
3614 master.xl_data_rate_set(Odr::Off)?;
3615 }
3616
3617 Ok(())
3618 }
3619
3620 fn write_byte_read_bytes(
3621 &mut self,
3622 wbuf: &[u8; 1],
3623 rbuf: &mut [u8],
3624 ) -> Result<(), Self::Error> {
3625 let mut master = self.sensor.borrow_mut();
3626 master.xl_data_rate_set(Odr::Off)?;
3628 let sh_cfg_read = ShCfgRead {
3630 slv_add: self.slave_address,
3631 slv_subadd: wbuf[0],
3632 slv_len: rbuf.len() as u8,
3633 };
3634 master.sh_slv_cfg_read(0, &sh_cfg_read)?; master.sh_slave_connected_set(ShSlaveConnected::_01)?;
3636 master.sh_master_set(1)?;
3638 master.xl_data_rate_set(Odr::_120hz)?;
3640 master.acceleration_raw_get()?; let mut drdy = 0;
3644 while drdy == 0 {
3645 master.tim.delay_ms(20);
3646 drdy = master.flag_data_ready_get()?.drdy_xl;
3647 }
3648
3649 let mut end_op = 0;
3650 while end_op == 0 {
3651 end_op = master.sh_status_get()?.sens_hub_endop();
3653 }
3654
3655 master.sh_master_set(0)?;
3657 master.xl_data_rate_set(Odr::Off)?;
3658
3659 master.sh_read_data_raw_get(rbuf)
3661 }
3662}
3663
3664#[derive(Clone, Copy, Default)]
3665pub struct AllSources {
3666 pub drdy_xl: u8,
3667 pub drdy_gy: u8,
3668 pub drdy_temp: u8,
3669 pub drdy_ah_qvar: u8,
3670 pub drdy_eis: u8,
3671 pub drdy_ois: u8,
3672 pub gy_settling: u8,
3673 pub timestamp: u8,
3674 pub free_fall: u8,
3675 pub wake_up: u8,
3676 pub wake_up_z: u8,
3677 pub wake_up_y: u8,
3678 pub wake_up_x: u8,
3679 pub single_tap: u8,
3680 pub double_tap: u8,
3681 pub tap_z: u8,
3682 pub tap_y: u8,
3683 pub tap_x: u8,
3684 pub tap_sign: u8,
3685 pub six_d: u8,
3686 pub six_d_xl: u8,
3687 pub six_d_xh: u8,
3688 pub six_d_yl: u8,
3689 pub six_d_yh: u8,
3690 pub six_d_zl: u8,
3691 pub six_d_zh: u8,
3692 pub sleep_change: u8,
3693 pub sleep_state: u8,
3694 pub step_detector: u8,
3695 pub step_count_inc: u8,
3696 pub step_count_overflow: u8,
3697 pub step_on_delta_time: u8,
3698 pub emb_func_stand_by: u8,
3699 pub emb_func_time_exceed: u8,
3700 pub tilt: u8,
3701 pub sig_mot: u8,
3702 pub fsm_lc: u8,
3703 pub fsm1: u8,
3704 pub fsm2: u8,
3705 pub fsm3: u8,
3706 pub fsm4: u8,
3707 pub fsm5: u8,
3708 pub fsm6: u8,
3709 pub fsm7: u8,
3710 pub fsm8: u8,
3711 pub mlc1: u8,
3712 pub mlc2: u8,
3713 pub mlc3: u8,
3714 pub mlc4: u8,
3715 pub sh_endop: u8,
3716 pub sh_slave0_nack: u8,
3717 pub sh_slave1_nack: u8,
3718 pub sh_slave2_nack: u8,
3719 pub sh_slave3_nack: u8,
3720 pub sh_wr_once: u8,
3721 pub fifo_bdr: u8,
3722 pub fifo_full: u8,
3723 pub fifo_ovr: u8,
3724 pub fifo_th: u8,
3725}
3726
3727#[repr(u8)]
3728#[derive(Clone, Copy, PartialEq)]
3729pub enum I2CAddress {
3730 I2cAddL = 0x6A,
3731 I2cAddH = 0x6B,
3732}
3733
3734pub const ID: u8 = 0x70;
3735
3736