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 Jul 24 14:19:09 2019 +0000
Revision:
1:978cae936ddb
Parent:
0:c761bc6186e8
Format with Astyle

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 1:978cae936ddb 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 1:978cae936ddb 54 assert(spi);
cparata 1:978cae936ddb 55 if (cs_pin == NC) {
cparata 1:978cae936ddb 56 printf("ERROR LPS22HH CS MUST NOT BE NC\n\r");
cparata 1:978cae936ddb 57 _dev_spi = NULL;
cparata 1:978cae936ddb 58 _dev_i2c = NULL;
cparata 1:978cae936ddb 59 return;
cparata 1:978cae936ddb 60 }
cparata 0:c761bc6186e8 61
cparata 1:978cae936ddb 62 _reg_ctx.write_reg = LPS22HH_io_write;
cparata 1:978cae936ddb 63 _reg_ctx.read_reg = LPS22HH_io_read;
cparata 1:978cae936ddb 64 _reg_ctx.handle = (void *)this;
cparata 1:978cae936ddb 65 _cs_pin = 1;
cparata 1:978cae936ddb 66 _dev_i2c = NULL;
cparata 1:978cae936ddb 67 _address = 0;
cparata 1:978cae936ddb 68
cparata 1:978cae936ddb 69 if (_spi_type == SPI3W) {
cparata 1:978cae936ddb 70 /* Enable SPI 3-Wires on the component */
cparata 1:978cae936ddb 71 uint8_t data = 0x01;
cparata 1:978cae936ddb 72 lps22hh_write_reg(&_reg_ctx, LPS22HH_CTRL_REG1, &data, 1);
cparata 1:978cae936ddb 73 }
cparata 0:c761bc6186e8 74 }
cparata 0:c761bc6186e8 75
cparata 0:c761bc6186e8 76 /** Constructor
cparata 0:c761bc6186e8 77 * @param i2c object of an helper class which handles the I2C peripheral
cparata 0:c761bc6186e8 78 * @param address the address of the component's instance
cparata 0:c761bc6186e8 79 * @param int_pin the interrupt pin
cparata 0:c761bc6186e8 80 */
cparata 0:c761bc6186e8 81 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 82 {
cparata 1:978cae936ddb 83 assert(i2c);
cparata 1:978cae936ddb 84 _dev_spi = NULL;
cparata 1:978cae936ddb 85 _reg_ctx.write_reg = LPS22HH_io_write;
cparata 1:978cae936ddb 86 _reg_ctx.read_reg = LPS22HH_io_read;
cparata 1:978cae936ddb 87 _reg_ctx.handle = (void *)this;
cparata 0:c761bc6186e8 88 }
cparata 0:c761bc6186e8 89
cparata 0:c761bc6186e8 90
cparata 0:c761bc6186e8 91 /**
cparata 0:c761bc6186e8 92 * @brief Initializing the component
cparata 0:c761bc6186e8 93 * @param init pointer to device specific initalization structure
cparata 0:c761bc6186e8 94 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 95 */
cparata 0:c761bc6186e8 96 int LPS22HHSensor::init(void *init)
cparata 0:c761bc6186e8 97 {
cparata 0:c761bc6186e8 98 /* Disable MIPI I3C(SM) interface */
cparata 1:978cae936ddb 99 if (lps22hh_i3c_interface_set(&_reg_ctx, LPS22HH_I3C_DISABLE) != 0) {
cparata 1:978cae936ddb 100 return 1;
cparata 1:978cae936ddb 101 }
cparata 0:c761bc6186e8 102
cparata 1:978cae936ddb 103 /* Power down the device, set Low Noise Enable (bit 5), clear One Shot (bit 4) */
cparata 1:978cae936ddb 104 if (lps22hh_data_rate_set(&_reg_ctx, (lps22hh_odr_t)(LPS22HH_POWER_DOWN | 0x10)) != 0) {
cparata 1:978cae936ddb 105 return 1;
cparata 1:978cae936ddb 106 }
cparata 0:c761bc6186e8 107
cparata 1:978cae936ddb 108 /* Disable low-pass filter on LPS22HH pressure data */
cparata 1:978cae936ddb 109 if (lps22hh_lp_bandwidth_set(&_reg_ctx, LPS22HH_LPF_ODR_DIV_2) != 0) {
cparata 1:978cae936ddb 110 return 1;
cparata 1:978cae936ddb 111 }
cparata 0:c761bc6186e8 112
cparata 1:978cae936ddb 113 /* Set block data update mode */
cparata 1:978cae936ddb 114 if (lps22hh_block_data_update_set(&_reg_ctx, PROPERTY_ENABLE) != 0) {
cparata 1:978cae936ddb 115 return 1;
cparata 1:978cae936ddb 116 }
cparata 0:c761bc6186e8 117
cparata 1:978cae936ddb 118 /* Set autoincrement for multi-byte read/write */
cparata 1:978cae936ddb 119 if (lps22hh_auto_increment_set(&_reg_ctx, PROPERTY_ENABLE) != 0) {
cparata 1:978cae936ddb 120 return 1;
cparata 1:978cae936ddb 121 }
cparata 0:c761bc6186e8 122
cparata 1:978cae936ddb 123 _last_odr = LPS22HH_25_Hz;
cparata 1:978cae936ddb 124 _is_enabled = 0;
cparata 0:c761bc6186e8 125
cparata 1:978cae936ddb 126 return 0;
cparata 0:c761bc6186e8 127 }
cparata 0:c761bc6186e8 128
cparata 0:c761bc6186e8 129 /**
cparata 0:c761bc6186e8 130 * @brief Get WHO_AM_I value
cparata 0:c761bc6186e8 131 * @param id the WHO_AM_I value
cparata 0:c761bc6186e8 132 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 133 */
cparata 0:c761bc6186e8 134 int LPS22HHSensor::read_id(uint8_t *id)
cparata 0:c761bc6186e8 135 {
cparata 1:978cae936ddb 136 if (lps22hh_device_id_get(&_reg_ctx, id) != 0) {
cparata 1:978cae936ddb 137 return 1;
cparata 1:978cae936ddb 138 }
cparata 0:c761bc6186e8 139
cparata 1:978cae936ddb 140 return 0;
cparata 0:c761bc6186e8 141 }
cparata 0:c761bc6186e8 142
cparata 0:c761bc6186e8 143 /**
cparata 0:c761bc6186e8 144 * @brief Enable the LPS22HH pressure sensor
cparata 0:c761bc6186e8 145 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 146 */
cparata 0:c761bc6186e8 147 int LPS22HHSensor::enable()
cparata 0:c761bc6186e8 148 {
cparata 1:978cae936ddb 149 /* Check if the component is already _is_enabled */
cparata 1:978cae936ddb 150 if (_is_enabled == 1U) {
cparata 1:978cae936ddb 151 return 0;
cparata 1:978cae936ddb 152 }
cparata 0:c761bc6186e8 153
cparata 1:978cae936ddb 154 /* Output data rate selection. */
cparata 1:978cae936ddb 155 if (lps22hh_data_rate_set(&_reg_ctx, _last_odr) != 0) {
cparata 1:978cae936ddb 156 return 1;
cparata 1:978cae936ddb 157 }
cparata 0:c761bc6186e8 158
cparata 1:978cae936ddb 159 _is_enabled = 1;
cparata 0:c761bc6186e8 160
cparata 1:978cae936ddb 161 return 0;
cparata 0:c761bc6186e8 162 }
cparata 0:c761bc6186e8 163
cparata 0:c761bc6186e8 164 /**
cparata 0:c761bc6186e8 165 * @brief Disable the LPS22HH pressure sensor
cparata 0:c761bc6186e8 166 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 167 */
cparata 0:c761bc6186e8 168 int LPS22HHSensor::disable()
cparata 0:c761bc6186e8 169 {
cparata 1:978cae936ddb 170 /* Check if the component is already disabled */
cparata 1:978cae936ddb 171 if (_is_enabled == 0U) {
cparata 1:978cae936ddb 172 return 0;
cparata 1:978cae936ddb 173 }
cparata 0:c761bc6186e8 174
cparata 1:978cae936ddb 175 /* Get current output data rate. */
cparata 1:978cae936ddb 176 if (lps22hh_data_rate_get(&_reg_ctx, &_last_odr) != 0) {
cparata 1:978cae936ddb 177 return 1;
cparata 1:978cae936ddb 178 }
cparata 1:978cae936ddb 179 /* Output data rate selection - power down. */
cparata 1:978cae936ddb 180 if (lps22hh_data_rate_set(&_reg_ctx, LPS22HH_POWER_DOWN) != 0) {
cparata 1:978cae936ddb 181 return 1;
cparata 1:978cae936ddb 182 }
cparata 0:c761bc6186e8 183
cparata 0:c761bc6186e8 184
cparata 1:978cae936ddb 185 _is_enabled = 0;
cparata 0:c761bc6186e8 186
cparata 1:978cae936ddb 187 return 0;
cparata 0:c761bc6186e8 188 }
cparata 0:c761bc6186e8 189
cparata 0:c761bc6186e8 190
cparata 0:c761bc6186e8 191 /**
cparata 0:c761bc6186e8 192 * @brief Get output data rate
cparata 0:c761bc6186e8 193 * @param odr the output data rate value
cparata 0:c761bc6186e8 194 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 195 */
cparata 0:c761bc6186e8 196 int LPS22HHSensor::get_odr(float *odr)
cparata 0:c761bc6186e8 197 {
cparata 1:978cae936ddb 198 int ret = 0;
cparata 1:978cae936ddb 199 lps22hh_odr_t odr_low_level;
cparata 0:c761bc6186e8 200
cparata 1:978cae936ddb 201 if (lps22hh_data_rate_get(&_reg_ctx, &odr_low_level) != 0) {
cparata 1:978cae936ddb 202 return 1;
cparata 1:978cae936ddb 203 }
cparata 0:c761bc6186e8 204
cparata 1:978cae936ddb 205 switch (odr_low_level) {
cparata 1:978cae936ddb 206 case LPS22HH_POWER_DOWN:
cparata 1:978cae936ddb 207 *odr = 0.0f;
cparata 1:978cae936ddb 208 break;
cparata 0:c761bc6186e8 209
cparata 1:978cae936ddb 210 case LPS22HH_1_Hz:
cparata 1:978cae936ddb 211 *odr = 1.0f;
cparata 1:978cae936ddb 212 break;
cparata 0:c761bc6186e8 213
cparata 1:978cae936ddb 214 case LPS22HH_10_Hz:
cparata 1:978cae936ddb 215 *odr = 10.0f;
cparata 1:978cae936ddb 216 break;
cparata 0:c761bc6186e8 217
cparata 1:978cae936ddb 218 case LPS22HH_25_Hz:
cparata 1:978cae936ddb 219 *odr = 25.0f;
cparata 1:978cae936ddb 220 break;
cparata 0:c761bc6186e8 221
cparata 1:978cae936ddb 222 case LPS22HH_50_Hz:
cparata 1:978cae936ddb 223 *odr = 50.0f;
cparata 1:978cae936ddb 224 break;
cparata 0:c761bc6186e8 225
cparata 1:978cae936ddb 226 case LPS22HH_75_Hz:
cparata 1:978cae936ddb 227 *odr = 75.0f;
cparata 1:978cae936ddb 228 break;
cparata 0:c761bc6186e8 229
cparata 1:978cae936ddb 230 case LPS22HH_100_Hz:
cparata 1:978cae936ddb 231 *odr = 100.0f;
cparata 1:978cae936ddb 232 break;
cparata 0:c761bc6186e8 233
cparata 1:978cae936ddb 234 case LPS22HH_200_Hz:
cparata 1:978cae936ddb 235 *odr = 200.0f;
cparata 1:978cae936ddb 236 break;
cparata 0:c761bc6186e8 237
cparata 1:978cae936ddb 238 default:
cparata 1:978cae936ddb 239 ret = 1;
cparata 1:978cae936ddb 240 break;
cparata 1:978cae936ddb 241 }
cparata 0:c761bc6186e8 242
cparata 1:978cae936ddb 243 return ret;
cparata 0:c761bc6186e8 244 }
cparata 0:c761bc6186e8 245
cparata 0:c761bc6186e8 246 /**
cparata 0:c761bc6186e8 247 * @brief Set the LPS22HH pressure sensor output data rate
cparata 0:c761bc6186e8 248 * @param odr the output data rate value to be set
cparata 0:c761bc6186e8 249 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 250 */
cparata 0:c761bc6186e8 251 int LPS22HHSensor::set_odr(float odr)
cparata 0:c761bc6186e8 252 {
cparata 1:978cae936ddb 253 /* Check if the component is _is_enabled */
cparata 1:978cae936ddb 254 if (_is_enabled == 1U) {
cparata 1:978cae936ddb 255 return set_odr_when_enabled(odr);
cparata 1:978cae936ddb 256 } else {
cparata 1:978cae936ddb 257 return set_odr_when_disabled(odr);
cparata 1:978cae936ddb 258 }
cparata 0:c761bc6186e8 259 }
cparata 0:c761bc6186e8 260
cparata 0:c761bc6186e8 261
cparata 0:c761bc6186e8 262 /**
cparata 0:c761bc6186e8 263 * @brief Set output data rate
cparata 0:c761bc6186e8 264 * @param odr the output data rate value to be set
cparata 0:c761bc6186e8 265 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 266 */
cparata 0:c761bc6186e8 267 int LPS22HHSensor::set_odr_when_enabled(float odr)
cparata 0:c761bc6186e8 268 {
cparata 1:978cae936ddb 269 lps22hh_odr_t new_odr;
cparata 0:c761bc6186e8 270
cparata 1:978cae936ddb 271 new_odr = (odr <= 1.0f) ? LPS22HH_1_Hz
cparata 1:978cae936ddb 272 : (odr <= 10.0f) ? LPS22HH_10_Hz
cparata 1:978cae936ddb 273 : (odr <= 25.0f) ? LPS22HH_25_Hz
cparata 1:978cae936ddb 274 : (odr <= 50.0f) ? LPS22HH_50_Hz
cparata 1:978cae936ddb 275 : (odr <= 75.0f) ? LPS22HH_75_Hz
cparata 1:978cae936ddb 276 : (odr <= 100.0f) ? LPS22HH_100_Hz
cparata 1:978cae936ddb 277 : LPS22HH_200_Hz;
cparata 0:c761bc6186e8 278
cparata 1:978cae936ddb 279 if (lps22hh_data_rate_set(&_reg_ctx, new_odr) != 0) {
cparata 1:978cae936ddb 280 return 1;
cparata 1:978cae936ddb 281 }
cparata 0:c761bc6186e8 282
cparata 1:978cae936ddb 283 if (lps22hh_data_rate_get(&_reg_ctx, &_last_odr) != 0) {
cparata 1:978cae936ddb 284 return 1;
cparata 1:978cae936ddb 285 }
cparata 0:c761bc6186e8 286
cparata 1:978cae936ddb 287 return 0;
cparata 0:c761bc6186e8 288 }
cparata 0:c761bc6186e8 289
cparata 0:c761bc6186e8 290 /**
cparata 0:c761bc6186e8 291 * @brief Set output data rate when disabled
cparata 0:c761bc6186e8 292 * @param odr the output data rate value to be set
cparata 0:c761bc6186e8 293 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 294 */
cparata 0:c761bc6186e8 295 int LPS22HHSensor::set_odr_when_disabled(float odr)
cparata 0:c761bc6186e8 296 {
cparata 1:978cae936ddb 297 _last_odr = (odr <= 1.0f) ? LPS22HH_1_Hz
cparata 1:978cae936ddb 298 : (odr <= 10.0f) ? LPS22HH_10_Hz
cparata 1:978cae936ddb 299 : (odr <= 25.0f) ? LPS22HH_25_Hz
cparata 1:978cae936ddb 300 : (odr <= 50.0f) ? LPS22HH_50_Hz
cparata 1:978cae936ddb 301 : (odr <= 75.0f) ? LPS22HH_75_Hz
cparata 1:978cae936ddb 302 : (odr <= 100.0f) ? LPS22HH_100_Hz
cparata 1:978cae936ddb 303 : LPS22HH_200_Hz;
cparata 0:c761bc6186e8 304
cparata 1:978cae936ddb 305 return 0;
cparata 0:c761bc6186e8 306 }
cparata 0:c761bc6186e8 307
cparata 0:c761bc6186e8 308 /**
cparata 0:c761bc6186e8 309 * @brief Get the LPS22HH pressure value
cparata 0:c761bc6186e8 310 * @param value pointer where the pressure value is written
cparata 0:c761bc6186e8 311 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 312 */
cparata 0:c761bc6186e8 313 int LPS22HHSensor::get_pressure(float *value)
cparata 0:c761bc6186e8 314 {
cparata 1:978cae936ddb 315 axis1bit32_t data_raw_pressure;
cparata 0:c761bc6186e8 316
cparata 1:978cae936ddb 317 (void)memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
cparata 1:978cae936ddb 318 if (lps22hh_pressure_raw_get(&_reg_ctx, data_raw_pressure.u8bit) != 0) {
cparata 1:978cae936ddb 319 return 1;
cparata 1:978cae936ddb 320 }
cparata 0:c761bc6186e8 321
cparata 1:978cae936ddb 322 *value = LPS22HH_FROM_LSB_TO_hPa((float)(data_raw_pressure.i32bit));
cparata 0:c761bc6186e8 323
cparata 1:978cae936ddb 324 return 0;
cparata 0:c761bc6186e8 325 }
cparata 0:c761bc6186e8 326
cparata 0:c761bc6186e8 327 /**
cparata 0:c761bc6186e8 328 * @brief Get the LPS22HH pressure data ready bit value
cparata 0:c761bc6186e8 329 * @param status the status of data ready bit
cparata 0:c761bc6186e8 330 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 331 */
cparata 0:c761bc6186e8 332 int LPS22HHSensor::get_press_drdy_status(uint8_t *status)
cparata 0:c761bc6186e8 333 {
cparata 1:978cae936ddb 334 if (lps22hh_press_flag_data_ready_get(&_reg_ctx, status) != 0) {
cparata 1:978cae936ddb 335 return 1;
cparata 1:978cae936ddb 336 }
cparata 0:c761bc6186e8 337
cparata 1:978cae936ddb 338 return 0;
cparata 0:c761bc6186e8 339 }
cparata 0:c761bc6186e8 340
cparata 0:c761bc6186e8 341 /**
cparata 0:c761bc6186e8 342 * @brief Get the LPS22HH temperature value
cparata 0:c761bc6186e8 343 * @param value pointer where the temperature value is written
cparata 0:c761bc6186e8 344 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 345 */
cparata 0:c761bc6186e8 346 int LPS22HHSensor::get_temperature(float *value)
cparata 0:c761bc6186e8 347 {
cparata 1:978cae936ddb 348 axis1bit16_t data_raw_temperature;
cparata 0:c761bc6186e8 349
cparata 1:978cae936ddb 350 (void)memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
cparata 1:978cae936ddb 351 if (lps22hh_temperature_raw_get(&_reg_ctx, data_raw_temperature.u8bit) != 0) {
cparata 1:978cae936ddb 352 return 1;
cparata 1:978cae936ddb 353 }
cparata 0:c761bc6186e8 354
cparata 1:978cae936ddb 355 *value = LPS22HH_FROM_LSB_TO_degC((float)(data_raw_temperature.i16bit));
cparata 0:c761bc6186e8 356
cparata 1:978cae936ddb 357 return 0;
cparata 0:c761bc6186e8 358 }
cparata 0:c761bc6186e8 359
cparata 0:c761bc6186e8 360 /**
cparata 0:c761bc6186e8 361 * @brief Get the LPS22HH temperature data ready bit value
cparata 0:c761bc6186e8 362 * @param status the status of data ready bit
cparata 0:c761bc6186e8 363 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 364 */
cparata 0:c761bc6186e8 365 int LPS22HHSensor::get_temp_drdy_status(uint8_t *status)
cparata 0:c761bc6186e8 366 {
cparata 1:978cae936ddb 367 if (lps22hh_temp_flag_data_ready_get(&_reg_ctx, status) != 0) {
cparata 1:978cae936ddb 368 return 1;
cparata 1:978cae936ddb 369 }
cparata 0:c761bc6186e8 370
cparata 1:978cae936ddb 371 return 0;
cparata 0:c761bc6186e8 372 }
cparata 0:c761bc6186e8 373
cparata 0:c761bc6186e8 374 /**
cparata 0:c761bc6186e8 375 * @brief Get the LPS22HH register value
cparata 0:c761bc6186e8 376 * @param reg address to be written
cparata 0:c761bc6186e8 377 * @param data value to be written
cparata 0:c761bc6186e8 378 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 379 */
cparata 0:c761bc6186e8 380 int LPS22HHSensor::read_reg(uint8_t reg, uint8_t *data)
cparata 0:c761bc6186e8 381 {
cparata 1:978cae936ddb 382 if (lps22hh_read_reg(&_reg_ctx, reg, data, 1) != 0) {
cparata 1:978cae936ddb 383 return 1;
cparata 1:978cae936ddb 384 }
cparata 0:c761bc6186e8 385
cparata 1:978cae936ddb 386 return 0;
cparata 0:c761bc6186e8 387 }
cparata 0:c761bc6186e8 388
cparata 0:c761bc6186e8 389 /**
cparata 0:c761bc6186e8 390 * @brief Set the LPS22HH register value
cparata 0:c761bc6186e8 391 * @param reg address to be written
cparata 0:c761bc6186e8 392 * @param data value to be written
cparata 0:c761bc6186e8 393 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 394 */
cparata 0:c761bc6186e8 395 int LPS22HHSensor::write_reg(uint8_t reg, uint8_t data)
cparata 0:c761bc6186e8 396 {
cparata 1:978cae936ddb 397 if (lps22hh_write_reg(&_reg_ctx, reg, &data, 1) != 0) {
cparata 1:978cae936ddb 398 return 1;
cparata 1:978cae936ddb 399 }
cparata 0:c761bc6186e8 400
cparata 1:978cae936ddb 401 return 0;
cparata 0:c761bc6186e8 402 }
cparata 0:c761bc6186e8 403
cparata 0:c761bc6186e8 404 /**
cparata 0:c761bc6186e8 405 * @brief Get the LPS22HH FIFO data
cparata 0:c761bc6186e8 406 * @param press the pointer where FIFO pressure value is stored
cparata 0:c761bc6186e8 407 * @param temp the pointer where FIFO temperature value is stored
cparata 0:c761bc6186e8 408 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 409 */
cparata 0:c761bc6186e8 410 int LPS22HHSensor::get_fifo_data(float *press, float *temp)
cparata 0:c761bc6186e8 411 {
cparata 1:978cae936ddb 412 axis1bit32_t data_raw_pressure;
cparata 1:978cae936ddb 413 axis1bit16_t data_raw_temperature;
cparata 0:c761bc6186e8 414
cparata 1:978cae936ddb 415 (void)memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
cparata 1:978cae936ddb 416 if (lps22hh_fifo_pressure_raw_get(&_reg_ctx, data_raw_pressure.u8bit) != 0) {
cparata 1:978cae936ddb 417 return 1;
cparata 1:978cae936ddb 418 }
cparata 0:c761bc6186e8 419
cparata 1:978cae936ddb 420 *press = LPS22HH_FROM_LSB_TO_hPa((float)(data_raw_pressure.i32bit));
cparata 0:c761bc6186e8 421
cparata 1:978cae936ddb 422 (void)memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
cparata 1:978cae936ddb 423 if (lps22hh_fifo_temperature_raw_get(&_reg_ctx, data_raw_temperature.u8bit) != 0) {
cparata 1:978cae936ddb 424 return 1;
cparata 1:978cae936ddb 425 }
cparata 0:c761bc6186e8 426
cparata 1:978cae936ddb 427 *temp = LPS22HH_FROM_LSB_TO_degC((float)(data_raw_temperature.i16bit));
cparata 0:c761bc6186e8 428
cparata 1:978cae936ddb 429 return 0;
cparata 0:c761bc6186e8 430 }
cparata 0:c761bc6186e8 431
cparata 0:c761bc6186e8 432 /**
cparata 0:c761bc6186e8 433 * @brief Get the LPS22HH FIFO threshold
cparata 0:c761bc6186e8 434 * @param status the status of FIFO threshold
cparata 0:c761bc6186e8 435 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 436 */
cparata 0:c761bc6186e8 437 int LPS22HHSensor::get_fifo_fth_status(uint8_t *status)
cparata 0:c761bc6186e8 438 {
cparata 1:978cae936ddb 439 if (lps22hh_fifo_wtm_flag_get(&_reg_ctx, status) != 0) {
cparata 1:978cae936ddb 440 return 1;
cparata 1:978cae936ddb 441 }
cparata 0:c761bc6186e8 442
cparata 1:978cae936ddb 443 return 0;
cparata 0:c761bc6186e8 444 }
cparata 0:c761bc6186e8 445
cparata 0:c761bc6186e8 446 /**
cparata 0:c761bc6186e8 447 * @brief Get the LPS22HH FIFO full status
cparata 0:c761bc6186e8 448 * @param status the status of FIFO full status
cparata 0:c761bc6186e8 449 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 450 */
cparata 0:c761bc6186e8 451 int LPS22HHSensor::get_fifo_full_status(uint8_t *status)
cparata 0:c761bc6186e8 452 {
cparata 1:978cae936ddb 453 if (lps22hh_fifo_full_flag_get(&_reg_ctx, status) != 0) {
cparata 1:978cae936ddb 454 return 1;
cparata 1:978cae936ddb 455 }
cparata 0:c761bc6186e8 456
cparata 1:978cae936ddb 457 return 0;
cparata 0:c761bc6186e8 458 }
cparata 0:c761bc6186e8 459
cparata 0:c761bc6186e8 460 /**
cparata 0:c761bc6186e8 461 * @brief Get the LPS22HH FIFO OVR status
cparata 0:c761bc6186e8 462 * @param status the status of FIFO OVR status
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_ovr_status(uint8_t *status)
cparata 0:c761bc6186e8 466 {
cparata 1:978cae936ddb 467 if (lps22hh_fifo_ovr_flag_get(&_reg_ctx, status) != 0) {
cparata 1:978cae936ddb 468 return 1;
cparata 1:978cae936ddb 469 }
cparata 0:c761bc6186e8 470
cparata 1:978cae936ddb 471 return 0;
cparata 0:c761bc6186e8 472 }
cparata 0:c761bc6186e8 473
cparata 0:c761bc6186e8 474 /**
cparata 0:c761bc6186e8 475 * @brief Get the LPS22HH FIFO data level
cparata 0:c761bc6186e8 476 * @param status the status of FIFO data level
cparata 0:c761bc6186e8 477 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 478 */
cparata 0:c761bc6186e8 479 int LPS22HHSensor::get_fifo_level(uint8_t *status)
cparata 0:c761bc6186e8 480 {
cparata 1:978cae936ddb 481 if (lps22hh_fifo_data_level_get(&_reg_ctx, status) != 0) {
cparata 1:978cae936ddb 482 return 1;
cparata 1:978cae936ddb 483 }
cparata 0:c761bc6186e8 484
cparata 1:978cae936ddb 485 return 0;
cparata 0:c761bc6186e8 486 }
cparata 0:c761bc6186e8 487
cparata 0:c761bc6186e8 488 /**
cparata 0:c761bc6186e8 489 * @brief Reset the FIFO interrupt
cparata 0:c761bc6186e8 490 * @param interrupt The FIFO interrupt to be reset; values: 0 = FTH; 1 = FULL; 2 = OVR
cparata 0:c761bc6186e8 491 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 492 */
cparata 0:c761bc6186e8 493 int LPS22HHSensor::reset_fifo_interrupt(uint8_t interrupt)
cparata 0:c761bc6186e8 494 {
cparata 1:978cae936ddb 495 switch (interrupt) {
cparata 1:978cae936ddb 496 case 0:
cparata 1:978cae936ddb 497 if (lps22hh_fifo_threshold_on_int_set(&_reg_ctx, PROPERTY_DISABLE) != 0) {
cparata 1:978cae936ddb 498 return 1;
cparata 1:978cae936ddb 499 }
cparata 1:978cae936ddb 500 break;
cparata 1:978cae936ddb 501 case 1:
cparata 1:978cae936ddb 502 if (lps22hh_fifo_full_on_int_set(&_reg_ctx, PROPERTY_DISABLE) != 0) {
cparata 1:978cae936ddb 503 return 1;
cparata 1:978cae936ddb 504 }
cparata 1:978cae936ddb 505 break;
cparata 1:978cae936ddb 506 case 2:
cparata 1:978cae936ddb 507 if (lps22hh_fifo_ovr_on_int_set(&_reg_ctx, PROPERTY_DISABLE) != 0) {
cparata 1:978cae936ddb 508 return 1;
cparata 1:978cae936ddb 509 }
cparata 1:978cae936ddb 510 break;
cparata 1:978cae936ddb 511 default:
cparata 1:978cae936ddb 512 return 1;
cparata 1:978cae936ddb 513 }
cparata 0:c761bc6186e8 514
cparata 1:978cae936ddb 515 return 0;
cparata 0:c761bc6186e8 516 }
cparata 0:c761bc6186e8 517
cparata 0:c761bc6186e8 518 /**
cparata 0:c761bc6186e8 519 * @brief Set the FIFO interrupt
cparata 0:c761bc6186e8 520 * @param interrupt The FIFO interrupt to be set; values: 0 = FTH; 1 = FULL; 2 = OVR
cparata 0:c761bc6186e8 521 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 522 */
cparata 0:c761bc6186e8 523 int LPS22HHSensor::set_fifo_interrupt(uint8_t interrupt)
cparata 0:c761bc6186e8 524 {
cparata 1:978cae936ddb 525 switch (interrupt) {
cparata 1:978cae936ddb 526 case 0:
cparata 1:978cae936ddb 527 if (lps22hh_fifo_threshold_on_int_set(&_reg_ctx, PROPERTY_ENABLE) != 0) {
cparata 1:978cae936ddb 528 return 1;
cparata 1:978cae936ddb 529 }
cparata 1:978cae936ddb 530 break;
cparata 1:978cae936ddb 531 case 1:
cparata 1:978cae936ddb 532 if (lps22hh_fifo_full_on_int_set(&_reg_ctx, PROPERTY_ENABLE) != 0) {
cparata 1:978cae936ddb 533 return 1;
cparata 1:978cae936ddb 534 }
cparata 1:978cae936ddb 535 break;
cparata 1:978cae936ddb 536 case 2:
cparata 1:978cae936ddb 537 if (lps22hh_fifo_ovr_on_int_set(&_reg_ctx, PROPERTY_ENABLE) != 0) {
cparata 1:978cae936ddb 538 return 1;
cparata 1:978cae936ddb 539 }
cparata 1:978cae936ddb 540 break;
cparata 1:978cae936ddb 541 default:
cparata 1:978cae936ddb 542 return 1;
cparata 1:978cae936ddb 543 }
cparata 0:c761bc6186e8 544
cparata 1:978cae936ddb 545 return 0;
cparata 0:c761bc6186e8 546 }
cparata 0:c761bc6186e8 547
cparata 0:c761bc6186e8 548 /**
cparata 0:c761bc6186e8 549 * @brief Set the FIFO mode
cparata 0:c761bc6186e8 550 * @param Mode the FIFO mode to be set
cparata 0:c761bc6186e8 551 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 552 */
cparata 0:c761bc6186e8 553 int LPS22HHSensor::set_fifo_mode(uint8_t mode)
cparata 0:c761bc6186e8 554 {
cparata 1:978cae936ddb 555 /* Verify that the passed parameter contains one of the valid values */
cparata 1:978cae936ddb 556 switch ((lps22hh_f_mode_t)mode) {
cparata 1:978cae936ddb 557 case LPS22HH_BYPASS_MODE:
cparata 1:978cae936ddb 558 case LPS22HH_FIFO_MODE:
cparata 1:978cae936ddb 559 case LPS22HH_STREAM_MODE:
cparata 1:978cae936ddb 560 case LPS22HH_STREAM_TO_FIFO_MODE:
cparata 1:978cae936ddb 561 case LPS22HH_BYPASS_TO_STREAM_MODE:
cparata 1:978cae936ddb 562 case LPS22HH_BYPASS_TO_FIFO_MODE:
cparata 1:978cae936ddb 563 break;
cparata 1:978cae936ddb 564 default:
cparata 1:978cae936ddb 565 return 1;
cparata 1:978cae936ddb 566 }
cparata 0:c761bc6186e8 567
cparata 1:978cae936ddb 568 if (lps22hh_fifo_mode_set(&_reg_ctx, (lps22hh_f_mode_t)mode) != 0) {
cparata 1:978cae936ddb 569 return 1;
cparata 1:978cae936ddb 570 }
cparata 0:c761bc6186e8 571
cparata 1:978cae936ddb 572 return 0;
cparata 0:c761bc6186e8 573 }
cparata 0:c761bc6186e8 574
cparata 0:c761bc6186e8 575 /**
cparata 0:c761bc6186e8 576 * @brief Set the LPS22HH FIFO watermark level
cparata 0:c761bc6186e8 577 * @param watermark the FIFO watermark level to be set
cparata 0:c761bc6186e8 578 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 579 */
cparata 0:c761bc6186e8 580 int LPS22HHSensor::set_fifo_watermark_level(uint8_t watermark)
cparata 0:c761bc6186e8 581 {
cparata 1:978cae936ddb 582 if (lps22hh_fifo_watermark_set(&_reg_ctx, watermark) != 0) {
cparata 1:978cae936ddb 583 return 1;
cparata 1:978cae936ddb 584 }
cparata 0:c761bc6186e8 585
cparata 1:978cae936ddb 586 return 0;
cparata 0:c761bc6186e8 587 }
cparata 0:c761bc6186e8 588
cparata 0:c761bc6186e8 589 /**
cparata 0:c761bc6186e8 590 * @brief Set the LPS22HH stop on watermark function
cparata 0:c761bc6186e8 591 * @param stop the state of stop on watermark function
cparata 0:c761bc6186e8 592 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 593 */
cparata 0:c761bc6186e8 594 int LPS22HHSensor::stop_fifo_on_watermark(uint8_t stop)
cparata 0:c761bc6186e8 595 {
cparata 1:978cae936ddb 596 if (lps22hh_fifo_stop_on_wtm_set(&_reg_ctx, stop) != 0) {
cparata 1:978cae936ddb 597 return 1;
cparata 1:978cae936ddb 598 }
cparata 0:c761bc6186e8 599
cparata 1:978cae936ddb 600 return 0;
cparata 0:c761bc6186e8 601 }
cparata 0:c761bc6186e8 602
cparata 0:c761bc6186e8 603 /**
cparata 0:c761bc6186e8 604 * @brief Set the LPS22HH One Shot Mode
cparata 0:c761bc6186e8 605 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 606 */
cparata 0:c761bc6186e8 607 int LPS22HHSensor::set_one_shot()
cparata 0:c761bc6186e8 608 {
cparata 1:978cae936ddb 609 /* Start One Shot Measurement */
cparata 1:978cae936ddb 610 if (lps22hh_data_rate_set(&_reg_ctx, LPS22HH_ONE_SHOOT) != 0) {
cparata 1:978cae936ddb 611 return 1;
cparata 1:978cae936ddb 612 }
cparata 0:c761bc6186e8 613
cparata 1:978cae936ddb 614 return 0;
cparata 0:c761bc6186e8 615 }
cparata 0:c761bc6186e8 616
cparata 0:c761bc6186e8 617 /**
cparata 0:c761bc6186e8 618 * @brief Get the LPS22HH One Shot Status
cparata 0:c761bc6186e8 619 * @param status pointer to the one shot status (1 means measurements available, 0 means measurements not available yet)
cparata 0:c761bc6186e8 620 * @retval 0 in case of success, an error code otherwise
cparata 0:c761bc6186e8 621 */
cparata 0:c761bc6186e8 622 int LPS22HHSensor::get_one_shot_status(uint8_t *status)
cparata 0:c761bc6186e8 623 {
cparata 1:978cae936ddb 624 uint8_t p_da;
cparata 1:978cae936ddb 625 uint8_t t_da;
cparata 0:c761bc6186e8 626
cparata 1:978cae936ddb 627 /* Get DataReady for pressure */
cparata 1:978cae936ddb 628 if (lps22hh_press_flag_data_ready_get(&_reg_ctx, &p_da) != 0) {
cparata 1:978cae936ddb 629 return 1;
cparata 1:978cae936ddb 630 }
cparata 0:c761bc6186e8 631
cparata 1:978cae936ddb 632 /* Get DataReady for temperature */
cparata 1:978cae936ddb 633 if (lps22hh_temp_flag_data_ready_get(&_reg_ctx, &t_da) != 0) {
cparata 1:978cae936ddb 634 return 1;
cparata 1:978cae936ddb 635 }
cparata 0:c761bc6186e8 636
cparata 1:978cae936ddb 637 if (p_da && t_da) {
cparata 1:978cae936ddb 638 *status = 1;
cparata 1:978cae936ddb 639 } else {
cparata 1:978cae936ddb 640 *status = 0;
cparata 1:978cae936ddb 641 }
cparata 0:c761bc6186e8 642
cparata 1:978cae936ddb 643 return 0;
cparata 0:c761bc6186e8 644 }
cparata 0:c761bc6186e8 645
cparata 0:c761bc6186e8 646 int32_t LPS22HH_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite)
cparata 0:c761bc6186e8 647 {
cparata 1:978cae936ddb 648 return ((LPS22HHSensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
cparata 0:c761bc6186e8 649 }
cparata 0:c761bc6186e8 650
cparata 0:c761bc6186e8 651 int32_t LPS22HH_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead)
cparata 0:c761bc6186e8 652 {
cparata 1:978cae936ddb 653 return ((LPS22HHSensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
cparata 0:c761bc6186e8 654 }