1 /**
2   ******************************************************************************
3   * @file    ais2ih_reg.c
4   * @author  Sensors Software Solution Team
5   * @brief   AIS2IH driver file
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
10   * All rights reserved.</center></h2>
11   *
12   * This software component is licensed by ST under BSD 3-Clause license,
13   * the "License"; You may not use this file except in compliance with the
14   * License. You may obtain a copy of the License at:
15   *                        opensource.org/licenses/BSD-3-Clause
16   *
17   ******************************************************************************
18   */
19 
20 #include "ais2ih_reg.h"
21 
22 /**
23   * @defgroup  AIS2IH
24   * @brief     This file provides a set of functions needed to drive the
25   *            ais2ih enhanced inertial module.
26   * @{
27   *
28   */
29 
30 /**
31   * @defgroup  AIS2IH_Interfaces_Functions
32   * @brief     This section provide a set of functions used to read and
33   *            write a generic register of the device.
34   *            MANDATORY: return 0 -> no Error.
35   * @{
36   *
37   */
38 
39 /**
40   * @brief  Read generic device register
41   *
42   * @param  ctx   read / write interface definitions(ptr)
43   * @param  reg   register to read
44   * @param  data  pointer to buffer that store the data read(ptr)
45   * @param  len   number of consecutive register to read
46   * @retval          interface status (MANDATORY: return 0 -> no Error)
47   *
48   */
ais2ih_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak ais2ih_read_reg(const stmdev_ctx_t *ctx, uint8_t reg, uint8_t *data,
50                                uint16_t len)
51 {
52   int32_t ret;
53 
54   if (ctx == NULL) return -1;
55 
56   ret = ctx->read_reg(ctx->handle, reg, data, len);
57 
58   return ret;
59 }
60 
61 /**
62   * @brief  Write generic device register
63   *
64   * @param  ctx   read / write interface definitions(ptr)
65   * @param  reg   register to write
66   * @param  data  pointer to data to write in register reg(ptr)
67   * @param  len   number of consecutive register to write
68   * @retval          interface status (MANDATORY: return 0 -> no Error)
69   *
70   */
ais2ih_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)71 int32_t __weak ais2ih_write_reg(const stmdev_ctx_t *ctx, uint8_t reg,
72                                 uint8_t *data,
73                                 uint16_t len)
74 {
75   int32_t ret;
76 
77   if (ctx == NULL) return -1;
78 
79   ret = ctx->write_reg(ctx->handle, reg, data, len);
80 
81   return ret;
82 }
83 
84 /**
85   * @}
86   *
87   */
88 
89 /**
90   * @defgroup    AIS2IH_Sensitivity
91   * @brief       These functions convert raw-data into engineering units.
92   * @{
93   *
94   */
95 
ais2ih_from_fs2_to_mg(int16_t lsb)96 float_t ais2ih_from_fs2_to_mg(int16_t lsb)
97 {
98   return ((float_t)lsb) * 0.061f;
99 }
100 
ais2ih_from_fs4_to_mg(int16_t lsb)101 float_t ais2ih_from_fs4_to_mg(int16_t lsb)
102 {
103   return ((float_t)lsb) * 0.122f;
104 }
105 
ais2ih_from_fs8_to_mg(int16_t lsb)106 float_t ais2ih_from_fs8_to_mg(int16_t lsb)
107 {
108   return ((float_t)lsb) * 0.244f;
109 }
110 
ais2ih_from_fs16_to_mg(int16_t lsb)111 float_t ais2ih_from_fs16_to_mg(int16_t lsb)
112 {
113   return ((float_t)lsb) * 0.488f;
114 }
115 
ais2ih_from_fs2_lp1_to_mg(int16_t lsb)116 float_t ais2ih_from_fs2_lp1_to_mg(int16_t lsb)
117 {
118   return ((float_t)lsb) * 0.061f;
119 }
120 
ais2ih_from_fs4_lp1_to_mg(int16_t lsb)121 float_t ais2ih_from_fs4_lp1_to_mg(int16_t lsb)
122 {
123   return ((float_t)lsb) * 0.122f;
124 }
125 
ais2ih_from_fs8_lp1_to_mg(int16_t lsb)126 float_t ais2ih_from_fs8_lp1_to_mg(int16_t lsb)
127 {
128   return ((float_t)lsb) * 0.244f;
129 }
130 
ais2ih_from_fs16_lp1_to_mg(int16_t lsb)131 float_t ais2ih_from_fs16_lp1_to_mg(int16_t lsb)
132 {
133   return ((float_t)lsb) * 0.488f;
134 }
135 
ais2ih_from_lsb_to_celsius(int16_t lsb)136 float_t ais2ih_from_lsb_to_celsius(int16_t lsb)
137 {
138   return (((float_t)lsb / 256.0f) + 25.0f);
139 }
140 
141 /**
142   * @}
143   *
144   */
145 
146 /**
147   * @defgroup  AIS2IH_Data_Generation
148   * @brief     This section groups all the functions concerning
149   *            data generation
150   * @{
151   *
152   */
153 
154 /**
155   * @brief  Select accelerometer operating modes.[set]
156   *
157   * @param  ctx      read / write interface definitions
158   * @param  val      change the values of mode / lp_mode in reg CTRL1
159   *                  and low_noise in reg CTRL6
160   * @retval          interface status (MANDATORY: return 0 -> no Error)
161   *
162   */
ais2ih_power_mode_set(const stmdev_ctx_t * ctx,ais2ih_mode_t val)163 int32_t ais2ih_power_mode_set(const stmdev_ctx_t *ctx, ais2ih_mode_t val)
164 {
165   ais2ih_ctrl1_t ctrl1;
166   ais2ih_ctrl6_t ctrl6;
167   int32_t ret;
168 
169   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL1, (uint8_t *) &ctrl1, 1);
170 
171   if (ret == 0)
172   {
173     ctrl1.mode = ((uint8_t) val & 0x0CU) >> 2;
174     ctrl1.lp_mode = (uint8_t) val & 0x03U ;
175     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL1, (uint8_t *) &ctrl1, 1);
176   }
177 
178   if (ret == 0)
179   {
180     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &ctrl6, 1);
181   }
182 
183   if (ret == 0)
184   {
185     ctrl6.low_noise = ((uint8_t) val & 0x10U) >> 4;
186     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &ctrl6, 1);
187   }
188 
189   return ret;
190 }
191 
192 /**
193   * @brief  Select accelerometer operating modes.[get]
194   *
195   * @param  ctx      read / write interface definitions
196   * @param  val      change the values of mode / lp_mode in reg CTRL1
197   *                  and low_noise in reg CTRL6
198   * @retval          interface status (MANDATORY: return 0 -> no Error)
199   *
200   */
ais2ih_power_mode_get(const stmdev_ctx_t * ctx,ais2ih_mode_t * val)201 int32_t ais2ih_power_mode_get(const stmdev_ctx_t *ctx, ais2ih_mode_t *val)
202 {
203   ais2ih_ctrl1_t ctrl1;
204   ais2ih_ctrl6_t ctrl6;
205   int32_t ret;
206 
207   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL1, (uint8_t *) &ctrl1, 1);
208 
209   if (ret == 0)
210   {
211     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &ctrl6, 1);
212 
213     switch (((ctrl6.low_noise << 4) + (ctrl1.mode << 2) +
214              ctrl1.lp_mode))
215     {
216       case AIS2IH_HIGH_PERFORMANCE:
217         *val = AIS2IH_HIGH_PERFORMANCE;
218         break;
219 
220       case AIS2IH_CONT_LOW_PWR_4:
221         *val = AIS2IH_CONT_LOW_PWR_4;
222         break;
223 
224       case AIS2IH_CONT_LOW_PWR_3:
225         *val = AIS2IH_CONT_LOW_PWR_3;
226         break;
227 
228       case AIS2IH_CONT_LOW_PWR_2:
229         *val = AIS2IH_CONT_LOW_PWR_2;
230         break;
231 
232       case AIS2IH_CONT_LOW_PWR_12bit:
233         *val = AIS2IH_CONT_LOW_PWR_12bit;
234         break;
235 
236       case AIS2IH_SINGLE_LOW_PWR_4:
237         *val = AIS2IH_SINGLE_LOW_PWR_4;
238         break;
239 
240       case AIS2IH_SINGLE_LOW_PWR_3:
241         *val = AIS2IH_SINGLE_LOW_PWR_3;
242         break;
243 
244       case AIS2IH_SINGLE_LOW_PWR_2:
245         *val = AIS2IH_SINGLE_LOW_PWR_2;
246         break;
247 
248       case AIS2IH_SINGLE_LOW_PWR_12bit:
249         *val = AIS2IH_SINGLE_LOW_PWR_12bit;
250         break;
251 
252       case AIS2IH_HIGH_PERFORMANCE_LOW_NOISE:
253         *val = AIS2IH_HIGH_PERFORMANCE_LOW_NOISE;
254         break;
255 
256       case AIS2IH_CONT_LOW_PWR_LOW_NOISE_4:
257         *val = AIS2IH_CONT_LOW_PWR_LOW_NOISE_4;
258         break;
259 
260       case AIS2IH_CONT_LOW_PWR_LOW_NOISE_3:
261         *val = AIS2IH_CONT_LOW_PWR_LOW_NOISE_3;
262         break;
263 
264       case AIS2IH_CONT_LOW_PWR_LOW_NOISE_2:
265         *val = AIS2IH_CONT_LOW_PWR_LOW_NOISE_2;
266         break;
267 
268       case AIS2IH_CONT_LOW_PWR_LOW_NOISE_12bit:
269         *val = AIS2IH_CONT_LOW_PWR_LOW_NOISE_12bit;
270         break;
271 
272       case AIS2IH_SINGLE_LOW_PWR_LOW_NOISE_4:
273         *val = AIS2IH_SINGLE_LOW_PWR_LOW_NOISE_4;
274         break;
275 
276       case AIS2IH_SINGLE_LOW_PWR_LOW_NOISE_3:
277         *val = AIS2IH_SINGLE_LOW_PWR_LOW_NOISE_3;
278         break;
279 
280       case AIS2IH_SINGLE_LOW_PWR_LOW_NOISE_2:
281         *val = AIS2IH_SINGLE_LOW_PWR_LOW_NOISE_2;
282         break;
283 
284       case AIS2IH_SINGLE_LOW_LOW_NOISE_PWR_12bit:
285         *val = AIS2IH_SINGLE_LOW_LOW_NOISE_PWR_12bit;
286         break;
287 
288       default:
289         *val = AIS2IH_HIGH_PERFORMANCE;
290         break;
291     }
292   }
293 
294   return ret;
295 }
296 
297 /**
298   * @brief  Accelerometer data rate selection.[set]
299   *
300   * @param  ctx      read / write interface definitions
301   * @param  val      change the values of odr in reg CTRL1
302   * @retval          interface status (MANDATORY: return 0 -> no Error)
303   *
304   */
ais2ih_data_rate_set(const stmdev_ctx_t * ctx,ais2ih_odr_t val)305 int32_t ais2ih_data_rate_set(const stmdev_ctx_t *ctx, ais2ih_odr_t val)
306 {
307   ais2ih_ctrl1_t ctrl1;
308   ais2ih_ctrl3_t ctrl3;
309   int32_t ret;
310 
311   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL1, (uint8_t *) &ctrl1, 1);
312 
313   if (ret == 0)
314   {
315     ctrl1.odr = (uint8_t) val;
316     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL1, (uint8_t *) &ctrl1, 1);
317   }
318 
319   if (ret == 0)
320   {
321     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &ctrl3, 1);
322   }
323 
324   if (ret == 0)
325   {
326     ctrl3.slp_mode = ((uint8_t) val & 0x30U) >> 4;
327     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &ctrl3, 1);
328   }
329 
330   return ret;
331 }
332 
333 /**
334   * @brief  Accelerometer data rate selection.[get]
335   *
336   * @param  ctx      read / write interface definitions
337   * @param  val      Get the values of odr in reg CTRL1
338   * @retval          interface status (MANDATORY: return 0 -> no Error)
339   *
340   */
ais2ih_data_rate_get(const stmdev_ctx_t * ctx,ais2ih_odr_t * val)341 int32_t ais2ih_data_rate_get(const stmdev_ctx_t *ctx, ais2ih_odr_t *val)
342 {
343   ais2ih_ctrl1_t ctrl1;
344   ais2ih_ctrl3_t ctrl3;
345   int32_t ret;
346 
347   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL1, (uint8_t *) &ctrl1, 1);
348 
349   if (ret == 0)
350   {
351     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &ctrl3, 1);
352 
353     switch ((ctrl3.slp_mode << 4) + ctrl1.odr)
354     {
355       case AIS2IH_XL_ODR_OFF:
356         *val = AIS2IH_XL_ODR_OFF;
357         break;
358 
359       case AIS2IH_XL_ODR_1Hz6_LP_ONLY:
360         *val = AIS2IH_XL_ODR_1Hz6_LP_ONLY;
361         break;
362 
363       case AIS2IH_XL_ODR_12Hz5:
364         *val = AIS2IH_XL_ODR_12Hz5;
365         break;
366 
367       case AIS2IH_XL_ODR_25Hz:
368         *val = AIS2IH_XL_ODR_25Hz;
369         break;
370 
371       case AIS2IH_XL_ODR_50Hz:
372         *val = AIS2IH_XL_ODR_50Hz;
373         break;
374 
375       case AIS2IH_XL_ODR_100Hz:
376         *val = AIS2IH_XL_ODR_100Hz;
377         break;
378 
379       case AIS2IH_XL_ODR_200Hz:
380         *val = AIS2IH_XL_ODR_200Hz;
381         break;
382 
383       case AIS2IH_XL_ODR_400Hz:
384         *val = AIS2IH_XL_ODR_400Hz;
385         break;
386 
387       case AIS2IH_XL_ODR_800Hz:
388         *val = AIS2IH_XL_ODR_800Hz;
389         break;
390 
391       case AIS2IH_XL_ODR_1k6Hz:
392         *val = AIS2IH_XL_ODR_1k6Hz;
393         break;
394 
395       case AIS2IH_XL_SET_SW_TRIG:
396         *val = AIS2IH_XL_SET_SW_TRIG;
397         break;
398 
399       case AIS2IH_XL_SET_PIN_TRIG:
400         *val = AIS2IH_XL_SET_PIN_TRIG;
401         break;
402 
403       default:
404         *val = AIS2IH_XL_ODR_OFF;
405         break;
406     }
407   }
408 
409   return ret;
410 }
411 
412 /**
413   * @brief  Block data update.[set]
414   *
415   * @param  ctx      read / write interface definitions
416   * @param  val      change the values of bdu in reg CTRL2
417   * @retval          interface status (MANDATORY: return 0 -> no Error)
418   *
419   */
ais2ih_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)420 int32_t ais2ih_block_data_update_set(const stmdev_ctx_t *ctx, uint8_t val)
421 {
422   ais2ih_ctrl2_t reg;
423   int32_t ret;
424 
425   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
426 
427   if (ret == 0)
428   {
429     reg.bdu = val;
430     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
431   }
432 
433   return ret;
434 }
435 
436 /**
437   * @brief  Block data update.[get]
438   *
439   * @param  ctx      read / write interface definitions
440   * @param  val      change the values of bdu in reg CTRL2
441   * @retval          interface status (MANDATORY: return 0 -> no Error)
442   *
443   */
ais2ih_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)444 int32_t ais2ih_block_data_update_get(const stmdev_ctx_t *ctx, uint8_t *val)
445 {
446   ais2ih_ctrl2_t reg;
447   int32_t ret;
448 
449   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
450   *val = reg.bdu;
451 
452   return ret;
453 }
454 
455 /**
456   * @brief  Accelerometer full-scale selection.[set]
457   *
458   * @param  ctx      read / write interface definitions
459   * @param  val      change the values of fs in reg CTRL6
460   * @retval          interface status (MANDATORY: return 0 -> no Error)
461   *
462   */
ais2ih_full_scale_set(const stmdev_ctx_t * ctx,ais2ih_fs_t val)463 int32_t ais2ih_full_scale_set(const stmdev_ctx_t *ctx, ais2ih_fs_t val)
464 {
465   ais2ih_ctrl6_t reg;
466   int32_t ret;
467 
468   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &reg, 1);
469 
470   if (ret == 0)
471   {
472     reg.fs = (uint8_t) val;
473     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &reg, 1);
474   }
475 
476   return ret;
477 }
478 
479 /**
480   * @brief  Accelerometer full-scale selection.[get]
481   *
482   * @param  ctx      read / write interface definitions
483   * @param  val      Get the values of fs in reg CTRL6
484   * @retval          interface status (MANDATORY: return 0 -> no Error)
485   *
486   */
ais2ih_full_scale_get(const stmdev_ctx_t * ctx,ais2ih_fs_t * val)487 int32_t ais2ih_full_scale_get(const stmdev_ctx_t *ctx, ais2ih_fs_t *val)
488 {
489   ais2ih_ctrl6_t reg;
490   int32_t ret;
491 
492   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &reg, 1);
493 
494   switch (reg.fs)
495   {
496     case AIS2IH_2g:
497       *val = AIS2IH_2g;
498       break;
499 
500     case AIS2IH_4g:
501       *val = AIS2IH_4g;
502       break;
503 
504     case AIS2IH_8g:
505       *val = AIS2IH_8g;
506       break;
507 
508     case AIS2IH_16g:
509       *val = AIS2IH_16g;
510       break;
511 
512     default:
513       *val = AIS2IH_2g;
514       break;
515   }
516 
517   return ret;
518 }
519 
520 /**
521   * @brief  The STATUS_REG register of the device.[get]
522   *
523   * @param  ctx      read / write interface definitions
524   * @param  val      union of registers from STATUS to
525   * @retval          interface status (MANDATORY: return 0 -> no Error)
526   *
527   */
ais2ih_status_reg_get(const stmdev_ctx_t * ctx,ais2ih_status_t * val)528 int32_t ais2ih_status_reg_get(const stmdev_ctx_t *ctx, ais2ih_status_t *val)
529 {
530   int32_t ret;
531 
532   ret = ais2ih_read_reg(ctx, AIS2IH_STATUS, (uint8_t *) val, 1);
533 
534   return ret;
535 }
536 
537 /**
538   * @brief  Accelerometer new data available.[get]
539   *
540   * @param  ctx      read / write interface definitions
541   * @param  val      change the values of drdy in reg STATUS
542   * @retval          interface status (MANDATORY: return 0 -> no Error)
543   *
544   */
ais2ih_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)545 int32_t ais2ih_flag_data_ready_get(const stmdev_ctx_t *ctx, uint8_t *val)
546 {
547   ais2ih_status_t reg;
548   int32_t ret;
549 
550   ret = ais2ih_read_reg(ctx, AIS2IH_STATUS, (uint8_t *) &reg, 1);
551   *val = reg.drdy;
552 
553   return ret;
554 }
555 /**
556   * @brief   Read all the interrupt/status flag of the device.[get]
557   *
558   * @param  ctx      read / write interface definitions
559   * @param  val      registers STATUS_DUP, WAKE_UP_SRC,
560   *                  TAP_SRC, SIXD_SRC, ALL_INT_SRC
561   * @retval          interface status (MANDATORY: return 0 -> no Error)
562   *
563   */
ais2ih_all_sources_get(const stmdev_ctx_t * ctx,ais2ih_all_sources_t * val)564 int32_t ais2ih_all_sources_get(const stmdev_ctx_t *ctx,
565                                ais2ih_all_sources_t *val)
566 {
567   int32_t ret;
568 
569   ret = ais2ih_read_reg(ctx, AIS2IH_STATUS_DUP, (uint8_t *) val, 5);
570 
571   return ret;
572 }
573 
574 /**
575   * @brief  Accelerometer X-axis user offset correction expressed in two’s
576   *         complement, weight depends on bit USR_OFF_W. The value must be
577   *         in the range [-127 127].[set]
578   *
579   * @param  ctx      read / write interface definitions
580   * @param  buff     buffer that contains data to write
581   * @retval          interface status (MANDATORY: return 0 -> no Error)
582   *
583   */
ais2ih_usr_offset_x_set(const stmdev_ctx_t * ctx,uint8_t * buff)584 int32_t ais2ih_usr_offset_x_set(const stmdev_ctx_t *ctx, uint8_t *buff)
585 {
586   int32_t ret;
587 
588   ret = ais2ih_write_reg(ctx, AIS2IH_X_OFS_USR, buff, 1);
589 
590   return ret;
591 }
592 
593 /**
594   * @brief  Accelerometer X-axis user offset correction expressed in two’s
595   *         complement, weight depends on bit USR_OFF_W. The value must be
596   *         in the range [-127 127].[get]
597   *
598   * @param  ctx      read / write interface definitions
599   * @param  buff     buffer that stores data read
600   * @retval          interface status (MANDATORY: return 0 -> no Error)
601   *
602   */
ais2ih_usr_offset_x_get(const stmdev_ctx_t * ctx,uint8_t * buff)603 int32_t ais2ih_usr_offset_x_get(const stmdev_ctx_t *ctx, uint8_t *buff)
604 {
605   int32_t ret;
606 
607   ret = ais2ih_read_reg(ctx, AIS2IH_X_OFS_USR, buff, 1);
608 
609   return ret;
610 }
611 
612 /**
613   * @brief  Accelerometer Y-axis user offset correction expressed in two’s
614   *         complement, weight depends on bit USR_OFF_W. The value must be
615   *         in the range [-127 127].[set]
616   *
617   * @param  ctx      read / write interface definitions
618   * @param  buff     buffer that contains data to write
619   * @retval          interface status (MANDATORY: return 0 -> no Error)
620   *
621   */
ais2ih_usr_offset_y_set(const stmdev_ctx_t * ctx,uint8_t * buff)622 int32_t ais2ih_usr_offset_y_set(const stmdev_ctx_t *ctx, uint8_t *buff)
623 {
624   int32_t ret;
625 
626   ret = ais2ih_write_reg(ctx, AIS2IH_Y_OFS_USR, buff, 1);
627 
628   return ret;
629 }
630 
631 /**
632   * @brief  Accelerometer Y-axis user offset correction expressed in two’s
633   *         complement, weight depends on bit USR_OFF_W. The value must be
634   *         in the range [-127 127].[get]
635   *
636   * @param  ctx      read / write interface definitions
637   * @param  buff     buffer that stores data read
638   * @retval          interface status (MANDATORY: return 0 -> no Error)
639   *
640   */
ais2ih_usr_offset_y_get(const stmdev_ctx_t * ctx,uint8_t * buff)641 int32_t ais2ih_usr_offset_y_get(const stmdev_ctx_t *ctx, uint8_t *buff)
642 {
643   int32_t ret;
644 
645   ret = ais2ih_read_reg(ctx, AIS2IH_Y_OFS_USR, buff, 1);
646 
647   return ret;
648 }
649 
650 /**
651   * @brief  Accelerometer Z-axis user offset correction expressed in two’s
652   *         complement, weight depends on bit USR_OFF_W. The value must be
653   *         in the range [-127 127].[set]
654   *
655   * @param  ctx      read / write interface definitions
656   * @param  buff     buffer that contains data to write
657   * @retval          interface status (MANDATORY: return 0 -> no Error)
658   *
659   */
ais2ih_usr_offset_z_set(const stmdev_ctx_t * ctx,uint8_t * buff)660 int32_t ais2ih_usr_offset_z_set(const stmdev_ctx_t *ctx, uint8_t *buff)
661 {
662   int32_t ret;
663 
664   ret = ais2ih_write_reg(ctx, AIS2IH_Z_OFS_USR, buff, 1);
665 
666   return ret;
667 }
668 
669 /**
670   * @brief  Accelerometer Z-axis user offset correction expressed in two’s
671   *         complement, weight depends on bit USR_OFF_W. The value must be
672   *         in the range [-127 127].[get]
673   *
674   * @param  ctx      read / write interface definitions
675   * @param  buff     buffer that stores data read
676   * @retval          interface status (MANDATORY: return 0 -> no Error)
677   *
678   */
ais2ih_usr_offset_z_get(const stmdev_ctx_t * ctx,uint8_t * buff)679 int32_t ais2ih_usr_offset_z_get(const stmdev_ctx_t *ctx, uint8_t *buff)
680 {
681   int32_t ret;
682 
683   ret = ais2ih_read_reg(ctx, AIS2IH_Z_OFS_USR, buff, 1);
684 
685   return ret;
686 }
687 
688 /**
689   * @brief  Weight of XL user offset bits of registers X_OFS_USR,
690   *         Y_OFS_USR, Z_OFS_USR.[set]
691   *
692   * @param  ctx      read / write interface definitions
693   * @param  val      change the values of usr_off_w in
694   *                               reg CTRL_REG7
695   * @retval          interface status (MANDATORY: return 0 -> no Error)
696   *
697   */
ais2ih_offset_weight_set(const stmdev_ctx_t * ctx,ais2ih_usr_off_w_t val)698 int32_t ais2ih_offset_weight_set(const stmdev_ctx_t *ctx,
699                                  ais2ih_usr_off_w_t val)
700 {
701   ais2ih_ctrl_reg7_t reg;
702   int32_t ret;
703 
704   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
705 
706   if (ret == 0)
707   {
708     reg.usr_off_w = (uint8_t) val;
709     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
710   }
711 
712   return ret;
713 }
714 
715 /**
716   * @brief  Weight of XL user offset bits of registers X_OFS_USR,
717   *         Y_OFS_USR, Z_OFS_USR.[get]
718   *
719   * @param  ctx      read / write interface definitions
720   * @param  val      Get the values of usr_off_w in reg CTRL_REG7
721   * @retval          interface status (MANDATORY: return 0 -> no Error)
722   *
723   */
ais2ih_offset_weight_get(const stmdev_ctx_t * ctx,ais2ih_usr_off_w_t * val)724 int32_t ais2ih_offset_weight_get(const stmdev_ctx_t *ctx,
725                                  ais2ih_usr_off_w_t *val)
726 {
727   ais2ih_ctrl_reg7_t reg;
728   int32_t ret;
729 
730   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
731 
732   switch (reg.usr_off_w)
733   {
734     case AIS2IH_LSb_977ug:
735       *val = AIS2IH_LSb_977ug;
736       break;
737 
738     case AIS2IH_LSb_15mg6:
739       *val = AIS2IH_LSb_15mg6;
740       break;
741 
742     default:
743       *val = AIS2IH_LSb_977ug;
744       break;
745   }
746 
747   return ret;
748 }
749 
750 /**
751   * @}
752   *
753   */
754 
755 /**
756   * @defgroup  AIS2IH_Data_Output
757   * @brief     This section groups all the data output functions.
758   * @{
759   *
760   */
761 
762 /**
763   * @brief  Temperature data output register (r). L and H registers
764   *         together express a 16-bit word in two’s complement.[get]
765   *
766   * @param  ctx      read / write interface definitions
767   * @param  val      buffer that stores data read
768   * @retval          interface status (MANDATORY: return 0 -> no Error)
769   *
770   */
ais2ih_temperature_raw_get(const stmdev_ctx_t * ctx,int16_t * val)771 int32_t ais2ih_temperature_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
772 {
773   uint8_t buff[2];
774   int32_t ret;
775 
776   ret = ais2ih_read_reg(ctx, AIS2IH_OUT_T_L, buff, 2);
777   *val = (int16_t)buff[1];
778   *val = (*val * 256) + (int16_t)buff[0];
779 
780   return ret;
781 }
782 
783 /**
784   * @brief  Linear acceleration output register. The value is expressed as
785   *         a 16-bit word in two’s complement.[get]
786   *
787   * @param  ctx      read / write interface definitions
788   * @param  val      buffer that stores data read
789   * @retval          interface status (MANDATORY: return 0 -> no Error)
790   *
791   */
ais2ih_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)792 int32_t ais2ih_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
793 {
794   uint8_t buff[6];
795   int32_t ret;
796 
797   ret = ais2ih_read_reg(ctx, AIS2IH_OUT_X_L, buff, 6);
798   val[0] = (int16_t)buff[1];
799   val[0] = (val[0] * 256) + (int16_t)buff[0];
800   val[1] = (int16_t)buff[3];
801   val[1] = (val[1] * 256) + (int16_t)buff[2];
802   val[2] = (int16_t)buff[5];
803   val[2] = (val[2] * 256) + (int16_t)buff[4];
804 
805   return ret;
806 }
807 
808 /**
809   * @}
810   *
811   */
812 
813 /**
814   * @defgroup  AIS2IH_Common
815   * @brief     This section groups common useful functions.
816   * @{
817   *
818   */
819 
820 /**
821   * @brief  Device Who am I.[get]
822   *
823   * @param  ctx      read / write interface definitions
824   * @param  buff     buffer that stores data read
825   * @retval          interface status (MANDATORY: return 0 -> no Error)
826   *
827   */
ais2ih_device_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)828 int32_t ais2ih_device_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
829 {
830   int32_t ret;
831 
832   ret = ais2ih_read_reg(ctx, AIS2IH_WHO_AM_I, buff, 1);
833 
834   return ret;
835 }
836 
837 /**
838   * @brief  Register address automatically incremented during multiple byte
839   *         access with a serial interface.[set]
840   *
841   * @param  ctx      read / write interface definitions
842   * @param  val      change the values of if_add_inc in reg CTRL2
843   * @retval          interface status (MANDATORY: return 0 -> no Error)
844   *
845   */
ais2ih_auto_increment_set(const stmdev_ctx_t * ctx,uint8_t val)846 int32_t ais2ih_auto_increment_set(const stmdev_ctx_t *ctx, uint8_t val)
847 {
848   ais2ih_ctrl2_t reg;
849   int32_t ret;
850 
851   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
852 
853   if (ret == 0)
854   {
855     reg.if_add_inc = val;
856     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
857   }
858 
859   return ret;
860 }
861 
862 /**
863   * @brief  Register address automatically incremented during multiple
864   *         byte access with a serial interface.[get]
865   *
866   * @param  ctx      read / write interface definitions
867   * @param  val      change the values of if_add_inc in reg CTRL2
868   * @retval          interface status (MANDATORY: return 0 -> no Error)
869   *
870   */
ais2ih_auto_increment_get(const stmdev_ctx_t * ctx,uint8_t * val)871 int32_t ais2ih_auto_increment_get(const stmdev_ctx_t *ctx, uint8_t *val)
872 {
873   ais2ih_ctrl2_t reg;
874   int32_t ret;
875 
876   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
877   *val = reg.if_add_inc;
878 
879   return ret;
880 }
881 
882 /**
883   * @brief  Software reset. Restore the default values in user registers.[set]
884   *
885   * @param  ctx      read / write interface definitions
886   * @param  val      change the values of soft_reset in reg CTRL2
887   * @retval          interface status (MANDATORY: return 0 -> no Error)
888   *
889   */
ais2ih_reset_set(const stmdev_ctx_t * ctx,uint8_t val)890 int32_t ais2ih_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
891 {
892   ais2ih_ctrl2_t reg;
893   int32_t ret;
894 
895   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
896 
897   if (ret == 0)
898   {
899     reg.soft_reset = val;
900     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
901   }
902 
903   return ret;
904 }
905 
906 /**
907   * @brief  Software reset. Restore the default values in user registers.[get]
908   *
909   * @param  ctx      read / write interface definitions
910   * @param  val      change the values of soft_reset in reg CTRL2
911   * @retval          interface status (MANDATORY: return 0 -> no Error)
912   *
913   */
ais2ih_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)914 int32_t ais2ih_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
915 {
916   ais2ih_ctrl2_t reg;
917   int32_t ret;
918 
919   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
920   *val = reg.soft_reset;
921 
922   return ret;
923 }
924 
925 /**
926   * @brief  Reboot memory content. Reload the calibration parameters.[set]
927   *
928   * @param  ctx      read / write interface definitions
929   * @param  val      change the values of boot in reg CTRL2
930   * @retval          interface status (MANDATORY: return 0 -> no Error)
931   *
932   */
ais2ih_boot_set(const stmdev_ctx_t * ctx,uint8_t val)933 int32_t ais2ih_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
934 {
935   ais2ih_ctrl2_t reg;
936   int32_t ret;
937 
938   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
939 
940   if (ret == 0)
941   {
942     reg.boot = val;
943     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
944   }
945 
946   return ret;
947 }
948 
949 /**
950   * @brief  Reboot memory content. Reload the calibration parameters.[get]
951   *
952   * @param  ctx      read / write interface definitions
953   * @param  val      change the values of boot in reg CTRL2
954   * @retval          interface status (MANDATORY: return 0 -> no Error)
955   *
956   */
ais2ih_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)957 int32_t ais2ih_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
958 {
959   ais2ih_ctrl2_t reg;
960   int32_t ret;
961 
962   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
963   *val = reg.boot;
964 
965   return ret;
966 }
967 
968 /**
969   * @brief  Sensor self-test enable.[set]
970   *
971   * @param  ctx      read / write interface definitions
972   * @param  val      change the values of st in reg CTRL3
973   * @retval          interface status (MANDATORY: return 0 -> no Error)
974   *
975   */
ais2ih_self_test_set(const stmdev_ctx_t * ctx,ais2ih_st_t val)976 int32_t ais2ih_self_test_set(const stmdev_ctx_t *ctx, ais2ih_st_t val)
977 {
978   ais2ih_ctrl3_t reg;
979   int32_t ret;
980 
981   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
982 
983   if (ret == 0)
984   {
985     reg.st = (uint8_t) val;
986     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
987   }
988 
989   return ret;
990 }
991 
992 /**
993   * @brief  Sensor self-test enable.[get]
994   *
995   * @param  ctx      read / write interface definitions
996   * @param  val      Get the values of st in reg CTRL3
997   * @retval          interface status (MANDATORY: return 0 -> no Error)
998   *
999   */
ais2ih_self_test_get(const stmdev_ctx_t * ctx,ais2ih_st_t * val)1000 int32_t ais2ih_self_test_get(const stmdev_ctx_t *ctx, ais2ih_st_t *val)
1001 {
1002   ais2ih_ctrl3_t reg;
1003   int32_t ret;
1004 
1005   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1006 
1007   switch (reg.st)
1008   {
1009     case AIS2IH_XL_ST_DISABLE:
1010       *val = AIS2IH_XL_ST_DISABLE;
1011       break;
1012 
1013     case AIS2IH_XL_ST_POSITIVE:
1014       *val = AIS2IH_XL_ST_POSITIVE;
1015       break;
1016 
1017     case AIS2IH_XL_ST_NEGATIVE:
1018       *val = AIS2IH_XL_ST_NEGATIVE;
1019       break;
1020 
1021     default:
1022       *val = AIS2IH_XL_ST_DISABLE;
1023       break;
1024   }
1025 
1026   return ret;
1027 }
1028 
1029 /**
1030   * @brief  Data-ready pulsed / letched mode.[set]
1031   *
1032   * @param  ctx      read / write interface definitions
1033   * @param  val      change the values of drdy_pulsed in reg CTRL_REG7
1034   * @retval          interface status (MANDATORY: return 0 -> no Error)
1035   *
1036   */
ais2ih_data_ready_mode_set(const stmdev_ctx_t * ctx,ais2ih_drdy_pulsed_t val)1037 int32_t ais2ih_data_ready_mode_set(const stmdev_ctx_t *ctx,
1038                                    ais2ih_drdy_pulsed_t val)
1039 {
1040   ais2ih_ctrl_reg7_t reg;
1041   int32_t ret;
1042 
1043   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1044 
1045   if (ret == 0)
1046   {
1047     reg.drdy_pulsed = (uint8_t) val;
1048     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1049   }
1050 
1051   return ret;
1052 }
1053 
1054 /**
1055   * @brief  Data-ready pulsed / letched mode.[get]
1056   *
1057   * @param  ctx      read / write interface definitions
1058   * @param  val      Get the values of drdy_pulsed in reg CTRL_REG7
1059   * @retval          interface status (MANDATORY: return 0 -> no Error)
1060   *
1061   */
ais2ih_data_ready_mode_get(const stmdev_ctx_t * ctx,ais2ih_drdy_pulsed_t * val)1062 int32_t ais2ih_data_ready_mode_get(const stmdev_ctx_t *ctx,
1063                                    ais2ih_drdy_pulsed_t *val)
1064 {
1065   ais2ih_ctrl_reg7_t reg;
1066   int32_t ret;
1067 
1068   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1069 
1070   switch (reg.drdy_pulsed)
1071   {
1072     case AIS2IH_DRDY_LATCHED:
1073       *val = AIS2IH_DRDY_LATCHED;
1074       break;
1075 
1076     case AIS2IH_DRDY_PULSED:
1077       *val = AIS2IH_DRDY_PULSED;
1078       break;
1079 
1080     default:
1081       *val = AIS2IH_DRDY_LATCHED;
1082       break;
1083   }
1084 
1085   return ret;
1086 }
1087 
1088 /**
1089   * @}
1090   *
1091   */
1092 
1093 /**
1094   * @defgroup  AIS2IH_Filters
1095   * @brief     This section group all the functions concerning the filters
1096   *            configuration.
1097   * @{
1098   *
1099   */
1100 
1101 /**
1102   * @brief  Accelerometer filtering path for outputs.[set]
1103   *
1104   * @param  ctx      read / write interface definitions
1105   * @param  val      change the values of fds in reg CTRL6
1106   * @retval          interface status (MANDATORY: return 0 -> no Error)
1107   *
1108   */
ais2ih_filter_path_set(const stmdev_ctx_t * ctx,ais2ih_fds_t val)1109 int32_t ais2ih_filter_path_set(const stmdev_ctx_t *ctx, ais2ih_fds_t val)
1110 {
1111   ais2ih_ctrl6_t ctrl6;
1112   ais2ih_ctrl_reg7_t ctrl_reg7;
1113   int32_t ret;
1114 
1115   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &ctrl6, 1);
1116 
1117   if (ret == 0)
1118   {
1119     ctrl6.fds = ((uint8_t) val & 0x10U) >> 4;
1120     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &ctrl6, 1);
1121   }
1122 
1123   if (ret == 0)
1124   {
1125     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &ctrl_reg7, 1);
1126   }
1127 
1128   if (ret == 0)
1129   {
1130     ctrl_reg7.usr_off_on_out = (uint8_t) val & 0x01U;
1131     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &ctrl_reg7, 1);
1132   }
1133 
1134   return ret;
1135 }
1136 
1137 /**
1138   * @brief  Accelerometer filtering path for outputs.[get]
1139   *
1140   * @param  ctx      read / write interface definitions
1141   * @param  val      Get the values of fds in reg CTRL6
1142   * @retval          interface status (MANDATORY: return 0 -> no Error)
1143   *
1144   */
ais2ih_filter_path_get(const stmdev_ctx_t * ctx,ais2ih_fds_t * val)1145 int32_t ais2ih_filter_path_get(const stmdev_ctx_t *ctx, ais2ih_fds_t *val)
1146 {
1147   ais2ih_ctrl6_t ctrl6;
1148   ais2ih_ctrl_reg7_t ctrl_reg7;
1149   int32_t ret;
1150 
1151   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &ctrl6, 1);
1152 
1153   if (ret == 0)
1154   {
1155     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &ctrl_reg7, 1);
1156 
1157     switch ((ctrl6.fds << 4) + ctrl_reg7.usr_off_on_out)
1158     {
1159       case AIS2IH_LPF_ON_OUT:
1160         *val = AIS2IH_LPF_ON_OUT;
1161         break;
1162 
1163       case AIS2IH_USER_OFFSET_ON_OUT:
1164         *val = AIS2IH_USER_OFFSET_ON_OUT;
1165         break;
1166 
1167       case AIS2IH_HIGH_PASS_ON_OUT:
1168         *val = AIS2IH_HIGH_PASS_ON_OUT;
1169         break;
1170 
1171       default:
1172         *val = AIS2IH_LPF_ON_OUT;
1173         break;
1174     }
1175   }
1176 
1177   return ret;
1178 }
1179 
1180 /**
1181   * @brief   Accelerometer cutoff filter frequency. Valid for low and high
1182   *          pass filter.[set]
1183   *
1184   * @param  ctx      read / write interface definitions
1185   * @param  val      change the values of bw_filt in reg CTRL6
1186   * @retval          interface status (MANDATORY: return 0 -> no Error)
1187   *
1188   */
ais2ih_filter_bandwidth_set(const stmdev_ctx_t * ctx,ais2ih_bw_filt_t val)1189 int32_t ais2ih_filter_bandwidth_set(const stmdev_ctx_t *ctx,
1190                                     ais2ih_bw_filt_t val)
1191 {
1192   ais2ih_ctrl6_t reg;
1193   int32_t ret;
1194 
1195   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &reg, 1);
1196 
1197   if (ret == 0)
1198   {
1199     reg.bw_filt = (uint8_t) val;
1200     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &reg, 1);
1201   }
1202 
1203   return ret;
1204 }
1205 
1206 /**
1207   * @brief   Accelerometer cutoff filter frequency. Valid for low and
1208   *          high pass filter.[get]
1209   *
1210   * @param  ctx      read / write interface definitions
1211   * @param  val      Get the values of bw_filt in reg CTRL6
1212   * @retval          interface status (MANDATORY: return 0 -> no Error)
1213   *
1214   */
ais2ih_filter_bandwidth_get(const stmdev_ctx_t * ctx,ais2ih_bw_filt_t * val)1215 int32_t ais2ih_filter_bandwidth_get(const stmdev_ctx_t *ctx,
1216                                     ais2ih_bw_filt_t *val)
1217 {
1218   ais2ih_ctrl6_t reg;
1219   int32_t ret;
1220 
1221   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL6, (uint8_t *) &reg, 1);
1222 
1223   switch (reg.bw_filt)
1224   {
1225     case AIS2IH_ODR_DIV_2:
1226       *val = AIS2IH_ODR_DIV_2;
1227       break;
1228 
1229     case AIS2IH_ODR_DIV_4:
1230       *val = AIS2IH_ODR_DIV_4;
1231       break;
1232 
1233     case AIS2IH_ODR_DIV_10:
1234       *val = AIS2IH_ODR_DIV_10;
1235       break;
1236 
1237     case AIS2IH_ODR_DIV_20:
1238       *val = AIS2IH_ODR_DIV_20;
1239       break;
1240 
1241     default:
1242       *val = AIS2IH_ODR_DIV_2;
1243       break;
1244   }
1245 
1246   return ret;
1247 }
1248 
1249 /**
1250   * @brief  Enable HP filter reference mode.[set]
1251   *
1252   * @param  ctx      read / write interface definitions
1253   * @param  val      change the values of hp_ref_mode in reg CTRL_REG7
1254   * @retval          interface status (MANDATORY: return 0 -> no Error)
1255   *
1256   */
ais2ih_reference_mode_set(const stmdev_ctx_t * ctx,uint8_t val)1257 int32_t ais2ih_reference_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
1258 {
1259   ais2ih_ctrl_reg7_t reg;
1260   int32_t ret;
1261 
1262   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1263 
1264   if (ret == 0)
1265   {
1266     reg.hp_ref_mode = val;
1267     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1268   }
1269 
1270   return ret;
1271 }
1272 
1273 /**
1274   * @brief  Enable HP filter reference mode.[get]
1275   *
1276   * @param  ctx      read / write interface definitions
1277   * @param  val      change the values of hp_ref_mode in reg CTRL_REG7
1278   * @retval          interface status (MANDATORY: return 0 -> no Error)
1279   *
1280   */
ais2ih_reference_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)1281 int32_t ais2ih_reference_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
1282 {
1283   ais2ih_ctrl_reg7_t reg;
1284   int32_t ret;
1285 
1286   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1287   *val = reg.hp_ref_mode;
1288 
1289   return ret;
1290 }
1291 
1292 /**
1293   * @}
1294   *
1295   */
1296 
1297 /**
1298   * @defgroup   AIS2IH_Serial_Interface
1299   * @brief      This section groups all the functions concerning main serial
1300   *             interface management (not auxiliary)
1301   * @{
1302   *
1303   */
1304 
1305 /**
1306   * @brief  SPI Serial Interface Mode selection.[set]
1307   *
1308   * @param  ctx      read / write interface definitions
1309   * @param  val      change the values of sim in reg CTRL2
1310   * @retval          interface status (MANDATORY: return 0 -> no Error)
1311   *
1312   */
ais2ih_spi_mode_set(const stmdev_ctx_t * ctx,ais2ih_sim_t val)1313 int32_t ais2ih_spi_mode_set(const stmdev_ctx_t *ctx, ais2ih_sim_t val)
1314 {
1315   ais2ih_ctrl2_t reg;
1316   int32_t ret;
1317 
1318   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1319 
1320   if (ret == 0)
1321   {
1322     reg.sim = (uint8_t) val;
1323     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1324   }
1325 
1326   return ret;
1327 }
1328 
1329 /**
1330   * @brief  SPI Serial Interface Mode selection.[get]
1331   *
1332   * @param  ctx      read / write interface definitions
1333   * @param  val      Get the values of sim in reg CTRL2
1334   * @retval          interface status (MANDATORY: return 0 -> no Error)
1335   *
1336   */
ais2ih_spi_mode_get(const stmdev_ctx_t * ctx,ais2ih_sim_t * val)1337 int32_t ais2ih_spi_mode_get(const stmdev_ctx_t *ctx, ais2ih_sim_t *val)
1338 {
1339   ais2ih_ctrl2_t reg;
1340   int32_t ret;
1341 
1342   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1343 
1344   switch (reg.sim)
1345   {
1346     case AIS2IH_SPI_4_WIRE:
1347       *val = AIS2IH_SPI_4_WIRE;
1348       break;
1349 
1350     case AIS2IH_SPI_3_WIRE:
1351       *val = AIS2IH_SPI_3_WIRE;
1352       break;
1353 
1354     default:
1355       *val = AIS2IH_SPI_4_WIRE;
1356       break;
1357   }
1358 
1359   return ret;
1360 }
1361 
1362 /**
1363   * @brief  Disable / Enable I2C interface.[set]
1364   *
1365   * @param  ctx      read / write interface definitions
1366   * @param  val      change the values of i2c_disable in
1367   *                                 reg CTRL2
1368   * @retval          interface status (MANDATORY: return 0 -> no Error)
1369   *
1370   */
ais2ih_i2c_interface_set(const stmdev_ctx_t * ctx,ais2ih_i2c_disable_t val)1371 int32_t ais2ih_i2c_interface_set(const stmdev_ctx_t *ctx,
1372                                  ais2ih_i2c_disable_t val)
1373 {
1374   ais2ih_ctrl2_t reg;
1375   int32_t ret;
1376 
1377   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1378 
1379   if (ret == 0)
1380   {
1381     reg.i2c_disable = (uint8_t) val;
1382     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1383   }
1384 
1385   return ret;
1386 }
1387 
1388 /**
1389   * @brief  Disable / Enable I2C interface.[get]
1390   *
1391   * @param  ctx      read / write interface definitions
1392   * @param  val      Get the values of i2c_disable in reg CTRL2
1393   * @retval          interface status (MANDATORY: return 0 -> no Error)
1394   *
1395   */
ais2ih_i2c_interface_get(const stmdev_ctx_t * ctx,ais2ih_i2c_disable_t * val)1396 int32_t ais2ih_i2c_interface_get(const stmdev_ctx_t *ctx,
1397                                  ais2ih_i2c_disable_t *val)
1398 {
1399   ais2ih_ctrl2_t reg;
1400   int32_t ret;
1401 
1402   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1403 
1404   switch (reg.i2c_disable)
1405   {
1406     case AIS2IH_I2C_ENABLE:
1407       *val = AIS2IH_I2C_ENABLE;
1408       break;
1409 
1410     case AIS2IH_I2C_DISABLE:
1411       *val = AIS2IH_I2C_DISABLE;
1412       break;
1413 
1414     default:
1415       *val = AIS2IH_I2C_ENABLE;
1416       break;
1417   }
1418 
1419   return ret;
1420 }
1421 
1422 /**
1423   * @brief  Disconnect CS pull-up.[set]
1424   *
1425   * @param  ctx      read / write interface definitions
1426   * @param  val      change the values of cs_pu_disc in reg CTRL2
1427   * @retval          interface status (MANDATORY: return 0 -> no Error)
1428   *
1429   */
ais2ih_cs_mode_set(const stmdev_ctx_t * ctx,ais2ih_cs_pu_disc_t val)1430 int32_t ais2ih_cs_mode_set(const stmdev_ctx_t *ctx, ais2ih_cs_pu_disc_t val)
1431 {
1432   ais2ih_ctrl2_t reg;
1433   int32_t ret;
1434 
1435   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1436 
1437   if (ret == 0)
1438   {
1439     reg.cs_pu_disc = (uint8_t) val;
1440     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1441   }
1442 
1443   return ret;
1444 }
1445 
1446 /**
1447   * @brief  Disconnect CS pull-up.[get]
1448   *
1449   * @param  ctx      read / write interface definitions
1450   * @param  val      Get the values of cs_pu_disc in reg CTRL2
1451   * @retval          interface status (MANDATORY: return 0 -> no Error)
1452   *
1453   */
ais2ih_cs_mode_get(const stmdev_ctx_t * ctx,ais2ih_cs_pu_disc_t * val)1454 int32_t ais2ih_cs_mode_get(const stmdev_ctx_t *ctx,
1455                            ais2ih_cs_pu_disc_t *val)
1456 {
1457   ais2ih_ctrl2_t reg;
1458   int32_t ret;
1459 
1460   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL2, (uint8_t *) &reg, 1);
1461 
1462   switch (reg.cs_pu_disc)
1463   {
1464     case AIS2IH_PULL_UP_CONNECT:
1465       *val = AIS2IH_PULL_UP_CONNECT;
1466       break;
1467 
1468     case AIS2IH_PULL_UP_DISCONNECT:
1469       *val = AIS2IH_PULL_UP_DISCONNECT;
1470       break;
1471 
1472     default:
1473       *val = AIS2IH_PULL_UP_CONNECT;
1474       break;
1475   }
1476 
1477   return ret;
1478 }
1479 
1480 /**
1481   * @}
1482   *
1483   */
1484 
1485 /**
1486   * @defgroup  AIS2IH_Interrupt_Pins
1487   * @brief     This section groups all the functions that manage interrupt pins
1488   * @{
1489   *
1490   */
1491 
1492 /**
1493   * @brief  Interrupt active-high/low.[set]
1494   *
1495   * @param  ctx      read / write interface definitions
1496   * @param  val      change the values of h_lactive in reg CTRL3
1497   * @retval          interface status (MANDATORY: return 0 -> no Error)
1498   *
1499   */
ais2ih_pin_polarity_set(const stmdev_ctx_t * ctx,ais2ih_h_lactive_t val)1500 int32_t ais2ih_pin_polarity_set(const stmdev_ctx_t *ctx,
1501                                 ais2ih_h_lactive_t val)
1502 {
1503   ais2ih_ctrl3_t reg;
1504   int32_t ret;
1505 
1506   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1507 
1508   if (ret == 0)
1509   {
1510     reg.h_lactive = (uint8_t) val;
1511     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1512   }
1513 
1514   return ret;
1515 }
1516 
1517 /**
1518   * @brief  Interrupt active-high/low.[get]
1519   *
1520   * @param  ctx      read / write interface definitions
1521   * @param  val      Get the values of h_lactive in reg CTRL3
1522   * @retval          interface status (MANDATORY: return 0 -> no Error)
1523   *
1524   */
ais2ih_pin_polarity_get(const stmdev_ctx_t * ctx,ais2ih_h_lactive_t * val)1525 int32_t ais2ih_pin_polarity_get(const stmdev_ctx_t *ctx,
1526                                 ais2ih_h_lactive_t *val)
1527 {
1528   ais2ih_ctrl3_t reg;
1529   int32_t ret;
1530 
1531   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1532 
1533   switch (reg.h_lactive)
1534   {
1535     case AIS2IH_ACTIVE_HIGH:
1536       *val = AIS2IH_ACTIVE_HIGH;
1537       break;
1538 
1539     case AIS2IH_ACTIVE_LOW:
1540       *val = AIS2IH_ACTIVE_LOW;
1541       break;
1542 
1543     default:
1544       *val = AIS2IH_ACTIVE_HIGH;
1545       break;
1546   }
1547 
1548   return ret;
1549 }
1550 
1551 /**
1552   * @brief  Latched/pulsed interrupt.[set]
1553   *
1554   * @param  ctx      read / write interface definitions
1555   * @param  val      change the values of lir in reg CTRL3
1556   * @retval          interface status (MANDATORY: return 0 -> no Error)
1557   *
1558   */
ais2ih_int_notification_set(const stmdev_ctx_t * ctx,ais2ih_lir_t val)1559 int32_t ais2ih_int_notification_set(const stmdev_ctx_t *ctx,
1560                                     ais2ih_lir_t val)
1561 {
1562   ais2ih_ctrl3_t reg;
1563   int32_t ret;
1564 
1565   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1566 
1567   if (ret == 0)
1568   {
1569     reg.lir = (uint8_t) val;
1570     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1571   }
1572 
1573   return ret;
1574 }
1575 
1576 /**
1577   * @brief  Latched/pulsed interrupt.[get]
1578   *
1579   * @param  ctx      read / write interface definitions
1580   * @param  val      Get the values of lir in reg CTRL3
1581   * @retval          interface status (MANDATORY: return 0 -> no Error)
1582   *
1583   */
ais2ih_int_notification_get(const stmdev_ctx_t * ctx,ais2ih_lir_t * val)1584 int32_t ais2ih_int_notification_get(const stmdev_ctx_t *ctx,
1585                                     ais2ih_lir_t *val)
1586 {
1587   ais2ih_ctrl3_t reg;
1588   int32_t ret;
1589 
1590   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1591 
1592   switch (reg.lir)
1593   {
1594     case AIS2IH_INT_PULSED:
1595       *val = AIS2IH_INT_PULSED;
1596       break;
1597 
1598     case AIS2IH_INT_LATCHED:
1599       *val = AIS2IH_INT_LATCHED;
1600       break;
1601 
1602     default:
1603       *val = AIS2IH_INT_PULSED;
1604       break;
1605   }
1606 
1607   return ret;
1608 }
1609 
1610 /**
1611   * @brief  Push-pull/open drain selection on interrupt pads.[set]
1612   *
1613   * @param  ctx      read / write interface definitions
1614   * @param  val      change the values of pp_od in reg CTRL3
1615   * @retval          interface status (MANDATORY: return 0 -> no Error)
1616   *
1617   */
ais2ih_pin_mode_set(const stmdev_ctx_t * ctx,ais2ih_pp_od_t val)1618 int32_t ais2ih_pin_mode_set(const stmdev_ctx_t *ctx, ais2ih_pp_od_t val)
1619 {
1620   ais2ih_ctrl3_t reg;
1621   int32_t ret;
1622 
1623   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1624 
1625   if (ret == 0)
1626   {
1627     reg.pp_od = (uint8_t) val;
1628     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1629   }
1630 
1631   return ret;
1632 }
1633 
1634 /**
1635   * @brief  Push-pull/open drain selection on interrupt pads.[get]
1636   *
1637   * @param  ctx      read / write interface definitions
1638   * @param  val      Get the values of pp_od in reg CTRL3
1639   * @retval          interface status (MANDATORY: return 0 -> no Error)
1640   *
1641   */
ais2ih_pin_mode_get(const stmdev_ctx_t * ctx,ais2ih_pp_od_t * val)1642 int32_t ais2ih_pin_mode_get(const stmdev_ctx_t *ctx, ais2ih_pp_od_t *val)
1643 {
1644   ais2ih_ctrl3_t reg;
1645   int32_t ret;
1646 
1647   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL3, (uint8_t *) &reg, 1);
1648 
1649   switch (reg.pp_od)
1650   {
1651     case AIS2IH_PUSH_PULL:
1652       *val = AIS2IH_PUSH_PULL;
1653       break;
1654 
1655     case AIS2IH_OPEN_DRAIN:
1656       *val = AIS2IH_OPEN_DRAIN;
1657       break;
1658 
1659     default:
1660       *val = AIS2IH_PUSH_PULL;
1661       break;
1662   }
1663 
1664   return ret;
1665 }
1666 
1667 /**
1668   * @brief  Select the signal that need to route on int1 pad.[set]
1669   *
1670   * @param  ctx      read / write interface definitions
1671   * @param  val      register CTRL4_INT1_PAD_CTRL.
1672   * @retval          interface status (MANDATORY: return 0 -> no Error)
1673   *
1674   */
ais2ih_pin_int1_route_set(const stmdev_ctx_t * ctx,ais2ih_ctrl4_int1_pad_ctrl_t * val)1675 int32_t ais2ih_pin_int1_route_set(const stmdev_ctx_t *ctx,
1676                                   ais2ih_ctrl4_int1_pad_ctrl_t *val)
1677 {
1678   ais2ih_ctrl5_int2_pad_ctrl_t ctrl5_int2_pad_ctrl;
1679   ais2ih_ctrl_reg7_t reg;
1680   int32_t ret;
1681 
1682   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL5_INT2_PAD_CTRL,
1683                         (uint8_t *)&ctrl5_int2_pad_ctrl, 1);
1684 
1685   if (ret == 0)
1686   {
1687     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1688   }
1689 
1690   if (ret == 0)
1691   {
1692     if ((val->int1_tap |
1693          val->int1_ff |
1694          val->int1_wu |
1695          val->int1_single_tap |
1696          val->int1_6d |
1697          ctrl5_int2_pad_ctrl.int2_sleep_state |
1698          ctrl5_int2_pad_ctrl.int2_sleep_chg) != PROPERTY_DISABLE)
1699     {
1700       reg.interrupts_enable = PROPERTY_ENABLE;
1701     }
1702 
1703     else
1704     {
1705       reg.interrupts_enable = PROPERTY_DISABLE;
1706     }
1707 
1708     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL4_INT1_PAD_CTRL,
1709                            (uint8_t *) val, 1);
1710   }
1711 
1712   if (ret == 0)
1713   {
1714     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1715   }
1716 
1717   return ret;
1718 }
1719 
1720 /**
1721   * @brief  Select the signal that need to route on int1 pad.[get]
1722   *
1723   * @param  ctx      read / write interface definitions
1724   * @param  val      register CTRL4_INT1_PAD_CTRL.
1725   * @retval          interface status (MANDATORY: return 0 -> no Error)
1726   *
1727   */
ais2ih_pin_int1_route_get(const stmdev_ctx_t * ctx,ais2ih_ctrl4_int1_pad_ctrl_t * val)1728 int32_t ais2ih_pin_int1_route_get(const stmdev_ctx_t *ctx,
1729                                   ais2ih_ctrl4_int1_pad_ctrl_t *val)
1730 {
1731   int32_t ret;
1732 
1733   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL4_INT1_PAD_CTRL,
1734                         (uint8_t *) val, 1);
1735 
1736   return ret;
1737 }
1738 
1739 /**
1740   * @brief   Select the signal that need to route on int2 pad.[set]
1741   *
1742   * @param  ctx      read / write interface definitions
1743   * @param  val      register CTRL5_INT2_PAD_CTRL.
1744   * @retval          interface status (MANDATORY: return 0 -> no Error)
1745   *
1746   */
ais2ih_pin_int2_route_set(const stmdev_ctx_t * ctx,ais2ih_ctrl5_int2_pad_ctrl_t * val)1747 int32_t ais2ih_pin_int2_route_set(const stmdev_ctx_t *ctx,
1748                                   ais2ih_ctrl5_int2_pad_ctrl_t *val)
1749 {
1750   ais2ih_ctrl4_int1_pad_ctrl_t ctrl4_int1_pad_ctrl;
1751   ais2ih_ctrl_reg7_t reg;
1752   int32_t ret;
1753 
1754   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL4_INT1_PAD_CTRL,
1755                         (uint8_t *) &ctrl4_int1_pad_ctrl, 1);
1756 
1757   if (ret == 0)
1758   {
1759     ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1760   }
1761 
1762   if (ret == 0)
1763   {
1764     if ((ctrl4_int1_pad_ctrl.int1_tap |
1765          ctrl4_int1_pad_ctrl.int1_ff |
1766          ctrl4_int1_pad_ctrl.int1_wu |
1767          ctrl4_int1_pad_ctrl.int1_single_tap |
1768          ctrl4_int1_pad_ctrl.int1_6d |
1769          val->int2_sleep_state | val->int2_sleep_chg) != PROPERTY_DISABLE)
1770     {
1771       reg.interrupts_enable = PROPERTY_ENABLE;
1772     }
1773 
1774     else
1775     {
1776       reg.interrupts_enable = PROPERTY_DISABLE;
1777     }
1778 
1779     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL5_INT2_PAD_CTRL,
1780                            (uint8_t *) val, 1);
1781   }
1782 
1783   if (ret == 0)
1784   {
1785     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1786   }
1787 
1788   return ret;
1789 }
1790 
1791 /**
1792   * @brief  Select the signal that need to route on int2 pad.[get]
1793   *
1794   * @param  ctx      read / write interface definitions
1795   * @param  val      register CTRL5_INT2_PAD_CTRL
1796   * @retval          interface status (MANDATORY: return 0 -> no Error)
1797   *
1798   */
ais2ih_pin_int2_route_get(const stmdev_ctx_t * ctx,ais2ih_ctrl5_int2_pad_ctrl_t * val)1799 int32_t ais2ih_pin_int2_route_get(const stmdev_ctx_t *ctx,
1800                                   ais2ih_ctrl5_int2_pad_ctrl_t *val)
1801 {
1802   int32_t ret;
1803 
1804   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL5_INT2_PAD_CTRL,
1805                         (uint8_t *) val, 1);
1806 
1807   return ret;
1808 }
1809 /**
1810   * @brief All interrupt signals become available on INT1 pin.[set]
1811   *
1812   * @param  ctx      read / write interface definitions
1813   * @param  val      change the values of int2_on_int1 in reg CTRL_REG7
1814   * @retval          interface status (MANDATORY: return 0 -> no Error)
1815   *
1816   */
ais2ih_all_on_int1_set(const stmdev_ctx_t * ctx,uint8_t val)1817 int32_t ais2ih_all_on_int1_set(const stmdev_ctx_t *ctx, uint8_t val)
1818 {
1819   ais2ih_ctrl_reg7_t reg;
1820   int32_t ret;
1821 
1822   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1823 
1824   if (ret == 0)
1825   {
1826     reg.int2_on_int1 = val;
1827     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1828   }
1829 
1830   return ret;
1831 }
1832 
1833 /**
1834   * @brief  All interrupt signals become available on INT1 pin.[get]
1835   *
1836   * @param  ctx      read / write interface definitions
1837   * @param  val      change the values of int2_on_int1 in reg CTRL_REG7
1838   * @retval          interface status (MANDATORY: return 0 -> no Error)
1839   *
1840   */
ais2ih_all_on_int1_get(const stmdev_ctx_t * ctx,uint8_t * val)1841 int32_t ais2ih_all_on_int1_get(const stmdev_ctx_t *ctx, uint8_t *val)
1842 {
1843   ais2ih_ctrl_reg7_t reg;
1844   int32_t ret;
1845 
1846   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1847   *val = reg.int2_on_int1;
1848 
1849   return ret;
1850 }
1851 
1852 /**
1853   * @}
1854   *
1855   */
1856 
1857 /**
1858   * @defgroup  AIS2IH_Wake_Up_Event
1859   * @brief     This section groups all the functions that manage the Wake
1860   *            Up event generation.
1861   * @{
1862   *
1863   */
1864 
1865 /**
1866   * @brief  Threshold for wakeup.1 LSB = FS_XL / 64.[set]
1867   *
1868   * @param  ctx      read / write interface definitions
1869   * @param  val      change the values of wk_ths in reg WAKE_UP_THS
1870   * @retval          interface status (MANDATORY: return 0 -> no Error)
1871   *
1872   */
ais2ih_wkup_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1873 int32_t ais2ih_wkup_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1874 {
1875   ais2ih_wake_up_ths_t reg;
1876   int32_t ret;
1877 
1878   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_THS, (uint8_t *) &reg, 1);
1879 
1880   if (ret == 0)
1881   {
1882     reg.wk_ths = val;
1883     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_THS, (uint8_t *) &reg, 1);
1884   }
1885 
1886   return ret;
1887 }
1888 
1889 /**
1890   * @brief  Threshold for wakeup.1 LSB = FS_XL / 64.[get]
1891   *
1892   * @param  ctx      read / write interface definitions
1893   * @param  val      change the values of wk_ths in reg WAKE_UP_THS
1894   * @retval          interface status (MANDATORY: return 0 -> no Error)
1895   *
1896   */
ais2ih_wkup_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1897 int32_t ais2ih_wkup_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1898 {
1899   ais2ih_wake_up_ths_t reg;
1900   int32_t ret;
1901 
1902   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_THS, (uint8_t *) &reg, 1);
1903   *val = reg.wk_ths;
1904 
1905   return ret;
1906 }
1907 
1908 /**
1909   * @brief  Wake up duration event.1LSb = 1 / ODR.[set]
1910   *
1911   * @param  ctx      read / write interface definitions
1912   * @param  val      change the values of wake_dur in reg WAKE_UP_DUR
1913   * @retval          interface status (MANDATORY: return 0 -> no Error)
1914   *
1915   */
ais2ih_wkup_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1916 int32_t ais2ih_wkup_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1917 {
1918   ais2ih_wake_up_dur_t reg;
1919   int32_t ret;
1920 
1921   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR, (uint8_t *) &reg, 1);
1922 
1923   if (ret == 0)
1924   {
1925     reg.wake_dur = val;
1926     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_DUR, (uint8_t *) &reg, 1);
1927   }
1928 
1929   return ret;
1930 }
1931 
1932 /**
1933   * @brief  Wake up duration event.1LSb = 1 / ODR.[get]
1934   *
1935   * @param  ctx      read / write interface definitions
1936   * @param  val      change the values of wake_dur in reg WAKE_UP_DUR
1937   * @retval          interface status (MANDATORY: return 0 -> no Error)
1938   *
1939   */
ais2ih_wkup_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1940 int32_t ais2ih_wkup_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1941 {
1942   ais2ih_wake_up_dur_t reg;
1943   int32_t ret;
1944 
1945   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR, (uint8_t *) &reg, 1);
1946   *val = reg.wake_dur;
1947 
1948   return ret;
1949 }
1950 
1951 /**
1952   * @brief  Data sent to wake-up interrupt function.[set]
1953   *
1954   * @param  ctx      read / write interface definitions
1955   * @param  val      change the values of usr_off_on_wu in reg CTRL_REG7
1956   * @retval          interface status (MANDATORY: return 0 -> no Error)
1957   *
1958   */
ais2ih_wkup_feed_data_set(const stmdev_ctx_t * ctx,ais2ih_usr_off_on_wu_t val)1959 int32_t ais2ih_wkup_feed_data_set(const stmdev_ctx_t *ctx,
1960                                   ais2ih_usr_off_on_wu_t val)
1961 {
1962   ais2ih_ctrl_reg7_t reg;
1963   int32_t ret;
1964 
1965   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1966 
1967   if (ret == 0)
1968   {
1969     reg.usr_off_on_wu = (uint8_t) val;
1970     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1971   }
1972 
1973   return ret;
1974 }
1975 
1976 /**
1977   * @brief  Data sent to wake-up interrupt function.[get]
1978   *
1979   * @param  ctx      read / write interface definitions
1980   * @param  val      Get the values of usr_off_on_wu in reg CTRL_REG7
1981   * @retval          interface status (MANDATORY: return 0 -> no Error)
1982   *
1983   */
ais2ih_wkup_feed_data_get(const stmdev_ctx_t * ctx,ais2ih_usr_off_on_wu_t * val)1984 int32_t ais2ih_wkup_feed_data_get(const stmdev_ctx_t *ctx,
1985                                   ais2ih_usr_off_on_wu_t *val)
1986 {
1987   ais2ih_ctrl_reg7_t reg;
1988   int32_t ret;
1989 
1990   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
1991 
1992   switch (reg.usr_off_on_wu)
1993   {
1994     case AIS2IH_HP_FEED:
1995       *val = AIS2IH_HP_FEED;
1996       break;
1997 
1998     case AIS2IH_USER_OFFSET_FEED:
1999       *val = AIS2IH_USER_OFFSET_FEED;
2000       break;
2001 
2002     default:
2003       *val = AIS2IH_HP_FEED;
2004       break;
2005   }
2006 
2007   return ret;
2008 }
2009 
2010 /**
2011   * @}
2012   *
2013   */
2014 
2015 /**
2016   * @defgroup   AIS2IH_Activity/Inactivity_Detection
2017   * @brief      This section groups all the functions concerning
2018   *             activity/inactivity detection.
2019   * @{
2020   *
2021   */
2022 
2023 /**
2024   * @brief  Config activity / inactivity or
2025   *         stationary / motion detection.[set]
2026   *
2027   * @param  ctx      read / write interface definitions
2028   * @param  val      change the values of sleep_on / stationary in
2029   *                  reg WAKE_UP_THS / WAKE_UP_DUR
2030   * @retval          interface status (MANDATORY: return 0 -> no Error)
2031   *
2032   */
ais2ih_act_mode_set(const stmdev_ctx_t * ctx,ais2ih_sleep_on_t val)2033 int32_t ais2ih_act_mode_set(const stmdev_ctx_t *ctx, ais2ih_sleep_on_t val)
2034 {
2035   ais2ih_wake_up_ths_t wake_up_ths;
2036   ais2ih_wake_up_dur_t wake_up_dur;
2037   int32_t ret;
2038 
2039   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_THS,
2040                         (uint8_t *) &wake_up_ths, 1);
2041 
2042   if (ret == 0)
2043   {
2044     ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR,
2045                           (uint8_t *) &wake_up_dur, 1);
2046   }
2047 
2048   if (ret == 0)
2049   {
2050     wake_up_ths.sleep_on = (uint8_t) val & 0x01U;
2051     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_THS,
2052                            (uint8_t *) &wake_up_ths, 1);
2053   }
2054 
2055   if (ret == 0)
2056   {
2057     wake_up_dur.stationary = ((uint8_t)val & 0x02U) >> 1;
2058     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_DUR,
2059                            (uint8_t *) &wake_up_dur, 1);
2060   }
2061 
2062   return ret;
2063 }
2064 
2065 /**
2066   * @brief  Config activity / inactivity or
2067   *         stationary / motion detection. [get]
2068   *
2069   * @param  ctx      read / write interface definitions
2070   * @param  val      Get the values of sleep_on in reg WAKE_UP_THS
2071   * @retval          interface status (MANDATORY: return 0 -> no Error)
2072   *
2073   */
ais2ih_act_mode_get(const stmdev_ctx_t * ctx,ais2ih_sleep_on_t * val)2074 int32_t ais2ih_act_mode_get(const stmdev_ctx_t *ctx, ais2ih_sleep_on_t *val)
2075 {
2076   ais2ih_wake_up_ths_t wake_up_ths;
2077   ais2ih_wake_up_dur_t wake_up_dur;;
2078   int32_t ret;
2079 
2080   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_THS,
2081                         (uint8_t *) &wake_up_ths, 1);
2082 
2083   if (ret == 0)
2084   {
2085     ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR,
2086                           (uint8_t *) &wake_up_dur, 1);
2087 
2088     switch ((wake_up_dur.stationary << 1) + wake_up_ths.sleep_on)
2089     {
2090       case AIS2IH_NO_DETECTION:
2091         *val = AIS2IH_NO_DETECTION;
2092         break;
2093 
2094       case AIS2IH_DETECT_ACT_INACT:
2095         *val = AIS2IH_DETECT_ACT_INACT;
2096         break;
2097 
2098       case AIS2IH_DETECT_STAT_MOTION:
2099         *val = AIS2IH_DETECT_STAT_MOTION;
2100         break;
2101 
2102       default:
2103         *val = AIS2IH_NO_DETECTION;
2104         break;
2105     }
2106   }
2107 
2108   return ret;
2109 }
2110 
2111 /**
2112   * @brief  Duration to go in sleep mode (1 LSb = 512 / ODR).[set]
2113   *
2114   * @param  ctx      read / write interface definitions
2115   * @param  val      change the values of sleep_dur in reg WAKE_UP_DUR
2116   * @retval          interface status (MANDATORY: return 0 -> no Error)
2117   *
2118   */
ais2ih_act_sleep_dur_set(const stmdev_ctx_t * ctx,uint8_t val)2119 int32_t ais2ih_act_sleep_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
2120 {
2121   ais2ih_wake_up_dur_t reg;
2122   int32_t ret;
2123 
2124   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR, (uint8_t *) &reg, 1);
2125 
2126   if (ret == 0)
2127   {
2128     reg.sleep_dur = val;
2129     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_DUR, (uint8_t *) &reg, 1);
2130   }
2131 
2132   return ret;
2133 }
2134 
2135 /**
2136   * @brief  Duration to go in sleep mode (1 LSb = 512 / ODR).[get]
2137   *
2138   * @param  ctx      read / write interface definitions
2139   * @param  val      change the values of sleep_dur in reg WAKE_UP_DUR
2140   * @retval          interface status (MANDATORY: return 0 -> no Error)
2141   *
2142   */
ais2ih_act_sleep_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)2143 int32_t ais2ih_act_sleep_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
2144 {
2145   ais2ih_wake_up_dur_t reg;
2146   int32_t ret;
2147 
2148   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR, (uint8_t *) &reg, 1);
2149   *val = reg.sleep_dur;
2150 
2151   return ret;
2152 }
2153 
2154 /**
2155   * @}
2156   *
2157   */
2158 
2159 /**
2160   * @defgroup  AIS2IH_Tap_Generator
2161   * @brief     This section groups all the functions that manage the tap
2162   *            and double tap event generation.
2163   * @{
2164   *
2165   */
2166 
2167 /**
2168   * @brief  Threshold for tap recognition.[set]
2169   *
2170   * @param  ctx      read / write interface definitions
2171   * @param  val      change the values of tap_thsx in reg TAP_THS_X
2172   * @retval          interface status (MANDATORY: return 0 -> no Error)
2173   *
2174   */
ais2ih_tap_threshold_x_set(const stmdev_ctx_t * ctx,uint8_t val)2175 int32_t ais2ih_tap_threshold_x_set(const stmdev_ctx_t *ctx, uint8_t val)
2176 {
2177   ais2ih_tap_ths_x_t reg;
2178   int32_t ret;
2179 
2180   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2181 
2182   if (ret == 0)
2183   {
2184     reg.tap_thsx = val;
2185     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2186   }
2187 
2188   return ret;
2189 }
2190 
2191 /**
2192   * @brief  Threshold for tap recognition.[get]
2193   *
2194   * @param  ctx      read / write interface definitions
2195   * @param  val      change the values of tap_thsx in reg TAP_THS_X
2196   * @retval          interface status (MANDATORY: return 0 -> no Error)
2197   *
2198   */
ais2ih_tap_threshold_x_get(const stmdev_ctx_t * ctx,uint8_t * val)2199 int32_t ais2ih_tap_threshold_x_get(const stmdev_ctx_t *ctx, uint8_t *val)
2200 {
2201   ais2ih_tap_ths_x_t reg;
2202   int32_t ret;
2203 
2204   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2205   *val = reg.tap_thsx;
2206 
2207   return ret;
2208 }
2209 
2210 /**
2211   * @brief  Threshold for tap recognition.[set]
2212   *
2213   * @param  ctx      read / write interface definitions
2214   * @param  val      change the values of tap_thsy in reg TAP_THS_Y
2215   * @retval          interface status (MANDATORY: return 0 -> no Error)
2216   *
2217   */
ais2ih_tap_threshold_y_set(const stmdev_ctx_t * ctx,uint8_t val)2218 int32_t ais2ih_tap_threshold_y_set(const stmdev_ctx_t *ctx, uint8_t val)
2219 {
2220   ais2ih_tap_ths_y_t reg;
2221   int32_t ret;
2222 
2223   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Y, (uint8_t *) &reg, 1);
2224 
2225   if (ret == 0)
2226   {
2227     reg.tap_thsy = val;
2228     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_Y, (uint8_t *) &reg, 1);
2229   }
2230 
2231   return ret;
2232 }
2233 
2234 /**
2235   * @brief  Threshold for tap recognition.[get]
2236   *
2237   * @param  ctx      read / write interface definitions
2238   * @param  val      change the values of tap_thsy in reg TAP_THS_Y
2239   * @retval          interface status (MANDATORY: return 0 -> no Error)
2240   *
2241   */
ais2ih_tap_threshold_y_get(const stmdev_ctx_t * ctx,uint8_t * val)2242 int32_t ais2ih_tap_threshold_y_get(const stmdev_ctx_t *ctx, uint8_t *val)
2243 {
2244   ais2ih_tap_ths_y_t reg;
2245   int32_t ret;
2246 
2247   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Y, (uint8_t *) &reg, 1);
2248   *val = reg.tap_thsy;
2249 
2250   return ret;
2251 }
2252 
2253 /**
2254   * @brief  Selection of axis priority for TAP detection.[set]
2255   *
2256   * @param  ctx      read / write interface definitions
2257   * @param  val      change the values of tap_prior in reg TAP_THS_Y
2258   * @retval          interface status (MANDATORY: return 0 -> no Error)
2259   *
2260   */
ais2ih_tap_axis_priority_set(const stmdev_ctx_t * ctx,ais2ih_tap_prior_t val)2261 int32_t ais2ih_tap_axis_priority_set(const stmdev_ctx_t *ctx,
2262                                      ais2ih_tap_prior_t val)
2263 {
2264   ais2ih_tap_ths_y_t reg;
2265   int32_t ret;
2266 
2267   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Y, (uint8_t *) &reg, 1);
2268 
2269   if (ret == 0)
2270   {
2271     reg.tap_prior = (uint8_t) val;
2272     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_Y, (uint8_t *) &reg, 1);
2273   }
2274 
2275   return ret;
2276 }
2277 
2278 /**
2279   * @brief  Selection of axis priority for TAP detection.[get]
2280   *
2281   * @param  ctx      read / write interface definitions
2282   * @param  val      Get the values of tap_prior in reg TAP_THS_Y
2283   * @retval          interface status (MANDATORY: return 0 -> no Error)
2284   *
2285   */
ais2ih_tap_axis_priority_get(const stmdev_ctx_t * ctx,ais2ih_tap_prior_t * val)2286 int32_t ais2ih_tap_axis_priority_get(const stmdev_ctx_t *ctx,
2287                                      ais2ih_tap_prior_t *val)
2288 {
2289   ais2ih_tap_ths_y_t reg;
2290   int32_t ret;
2291 
2292   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Y, (uint8_t *) &reg, 1);
2293 
2294   switch (reg.tap_prior)
2295   {
2296     case AIS2IH_XYZ:
2297       *val = AIS2IH_XYZ;
2298       break;
2299 
2300     case AIS2IH_YXZ:
2301       *val = AIS2IH_YXZ;
2302       break;
2303 
2304     case AIS2IH_XZY:
2305       *val = AIS2IH_XZY;
2306       break;
2307 
2308     case AIS2IH_ZYX:
2309       *val = AIS2IH_ZYX;
2310       break;
2311 
2312     case AIS2IH_YZX:
2313       *val = AIS2IH_YZX;
2314       break;
2315 
2316     case AIS2IH_ZXY:
2317       *val = AIS2IH_ZXY;
2318       break;
2319 
2320     default:
2321       *val = AIS2IH_XYZ;
2322       break;
2323   }
2324 
2325   return ret;
2326 }
2327 
2328 /**
2329   * @brief  Threshold for tap recognition.[set]
2330   *
2331   * @param  ctx      read / write interface definitions
2332   * @param  val      change the values of tap_thsz in reg TAP_THS_Z
2333   * @retval          interface status (MANDATORY: return 0 -> no Error)
2334   *
2335   */
ais2ih_tap_threshold_z_set(const stmdev_ctx_t * ctx,uint8_t val)2336 int32_t ais2ih_tap_threshold_z_set(const stmdev_ctx_t *ctx, uint8_t val)
2337 {
2338   ais2ih_tap_ths_z_t reg;
2339   int32_t ret;
2340 
2341   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2342 
2343   if (ret == 0)
2344   {
2345     reg.tap_thsz = val;
2346     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2347   }
2348 
2349   return ret;
2350 }
2351 
2352 /**
2353   * @brief  Threshold for tap recognition.[get]
2354   *
2355   * @param  ctx      read / write interface definitions
2356   * @param  val      change the values of tap_thsz in reg TAP_THS_Z
2357   * @retval          interface status (MANDATORY: return 0 -> no Error)
2358   *
2359   */
ais2ih_tap_threshold_z_get(const stmdev_ctx_t * ctx,uint8_t * val)2360 int32_t ais2ih_tap_threshold_z_get(const stmdev_ctx_t *ctx, uint8_t *val)
2361 {
2362   ais2ih_tap_ths_z_t reg;
2363   int32_t ret;
2364 
2365   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2366   *val = reg.tap_thsz;
2367 
2368   return ret;
2369 }
2370 
2371 /**
2372   * @brief  Enable Z direction in tap recognition.[set]
2373   *
2374   * @param  ctx      read / write interface definitions
2375   * @param  val      change the values of tap_z_en in reg TAP_THS_Z
2376   * @retval          interface status (MANDATORY: return 0 -> no Error)
2377   *
2378   */
ais2ih_tap_detection_on_z_set(const stmdev_ctx_t * ctx,uint8_t val)2379 int32_t ais2ih_tap_detection_on_z_set(const stmdev_ctx_t *ctx, uint8_t val)
2380 {
2381   ais2ih_tap_ths_z_t reg;
2382   int32_t ret;
2383 
2384   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2385 
2386   if (ret == 0)
2387   {
2388     reg.tap_z_en = val;
2389     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2390   }
2391 
2392   return ret;
2393 }
2394 
2395 /**
2396   * @brief  Enable Z direction in tap recognition.[get]
2397   *
2398   * @param  ctx      read / write interface definitions
2399   * @param  val      change the values of tap_z_en in reg TAP_THS_Z
2400   * @retval          interface status (MANDATORY: return 0 -> no Error)
2401   *
2402   */
ais2ih_tap_detection_on_z_get(const stmdev_ctx_t * ctx,uint8_t * val)2403 int32_t ais2ih_tap_detection_on_z_get(const stmdev_ctx_t *ctx, uint8_t *val)
2404 {
2405   ais2ih_tap_ths_z_t reg;
2406   int32_t ret;
2407 
2408   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2409   *val = reg.tap_z_en;
2410 
2411   return ret;
2412 }
2413 
2414 /**
2415   * @brief  Enable Y direction in tap recognition.[set]
2416   *
2417   * @param  ctx      read / write interface definitions
2418   * @param  val      change the values of tap_y_en in reg TAP_THS_Z
2419   * @retval          interface status (MANDATORY: return 0 -> no Error)
2420   *
2421   */
ais2ih_tap_detection_on_y_set(const stmdev_ctx_t * ctx,uint8_t val)2422 int32_t ais2ih_tap_detection_on_y_set(const stmdev_ctx_t *ctx, uint8_t val)
2423 {
2424   ais2ih_tap_ths_z_t reg;
2425   int32_t ret;
2426 
2427   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2428 
2429   if (ret == 0)
2430   {
2431     reg.tap_y_en = val;
2432     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2433   }
2434 
2435   return ret;
2436 }
2437 
2438 /**
2439   * @brief  Enable Y direction in tap recognition.[get]
2440   *
2441   * @param  ctx      read / write interface definitions
2442   * @param  val      change the values of tap_y_en in reg TAP_THS_Z
2443   * @retval          interface status (MANDATORY: return 0 -> no Error)
2444   *
2445   */
ais2ih_tap_detection_on_y_get(const stmdev_ctx_t * ctx,uint8_t * val)2446 int32_t ais2ih_tap_detection_on_y_get(const stmdev_ctx_t *ctx, uint8_t *val)
2447 {
2448   ais2ih_tap_ths_z_t reg;
2449   int32_t ret;
2450 
2451   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2452   *val = reg.tap_y_en;
2453 
2454   return ret;
2455 }
2456 
2457 /**
2458   * @brief  Enable X direction in tap recognition.[set]
2459   *
2460   * @param  ctx      read / write interface definitions
2461   * @param  val      change the values of tap_x_en in reg TAP_THS_Z
2462   * @retval          interface status (MANDATORY: return 0 -> no Error)
2463   *
2464   */
ais2ih_tap_detection_on_x_set(const stmdev_ctx_t * ctx,uint8_t val)2465 int32_t ais2ih_tap_detection_on_x_set(const stmdev_ctx_t *ctx, uint8_t val)
2466 {
2467   ais2ih_tap_ths_z_t reg;
2468   int32_t ret;
2469 
2470   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2471 
2472   if (ret == 0)
2473   {
2474     reg.tap_x_en = val;
2475     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2476   }
2477 
2478   return ret;
2479 }
2480 
2481 /**
2482   * @brief  Enable X direction in tap recognition.[get]
2483   *
2484   * @param  ctx      read / write interface definitions
2485   * @param  val      change the values of tap_x_en in reg TAP_THS_Z
2486   * @retval          interface status (MANDATORY: return 0 -> no Error)
2487   *
2488   */
ais2ih_tap_detection_on_x_get(const stmdev_ctx_t * ctx,uint8_t * val)2489 int32_t ais2ih_tap_detection_on_x_get(const stmdev_ctx_t *ctx, uint8_t *val)
2490 {
2491   ais2ih_tap_ths_z_t reg;
2492   int32_t ret;
2493 
2494   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_Z, (uint8_t *) &reg, 1);
2495   *val = reg.tap_x_en;
2496 
2497   return ret;
2498 }
2499 
2500 /**
2501   * @brief  Maximum duration is the maximum time of an overthreshold signal
2502   *         detection to be recognized as a tap event. The default value
2503   *         of these bits is 00b which corresponds to 4*ODR_XL time.
2504   *         If the SHOCK[1:0] bits are set to a different value, 1LSB
2505   *         corresponds to 8*ODR_XL time.[set]
2506   *
2507   * @param  ctx      read / write interface definitions
2508   * @param  val      change the values of shock in reg INT_DUR
2509   * @retval          interface status (MANDATORY: return 0 -> no Error)
2510   *
2511   */
ais2ih_tap_shock_set(const stmdev_ctx_t * ctx,uint8_t val)2512 int32_t ais2ih_tap_shock_set(const stmdev_ctx_t *ctx, uint8_t val)
2513 {
2514   ais2ih_int_dur_t reg;
2515   int32_t ret;
2516 
2517   ret = ais2ih_read_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2518 
2519   if (ret == 0)
2520   {
2521     reg.shock = val;
2522     ret = ais2ih_write_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2523   }
2524 
2525   return ret;
2526 }
2527 
2528 /**
2529   * @brief  Maximum duration is the maximum time of an overthreshold signal
2530   *         detection to be recognized as a tap event. The default value
2531   *         of these bits is 00b which corresponds to 4*ODR_XL time.
2532   *         If the SHOCK[1:0] bits are set to a different value, 1LSB
2533   *         corresponds to 8*ODR_XL time.[get]
2534   *
2535   * @param  ctx      read / write interface definitions
2536   * @param  val      change the values of shock in reg INT_DUR
2537   * @retval          interface status (MANDATORY: return 0 -> no Error)
2538   *
2539   */
ais2ih_tap_shock_get(const stmdev_ctx_t * ctx,uint8_t * val)2540 int32_t ais2ih_tap_shock_get(const stmdev_ctx_t *ctx, uint8_t *val)
2541 {
2542   ais2ih_int_dur_t reg;
2543   int32_t ret;
2544 
2545   ret = ais2ih_read_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2546   *val = reg.shock;
2547 
2548   return ret;
2549 }
2550 
2551 /**
2552   * @brief  Quiet time is the time after the first detected tap in which
2553   *         there must not be any overthreshold event.
2554   *         The default value of these bits is 00b which corresponds
2555   *         to 2*ODR_XL time. If the QUIET[1:0] bits are set to a different
2556   *         value, 1LSB corresponds to 4*ODR_XL time.[set]
2557   *
2558   * @param  ctx      read / write interface definitions
2559   * @param  val      change the values of quiet in reg INT_DUR
2560   * @retval          interface status (MANDATORY: return 0 -> no Error)
2561   *
2562   */
ais2ih_tap_quiet_set(const stmdev_ctx_t * ctx,uint8_t val)2563 int32_t ais2ih_tap_quiet_set(const stmdev_ctx_t *ctx, uint8_t val)
2564 {
2565   ais2ih_int_dur_t reg;
2566   int32_t ret;
2567 
2568   ret = ais2ih_read_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2569 
2570   if (ret == 0)
2571   {
2572     reg.quiet = val;
2573     ret = ais2ih_write_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2574   }
2575 
2576   return ret;
2577 }
2578 
2579 /**
2580   * @brief  Quiet time is the time after the first detected tap in which
2581   *         there must not be any overthreshold event.
2582   *         The default value of these bits is 00b which corresponds
2583   *         to 2*ODR_XL time. If the QUIET[1:0] bits are set to a different
2584   *         value, 1LSB corresponds to 4*ODR_XL time.[get]
2585   *
2586   * @param  ctx      read / write interface definitions
2587   * @param  val      change the values of quiet in reg INT_DUR
2588   * @retval          interface status (MANDATORY: return 0 -> no Error)
2589   *
2590   */
ais2ih_tap_quiet_get(const stmdev_ctx_t * ctx,uint8_t * val)2591 int32_t ais2ih_tap_quiet_get(const stmdev_ctx_t *ctx, uint8_t *val)
2592 {
2593   ais2ih_int_dur_t reg;
2594   int32_t ret;
2595 
2596   ret = ais2ih_read_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2597   *val = reg.quiet;
2598 
2599   return ret;
2600 }
2601 
2602 /**
2603   * @brief  When double tap recognition is enabled, this register expresses
2604   *         the maximum time between two consecutive detected taps to
2605   *         determine a double tap event.
2606   *         The default value of these bits is 0000b which corresponds
2607   *         to 16*ODR_XL time. If the DUR[3:0] bits are set to a different
2608   *         value, 1LSB corresponds to 32*ODR_XL time.[set]
2609   *
2610   * @param  ctx      read / write interface definitions
2611   * @param  val      change the values of latency in reg INT_DUR
2612   * @retval          interface status (MANDATORY: return 0 -> no Error)
2613   *
2614   */
ais2ih_tap_dur_set(const stmdev_ctx_t * ctx,uint8_t val)2615 int32_t ais2ih_tap_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
2616 {
2617   ais2ih_int_dur_t reg;
2618   int32_t ret;
2619 
2620   ret = ais2ih_read_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2621 
2622   if (ret == 0)
2623   {
2624     reg.latency = val;
2625     ret = ais2ih_write_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2626   }
2627 
2628   return ret;
2629 }
2630 
2631 /**
2632   * @brief  When double tap recognition is enabled, this register expresses
2633   *         the maximum time between two consecutive detected taps to
2634   *         determine a double tap event.
2635   *         The default value of these bits is 0000b which corresponds
2636   *         to 16*ODR_XL time. If the DUR[3:0] bits are set to a different
2637   *         value, 1LSB corresponds to 32*ODR_XL time.[get]
2638   *
2639   * @param  ctx      read / write interface definitions
2640   * @param  val      change the values of latency in reg INT_DUR
2641   * @retval          interface status (MANDATORY: return 0 -> no Error)
2642   *
2643   */
ais2ih_tap_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)2644 int32_t ais2ih_tap_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
2645 {
2646   ais2ih_int_dur_t reg;
2647   int32_t ret;
2648 
2649   ret = ais2ih_read_reg(ctx, AIS2IH_INT_DUR, (uint8_t *) &reg, 1);
2650   *val = reg.latency;
2651 
2652   return ret;
2653 }
2654 
2655 /**
2656   * @brief  Single/double-tap event enable.[set]
2657   *
2658   * @param  ctx      read / write interface definitions
2659   * @param  val      change the values of single_double_tap in reg WAKE_UP_THS
2660   * @retval          interface status (MANDATORY: return 0 -> no Error)
2661   *
2662   */
ais2ih_tap_mode_set(const stmdev_ctx_t * ctx,ais2ih_single_double_tap_t val)2663 int32_t ais2ih_tap_mode_set(const stmdev_ctx_t *ctx,
2664                             ais2ih_single_double_tap_t val)
2665 {
2666   ais2ih_wake_up_ths_t reg;
2667   int32_t ret;
2668 
2669   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_THS, (uint8_t *) &reg, 1);
2670 
2671   if (ret == 0)
2672   {
2673     reg.single_double_tap = (uint8_t) val;
2674     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_THS, (uint8_t *) &reg, 1);
2675   }
2676 
2677   return ret;
2678 }
2679 
2680 /**
2681   * @brief  Single/double-tap event enable.[get]
2682   *
2683   * @param  ctx      read / write interface definitions
2684   * @param  val      Get the values of single_double_tap in reg WAKE_UP_THS
2685   * @retval          interface status (MANDATORY: return 0 -> no Error)
2686   *
2687   */
ais2ih_tap_mode_get(const stmdev_ctx_t * ctx,ais2ih_single_double_tap_t * val)2688 int32_t ais2ih_tap_mode_get(const stmdev_ctx_t *ctx,
2689                             ais2ih_single_double_tap_t *val)
2690 {
2691   ais2ih_wake_up_ths_t reg;
2692   int32_t ret;
2693 
2694   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_THS, (uint8_t *) &reg, 1);
2695 
2696   switch (reg.single_double_tap)
2697   {
2698     case AIS2IH_ONLY_SINGLE:
2699       *val = AIS2IH_ONLY_SINGLE;
2700       break;
2701 
2702     case AIS2IH_BOTH_SINGLE_DOUBLE:
2703       *val = AIS2IH_BOTH_SINGLE_DOUBLE;
2704       break;
2705 
2706     default:
2707       *val = AIS2IH_ONLY_SINGLE;
2708       break;
2709   }
2710 
2711   return ret;
2712 }
2713 
2714 /**
2715   * @brief  Read the tap / double tap source register.[get]
2716   *
2717   * @param  ctx      read / write interface definitions
2718   * @param  ais2ih_tap_src: union of registers from TAP_SRC to
2719   * @retval          interface status (MANDATORY: return 0 -> no Error)
2720   *
2721   */
ais2ih_tap_src_get(const stmdev_ctx_t * ctx,ais2ih_tap_src_t * val)2722 int32_t ais2ih_tap_src_get(const stmdev_ctx_t *ctx, ais2ih_tap_src_t *val)
2723 {
2724   int32_t ret;
2725 
2726   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_SRC, (uint8_t *) val, 1);
2727 
2728   return ret;
2729 }
2730 
2731 /**
2732   * @}
2733   *
2734   */
2735 
2736 /**
2737   * @defgroup   AIS2IH_Six_Position_Detection(6D/4D)
2738   * @brief      This section groups all the functions concerning six
2739   *             position detection (6D).
2740   * @{
2741   *
2742   */
2743 
2744 /**
2745   * @brief  Threshold for 4D/6D function.[set]
2746   *
2747   * @param  ctx      read / write interface definitions
2748   * @param  val      change the values of 6d_ths in reg TAP_THS_X
2749   * @retval          interface status (MANDATORY: return 0 -> no Error)
2750   *
2751   */
ais2ih_6d_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)2752 int32_t ais2ih_6d_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
2753 {
2754   ais2ih_tap_ths_x_t reg;
2755   int32_t ret;
2756 
2757   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2758 
2759   if (ret == 0)
2760   {
2761     reg._6d_ths = val;
2762     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2763   }
2764 
2765   return ret;
2766 }
2767 
2768 /**
2769   * @brief  Threshold for 4D/6D function.[get]
2770   *
2771   * @param  ctx      read / write interface definitions
2772   * @param  val      change the values of 6d_ths in reg TAP_THS_X
2773   * @retval          interface status (MANDATORY: return 0 -> no Error)
2774   *
2775   */
ais2ih_6d_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)2776 int32_t ais2ih_6d_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
2777 {
2778   ais2ih_tap_ths_x_t reg;
2779   int32_t ret;
2780 
2781   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2782   *val = reg._6d_ths;
2783 
2784   return ret;
2785 }
2786 
2787 /**
2788   * @brief  4D orientation detection enable.[set]
2789   *
2790   * @param  ctx      read / write interface definitions
2791   * @param  val      change the values of 4d_en in reg TAP_THS_X
2792   * @retval          interface status (MANDATORY: return 0 -> no Error)
2793   *
2794   */
ais2ih_4d_mode_set(const stmdev_ctx_t * ctx,uint8_t val)2795 int32_t ais2ih_4d_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
2796 {
2797   ais2ih_tap_ths_x_t reg;
2798   int32_t ret;
2799 
2800   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2801 
2802   if (ret == 0)
2803   {
2804     reg._4d_en = val;
2805     ret = ais2ih_write_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2806   }
2807 
2808   return ret;
2809 }
2810 
2811 /**
2812   * @brief  4D orientation detection enable.[get]
2813   *
2814   * @param  ctx      read / write interface definitions
2815   * @param  val      change the values of 4d_en in reg TAP_THS_X
2816   * @retval          interface status (MANDATORY: return 0 -> no Error)
2817   *
2818   */
ais2ih_4d_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)2819 int32_t ais2ih_4d_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
2820 {
2821   ais2ih_tap_ths_x_t reg;
2822   int32_t ret;
2823 
2824   ret = ais2ih_read_reg(ctx, AIS2IH_TAP_THS_X, (uint8_t *) &reg, 1);
2825   *val = reg._4d_en;
2826 
2827   return ret;
2828 }
2829 
2830 /**
2831   * @brief  Read the 6D tap source register.[get]
2832   *
2833   * @param  ctx      read / write interface definitions
2834   * @param  val      union of registers from SIXD_SRC
2835   * @retval          interface status (MANDATORY: return 0 -> no Error)
2836   *
2837   */
ais2ih_6d_src_get(const stmdev_ctx_t * ctx,ais2ih_sixd_src_t * val)2838 int32_t ais2ih_6d_src_get(const stmdev_ctx_t *ctx, ais2ih_sixd_src_t *val)
2839 {
2840   int32_t ret;
2841 
2842   ret = ais2ih_read_reg(ctx, AIS2IH_SIXD_SRC, (uint8_t *) val, 1);
2843 
2844   return ret;
2845 }
2846 /**
2847   * @brief  Data sent to 6D interrupt function.[set]
2848   *
2849   * @param  ctx      read / write interface definitions
2850   * @param  val      change the values of lpass_on6d in reg CTRL_REG7
2851   * @retval          interface status (MANDATORY: return 0 -> no Error)
2852   *
2853   */
ais2ih_6d_feed_data_set(const stmdev_ctx_t * ctx,ais2ih_lpass_on6d_t val)2854 int32_t ais2ih_6d_feed_data_set(const stmdev_ctx_t *ctx,
2855                                 ais2ih_lpass_on6d_t val)
2856 {
2857   ais2ih_ctrl_reg7_t reg;
2858   int32_t ret;
2859 
2860   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
2861 
2862   if (ret == 0)
2863   {
2864     reg.lpass_on6d = (uint8_t) val;
2865     ret = ais2ih_write_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
2866   }
2867 
2868   return ret;
2869 }
2870 
2871 /**
2872   * @brief  Data sent to 6D interrupt function.[get]
2873   *
2874   * @param  ctx      read / write interface definitions
2875   * @param  val      Get the values of lpass_on6d in reg CTRL_REG7
2876   * @retval          interface status (MANDATORY: return 0 -> no Error)
2877   *
2878   */
ais2ih_6d_feed_data_get(const stmdev_ctx_t * ctx,ais2ih_lpass_on6d_t * val)2879 int32_t ais2ih_6d_feed_data_get(const stmdev_ctx_t *ctx,
2880                                 ais2ih_lpass_on6d_t *val)
2881 {
2882   ais2ih_ctrl_reg7_t reg;
2883   int32_t ret;
2884 
2885   ret = ais2ih_read_reg(ctx, AIS2IH_CTRL_REG7, (uint8_t *) &reg, 1);
2886 
2887   switch (reg.lpass_on6d)
2888   {
2889     case AIS2IH_ODR_DIV_2_FEED:
2890       *val = AIS2IH_ODR_DIV_2_FEED;
2891       break;
2892 
2893     case AIS2IH_LPF2_FEED:
2894       *val = AIS2IH_LPF2_FEED;
2895       break;
2896 
2897     default:
2898       *val = AIS2IH_ODR_DIV_2_FEED;
2899       break;
2900   }
2901 
2902   return ret;
2903 }
2904 
2905 /**
2906   * @}
2907   *
2908   */
2909 
2910 /**
2911   * @defgroup  AIS2IH_Free_Fall
2912   * @brief     This section group all the functions concerning
2913   *            the free fall detection.
2914   * @{
2915   *
2916   */
2917 
2918 /**
2919   * @brief  Wake up duration event(1LSb = 1 / ODR).[set]
2920   *
2921   * @param  ctx      read / write interface definitions
2922   * @param  val      change the values of ff_dur in reg
2923   *                  WAKE_UP_DUR /F REE_FALL
2924   * @retval          interface status (MANDATORY: return 0 -> no Error)
2925   *
2926   */
ais2ih_ff_dur_set(const stmdev_ctx_t * ctx,uint8_t val)2927 int32_t ais2ih_ff_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
2928 {
2929   ais2ih_wake_up_dur_t wake_up_dur;
2930   ais2ih_free_fall_t free_fall;
2931   int32_t ret;
2932 
2933   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR,
2934                         (uint8_t *) &wake_up_dur, 1);
2935 
2936   if (ret == 0)
2937   {
2938     ret = ais2ih_read_reg(ctx, AIS2IH_FREE_FALL, (uint8_t *) &free_fall, 1);
2939   }
2940 
2941   if (ret == 0)
2942   {
2943     wake_up_dur.ff_dur = ((uint8_t) val & 0x20U) >> 5;
2944     free_fall.ff_dur = (uint8_t) val & 0x1FU;
2945     ret = ais2ih_write_reg(ctx, AIS2IH_WAKE_UP_DUR,
2946                            (uint8_t *) &wake_up_dur, 1);
2947   }
2948 
2949   if (ret == 0)
2950   {
2951     ret = ais2ih_write_reg(ctx, AIS2IH_FREE_FALL, (uint8_t *) &free_fall, 1);
2952   }
2953 
2954   return ret;
2955 }
2956 
2957 /**
2958   * @brief  Wake up duration event(1LSb = 1 / ODR).[get]
2959   *
2960   * @param  ctx      read / write interface definitions
2961   * @param  val      change the values of ff_dur in
2962   *                  reg WAKE_UP_DUR /F REE_FALL
2963   * @retval          interface status (MANDATORY: return 0 -> no Error)
2964   *
2965   */
ais2ih_ff_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)2966 int32_t ais2ih_ff_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
2967 {
2968   ais2ih_wake_up_dur_t wake_up_dur;
2969   ais2ih_free_fall_t free_fall;
2970   int32_t ret;
2971 
2972   ret = ais2ih_read_reg(ctx, AIS2IH_WAKE_UP_DUR,
2973                         (uint8_t *) &wake_up_dur, 1);
2974 
2975   if (ret == 0)
2976   {
2977     ret = ais2ih_read_reg(ctx, AIS2IH_FREE_FALL, (uint8_t *) &free_fall, 1);
2978     *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
2979   }
2980 
2981   return ret;
2982 }
2983 
2984 /**
2985   * @brief  Free fall threshold setting.[set]
2986   *
2987   * @param  ctx      read / write interface definitions
2988   * @param  val      change the values of ff_ths in reg FREE_FALL
2989   * @retval          interface status (MANDATORY: return 0 -> no Error)
2990   *
2991   */
ais2ih_ff_threshold_set(const stmdev_ctx_t * ctx,ais2ih_ff_ths_t val)2992 int32_t ais2ih_ff_threshold_set(const stmdev_ctx_t *ctx,
2993                                 ais2ih_ff_ths_t val)
2994 {
2995   ais2ih_free_fall_t reg;
2996   int32_t ret;
2997 
2998   ret = ais2ih_read_reg(ctx, AIS2IH_FREE_FALL, (uint8_t *) &reg, 1);
2999 
3000   if (ret == 0)
3001   {
3002     reg.ff_ths = (uint8_t) val;
3003     ret = ais2ih_write_reg(ctx, AIS2IH_FREE_FALL, (uint8_t *) &reg, 1);
3004   }
3005 
3006   return ret;
3007 }
3008 
3009 /**
3010   * @brief  Free fall threshold setting.[get]
3011   *
3012   * @param  ctx      read / write interface definitions
3013   * @param  val      Get the values of ff_ths in reg FREE_FALL
3014   * @retval          interface status (MANDATORY: return 0 -> no Error)
3015   *
3016   */
ais2ih_ff_threshold_get(const stmdev_ctx_t * ctx,ais2ih_ff_ths_t * val)3017 int32_t ais2ih_ff_threshold_get(const stmdev_ctx_t *ctx,
3018                                 ais2ih_ff_ths_t *val)
3019 {
3020   ais2ih_free_fall_t reg;
3021   int32_t ret;
3022 
3023   ret = ais2ih_read_reg(ctx, AIS2IH_FREE_FALL, (uint8_t *) &reg, 1);
3024 
3025   switch (reg.ff_ths)
3026   {
3027     case AIS2IH_FF_TSH_5LSb_FS2g:
3028       *val = AIS2IH_FF_TSH_5LSb_FS2g;
3029       break;
3030 
3031     case AIS2IH_FF_TSH_7LSb_FS2g:
3032       *val = AIS2IH_FF_TSH_7LSb_FS2g;
3033       break;
3034 
3035     case AIS2IH_FF_TSH_8LSb_FS2g:
3036       *val = AIS2IH_FF_TSH_8LSb_FS2g;
3037       break;
3038 
3039     case AIS2IH_FF_TSH_10LSb_FS2g:
3040       *val = AIS2IH_FF_TSH_10LSb_FS2g;
3041       break;
3042 
3043     case AIS2IH_FF_TSH_11LSb_FS2g:
3044       *val = AIS2IH_FF_TSH_11LSb_FS2g;
3045       break;
3046 
3047     case AIS2IH_FF_TSH_13LSb_FS2g:
3048       *val = AIS2IH_FF_TSH_13LSb_FS2g;
3049       break;
3050 
3051     case AIS2IH_FF_TSH_15LSb_FS2g:
3052       *val = AIS2IH_FF_TSH_15LSb_FS2g;
3053       break;
3054 
3055     case AIS2IH_FF_TSH_16LSb_FS2g:
3056       *val = AIS2IH_FF_TSH_16LSb_FS2g;
3057       break;
3058 
3059     default:
3060       *val = AIS2IH_FF_TSH_5LSb_FS2g;
3061       break;
3062   }
3063 
3064   return ret;
3065 }
3066 
3067 /**
3068   * @}
3069   *
3070   */
3071 
3072 /**
3073   * @defgroup  AIS2IH_Fifo
3074   * @brief     This section group all the functions concerning the fifo usage
3075   * @{
3076   *
3077   */
3078 
3079 /**
3080   * @brief  FIFO watermark level selection.[set]
3081   *
3082   * @param  ctx      read / write interface definitions
3083   * @param  val      change the values of fth in reg FIFO_CTRL
3084   * @retval          interface status (MANDATORY: return 0 -> no Error)
3085   *
3086   */
ais2ih_fifo_watermark_set(const stmdev_ctx_t * ctx,uint8_t val)3087 int32_t ais2ih_fifo_watermark_set(const stmdev_ctx_t *ctx, uint8_t val)
3088 {
3089   ais2ih_fifo_ctrl_t reg;
3090   int32_t ret;
3091 
3092   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_CTRL, (uint8_t *) &reg, 1);
3093 
3094   if (ret == 0)
3095   {
3096     reg.fth = val;
3097     ret = ais2ih_write_reg(ctx, AIS2IH_FIFO_CTRL, (uint8_t *) &reg, 1);
3098   }
3099 
3100   return ret;
3101 }
3102 
3103 /**
3104   * @brief  FIFO watermark level selection.[get]
3105   *
3106   * @param  ctx      read / write interface definitions
3107   * @param  val      change the values of fth in reg FIFO_CTRL
3108   * @retval          interface status (MANDATORY: return 0 -> no Error)
3109   *
3110   */
ais2ih_fifo_watermark_get(const stmdev_ctx_t * ctx,uint8_t * val)3111 int32_t ais2ih_fifo_watermark_get(const stmdev_ctx_t *ctx, uint8_t *val)
3112 {
3113   ais2ih_fifo_ctrl_t reg;
3114   int32_t ret;
3115 
3116   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_CTRL, (uint8_t *) &reg, 1);
3117   *val = reg.fth;
3118 
3119   return ret;
3120 }
3121 
3122 /**
3123   * @brief  FIFO mode selection.[set]
3124   *
3125   * @param  ctx      read / write interface definitions
3126   * @param  val      change the values of fmode in reg FIFO_CTRL
3127   * @retval          interface status (MANDATORY: return 0 -> no Error)
3128   *
3129   */
ais2ih_fifo_mode_set(const stmdev_ctx_t * ctx,ais2ih_fmode_t val)3130 int32_t ais2ih_fifo_mode_set(const stmdev_ctx_t *ctx, ais2ih_fmode_t val)
3131 {
3132   ais2ih_fifo_ctrl_t reg;
3133   int32_t ret;
3134 
3135   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_CTRL, (uint8_t *) &reg, 1);
3136 
3137   if (ret == 0)
3138   {
3139     reg.fmode = (uint8_t) val;
3140     ret = ais2ih_write_reg(ctx, AIS2IH_FIFO_CTRL, (uint8_t *) &reg, 1);
3141   }
3142 
3143   return ret;
3144 }
3145 
3146 /**
3147   * @brief  FIFO mode selection.[get]
3148   *
3149   * @param  ctx      read / write interface definitions
3150   * @param  val      Get the values of fmode in reg FIFO_CTRL
3151   * @retval          interface status (MANDATORY: return 0 -> no Error)
3152   *
3153   */
ais2ih_fifo_mode_get(const stmdev_ctx_t * ctx,ais2ih_fmode_t * val)3154 int32_t ais2ih_fifo_mode_get(const stmdev_ctx_t *ctx, ais2ih_fmode_t *val)
3155 {
3156   ais2ih_fifo_ctrl_t reg;
3157   int32_t ret;
3158 
3159   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_CTRL, (uint8_t *) &reg, 1);
3160 
3161   switch (reg.fmode)
3162   {
3163     case AIS2IH_BYPASS_MODE:
3164       *val = AIS2IH_BYPASS_MODE;
3165       break;
3166 
3167     case AIS2IH_FIFO_MODE:
3168       *val = AIS2IH_FIFO_MODE;
3169       break;
3170 
3171     case AIS2IH_STREAM_TO_FIFO_MODE:
3172       *val = AIS2IH_STREAM_TO_FIFO_MODE;
3173       break;
3174 
3175     case AIS2IH_BYPASS_TO_STREAM_MODE:
3176       *val = AIS2IH_BYPASS_TO_STREAM_MODE;
3177       break;
3178 
3179     case AIS2IH_STREAM_MODE:
3180       *val = AIS2IH_STREAM_MODE;
3181       break;
3182 
3183     default:
3184       *val = AIS2IH_BYPASS_MODE;
3185       break;
3186   }
3187 
3188   return ret;
3189 }
3190 
3191 /**
3192   * @brief  Number of unread samples stored in FIFO.[get]
3193   *
3194   * @param  ctx      read / write interface definitions
3195   * @param  val      change the values of diff in reg FIFO_SAMPLES
3196   * @retval          interface status (MANDATORY: return 0 -> no Error)
3197   *
3198   */
ais2ih_fifo_data_level_get(const stmdev_ctx_t * ctx,uint8_t * val)3199 int32_t ais2ih_fifo_data_level_get(const stmdev_ctx_t *ctx, uint8_t *val)
3200 {
3201   ais2ih_fifo_samples_t reg;
3202   int32_t ret;
3203 
3204   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_SAMPLES, (uint8_t *) &reg, 1);
3205   *val = reg.diff;
3206 
3207   return ret;
3208 }
3209 /**
3210   * @brief  FIFO overrun status.[get]
3211   *
3212   * @param  ctx      read / write interface definitions
3213   * @param  val      change the values of fifo_ovr in reg FIFO_SAMPLES
3214   * @retval          interface status (MANDATORY: return 0 -> no Error)
3215   *
3216   */
ais2ih_fifo_ovr_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)3217 int32_t ais2ih_fifo_ovr_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
3218 {
3219   ais2ih_fifo_samples_t reg;
3220   int32_t ret;
3221 
3222   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_SAMPLES, (uint8_t *) &reg, 1);
3223   *val = reg.fifo_ovr;
3224 
3225   return ret;
3226 }
3227 /**
3228   * @brief  FIFO threshold status flag.[get]
3229   *
3230   * @param  ctx      read / write interface definitions
3231   * @param  val      change the values of fifo_fth in reg FIFO_SAMPLES
3232   * @retval          interface status (MANDATORY: return 0 -> no Error)
3233   *
3234   */
ais2ih_fifo_wtm_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)3235 int32_t ais2ih_fifo_wtm_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
3236 {
3237   ais2ih_fifo_samples_t reg;
3238   int32_t ret;
3239 
3240   ret = ais2ih_read_reg(ctx, AIS2IH_FIFO_SAMPLES, (uint8_t *) &reg, 1);
3241   *val = reg.fifo_fth;
3242 
3243   return ret;
3244 }
3245 
3246 /**
3247   * @}
3248   *
3249   */
3250 
3251 /**
3252   * @}
3253   *
3254   */
3255 
3256 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
3257