1 /**
2   ******************************************************************************
3   * @file    lis331dlh_reg.c
4   * @author  Sensors Software Solution Team
5   * @brief   LIS331DLH 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 "lis331dlh_reg.h"
21 
22 /**
23   * @defgroup    LIS331DLH
24   * @brief       This file provides a set of functions needed to drive the
25   *              lis331dlh enhanced inertial module.
26   * @{
27   *
28   */
29 
30 /**
31   * @defgroup    LIS331DLH_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   */
lis331dlh_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak lis331dlh_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)
56   {
57     return -1;
58   }
59 
60   ret = ctx->read_reg(ctx->handle, reg, data, len);
61 
62   return ret;
63 }
64 
65 /**
66   * @brief  Write generic device register
67   *
68   * @param  ctx   read / write interface definitions(ptr)
69   * @param  reg   register to write
70   * @param  data  pointer to data to write in register reg(ptr)
71   * @param  len   number of consecutive register to write
72   * @retval       interface status (MANDATORY: return 0 -> no Error)
73   *
74   */
lis331dlh_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak lis331dlh_write_reg(const stmdev_ctx_t *ctx, uint8_t reg,
76                                    uint8_t *data,
77                                    uint16_t len)
78 {
79   int32_t ret;
80 
81   if (ctx == NULL)
82   {
83     return -1;
84   }
85 
86   ret = ctx->write_reg(ctx->handle, reg, data, len);
87 
88   return ret;
89 }
90 
91 /**
92   * @}
93   *
94   */
95 
96 /**
97   * @defgroup    LIS331DLH_Sensitivity
98   * @brief       These functions convert raw-data into engineering units.
99   * @{
100   *
101   */
102 
lis331dlh_from_fs2_to_mg(int16_t lsb)103 float_t lis331dlh_from_fs2_to_mg(int16_t lsb)
104 {
105   return ((float_t)lsb / 16.0f);
106 }
107 
lis331dlh_from_fs4_to_mg(int16_t lsb)108 float_t lis331dlh_from_fs4_to_mg(int16_t lsb)
109 {
110   return ((float_t)lsb * 2.0f / 16.0f);
111 }
112 
lis331dlh_from_fs8_to_mg(int16_t lsb)113 float_t lis331dlh_from_fs8_to_mg(int16_t lsb)
114 {
115   return ((float_t)lsb * 3.9f / 16.0f);
116 }
117 
118 /**
119   * @}
120   *
121   */
122 
123 /**
124   * @defgroup    LIS331DLH_Data_Generation
125   * @brief       This section group all the functions concerning
126   *              data generation
127   * @{
128   *
129   */
130 
131 /**
132   * @brief  X axis enable/disable.[set]
133   *
134   * @param  ctx         read / write interface definitions(ptr)
135   * @param  val         change the values of xen in reg CTRL_REG1
136   * @retval       interface status (MANDATORY: return 0 -> no Error)
137   *
138   */
lis331dlh_axis_x_data_set(const stmdev_ctx_t * ctx,uint8_t val)139 int32_t lis331dlh_axis_x_data_set(const stmdev_ctx_t *ctx, uint8_t val)
140 {
141   lis331dlh_ctrl_reg1_t ctrl_reg1;
142   int32_t ret;
143 
144   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
145                            (uint8_t *)&ctrl_reg1, 1);
146 
147   if (ret == 0)
148   {
149     ctrl_reg1.xen = val;
150     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG1,
151                               (uint8_t *)&ctrl_reg1, 1);
152   }
153 
154   return ret;
155 }
156 
157 /**
158   * @brief  X axis enable/disable.[get]
159   *
160   * @param  ctx         read / write interface definitions(ptr)
161   * @param  val         change the values of xen in reg CTRL_REG1
162   * @retval       interface status (MANDATORY: return 0 -> no Error)
163   *
164   */
lis331dlh_axis_x_data_get(const stmdev_ctx_t * ctx,uint8_t * val)165 int32_t lis331dlh_axis_x_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
166 {
167   lis331dlh_ctrl_reg1_t ctrl_reg1;
168   int32_t ret;
169 
170   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
171                            (uint8_t *)&ctrl_reg1, 1);
172   *val = ctrl_reg1.xen;
173 
174   return ret;
175 }
176 
177 /**
178   * @brief  Y axis enable/disable.[set]
179   *
180   * @param  ctx         read / write interface definitions(ptr)
181   * @param  val         change the values of yen in reg CTRL_REG1
182   * @retval       interface status (MANDATORY: return 0 -> no Error)
183   *
184   */
lis331dlh_axis_y_data_set(const stmdev_ctx_t * ctx,uint8_t val)185 int32_t lis331dlh_axis_y_data_set(const stmdev_ctx_t *ctx, uint8_t val)
186 {
187   lis331dlh_ctrl_reg1_t ctrl_reg1;
188   int32_t ret;
189 
190   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
191                            (uint8_t *)&ctrl_reg1, 1);
192 
193   if (ret == 0)
194   {
195     ctrl_reg1.yen = val;
196     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG1,
197                               (uint8_t *)&ctrl_reg1, 1);
198   }
199 
200   return ret;
201 }
202 
203 /**
204   * @brief  Y axis enable/disable.[get]
205   *
206   * @param  ctx         read / write interface definitions(ptr)
207   * @param  val         change the values of yen in reg CTRL_REG1
208   * @retval       interface status (MANDATORY: return 0 -> no Error)
209   *
210   */
lis331dlh_axis_y_data_get(const stmdev_ctx_t * ctx,uint8_t * val)211 int32_t lis331dlh_axis_y_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
212 {
213   lis331dlh_ctrl_reg1_t ctrl_reg1;
214   int32_t ret;
215 
216   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
217                            (uint8_t *)&ctrl_reg1, 1);
218   *val = ctrl_reg1.yen;
219 
220   return ret;
221 }
222 
223 /**
224   * @brief  Z axis enable/disable.[set]
225   *
226   * @param  ctx         read / write interface definitions(ptr)
227   * @param  val         change the values of zen in reg CTRL_REG1
228   * @retval       interface status (MANDATORY: return 0 -> no Error)
229   *
230   */
lis331dlh_axis_z_data_set(const stmdev_ctx_t * ctx,uint8_t val)231 int32_t lis331dlh_axis_z_data_set(const stmdev_ctx_t *ctx, uint8_t val)
232 {
233   lis331dlh_ctrl_reg1_t ctrl_reg1;
234   int32_t ret;
235 
236   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
237                            (uint8_t *)&ctrl_reg1, 1);
238 
239   if (ret == 0)
240   {
241     ctrl_reg1.zen = val;
242     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG1,
243                               (uint8_t *)&ctrl_reg1, 1);
244   }
245 
246   return ret;
247 }
248 
249 /**
250   * @brief  Z axis enable/disable.[get]
251   *
252   * @param  ctx         read / write interface definitions(ptr)
253   * @param  val         change the values of zen in reg CTRL_REG1
254   * @retval       interface status (MANDATORY: return 0 -> no Error)
255   *
256   */
lis331dlh_axis_z_data_get(const stmdev_ctx_t * ctx,uint8_t * val)257 int32_t lis331dlh_axis_z_data_get(const stmdev_ctx_t *ctx, uint8_t *val)
258 {
259   lis331dlh_ctrl_reg1_t ctrl_reg1;
260   int32_t ret;
261 
262   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
263                            (uint8_t *)&ctrl_reg1, 1);
264   *val = ctrl_reg1.zen;
265 
266   return ret;
267 }
268 
269 /**
270   * @brief  Accelerometer data rate selection.[set]
271   *
272   * @param  ctx         read / write interface definitions(ptr)
273   * @param  val         change the values of dr in reg CTRL_REG1
274   * @retval       interface status (MANDATORY: return 0 -> no Error)
275   *
276   */
lis331dlh_data_rate_set(const stmdev_ctx_t * ctx,lis331dlh_dr_t val)277 int32_t lis331dlh_data_rate_set(const stmdev_ctx_t *ctx, lis331dlh_dr_t val)
278 {
279   lis331dlh_ctrl_reg1_t ctrl_reg1;
280   int32_t ret;
281 
282   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
283                            (uint8_t *)&ctrl_reg1, 1);
284 
285   if (ret == 0)
286   {
287     ctrl_reg1.pm = (uint8_t)val & 0x07U;
288     ctrl_reg1.dr = ((uint8_t)val & 0x30U) >> 4;
289     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG1,
290                               (uint8_t *)&ctrl_reg1, 1);
291   }
292 
293   return ret;
294 }
295 
296 /**
297   * @brief  Accelerometer data rate selection.[get]
298   *
299   * @param  ctx         read / write interface definitions(ptr)
300   * @param  val         Get the values of dr in reg CTRL_REG1
301   * @retval       interface status (MANDATORY: return 0 -> no Error)
302   *
303   */
lis331dlh_data_rate_get(const stmdev_ctx_t * ctx,lis331dlh_dr_t * val)304 int32_t lis331dlh_data_rate_get(const stmdev_ctx_t *ctx,
305                                 lis331dlh_dr_t *val)
306 {
307   lis331dlh_ctrl_reg1_t ctrl_reg1;
308   int32_t ret;
309 
310   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG1,
311                            (uint8_t *)&ctrl_reg1, 1);
312 
313   switch ((ctrl_reg1.dr << 4) + ctrl_reg1.pm)
314   {
315     case LIS331DLH_ODR_OFF:
316       *val = LIS331DLH_ODR_OFF;
317       break;
318 
319     case LIS331DLH_ODR_Hz5:
320       *val = LIS331DLH_ODR_Hz5;
321       break;
322 
323     case LIS331DLH_ODR_1Hz:
324       *val = LIS331DLH_ODR_1Hz;
325       break;
326 
327     case LIS331DLH_ODR_2Hz:
328       *val = LIS331DLH_ODR_2Hz;
329       break;
330 
331     case LIS331DLH_ODR_5Hz:
332       *val = LIS331DLH_ODR_5Hz;
333       break;
334 
335     case LIS331DLH_ODR_10Hz:
336       *val = LIS331DLH_ODR_10Hz;
337       break;
338 
339     case LIS331DLH_ODR_50Hz:
340       *val = LIS331DLH_ODR_50Hz;
341       break;
342 
343     case LIS331DLH_ODR_100Hz:
344       *val = LIS331DLH_ODR_100Hz;
345       break;
346 
347     case LIS331DLH_ODR_400Hz:
348       *val = LIS331DLH_ODR_400Hz;
349       break;
350 
351     case LIS331DLH_ODR_1kHz:
352       *val = LIS331DLH_ODR_1kHz;
353       break;
354 
355     default:
356       *val = LIS331DLH_ODR_OFF;
357       break;
358   }
359 
360   return ret;
361 }
362 
363 /**
364   * @brief  High pass filter mode selection.[set]
365   *
366   * @param  ctx         read / write interface definitions(ptr)
367   * @param  val         change the values of hpm in reg CTRL_REG2
368   * @retval       interface status (MANDATORY: return 0 -> no Error)
369   *
370   */
lis331dlh_reference_mode_set(const stmdev_ctx_t * ctx,lis331dlh_hpm_t val)371 int32_t lis331dlh_reference_mode_set(const stmdev_ctx_t *ctx,
372                                      lis331dlh_hpm_t val)
373 {
374   lis331dlh_ctrl_reg2_t ctrl_reg2;
375   int32_t ret;
376 
377   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
378                            (uint8_t *)&ctrl_reg2, 1);
379 
380   if (ret == 0)
381   {
382     ctrl_reg2.hpm = (uint8_t)val;
383     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG2,
384                               (uint8_t *)&ctrl_reg2, 1);
385   }
386 
387   return ret;
388 }
389 
390 /**
391   * @brief  High pass filter mode selection.[get]
392   *
393   * @param  ctx         read / write interface definitions(ptr)
394   * @param  val         Get the values of hpm in reg CTRL_REG2
395   * @retval       interface status (MANDATORY: return 0 -> no Error)
396   *
397   */
lis331dlh_reference_mode_get(const stmdev_ctx_t * ctx,lis331dlh_hpm_t * val)398 int32_t lis331dlh_reference_mode_get(const stmdev_ctx_t *ctx,
399                                      lis331dlh_hpm_t *val)
400 {
401   lis331dlh_ctrl_reg2_t ctrl_reg2;
402   int32_t ret;
403 
404   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
405                            (uint8_t *)&ctrl_reg2, 1);
406 
407   switch (ctrl_reg2.hpm)
408   {
409     case LIS331DLH_NORMAL_MODE:
410       *val = LIS331DLH_NORMAL_MODE;
411       break;
412 
413     case LIS331DLH_REF_MODE_ENABLE:
414       *val = LIS331DLH_REF_MODE_ENABLE;
415       break;
416 
417     default:
418       *val = LIS331DLH_NORMAL_MODE;
419       break;
420   }
421 
422   return ret;
423 }
424 
425 /**
426   * @brief  Accelerometer full-scale selection.[set]
427   *
428   * @param  ctx         read / write interface definitions(ptr)
429   * @param  val         change the values of fs in reg CTRL_REG4
430   * @retval       interface status (MANDATORY: return 0 -> no Error)
431   *
432   */
lis331dlh_full_scale_set(const stmdev_ctx_t * ctx,lis331dlh_fs_t val)433 int32_t lis331dlh_full_scale_set(const stmdev_ctx_t *ctx,
434                                  lis331dlh_fs_t val)
435 {
436   lis331dlh_ctrl_reg4_t ctrl_reg4;
437   int32_t ret;
438 
439   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
440                            (uint8_t *)&ctrl_reg4, 1);
441 
442   if (ret == 0)
443   {
444     ctrl_reg4.fs = (uint8_t)val;
445     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG4,
446                               (uint8_t *)&ctrl_reg4, 1);
447   }
448 
449   return ret;
450 }
451 
452 /**
453   * @brief  Accelerometer full-scale selection.[get]
454   *
455   * @param  ctx         read / write interface definitions(ptr)
456   * @param  val         Get the values of fs in reg CTRL_REG4
457   * @retval       interface status (MANDATORY: return 0 -> no Error)
458   *
459   */
lis331dlh_full_scale_get(const stmdev_ctx_t * ctx,lis331dlh_fs_t * val)460 int32_t lis331dlh_full_scale_get(const stmdev_ctx_t *ctx,
461                                  lis331dlh_fs_t *val)
462 {
463   lis331dlh_ctrl_reg4_t ctrl_reg4;
464   int32_t ret;
465 
466   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
467                            (uint8_t *)&ctrl_reg4, 1);
468 
469   switch (ctrl_reg4.fs)
470   {
471     case LIS331DLH_2g:
472       *val = LIS331DLH_2g;
473       break;
474 
475     case LIS331DLH_4g:
476       *val = LIS331DLH_4g;
477       break;
478 
479     case LIS331DLH_8g:
480       *val = LIS331DLH_8g;
481       break;
482 
483     default:
484       *val = LIS331DLH_2g;
485       break;
486   }
487 
488   return ret;
489 }
490 
491 /**
492   * @brief  Block data update.[set]
493   *
494   * @param  ctx         read / write interface definitions(ptr)
495   * @param  val         change the values of bdu in reg CTRL_REG4
496   * @retval       interface status (MANDATORY: return 0 -> no Error)
497   *
498   */
lis331dlh_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)499 int32_t lis331dlh_block_data_update_set(const stmdev_ctx_t *ctx,
500                                         uint8_t val)
501 {
502   lis331dlh_ctrl_reg4_t ctrl_reg4;
503   int32_t ret;
504 
505   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
506                            (uint8_t *)&ctrl_reg4, 1);
507 
508   if (ret == 0)
509   {
510     ctrl_reg4.bdu = val;
511     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG4,
512                               (uint8_t *)&ctrl_reg4, 1);
513   }
514 
515   return ret;
516 }
517 
518 /**
519   * @brief  Block data update.[get]
520   *
521   * @param  ctx         read / write interface definitions(ptr)
522   * @param  val         change the values of bdu in reg CTRL_REG4
523   * @retval       interface status (MANDATORY: return 0 -> no Error)
524   *
525   */
lis331dlh_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)526 int32_t lis331dlh_block_data_update_get(const stmdev_ctx_t *ctx,
527                                         uint8_t *val)
528 {
529   lis331dlh_ctrl_reg4_t ctrl_reg4;
530   int32_t ret;
531 
532   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
533                            (uint8_t *)&ctrl_reg4, 1);
534   *val = ctrl_reg4.bdu;
535 
536   return ret;
537 }
538 
539 /**
540   * @brief  The STATUS_REG register is read by the interface.[get]
541   *
542   * @param  ctx         read / write interface definitions(ptr)
543   * @param  val         registers STATUS_REG
544   * @retval       interface status (MANDATORY: return 0 -> no Error)
545   *
546   */
lis331dlh_status_reg_get(const stmdev_ctx_t * ctx,lis331dlh_status_reg_t * val)547 int32_t lis331dlh_status_reg_get(const stmdev_ctx_t *ctx,
548                                  lis331dlh_status_reg_t *val)
549 {
550   int32_t ret;
551 
552   ret = lis331dlh_read_reg(ctx, LIS331DLH_STATUS_REG, (uint8_t *) val, 1);
553 
554   return ret;
555 }
556 
557 /**
558   * @brief  Accelerometer new data available.[get]
559   *
560   * @param  ctx         read / write interface definitions(ptr)
561   * @param  val         change the values of zyxda in reg STATUS_REG
562   * @retval       interface status (MANDATORY: return 0 -> no Error)
563   *
564   */
lis331dlh_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)565 int32_t lis331dlh_flag_data_ready_get(const stmdev_ctx_t *ctx, uint8_t *val)
566 {
567   lis331dlh_status_reg_t status_reg;
568   int32_t ret;
569 
570   ret = lis331dlh_read_reg(ctx, LIS331DLH_STATUS_REG,
571                            (uint8_t *)&status_reg, 1);
572   *val = status_reg.zyxda;
573 
574   return ret;
575 }
576 
577 /**
578   * @}
579   *
580   */
581 
582 /**
583   * @defgroup    LIS331DLH_Data_Output
584   * @brief       This section groups all the data output functions.
585   * @{
586   *
587   */
588 
589 /**
590   * @brief  Linear acceleration output register. The value is expressed
591   *         as a 16-bit word in two’s complement.[get]
592   *
593   * @param  ctx         read / write interface definitions(ptr)
594   * @param  buff        buffer that stores data read
595   * @retval       interface status (MANDATORY: return 0 -> no Error)
596   *
597   */
lis331dlh_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)598 int32_t lis331dlh_acceleration_raw_get(const stmdev_ctx_t *ctx,
599                                        int16_t *val)
600 {
601   uint8_t buff[6];
602   int32_t ret;
603 
604   ret = lis331dlh_read_reg(ctx, LIS331DLH_OUT_X_L, buff, 6);
605   val[0] = (int16_t)buff[1];
606   val[0] = (val[0] * 256) + (int16_t)buff[0];
607   val[1] = (int16_t)buff[3];
608   val[1] = (val[1] * 256) + (int16_t)buff[2];
609   val[2] = (int16_t)buff[5];
610   val[2] = (val[2] * 256) + (int16_t)buff[4];
611 
612   return ret;
613 }
614 
615 /**
616   * @}
617   *
618   */
619 
620 /**
621   * @defgroup    LIS331DLH_Common
622   * @brief       This section groups common useful functions.
623   * @{
624   *
625   */
626 
627 /**
628   * @brief  Device Who am I.[get]
629   *
630   * @param  ctx         read / write interface definitions(ptr)
631   * @param  buff        buffer that stores data read
632   * @retval       interface status (MANDATORY: return 0 -> no Error)
633   *
634   */
lis331dlh_device_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)635 int32_t lis331dlh_device_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
636 {
637   int32_t ret;
638 
639   ret = lis331dlh_read_reg(ctx, LIS331DLH_WHO_AM_I, buff, 1);
640 
641   return ret;
642 }
643 
644 /**
645   * @brief  Reboot memory content. Reload the calibration parameters.[set]
646   *
647   * @param  ctx         read / write interface definitions(ptr)
648   * @param  val         change the values of boot in reg CTRL_REG2
649   * @retval       interface status (MANDATORY: return 0 -> no Error)
650   *
651   */
lis331dlh_boot_set(const stmdev_ctx_t * ctx,uint8_t val)652 int32_t lis331dlh_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
653 {
654   lis331dlh_ctrl_reg2_t ctrl_reg2;
655   int32_t ret;
656 
657   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
658                            (uint8_t *)&ctrl_reg2, 1);
659 
660   if (ret == 0)
661   {
662     ctrl_reg2.boot = val;
663     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG2,
664                               (uint8_t *)&ctrl_reg2, 1);
665   }
666 
667   return ret;
668 }
669 
670 /**
671   * @brief  Reboot memory content. Reload the calibration parameters.[get]
672   *
673   * @param  ctx         read / write interface definitions(ptr)
674   * @param  val         change the values of boot in reg CTRL_REG2
675   * @retval       interface status (MANDATORY: return 0 -> no Error)
676   *
677   */
lis331dlh_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)678 int32_t lis331dlh_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
679 {
680   lis331dlh_ctrl_reg2_t ctrl_reg2;
681   int32_t ret;
682 
683   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
684                            (uint8_t *)&ctrl_reg2, 1);
685   *val = ctrl_reg2.boot;
686 
687   return ret;
688 }
689 
690 /**
691   * @brief  Linear acceleration sensor self-test enable.[set]
692   *
693   * @param  ctx         read / write interface definitions(ptr)
694   * @param  val         change the values of st in reg CTRL_REG4
695   * @retval       interface status (MANDATORY: return 0 -> no Error)
696   *
697   */
lis331dlh_self_test_set(const stmdev_ctx_t * ctx,lis331dlh_st_t val)698 int32_t lis331dlh_self_test_set(const stmdev_ctx_t *ctx, lis331dlh_st_t val)
699 {
700   lis331dlh_ctrl_reg4_t ctrl_reg4;
701   int32_t ret;
702 
703   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
704                            (uint8_t *)&ctrl_reg4, 1);
705 
706   if (ret == 0)
707   {
708     ctrl_reg4.st = (uint8_t)val;
709     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG4,
710                               (uint8_t *)&ctrl_reg4, 1);
711   }
712 
713   return ret;
714 }
715 
716 /**
717   * @brief  Linear acceleration sensor self-test enable.[get]
718   *
719   * @param  ctx         read / write interface definitions(ptr)
720   * @param  val         Get the values of st in reg CTRL_REG4
721   * @retval       interface status (MANDATORY: return 0 -> no Error)
722   *
723   */
lis331dlh_self_test_get(const stmdev_ctx_t * ctx,lis331dlh_st_t * val)724 int32_t lis331dlh_self_test_get(const stmdev_ctx_t *ctx,
725                                 lis331dlh_st_t *val)
726 {
727   lis331dlh_ctrl_reg4_t ctrl_reg4;
728   int32_t ret;
729 
730   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
731                            (uint8_t *)&ctrl_reg4, 1);
732 
733   switch (ctrl_reg4.st)
734   {
735     case LIS331DLH_ST_DISABLE:
736       *val = LIS331DLH_ST_DISABLE;
737       break;
738 
739     case LIS331DLH_ST_POSITIVE:
740       *val = LIS331DLH_ST_POSITIVE;
741       break;
742 
743     case LIS331DLH_ST_NEGATIVE:
744       *val = LIS331DLH_ST_NEGATIVE;
745       break;
746 
747     default:
748       *val = LIS331DLH_ST_DISABLE;
749       break;
750   }
751 
752   return ret;
753 }
754 
755 /**
756   * @brief  Big/Little Endian Data selection.[set]
757   *
758   * @param  ctx         read / write interface definitions(ptr)
759   * @param  val         change the values of ble in reg CTRL_REG4
760   * @retval       interface status (MANDATORY: return 0 -> no Error)
761   *
762   */
lis331dlh_data_format_set(const stmdev_ctx_t * ctx,lis331dlh_ble_t val)763 int32_t lis331dlh_data_format_set(const stmdev_ctx_t *ctx,
764                                   lis331dlh_ble_t val)
765 {
766   lis331dlh_ctrl_reg4_t ctrl_reg4;
767   int32_t ret;
768 
769   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
770                            (uint8_t *)&ctrl_reg4, 1);
771 
772   if (ret == 0)
773   {
774     ctrl_reg4.ble = (uint8_t)val;
775     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG4,
776                               (uint8_t *)&ctrl_reg4, 1);
777   }
778 
779   return ret;
780 }
781 
782 /**
783   * @brief  Big/Little Endian Data selection.[get]
784   *
785   * @param  ctx         read / write interface definitions(ptr)
786   * @param  val         Get the values of ble in reg CTRL_REG4
787   * @retval       interface status (MANDATORY: return 0 -> no Error)
788   *
789   */
lis331dlh_data_format_get(const stmdev_ctx_t * ctx,lis331dlh_ble_t * val)790 int32_t lis331dlh_data_format_get(const stmdev_ctx_t *ctx,
791                                   lis331dlh_ble_t *val)
792 {
793   lis331dlh_ctrl_reg4_t ctrl_reg4;
794   int32_t ret;
795 
796   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
797                            (uint8_t *)&ctrl_reg4, 1);
798 
799   switch (ctrl_reg4.ble)
800   {
801     case LIS331DLH_LSB_AT_LOW_ADD:
802       *val = LIS331DLH_LSB_AT_LOW_ADD;
803       break;
804 
805     case LIS331DLH_MSB_AT_LOW_ADD:
806       *val = LIS331DLH_MSB_AT_LOW_ADD;
807       break;
808 
809     default:
810       *val = LIS331DLH_LSB_AT_LOW_ADD;
811       break;
812   }
813 
814   return ret;
815 }
816 
817 /**
818   * @}
819   *
820   */
821 
822 /**
823   * @defgroup    LIS331DLH_Filters
824   * @brief       This section group all the functions concerning the
825   *              filters configuration.
826   * @{
827   *
828   */
829 
830 /**
831   * @brief  High pass filter cut-off frequency configuration.[set]
832   *
833   * @param  ctx         read / write interface definitions(ptr)
834   * @param  val         change the values of hpcf in reg CTRL_REG2
835   * @retval       interface status (MANDATORY: return 0 -> no Error)
836   *
837   */
lis331dlh_hp_bandwidth_set(const stmdev_ctx_t * ctx,lis331dlh_hpcf_t val)838 int32_t lis331dlh_hp_bandwidth_set(const stmdev_ctx_t *ctx,
839                                    lis331dlh_hpcf_t val)
840 {
841   lis331dlh_ctrl_reg2_t ctrl_reg2;
842   int32_t ret;
843 
844   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
845                            (uint8_t *)&ctrl_reg2, 1);
846 
847   if (ret == 0)
848   {
849     ctrl_reg2.hpcf = (uint8_t)val;
850     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG2,
851                               (uint8_t *)&ctrl_reg2, 1);
852   }
853 
854   return ret;
855 }
856 
857 /**
858   * @brief  High pass filter cut-off frequency configuration.[get]
859   *
860   * @param  ctx         read / write interface definitions(ptr)
861   * @param  val         Get the values of hpcf in reg CTRL_REG2
862   * @retval       interface status (MANDATORY: return 0 -> no Error)
863   *
864   */
lis331dlh_hp_bandwidth_get(const stmdev_ctx_t * ctx,lis331dlh_hpcf_t * val)865 int32_t lis331dlh_hp_bandwidth_get(const stmdev_ctx_t *ctx,
866                                    lis331dlh_hpcf_t *val)
867 {
868   lis331dlh_ctrl_reg2_t ctrl_reg2;
869   int32_t ret;
870 
871   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
872                            (uint8_t *)&ctrl_reg2, 1);
873 
874   switch (ctrl_reg2.hpcf)
875   {
876     case LIS331DLH_CUT_OFF_8Hz:
877       *val = LIS331DLH_CUT_OFF_8Hz;
878       break;
879 
880     case LIS331DLH_CUT_OFF_16Hz:
881       *val = LIS331DLH_CUT_OFF_16Hz;
882       break;
883 
884     case LIS331DLH_CUT_OFF_32Hz:
885       *val = LIS331DLH_CUT_OFF_32Hz;
886       break;
887 
888     case LIS331DLH_CUT_OFF_64Hz:
889       *val = LIS331DLH_CUT_OFF_64Hz;
890       break;
891 
892     default:
893       *val = LIS331DLH_CUT_OFF_8Hz;
894       break;
895   }
896 
897   return ret;
898 }
899 
900 /**
901   * @brief  Select High Pass filter path.[set]
902   *
903   * @param  ctx         read / write interface definitions(ptr)
904   * @param  val         change the values of hpen in reg CTRL_REG2
905   * @retval       interface status (MANDATORY: return 0 -> no Error)
906   *
907   */
lis331dlh_hp_path_set(const stmdev_ctx_t * ctx,lis331dlh_hpen_t val)908 int32_t lis331dlh_hp_path_set(const stmdev_ctx_t *ctx, lis331dlh_hpen_t val)
909 {
910   lis331dlh_ctrl_reg2_t ctrl_reg2;
911   int32_t ret;
912 
913   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
914                            (uint8_t *)&ctrl_reg2, 1);
915 
916   if (ret == 0)
917   {
918     ctrl_reg2.hpen = (uint8_t)val & 0x03U;
919     ctrl_reg2.fds = ((uint8_t)val & 0x04U) >> 2;
920     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG2,
921                               (uint8_t *)&ctrl_reg2, 1);
922   }
923 
924   return ret;
925 }
926 
927 /**
928   * @brief  Select High Pass filter path.[get]
929   *
930   * @param  ctx         read / write interface definitions(ptr)
931   * @param  val         Get the values of hpen in reg CTRL_REG2
932   * @retval       interface status (MANDATORY: return 0 -> no Error)
933   *
934   */
lis331dlh_hp_path_get(const stmdev_ctx_t * ctx,lis331dlh_hpen_t * val)935 int32_t lis331dlh_hp_path_get(const stmdev_ctx_t *ctx,
936                               lis331dlh_hpen_t *val)
937 {
938   lis331dlh_ctrl_reg2_t ctrl_reg2;
939   int32_t ret;
940 
941   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG2,
942                            (uint8_t *)&ctrl_reg2, 1);
943 
944   switch ((ctrl_reg2.fds << 2) + ctrl_reg2.hpen)
945   {
946     case LIS331DLH_HP_DISABLE:
947       *val = LIS331DLH_HP_DISABLE;
948       break;
949 
950     case LIS331DLH_HP_ON_OUT:
951       *val = LIS331DLH_HP_ON_OUT;
952       break;
953 
954     case LIS331DLH_HP_ON_INT1:
955       *val = LIS331DLH_HP_ON_INT1;
956       break;
957 
958     case LIS331DLH_HP_ON_INT2:
959       *val = LIS331DLH_HP_ON_INT2;
960       break;
961 
962     case LIS331DLH_HP_ON_INT1_INT2:
963       *val = LIS331DLH_HP_ON_INT1_INT2;
964       break;
965 
966     case LIS331DLH_HP_ON_INT1_INT2_OUT:
967       *val = LIS331DLH_HP_ON_INT1_INT2_OUT;
968       break;
969 
970     case LIS331DLH_HP_ON_INT2_OUT:
971       *val = LIS331DLH_HP_ON_INT2_OUT;
972       break;
973 
974     case LIS331DLH_HP_ON_INT1_OUT:
975       *val = LIS331DLH_HP_ON_INT1_OUT;
976       break;
977 
978     default:
979       *val = LIS331DLH_HP_DISABLE;
980       break;
981   }
982 
983   return ret;
984 }
985 
986 /**
987   * @brief  Reading at this address zeroes instantaneously
988   *         the content of the internal high pass-filter.
989   *         If the high pass filter is enabled all three axes
990   *         are instantaneously set to 0g. This allows to
991   *         overcome the settling time of the high pass
992   *         filter.[get]
993   *
994   * @param  ctx         read / write interface definitions(ptr)
995   * @retval       interface status (MANDATORY: return 0 -> no Error)
996   *
997   */
lis331dlh_hp_reset_get(const stmdev_ctx_t * ctx)998 int32_t lis331dlh_hp_reset_get(const stmdev_ctx_t *ctx)
999 {
1000   uint8_t dummy;
1001   int32_t ret;
1002 
1003   ret = lis331dlh_read_reg(ctx, LIS331DLH_HP_FILTER_RESET,
1004                            (uint8_t *)&dummy, 1);
1005 
1006   return ret;
1007 }
1008 
1009 /**
1010   * @brief  Reference value for high-pass filter.[set]
1011   *
1012   * @param  ctx         read / write interface definitions(ptr)
1013   * @param  val         change the values of ref in reg REFERENCE
1014   * @retval       interface status (MANDATORY: return 0 -> no Error)
1015   *
1016   */
lis331dlh_hp_reference_value_set(const stmdev_ctx_t * ctx,uint8_t val)1017 int32_t lis331dlh_hp_reference_value_set(const stmdev_ctx_t *ctx,
1018                                          uint8_t val)
1019 {
1020   int32_t ret;
1021 
1022   ret = lis331dlh_write_reg(ctx, LIS331DLH_REFERENCE, (uint8_t *)&val, 1);
1023 
1024   return ret;
1025 }
1026 
1027 /**
1028   * @brief  Reference value for high-pass filter.[get]
1029   *
1030   * @param  ctx         read / write interface definitions(ptr)
1031   * @param  val         change the values of ref in reg REFERENCE
1032   * @retval       interface status (MANDATORY: return 0 -> no Error)
1033   *
1034   */
lis331dlh_hp_reference_value_get(const stmdev_ctx_t * ctx,uint8_t * val)1035 int32_t lis331dlh_hp_reference_value_get(const stmdev_ctx_t *ctx,
1036                                          uint8_t *val)
1037 {
1038   int32_t ret;
1039 
1040   ret = lis331dlh_read_reg(ctx, LIS331DLH_REFERENCE, val, 1);
1041 
1042   return ret;
1043 }
1044 
1045 /**
1046   * @}
1047   *
1048   */
1049 
1050 /**
1051   * @defgroup    LIS331DLH_Serial_Interface
1052   * @brief       This section groups all the functions concerning serial
1053   *              interface management.
1054   * @{
1055   *
1056   */
1057 
1058 /**
1059   * @brief  SPI 3- or 4-wire interface.[set]
1060   *
1061   * @param  ctx         read / write interface definitions(ptr)
1062   * @param  val         change the values of sim in reg CTRL_REG4
1063   * @retval       interface status (MANDATORY: return 0 -> no Error)
1064   *
1065   */
lis331dlh_spi_mode_set(const stmdev_ctx_t * ctx,lis331dlh_sim_t val)1066 int32_t lis331dlh_spi_mode_set(const stmdev_ctx_t *ctx, lis331dlh_sim_t val)
1067 {
1068   lis331dlh_ctrl_reg4_t ctrl_reg4;
1069   int32_t ret;
1070 
1071   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
1072                            (uint8_t *)&ctrl_reg4, 1);
1073 
1074   if (ret == 0)
1075   {
1076     ctrl_reg4.sim = (uint8_t)val;
1077     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG4,
1078                               (uint8_t *)&ctrl_reg4, 1);
1079   }
1080 
1081   return ret;
1082 }
1083 
1084 /**
1085   * @brief  SPI 3- or 4-wire interface.[get]
1086   *
1087   * @param  ctx         read / write interface definitions(ptr)
1088   * @param  val         Get the values of sim in reg CTRL_REG4
1089   * @retval       interface status (MANDATORY: return 0 -> no Error)
1090   *
1091   */
lis331dlh_spi_mode_get(const stmdev_ctx_t * ctx,lis331dlh_sim_t * val)1092 int32_t lis331dlh_spi_mode_get(const stmdev_ctx_t *ctx,
1093                                lis331dlh_sim_t *val)
1094 {
1095   lis331dlh_ctrl_reg4_t ctrl_reg4;
1096   int32_t ret;
1097 
1098   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG4,
1099                            (uint8_t *)&ctrl_reg4, 1);
1100 
1101   switch (ctrl_reg4.sim)
1102   {
1103     case LIS331DLH_SPI_4_WIRE:
1104       *val = LIS331DLH_SPI_4_WIRE;
1105       break;
1106 
1107     case LIS331DLH_SPI_3_WIRE:
1108       *val = LIS331DLH_SPI_3_WIRE;
1109       break;
1110 
1111     default:
1112       *val = LIS331DLH_SPI_4_WIRE;
1113       break;
1114   }
1115 
1116   return ret;
1117 }
1118 
1119 /**
1120   * @}
1121   *
1122   */
1123 
1124 /**
1125   * @defgroup    LIS331DLH_Interrupt_Pins
1126   * @brief       This section groups all the functions that manage
1127   *              interrupt pins.
1128   * @{
1129   *
1130   */
1131 
1132 /**
1133   * @brief  Data signal on INT 1 pad control bits.[set]
1134   *
1135   * @param  ctx         read / write interface definitions(ptr)
1136   * @param  val         change the values of i1_cfg in reg CTRL_REG3
1137   * @retval       interface status (MANDATORY: return 0 -> no Error)
1138   *
1139   */
lis331dlh_pin_int1_route_set(const stmdev_ctx_t * ctx,lis331dlh_i1_cfg_t val)1140 int32_t lis331dlh_pin_int1_route_set(const stmdev_ctx_t *ctx,
1141                                      lis331dlh_i1_cfg_t val)
1142 {
1143   lis331dlh_ctrl_reg3_t ctrl_reg3;
1144   int32_t ret;
1145 
1146   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1147                            (uint8_t *)&ctrl_reg3, 1);
1148 
1149   if (ret == 0)
1150   {
1151     ctrl_reg3.i1_cfg = (uint8_t)val;
1152     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG3,
1153                               (uint8_t *)&ctrl_reg3, 1);
1154   }
1155 
1156   return ret;
1157 }
1158 
1159 /**
1160   * @brief  Data signal on INT 1 pad control bits.[get]
1161   *
1162   * @param  ctx         read / write interface definitions(ptr)
1163   * @param  val         Get the values of i1_cfg in reg CTRL_REG3
1164   * @retval       interface status (MANDATORY: return 0 -> no Error)
1165   *
1166   */
lis331dlh_pin_int1_route_get(const stmdev_ctx_t * ctx,lis331dlh_i1_cfg_t * val)1167 int32_t lis331dlh_pin_int1_route_get(const stmdev_ctx_t *ctx,
1168                                      lis331dlh_i1_cfg_t *val)
1169 {
1170   lis331dlh_ctrl_reg3_t ctrl_reg3;
1171   int32_t ret;
1172 
1173   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1174                            (uint8_t *)&ctrl_reg3, 1);
1175 
1176   switch (ctrl_reg3.i1_cfg)
1177   {
1178     case LIS331DLH_PAD1_INT1_SRC:
1179       *val = LIS331DLH_PAD1_INT1_SRC;
1180       break;
1181 
1182     case LIS331DLH_PAD1_INT1_OR_INT2_SRC:
1183       *val = LIS331DLH_PAD1_INT1_OR_INT2_SRC;
1184       break;
1185 
1186     case LIS331DLH_PAD1_DRDY:
1187       *val = LIS331DLH_PAD1_DRDY;
1188       break;
1189 
1190     case LIS331DLH_PAD1_BOOT:
1191       *val = LIS331DLH_PAD1_BOOT;
1192       break;
1193 
1194     default:
1195       *val = LIS331DLH_PAD1_INT1_SRC;
1196       break;
1197   }
1198 
1199   return ret;
1200 }
1201 
1202 /**
1203   * @brief  Latch interrupt request on INT1_SRC register, with INT1_SRC
1204   *         register cleared by reading INT1_SRC register.[set]
1205   *
1206   * @param  ctx         read / write interface definitions(ptr)
1207   * @param  val         change the values of lir1 in reg CTRL_REG3
1208   * @retval       interface status (MANDATORY: return 0 -> no Error)
1209   *
1210   */
lis331dlh_int1_notification_set(const stmdev_ctx_t * ctx,lis331dlh_lir1_t val)1211 int32_t lis331dlh_int1_notification_set(const stmdev_ctx_t *ctx,
1212                                         lis331dlh_lir1_t val)
1213 {
1214   lis331dlh_ctrl_reg3_t ctrl_reg3;
1215   int32_t ret;
1216 
1217   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1218                            (uint8_t *)&ctrl_reg3, 1);
1219 
1220   if (ret == 0)
1221   {
1222     ctrl_reg3.lir1 = (uint8_t)val;
1223     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG3,
1224                               (uint8_t *)&ctrl_reg3, 1);
1225   }
1226 
1227   return ret;
1228 }
1229 
1230 /**
1231   * @brief  Latch interrupt request on INT1_SRC register, with INT1_SRC
1232   *         register cleared by reading INT1_SRC register.[get]
1233   *
1234   * @param  ctx         read / write interface definitions(ptr)
1235   * @param  val         Get the values of lir1 in reg CTRL_REG3
1236   * @retval       interface status (MANDATORY: return 0 -> no Error)
1237   *
1238   */
lis331dlh_int1_notification_get(const stmdev_ctx_t * ctx,lis331dlh_lir1_t * val)1239 int32_t lis331dlh_int1_notification_get(const stmdev_ctx_t *ctx,
1240                                         lis331dlh_lir1_t *val)
1241 {
1242   lis331dlh_ctrl_reg3_t ctrl_reg3;
1243   int32_t ret;
1244 
1245   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1246                            (uint8_t *)&ctrl_reg3, 1);
1247 
1248   switch (ctrl_reg3.lir1)
1249   {
1250     case LIS331DLH_INT1_PULSED:
1251       *val = LIS331DLH_INT1_PULSED;
1252       break;
1253 
1254     case LIS331DLH_INT1_LATCHED:
1255       *val = LIS331DLH_INT1_LATCHED;
1256       break;
1257 
1258     default:
1259       *val = LIS331DLH_INT1_PULSED;
1260       break;
1261   }
1262 
1263   return ret;
1264 }
1265 
1266 /**
1267   * @brief  Data signal on INT 2 pad control bits.[set]
1268   *
1269   * @param  ctx         read / write interface definitions(ptr)
1270   * @param  val         change the values of i2_cfg in reg CTRL_REG3
1271   * @retval       interface status (MANDATORY: return 0 -> no Error)
1272   *
1273   */
lis331dlh_pin_int2_route_set(const stmdev_ctx_t * ctx,lis331dlh_i2_cfg_t val)1274 int32_t lis331dlh_pin_int2_route_set(const stmdev_ctx_t *ctx,
1275                                      lis331dlh_i2_cfg_t val)
1276 {
1277   lis331dlh_ctrl_reg3_t ctrl_reg3;
1278   int32_t ret;
1279 
1280   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1281                            (uint8_t *)&ctrl_reg3, 1);
1282 
1283   if (ret == 0)
1284   {
1285     ctrl_reg3.i2_cfg = (uint8_t)val;
1286     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG3,
1287                               (uint8_t *)&ctrl_reg3, 1);
1288   }
1289 
1290   return ret;
1291 }
1292 
1293 /**
1294   * @brief  Data signal on INT 2 pad control bits.[get]
1295   *
1296   * @param  ctx         read / write interface definitions(ptr)
1297   * @param  val         Get the values of i2_cfg in reg CTRL_REG3
1298   * @retval       interface status (MANDATORY: return 0 -> no Error)
1299   *
1300   */
lis331dlh_pin_int2_route_get(const stmdev_ctx_t * ctx,lis331dlh_i2_cfg_t * val)1301 int32_t lis331dlh_pin_int2_route_get(const stmdev_ctx_t *ctx,
1302                                      lis331dlh_i2_cfg_t *val)
1303 {
1304   lis331dlh_ctrl_reg3_t ctrl_reg3;
1305   int32_t ret;
1306 
1307   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1308                            (uint8_t *)&ctrl_reg3, 1);
1309 
1310   switch (ctrl_reg3.i2_cfg)
1311   {
1312     case LIS331DLH_PAD2_INT2_SRC:
1313       *val = LIS331DLH_PAD2_INT2_SRC;
1314       break;
1315 
1316     case LIS331DLH_PAD2_INT1_OR_INT2_SRC:
1317       *val = LIS331DLH_PAD2_INT1_OR_INT2_SRC;
1318       break;
1319 
1320     case LIS331DLH_PAD2_DRDY:
1321       *val = LIS331DLH_PAD2_DRDY;
1322       break;
1323 
1324     case LIS331DLH_PAD2_BOOT:
1325       *val = LIS331DLH_PAD2_BOOT;
1326       break;
1327 
1328     default:
1329       *val = LIS331DLH_PAD2_INT2_SRC;
1330       break;
1331   }
1332 
1333   return ret;
1334 }
1335 
1336 /**
1337   * @brief  Latch interrupt request on INT2_SRC register, with INT2_SRC
1338   *         register cleared by reading INT2_SRC itself.[set]
1339   *
1340   * @param  ctx         read / write interface definitions(ptr)
1341   * @param  val         change the values of lir2 in reg CTRL_REG3
1342   * @retval       interface status (MANDATORY: return 0 -> no Error)
1343   *
1344   */
lis331dlh_int2_notification_set(const stmdev_ctx_t * ctx,lis331dlh_lir2_t val)1345 int32_t lis331dlh_int2_notification_set(const stmdev_ctx_t *ctx,
1346                                         lis331dlh_lir2_t val)
1347 {
1348   lis331dlh_ctrl_reg3_t ctrl_reg3;
1349   int32_t ret;
1350 
1351   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1352                            (uint8_t *)&ctrl_reg3, 1);
1353 
1354   if (ret == 0)
1355   {
1356     ctrl_reg3.lir2 = (uint8_t)val;
1357     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG3,
1358                               (uint8_t *)&ctrl_reg3, 1);
1359   }
1360 
1361   return ret;
1362 }
1363 
1364 /**
1365   * @brief  Latch interrupt request on INT2_SRC register, with INT2_SRC
1366   *         register cleared by reading INT2_SRC itself.[get]
1367   *
1368   * @param  ctx         read / write interface definitions(ptr)
1369   * @param  val         Get the values of lir2 in reg CTRL_REG3
1370   * @retval       interface status (MANDATORY: return 0 -> no Error)
1371   *
1372   */
lis331dlh_int2_notification_get(const stmdev_ctx_t * ctx,lis331dlh_lir2_t * val)1373 int32_t lis331dlh_int2_notification_get(const stmdev_ctx_t *ctx,
1374                                         lis331dlh_lir2_t *val)
1375 {
1376   lis331dlh_ctrl_reg3_t ctrl_reg3;
1377   int32_t ret;
1378 
1379   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1380                            (uint8_t *)&ctrl_reg3, 1);
1381 
1382   switch (ctrl_reg3.lir2)
1383   {
1384     case LIS331DLH_INT2_PULSED:
1385       *val = LIS331DLH_INT2_PULSED;
1386       break;
1387 
1388     case LIS331DLH_INT2_LATCHED:
1389       *val = LIS331DLH_INT2_LATCHED;
1390       break;
1391 
1392     default:
1393       *val = LIS331DLH_INT2_PULSED;
1394       break;
1395   }
1396 
1397   return ret;
1398 }
1399 
1400 /**
1401   * @brief  Push-pull/open drain selection on interrupt pads.[set]
1402   *
1403   * @param  ctx         read / write interface definitions(ptr)
1404   * @param  val         change the values of pp_od in reg CTRL_REG3
1405   * @retval       interface status (MANDATORY: return 0 -> no Error)
1406   *
1407   */
lis331dlh_pin_mode_set(const stmdev_ctx_t * ctx,lis331dlh_pp_od_t val)1408 int32_t lis331dlh_pin_mode_set(const stmdev_ctx_t *ctx,
1409                                lis331dlh_pp_od_t val)
1410 {
1411   lis331dlh_ctrl_reg3_t ctrl_reg3;
1412   int32_t ret;
1413 
1414   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1415                            (uint8_t *)&ctrl_reg3, 1);
1416 
1417   if (ret == 0)
1418   {
1419     ctrl_reg3.pp_od = (uint8_t)val;
1420     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG3,
1421                               (uint8_t *)&ctrl_reg3, 1);
1422   }
1423 
1424   return ret;
1425 }
1426 
1427 /**
1428   * @brief  Push-pull/open drain selection on interrupt pads.[get]
1429   *
1430   * @param  ctx         read / write interface definitions(ptr)
1431   * @param  val         Get the values of pp_od in reg CTRL_REG3
1432   * @retval       interface status (MANDATORY: return 0 -> no Error)
1433   *
1434   */
lis331dlh_pin_mode_get(const stmdev_ctx_t * ctx,lis331dlh_pp_od_t * val)1435 int32_t lis331dlh_pin_mode_get(const stmdev_ctx_t *ctx,
1436                                lis331dlh_pp_od_t *val)
1437 {
1438   lis331dlh_ctrl_reg3_t ctrl_reg3;
1439   int32_t ret;
1440 
1441   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1442                            (uint8_t *)&ctrl_reg3, 1);
1443 
1444   switch (ctrl_reg3.pp_od)
1445   {
1446     case LIS331DLH_PUSH_PULL:
1447       *val = LIS331DLH_PUSH_PULL;
1448       break;
1449 
1450     case LIS331DLH_OPEN_DRAIN:
1451       *val = LIS331DLH_OPEN_DRAIN;
1452       break;
1453 
1454     default:
1455       *val = LIS331DLH_PUSH_PULL;
1456       break;
1457   }
1458 
1459   return ret;
1460 }
1461 
1462 /**
1463   * @brief  Interrupt active-high/low.[set]
1464   *
1465   * @param  ctx         read / write interface definitions(ptr)
1466   * @param  val         change the values of ihl in reg CTRL_REG3
1467   * @retval       interface status (MANDATORY: return 0 -> no Error)
1468   *
1469   */
lis331dlh_pin_polarity_set(const stmdev_ctx_t * ctx,lis331dlh_ihl_t val)1470 int32_t lis331dlh_pin_polarity_set(const stmdev_ctx_t *ctx,
1471                                    lis331dlh_ihl_t val)
1472 {
1473   lis331dlh_ctrl_reg3_t ctrl_reg3;
1474   int32_t ret;
1475 
1476   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1477                            (uint8_t *)&ctrl_reg3, 1);
1478 
1479   if (ret == 0)
1480   {
1481     ctrl_reg3.ihl = (uint8_t)val;
1482     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG3,
1483                               (uint8_t *)&ctrl_reg3, 1);
1484   }
1485 
1486   return ret;
1487 }
1488 
1489 /**
1490   * @brief  Interrupt active-high/low.[get]
1491   *
1492   * @param  ctx         read / write interface definitions(ptr)
1493   * @param  val         Get the values of ihl in reg CTRL_REG3
1494   * @retval       interface status (MANDATORY: return 0 -> no Error)
1495   *
1496   */
lis331dlh_pin_polarity_get(const stmdev_ctx_t * ctx,lis331dlh_ihl_t * val)1497 int32_t lis331dlh_pin_polarity_get(const stmdev_ctx_t *ctx,
1498                                    lis331dlh_ihl_t *val)
1499 {
1500   lis331dlh_ctrl_reg3_t ctrl_reg3;
1501   int32_t ret;
1502 
1503   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG3,
1504                            (uint8_t *)&ctrl_reg3, 1);
1505 
1506   switch (ctrl_reg3.ihl)
1507   {
1508     case LIS331DLH_ACTIVE_HIGH:
1509       *val = LIS331DLH_ACTIVE_HIGH;
1510       break;
1511 
1512     case LIS331DLH_ACTIVE_LOW:
1513       *val = LIS331DLH_ACTIVE_LOW;
1514       break;
1515 
1516     default:
1517       *val = LIS331DLH_ACTIVE_HIGH;
1518       break;
1519   }
1520 
1521   return ret;
1522 }
1523 
1524 /**
1525   * @}
1526   *
1527   */
1528 
1529 /**
1530   * @defgroup    LIS331DLH_interrupt_on_threshold
1531   * @brief       This section groups all the functions that manage
1532   *              the interrupt on threshold event generation.
1533   * @{
1534   *
1535   */
1536 
1537 /**
1538   * @brief  Configure the interrupt 1 threshold sign.[set]
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   */
lis331dlh_int1_on_threshold_conf_set(const stmdev_ctx_t * ctx,int1_on_th_conf_t val)1545 int32_t lis331dlh_int1_on_threshold_conf_set(const stmdev_ctx_t *ctx,
1546                                              int1_on_th_conf_t val)
1547 {
1548   lis331dlh_int1_cfg_t int1_cfg;
1549   int32_t ret;
1550 
1551   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_CFG,
1552                            (uint8_t *)&int1_cfg, 1);
1553 
1554   if (ret == 0)
1555   {
1556     int1_cfg.xlie  = val.int1_xlie;
1557     int1_cfg.xhie  = val.int1_xhie;
1558     int1_cfg.ylie  = val.int1_ylie;
1559     int1_cfg.yhie  = val.int1_yhie;
1560     int1_cfg.zlie  = val.int1_zlie;
1561     int1_cfg.zhie  = val.int1_zhie;
1562     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT1_CFG,
1563                               (uint8_t *)&int1_cfg, 1);
1564   }
1565 
1566   return ret;
1567 }
1568 
1569 /**
1570   * @brief   Configure the interrupt 1 threshold sign.[get]
1571   *
1572   * @param  ctx         read / write interface definitions(ptr)
1573   * @param  val         enable sign and axis for interrupt on threshold
1574   * @retval       interface status (MANDATORY: return 0 -> no Error)
1575   *
1576   */
lis331dlh_int1_on_threshold_conf_get(const stmdev_ctx_t * ctx,int1_on_th_conf_t * val)1577 int32_t lis331dlh_int1_on_threshold_conf_get(const stmdev_ctx_t *ctx,
1578                                              int1_on_th_conf_t *val)
1579 {
1580   lis331dlh_int1_cfg_t int1_cfg;
1581   int32_t ret;
1582 
1583   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_CFG,
1584                            (uint8_t *)&int1_cfg, 1);
1585   val->int1_xlie = int1_cfg.xlie;
1586   val->int1_xhie = int1_cfg.xhie;
1587   val->int1_ylie = int1_cfg.ylie;
1588   val->int1_yhie = int1_cfg.yhie;
1589   val->int1_zlie = int1_cfg.zlie;
1590   val->int1_zhie = int1_cfg.zhie;
1591 
1592   return ret;
1593 }
1594 
1595 /**
1596   * @brief  AND/OR combination of Interrupt 1 events.[set]
1597   *
1598   * @param  ctx         read / write interface definitions(ptr)
1599   * @param  val         change the values of aoi in reg INT1_CFG
1600   * @retval       interface status (MANDATORY: return 0 -> no Error)
1601   *
1602   */
lis331dlh_int1_on_threshold_mode_set(const stmdev_ctx_t * ctx,lis331dlh_int1_aoi_t val)1603 int32_t lis331dlh_int1_on_threshold_mode_set(const stmdev_ctx_t *ctx,
1604                                              lis331dlh_int1_aoi_t val)
1605 {
1606   lis331dlh_int1_cfg_t int1_cfg;
1607   int32_t ret;
1608 
1609   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_CFG,
1610                            (uint8_t *)&int1_cfg, 1);
1611 
1612   if (ret == 0)
1613   {
1614     int1_cfg.aoi = (uint8_t) val;
1615     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT1_CFG,
1616                               (uint8_t *)&int1_cfg, 1);
1617   }
1618 
1619   return ret;
1620 }
1621 
1622 /**
1623   * @brief   AND/OR combination of Interrupt 1 events.[get]
1624   *
1625   * @param  ctx         read / write interface definitions(ptr)
1626   * @param  val         Get the values of aoi in reg INT1_CFG
1627   * @retval       interface status (MANDATORY: return 0 -> no Error)
1628   *
1629   */
lis331dlh_int1_on_threshold_mode_get(const stmdev_ctx_t * ctx,lis331dlh_int1_aoi_t * val)1630 int32_t lis331dlh_int1_on_threshold_mode_get(const stmdev_ctx_t *ctx,
1631                                              lis331dlh_int1_aoi_t *val)
1632 {
1633   lis331dlh_int1_cfg_t int1_cfg;
1634   int32_t ret;
1635 
1636   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_CFG,
1637                            (uint8_t *)&int1_cfg, 1);
1638 
1639   switch (int1_cfg.aoi)
1640   {
1641     case LIS331DLH_INT1_ON_THRESHOLD_OR:
1642       *val = LIS331DLH_INT1_ON_THRESHOLD_OR;
1643       break;
1644 
1645     case LIS331DLH_INT1_ON_THRESHOLD_AND:
1646       *val = LIS331DLH_INT1_ON_THRESHOLD_AND;
1647       break;
1648 
1649     default:
1650       *val = LIS331DLH_INT1_ON_THRESHOLD_OR;
1651       break;
1652   }
1653 
1654   return ret;
1655 }
1656 
1657 /**
1658   * @brief  Interrupt generator 1 on threshold source register.[get]
1659   *
1660   * @param  ctx         read / write interface definitions(ptr)
1661   * @param  val         registers INT1_SRC
1662   * @retval       interface status (MANDATORY: return 0 -> no Error)
1663   *
1664   */
lis331dlh_int1_src_get(const stmdev_ctx_t * ctx,lis331dlh_int1_src_t * val)1665 int32_t lis331dlh_int1_src_get(const stmdev_ctx_t *ctx,
1666                                lis331dlh_int1_src_t *val)
1667 {
1668   int32_t ret;
1669 
1670   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_SRC, (uint8_t *) val, 1);
1671 
1672   return ret;
1673 }
1674 
1675 /**
1676   * @brief  Interrupt 1 threshold.[set]
1677   *
1678   * @param  ctx         read / write interface definitions(ptr)
1679   * @param  val         change the values of ths in reg INT1_THS
1680   * @retval       interface status (MANDATORY: return 0 -> no Error)
1681   *
1682   */
lis331dlh_int1_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1683 int32_t lis331dlh_int1_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1684 {
1685   lis331dlh_int1_ths_t int1_ths;
1686   int32_t ret;
1687 
1688   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_THS,
1689                            (uint8_t *)&int1_ths, 1);
1690 
1691   if (ret == 0)
1692   {
1693     int1_ths.ths = val;
1694     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT1_THS,
1695                               (uint8_t *)&int1_ths, 1);
1696   }
1697 
1698   return ret;
1699 }
1700 
1701 /**
1702   * @brief  Interrupt 1 threshold.[get]
1703   *
1704   * @param  ctx         read / write interface definitions(ptr)
1705   * @param  val         change the values of ths in reg INT1_THS
1706   * @retval       interface status (MANDATORY: return 0 -> no Error)
1707   *
1708   */
lis331dlh_int1_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1709 int32_t lis331dlh_int1_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1710 {
1711   lis331dlh_int1_ths_t int1_ths;
1712   int32_t ret;
1713 
1714   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_THS,
1715                            (uint8_t *)&int1_ths, 1);
1716   *val = int1_ths.ths;
1717 
1718   return ret;
1719 }
1720 
1721 /**
1722   * @brief  Duration value for interrupt 1 generator.[set]
1723   *
1724   * @param  ctx         read / write interface definitions(ptr)
1725   * @param  val         change the values of d in reg INT1_DURATION
1726   * @retval       interface status (MANDATORY: return 0 -> no Error)
1727   *
1728   */
lis331dlh_int1_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1729 int32_t lis331dlh_int1_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1730 {
1731   lis331dlh_int1_duration_t int1_duration;
1732   int32_t ret;
1733 
1734   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_DURATION,
1735                            (uint8_t *)&int1_duration, 1);
1736 
1737   if (ret == 0)
1738   {
1739     int1_duration.d = val;
1740     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT1_DURATION,
1741                               (uint8_t *)&int1_duration, 1);
1742   }
1743 
1744   return ret;
1745 }
1746 
1747 /**
1748   * @brief  Duration value for interrupt 1 generator.[get]
1749   *
1750   * @param  ctx         read / write interface definitions(ptr)
1751   * @param  val         change the values of d in reg INT1_DURATION
1752   * @retval       interface status (MANDATORY: return 0 -> no Error)
1753   *
1754   */
lis331dlh_int1_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1755 int32_t lis331dlh_int1_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1756 {
1757   lis331dlh_int1_duration_t int1_duration;
1758   int32_t ret;
1759 
1760   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_DURATION,
1761                            (uint8_t *)&int1_duration, 1);
1762   *val = int1_duration.d;
1763 
1764   return ret;
1765 }
1766 
1767 /**
1768   * @brief  Configure the interrupt 2 threshold sign.[set]
1769   *
1770   * @param  ctx         read / write interface definitions(ptr)
1771   * @param  val         enable sign and axis for interrupt on threshold
1772   * @retval       interface status (MANDATORY: return 0 -> no Error)
1773   *
1774   */
lis331dlh_int2_on_threshold_conf_set(const stmdev_ctx_t * ctx,int2_on_th_conf_t val)1775 int32_t lis331dlh_int2_on_threshold_conf_set(const stmdev_ctx_t *ctx,
1776                                              int2_on_th_conf_t val)
1777 {
1778   lis331dlh_int2_cfg_t int2_cfg;
1779   int32_t ret;
1780 
1781   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_CFG,
1782                            (uint8_t *)&int2_cfg, 1);
1783 
1784   if (ret == 0)
1785   {
1786     int2_cfg.xlie  = val.int2_xlie;
1787     int2_cfg.xhie  = val.int2_xhie;
1788     int2_cfg.ylie  = val.int2_ylie;
1789     int2_cfg.yhie  = val.int2_yhie;
1790     int2_cfg.zlie  = val.int2_zlie;
1791     int2_cfg.zhie  = val.int2_zhie;
1792     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT2_CFG,
1793                               (uint8_t *)&int2_cfg, 1);
1794   }
1795 
1796   return ret;
1797 }
1798 
1799 /**
1800   * @brief  Configure the interrupt 2 threshold sign.[get]
1801   *
1802   * @param  ctx         read / write interface definitions(ptr)
1803   * @param  val         enable sign and axis for interrupt on threshold
1804   * @retval       interface status (MANDATORY: return 0 -> no Error)
1805   *
1806   */
lis331dlh_int2_on_threshold_conf_get(const stmdev_ctx_t * ctx,int2_on_th_conf_t * val)1807 int32_t lis331dlh_int2_on_threshold_conf_get(const stmdev_ctx_t *ctx,
1808                                              int2_on_th_conf_t *val)
1809 {
1810   lis331dlh_int2_cfg_t int2_cfg;
1811   int32_t ret;
1812 
1813   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_CFG,
1814                            (uint8_t *)&int2_cfg, 1);
1815   val->int2_xlie = int2_cfg.xlie;
1816   val->int2_xhie = int2_cfg.xhie;
1817   val->int2_ylie = int2_cfg.ylie;
1818   val->int2_yhie = int2_cfg.yhie;
1819   val->int2_zlie = int2_cfg.zlie;
1820   val->int2_zhie = int2_cfg.zhie;
1821 
1822   return ret;
1823 }
1824 
1825 /**
1826   * @brief  AND/OR combination of Interrupt 2 events.[set]
1827   *
1828   * @param  ctx         read / write interface definitions(ptr)
1829   * @param  val         change the values of aoi in reg INT2_CFG
1830   * @retval       interface status (MANDATORY: return 0 -> no Error)
1831   *
1832   */
lis331dlh_int2_on_threshold_mode_set(const stmdev_ctx_t * ctx,lis331dlh_int2_aoi_t val)1833 int32_t lis331dlh_int2_on_threshold_mode_set(const stmdev_ctx_t *ctx,
1834                                              lis331dlh_int2_aoi_t val)
1835 {
1836   lis331dlh_int2_cfg_t int2_cfg;
1837   int32_t ret;
1838 
1839   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_CFG,
1840                            (uint8_t *)&int2_cfg, 1);
1841 
1842   if (ret == 0)
1843   {
1844     int2_cfg.aoi = (uint8_t) val;
1845     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT2_CFG,
1846                               (uint8_t *)&int2_cfg, 1);
1847   }
1848 
1849   return ret;
1850 }
1851 
1852 /**
1853   * @brief   AND/OR combination of Interrupt 2 events.[get]
1854   *
1855   * @param  ctx         read / write interface definitions(ptr)
1856   * @param  val         Get the values of aoi in reg INT2_CFG
1857   * @retval       interface status (MANDATORY: return 0 -> no Error)
1858   *
1859   */
lis331dlh_int2_on_threshold_mode_get(const stmdev_ctx_t * ctx,lis331dlh_int2_aoi_t * val)1860 int32_t lis331dlh_int2_on_threshold_mode_get(const stmdev_ctx_t *ctx,
1861                                              lis331dlh_int2_aoi_t *val)
1862 {
1863   lis331dlh_int2_cfg_t int2_cfg;
1864   int32_t ret;
1865 
1866   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_CFG,
1867                            (uint8_t *)&int2_cfg, 1);
1868 
1869   switch (int2_cfg.aoi)
1870   {
1871     case LIS331DLH_INT2_ON_THRESHOLD_OR:
1872       *val = LIS331DLH_INT2_ON_THRESHOLD_OR;
1873       break;
1874 
1875     case LIS331DLH_INT2_ON_THRESHOLD_AND:
1876       *val = LIS331DLH_INT2_ON_THRESHOLD_AND;
1877       break;
1878 
1879     default:
1880       *val = LIS331DLH_INT2_ON_THRESHOLD_OR;
1881       break;
1882   }
1883 
1884   return ret;
1885 }
1886 
1887 /**
1888   * @brief  Interrupt generator 1 on threshold source register.[get]
1889   *
1890   * @param  ctx         read / write interface definitions(ptr)
1891   * @param  val         registers INT2_SRC
1892   * @retval       interface status (MANDATORY: return 0 -> no Error)
1893   *
1894   */
lis331dlh_int2_src_get(const stmdev_ctx_t * ctx,lis331dlh_int2_src_t * val)1895 int32_t lis331dlh_int2_src_get(const stmdev_ctx_t *ctx,
1896                                lis331dlh_int2_src_t *val)
1897 {
1898   int32_t ret;
1899 
1900   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_SRC, (uint8_t *) val, 1);
1901 
1902   return ret;
1903 }
1904 
1905 /**
1906   * @brief  Interrupt 2 threshold.[set]
1907   *
1908   * @param  ctx         read / write interface definitions(ptr)
1909   * @param  val         change the values of ths in reg INT2_THS
1910   * @retval       interface status (MANDATORY: return 0 -> no Error)
1911   *
1912   */
lis331dlh_int2_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)1913 int32_t lis331dlh_int2_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
1914 {
1915   lis331dlh_int2_ths_t int2_ths;
1916   int32_t ret;
1917 
1918   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_THS,
1919                            (uint8_t *)&int2_ths, 1);
1920 
1921   if (ret == 0)
1922   {
1923     int2_ths.ths = val;
1924     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT2_THS,
1925                               (uint8_t *)&int2_ths, 1);
1926   }
1927 
1928   return ret;
1929 }
1930 
1931 /**
1932   * @brief  Interrupt 2 threshold.[get]
1933   *
1934   * @param  ctx         read / write interface definitions(ptr)
1935   * @param  val         change the values of ths in reg INT2_THS
1936   * @retval       interface status (MANDATORY: return 0 -> no Error)
1937   *
1938   */
lis331dlh_int2_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)1939 int32_t lis331dlh_int2_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
1940 {
1941   lis331dlh_int2_ths_t int2_ths;
1942   int32_t ret;
1943 
1944   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_THS,
1945                            (uint8_t *)&int2_ths, 1);
1946   *val = int2_ths.ths;
1947 
1948   return ret;
1949 }
1950 
1951 /**
1952   * @brief  Duration value for interrupt 2 generator.[set]
1953   *
1954   * @param  ctx         read / write interface definitions(ptr)
1955   * @param  val         change the values of d in reg INT2_DURATION
1956   * @retval       interface status (MANDATORY: return 0 -> no Error)
1957   *
1958   */
lis331dlh_int2_dur_set(const stmdev_ctx_t * ctx,uint8_t val)1959 int32_t lis331dlh_int2_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
1960 {
1961   lis331dlh_int2_duration_t int2_duration;
1962   int32_t ret;
1963 
1964   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_DURATION,
1965                            (uint8_t *)&int2_duration, 1);
1966 
1967   if (ret == 0)
1968   {
1969     int2_duration.d = val;
1970     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT2_DURATION,
1971                               (uint8_t *)&int2_duration, 1);
1972   }
1973 
1974   return ret;
1975 }
1976 
1977 /**
1978   * @brief    Duration value for interrupt 2 generator.[get]
1979   *
1980   * @param  ctx         read / write interface definitions(ptr)
1981   * @param  val         change the values of d in reg INT2_DURATION
1982   * @retval       interface status (MANDATORY: return 0 -> no Error)
1983   *
1984   */
lis331dlh_int2_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)1985 int32_t lis331dlh_int2_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
1986 {
1987   lis331dlh_int2_duration_t int2_duration;
1988   int32_t ret;
1989 
1990   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_DURATION,
1991                            (uint8_t *)&int2_duration, 1);
1992   *val = int2_duration.d;
1993 
1994   return ret;
1995 }
1996 
1997 /**
1998   * @}
1999   *
2000   */
2001 
2002 /**
2003   * @defgroup    LIS331DLH_Wake_Up_Event
2004   * @brief       This section groups all the functions that manage the
2005   *              Wake Up event generation.
2006   * @{
2007   *
2008   */
2009 
2010 /**
2011   * @brief  Turn-on mode selection for sleep to wake function.[set]
2012   *
2013   * @param  ctx         read / write interface definitions(ptr)
2014   * @param  val         change the values of turnon in reg CTRL_REG5
2015   * @retval       interface status (MANDATORY: return 0 -> no Error)
2016   *
2017   */
lis331dlh_wkup_to_sleep_set(const stmdev_ctx_t * ctx,uint8_t val)2018 int32_t lis331dlh_wkup_to_sleep_set(const stmdev_ctx_t *ctx, uint8_t val)
2019 {
2020   lis331dlh_ctrl_reg5_t ctrl_reg5;
2021   int32_t ret;
2022 
2023   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG5,
2024                            (uint8_t *)&ctrl_reg5, 1);
2025 
2026   if (ret == 0)
2027   {
2028     ctrl_reg5.turnon = val;
2029     ret = lis331dlh_write_reg(ctx, LIS331DLH_CTRL_REG5,
2030                               (uint8_t *)&ctrl_reg5, 1);
2031   }
2032 
2033   return ret;
2034 }
2035 
2036 /**
2037   * @brief  Turn-on mode selection for sleep to wake function.[get]
2038   *
2039   * @param  ctx         read / write interface definitions(ptr)
2040   * @param  val         change the values of turnon in reg CTRL_REG5
2041   * @retval       interface status (MANDATORY: return 0 -> no Error)
2042   *
2043   */
lis331dlh_wkup_to_sleep_get(const stmdev_ctx_t * ctx,uint8_t * val)2044 int32_t lis331dlh_wkup_to_sleep_get(const stmdev_ctx_t *ctx, uint8_t *val)
2045 {
2046   lis331dlh_ctrl_reg5_t ctrl_reg5;
2047   int32_t ret;
2048 
2049   ret = lis331dlh_read_reg(ctx, LIS331DLH_CTRL_REG5,
2050                            (uint8_t *)&ctrl_reg5, 1);
2051   *val = ctrl_reg5.turnon;
2052 
2053   return ret;
2054 }
2055 
2056 /**
2057   * @}
2058   *
2059   */
2060 
2061 /**
2062   * @defgroup    LIS331DLH_Six_Position_Detection
2063   * @brief       This section groups all the functions concerning six
2064   *              position detection (6D).
2065   * @{
2066   *
2067   */
2068 
2069 /**
2070   * @brief  Configure the 6d on interrupt 1 generator.[set]
2071   *
2072   * @param  ctx         read / write interface definitions(ptr)
2073   * @param  val         change the values of 6d in reg INT1_CFG
2074   * @retval       interface status (MANDATORY: return 0 -> no Error)
2075   *
2076   */
lis331dlh_int1_6d_mode_set(const stmdev_ctx_t * ctx,lis331dlh_int1_6d_t val)2077 int32_t lis331dlh_int1_6d_mode_set(const stmdev_ctx_t *ctx,
2078                                    lis331dlh_int1_6d_t val)
2079 {
2080   lis331dlh_int1_cfg_t int1_cfg;
2081   int32_t ret;
2082 
2083   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_CFG,
2084                            (uint8_t *)&int1_cfg, 1);
2085 
2086   if (ret == 0)
2087   {
2088     int1_cfg._6d = (uint8_t)val & 0x01U;
2089     int1_cfg.aoi = ((uint8_t)val & 0x02U) >> 1;
2090     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT1_CFG,
2091                               (uint8_t *)&int1_cfg, 1);
2092   }
2093 
2094   return ret;
2095 }
2096 
2097 /**
2098   * @brief  Configure the 6d on interrupt 1 generator.[get]
2099   *
2100   * @param  ctx         read / write interface definitions(ptr)
2101   * @param  val         Get the values of 6d in reg INT1_CFG
2102   * @retval       interface status (MANDATORY: return 0 -> no Error)
2103   *
2104   */
lis331dlh_int1_6d_mode_get(const stmdev_ctx_t * ctx,lis331dlh_int1_6d_t * val)2105 int32_t lis331dlh_int1_6d_mode_get(const stmdev_ctx_t *ctx,
2106                                    lis331dlh_int1_6d_t *val)
2107 {
2108   lis331dlh_int1_cfg_t int1_cfg;
2109   int32_t ret;
2110 
2111   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_CFG,
2112                            (uint8_t *)&int1_cfg, 1);
2113 
2114   switch ((int1_cfg.aoi << 1) + int1_cfg._6d)
2115   {
2116     case LIS331DLH_6D_INT1_DISABLE:
2117       *val = LIS331DLH_6D_INT1_DISABLE;
2118       break;
2119 
2120     case LIS331DLH_6D_INT1_MOVEMENT:
2121       *val = LIS331DLH_6D_INT1_MOVEMENT;
2122       break;
2123 
2124     case LIS331DLH_6D_INT1_POSITION:
2125       *val = LIS331DLH_6D_INT1_POSITION;
2126       break;
2127 
2128     default:
2129       *val = LIS331DLH_6D_INT1_DISABLE;
2130       break;
2131   }
2132 
2133   return ret;
2134 }
2135 
2136 /**
2137   * @brief  6D on interrupt generator 1 source register.[get]
2138   *
2139   * @param  ctx         read / write interface definitions(ptr)
2140   * @param  val         registers INT1_SRC
2141   * @retval       interface status (MANDATORY: return 0 -> no Error)
2142   *
2143   */
lis331dlh_int1_6d_src_get(const stmdev_ctx_t * ctx,lis331dlh_int1_src_t * val)2144 int32_t lis331dlh_int1_6d_src_get(const stmdev_ctx_t *ctx,
2145                                   lis331dlh_int1_src_t *val)
2146 {
2147   int32_t ret;
2148 
2149   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_SRC, (uint8_t *) val, 1);
2150 
2151   return ret;
2152 }
2153 
2154 /**
2155   * @brief  Interrupt 1 threshold.[set]
2156   *
2157   * @param  ctx         read / write interface definitions(ptr)
2158   * @param  val         change the values of ths in reg INT1_THS
2159   * @retval       interface status (MANDATORY: return 0 -> no Error)
2160   *
2161   */
lis331dlh_int1_6d_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)2162 int32_t lis331dlh_int1_6d_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
2163 {
2164   lis331dlh_int1_ths_t int1_ths;
2165   int32_t ret;
2166 
2167   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_THS,
2168                            (uint8_t *)&int1_ths, 1);
2169 
2170   if (ret == 0)
2171   {
2172     int1_ths.ths = val;
2173     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT1_THS,
2174                               (uint8_t *)&int1_ths, 1);
2175   }
2176 
2177   return ret;
2178 }
2179 
2180 /**
2181   * @brief  Interrupt 1 threshold.[get]
2182   *
2183   * @param  ctx         read / write interface definitions(ptr)
2184   * @param  val         change the values of ths in reg INT1_THS
2185   * @retval       interface status (MANDATORY: return 0 -> no Error)
2186   *
2187   */
lis331dlh_int1_6d_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)2188 int32_t lis331dlh_int1_6d_threshold_get(const stmdev_ctx_t *ctx,
2189                                         uint8_t *val)
2190 {
2191   lis331dlh_int1_ths_t int1_ths;
2192   int32_t ret;
2193 
2194   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT1_THS,
2195                            (uint8_t *)&int1_ths, 1);
2196   *val = int1_ths.ths;
2197 
2198   return ret;
2199 }
2200 
2201 /**
2202   * @brief  Configure the 6d on interrupt 2 generator.[set]
2203   *
2204   * @param  ctx         read / write interface definitions(ptr)
2205   * @param  val         change the values of 6d in reg INT2_CFG
2206   * @retval       interface status (MANDATORY: return 0 -> no Error)
2207   *
2208   */
lis331dlh_int2_6d_mode_set(const stmdev_ctx_t * ctx,lis331dlh_int2_6d_t val)2209 int32_t lis331dlh_int2_6d_mode_set(const stmdev_ctx_t *ctx,
2210                                    lis331dlh_int2_6d_t val)
2211 {
2212   lis331dlh_int2_cfg_t int2_cfg;
2213   int32_t ret;
2214 
2215   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_CFG,
2216                            (uint8_t *)&int2_cfg, 1);
2217 
2218   if (ret == 0)
2219   {
2220     int2_cfg._6d = (uint8_t)val & 0x01U;
2221     int2_cfg.aoi = ((uint8_t)val & 0x02U) >> 1;
2222     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT2_CFG,
2223                               (uint8_t *)&int2_cfg, 1);
2224   }
2225 
2226   return ret;
2227 }
2228 
2229 /**
2230   * @brief  Configure the 6d on interrupt 2 generator.[get]
2231   *
2232   * @param  ctx         read / write interface definitions(ptr)
2233   * @param  val         Get the values of 6d in reg INT2_CFG
2234   * @retval       interface status (MANDATORY: return 0 -> no Error)
2235   *
2236   */
lis331dlh_int2_6d_mode_get(const stmdev_ctx_t * ctx,lis331dlh_int2_6d_t * val)2237 int32_t lis331dlh_int2_6d_mode_get(const stmdev_ctx_t *ctx,
2238                                    lis331dlh_int2_6d_t *val)
2239 {
2240   lis331dlh_int2_cfg_t int2_cfg;
2241   int32_t ret;
2242 
2243   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_CFG,
2244                            (uint8_t *)&int2_cfg, 1);
2245 
2246   switch ((int2_cfg.aoi << 1) + int2_cfg._6d)
2247   {
2248     case LIS331DLH_6D_INT2_DISABLE:
2249       *val = LIS331DLH_6D_INT2_DISABLE;
2250       break;
2251 
2252     case LIS331DLH_6D_INT2_MOVEMENT:
2253       *val = LIS331DLH_6D_INT2_MOVEMENT;
2254       break;
2255 
2256     case LIS331DLH_6D_INT2_POSITION:
2257       *val = LIS331DLH_6D_INT2_POSITION;
2258       break;
2259 
2260     default:
2261       *val = LIS331DLH_6D_INT2_DISABLE;
2262       break;
2263   }
2264 
2265   return ret;
2266 }
2267 
2268 /**
2269   * @brief  6D on interrupt generator 2 source register.[get]
2270   *
2271   * @param  ctx         read / write interface definitions(ptr)
2272   * @param  val         registers INT2_SRC
2273   * @retval       interface status (MANDATORY: return 0 -> no Error)
2274   *
2275   */
lis331dlh_int2_6d_src_get(const stmdev_ctx_t * ctx,lis331dlh_int2_src_t * val)2276 int32_t lis331dlh_int2_6d_src_get(const stmdev_ctx_t *ctx,
2277                                   lis331dlh_int2_src_t *val)
2278 {
2279   int32_t ret;
2280 
2281   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_SRC, (uint8_t *) val, 1);
2282 
2283   return ret;
2284 }
2285 
2286 /**
2287   * @brief  Interrupt 2 threshold.[set]
2288   *
2289   * @param  ctx         read / write interface definitions(ptr)
2290   * @param  val         change the values of ths in reg INT2_THS
2291   * @retval       interface status (MANDATORY: return 0 -> no Error)
2292   *
2293   */
lis331dlh_int2_6d_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)2294 int32_t lis331dlh_int2_6d_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
2295 {
2296   lis331dlh_int2_ths_t int2_ths;
2297   int32_t ret;
2298 
2299   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_THS,
2300                            (uint8_t *)&int2_ths, 1);
2301 
2302   if (ret == 0)
2303   {
2304     int2_ths.ths = val;
2305     ret = lis331dlh_write_reg(ctx, LIS331DLH_INT2_THS,
2306                               (uint8_t *)&int2_ths, 1);
2307   }
2308 
2309   return ret;
2310 }
2311 
2312 /**
2313   * @brief  Interrupt 2 threshold.[get]
2314   *
2315   * @param  ctx         read / write interface definitions(ptr)
2316   * @param  val         change the values of ths in reg INT2_THS
2317   * @retval       interface status (MANDATORY: return 0 -> no Error)
2318   *
2319   */
lis331dlh_int2_6d_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)2320 int32_t lis331dlh_int2_6d_threshold_get(const stmdev_ctx_t *ctx,
2321                                         uint8_t *val)
2322 {
2323   lis331dlh_int2_ths_t int2_ths;
2324   int32_t ret;
2325 
2326   ret = lis331dlh_read_reg(ctx, LIS331DLH_INT2_THS,
2327                            (uint8_t *)&int2_ths, 1);
2328   *val = int2_ths.ths;
2329 
2330   return ret;
2331 }
2332 
2333 /**
2334   * @}
2335   *
2336   */
2337 
2338 /**
2339   * @}
2340   *
2341   */
2342 
2343 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2344