1 /**
2   ******************************************************************************
3   * @file    h3lis100dl_reg.c
4   * @author  Sensors Software Solution Team
5   * @brief   H3LIS100DL 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 "h3lis100dl_reg.h"
21 
22 /**
23   * @defgroup    H3LIS100DL
24   * @brief       This file provides a set of functions needed to drive the
25   *              h3lis100dl enhanced inertial module.
26   * @{
27   *
28   */
29 
30 /**
31   * @defgroup    H3LIS100DL_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   */
h3lis100dl_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak h3lis100dl_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   */
h3lis100dl_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)72 int32_t __weak h3lis100dl_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    H3LIS100DL_Sensitivity
92   * @brief       These functions convert raw-data into engineering units.
93   * @{
94   *
95   */
96 
h3lis100dl_from_fs100g_to_mg(int8_t lsb)97 float_t h3lis100dl_from_fs100g_to_mg(int8_t lsb)
98 {
99   return (float_t)lsb * 780.0f;
100 }
101 
102 /**
103   * @}
104   *
105   */
106 
107 /**
108   * @defgroup    H3LIS100DL_Data_Generation
109   * @brief       This section group all the functions concerning
110   *              data generation
111   * @{
112   *
113   */
114 
115 /**
116   * @brief  X axis enable/disable.[set]
117   *
118   * @param  ctx         read / write interface definitions(ptr)
119   * @param  val         change the values of xen in reg CTRL_REG1
120   * @retval       interface status (MANDATORY: return 0 -> no Error)
121   *
122   */
h3lis100dl_axis_x_data_set(const stmdev_ctx_t * ctx,uint8_t val)123 int32_t h3lis100dl_axis_x_data_set(const stmdev_ctx_t *ctx, uint8_t val)
124 {
125   h3lis100dl_ctrl_reg1_t ctrl_reg1;
126   int32_t ret;
127 
128   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
129                             (uint8_t *)&ctrl_reg1, 1);
130 
131   if (ret == 0)
132   {
133     ctrl_reg1.xen = val;
134     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG1,
135                                (uint8_t *)&ctrl_reg1, 1);
136   }
137 
138   return ret;
139 }
140 
141 /**
142   * @brief  X axis enable/disable.[get]
143   *
144   * @param  ctx         read / write interface definitions(ptr)
145   * @param  val         change the values of xen in reg CTRL_REG1
146   * @retval       interface status (MANDATORY: return 0 -> no Error)
147   *
148   */
h3lis100dl_axis_x_data_get(const stmdev_ctx_t * ctx,uint8_t * val)149 int32_t h3lis100dl_axis_x_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
150 {
151   h3lis100dl_ctrl_reg1_t ctrl_reg1;
152   int32_t ret;
153 
154   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
155                             (uint8_t *)&ctrl_reg1, 1);
156   *val = ctrl_reg1.xen;
157 
158   return ret;
159 }
160 
161 /**
162   * @brief  Y axis enable/disable.[set]
163   *
164   * @param  ctx         read / write interface definitions(ptr)
165   * @param  val         change the values of yen in reg CTRL_REG1
166   * @retval       interface status (MANDATORY: return 0 -> no Error)
167   *
168   */
h3lis100dl_axis_y_data_set(const stmdev_ctx_t * ctx,uint8_t val)169 int32_t h3lis100dl_axis_y_data_set(const stmdev_ctx_t *ctx, uint8_t val)
170 {
171   h3lis100dl_ctrl_reg1_t ctrl_reg1;
172   int32_t ret;
173 
174   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
175                             (uint8_t *)&ctrl_reg1, 1);
176 
177   if (ret == 0)
178   {
179     ctrl_reg1.yen = val;
180     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG1,
181                                (uint8_t *)&ctrl_reg1, 1);
182   }
183 
184   return ret;
185 }
186 
187 /**
188   * @brief  Y axis enable/disable.[get]
189   *
190   * @param  ctx         read / write interface definitions(ptr)
191   * @param  val         change the values of yen in reg CTRL_REG1
192   * @retval       interface status (MANDATORY: return 0 -> no Error)
193   *
194   */
h3lis100dl_axis_y_data_get(const stmdev_ctx_t * ctx,uint8_t * val)195 int32_t h3lis100dl_axis_y_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
196 {
197   h3lis100dl_ctrl_reg1_t ctrl_reg1;
198   int32_t ret;
199 
200   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
201                             (uint8_t *)&ctrl_reg1, 1);
202   *val = ctrl_reg1.yen;
203 
204   return ret;
205 }
206 
207 /**
208   * @brief  Z axis enable/disable.[set]
209   *
210   * @param  ctx         read / write interface definitions(ptr)
211   * @param  val         change the values of zen in reg CTRL_REG1
212   * @retval       interface status (MANDATORY: return 0 -> no Error)
213   *
214   */
h3lis100dl_axis_z_data_set(const stmdev_ctx_t * ctx,uint8_t val)215 int32_t h3lis100dl_axis_z_data_set(const stmdev_ctx_t *ctx, uint8_t val)
216 {
217   h3lis100dl_ctrl_reg1_t ctrl_reg1;
218   int32_t ret;
219 
220   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
221                             (uint8_t *)&ctrl_reg1, 1);
222 
223   if (ret == 0)
224   {
225     ctrl_reg1.zen = val;
226     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG1,
227                                (uint8_t *)&ctrl_reg1, 1);
228   }
229 
230   return ret;
231 }
232 
233 /**
234   * @brief  Z axis enable/disable.[get]
235   *
236   * @param  ctx         read / write interface definitions(ptr)
237   * @param  val         change the values of zen in reg CTRL_REG1
238   * @retval       interface status (MANDATORY: return 0 -> no Error)
239   *
240   */
h3lis100dl_axis_z_data_get(const stmdev_ctx_t * ctx,uint8_t * val)241 int32_t h3lis100dl_axis_z_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
242 {
243   h3lis100dl_ctrl_reg1_t ctrl_reg1;
244   int32_t ret;
245 
246   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
247                             (uint8_t *)&ctrl_reg1, 1);
248   *val = ctrl_reg1.zen;
249 
250   return ret;
251 }
252 
253 /**
254   * @brief  Accelerometer data rate selection.[set]
255   *
256   * @param  ctx         read / write interface definitions(ptr)
257   * @param  val         change the values of dr in reg CTRL_REG1
258   * @retval       interface status (MANDATORY: return 0 -> no Error)
259   *
260   */
h3lis100dl_data_rate_set(const stmdev_ctx_t * ctx,h3lis100dl_dr_t val)261 int32_t h3lis100dl_data_rate_set(const stmdev_ctx_t *ctx,
262                                  h3lis100dl_dr_t val)
263 {
264   h3lis100dl_ctrl_reg1_t ctrl_reg1;
265   int32_t ret;
266 
267   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
268                             (uint8_t *)&ctrl_reg1, 1);
269 
270   if (ret == 0)
271   {
272     ctrl_reg1.pm = (uint8_t)val & 0x07U;
273     ctrl_reg1.dr = ((uint8_t)val & 0x30U) >> 4;
274     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG1,
275                                (uint8_t *)&ctrl_reg1, 1);
276   }
277 
278   return ret;
279 }
280 
281 /**
282   * @brief  Accelerometer data rate selection.[get]
283   *
284   * @param  ctx         read / write interface definitions(ptr)
285   * @param  val         Get the values of dr in reg CTRL_REG1
286   * @retval       interface status (MANDATORY: return 0 -> no Error)
287   *
288   */
h3lis100dl_data_rate_get(const stmdev_ctx_t * ctx,h3lis100dl_dr_t * val)289 int32_t h3lis100dl_data_rate_get(const stmdev_ctx_t *ctx,
290                                  h3lis100dl_dr_t *val)
291 {
292   h3lis100dl_ctrl_reg1_t ctrl_reg1;
293   int32_t ret;
294 
295   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG1,
296                             (uint8_t *)&ctrl_reg1, 1);
297 
298   switch ((ctrl_reg1.dr << 4) + ctrl_reg1.pm)
299   {
300     case H3LIS100DL_ODR_OFF:
301       *val = H3LIS100DL_ODR_OFF;
302       break;
303 
304     case H3LIS100DL_ODR_Hz5:
305       *val = H3LIS100DL_ODR_Hz5;
306       break;
307 
308     case H3LIS100DL_ODR_1Hz:
309       *val = H3LIS100DL_ODR_1Hz;
310       break;
311 
312     case H3LIS100DL_ODR_2Hz:
313       *val = H3LIS100DL_ODR_2Hz;
314       break;
315 
316     case H3LIS100DL_ODR_5Hz:
317       *val = H3LIS100DL_ODR_5Hz;
318       break;
319 
320     case H3LIS100DL_ODR_10Hz:
321       *val = H3LIS100DL_ODR_10Hz;
322       break;
323 
324     case H3LIS100DL_ODR_50Hz:
325       *val = H3LIS100DL_ODR_50Hz;
326       break;
327 
328     case H3LIS100DL_ODR_100Hz:
329       *val = H3LIS100DL_ODR_100Hz;
330       break;
331 
332     case H3LIS100DL_ODR_400Hz:
333       *val = H3LIS100DL_ODR_400Hz;
334       break;
335 
336     default:
337       *val = H3LIS100DL_ODR_OFF;
338       break;
339   }
340 
341   return ret;
342 }
343 
344 /**
345   * @brief  High pass filter mode selection.[set]
346   *
347   * @param  ctx         read / write interface definitions(ptr)
348   * @param  val         change the values of hpm in reg CTRL_REG2
349   * @retval       interface status (MANDATORY: return 0 -> no Error)
350   *
351   */
h3lis100dl_reference_mode_set(const stmdev_ctx_t * ctx,h3lis100dl_hpm_t val)352 int32_t h3lis100dl_reference_mode_set(const stmdev_ctx_t *ctx,
353                                       h3lis100dl_hpm_t val)
354 {
355   h3lis100dl_ctrl_reg2_t ctrl_reg2;
356   int32_t ret;
357 
358   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
359                             (uint8_t *)&ctrl_reg2, 1);
360 
361   if (ret == 0)
362   {
363     ctrl_reg2.hpm = (uint8_t)val;
364     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG2,
365                                (uint8_t *)&ctrl_reg2, 1);
366   }
367 
368   return ret;
369 }
370 
371 /**
372   * @brief  High pass filter mode selection.[get]
373   *
374   * @param  ctx         read / write interface definitions(ptr)
375   * @param  val         Get the values of hpm in reg CTRL_REG2
376   * @retval       interface status (MANDATORY: return 0 -> no Error)
377   *
378   */
h3lis100dl_reference_mode_get(const stmdev_ctx_t * ctx,h3lis100dl_hpm_t * val)379 int32_t h3lis100dl_reference_mode_get(const stmdev_ctx_t *ctx,
380                                       h3lis100dl_hpm_t *val)
381 {
382   h3lis100dl_ctrl_reg2_t ctrl_reg2;
383   int32_t ret;
384 
385   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
386                             (uint8_t *)&ctrl_reg2, 1);
387 
388   switch (ctrl_reg2.hpm)
389   {
390     case H3LIS100DL_NORMAL_MODE:
391       *val = H3LIS100DL_NORMAL_MODE;
392       break;
393 
394     case H3LIS100DL_REF_MODE_ENABLE:
395       *val = H3LIS100DL_REF_MODE_ENABLE;
396       break;
397 
398     default:
399       *val = H3LIS100DL_NORMAL_MODE;
400       break;
401   }
402 
403   return ret;
404 }
405 
406 /**
407   * @brief  The STATUS_REG register is read by the interface.[get]
408   *
409   * @param  ctx         read / write interface definitions(ptr)
410   * @param  val         registers STATUS_REG
411   * @retval       interface status (MANDATORY: return 0 -> no Error)
412   *
413   */
h3lis100dl_status_reg_get(const stmdev_ctx_t * ctx,h3lis100dl_status_reg_t * val)414 int32_t h3lis100dl_status_reg_get(const stmdev_ctx_t *ctx,
415                                   h3lis100dl_status_reg_t *val)
416 {
417   int32_t ret;
418 
419   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_STATUS_REG, (uint8_t *) val, 1);
420 
421   return ret;
422 }
423 
424 /**
425   * @brief  Accelerometer new data available.[get]
426   *
427   * @param  ctx         read / write interface definitions(ptr)
428   * @param  val         change the values of zyxda in reg STATUS_REG
429   * @retval       interface status (MANDATORY: return 0 -> no Error)
430   *
431   */
h3lis100dl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)432 int32_t h3lis100dl_flag_data_ready_get(const stmdev_ctx_t *ctx,
433                                        uint8_t *val)
434 {
435   h3lis100dl_status_reg_t status_reg;
436   int32_t ret;
437 
438   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_STATUS_REG,
439                             (uint8_t *)&status_reg, 1);
440   *val = status_reg.zyxda;
441 
442   return ret;
443 }
444 
445 /**
446   * @}
447   *
448   */
449 
450 /**
451   * @defgroup    H3LIS100DL_Data_Output
452   * @brief       This section groups all the data output functions.
453   * @{
454   *
455   */
456 
457 /**
458   * @brief  Linear acceleration output register. The value is expressed
459   *         as a 8-bit word in two's complement.[get]
460   *
461   * @param  ctx         read / write interface definitions(ptr)
462   * @param  buff        buffer that stores data read
463   * @retval       interface status (MANDATORY: return 0 -> no Error)
464   *
465   */
h3lis100dl_acceleration_raw_get(const stmdev_ctx_t * ctx,int8_t * val)466 int32_t h3lis100dl_acceleration_raw_get(const stmdev_ctx_t *ctx,
467                                         int8_t *val)
468 {
469   int32_t ret;
470 
471   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_OUT_X, (uint8_t *)&val[0], 1);
472   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_OUT_Y, (uint8_t *)&val[1], 1);
473   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_OUT_Z, (uint8_t *)&val[2], 1);
474 
475   return ret;
476 }
477 
478 /**
479   * @}
480   *
481   */
482 
483 /**
484   * @defgroup    H3LIS100DL_Common
485   * @brief       This section groups common useful functions.
486   * @{
487   *
488   */
489 
490 /**
491   * @brief  Device Who am I.[get]
492   *
493   * @param  ctx         read / write interface definitions(ptr)
494   * @param  buff        buffer that stores data read
495   * @retval       interface status (MANDATORY: return 0 -> no Error)
496   *
497   */
h3lis100dl_device_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)498 int32_t h3lis100dl_device_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
499 {
500   int32_t ret;
501 
502   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_WHO_AM_I, buff, 1);
503 
504   return ret;
505 }
506 
507 /**
508   * @brief  Reboot memory content. Reload the calibration parameters.[set]
509   *
510   * @param  ctx         read / write interface definitions(ptr)
511   * @param  val         change the values of boot in reg CTRL_REG2
512   * @retval       interface status (MANDATORY: return 0 -> no Error)
513   *
514   */
h3lis100dl_boot_set(const stmdev_ctx_t * ctx,uint8_t val)515 int32_t h3lis100dl_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
516 {
517   h3lis100dl_ctrl_reg2_t ctrl_reg2;
518   int32_t ret;
519 
520   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
521                             (uint8_t *)&ctrl_reg2, 1);
522 
523   if (ret == 0)
524   {
525     ctrl_reg2.boot = val;
526     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG2,
527                                (uint8_t *)&ctrl_reg2, 1);
528   }
529 
530   return ret;
531 }
532 
533 /**
534   * @brief  Reboot memory content. Reload the calibration parameters.[get]
535   *
536   * @param  ctx         read / write interface definitions(ptr)
537   * @param  val         change the values of boot in reg CTRL_REG2
538   * @retval       interface status (MANDATORY: return 0 -> no Error)
539   *
540   */
h3lis100dl_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)541 int32_t h3lis100dl_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
542 {
543   h3lis100dl_ctrl_reg2_t ctrl_reg2;
544   int32_t ret;
545 
546   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
547                             (uint8_t *)&ctrl_reg2, 1);
548   *val = ctrl_reg2.boot;
549 
550   return ret;
551 }
552 
553 /**
554   * @}
555   *
556   */
557 
558 /**
559   * @defgroup    H3LIS100DL_Filters
560   * @brief       This section group all the functions concerning the
561   *              filters configuration.
562   * @{
563   *
564   */
565 
566 /**
567   * @brief  High pass filter cut-off frequency configuration.[set]
568   *
569   * @param  ctx         read / write interface definitions(ptr)
570   * @param  val         change the values of hpcf in reg CTRL_REG2
571   * @retval       interface status (MANDATORY: return 0 -> no Error)
572   *
573   */
h3lis100dl_hp_bandwidth_set(const stmdev_ctx_t * ctx,h3lis100dl_hpcf_t val)574 int32_t h3lis100dl_hp_bandwidth_set(const stmdev_ctx_t *ctx,
575                                     h3lis100dl_hpcf_t val)
576 {
577   h3lis100dl_ctrl_reg2_t ctrl_reg2;
578   int32_t ret;
579 
580   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
581                             (uint8_t *)&ctrl_reg2, 1);
582 
583   if (ret == 0)
584   {
585     ctrl_reg2.hpcf = (uint8_t)val;
586     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG2,
587                                (uint8_t *)&ctrl_reg2, 1);
588   }
589 
590   return ret;
591 }
592 
593 /**
594   * @brief  High pass filter cut-off frequency configuration.[get]
595   *
596   * @param  ctx         read / write interface definitions(ptr)
597   * @param  val         Get the values of hpcf in reg CTRL_REG2
598   * @retval       interface status (MANDATORY: return 0 -> no Error)
599   *
600   */
h3lis100dl_hp_bandwidth_get(const stmdev_ctx_t * ctx,h3lis100dl_hpcf_t * val)601 int32_t h3lis100dl_hp_bandwidth_get(const stmdev_ctx_t *ctx,
602                                     h3lis100dl_hpcf_t *val)
603 {
604   h3lis100dl_ctrl_reg2_t ctrl_reg2;
605   int32_t ret;
606 
607   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
608                             (uint8_t *)&ctrl_reg2, 1);
609 
610   switch (ctrl_reg2.hpcf)
611   {
612     case H3LIS100DL_CUT_OFF_8Hz:
613       *val = H3LIS100DL_CUT_OFF_8Hz;
614       break;
615 
616     case H3LIS100DL_CUT_OFF_16Hz:
617       *val = H3LIS100DL_CUT_OFF_16Hz;
618       break;
619 
620     case H3LIS100DL_CUT_OFF_32Hz:
621       *val = H3LIS100DL_CUT_OFF_32Hz;
622       break;
623 
624     case H3LIS100DL_CUT_OFF_64Hz:
625       *val = H3LIS100DL_CUT_OFF_64Hz;
626       break;
627 
628     default:
629       *val = H3LIS100DL_CUT_OFF_8Hz;
630       break;
631   }
632 
633   return ret;
634 }
635 
636 /**
637   * @brief  Select High Pass filter path.[set]
638   *
639   * @param  ctx         read / write interface definitions(ptr)
640   * @param  val         change the values of hpen in reg CTRL_REG2
641   * @retval       interface status (MANDATORY: return 0 -> no Error)
642   *
643   */
h3lis100dl_hp_path_set(const stmdev_ctx_t * ctx,h3lis100dl_hpen_t val)644 int32_t h3lis100dl_hp_path_set(const stmdev_ctx_t *ctx,
645                                h3lis100dl_hpen_t val)
646 {
647   h3lis100dl_ctrl_reg2_t ctrl_reg2;
648   int32_t ret;
649 
650   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
651                             (uint8_t *)&ctrl_reg2, 1);
652 
653   if (ret == 0)
654   {
655     ctrl_reg2.hpen = (uint8_t)val & 0x03U;
656     ctrl_reg2.fds = ((uint8_t)val & 0x04U) >> 2;
657     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG2,
658                                (uint8_t *)&ctrl_reg2, 1);
659   }
660 
661   return ret;
662 }
663 
664 /**
665   * @brief  Select High Pass filter path.[get]
666   *
667   * @param  ctx         read / write interface definitions(ptr)
668   * @param  val         Get the values of hpen in reg CTRL_REG2
669   * @retval       interface status (MANDATORY: return 0 -> no Error)
670   *
671   */
h3lis100dl_hp_path_get(const stmdev_ctx_t * ctx,h3lis100dl_hpen_t * val)672 int32_t h3lis100dl_hp_path_get(const stmdev_ctx_t *ctx,
673                                h3lis100dl_hpen_t *val)
674 {
675   h3lis100dl_ctrl_reg2_t ctrl_reg2;
676   int32_t ret;
677 
678   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG2,
679                             (uint8_t *)&ctrl_reg2, 1);
680 
681   switch ((ctrl_reg2.fds << 2) + ctrl_reg2.hpen)
682   {
683     case H3LIS100DL_HP_DISABLE:
684       *val = H3LIS100DL_HP_DISABLE;
685       break;
686 
687     case H3LIS100DL_HP_ON_OUT:
688       *val = H3LIS100DL_HP_ON_OUT;
689       break;
690 
691     case H3LIS100DL_HP_ON_INT1:
692       *val = H3LIS100DL_HP_ON_INT1;
693       break;
694 
695     case H3LIS100DL_HP_ON_INT2:
696       *val = H3LIS100DL_HP_ON_INT2;
697       break;
698 
699     case H3LIS100DL_HP_ON_INT1_INT2:
700       *val = H3LIS100DL_HP_ON_INT1_INT2;
701       break;
702 
703     case H3LIS100DL_HP_ON_INT1_INT2_OUT:
704       *val = H3LIS100DL_HP_ON_INT1_INT2_OUT;
705       break;
706 
707     case H3LIS100DL_HP_ON_INT2_OUT:
708       *val = H3LIS100DL_HP_ON_INT2_OUT;
709       break;
710 
711     case H3LIS100DL_HP_ON_INT1_OUT:
712       *val = H3LIS100DL_HP_ON_INT1_OUT;
713       break;
714 
715     default:
716       *val = H3LIS100DL_HP_DISABLE;
717       break;
718   }
719 
720   return ret;
721 }
722 
723 /**
724   * @brief  Reading at this address zeroes instantaneously
725   *         the content of the internal high pass-filter.
726   *         If the high pass filter is enabled all three axes
727   *         are instantaneously set to 0g. This allows to
728   *         overcome the settling time of the high pass
729   *         filter.[get]
730   *
731   * @param  ctx         read / write interface definitions(ptr)
732   * @retval       interface status (MANDATORY: return 0 -> no Error)
733   *
734   */
h3lis100dl_hp_reset_get(const stmdev_ctx_t * ctx)735 int32_t h3lis100dl_hp_reset_get(const stmdev_ctx_t *ctx)
736 {
737   uint8_t dummy;
738   int32_t ret;
739 
740   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_HP_FILTER_RESET,
741                             (uint8_t *)&dummy, 1);
742 
743   return ret;
744 }
745 
746 /**
747   * @brief  Reference value for high-pass filter.[set]
748   *
749   * @param  ctx         read / write interface definitions(ptr)
750   * @param  val         change the values of ref in reg REFERENCE
751   * @retval       interface status (MANDATORY: return 0 -> no Error)
752   *
753   */
h3lis100dl_hp_reference_value_set(const stmdev_ctx_t * ctx,uint8_t val)754 int32_t h3lis100dl_hp_reference_value_set(const stmdev_ctx_t *ctx,
755                                           uint8_t val)
756 {
757   int32_t ret;
758 
759   ret = h3lis100dl_write_reg(ctx, H3LIS100DL_REFERENCE, (uint8_t *)&val, 1);
760 
761   return ret;
762 }
763 
764 /**
765   * @brief  Reference value for high-pass filter.[get]
766   *
767   * @param  ctx         read / write interface definitions(ptr)
768   * @param  val         change the values of ref in reg REFERENCE
769   * @retval       interface status (MANDATORY: return 0 -> no Error)
770   *
771   */
h3lis100dl_hp_reference_value_get(const stmdev_ctx_t * ctx,uint8_t * val)772 int32_t h3lis100dl_hp_reference_value_get(const stmdev_ctx_t *ctx,
773                                           uint8_t *val)
774 {
775   int32_t ret;
776 
777   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_REFERENCE, val, 1);
778 
779   return ret;
780 }
781 
782 /**
783   * @}
784   *
785   */
786 
787 /**
788   * @defgroup    H3LIS100DL_Serial_Interface
789   * @brief       This section groups all the functions concerning serial
790   *              interface management.
791   * @{
792   *
793   */
794 
795 /**
796   * @brief  SPI 3- or 4-wire interface.[set]
797   *
798   * @param  ctx         read / write interface definitions(ptr)
799   * @param  val         change the values of sim in reg CTRL_REG4
800   * @retval       interface status (MANDATORY: return 0 -> no Error)
801   *
802   */
h3lis100dl_spi_mode_set(const stmdev_ctx_t * ctx,h3lis100dl_sim_t val)803 int32_t h3lis100dl_spi_mode_set(const stmdev_ctx_t *ctx,
804                                 h3lis100dl_sim_t val)
805 {
806   h3lis100dl_ctrl_reg4_t ctrl_reg4;
807   int32_t ret;
808 
809   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG4,
810                             (uint8_t *)&ctrl_reg4, 1);
811 
812   if (ret == 0)
813   {
814     ctrl_reg4.sim = (uint8_t)val;
815     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG4,
816                                (uint8_t *)&ctrl_reg4, 1);
817   }
818 
819   return ret;
820 }
821 
822 /**
823   * @brief  SPI 3- or 4-wire interface.[get]
824   *
825   * @param  ctx         read / write interface definitions(ptr)
826   * @param  val         Get the values of sim in reg CTRL_REG4
827   * @retval       interface status (MANDATORY: return 0 -> no Error)
828   *
829   */
h3lis100dl_spi_mode_get(const stmdev_ctx_t * ctx,h3lis100dl_sim_t * val)830 int32_t h3lis100dl_spi_mode_get(const stmdev_ctx_t *ctx,
831                                 h3lis100dl_sim_t *val)
832 {
833   h3lis100dl_ctrl_reg4_t ctrl_reg4;
834   int32_t ret;
835 
836   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG4,
837                             (uint8_t *)&ctrl_reg4, 1);
838 
839   switch (ctrl_reg4.sim)
840   {
841     case H3LIS100DL_SPI_4_WIRE:
842       *val = H3LIS100DL_SPI_4_WIRE;
843       break;
844 
845     case H3LIS100DL_SPI_3_WIRE:
846       *val = H3LIS100DL_SPI_3_WIRE;
847       break;
848 
849     default:
850       *val = H3LIS100DL_SPI_4_WIRE;
851       break;
852   }
853 
854   return ret;
855 }
856 
857 /**
858   * @}
859   *
860   */
861 
862 /**
863   * @defgroup    H3LIS100DL_Interrupt_Pins
864   * @brief       This section groups all the functions that manage
865   *              interrupt pins.
866   * @{
867   *
868   */
869 
870 /**
871   * @brief  Data signal on INT 1 pad control bits.[set]
872   *
873   * @param  ctx         read / write interface definitions(ptr)
874   * @param  val         change the values of i1_cfg in reg CTRL_REG3
875   * @retval       interface status (MANDATORY: return 0 -> no Error)
876   *
877   */
h3lis100dl_pin_int1_route_set(const stmdev_ctx_t * ctx,h3lis100dl_i1_cfg_t val)878 int32_t h3lis100dl_pin_int1_route_set(const stmdev_ctx_t *ctx,
879                                       h3lis100dl_i1_cfg_t val)
880 {
881   h3lis100dl_ctrl_reg3_t ctrl_reg3;
882   int32_t ret;
883 
884   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
885                             (uint8_t *)&ctrl_reg3, 1);
886 
887   if (ret == 0)
888   {
889     ctrl_reg3.i1_cfg = (uint8_t)val;
890     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG3,
891                                (uint8_t *)&ctrl_reg3, 1);
892   }
893 
894   return ret;
895 }
896 
897 /**
898   * @brief  Data signal on INT 1 pad control bits.[get]
899   *
900   * @param  ctx         read / write interface definitions(ptr)
901   * @param  val         Get the values of i1_cfg in reg CTRL_REG3
902   * @retval       interface status (MANDATORY: return 0 -> no Error)
903   *
904   */
h3lis100dl_pin_int1_route_get(const stmdev_ctx_t * ctx,h3lis100dl_i1_cfg_t * val)905 int32_t h3lis100dl_pin_int1_route_get(const stmdev_ctx_t *ctx,
906                                       h3lis100dl_i1_cfg_t *val)
907 {
908   h3lis100dl_ctrl_reg3_t ctrl_reg3;
909   int32_t ret;
910 
911   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
912                             (uint8_t *)&ctrl_reg3, 1);
913 
914   switch (ctrl_reg3.i1_cfg)
915   {
916     case H3LIS100DL_PAD1_INT1_SRC:
917       *val = H3LIS100DL_PAD1_INT1_SRC;
918       break;
919 
920     case H3LIS100DL_PAD1_INT1_OR_INT2_SRC:
921       *val = H3LIS100DL_PAD1_INT1_OR_INT2_SRC;
922       break;
923 
924     case H3LIS100DL_PAD1_DRDY:
925       *val = H3LIS100DL_PAD1_DRDY;
926       break;
927 
928     case H3LIS100DL_PAD1_BOOT:
929       *val = H3LIS100DL_PAD1_BOOT;
930       break;
931 
932     default:
933       *val = H3LIS100DL_PAD1_INT1_SRC;
934       break;
935   }
936 
937   return ret;
938 }
939 
940 /**
941   * @brief  Latch interrupt request on INT1_SRC register, with INT1_SRC
942   *         register cleared by reading INT1_SRC register.[set]
943   *
944   * @param  ctx         read / write interface definitions(ptr)
945   * @param  val         change the values of lir1 in reg CTRL_REG3
946   * @retval       interface status (MANDATORY: return 0 -> no Error)
947   *
948   */
h3lis100dl_int1_notification_set(const stmdev_ctx_t * ctx,h3lis100dl_lir1_t val)949 int32_t h3lis100dl_int1_notification_set(const stmdev_ctx_t *ctx,
950                                          h3lis100dl_lir1_t val)
951 {
952   h3lis100dl_ctrl_reg3_t ctrl_reg3;
953   int32_t ret;
954 
955   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
956                             (uint8_t *)&ctrl_reg3, 1);
957 
958   if (ret == 0)
959   {
960     ctrl_reg3.lir1 = (uint8_t)val;
961     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG3,
962                                (uint8_t *)&ctrl_reg3, 1);
963   }
964 
965   return ret;
966 }
967 
968 /**
969   * @brief  Latch interrupt request on INT1_SRC register, with INT1_SRC
970   *         register cleared by reading INT1_SRC register.[get]
971   *
972   * @param  ctx         read / write interface definitions(ptr)
973   * @param  val         Get the values of lir1 in reg CTRL_REG3
974   * @retval       interface status (MANDATORY: return 0 -> no Error)
975   *
976   */
h3lis100dl_int1_notification_get(const stmdev_ctx_t * ctx,h3lis100dl_lir1_t * val)977 int32_t h3lis100dl_int1_notification_get(const stmdev_ctx_t *ctx,
978                                          h3lis100dl_lir1_t *val)
979 {
980   h3lis100dl_ctrl_reg3_t ctrl_reg3;
981   int32_t ret;
982 
983   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
984                             (uint8_t *)&ctrl_reg3, 1);
985 
986   switch (ctrl_reg3.lir1)
987   {
988     case H3LIS100DL_INT1_PULSED:
989       *val = H3LIS100DL_INT1_PULSED;
990       break;
991 
992     case H3LIS100DL_INT1_LATCHED:
993       *val = H3LIS100DL_INT1_LATCHED;
994       break;
995 
996     default:
997       *val = H3LIS100DL_INT1_PULSED;
998       break;
999   }
1000 
1001   return ret;
1002 }
1003 
1004 /**
1005   * @brief  Data signal on INT 2 pad control bits.[set]
1006   *
1007   * @param  ctx         read / write interface definitions(ptr)
1008   * @param  val         change the values of i2_cfg in reg CTRL_REG3
1009   * @retval       interface status (MANDATORY: return 0 -> no Error)
1010   *
1011   */
h3lis100dl_pin_int2_route_set(const stmdev_ctx_t * ctx,h3lis100dl_i2_cfg_t val)1012 int32_t h3lis100dl_pin_int2_route_set(const stmdev_ctx_t *ctx,
1013                                       h3lis100dl_i2_cfg_t val)
1014 {
1015   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1016   int32_t ret;
1017 
1018   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1019                             (uint8_t *)&ctrl_reg3, 1);
1020 
1021   if (ret == 0)
1022   {
1023     ctrl_reg3.i2_cfg = (uint8_t)val;
1024     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG3,
1025                                (uint8_t *)&ctrl_reg3, 1);
1026   }
1027 
1028   return ret;
1029 }
1030 
1031 /**
1032   * @brief  Data signal on INT 2 pad control bits.[get]
1033   *
1034   * @param  ctx         read / write interface definitions(ptr)
1035   * @param  val         Get the values of i2_cfg in reg CTRL_REG3
1036   * @retval       interface status (MANDATORY: return 0 -> no Error)
1037   *
1038   */
h3lis100dl_pin_int2_route_get(const stmdev_ctx_t * ctx,h3lis100dl_i2_cfg_t * val)1039 int32_t h3lis100dl_pin_int2_route_get(const stmdev_ctx_t *ctx,
1040                                       h3lis100dl_i2_cfg_t *val)
1041 {
1042   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1043   int32_t ret;
1044 
1045   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1046                             (uint8_t *)&ctrl_reg3, 1);
1047 
1048   switch (ctrl_reg3.i2_cfg)
1049   {
1050     case H3LIS100DL_PAD2_INT2_SRC:
1051       *val = H3LIS100DL_PAD2_INT2_SRC;
1052       break;
1053 
1054     case H3LIS100DL_PAD2_INT1_OR_INT2_SRC:
1055       *val = H3LIS100DL_PAD2_INT1_OR_INT2_SRC;
1056       break;
1057 
1058     case H3LIS100DL_PAD2_DRDY:
1059       *val = H3LIS100DL_PAD2_DRDY;
1060       break;
1061 
1062     case H3LIS100DL_PAD2_BOOT:
1063       *val = H3LIS100DL_PAD2_BOOT;
1064       break;
1065 
1066     default:
1067       *val = H3LIS100DL_PAD2_INT2_SRC;
1068       break;
1069   }
1070 
1071   return ret;
1072 }
1073 
1074 /**
1075   * @brief  Latch interrupt request on INT2_SRC register, with INT2_SRC
1076   *         register cleared by reading INT2_SRC itself.[set]
1077   *
1078   * @param  ctx         read / write interface definitions(ptr)
1079   * @param  val         change the values of lir2 in reg CTRL_REG3
1080   * @retval       interface status (MANDATORY: return 0 -> no Error)
1081   *
1082   */
h3lis100dl_int2_notification_set(const stmdev_ctx_t * ctx,h3lis100dl_lir2_t val)1083 int32_t h3lis100dl_int2_notification_set(const stmdev_ctx_t *ctx,
1084                                          h3lis100dl_lir2_t val)
1085 {
1086   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1087   int32_t ret;
1088 
1089   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1090                             (uint8_t *)&ctrl_reg3, 1);
1091 
1092   if (ret == 0)
1093   {
1094     ctrl_reg3.lir2 = (uint8_t)val;
1095     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG3,
1096                                (uint8_t *)&ctrl_reg3, 1);
1097   }
1098 
1099   return ret;
1100 }
1101 
1102 /**
1103   * @brief  Latch interrupt request on INT2_SRC register, with INT2_SRC
1104   *         register cleared by reading INT2_SRC itself.[get]
1105   *
1106   * @param  ctx         read / write interface definitions(ptr)
1107   * @param  val         Get the values of lir2 in reg CTRL_REG3
1108   * @retval       interface status (MANDATORY: return 0 -> no Error)
1109   *
1110   */
h3lis100dl_int2_notification_get(const stmdev_ctx_t * ctx,h3lis100dl_lir2_t * val)1111 int32_t h3lis100dl_int2_notification_get(const stmdev_ctx_t *ctx,
1112                                          h3lis100dl_lir2_t *val)
1113 {
1114   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1115   int32_t ret;
1116 
1117   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1118                             (uint8_t *)&ctrl_reg3, 1);
1119 
1120   switch (ctrl_reg3.lir2)
1121   {
1122     case H3LIS100DL_INT2_PULSED:
1123       *val = H3LIS100DL_INT2_PULSED;
1124       break;
1125 
1126     case H3LIS100DL_INT2_LATCHED:
1127       *val = H3LIS100DL_INT2_LATCHED;
1128       break;
1129 
1130     default:
1131       *val = H3LIS100DL_INT2_PULSED;
1132       break;
1133   }
1134 
1135   return ret;
1136 }
1137 
1138 /**
1139   * @brief  Push-pull/open drain selection on interrupt pads.[set]
1140   *
1141   * @param  ctx         read / write interface definitions(ptr)
1142   * @param  val         change the values of pp_od in reg CTRL_REG3
1143   * @retval       interface status (MANDATORY: return 0 -> no Error)
1144   *
1145   */
h3lis100dl_pin_mode_set(const stmdev_ctx_t * ctx,h3lis100dl_pp_od_t val)1146 int32_t h3lis100dl_pin_mode_set(const stmdev_ctx_t *ctx,
1147                                 h3lis100dl_pp_od_t val)
1148 {
1149   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1150   int32_t ret;
1151 
1152   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1153                             (uint8_t *)&ctrl_reg3, 1);
1154 
1155   if (ret == 0)
1156   {
1157     ctrl_reg3.pp_od = (uint8_t)val;
1158     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG3,
1159                                (uint8_t *)&ctrl_reg3, 1);
1160   }
1161 
1162   return ret;
1163 }
1164 
1165 /**
1166   * @brief  Push-pull/open drain selection on interrupt pads.[get]
1167   *
1168   * @param  ctx         read / write interface definitions(ptr)
1169   * @param  val         Get the values of pp_od in reg CTRL_REG3
1170   * @retval       interface status (MANDATORY: return 0 -> no Error)
1171   *
1172   */
h3lis100dl_pin_mode_get(const stmdev_ctx_t * ctx,h3lis100dl_pp_od_t * val)1173 int32_t h3lis100dl_pin_mode_get(const stmdev_ctx_t *ctx,
1174                                 h3lis100dl_pp_od_t *val)
1175 {
1176   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1177   int32_t ret;
1178 
1179   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1180                             (uint8_t *)&ctrl_reg3, 1);
1181 
1182   switch (ctrl_reg3.pp_od)
1183   {
1184     case H3LIS100DL_PUSH_PULL:
1185       *val = H3LIS100DL_PUSH_PULL;
1186       break;
1187 
1188     case H3LIS100DL_OPEN_DRAIN:
1189       *val = H3LIS100DL_OPEN_DRAIN;
1190       break;
1191 
1192     default:
1193       *val = H3LIS100DL_PUSH_PULL;
1194       break;
1195   }
1196 
1197   return ret;
1198 }
1199 
1200 /**
1201   * @brief  Interrupt active-high/low.[set]
1202   *
1203   * @param  ctx         read / write interface definitions(ptr)
1204   * @param  val         change the values of ihl in reg CTRL_REG3
1205   * @retval       interface status (MANDATORY: return 0 -> no Error)
1206   *
1207   */
h3lis100dl_pin_polarity_set(const stmdev_ctx_t * ctx,h3lis100dl_ihl_t val)1208 int32_t h3lis100dl_pin_polarity_set(const stmdev_ctx_t *ctx,
1209                                     h3lis100dl_ihl_t val)
1210 {
1211   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1212   int32_t ret;
1213 
1214   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1215                             (uint8_t *)&ctrl_reg3, 1);
1216 
1217   if (ret == 0)
1218   {
1219     ctrl_reg3.ihl = (uint8_t)val;
1220     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG3,
1221                                (uint8_t *)&ctrl_reg3, 1);
1222   }
1223 
1224   return ret;
1225 }
1226 
1227 /**
1228   * @brief  Interrupt active-high/low.[get]
1229   *
1230   * @param  ctx         read / write interface definitions(ptr)
1231   * @param  val         Get the values of ihl in reg CTRL_REG3
1232   * @retval       interface status (MANDATORY: return 0 -> no Error)
1233   *
1234   */
h3lis100dl_pin_polarity_get(const stmdev_ctx_t * ctx,h3lis100dl_ihl_t * val)1235 int32_t h3lis100dl_pin_polarity_get(const stmdev_ctx_t *ctx,
1236                                     h3lis100dl_ihl_t *val)
1237 {
1238   h3lis100dl_ctrl_reg3_t ctrl_reg3;
1239   int32_t ret;
1240 
1241   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG3,
1242                             (uint8_t *)&ctrl_reg3, 1);
1243 
1244   switch (ctrl_reg3.ihl)
1245   {
1246     case H3LIS100DL_ACTIVE_HIGH:
1247       *val = H3LIS100DL_ACTIVE_HIGH;
1248       break;
1249 
1250     case H3LIS100DL_ACTIVE_LOW:
1251       *val = H3LIS100DL_ACTIVE_LOW;
1252       break;
1253 
1254     default:
1255       *val = H3LIS100DL_ACTIVE_HIGH;
1256       break;
1257   }
1258 
1259   return ret;
1260 }
1261 
1262 /**
1263   * @}
1264   *
1265   */
1266 
1267 /**
1268   * @defgroup    H3LIS100DL_interrupt_on_threshold
1269   * @brief       This section groups all the functions that manage
1270   *              the interrupt on threshold event generation.
1271   * @{
1272   *
1273   */
1274 
1275 /**
1276   * @brief  Configure the interrupt 1 threshold sign.[set]
1277   *
1278   * @param  ctx         read / write interface definitions(ptr)
1279   * @param  val         enable sign and axis for interrupt on threshold
1280   * @retval       interface status (MANDATORY: return 0 -> no Error)
1281   *
1282   */
h3lis100dl_int1_on_threshold_conf_set(const stmdev_ctx_t * ctx,int1_on_th_conf_t val)1283 int32_t h3lis100dl_int1_on_threshold_conf_set(const stmdev_ctx_t *ctx,
1284                                               int1_on_th_conf_t val)
1285 {
1286   h3lis100dl_int1_cfg_t int1_cfg;
1287   int32_t ret;
1288 
1289   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_CFG,
1290                             (uint8_t *)&int1_cfg, 1);
1291 
1292   if (ret == 0)
1293   {
1294     int1_cfg.xlie  = val.int1_xlie;
1295     int1_cfg.xhie  = val.int1_xhie;
1296     int1_cfg.ylie  = val.int1_ylie;
1297     int1_cfg.yhie  = val.int1_yhie;
1298     int1_cfg.zlie  = val.int1_zlie;
1299     int1_cfg.zhie  = val.int1_zhie;
1300     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT1_CFG,
1301                                (uint8_t *)&int1_cfg, 1);
1302   }
1303 
1304   return ret;
1305 }
1306 
1307 /**
1308   * @brief   Configure the interrupt 1 threshold sign.[get]
1309   *
1310   * @param  ctx         read / write interface definitions(ptr)
1311   * @param  val         enable sign and axis for interrupt on threshold
1312   * @retval       interface status (MANDATORY: return 0 -> no Error)
1313   *
1314   */
h3lis100dl_int1_on_threshold_conf_get(const stmdev_ctx_t * ctx,int1_on_th_conf_t * val)1315 int32_t h3lis100dl_int1_on_threshold_conf_get(const stmdev_ctx_t *ctx,
1316                                               int1_on_th_conf_t *val)
1317 {
1318   h3lis100dl_int1_cfg_t int1_cfg;
1319   int32_t ret;
1320 
1321   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_CFG,
1322                             (uint8_t *)&int1_cfg, 1);
1323   val->int1_xlie = int1_cfg.xlie;
1324   val->int1_xhie = int1_cfg.xhie;
1325   val->int1_ylie = int1_cfg.ylie;
1326   val->int1_yhie = int1_cfg.yhie;
1327   val->int1_zlie = int1_cfg.zlie;
1328   val->int1_zhie = int1_cfg.zhie;
1329 
1330   return ret;
1331 }
1332 
1333 /**
1334   * @brief  AND/OR combination of Interrupt 1 events.[set]
1335   *
1336   * @param  ctx         read / write interface definitions(ptr)
1337   * @param  val         change the values of aoi in reg INT1_CFG
1338   * @retval       interface status (MANDATORY: return 0 -> no Error)
1339   *
1340   */
h3lis100dl_int1_on_threshold_mode_set(const stmdev_ctx_t * ctx,h3lis100dl_int1_aoi_t val)1341 int32_t h3lis100dl_int1_on_threshold_mode_set(const stmdev_ctx_t *ctx,
1342                                               h3lis100dl_int1_aoi_t val)
1343 {
1344   h3lis100dl_int1_cfg_t int1_cfg;
1345   int32_t ret;
1346 
1347   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_CFG,
1348                             (uint8_t *)&int1_cfg, 1);
1349 
1350   if (ret == 0)
1351   {
1352     int1_cfg.aoi = (uint8_t) val;
1353     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT1_CFG,
1354                                (uint8_t *)&int1_cfg, 1);
1355   }
1356 
1357   return ret;
1358 }
1359 
1360 /**
1361   * @brief   AND/OR combination of Interrupt 1 events.[get]
1362   *
1363   * @param  ctx         read / write interface definitions(ptr)
1364   * @param  val         Get the values of aoi in reg INT1_CFG
1365   * @retval       interface status (MANDATORY: return 0 -> no Error)
1366   *
1367   */
h3lis100dl_int1_on_threshold_mode_get(const stmdev_ctx_t * ctx,h3lis100dl_int1_aoi_t * val)1368 int32_t h3lis100dl_int1_on_threshold_mode_get(const stmdev_ctx_t *ctx,
1369                                               h3lis100dl_int1_aoi_t *val)
1370 {
1371   h3lis100dl_int1_cfg_t int1_cfg;
1372   int32_t ret;
1373 
1374   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_CFG,
1375                             (uint8_t *)&int1_cfg, 1);
1376 
1377   switch (int1_cfg.aoi)
1378   {
1379     case H3LIS100DL_INT1_ON_THRESHOLD_OR:
1380       *val = H3LIS100DL_INT1_ON_THRESHOLD_OR;
1381       break;
1382 
1383     case H3LIS100DL_INT1_ON_THRESHOLD_AND:
1384       *val = H3LIS100DL_INT1_ON_THRESHOLD_AND;
1385       break;
1386 
1387     default:
1388       *val = H3LIS100DL_INT1_ON_THRESHOLD_OR;
1389       break;
1390   }
1391 
1392   return ret;
1393 }
1394 
1395 /**
1396   * @brief  Interrupt generator 1 on threshold source register.[get]
1397   *
1398   * @param  ctx         read / write interface definitions(ptr)
1399   * @param  val         registers INT1_SRC
1400   * @retval       interface status (MANDATORY: return 0 -> no Error)
1401   *
1402   */
h3lis100dl_int1_src_get(const stmdev_ctx_t * ctx,h3lis100dl_int1_src_t * val)1403 int32_t h3lis100dl_int1_src_get(const stmdev_ctx_t *ctx,
1404                                 h3lis100dl_int1_src_t *val)
1405 {
1406   int32_t ret;
1407 
1408   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_SRC, (uint8_t *) val, 1);
1409 
1410   return ret;
1411 }
1412 
1413 /**
1414   * @brief  Interrupt 1 threshold.[set]
1415   *
1416   * @param  ctx         read / write interface definitions(ptr)
1417   * @param  val         change the values of ths in reg INT1_THS
1418   * @retval       interface status (MANDATORY: return 0 -> no Error)
1419   *
1420   */
h3lis100dl_int1_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1421 int32_t h3lis100dl_int1_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1422 {
1423   h3lis100dl_int1_ths_t int1_ths;
1424   int32_t ret;
1425 
1426   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_THS,
1427                             (uint8_t *)&int1_ths, 1);
1428 
1429   if (ret == 0)
1430   {
1431     int1_ths.ths = val;
1432     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT1_THS,
1433                                (uint8_t *)&int1_ths, 1);
1434   }
1435 
1436   return ret;
1437 }
1438 
1439 /**
1440   * @brief  Interrupt 1 threshold.[get]
1441   *
1442   * @param  ctx         read / write interface definitions(ptr)
1443   * @param  val         change the values of ths in reg INT1_THS
1444   * @retval       interface status (MANDATORY: return 0 -> no Error)
1445   *
1446   */
h3lis100dl_int1_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1447 int32_t h3lis100dl_int1_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1448 {
1449   h3lis100dl_int1_ths_t int1_ths;
1450   int32_t ret;
1451 
1452   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_THS,
1453                             (uint8_t *)&int1_ths, 1);
1454   *val = int1_ths.ths;
1455 
1456   return ret;
1457 }
1458 
1459 /**
1460   * @brief  Duration value for interrupt 1 generator.[set]
1461   *
1462   * @param  ctx         read / write interface definitions(ptr)
1463   * @param  val         change the values of d in reg INT1_DURATION
1464   * @retval       interface status (MANDATORY: return 0 -> no Error)
1465   *
1466   */
h3lis100dl_int1_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1467 int32_t h3lis100dl_int1_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1468 {
1469   h3lis100dl_int1_duration_t int1_duration;
1470   int32_t ret;
1471 
1472   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_DURATION,
1473                             (uint8_t *)&int1_duration, 1);
1474 
1475   if (ret == 0)
1476   {
1477     int1_duration.d = val;
1478     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT1_DURATION,
1479                                (uint8_t *)&int1_duration, 1);
1480   }
1481 
1482   return ret;
1483 }
1484 
1485 /**
1486   * @brief  Duration value for interrupt 1 generator.[get]
1487   *
1488   * @param  ctx         read / write interface definitions(ptr)
1489   * @param  val         change the values of d in reg INT1_DURATION
1490   * @retval       interface status (MANDATORY: return 0 -> no Error)
1491   *
1492   */
h3lis100dl_int1_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1493 int32_t h3lis100dl_int1_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1494 {
1495   h3lis100dl_int1_duration_t int1_duration;
1496   int32_t ret;
1497 
1498   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT1_DURATION,
1499                             (uint8_t *)&int1_duration, 1);
1500   *val = int1_duration.d;
1501 
1502   return ret;
1503 }
1504 
1505 /**
1506   * @brief  Configure the interrupt 2 threshold sign.[set]
1507   *
1508   * @param  ctx         read / write interface definitions(ptr)
1509   * @param  val         enable sign and axis for interrupt on threshold
1510   * @retval       interface status (MANDATORY: return 0 -> no Error)
1511   *
1512   */
h3lis100dl_int2_on_threshold_conf_set(const stmdev_ctx_t * ctx,int2_on_th_conf_t val)1513 int32_t h3lis100dl_int2_on_threshold_conf_set(const stmdev_ctx_t *ctx,
1514                                               int2_on_th_conf_t val)
1515 {
1516   h3lis100dl_int2_cfg_t int2_cfg;
1517   int32_t ret;
1518 
1519   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_CFG,
1520                             (uint8_t *)&int2_cfg, 1);
1521 
1522   if (ret == 0)
1523   {
1524     int2_cfg.xlie  = val.int2_xlie;
1525     int2_cfg.xhie  = val.int2_xhie;
1526     int2_cfg.ylie  = val.int2_ylie;
1527     int2_cfg.yhie  = val.int2_yhie;
1528     int2_cfg.zlie  = val.int2_zlie;
1529     int2_cfg.zhie  = val.int2_zhie;
1530     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT2_CFG,
1531                                (uint8_t *)&int2_cfg, 1);
1532   }
1533 
1534   return ret;
1535 }
1536 
1537 /**
1538   * @brief  Configure the interrupt 2 threshold sign.[get]
1539   *
1540   * @param  ctx         read / write interface definitions(ptr)
1541   * @param  val         enable sign and axis for interrupt on threshold
1542   * @retval       interface status (MANDATORY: return 0 -> no Error)
1543   *
1544   */
h3lis100dl_int2_on_threshold_conf_get(const stmdev_ctx_t * ctx,int2_on_th_conf_t * val)1545 int32_t h3lis100dl_int2_on_threshold_conf_get(const stmdev_ctx_t *ctx,
1546                                               int2_on_th_conf_t *val)
1547 {
1548   h3lis100dl_int2_cfg_t int2_cfg;
1549   int32_t ret;
1550 
1551   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_CFG,
1552                             (uint8_t *)&int2_cfg, 1);
1553   val->int2_xlie = int2_cfg.xlie;
1554   val->int2_xhie = int2_cfg.xhie;
1555   val->int2_ylie = int2_cfg.ylie;
1556   val->int2_yhie = int2_cfg.yhie;
1557   val->int2_zlie = int2_cfg.zlie;
1558   val->int2_zhie = int2_cfg.zhie;
1559 
1560   return ret;
1561 }
1562 
1563 /**
1564   * @brief  AND/OR combination of Interrupt 2 events.[set]
1565   *
1566   * @param  ctx         read / write interface definitions(ptr)
1567   * @param  val         change the values of aoi in reg INT2_CFG
1568   * @retval       interface status (MANDATORY: return 0 -> no Error)
1569   *
1570   */
h3lis100dl_int2_on_threshold_mode_set(const stmdev_ctx_t * ctx,h3lis100dl_int2_aoi_t val)1571 int32_t h3lis100dl_int2_on_threshold_mode_set(const stmdev_ctx_t *ctx,
1572                                               h3lis100dl_int2_aoi_t val)
1573 {
1574   h3lis100dl_int2_cfg_t int2_cfg;
1575   int32_t ret;
1576 
1577   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_CFG,
1578                             (uint8_t *)&int2_cfg, 1);
1579 
1580   if (ret == 0)
1581   {
1582     int2_cfg.aoi = (uint8_t) val;
1583     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT2_CFG,
1584                                (uint8_t *)&int2_cfg, 1);
1585   }
1586 
1587   return ret;
1588 }
1589 
1590 /**
1591   * @brief   AND/OR combination of Interrupt 2 events.[get]
1592   *
1593   * @param  ctx         read / write interface definitions(ptr)
1594   * @param  val         Get the values of aoi in reg INT2_CFG
1595   * @retval       interface status (MANDATORY: return 0 -> no Error)
1596   *
1597   */
h3lis100dl_int2_on_threshold_mode_get(const stmdev_ctx_t * ctx,h3lis100dl_int2_aoi_t * val)1598 int32_t h3lis100dl_int2_on_threshold_mode_get(const stmdev_ctx_t *ctx,
1599                                               h3lis100dl_int2_aoi_t *val)
1600 {
1601   h3lis100dl_int2_cfg_t int2_cfg;
1602   int32_t ret;
1603 
1604   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_CFG,
1605                             (uint8_t *)&int2_cfg, 1);
1606 
1607   switch (int2_cfg.aoi)
1608   {
1609     case H3LIS100DL_INT2_ON_THRESHOLD_OR:
1610       *val = H3LIS100DL_INT2_ON_THRESHOLD_OR;
1611       break;
1612 
1613     case H3LIS100DL_INT2_ON_THRESHOLD_AND:
1614       *val = H3LIS100DL_INT2_ON_THRESHOLD_AND;
1615       break;
1616 
1617     default:
1618       *val = H3LIS100DL_INT2_ON_THRESHOLD_OR;
1619       break;
1620   }
1621 
1622   return ret;
1623 }
1624 
1625 /**
1626   * @brief  Interrupt generator 1 on threshold source register.[get]
1627   *
1628   * @param  ctx         read / write interface definitions(ptr)
1629   * @param  val         registers INT2_SRC
1630   * @retval       interface status (MANDATORY: return 0 -> no Error)
1631   *
1632   */
h3lis100dl_int2_src_get(const stmdev_ctx_t * ctx,h3lis100dl_int2_src_t * val)1633 int32_t h3lis100dl_int2_src_get(const stmdev_ctx_t *ctx,
1634                                 h3lis100dl_int2_src_t *val)
1635 {
1636   int32_t ret;
1637 
1638   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_SRC, (uint8_t *) val, 1);
1639 
1640   return ret;
1641 }
1642 
1643 /**
1644   * @brief  Interrupt 2 threshold.[set]
1645   *
1646   * @param  ctx         read / write interface definitions(ptr)
1647   * @param  val         change the values of ths in reg INT2_THS
1648   * @retval       interface status (MANDATORY: return 0 -> no Error)
1649   *
1650   */
h3lis100dl_int2_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1651 int32_t h3lis100dl_int2_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1652 {
1653   h3lis100dl_int2_ths_t int2_ths;
1654   int32_t ret;
1655 
1656   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_THS,
1657                             (uint8_t *)&int2_ths, 1);
1658 
1659   if (ret == 0)
1660   {
1661     int2_ths.ths = val;
1662     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT2_THS,
1663                                (uint8_t *)&int2_ths, 1);
1664   }
1665 
1666   return ret;
1667 }
1668 
1669 /**
1670   * @brief  Interrupt 2 threshold.[get]
1671   *
1672   * @param  ctx         read / write interface definitions(ptr)
1673   * @param  val         change the values of ths in reg INT2_THS
1674   * @retval       interface status (MANDATORY: return 0 -> no Error)
1675   *
1676   */
h3lis100dl_int2_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1677 int32_t h3lis100dl_int2_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1678 {
1679   h3lis100dl_int2_ths_t int2_ths;
1680   int32_t ret;
1681 
1682   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_THS,
1683                             (uint8_t *)&int2_ths, 1);
1684   *val = int2_ths.ths;
1685 
1686   return ret;
1687 }
1688 
1689 /**
1690   * @brief  Duration value for interrupt 2 generator.[set]
1691   *
1692   * @param  ctx         read / write interface definitions(ptr)
1693   * @param  val         change the values of d in reg INT2_DURATION
1694   * @retval       interface status (MANDATORY: return 0 -> no Error)
1695   *
1696   */
h3lis100dl_int2_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1697 int32_t h3lis100dl_int2_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1698 {
1699   h3lis100dl_int2_duration_t int2_duration;
1700   int32_t ret;
1701 
1702   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_DURATION,
1703                             (uint8_t *)&int2_duration, 1);
1704 
1705   if (ret == 0)
1706   {
1707     int2_duration.d = val;
1708     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_INT2_DURATION,
1709                                (uint8_t *)&int2_duration, 1);
1710   }
1711 
1712   return ret;
1713 }
1714 
1715 /**
1716   * @brief    Duration value for interrupt 2 generator.[get]
1717   *
1718   * @param  ctx         read / write interface definitions(ptr)
1719   * @param  val         change the values of d in reg INT2_DURATION
1720   * @retval       interface status (MANDATORY: return 0 -> no Error)
1721   *
1722   */
h3lis100dl_int2_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1723 int32_t h3lis100dl_int2_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1724 {
1725   h3lis100dl_int2_duration_t int2_duration;
1726   int32_t ret;
1727 
1728   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_INT2_DURATION,
1729                             (uint8_t *)&int2_duration, 1);
1730   *val = int2_duration.d;
1731 
1732   return ret;
1733 }
1734 
1735 /**
1736   * @}
1737   *
1738   */
1739 
1740 /**
1741   * @defgroup    H3LIS100DL_Wake_Up_Event
1742   * @brief       This section groups all the functions that manage the
1743   *              Wake Up event generation.
1744   * @{
1745   *
1746   */
1747 
1748 /**
1749   * @brief  Turn-on mode selection for sleep to wake function.[set]
1750   *
1751   * @param  ctx         read / write interface definitions(ptr)
1752   * @param  val         change the values of turnon in reg CTRL_REG5
1753   * @retval       interface status (MANDATORY: return 0 -> no Error)
1754   *
1755   */
h3lis100dl_wkup_to_sleep_set(const stmdev_ctx_t * ctx,uint8_t val)1756 int32_t h3lis100dl_wkup_to_sleep_set(const stmdev_ctx_t *ctx, uint8_t val)
1757 {
1758   h3lis100dl_ctrl_reg5_t ctrl_reg5;
1759   int32_t ret;
1760 
1761   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG5,
1762                             (uint8_t *)&ctrl_reg5, 1);
1763 
1764   if (ret == 0)
1765   {
1766     ctrl_reg5.turnon = val;
1767     ret = h3lis100dl_write_reg(ctx, H3LIS100DL_CTRL_REG5,
1768                                (uint8_t *)&ctrl_reg5, 1);
1769   }
1770 
1771   return ret;
1772 }
1773 
1774 /**
1775   * @brief  Turn-on mode selection for sleep to wake function.[get]
1776   *
1777   * @param  ctx         read / write interface definitions(ptr)
1778   * @param  val         change the values of turnon in reg CTRL_REG5
1779   * @retval       interface status (MANDATORY: return 0 -> no Error)
1780   *
1781   */
h3lis100dl_wkup_to_sleep_get(const stmdev_ctx_t * ctx,uint8_t * val)1782 int32_t h3lis100dl_wkup_to_sleep_get(const stmdev_ctx_t *ctx, uint8_t *val)
1783 {
1784   h3lis100dl_ctrl_reg5_t ctrl_reg5;
1785   int32_t ret;
1786 
1787   ret = h3lis100dl_read_reg(ctx, H3LIS100DL_CTRL_REG5,
1788                             (uint8_t *)&ctrl_reg5, 1);
1789   *val = ctrl_reg5.turnon;
1790 
1791   return ret;
1792 }
1793 
1794 /**
1795   * @}
1796   *
1797   */
1798 
1799 /**
1800   * @}
1801   *
1802   */
1803 
1804 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1805