├── 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 | --------------------------------------------------------------------------------