1 /**
2   ******************************************************************************
3   * @file    h3lis331dl_reg.c
4   * @author  Sensors Software Solution Team
5   * @brief   H3LIS331DL 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 "h3lis331dl_reg.h"
21 
22 /**
23   * @defgroup    H3LIS331DL
24   * @brief       This file provides a set of functions needed to drive the
25   *              h3lis331dl enhanced inertial module.
26   * @{
27   *
28   */
29 
30 /**
31   * @defgroup    H3LIS331DL_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   */
h3lis331dl_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak h3lis331dl_read_reg(const stmdev_ctx_t *ctx, uint8_t reg,
50                                    uint8_t *data,
51                                    uint16_t len)
52 {
53   int32_t ret;
54 
55   if (ctx == NULL) return -1;
56 
57   ret = ctx->read_reg(ctx->handle, reg, data, len);
58 
59   return ret;
60 }
61 
62 /**
63   * @brief  Write generic device register
64   *
65   * @param  ctx   read / write interface definitions(ptr)
66   * @param  reg   register to write
67   * @param  data  pointer to data to write in register reg(ptr)
68   * @param  len   number of consecutive register to write
69   * @retval       interface status (MANDATORY: return 0 -> no Error)
70   *
71   */
h3lis331dl_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)72 int32_t __weak h3lis331dl_write_reg(const stmdev_ctx_t *ctx, uint8_t reg,
73                                     uint8_t *data,
74                                     uint16_t len)
75 {
76   int32_t ret;
77 
78   if (ctx == NULL) return -1;
79 
80   ret = ctx->write_reg(ctx->handle, reg, data, len);
81 
82   return ret;
83 }
84 
85 /**
86   * @}
87   *
88   */
89 
90 /**
91   * @defgroup    H3LIS331DL_Sensitivity
92   * @brief       These functions convert raw-data into engineering units.
93   * @{
94   *
95   */
96 
h3lis331dl_from_fs100_to_mg(int16_t lsb)97 float_t h3lis331dl_from_fs100_to_mg(int16_t lsb)
98 {
99   return ((float_t)lsb * 3.0625f);
100 }
101 
h3lis331dl_from_fs200_to_mg(int16_t lsb)102 float_t h3lis331dl_from_fs200_to_mg(int16_t lsb)
103 {
104   return ((float_t)lsb * 6.125f);
105 }
106 
h3lis331dl_from_fs400_to_mg(int16_t lsb)107 float_t h3lis331dl_from_fs400_to_mg(int16_t lsb)
108 {
109   return ((float_t)lsb * 12.1875f);
110 }
111 
112 /**
113   * @}
114   *
115   */
116 
117 /**
118   * @defgroup    H3LIS331DL_Data_Generation
119   * @brief       This section group all the functions concerning
120   *              data generation
121   * @{
122   *
123   */
124 
125 /**
126   * @brief  X axis enable/disable.[set]
127   *
128   * @param  ctx         read / write interface definitions(ptr)
129   * @param  val         change the values of xen in reg CTRL_REG1
130   * @retval       interface status (MANDATORY: return 0 -> no Error)
131   *
132   */
h3lis331dl_axis_x_data_set(const stmdev_ctx_t * ctx,uint8_t val)133 int32_t h3lis331dl_axis_x_data_set(const stmdev_ctx_t *ctx, uint8_t val)
134 {
135   h3lis331dl_ctrl_reg1_t ctrl_reg1;
136   int32_t ret;
137 
138   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
139                             (uint8_t *)&ctrl_reg1, 1);
140 
141   if (ret == 0)
142   {
143     ctrl_reg1.xen = val;
144     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG1,
145                                (uint8_t *)&ctrl_reg1, 1);
146   }
147 
148   return ret;
149 }
150 
151 /**
152   * @brief  X axis enable/disable.[get]
153   *
154   * @param  ctx         read / write interface definitions(ptr)
155   * @param  val         change the values of xen in reg CTRL_REG1
156   * @retval       interface status (MANDATORY: return 0 -> no Error)
157   *
158   */
h3lis331dl_axis_x_data_get(const stmdev_ctx_t * ctx,uint8_t * val)159 int32_t h3lis331dl_axis_x_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
160 {
161   h3lis331dl_ctrl_reg1_t ctrl_reg1;
162   int32_t ret;
163 
164   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
165                             (uint8_t *)&ctrl_reg1, 1);
166   *val = ctrl_reg1.xen;
167 
168   return ret;
169 }
170 
171 /**
172   * @brief  Y axis enable/disable.[set]
173   *
174   * @param  ctx         read / write interface definitions(ptr)
175   * @param  val         change the values of yen in reg CTRL_REG1
176   * @retval       interface status (MANDATORY: return 0 -> no Error)
177   *
178   */
h3lis331dl_axis_y_data_set(const stmdev_ctx_t * ctx,uint8_t val)179 int32_t h3lis331dl_axis_y_data_set(const stmdev_ctx_t *ctx, uint8_t val)
180 {
181   h3lis331dl_ctrl_reg1_t ctrl_reg1;
182   int32_t ret;
183 
184   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
185                             (uint8_t *)&ctrl_reg1, 1);
186 
187   if (ret == 0)
188   {
189     ctrl_reg1.yen = val;
190     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG1,
191                                (uint8_t *)&ctrl_reg1, 1);
192   }
193 
194   return ret;
195 }
196 
197 /**
198   * @brief  Y axis enable/disable.[get]
199   *
200   * @param  ctx         read / write interface definitions(ptr)
201   * @param  val         change the values of yen in reg CTRL_REG1
202   * @retval       interface status (MANDATORY: return 0 -> no Error)
203   *
204   */
h3lis331dl_axis_y_data_get(const stmdev_ctx_t * ctx,uint8_t * val)205 int32_t h3lis331dl_axis_y_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
206 {
207   h3lis331dl_ctrl_reg1_t ctrl_reg1;
208   int32_t ret;
209 
210   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
211                             (uint8_t *)&ctrl_reg1, 1);
212   *val = ctrl_reg1.yen;
213 
214   return ret;
215 }
216 
217 /**
218   * @brief  Z axis enable/disable.[set]
219   *
220   * @param  ctx         read / write interface definitions(ptr)
221   * @param  val         change the values of zen in reg CTRL_REG1
222   * @retval       interface status (MANDATORY: return 0 -> no Error)
223   *
224   */
h3lis331dl_axis_z_data_set(const stmdev_ctx_t * ctx,uint8_t val)225 int32_t h3lis331dl_axis_z_data_set(const stmdev_ctx_t *ctx, uint8_t val)
226 {
227   h3lis331dl_ctrl_reg1_t ctrl_reg1;
228   int32_t ret;
229 
230   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
231                             (uint8_t *)&ctrl_reg1, 1);
232 
233   if (ret == 0)
234   {
235     ctrl_reg1.zen = val;
236     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG1,
237                                (uint8_t *)&ctrl_reg1, 1);
238   }
239 
240   return ret;
241 }
242 
243 /**
244   * @brief  Z axis enable/disable.[get]
245   *
246   * @param  ctx         read / write interface definitions(ptr)
247   * @param  val         change the values of zen in reg CTRL_REG1
248   * @retval       interface status (MANDATORY: return 0 -> no Error)
249   *
250   */
h3lis331dl_axis_z_data_get(const stmdev_ctx_t * ctx,uint8_t * val)251 int32_t h3lis331dl_axis_z_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
252 {
253   h3lis331dl_ctrl_reg1_t ctrl_reg1;
254   int32_t ret;
255 
256   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
257                             (uint8_t *)&ctrl_reg1, 1);
258   *val = ctrl_reg1.zen;
259 
260   return ret;
261 }
262 
263 /**
264   * @brief  Accelerometer data rate selection.[set]
265   *
266   * @param  ctx         read / write interface definitions(ptr)
267   * @param  val         change the values of dr in reg CTRL_REG1
268   * @retval       interface status (MANDATORY: return 0 -> no Error)
269   *
270   */
h3lis331dl_data_rate_set(const stmdev_ctx_t * ctx,h3lis331dl_dr_t val)271 int32_t h3lis331dl_data_rate_set(const stmdev_ctx_t *ctx,
272                                  h3lis331dl_dr_t val)
273 {
274   h3lis331dl_ctrl_reg1_t ctrl_reg1;
275   int32_t ret;
276 
277   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
278                             (uint8_t *)&ctrl_reg1, 1);
279 
280   if (ret == 0)
281   {
282     ctrl_reg1.pm = (uint8_t)val & 0x07U;
283     ctrl_reg1.dr = ((uint8_t)val & 0x30U) >> 4;
284     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG1,
285                                (uint8_t *)&ctrl_reg1, 1);
286   }
287 
288   return ret;
289 }
290 
291 /**
292   * @brief  Accelerometer data rate selection.[get]
293   *
294   * @param  ctx         read / write interface definitions(ptr)
295   * @param  val         Get the values of dr in reg CTRL_REG1
296   * @retval       interface status (MANDATORY: return 0 -> no Error)
297   *
298   */
h3lis331dl_data_rate_get(const stmdev_ctx_t * ctx,h3lis331dl_dr_t * val)299 int32_t h3lis331dl_data_rate_get(const stmdev_ctx_t *ctx,
300                                  h3lis331dl_dr_t *val)
301 {
302   h3lis331dl_ctrl_reg1_t ctrl_reg1;
303   int32_t ret;
304 
305   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG1,
306                             (uint8_t *)&ctrl_reg1, 1);
307 
308   switch ((ctrl_reg1.dr << 4) + ctrl_reg1.pm)
309   {
310     case H3LIS331DL_ODR_OFF:
311       *val = H3LIS331DL_ODR_OFF;
312       break;
313 
314     case H3LIS331DL_ODR_Hz5:
315       *val = H3LIS331DL_ODR_Hz5;
316       break;
317 
318     case H3LIS331DL_ODR_1Hz:
319       *val = H3LIS331DL_ODR_1Hz;
320       break;
321 
322     case H3LIS331DL_ODR_2Hz:
323       *val = H3LIS331DL_ODR_2Hz;
324       break;
325 
326     case H3LIS331DL_ODR_5Hz:
327       *val = H3LIS331DL_ODR_5Hz;
328       break;
329 
330     case H3LIS331DL_ODR_10Hz:
331       *val = H3LIS331DL_ODR_10Hz;
332       break;
333 
334     case H3LIS331DL_ODR_50Hz:
335       *val = H3LIS331DL_ODR_50Hz;
336       break;
337 
338     case H3LIS331DL_ODR_100Hz:
339       *val = H3LIS331DL_ODR_100Hz;
340       break;
341 
342     case H3LIS331DL_ODR_400Hz:
343       *val = H3LIS331DL_ODR_400Hz;
344       break;
345 
346     case H3LIS331DL_ODR_1kHz:
347       *val = H3LIS331DL_ODR_1kHz;
348       break;
349 
350     default:
351       *val = H3LIS331DL_ODR_OFF;
352       break;
353   }
354 
355   return ret;
356 }
357 
358 /**
359   * @brief  High pass filter mode selection.[set]
360   *
361   * @param  ctx         read / write interface definitions(ptr)
362   * @param  val         change the values of hpm in reg CTRL_REG2
363   * @retval       interface status (MANDATORY: return 0 -> no Error)
364   *
365   */
h3lis331dl_reference_mode_set(const stmdev_ctx_t * ctx,h3lis331dl_hpm_t val)366 int32_t h3lis331dl_reference_mode_set(const stmdev_ctx_t *ctx,
367                                       h3lis331dl_hpm_t val)
368 {
369   h3lis331dl_ctrl_reg2_t ctrl_reg2;
370   int32_t ret;
371 
372   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
373                             (uint8_t *)&ctrl_reg2, 1);
374 
375   if (ret == 0)
376   {
377     ctrl_reg2.hpm = (uint8_t)val;
378     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG2,
379                                (uint8_t *)&ctrl_reg2, 1);
380   }
381 
382   return ret;
383 }
384 
385 /**
386   * @brief  High pass filter mode selection.[get]
387   *
388   * @param  ctx         read / write interface definitions(ptr)
389   * @param  val         Get the values of hpm in reg CTRL_REG2
390   * @retval       interface status (MANDATORY: return 0 -> no Error)
391   *
392   */
h3lis331dl_reference_mode_get(const stmdev_ctx_t * ctx,h3lis331dl_hpm_t * val)393 int32_t h3lis331dl_reference_mode_get(const stmdev_ctx_t *ctx,
394                                       h3lis331dl_hpm_t *val)
395 {
396   h3lis331dl_ctrl_reg2_t ctrl_reg2;
397   int32_t ret;
398 
399   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
400                             (uint8_t *)&ctrl_reg2, 1);
401 
402   switch (ctrl_reg2.hpm)
403   {
404     case H3LIS331DL_NORMAL_MODE:
405       *val = H3LIS331DL_NORMAL_MODE;
406       break;
407 
408     case H3LIS331DL_REF_MODE_ENABLE:
409       *val = H3LIS331DL_REF_MODE_ENABLE;
410       break;
411 
412     default:
413       *val = H3LIS331DL_NORMAL_MODE;
414       break;
415   }
416 
417   return ret;
418 }
419 
420 /**
421   * @brief  Accelerometer full-scale selection.[set]
422   *
423   * @param  ctx         read / write interface definitions(ptr)
424   * @param  val         change the values of fs in reg CTRL_REG4
425   * @retval       interface status (MANDATORY: return 0 -> no Error)
426   *
427   */
h3lis331dl_full_scale_set(const stmdev_ctx_t * ctx,h3lis331dl_fs_t val)428 int32_t h3lis331dl_full_scale_set(const stmdev_ctx_t *ctx,
429                                   h3lis331dl_fs_t val)
430 {
431   h3lis331dl_ctrl_reg4_t ctrl_reg4;
432   int32_t ret;
433 
434   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
435                             (uint8_t *)&ctrl_reg4, 1);
436 
437   if (ret == 0)
438   {
439     ctrl_reg4.fs = (uint8_t)val;
440     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG4,
441                                (uint8_t *)&ctrl_reg4, 1);
442   }
443 
444   return ret;
445 }
446 
447 /**
448   * @brief  Accelerometer full-scale selection.[get]
449   *
450   * @param  ctx         read / write interface definitions(ptr)
451   * @param  val         Get the values of fs in reg CTRL_REG4
452   * @retval       interface status (MANDATORY: return 0 -> no Error)
453   *
454   */
h3lis331dl_full_scale_get(const stmdev_ctx_t * ctx,h3lis331dl_fs_t * val)455 int32_t h3lis331dl_full_scale_get(const stmdev_ctx_t *ctx,
456                                   h3lis331dl_fs_t *val)
457 {
458   h3lis331dl_ctrl_reg4_t ctrl_reg4;
459   int32_t ret;
460 
461   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
462                             (uint8_t *)&ctrl_reg4, 1);
463 
464   switch (ctrl_reg4.fs)
465   {
466     case H3LIS331DL_100g:
467       *val = H3LIS331DL_100g;
468       break;
469 
470     case H3LIS331DL_200g:
471       *val = H3LIS331DL_200g;
472       break;
473 
474     case H3LIS331DL_400g:
475       *val = H3LIS331DL_400g;
476       break;
477 
478     default:
479       *val = H3LIS331DL_100g;
480       break;
481   }
482 
483   return ret;
484 }
485 
486 /**
487   * @brief  Block data update.[set]
488   *
489   * @param  ctx         read / write interface definitions(ptr)
490   * @param  val         change the values of bdu in reg CTRL_REG4
491   * @retval       interface status (MANDATORY: return 0 -> no Error)
492   *
493   */
h3lis331dl_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)494 int32_t h3lis331dl_block_data_update_set(const stmdev_ctx_t *ctx,
495                                          uint8_t val)
496 {
497   h3lis331dl_ctrl_reg4_t ctrl_reg4;
498   int32_t ret;
499 
500   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
501                             (uint8_t *)&ctrl_reg4, 1);
502 
503   if (ret == 0)
504   {
505     ctrl_reg4.bdu = val;
506     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG4,
507                                (uint8_t *)&ctrl_reg4, 1);
508   }
509 
510   return ret;
511 }
512 
513 /**
514   * @brief  Block data update.[get]
515   *
516   * @param  ctx         read / write interface definitions(ptr)
517   * @param  val         change the values of bdu in reg CTRL_REG4
518   * @retval       interface status (MANDATORY: return 0 -> no Error)
519   *
520   */
h3lis331dl_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)521 int32_t h3lis331dl_block_data_update_get(const stmdev_ctx_t *ctx,
522                                          uint8_t *val)
523 {
524   h3lis331dl_ctrl_reg4_t ctrl_reg4;
525   int32_t ret;
526 
527   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
528                             (uint8_t *)&ctrl_reg4, 1);
529   *val = ctrl_reg4.bdu;
530 
531   return ret;
532 }
533 
534 /**
535   * @brief  The STATUS_REG register is read by the interface.[get]
536   *
537   * @param  ctx         read / write interface definitions(ptr)
538   * @param  val         registers STATUS_REG
539   * @retval       interface status (MANDATORY: return 0 -> no Error)
540   *
541   */
h3lis331dl_status_reg_get(const stmdev_ctx_t * ctx,h3lis331dl_status_reg_t * val)542 int32_t h3lis331dl_status_reg_get(const stmdev_ctx_t *ctx,
543                                   h3lis331dl_status_reg_t *val)
544 {
545   int32_t ret;
546 
547   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_STATUS_REG,
548                             (uint8_t *) val, 1);
549 
550   return ret;
551 }
552 
553 /**
554   * @brief  Accelerometer new data available.[get]
555   *
556   * @param  ctx         read / write interface definitions(ptr)
557   * @param  val         change the values of zyxda in reg STATUS_REG
558   * @retval       interface status (MANDATORY: return 0 -> no Error)
559   *
560   */
h3lis331dl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)561 int32_t h3lis331dl_flag_data_ready_get(const stmdev_ctx_t *ctx,
562                                        uint8_t *val)
563 {
564   h3lis331dl_status_reg_t status_reg;
565   int32_t ret;
566 
567   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_STATUS_REG,
568                             (uint8_t *)&status_reg, 1);
569   *val = status_reg.zyxda;
570 
571   return ret;
572 }
573 
574 /**
575   * @}
576   *
577   */
578 
579 /**
580   * @defgroup    H3LIS331DL_Data_Output
581   * @brief       This section groups all the data output functions.
582   * @{
583   *
584   */
585 
586 /**
587   * @brief  Linear acceleration output register. The value is expressed
588   *         as a 16-bit word in two’s complement.[get]
589   *
590   * @param  ctx         read / write interface definitions(ptr)
591   * @param  buff        buffer that stores data read
592   * @retval       interface status (MANDATORY: return 0 -> no Error)
593   *
594   */
h3lis331dl_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)595 int32_t h3lis331dl_acceleration_raw_get(const stmdev_ctx_t *ctx,
596                                         int16_t *val)
597 {
598   uint8_t buff[6];
599   int32_t ret;
600 
601   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_OUT_X_L, buff, 6);
602   val[0] = (int16_t)buff[1];
603   val[0] = (val[0] * 256) + (int16_t)buff[0];
604   val[1] = (int16_t)buff[3];
605   val[1] = (val[1] * 256) + (int16_t)buff[2];
606   val[2] = (int16_t)buff[5];
607   val[2] = (val[2] * 256) + (int16_t)buff[4];
608 
609   return ret;
610 }
611 
612 /**
613   * @}
614   *
615   */
616 
617 /**
618   * @defgroup    H3LIS331DL_Common
619   * @brief       This section groups common useful functions.
620   * @{
621   *
622   */
623 
624 /**
625   * @brief  Device Who am I.[get]
626   *
627   * @param  ctx         read / write interface definitions(ptr)
628   * @param  buff        buffer that stores data read
629   * @retval       interface status (MANDATORY: return 0 -> no Error)
630   *
631   */
h3lis331dl_device_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)632 int32_t h3lis331dl_device_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
633 {
634   int32_t ret;
635 
636   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_WHO_AM_I, buff, 1);
637 
638   return ret;
639 }
640 
641 /**
642   * @brief  Reboot memory content. Reload the calibration parameters.[set]
643   *
644   * @param  ctx         read / write interface definitions(ptr)
645   * @param  val         change the values of boot in reg CTRL_REG2
646   * @retval       interface status (MANDATORY: return 0 -> no Error)
647   *
648   */
h3lis331dl_boot_set(const stmdev_ctx_t * ctx,uint8_t val)649 int32_t h3lis331dl_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
650 {
651   h3lis331dl_ctrl_reg2_t ctrl_reg2;
652   int32_t ret;
653 
654   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
655                             (uint8_t *)&ctrl_reg2, 1);
656 
657   if (ret == 0)
658   {
659     ctrl_reg2.boot = val;
660     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG2,
661                                (uint8_t *)&ctrl_reg2, 1);
662   }
663 
664   return ret;
665 }
666 
667 /**
668   * @brief  Reboot memory content. Reload the calibration parameters.[get]
669   *
670   * @param  ctx         read / write interface definitions(ptr)
671   * @param  val         change the values of boot in reg CTRL_REG2
672   * @retval       interface status (MANDATORY: return 0 -> no Error)
673   *
674   */
h3lis331dl_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)675 int32_t h3lis331dl_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
676 {
677   h3lis331dl_ctrl_reg2_t ctrl_reg2;
678   int32_t ret;
679 
680   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
681                             (uint8_t *)&ctrl_reg2, 1);
682   *val = ctrl_reg2.boot;
683 
684   return ret;
685 }
686 
687 /**
688   * @brief  Big/Little Endian Data selection.[set]
689   *
690   * @param  ctx         read / write interface definitions(ptr)
691   * @param  val         change the values of ble in reg CTRL_REG4
692   * @retval       interface status (MANDATORY: return 0 -> no Error)
693   *
694   */
h3lis331dl_data_format_set(const stmdev_ctx_t * ctx,h3lis331dl_ble_t val)695 int32_t h3lis331dl_data_format_set(const stmdev_ctx_t *ctx,
696                                    h3lis331dl_ble_t val)
697 {
698   h3lis331dl_ctrl_reg4_t ctrl_reg4;
699   int32_t ret;
700 
701   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
702                             (uint8_t *)&ctrl_reg4, 1);
703 
704   if (ret == 0)
705   {
706     ctrl_reg4.ble = (uint8_t)val;
707     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG4,
708                                (uint8_t *)&ctrl_reg4, 1);
709   }
710 
711   return ret;
712 }
713 
714 /**
715   * @brief  Big/Little Endian Data selection.[get]
716   *
717   * @param  ctx         read / write interface definitions(ptr)
718   * @param  val         Get the values of ble in reg CTRL_REG4
719   * @retval       interface status (MANDATORY: return 0 -> no Error)
720   *
721   */
h3lis331dl_data_format_get(const stmdev_ctx_t * ctx,h3lis331dl_ble_t * val)722 int32_t h3lis331dl_data_format_get(const stmdev_ctx_t *ctx,
723                                    h3lis331dl_ble_t *val)
724 {
725   h3lis331dl_ctrl_reg4_t ctrl_reg4;
726   int32_t ret;
727 
728   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
729                             (uint8_t *)&ctrl_reg4, 1);
730 
731   switch (ctrl_reg4.ble)
732   {
733     case H3LIS331DL_LSB_AT_LOW_ADD:
734       *val = H3LIS331DL_LSB_AT_LOW_ADD;
735       break;
736 
737     case H3LIS331DL_MSB_AT_LOW_ADD:
738       *val = H3LIS331DL_MSB_AT_LOW_ADD;
739       break;
740 
741     default:
742       *val = H3LIS331DL_LSB_AT_LOW_ADD;
743       break;
744   }
745 
746   return ret;
747 }
748 
749 /**
750   * @}
751   *
752   */
753 
754 /**
755   * @defgroup    H3LIS331DL_Filters
756   * @brief       This section group all the functions concerning the
757   *              filters configuration.
758   * @{
759   *
760   */
761 
762 /**
763   * @brief  High pass filter cut-off frequency configuration.[set]
764   *
765   * @param  ctx         read / write interface definitions(ptr)
766   * @param  val         change the values of hpcf in reg CTRL_REG2
767   * @retval       interface status (MANDATORY: return 0 -> no Error)
768   *
769   */
h3lis331dl_hp_bandwidth_set(const stmdev_ctx_t * ctx,h3lis331dl_hpcf_t val)770 int32_t h3lis331dl_hp_bandwidth_set(const stmdev_ctx_t *ctx,
771                                     h3lis331dl_hpcf_t val)
772 {
773   h3lis331dl_ctrl_reg2_t ctrl_reg2;
774   int32_t ret;
775 
776   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
777                             (uint8_t *)&ctrl_reg2, 1);
778 
779   if (ret == 0)
780   {
781     ctrl_reg2.hpcf = (uint8_t)val;
782     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG2,
783                                (uint8_t *)&ctrl_reg2, 1);
784   }
785 
786   return ret;
787 }
788 
789 /**
790   * @brief  High pass filter cut-off frequency configuration.[get]
791   *
792   * @param  ctx         read / write interface definitions(ptr)
793   * @param  val         Get the values of hpcf in reg CTRL_REG2
794   * @retval       interface status (MANDATORY: return 0 -> no Error)
795   *
796   */
h3lis331dl_hp_bandwidth_get(const stmdev_ctx_t * ctx,h3lis331dl_hpcf_t * val)797 int32_t h3lis331dl_hp_bandwidth_get(const stmdev_ctx_t *ctx,
798                                     h3lis331dl_hpcf_t *val)
799 {
800   h3lis331dl_ctrl_reg2_t ctrl_reg2;
801   int32_t ret;
802 
803   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
804                             (uint8_t *)&ctrl_reg2, 1);
805 
806   switch (ctrl_reg2.hpcf)
807   {
808     case H3LIS331DL_CUT_OFF_8Hz:
809       *val = H3LIS331DL_CUT_OFF_8Hz;
810       break;
811 
812     case H3LIS331DL_CUT_OFF_16Hz:
813       *val = H3LIS331DL_CUT_OFF_16Hz;
814       break;
815 
816     case H3LIS331DL_CUT_OFF_32Hz:
817       *val = H3LIS331DL_CUT_OFF_32Hz;
818       break;
819 
820     case H3LIS331DL_CUT_OFF_64Hz:
821       *val = H3LIS331DL_CUT_OFF_64Hz;
822       break;
823 
824     default:
825       *val = H3LIS331DL_CUT_OFF_8Hz;
826       break;
827   }
828 
829   return ret;
830 }
831 
832 /**
833   * @brief  Select High Pass filter path.[set]
834   *
835   * @param  ctx         read / write interface definitions(ptr)
836   * @param  val         change the values of hpen in reg CTRL_REG2
837   * @retval       interface status (MANDATORY: return 0 -> no Error)
838   *
839   */
h3lis331dl_hp_path_set(const stmdev_ctx_t * ctx,h3lis331dl_hpen_t val)840 int32_t h3lis331dl_hp_path_set(const stmdev_ctx_t *ctx,
841                                h3lis331dl_hpen_t val)
842 {
843   h3lis331dl_ctrl_reg2_t ctrl_reg2;
844   int32_t ret;
845 
846   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
847                             (uint8_t *)&ctrl_reg2, 1);
848 
849   if (ret == 0)
850   {
851     ctrl_reg2.hpen = (uint8_t)val & 0x03U;
852     ctrl_reg2.fds = ((uint8_t)val & 0x04U) >> 2;
853     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG2,
854                                (uint8_t *)&ctrl_reg2, 1);
855   }
856 
857   return ret;
858 }
859 
860 /**
861   * @brief  Select High Pass filter path.[get]
862   *
863   * @param  ctx         read / write interface definitions(ptr)
864   * @param  val         Get the values of hpen in reg CTRL_REG2
865   * @retval       interface status (MANDATORY: return 0 -> no Error)
866   *
867   */
h3lis331dl_hp_path_get(const stmdev_ctx_t * ctx,h3lis331dl_hpen_t * val)868 int32_t h3lis331dl_hp_path_get(const stmdev_ctx_t *ctx,
869                                h3lis331dl_hpen_t *val)
870 {
871   h3lis331dl_ctrl_reg2_t ctrl_reg2;
872   int32_t ret;
873 
874   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG2,
875                             (uint8_t *)&ctrl_reg2, 1);
876 
877   switch ((ctrl_reg2.fds << 2) + ctrl_reg2.hpen)
878   {
879     case H3LIS331DL_HP_DISABLE:
880       *val = H3LIS331DL_HP_DISABLE;
881       break;
882 
883     case H3LIS331DL_HP_ON_OUT:
884       *val = H3LIS331DL_HP_ON_OUT;
885       break;
886 
887     case H3LIS331DL_HP_ON_INT1:
888       *val = H3LIS331DL_HP_ON_INT1;
889       break;
890 
891     case H3LIS331DL_HP_ON_INT2:
892       *val = H3LIS331DL_HP_ON_INT2;
893       break;
894 
895     case H3LIS331DL_HP_ON_INT1_INT2:
896       *val = H3LIS331DL_HP_ON_INT1_INT2;
897       break;
898 
899     case H3LIS331DL_HP_ON_INT1_INT2_OUT:
900       *val = H3LIS331DL_HP_ON_INT1_INT2_OUT;
901       break;
902 
903     case H3LIS331DL_HP_ON_INT2_OUT:
904       *val = H3LIS331DL_HP_ON_INT2_OUT;
905       break;
906 
907     case H3LIS331DL_HP_ON_INT1_OUT:
908       *val = H3LIS331DL_HP_ON_INT1_OUT;
909       break;
910 
911     default:
912       *val = H3LIS331DL_HP_DISABLE;
913       break;
914   }
915 
916   return ret;
917 }
918 
919 /**
920   * @brief  Reading at this address zeroes instantaneously
921   *         the content of the internal high pass-filter.
922   *         If the high pass filter is enabled all three axes
923   *         are instantaneously set to 0g. This allows to
924   *         overcome the settling time of the high pass
925   *         filter.[get]
926   *
927   * @param  ctx         read / write interface definitions(ptr)
928   * @retval       interface status (MANDATORY: return 0 -> no Error)
929   *
930   */
h3lis331dl_hp_reset_get(const stmdev_ctx_t * ctx)931 int32_t h3lis331dl_hp_reset_get(const stmdev_ctx_t *ctx)
932 {
933   uint8_t dummy;
934   int32_t ret;
935 
936   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_HP_FILTER_RESET,
937                             (uint8_t *)&dummy, 1);
938 
939   return ret;
940 }
941 
942 /**
943   * @brief  Reference value for high-pass filter.[set]
944   *
945   * @param  ctx         read / write interface definitions(ptr)
946   * @param  val         change the values of ref in reg REFERENCE
947   * @retval       interface status (MANDATORY: return 0 -> no Error)
948   *
949   */
h3lis331dl_hp_reference_value_set(const stmdev_ctx_t * ctx,uint8_t val)950 int32_t h3lis331dl_hp_reference_value_set(const stmdev_ctx_t *ctx,
951                                           uint8_t val)
952 {
953   int32_t ret;
954 
955   ret = h3lis331dl_write_reg(ctx, H3LIS331DL_REFERENCE, (uint8_t *)&val, 1);
956 
957   return ret;
958 }
959 
960 /**
961   * @brief  Reference value for high-pass filter.[get]
962   *
963   * @param  ctx         read / write interface definitions(ptr)
964   * @param  val         change the values of ref in reg REFERENCE
965   * @retval       interface status (MANDATORY: return 0 -> no Error)
966   *
967   */
h3lis331dl_hp_reference_value_get(const stmdev_ctx_t * ctx,uint8_t * val)968 int32_t h3lis331dl_hp_reference_value_get(const stmdev_ctx_t *ctx,
969                                           uint8_t *val)
970 {
971   int32_t ret;
972 
973   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_REFERENCE, val, 1);
974 
975   return ret;
976 }
977 
978 /**
979   * @}
980   *
981   */
982 
983 /**
984   * @defgroup    H3LIS331DL_Serial_Interface
985   * @brief       This section groups all the functions concerning serial
986   *              interface management.
987   * @{
988   *
989   */
990 
991 /**
992   * @brief  SPI 3- or 4-wire interface.[set]
993   *
994   * @param  ctx         read / write interface definitions(ptr)
995   * @param  val         change the values of sim in reg CTRL_REG4
996   * @retval       interface status (MANDATORY: return 0 -> no Error)
997   *
998   */
h3lis331dl_spi_mode_set(const stmdev_ctx_t * ctx,h3lis331dl_sim_t val)999 int32_t h3lis331dl_spi_mode_set(const stmdev_ctx_t *ctx,
1000                                 h3lis331dl_sim_t val)
1001 {
1002   h3lis331dl_ctrl_reg4_t ctrl_reg4;
1003   int32_t ret;
1004 
1005   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
1006                             (uint8_t *)&ctrl_reg4, 1);
1007 
1008   if (ret == 0)
1009   {
1010     ctrl_reg4.sim = (uint8_t)val;
1011     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG4,
1012                                (uint8_t *)&ctrl_reg4, 1);
1013   }
1014 
1015   return ret;
1016 }
1017 
1018 /**
1019   * @brief  SPI 3- or 4-wire interface.[get]
1020   *
1021   * @param  ctx         read / write interface definitions(ptr)
1022   * @param  val         Get the values of sim in reg CTRL_REG4
1023   * @retval       interface status (MANDATORY: return 0 -> no Error)
1024   *
1025   */
h3lis331dl_spi_mode_get(const stmdev_ctx_t * ctx,h3lis331dl_sim_t * val)1026 int32_t h3lis331dl_spi_mode_get(const stmdev_ctx_t *ctx,
1027                                 h3lis331dl_sim_t *val)
1028 {
1029   h3lis331dl_ctrl_reg4_t ctrl_reg4;
1030   int32_t ret;
1031 
1032   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG4,
1033                             (uint8_t *)&ctrl_reg4, 1);
1034 
1035   switch (ctrl_reg4.sim)
1036   {
1037     case H3LIS331DL_SPI_4_WIRE:
1038       *val = H3LIS331DL_SPI_4_WIRE;
1039       break;
1040 
1041     case H3LIS331DL_SPI_3_WIRE:
1042       *val = H3LIS331DL_SPI_3_WIRE;
1043       break;
1044 
1045     default:
1046       *val = H3LIS331DL_SPI_4_WIRE;
1047       break;
1048   }
1049 
1050   return ret;
1051 }
1052 
1053 /**
1054   * @}
1055   *
1056   */
1057 
1058 /**
1059   * @defgroup    H3LIS331DL_Interrupt_Pins
1060   * @brief       This section groups all the functions that manage
1061   *              interrupt pins.
1062   * @{
1063   *
1064   */
1065 
1066 /**
1067   * @brief  Data signal on INT 1 pad control bits.[set]
1068   *
1069   * @param  ctx         read / write interface definitions(ptr)
1070   * @param  val         change the values of i1_cfg in reg CTRL_REG3
1071   * @retval       interface status (MANDATORY: return 0 -> no Error)
1072   *
1073   */
h3lis331dl_pin_int1_route_set(const stmdev_ctx_t * ctx,h3lis331dl_i1_cfg_t val)1074 int32_t h3lis331dl_pin_int1_route_set(const stmdev_ctx_t *ctx,
1075                                       h3lis331dl_i1_cfg_t val)
1076 {
1077   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1078   int32_t ret;
1079 
1080   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1081                             (uint8_t *)&ctrl_reg3, 1);
1082 
1083   if (ret == 0)
1084   {
1085     ctrl_reg3.i1_cfg = (uint8_t)val;
1086     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG3,
1087                                (uint8_t *)&ctrl_reg3, 1);
1088   }
1089 
1090   return ret;
1091 }
1092 
1093 /**
1094   * @brief  Data signal on INT 1 pad control bits.[get]
1095   *
1096   * @param  ctx         read / write interface definitions(ptr)
1097   * @param  val         Get the values of i1_cfg in reg CTRL_REG3
1098   * @retval       interface status (MANDATORY: return 0 -> no Error)
1099   *
1100   */
h3lis331dl_pin_int1_route_get(const stmdev_ctx_t * ctx,h3lis331dl_i1_cfg_t * val)1101 int32_t h3lis331dl_pin_int1_route_get(const stmdev_ctx_t *ctx,
1102                                       h3lis331dl_i1_cfg_t *val)
1103 {
1104   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1105   int32_t ret;
1106 
1107   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1108                             (uint8_t *)&ctrl_reg3, 1);
1109 
1110   switch (ctrl_reg3.i1_cfg)
1111   {
1112     case H3LIS331DL_PAD1_INT1_SRC:
1113       *val = H3LIS331DL_PAD1_INT1_SRC;
1114       break;
1115 
1116     case H3LIS331DL_PAD1_INT1_OR_INT2_SRC:
1117       *val = H3LIS331DL_PAD1_INT1_OR_INT2_SRC;
1118       break;
1119 
1120     case H3LIS331DL_PAD1_DRDY:
1121       *val = H3LIS331DL_PAD1_DRDY;
1122       break;
1123 
1124     case H3LIS331DL_PAD1_BOOT:
1125       *val = H3LIS331DL_PAD1_BOOT;
1126       break;
1127 
1128     default:
1129       *val = H3LIS331DL_PAD1_INT1_SRC;
1130       break;
1131   }
1132 
1133   return ret;
1134 }
1135 
1136 /**
1137   * @brief  Latch interrupt request on INT1_SRC register, with INT1_SRC
1138   *         register cleared by reading INT1_SRC register.[set]
1139   *
1140   * @param  ctx         read / write interface definitions(ptr)
1141   * @param  val         change the values of lir1 in reg CTRL_REG3
1142   * @retval       interface status (MANDATORY: return 0 -> no Error)
1143   *
1144   */
h3lis331dl_int1_notification_set(const stmdev_ctx_t * ctx,h3lis331dl_lir1_t val)1145 int32_t h3lis331dl_int1_notification_set(const stmdev_ctx_t *ctx,
1146                                          h3lis331dl_lir1_t val)
1147 {
1148   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1149   int32_t ret;
1150 
1151   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1152                             (uint8_t *)&ctrl_reg3, 1);
1153 
1154   if (ret == 0)
1155   {
1156     ctrl_reg3.lir1 = (uint8_t)val;
1157     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG3,
1158                                (uint8_t *)&ctrl_reg3, 1);
1159   }
1160 
1161   return ret;
1162 }
1163 
1164 /**
1165   * @brief  Latch interrupt request on INT1_SRC register, with INT1_SRC
1166   *         register cleared by reading INT1_SRC register.[get]
1167   *
1168   * @param  ctx         read / write interface definitions(ptr)
1169   * @param  val         Get the values of lir1 in reg CTRL_REG3
1170   * @retval       interface status (MANDATORY: return 0 -> no Error)
1171   *
1172   */
h3lis331dl_int1_notification_get(const stmdev_ctx_t * ctx,h3lis331dl_lir1_t * val)1173 int32_t h3lis331dl_int1_notification_get(const stmdev_ctx_t *ctx,
1174                                          h3lis331dl_lir1_t *val)
1175 {
1176   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1177   int32_t ret;
1178 
1179   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1180                             (uint8_t *)&ctrl_reg3, 1);
1181 
1182   switch (ctrl_reg3.lir1)
1183   {
1184     case H3LIS331DL_INT1_PULSED:
1185       *val = H3LIS331DL_INT1_PULSED;
1186       break;
1187 
1188     case H3LIS331DL_INT1_LATCHED:
1189       *val = H3LIS331DL_INT1_LATCHED;
1190       break;
1191 
1192     default:
1193       *val = H3LIS331DL_INT1_PULSED;
1194       break;
1195   }
1196 
1197   return ret;
1198 }
1199 
1200 /**
1201   * @brief  Data signal on INT 2 pad control bits.[set]
1202   *
1203   * @param  ctx         read / write interface definitions(ptr)
1204   * @param  val         change the values of i2_cfg in reg CTRL_REG3
1205   * @retval       interface status (MANDATORY: return 0 -> no Error)
1206   *
1207   */
h3lis331dl_pin_int2_route_set(const stmdev_ctx_t * ctx,h3lis331dl_i2_cfg_t val)1208 int32_t h3lis331dl_pin_int2_route_set(const stmdev_ctx_t *ctx,
1209                                       h3lis331dl_i2_cfg_t val)
1210 {
1211   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1212   int32_t ret;
1213 
1214   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1215                             (uint8_t *)&ctrl_reg3, 1);
1216 
1217   if (ret == 0)
1218   {
1219     ctrl_reg3.i2_cfg = (uint8_t)val;
1220     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG3,
1221                                (uint8_t *)&ctrl_reg3, 1);
1222   }
1223 
1224   return ret;
1225 }
1226 
1227 /**
1228   * @brief  Data signal on INT 2 pad control bits.[get]
1229   *
1230   * @param  ctx         read / write interface definitions(ptr)
1231   * @param  val         Get the values of i2_cfg in reg CTRL_REG3
1232   * @retval       interface status (MANDATORY: return 0 -> no Error)
1233   *
1234   */
h3lis331dl_pin_int2_route_get(const stmdev_ctx_t * ctx,h3lis331dl_i2_cfg_t * val)1235 int32_t h3lis331dl_pin_int2_route_get(const stmdev_ctx_t *ctx,
1236                                       h3lis331dl_i2_cfg_t *val)
1237 {
1238   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1239   int32_t ret;
1240 
1241   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1242                             (uint8_t *)&ctrl_reg3, 1);
1243 
1244   switch (ctrl_reg3.i2_cfg)
1245   {
1246     case H3LIS331DL_PAD2_INT2_SRC:
1247       *val = H3LIS331DL_PAD2_INT2_SRC;
1248       break;
1249 
1250     case H3LIS331DL_PAD2_INT1_OR_INT2_SRC:
1251       *val = H3LIS331DL_PAD2_INT1_OR_INT2_SRC;
1252       break;
1253 
1254     case H3LIS331DL_PAD2_DRDY:
1255       *val = H3LIS331DL_PAD2_DRDY;
1256       break;
1257 
1258     case H3LIS331DL_PAD2_BOOT:
1259       *val = H3LIS331DL_PAD2_BOOT;
1260       break;
1261 
1262     default:
1263       *val = H3LIS331DL_PAD2_INT2_SRC;
1264       break;
1265   }
1266 
1267   return ret;
1268 }
1269 
1270 /**
1271   * @brief  Latch interrupt request on INT2_SRC register, with INT2_SRC
1272   *         register cleared by reading INT2_SRC itself.[set]
1273   *
1274   * @param  ctx         read / write interface definitions(ptr)
1275   * @param  val         change the values of lir2 in reg CTRL_REG3
1276   * @retval       interface status (MANDATORY: return 0 -> no Error)
1277   *
1278   */
h3lis331dl_int2_notification_set(const stmdev_ctx_t * ctx,h3lis331dl_lir2_t val)1279 int32_t h3lis331dl_int2_notification_set(const stmdev_ctx_t *ctx,
1280                                          h3lis331dl_lir2_t val)
1281 {
1282   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1283   int32_t ret;
1284 
1285   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1286                             (uint8_t *)&ctrl_reg3, 1);
1287 
1288   if (ret == 0)
1289   {
1290     ctrl_reg3.lir2 = (uint8_t)val;
1291     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG3,
1292                                (uint8_t *)&ctrl_reg3, 1);
1293   }
1294 
1295   return ret;
1296 }
1297 
1298 /**
1299   * @brief  Latch interrupt request on INT2_SRC register, with INT2_SRC
1300   *         register cleared by reading INT2_SRC itself.[get]
1301   *
1302   * @param  ctx         read / write interface definitions(ptr)
1303   * @param  val         Get the values of lir2 in reg CTRL_REG3
1304   * @retval       interface status (MANDATORY: return 0 -> no Error)
1305   *
1306   */
h3lis331dl_int2_notification_get(const stmdev_ctx_t * ctx,h3lis331dl_lir2_t * val)1307 int32_t h3lis331dl_int2_notification_get(const stmdev_ctx_t *ctx,
1308                                          h3lis331dl_lir2_t *val)
1309 {
1310   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1311   int32_t ret;
1312 
1313   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1314                             (uint8_t *)&ctrl_reg3, 1);
1315 
1316   switch (ctrl_reg3.lir2)
1317   {
1318     case H3LIS331DL_INT2_PULSED:
1319       *val = H3LIS331DL_INT2_PULSED;
1320       break;
1321 
1322     case H3LIS331DL_INT2_LATCHED:
1323       *val = H3LIS331DL_INT2_LATCHED;
1324       break;
1325 
1326     default:
1327       *val = H3LIS331DL_INT2_PULSED;
1328       break;
1329   }
1330 
1331   return ret;
1332 }
1333 
1334 /**
1335   * @brief  Push-pull/open drain selection on interrupt pads.[set]
1336   *
1337   * @param  ctx         read / write interface definitions(ptr)
1338   * @param  val         change the values of pp_od in reg CTRL_REG3
1339   * @retval       interface status (MANDATORY: return 0 -> no Error)
1340   *
1341   */
h3lis331dl_pin_mode_set(const stmdev_ctx_t * ctx,h3lis331dl_pp_od_t val)1342 int32_t h3lis331dl_pin_mode_set(const stmdev_ctx_t *ctx,
1343                                 h3lis331dl_pp_od_t val)
1344 {
1345   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1346   int32_t ret;
1347 
1348   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1349                             (uint8_t *)&ctrl_reg3, 1);
1350 
1351   if (ret == 0)
1352   {
1353     ctrl_reg3.pp_od = (uint8_t)val;
1354     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG3,
1355                                (uint8_t *)&ctrl_reg3, 1);
1356   }
1357 
1358   return ret;
1359 }
1360 
1361 /**
1362   * @brief  Push-pull/open drain selection on interrupt pads.[get]
1363   *
1364   * @param  ctx         read / write interface definitions(ptr)
1365   * @param  val         Get the values of pp_od in reg CTRL_REG3
1366   * @retval       interface status (MANDATORY: return 0 -> no Error)
1367   *
1368   */
h3lis331dl_pin_mode_get(const stmdev_ctx_t * ctx,h3lis331dl_pp_od_t * val)1369 int32_t h3lis331dl_pin_mode_get(const stmdev_ctx_t *ctx,
1370                                 h3lis331dl_pp_od_t *val)
1371 {
1372   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1373   int32_t ret;
1374 
1375   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1376                             (uint8_t *)&ctrl_reg3, 1);
1377 
1378   switch (ctrl_reg3.pp_od)
1379   {
1380     case H3LIS331DL_PUSH_PULL:
1381       *val = H3LIS331DL_PUSH_PULL;
1382       break;
1383 
1384     case H3LIS331DL_OPEN_DRAIN:
1385       *val = H3LIS331DL_OPEN_DRAIN;
1386       break;
1387 
1388     default:
1389       *val = H3LIS331DL_PUSH_PULL;
1390       break;
1391   }
1392 
1393   return ret;
1394 }
1395 
1396 /**
1397   * @brief  Interrupt active-high/low.[set]
1398   *
1399   * @param  ctx         read / write interface definitions(ptr)
1400   * @param  val         change the values of ihl in reg CTRL_REG3
1401   * @retval       interface status (MANDATORY: return 0 -> no Error)
1402   *
1403   */
h3lis331dl_pin_polarity_set(const stmdev_ctx_t * ctx,h3lis331dl_ihl_t val)1404 int32_t h3lis331dl_pin_polarity_set(const stmdev_ctx_t *ctx,
1405                                     h3lis331dl_ihl_t val)
1406 {
1407   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1408   int32_t ret;
1409 
1410   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1411                             (uint8_t *)&ctrl_reg3, 1);
1412 
1413   if (ret == 0)
1414   {
1415     ctrl_reg3.ihl = (uint8_t)val;
1416     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG3,
1417                                (uint8_t *)&ctrl_reg3, 1);
1418   }
1419 
1420   return ret;
1421 }
1422 
1423 /**
1424   * @brief  Interrupt active-high/low.[get]
1425   *
1426   * @param  ctx         read / write interface definitions(ptr)
1427   * @param  val         Get the values of ihl in reg CTRL_REG3
1428   * @retval       interface status (MANDATORY: return 0 -> no Error)
1429   *
1430   */
h3lis331dl_pin_polarity_get(const stmdev_ctx_t * ctx,h3lis331dl_ihl_t * val)1431 int32_t h3lis331dl_pin_polarity_get(const stmdev_ctx_t *ctx,
1432                                     h3lis331dl_ihl_t *val)
1433 {
1434   h3lis331dl_ctrl_reg3_t ctrl_reg3;
1435   int32_t ret;
1436 
1437   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG3,
1438                             (uint8_t *)&ctrl_reg3, 1);
1439 
1440   switch (ctrl_reg3.ihl)
1441   {
1442     case H3LIS331DL_ACTIVE_HIGH:
1443       *val = H3LIS331DL_ACTIVE_HIGH;
1444       break;
1445 
1446     case H3LIS331DL_ACTIVE_LOW:
1447       *val = H3LIS331DL_ACTIVE_LOW;
1448       break;
1449 
1450     default:
1451       *val = H3LIS331DL_ACTIVE_HIGH;
1452       break;
1453   }
1454 
1455   return ret;
1456 }
1457 
1458 /**
1459   * @}
1460   *
1461   */
1462 
1463 /**
1464   * @defgroup    H3LIS331DL_interrupt_on_threshold
1465   * @brief       This section groups all the functions that manage
1466   *              the interrupt on threshold event generation.
1467   * @{
1468   *
1469   */
1470 
1471 /**
1472   * @brief  Configure the interrupt 1 threshold sign.[set]
1473   *
1474   * @param  ctx         read / write interface definitions(ptr)
1475   * @param  val         enable sign and axis for interrupt on threshold
1476   * @retval       interface status (MANDATORY: return 0 -> no Error)
1477   *
1478   */
h3lis331dl_int1_on_threshold_conf_set(const stmdev_ctx_t * ctx,h3lis331dl_int1_on_th_conf_t val)1479 int32_t h3lis331dl_int1_on_threshold_conf_set(const stmdev_ctx_t *ctx,
1480                                               h3lis331dl_int1_on_th_conf_t val)
1481 {
1482   h3lis331dl_int1_cfg_t int1_cfg;
1483   int32_t ret;
1484 
1485   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_CFG,
1486                             (uint8_t *)&int1_cfg, 1);
1487 
1488   if (ret == 0)
1489   {
1490     int1_cfg.xlie  = val.int1_xlie;
1491     int1_cfg.xhie  = val.int1_xhie;
1492     int1_cfg.ylie  = val.int1_ylie;
1493     int1_cfg.yhie  = val.int1_yhie;
1494     int1_cfg.zlie  = val.int1_zlie;
1495     int1_cfg.zhie  = val.int1_zhie;
1496     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT1_CFG,
1497                                (uint8_t *)&int1_cfg, 1);
1498   }
1499 
1500   return ret;
1501 }
1502 
1503 /**
1504   * @brief   Configure the interrupt 1 threshold sign.[get]
1505   *
1506   * @param  ctx         read / write interface definitions(ptr)
1507   * @param  val         enable sign and axis for interrupt on threshold
1508   * @retval       interface status (MANDATORY: return 0 -> no Error)
1509   *
1510   */
h3lis331dl_int1_on_threshold_conf_get(const stmdev_ctx_t * ctx,h3lis331dl_int1_on_th_conf_t * val)1511 int32_t h3lis331dl_int1_on_threshold_conf_get(const stmdev_ctx_t *ctx,
1512                                               h3lis331dl_int1_on_th_conf_t *val)
1513 {
1514   h3lis331dl_int1_cfg_t int1_cfg;
1515   int32_t ret;
1516 
1517   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_CFG,
1518                             (uint8_t *)&int1_cfg, 1);
1519   val->int1_xlie = int1_cfg.xlie;
1520   val->int1_xhie = int1_cfg.xhie;
1521   val->int1_ylie = int1_cfg.ylie;
1522   val->int1_yhie = int1_cfg.yhie;
1523   val->int1_zlie = int1_cfg.zlie;
1524   val->int1_zhie = int1_cfg.zhie;
1525 
1526   return ret;
1527 }
1528 
1529 /**
1530   * @brief  AND/OR combination of Interrupt 1 events.[set]
1531   *
1532   * @param  ctx         read / write interface definitions(ptr)
1533   * @param  val         change the values of aoi in reg INT1_CFG
1534   * @retval       interface status (MANDATORY: return 0 -> no Error)
1535   *
1536   */
h3lis331dl_int1_on_threshold_mode_set(const stmdev_ctx_t * ctx,h3lis331dl_int1_aoi_t val)1537 int32_t h3lis331dl_int1_on_threshold_mode_set(const stmdev_ctx_t *ctx,
1538                                               h3lis331dl_int1_aoi_t val)
1539 {
1540   h3lis331dl_int1_cfg_t int1_cfg;
1541   int32_t ret;
1542 
1543   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_CFG,
1544                             (uint8_t *)&int1_cfg, 1);
1545 
1546   if (ret == 0)
1547   {
1548     int1_cfg.aoi = (uint8_t) val;
1549     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT1_CFG,
1550                                (uint8_t *)&int1_cfg, 1);
1551   }
1552 
1553   return ret;
1554 }
1555 
1556 /**
1557   * @brief   AND/OR combination of Interrupt 1 events.[get]
1558   *
1559   * @param  ctx         read / write interface definitions(ptr)
1560   * @param  val         Get the values of aoi in reg INT1_CFG
1561   * @retval       interface status (MANDATORY: return 0 -> no Error)
1562   *
1563   */
h3lis331dl_int1_on_threshold_mode_get(const stmdev_ctx_t * ctx,h3lis331dl_int1_aoi_t * val)1564 int32_t h3lis331dl_int1_on_threshold_mode_get(const stmdev_ctx_t *ctx,
1565                                               h3lis331dl_int1_aoi_t *val)
1566 {
1567   h3lis331dl_int1_cfg_t int1_cfg;
1568   int32_t ret;
1569 
1570   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_CFG,
1571                             (uint8_t *)&int1_cfg, 1);
1572 
1573   switch (int1_cfg.aoi)
1574   {
1575     case H3LIS331DL_INT1_ON_THRESHOLD_OR:
1576       *val = H3LIS331DL_INT1_ON_THRESHOLD_OR;
1577       break;
1578 
1579     case H3LIS331DL_INT1_ON_THRESHOLD_AND:
1580       *val = H3LIS331DL_INT1_ON_THRESHOLD_AND;
1581       break;
1582 
1583     default:
1584       *val = H3LIS331DL_INT1_ON_THRESHOLD_OR;
1585       break;
1586   }
1587 
1588   return ret;
1589 }
1590 
1591 /**
1592   * @brief  Interrupt generator 1 on threshold source register.[get]
1593   *
1594   * @param  ctx         read / write interface definitions(ptr)
1595   * @param  val         registers INT1_SRC
1596   * @retval       interface status (MANDATORY: return 0 -> no Error)
1597   *
1598   */
h3lis331dl_int1_src_get(const stmdev_ctx_t * ctx,h3lis331dl_int1_src_t * val)1599 int32_t h3lis331dl_int1_src_get(const stmdev_ctx_t *ctx,
1600                                 h3lis331dl_int1_src_t *val)
1601 {
1602   int32_t ret;
1603 
1604   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_SRC, (uint8_t *) val, 1);
1605 
1606   return ret;
1607 }
1608 
1609 /**
1610   * @brief  Interrupt 1 threshold.[set]
1611   *
1612   * @param  ctx         read / write interface definitions(ptr)
1613   * @param  val         change the values of ths in reg INT1_THS
1614   * @retval       interface status (MANDATORY: return 0 -> no Error)
1615   *
1616   */
h3lis331dl_int1_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1617 int32_t h3lis331dl_int1_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1618 {
1619   h3lis331dl_int1_ths_t int1_ths;
1620   int32_t ret;
1621 
1622   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_THS,
1623                             (uint8_t *)&int1_ths, 1);
1624 
1625   if (ret == 0)
1626   {
1627     int1_ths.ths = val;
1628     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT1_THS,
1629                                (uint8_t *)&int1_ths, 1);
1630   }
1631 
1632   return ret;
1633 }
1634 
1635 /**
1636   * @brief  Interrupt 1 threshold.[get]
1637   *
1638   * @param  ctx         read / write interface definitions(ptr)
1639   * @param  val         change the values of ths in reg INT1_THS
1640   * @retval       interface status (MANDATORY: return 0 -> no Error)
1641   *
1642   */
h3lis331dl_int1_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1643 int32_t h3lis331dl_int1_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1644 {
1645   h3lis331dl_int1_ths_t int1_ths;
1646   int32_t ret;
1647 
1648   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_THS,
1649                             (uint8_t *)&int1_ths, 1);
1650   *val = int1_ths.ths;
1651 
1652   return ret;
1653 }
1654 
1655 /**
1656   * @brief  Duration value for interrupt 1 generator.[set]
1657   *
1658   * @param  ctx         read / write interface definitions(ptr)
1659   * @param  val         change the values of d in reg INT1_DURATION
1660   * @retval       interface status (MANDATORY: return 0 -> no Error)
1661   *
1662   */
h3lis331dl_int1_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1663 int32_t h3lis331dl_int1_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1664 {
1665   h3lis331dl_int1_duration_t int1_duration;
1666   int32_t ret;
1667 
1668   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_DURATION,
1669                             (uint8_t *)&int1_duration, 1);
1670 
1671   if (ret == 0)
1672   {
1673     int1_duration.d = val;
1674     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT1_DURATION,
1675                                (uint8_t *)&int1_duration, 1);
1676   }
1677 
1678   return ret;
1679 }
1680 
1681 /**
1682   * @brief  Duration value for interrupt 1 generator.[get]
1683   *
1684   * @param  ctx         read / write interface definitions(ptr)
1685   * @param  val         change the values of d in reg INT1_DURATION
1686   * @retval       interface status (MANDATORY: return 0 -> no Error)
1687   *
1688   */
h3lis331dl_int1_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1689 int32_t h3lis331dl_int1_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1690 {
1691   h3lis331dl_int1_duration_t int1_duration;
1692   int32_t ret;
1693 
1694   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT1_DURATION,
1695                             (uint8_t *)&int1_duration, 1);
1696   *val = int1_duration.d;
1697 
1698   return ret;
1699 }
1700 
1701 /**
1702   * @brief  Configure the interrupt 2 threshold sign.[set]
1703   *
1704   * @param  ctx         read / write interface definitions(ptr)
1705   * @param  val         enable sign and axis for interrupt on threshold
1706   * @retval       interface status (MANDATORY: return 0 -> no Error)
1707   *
1708   */
h3lis331dl_int2_on_threshold_conf_set(const stmdev_ctx_t * ctx,h3lis331dl_int2_on_th_conf_t val)1709 int32_t h3lis331dl_int2_on_threshold_conf_set(const stmdev_ctx_t *ctx,
1710                                               h3lis331dl_int2_on_th_conf_t val)
1711 {
1712   h3lis331dl_int2_cfg_t int2_cfg;
1713   int32_t ret;
1714 
1715   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_CFG,
1716                             (uint8_t *)&int2_cfg, 1);
1717 
1718   if (ret == 0)
1719   {
1720     int2_cfg.xlie  = val.int2_xlie;
1721     int2_cfg.xhie  = val.int2_xhie;
1722     int2_cfg.ylie  = val.int2_ylie;
1723     int2_cfg.yhie  = val.int2_yhie;
1724     int2_cfg.zlie  = val.int2_zlie;
1725     int2_cfg.zhie  = val.int2_zhie;
1726     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT2_CFG,
1727                                (uint8_t *)&int2_cfg, 1);
1728   }
1729 
1730   return ret;
1731 }
1732 
1733 /**
1734   * @brief  Configure the interrupt 2 threshold sign.[get]
1735   *
1736   * @param  ctx         read / write interface definitions(ptr)
1737   * @param  val         enable sign and axis for interrupt on threshold
1738   * @retval       interface status (MANDATORY: return 0 -> no Error)
1739   *
1740   */
h3lis331dl_int2_on_threshold_conf_get(const stmdev_ctx_t * ctx,h3lis331dl_int2_on_th_conf_t * val)1741 int32_t h3lis331dl_int2_on_threshold_conf_get(const stmdev_ctx_t *ctx,
1742                                               h3lis331dl_int2_on_th_conf_t *val)
1743 {
1744   h3lis331dl_int2_cfg_t int2_cfg;
1745   int32_t ret;
1746 
1747   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_CFG,
1748                             (uint8_t *)&int2_cfg, 1);
1749   val->int2_xlie = int2_cfg.xlie;
1750   val->int2_xhie = int2_cfg.xhie;
1751   val->int2_ylie = int2_cfg.ylie;
1752   val->int2_yhie = int2_cfg.yhie;
1753   val->int2_zlie = int2_cfg.zlie;
1754   val->int2_zhie = int2_cfg.zhie;
1755 
1756   return ret;
1757 }
1758 
1759 /**
1760   * @brief  AND/OR combination of Interrupt 2 events.[set]
1761   *
1762   * @param  ctx         read / write interface definitions(ptr)
1763   * @param  val         change the values of aoi in reg INT2_CFG
1764   * @retval       interface status (MANDATORY: return 0 -> no Error)
1765   *
1766   */
h3lis331dl_int2_on_threshold_mode_set(const stmdev_ctx_t * ctx,h3lis331dl_int2_aoi_t val)1767 int32_t h3lis331dl_int2_on_threshold_mode_set(const stmdev_ctx_t *ctx,
1768                                               h3lis331dl_int2_aoi_t val)
1769 {
1770   h3lis331dl_int2_cfg_t int2_cfg;
1771   int32_t ret;
1772 
1773   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_CFG,
1774                             (uint8_t *)&int2_cfg, 1);
1775 
1776   if (ret == 0)
1777   {
1778     int2_cfg.aoi = (uint8_t) val;
1779     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT2_CFG,
1780                                (uint8_t *)&int2_cfg, 1);
1781   }
1782 
1783   return ret;
1784 }
1785 
1786 /**
1787   * @brief   AND/OR combination of Interrupt 2 events.[get]
1788   *
1789   * @param  ctx         read / write interface definitions(ptr)
1790   * @param  val         Get the values of aoi in reg INT2_CFG
1791   * @retval       interface status (MANDATORY: return 0 -> no Error)
1792   *
1793   */
h3lis331dl_int2_on_threshold_mode_get(const stmdev_ctx_t * ctx,h3lis331dl_int2_aoi_t * val)1794 int32_t h3lis331dl_int2_on_threshold_mode_get(const stmdev_ctx_t *ctx,
1795                                               h3lis331dl_int2_aoi_t *val)
1796 {
1797   h3lis331dl_int2_cfg_t int2_cfg;
1798   int32_t ret;
1799 
1800   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_CFG,
1801                             (uint8_t *)&int2_cfg, 1);
1802 
1803   switch (int2_cfg.aoi)
1804   {
1805     case H3LIS331DL_INT2_ON_THRESHOLD_OR:
1806       *val = H3LIS331DL_INT2_ON_THRESHOLD_OR;
1807       break;
1808 
1809     case H3LIS331DL_INT2_ON_THRESHOLD_AND:
1810       *val = H3LIS331DL_INT2_ON_THRESHOLD_AND;
1811       break;
1812 
1813     default:
1814       *val = H3LIS331DL_INT2_ON_THRESHOLD_OR;
1815       break;
1816   }
1817 
1818   return ret;
1819 }
1820 
1821 /**
1822   * @brief  Interrupt generator 2 on threshold source register.[get]
1823   *
1824   * @param  ctx         read / write interface definitions(ptr)
1825   * @param  val         registers INT2_SRC
1826   * @retval       interface status (MANDATORY: return 0 -> no Error)
1827   *
1828   */
h3lis331dl_int2_src_get(const stmdev_ctx_t * ctx,h3lis331dl_int2_src_t * val)1829 int32_t h3lis331dl_int2_src_get(const stmdev_ctx_t *ctx,
1830                                 h3lis331dl_int2_src_t *val)
1831 {
1832   int32_t ret;
1833 
1834   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_SRC, (uint8_t *) val, 1);
1835 
1836   return ret;
1837 }
1838 
1839 /**
1840   * @brief  Interrupt 2 threshold.[set]
1841   *
1842   * @param  ctx         read / write interface definitions(ptr)
1843   * @param  val         change the values of ths in reg INT2_THS
1844   * @retval       interface status (MANDATORY: return 0 -> no Error)
1845   *
1846   */
h3lis331dl_int2_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1847 int32_t h3lis331dl_int2_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1848 {
1849   h3lis331dl_int2_ths_t int2_ths;
1850   int32_t ret;
1851 
1852   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_THS,
1853                             (uint8_t *)&int2_ths, 1);
1854 
1855   if (ret == 0)
1856   {
1857     int2_ths.ths = val;
1858     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT2_THS,
1859                                (uint8_t *)&int2_ths, 1);
1860   }
1861 
1862   return ret;
1863 }
1864 
1865 /**
1866   * @brief  Interrupt 2 threshold.[get]
1867   *
1868   * @param  ctx         read / write interface definitions(ptr)
1869   * @param  val         change the values of ths in reg INT2_THS
1870   * @retval       interface status (MANDATORY: return 0 -> no Error)
1871   *
1872   */
h3lis331dl_int2_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1873 int32_t h3lis331dl_int2_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1874 {
1875   h3lis331dl_int2_ths_t int2_ths;
1876   int32_t ret;
1877 
1878   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_THS,
1879                             (uint8_t *)&int2_ths, 1);
1880   *val = int2_ths.ths;
1881 
1882   return ret;
1883 }
1884 
1885 /**
1886   * @brief  Duration value for interrupt 2 generator.[set]
1887   *
1888   * @param  ctx         read / write interface definitions(ptr)
1889   * @param  val         change the values of d in reg INT2_DURATION
1890   * @retval       interface status (MANDATORY: return 0 -> no Error)
1891   *
1892   */
h3lis331dl_int2_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1893 int32_t h3lis331dl_int2_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1894 {
1895   h3lis331dl_int2_duration_t int2_duration;
1896   int32_t ret;
1897 
1898   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_DURATION,
1899                             (uint8_t *)&int2_duration, 1);
1900 
1901   if (ret == 0)
1902   {
1903     int2_duration.d = val;
1904     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_INT2_DURATION,
1905                                (uint8_t *)&int2_duration, 1);
1906   }
1907 
1908   return ret;
1909 }
1910 
1911 /**
1912   * @brief    Duration value for interrupt 2 generator.[get]
1913   *
1914   * @param  ctx         read / write interface definitions(ptr)
1915   * @param  val         change the values of d in reg INT2_DURATION
1916   * @retval       interface status (MANDATORY: return 0 -> no Error)
1917   *
1918   */
h3lis331dl_int2_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1919 int32_t h3lis331dl_int2_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1920 {
1921   h3lis331dl_int2_duration_t int2_duration;
1922   int32_t ret;
1923 
1924   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_INT2_DURATION,
1925                             (uint8_t *)&int2_duration, 1);
1926   *val = int2_duration.d;
1927 
1928   return ret;
1929 }
1930 
1931 /**
1932   * @}
1933   *
1934   */
1935 
1936 /**
1937   * @defgroup    H3LIS331DL_Wake_Up_Event
1938   * @brief       This section groups all the functions that manage the
1939   *              Wake Up event generation.
1940   * @{
1941   *
1942   */
1943 
1944 /**
1945   * @brief  Turn-on mode selection for sleep to wake function.[set]
1946   *
1947   * @param  ctx         read / write interface definitions(ptr)
1948   * @param  val         change the values of turnon in reg CTRL_REG5
1949   * @retval       interface status (MANDATORY: return 0 -> no Error)
1950   *
1951   */
h3lis331dl_wkup_to_sleep_set(const stmdev_ctx_t * ctx,uint8_t val)1952 int32_t h3lis331dl_wkup_to_sleep_set(const stmdev_ctx_t *ctx, uint8_t val)
1953 {
1954   h3lis331dl_ctrl_reg5_t ctrl_reg5;
1955   int32_t ret;
1956 
1957   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG5,
1958                             (uint8_t *)&ctrl_reg5, 1);
1959 
1960   if (ret == 0)
1961   {
1962     ctrl_reg5.turnon = val;
1963     ret = h3lis331dl_write_reg(ctx, H3LIS331DL_CTRL_REG5,
1964                                (uint8_t *)&ctrl_reg5, 1);
1965   }
1966 
1967   return ret;
1968 }
1969 
1970 /**
1971   * @brief  Turn-on mode selection for sleep to wake function.[get]
1972   *
1973   * @param  ctx         read / write interface definitions(ptr)
1974   * @param  val         change the values of turnon in reg CTRL_REG5
1975   * @retval       interface status (MANDATORY: return 0 -> no Error)
1976   *
1977   */
h3lis331dl_wkup_to_sleep_get(const stmdev_ctx_t * ctx,uint8_t * val)1978 int32_t h3lis331dl_wkup_to_sleep_get(const stmdev_ctx_t *ctx, uint8_t *val)
1979 {
1980   h3lis331dl_ctrl_reg5_t ctrl_reg5;
1981   int32_t ret;
1982 
1983   ret = h3lis331dl_read_reg(ctx, H3LIS331DL_CTRL_REG5,
1984                             (uint8_t *)&ctrl_reg5, 1);
1985   *val = ctrl_reg5.turnon;
1986 
1987   return ret;
1988 }
1989 
1990 /**
1991   * @}
1992   *
1993   */
1994 
1995 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1996