├── README.md
├── examples
├── LSM6DSOX_FIFO_Interrupt
│ └── LSM6DSOX_FIFO_Interrupt.ino
├── LSM6DSOX_FIFO_Polling
│ └── LSM6DSOX_FIFO_Polling.ino
└── LSM6DSOX_HelloWorld
│ └── LSM6DSOX_HelloWorld.ino
├── keywords.txt
├── library.properties
└── src
├── LSM6DSOXSensor.cpp
├── LSM6DSOXSensor.h
├── lsm6dsox_reg.c
└── lsm6dsox_reg.h
/README.md:
--------------------------------------------------------------------------------
1 | # LSM6DSOX
2 | Arduino library to support the LSM6DSOX 3D accelerometer and 3D gyroscope
3 |
4 | ## API
5 |
6 | This sensor uses I2C or SPI to communicate.
7 | For I2C it is then required to create a TwoWire interface before accessing to the sensors:
8 |
9 | TwoWire dev_i2c(I2C_SDA, I2C_SCL);
10 | dev_i2c.begin();
11 |
12 | For SPI it is then required to create a SPI interface before accessing to the sensors:
13 |
14 | SPIClass dev_spi(SPI_MOSI, SPI_MISO, SPI_SCK);
15 | dev_spi.begin();
16 |
17 | An instance can be created and enabled when the I2C bus is used following the procedure below:
18 |
19 | LSM6DSOXSensor AccGyr(&dev_i2c);
20 | AccGyr.begin();
21 | AccGyr.Enable_X();
22 | AccGyr.Enable_G();
23 |
24 | An instance can be created and enabled when the SPI bus is used following the procedure below:
25 |
26 | LSM6DSOXSensor AccGyr(&dev_spi, CS_PIN);
27 | AccGyr.begin();
28 | AccGyr.Enable_X();
29 | AccGyr.Enable_G();
30 |
31 | The access to the sensor values is done as explained below:
32 |
33 | Read accelerometer and gyroscope.
34 |
35 | int32_t accelerometer[3];
36 | int32_t gyroscope[3];
37 | AccGyr.Get_X_Axes(accelerometer);
38 | AccGyr.Get_G_Axes(gyroscope);
39 |
40 | ## Documentation
41 |
42 | You can find the source files at
43 | https://github.com/stm32duino/LSM6DSOX
44 |
45 | The LSM6DSOX datasheet is available at
46 | https://www.st.com/content/st_com/en/products/mems-and-sensors/inemo-inertial-modules/lsm6dsox.html
47 |
--------------------------------------------------------------------------------
/examples/LSM6DSOX_FIFO_Interrupt/LSM6DSOX_FIFO_Interrupt.ino:
--------------------------------------------------------------------------------
1 | /**
2 | ******************************************************************************
3 | * @file LSM6DSOX_FIFO_Interrupt.ino
4 | * @author alvaro-oliver
5 | * @version V1.0.0
6 | * @date May 2021
7 | * @brief Example for LSM6DSOX library with FIFO status interrupts.
8 | ******************************************************************************
9 | * @attention
10 | *
11 | *
© COPYRIGHT(c) 2019 STMicroelectronics
12 | *
13 | * Redistribution and use in source and binary forms, with or without modification,
14 | * are permitted provided that the following conditions are met:
15 | * 1. Redistributions of source code must retain the above copyright notice,
16 | * this list of conditions and the following disclaimer.
17 | * 2. Redistributions in binary form must reproduce the above copyright notice,
18 | * this list of conditions and the following disclaimer in the documentation
19 | * and/or other materials provided with the distribution.
20 | * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 | * may be used to endorse or promote products derived from this software
22 | * without specific prior written permission.
23 | *
24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 | *
35 | ******************************************************************************
36 | */
37 |
38 | /* WIRING
39 | In order to use the Adafruit lsm6dsox sensor with a ST nucleo board,
40 | plug Nucleo "+3.3V" to AdafruitLSM6DOX "VIN",
41 | plug Nucleo "GND" to AdafruitLSM6DOX "GND",
42 | plug Nucleo "SCL"(D15) to AdafruitLSM6DOX "SCL",
43 | plug Nucleo "SDA"(D14) to AdafruitLSM6DOX "SDA",
44 | plug Nucleo "A0" to AdafruitLSM6DOX "I1".*/
45 |
46 | #include "LSM6DSOXSensor.h"
47 |
48 | #define SR 104.0f // Sample rate. Options are: 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333 and 6667 Hz
49 | #define WTM_LV 199 // Watermark threshold level. Max samples in this FIFO configuration is 512 (accel and gyro only).
50 |
51 | // Define interrupt pins according to MCU board and sensor wiring.
52 | #define INT1_pin A0 // MCU input pin connected to sensor INT1 output pin
53 |
54 | /** LSM6DSOX i2c address:
55 | * LSM6DSOX_I2C_ADD_L: 0x6A (default)
56 | * LSM6DSOX_I2C_ADD_H: 0x6B
57 | **/
58 | LSM6DSOXSensor lsm6dsoxSensor = LSM6DSOXSensor(&Wire, LSM6DSOX_I2C_ADD_L);
59 |
60 | volatile uint8_t fullFlag = 0; // FIFO full flag
61 |
62 | // ISR callback for INT1
63 | void INT1_fullEvent_cb() {
64 | fullFlag = 1;
65 | }
66 |
67 | void setup() {
68 |
69 | Serial.begin(921600);
70 | // Comment this line to skip waiting for serial:
71 | while(!Serial) delay(10);
72 |
73 | // i2c, fast mode
74 | Wire.begin();
75 | Wire.setClock(400000);
76 |
77 | // Interrupt pin settings
78 | pinMode(INT1_pin, INPUT);
79 | attachInterrupt(digitalPinToInterrupt(INT1_pin), INT1_fullEvent_cb, RISING); // attach watermark event to INT1 input pin
80 |
81 | // Initialize sensors
82 | lsm6dsoxSensor.begin();
83 | if (lsm6dsoxSensor.Enable_G() == LSM6DSOX_OK && lsm6dsoxSensor.Enable_X() == LSM6DSOX_OK) {
84 | Serial.println("Success enabling accelero and gyro");
85 | } else {
86 | Serial.println("Error enabling accelero and gyro");
87 | abort();
88 | }
89 |
90 | // Check device id
91 | uint8_t id;
92 | lsm6dsoxSensor.ReadID(&id);
93 | if (id != LSM6DSOX_ID) {
94 | Serial.println("Wrong id for LSM6DSOX sensor. Check that device is plugged");
95 | abort();
96 | } else {
97 | Serial.println("Success checking id for LSM6DSOX sensor");
98 | }
99 |
100 | // Set accelerometer scale. Available values are: 2, 4, 8, 16 G
101 | lsm6dsoxSensor.Set_X_FS(2);
102 | // Set gyroscope scale. Available values are: 125, 250, 500, 1000, 2000 dps
103 | lsm6dsoxSensor.Set_G_FS(250);
104 |
105 | // Set accelerometer Output Data Rate. Available values are: 1.6, 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333, 6667 Hz
106 | lsm6dsoxSensor.Set_X_ODR(SR);
107 | // Set gyroscope Output Data Rate. Available values are 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333, 6667 Hz
108 | lsm6dsoxSensor.Set_G_ODR(SR);
109 |
110 | // Set FIFO Batch Data Rate for accelerometer and gyroscope. Available values are: 0, 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333, 6667 Hz
111 | lsm6dsoxSensor.Set_FIFO_X_BDR(SR);
112 | lsm6dsoxSensor.Set_FIFO_G_BDR(SR);
113 |
114 | /** Set FIFO operation mode. Available values are:
115 | * LSM6DSOX_BYPASS_MODE: FIFO is not used, the buffer content is cleared
116 | * LSM6DSOX_FIFO_MODE: bufer continues filling until it becomes full. Then it stops collecting data.
117 | * LSM6DSOX_STREAM_MODE: continuous mode. Older data are replaced by the new data.
118 | * LSM6DSOX_STREAM_TO_FIFO_MODE: FIFO buffer starts operating in Continuous mode and switches to FIFO mode when an event condition occurs.
119 | * LSM6DSOX_BYPASS_TO_STREAM_MODE: FIFO buffer starts operating in Bypass mode and switches to Continuous mode when an event condition occurs.
120 | * */
121 | lsm6dsoxSensor.Set_FIFO_Mode(LSM6DSOX_BYPASS_MODE); // flush any previous value in FIFO before start
122 |
123 | lsm6dsoxSensor.Set_FIFO_INT1_FIFO_Full(1); // enable FIFO full interrupt on sensor INT1 pin
124 |
125 | // Set FIFO watermark level. Can be used to check when the number of samples in buffer reaches this defined threshold level.
126 | lsm6dsoxSensor.Set_FIFO_Watermark_Level(WTM_LV);
127 |
128 | // FIFO size can be limited to the watermark level by setting the STOP_ON_WTM flag to 1
129 | lsm6dsoxSensor.Set_FIFO_Stop_On_Fth(1);
130 |
131 | // start batching in continous mode
132 | lsm6dsoxSensor.Set_FIFO_Mode(LSM6DSOX_STREAM_MODE);
133 |
134 | Serial.println("Starting...");
135 | }
136 |
137 | void loop() {
138 |
139 | uint16_t numSamples = 0; // number of samples in FIFO
140 | uint8_t Tag; // FIFO data sensor identifier
141 | int32_t acceleration[3]; // X, Y, Z accelerometer values in mg
142 | int32_t rotation[3]; // X, Y, Z giroscope values in mdps
143 | int16_t dummy[3];
144 | uint8_t fullStatus = 0; // full status
145 | int32_t count_acc_samples = 0;
146 | int32_t count_gyro_samples = 0;
147 | int32_t count_dummy_samples = 0;
148 |
149 | // Get number of samples in buffer
150 | lsm6dsoxSensor.Get_FIFO_Num_Samples(&numSamples);
151 | Serial.print("Samples in FIFO: ");
152 | Serial.println(numSamples);
153 | Serial.flush();
154 |
155 | // Check if FIFO threshold level was reached.
156 | if (fullFlag != 0) {
157 | fullFlag = 0;
158 |
159 | lsm6dsoxSensor.Get_FIFO_Full_Status(&fullStatus);
160 |
161 | if(fullStatus) {
162 | Serial.println("-- FIFO Watermark level reached!, fetching data.");
163 | Serial.flush();
164 |
165 | lsm6dsoxSensor.Get_FIFO_Num_Samples(&numSamples);
166 |
167 | Serial.print("numSamples=");
168 | Serial.println(numSamples);
169 | Serial.flush();
170 |
171 | // fetch data from FIFO
172 | for (uint16_t i = 0; i < numSamples; i++) {
173 |
174 | lsm6dsoxSensor.Get_FIFO_Tag(&Tag); // get data identifier
175 |
176 | // Get gyroscope data
177 | if (Tag == 1) {
178 | lsm6dsoxSensor.Get_FIFO_G_Axes(rotation);
179 | count_gyro_samples++;
180 | #if 1 // set to 1 for printing values
181 | Serial.print("mdps: "); Serial.print(rotation[0]);
182 | Serial.print(", "); Serial.print(rotation[1]);
183 | Serial.print(", "); Serial.print(rotation[2]);
184 | Serial.println();
185 | Serial.flush();
186 | #endif
187 | }
188 |
189 | // Get accelerometer data
190 | else if (Tag == 2) {
191 | lsm6dsoxSensor.Get_FIFO_X_Axes(acceleration);
192 | count_acc_samples++;
193 | #if 1 // set to 1 for printing values
194 | Serial.print("mG: "); Serial.print(acceleration[0]);
195 | Serial.print(", "); Serial.print(acceleration[1]);
196 | Serial.print(", "); Serial.print(acceleration[2]);
197 | Serial.println();
198 | Serial.flush();
199 | #endif
200 | }
201 |
202 | // Flush unused tag
203 | else {
204 | lsm6dsoxSensor.Get_FIFO_Data((uint8_t *)dummy);
205 | count_dummy_samples++;
206 | }
207 | }
208 | Serial.print("Acc Samples: ");
209 | Serial.println(count_acc_samples);
210 | Serial.print("Gyro Samples: ");
211 | Serial.println(count_gyro_samples);
212 | Serial.print("Dummy Samples: ");
213 | Serial.println(count_dummy_samples);
214 | Serial.flush();
215 | }
216 | }
217 | }
218 |
--------------------------------------------------------------------------------
/examples/LSM6DSOX_FIFO_Polling/LSM6DSOX_FIFO_Polling.ino:
--------------------------------------------------------------------------------
1 | /**
2 | ******************************************************************************
3 | * @file LSM6DSOX_FIFO_Polling.ino
4 | * @author alvaro-oliver
5 | * @version V1.0.1
6 | * @date May 2021
7 | * @brief Example for LSM6DSOX library with FIFO status polling.
8 | ******************************************************************************
9 | * @attention
10 | *
11 | * © COPYRIGHT(c) 2019 STMicroelectronics
12 | *
13 | * Redistribution and use in source and binary forms, with or without modification,
14 | * are permitted provided that the following conditions are met:
15 | * 1. Redistributions of source code must retain the above copyright notice,
16 | * this list of conditions and the following disclaimer.
17 | * 2. Redistributions in binary form must reproduce the above copyright notice,
18 | * this list of conditions and the following disclaimer in the documentation
19 | * and/or other materials provided with the distribution.
20 | * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 | * may be used to endorse or promote products derived from this software
22 | * without specific prior written permission.
23 | *
24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 | *
35 | ******************************************************************************
36 | */
37 |
38 | /* WIRING
39 | In order to use the Adafruit lsm6dsox sensor with a ST nucleo board,
40 | plug Nucleo "+3.3V" to AdafruitLSM6DOX "VIN",
41 | plug Nucleo "GND" to AdafruitLSM6DOX "GND",
42 | plug Nucleo "SCL"(D15) to AdafruitLSM6DOX "SCL",
43 | plug Nucleo "SDA"(D14) to AdafruitLSM6DOX "SDA".*/
44 |
45 | #include "LSM6DSOXSensor.h"
46 |
47 | #define SR 104 // Sample rate. Options are: 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333 and 6667 Hz.
48 | #define WTM_LV 199 // Watermark threshold level. Max samples in this FIFO configuration is 512 (accel and gyro only).
49 |
50 | /** LSM6DSOX i2c address:
51 | * LSM6DSOX_I2C_ADD_L: 0x6A (default)
52 | * LSM6DSOX_I2C_ADD_H: 0x6B
53 | **/
54 | LSM6DSOXSensor lsm6dsoxSensor = LSM6DSOXSensor(&Wire, LSM6DSOX_I2C_ADD_L);
55 |
56 | void setup() {
57 |
58 | Serial.begin(921600);
59 | // Comment this line to skip waiting for serial:
60 | while(!Serial) delay(10);
61 |
62 | // i2c, fast mode
63 | Wire.begin();
64 | Wire.setClock(400000);
65 |
66 | // Initialize sensors
67 | lsm6dsoxSensor.begin();
68 | if (lsm6dsoxSensor.Enable_G() == LSM6DSOX_OK && lsm6dsoxSensor.Enable_X() == LSM6DSOX_OK) {
69 | Serial.println("Success enabling accelero and gyro");
70 | } else {
71 | Serial.println("Error enabling accelero and gyro");
72 | abort();
73 | }
74 |
75 | // Check device id
76 | uint8_t id;
77 | lsm6dsoxSensor.ReadID(&id);
78 | if (id != LSM6DSOX_ID) {
79 | Serial.println("Wrong id for LSM6DSOX sensor. Check that device is plugged");
80 | abort();
81 | } else {
82 | Serial.println("Success checking id for LSM6DSOX sensor");
83 | }
84 |
85 | // Set accelerometer scale. Available values are: 2, 4, 8, 16 G
86 | lsm6dsoxSensor.Set_X_FS(2);
87 | // Set gyroscope scale. Available values are: 125, 250, 500, 1000, 2000 dps
88 | lsm6dsoxSensor.Set_G_FS(250);
89 |
90 | // Set accelerometer Output Data Rate. Available values are: 1.6, 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333, 6667 Hz
91 | lsm6dsoxSensor.Set_X_ODR(SR);
92 | // Set gyroscope Output Data Rate. Available values are 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333, 6667 Hz
93 | lsm6dsoxSensor.Set_G_ODR(SR);
94 |
95 | // Set FIFO Batch Data Rate for accelerometer and gyroscope. Available values are: 0, 12.5, 26, 52, 104, 208, 417, 833, 1667, 3333, 6667 Hz
96 | lsm6dsoxSensor.Set_FIFO_X_BDR(SR);
97 | lsm6dsoxSensor.Set_FIFO_G_BDR(SR);
98 |
99 | /** Set FIFO operation mode. Available values are:
100 | * LSM6DSOX_BYPASS_MODE: FIFO is not used, the buffer content is cleared
101 | * LSM6DSOX_FIFO_MODE: bufer continues filling until it becomes full. Then it stops collecting data.
102 | * LSM6DSOX_STREAM_MODE: continuous mode. Older data are replaced by the new data.
103 | * LSM6DSOX_STREAM_TO_FIFO_MODE: FIFO buffer starts operating in Continuous mode and switches to FIFO mode when an event condition occurs.
104 | * LSM6DSOX_BYPASS_TO_STREAM_MODE: FIFO buffer starts operating in Bypass mode and switches to Continuous mode when an event condition occurs.
105 | * */
106 | lsm6dsoxSensor.Set_FIFO_Mode(LSM6DSOX_BYPASS_MODE); // flush any previous value in FIFO before start
107 | lsm6dsoxSensor.Set_FIFO_Mode(LSM6DSOX_STREAM_MODE); // start batching in continous mode
108 |
109 | // Set FIFO watermark level. Can be used to check when the number of samples in buffer reaches this defined threshold level.
110 | lsm6dsoxSensor.Set_FIFO_Watermark_Level(WTM_LV);
111 |
112 | // FIFO size can be limited to the watermark level by setting the STOP_ON_WTM flag to 1
113 | //lsm6dsoxSensor.Set_FIFO_Stop_On_Fth(1);
114 |
115 | Serial.println("Starting...");
116 | }
117 |
118 | void loop() {
119 |
120 | static uint8_t wtmStatus = 0; // FIFO watermark status
121 | uint8_t fullStatus = 0; // FIFO full status
122 | uint16_t numSamples = 0; // number of samples in FIFO
123 | uint8_t Tag; // FIFO data sensor identifier
124 | int32_t acceleration[3]; // X, Y, Z accelerometer values in mg
125 | int32_t rotation[3]; // X, Y, Z giroscope values in mdps
126 |
127 | // Get number of samples in buffer
128 | lsm6dsoxSensor.Get_FIFO_Num_Samples(&numSamples);
129 | Serial.print("Samples in FIFO: "); Serial.println(numSamples);
130 | Serial.flush();
131 |
132 | // Check if FIFO threshold level was reached.
133 | lsm6dsoxSensor.Get_FIFO_Watermark_Status(&wtmStatus);
134 |
135 | if (wtmStatus != 0) {
136 | Serial.println("-- FIFO Watermark level reached!, fetching data.");
137 | Serial.flush();
138 |
139 | // fetch data from FIFO
140 | for (uint16_t i = 0; i < WTM_LV; i++) {
141 |
142 | lsm6dsoxSensor.Get_FIFO_Tag(&Tag); // get data identifier
143 |
144 | // Get gyroscope data
145 | if (Tag == 1) {
146 | lsm6dsoxSensor.Get_FIFO_G_Axes(rotation);
147 | #if 1 // set to 1 for printing values
148 | Serial.print("mdps: "); Serial.print(rotation[0]);
149 | Serial.print(", "); Serial.print(rotation[1]);
150 | Serial.print(", "); Serial.print(rotation[2]);
151 | Serial.println();
152 | Serial.flush();
153 | #endif
154 | }
155 |
156 | // Get accelerometer data
157 | else if (Tag == 2) {
158 | lsm6dsoxSensor.Get_FIFO_X_Axes(acceleration);
159 | #if 1 // set to 1 for printing values
160 | Serial.print("mG: "); Serial.print(acceleration[0]);
161 | Serial.print(", "); Serial.print(acceleration[1]);
162 | Serial.print(", "); Serial.print(acceleration[2]);
163 | Serial.println();
164 | Serial.flush();
165 | #endif
166 | }
167 | }
168 | }
169 |
170 | // Check if FIFO is full.
171 | lsm6dsoxSensor.Get_FIFO_Full_Status(&fullStatus);
172 |
173 | if (fullStatus != 0) {
174 | Serial.println("-- FIFO is full!, consider reducing Watermark Level or Buffer Data Rate.\nFlushing data from FIFO.");
175 | Serial.flush();
176 | lsm6dsoxSensor.Set_FIFO_Mode(LSM6DSOX_BYPASS_MODE); // flush FIFO data
177 | lsm6dsoxSensor.Set_FIFO_Mode(LSM6DSOX_STREAM_MODE); // continue batching
178 | }
179 |
180 | delay(10); // FIFO continues batching while we sleep
181 | }
182 |
--------------------------------------------------------------------------------
/examples/LSM6DSOX_HelloWorld/LSM6DSOX_HelloWorld.ino:
--------------------------------------------------------------------------------
1 | /**
2 | ******************************************************************************
3 | @file LSM6DSOX_HelloWorld.ino
4 | @author Benhalor
5 | @version V1.0.1
6 | @date January 2020
7 | @brief Basic example for using the LSM6DSOX library .
8 | ******************************************************************************
9 | @attention
10 | © COPYRIGHT(c) 2019 STMicroelectronics
11 | Redistribution and use in source and binary forms, with or without modification,
12 | are permitted provided that the following conditions are met:
13 | 1. Redistributions of source code must retain the above copyright notice,
14 | this list of conditions and the following disclaimer.
15 | 2. Redistributions in binary form must reproduce the above copyright notice,
16 | this list of conditions and the following disclaimer in the documentation
17 | and/or other materials provided with the distribution.
18 | 3. Neither the name of STMicroelectronics nor the names of its contributors
19 | may be used to endorse or promote products derived from this software
20 | without specific prior written permission.
21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 | ******************************************************************************
32 | */
33 |
34 | /* WIRING
35 | In order to use the Adafruit lsm6dsox sensor with a ST nucleo board,
36 | plug Nucleo "+3.3V" to AdafruitLSM6DOX "VIN",
37 | plug Nucleo "GND" to AdafruitLSM6DOX "GND",
38 | plug Nucleo "SCL"(D15) to AdafruitLSM6DOX "SCL",
39 | plug Nucleo "SDA"(D14) to AdafruitLSM6DOX "SDA".*/
40 |
41 | #include "LSM6DSOXSensor.h"
42 |
43 | // Declare LSM6DSOX sensor. Sensor address can have 2 values LSM6DSOX_I2C_ADD_L (corresponds to 0x6A I2C address) or LSM6DSOX_I2C_ADD_H (corresponds to 0x6B I2C address)
44 | // On Adafruit lsm6dsox sensor, LSM6DSOX_I2C_ADD_L is the default address
45 | LSM6DSOXSensor lsm6dsoxSensor = LSM6DSOXSensor(&Wire, LSM6DSOX_I2C_ADD_L);
46 |
47 | void setup() {
48 | Serial.begin(115200);
49 | Wire.begin();
50 |
51 | // Default clock is 100kHz. LSM6DSOX also supports 400kHz, let's use it
52 | Wire.setClock(400000);
53 |
54 | // Init the sensor
55 | lsm6dsoxSensor.begin();
56 |
57 | // Enable accelerometer and gyroscope, and check success
58 | if (lsm6dsoxSensor.Enable_X() == LSM6DSOX_OK && lsm6dsoxSensor.Enable_G() == LSM6DSOX_OK) {
59 | Serial.println("Success enabling accelero and gyro");
60 | } else {
61 | Serial.println("Error enabling accelero and gyro");
62 | }
63 |
64 | // Read ID of device and check that it is correct
65 | uint8_t id;
66 | lsm6dsoxSensor.ReadID(&id);
67 | if (id != LSM6DSOX_ID) {
68 | Serial.println("Wrong ID for LSM6DSOX sensor. Check that device is plugged");
69 | } else {
70 | Serial.println("Receviced correct ID for LSM6DSOX sensor");
71 | }
72 |
73 | // Set accelerometer scale at +- 2G. Available values are +- 2, 4, 8, 16 G
74 | lsm6dsoxSensor.Set_X_FS(2);
75 |
76 | // Set gyroscope scale at +- 125 degres per second. Available values are +- 125, 250, 500, 1000, 2000 dps
77 | lsm6dsoxSensor.Set_G_FS(125);
78 |
79 |
80 | // Set Accelerometer sample rate to 208 Hz. Available values are +- 12.0, 26.0, 52.0, 104.0, 208.0, 416.0, 833.0, 1667.0, 3333.0, 6667.0 Hz
81 | lsm6dsoxSensor.Set_X_ODR(208.0f);
82 |
83 |
84 | // Set Gyroscope sample rate to 208 Hz. Available values are +- 12.0, 26.0, 52.0, 104.0, 208.0, 416.0, 833.0, 1667.0, 3333.0, 6667.0 Hz
85 | lsm6dsoxSensor.Set_G_ODR(208.0f);
86 |
87 |
88 | }
89 |
90 | void loop() {
91 |
92 | // Read accelerometer
93 | uint8_t acceleroStatus;
94 | lsm6dsoxSensor.Get_X_DRDY_Status(&acceleroStatus);
95 | if (acceleroStatus == 1) { // Status == 1 means a new data is available
96 | int32_t acceleration[3];
97 | lsm6dsoxSensor.Get_X_Axes(acceleration);
98 | // Plot data for each axis in mg
99 | Serial.print("AccelerationX="); Serial.print(acceleration[0]); Serial.print("mg, AccelerationY="); Serial.print(acceleration[1]); Serial.print("mg, AccelerationZ="); Serial.print(acceleration[2]); Serial.println("mg");
100 | }
101 |
102 | // Read gyroscope
103 | uint8_t gyroStatus;
104 | lsm6dsoxSensor.Get_G_DRDY_Status(&gyroStatus);
105 | if (gyroStatus == 1) { // Status == 1 means a new data is available
106 | int32_t rotation[3];
107 | lsm6dsoxSensor.Get_G_Axes(rotation);
108 | // Plot data for each axis in milli degrees per second
109 | Serial.print("RotationX="); Serial.print(rotation[0]); Serial.print("mdps, RotationY="); Serial.print(rotation[1]); Serial.print("mdps, RotationZ="); Serial.print(rotation[2]); Serial.println("mdps");
110 | }
111 |
112 | delay(10);
113 |
114 | }
--------------------------------------------------------------------------------
/keywords.txt:
--------------------------------------------------------------------------------
1 | #######################################
2 | # Syntax Coloring Map For LSM6DSOX
3 | #######################################
4 |
5 | #######################################
6 | # Datatypes (KEYWORD1)
7 | #######################################
8 |
9 | LSM6DSOXSensor KEYWORD1
10 |
11 | #######################################
12 | # Methods and Functions (KEYWORD2)
13 | #######################################
14 |
15 | begin KEYWORD2
16 | end KEYWORD2
17 | ReadID KEYWORD2
18 | Enable_X KEYWORD2
19 | Disable_X KEYWORD2
20 | Get_X_Sensitivity KEYWORD2
21 | Get_X_ODR KEYWORD2
22 | Set_X_ODR KEYWORD2
23 | Set_X_ODR_With_Mode KEYWORD2
24 | Get_X_FS KEYWORD2
25 | Set_X_FS KEYWORD2
26 | Get_X_AxesRaw KEYWORD2
27 | Get_X_Axes KEYWORD2
28 | Enable_G KEYWORD2
29 | Disable_G KEYWORD2
30 | Get_G_Sensitivity KEYWORD2
31 | Get_G_ODR KEYWORD2
32 | Set_G_ODR KEYWORD2
33 | Set_G_ODR_With_Mode KEYWORD2
34 | Get_G_FS KEYWORD2
35 | Set_G_FS KEYWORD2
36 | Get_G_AxesRaw KEYWORD2
37 | Get_G_Axes KEYWORD2
38 | Read_Reg KEYWORD2
39 | Write_Reg KEYWORD2
40 | Set_Interrupt_Latch KEYWORD2
41 | Enable_Free_Fall_Detection KEYWORD2
42 | Disable_Free_Fall_Detection KEYWORD2
43 | Set_Free_Fall_Threshold KEYWORD2
44 | Set_Free_Fall_Duration KEYWORD2
45 | Enable_Pedometer KEYWORD2
46 | Disable_Pedometer KEYWORD2
47 | Get_Step_Count KEYWORD2
48 | Step_Counter_Reset KEYWORD2
49 | Enable_Tilt_Detection KEYWORD2
50 | Disable_Tilt_Detection KEYWORD2
51 | Enable_Wake_Up_Detection KEYWORD2
52 | Disable_Wake_Up_Detection KEYWORD2
53 | Set_Wake_Up_Threshold KEYWORD2
54 | Set_Wake_Up_Duration KEYWORD2
55 | Enable_Single_Tap_Detection KEYWORD2
56 | Disable_Single_Tap_Detection KEYWORD2
57 | Enable_Double_Tap_Detection KEYWORD2
58 | Disable_Double_Tap_Detection KEYWORD2
59 | Set_Tap_Threshold KEYWORD2
60 | Set_Tap_Shock_Time KEYWORD2
61 | Set_Tap_Quiet_Time KEYWORD2
62 | Set_Tap_Duration_Time KEYWORD2
63 | Enable_6D_Orientation KEYWORD2
64 | Disable_6D_Orientation KEYWORD2
65 | Set_6D_Orientation_Threshold KEYWORD2
66 | Get_6D_Orientation_XL KEYWORD2
67 | Get_6D_Orientation_XH KEYWORD2
68 | Get_6D_Orientation_YL KEYWORD2
69 | Get_6D_Orientation_YH KEYWORD2
70 | Get_6D_Orientation_ZL KEYWORD2
71 | Get_6D_Orientation_ZH KEYWORD2
72 | Get_X_DRDY_Status KEYWORD2
73 | Get_X_Event_Status KEYWORD2
74 | Set_X_SelfTest KEYWORD2
75 | Get_G_DRDY_Status KEYWORD2
76 | Set_G_SelfTest KEYWORD2
77 | Get_FIFO_Num_Samples KEYWORD2
78 | Get_FIFO_Full_Status KEYWORD2
79 | Set_FIFO_INT1_FIFO_Full KEYWORD2
80 | Set_FIFO_Watermark_Level KEYWORD2
81 | Set_FIFO_Stop_On_Fth KEYWORD2
82 | Set_FIFO_Mode KEYWORD2
83 | Get_FIFO_Tag KEYWORD2
84 | Get_FIFO_Data KEYWORD2
85 | Get_FIFO_X_Axes KEYWORD2
86 | Set_FIFO_X_BDR KEYWORD2
87 | Get_FIFO_G_Axes KEYWORD2
88 | Set_FIFO_G_BDR KEYWORD2
89 | Get_MLC_Status KEYWORD2
90 | Get_MLC_Output KEYWORD2
91 |
92 | #######################################
93 | # Constants (LITERAL1)
94 | #######################################
95 |
96 | LSM6DSOX_OK LITERAL1
97 | LSM6DSOX_ERROR LITERAL1
98 | LSM6DSOX_INT1_PIN LITERAL1
99 | LSM6DSOX_INT2_PIN LITERAL1
100 | LSM6DSOX_ACC_SENSITIVITY_FS_2G LITERAL1
101 | LSM6DSOX_ACC_SENSITIVITY_FS_4G LITERAL1
102 | LSM6DSOX_ACC_SENSITIVITY_FS_8G LITERAL1
103 | LSM6DSOX_ACC_SENSITIVITY_FS_16G LITERAL1
104 | LSM6DSOX_GYRO_SENSITIVITY_FS_125DPS LITERAL1
105 | LSM6DSOX_GYRO_SENSITIVITY_FS_250DPS LITERAL1
106 | LSM6DSOX_GYRO_SENSITIVITY_FS_500DPS LITERAL1
107 | LSM6DSOX_GYRO_SENSITIVITY_FS_1000DPS LITERAL1
108 | LSM6DSOX_GYRO_SENSITIVITY_FS_2000DPS LITERAL1
109 |
110 |
--------------------------------------------------------------------------------
/library.properties:
--------------------------------------------------------------------------------
1 | name=STM32duino LSM6DSOX
2 | version=2.3.4
3 | author=SRA
4 | maintainer=stm32duino
5 | sentence=Ultra Low Power inertial measurement unit.
6 | paragraph=This library provides Arduino support for the Ultra Low Power LSM6DSOX for STM32 boards.
7 | category=Sensors
8 | url=https://github.com/stm32duino/LSM6DSOX
9 | architectures=*
10 |
--------------------------------------------------------------------------------
/src/LSM6DSOXSensor.cpp:
--------------------------------------------------------------------------------
1 | /**
2 | ******************************************************************************
3 | * @file LSM6DSOXSensor.cpp
4 | * @author SRA
5 | * @version V1.0.0
6 | * @date February 2019
7 | * @brief Implementation of an LSM6DSOX Inertial Measurement Unit (IMU) 3 axes
8 | * sensor.
9 | ******************************************************************************
10 | * @attention
11 | *
12 | * © COPYRIGHT(c) 2019 STMicroelectronics
13 | *
14 | * Redistribution and use in source and binary forms, with or without modification,
15 | * are permitted provided that the following conditions are met:
16 | * 1. Redistributions of source code must retain the above copyright notice,
17 | * this list of conditions and the following disclaimer.
18 | * 2. Redistributions in binary form must reproduce the above copyright notice,
19 | * this list of conditions and the following disclaimer in the documentation
20 | * and/or other materials provided with the distribution.
21 | * 3. Neither the name of STMicroelectronics nor the names of its contributors
22 | * may be used to endorse or promote products derived from this software
23 | * without specific prior written permission.
24 | *
25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 | *
36 | ******************************************************************************
37 | */
38 |
39 |
40 | /* Includes ------------------------------------------------------------------*/
41 |
42 | #include "LSM6DSOXSensor.h"
43 |
44 |
45 | /* Class Implementation ------------------------------------------------------*/
46 |
47 | /** Constructor
48 | * @param i2c object of an helper class which handles the I2C peripheral
49 | * @param address the address of the component's instance
50 | */
51 | LSM6DSOXSensor::LSM6DSOXSensor(TwoWire *i2c, uint8_t address) : dev_i2c(i2c), address(address)
52 | {
53 | dev_spi = NULL;
54 | reg_ctx.write_reg = LSM6DSOX_io_write;
55 | reg_ctx.read_reg = LSM6DSOX_io_read;
56 | reg_ctx.handle = (void *)this;
57 | acc_is_enabled = 0U;
58 | gyro_is_enabled = 0U;
59 | }
60 |
61 | /** Constructor
62 | * @param spi object of an helper class which handles the SPI peripheral
63 | * @param cs_pin the chip select pin
64 | * @param spi_speed the SPI speed
65 | */
66 | LSM6DSOXSensor::LSM6DSOXSensor(SPIClass *spi, int cs_pin, uint32_t spi_speed) : dev_spi(spi), cs_pin(cs_pin), spi_speed(spi_speed)
67 | {
68 | reg_ctx.write_reg = LSM6DSOX_io_write;
69 | reg_ctx.read_reg = LSM6DSOX_io_read;
70 | reg_ctx.handle = (void *)this;
71 | dev_i2c = NULL;
72 | address = 0;
73 | acc_is_enabled = 0U;
74 | gyro_is_enabled = 0U;
75 | }
76 |
77 | /**
78 | * @brief Configure the sensor in order to be used
79 | * @retval 0 in case of success, an error code otherwise
80 | */
81 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::begin()
82 | {
83 | if(dev_spi)
84 | {
85 | // Configure CS pin
86 | pinMode(cs_pin, OUTPUT);
87 | digitalWrite(cs_pin, HIGH);
88 | }
89 |
90 | /* Disable I3C */
91 | if (lsm6dsox_i3c_disable_set(®_ctx, LSM6DSOX_I3C_DISABLE) != LSM6DSOX_OK)
92 | {
93 | return LSM6DSOX_ERROR;
94 | }
95 |
96 | /* Enable register address automatically incremented during a multiple byte
97 | access with a serial interface. */
98 | if (lsm6dsox_auto_increment_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
99 | {
100 | return LSM6DSOX_ERROR;
101 | }
102 |
103 | /* Enable BDU */
104 | if (lsm6dsox_block_data_update_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
105 | {
106 | return LSM6DSOX_ERROR;
107 | }
108 |
109 | /* FIFO mode selection */
110 | if (lsm6dsox_fifo_mode_set(®_ctx, LSM6DSOX_BYPASS_MODE) != LSM6DSOX_OK)
111 | {
112 | return LSM6DSOX_ERROR;
113 | }
114 |
115 | /* Select default output data rate. */
116 | acc_odr = LSM6DSOX_XL_ODR_104Hz;
117 |
118 | /* Output data rate selection - power down. */
119 | if (lsm6dsox_xl_data_rate_set(®_ctx, LSM6DSOX_XL_ODR_OFF) != LSM6DSOX_OK)
120 | {
121 | return LSM6DSOX_ERROR;
122 | }
123 |
124 | /* Full scale selection. */
125 | if (lsm6dsox_xl_full_scale_set(®_ctx, LSM6DSOX_2g) != LSM6DSOX_OK)
126 | {
127 | return LSM6DSOX_ERROR;
128 | }
129 |
130 | /* Select default output data rate. */
131 | gyro_odr = LSM6DSOX_GY_ODR_104Hz;
132 |
133 | /* Output data rate selection - power down. */
134 | if (lsm6dsox_gy_data_rate_set(®_ctx, LSM6DSOX_GY_ODR_OFF) != LSM6DSOX_OK)
135 | {
136 | return LSM6DSOX_ERROR;
137 | }
138 |
139 | /* Full scale selection. */
140 | if (lsm6dsox_gy_full_scale_set(®_ctx, LSM6DSOX_2000dps) != LSM6DSOX_OK)
141 | {
142 | return LSM6DSOX_ERROR;
143 | }
144 |
145 | acc_is_enabled = 0;
146 | gyro_is_enabled = 0;
147 |
148 | return LSM6DSOX_OK;
149 | }
150 |
151 | /**
152 | * @brief Disable the sensor and relative resources
153 | * @retval 0 in case of success, an error code otherwise
154 | */
155 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::end()
156 | {
157 | /* Disable both acc and gyro */
158 | if (Disable_X() != LSM6DSOX_OK)
159 | {
160 | return LSM6DSOX_ERROR;
161 | }
162 |
163 | if (Disable_G() != LSM6DSOX_OK)
164 | {
165 | return LSM6DSOX_ERROR;
166 | }
167 |
168 | /* Reset CS configuration */
169 | if(dev_spi)
170 | {
171 | // Configure CS pin
172 | pinMode(cs_pin, INPUT);
173 | }
174 |
175 | return LSM6DSOX_OK;
176 | }
177 |
178 |
179 | /**
180 | * @brief Read component ID
181 | * @param Id the WHO_AM_I value
182 | * @retval 0 in case of success, an error code otherwise
183 | */
184 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::ReadID(uint8_t *Id)
185 | {
186 | if (lsm6dsox_device_id_get(®_ctx, Id) != LSM6DSOX_OK)
187 | {
188 | return LSM6DSOX_ERROR;
189 | }
190 |
191 | return LSM6DSOX_OK;
192 | }
193 |
194 | /**
195 | * @brief Enable the LSM6DSOX accelerometer sensor
196 | * @retval 0 in case of success, an error code otherwise
197 | */
198 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_X()
199 | {
200 | /* Check if the component is already enabled */
201 | if (acc_is_enabled == 1U)
202 | {
203 | return LSM6DSOX_OK;
204 | }
205 |
206 | /* Output data rate selection. */
207 | if (lsm6dsox_xl_data_rate_set(®_ctx, acc_odr) != LSM6DSOX_OK)
208 | {
209 | return LSM6DSOX_ERROR;
210 | }
211 |
212 | acc_is_enabled = 1;
213 |
214 | return LSM6DSOX_OK;
215 | }
216 |
217 | /**
218 | * @brief Disable the LSM6DSOX accelerometer sensor
219 | * @retval 0 in case of success, an error code otherwise
220 | */
221 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_X()
222 | {
223 | /* Check if the component is already disabled */
224 | if (acc_is_enabled == 0U)
225 | {
226 | return LSM6DSOX_OK;
227 | }
228 |
229 | /* Get current output data rate. */
230 | if (lsm6dsox_xl_data_rate_get(®_ctx, &acc_odr) != LSM6DSOX_OK)
231 | {
232 | return LSM6DSOX_ERROR;
233 | }
234 |
235 | /* Output data rate selection - power down. */
236 | if (lsm6dsox_xl_data_rate_set(®_ctx, LSM6DSOX_XL_ODR_OFF) != LSM6DSOX_OK)
237 | {
238 | return LSM6DSOX_ERROR;
239 | }
240 |
241 | acc_is_enabled = 0;
242 |
243 | return LSM6DSOX_OK;
244 | }
245 |
246 | /**
247 | * @brief Get the LSM6DSOX accelerometer sensor sensitivity
248 | * @param Sensitivity pointer
249 | * @retval 0 in case of success, an error code otherwise
250 | */
251 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_Sensitivity(float *Sensitivity)
252 | {
253 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
254 | lsm6dsox_fs_xl_t full_scale;
255 |
256 | /* Read actual full scale selection from sensor. */
257 | if (lsm6dsox_xl_full_scale_get(®_ctx, &full_scale) != LSM6DSOX_OK)
258 | {
259 | return LSM6DSOX_ERROR;
260 | }
261 |
262 | /* Store the Sensitivity based on actual full scale. */
263 | switch (full_scale)
264 | {
265 | case LSM6DSOX_2g:
266 | *Sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_2G;
267 | break;
268 |
269 | case LSM6DSOX_4g:
270 | *Sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_4G;
271 | break;
272 |
273 | case LSM6DSOX_8g:
274 | *Sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_8G;
275 | break;
276 |
277 | case LSM6DSOX_16g:
278 | *Sensitivity = LSM6DSOX_ACC_SENSITIVITY_FS_16G;
279 | break;
280 |
281 | default:
282 | ret = LSM6DSOX_ERROR;
283 | break;
284 | }
285 |
286 | return ret;
287 | }
288 |
289 | /**
290 | * @brief Get the LSM6DSOX accelerometer sensor output data rate
291 | * @param Odr pointer where the output data rate is written
292 | * @retval 0 in case of success, an error code otherwise
293 | */
294 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_ODR(float *Odr)
295 | {
296 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
297 | lsm6dsox_odr_xl_t odr_low_level;
298 |
299 | /* Get current output data rate. */
300 | if (lsm6dsox_xl_data_rate_get(®_ctx, &odr_low_level) != LSM6DSOX_OK)
301 | {
302 | return LSM6DSOX_ERROR;
303 | }
304 |
305 | switch (odr_low_level)
306 | {
307 | case LSM6DSOX_XL_ODR_OFF:
308 | *Odr = 0.0f;
309 | break;
310 |
311 | case LSM6DSOX_XL_ODR_1Hz6:
312 | *Odr = 1.6f;
313 | break;
314 |
315 | case LSM6DSOX_XL_ODR_12Hz5:
316 | *Odr = 12.5f;
317 | break;
318 |
319 | case LSM6DSOX_XL_ODR_26Hz:
320 | *Odr = 26.0f;
321 | break;
322 |
323 | case LSM6DSOX_XL_ODR_52Hz:
324 | *Odr = 52.0f;
325 | break;
326 |
327 | case LSM6DSOX_XL_ODR_104Hz:
328 | *Odr = 104.0f;
329 | break;
330 |
331 | case LSM6DSOX_XL_ODR_208Hz:
332 | *Odr = 208.0f;
333 | break;
334 |
335 | case LSM6DSOX_XL_ODR_417Hz:
336 | *Odr = 417.0f;
337 | break;
338 |
339 | case LSM6DSOX_XL_ODR_833Hz:
340 | *Odr = 833.0f;
341 | break;
342 |
343 | case LSM6DSOX_XL_ODR_1667Hz:
344 | *Odr = 1667.0f;
345 | break;
346 |
347 | case LSM6DSOX_XL_ODR_3333Hz:
348 | *Odr = 3333.0f;
349 | break;
350 |
351 | case LSM6DSOX_XL_ODR_6667Hz:
352 | *Odr = 6667.0f;
353 | break;
354 |
355 | default:
356 | ret = LSM6DSOX_ERROR;
357 | break;
358 | }
359 |
360 | return ret;
361 | }
362 |
363 | /**
364 | * @brief Set the LSM6DSOX accelerometer sensor output data rate
365 | * @param Odr the output data rate value to be set
366 | * @retval 0 in case of success, an error code otherwise
367 | */
368 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_X_ODR(float Odr)
369 | {
370 | return Set_X_ODR_With_Mode(Odr, LSM6DSOX_ACC_HIGH_PERFORMANCE_MODE);
371 | }
372 |
373 | /**
374 | * @brief Set the LSM6DSOX accelerometer sensor output data rate with operating mode
375 | * @param Odr the output data rate value to be set
376 | * @param Mode the accelerometer operating mode
377 | * @note This function switches off the gyroscope if Ultra Low Power Mode is set
378 | * @retval 0 in case of success, an error code otherwise
379 | */
380 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_X_ODR_With_Mode(float Odr, LSM6DSOX_ACC_Operating_Mode_t Mode)
381 | {
382 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
383 |
384 | switch (Mode)
385 | {
386 | case LSM6DSOX_ACC_HIGH_PERFORMANCE_MODE:
387 | {
388 | /* We must uncheck Low Power and Ultra Low Power bits if they are enabled */
389 | lsm6dsox_ctrl5_c_t val1;
390 | lsm6dsox_ctrl6_c_t val2;
391 |
392 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
393 | {
394 | return LSM6DSOX_ERROR;
395 | }
396 |
397 | if (val1.xl_ulp_en)
398 | {
399 | /* Power off the accelerometer */
400 | if (acc_is_enabled == 1U)
401 | {
402 | if (lsm6dsox_xl_data_rate_set(®_ctx, LSM6DSOX_XL_ODR_OFF) != LSM6DSOX_OK)
403 | {
404 | return LSM6DSOX_ERROR;
405 | }
406 | }
407 |
408 | val1.xl_ulp_en = 0;
409 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
410 | {
411 | return LSM6DSOX_ERROR;
412 | }
413 | }
414 |
415 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != LSM6DSOX_OK)
416 | {
417 | return LSM6DSOX_ERROR;
418 | }
419 |
420 | if (val2.xl_hm_mode)
421 | {
422 | val2.xl_hm_mode = 0;
423 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != LSM6DSOX_OK)
424 | {
425 | return LSM6DSOX_ERROR;
426 | }
427 | }
428 |
429 | /* ODR should be at least 12.5Hz */
430 | if (Odr < 12.5f)
431 | {
432 | Odr = 12.5f;
433 | }
434 | break;
435 | }
436 | case LSM6DSOX_ACC_LOW_POWER_NORMAL_MODE:
437 | {
438 | /* We must uncheck Ultra Low Power bit if it is enabled */
439 | /* and check the Low Power bit if it is unchecked */
440 | lsm6dsox_ctrl5_c_t val1;
441 | lsm6dsox_ctrl6_c_t val2;
442 |
443 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
444 | {
445 | return LSM6DSOX_ERROR;
446 | }
447 |
448 | if (val1.xl_ulp_en)
449 | {
450 | /* Power off the accelerometer */
451 | if (acc_is_enabled == 1U)
452 | {
453 | if (lsm6dsox_xl_data_rate_set(®_ctx, LSM6DSOX_XL_ODR_OFF) != LSM6DSOX_OK)
454 | {
455 | return LSM6DSOX_ERROR;
456 | }
457 | }
458 |
459 | val1.xl_ulp_en = 0;
460 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
461 | {
462 | return LSM6DSOX_ERROR;
463 | }
464 | }
465 |
466 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != LSM6DSOX_OK)
467 | {
468 | return LSM6DSOX_ERROR;
469 | }
470 |
471 | if (!val2.xl_hm_mode)
472 | {
473 | val2.xl_hm_mode = 1U;
474 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != LSM6DSOX_OK)
475 | {
476 | return LSM6DSOX_ERROR;
477 | }
478 | }
479 |
480 | /* Now we need to limit the ODR to 208 Hz if it is higher */
481 | if (Odr > 208.0f)
482 | {
483 | Odr = 208.0f;
484 | }
485 | break;
486 | }
487 | case LSM6DSOX_ACC_ULTRA_LOW_POWER_MODE:
488 | {
489 | /* We must uncheck Low Power bit if it is enabled */
490 | /* and check the Ultra Low Power bit if it is unchecked */
491 | /* We must switch off gyro otherwise Ultra Low Power does not work */
492 | lsm6dsox_ctrl5_c_t val1;
493 | lsm6dsox_ctrl6_c_t val2;
494 |
495 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != LSM6DSOX_OK)
496 | {
497 | return LSM6DSOX_ERROR;
498 | }
499 |
500 | if (val2.xl_hm_mode)
501 | {
502 | val2.xl_hm_mode = 0;
503 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL6_C, (uint8_t *)&val2, 1) != LSM6DSOX_OK)
504 | {
505 | return LSM6DSOX_ERROR;
506 | }
507 | }
508 |
509 | /* Disable Gyro */
510 | if (gyro_is_enabled == 1U)
511 | {
512 | if (Disable_G() != LSM6DSOX_OK)
513 | {
514 | return LSM6DSOX_ERROR;
515 | }
516 | }
517 |
518 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
519 | {
520 | return LSM6DSOX_ERROR;
521 | }
522 |
523 | if (!val1.xl_ulp_en)
524 | {
525 | /* Power off the accelerometer */
526 | if (acc_is_enabled == 1U)
527 | {
528 | if (lsm6dsox_xl_data_rate_set(®_ctx, LSM6DSOX_XL_ODR_OFF) != LSM6DSOX_OK)
529 | {
530 | return LSM6DSOX_ERROR;
531 | }
532 | }
533 |
534 | val1.xl_ulp_en = 1U;
535 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL5_C, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
536 | {
537 | return LSM6DSOX_ERROR;
538 | }
539 | }
540 |
541 | /* Now we need to limit the ODR to 208 Hz if it is higher */
542 | if (Odr > 208.0f)
543 | {
544 | Odr = 208.0f;
545 | }
546 | break;
547 | }
548 | default:
549 | ret = LSM6DSOX_ERROR;
550 | break;
551 | }
552 |
553 | /* Check if the component is enabled */
554 | if (acc_is_enabled == 1U)
555 | {
556 | ret = Set_X_ODR_When_Enabled(Odr);
557 | }
558 | else
559 | {
560 | ret = Set_X_ODR_When_Disabled(Odr);
561 | }
562 |
563 | return ret;
564 | }
565 |
566 | /**
567 | * @brief Set the LSM6DSOX accelerometer sensor output data rate when enabled
568 | * @param Odr the functional output data rate to be set
569 | * @retval 0 in case of success, an error code otherwise
570 | */
571 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_X_ODR_When_Enabled(float Odr)
572 | {
573 | lsm6dsox_odr_xl_t new_odr;
574 |
575 | new_odr = (Odr <= 1.6f) ? LSM6DSOX_XL_ODR_1Hz6
576 | : (Odr <= 12.5f) ? LSM6DSOX_XL_ODR_12Hz5
577 | : (Odr <= 26.0f) ? LSM6DSOX_XL_ODR_26Hz
578 | : (Odr <= 52.0f) ? LSM6DSOX_XL_ODR_52Hz
579 | : (Odr <= 104.0f) ? LSM6DSOX_XL_ODR_104Hz
580 | : (Odr <= 208.0f) ? LSM6DSOX_XL_ODR_208Hz
581 | : (Odr <= 417.0f) ? LSM6DSOX_XL_ODR_417Hz
582 | : (Odr <= 833.0f) ? LSM6DSOX_XL_ODR_833Hz
583 | : (Odr <= 1667.0f) ? LSM6DSOX_XL_ODR_1667Hz
584 | : (Odr <= 3333.0f) ? LSM6DSOX_XL_ODR_3333Hz
585 | : LSM6DSOX_XL_ODR_6667Hz;
586 |
587 | /* Output data rate selection. */
588 | if (lsm6dsox_xl_data_rate_set(®_ctx, new_odr) != LSM6DSOX_OK)
589 | {
590 | return LSM6DSOX_ERROR;
591 | }
592 |
593 | return LSM6DSOX_OK;
594 | }
595 |
596 | /**
597 | * @brief Set the LSM6DSOX accelerometer sensor output data rate when disabled
598 | * @param Odr the functional output data rate to be set
599 | * @retval 0 in case of success, an error code otherwise
600 | */
601 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_X_ODR_When_Disabled(float Odr)
602 | {
603 | acc_odr = (Odr <= 1.6f) ? LSM6DSOX_XL_ODR_1Hz6
604 | : (Odr <= 12.5f) ? LSM6DSOX_XL_ODR_12Hz5
605 | : (Odr <= 26.0f) ? LSM6DSOX_XL_ODR_26Hz
606 | : (Odr <= 52.0f) ? LSM6DSOX_XL_ODR_52Hz
607 | : (Odr <= 104.0f) ? LSM6DSOX_XL_ODR_104Hz
608 | : (Odr <= 208.0f) ? LSM6DSOX_XL_ODR_208Hz
609 | : (Odr <= 417.0f) ? LSM6DSOX_XL_ODR_417Hz
610 | : (Odr <= 833.0f) ? LSM6DSOX_XL_ODR_833Hz
611 | : (Odr <= 1667.0f) ? LSM6DSOX_XL_ODR_1667Hz
612 | : (Odr <= 3333.0f) ? LSM6DSOX_XL_ODR_3333Hz
613 | : LSM6DSOX_XL_ODR_6667Hz;
614 |
615 | return LSM6DSOX_OK;
616 | }
617 |
618 |
619 | /**
620 | * @brief Get the LSM6DSOX accelerometer sensor full scale
621 | * @param FullScale pointer where the full scale is written
622 | * @retval 0 in case of success, an error code otherwise
623 | */
624 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_FS(int32_t *FullScale)
625 | {
626 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
627 | lsm6dsox_fs_xl_t fs_low_level;
628 |
629 | /* Read actual full scale selection from sensor. */
630 | if (lsm6dsox_xl_full_scale_get(®_ctx, &fs_low_level) != LSM6DSOX_OK)
631 | {
632 | return LSM6DSOX_ERROR;
633 | }
634 |
635 | switch (fs_low_level)
636 | {
637 | case LSM6DSOX_2g:
638 | *FullScale = 2;
639 | break;
640 |
641 | case LSM6DSOX_4g:
642 | *FullScale = 4;
643 | break;
644 |
645 | case LSM6DSOX_8g:
646 | *FullScale = 8;
647 | break;
648 |
649 | case LSM6DSOX_16g:
650 | *FullScale = 16;
651 | break;
652 |
653 | default:
654 | ret = LSM6DSOX_ERROR;
655 | break;
656 | }
657 |
658 | return ret;
659 | }
660 |
661 | /**
662 | * @brief Set the LSM6DSOX accelerometer sensor full scale
663 | * @param FullScale the functional full scale to be set
664 | * @retval 0 in case of success, an error code otherwise
665 | */
666 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_X_FS(int32_t FullScale)
667 | {
668 | lsm6dsox_fs_xl_t new_fs;
669 |
670 | /* Seems like MISRA C-2012 rule 14.3a violation but only from single file statical analysis point of view because
671 | the parameter passed to the function is not known at the moment of analysis */
672 | new_fs = (FullScale <= 2) ? LSM6DSOX_2g
673 | : (FullScale <= 4) ? LSM6DSOX_4g
674 | : (FullScale <= 8) ? LSM6DSOX_8g
675 | : LSM6DSOX_16g;
676 |
677 | if (lsm6dsox_xl_full_scale_set(®_ctx, new_fs) != LSM6DSOX_OK)
678 | {
679 | return LSM6DSOX_ERROR;
680 | }
681 |
682 | return LSM6DSOX_OK;
683 | }
684 |
685 | /**
686 | * @brief Get the LSM6DSOX accelerometer sensor raw axes
687 | * @param Value pointer where the raw values of the axes are written
688 | * @retval 0 in case of success, an error code otherwise
689 | */
690 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_AxesRaw(int16_t *Value)
691 | {
692 | axis3bit16_t data_raw;
693 |
694 | /* Read raw data values. */
695 | if (lsm6dsox_acceleration_raw_get(®_ctx, data_raw.u8bit) != LSM6DSOX_OK)
696 | {
697 | return LSM6DSOX_ERROR;
698 | }
699 |
700 | /* Format the data. */
701 | Value[0] = data_raw.i16bit[0];
702 | Value[1] = data_raw.i16bit[1];
703 | Value[2] = data_raw.i16bit[2];
704 |
705 | return LSM6DSOX_OK;
706 | }
707 |
708 |
709 | /**
710 | * @brief Get the LSM6DSOX accelerometer sensor axes
711 | * @param Acceleration pointer where the values of the axes are written
712 | * @retval 0 in case of success, an error code otherwise
713 | */
714 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_Axes(int32_t *Acceleration)
715 | {
716 | axis3bit16_t data_raw;
717 | float sensitivity = 0.0f;
718 |
719 | /* Read raw data values. */
720 | if (lsm6dsox_acceleration_raw_get(®_ctx, data_raw.u8bit) != LSM6DSOX_OK)
721 | {
722 | return LSM6DSOX_ERROR;
723 | }
724 |
725 | /* Get LSM6DSOX actual sensitivity. */
726 | if (Get_X_Sensitivity(&sensitivity) != LSM6DSOX_OK)
727 | {
728 | return LSM6DSOX_ERROR;
729 | }
730 |
731 | /* Calculate the data. */
732 | Acceleration[0] = (int32_t)((float)((float)data_raw.i16bit[0] * sensitivity));
733 | Acceleration[1] = (int32_t)((float)((float)data_raw.i16bit[1] * sensitivity));
734 | Acceleration[2] = (int32_t)((float)((float)data_raw.i16bit[2] * sensitivity));
735 |
736 | return LSM6DSOX_OK;
737 | }
738 |
739 |
740 | /**
741 | * @brief Enable the LSM6DSOX gyroscope sensor
742 | * @retval 0 in case of success, an error code otherwise
743 | */
744 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_G()
745 | {
746 | /* Check if the component is already enabled */
747 | if (gyro_is_enabled == 1U)
748 | {
749 | return LSM6DSOX_OK;
750 | }
751 |
752 | /* Output data rate selection. */
753 | if (lsm6dsox_gy_data_rate_set(®_ctx, gyro_odr) != LSM6DSOX_OK)
754 | {
755 | return LSM6DSOX_ERROR;
756 | }
757 |
758 | gyro_is_enabled = 1;
759 |
760 | return LSM6DSOX_OK;
761 | }
762 |
763 |
764 | /**
765 | * @brief Disable the LSM6DSOX gyroscope sensor
766 | * @retval 0 in case of success, an error code otherwise
767 | */
768 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_G()
769 | {
770 | /* Check if the component is already disabled */
771 | if (gyro_is_enabled == 0U)
772 | {
773 | return LSM6DSOX_OK;
774 | }
775 |
776 | /* Get current output data rate. */
777 | if (lsm6dsox_gy_data_rate_get(®_ctx, &gyro_odr) != LSM6DSOX_OK)
778 | {
779 | return LSM6DSOX_ERROR;
780 | }
781 |
782 | /* Output data rate selection - power down. */
783 | if (lsm6dsox_gy_data_rate_set(®_ctx, LSM6DSOX_GY_ODR_OFF) != LSM6DSOX_OK)
784 | {
785 | return LSM6DSOX_ERROR;
786 | }
787 |
788 | gyro_is_enabled = 0;
789 |
790 | return LSM6DSOX_OK;
791 | }
792 |
793 | /**
794 | * @brief Get the LSM6DSOX gyroscope sensor sensitivity
795 | * @param Sensitivity pointer
796 | * @retval 0 in case of success, an error code otherwise
797 | */
798 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_G_Sensitivity(float *Sensitivity)
799 | {
800 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
801 | lsm6dsox_fs_g_t full_scale;
802 |
803 | /* Read actual full scale selection from sensor. */
804 | if (lsm6dsox_gy_full_scale_get(®_ctx, &full_scale) != LSM6DSOX_OK)
805 | {
806 | return LSM6DSOX_ERROR;
807 | }
808 |
809 | /* Store the sensitivity based on actual full scale. */
810 | switch (full_scale)
811 | {
812 | case LSM6DSOX_125dps:
813 | *Sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_125DPS;
814 | break;
815 |
816 | case LSM6DSOX_250dps:
817 | *Sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_250DPS;
818 | break;
819 |
820 | case LSM6DSOX_500dps:
821 | *Sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_500DPS;
822 | break;
823 |
824 | case LSM6DSOX_1000dps:
825 | *Sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_1000DPS;
826 | break;
827 |
828 | case LSM6DSOX_2000dps:
829 | *Sensitivity = LSM6DSOX_GYRO_SENSITIVITY_FS_2000DPS;
830 | break;
831 |
832 | default:
833 | ret = LSM6DSOX_ERROR;
834 | break;
835 | }
836 |
837 | return ret;
838 | }
839 |
840 | /**
841 | * @brief Get the LSM6DSOX gyroscope sensor output data rate
842 | * @param Odr pointer where the output data rate is written
843 | * @retval 0 in case of success, an error code otherwise
844 | */
845 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_G_ODR(float *Odr)
846 | {
847 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
848 | lsm6dsox_odr_g_t odr_low_level;
849 |
850 | /* Get current output data rate. */
851 | if (lsm6dsox_gy_data_rate_get(®_ctx, &odr_low_level) != LSM6DSOX_OK)
852 | {
853 | return LSM6DSOX_ERROR;
854 | }
855 |
856 | switch (odr_low_level)
857 | {
858 | case LSM6DSOX_GY_ODR_OFF:
859 | *Odr = 0.0f;
860 | break;
861 |
862 | case LSM6DSOX_GY_ODR_12Hz5:
863 | *Odr = 12.5f;
864 | break;
865 |
866 | case LSM6DSOX_GY_ODR_26Hz:
867 | *Odr = 26.0f;
868 | break;
869 |
870 | case LSM6DSOX_GY_ODR_52Hz:
871 | *Odr = 52.0f;
872 | break;
873 |
874 | case LSM6DSOX_GY_ODR_104Hz:
875 | *Odr = 104.0f;
876 | break;
877 |
878 | case LSM6DSOX_GY_ODR_208Hz:
879 | *Odr = 208.0f;
880 | break;
881 |
882 | case LSM6DSOX_GY_ODR_417Hz:
883 | *Odr = 417.0f;
884 | break;
885 |
886 | case LSM6DSOX_GY_ODR_833Hz:
887 | *Odr = 833.0f;
888 | break;
889 |
890 | case LSM6DSOX_GY_ODR_1667Hz:
891 | *Odr = 1667.0f;
892 | break;
893 |
894 | case LSM6DSOX_GY_ODR_3333Hz:
895 | *Odr = 3333.0f;
896 | break;
897 |
898 | case LSM6DSOX_GY_ODR_6667Hz:
899 | *Odr = 6667.0f;
900 | break;
901 |
902 | default:
903 | ret = LSM6DSOX_ERROR;
904 | break;
905 | }
906 |
907 | return ret;
908 | }
909 |
910 | /**
911 | * @brief Set the LSM6DSOX gyroscope sensor output data rate
912 | * @param Odr the output data rate value to be set
913 | * @retval 0 in case of success, an error code otherwise
914 | */
915 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_G_ODR(float Odr)
916 | {
917 | return Set_G_ODR_With_Mode(Odr, LSM6DSOX_GYRO_HIGH_PERFORMANCE_MODE);
918 | }
919 |
920 | /**
921 | * @brief Set the LSM6DSOX gyroscope sensor output data rate with operating mode
922 | * @param Odr the output data rate value to be set
923 | * @param Mode the gyroscope operating mode
924 | * @retval 0 in case of success, an error code otherwise
925 | */
926 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_G_ODR_With_Mode(float Odr, LSM6DSOX_GYRO_Operating_Mode_t Mode)
927 | {
928 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
929 |
930 | switch (Mode)
931 | {
932 | case LSM6DSOX_GYRO_HIGH_PERFORMANCE_MODE:
933 | {
934 | /* We must uncheck Low Power bit if it is enabled */
935 | lsm6dsox_ctrl7_g_t val1;
936 |
937 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
938 | {
939 | return LSM6DSOX_ERROR;
940 | }
941 |
942 | if (val1.g_hm_mode)
943 | {
944 | val1.g_hm_mode = 0;
945 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
946 | {
947 | return LSM6DSOX_ERROR;
948 | }
949 | }
950 | break;
951 | }
952 | case LSM6DSOX_GYRO_LOW_POWER_NORMAL_MODE:
953 | {
954 | /* We must check the Low Power bit if it is unchecked */
955 | lsm6dsox_ctrl7_g_t val1;
956 |
957 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
958 | {
959 | return LSM6DSOX_ERROR;
960 | }
961 |
962 | if (!val1.g_hm_mode)
963 | {
964 | val1.g_hm_mode = 1U;
965 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_CTRL7_G, (uint8_t *)&val1, 1) != LSM6DSOX_OK)
966 | {
967 | return LSM6DSOX_ERROR;
968 | }
969 | }
970 |
971 | /* Now we need to limit the ODR to 208 Hz if it is higher */
972 | if (Odr > 208.0f)
973 | {
974 | Odr = 208.0f;
975 | }
976 | break;
977 | }
978 | default:
979 | ret = LSM6DSOX_ERROR;
980 | break;
981 | }
982 |
983 | /* Check if the component is enabled */
984 | if (gyro_is_enabled == 1U)
985 | {
986 | ret = Set_G_ODR_When_Enabled(Odr);
987 | }
988 | else
989 | {
990 | ret = Set_G_ODR_When_Disabled(Odr);
991 | }
992 |
993 | return ret;
994 | }
995 |
996 | /**
997 | * @brief Set the LSM6DSOX gyroscope sensor output data rate when enabled
998 | * @param Odr the functional output data rate to be set
999 | * @retval 0 in case of success, an error code otherwise
1000 | */
1001 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_G_ODR_When_Enabled(float Odr)
1002 | {
1003 | lsm6dsox_odr_g_t new_odr;
1004 |
1005 | new_odr = (Odr <= 12.5f) ? LSM6DSOX_GY_ODR_12Hz5
1006 | : (Odr <= 26.0f) ? LSM6DSOX_GY_ODR_26Hz
1007 | : (Odr <= 52.0f) ? LSM6DSOX_GY_ODR_52Hz
1008 | : (Odr <= 104.0f) ? LSM6DSOX_GY_ODR_104Hz
1009 | : (Odr <= 208.0f) ? LSM6DSOX_GY_ODR_208Hz
1010 | : (Odr <= 417.0f) ? LSM6DSOX_GY_ODR_417Hz
1011 | : (Odr <= 833.0f) ? LSM6DSOX_GY_ODR_833Hz
1012 | : (Odr <= 1667.0f) ? LSM6DSOX_GY_ODR_1667Hz
1013 | : (Odr <= 3333.0f) ? LSM6DSOX_GY_ODR_3333Hz
1014 | : LSM6DSOX_GY_ODR_6667Hz;
1015 |
1016 | /* Output data rate selection. */
1017 | if (lsm6dsox_gy_data_rate_set(®_ctx, new_odr) != LSM6DSOX_OK)
1018 | {
1019 | return LSM6DSOX_ERROR;
1020 | }
1021 |
1022 | return LSM6DSOX_OK;
1023 | }
1024 |
1025 | /**
1026 | * @brief Set the LSM6DSOX gyroscope sensor output data rate when disabled
1027 | * @param Odr the functional output data rate to be set
1028 | * @retval 0 in case of success, an error code otherwise
1029 | */
1030 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_G_ODR_When_Disabled(float Odr)
1031 | {
1032 | gyro_odr = (Odr <= 12.5f) ? LSM6DSOX_GY_ODR_12Hz5
1033 | : (Odr <= 26.0f) ? LSM6DSOX_GY_ODR_26Hz
1034 | : (Odr <= 52.0f) ? LSM6DSOX_GY_ODR_52Hz
1035 | : (Odr <= 104.0f) ? LSM6DSOX_GY_ODR_104Hz
1036 | : (Odr <= 208.0f) ? LSM6DSOX_GY_ODR_208Hz
1037 | : (Odr <= 417.0f) ? LSM6DSOX_GY_ODR_417Hz
1038 | : (Odr <= 833.0f) ? LSM6DSOX_GY_ODR_833Hz
1039 | : (Odr <= 1667.0f) ? LSM6DSOX_GY_ODR_1667Hz
1040 | : (Odr <= 3333.0f) ? LSM6DSOX_GY_ODR_3333Hz
1041 | : LSM6DSOX_GY_ODR_6667Hz;
1042 |
1043 | return LSM6DSOX_OK;
1044 | }
1045 |
1046 |
1047 | /**
1048 | * @brief Get the LSM6DSOX gyroscope sensor full scale
1049 | * @param FullScale pointer where the full scale is written
1050 | * @retval 0 in case of success, an error code otherwise
1051 | */
1052 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_G_FS(int32_t *FullScale)
1053 | {
1054 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
1055 | lsm6dsox_fs_g_t fs_low_level;
1056 |
1057 | /* Read actual full scale selection from sensor. */
1058 | if (lsm6dsox_gy_full_scale_get(®_ctx, &fs_low_level) != LSM6DSOX_OK)
1059 | {
1060 | return LSM6DSOX_ERROR;
1061 | }
1062 |
1063 | switch (fs_low_level)
1064 | {
1065 | case LSM6DSOX_125dps:
1066 | *FullScale = 125;
1067 | break;
1068 |
1069 | case LSM6DSOX_250dps:
1070 | *FullScale = 250;
1071 | break;
1072 |
1073 | case LSM6DSOX_500dps:
1074 | *FullScale = 500;
1075 | break;
1076 |
1077 | case LSM6DSOX_1000dps:
1078 | *FullScale = 1000;
1079 | break;
1080 |
1081 | case LSM6DSOX_2000dps:
1082 | *FullScale = 2000;
1083 | break;
1084 |
1085 | default:
1086 | ret = LSM6DSOX_ERROR;
1087 | break;
1088 | }
1089 |
1090 | return ret;
1091 | }
1092 |
1093 | /**
1094 | * @brief Set the LSM6DSOX gyroscope sensor full scale
1095 | * @param FullScale the functional full scale to be set
1096 | * @retval 0 in case of success, an error code otherwise
1097 | */
1098 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_G_FS(int32_t FullScale)
1099 | {
1100 | lsm6dsox_fs_g_t new_fs;
1101 |
1102 | new_fs = (FullScale <= 125) ? LSM6DSOX_125dps
1103 | : (FullScale <= 250) ? LSM6DSOX_250dps
1104 | : (FullScale <= 500) ? LSM6DSOX_500dps
1105 | : (FullScale <= 1000) ? LSM6DSOX_1000dps
1106 | : LSM6DSOX_2000dps;
1107 |
1108 | if (lsm6dsox_gy_full_scale_set(®_ctx, new_fs) != LSM6DSOX_OK)
1109 | {
1110 | return LSM6DSOX_ERROR;
1111 | }
1112 |
1113 | return LSM6DSOX_OK;
1114 | }
1115 |
1116 | /**
1117 | * @brief Get the LSM6DSOX gyroscope sensor raw axes
1118 | * @param Value pointer where the raw values of the axes are written
1119 | * @retval 0 in case of success, an error code otherwise
1120 | */
1121 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_G_AxesRaw(int16_t *Value)
1122 | {
1123 | axis3bit16_t data_raw;
1124 |
1125 | /* Read raw data values. */
1126 | if (lsm6dsox_angular_rate_raw_get(®_ctx, data_raw.u8bit) != LSM6DSOX_OK)
1127 | {
1128 | return LSM6DSOX_ERROR;
1129 | }
1130 |
1131 | /* Format the data. */
1132 | Value[0] = data_raw.i16bit[0];
1133 | Value[1] = data_raw.i16bit[1];
1134 | Value[2] = data_raw.i16bit[2];
1135 |
1136 | return LSM6DSOX_OK;
1137 | }
1138 |
1139 |
1140 | /**
1141 | * @brief Get the LSM6DSOX gyroscope sensor axes
1142 | * @param AngularRate pointer where the values of the axes are written
1143 | * @retval 0 in case of success, an error code otherwise
1144 | */
1145 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_G_Axes(int32_t *AngularRate)
1146 | {
1147 | axis3bit16_t data_raw;
1148 | float sensitivity;
1149 |
1150 | /* Read raw data values. */
1151 | if (lsm6dsox_angular_rate_raw_get(®_ctx, data_raw.u8bit) != LSM6DSOX_OK)
1152 | {
1153 | return LSM6DSOX_ERROR;
1154 | }
1155 |
1156 | /* Get LSM6DSOX actual sensitivity. */
1157 | if (Get_G_Sensitivity(&sensitivity) != LSM6DSOX_OK)
1158 | {
1159 | return LSM6DSOX_ERROR;
1160 | }
1161 |
1162 | /* Calculate the data. */
1163 | AngularRate[0] = (int32_t)((float)((float)data_raw.i16bit[0] * sensitivity));
1164 | AngularRate[1] = (int32_t)((float)((float)data_raw.i16bit[1] * sensitivity));
1165 | AngularRate[2] = (int32_t)((float)((float)data_raw.i16bit[2] * sensitivity));
1166 |
1167 | return LSM6DSOX_OK;
1168 | }
1169 |
1170 |
1171 | /**
1172 | * @brief Get the LSM6DSOX register value
1173 | * @param Reg address to be read
1174 | * @param Data pointer where the value is written
1175 | * @retval 0 in case of success, an error code otherwise
1176 | */
1177 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Read_Reg(uint8_t Reg, uint8_t *Data)
1178 | {
1179 | if (lsm6dsox_read_reg(®_ctx, Reg, Data, 1) != LSM6DSOX_OK)
1180 | {
1181 | return LSM6DSOX_ERROR;
1182 | }
1183 |
1184 | return LSM6DSOX_OK;
1185 | }
1186 |
1187 |
1188 | /**
1189 | * @brief Set the LSM6DSOX register value
1190 | * @param Reg address to be written
1191 | * @param Data value to be written
1192 | * @retval 0 in case of success, an error code otherwise
1193 | */
1194 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Write_Reg(uint8_t Reg, uint8_t Data)
1195 | {
1196 | if (lsm6dsox_write_reg(®_ctx, Reg, &Data, 1) != LSM6DSOX_OK)
1197 | {
1198 | return LSM6DSOX_ERROR;
1199 | }
1200 |
1201 | return LSM6DSOX_OK;
1202 | }
1203 |
1204 | /**
1205 | * @brief Set the interrupt latch
1206 | * @param Status value to be written
1207 | * @retval 0 in case of success, an error code otherwise
1208 | */
1209 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Interrupt_Latch(uint8_t Status)
1210 | {
1211 | if (Status > 1U)
1212 | {
1213 | return LSM6DSOX_ERROR;
1214 | }
1215 |
1216 | if (lsm6dsox_int_notification_set(®_ctx, (lsm6dsox_lir_t)Status) != LSM6DSOX_OK)
1217 | {
1218 | return LSM6DSOX_ERROR;
1219 | }
1220 |
1221 | return LSM6DSOX_OK;
1222 | }
1223 |
1224 | /**
1225 | * @brief Enable free fall detection
1226 | * @param IntPin interrupt pin line to be used
1227 | * @retval 0 in case of success, an error code otherwise
1228 | */
1229 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_Free_Fall_Detection(LSM6DSOX_SensorIntPin_t IntPin)
1230 | {
1231 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
1232 | lsm6dsox_pin_int1_route_t val1;
1233 | lsm6dsox_pin_int2_route_t val2;
1234 |
1235 | /* Output Data Rate selection */
1236 | if (Set_X_ODR(416.0f) != LSM6DSOX_OK)
1237 | {
1238 | return LSM6DSOX_ERROR;
1239 | }
1240 |
1241 | /* Full scale selection */
1242 | if (Set_X_FS(2) != LSM6DSOX_OK)
1243 | {
1244 | return LSM6DSOX_ERROR;
1245 | }
1246 |
1247 | /* FF_DUR setting */
1248 | if (lsm6dsox_ff_dur_set(®_ctx, 0x06) != LSM6DSOX_OK)
1249 | {
1250 | return LSM6DSOX_ERROR;
1251 | }
1252 |
1253 | /* WAKE_DUR setting */
1254 | if (lsm6dsox_wkup_dur_set(®_ctx, 0x00) != LSM6DSOX_OK)
1255 | {
1256 | return LSM6DSOX_ERROR;
1257 | }
1258 |
1259 | /* SLEEP_DUR setting */
1260 | if (lsm6dsox_act_sleep_dur_set(®_ctx, 0x00) != LSM6DSOX_OK)
1261 | {
1262 | return LSM6DSOX_ERROR;
1263 | }
1264 |
1265 | /* FF_THS setting */
1266 | if (lsm6dsox_ff_threshold_set(®_ctx, LSM6DSOX_FF_TSH_312mg) != LSM6DSOX_OK)
1267 | {
1268 | return LSM6DSOX_ERROR;
1269 | }
1270 |
1271 | /* Enable free fall event on either INT1 or INT2 pin */
1272 | switch (IntPin)
1273 | {
1274 | case LSM6DSOX_INT1_PIN:
1275 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1276 | {
1277 | return LSM6DSOX_ERROR;
1278 | }
1279 |
1280 | val1.free_fall = PROPERTY_ENABLE;
1281 |
1282 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1283 | {
1284 | return LSM6DSOX_ERROR;
1285 | }
1286 | break;
1287 |
1288 | case LSM6DSOX_INT2_PIN:
1289 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1290 | {
1291 | return LSM6DSOX_ERROR;
1292 | }
1293 |
1294 | val2.free_fall = PROPERTY_ENABLE;
1295 |
1296 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1297 | {
1298 | return LSM6DSOX_ERROR;
1299 | }
1300 | break;
1301 |
1302 | default:
1303 | ret = LSM6DSOX_ERROR;
1304 | break;
1305 | }
1306 |
1307 | return ret;
1308 | }
1309 |
1310 | /**
1311 | * @brief Disable free fall detection
1312 | * @retval 0 in case of success, an error code otherwise
1313 | */
1314 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_Free_Fall_Detection()
1315 | {
1316 | lsm6dsox_pin_int1_route_t val1;
1317 | lsm6dsox_pin_int2_route_t val2;
1318 |
1319 | /* Disable free fall event on both INT1 and INT2 pins */
1320 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1321 | {
1322 | return LSM6DSOX_ERROR;
1323 | }
1324 |
1325 | val1.free_fall = PROPERTY_DISABLE;
1326 |
1327 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1328 | {
1329 | return LSM6DSOX_ERROR;
1330 | }
1331 |
1332 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1333 | {
1334 | return LSM6DSOX_ERROR;
1335 | }
1336 |
1337 | val2.free_fall = PROPERTY_DISABLE;
1338 |
1339 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1340 | {
1341 | return LSM6DSOX_ERROR;
1342 | }
1343 |
1344 | /* FF_DUR setting */
1345 | if (lsm6dsox_ff_dur_set(®_ctx, 0x00) != LSM6DSOX_OK)
1346 | {
1347 | return LSM6DSOX_ERROR;
1348 | }
1349 |
1350 | /* FF_THS setting */
1351 | if (lsm6dsox_ff_threshold_set(®_ctx, LSM6DSOX_FF_TSH_156mg) != LSM6DSOX_OK)
1352 | {
1353 | return LSM6DSOX_ERROR;
1354 | }
1355 |
1356 | return LSM6DSOX_OK;
1357 | }
1358 |
1359 | /**
1360 | * @brief Set free fall threshold
1361 | * @param Threshold free fall detection threshold
1362 | * @retval 0 in case of success, an error code otherwise
1363 | */
1364 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Free_Fall_Threshold(uint8_t Threshold)
1365 | {
1366 | if (lsm6dsox_ff_threshold_set(®_ctx, (lsm6dsox_ff_ths_t)Threshold) != LSM6DSOX_OK)
1367 | {
1368 | return LSM6DSOX_ERROR;
1369 | }
1370 |
1371 | return LSM6DSOX_OK;
1372 | }
1373 |
1374 |
1375 | /**
1376 | * @brief Set free fall duration
1377 | * @param Duration free fall detection duration
1378 | * @retval 0 in case of success, an error code otherwise
1379 | */
1380 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Free_Fall_Duration(uint8_t Duration)
1381 | {
1382 | if (lsm6dsox_ff_dur_set(®_ctx, Duration) != LSM6DSOX_OK)
1383 | {
1384 | return LSM6DSOX_ERROR;
1385 | }
1386 |
1387 | return LSM6DSOX_OK;
1388 | }
1389 |
1390 |
1391 | /**
1392 | * @brief Enable pedometer
1393 | * @retval 0 in case of success, an error code otherwise
1394 | */
1395 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_Pedometer()
1396 | {
1397 | lsm6dsox_pin_int1_route_t val;
1398 | lsm6dsox_emb_sens_t emb_sens;
1399 |
1400 | /* Output Data Rate selection */
1401 | if (Set_X_ODR(26.0f) != LSM6DSOX_OK)
1402 | {
1403 | return LSM6DSOX_ERROR;
1404 | }
1405 |
1406 | /* Full scale selection */
1407 | if (Set_X_FS(2) != LSM6DSOX_OK)
1408 | {
1409 | return LSM6DSOX_ERROR;
1410 | }
1411 |
1412 | /* Save current embedded features */
1413 | if (lsm6dsox_embedded_sens_get(®_ctx, &emb_sens) != LSM6DSOX_OK)
1414 | {
1415 | return LSM6DSOX_ERROR;
1416 | }
1417 |
1418 | /* Turn off embedded features */
1419 | if (lsm6dsox_embedded_sens_off(®_ctx) != LSM6DSOX_OK)
1420 | {
1421 | return LSM6DSOX_ERROR;
1422 | }
1423 |
1424 | /* Wait for 10 ms */
1425 | delay(10);
1426 |
1427 | /* Enable pedometer algorithm. */
1428 | emb_sens.step = PROPERTY_ENABLE;
1429 |
1430 | if (lsm6dsox_pedo_sens_set(®_ctx, LSM6DSOX_PEDO_BASE_MODE) != LSM6DSOX_OK)
1431 | {
1432 | return LSM6DSOX_ERROR;
1433 | }
1434 |
1435 | /* Turn on embedded features */
1436 | if (lsm6dsox_embedded_sens_set(®_ctx, &emb_sens) != LSM6DSOX_OK)
1437 | {
1438 | return LSM6DSOX_ERROR;
1439 | }
1440 |
1441 | /* Enable step detector on INT1 pin */
1442 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val) != LSM6DSOX_OK)
1443 | {
1444 | return LSM6DSOX_ERROR;
1445 | }
1446 |
1447 | val.step_detector = PROPERTY_ENABLE;
1448 |
1449 | if (lsm6dsox_pin_int1_route_set(®_ctx, val) != LSM6DSOX_OK)
1450 | {
1451 | return LSM6DSOX_ERROR;
1452 | }
1453 |
1454 | return LSM6DSOX_OK;
1455 | }
1456 |
1457 | /**
1458 | * @brief Disable pedometer
1459 | * @retval 0 in case of success, an error code otherwise
1460 | */
1461 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_Pedometer()
1462 | {
1463 | lsm6dsox_pin_int1_route_t val1;
1464 | lsm6dsox_emb_sens_t emb_sens;
1465 |
1466 | /* Disable step detector on INT1 pin */
1467 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1468 | {
1469 | return LSM6DSOX_ERROR;
1470 | }
1471 |
1472 | val1.step_detector = PROPERTY_DISABLE;
1473 |
1474 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1475 | {
1476 | return LSM6DSOX_ERROR;
1477 | }
1478 |
1479 | /* Save current embedded features */
1480 | if (lsm6dsox_embedded_sens_get(®_ctx, &emb_sens) != LSM6DSOX_OK)
1481 | {
1482 | return LSM6DSOX_ERROR;
1483 | }
1484 |
1485 | /* Disable pedometer algorithm. */
1486 | emb_sens.step = PROPERTY_DISABLE;
1487 |
1488 | if (lsm6dsox_embedded_sens_set(®_ctx, &emb_sens) != LSM6DSOX_OK)
1489 | {
1490 | return LSM6DSOX_ERROR;
1491 | }
1492 |
1493 | return LSM6DSOX_OK;
1494 | }
1495 |
1496 | /**
1497 | * @brief Get step count
1498 | * @param StepCount step counter
1499 | * @retval 0 in case of success, an error code otherwise
1500 | */
1501 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_Step_Count(uint16_t *StepCount)
1502 | {
1503 | if (lsm6dsox_number_of_steps_get(®_ctx, (uint8_t *)StepCount) != LSM6DSOX_OK)
1504 | {
1505 | return LSM6DSOX_ERROR;
1506 | }
1507 |
1508 | return LSM6DSOX_OK;
1509 | }
1510 |
1511 | /**
1512 | * @brief Enable step counter reset
1513 | * @retval 0 in case of success, an error code otherwise
1514 | */
1515 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Step_Counter_Reset()
1516 | {
1517 | if (lsm6dsox_steps_reset(®_ctx) != LSM6DSOX_OK)
1518 | {
1519 | return LSM6DSOX_ERROR;
1520 | }
1521 |
1522 | return LSM6DSOX_OK;
1523 | }
1524 |
1525 | /**
1526 | * @brief Enable tilt detection
1527 | * @param IntPin interrupt pin line to be used
1528 | * @retval 0 in case of success, an error code otherwise
1529 | */
1530 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_Tilt_Detection(LSM6DSOX_SensorIntPin_t IntPin)
1531 | {
1532 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
1533 | lsm6dsox_pin_int1_route_t val1;
1534 | lsm6dsox_pin_int2_route_t val2;
1535 | lsm6dsox_emb_sens_t emb_sens;
1536 |
1537 | /* Output Data Rate selection */
1538 | if (Set_X_ODR(26.0f) != LSM6DSOX_OK)
1539 | {
1540 | return LSM6DSOX_ERROR;
1541 | }
1542 |
1543 | /* Full scale selection */
1544 | if (Set_X_FS(2) != LSM6DSOX_OK)
1545 | {
1546 | return LSM6DSOX_ERROR;
1547 | }
1548 |
1549 | /* Save current embedded features */
1550 | if (lsm6dsox_embedded_sens_get(®_ctx, &emb_sens) != LSM6DSOX_OK)
1551 | {
1552 | return LSM6DSOX_ERROR;
1553 | }
1554 |
1555 | /* Turn off embedded features */
1556 | if (lsm6dsox_embedded_sens_off(®_ctx) != LSM6DSOX_OK)
1557 | {
1558 | return LSM6DSOX_ERROR;
1559 | }
1560 |
1561 | /* Wait for 10 ms */
1562 | delay(10);
1563 |
1564 | /* Enable tilt algorithm. */
1565 | emb_sens.tilt = PROPERTY_ENABLE;
1566 |
1567 | /* Turn on embedded features */
1568 | if (lsm6dsox_embedded_sens_set(®_ctx, &emb_sens) != LSM6DSOX_OK)
1569 | {
1570 | return LSM6DSOX_ERROR;
1571 | }
1572 |
1573 | /* Enable tilt event on either INT1 or INT2 pin */
1574 | switch (IntPin)
1575 | {
1576 | case LSM6DSOX_INT1_PIN:
1577 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1578 | {
1579 | return LSM6DSOX_ERROR;
1580 | }
1581 |
1582 | val1.tilt = PROPERTY_ENABLE;
1583 |
1584 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1585 | {
1586 | return LSM6DSOX_ERROR;
1587 | }
1588 | break;
1589 |
1590 | case LSM6DSOX_INT2_PIN:
1591 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1592 | {
1593 | return LSM6DSOX_ERROR;
1594 | }
1595 |
1596 | val2.tilt = PROPERTY_ENABLE;
1597 |
1598 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1599 | {
1600 | return LSM6DSOX_ERROR;
1601 | }
1602 | break;
1603 |
1604 | default:
1605 | ret = LSM6DSOX_ERROR;
1606 | break;
1607 | }
1608 |
1609 | return ret;
1610 | }
1611 |
1612 | /**
1613 | * @brief Disable tilt detection
1614 | * @retval 0 in case of success, an error code otherwise
1615 | */
1616 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_Tilt_Detection()
1617 | {
1618 | lsm6dsox_pin_int1_route_t val1;
1619 | lsm6dsox_pin_int2_route_t val2;
1620 | lsm6dsox_emb_sens_t emb_sens;
1621 |
1622 | /* Disable tilt event on both INT1 and INT2 pins */
1623 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1624 | {
1625 | return LSM6DSOX_ERROR;
1626 | }
1627 |
1628 | val1.tilt = PROPERTY_DISABLE;
1629 |
1630 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1631 | {
1632 | return LSM6DSOX_ERROR;
1633 | }
1634 |
1635 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1636 | {
1637 | return LSM6DSOX_ERROR;
1638 | }
1639 |
1640 | val2.tilt = PROPERTY_DISABLE;
1641 |
1642 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1643 | {
1644 | return LSM6DSOX_ERROR;
1645 | }
1646 |
1647 | /* Save current embedded features */
1648 | if (lsm6dsox_embedded_sens_get(®_ctx, &emb_sens) != LSM6DSOX_OK)
1649 | {
1650 | return LSM6DSOX_ERROR;
1651 | }
1652 |
1653 | /* Disable tilt algorithm. */
1654 | emb_sens.tilt = PROPERTY_DISABLE;
1655 |
1656 | if (lsm6dsox_embedded_sens_set(®_ctx, &emb_sens) != LSM6DSOX_OK)
1657 | {
1658 | return LSM6DSOX_ERROR;
1659 | }
1660 |
1661 | return LSM6DSOX_OK;
1662 | }
1663 |
1664 | /**
1665 | * @brief Enable wake up detection
1666 | * @param IntPin interrupt pin line to be used
1667 | * @retval 0 in case of success, an error code otherwise
1668 | */
1669 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_Wake_Up_Detection(LSM6DSOX_SensorIntPin_t IntPin)
1670 | {
1671 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
1672 | lsm6dsox_pin_int1_route_t val1;
1673 | lsm6dsox_pin_int2_route_t val2;
1674 |
1675 | /* Output Data Rate selection */
1676 | if (Set_X_ODR(416.0f) != LSM6DSOX_OK)
1677 | {
1678 | return LSM6DSOX_ERROR;
1679 | }
1680 |
1681 | /* Full scale selection */
1682 | if (Set_X_FS(2) != LSM6DSOX_OK)
1683 | {
1684 | return LSM6DSOX_ERROR;
1685 | }
1686 |
1687 | /* WAKE_DUR setting */
1688 | if (lsm6dsox_wkup_dur_set(®_ctx, 0x00) != LSM6DSOX_OK)
1689 | {
1690 | return LSM6DSOX_ERROR;
1691 | }
1692 |
1693 | /* Set wake up threshold. */
1694 | if (lsm6dsox_wkup_threshold_set(®_ctx, 0x02) != LSM6DSOX_OK)
1695 | {
1696 | return LSM6DSOX_ERROR;
1697 | }
1698 |
1699 | /* Enable wake up event on either INT1 or INT2 pin */
1700 | switch (IntPin)
1701 | {
1702 | case LSM6DSOX_INT1_PIN:
1703 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1704 | {
1705 | return LSM6DSOX_ERROR;
1706 | }
1707 |
1708 | val1.wake_up = PROPERTY_ENABLE;
1709 |
1710 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1711 | {
1712 | return LSM6DSOX_ERROR;
1713 | }
1714 | break;
1715 |
1716 | case LSM6DSOX_INT2_PIN:
1717 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1718 | {
1719 | return LSM6DSOX_ERROR;
1720 | }
1721 |
1722 | val2.wake_up = PROPERTY_ENABLE;
1723 |
1724 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1725 | {
1726 | return LSM6DSOX_ERROR;
1727 | }
1728 | break;
1729 |
1730 | default:
1731 | ret = LSM6DSOX_ERROR;
1732 | break;
1733 | }
1734 |
1735 | return ret;
1736 | }
1737 |
1738 |
1739 | /**
1740 | * @brief Disable wake up detection
1741 | * @retval 0 in case of success, an error code otherwise
1742 | */
1743 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_Wake_Up_Detection()
1744 | {
1745 | lsm6dsox_pin_int1_route_t val1;
1746 | lsm6dsox_pin_int2_route_t val2;
1747 |
1748 | /* Disable wake up event on both INT1 and INT2 pins */
1749 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1750 | {
1751 | return LSM6DSOX_ERROR;
1752 | }
1753 |
1754 | val1.wake_up = PROPERTY_DISABLE;
1755 |
1756 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1757 | {
1758 | return LSM6DSOX_ERROR;
1759 | }
1760 |
1761 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1762 | {
1763 | return LSM6DSOX_ERROR;
1764 | }
1765 |
1766 | val2.wake_up = PROPERTY_DISABLE;
1767 |
1768 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1769 | {
1770 | return LSM6DSOX_ERROR;
1771 | }
1772 |
1773 | /* Reset wake up threshold. */
1774 | if (lsm6dsox_wkup_threshold_set(®_ctx, 0x00) != LSM6DSOX_OK)
1775 | {
1776 | return LSM6DSOX_ERROR;
1777 | }
1778 |
1779 | /* WAKE_DUR setting */
1780 | if (lsm6dsox_wkup_dur_set(®_ctx, 0x00) != LSM6DSOX_OK)
1781 | {
1782 | return LSM6DSOX_ERROR;
1783 | }
1784 |
1785 | return LSM6DSOX_OK;
1786 | }
1787 |
1788 | /**
1789 | * @brief Set wake up threshold
1790 | * @param Threshold wake up detection threshold
1791 | * @retval 0 in case of success, an error code otherwise
1792 | */
1793 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Wake_Up_Threshold(uint8_t Threshold)
1794 | {
1795 | /* Set wake up threshold. */
1796 | if (lsm6dsox_wkup_threshold_set(®_ctx, Threshold) != LSM6DSOX_OK)
1797 | {
1798 | return LSM6DSOX_ERROR;
1799 | }
1800 |
1801 | return LSM6DSOX_OK;
1802 | }
1803 |
1804 | /**
1805 | * @brief Set wake up duration
1806 | * @param Duration wake up detection duration
1807 | * @retval 0 in case of success, an error code otherwise
1808 | */
1809 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Wake_Up_Duration(uint8_t Duration)
1810 | {
1811 | /* Set wake up duration. */
1812 | if (lsm6dsox_wkup_dur_set(®_ctx, Duration) != LSM6DSOX_OK)
1813 | {
1814 | return LSM6DSOX_ERROR;
1815 | }
1816 |
1817 | return LSM6DSOX_OK;
1818 | }
1819 |
1820 | /**
1821 | * @brief Enable single tap detection
1822 | * @param IntPin interrupt pin line to be used
1823 | * @retval 0 in case of success, an error code otherwise
1824 | */
1825 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_Single_Tap_Detection(LSM6DSOX_SensorIntPin_t IntPin)
1826 | {
1827 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
1828 | lsm6dsox_pin_int1_route_t val1;
1829 | lsm6dsox_pin_int2_route_t val2;
1830 |
1831 | /* Output Data Rate selection */
1832 | if (Set_X_ODR(416.0f) != LSM6DSOX_OK)
1833 | {
1834 | return LSM6DSOX_ERROR;
1835 | }
1836 |
1837 | /* Full scale selection */
1838 | if (Set_X_FS(2) != LSM6DSOX_OK)
1839 | {
1840 | return LSM6DSOX_ERROR;
1841 | }
1842 |
1843 | /* Enable X direction in tap recognition. */
1844 | if (lsm6dsox_tap_detection_on_x_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
1845 | {
1846 | return LSM6DSOX_ERROR;
1847 | }
1848 |
1849 | /* Enable Y direction in tap recognition. */
1850 | if (lsm6dsox_tap_detection_on_y_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
1851 | {
1852 | return LSM6DSOX_ERROR;
1853 | }
1854 |
1855 | /* Enable Z direction in tap recognition. */
1856 | if (lsm6dsox_tap_detection_on_z_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
1857 | {
1858 | return LSM6DSOX_ERROR;
1859 | }
1860 |
1861 | /* Set tap threshold. */
1862 | if (lsm6dsox_tap_threshold_x_set(®_ctx, 0x08) != LSM6DSOX_OK)
1863 | {
1864 | return LSM6DSOX_ERROR;
1865 | }
1866 |
1867 | /* Set tap shock time window. */
1868 | if (lsm6dsox_tap_shock_set(®_ctx, 0x02) != LSM6DSOX_OK)
1869 | {
1870 | return LSM6DSOX_ERROR;
1871 | }
1872 |
1873 | /* Set tap quiet time window. */
1874 | if (lsm6dsox_tap_quiet_set(®_ctx, 0x01) != LSM6DSOX_OK)
1875 | {
1876 | return LSM6DSOX_ERROR;
1877 | }
1878 |
1879 | /* _NOTE_: Tap duration time window - don't care for single tap. */
1880 |
1881 | /* _NOTE_: Single/Double Tap event - don't care of this flag for single tap. */
1882 |
1883 | /* Enable single tap event on either INT1 or INT2 pin */
1884 | switch (IntPin)
1885 | {
1886 | case LSM6DSOX_INT1_PIN:
1887 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1888 | {
1889 | return LSM6DSOX_ERROR;
1890 | }
1891 |
1892 | val1.single_tap = PROPERTY_ENABLE;
1893 |
1894 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1895 | {
1896 | return LSM6DSOX_ERROR;
1897 | }
1898 | break;
1899 |
1900 | case LSM6DSOX_INT2_PIN:
1901 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1902 | {
1903 | return LSM6DSOX_ERROR;
1904 | }
1905 |
1906 | val2.single_tap = PROPERTY_ENABLE;
1907 |
1908 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1909 | {
1910 | return LSM6DSOX_ERROR;
1911 | }
1912 | break;
1913 |
1914 | default:
1915 | ret = LSM6DSOX_ERROR;
1916 | break;
1917 | }
1918 |
1919 | return ret;
1920 | }
1921 |
1922 | /**
1923 | * @brief Disable single tap detection
1924 | * @param pObj the device pObj
1925 | * @retval 0 in case of success, an error code otherwise
1926 | */
1927 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_Single_Tap_Detection()
1928 | {
1929 | lsm6dsox_pin_int1_route_t val1;
1930 | lsm6dsox_pin_int2_route_t val2;
1931 |
1932 | /* Disable single tap event on both INT1 and INT2 pins */
1933 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
1934 | {
1935 | return LSM6DSOX_ERROR;
1936 | }
1937 |
1938 | val1.single_tap = PROPERTY_DISABLE;
1939 |
1940 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
1941 | {
1942 | return LSM6DSOX_ERROR;
1943 | }
1944 |
1945 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
1946 | {
1947 | return LSM6DSOX_ERROR;
1948 | }
1949 |
1950 | val2.single_tap = PROPERTY_DISABLE;
1951 |
1952 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
1953 | {
1954 | return LSM6DSOX_ERROR;
1955 | }
1956 |
1957 | /* Reset tap quiet time window. */
1958 | if (lsm6dsox_tap_quiet_set(®_ctx, 0x00) != LSM6DSOX_OK)
1959 | {
1960 | return LSM6DSOX_ERROR;
1961 | }
1962 |
1963 | /* Reset tap shock time window. */
1964 | if (lsm6dsox_tap_shock_set(®_ctx, 0x00) != LSM6DSOX_OK)
1965 | {
1966 | return LSM6DSOX_ERROR;
1967 | }
1968 |
1969 | /* Reset tap threshold. */
1970 | if (lsm6dsox_tap_threshold_x_set(®_ctx, 0x00) != LSM6DSOX_OK)
1971 | {
1972 | return LSM6DSOX_ERROR;
1973 | }
1974 |
1975 | /* Disable Z direction in tap recognition. */
1976 | if (lsm6dsox_tap_detection_on_z_set(®_ctx, PROPERTY_DISABLE) != LSM6DSOX_OK)
1977 | {
1978 | return LSM6DSOX_ERROR;
1979 | }
1980 |
1981 | /* Disable Y direction in tap recognition. */
1982 | if (lsm6dsox_tap_detection_on_y_set(®_ctx, PROPERTY_DISABLE) != LSM6DSOX_OK)
1983 | {
1984 | return LSM6DSOX_ERROR;
1985 | }
1986 |
1987 | /* Disable X direction in tap recognition. */
1988 | if (lsm6dsox_tap_detection_on_x_set(®_ctx, PROPERTY_DISABLE) != LSM6DSOX_OK)
1989 | {
1990 | return LSM6DSOX_ERROR;
1991 | }
1992 |
1993 | return LSM6DSOX_OK;
1994 | }
1995 |
1996 | /**
1997 | * @brief Enable double tap detection
1998 | * @param IntPin interrupt pin line to be used
1999 | * @retval 0 in case of success, an error code otherwise
2000 | */
2001 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_Double_Tap_Detection(LSM6DSOX_SensorIntPin_t IntPin)
2002 | {
2003 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
2004 | lsm6dsox_pin_int1_route_t val1;
2005 | lsm6dsox_pin_int2_route_t val2;
2006 |
2007 | /* Output Data Rate selection */
2008 | if (Set_X_ODR(416.0f) != LSM6DSOX_OK)
2009 | {
2010 | return LSM6DSOX_ERROR;
2011 | }
2012 |
2013 | /* Full scale selection */
2014 | if (Set_X_FS(2) != LSM6DSOX_OK)
2015 | {
2016 | return LSM6DSOX_ERROR;
2017 | }
2018 |
2019 | /* Enable X direction in tap recognition. */
2020 | if (lsm6dsox_tap_detection_on_x_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
2021 | {
2022 | return LSM6DSOX_ERROR;
2023 | }
2024 |
2025 | /* Enable Y direction in tap recognition. */
2026 | if (lsm6dsox_tap_detection_on_y_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
2027 | {
2028 | return LSM6DSOX_ERROR;
2029 | }
2030 |
2031 | /* Enable Z direction in tap recognition. */
2032 | if (lsm6dsox_tap_detection_on_z_set(®_ctx, PROPERTY_ENABLE) != LSM6DSOX_OK)
2033 | {
2034 | return LSM6DSOX_ERROR;
2035 | }
2036 |
2037 | /* Set tap threshold. */
2038 | if (lsm6dsox_tap_threshold_x_set(®_ctx, 0x08) != LSM6DSOX_OK)
2039 | {
2040 | return LSM6DSOX_ERROR;
2041 | }
2042 |
2043 | /* Set tap shock time window. */
2044 | if (lsm6dsox_tap_shock_set(®_ctx, 0x03) != LSM6DSOX_OK)
2045 | {
2046 | return LSM6DSOX_ERROR;
2047 | }
2048 |
2049 | /* Set tap quiet time window. */
2050 | if (lsm6dsox_tap_quiet_set(®_ctx, 0x03) != LSM6DSOX_OK)
2051 | {
2052 | return LSM6DSOX_ERROR;
2053 | }
2054 |
2055 | /* Set tap duration time window. */
2056 | if (lsm6dsox_tap_dur_set(®_ctx, 0x08) != LSM6DSOX_OK)
2057 | {
2058 | return LSM6DSOX_ERROR;
2059 | }
2060 |
2061 | /* Single and double tap enabled. */
2062 | if (lsm6dsox_tap_mode_set(®_ctx, LSM6DSOX_BOTH_SINGLE_DOUBLE) != LSM6DSOX_OK)
2063 | {
2064 | return LSM6DSOX_ERROR;
2065 | }
2066 |
2067 | /* Enable double tap event on either INT1 or INT2 pin */
2068 | switch (IntPin)
2069 | {
2070 | case LSM6DSOX_INT1_PIN:
2071 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
2072 | {
2073 | return LSM6DSOX_ERROR;
2074 | }
2075 |
2076 | val1.double_tap = PROPERTY_ENABLE;
2077 |
2078 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
2079 | {
2080 | return LSM6DSOX_ERROR;
2081 | }
2082 | break;
2083 |
2084 | case LSM6DSOX_INT2_PIN:
2085 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
2086 | {
2087 | return LSM6DSOX_ERROR;
2088 | }
2089 |
2090 | val2.double_tap = PROPERTY_ENABLE;
2091 |
2092 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
2093 | {
2094 | return LSM6DSOX_ERROR;
2095 | }
2096 | break;
2097 |
2098 | default:
2099 | ret = LSM6DSOX_ERROR;
2100 | break;
2101 | }
2102 |
2103 | return ret;
2104 | }
2105 |
2106 | /**
2107 | * @brief Disable double tap detection
2108 | * @retval 0 in case of success, an error code otherwise
2109 | */
2110 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_Double_Tap_Detection()
2111 | {
2112 | lsm6dsox_pin_int1_route_t val1;
2113 | lsm6dsox_pin_int2_route_t val2;
2114 |
2115 | /* Disable double tap event on both INT1 and INT2 pins */
2116 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
2117 | {
2118 | return LSM6DSOX_ERROR;
2119 | }
2120 |
2121 | val1.double_tap = PROPERTY_DISABLE;
2122 |
2123 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
2124 | {
2125 | return LSM6DSOX_ERROR;
2126 | }
2127 |
2128 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
2129 | {
2130 | return LSM6DSOX_ERROR;
2131 | }
2132 |
2133 | val2.double_tap = PROPERTY_DISABLE;
2134 |
2135 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
2136 | {
2137 | return LSM6DSOX_ERROR;
2138 | }
2139 |
2140 | /* Only single tap enabled. */
2141 | if (lsm6dsox_tap_mode_set(®_ctx, LSM6DSOX_ONLY_SINGLE) != LSM6DSOX_OK)
2142 | {
2143 | return LSM6DSOX_ERROR;
2144 | }
2145 |
2146 | /* Reset tap duration time window. */
2147 | if (lsm6dsox_tap_dur_set(®_ctx, 0x00) != LSM6DSOX_OK)
2148 | {
2149 | return LSM6DSOX_ERROR;
2150 | }
2151 |
2152 | /* Reset tap quiet time window. */
2153 | if (lsm6dsox_tap_quiet_set(®_ctx, 0x00) != LSM6DSOX_OK)
2154 | {
2155 | return LSM6DSOX_ERROR;
2156 | }
2157 |
2158 | /* Reset tap shock time window. */
2159 | if (lsm6dsox_tap_shock_set(®_ctx, 0x00) != LSM6DSOX_OK)
2160 | {
2161 | return LSM6DSOX_ERROR;
2162 | }
2163 |
2164 | /* Reset tap threshold. */
2165 | if (lsm6dsox_tap_threshold_x_set(®_ctx, 0x00) != LSM6DSOX_OK)
2166 | {
2167 | return LSM6DSOX_ERROR;
2168 | }
2169 |
2170 | /* Disable Z direction in tap recognition. */
2171 | if (lsm6dsox_tap_detection_on_z_set(®_ctx, PROPERTY_DISABLE) != LSM6DSOX_OK)
2172 | {
2173 | return LSM6DSOX_ERROR;
2174 | }
2175 |
2176 | /* Disable Y direction in tap recognition. */
2177 | if (lsm6dsox_tap_detection_on_y_set(®_ctx, PROPERTY_DISABLE) != LSM6DSOX_OK)
2178 | {
2179 | return LSM6DSOX_ERROR;
2180 | }
2181 |
2182 | /* Disable X direction in tap recognition. */
2183 | if (lsm6dsox_tap_detection_on_x_set(®_ctx, PROPERTY_DISABLE) != LSM6DSOX_OK)
2184 | {
2185 | return LSM6DSOX_ERROR;
2186 | }
2187 |
2188 | return LSM6DSOX_OK;
2189 | }
2190 |
2191 | /**
2192 | * @brief Set tap threshold
2193 | * @param Threshold tap threshold
2194 | * @retval 0 in case of success, an error code otherwise
2195 | */
2196 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Tap_Threshold(uint8_t Threshold)
2197 | {
2198 | /* Set tap threshold. */
2199 | if (lsm6dsox_tap_threshold_x_set(®_ctx, Threshold) != LSM6DSOX_OK)
2200 | {
2201 | return LSM6DSOX_ERROR;
2202 | }
2203 |
2204 | return LSM6DSOX_OK;
2205 | }
2206 |
2207 | /**
2208 | * @brief Set tap shock time
2209 | * @param Time tap shock time
2210 | * @retval 0 in case of success, an error code otherwise
2211 | */
2212 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Tap_Shock_Time(uint8_t Time)
2213 | {
2214 | /* Set tap shock time window. */
2215 | if (lsm6dsox_tap_shock_set(®_ctx, Time) != LSM6DSOX_OK)
2216 | {
2217 | return LSM6DSOX_ERROR;
2218 | }
2219 |
2220 | return LSM6DSOX_OK;
2221 | }
2222 |
2223 | /**
2224 | * @brief Set tap quiet time
2225 | * @param Time tap quiet time
2226 | * @retval 0 in case of success, an error code otherwise
2227 | */
2228 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Tap_Quiet_Time(uint8_t Time)
2229 | {
2230 | /* Set tap quiet time window. */
2231 | if (lsm6dsox_tap_quiet_set(®_ctx, Time) != LSM6DSOX_OK)
2232 | {
2233 | return LSM6DSOX_ERROR;
2234 | }
2235 |
2236 | return LSM6DSOX_OK;
2237 | }
2238 |
2239 | /**
2240 | * @brief Set tap duration time
2241 | * @param Time tap duration time
2242 | * @retval 0 in case of success, an error code otherwise
2243 | */
2244 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Tap_Duration_Time(uint8_t Time)
2245 | {
2246 | /* Set tap duration time window. */
2247 | if (lsm6dsox_tap_dur_set(®_ctx, Time) != LSM6DSOX_OK)
2248 | {
2249 | return LSM6DSOX_ERROR;
2250 | }
2251 |
2252 | return LSM6DSOX_OK;
2253 | }
2254 |
2255 | /**
2256 | * @brief Enable 6D orientation detection
2257 | * @param IntPin interrupt pin line to be used
2258 | * @retval 0 in case of success, an error code otherwise
2259 | */
2260 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Enable_6D_Orientation(LSM6DSOX_SensorIntPin_t IntPin)
2261 | {
2262 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
2263 | lsm6dsox_pin_int1_route_t val1;
2264 | lsm6dsox_pin_int2_route_t val2;
2265 |
2266 | /* Output Data Rate selection */
2267 | if (Set_X_ODR(416.0f) != LSM6DSOX_OK)
2268 | {
2269 | return LSM6DSOX_ERROR;
2270 | }
2271 |
2272 | /* Full scale selection */
2273 | if (Set_X_FS(2) != LSM6DSOX_OK)
2274 | {
2275 | return LSM6DSOX_ERROR;
2276 | }
2277 |
2278 | /* 6D orientation enabled. */
2279 | if (lsm6dsox_6d_threshold_set(®_ctx, LSM6DSOX_DEG_60) != LSM6DSOX_OK)
2280 | {
2281 | return LSM6DSOX_ERROR;
2282 | }
2283 |
2284 | /* Enable 6D orientation event on either INT1 or INT2 pin */
2285 | switch (IntPin)
2286 | {
2287 | case LSM6DSOX_INT1_PIN:
2288 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
2289 | {
2290 | return LSM6DSOX_ERROR;
2291 | }
2292 |
2293 | val1.six_d = PROPERTY_ENABLE;
2294 |
2295 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
2296 | {
2297 | return LSM6DSOX_ERROR;
2298 | }
2299 | break;
2300 |
2301 | case LSM6DSOX_INT2_PIN:
2302 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
2303 | {
2304 | return LSM6DSOX_ERROR;
2305 | }
2306 |
2307 | val2.six_d = PROPERTY_ENABLE;
2308 |
2309 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
2310 | {
2311 | return LSM6DSOX_ERROR;
2312 | }
2313 | break;
2314 |
2315 | default:
2316 | ret = LSM6DSOX_ERROR;
2317 | break;
2318 | }
2319 |
2320 | return ret;
2321 | }
2322 |
2323 | /**
2324 | * @brief Disable 6D orientation detection
2325 | * @retval 0 in case of success, an error code otherwise
2326 | */
2327 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Disable_6D_Orientation()
2328 | {
2329 | lsm6dsox_pin_int1_route_t val1;
2330 | lsm6dsox_pin_int2_route_t val2;
2331 |
2332 | /* Disable 6D orientation event on both INT1 and INT2 pins */
2333 | if (lsm6dsox_pin_int1_route_get(®_ctx, &val1) != LSM6DSOX_OK)
2334 | {
2335 | return LSM6DSOX_ERROR;
2336 | }
2337 |
2338 | val1.six_d = PROPERTY_DISABLE;
2339 |
2340 | if (lsm6dsox_pin_int1_route_set(®_ctx, val1) != LSM6DSOX_OK)
2341 | {
2342 | return LSM6DSOX_ERROR;
2343 | }
2344 |
2345 | if (lsm6dsox_pin_int2_route_get(®_ctx, NULL, &val2) != LSM6DSOX_OK)
2346 | {
2347 | return LSM6DSOX_ERROR;
2348 | }
2349 |
2350 | val2.six_d = PROPERTY_DISABLE;
2351 |
2352 | if (lsm6dsox_pin_int2_route_set(®_ctx, NULL, val2) != LSM6DSOX_OK)
2353 | {
2354 | return LSM6DSOX_ERROR;
2355 | }
2356 |
2357 | /* Reset 6D orientation. */
2358 | if (lsm6dsox_6d_threshold_set(®_ctx, LSM6DSOX_DEG_80) != LSM6DSOX_OK)
2359 | {
2360 | return LSM6DSOX_ERROR;
2361 | }
2362 |
2363 | return LSM6DSOX_OK;
2364 | }
2365 |
2366 | /**
2367 | * @brief Set 6D orientation threshold
2368 | * @param Threshold 6D Orientation detection threshold
2369 | * @retval 0 in case of success, an error code otherwise
2370 | */
2371 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_6D_Orientation_Threshold(uint8_t Threshold)
2372 | {
2373 | if (lsm6dsox_6d_threshold_set(®_ctx, (lsm6dsox_sixd_ths_t)Threshold) != LSM6DSOX_OK)
2374 | {
2375 | return LSM6DSOX_ERROR;
2376 | }
2377 |
2378 | return LSM6DSOX_OK;
2379 | }
2380 |
2381 | /**
2382 | * @brief Get the status of XLow orientation
2383 | * @param XLow the status of XLow orientation
2384 | * @retval 0 in case of success, an error code otherwise
2385 | */
2386 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_6D_Orientation_XL(uint8_t *XLow)
2387 | {
2388 | lsm6dsox_d6d_src_t data;
2389 |
2390 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != LSM6DSOX_OK)
2391 | {
2392 | return LSM6DSOX_ERROR;
2393 | }
2394 |
2395 | *XLow = data.xl;
2396 |
2397 | return LSM6DSOX_OK;
2398 | }
2399 |
2400 | /**
2401 | * @brief Get the status of XHigh orientation
2402 | * @param XHigh the status of XHigh orientation
2403 | * @retval 0 in case of success, an error code otherwise
2404 | */
2405 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_6D_Orientation_XH(uint8_t *XHigh)
2406 | {
2407 | lsm6dsox_d6d_src_t data;
2408 |
2409 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != LSM6DSOX_OK)
2410 | {
2411 | return LSM6DSOX_ERROR;
2412 | }
2413 |
2414 | *XHigh = data.xh;
2415 |
2416 | return LSM6DSOX_OK;
2417 | }
2418 |
2419 | /**
2420 | * @brief Get the status of YLow orientation
2421 | * @param YLow the status of YLow orientation
2422 | * @retval 0 in case of success, an error code otherwise
2423 | */
2424 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_6D_Orientation_YL(uint8_t *YLow)
2425 | {
2426 | lsm6dsox_d6d_src_t data;
2427 |
2428 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != LSM6DSOX_OK)
2429 | {
2430 | return LSM6DSOX_ERROR;
2431 | }
2432 |
2433 | *YLow = data.yl;
2434 |
2435 | return LSM6DSOX_OK;
2436 | }
2437 |
2438 | /**
2439 | * @brief Get the status of YHigh orientation
2440 | * @param YHigh the status of YHigh orientation
2441 | * @retval 0 in case of success, an error code otherwise
2442 | */
2443 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_6D_Orientation_YH(uint8_t *YHigh)
2444 | {
2445 | lsm6dsox_d6d_src_t data;
2446 |
2447 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != LSM6DSOX_OK)
2448 | {
2449 | return LSM6DSOX_ERROR;
2450 | }
2451 |
2452 | *YHigh = data.yh;
2453 |
2454 | return LSM6DSOX_OK;
2455 | }
2456 |
2457 | /**
2458 | * @brief Get the status of ZLow orientation
2459 | * @param ZLow the status of ZLow orientation
2460 | * @retval 0 in case of success, an error code otherwise
2461 | */
2462 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_6D_Orientation_ZL(uint8_t *ZLow)
2463 | {
2464 | lsm6dsox_d6d_src_t data;
2465 |
2466 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != LSM6DSOX_OK)
2467 | {
2468 | return LSM6DSOX_ERROR;
2469 | }
2470 |
2471 | *ZLow = data.zl;
2472 |
2473 | return LSM6DSOX_OK;
2474 | }
2475 |
2476 | /**
2477 | * @brief Get the status of ZHigh orientation
2478 | * @param ZHigh the status of ZHigh orientation
2479 | * @retval 0 in case of success, an error code otherwise
2480 | */
2481 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_6D_Orientation_ZH(uint8_t *ZHigh)
2482 | {
2483 | lsm6dsox_d6d_src_t data;
2484 |
2485 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&data, 1) != LSM6DSOX_OK)
2486 | {
2487 | return LSM6DSOX_ERROR;
2488 | }
2489 |
2490 | *ZHigh = data.zh;
2491 |
2492 | return LSM6DSOX_OK;
2493 | }
2494 |
2495 | /**
2496 | * @brief Get the LSM6DSOX ACC data ready bit value
2497 | * @param Status the status of data ready bit
2498 | * @retval 0 in case of success, an error code otherwise
2499 | */
2500 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_DRDY_Status(uint8_t *Status)
2501 | {
2502 | if (lsm6dsox_xl_flag_data_ready_get(®_ctx, Status) != LSM6DSOX_OK)
2503 | {
2504 | return LSM6DSOX_ERROR;
2505 | }
2506 |
2507 | return LSM6DSOX_OK;
2508 | }
2509 |
2510 | /**
2511 | * @brief Get the status of all hardware events
2512 | * @param pObj the device pObj
2513 | * @param Status the status of all hardware events
2514 | * @retval 0 in case of success, an error code otherwise
2515 | */
2516 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_X_Event_Status(LSM6DSOX_Event_Status_t *Status)
2517 | {
2518 | uint8_t tilt_ia = 0U;
2519 | lsm6dsox_wake_up_src_t wake_up_src;
2520 | lsm6dsox_tap_src_t tap_src;
2521 | lsm6dsox_d6d_src_t d6d_src;
2522 | lsm6dsox_emb_func_src_t func_src;
2523 | lsm6dsox_md1_cfg_t md1_cfg;
2524 | lsm6dsox_md2_cfg_t md2_cfg;
2525 | lsm6dsox_emb_func_int1_t int1_ctrl;
2526 | lsm6dsox_emb_func_int2_t int2_ctrl;
2527 |
2528 | (void)memset((void *)Status, 0x0, sizeof(LSM6DSOX_Event_Status_t));
2529 |
2530 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_WAKE_UP_SRC, (uint8_t *)&wake_up_src, 1) != LSM6DSOX_OK)
2531 | {
2532 | return LSM6DSOX_ERROR;
2533 | }
2534 |
2535 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_TAP_SRC, (uint8_t *)&tap_src, 1) != LSM6DSOX_OK)
2536 | {
2537 | return LSM6DSOX_ERROR;
2538 | }
2539 |
2540 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_D6D_SRC, (uint8_t *)&d6d_src, 1) != LSM6DSOX_OK)
2541 | {
2542 | return LSM6DSOX_ERROR;
2543 | }
2544 |
2545 | if (lsm6dsox_mem_bank_set(®_ctx, LSM6DSOX_EMBEDDED_FUNC_BANK) != LSM6DSOX_OK)
2546 | {
2547 | return LSM6DSOX_ERROR;
2548 | }
2549 |
2550 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_EMB_FUNC_SRC, (uint8_t *)&func_src, 1) != LSM6DSOX_OK)
2551 | {
2552 | return LSM6DSOX_ERROR;
2553 | }
2554 |
2555 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_EMB_FUNC_INT1, (uint8_t *)&int1_ctrl, 1) != LSM6DSOX_OK)
2556 | {
2557 | return LSM6DSOX_ERROR;
2558 | }
2559 |
2560 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_EMB_FUNC_INT2, (uint8_t *)&int2_ctrl, 1) != LSM6DSOX_OK)
2561 | {
2562 | return LSM6DSOX_ERROR;
2563 | }
2564 |
2565 | if (lsm6dsox_mem_bank_set(®_ctx, LSM6DSOX_USER_BANK) != LSM6DSOX_OK)
2566 | {
2567 | return LSM6DSOX_ERROR;
2568 | }
2569 |
2570 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_MD1_CFG, (uint8_t *)&md1_cfg, 1) != LSM6DSOX_OK)
2571 | {
2572 | return LSM6DSOX_ERROR;
2573 | }
2574 |
2575 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_MD2_CFG, (uint8_t *)&md2_cfg, 1) != LSM6DSOX_OK)
2576 | {
2577 | return LSM6DSOX_ERROR;
2578 | }
2579 |
2580 | if (lsm6dsox_tilt_flag_data_ready_get(®_ctx, &tilt_ia) != LSM6DSOX_OK)
2581 | {
2582 | return LSM6DSOX_ERROR;
2583 | }
2584 |
2585 | if ((md1_cfg.int1_ff == 1U) || (md2_cfg.int2_ff == 1U))
2586 | {
2587 | if (wake_up_src.ff_ia == 1U)
2588 | {
2589 | Status->FreeFallStatus = 1;
2590 | }
2591 | }
2592 |
2593 | if ((md1_cfg.int1_wu == 1U) || (md2_cfg.int2_wu == 1U))
2594 | {
2595 | if (wake_up_src.wu_ia == 1U)
2596 | {
2597 | Status->WakeUpStatus = 1;
2598 | }
2599 | }
2600 |
2601 | if ((md1_cfg.int1_single_tap == 1U) || (md2_cfg.int2_single_tap == 1U))
2602 | {
2603 | if (tap_src.single_tap == 1U)
2604 | {
2605 | Status->TapStatus = 1;
2606 | }
2607 | }
2608 |
2609 | if ((md1_cfg.int1_double_tap == 1U) || (md2_cfg.int2_double_tap == 1U))
2610 | {
2611 | if (tap_src.double_tap == 1U)
2612 | {
2613 | Status->DoubleTapStatus = 1;
2614 | }
2615 | }
2616 |
2617 | if ((md1_cfg.int1_6d == 1U) || (md2_cfg.int2_6d == 1U))
2618 | {
2619 | if (d6d_src.d6d_ia == 1U)
2620 | {
2621 | Status->D6DOrientationStatus = 1;
2622 | }
2623 | }
2624 |
2625 | if (int1_ctrl.int1_step_detector == 1U)
2626 | {
2627 | if (func_src.step_detected == 1U)
2628 | {
2629 | Status->StepStatus = 1;
2630 | }
2631 | }
2632 |
2633 | if ((int1_ctrl.int1_tilt == 1U) || (int2_ctrl.int2_tilt == 1U))
2634 | {
2635 | if (tilt_ia == 1U)
2636 | {
2637 | Status->TiltStatus = 1;
2638 | }
2639 | }
2640 |
2641 | return LSM6DSOX_OK;
2642 | }
2643 |
2644 | /**
2645 | * @brief Set self test
2646 | * @param val the value of st_xl in reg CTRL5_C
2647 | * @retval 0 in case of success, an error code otherwise
2648 | */
2649 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_X_SelfTest(uint8_t val)
2650 | {
2651 | lsm6dsox_st_xl_t reg;
2652 |
2653 | reg = (val == 0U) ? LSM6DSOX_XL_ST_DISABLE
2654 | : (val == 1U) ? LSM6DSOX_XL_ST_POSITIVE
2655 | : (val == 2U) ? LSM6DSOX_XL_ST_NEGATIVE
2656 | : LSM6DSOX_XL_ST_DISABLE;
2657 |
2658 | if (lsm6dsox_xl_self_test_set(®_ctx, reg) != LSM6DSOX_OK)
2659 | {
2660 | return LSM6DSOX_ERROR;
2661 | }
2662 |
2663 | return LSM6DSOX_OK;
2664 | }
2665 |
2666 | /**
2667 | * @brief Get the LSM6DSOX GYRO data ready bit value
2668 | * @param Status the status of data ready bit
2669 | * @retval 0 in case of success, an error code otherwise
2670 | */
2671 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_G_DRDY_Status(uint8_t *Status)
2672 | {
2673 | if (lsm6dsox_gy_flag_data_ready_get(®_ctx, Status) != LSM6DSOX_OK)
2674 | {
2675 | return LSM6DSOX_ERROR;
2676 | }
2677 |
2678 | return LSM6DSOX_OK;
2679 | }
2680 |
2681 | /**
2682 | * @brief Set self test
2683 | * @param val the value of st_xl in reg CTRL5_C
2684 | * @retval 0 in case of success, an error code otherwise
2685 | */
2686 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_G_SelfTest(uint8_t val)
2687 | {
2688 | lsm6dsox_st_g_t reg;
2689 |
2690 | reg = (val == 0U) ? LSM6DSOX_GY_ST_DISABLE
2691 | : (val == 1U) ? LSM6DSOX_GY_ST_POSITIVE
2692 | : (val == 2U) ? LSM6DSOX_GY_ST_NEGATIVE
2693 | : LSM6DSOX_GY_ST_DISABLE;
2694 |
2695 |
2696 | if (lsm6dsox_gy_self_test_set(®_ctx, reg) != LSM6DSOX_OK)
2697 | {
2698 | return LSM6DSOX_ERROR;
2699 | }
2700 |
2701 | return LSM6DSOX_OK;
2702 | }
2703 |
2704 | /**
2705 | * @brief Get the LSM6DSOX FIFO number of samples
2706 | * @param NumSamples number of samples
2707 | * @retval 0 in case of success, an error code otherwise
2708 | */
2709 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Num_Samples(uint16_t *NumSamples)
2710 | {
2711 | if (lsm6dsox_fifo_data_level_get(®_ctx, NumSamples) != LSM6DSOX_OK)
2712 | {
2713 | return LSM6DSOX_ERROR;
2714 | }
2715 |
2716 | return LSM6DSOX_OK;
2717 | }
2718 |
2719 | /**
2720 | * @brief Get the LSM6DSOX FIFO full status
2721 | * @param Status FIFO full status
2722 | * @retval 0 in case of success, an error code otherwise
2723 | */
2724 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Full_Status(uint8_t *Status)
2725 | {
2726 | lsm6dsox_reg_t reg;
2727 |
2728 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_FIFO_STATUS2, ®.byte, 1) != LSM6DSOX_OK)
2729 | {
2730 | return LSM6DSOX_ERROR;
2731 | }
2732 |
2733 | *Status = reg.fifo_status2.fifo_full_ia;
2734 |
2735 | return LSM6DSOX_OK;
2736 | }
2737 |
2738 | /**
2739 | * @brief Get the LSM6DSOX FIFO overrun status
2740 | * @param Status FIFO overrun status
2741 | * @retval 0 in case of success, an error code otherwise
2742 | */
2743 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Overrun_Status(uint8_t *Status)
2744 | {
2745 | lsm6dsox_reg_t reg;
2746 |
2747 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_FIFO_STATUS2, ®.byte, 1) != LSM6DSOX_OK)
2748 | {
2749 | return LSM6DSOX_ERROR;
2750 | }
2751 |
2752 | *Status = reg.fifo_status2.fifo_ovr_ia;
2753 |
2754 | return LSM6DSOX_OK;
2755 | }
2756 |
2757 | /**
2758 | * @brief Get the LSM6DSOX FIFO watermark status
2759 | * @param Status FIFO watermark status
2760 | * @retval 0 in case of success, an error code otherwise
2761 | */
2762 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Watermark_Status(uint8_t *Status)
2763 | {
2764 | lsm6dsox_reg_t reg;
2765 |
2766 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_FIFO_STATUS2, ®.byte, 1) != LSM6DSOX_OK)
2767 | {
2768 | return LSM6DSOX_ERROR;
2769 | }
2770 |
2771 | *Status = reg.fifo_status2.fifo_wtm_ia;
2772 |
2773 | return LSM6DSOX_OK;
2774 | }
2775 |
2776 | /**
2777 | * @brief Set the LSM6DSOX FIFO full interrupt on INT1 pin
2778 | * @param Status FIFO full interrupt on INT1 pin status
2779 | * @retval 0 in case of success, an error code otherwise
2780 | */
2781 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_INT1_FIFO_Full(uint8_t Status)
2782 | {
2783 | lsm6dsox_reg_t reg;
2784 |
2785 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_INT1_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2786 | {
2787 | return LSM6DSOX_ERROR;
2788 | }
2789 |
2790 | reg.int1_ctrl.int1_fifo_full = Status;
2791 |
2792 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_INT1_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2793 | {
2794 | return LSM6DSOX_ERROR;
2795 | }
2796 |
2797 | return LSM6DSOX_OK;
2798 | }
2799 |
2800 | /**
2801 | * @brief Set the LSM6DSOX FIFO overrun interrupt on INT1 pin
2802 | * @param Status FIFO overrun interrupt on INT1 pin status
2803 | * @retval 0 in case of success, an error code otherwise
2804 | */
2805 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_INT1_FIFO_Overrun(uint8_t Status)
2806 | {
2807 | lsm6dsox_reg_t reg;
2808 |
2809 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_INT1_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2810 | {
2811 | return LSM6DSOX_ERROR;
2812 | }
2813 |
2814 | reg.int1_ctrl.int1_fifo_ovr = Status;
2815 |
2816 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_INT1_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2817 | {
2818 | return LSM6DSOX_ERROR;
2819 | }
2820 |
2821 | return LSM6DSOX_OK;
2822 | }
2823 |
2824 | /**
2825 | * @brief Set the LSM6DSOX FIFO threshold interrupt on INT1 pin
2826 | * @param Status FIFO threshold interrupt on INT1 pin status
2827 | * @retval 0 in case of success, an error code otherwise
2828 | */
2829 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_INT1_FIFO_Threshold(uint8_t Status)
2830 | {
2831 | lsm6dsox_reg_t reg;
2832 |
2833 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_INT1_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2834 | {
2835 | return LSM6DSOX_ERROR;
2836 | }
2837 |
2838 | reg.int1_ctrl.int1_fifo_th = Status;
2839 |
2840 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_INT1_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2841 | {
2842 | return LSM6DSOX_ERROR;
2843 | }
2844 |
2845 | return LSM6DSOX_OK;
2846 | }
2847 |
2848 | /**
2849 | * @brief Set the LSM6DSOX FIFO full interrupt on INT2 pin
2850 | * @param Status FIFO full interrupt on INT2 pin status
2851 | * @retval 0 in case of success, an error code otherwise
2852 | */
2853 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_INT2_FIFO_Full(uint8_t Status)
2854 | {
2855 | lsm6dsox_reg_t reg;
2856 |
2857 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_INT2_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2858 | {
2859 | return LSM6DSOX_ERROR;
2860 | }
2861 |
2862 | reg.int2_ctrl.int2_fifo_full = Status;
2863 |
2864 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_INT2_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2865 | {
2866 | return LSM6DSOX_ERROR;
2867 | }
2868 |
2869 | return LSM6DSOX_OK;
2870 | }
2871 |
2872 | /**
2873 | * @brief Set the LSM6DSOX FIFO overrun interrupt on INT2 pin
2874 | * @param Status FIFO overrun interrupt on INT2 pin status
2875 | * @retval 0 in case of success, an error code otherwise
2876 | */
2877 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_INT2_FIFO_Overrun(uint8_t Status)
2878 | {
2879 | lsm6dsox_reg_t reg;
2880 |
2881 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_INT2_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2882 | {
2883 | return LSM6DSOX_ERROR;
2884 | }
2885 |
2886 | reg.int2_ctrl.int2_fifo_ovr = Status;
2887 |
2888 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_INT2_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2889 | {
2890 | return LSM6DSOX_ERROR;
2891 | }
2892 |
2893 | return LSM6DSOX_OK;
2894 | }
2895 |
2896 | /**
2897 | * @brief Set the LSM6DSOX FIFO threshold interrupt on INT2 pin
2898 | * @param Status FIFO threshold interrupt on INT2 pin status
2899 | * @retval 0 in case of success, an error code otherwise
2900 | */
2901 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_INT2_FIFO_Threshold(uint8_t Status)
2902 | {
2903 | lsm6dsox_reg_t reg;
2904 |
2905 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_INT2_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2906 | {
2907 | return LSM6DSOX_ERROR;
2908 | }
2909 |
2910 | reg.int2_ctrl.int2_fifo_th = Status;
2911 |
2912 | if (lsm6dsox_write_reg(®_ctx, LSM6DSOX_INT2_CTRL, ®.byte, 1) != LSM6DSOX_OK)
2913 | {
2914 | return LSM6DSOX_ERROR;
2915 | }
2916 |
2917 | return LSM6DSOX_OK;
2918 | }
2919 |
2920 | /**
2921 | * @brief Set the LSM6DSOX FIFO watermark level
2922 | * @param Watermark FIFO watermark level
2923 | * @retval 0 in case of success, an error code otherwise
2924 | */
2925 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Watermark_Level(uint16_t Watermark)
2926 | {
2927 | if (lsm6dsox_fifo_watermark_set(®_ctx, Watermark) != LSM6DSOX_OK)
2928 | {
2929 | return LSM6DSOX_ERROR;
2930 | }
2931 |
2932 | return LSM6DSOX_OK;
2933 | }
2934 |
2935 | /**
2936 | * @brief Set the LSM6DSOX FIFO stop on watermark
2937 | * @param Status FIFO stop on watermark status
2938 | * @retval 0 in case of success, an error code otherwise
2939 | */
2940 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Stop_On_Fth(uint8_t Status)
2941 | {
2942 | if (lsm6dsox_fifo_stop_on_wtm_set(®_ctx, Status) != LSM6DSOX_OK)
2943 | {
2944 | return LSM6DSOX_ERROR;
2945 | }
2946 |
2947 | return LSM6DSOX_OK;
2948 | }
2949 |
2950 | /**
2951 | * @brief Set the LSM6DSOX FIFO mode
2952 | * @param Mode FIFO mode
2953 | * @retval 0 in case of success, an error code otherwise
2954 | */
2955 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Mode(uint8_t Mode)
2956 | {
2957 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
2958 |
2959 | /* Verify that the passed parameter contains one of the valid values. */
2960 | switch ((lsm6dsox_fifo_mode_t)Mode)
2961 | {
2962 | case LSM6DSOX_BYPASS_MODE:
2963 | case LSM6DSOX_FIFO_MODE:
2964 | case LSM6DSOX_STREAM_TO_FIFO_MODE:
2965 | case LSM6DSOX_BYPASS_TO_STREAM_MODE:
2966 | case LSM6DSOX_STREAM_MODE:
2967 | break;
2968 |
2969 | default:
2970 | ret = LSM6DSOX_ERROR;
2971 | break;
2972 | }
2973 |
2974 | if (ret == LSM6DSOX_ERROR)
2975 | {
2976 | return ret;
2977 | }
2978 |
2979 | if (lsm6dsox_fifo_mode_set(®_ctx, (lsm6dsox_fifo_mode_t)Mode) != LSM6DSOX_OK)
2980 | {
2981 | return LSM6DSOX_ERROR;
2982 | }
2983 |
2984 | return ret;
2985 | }
2986 |
2987 | /**
2988 | * @brief Get the LSM6DSOX FIFO tag
2989 | * @param Tag FIFO tag
2990 | * @retval 0 in case of success, an error code otherwise
2991 | */
2992 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Tag(uint8_t *Tag)
2993 | {
2994 | lsm6dsox_fifo_tag_t tag_local;
2995 |
2996 | if (lsm6dsox_fifo_sensor_tag_get(®_ctx, &tag_local) != LSM6DSOX_OK)
2997 | {
2998 | return LSM6DSOX_ERROR;
2999 | }
3000 |
3001 | *Tag = (uint8_t)tag_local;
3002 |
3003 | return LSM6DSOX_OK;
3004 | }
3005 |
3006 | /**
3007 | * @brief Get the LSM6DSOX FIFO raw data
3008 | * @param Data FIFO raw data array [6]
3009 | * @retval 0 in case of success, an error code otherwise
3010 | */
3011 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Data(uint8_t *Data)
3012 | {
3013 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_FIFO_DATA_OUT_X_L, Data, 6) != LSM6DSOX_OK)
3014 | {
3015 | return LSM6DSOX_ERROR;
3016 | }
3017 |
3018 | return LSM6DSOX_OK;
3019 | }
3020 |
3021 | /**
3022 | * @brief Get the LSM6DSOX FIFO sample
3023 | * @param Sample FIFO sample array [multiple of 7]
3024 | * @param Count Count of samples to get.
3025 | * @retval 0 in case of success, an error code otherwise
3026 | */
3027 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_Sample(uint8_t *Sample, uint16_t Count)
3028 | {
3029 | if (lsm6dsox_read_reg(®_ctx, LSM6DSOX_FIFO_DATA_OUT_TAG, Sample, Count * 7) != LSM6DSOX_OK)
3030 | {
3031 | return LSM6DSOX_ERROR;
3032 | }
3033 |
3034 | return LSM6DSOX_OK;
3035 | }
3036 |
3037 | /**
3038 | * @brief Get the LSM6DSOX FIFO accelero single sample (16-bit data per 3 axes) and calculate acceleration [mg]
3039 | * @param Acceleration FIFO accelero axes [mg]
3040 | * @retval 0 in case of success, an error code otherwise
3041 | */
3042 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_X_Axes(int32_t *Acceleration)
3043 | {
3044 | uint8_t data[6];
3045 | int16_t data_raw[3];
3046 | float sensitivity = 0.0f;
3047 | float acceleration_float[3];
3048 |
3049 | if (Get_FIFO_Data(data) != LSM6DSOX_OK)
3050 | {
3051 | return LSM6DSOX_ERROR;
3052 | }
3053 |
3054 | data_raw[0] = ((int16_t)data[1] << 8) | data[0];
3055 | data_raw[1] = ((int16_t)data[3] << 8) | data[2];
3056 | data_raw[2] = ((int16_t)data[5] << 8) | data[4];
3057 |
3058 | if (Get_X_Sensitivity(&sensitivity) != LSM6DSOX_OK)
3059 | {
3060 | return LSM6DSOX_ERROR;
3061 | }
3062 |
3063 | acceleration_float[0] = (float)data_raw[0] * sensitivity;
3064 | acceleration_float[1] = (float)data_raw[1] * sensitivity;
3065 | acceleration_float[2] = (float)data_raw[2] * sensitivity;
3066 |
3067 | Acceleration[0] = (int32_t)acceleration_float[0];
3068 | Acceleration[1] = (int32_t)acceleration_float[1];
3069 | Acceleration[2] = (int32_t)acceleration_float[2];
3070 |
3071 | return LSM6DSOX_OK;
3072 | }
3073 |
3074 | /**
3075 | * @brief Set the LSM6DSOX FIFO accelero BDR value
3076 | * @param Bdr FIFO accelero BDR value
3077 | * @retval 0 in case of success, an error code otherwise
3078 | */
3079 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_X_BDR(float Bdr)
3080 | {
3081 | lsm6dsox_bdr_xl_t new_bdr;
3082 |
3083 | new_bdr = (Bdr <= 0.0f) ? LSM6DSOX_XL_NOT_BATCHED
3084 | : (Bdr <= 12.5f) ? LSM6DSOX_XL_BATCHED_AT_12Hz5
3085 | : (Bdr <= 26.0f) ? LSM6DSOX_XL_BATCHED_AT_26Hz
3086 | : (Bdr <= 52.0f) ? LSM6DSOX_XL_BATCHED_AT_52Hz
3087 | : (Bdr <= 104.0f) ? LSM6DSOX_XL_BATCHED_AT_104Hz
3088 | : (Bdr <= 208.0f) ? LSM6DSOX_XL_BATCHED_AT_208Hz
3089 | : (Bdr <= 416.0f) ? LSM6DSOX_XL_BATCHED_AT_417Hz
3090 | : (Bdr <= 833.0f) ? LSM6DSOX_XL_BATCHED_AT_833Hz
3091 | : (Bdr <= 1660.0f) ? LSM6DSOX_XL_BATCHED_AT_1667Hz
3092 | : (Bdr <= 3330.0f) ? LSM6DSOX_XL_BATCHED_AT_3333Hz
3093 | : LSM6DSOX_XL_BATCHED_AT_6667Hz;
3094 |
3095 | if (lsm6dsox_fifo_xl_batch_set(®_ctx, new_bdr) != LSM6DSOX_OK)
3096 | {
3097 | return LSM6DSOX_ERROR;
3098 | }
3099 |
3100 | return LSM6DSOX_OK;
3101 | }
3102 |
3103 | /**
3104 | * @brief Get the LSM6DSOX FIFO gyro single sample (16-bit data per 3 axes) and calculate angular velocity [mDPS]
3105 | * @param AngularVelocity FIFO gyro axes [mDPS]
3106 | * @retval 0 in case of success, an error code otherwise
3107 | */
3108 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_FIFO_G_Axes(int32_t *AngularVelocity)
3109 | {
3110 | uint8_t data[6];
3111 | int16_t data_raw[3];
3112 | float sensitivity = 0.0f;
3113 | float angular_velocity_float[3];
3114 |
3115 | if (Get_FIFO_Data(data) != LSM6DSOX_OK)
3116 | {
3117 | return LSM6DSOX_ERROR;
3118 | }
3119 |
3120 | data_raw[0] = ((int16_t)data[1] << 8) | data[0];
3121 | data_raw[1] = ((int16_t)data[3] << 8) | data[2];
3122 | data_raw[2] = ((int16_t)data[5] << 8) | data[4];
3123 |
3124 | if (Get_G_Sensitivity(&sensitivity) != LSM6DSOX_OK)
3125 | {
3126 | return LSM6DSOX_ERROR;
3127 | }
3128 |
3129 | angular_velocity_float[0] = (float)data_raw[0] * sensitivity;
3130 | angular_velocity_float[1] = (float)data_raw[1] * sensitivity;
3131 | angular_velocity_float[2] = (float)data_raw[2] * sensitivity;
3132 |
3133 | AngularVelocity[0] = (int32_t)angular_velocity_float[0];
3134 | AngularVelocity[1] = (int32_t)angular_velocity_float[1];
3135 | AngularVelocity[2] = (int32_t)angular_velocity_float[2];
3136 |
3137 | return LSM6DSOX_OK;
3138 | }
3139 |
3140 | /**
3141 | * @brief Set the LSM6DSOX FIFO gyro BDR value
3142 | * @param Bdr FIFO gyro BDR value
3143 | * @retval 0 in case of success, an error code otherwise
3144 | */
3145 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_G_BDR(float Bdr)
3146 | {
3147 | lsm6dsox_bdr_gy_t new_bdr;
3148 |
3149 | new_bdr = (Bdr <= 0.0f) ? LSM6DSOX_GY_NOT_BATCHED
3150 | : (Bdr <= 12.5f) ? LSM6DSOX_GY_BATCHED_AT_12Hz5
3151 | : (Bdr <= 26.0f) ? LSM6DSOX_GY_BATCHED_AT_26Hz
3152 | : (Bdr <= 52.0f) ? LSM6DSOX_GY_BATCHED_AT_52Hz
3153 | : (Bdr <= 104.0f) ? LSM6DSOX_GY_BATCHED_AT_104Hz
3154 | : (Bdr <= 208.0f) ? LSM6DSOX_GY_BATCHED_AT_208Hz
3155 | : (Bdr <= 416.0f) ? LSM6DSOX_GY_BATCHED_AT_417Hz
3156 | : (Bdr <= 833.0f) ? LSM6DSOX_GY_BATCHED_AT_833Hz
3157 | : (Bdr <= 1660.0f) ? LSM6DSOX_GY_BATCHED_AT_1667Hz
3158 | : (Bdr <= 3330.0f) ? LSM6DSOX_GY_BATCHED_AT_3333Hz
3159 | : LSM6DSOX_GY_BATCHED_AT_6667Hz;
3160 |
3161 | if (lsm6dsox_fifo_gy_batch_set(®_ctx, new_bdr) != LSM6DSOX_OK)
3162 | {
3163 | return LSM6DSOX_ERROR;
3164 | }
3165 |
3166 | return LSM6DSOX_OK;
3167 | }
3168 |
3169 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_MLC_Status(LSM6DSOX_MLC_Status_t *Status)
3170 | {
3171 | if (lsm6dsox_mlc_status_get(®_ctx, (lsm6dsox_mlc_status_mainpage_t *)Status) != LSM6DSOX_OK)
3172 | {
3173 | return LSM6DSOX_ERROR;
3174 | }
3175 |
3176 | return LSM6DSOX_OK;
3177 | }
3178 |
3179 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_MLC_Output(uint8_t *Output)
3180 | {
3181 | if (lsm6dsox_mlc_out_get(®_ctx, Output) != LSM6DSOX_OK)
3182 | {
3183 | return LSM6DSOX_ERROR;
3184 | }
3185 |
3186 | return LSM6DSOX_OK;
3187 | }
3188 |
3189 | /**
3190 | * @brief Get the LSM6DSOX timestamp enable status
3191 | * @param Status Timestamp enable status
3192 | * @retval 0 in case of success, an error code otherwise
3193 | */
3194 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Get_Timestamp_Status(uint8_t *Status)
3195 | {
3196 | if (lsm6dsox_timestamp_get(®_ctx, Status) != LSM6DSOX_OK)
3197 | {
3198 | return LSM6DSOX_ERROR;
3199 | }
3200 |
3201 | return LSM6DSOX_OK;
3202 | }
3203 |
3204 | /**
3205 | * @brief Set the LSM6DSOX timestamp enable status
3206 | * @param Status Timestamp enable status
3207 | * @retval 0 in case of success, an error code otherwise
3208 | */
3209 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_Timestamp_Status(uint8_t Status)
3210 | {
3211 | if (lsm6dsox_timestamp_set(®_ctx, Status) != LSM6DSOX_OK)
3212 | {
3213 | return LSM6DSOX_ERROR;
3214 | }
3215 |
3216 | return LSM6DSOX_OK;
3217 | }
3218 |
3219 | /**
3220 | * @brief Set the LSM6DSOX FIFO timestamp decimation
3221 | * @param Decimation FIFO timestamp decimation
3222 | * @retval 0 in case of success, an error code otherwise
3223 | */
3224 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Timestamp_Decimation(uint8_t Decimation)
3225 | {
3226 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
3227 |
3228 | /* Verify that the passed parameter contains one of the valid values. */
3229 | switch ((lsm6dsox_odr_ts_batch_t)Decimation)
3230 | {
3231 | case LSM6DSOX_NO_DECIMATION:
3232 | case LSM6DSOX_DEC_1:
3233 | case LSM6DSOX_DEC_8:
3234 | case LSM6DSOX_DEC_32:
3235 | break;
3236 |
3237 | default:
3238 | ret = LSM6DSOX_ERROR;
3239 | break;
3240 | }
3241 |
3242 | if (ret == LSM6DSOX_ERROR)
3243 | {
3244 | return ret;
3245 | }
3246 |
3247 | if (lsm6dsox_fifo_timestamp_decimation_set(®_ctx, (lsm6dsox_odr_ts_batch_t)Decimation) != LSM6DSOX_OK)
3248 | {
3249 | return LSM6DSOX_ERROR;
3250 | }
3251 |
3252 | return ret;
3253 | }
3254 |
3255 | /**
3256 | * @brief Set the LSM6DSOX FIFO compression initialization status
3257 | * @param Status FIFO compression initialization status
3258 | * @retval 0 in case of success, an error code otherwise
3259 | */
3260 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Init(uint8_t Status)
3261 | {
3262 | if (lsm6dsox_compression_algo_init_set(®_ctx, Status) != LSM6DSOX_OK)
3263 | {
3264 | return LSM6DSOX_ERROR;
3265 | }
3266 |
3267 | return LSM6DSOX_OK;
3268 | }
3269 |
3270 | /**
3271 | * @brief Set the LSM6DSOX FIFO compression enable status
3272 | * @param Status FIFO compression enable status
3273 | * @retval 0 in case of success, an error code otherwise
3274 | */
3275 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Enable(uint8_t Status)
3276 | {
3277 | lsm6dsox_emb_sens_t val;
3278 | if (lsm6dsox_embedded_sens_get(®_ctx, &val) != LSM6DSOX_OK)
3279 | {
3280 | return LSM6DSOX_ERROR;
3281 | }
3282 |
3283 | val.fifo_compr = Status;
3284 |
3285 | if (lsm6dsox_embedded_sens_set(®_ctx, &val) != LSM6DSOX_OK)
3286 | {
3287 | return LSM6DSOX_ERROR;
3288 | }
3289 |
3290 | return LSM6DSOX_OK;
3291 | }
3292 |
3293 | /**
3294 | * @brief Set the LSM6DSOX FIFO compression configuration and enable status
3295 | * @param Compression FIFO compression and enable status
3296 | * @retval 0 in case of success, an error code otherwise
3297 | */
3298 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Set(uint8_t Compression)
3299 | {
3300 | LSM6DSOXStatusTypeDef ret = LSM6DSOX_OK;
3301 |
3302 | /* Verify that the passed parameter contains one of the valid values. */
3303 | switch ((lsm6dsox_uncoptr_rate_t)Compression)
3304 | {
3305 | case LSM6DSOX_CMP_DISABLE:
3306 | case LSM6DSOX_CMP_ALWAYS:
3307 | case LSM6DSOX_CMP_8_TO_1:
3308 | case LSM6DSOX_CMP_16_TO_1:
3309 | case LSM6DSOX_CMP_32_TO_1:
3310 | break;
3311 |
3312 | default:
3313 | ret = LSM6DSOX_ERROR;
3314 | break;
3315 | }
3316 |
3317 |
3318 | if (ret == LSM6DSOX_ERROR)
3319 | {
3320 | return ret;
3321 | }
3322 |
3323 | if (lsm6dsox_compression_algo_set(®_ctx, (lsm6dsox_uncoptr_rate_t)Compression) != LSM6DSOX_OK)
3324 | {
3325 | return LSM6DSOX_ERROR;
3326 | }
3327 |
3328 | return ret;
3329 | }
3330 |
3331 | /**
3332 | * @brief Set the LSM6DSOX FIFO compression real time enable status
3333 | * @param Status FIFO compression real time enable status
3334 | * @retval 0 in case of success, an error code otherwise
3335 | */
3336 | LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Real_Time_Set(uint8_t Status)
3337 | {
3338 | if (lsm6dsox_compression_algo_real_time_set(®_ctx, Status) != LSM6DSOX_OK)
3339 | {
3340 | return LSM6DSOX_ERROR;
3341 | }
3342 |
3343 | return LSM6DSOX_OK;
3344 | }
3345 |
3346 | int32_t LSM6DSOX_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite)
3347 | {
3348 | return ((LSM6DSOXSensor *)handle)->IO_Write(pBuffer, WriteAddr, nBytesToWrite);
3349 | }
3350 |
3351 | int32_t LSM6DSOX_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead)
3352 | {
3353 | return ((LSM6DSOXSensor *)handle)->IO_Read(pBuffer, ReadAddr, nBytesToRead);
3354 | }
3355 |
--------------------------------------------------------------------------------
/src/LSM6DSOXSensor.h:
--------------------------------------------------------------------------------
1 | /**
2 | ******************************************************************************
3 | * @file LSM6DSOXSensor.h
4 | * @author SRA
5 | * @version V1.0.0
6 | * @date February 2019
7 | * @brief Abstract Class of an LSM6DSOX Inertial Measurement Unit (IMU) 3 axes
8 | * sensor.
9 | ******************************************************************************
10 | * @attention
11 | *
12 | * © COPYRIGHT(c) 2019 STMicroelectronics
13 | *
14 | * Redistribution and use in source and binary forms, with or without modification,
15 | * are permitted provided that the following conditions are met:
16 | * 1. Redistributions of source code must retain the above copyright notice,
17 | * this list of conditions and the following disclaimer.
18 | * 2. Redistributions in binary form must reproduce the above copyright notice,
19 | * this list of conditions and the following disclaimer in the documentation
20 | * and/or other materials provided with the distribution.
21 | * 3. Neither the name of STMicroelectronics nor the names of its contributors
22 | * may be used to endorse or promote products derived from this software
23 | * without specific prior written permission.
24 | *
25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 | *
36 | ******************************************************************************
37 | */
38 |
39 |
40 | /* Prevent recursive inclusion -----------------------------------------------*/
41 |
42 | #ifndef __LSM6DSOXSensor_H__
43 | #define __LSM6DSOXSensor_H__
44 |
45 |
46 | /* Includes ------------------------------------------------------------------*/
47 |
48 | #include "Wire.h"
49 | #include "SPI.h"
50 | #include "lsm6dsox_reg.h"
51 |
52 | /* Defines -------------------------------------------------------------------*/
53 | /* For compatibility with ESP32 platforms */
54 | #ifdef ESP32
55 | #ifndef MSBFIRST
56 | #define MSBFIRST SPI_MSBFIRST
57 | #endif
58 | #endif
59 |
60 | #define LSM6DSOX_ACC_SENSITIVITY_FS_2G 0.061f
61 | #define LSM6DSOX_ACC_SENSITIVITY_FS_4G 0.122f
62 | #define LSM6DSOX_ACC_SENSITIVITY_FS_8G 0.244f
63 | #define LSM6DSOX_ACC_SENSITIVITY_FS_16G 0.488f
64 |
65 | #define LSM6DSOX_GYRO_SENSITIVITY_FS_125DPS 4.375f
66 | #define LSM6DSOX_GYRO_SENSITIVITY_FS_250DPS 8.750f
67 | #define LSM6DSOX_GYRO_SENSITIVITY_FS_500DPS 17.500f
68 | #define LSM6DSOX_GYRO_SENSITIVITY_FS_1000DPS 35.000f
69 | #define LSM6DSOX_GYRO_SENSITIVITY_FS_2000DPS 70.000f
70 |
71 |
72 | /* Typedefs ------------------------------------------------------------------*/
73 |
74 | typedef enum
75 | {
76 | LSM6DSOX_OK = 0,
77 | LSM6DSOX_ERROR =-1
78 | } LSM6DSOXStatusTypeDef;
79 |
80 | typedef enum
81 | {
82 | LSM6DSOX_INT1_PIN,
83 | LSM6DSOX_INT2_PIN,
84 | } LSM6DSOX_SensorIntPin_t;
85 |
86 | typedef enum
87 | {
88 | LSM6DSOX_ACC_HIGH_PERFORMANCE_MODE,
89 | LSM6DSOX_ACC_LOW_POWER_NORMAL_MODE,
90 | LSM6DSOX_ACC_ULTRA_LOW_POWER_MODE
91 | } LSM6DSOX_ACC_Operating_Mode_t;
92 |
93 | typedef enum
94 | {
95 | LSM6DSOX_GYRO_HIGH_PERFORMANCE_MODE,
96 | LSM6DSOX_GYRO_LOW_POWER_NORMAL_MODE
97 | } LSM6DSOX_GYRO_Operating_Mode_t;
98 |
99 | typedef struct
100 | {
101 | unsigned int FreeFallStatus : 1;
102 | unsigned int TapStatus : 1;
103 | unsigned int DoubleTapStatus : 1;
104 | unsigned int WakeUpStatus : 1;
105 | unsigned int StepStatus : 1;
106 | unsigned int TiltStatus : 1;
107 | unsigned int D6DOrientationStatus : 1;
108 | unsigned int SleepStatus : 1;
109 | } LSM6DSOX_Event_Status_t;
110 |
111 | typedef struct {
112 | unsigned int is_mlc1 : 1;
113 | unsigned int is_mlc2 : 1;
114 | unsigned int is_mlc3 : 1;
115 | unsigned int is_mlc4 : 1;
116 | unsigned int is_mlc5 : 1;
117 | unsigned int is_mlc6 : 1;
118 | unsigned int is_mlc7 : 1;
119 | unsigned int is_mlc8 : 1;
120 | } LSM6DSOX_MLC_Status_t;
121 |
122 |
123 | /* Class Declaration ---------------------------------------------------------*/
124 |
125 | /**
126 | * Abstract class of an LSM6DSOX Inertial Measurement Unit (IMU) 3 axes
127 | * sensor.
128 | */
129 | class LSM6DSOXSensor
130 | {
131 | public:
132 | LSM6DSOXSensor(TwoWire *i2c, uint8_t address=LSM6DSOX_I2C_ADD_H);
133 | LSM6DSOXSensor(SPIClass *spi, int cs_pin, uint32_t spi_speed=2000000);
134 | LSM6DSOXStatusTypeDef begin();
135 | LSM6DSOXStatusTypeDef end();
136 | LSM6DSOXStatusTypeDef ReadID(uint8_t *Id);
137 | LSM6DSOXStatusTypeDef Enable_X();
138 | LSM6DSOXStatusTypeDef Disable_X();
139 | LSM6DSOXStatusTypeDef Get_X_Sensitivity(float *Sensitivity);
140 | LSM6DSOXStatusTypeDef Get_X_ODR(float *Odr);
141 | LSM6DSOXStatusTypeDef Set_X_ODR(float Odr);
142 | LSM6DSOXStatusTypeDef Set_X_ODR_With_Mode(float Odr, LSM6DSOX_ACC_Operating_Mode_t Mode);
143 | LSM6DSOXStatusTypeDef Get_X_FS(int32_t *FullScale);
144 | LSM6DSOXStatusTypeDef Set_X_FS(int32_t FullScale);
145 | LSM6DSOXStatusTypeDef Get_X_AxesRaw(int16_t *Value);
146 | LSM6DSOXStatusTypeDef Get_X_Axes(int32_t *Acceleration);
147 |
148 | LSM6DSOXStatusTypeDef Enable_G();
149 | LSM6DSOXStatusTypeDef Disable_G();
150 | LSM6DSOXStatusTypeDef Get_G_Sensitivity(float *Sensitivity);
151 | LSM6DSOXStatusTypeDef Get_G_ODR(float *Odr);
152 | LSM6DSOXStatusTypeDef Set_G_ODR(float Odr);
153 | LSM6DSOXStatusTypeDef Set_G_ODR_With_Mode(float Odr, LSM6DSOX_GYRO_Operating_Mode_t Mode);
154 | LSM6DSOXStatusTypeDef Get_G_FS(int32_t *FullScale);
155 | LSM6DSOXStatusTypeDef Set_G_FS(int32_t FullScale);
156 | LSM6DSOXStatusTypeDef Get_G_AxesRaw(int16_t *Value);
157 | LSM6DSOXStatusTypeDef Get_G_Axes(int32_t *AngularRate);
158 |
159 | LSM6DSOXStatusTypeDef Read_Reg(uint8_t reg, uint8_t *Data);
160 | LSM6DSOXStatusTypeDef Write_Reg(uint8_t reg, uint8_t Data);
161 | LSM6DSOXStatusTypeDef Set_Interrupt_Latch(uint8_t Status);
162 |
163 | LSM6DSOXStatusTypeDef Enable_Free_Fall_Detection(LSM6DSOX_SensorIntPin_t IntPin);
164 | LSM6DSOXStatusTypeDef Disable_Free_Fall_Detection();
165 | LSM6DSOXStatusTypeDef Set_Free_Fall_Threshold(uint8_t Threshold);
166 | LSM6DSOXStatusTypeDef Set_Free_Fall_Duration(uint8_t Duration);
167 |
168 | LSM6DSOXStatusTypeDef Enable_Pedometer();
169 | LSM6DSOXStatusTypeDef Disable_Pedometer();
170 | LSM6DSOXStatusTypeDef Get_Step_Count(uint16_t *StepCount);
171 | LSM6DSOXStatusTypeDef Step_Counter_Reset();
172 |
173 | LSM6DSOXStatusTypeDef Enable_Tilt_Detection(LSM6DSOX_SensorIntPin_t IntPin);
174 | LSM6DSOXStatusTypeDef Disable_Tilt_Detection();
175 |
176 | LSM6DSOXStatusTypeDef Enable_Wake_Up_Detection(LSM6DSOX_SensorIntPin_t IntPin);
177 | LSM6DSOXStatusTypeDef Disable_Wake_Up_Detection();
178 | LSM6DSOXStatusTypeDef Set_Wake_Up_Threshold(uint8_t Threshold);
179 | LSM6DSOXStatusTypeDef Set_Wake_Up_Duration(uint8_t Duration);
180 |
181 | LSM6DSOXStatusTypeDef Enable_Single_Tap_Detection(LSM6DSOX_SensorIntPin_t IntPin);
182 | LSM6DSOXStatusTypeDef Disable_Single_Tap_Detection();
183 | LSM6DSOXStatusTypeDef Enable_Double_Tap_Detection(LSM6DSOX_SensorIntPin_t IntPin);
184 | LSM6DSOXStatusTypeDef Disable_Double_Tap_Detection();
185 | LSM6DSOXStatusTypeDef Set_Tap_Threshold(uint8_t Threshold);
186 | LSM6DSOXStatusTypeDef Set_Tap_Shock_Time(uint8_t Time);
187 | LSM6DSOXStatusTypeDef Set_Tap_Quiet_Time(uint8_t Time);
188 | LSM6DSOXStatusTypeDef Set_Tap_Duration_Time(uint8_t Time);
189 |
190 | LSM6DSOXStatusTypeDef Enable_6D_Orientation(LSM6DSOX_SensorIntPin_t IntPin);
191 | LSM6DSOXStatusTypeDef Disable_6D_Orientation();
192 | LSM6DSOXStatusTypeDef Set_6D_Orientation_Threshold(uint8_t Threshold);
193 | LSM6DSOXStatusTypeDef Get_6D_Orientation_XL(uint8_t *XLow);
194 | LSM6DSOXStatusTypeDef Get_6D_Orientation_XH(uint8_t *XHigh);
195 | LSM6DSOXStatusTypeDef Get_6D_Orientation_YL(uint8_t *YLow);
196 | LSM6DSOXStatusTypeDef Get_6D_Orientation_YH(uint8_t *YHigh);
197 | LSM6DSOXStatusTypeDef Get_6D_Orientation_ZL(uint8_t *ZLow);
198 | LSM6DSOXStatusTypeDef Get_6D_Orientation_ZH(uint8_t *ZHigh);
199 |
200 | LSM6DSOXStatusTypeDef Get_X_DRDY_Status(uint8_t *Status);
201 | LSM6DSOXStatusTypeDef Get_X_Event_Status(LSM6DSOX_Event_Status_t *Status);
202 | LSM6DSOXStatusTypeDef Set_X_SelfTest(uint8_t Status);
203 |
204 | LSM6DSOXStatusTypeDef Get_G_DRDY_Status(uint8_t *Status);
205 | LSM6DSOXStatusTypeDef Set_G_SelfTest(uint8_t Status);
206 |
207 | LSM6DSOXStatusTypeDef Get_FIFO_Num_Samples(uint16_t *NumSamples);
208 | LSM6DSOXStatusTypeDef Get_FIFO_Full_Status(uint8_t *Status);
209 | LSM6DSOXStatusTypeDef Get_FIFO_Overrun_Status(uint8_t *Status);
210 | LSM6DSOXStatusTypeDef Get_FIFO_Watermark_Status(uint8_t *Status);
211 | LSM6DSOXStatusTypeDef Set_FIFO_INT1_FIFO_Full(uint8_t Status);
212 | LSM6DSOXStatusTypeDef Set_FIFO_INT1_FIFO_Overrun(uint8_t Status);
213 | LSM6DSOXStatusTypeDef Set_FIFO_INT1_FIFO_Threshold(uint8_t Status);
214 | LSM6DSOXStatusTypeDef Set_FIFO_INT2_FIFO_Full(uint8_t Status);
215 | LSM6DSOXStatusTypeDef Set_FIFO_INT2_FIFO_Overrun(uint8_t Status);
216 | LSM6DSOXStatusTypeDef Set_FIFO_INT2_FIFO_Threshold(uint8_t Status);
217 | LSM6DSOXStatusTypeDef Set_FIFO_Watermark_Level(uint16_t Watermark);
218 | LSM6DSOXStatusTypeDef Set_FIFO_Stop_On_Fth(uint8_t Status);
219 | LSM6DSOXStatusTypeDef Set_FIFO_Mode(uint8_t Mode);
220 | LSM6DSOXStatusTypeDef Get_FIFO_Tag(uint8_t *Tag);
221 | LSM6DSOXStatusTypeDef Get_FIFO_Data(uint8_t *Data);
222 | LSM6DSOXStatusTypeDef Get_FIFO_Sample(uint8_t *Sample, uint16_t Count = 1);
223 | LSM6DSOXStatusTypeDef Get_FIFO_X_Axes(int32_t *Acceleration);
224 | LSM6DSOXStatusTypeDef Set_FIFO_X_BDR(float Bdr);
225 | LSM6DSOXStatusTypeDef Get_FIFO_G_Axes(int32_t *AngularVelocity);
226 | LSM6DSOXStatusTypeDef Set_FIFO_G_BDR(float Bdr);
227 |
228 | LSM6DSOXStatusTypeDef Get_MLC_Status(LSM6DSOX_MLC_Status_t *Status);
229 | LSM6DSOXStatusTypeDef Get_MLC_Output(uint8_t *Output);
230 |
231 | LSM6DSOXStatusTypeDef Get_Timestamp_Status(uint8_t *Status);
232 | LSM6DSOXStatusTypeDef Set_Timestamp_Status(uint8_t Status);
233 |
234 | LSM6DSOXStatusTypeDef Set_FIFO_Timestamp_Decimation(uint8_t Decimation);
235 |
236 | LSM6DSOXStatusTypeDef Set_FIFO_Compression_Algo_Init(uint8_t Status);
237 |
238 | LSM6DSOXStatusTypeDef Set_FIFO_Compression_Algo_Enable(uint8_t Status);
239 |
240 | LSM6DSOXStatusTypeDef Set_FIFO_Compression_Algo_Set(uint8_t Compression);
241 |
242 | LSM6DSOXStatusTypeDef Set_FIFO_Compression_Algo_Real_Time_Set(uint8_t Status);
243 |
244 | /**
245 | * @brief Utility function to read data.
246 | * @param pBuffer: pointer to data to be read.
247 | * @param RegisterAddr: specifies internal address register to be read.
248 | * @param NumByteToRead: number of bytes to be read.
249 | * @retval 0 if ok, an error code otherwise.
250 | */
251 | uint8_t IO_Read(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToRead)
252 | {
253 | if (dev_spi) {
254 | dev_spi->beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE3));
255 |
256 | digitalWrite(cs_pin, LOW);
257 |
258 | /* Write Reg Address */
259 | dev_spi->transfer(RegisterAddr | 0x80);
260 | /* Read the data */
261 | for (uint16_t i=0; itransfer(0x00);
263 | }
264 |
265 | digitalWrite(cs_pin, HIGH);
266 |
267 | dev_spi->endTransaction();
268 |
269 | return 0;
270 | }
271 |
272 | if (dev_i2c) {
273 | dev_i2c->beginTransmission(((uint8_t)(((address) >> 1) & 0x7F)));
274 | dev_i2c->write(RegisterAddr);
275 | dev_i2c->endTransmission(false);
276 |
277 | dev_i2c->requestFrom(((uint8_t)(((address) >> 1) & 0x7F)), (uint8_t) NumByteToRead);
278 |
279 | int i=0;
280 | while (dev_i2c->available()) {
281 | pBuffer[i] = dev_i2c->read();
282 | i++;
283 | }
284 |
285 | return 0;
286 | }
287 |
288 | return 1;
289 | }
290 |
291 | /**
292 | * @brief Utility function to write data.
293 | * @param pBuffer: pointer to data to be written.
294 | * @param RegisterAddr: specifies internal address register to be written.
295 | * @param NumByteToWrite: number of bytes to write.
296 | * @retval 0 if ok, an error code otherwise.
297 | */
298 | uint8_t IO_Write(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToWrite)
299 | {
300 | if (dev_spi) {
301 | dev_spi->beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE3));
302 |
303 | digitalWrite(cs_pin, LOW);
304 |
305 | /* Write Reg Address */
306 | dev_spi->transfer(RegisterAddr);
307 | /* Write the data */
308 | for (uint16_t i=0; itransfer(pBuffer[i]);
310 | }
311 |
312 | digitalWrite(cs_pin, HIGH);
313 |
314 | dev_spi->endTransaction();
315 |
316 | return 0;
317 | }
318 |
319 | if (dev_i2c) {
320 | dev_i2c->beginTransmission(((uint8_t)(((address) >> 1) & 0x7F)));
321 |
322 | dev_i2c->write(RegisterAddr);
323 | for (uint16_t i = 0 ; i < NumByteToWrite ; i++) {
324 | dev_i2c->write(pBuffer[i]);
325 | }
326 |
327 | dev_i2c->endTransmission(true);
328 |
329 | return 0;
330 | }
331 |
332 | return 1;
333 | }
334 |
335 | private:
336 |
337 | LSM6DSOXStatusTypeDef Set_X_ODR_When_Enabled(float Odr);
338 | LSM6DSOXStatusTypeDef Set_X_ODR_When_Disabled(float Odr);
339 | LSM6DSOXStatusTypeDef Set_G_ODR_When_Enabled(float Odr);
340 | LSM6DSOXStatusTypeDef Set_G_ODR_When_Disabled(float Odr);
341 |
342 |
343 |
344 | /* Helper classes. */
345 | TwoWire *dev_i2c;
346 | SPIClass *dev_spi;
347 |
348 | /* Configuration */
349 | uint8_t address;
350 | int cs_pin;
351 | uint32_t spi_speed;
352 |
353 | lsm6dsox_odr_xl_t acc_odr;
354 | lsm6dsox_odr_g_t gyro_odr;
355 |
356 | uint8_t acc_is_enabled;
357 | uint8_t gyro_is_enabled;
358 |
359 |
360 | lsm6dsox_ctx_t reg_ctx;
361 |
362 | };
363 |
364 | #ifdef __cplusplus
365 | extern "C" {
366 | #endif
367 | int32_t LSM6DSOX_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite );
368 | int32_t LSM6DSOX_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead );
369 | #ifdef __cplusplus
370 | }
371 | #endif
372 |
373 | #endif
374 |
--------------------------------------------------------------------------------