MEMS nano pressure sensor: 260-1260 hPa absolute digital output barometer.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Committer:
cparata
Date:
Wed Mar 06 09:18:20 2019 +0000
Revision:
0:c761bc6186e8
Child:
1:978cae936ddb
First version of LPS22HH library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 0:c761bc6186e8 1 /**
cparata 0:c761bc6186e8 2 ******************************************************************************
cparata 0:c761bc6186e8 3 * @file LPS22HHSensor.cpp
cparata 0:c761bc6186e8 4 * @author SRA
cparata 0:c761bc6186e8 5 * @version V1.0.0
cparata 0:c761bc6186e8 6 * @date February 2019
cparata 0:c761bc6186e8 7 * @brief Implementation of a LPS22HH pressure sensor.
cparata 0:c761bc6186e8 8 ******************************************************************************
cparata 0:c761bc6186e8 9 * @attention
cparata 0:c761bc6186e8 10 *
cparata 0:c761bc6186e8 11 * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
cparata 0:c761bc6186e8 12 *
cparata 0:c761bc6186e8 13 * Redistribution and use in source and binary forms, with or without modification,
cparata 0:c761bc6186e8 14 * are permitted provided that the following conditions are met:
cparata 0:c761bc6186e8 15 * 1. Redistributions of source code must retain the above copyright notice,
cparata 0:c761bc6186e8 16 * this list of conditions and the following disclaimer.
cparata 0:c761bc6186e8 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 0:c761bc6186e8 18 * this list of conditions and the following disclaimer in the documentation
cparata 0:c761bc6186e8 19 * and/or other materials provided with the distribution.
cparata 0:c761bc6186e8 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 0:c761bc6186e8 21 * may be used to endorse or promote products derived from this software
cparata 0:c761bc6186e8 22 * without specific prior written permission.
cparata 0:c761bc6186e8 23 *
cparata 0:c761bc6186e8 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 0:c761bc6186e8 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 0:c761bc6186e8 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 0:c761bc6186e8 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 0:c761bc6186e8 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 0:c761bc6186e8 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 0:c761bc6186e8 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 0:c761bc6186e8 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 0:c761bc6186e8 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 0:c761bc6186e8 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 0:c761bc6186e8 34 *
cparata 0:c761bc6186e8 35 ******************************************************************************
cparata 0:c761bc6186e8 36 */
cparata 0:c761bc6186e8 37
cparata 0:c761bc6186e8 38
cparata 0:c761bc6186e8 39 /* Includes ------------------------------------------------------------------*/
cparata 0:c761bc6186e8 40
cparata 0:c761bc6186e8 41 #include "LPS22HHSensor.h"
cparata 0:c761bc6186e8 42
cparata 0:c761bc6186e8 43
cparata 0:c761bc6186e8 44 /* Class Implementation ------------------------------------------------------*/
cparata 0:c761bc6186e8 45
cparata 0:c761bc6186e8 46 /** Constructor
cparata 0:c761bc6186e8 47 * @param spi object of an helper class which handles the SPI peripheral
cparata 0:c761bc6186e8 48 * @param cs_pin the chip select pin
cparata 0:c761bc6186e8 49 * @param int_pin the interrupt pin
cparata 0:c761bc6186e8 50 * @param spi_type the SPI type
cparata 0:c761bc6186e8 51 */
cparata 0:c761bc6186e8 52 LPS22HHSensor::LPS22HHSensor(SPI *spi, PinName cs_pin, PinName int_pin, SPI_type_t spi_type) : _dev_spi(spi), _cs_pin(cs_pin), _int_irq(int_pin), _spi_type(spi_type)
cparata 0:c761bc6186e8 53 {
cparata 0:c761bc6186e8 54 assert (spi);
cparata 0:c761bc6186e8 55 if (cs_pin == NC)
cparata 0:c761bc6186e8 56 {
cparata 0:c761bc6186e8 57 printf ("ERROR LPS22HH CS MUST NOT BE NC\n\r");
cparata 0:c761bc6186e8 58 _dev_spi = NULL;
cparata 0:c761bc6186e8 59 _dev_i2c = NULL;
cparata 0:c761bc6186e8 60 return;
cparata 0:c761bc6186e8 61 }
cparata 0:c761bc6186e8 62
cparata 0:c761bc6186e8 63 _reg_ctx.write_reg = LPS22HH_io_write;
cparata 0:c761bc6186e8 64 _reg_ctx.read_reg = LPS22HH_io_read;
cparata 0:c761bc6186e8 65 _reg_ctx.handle = (void *)this;
cparata 0:c761bc6186e8 66 _cs_pin = 1;
cparata 0:c761bc6186e8 67 _dev_i2c = NULL;
cparata 0:c761bc6186e8 68 _address = 0;
cparata 0:c761bc6186e8 69
cparata 0:c761bc6186e8 70 if (_spi_type == SPI3W)
cparata 0:c761bc6186e8 71 {
cparata 0:c761bc6186e8 72 /* Enable SPI 3-Wires on the component */
cparata 0:c761bc6186e8 73 uint8_t data = 0x01;
cparata 0:c761bc6186e8 74 lps22hh_write_reg(&_reg_ctx, LPS22HH_CTRL_REG1, &data, 1);
cparata 0:c761bc6186e8 75 }
cparata 0:c761bc6186e8 76 }
cparata 0:c761bc6186e8 77
cparata 0:c761bc6186e8 78 /** Constructor
cparata 0:c761bc6186e8 79 * @param i2c object of an helper class which handles the I2C peripheral
cparata 0:c761bc6186e8 80 * @param address the address of the component's instance
cparata 0:c761bc6186e8 81 * @param int_pin the interrupt pin
cparata 0:c761bc6186e8 82 */
cparata 0:c761bc6186e8 83 LPS22HHSensor::LPS22HHSensor(DevI2C *i2c, uint8_t address, PinName int_pin) : _dev_i2c(i2c), _address(address), _cs_pin(NC), _int_irq(int_pin)
cparata 0:c761bc6186e8 84 {
cparata 0:c761bc6186e8 85 assert (i2c);
cparata 0:c761bc6186e8 86 _dev_spi = NULL;
cparata 0:c761bc6186e8 87 _reg_ctx.write_reg = LPS22HH_io_write;
cparata 0:c761bc6186e8 88 _reg_ctx.read_reg = LPS22HH_io_read;
cparata 0:c761bc6186e8 89 _reg_ctx.handle = (void *)this;
cparata 0:c761bc6186e8 90 }
cparata 0:c761bc6186e8 91
cparata 0:c761bc6186e8 92
cparata 0:c761bc6186e8 93 /**
cparata 0:c761bc6186e8 94 * @brief Initializing the component
cparata 0:c761bc6186e8 95 * @param init pointer to device specific initalization structure
cparata 0:c761bc6186e8 96 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 97 */
cparata 0:c761bc6186e8 98 int LPS22HHSensor::init(void *init)
cparata 0:c761bc6186e8 99 {
cparata 0:c761bc6186e8 100 /* Disable MIPI I3C(SM) interface */
cparata 0:c761bc6186e8 101 if (lps22hh_i3c_interface_set(&_reg_ctx, LPS22HH_I3C_DISABLE) != 0)
cparata 0:c761bc6186e8 102 {
cparata 0:c761bc6186e8 103 return 1;
cparata 0:c761bc6186e8 104 }
cparata 0:c761bc6186e8 105
cparata 0:c761bc6186e8 106 /* Power down the device, set Low Noise Enable (bit 5), clear One Shot (bit 4) */
cparata 0:c761bc6186e8 107 if (lps22hh_data_rate_set(&_reg_ctx, (lps22hh_odr_t)(LPS22HH_POWER_DOWN | 0x10)) != 0)
cparata 0:c761bc6186e8 108 {
cparata 0:c761bc6186e8 109 return 1;
cparata 0:c761bc6186e8 110 }
cparata 0:c761bc6186e8 111
cparata 0:c761bc6186e8 112 /* Disable low-pass filter on LPS22HH pressure data */
cparata 0:c761bc6186e8 113 if (lps22hh_lp_bandwidth_set(&_reg_ctx, LPS22HH_LPF_ODR_DIV_2) != 0)
cparata 0:c761bc6186e8 114 {
cparata 0:c761bc6186e8 115 return 1;
cparata 0:c761bc6186e8 116 }
cparata 0:c761bc6186e8 117
cparata 0:c761bc6186e8 118 /* Set block data update mode */
cparata 0:c761bc6186e8 119 if (lps22hh_block_data_update_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:c761bc6186e8 120 {
cparata 0:c761bc6186e8 121 return 1;
cparata 0:c761bc6186e8 122 }
cparata 0:c761bc6186e8 123
cparata 0:c761bc6186e8 124 /* Set autoincrement for multi-byte read/write */
cparata 0:c761bc6186e8 125 if (lps22hh_auto_increment_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:c761bc6186e8 126 {
cparata 0:c761bc6186e8 127 return 1;
cparata 0:c761bc6186e8 128 }
cparata 0:c761bc6186e8 129
cparata 0:c761bc6186e8 130 _last_odr = LPS22HH_25_Hz;
cparata 0:c761bc6186e8 131 _is_enabled = 0;
cparata 0:c761bc6186e8 132
cparata 0:c761bc6186e8 133 return 0;
cparata 0:c761bc6186e8 134 }
cparata 0:c761bc6186e8 135
cparata 0:c761bc6186e8 136 /**
cparata 0:c761bc6186e8 137 * @brief Get WHO_AM_I value
cparata 0:c761bc6186e8 138 * @param id the WHO_AM_I value
cparata 0:c761bc6186e8 139 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 140 */
cparata 0:c761bc6186e8 141 int LPS22HHSensor::read_id(uint8_t *id)
cparata 0:c761bc6186e8 142 {
cparata 0:c761bc6186e8 143 if (lps22hh_device_id_get(&_reg_ctx, id) != 0)
cparata 0:c761bc6186e8 144 {
cparata 0:c761bc6186e8 145 return 1;
cparata 0:c761bc6186e8 146 }
cparata 0:c761bc6186e8 147
cparata 0:c761bc6186e8 148 return 0;
cparata 0:c761bc6186e8 149 }
cparata 0:c761bc6186e8 150
cparata 0:c761bc6186e8 151 /**
cparata 0:c761bc6186e8 152 * @brief Enable the LPS22HH pressure sensor
cparata 0:c761bc6186e8 153 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 154 */
cparata 0:c761bc6186e8 155 int LPS22HHSensor::enable()
cparata 0:c761bc6186e8 156 {
cparata 0:c761bc6186e8 157 /* Check if the component is already _is_enabled */
cparata 0:c761bc6186e8 158 if (_is_enabled == 1U)
cparata 0:c761bc6186e8 159 {
cparata 0:c761bc6186e8 160 return 0;
cparata 0:c761bc6186e8 161 }
cparata 0:c761bc6186e8 162
cparata 0:c761bc6186e8 163 /* Output data rate selection. */
cparata 0:c761bc6186e8 164 if (lps22hh_data_rate_set(&_reg_ctx, _last_odr) != 0)
cparata 0:c761bc6186e8 165 {
cparata 0:c761bc6186e8 166 return 1;
cparata 0:c761bc6186e8 167 }
cparata 0:c761bc6186e8 168
cparata 0:c761bc6186e8 169 _is_enabled = 1;
cparata 0:c761bc6186e8 170
cparata 0:c761bc6186e8 171 return 0;
cparata 0:c761bc6186e8 172 }
cparata 0:c761bc6186e8 173
cparata 0:c761bc6186e8 174 /**
cparata 0:c761bc6186e8 175 * @brief Disable the LPS22HH pressure sensor
cparata 0:c761bc6186e8 176 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 177 */
cparata 0:c761bc6186e8 178 int LPS22HHSensor::disable()
cparata 0:c761bc6186e8 179 {
cparata 0:c761bc6186e8 180 /* Check if the component is already disabled */
cparata 0:c761bc6186e8 181 if (_is_enabled == 0U)
cparata 0:c761bc6186e8 182 {
cparata 0:c761bc6186e8 183 return 0;
cparata 0:c761bc6186e8 184 }
cparata 0:c761bc6186e8 185
cparata 0:c761bc6186e8 186 /* Get current output data rate. */
cparata 0:c761bc6186e8 187 if (lps22hh_data_rate_get(&_reg_ctx, &_last_odr) != 0)
cparata 0:c761bc6186e8 188 {
cparata 0:c761bc6186e8 189 return 1;
cparata 0:c761bc6186e8 190 }
cparata 0:c761bc6186e8 191 /* Output data rate selection - power down. */
cparata 0:c761bc6186e8 192 if (lps22hh_data_rate_set(&_reg_ctx, LPS22HH_POWER_DOWN) != 0)
cparata 0:c761bc6186e8 193 {
cparata 0:c761bc6186e8 194 return 1;
cparata 0:c761bc6186e8 195 }
cparata 0:c761bc6186e8 196
cparata 0:c761bc6186e8 197
cparata 0:c761bc6186e8 198 _is_enabled = 0;
cparata 0:c761bc6186e8 199
cparata 0:c761bc6186e8 200 return 0;
cparata 0:c761bc6186e8 201 }
cparata 0:c761bc6186e8 202
cparata 0:c761bc6186e8 203
cparata 0:c761bc6186e8 204 /**
cparata 0:c761bc6186e8 205 * @brief Get output data rate
cparata 0:c761bc6186e8 206 * @param odr the output data rate value
cparata 0:c761bc6186e8 207 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 208 */
cparata 0:c761bc6186e8 209 int LPS22HHSensor::get_odr(float *odr)
cparata 0:c761bc6186e8 210 {
cparata 0:c761bc6186e8 211 int ret = 0;
cparata 0:c761bc6186e8 212 lps22hh_odr_t odr_low_level;
cparata 0:c761bc6186e8 213
cparata 0:c761bc6186e8 214 if (lps22hh_data_rate_get(&_reg_ctx, &odr_low_level) != 0)
cparata 0:c761bc6186e8 215 {
cparata 0:c761bc6186e8 216 return 1;
cparata 0:c761bc6186e8 217 }
cparata 0:c761bc6186e8 218
cparata 0:c761bc6186e8 219 switch (odr_low_level)
cparata 0:c761bc6186e8 220 {
cparata 0:c761bc6186e8 221 case LPS22HH_POWER_DOWN:
cparata 0:c761bc6186e8 222 *odr = 0.0f;
cparata 0:c761bc6186e8 223 break;
cparata 0:c761bc6186e8 224
cparata 0:c761bc6186e8 225 case LPS22HH_1_Hz:
cparata 0:c761bc6186e8 226 *odr = 1.0f;
cparata 0:c761bc6186e8 227 break;
cparata 0:c761bc6186e8 228
cparata 0:c761bc6186e8 229 case LPS22HH_10_Hz:
cparata 0:c761bc6186e8 230 *odr = 10.0f;
cparata 0:c761bc6186e8 231 break;
cparata 0:c761bc6186e8 232
cparata 0:c761bc6186e8 233 case LPS22HH_25_Hz:
cparata 0:c761bc6186e8 234 *odr = 25.0f;
cparata 0:c761bc6186e8 235 break;
cparata 0:c761bc6186e8 236
cparata 0:c761bc6186e8 237 case LPS22HH_50_Hz:
cparata 0:c761bc6186e8 238 *odr = 50.0f;
cparata 0:c761bc6186e8 239 break;
cparata 0:c761bc6186e8 240
cparata 0:c761bc6186e8 241 case LPS22HH_75_Hz:
cparata 0:c761bc6186e8 242 *odr = 75.0f;
cparata 0:c761bc6186e8 243 break;
cparata 0:c761bc6186e8 244
cparata 0:c761bc6186e8 245 case LPS22HH_100_Hz:
cparata 0:c761bc6186e8 246 *odr = 100.0f;
cparata 0:c761bc6186e8 247 break;
cparata 0:c761bc6186e8 248
cparata 0:c761bc6186e8 249 case LPS22HH_200_Hz:
cparata 0:c761bc6186e8 250 *odr = 200.0f;
cparata 0:c761bc6186e8 251 break;
cparata 0:c761bc6186e8 252
cparata 0:c761bc6186e8 253 default:
cparata 0:c761bc6186e8 254 ret = 1;
cparata 0:c761bc6186e8 255 break;
cparata 0:c761bc6186e8 256 }
cparata 0:c761bc6186e8 257
cparata 0:c761bc6186e8 258 return ret;
cparata 0:c761bc6186e8 259 }
cparata 0:c761bc6186e8 260
cparata 0:c761bc6186e8 261 /**
cparata 0:c761bc6186e8 262 * @brief Set the LPS22HH pressure sensor output data rate
cparata 0:c761bc6186e8 263 * @param odr the output data rate value to be set
cparata 0:c761bc6186e8 264 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 265 */
cparata 0:c761bc6186e8 266 int LPS22HHSensor::set_odr(float odr)
cparata 0:c761bc6186e8 267 {
cparata 0:c761bc6186e8 268 /* Check if the component is _is_enabled */
cparata 0:c761bc6186e8 269 if (_is_enabled == 1U)
cparata 0:c761bc6186e8 270 {
cparata 0:c761bc6186e8 271 return set_odr_when_enabled(odr);
cparata 0:c761bc6186e8 272 }
cparata 0:c761bc6186e8 273 else
cparata 0:c761bc6186e8 274 {
cparata 0:c761bc6186e8 275 return set_odr_when_disabled(odr);
cparata 0:c761bc6186e8 276 }
cparata 0:c761bc6186e8 277 }
cparata 0:c761bc6186e8 278
cparata 0:c761bc6186e8 279
cparata 0:c761bc6186e8 280 /**
cparata 0:c761bc6186e8 281 * @brief Set output data rate
cparata 0:c761bc6186e8 282 * @param odr the output data rate value to be set
cparata 0:c761bc6186e8 283 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 284 */
cparata 0:c761bc6186e8 285 int LPS22HHSensor::set_odr_when_enabled(float odr)
cparata 0:c761bc6186e8 286 {
cparata 0:c761bc6186e8 287 lps22hh_odr_t new_odr;
cparata 0:c761bc6186e8 288
cparata 0:c761bc6186e8 289 new_odr = (odr <= 1.0f) ? LPS22HH_1_Hz
cparata 0:c761bc6186e8 290 : (odr <= 10.0f) ? LPS22HH_10_Hz
cparata 0:c761bc6186e8 291 : (odr <= 25.0f) ? LPS22HH_25_Hz
cparata 0:c761bc6186e8 292 : (odr <= 50.0f) ? LPS22HH_50_Hz
cparata 0:c761bc6186e8 293 : (odr <= 75.0f) ? LPS22HH_75_Hz
cparata 0:c761bc6186e8 294 : (odr <= 100.0f) ? LPS22HH_100_Hz
cparata 0:c761bc6186e8 295 : LPS22HH_200_Hz;
cparata 0:c761bc6186e8 296
cparata 0:c761bc6186e8 297 if (lps22hh_data_rate_set(&_reg_ctx, new_odr) != 0)
cparata 0:c761bc6186e8 298 {
cparata 0:c761bc6186e8 299 return 1;
cparata 0:c761bc6186e8 300 }
cparata 0:c761bc6186e8 301
cparata 0:c761bc6186e8 302 if (lps22hh_data_rate_get(&_reg_ctx, &_last_odr) != 0)
cparata 0:c761bc6186e8 303 {
cparata 0:c761bc6186e8 304 return 1;
cparata 0:c761bc6186e8 305 }
cparata 0:c761bc6186e8 306
cparata 0:c761bc6186e8 307 return 0;
cparata 0:c761bc6186e8 308 }
cparata 0:c761bc6186e8 309
cparata 0:c761bc6186e8 310 /**
cparata 0:c761bc6186e8 311 * @brief Set output data rate when disabled
cparata 0:c761bc6186e8 312 * @param odr the output data rate value to be set
cparata 0:c761bc6186e8 313 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 314 */
cparata 0:c761bc6186e8 315 int LPS22HHSensor::set_odr_when_disabled(float odr)
cparata 0:c761bc6186e8 316 {
cparata 0:c761bc6186e8 317 _last_odr = (odr <= 1.0f) ? LPS22HH_1_Hz
cparata 0:c761bc6186e8 318 : (odr <= 10.0f) ? LPS22HH_10_Hz
cparata 0:c761bc6186e8 319 : (odr <= 25.0f) ? LPS22HH_25_Hz
cparata 0:c761bc6186e8 320 : (odr <= 50.0f) ? LPS22HH_50_Hz
cparata 0:c761bc6186e8 321 : (odr <= 75.0f) ? LPS22HH_75_Hz
cparata 0:c761bc6186e8 322 : (odr <= 100.0f) ? LPS22HH_100_Hz
cparata 0:c761bc6186e8 323 : LPS22HH_200_Hz;
cparata 0:c761bc6186e8 324
cparata 0:c761bc6186e8 325 return 0;
cparata 0:c761bc6186e8 326 }
cparata 0:c761bc6186e8 327
cparata 0:c761bc6186e8 328 /**
cparata 0:c761bc6186e8 329 * @brief Get the LPS22HH pressure value
cparata 0:c761bc6186e8 330 * @param value pointer where the pressure value is written
cparata 0:c761bc6186e8 331 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 332 */
cparata 0:c761bc6186e8 333 int LPS22HHSensor::get_pressure(float *value)
cparata 0:c761bc6186e8 334 {
cparata 0:c761bc6186e8 335 axis1bit32_t data_raw_pressure;
cparata 0:c761bc6186e8 336
cparata 0:c761bc6186e8 337 (void)memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
cparata 0:c761bc6186e8 338 if (lps22hh_pressure_raw_get(&_reg_ctx, data_raw_pressure.u8bit) != 0)
cparata 0:c761bc6186e8 339 {
cparata 0:c761bc6186e8 340 return 1;
cparata 0:c761bc6186e8 341 }
cparata 0:c761bc6186e8 342
cparata 0:c761bc6186e8 343 *value = LPS22HH_FROM_LSB_TO_hPa((float)(data_raw_pressure.i32bit));
cparata 0:c761bc6186e8 344
cparata 0:c761bc6186e8 345 return 0;
cparata 0:c761bc6186e8 346 }
cparata 0:c761bc6186e8 347
cparata 0:c761bc6186e8 348 /**
cparata 0:c761bc6186e8 349 * @brief Get the LPS22HH pressure data ready bit value
cparata 0:c761bc6186e8 350 * @param status the status of data ready bit
cparata 0:c761bc6186e8 351 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 352 */
cparata 0:c761bc6186e8 353 int LPS22HHSensor::get_press_drdy_status(uint8_t *status)
cparata 0:c761bc6186e8 354 {
cparata 0:c761bc6186e8 355 if (lps22hh_press_flag_data_ready_get(&_reg_ctx, status) != 0)
cparata 0:c761bc6186e8 356 {
cparata 0:c761bc6186e8 357 return 1;
cparata 0:c761bc6186e8 358 }
cparata 0:c761bc6186e8 359
cparata 0:c761bc6186e8 360 return 0;
cparata 0:c761bc6186e8 361 }
cparata 0:c761bc6186e8 362
cparata 0:c761bc6186e8 363 /**
cparata 0:c761bc6186e8 364 * @brief Get the LPS22HH temperature value
cparata 0:c761bc6186e8 365 * @param value pointer where the temperature value is written
cparata 0:c761bc6186e8 366 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 367 */
cparata 0:c761bc6186e8 368 int LPS22HHSensor::get_temperature(float *value)
cparata 0:c761bc6186e8 369 {
cparata 0:c761bc6186e8 370 axis1bit16_t data_raw_temperature;
cparata 0:c761bc6186e8 371
cparata 0:c761bc6186e8 372 (void)memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
cparata 0:c761bc6186e8 373 if (lps22hh_temperature_raw_get(&_reg_ctx, data_raw_temperature.u8bit) != 0)
cparata 0:c761bc6186e8 374 {
cparata 0:c761bc6186e8 375 return 1;
cparata 0:c761bc6186e8 376 }
cparata 0:c761bc6186e8 377
cparata 0:c761bc6186e8 378 *value = LPS22HH_FROM_LSB_TO_degC((float)(data_raw_temperature.i16bit));
cparata 0:c761bc6186e8 379
cparata 0:c761bc6186e8 380 return 0;
cparata 0:c761bc6186e8 381 }
cparata 0:c761bc6186e8 382
cparata 0:c761bc6186e8 383 /**
cparata 0:c761bc6186e8 384 * @brief Get the LPS22HH temperature data ready bit value
cparata 0:c761bc6186e8 385 * @param status the status of data ready bit
cparata 0:c761bc6186e8 386 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 387 */
cparata 0:c761bc6186e8 388 int LPS22HHSensor::get_temp_drdy_status(uint8_t *status)
cparata 0:c761bc6186e8 389 {
cparata 0:c761bc6186e8 390 if (lps22hh_temp_flag_data_ready_get(&_reg_ctx, status) != 0)
cparata 0:c761bc6186e8 391 {
cparata 0:c761bc6186e8 392 return 1;
cparata 0:c761bc6186e8 393 }
cparata 0:c761bc6186e8 394
cparata 0:c761bc6186e8 395 return 0;
cparata 0:c761bc6186e8 396 }
cparata 0:c761bc6186e8 397
cparata 0:c761bc6186e8 398 /**
cparata 0:c761bc6186e8 399 * @brief Get the LPS22HH register value
cparata 0:c761bc6186e8 400 * @param reg address to be written
cparata 0:c761bc6186e8 401 * @param data value to be written
cparata 0:c761bc6186e8 402 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 403 */
cparata 0:c761bc6186e8 404 int LPS22HHSensor::read_reg(uint8_t reg, uint8_t *data)
cparata 0:c761bc6186e8 405 {
cparata 0:c761bc6186e8 406 if (lps22hh_read_reg(&_reg_ctx, reg, data, 1) != 0)
cparata 0:c761bc6186e8 407 {
cparata 0:c761bc6186e8 408 return 1;
cparata 0:c761bc6186e8 409 }
cparata 0:c761bc6186e8 410
cparata 0:c761bc6186e8 411 return 0;
cparata 0:c761bc6186e8 412 }
cparata 0:c761bc6186e8 413
cparata 0:c761bc6186e8 414 /**
cparata 0:c761bc6186e8 415 * @brief Set the LPS22HH register value
cparata 0:c761bc6186e8 416 * @param reg address to be written
cparata 0:c761bc6186e8 417 * @param data value to be written
cparata 0:c761bc6186e8 418 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 419 */
cparata 0:c761bc6186e8 420 int LPS22HHSensor::write_reg(uint8_t reg, uint8_t data)
cparata 0:c761bc6186e8 421 {
cparata 0:c761bc6186e8 422 if (lps22hh_write_reg(&_reg_ctx, reg, &data, 1) != 0)
cparata 0:c761bc6186e8 423 {
cparata 0:c761bc6186e8 424 return 1;
cparata 0:c761bc6186e8 425 }
cparata 0:c761bc6186e8 426
cparata 0:c761bc6186e8 427 return 0;
cparata 0:c761bc6186e8 428 }
cparata 0:c761bc6186e8 429
cparata 0:c761bc6186e8 430 /**
cparata 0:c761bc6186e8 431 * @brief Get the LPS22HH FIFO data
cparata 0:c761bc6186e8 432 * @param press the pointer where FIFO pressure value is stored
cparata 0:c761bc6186e8 433 * @param temp the pointer where FIFO temperature value is stored
cparata 0:c761bc6186e8 434 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 435 */
cparata 0:c761bc6186e8 436 int LPS22HHSensor::get_fifo_data(float *press, float *temp)
cparata 0:c761bc6186e8 437 {
cparata 0:c761bc6186e8 438 axis1bit32_t data_raw_pressure;
cparata 0:c761bc6186e8 439 axis1bit16_t data_raw_temperature;
cparata 0:c761bc6186e8 440
cparata 0:c761bc6186e8 441 (void)memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
cparata 0:c761bc6186e8 442 if (lps22hh_fifo_pressure_raw_get(&_reg_ctx, data_raw_pressure.u8bit) != 0)
cparata 0:c761bc6186e8 443 {
cparata 0:c761bc6186e8 444 return 1;
cparata 0:c761bc6186e8 445 }
cparata 0:c761bc6186e8 446
cparata 0:c761bc6186e8 447 *press = LPS22HH_FROM_LSB_TO_hPa((float)(data_raw_pressure.i32bit));
cparata 0:c761bc6186e8 448
cparata 0:c761bc6186e8 449 (void)memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
cparata 0:c761bc6186e8 450 if (lps22hh_fifo_temperature_raw_get(&_reg_ctx, data_raw_temperature.u8bit) != 0)
cparata 0:c761bc6186e8 451 {
cparata 0:c761bc6186e8 452 return 1;
cparata 0:c761bc6186e8 453 }
cparata 0:c761bc6186e8 454
cparata 0:c761bc6186e8 455 *temp = LPS22HH_FROM_LSB_TO_degC((float)(data_raw_temperature.i16bit));
cparata 0:c761bc6186e8 456
cparata 0:c761bc6186e8 457 return 0;
cparata 0:c761bc6186e8 458 }
cparata 0:c761bc6186e8 459
cparata 0:c761bc6186e8 460 /**
cparata 0:c761bc6186e8 461 * @brief Get the LPS22HH FIFO threshold
cparata 0:c761bc6186e8 462 * @param status the status of FIFO threshold
cparata 0:c761bc6186e8 463 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 464 */
cparata 0:c761bc6186e8 465 int LPS22HHSensor::get_fifo_fth_status(uint8_t *status)
cparata 0:c761bc6186e8 466 {
cparata 0:c761bc6186e8 467 if (lps22hh_fifo_wtm_flag_get(&_reg_ctx, status) != 0)
cparata 0:c761bc6186e8 468 {
cparata 0:c761bc6186e8 469 return 1;
cparata 0:c761bc6186e8 470 }
cparata 0:c761bc6186e8 471
cparata 0:c761bc6186e8 472 return 0;
cparata 0:c761bc6186e8 473 }
cparata 0:c761bc6186e8 474
cparata 0:c761bc6186e8 475 /**
cparata 0:c761bc6186e8 476 * @brief Get the LPS22HH FIFO full status
cparata 0:c761bc6186e8 477 * @param status the status of FIFO full status
cparata 0:c761bc6186e8 478 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 479 */
cparata 0:c761bc6186e8 480 int LPS22HHSensor::get_fifo_full_status(uint8_t *status)
cparata 0:c761bc6186e8 481 {
cparata 0:c761bc6186e8 482 if (lps22hh_fifo_full_flag_get(&_reg_ctx, status) != 0)
cparata 0:c761bc6186e8 483 {
cparata 0:c761bc6186e8 484 return 1;
cparata 0:c761bc6186e8 485 }
cparata 0:c761bc6186e8 486
cparata 0:c761bc6186e8 487 return 0;
cparata 0:c761bc6186e8 488 }
cparata 0:c761bc6186e8 489
cparata 0:c761bc6186e8 490 /**
cparata 0:c761bc6186e8 491 * @brief Get the LPS22HH FIFO OVR status
cparata 0:c761bc6186e8 492 * @param status the status of FIFO OVR status
cparata 0:c761bc6186e8 493 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 494 */
cparata 0:c761bc6186e8 495 int LPS22HHSensor::get_fifo_ovr_status(uint8_t *status)
cparata 0:c761bc6186e8 496 {
cparata 0:c761bc6186e8 497 if (lps22hh_fifo_ovr_flag_get(&_reg_ctx, status) != 0)
cparata 0:c761bc6186e8 498 {
cparata 0:c761bc6186e8 499 return 1;
cparata 0:c761bc6186e8 500 }
cparata 0:c761bc6186e8 501
cparata 0:c761bc6186e8 502 return 0;
cparata 0:c761bc6186e8 503 }
cparata 0:c761bc6186e8 504
cparata 0:c761bc6186e8 505 /**
cparata 0:c761bc6186e8 506 * @brief Get the LPS22HH FIFO data level
cparata 0:c761bc6186e8 507 * @param status the status of FIFO data level
cparata 0:c761bc6186e8 508 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 509 */
cparata 0:c761bc6186e8 510 int LPS22HHSensor::get_fifo_level(uint8_t *status)
cparata 0:c761bc6186e8 511 {
cparata 0:c761bc6186e8 512 if (lps22hh_fifo_data_level_get(&_reg_ctx, status) != 0)
cparata 0:c761bc6186e8 513 {
cparata 0:c761bc6186e8 514 return 1;
cparata 0:c761bc6186e8 515 }
cparata 0:c761bc6186e8 516
cparata 0:c761bc6186e8 517 return 0;
cparata 0:c761bc6186e8 518 }
cparata 0:c761bc6186e8 519
cparata 0:c761bc6186e8 520 /**
cparata 0:c761bc6186e8 521 * @brief Reset the FIFO interrupt
cparata 0:c761bc6186e8 522 * @param interrupt The FIFO interrupt to be reset; values: 0 = FTH; 1 = FULL; 2 = OVR
cparata 0:c761bc6186e8 523 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 524 */
cparata 0:c761bc6186e8 525 int LPS22HHSensor::reset_fifo_interrupt(uint8_t interrupt)
cparata 0:c761bc6186e8 526 {
cparata 0:c761bc6186e8 527 switch (interrupt)
cparata 0:c761bc6186e8 528 {
cparata 0:c761bc6186e8 529 case 0:
cparata 0:c761bc6186e8 530 if (lps22hh_fifo_threshold_on_int_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:c761bc6186e8 531 {
cparata 0:c761bc6186e8 532 return 1;
cparata 0:c761bc6186e8 533 }
cparata 0:c761bc6186e8 534 break;
cparata 0:c761bc6186e8 535 case 1:
cparata 0:c761bc6186e8 536 if (lps22hh_fifo_full_on_int_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:c761bc6186e8 537 {
cparata 0:c761bc6186e8 538 return 1;
cparata 0:c761bc6186e8 539 }
cparata 0:c761bc6186e8 540 break;
cparata 0:c761bc6186e8 541 case 2:
cparata 0:c761bc6186e8 542 if (lps22hh_fifo_ovr_on_int_set(&_reg_ctx, PROPERTY_DISABLE) != 0)
cparata 0:c761bc6186e8 543 {
cparata 0:c761bc6186e8 544 return 1;
cparata 0:c761bc6186e8 545 }
cparata 0:c761bc6186e8 546 break;
cparata 0:c761bc6186e8 547 default:
cparata 0:c761bc6186e8 548 return 1;
cparata 0:c761bc6186e8 549 }
cparata 0:c761bc6186e8 550
cparata 0:c761bc6186e8 551 return 0;
cparata 0:c761bc6186e8 552 }
cparata 0:c761bc6186e8 553
cparata 0:c761bc6186e8 554 /**
cparata 0:c761bc6186e8 555 * @brief Set the FIFO interrupt
cparata 0:c761bc6186e8 556 * @param interrupt The FIFO interrupt to be set; values: 0 = FTH; 1 = FULL; 2 = OVR
cparata 0:c761bc6186e8 557 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 558 */
cparata 0:c761bc6186e8 559 int LPS22HHSensor::set_fifo_interrupt(uint8_t interrupt)
cparata 0:c761bc6186e8 560 {
cparata 0:c761bc6186e8 561 switch (interrupt)
cparata 0:c761bc6186e8 562 {
cparata 0:c761bc6186e8 563 case 0:
cparata 0:c761bc6186e8 564 if (lps22hh_fifo_threshold_on_int_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:c761bc6186e8 565 {
cparata 0:c761bc6186e8 566 return 1;
cparata 0:c761bc6186e8 567 }
cparata 0:c761bc6186e8 568 break;
cparata 0:c761bc6186e8 569 case 1:
cparata 0:c761bc6186e8 570 if (lps22hh_fifo_full_on_int_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:c761bc6186e8 571 {
cparata 0:c761bc6186e8 572 return 1;
cparata 0:c761bc6186e8 573 }
cparata 0:c761bc6186e8 574 break;
cparata 0:c761bc6186e8 575 case 2:
cparata 0:c761bc6186e8 576 if (lps22hh_fifo_ovr_on_int_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
cparata 0:c761bc6186e8 577 {
cparata 0:c761bc6186e8 578 return 1;
cparata 0:c761bc6186e8 579 }
cparata 0:c761bc6186e8 580 break;
cparata 0:c761bc6186e8 581 default:
cparata 0:c761bc6186e8 582 return 1;
cparata 0:c761bc6186e8 583 }
cparata 0:c761bc6186e8 584
cparata 0:c761bc6186e8 585 return 0;
cparata 0:c761bc6186e8 586 }
cparata 0:c761bc6186e8 587
cparata 0:c761bc6186e8 588 /**
cparata 0:c761bc6186e8 589 * @brief Set the FIFO mode
cparata 0:c761bc6186e8 590 * @param Mode the FIFO mode to be set
cparata 0:c761bc6186e8 591 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 592 */
cparata 0:c761bc6186e8 593 int LPS22HHSensor::set_fifo_mode(uint8_t mode)
cparata 0:c761bc6186e8 594 {
cparata 0:c761bc6186e8 595 /* Verify that the passed parameter contains one of the valid values */
cparata 0:c761bc6186e8 596 switch ((lps22hh_f_mode_t)mode)
cparata 0:c761bc6186e8 597 {
cparata 0:c761bc6186e8 598 case LPS22HH_BYPASS_MODE:
cparata 0:c761bc6186e8 599 case LPS22HH_FIFO_MODE:
cparata 0:c761bc6186e8 600 case LPS22HH_STREAM_MODE:
cparata 0:c761bc6186e8 601 case LPS22HH_STREAM_TO_FIFO_MODE:
cparata 0:c761bc6186e8 602 case LPS22HH_BYPASS_TO_STREAM_MODE:
cparata 0:c761bc6186e8 603 case LPS22HH_BYPASS_TO_FIFO_MODE:
cparata 0:c761bc6186e8 604 break;
cparata 0:c761bc6186e8 605 default:
cparata 0:c761bc6186e8 606 return 1;
cparata 0:c761bc6186e8 607 }
cparata 0:c761bc6186e8 608
cparata 0:c761bc6186e8 609 if (lps22hh_fifo_mode_set(&_reg_ctx, (lps22hh_f_mode_t)mode) != 0)
cparata 0:c761bc6186e8 610 {
cparata 0:c761bc6186e8 611 return 1;
cparata 0:c761bc6186e8 612 }
cparata 0:c761bc6186e8 613
cparata 0:c761bc6186e8 614 return 0;
cparata 0:c761bc6186e8 615 }
cparata 0:c761bc6186e8 616
cparata 0:c761bc6186e8 617 /**
cparata 0:c761bc6186e8 618 * @brief Set the LPS22HH FIFO watermark level
cparata 0:c761bc6186e8 619 * @param watermark the FIFO watermark level to be set
cparata 0:c761bc6186e8 620 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 621 */
cparata 0:c761bc6186e8 622 int LPS22HHSensor::set_fifo_watermark_level(uint8_t watermark)
cparata 0:c761bc6186e8 623 {
cparata 0:c761bc6186e8 624 if (lps22hh_fifo_watermark_set(&_reg_ctx, watermark) != 0)
cparata 0:c761bc6186e8 625 {
cparata 0:c761bc6186e8 626 return 1;
cparata 0:c761bc6186e8 627 }
cparata 0:c761bc6186e8 628
cparata 0:c761bc6186e8 629 return 0;
cparata 0:c761bc6186e8 630 }
cparata 0:c761bc6186e8 631
cparata 0:c761bc6186e8 632 /**
cparata 0:c761bc6186e8 633 * @brief Set the LPS22HH stop on watermark function
cparata 0:c761bc6186e8 634 * @param stop the state of stop on watermark function
cparata 0:c761bc6186e8 635 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 636 */
cparata 0:c761bc6186e8 637 int LPS22HHSensor::stop_fifo_on_watermark(uint8_t stop)
cparata 0:c761bc6186e8 638 {
cparata 0:c761bc6186e8 639 if (lps22hh_fifo_stop_on_wtm_set(&_reg_ctx, stop) != 0)
cparata 0:c761bc6186e8 640 {
cparata 0:c761bc6186e8 641 return 1;
cparata 0:c761bc6186e8 642 }
cparata 0:c761bc6186e8 643
cparata 0:c761bc6186e8 644 return 0;
cparata 0:c761bc6186e8 645 }
cparata 0:c761bc6186e8 646
cparata 0:c761bc6186e8 647 /**
cparata 0:c761bc6186e8 648 * @brief Set the LPS22HH One Shot Mode
cparata 0:c761bc6186e8 649 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 650 */
cparata 0:c761bc6186e8 651 int LPS22HHSensor::set_one_shot()
cparata 0:c761bc6186e8 652 {
cparata 0:c761bc6186e8 653 /* Start One Shot Measurement */
cparata 0:c761bc6186e8 654 if(lps22hh_data_rate_set(&_reg_ctx, LPS22HH_ONE_SHOOT) != 0)
cparata 0:c761bc6186e8 655 {
cparata 0:c761bc6186e8 656 return 1;
cparata 0:c761bc6186e8 657 }
cparata 0:c761bc6186e8 658
cparata 0:c761bc6186e8 659 return 0;
cparata 0:c761bc6186e8 660 }
cparata 0:c761bc6186e8 661
cparata 0:c761bc6186e8 662 /**
cparata 0:c761bc6186e8 663 * @brief Get the LPS22HH One Shot Status
cparata 0:c761bc6186e8 664 * @param status pointer to the one shot status (1 means measurements available, 0 means measurements not available yet)
cparata 0:c761bc6186e8 665 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 666 */
cparata 0:c761bc6186e8 667 int LPS22HHSensor::get_one_shot_status(uint8_t *status)
cparata 0:c761bc6186e8 668 {
cparata 0:c761bc6186e8 669 uint8_t p_da;
cparata 0:c761bc6186e8 670 uint8_t t_da;
cparata 0:c761bc6186e8 671
cparata 0:c761bc6186e8 672 /* Get DataReady for pressure */
cparata 0:c761bc6186e8 673 if(lps22hh_press_flag_data_ready_get(&_reg_ctx, &p_da) != 0)
cparata 0:c761bc6186e8 674 {
cparata 0:c761bc6186e8 675 return 1;
cparata 0:c761bc6186e8 676 }
cparata 0:c761bc6186e8 677
cparata 0:c761bc6186e8 678 /* Get DataReady for temperature */
cparata 0:c761bc6186e8 679 if(lps22hh_temp_flag_data_ready_get(&_reg_ctx, &t_da) != 0)
cparata 0:c761bc6186e8 680 {
cparata 0:c761bc6186e8 681 return 1;
cparata 0:c761bc6186e8 682 }
cparata 0:c761bc6186e8 683
cparata 0:c761bc6186e8 684 if(p_da && t_da)
cparata 0:c761bc6186e8 685 {
cparata 0:c761bc6186e8 686 *status = 1;
cparata 0:c761bc6186e8 687 }
cparata 0:c761bc6186e8 688 else
cparata 0:c761bc6186e8 689 {
cparata 0:c761bc6186e8 690 *status = 0;
cparata 0:c761bc6186e8 691 }
cparata 0:c761bc6186e8 692
cparata 0:c761bc6186e8 693 return 0;
cparata 0:c761bc6186e8 694 }
cparata 0:c761bc6186e8 695
cparata 0:c761bc6186e8 696 int32_t LPS22HH_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite)
cparata 0:c761bc6186e8 697 {
cparata 0:c761bc6186e8 698 return ((LPS22HHSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
cparata 0:c761bc6186e8 699 }
cparata 0:c761bc6186e8 700
cparata 0:c761bc6186e8 701 int32_t LPS22HH_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead)
cparata 0:c761bc6186e8 702 {
cparata 0:c761bc6186e8 703 return ((LPS22HHSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
cparata 0:c761bc6186e8 704 }