parent
bf282b0a12
commit
4158f225e1
@ -1,225 +0,0 @@ |
|||||||
/**
|
|
||||||
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are met: |
|
||||||
* |
|
||||||
* Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* Neither the name of the copyright holder nor the names of the |
|
||||||
* contributors may be used to endorse or promote products derived from |
|
||||||
* this software without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR |
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|
||||||
* DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER |
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY |
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
|
||||||
* OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|
||||||
* ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
|
||||||
* |
|
||||||
* The information provided is believed to be accurate and reliable. |
|
||||||
* The copyright holder assumes no responsibility |
|
||||||
* for the consequences of use |
|
||||||
* of such information nor for any infringement of patents or |
|
||||||
* other rights of third parties which may result from its use. |
|
||||||
* No license is granted by implication or otherwise under any patent or |
|
||||||
* patent rights of the copyright holder. |
|
||||||
* |
|
||||||
* @file bme680.h |
|
||||||
* @date 30 Oct 2017 |
|
||||||
* @version 3.5.3 |
|
||||||
* @brief |
|
||||||
* |
|
||||||
*/ |
|
||||||
/*! @file bme680.h
|
|
||||||
@brief Sensor driver for BME680 sensor */ |
|
||||||
/*!
|
|
||||||
* @defgroup BME680 SENSOR API |
|
||||||
* @{*/ |
|
||||||
#ifndef BME680_H_ |
|
||||||
#define BME680_H_ |
|
||||||
|
|
||||||
/*! CPP guard */ |
|
||||||
#ifdef __cplusplus |
|
||||||
extern "C" |
|
||||||
{ |
|
||||||
#endif |
|
||||||
|
|
||||||
/* Header includes */ |
|
||||||
#include "bme680_defs.h" |
|
||||||
|
|
||||||
/* function prototype declarations */ |
|
||||||
/*!
|
|
||||||
* @brief This API is the entry point. |
|
||||||
* It reads the chip-id and calibration data from the sensor. |
|
||||||
* |
|
||||||
* @param[in,out] dev : Structure instance of bme680_dev |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
|
||||||
*/ |
|
||||||
int8_t bme680_init(struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API writes the given data to the register address |
|
||||||
* of the sensor. |
|
||||||
* |
|
||||||
* @param[in] reg_addr : Register address from where the data to be written. |
|
||||||
* @param[in] reg_data : Pointer to data buffer which is to be written |
|
||||||
* in the sensor. |
|
||||||
* @param[in] len : No of bytes of data to write.. |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
|
||||||
*/ |
|
||||||
int8_t bme680_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API reads the data from the given register address of the sensor. |
|
||||||
* |
|
||||||
* @param[in] reg_addr : Register address from where the data to be read |
|
||||||
* @param[out] reg_data : Pointer to data buffer to store the read data. |
|
||||||
* @param[in] len : No of bytes of data to be read. |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
|
||||||
*/ |
|
||||||
int8_t bme680_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API performs the soft reset of the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error. |
|
||||||
*/ |
|
||||||
int8_t bme680_soft_reset(struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API is used to set the power mode of the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev |
|
||||||
* @note : Pass the value to bme680_dev.power_mode structure variable. |
|
||||||
* |
|
||||||
* value | mode |
|
||||||
* -------------|------------------ |
|
||||||
* 0x00 | BME680_SLEEP_MODE |
|
||||||
* 0x01 | BME680_FORCED_MODE |
|
||||||
* |
|
||||||
* * @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
|
||||||
*/ |
|
||||||
int8_t bme680_set_sensor_mode(struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API is used to get the power mode of the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev |
|
||||||
* @note : bme680_dev.power_mode structure variable hold the power mode. |
|
||||||
* |
|
||||||
* value | mode |
|
||||||
* ---------|------------------ |
|
||||||
* 0x00 | BME680_SLEEP_MODE |
|
||||||
* 0x01 | BME680_FORCED_MODE |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
|
||||||
*/ |
|
||||||
int8_t bme680_get_sensor_mode(struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API is used to set the profile duration of the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* @param[in] duration : Duration of the measurement in ms. |
|
||||||
* |
|
||||||
* @return Nothing |
|
||||||
*/ |
|
||||||
void bme680_set_profile_dur(uint16_t duration, struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API is used to get the profile duration of the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* @param[in] duration : Duration of the measurement in ms. |
|
||||||
* |
|
||||||
* @return Nothing |
|
||||||
*/ |
|
||||||
void bme680_get_profile_dur(uint16_t *duration, const struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API reads the pressure, temperature and humidity and gas data |
|
||||||
* from the sensor, compensates the data and store it in the bme680_data |
|
||||||
* structure instance passed by the user. |
|
||||||
* |
|
||||||
* @param[out] data: Structure instance to hold the data. |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
|
||||||
*/ |
|
||||||
int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API is used to set the oversampling, filter and T,P,H, gas selection |
|
||||||
* settings in the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* @param[in] desired_settings : Variable used to select the settings which |
|
||||||
* are to be set in the sensor. |
|
||||||
* |
|
||||||
* Macros | Functionality |
|
||||||
*---------------------------------|---------------------------------------------- |
|
||||||
* BME680_OST_SEL | To set temperature oversampling. |
|
||||||
* BME680_OSP_SEL | To set pressure oversampling. |
|
||||||
* BME680_OSH_SEL | To set humidity oversampling. |
|
||||||
* BME680_GAS_MEAS_SEL | To set gas measurement setting. |
|
||||||
* BME680_FILTER_SEL | To set filter setting. |
|
||||||
* BME680_HCNTRL_SEL | To set humidity control setting. |
|
||||||
* BME680_RUN_GAS_SEL | To set run gas setting. |
|
||||||
* BME680_NBCONV_SEL | To set NB conversion setting. |
|
||||||
* BME680_GAS_SENSOR_SEL | To set all gas sensor related settings |
|
||||||
* |
|
||||||
* @note : Below are the macros to be used by the user for selecting the |
|
||||||
* desired settings. User can do OR operation of these macros for configuring |
|
||||||
* multiple settings. |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error. |
|
||||||
*/ |
|
||||||
int8_t bme680_set_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This API is used to get the oversampling, filter and T,P,H, gas selection |
|
||||||
* settings in the sensor. |
|
||||||
* |
|
||||||
* @param[in] dev : Structure instance of bme680_dev. |
|
||||||
* @param[in] desired_settings : Variable used to select the settings which |
|
||||||
* are to be get from the sensor. |
|
||||||
* |
|
||||||
* @return Result of API execution status |
|
||||||
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error. |
|
||||||
*/ |
|
||||||
int8_t bme680_get_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev); |
|
||||||
#ifdef __cplusplus |
|
||||||
} |
|
||||||
#endif /* End of CPP guard */ |
|
||||||
#endif /* BME680_H_ */ |
|
||||||
/** @}*/ |
|
@ -1,512 +0,0 @@ |
|||||||
/**
|
|
||||||
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are met: |
|
||||||
* |
|
||||||
* Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* Neither the name of the copyright holder nor the names of the |
|
||||||
* contributors may be used to endorse or promote products derived from |
|
||||||
* this software without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR |
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|
||||||
* DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER |
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY |
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
|
||||||
* OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|
||||||
* ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
|
||||||
* |
|
||||||
* The information provided is believed to be accurate and reliable. |
|
||||||
* The copyright holder assumes no responsibility |
|
||||||
* for the consequences of use |
|
||||||
* of such information nor for any infringement of patents or |
|
||||||
* other rights of third parties which may result from its use. |
|
||||||
* No license is granted by implication or otherwise under any patent or |
|
||||||
* patent rights of the copyright holder. |
|
||||||
* |
|
||||||
* @file bme680_defs.h |
|
||||||
* @date 30 Oct 2017 |
|
||||||
* @version 3.5.3 |
|
||||||
* @brief |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
/*! @file bme680_defs.h
|
|
||||||
@brief Sensor driver for BME680 sensor */ |
|
||||||
/*!
|
|
||||||
* @defgroup BME680 SENSOR API |
|
||||||
* @brief |
|
||||||
* @{*/ |
|
||||||
#ifndef BME680_DEFS_H_ |
|
||||||
#define BME680_DEFS_H_ |
|
||||||
|
|
||||||
/********************************************************/ |
|
||||||
/* header includes */ |
|
||||||
#ifdef __KERNEL__ |
|
||||||
#include <linux/types.h> |
|
||||||
#include <linux/kernel.h> |
|
||||||
#else |
|
||||||
#include <stdint.h> |
|
||||||
#include <stddef.h> |
|
||||||
#endif |
|
||||||
|
|
||||||
/******************************************************************************/ |
|
||||||
/*! @name Common macros */ |
|
||||||
/******************************************************************************/ |
|
||||||
|
|
||||||
#if !defined(UINT8_C) && !defined(INT8_C) |
|
||||||
#define INT8_C(x) S8_C(x) |
|
||||||
#define UINT8_C(x) U8_C(x) |
|
||||||
#endif |
|
||||||
|
|
||||||
#if !defined(UINT16_C) && !defined(INT16_C) |
|
||||||
#define INT16_C(x) S16_C(x) |
|
||||||
#define UINT16_C(x) U16_C(x) |
|
||||||
#endif |
|
||||||
|
|
||||||
#if !defined(INT32_C) && !defined(UINT32_C) |
|
||||||
#define INT32_C(x) S32_C(x) |
|
||||||
#define UINT32_C(x) U32_C(x) |
|
||||||
#endif |
|
||||||
|
|
||||||
#if !defined(INT64_C) && !defined(UINT64_C) |
|
||||||
#define INT64_C(x) S64_C(x) |
|
||||||
#define UINT64_C(x) U64_C(x) |
|
||||||
#endif |
|
||||||
|
|
||||||
/**@}*/ |
|
||||||
|
|
||||||
/**\name C standard macros */ |
|
||||||
#ifndef NULL |
|
||||||
#ifdef __cplusplus |
|
||||||
#define NULL 0 |
|
||||||
#else |
|
||||||
#define NULL ((void *) 0) |
|
||||||
#endif |
|
||||||
#endif |
|
||||||
|
|
||||||
/** BME680 General config */ |
|
||||||
#define BME680_POLL_PERIOD_MS UINT8_C(10) |
|
||||||
|
|
||||||
/** BME680 I2C addresses */ |
|
||||||
#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76) |
|
||||||
#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77) |
|
||||||
|
|
||||||
/** BME680 unique chip identifier */ |
|
||||||
#define BME680_CHIP_ID UINT8_C(0x61) |
|
||||||
|
|
||||||
/** BME680 coefficients related defines */ |
|
||||||
#define BME680_COEFF_SIZE UINT8_C(0x41) |
|
||||||
#define BME680_COEFF_ADDR1_LEN UINT8_C(25) |
|
||||||
#define BME680_COEFF_ADDR2_LEN UINT8_C(16) |
|
||||||
|
|
||||||
/** BME680 field_x related defines */ |
|
||||||
#define BME680_FIELD_LENGTH UINT8_C(15) |
|
||||||
#define BME680_FIELD_ADDR_OFFSET UINT8_C(17) |
|
||||||
|
|
||||||
/** Soft reset command */ |
|
||||||
#define BME680_SOFT_RESET_CMD UINT8_C(0xb6) |
|
||||||
|
|
||||||
/** Error code definitions */ |
|
||||||
#define BME680_OK INT8_C(0) |
|
||||||
/* Errors */ |
|
||||||
#define BME680_E_NULL_PTR INT8_C(-1) |
|
||||||
#define BME680_E_COM_FAIL INT8_C(-2) |
|
||||||
#define BME680_E_DEV_NOT_FOUND INT8_C(-3) |
|
||||||
#define BME680_E_INVALID_LENGTH INT8_C(-4) |
|
||||||
|
|
||||||
/* Warnings */ |
|
||||||
#define BME680_W_DEFINE_PWR_MODE INT8_C(1) |
|
||||||
#define BME680_W_NO_NEW_DATA INT8_C(2) |
|
||||||
|
|
||||||
/* Info's */ |
|
||||||
#define BME680_I_MIN_CORRECTION UINT8_C(1) |
|
||||||
#define BME680_I_MAX_CORRECTION UINT8_C(2) |
|
||||||
|
|
||||||
/** Register map */ |
|
||||||
/** Other coefficient's address */ |
|
||||||
#define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00) |
|
||||||
#define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02) |
|
||||||
#define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04) |
|
||||||
#define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A) |
|
||||||
#define BME680_ADDR_GAS_CONF_START UINT8_C(0x64) |
|
||||||
|
|
||||||
/** Field settings */ |
|
||||||
#define BME680_FIELD0_ADDR UINT8_C(0x1d) |
|
||||||
|
|
||||||
/** Heater settings */ |
|
||||||
#define BME680_RES_HEAT0_ADDR UINT8_C(0x5a) |
|
||||||
#define BME680_GAS_WAIT0_ADDR UINT8_C(0x64) |
|
||||||
|
|
||||||
/** Sensor configuration registers */ |
|
||||||
#define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70) |
|
||||||
#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71) |
|
||||||
#define BME680_CONF_OS_H_ADDR UINT8_C(0x72) |
|
||||||
#define BME680_MEM_PAGE_ADDR UINT8_C(0xf3) |
|
||||||
#define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74) |
|
||||||
#define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75) |
|
||||||
|
|
||||||
/** Coefficient's address */ |
|
||||||
#define BME680_COEFF_ADDR1 UINT8_C(0x89) |
|
||||||
#define BME680_COEFF_ADDR2 UINT8_C(0xe1) |
|
||||||
|
|
||||||
/** Chip identifier */ |
|
||||||
#define BME680_CHIP_ID_ADDR UINT8_C(0xd0) |
|
||||||
|
|
||||||
/** Soft reset register */ |
|
||||||
#define BME680_SOFT_RESET_ADDR UINT8_C(0xe0) |
|
||||||
|
|
||||||
/** Heater control settings */ |
|
||||||
#define BME680_ENABLE_HEATER UINT8_C(0x00) |
|
||||||
#define BME680_DISABLE_HEATER UINT8_C(0x08) |
|
||||||
|
|
||||||
/** Gas measurement settings */ |
|
||||||
#define BME680_DISABLE_GAS_MEAS UINT8_C(0x00) |
|
||||||
#define BME680_ENABLE_GAS_MEAS UINT8_C(0x01) |
|
||||||
|
|
||||||
/** Over-sampling settings */ |
|
||||||
#define BME680_OS_NONE UINT8_C(0) |
|
||||||
#define BME680_OS_1X UINT8_C(1) |
|
||||||
#define BME680_OS_2X UINT8_C(2) |
|
||||||
#define BME680_OS_4X UINT8_C(3) |
|
||||||
#define BME680_OS_8X UINT8_C(4) |
|
||||||
#define BME680_OS_16X UINT8_C(5) |
|
||||||
|
|
||||||
/** IIR filter settings */ |
|
||||||
#define BME680_FILTER_SIZE_0 UINT8_C(0) |
|
||||||
#define BME680_FILTER_SIZE_1 UINT8_C(1) |
|
||||||
#define BME680_FILTER_SIZE_3 UINT8_C(2) |
|
||||||
#define BME680_FILTER_SIZE_7 UINT8_C(3) |
|
||||||
#define BME680_FILTER_SIZE_15 UINT8_C(4) |
|
||||||
#define BME680_FILTER_SIZE_31 UINT8_C(5) |
|
||||||
#define BME680_FILTER_SIZE_63 UINT8_C(6) |
|
||||||
#define BME680_FILTER_SIZE_127 UINT8_C(7) |
|
||||||
|
|
||||||
/** Power mode settings */ |
|
||||||
#define BME680_SLEEP_MODE UINT8_C(0) |
|
||||||
#define BME680_FORCED_MODE UINT8_C(1) |
|
||||||
|
|
||||||
/** Delay related macro declaration */ |
|
||||||
#define BME680_RESET_PERIOD UINT32_C(10) |
|
||||||
|
|
||||||
/** SPI memory page settings */ |
|
||||||
#define BME680_MEM_PAGE0 UINT8_C(0x10) |
|
||||||
#define BME680_MEM_PAGE1 UINT8_C(0x00) |
|
||||||
|
|
||||||
/** Ambient humidity shift value for compensation */ |
|
||||||
#define BME680_HUM_REG_SHIFT_VAL UINT8_C(4) |
|
||||||
|
|
||||||
/** Run gas enable and disable settings */ |
|
||||||
#define BME680_RUN_GAS_DISABLE UINT8_C(0) |
|
||||||
#define BME680_RUN_GAS_ENABLE UINT8_C(1) |
|
||||||
|
|
||||||
/** Buffer length macro declaration */ |
|
||||||
#define BME680_TMP_BUFFER_LENGTH UINT8_C(40) |
|
||||||
#define BME680_REG_BUFFER_LENGTH UINT8_C(6) |
|
||||||
#define BME680_FIELD_DATA_LENGTH UINT8_C(3) |
|
||||||
#define BME680_GAS_REG_BUF_LENGTH UINT8_C(20) |
|
||||||
#define BME680_GAS_HEATER_PROF_LEN_MAX UINT8_C(10) |
|
||||||
|
|
||||||
/** Settings selector */ |
|
||||||
#define BME680_OST_SEL UINT16_C(1) |
|
||||||
#define BME680_OSP_SEL UINT16_C(2) |
|
||||||
#define BME680_OSH_SEL UINT16_C(4) |
|
||||||
#define BME680_GAS_MEAS_SEL UINT16_C(8) |
|
||||||
#define BME680_FILTER_SEL UINT16_C(16) |
|
||||||
#define BME680_HCNTRL_SEL UINT16_C(32) |
|
||||||
#define BME680_RUN_GAS_SEL UINT16_C(64) |
|
||||||
#define BME680_NBCONV_SEL UINT16_C(128) |
|
||||||
#define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL) |
|
||||||
|
|
||||||
/** Number of conversion settings*/ |
|
||||||
#define BME680_NBCONV_MIN UINT8_C(0) |
|
||||||
#define BME680_NBCONV_MAX UINT8_C(10) |
|
||||||
|
|
||||||
/** Mask definitions */ |
|
||||||
#define BME680_GAS_MEAS_MSK UINT8_C(0x30) |
|
||||||
#define BME680_NBCONV_MSK UINT8_C(0X0F) |
|
||||||
#define BME680_FILTER_MSK UINT8_C(0X1C) |
|
||||||
#define BME680_OST_MSK UINT8_C(0XE0) |
|
||||||
#define BME680_OSP_MSK UINT8_C(0X1C) |
|
||||||
#define BME680_OSH_MSK UINT8_C(0X07) |
|
||||||
#define BME680_HCTRL_MSK UINT8_C(0x08) |
|
||||||
#define BME680_RUN_GAS_MSK UINT8_C(0x10) |
|
||||||
#define BME680_MODE_MSK UINT8_C(0x03) |
|
||||||
#define BME680_RHRANGE_MSK UINT8_C(0x30) |
|
||||||
#define BME680_RSERROR_MSK UINT8_C(0xf0) |
|
||||||
#define BME680_NEW_DATA_MSK UINT8_C(0x80) |
|
||||||
#define BME680_GAS_INDEX_MSK UINT8_C(0x0f) |
|
||||||
#define BME680_GAS_RANGE_MSK UINT8_C(0x0f) |
|
||||||
#define BME680_GASM_VALID_MSK UINT8_C(0x20) |
|
||||||
#define BME680_HEAT_STAB_MSK UINT8_C(0x10) |
|
||||||
#define BME680_MEM_PAGE_MSK UINT8_C(0x10) |
|
||||||
#define BME680_SPI_RD_MSK UINT8_C(0x80) |
|
||||||
#define BME680_SPI_WR_MSK UINT8_C(0x7f) |
|
||||||
#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F) |
|
||||||
|
|
||||||
/** Bit position definitions for sensor settings */ |
|
||||||
#define BME680_GAS_MEAS_POS UINT8_C(4) |
|
||||||
#define BME680_FILTER_POS UINT8_C(2) |
|
||||||
#define BME680_OST_POS UINT8_C(5) |
|
||||||
#define BME680_OSP_POS UINT8_C(2) |
|
||||||
#define BME680_RUN_GAS_POS UINT8_C(4) |
|
||||||
|
|
||||||
/** Array Index to Field data mapping for Calibration Data*/ |
|
||||||
#define BME680_T2_LSB_REG (1) |
|
||||||
#define BME680_T2_MSB_REG (2) |
|
||||||
#define BME680_T3_REG (3) |
|
||||||
#define BME680_P1_LSB_REG (5) |
|
||||||
#define BME680_P1_MSB_REG (6) |
|
||||||
#define BME680_P2_LSB_REG (7) |
|
||||||
#define BME680_P2_MSB_REG (8) |
|
||||||
#define BME680_P3_REG (9) |
|
||||||
#define BME680_P4_LSB_REG (11) |
|
||||||
#define BME680_P4_MSB_REG (12) |
|
||||||
#define BME680_P5_LSB_REG (13) |
|
||||||
#define BME680_P5_MSB_REG (14) |
|
||||||
#define BME680_P7_REG (15) |
|
||||||
#define BME680_P6_REG (16) |
|
||||||
#define BME680_P8_LSB_REG (19) |
|
||||||
#define BME680_P8_MSB_REG (20) |
|
||||||
#define BME680_P9_LSB_REG (21) |
|
||||||
#define BME680_P9_MSB_REG (22) |
|
||||||
#define BME680_P10_REG (23) |
|
||||||
#define BME680_H2_MSB_REG (25) |
|
||||||
#define BME680_H2_LSB_REG (26) |
|
||||||
#define BME680_H1_LSB_REG (26) |
|
||||||
#define BME680_H1_MSB_REG (27) |
|
||||||
#define BME680_H3_REG (28) |
|
||||||
#define BME680_H4_REG (29) |
|
||||||
#define BME680_H5_REG (30) |
|
||||||
#define BME680_H6_REG (31) |
|
||||||
#define BME680_H7_REG (32) |
|
||||||
#define BME680_T1_LSB_REG (33) |
|
||||||
#define BME680_T1_MSB_REG (34) |
|
||||||
#define BME680_GH2_LSB_REG (35) |
|
||||||
#define BME680_GH2_MSB_REG (36) |
|
||||||
#define BME680_GH1_REG (37) |
|
||||||
#define BME680_GH3_REG (38) |
|
||||||
|
|
||||||
/** BME680 register buffer index settings*/ |
|
||||||
#define BME680_REG_FILTER_INDEX UINT8_C(5) |
|
||||||
#define BME680_REG_TEMP_INDEX UINT8_C(4) |
|
||||||
#define BME680_REG_PRES_INDEX UINT8_C(4) |
|
||||||
#define BME680_REG_HUM_INDEX UINT8_C(2) |
|
||||||
#define BME680_REG_NBCONV_INDEX UINT8_C(1) |
|
||||||
#define BME680_REG_RUN_GAS_INDEX UINT8_C(1) |
|
||||||
#define BME680_REG_HCTRL_INDEX UINT8_C(0) |
|
||||||
|
|
||||||
/** Macro to combine two 8 bit data's to form a 16 bit data */ |
|
||||||
#define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb) |
|
||||||
|
|
||||||
/** Macro to SET and GET BITS of a register */ |
|
||||||
#define BME680_SET_BITS(reg_data, bitname, data) \ |
|
||||||
((reg_data & ~(bitname##_MSK)) | \
|
|
||||||
((data << bitname##_POS) & bitname##_MSK)) |
|
||||||
#define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \ |
|
||||||
(bitname##_POS)) |
|
||||||
|
|
||||||
/** Macro variant to handle the bitname position if it is zero */ |
|
||||||
#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \ |
|
||||||
((reg_data & ~(bitname##_MSK)) | \
|
|
||||||
(data & bitname##_MSK)) |
|
||||||
#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) |
|
||||||
|
|
||||||
/** Type definitions */ |
|
||||||
/*
|
|
||||||
* Generic communication function pointer |
|
||||||
* @param[in] dev_id: Place holder to store the id of the device structure |
|
||||||
* Can be used to store the index of the Chip select or |
|
||||||
* I2C address of the device. |
|
||||||
* @param[in] reg_addr: Used to select the register the where data needs to |
|
||||||
* be read from or written to. |
|
||||||
* @param[in/out] reg_data: Data array to read/write |
|
||||||
* @param[in] len: Length of the data array |
|
||||||
*/ |
|
||||||
typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len); |
|
||||||
|
|
||||||
/*
|
|
||||||
* Delay function pointer |
|
||||||
* @param[in] period: Time period in milliseconds |
|
||||||
*/ |
|
||||||
typedef void (*bme680_delay_fptr_t)(uint32_t period); |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief Interface selection Enumerations |
|
||||||
*/ |
|
||||||
enum bme680_intf { |
|
||||||
/*! SPI interface */ |
|
||||||
BME680_SPI_INTF, |
|
||||||
/*! I2C interface */ |
|
||||||
BME680_I2C_INTF |
|
||||||
}; |
|
||||||
|
|
||||||
/* structure definitions */ |
|
||||||
/*!
|
|
||||||
* @brief Sensor field data structure |
|
||||||
*/ |
|
||||||
struct bme680_field_data { |
|
||||||
/*! Contains new_data, gasm_valid & heat_stab */ |
|
||||||
uint8_t status; |
|
||||||
/*! The index of the heater profile used */ |
|
||||||
uint8_t gas_index; |
|
||||||
/*! Measurement index to track order */ |
|
||||||
uint8_t meas_index; |
|
||||||
/*! Temperature in degree celsius x100 */ |
|
||||||
int16_t temperature; |
|
||||||
/*! Pressure in Pascal */ |
|
||||||
uint32_t pressure; |
|
||||||
/*! Humidity in % relative humidity x1000 */ |
|
||||||
uint32_t humidity; |
|
||||||
/*! Gas resistance in Ohms */ |
|
||||||
uint32_t gas_resistance; |
|
||||||
}; |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief Structure to hold the Calibration data |
|
||||||
*/ |
|
||||||
struct bme680_calib_data { |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
uint16_t par_h1; |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
uint16_t par_h2; |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
int8_t par_h3; |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
int8_t par_h4; |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
int8_t par_h5; |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
uint8_t par_h6; |
|
||||||
/*! Variable to store calibrated humidity data */ |
|
||||||
int8_t par_h7; |
|
||||||
/*! Variable to store calibrated gas data */ |
|
||||||
int8_t par_gh1; |
|
||||||
/*! Variable to store calibrated gas data */ |
|
||||||
int16_t par_gh2; |
|
||||||
/*! Variable to store calibrated gas data */ |
|
||||||
int8_t par_gh3; |
|
||||||
/*! Variable to store calibrated temperature data */ |
|
||||||
uint16_t par_t1; |
|
||||||
/*! Variable to store calibrated temperature data */ |
|
||||||
int16_t par_t2; |
|
||||||
/*! Variable to store calibrated temperature data */ |
|
||||||
int8_t par_t3; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
uint16_t par_p1; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int16_t par_p2; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int8_t par_p3; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int16_t par_p4; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int16_t par_p5; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int8_t par_p6; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int8_t par_p7; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int16_t par_p8; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
int16_t par_p9; |
|
||||||
/*! Variable to store calibrated pressure data */ |
|
||||||
uint8_t par_p10; |
|
||||||
/*! Variable to store t_fine size */ |
|
||||||
int32_t t_fine; |
|
||||||
/*! Variable to store heater resistance range */ |
|
||||||
uint8_t res_heat_range; |
|
||||||
/*! Variable to store heater resistance value */ |
|
||||||
int8_t res_heat_val; |
|
||||||
/*! Variable to store error range */ |
|
||||||
int8_t range_sw_err; |
|
||||||
}; |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief BME680 sensor settings structure which comprises of ODR, |
|
||||||
* over-sampling and filter settings. |
|
||||||
*/ |
|
||||||
struct bme680_tph_sett { |
|
||||||
/*! Humidity oversampling */ |
|
||||||
uint8_t os_hum; |
|
||||||
/*! Temperature oversampling */ |
|
||||||
uint8_t os_temp; |
|
||||||
/*! Pressure oversampling */ |
|
||||||
uint8_t os_pres; |
|
||||||
/*! Filter coefficient */ |
|
||||||
uint8_t filter; |
|
||||||
}; |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief BME680 gas sensor which comprises of gas settings |
|
||||||
* and status parameters |
|
||||||
*/ |
|
||||||
struct bme680_gas_sett { |
|
||||||
/*! Variable to store nb conversion */ |
|
||||||
uint8_t nb_conv; |
|
||||||
/*! Variable to store heater control */ |
|
||||||
uint8_t heatr_ctrl; |
|
||||||
/*! Run gas enable value */ |
|
||||||
uint8_t run_gas; |
|
||||||
/*! Pointer to store heater temperature */ |
|
||||||
uint16_t heatr_temp; |
|
||||||
/*! Pointer to store duration profile */ |
|
||||||
uint16_t heatr_dur; |
|
||||||
}; |
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief BME680 device structure |
|
||||||
*/ |
|
||||||
struct bme680_dev { |
|
||||||
/*! Chip Id */ |
|
||||||
uint8_t chip_id; |
|
||||||
/*! Device Id */ |
|
||||||
uint8_t dev_id; |
|
||||||
/*! SPI/I2C interface */ |
|
||||||
enum bme680_intf intf; |
|
||||||
/*! Memory page used */ |
|
||||||
uint8_t mem_page; |
|
||||||
/*! Ambient temperature in Degree C*/ |
|
||||||
int8_t amb_temp; |
|
||||||
/*! Sensor calibration data */ |
|
||||||
struct bme680_calib_data calib; |
|
||||||
/*! Sensor settings */ |
|
||||||
struct bme680_tph_sett tph_sett; |
|
||||||
/*! Gas Sensor settings */ |
|
||||||
struct bme680_gas_sett gas_sett; |
|
||||||
/*! Sensor power modes */ |
|
||||||
uint8_t power_mode; |
|
||||||
/*! New sensor fields */ |
|
||||||
uint8_t new_fields; |
|
||||||
/*! Store the info messages */ |
|
||||||
uint8_t info_msg; |
|
||||||
/*! Burst read structure */ |
|
||||||
bme680_com_fptr_t read; |
|
||||||
/*! Burst write structure */ |
|
||||||
bme680_com_fptr_t write; |
|
||||||
/*! Delay in ms */ |
|
||||||
bme680_delay_fptr_t delay_ms; |
|
||||||
/*! Communication function result */ |
|
||||||
int8_t com_rslt; |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* BME680_DEFS_H_ */ |
|
||||||
/** @}*/ |
|
||||||
/** @}*/ |
|
@ -0,0 +1,323 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved. |
||||||
|
* |
||||||
|
* BSD-3-Clause |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* 1. Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* 3. Neither the name of the copyright holder nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
||||||
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
* @file bme68x.h |
||||||
|
* @date 2021-11-09 |
||||||
|
* @version v4.4.7 |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @defgroup bme68x BME68X |
||||||
|
* @brief <a href="https://www.bosch-sensortec.com/bst/products/all_products/bme680">Product Overview</a> |
||||||
|
* and <a href="https://github.com/BoschSensortec/BME68x-Sensor-API">Sensor API Source Code</a> |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef BME68X_H_ |
||||||
|
#define BME68X_H_ |
||||||
|
|
||||||
|
#include "bme68x_defs.h" |
||||||
|
|
||||||
|
/* CPP guard */ |
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup bme68x |
||||||
|
* \defgroup bme68xApiInit Initialization |
||||||
|
* @brief Initialize the sensor and device structure |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiInit |
||||||
|
* \page bme68x_api_bme68x_init bme68x_init |
||||||
|
* \code |
||||||
|
* int8_t bme68x_init(struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API reads the chip-id of the sensor which is the first step to |
||||||
|
* verify the sensor and also calibrates the sensor |
||||||
|
* As this API is the entry point, call this API before using other APIs. |
||||||
|
* |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_init(struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup bme68x |
||||||
|
* \defgroup bme68xApiRegister Registers |
||||||
|
* @brief Generic API for accessing sensor registers |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiRegister |
||||||
|
* \page bme68x_api_bme68x_set_regs bme68x_set_regs |
||||||
|
* \code |
||||||
|
* int8_t bme68x_set_regs(const uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev) |
||||||
|
* \endcode |
||||||
|
* @details This API writes the given data to the register address of the sensor |
||||||
|
* |
||||||
|
* @param[in] reg_addr : Register addresses to where the data is to be written |
||||||
|
* @param[in] reg_data : Pointer to data buffer which is to be written |
||||||
|
* in the reg_addr of sensor. |
||||||
|
* @param[in] len : No of bytes of data to write |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiRegister |
||||||
|
* \page bme68x_api_bme68x_get_regs bme68x_get_regs |
||||||
|
* \code |
||||||
|
* int8_t bme68x_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev) |
||||||
|
* \endcode |
||||||
|
* @details This API reads the data from the given register address of sensor. |
||||||
|
* |
||||||
|
* @param[in] reg_addr : Register address from where the data to be read |
||||||
|
* @param[out] reg_data : Pointer to data buffer to store the read data. |
||||||
|
* @param[in] len : No of bytes of data to be read. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup bme68x |
||||||
|
* \defgroup bme68xApiSystem System |
||||||
|
* @brief API that performs system-level operations |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiSystem |
||||||
|
* \page bme68x_api_bme68x_soft_reset bme68x_soft_reset |
||||||
|
* \code |
||||||
|
* int8_t bme68x_soft_reset(struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API soft-resets the sensor. |
||||||
|
* |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_soft_reset(struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup bme68x |
||||||
|
* \defgroup bme68xApiOm Operation mode |
||||||
|
* @brief API to configure operation mode |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiOm |
||||||
|
* \page bme68x_api_bme68x_set_op_mode bme68x_set_op_mode |
||||||
|
* \code |
||||||
|
* int8_t bme68x_set_op_mode(const uint8_t op_mode, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to set the operation mode of the sensor |
||||||
|
* @param[in] op_mode : Desired operation mode. |
||||||
|
* @param[in] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_set_op_mode(const uint8_t op_mode, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiOm |
||||||
|
* \page bme68x_api_bme68x_get_op_mode bme68x_get_op_mode |
||||||
|
* \code |
||||||
|
* int8_t bme68x_get_op_mode(uint8_t *op_mode, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to get the operation mode of the sensor. |
||||||
|
* |
||||||
|
* @param[out] op_mode : Desired operation mode. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_get_op_mode(uint8_t *op_mode, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiConfig |
||||||
|
* \page bme68x_api_bme68x_get_meas_dur bme68x_get_meas_dur |
||||||
|
* \code |
||||||
|
* uint32_t bme68x_get_meas_dur(const uint8_t op_mode, struct bme68x_conf *conf, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to get the remaining duration that can be used for heating. |
||||||
|
* |
||||||
|
* @param[in] op_mode : Desired operation mode. |
||||||
|
* @param[in] conf : Desired sensor configuration. |
||||||
|
* @param[in] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Measurement duration calculated in microseconds |
||||||
|
*/ |
||||||
|
uint32_t bme68x_get_meas_dur(const uint8_t op_mode, struct bme68x_conf *conf, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup bme68x |
||||||
|
* \defgroup bme68xApiData Data Read out |
||||||
|
* @brief Read our data from the sensor |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiData |
||||||
|
* \page bme68x_api_bme68x_get_data bme68x_get_data |
||||||
|
* \code |
||||||
|
* int8_t bme68x_get_data(uint8_t op_mode, struct bme68x_data *data, uint8_t *n_data, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API reads the pressure, temperature and humidity and gas data |
||||||
|
* from the sensor, compensates the data and store it in the bme68x_data |
||||||
|
* structure instance passed by the user. |
||||||
|
* |
||||||
|
* @param[in] op_mode : Expected operation mode. |
||||||
|
* @param[out] data : Structure instance to hold the data. |
||||||
|
* @param[out] n_data : Number of data instances available. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_get_data(uint8_t op_mode, struct bme68x_data *data, uint8_t *n_data, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup bme68x |
||||||
|
* \defgroup bme68xApiConfig Configuration |
||||||
|
* @brief Configuration API of sensor |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiConfig |
||||||
|
* \page bme68x_api_bme68x_set_conf bme68x_set_conf |
||||||
|
* \code |
||||||
|
* int8_t bme68x_set_conf(struct bme68x_conf *conf, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to set the oversampling, filter and odr configuration |
||||||
|
* |
||||||
|
* @param[in] conf : Desired sensor configuration. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_set_conf(struct bme68x_conf *conf, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiConfig |
||||||
|
* \page bme68x_api_bme68x_get_conf bme68x_get_conf |
||||||
|
* \code |
||||||
|
* int8_t bme68x_get_conf(struct bme68x_conf *conf, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to get the oversampling, filter and odr |
||||||
|
* configuration |
||||||
|
* |
||||||
|
* @param[out] conf : Present sensor configuration. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_get_conf(struct bme68x_conf *conf, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiConfig |
||||||
|
* \page bme68x_api_bme68x_set_heatr_conf bme68x_set_heatr_conf |
||||||
|
* \code |
||||||
|
* int8_t bme68x_set_heatr_conf(uint8_t op_mode, const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to set the gas configuration of the sensor. |
||||||
|
* |
||||||
|
* @param[in] op_mode : Expected operation mode of the sensor. |
||||||
|
* @param[in] conf : Desired heating configuration. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_set_heatr_conf(uint8_t op_mode, const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiConfig |
||||||
|
* \page bme68x_api_bme68x_get_heatr_conf bme68x_get_heatr_conf |
||||||
|
* \code |
||||||
|
* int8_t bme68x_get_heatr_conf(const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API is used to get the gas configuration of the sensor. |
||||||
|
* |
||||||
|
* @param[out] conf : Current configurations of the gas sensor. |
||||||
|
* @param[in,out] dev : Structure instance of bme68x_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_get_heatr_conf(const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup bme68xApiSystem |
||||||
|
* \page bme68x_api_bme68x_selftest_check bme68x_selftest_check |
||||||
|
* \code |
||||||
|
* int8_t bme68x_selftest_check(const struct bme68x_dev *dev); |
||||||
|
* \endcode |
||||||
|
* @details This API performs Self-test of low gas variant of BME68X |
||||||
|
* |
||||||
|
* @param[in, out] dev : Structure instance of bme68x_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval 0 -> Success |
||||||
|
* @retval < 0 -> Fail |
||||||
|
*/ |
||||||
|
int8_t bme68x_selftest_check(const struct bme68x_dev *dev); |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif /* End of CPP guard */ |
||||||
|
#endif /* BME68X_H_ */ |
@ -0,0 +1,972 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved. |
||||||
|
* |
||||||
|
* BSD-3-Clause |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* 1. Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* 3. Neither the name of the copyright holder nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
||||||
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
* @file bme68x_defs.h |
||||||
|
* @date 2021-11-09 |
||||||
|
* @version v4.4.7 |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
/*! @cond DOXYGEN_SUPRESS */ |
||||||
|
|
||||||
|
#ifndef BME68X_DEFS_H_ |
||||||
|
#define BME68X_DEFS_H_ |
||||||
|
|
||||||
|
/********************************************************* */ |
||||||
|
/*! Header includes */ |
||||||
|
/********************************************************* */ |
||||||
|
#ifdef __KERNEL__ |
||||||
|
#include <linux/types.h> |
||||||
|
#include <linux/kernel.h> |
||||||
|
#else |
||||||
|
#include <stdint.h> |
||||||
|
#include <stddef.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
/********************************************************* */ |
||||||
|
/*! Common Macros */ |
||||||
|
/********************************************************* */ |
||||||
|
#ifdef __KERNEL__ |
||||||
|
#if !defined(UINT8_C) && !defined(INT8_C) |
||||||
|
#define INT8_C(x) S8_C(x) |
||||||
|
#define UINT8_C(x) U8_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined(UINT16_C) && !defined(INT16_C) |
||||||
|
#define INT16_C(x) S16_C(x) |
||||||
|
#define UINT16_C(x) U16_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined(INT32_C) && !defined(UINT32_C) |
||||||
|
#define INT32_C(x) S32_C(x) |
||||||
|
#define UINT32_C(x) U32_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined(INT64_C) && !defined(UINT64_C) |
||||||
|
#define INT64_C(x) S64_C(x) |
||||||
|
#define UINT64_C(x) U64_C(x) |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! C standard macros */ |
||||||
|
#ifndef NULL |
||||||
|
#ifdef __cplusplus |
||||||
|
#define NULL 0 |
||||||
|
#else |
||||||
|
#define NULL ((void *) 0) |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifndef BME68X_DO_NOT_USE_FPU |
||||||
|
|
||||||
|
/* Comment or un-comment the macro to provide floating point data output */ |
||||||
|
#define BME68X_USE_FPU |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Period between two polls (value can be given by user) */ |
||||||
|
#ifndef BME68X_PERIOD_POLL |
||||||
|
#define BME68X_PERIOD_POLL UINT32_C(10000) |
||||||
|
#endif |
||||||
|
|
||||||
|
/* BME68X unique chip identifier */ |
||||||
|
#define BME68X_CHIP_ID UINT8_C(0x61) |
||||||
|
|
||||||
|
/* Period for a soft reset */ |
||||||
|
#define BME68X_PERIOD_RESET UINT32_C(10000) |
||||||
|
|
||||||
|
/* BME68X lower I2C address */ |
||||||
|
#define BME68X_I2C_ADDR_LOW UINT8_C(0x76) |
||||||
|
|
||||||
|
/* BME68X higher I2C address */ |
||||||
|
#define BME68X_I2C_ADDR_HIGH UINT8_C(0x77) |
||||||
|
|
||||||
|
/* Soft reset command */ |
||||||
|
#define BME68X_SOFT_RESET_CMD UINT8_C(0xb6) |
||||||
|
|
||||||
|
/* Return code definitions */ |
||||||
|
/* Success */ |
||||||
|
#define BME68X_OK INT8_C(0) |
||||||
|
|
||||||
|
/* Errors */ |
||||||
|
/* Null pointer passed */ |
||||||
|
#define BME68X_E_NULL_PTR INT8_C(-1) |
||||||
|
|
||||||
|
/* Communication failure */ |
||||||
|
#define BME68X_E_COM_FAIL INT8_C(-2) |
||||||
|
|
||||||
|
/* Sensor not found */ |
||||||
|
#define BME68X_E_DEV_NOT_FOUND INT8_C(-3) |
||||||
|
|
||||||
|
/* Incorrect length parameter */ |
||||||
|
#define BME68X_E_INVALID_LENGTH INT8_C(-4) |
||||||
|
|
||||||
|
/* Self test fail error */ |
||||||
|
#define BME68X_E_SELF_TEST INT8_C(-5) |
||||||
|
|
||||||
|
/* Warnings */ |
||||||
|
/* Define a valid operation mode */ |
||||||
|
#define BME68X_W_DEFINE_OP_MODE INT8_C(1) |
||||||
|
|
||||||
|
/* No new data was found */ |
||||||
|
#define BME68X_W_NO_NEW_DATA INT8_C(2) |
||||||
|
|
||||||
|
/* Define the shared heating duration */ |
||||||
|
#define BME68X_W_DEFINE_SHD_HEATR_DUR INT8_C(3) |
||||||
|
|
||||||
|
/* Information - only available via bme68x_dev.info_msg */ |
||||||
|
#define BME68X_I_PARAM_CORR UINT8_C(1) |
||||||
|
|
||||||
|
/* Register map addresses in I2C */ |
||||||
|
/* Register for 3rd group of coefficients */ |
||||||
|
#define BME68X_REG_COEFF3 UINT8_C(0x00) |
||||||
|
|
||||||
|
/* 0th Field address*/ |
||||||
|
#define BME68X_REG_FIELD0 UINT8_C(0x1d) |
||||||
|
|
||||||
|
/* 0th Current DAC address*/ |
||||||
|
#define BME68X_REG_IDAC_HEAT0 UINT8_C(0x50) |
||||||
|
|
||||||
|
/* 0th Res heat address */ |
||||||
|
#define BME68X_REG_RES_HEAT0 UINT8_C(0x5a) |
||||||
|
|
||||||
|
/* 0th Gas wait address */ |
||||||
|
#define BME68X_REG_GAS_WAIT0 UINT8_C(0x64) |
||||||
|
|
||||||
|
/* Shared heating duration address */ |
||||||
|
#define BME68X_REG_SHD_HEATR_DUR UINT8_C(0x6E) |
||||||
|
|
||||||
|
/* CTRL_GAS_0 address */ |
||||||
|
#define BME68X_REG_CTRL_GAS_0 UINT8_C(0x70) |
||||||
|
|
||||||
|
/* CTRL_GAS_1 address */ |
||||||
|
#define BME68X_REG_CTRL_GAS_1 UINT8_C(0x71) |
||||||
|
|
||||||
|
/* CTRL_HUM address */ |
||||||
|
#define BME68X_REG_CTRL_HUM UINT8_C(0x72) |
||||||
|
|
||||||
|
/* CTRL_MEAS address */ |
||||||
|
#define BME68X_REG_CTRL_MEAS UINT8_C(0x74) |
||||||
|
|
||||||
|
/* CONFIG address */ |
||||||
|
#define BME68X_REG_CONFIG UINT8_C(0x75) |
||||||
|
|
||||||
|
/* MEM_PAGE address */ |
||||||
|
#define BME68X_REG_MEM_PAGE UINT8_C(0xf3) |
||||||
|
|
||||||
|
/* Unique ID address */ |
||||||
|
#define BME68X_REG_UNIQUE_ID UINT8_C(0x83) |
||||||
|
|
||||||
|
/* Register for 1st group of coefficients */ |
||||||
|
#define BME68X_REG_COEFF1 UINT8_C(0x8a) |
||||||
|
|
||||||
|
/* Chip ID address */ |
||||||
|
#define BME68X_REG_CHIP_ID UINT8_C(0xd0) |
||||||
|
|
||||||
|
/* Soft reset address */ |
||||||
|
#define BME68X_REG_SOFT_RESET UINT8_C(0xe0) |
||||||
|
|
||||||
|
/* Register for 2nd group of coefficients */ |
||||||
|
#define BME68X_REG_COEFF2 UINT8_C(0xe1) |
||||||
|
|
||||||
|
/* Variant ID Register */ |
||||||
|
#define BME68X_REG_VARIANT_ID UINT8_C(0xF0) |
||||||
|
|
||||||
|
/* Enable/Disable macros */ |
||||||
|
|
||||||
|
/* Enable */ |
||||||
|
#define BME68X_ENABLE UINT8_C(0x01) |
||||||
|
|
||||||
|
/* Disable */ |
||||||
|
#define BME68X_DISABLE UINT8_C(0x00) |
||||||
|
|
||||||
|
/* Variant ID macros */ |
||||||
|
|
||||||
|
/* Low Gas variant */ |
||||||
|
#define BME68X_VARIANT_GAS_LOW UINT8_C(0x00) |
||||||
|
|
||||||
|
/* High Gas variant */ |
||||||
|
#define BME68X_VARIANT_GAS_HIGH UINT8_C(0x01) |
||||||
|
|
||||||
|
/* Oversampling setting macros */ |
||||||
|
|
||||||
|
/* Switch off measurement */ |
||||||
|
#define BME68X_OS_NONE UINT8_C(0) |
||||||
|
|
||||||
|
/* Perform 1 measurement */ |
||||||
|
#define BME68X_OS_1X UINT8_C(1) |
||||||
|
|
||||||
|
/* Perform 2 measurements */ |
||||||
|
#define BME68X_OS_2X UINT8_C(2) |
||||||
|
|
||||||
|
/* Perform 4 measurements */ |
||||||
|
#define BME68X_OS_4X UINT8_C(3) |
||||||
|
|
||||||
|
/* Perform 8 measurements */ |
||||||
|
#define BME68X_OS_8X UINT8_C(4) |
||||||
|
|
||||||
|
/* Perform 16 measurements */ |
||||||
|
#define BME68X_OS_16X UINT8_C(5) |
||||||
|
|
||||||
|
/* IIR Filter settings */ |
||||||
|
|
||||||
|
/* Switch off the filter */ |
||||||
|
#define BME68X_FILTER_OFF UINT8_C(0) |
||||||
|
|
||||||
|
/* Filter coefficient of 2 */ |
||||||
|
#define BME68X_FILTER_SIZE_1 UINT8_C(1) |
||||||
|
|
||||||
|
/* Filter coefficient of 4 */ |
||||||
|
#define BME68X_FILTER_SIZE_3 UINT8_C(2) |
||||||
|
|
||||||
|
/* Filter coefficient of 8 */ |
||||||
|
#define BME68X_FILTER_SIZE_7 UINT8_C(3) |
||||||
|
|
||||||
|
/* Filter coefficient of 16 */ |
||||||
|
#define BME68X_FILTER_SIZE_15 UINT8_C(4) |
||||||
|
|
||||||
|
/* Filter coefficient of 32 */ |
||||||
|
#define BME68X_FILTER_SIZE_31 UINT8_C(5) |
||||||
|
|
||||||
|
/* Filter coefficient of 64 */ |
||||||
|
#define BME68X_FILTER_SIZE_63 UINT8_C(6) |
||||||
|
|
||||||
|
/* Filter coefficient of 128 */ |
||||||
|
#define BME68X_FILTER_SIZE_127 UINT8_C(7) |
||||||
|
|
||||||
|
/* ODR/Standby time macros */ |
||||||
|
|
||||||
|
/* Standby time of 0.59ms */ |
||||||
|
#define BME68X_ODR_0_59_MS UINT8_C(0) |
||||||
|
|
||||||
|
/* Standby time of 62.5ms */ |
||||||
|
#define BME68X_ODR_62_5_MS UINT8_C(1) |
||||||
|
|
||||||
|
/* Standby time of 125ms */ |
||||||
|
#define BME68X_ODR_125_MS UINT8_C(2) |
||||||
|
|
||||||
|
/* Standby time of 250ms */ |
||||||
|
#define BME68X_ODR_250_MS UINT8_C(3) |
||||||
|
|
||||||
|
/* Standby time of 500ms */ |
||||||
|
#define BME68X_ODR_500_MS UINT8_C(4) |
||||||
|
|
||||||
|
/* Standby time of 1s */ |
||||||
|
#define BME68X_ODR_1000_MS UINT8_C(5) |
||||||
|
|
||||||
|
/* Standby time of 10ms */ |
||||||
|
#define BME68X_ODR_10_MS UINT8_C(6) |
||||||
|
|
||||||
|
/* Standby time of 20ms */ |
||||||
|
#define BME68X_ODR_20_MS UINT8_C(7) |
||||||
|
|
||||||
|
/* No standby time */ |
||||||
|
#define BME68X_ODR_NONE UINT8_C(8) |
||||||
|
|
||||||
|
/* Operating mode macros */ |
||||||
|
|
||||||
|
/* Sleep operation mode */ |
||||||
|
#define BME68X_SLEEP_MODE UINT8_C(0) |
||||||
|
|
||||||
|
/* Forced operation mode */ |
||||||
|
#define BME68X_FORCED_MODE UINT8_C(1) |
||||||
|
|
||||||
|
/* Parallel operation mode */ |
||||||
|
#define BME68X_PARALLEL_MODE UINT8_C(2) |
||||||
|
|
||||||
|
/* Sequential operation mode */ |
||||||
|
#define BME68X_SEQUENTIAL_MODE UINT8_C(3) |
||||||
|
|
||||||
|
/* SPI page macros */ |
||||||
|
|
||||||
|
/* SPI memory page 0 */ |
||||||
|
#define BME68X_MEM_PAGE0 UINT8_C(0x10) |
||||||
|
|
||||||
|
/* SPI memory page 1 */ |
||||||
|
#define BME68X_MEM_PAGE1 UINT8_C(0x00) |
||||||
|
|
||||||
|
/* Coefficient index macros */ |
||||||
|
|
||||||
|
/* Length for all coefficients */ |
||||||
|
#define BME68X_LEN_COEFF_ALL UINT8_C(42) |
||||||
|
|
||||||
|
/* Length for 1st group of coefficients */ |
||||||
|
#define BME68X_LEN_COEFF1 UINT8_C(23) |
||||||
|
|
||||||
|
/* Length for 2nd group of coefficients */ |
||||||
|
#define BME68X_LEN_COEFF2 UINT8_C(14) |
||||||
|
|
||||||
|
/* Length for 3rd group of coefficients */ |
||||||
|
#define BME68X_LEN_COEFF3 UINT8_C(5) |
||||||
|
|
||||||
|
/* Length of the field */ |
||||||
|
#define BME68X_LEN_FIELD UINT8_C(17) |
||||||
|
|
||||||
|
/* Length between two fields */ |
||||||
|
#define BME68X_LEN_FIELD_OFFSET UINT8_C(17) |
||||||
|
|
||||||
|
/* Length of the configuration register */ |
||||||
|
#define BME68X_LEN_CONFIG UINT8_C(5) |
||||||
|
|
||||||
|
/* Length of the interleaved buffer */ |
||||||
|
#define BME68X_LEN_INTERLEAVE_BUFF UINT8_C(20) |
||||||
|
|
||||||
|
/* Coefficient index macros */ |
||||||
|
|
||||||
|
/* Coefficient T2 LSB position */ |
||||||
|
#define BME68X_IDX_T2_LSB (0) |
||||||
|
|
||||||
|
/* Coefficient T2 MSB position */ |
||||||
|
#define BME68X_IDX_T2_MSB (1) |
||||||
|
|
||||||
|
/* Coefficient T3 position */ |
||||||
|
#define BME68X_IDX_T3 (2) |
||||||
|
|
||||||
|
/* Coefficient P1 LSB position */ |
||||||
|
#define BME68X_IDX_P1_LSB (4) |
||||||
|
|
||||||
|
/* Coefficient P1 MSB position */ |
||||||
|
#define BME68X_IDX_P1_MSB (5) |
||||||
|
|
||||||
|
/* Coefficient P2 LSB position */ |
||||||
|
#define BME68X_IDX_P2_LSB (6) |
||||||
|
|
||||||
|
/* Coefficient P2 MSB position */ |
||||||
|
#define BME68X_IDX_P2_MSB (7) |
||||||
|
|
||||||
|
/* Coefficient P3 position */ |
||||||
|
#define BME68X_IDX_P3 (8) |
||||||
|
|
||||||
|
/* Coefficient P4 LSB position */ |
||||||
|
#define BME68X_IDX_P4_LSB (10) |
||||||
|
|
||||||
|
/* Coefficient P4 MSB position */ |
||||||
|
#define BME68X_IDX_P4_MSB (11) |
||||||
|
|
||||||
|
/* Coefficient P5 LSB position */ |
||||||
|
#define BME68X_IDX_P5_LSB (12) |
||||||
|
|
||||||
|
/* Coefficient P5 MSB position */ |
||||||
|
#define BME68X_IDX_P5_MSB (13) |
||||||
|
|
||||||
|
/* Coefficient P7 position */ |
||||||
|
#define BME68X_IDX_P7 (14) |
||||||
|
|
||||||
|
/* Coefficient P6 position */ |
||||||
|
#define BME68X_IDX_P6 (15) |
||||||
|
|
||||||
|
/* Coefficient P8 LSB position */ |
||||||
|
#define BME68X_IDX_P8_LSB (18) |
||||||
|
|
||||||
|
/* Coefficient P8 MSB position */ |
||||||
|
#define BME68X_IDX_P8_MSB (19) |
||||||
|
|
||||||
|
/* Coefficient P9 LSB position */ |
||||||
|
#define BME68X_IDX_P9_LSB (20) |
||||||
|
|
||||||
|
/* Coefficient P9 MSB position */ |
||||||
|
#define BME68X_IDX_P9_MSB (21) |
||||||
|
|
||||||
|
/* Coefficient P10 position */ |
||||||
|
#define BME68X_IDX_P10 (22) |
||||||
|
|
||||||
|
/* Coefficient H2 MSB position */ |
||||||
|
#define BME68X_IDX_H2_MSB (23) |
||||||
|
|
||||||
|
/* Coefficient H2 LSB position */ |
||||||
|
#define BME68X_IDX_H2_LSB (24) |
||||||
|
|
||||||
|
/* Coefficient H1 LSB position */ |
||||||
|
#define BME68X_IDX_H1_LSB (24) |
||||||
|
|
||||||
|
/* Coefficient H1 MSB position */ |
||||||
|
#define BME68X_IDX_H1_MSB (25) |
||||||
|
|
||||||
|
/* Coefficient H3 position */ |
||||||
|
#define BME68X_IDX_H3 (26) |
||||||
|
|
||||||
|
/* Coefficient H4 position */ |
||||||
|
#define BME68X_IDX_H4 (27) |
||||||
|
|
||||||
|
/* Coefficient H5 position */ |
||||||
|
#define BME68X_IDX_H5 (28) |
||||||
|
|
||||||
|
/* Coefficient H6 position */ |
||||||
|
#define BME68X_IDX_H6 (29) |
||||||
|
|
||||||
|
/* Coefficient H7 position */ |
||||||
|
#define BME68X_IDX_H7 (30) |
||||||
|
|
||||||
|
/* Coefficient T1 LSB position */ |
||||||
|
#define BME68X_IDX_T1_LSB (31) |
||||||
|
|
||||||
|
/* Coefficient T1 MSB position */ |
||||||
|
#define BME68X_IDX_T1_MSB (32) |
||||||
|
|
||||||
|
/* Coefficient GH2 LSB position */ |
||||||
|
#define BME68X_IDX_GH2_LSB (33) |
||||||
|
|
||||||
|
/* Coefficient GH2 MSB position */ |
||||||
|
#define BME68X_IDX_GH2_MSB (34) |
||||||
|
|
||||||
|
/* Coefficient GH1 position */ |
||||||
|
#define BME68X_IDX_GH1 (35) |
||||||
|
|
||||||
|
/* Coefficient GH3 position */ |
||||||
|
#define BME68X_IDX_GH3 (36) |
||||||
|
|
||||||
|
/* Coefficient res heat value position */ |
||||||
|
#define BME68X_IDX_RES_HEAT_VAL (37) |
||||||
|
|
||||||
|
/* Coefficient res heat range position */ |
||||||
|
#define BME68X_IDX_RES_HEAT_RANGE (39) |
||||||
|
|
||||||
|
/* Coefficient range switching error position */ |
||||||
|
#define BME68X_IDX_RANGE_SW_ERR (41) |
||||||
|
|
||||||
|
/* Gas measurement macros */ |
||||||
|
|
||||||
|
/* Disable gas measurement */ |
||||||
|
#define BME68X_DISABLE_GAS_MEAS UINT8_C(0x00) |
||||||
|
|
||||||
|
/* Enable gas measurement low */ |
||||||
|
#define BME68X_ENABLE_GAS_MEAS_L UINT8_C(0x01) |
||||||
|
|
||||||
|
/* Enable gas measurement high */ |
||||||
|
#define BME68X_ENABLE_GAS_MEAS_H UINT8_C(0x02) |
||||||
|
|
||||||
|
/* Heater control macros */ |
||||||
|
|
||||||
|
/* Enable heater */ |
||||||
|
#define BME68X_ENABLE_HEATER UINT8_C(0x00) |
||||||
|
|
||||||
|
/* Disable heater */ |
||||||
|
#define BME68X_DISABLE_HEATER UINT8_C(0x01) |
||||||
|
|
||||||
|
#ifdef BME68X_USE_FPU |
||||||
|
|
||||||
|
/* 0 degree Celsius */ |
||||||
|
#define BME68X_MIN_TEMPERATURE INT16_C(0) |
||||||
|
|
||||||
|
/* 60 degree Celsius */ |
||||||
|
#define BME68X_MAX_TEMPERATURE INT16_C(60) |
||||||
|
|
||||||
|
/* 900 hecto Pascals */ |
||||||
|
#define BME68X_MIN_PRESSURE UINT32_C(90000) |
||||||
|
|
||||||
|
/* 1100 hecto Pascals */ |
||||||
|
#define BME68X_MAX_PRESSURE UINT32_C(110000) |
||||||
|
|
||||||
|
/* 20% relative humidity */ |
||||||
|
#define BME68X_MIN_HUMIDITY UINT32_C(20) |
||||||
|
|
||||||
|
/* 80% relative humidity*/ |
||||||
|
#define BME68X_MAX_HUMIDITY UINT32_C(80) |
||||||
|
#else |
||||||
|
|
||||||
|
/* 0 degree Celsius */ |
||||||
|
#define BME68X_MIN_TEMPERATURE INT16_C(0) |
||||||
|
|
||||||
|
/* 60 degree Celsius */ |
||||||
|
#define BME68X_MAX_TEMPERATURE INT16_C(6000) |
||||||
|
|
||||||
|
/* 900 hecto Pascals */ |
||||||
|
#define BME68X_MIN_PRESSURE UINT32_C(90000) |
||||||
|
|
||||||
|
/* 1100 hecto Pascals */ |
||||||
|
#define BME68X_MAX_PRESSURE UINT32_C(110000) |
||||||
|
|
||||||
|
/* 20% relative humidity */ |
||||||
|
#define BME68X_MIN_HUMIDITY UINT32_C(20000) |
||||||
|
|
||||||
|
/* 80% relative humidity*/ |
||||||
|
#define BME68X_MAX_HUMIDITY UINT32_C(80000) |
||||||
|
|
||||||
|
#endif |
||||||
|
|
||||||
|
#define BME68X_HEATR_DUR1 UINT16_C(1000) |
||||||
|
#define BME68X_HEATR_DUR2 UINT16_C(2000) |
||||||
|
#define BME68X_HEATR_DUR1_DELAY UINT32_C(1000000) |
||||||
|
#define BME68X_HEATR_DUR2_DELAY UINT32_C(2000000) |
||||||
|
#define BME68X_N_MEAS UINT8_C(6) |
||||||
|
#define BME68X_LOW_TEMP UINT8_C(150) |
||||||
|
#define BME68X_HIGH_TEMP UINT16_C(350) |
||||||
|
|
||||||
|
/* Mask macros */ |
||||||
|
/* Mask for number of conversions */ |
||||||
|
#define BME68X_NBCONV_MSK UINT8_C(0X0f) |
||||||
|
|
||||||
|
/* Mask for IIR filter */ |
||||||
|
#define BME68X_FILTER_MSK UINT8_C(0X1c) |
||||||
|
|
||||||
|
/* Mask for ODR[3] */ |
||||||
|
#define BME68X_ODR3_MSK UINT8_C(0x80) |
||||||
|
|
||||||
|
/* Mask for ODR[2:0] */ |
||||||
|
#define BME68X_ODR20_MSK UINT8_C(0xe0) |
||||||
|
|
||||||
|
/* Mask for temperature oversampling */ |
||||||
|
#define BME68X_OST_MSK UINT8_C(0Xe0) |
||||||
|
|
||||||
|
/* Mask for pressure oversampling */ |
||||||
|
#define BME68X_OSP_MSK UINT8_C(0X1c) |
||||||
|
|
||||||
|
/* Mask for humidity oversampling */ |
||||||
|
#define BME68X_OSH_MSK UINT8_C(0X07) |
||||||
|
|
||||||
|
/* Mask for heater control */ |
||||||
|
#define BME68X_HCTRL_MSK UINT8_C(0x08) |
||||||
|
|
||||||
|
/* Mask for run gas */ |
||||||
|
#define BME68X_RUN_GAS_MSK UINT8_C(0x30) |
||||||
|
|
||||||
|
/* Mask for operation mode */ |
||||||
|
#define BME68X_MODE_MSK UINT8_C(0x03) |
||||||
|
|
||||||
|
/* Mask for res heat range */ |
||||||
|
#define BME68X_RHRANGE_MSK UINT8_C(0x30) |
||||||
|
|
||||||
|
/* Mask for range switching error */ |
||||||
|
#define BME68X_RSERROR_MSK UINT8_C(0xf0) |
||||||
|
|
||||||
|
/* Mask for new data */ |
||||||
|
#define BME68X_NEW_DATA_MSK UINT8_C(0x80) |
||||||
|
|
||||||
|
/* Mask for gas index */ |
||||||
|
#define BME68X_GAS_INDEX_MSK UINT8_C(0x0f) |
||||||
|
|
||||||
|
/* Mask for gas range */ |
||||||
|
#define BME68X_GAS_RANGE_MSK UINT8_C(0x0f) |
||||||
|
|
||||||
|
/* Mask for gas measurement valid */ |
||||||
|
#define BME68X_GASM_VALID_MSK UINT8_C(0x20) |
||||||
|
|
||||||
|
/* Mask for heater stability */ |
||||||
|
#define BME68X_HEAT_STAB_MSK UINT8_C(0x10) |
||||||
|
|
||||||
|
/* Mask for SPI memory page */ |
||||||
|
#define BME68X_MEM_PAGE_MSK UINT8_C(0x10) |
||||||
|
|
||||||
|
/* Mask for reading a register in SPI */ |
||||||
|
#define BME68X_SPI_RD_MSK UINT8_C(0x80) |
||||||
|
|
||||||
|
/* Mask for writing a register in SPI */ |
||||||
|
#define BME68X_SPI_WR_MSK UINT8_C(0x7f) |
||||||
|
|
||||||
|
/* Mask for the H1 calibration coefficient */ |
||||||
|
#define BME68X_BIT_H1_DATA_MSK UINT8_C(0x0f) |
||||||
|
|
||||||
|
/* Position macros */ |
||||||
|
|
||||||
|
/* Filter bit position */ |
||||||
|
#define BME68X_FILTER_POS UINT8_C(2) |
||||||
|
|
||||||
|
/* Temperature oversampling bit position */ |
||||||
|
#define BME68X_OST_POS UINT8_C(5) |
||||||
|
|
||||||
|
/* Pressure oversampling bit position */ |
||||||
|
#define BME68X_OSP_POS UINT8_C(2) |
||||||
|
|
||||||
|
/* ODR[3] bit position */ |
||||||
|
#define BME68X_ODR3_POS UINT8_C(7) |
||||||
|
|
||||||
|
/* ODR[2:0] bit position */ |
||||||
|
#define BME68X_ODR20_POS UINT8_C(5) |
||||||
|
|
||||||
|
/* Run gas bit position */ |
||||||
|
#define BME68X_RUN_GAS_POS UINT8_C(4) |
||||||
|
|
||||||
|
/* Heater control bit position */ |
||||||
|
#define BME68X_HCTRL_POS UINT8_C(3) |
||||||
|
|
||||||
|
/* Macro to combine two 8 bit data's to form a 16 bit data */ |
||||||
|
#define BME68X_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb) |
||||||
|
|
||||||
|
/* Macro to set bits */ |
||||||
|
#define BME68X_SET_BITS(reg_data, bitname, data) \ |
||||||
|
((reg_data & ~(bitname##_MSK)) | \
|
||||||
|
((data << bitname##_POS) & bitname##_MSK)) |
||||||
|
|
||||||
|
/* Macro to get bits */ |
||||||
|
#define BME68X_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \ |
||||||
|
(bitname##_POS)) |
||||||
|
|
||||||
|
/* Macro to set bits starting from position 0 */ |
||||||
|
#define BME68X_SET_BITS_POS_0(reg_data, bitname, data) \ |
||||||
|
((reg_data & ~(bitname##_MSK)) | \
|
||||||
|
(data & bitname##_MSK)) |
||||||
|
|
||||||
|
/* Macro to get bits starting from position 0 */ |
||||||
|
#define BME68X_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) |
||||||
|
|
||||||
|
/**
|
||||||
|
* BME68X_INTF_RET_TYPE is the read/write interface return type which can be overwritten by the build system. |
||||||
|
* The default is set to int8_t. |
||||||
|
*/ |
||||||
|
#ifndef BME68X_INTF_RET_TYPE |
||||||
|
#define BME68X_INTF_RET_TYPE int8_t |
||||||
|
#endif |
||||||
|
|
||||||
|
/**
|
||||||
|
* BME68X_INTF_RET_SUCCESS is the success return value read/write interface return type which can be |
||||||
|
* overwritten by the build system. The default is set to 0. It is used to check for a successful |
||||||
|
* execution of the read/write functions |
||||||
|
*/ |
||||||
|
#ifndef BME68X_INTF_RET_SUCCESS |
||||||
|
#define BME68X_INTF_RET_SUCCESS INT8_C(0) |
||||||
|
#endif |
||||||
|
|
||||||
|
/********************************************************* */ |
||||||
|
/*! Function Pointers */ |
||||||
|
/********************************************************* */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Bus communication function pointer which should be mapped to |
||||||
|
* the platform specific read functions of the user |
||||||
|
* |
||||||
|
* @param[in] reg_addr : 8bit register address of the sensor |
||||||
|
* @param[out] reg_data : Data from the specified address |
||||||
|
* @param[in] length : Length of the reg_data array |
||||||
|
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors |
||||||
|
* for interface related callbacks |
||||||
|
* @retval 0 for Success |
||||||
|
* @retval Non-zero for Failure |
||||||
|
*/ |
||||||
|
typedef BME68X_INTF_RET_TYPE (*bme68x_read_fptr_t)(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, |
||||||
|
void *intf_ptr); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Bus communication function pointer which should be mapped to |
||||||
|
* the platform specific write functions of the user |
||||||
|
* |
||||||
|
* @param[in] reg_addr : 8bit register address of the sensor |
||||||
|
* @param[out] reg_data : Data to the specified address |
||||||
|
* @param[in] length : Length of the reg_data array |
||||||
|
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors |
||||||
|
* for interface related callbacks |
||||||
|
* @retval 0 for Success |
||||||
|
* @retval Non-zero for Failure |
||||||
|
* |
||||||
|
*/ |
||||||
|
typedef BME68X_INTF_RET_TYPE (*bme68x_write_fptr_t)(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, |
||||||
|
void *intf_ptr); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Delay function pointer which should be mapped to |
||||||
|
* delay function of the user |
||||||
|
* |
||||||
|
* @param period - The time period in microseconds |
||||||
|
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors |
||||||
|
* for interface related callbacks |
||||||
|
*/ |
||||||
|
typedef void (*bme68x_delay_us_fptr_t)(uint32_t period, void *intf_ptr); |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Generic communication function pointer |
||||||
|
* @param[in] dev_id: Place holder to store the id of the device structure |
||||||
|
* Can be used to store the index of the Chip select or |
||||||
|
* I2C address of the device. |
||||||
|
* @param[in] reg_addr: Used to select the register the where data needs to |
||||||
|
* be read from or written to. |
||||||
|
* @param[in,out] reg_data: Data array to read/write |
||||||
|
* @param[in] len: Length of the data array |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Interface selection Enumerations |
||||||
|
*/ |
||||||
|
enum bme68x_intf { |
||||||
|
/*! SPI interface */ |
||||||
|
BME68X_SPI_INTF, |
||||||
|
/*! I2C interface */ |
||||||
|
BME68X_I2C_INTF |
||||||
|
}; |
||||||
|
|
||||||
|
/* Structure definitions */ |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Sensor field data structure |
||||||
|
*/ |
||||||
|
struct bme68x_data |
||||||
|
{ |
||||||
|
/*! Contains new_data, gasm_valid & heat_stab */ |
||||||
|
uint8_t status; |
||||||
|
|
||||||
|
/*! The index of the heater profile used */ |
||||||
|
uint8_t gas_index; |
||||||
|
|
||||||
|
/*! Measurement index to track order */ |
||||||
|
uint8_t meas_index; |
||||||
|
|
||||||
|
/*! Heater resistance */ |
||||||
|
uint8_t res_heat; |
||||||
|
|
||||||
|
/*! Current DAC */ |
||||||
|
uint8_t idac; |
||||||
|
|
||||||
|
/*! Gas wait period */ |
||||||
|
uint8_t gas_wait; |
||||||
|
#ifndef BME68X_USE_FPU |
||||||
|
|
||||||
|
/*! Temperature in degree celsius x100 */ |
||||||
|
int16_t temperature; |
||||||
|
|
||||||
|
/*! Pressure in Pascal */ |
||||||
|
uint32_t pressure; |
||||||
|
|
||||||
|
/*! Humidity in % relative humidity x1000 */ |
||||||
|
uint32_t humidity; |
||||||
|
|
||||||
|
/*! Gas resistance in Ohms */ |
||||||
|
uint32_t gas_resistance; |
||||||
|
#else |
||||||
|
|
||||||
|
/*! Temperature in degree celsius */ |
||||||
|
float temperature; |
||||||
|
|
||||||
|
/*! Pressure in Pascal */ |
||||||
|
float pressure; |
||||||
|
|
||||||
|
/*! Humidity in % relative humidity x1000 */ |
||||||
|
float humidity; |
||||||
|
|
||||||
|
/*! Gas resistance in Ohms */ |
||||||
|
float gas_resistance; |
||||||
|
|
||||||
|
#endif |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Structure to hold the calibration coefficients |
||||||
|
*/ |
||||||
|
struct bme68x_calib_data |
||||||
|
{ |
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
uint16_t par_h1; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
uint16_t par_h2; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
int8_t par_h3; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
int8_t par_h4; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
int8_t par_h5; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
uint8_t par_h6; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the humidity sensor */ |
||||||
|
int8_t par_h7; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the gas sensor */ |
||||||
|
int8_t par_gh1; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the gas sensor */ |
||||||
|
int16_t par_gh2; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the gas sensor */ |
||||||
|
int8_t par_gh3; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the temperature sensor */ |
||||||
|
uint16_t par_t1; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the temperature sensor */ |
||||||
|
int16_t par_t2; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the temperature sensor */ |
||||||
|
int8_t par_t3; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
uint16_t par_p1; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int16_t par_p2; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int8_t par_p3; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int16_t par_p4; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int16_t par_p5; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int8_t par_p6; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int8_t par_p7; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int16_t par_p8; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
int16_t par_p9; |
||||||
|
|
||||||
|
/*! Calibration coefficient for the pressure sensor */ |
||||||
|
uint8_t par_p10; |
||||||
|
#ifndef BME68X_USE_FPU |
||||||
|
|
||||||
|
/*! Variable to store the intermediate temperature coefficient */ |
||||||
|
int32_t t_fine; |
||||||
|
#else |
||||||
|
|
||||||
|
/*! Variable to store the intermediate temperature coefficient */ |
||||||
|
float t_fine; |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! Heater resistance range coefficient */ |
||||||
|
uint8_t res_heat_range; |
||||||
|
|
||||||
|
/*! Heater resistance value coefficient */ |
||||||
|
int8_t res_heat_val; |
||||||
|
|
||||||
|
/*! Gas resistance range switching error coefficient */ |
||||||
|
int8_t range_sw_err; |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief BME68X sensor settings structure which comprises of ODR, |
||||||
|
* over-sampling and filter settings. |
||||||
|
*/ |
||||||
|
struct bme68x_conf |
||||||
|
{ |
||||||
|
/*! Humidity oversampling. Refer @ref osx*/ |
||||||
|
uint8_t os_hum; |
||||||
|
|
||||||
|
/*! Temperature oversampling. Refer @ref osx */ |
||||||
|
uint8_t os_temp; |
||||||
|
|
||||||
|
/*! Pressure oversampling. Refer @ref osx */ |
||||||
|
uint8_t os_pres; |
||||||
|
|
||||||
|
/*! Filter coefficient. Refer @ref filter*/ |
||||||
|
uint8_t filter; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* Standby time between sequential mode measurement profiles. |
||||||
|
* Refer @ref odr |
||||||
|
*/ |
||||||
|
uint8_t odr; |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief BME68X gas heater configuration |
||||||
|
*/ |
||||||
|
struct bme68x_heatr_conf |
||||||
|
{ |
||||||
|
/*! Enable gas measurement. Refer @ref en_dis */ |
||||||
|
uint8_t enable; |
||||||
|
|
||||||
|
/*! Store the heater temperature for forced mode degree Celsius */ |
||||||
|
uint16_t heatr_temp; |
||||||
|
|
||||||
|
/*! Store the heating duration for forced mode in milliseconds */ |
||||||
|
uint16_t heatr_dur; |
||||||
|
|
||||||
|
/*! Store the heater temperature profile in degree Celsius */ |
||||||
|
uint16_t *heatr_temp_prof; |
||||||
|
|
||||||
|
/*! Store the heating duration profile in milliseconds */ |
||||||
|
uint16_t *heatr_dur_prof; |
||||||
|
|
||||||
|
/*! Variable to store the length of the heating profile */ |
||||||
|
uint8_t profile_len; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* Variable to store heating duration for parallel mode |
||||||
|
* in milliseconds |
||||||
|
*/ |
||||||
|
uint16_t shared_heatr_dur; |
||||||
|
}; |
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief BME68X device structure |
||||||
|
*/ |
||||||
|
struct bme68x_dev |
||||||
|
{ |
||||||
|
/*! Chip Id */ |
||||||
|
uint8_t chip_id; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* The interface pointer is used to enable the user |
||||||
|
* to link their interface descriptors for reference during the |
||||||
|
* implementation of the read and write interfaces to the |
||||||
|
* hardware. |
||||||
|
*/ |
||||||
|
void *intf_ptr; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* Variant id |
||||||
|
* ---------------------------------------- |
||||||
|
* Value | Variant |
||||||
|
* ---------------------------------------- |
||||||
|
* 0 | BME68X_VARIANT_GAS_LOW |
||||||
|
* 1 | BME68X_VARIANT_GAS_HIGH |
||||||
|
* ---------------------------------------- |
||||||
|
*/ |
||||||
|
uint32_t variant_id; |
||||||
|
|
||||||
|
/*! SPI/I2C interface */ |
||||||
|
enum bme68x_intf intf; |
||||||
|
|
||||||
|
/*! Memory page used */ |
||||||
|
uint8_t mem_page; |
||||||
|
|
||||||
|
/*! Ambient temperature in Degree C*/ |
||||||
|
int8_t amb_temp; |
||||||
|
|
||||||
|
/*! Sensor calibration data */ |
||||||
|
struct bme68x_calib_data calib; |
||||||
|
|
||||||
|
/*! Read function pointer */ |
||||||
|
bme68x_read_fptr_t read; |
||||||
|
|
||||||
|
/*! Write function pointer */ |
||||||
|
bme68x_write_fptr_t write; |
||||||
|
|
||||||
|
/*! Delay function pointer */ |
||||||
|
bme68x_delay_us_fptr_t delay_us; |
||||||
|
|
||||||
|
/*! To store interface pointer error */ |
||||||
|
BME68X_INTF_RET_TYPE intf_rslt; |
||||||
|
|
||||||
|
/*! Store the info messages */ |
||||||
|
uint8_t info_msg; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif /* BME68X_DEFS_H_ */ |
||||||
|
/*! @endcond */ |
@ -0,0 +1,135 @@ |
|||||||
|
/**
|
||||||
|
* bsec2 but rewritten in C |
||||||
|
* |
||||||
|
* Created on 2021/12/12. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef ESPNODE_BSEC2_H |
||||||
|
#define ESPNODE_BSEC2_H |
||||||
|
|
||||||
|
// BSEC
|
||||||
|
#include "bme68x.h" |
||||||
|
#include "bsec_datatypes.h" |
||||||
|
#include "bsec_interface.h" |
||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
|
||||||
|
#define ARRAY_LEN(array) (sizeof(array)/sizeof((array)[0])) |
||||||
|
#define BSEC_CHECK_INPUT(x, shift) ((x) & (1 << ((shift)-1))) |
||||||
|
#define BSEC_TOTAL_HEAT_DUR UINT16_C(140) |
||||||
|
|
||||||
|
typedef bsec_output_t bsecData; |
||||||
|
typedef bsec_virtual_sensor_t bsecSensor; |
||||||
|
|
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
bsecData output[BSEC_NUMBER_OUTPUTS]; |
||||||
|
uint8_t nOutputs; |
||||||
|
} bsecOutputs; |
||||||
|
|
||||||
|
struct bsec2; |
||||||
|
typedef void (*bsecCallback)(const struct bme68x_data *data, const bsecOutputs *outputs, const struct bsec2 * bsec); |
||||||
|
|
||||||
|
struct bsec2 { |
||||||
|
// "public"
|
||||||
|
struct bme68x_dev *sensor; |
||||||
|
bsec_version_t version; |
||||||
|
bsec_library_return_t status; |
||||||
|
// "private"
|
||||||
|
int8_t sensor_status; |
||||||
|
bsec_bme_settings_t bmeConf; |
||||||
|
bsecCallback newDataCallback; |
||||||
|
bsecOutputs outputs; |
||||||
|
uint8_t opMode; |
||||||
|
float extTempOffset; |
||||||
|
uint32_t ovfCounter; |
||||||
|
uint32_t lastMillis; |
||||||
|
uint8_t workBuffer[BSEC_MAX_WORKBUFFER_SIZE]; |
||||||
|
}; |
||||||
|
|
||||||
|
int bsec2_init(struct bsec2 *self, struct bme68x_dev *dev); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function that sets the desired sensors and the sample rates |
||||||
|
* @param sensorList : The list of output sensors |
||||||
|
* @param nSensors : Number of outputs requested |
||||||
|
* @param sampleRate : The sample rate of requested sensors, def BSEC_SAMPLE_RATE_ULP |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_updateSubscription(struct bsec2 *self, const bsecSensor *sensorList, uint8_t nSensors, float sampleRate); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback from the user to read data from the BME68x using parallel/forced mode, process and store outputs |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_run(struct bsec2 *self); |
||||||
|
|
||||||
|
static inline void bsec2_attachCallback(struct bsec2 *self, bsecCallback callback) |
||||||
|
{ |
||||||
|
self->newDataCallback = callback; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to get the BSEC outputs |
||||||
|
* @return pointer to BSEC outputs if available else nullptr |
||||||
|
*/ |
||||||
|
static inline const bsecOutputs* bsec2_getOutputs(struct bsec2 *self) |
||||||
|
{ |
||||||
|
if (self->outputs.nOutputs) |
||||||
|
return &self->outputs; |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to get the BSEC output by sensor id |
||||||
|
* @return pointer to BSEC output, nullptr otherwise |
||||||
|
*/ |
||||||
|
bsecData bsec2_getData(struct bsec2 *self, bsecSensor id); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to get the state of the algorithm to save to non-volatile memory |
||||||
|
* @param state : Pointer to a memory location, to hold the state |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_getState(struct bsec2 *self, uint8_t *state); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to set the state of the algorithm from non-volatile memory |
||||||
|
* @param state : Pointer to a memory location that contains the state |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_setState(struct bsec2 *self, uint8_t *state); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to retrieve the current library configuration |
||||||
|
* @param config : Pointer to a memory location, to hold the serialized config blob |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_getConfig(struct bsec2 *self, uint8_t *config); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to set the configuration of the algorithm from memory |
||||||
|
* @param state : Pointer to a memory location that contains the configuration |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_setConfig(struct bsec2 *self, const uint8_t *config); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to set the temperature offset |
||||||
|
* @param tempOffset : Temperature offset in degree Celsius |
||||||
|
*/ |
||||||
|
static inline void bsec2_setTemperatureOffset(struct bsec2 *self, float tempOffset) |
||||||
|
{ |
||||||
|
self->extTempOffset = tempOffset; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to calculate an int64_t timestamp in milliseconds |
||||||
|
*/ |
||||||
|
int64_t bsec2_getTimeMs(struct bsec2 *self); |
||||||
|
|
||||||
|
extern void bsec2_errormsg(const char *msg); |
||||||
|
|
||||||
|
extern uint32_t bsec2_timestamp_millis(); |
||||||
|
|
||||||
|
#endif //ESPNODE_BSEC2_H
|
@ -0,0 +1,506 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (C) Bosch Sensortec GmbH. All Rights Reserved. Confidential. |
||||||
|
* |
||||||
|
* Disclaimer |
||||||
|
* |
||||||
|
* Common: |
||||||
|
* Bosch Sensortec products are developed for the consumer goods industry. They may only be used |
||||||
|
* within the parameters of the respective valid product data sheet. Bosch Sensortec products are |
||||||
|
* provided with the express understanding that there is no warranty of fitness for a particular purpose. |
||||||
|
* They are not fit for use in life-sustaining, safety or security sensitive systems or any system or device |
||||||
|
* that may lead to bodily harm or property damage if the system or device malfunctions. In addition, |
||||||
|
* Bosch Sensortec products are not fit for use in products which interact with motor vehicle systems. |
||||||
|
* The resale and/or use of products are at the purchaser's own risk and his own responsibility. The |
||||||
|
* examination of fitness for the intended use is the sole responsibility of the Purchaser. |
||||||
|
* |
||||||
|
* The purchaser shall indemnify Bosch Sensortec from all third party claims, including any claims for |
||||||
|
* incidental, or consequential damages, arising from any product use not covered by the parameters of |
||||||
|
* the respective valid product data sheet or not approved by Bosch Sensortec and reimburse Bosch |
||||||
|
* Sensortec for all costs in connection with such claims. |
||||||
|
* |
||||||
|
* The purchaser must monitor the market for the purchased products, particularly with regard to |
||||||
|
* product safety and inform Bosch Sensortec without delay of all security relevant incidents. |
||||||
|
* |
||||||
|
* Engineering Samples are marked with an asterisk (*) or (e). Samples may vary from the valid |
||||||
|
* technical specifications of the product series. They are therefore not intended or fit for resale to third |
||||||
|
* parties or for use in end products. Their sole purpose is internal client testing. The testing of an |
||||||
|
* engineering sample may in no way replace the testing of a product series. Bosch Sensortec |
||||||
|
* assumes no liability for the use of engineering samples. By accepting the engineering samples, the |
||||||
|
* Purchaser agrees to indemnify Bosch Sensortec from all claims arising from the use of engineering |
||||||
|
* samples. |
||||||
|
* |
||||||
|
* Special: |
||||||
|
* This software module (hereinafter called "Software") and any information on application-sheets |
||||||
|
* (hereinafter called "Information") is provided free of charge for the sole purpose to support your |
||||||
|
* application work. The Software and Information is subject to the following terms and conditions: |
||||||
|
* |
||||||
|
* The Software is specifically designed for the exclusive use for Bosch Sensortec products by |
||||||
|
* personnel who have special experience and training. Do not use this Software if you do not have the |
||||||
|
* proper experience or training. |
||||||
|
* |
||||||
|
* This Software package is provided `` as is `` and without any expressed or implied warranties, |
||||||
|
* including without limitation, the implied warranties of merchantability and fitness for a particular |
||||||
|
* purpose. |
||||||
|
* |
||||||
|
* Bosch Sensortec and their representatives and agents deny any liability for the functional impairment |
||||||
|
* of this Software in terms of fitness, performance and safety. Bosch Sensortec and their |
||||||
|
* representatives and agents shall not be liable for any direct or indirect damages or injury, except as |
||||||
|
* otherwise stipulated in mandatory applicable law. |
||||||
|
* |
||||||
|
* The Information provided is believed to be accurate and reliable. Bosch Sensortec assumes no |
||||||
|
* responsibility for the consequences of use of such Information nor for any infringement of patents or |
||||||
|
* other rights of third parties which may result from its use. No license is granted by implication or |
||||||
|
* otherwise under any patent or patent rights of Bosch. Specifications mentioned in the Information are |
||||||
|
* subject to change without notice. |
||||||
|
* |
||||||
|
* It is not allowed to deliver the source code of the Software to any third party without permission of |
||||||
|
* Bosch Sensortec. |
||||||
|
* |
||||||
|
* @file bsec_datatypes.h |
||||||
|
* |
||||||
|
* @brief |
||||||
|
* Contains the data types used by BSEC |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
#ifndef __BSEC_DATATYPES_H__ |
||||||
|
#define __BSEC_DATATYPES_H__ |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" |
||||||
|
{ |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup bsec_interface BSEC C Interface |
||||||
|
* @{*/ |
||||||
|
|
||||||
|
#ifdef __KERNEL__ |
||||||
|
#include <linux/types.h> |
||||||
|
#endif |
||||||
|
#include <stdint.h> |
||||||
|
#include <stddef.h> |
||||||
|
|
||||||
|
#define BSEC_MAX_WORKBUFFER_SIZE (4096) /*!< Maximum size (in bytes) of the work buffer */ |
||||||
|
#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ |
||||||
|
#define BSEC_MAX_PROPERTY_BLOB_SIZE (2277) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ |
||||||
|
#define BSEC_MAX_STATE_BLOB_SIZE (197) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_state()*/ |
||||||
|
#define BSEC_SAMPLE_RATE_DISABLED (65535.0f) /*!< Sample rate of a disabled sensor */ |
||||||
|
#define BSEC_SAMPLE_RATE_ULP (0.0033333f) /*!< Sample rate in case of Ultra Low Power Mode */ |
||||||
|
#define BSEC_SAMPLE_RATE_LP (0.33333f) /*!< Sample rate in case of Low Power Mode */ |
||||||
|
#define BSEC_SAMPLE_RATE_ULP_MEASUREMENT_ON_DEMAND (0.0f) /*!< Input value used to trigger an extra measurment (ULP plus) */ |
||||||
|
#define BSEC_SAMPLE_RATE_HIGH_PERFORMANCE (0.055556f) /*!< Sample rate in case of high performance */ |
||||||
|
|
||||||
|
#define BSEC_PROCESS_PRESSURE (1 << (BSEC_INPUT_PRESSURE-1)) /*!< process_data bitfield constant for pressure @sa bsec_bme_settings_t */ |
||||||
|
#define BSEC_PROCESS_TEMPERATURE (1 << (BSEC_INPUT_TEMPERATURE-1)) /*!< process_data bitfield constant for temperature @sa bsec_bme_settings_t */ |
||||||
|
#define BSEC_PROCESS_HUMIDITY (1 << (BSEC_INPUT_HUMIDITY-1)) /*!< process_data bitfield constant for humidity @sa bsec_bme_settings_t */ |
||||||
|
#define BSEC_PROCESS_GAS (1 << (BSEC_INPUT_GASRESISTOR-1)) /*!< process_data bitfield constant for gas sensor @sa bsec_bme_settings_t */ |
||||||
|
#define BSEC_NUMBER_OUTPUTS (19) /*!< Number of outputs, depending on solution */ |
||||||
|
#define BSEC_OUTPUT_INCLUDED (66222575) /*!< bitfield that indicates which outputs are included in the solution */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for input (physical) sensors. |
||||||
|
* |
||||||
|
* Used to populate bsec_input_t::sensor_id. It is also used in bsec_sensor_configuration_t::sensor_id structs |
||||||
|
* returned in the parameter required_sensor_settings of bsec_update_subscription(). |
||||||
|
* |
||||||
|
* @sa bsec_sensor_configuration_t @sa bsec_input_t |
||||||
|
*/ |
||||||
|
typedef enum |
||||||
|
{ |
||||||
|
/**
|
||||||
|
* @brief Pressure sensor output of BMExxx [Pa] |
||||||
|
*/ |
||||||
|
BSEC_INPUT_PRESSURE = 1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Humidity sensor output of BMExxx [%] |
||||||
|
* |
||||||
|
* @note Relative humidity strongly depends on the temperature (it is measured at). It may require a conversion to |
||||||
|
* the temperature outside of the device.
|
||||||
|
* |
||||||
|
* @sa bsec_virtual_sensor_t |
||||||
|
*/ |
||||||
|
BSEC_INPUT_HUMIDITY = 2,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Temperature sensor output of BMExxx [degrees Celsius] |
||||||
|
*
|
||||||
|
* @note The BME680 is factory trimmed, thus the temperature sensor of the BME680 is very accurate.
|
||||||
|
* The temperature value is a very local measurement value and can be influenced by external heat sources.
|
||||||
|
* |
||||||
|
* @sa bsec_virtual_sensor_t |
||||||
|
*/ |
||||||
|
BSEC_INPUT_TEMPERATURE = 3,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gas sensor resistance output of BMExxx [Ohm] |
||||||
|
*
|
||||||
|
* The resistance value changes due to varying VOC concentrations (the higher the concentration of reducing VOCs,
|
||||||
|
* the lower the resistance and vice versa).
|
||||||
|
*/ |
||||||
|
BSEC_INPUT_GASRESISTOR = 4, /*!< */ |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Additional input for device heat compensation |
||||||
|
*
|
||||||
|
* IAQ solution: The value is subtracted from ::BSEC_INPUT_TEMPERATURE to compute
|
||||||
|
* ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. |
||||||
|
* |
||||||
|
* ALL solution: Generic heat source 1 |
||||||
|
*
|
||||||
|
* @sa bsec_virtual_sensor_t |
||||||
|
*/ |
||||||
|
BSEC_INPUT_HEATSOURCE = 14,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Additional input for device heat compensation 8 |
||||||
|
* |
||||||
|
* Generic heat source 8 |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Additional input that disables baseline tracker |
||||||
|
* |
||||||
|
* 0 - Normal
|
||||||
|
* 1 - Event 1 |
||||||
|
* 2 - Event 2 |
||||||
|
*/ |
||||||
|
BSEC_INPUT_DISABLE_BASELINE_TRACKER = 23,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Additional input that provides information about the state of the profile (1-9)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BSEC_INPUT_PROFILE_PART = 24
|
||||||
|
} bsec_physical_sensor_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for output (virtual) sensors |
||||||
|
* |
||||||
|
* Used to populate bsec_output_t::sensor_id. It is also used in bsec_sensor_configuration_t::sensor_id structs
|
||||||
|
* passed in the parameter requested_virtual_sensors of bsec_update_subscription(). |
||||||
|
* |
||||||
|
* @sa bsec_sensor_configuration_t @sa bsec_output_t |
||||||
|
*/ |
||||||
|
typedef enum |
||||||
|
{ |
||||||
|
/**
|
||||||
|
* @brief Indoor-air-quality estimate [0-500] |
||||||
|
*
|
||||||
|
* Indoor-air-quality (IAQ) gives an indication of the relative change in ambient TVOCs detected by BME680.
|
||||||
|
*
|
||||||
|
* @note The IAQ scale ranges from 0 (clean air) to 500 (heavily polluted air). During operation, algorithms
|
||||||
|
* automatically calibrate and adapt themselves to the typical environments where the sensor is operated
|
||||||
|
* (e.g., home, workplace, inside a car, etc.).This automatic background calibration ensures that users experience
|
||||||
|
* consistent IAQ performance. The calibration process considers the recent measurement history (typ. up to four
|
||||||
|
* days) to ensure that IAQ=25 corresponds to typical good air and IAQ=250 indicates typical polluted air. |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_IAQ = 1,
|
||||||
|
BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */
|
||||||
|
BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */
|
||||||
|
BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Temperature sensor signal [degrees Celsius] |
||||||
|
*
|
||||||
|
* Temperature directly measured by BME680 in degree Celsius.
|
||||||
|
*
|
||||||
|
* @note This value is cross-influenced by the sensor heating and device specific heating. |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_RAW_TEMPERATURE = 6,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pressure sensor signal [Pa] |
||||||
|
*
|
||||||
|
* Pressure directly measured by the BME680 in Pa. |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_RAW_PRESSURE = 7,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Relative humidity sensor signal [%]
|
||||||
|
*
|
||||||
|
* Relative humidity directly measured by the BME680 in %.
|
||||||
|
*
|
||||||
|
* @note This value is cross-influenced by the sensor heating and device specific heating. |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_RAW_HUMIDITY = 8,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gas sensor signal [Ohm] |
||||||
|
*
|
||||||
|
* Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC
|
||||||
|
* concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa).
|
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_RAW_GAS = 9,
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gas sensor stabilization status [boolean] |
||||||
|
*
|
||||||
|
* Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization
|
||||||
|
* is finished (1).
|
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_STABILIZATION_STATUS = 12,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gas sensor run-in status [boolean] |
||||||
|
* |
||||||
|
* Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization
|
||||||
|
* is finished (1). |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_RUN_IN_STATUS = 13,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sensor heat compensated temperature [degrees Celsius] |
||||||
|
*
|
||||||
|
* Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius.
|
||||||
|
* The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @note IAQ solution: In addition, the temperature output can be compensated by an user defined value
|
||||||
|
* (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. |
||||||
|
*
|
||||||
|
* Thus, the value is calculated as follows: |
||||||
|
* * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` |
||||||
|
* * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` |
||||||
|
* |
||||||
|
* The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. |
||||||
|
* The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sensor heat compensated humidity [%]
|
||||||
|
*
|
||||||
|
* Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. |
||||||
|
*
|
||||||
|
* It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature
|
||||||
|
* ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. |
||||||
|
*
|
||||||
|
* @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be
|
||||||
|
* effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. |
||||||
|
*/ |
||||||
|
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15,
|
||||||
|
|
||||||
|
BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */
|
||||||
|
BSEC_OUTPUT_GAS_PERCENTAGE = 21, /*!< percentage of min and max filtered gas value [%] */ |
||||||
|
|
||||||
|
BSEC_OUTPUT_GAS_ESTIMATE_1 = 22, /*!< Gas estimate output channel 1 */ |
||||||
|
BSEC_OUTPUT_GAS_ESTIMATE_2 = 23, /*!< Gas estimate output channel 2 */ |
||||||
|
BSEC_OUTPUT_GAS_ESTIMATE_3 = 24, /*!< Gas estimate output channel 3 */ |
||||||
|
BSEC_OUTPUT_GAS_ESTIMATE_4 = 25, /*!< Gas estimate output channel 4 */ |
||||||
|
|
||||||
|
BSEC_OUTPUT_RAW_GAS_INDEX = 26 /* Gas index cyclically running from 0 to heater_profile_length-1 */
|
||||||
|
} bsec_virtual_sensor_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for function return codes
|
||||||
|
*/ |
||||||
|
typedef enum |
||||||
|
{ |
||||||
|
BSEC_OK = 0, /*!< Function execution successful */ |
||||||
|
BSEC_E_DOSTEPS_INVALIDINPUT = -1, /*!< Input (physical) sensor id passed to bsec_do_steps() is not in the valid range or not valid for requested virtual sensor */ |
||||||
|
BSEC_E_DOSTEPS_VALUELIMITS = -2, /*!< Value of input (physical) sensor signal passed to bsec_do_steps() is not in the valid range */ |
||||||
|
BSEC_E_DOSTEPS_TSINTRADIFFOUTOFRANGE = -4, /*!< Past timestamps passed to bsec_do_steps() */ |
||||||
|
BSEC_E_DOSTEPS_DUPLICATEINPUT = -6, /*!< Duplicate input (physical) sensor ids passed as input to bsec_do_steps() */ |
||||||
|
BSEC_I_DOSTEPS_NOOUTPUTSRETURNABLE = 2, /*!< No memory allocated to hold return values from bsec_do_steps(), i.e., n_outputs == 0 */ |
||||||
|
BSEC_W_DOSTEPS_EXCESSOUTPUTS = 3, /*!< Not enough memory allocated to hold return values from bsec_do_steps(), i.e., n_outputs < maximum number of requested output (virtual) sensors */ |
||||||
|
BSEC_W_DOSTEPS_GASINDEXMISS = 5, /*!< Gas index not provided to bsec_do_steps() */ |
||||||
|
BSEC_E_SU_WRONGDATARATE = -10, /*!< The sample_rate of the requested output (virtual) sensor passed to bsec_update_subscription() is zero */ |
||||||
|
BSEC_E_SU_SAMPLERATELIMITS = -12, /*!< The sample_rate of the requested output (virtual) sensor passed to bsec_update_subscription() does not match with the sampling rate allowed for that sensor */ |
||||||
|
BSEC_E_SU_DUPLICATEGATE = -13, /*!< Duplicate output (virtual) sensor ids requested through bsec_update_subscription() */ |
||||||
|
BSEC_E_SU_INVALIDSAMPLERATE = -14, /*!< The sample_rate of the requested output (virtual) sensor passed to bsec_update_subscription() does not fall within the global minimum and maximum sampling rates */ |
||||||
|
BSEC_E_SU_GATECOUNTEXCEEDSARRAY = -15, /*!< Not enough memory allocated to hold returned input (physical) sensor data from bsec_update_subscription(), i.e., n_required_sensor_settings < #BSEC_MAX_PHYSICAL_SENSOR */ |
||||||
|
BSEC_E_SU_SAMPLINTVLINTEGERMULT = -16, /*!< The sample_rate of the requested output (virtual) sensor passed to bsec_update_subscription() is not correct */ |
||||||
|
BSEC_E_SU_MULTGASSAMPLINTVL = -17, /*!< The sample_rate of the requested output (virtual), which requires the gas sensor, is not equal to the sample_rate that the gas sensor is being operated */ |
||||||
|
BSEC_E_SU_HIGHHEATERONDURATION = -18, /*!< The duration of one measurement is longer than the requested sampling interval */ |
||||||
|
BSEC_W_SU_UNKNOWNOUTPUTGATE = 10, /*!< Output (virtual) sensor id passed to bsec_update_subscription() is not in the valid range; e.g., n_requested_virtual_sensors > actual number of output (virtual) sensors requested */ |
||||||
|
BSEC_W_SU_MODINNOULP = 11, /*!< ULP plus can not be requested in non-ulp mode */ /*MOD_ONLY*/ |
||||||
|
BSEC_I_SU_SUBSCRIBEDOUTPUTGATES = 12, /*!< No output (virtual) sensor data were requested via bsec_update_subscription() */ |
||||||
|
BSEC_I_SU_GASESTIMATEPRECEDENCE = 13, /*!< GAS_ESTIMATE is suscribed and take precedence over other requested outputs */ |
||||||
|
BSEC_E_PARSE_SECTIONEXCEEDSWORKBUFFER = -32, /*!< n_work_buffer_size passed to bsec_set_[configuration/state]() not sufficient */ |
||||||
|
BSEC_E_CONFIG_FAIL = -33, /*!< Configuration failed */ |
||||||
|
BSEC_E_CONFIG_VERSIONMISMATCH = -34, /*!< Version encoded in serialized_[settings/state] passed to bsec_set_[configuration/state]() does not match with current version */ |
||||||
|
BSEC_E_CONFIG_FEATUREMISMATCH = -35, /*!< Enabled features encoded in serialized_[settings/state] passed to bsec_set_[configuration/state]() does not match with current library implementation */ |
||||||
|
BSEC_E_CONFIG_CRCMISMATCH = -36, /*!< serialized_[settings/state] passed to bsec_set_[configuration/state]() is corrupted */ |
||||||
|
BSEC_E_CONFIG_EMPTY = -37, /*!< n_serialized_[settings/state] passed to bsec_set_[configuration/state]() is to short to be valid */ |
||||||
|
BSEC_E_CONFIG_INSUFFICIENTWORKBUFFER = -38, /*!< Provided work_buffer is not large enough to hold the desired string */ |
||||||
|
BSEC_E_CONFIG_INVALIDSTRINGSIZE = -40, /*!< String size encoded in configuration/state strings passed to bsec_set_[configuration/state]() does not match with the actual string size n_serialized_[settings/state] passed to these functions */ |
||||||
|
BSEC_E_CONFIG_INSUFFICIENTBUFFER = -41, /*!< String buffer insufficient to hold serialized data from BSEC library */ |
||||||
|
BSEC_E_SET_INVALIDCHANNELIDENTIFIER = -100, /*!< Internal error code, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ |
||||||
|
BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ |
||||||
|
BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ |
||||||
|
BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ |
||||||
|
BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ |
||||||
|
} bsec_library_return_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Structure containing the version information |
||||||
|
* |
||||||
|
* Please note that configuration and state strings are coded to a specific version and will not be accepted by other
|
||||||
|
* versions of BSEC. |
||||||
|
*
|
||||||
|
*/ |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
uint8_t major; /**< @brief Major version */ |
||||||
|
uint8_t minor; /**< @brief Minor version */ |
||||||
|
uint8_t major_bugfix; /**< @brief Major bug fix version */ |
||||||
|
uint8_t minor_bugfix; /**< @brief Minor bug fix version */ |
||||||
|
} bsec_version_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Structure describing an input sample to the library |
||||||
|
* |
||||||
|
* Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided
|
||||||
|
* in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in
|
||||||
|
* an error code being returned from bsec_do_steps(). |
||||||
|
* |
||||||
|
* The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible
|
||||||
|
* bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. |
||||||
|
* |
||||||
|
* @sa bsec_physical_sensor_t |
||||||
|
*
|
||||||
|
*/ |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
/**
|
||||||
|
* @brief Time stamp in nanosecond resolution [ns] |
||||||
|
* |
||||||
|
* Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or |
||||||
|
* at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) |
||||||
|
*/ |
||||||
|
int64_t time_stamp;
|
||||||
|
float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ |
||||||
|
uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ |
||||||
|
uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ |
||||||
|
} bsec_input_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Structure describing an output sample of the library |
||||||
|
* |
||||||
|
* Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of
|
||||||
|
* the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output
|
||||||
|
* bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t.
|
||||||
|
* |
||||||
|
* @sa bsec_virtual_sensor_t |
||||||
|
*/ |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ |
||||||
|
float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ |
||||||
|
uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ |
||||||
|
uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Accuracy status 0-3 |
||||||
|
* |
||||||
|
* Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as
|
||||||
|
* follows: |
||||||
|
* |
||||||
|
* | Name | Value | Accuracy description | |
||||||
|
* |----------------------------|-------|-------------------------------------------------------------| |
||||||
|
* | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | |
||||||
|
* | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | |
||||||
|
* | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | |
||||||
|
* | HIGH_ACCURACY | 3 | High accuracy | |
||||||
|
* |
||||||
|
* For example: |
||||||
|
*
|
||||||
|
* - Ambient temperature accuracy is derived from change in the temperature in 1 minute. |
||||||
|
*
|
||||||
|
* | Virtual sensor | Value | Accuracy description | |
||||||
|
* |--------------------- |-------|------------------------------------------------------------------------------| |
||||||
|
* | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | |
||||||
|
* | | 1 | The difference in ambient temperature is less than 4 degree in one minute | |
||||||
|
* | | 2 | The difference in ambient temperature is less than 3 degree in one minute | |
||||||
|
* | | 3 | The difference in ambient temperature is less than 2 degree in one minute | |
||||||
|
*
|
||||||
|
* - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is
|
||||||
|
* performed automatically in the background if the sensor is exposed to clean and polluted air for approximately
|
||||||
|
* 30 minutes each. |
||||||
|
*
|
||||||
|
* | Virtual sensor | Value | Accuracy description | |
||||||
|
* |----------------------------|-------|-----------------------------------------------------------------| |
||||||
|
* | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | |
||||||
|
* | | 1 | Calibration required | |
||||||
|
* | | 2 | Calibration on-going | |
||||||
|
* | | 3 | Calibration is done, now IAQ estimate achieves best performance | |
||||||
|
*/
|
||||||
|
uint8_t accuracy;
|
||||||
|
} bsec_output_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Structure describing sample rate of physical/virtual sensors |
||||||
|
* |
||||||
|
* This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information |
||||||
|
* about the sample rates used for BSEC inputs. |
||||||
|
*/ |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
/**
|
||||||
|
* @brief Sample rate of the virtual or physical sensor in Hertz [Hz] |
||||||
|
* |
||||||
|
* Only supported sample rates are allowed. |
||||||
|
*/ |
||||||
|
float sample_rate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Identifier of the virtual or physical sensor |
||||||
|
* |
||||||
|
* The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument |
||||||
|
* to bsec_update_subscription() or as the required_sensor_settings argument. |
||||||
|
* |
||||||
|
* | bsec_update_subscription() argument | sensor_id field interpretation | |
||||||
|
* |-------------------------------------|--------------------------------| |
||||||
|
* | requested_virtual_sensors | ::bsec_virtual_sensor_t | |
||||||
|
* | required_sensor_settings | ::bsec_physical_sensor_t | |
||||||
|
* |
||||||
|
* @sa bsec_physical_sensor_t
|
||||||
|
* @sa bsec_virtual_sensor_t
|
||||||
|
*/ |
||||||
|
uint8_t sensor_id;
|
||||||
|
} bsec_sensor_configuration_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor
|
||||||
|
* |
||||||
|
* This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement.
|
||||||
|
* A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling
|
||||||
|
* settings for temperature, humidity, and pressure should be set to the provided settings provided in
|
||||||
|
* bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and |
||||||
|
* bsec_bme_settings_t::pressure_oversampling, respectively.
|
||||||
|
* |
||||||
|
* In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided
|
||||||
|
* bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. |
||||||
|
*/ |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ |
||||||
|
uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ |
||||||
|
uint16_t heater_temperature; /*!< @brief Heater temperature [degrees Celsius] */ |
||||||
|
uint16_t heater_duration; /*!< @brief Heater duration [ms] */ |
||||||
|
uint16_t heater_temperature_profile[10]; /*!< @brief Heater temperature profile [degrees Celsius] */ |
||||||
|
uint16_t heater_duration_profile[10]; /*!< @brief Heater duration profile [ms] */ |
||||||
|
uint8_t heater_profile_len; /*!< @brief Heater profile length [0-10] */ |
||||||
|
uint8_t run_gas; /*!< @brief Enable gas measurements [0/1] */ |
||||||
|
uint8_t pressure_oversampling; /*!< @brief Pressure oversampling settings [0-5] */ |
||||||
|
uint8_t temperature_oversampling; /*!< @brief Temperature oversampling settings [0-5] */ |
||||||
|
uint8_t humidity_oversampling; /*!< @brief Humidity oversampling settings [0-5] */ |
||||||
|
uint8_t trigger_measurement; /*!< @brief Trigger a forced measurement with these settings now [0/1] */ |
||||||
|
uint8_t op_mode; /*!< @brief Sensor operation mode [0/1] */ |
||||||
|
} bsec_bme_settings_t; |
||||||
|
|
||||||
|
/* internal defines and backward compatibility */ |
||||||
|
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,562 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (C) Bosch Sensortec GmbH. All Rights Reserved. Confidential. |
||||||
|
* |
||||||
|
* Disclaimer |
||||||
|
* |
||||||
|
* Common: |
||||||
|
* Bosch Sensortec products are developed for the consumer goods industry. They may only be used |
||||||
|
* within the parameters of the respective valid product data sheet. Bosch Sensortec products are |
||||||
|
* provided with the express understanding that there is no warranty of fitness for a particular purpose. |
||||||
|
* They are not fit for use in life-sustaining, safety or security sensitive systems or any system or device |
||||||
|
* that may lead to bodily harm or property damage if the system or device malfunctions. In addition, |
||||||
|
* Bosch Sensortec products are not fit for use in products which interact with motor vehicle systems. |
||||||
|
* The resale and/or use of products are at the purchaser's own risk and his own responsibility. The |
||||||
|
* examination of fitness for the intended use is the sole responsibility of the Purchaser. |
||||||
|
* |
||||||
|
* The purchaser shall indemnify Bosch Sensortec from all third party claims, including any claims for |
||||||
|
* incidental, or consequential damages, arising from any product use not covered by the parameters of |
||||||
|
* the respective valid product data sheet or not approved by Bosch Sensortec and reimburse Bosch |
||||||
|
* Sensortec for all costs in connection with such claims. |
||||||
|
* |
||||||
|
* The purchaser must monitor the market for the purchased products, particularly with regard to |
||||||
|
* product safety and inform Bosch Sensortec without delay of all security relevant incidents. |
||||||
|
* |
||||||
|
* Engineering Samples are marked with an asterisk (*) or (e). Samples may vary from the valid |
||||||
|
* technical specifications of the product series. They are therefore not intended or fit for resale to third |
||||||
|
* parties or for use in end products. Their sole purpose is internal client testing. The testing of an |
||||||
|
* engineering sample may in no way replace the testing of a product series. Bosch Sensortec |
||||||
|
* assumes no liability for the use of engineering samples. By accepting the engineering samples, the |
||||||
|
* Purchaser agrees to indemnify Bosch Sensortec from all claims arising from the use of engineering |
||||||
|
* samples. |
||||||
|
* |
||||||
|
* Special: |
||||||
|
* This software module (hereinafter called "Software") and any information on application-sheets |
||||||
|
* (hereinafter called "Information") is provided free of charge for the sole purpose to support your |
||||||
|
* application work. The Software and Information is subject to the following terms and conditions: |
||||||
|
* |
||||||
|
* The Software is specifically designed for the exclusive use for Bosch Sensortec products by |
||||||
|
* personnel who have special experience and training. Do not use this Software if you do not have the |
||||||
|
* proper experience or training. |
||||||
|
* |
||||||
|
* This Software package is provided `` as is `` and without any expressed or implied warranties, |
||||||
|
* including without limitation, the implied warranties of merchantability and fitness for a particular |
||||||
|
* purpose. |
||||||
|
* |
||||||
|
* Bosch Sensortec and their representatives and agents deny any liability for the functional impairment |
||||||
|
* of this Software in terms of fitness, performance and safety. Bosch Sensortec and their |
||||||
|
* representatives and agents shall not be liable for any direct or indirect damages or injury, except as |
||||||
|
* otherwise stipulated in mandatory applicable law. |
||||||
|
* |
||||||
|
* The Information provided is believed to be accurate and reliable. Bosch Sensortec assumes no |
||||||
|
* responsibility for the consequences of use of such Information nor for any infringement of patents or |
||||||
|
* other rights of third parties which may result from its use. No license is granted by implication or |
||||||
|
* otherwise under any patent or patent rights of Bosch. Specifications mentioned in the Information are |
||||||
|
* subject to change without notice. |
||||||
|
* |
||||||
|
* It is not allowed to deliver the source code of the Software to any third party without permission of |
||||||
|
* Bosch Sensortec. |
||||||
|
* |
||||||
|
* @file bsec_interface.h |
||||||
|
* |
||||||
|
* @brief |
||||||
|
* Contains the API for BSEC |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef __BSEC_INTERFACE_H__ |
||||||
|
#define __BSEC_INTERFACE_H__ |
||||||
|
|
||||||
|
#include "bsec_datatypes.h" |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
/*! @addtogroup bsec_interface BSEC C Interface
|
||||||
|
* @brief Interfaces of BSEC signal processing library |
||||||
|
* |
||||||
|
* ### Interface usage |
||||||
|
* |
||||||
|
* The following provides a short overview on the typical operation sequence for BSEC. |
||||||
|
* |
||||||
|
* - Initialization of the library |
||||||
|
* |
||||||
|
* | Steps | Function | |
||||||
|
* |---------------------------------------------------------------------|--------------------------| |
||||||
|
* | Initialization of library | bsec_init() | |
||||||
|
* | Update configuration settings (optional) | bsec_set_configuration() | |
||||||
|
* | Restore the state of the library (optional) | bsec_set_state() | |
||||||
|
* |
||||||
|
* |
||||||
|
* - The following function is called to enable output signals and define their sampling rate / operation mode. |
||||||
|
* |
||||||
|
* | Steps | Function | |
||||||
|
* |---------------------------------------------|----------------------------| |
||||||
|
* | Enable library outputs with specified mode | bsec_update_subscription() | |
||||||
|
* |
||||||
|
* |
||||||
|
* - This table describes the main processing loop. |
||||||
|
* |
||||||
|
* | Steps | Function | |
||||||
|
* |-------------------------------------------|----------------------------------| |
||||||
|
* | Retrieve sensor settings to be used | bsec_sensor_control() | |
||||||
|
* | Configure sensor and trigger measurement | See BME68x API and example codes | |
||||||
|
* | Read results from sensor | See BME68x API and example codes | |
||||||
|
* | Perform signal processing | bsec_do_steps() | |
||||||
|
* |
||||||
|
* |
||||||
|
* - Before shutting down the system, the current state of BSEC can be retrieved and can then be used during |
||||||
|
* re-initialization to continue processing. |
||||||
|
* |
||||||
|
* | Steps | Function | |
||||||
|
* |----------------------------------------|-------------------| |
||||||
|
* | To retrieve the current library state | bsec_get_state() | |
||||||
|
* |
||||||
|
* |
||||||
|
* |
||||||
|
* ### Configuration and state |
||||||
|
* |
||||||
|
* Values of variables belonging to a BSEC instance are divided into two groups: |
||||||
|
* - Values **not updated by processing** of signals belong to the **configuration group**. If available, BSEC can be |
||||||
|
* configured before use with a customer specific configuration string. |
||||||
|
* - Values **updated during processing** are member of the **state group**. Saving and restoring of the state of BSEC |
||||||
|
* is necessary to maintain previously estimated sensor models and baseline information which is important for best |
||||||
|
* performance of the gas sensor outputs. |
||||||
|
* |
||||||
|
* @note BSEC library consists of adaptive algorithms which models the gas sensor which improves its performance over |
||||||
|
* the time. These will be lost if library is initialized due to system reset. In order to avoid this situation |
||||||
|
* library state shall be stored in non volatile memory so that it can be loaded after system reset. |
||||||
|
* |
||||||
|
* |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Return the version information of BSEC library |
||||||
|
* |
||||||
|
* @param [out] bsec_version_p pointer to struct which is to be populated with the version information |
||||||
|
* |
||||||
|
* @return Zero if successful, otherwise an error code |
||||||
|
* |
||||||
|
* See also: bsec_version_t |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
bsec_version_t version; |
||||||
|
bsec_get_version(&version); |
||||||
|
printf("BSEC version: %d.%d.%d.%d",version.major, version.minor, version.major_bugfix, version.minor_bugfix); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_get_version(bsec_version_t * bsec_version_p); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initialize the library |
||||||
|
* |
||||||
|
* Initialization and reset of BSEC is performed by calling bsec_init(). Calling this function sets up the relation |
||||||
|
* among all internal modules, initializes run-time dependent library states and resets the configuration and state |
||||||
|
* of all BSEC signal processing modules to defaults. |
||||||
|
* |
||||||
|
* Before any further use, the library must be initialized. This ensure that all memory and states are in defined |
||||||
|
* conditions prior to processing any data. |
||||||
|
* |
||||||
|
* @return Zero if successful, otherwise an error code |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
|
||||||
|
// Initialize BSEC library before further use
|
||||||
|
bsec_init(); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_init(void); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Subscribe to library virtual sensors outputs |
||||||
|
* |
||||||
|
* Use bsec_update_subscription() to instruct BSEC which of the processed output signals are requested at which sample rates. |
||||||
|
* See ::bsec_virtual_sensor_t for available library outputs. |
||||||
|
* |
||||||
|
* Based on the requested virtual sensors outputs, BSEC will provide information about the required physical sensor input signals |
||||||
|
* (see ::bsec_physical_sensor_t) with corresponding sample rates. This information is purely informational as bsec_sensor_control() |
||||||
|
* will ensure the sensor is operated in the required manner. To disable a virtual sensor, set the sample rate to BSEC_SAMPLE_RATE_DISABLED. |
||||||
|
* |
||||||
|
* The subscription update using bsec_update_subscription() is apart from the signal processing one of the the most |
||||||
|
* important functions. It allows to enable the desired library outputs. The function determines which physical input |
||||||
|
* sensor signals are required at which sample rate to produce the virtual output sensor signals requested by the user. |
||||||
|
* When this function returns with success, the requested outputs are called subscribed. A very important feature is the |
||||||
|
* retaining of already subscribed outputs. Further outputs can be requested or disabled both individually and |
||||||
|
* group-wise in addition to already subscribed outputs without changing them unless a change of already subscribed |
||||||
|
* outputs is requested. |
||||||
|
* |
||||||
|
* @note The state of the library concerning the subscribed outputs cannot be retained among reboots. |
||||||
|
* |
||||||
|
* The interface of bsec_update_subscription() requires the usage of arrays of sensor configuration structures. |
||||||
|
* Such a structure has the fields sensor identifier and sample rate. These fields have the properties: |
||||||
|
* - Output signals of virtual sensors must be requested using unique identifiers (Member of ::bsec_virtual_sensor_t) |
||||||
|
* - Different sets of identifiers are available for inputs of physical sensors and outputs of virtual sensors |
||||||
|
* - Identifiers are unique values defined by the library, not from external |
||||||
|
* - Sample rates must be provided as value of |
||||||
|
* - An allowed sample rate for continuously sampled signals |
||||||
|
* - 65535.0f (BSEC_SAMPLE_RATE_DISABLED) to turn off outputs and identify disabled inputs |
||||||
|
* |
||||||
|
* @note The same sensor identifiers are also used within the functions bsec_do_steps(). |
||||||
|
* |
||||||
|
* The usage principles of bsec_update_subscription() are: |
||||||
|
* - Differential updates (i.e., only asking for outputs that the user would like to change) is supported. |
||||||
|
* - Invalid requests of outputs are ignored. Also if one of the requested outputs is unavailable, all the requests |
||||||
|
* are ignored. At the same time, a warning is returned. |
||||||
|
* - To disable BSEC, all outputs shall be turned off. Only enabled (subscribed) outputs have to be disabled while |
||||||
|
* already disabled outputs do not have to be disabled explicitly. |
||||||
|
* |
||||||
|
* @param[in] requested_virtual_sensors Pointer to array of requested virtual sensor (output) configurations for the library |
||||||
|
* @param[in] n_requested_virtual_sensors Number of virtual sensor structs pointed by requested_virtual_sensors |
||||||
|
* @param[out] required_sensor_settings Pointer to array of required physical sensor configurations for the library |
||||||
|
* @param[in,out] n_required_sensor_settings [in] Size of allocated required_sensor_settings array, [out] number of sensor configurations returned |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
* @sa bsec_sensor_configuration_t |
||||||
|
* @sa bsec_physical_sensor_t |
||||||
|
* @sa bsec_virtual_sensor_t |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
|
||||||
|
// Change 3 virtual sensors (switch IAQ and raw temperature -> on / pressure -> off)
|
||||||
|
bsec_sensor_configuration_t requested_virtual_sensors[3]; |
||||||
|
uint8_t n_requested_virtual_sensors = 3; |
||||||
|
|
||||||
|
requested_virtual_sensors[0].sensor_id = BSEC_OUTPUT_IAQ; |
||||||
|
requested_virtual_sensors[0].sample_rate = BSEC_SAMPLE_RATE_ULP; |
||||||
|
requested_virtual_sensors[1].sensor_id = BSEC_OUTPUT_RAW_TEMPERATURE; |
||||||
|
requested_virtual_sensors[1].sample_rate = BSEC_SAMPLE_RATE_ULP; |
||||||
|
requested_virtual_sensors[2].sensor_id = BSEC_OUTPUT_RAW_PRESSURE; |
||||||
|
requested_virtual_sensors[2].sample_rate = BSEC_SAMPLE_RATE_DISABLED; |
||||||
|
|
||||||
|
// Allocate a struct for the returned physical sensor settings
|
||||||
|
bsec_sensor_configuration_t required_sensor_settings[BSEC_MAX_PHYSICAL_SENSOR]; |
||||||
|
uint8_t n_required_sensor_settings = BSEC_MAX_PHYSICAL_SENSOR; |
||||||
|
|
||||||
|
// Call bsec_update_subscription() to enable/disable the requested virtual sensors
|
||||||
|
bsec_update_subscription(requested_virtual_sensors, n_requested_virtual_sensors, required_sensor_settings, &n_required_sensor_settings); |
||||||
|
\endcode |
||||||
|
* |
||||||
|
*/ |
||||||
|
bsec_library_return_t bsec_update_subscription(const bsec_sensor_configuration_t * requested_virtual_sensors, |
||||||
|
uint8_t n_requested_virtual_sensors, bsec_sensor_configuration_t * required_sensor_settings, |
||||||
|
uint8_t * n_required_sensor_settings); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Main signal processing function of BSEC |
||||||
|
* |
||||||
|
* |
||||||
|
* Processing of the input signals and returning of output samples is performed by bsec_do_steps(). |
||||||
|
* - The samples of all library inputs must be passed with unique identifiers representing the input signals from |
||||||
|
* physical sensors where the order of these inputs can be chosen arbitrary. However, all input have to be provided |
||||||
|
* within the same time period as they are read. A sequential provision to the library might result in undefined |
||||||
|
* behavior. |
||||||
|
* - The samples of all library outputs are returned with unique identifiers corresponding to the output signals of |
||||||
|
* virtual sensors where the order of the returned outputs may be arbitrary. |
||||||
|
* - The samples of all input as well as output signals of physical as well as virtual sensors use the same |
||||||
|
* representation in memory with the following fields: |
||||||
|
* - Sensor identifier: |
||||||
|
* - For inputs: required to identify the input signal from a physical sensor |
||||||
|
* - For output: overwritten by bsec_do_steps() to identify the returned signal from a virtual sensor |
||||||
|
* - Time stamp of the sample |
||||||
|
* |
||||||
|
* Calling bsec_do_steps() requires the samples of the input signals to be provided along with their time stamp when |
||||||
|
* they are recorded and only when they are acquired. Repetition of samples with the same time stamp are ignored and |
||||||
|
* result in a warning. Repetition of values of samples which are not acquired anew by a sensor result in deviations |
||||||
|
* of the computed output signals. Concerning the returned output samples, an important feature is, that a value is |
||||||
|
* returned for an output only when a new occurrence has been computed. A sample of an output signal is returned only |
||||||
|
* once. |
||||||
|
* |
||||||
|
* |
||||||
|
* @param[in] inputs Array of input data samples. Each array element represents a sample of a different physical sensor. |
||||||
|
* @param[in] n_inputs Number of passed input data structs. |
||||||
|
* @param[out] outputs Array of output data samples. Each array element represents a sample of a different virtual sensor. |
||||||
|
* @param[in,out] n_outputs [in] Number of allocated output structs, [out] number of outputs returned |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
|
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
|
||||||
|
// Allocate input and output memory
|
||||||
|
bsec_input_t input[3]; |
||||||
|
uint8_t n_input = 3; |
||||||
|
bsec_output_t output[2]; |
||||||
|
uint8_t n_output=2; |
||||||
|
|
||||||
|
bsec_library_return_t status; |
||||||
|
|
||||||
|
// Populate the input structs, assuming the we have timestamp (ts),
|
||||||
|
// gas sensor resistance (R), temperature (T), and humidity (rH) available
|
||||||
|
// as input variables
|
||||||
|
input[0].sensor_id = BSEC_INPUT_GASRESISTOR; |
||||||
|
input[0].signal = R; |
||||||
|
input[0].time_stamp= ts; |
||||||
|
input[1].sensor_id = BSEC_INPUT_TEMPERATURE; |
||||||
|
input[1].signal = T; |
||||||
|
input[1].time_stamp= ts; |
||||||
|
input[2].sensor_id = BSEC_INPUT_HUMIDITY; |
||||||
|
input[2].signal = rH; |
||||||
|
input[2].time_stamp= ts; |
||||||
|
|
||||||
|
|
||||||
|
// Invoke main processing BSEC function
|
||||||
|
status = bsec_do_steps( input, n_input, output, &n_output ); |
||||||
|
|
||||||
|
// Iterate through the BSEC output data, if the call succeeded
|
||||||
|
if(status == BSEC_OK) |
||||||
|
{ |
||||||
|
for(int i = 0; i < n_output; i++) |
||||||
|
{ |
||||||
|
switch(output[i].sensor_id) |
||||||
|
{ |
||||||
|
case BSEC_OUTPUT_IAQ: |
||||||
|
// Retrieve the IAQ results from output[i].signal
|
||||||
|
// and do something with the data
|
||||||
|
break; |
||||||
|
case BSEC_OUTPUT_AMBIENT_TEMPERATURE: |
||||||
|
// Retrieve the ambient temperature results from output[i].signal
|
||||||
|
// and do something with the data
|
||||||
|
break; |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_do_steps(const bsec_input_t * inputs, uint8_t n_inputs, bsec_output_t * outputs, uint8_t * n_outputs); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reset a particular virtual sensor output |
||||||
|
* |
||||||
|
* This function allows specific virtual sensor outputs to be reset. The meaning of "reset" depends on the specific |
||||||
|
* output. In case of the IAQ output, reset means zeroing the output to the current ambient conditions. |
||||||
|
* |
||||||
|
* @param[in] sensor_id Virtual sensor to be reset |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
bsec_reset_output(BSEC_OUTPUT_IAQ); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_reset_output(uint8_t sensor_id); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Update algorithm configuration parameters |
||||||
|
* |
||||||
|
* BSEC uses a default configuration for the modules and common settings. The initial configuration can be customized |
||||||
|
* by bsec_set_configuration(). This is an optional step. |
||||||
|
* |
||||||
|
* @note A work buffer with sufficient size is required and has to be provided by the function caller to decompose |
||||||
|
* the serialization and apply it to the library and its modules. |
||||||
|
* |
||||||
|
* Please use #BSEC_MAX_PROPERTY_BLOB_SIZE for allotting the required size. |
||||||
|
* |
||||||
|
* @param[in] serialized_settings Settings serialized to a binary blob |
||||||
|
* @param[in] n_serialized_settings Size of the settings blob |
||||||
|
* @param[in,out] work_buffer Work buffer used to parse the blob |
||||||
|
* @param[in] n_work_buffer_size Length of the work buffer available for parsing the blob |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
|
||||||
|
// Allocate variables
|
||||||
|
uint8_t serialized_settings[BSEC_MAX_PROPERTY_BLOB_SIZE]; |
||||||
|
uint32_t n_serialized_settings_max = BSEC_MAX_PROPERTY_BLOB_SIZE; |
||||||
|
uint8_t work_buffer[BSEC_MAX_WORKBUFFER_SIZE]; |
||||||
|
uint32_t n_work_buffer = BSEC_MAX_WORKBUFFER_SIZE; |
||||||
|
|
||||||
|
// Here we will load a provided config string into serialized_settings
|
||||||
|
|
||||||
|
// Apply the configuration
|
||||||
|
bsec_set_configuration(serialized_settings, n_serialized_settings_max, work_buffer, n_work_buffer); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_set_configuration(const uint8_t * serialized_settings, |
||||||
|
uint32_t n_serialized_settings, uint8_t * work_buffer, |
||||||
|
uint32_t n_work_buffer_size); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Restore the internal state of the library |
||||||
|
* |
||||||
|
* BSEC uses a default state for all signal processing modules and the BSEC module. To ensure optimal performance, |
||||||
|
* especially of the gas sensor functionality, it is recommended to retrieve the state using bsec_get_state() |
||||||
|
* before unloading the library, storing it in some form of non-volatile memory, and setting it using bsec_set_state() |
||||||
|
* before resuming further operation of the library. |
||||||
|
* |
||||||
|
* @note A work buffer with sufficient size is required and has to be provided by the function caller to decompose the |
||||||
|
* serialization and apply it to the library and its modules. |
||||||
|
* |
||||||
|
* Please use #BSEC_MAX_STATE_BLOB_SIZE for allotting the required size. |
||||||
|
* |
||||||
|
* @param[in] serialized_state States serialized to a binary blob |
||||||
|
* @param[in] n_serialized_state Size of the state blob |
||||||
|
* @param[in,out] work_buffer Work buffer used to parse the blob |
||||||
|
* @param[in] n_work_buffer_size Length of the work buffer available for parsing the blob |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
|
||||||
|
// Allocate variables
|
||||||
|
uint8_t serialized_state[BSEC_MAX_PROPERTY_BLOB_SIZE]; |
||||||
|
uint32_t n_serialized_state = BSEC_MAX_PROPERTY_BLOB_SIZE; |
||||||
|
uint8_t work_buffer_state[BSEC_MAX_WORKBUFFER_SIZE]; |
||||||
|
uint32_t n_work_buffer_size = BSEC_MAX_WORKBUFFER_SIZE; |
||||||
|
|
||||||
|
// Here we will load a state string from a previous use of BSEC
|
||||||
|
|
||||||
|
// Apply the previous state to the current BSEC session
|
||||||
|
bsec_set_state(serialized_state, n_serialized_state, work_buffer_state, n_work_buffer_size); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_set_state(const uint8_t * serialized_state, uint32_t n_serialized_state, |
||||||
|
uint8_t * work_buffer, uint32_t n_work_buffer_size); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Retrieve the current library configuration |
||||||
|
* |
||||||
|
* BSEC allows to retrieve the current configuration using bsec_get_configuration(). Returns a binary blob encoding |
||||||
|
* the current configuration parameters of the library in a format compatible with bsec_set_configuration(). |
||||||
|
* |
||||||
|
* @note The function bsec_get_configuration() is required to be used for debugging purposes only. |
||||||
|
* @note A work buffer with sufficient size is required and has to be provided by the function caller to decompose the |
||||||
|
* serialization and apply it to the library and its modules. |
||||||
|
* |
||||||
|
* Please use #BSEC_MAX_PROPERTY_BLOB_SIZE for allotting the required size. |
||||||
|
* |
||||||
|
* @param[in] config_id Identifier for a specific set of configuration settings to be returned; |
||||||
|
* shall be zero to retrieve all configuration settings. |
||||||
|
* @param[out] serialized_settings Buffer to hold the serialized config blob |
||||||
|
* @param[in] n_serialized_settings_max Maximum available size for the serialized settings |
||||||
|
* @param[in,out] work_buffer Work buffer used to parse the binary blob |
||||||
|
* @param[in] n_work_buffer Length of the work buffer available for parsing the blob |
||||||
|
* @param[out] n_serialized_settings Actual size of the returned serialized configuration blob |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
|
||||||
|
// Allocate variables
|
||||||
|
uint8_t serialized_settings[BSEC_MAX_PROPERTY_BLOB_SIZE]; |
||||||
|
uint32_t n_serialized_settings_max = BSEC_MAX_PROPERTY_BLOB_SIZE; |
||||||
|
uint8_t work_buffer[BSEC_MAX_WORKBUFFER_SIZE]; |
||||||
|
uint32_t n_work_buffer = BSEC_MAX_WORKBUFFER_SIZE; |
||||||
|
uint32_t n_serialized_settings = 0; |
||||||
|
|
||||||
|
// Configuration of BSEC algorithm is stored in 'serialized_settings'
|
||||||
|
bsec_get_configuration(0, serialized_settings, n_serialized_settings_max, work_buffer, n_work_buffer, &n_serialized_settings); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_get_configuration(uint8_t config_id, uint8_t * serialized_settings, uint32_t n_serialized_settings_max, |
||||||
|
uint8_t * work_buffer, uint32_t n_work_buffer, uint32_t * n_serialized_settings); |
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
*@brief Retrieve the current internal library state |
||||||
|
* |
||||||
|
* BSEC allows to retrieve the current states of all signal processing modules and the BSEC module using |
||||||
|
* bsec_get_state(). This allows a restart of the processing after a reboot of the system by calling bsec_set_state(). |
||||||
|
* |
||||||
|
* @note A work buffer with sufficient size is required and has to be provided by the function caller to decompose the |
||||||
|
* serialization and apply it to the library and its modules. |
||||||
|
* |
||||||
|
* Please use #BSEC_MAX_STATE_BLOB_SIZE for allotting the required size. |
||||||
|
* |
||||||
|
* @param[in] state_set_id Identifier for a specific set of states to be returned; shall be |
||||||
|
* zero to retrieve all states. |
||||||
|
* @param[out] serialized_state Buffer to hold the serialized config blob |
||||||
|
* @param[in] n_serialized_state_max Maximum available size for the serialized states |
||||||
|
* @param[in,out] work_buffer Work buffer used to parse the blob |
||||||
|
* @param[in] n_work_buffer Length of the work buffer available for parsing the blob |
||||||
|
* @param[out] n_serialized_state Actual size of the returned serialized blob |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
* |
||||||
|
\code{.c} |
||||||
|
// Example //
|
||||||
|
|
||||||
|
// Allocate variables
|
||||||
|
uint8_t serialized_state[BSEC_MAX_STATE_BLOB_SIZE]; |
||||||
|
uint32_t n_serialized_state_max = BSEC_MAX_STATE_BLOB_SIZE; |
||||||
|
uint32_t n_serialized_state = BSEC_MAX_STATE_BLOB_SIZE; |
||||||
|
uint8_t work_buffer_state[BSEC_MAX_WORKBUFFER_SIZE]; |
||||||
|
uint32_t n_work_buffer_size = BSEC_MAX_WORKBUFFER_SIZE; |
||||||
|
|
||||||
|
// Algorithm state is stored in 'serialized_state'
|
||||||
|
bsec_get_state(0, serialized_state, n_serialized_state_max, work_buffer_state, n_work_buffer_size, &n_serialized_state); |
||||||
|
|
||||||
|
\endcode |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_get_state(uint8_t state_set_id, uint8_t * serialized_state, |
||||||
|
uint32_t n_serialized_state_max, uint8_t * work_buffer, uint32_t n_work_buffer, |
||||||
|
uint32_t * n_serialized_state); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Retrieve BMExxx sensor instructions |
||||||
|
* |
||||||
|
* The bsec_sensor_control() interface is a key feature of BSEC, as it allows an easy way for the signal processing |
||||||
|
* library to control the operation of the BME sensor. This is important since gas sensor behaviour is mainly |
||||||
|
* determined by how the integrated heater is configured. To ensure an easy integration of BSEC into any system, |
||||||
|
* bsec_sensor_control() will provide the caller with information about the current sensor configuration that is |
||||||
|
* necessary to fulfill the input requirements derived from the current outputs requested via |
||||||
|
* bsec_update_subscription(). |
||||||
|
* |
||||||
|
* In practice the use of this function shall be as follows: |
||||||
|
* - Call bsec_sensor_control() which returns a bsec_bme_settings_t struct. |
||||||
|
* - Based on the information contained in this struct, the sensor is configured and a forced-mode measurement is |
||||||
|
* triggered if requested by bsec_sensor_control(). |
||||||
|
* - Once this forced-mode measurement is complete, the signals specified in this struct shall be passed to |
||||||
|
* bsec_do_steps() to perform the signal processing. |
||||||
|
* - After processing, the process should sleep until the bsec_bme_settings_t::next_call timestamp is reached. |
||||||
|
* |
||||||
|
* |
||||||
|
* @param [in] time_stamp Current timestamp in [ns] |
||||||
|
* @param[out] sensor_settings Settings to be passed to API to operate sensor at this time instance |
||||||
|
* |
||||||
|
* @return Zero when successful, otherwise an error code |
||||||
|
*/ |
||||||
|
|
||||||
|
bsec_library_return_t bsec_sensor_control(int64_t time_stamp, bsec_bme_settings_t *sensor_settings); |
||||||
|
|
||||||
|
/*@}*/ //BSEC Interface
|
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif /* __BSEC_INTERFACE_H__ */ |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,403 @@ |
|||||||
|
#include <string.h> |
||||||
|
#include "bsec2.h" |
||||||
|
|
||||||
|
/* Private funcs - prototypes */ |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads the data from the BME68x sensor and process it |
||||||
|
* @param currTimeNs: Current time in ns |
||||||
|
* @return true if there are new outputs. false otherwise |
||||||
|
*/ |
||||||
|
static bool bsec2_processData(struct bsec2 *self, int64_t currTimeNs, const struct bme68x_data *data); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the BME68x sensor configuration to forced mode |
||||||
|
*/ |
||||||
|
static void bsec2_setBme68xConfigForced(struct bsec2 *self); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the BME68x sensor configuration to parallel mode |
||||||
|
*/ |
||||||
|
static void bsec2_setBme68xConfigParallel(struct bsec2 *self); |
||||||
|
|
||||||
|
|
||||||
|
/* Public funcs impl */ |
||||||
|
|
||||||
|
int bsec2_init(struct bsec2 *self, struct bme68x_dev *dev) { |
||||||
|
self->ovfCounter = 0; |
||||||
|
self->lastMillis = 0; |
||||||
|
self->status = BSEC_OK; |
||||||
|
self->extTempOffset = 0.0f; |
||||||
|
self->opMode = BME68X_SLEEP_MODE; |
||||||
|
self->newDataCallback = NULL; |
||||||
|
self->sensor = dev; |
||||||
|
memset(&self->version, 0, sizeof(self->version)); |
||||||
|
memset(&self->bmeConf, 0, sizeof(self->bmeConf)); |
||||||
|
memset(&self->outputs, 0, sizeof(self->outputs)); |
||||||
|
|
||||||
|
// The sensor must be inited and OK by the time this func is called!
|
||||||
|
|
||||||
|
// Begin
|
||||||
|
self->status = bsec_init(); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
self->status = bsec_get_version(&self->version); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
return -2; |
||||||
|
} |
||||||
|
memset(&self->bmeConf, 0, sizeof(self->bmeConf)); |
||||||
|
memset(&self->outputs, 0, sizeof(self->outputs)); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
bool bsec2_updateSubscription(struct bsec2 *self, const bsecSensor *sensorList, uint8_t nSensors, float sampleRate) { |
||||||
|
bsec_sensor_configuration_t virtualSensors[BSEC_NUMBER_OUTPUTS], sensorSettings[BSEC_MAX_PHYSICAL_SENSOR]; |
||||||
|
uint8_t nSensorSettings = BSEC_MAX_PHYSICAL_SENSOR; |
||||||
|
|
||||||
|
for (uint8_t i = 0; i < nSensors; i++) { |
||||||
|
virtualSensors[i].sensor_id = sensorList[i]; |
||||||
|
virtualSensors[i].sample_rate = sampleRate; |
||||||
|
} |
||||||
|
|
||||||
|
/* Subscribe to library virtual sensors outputs */ |
||||||
|
self->status = bsec_update_subscription(virtualSensors, nSensors, sensorSettings, &nSensorSettings); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
bool bsec2_run(struct bsec2 *self) { |
||||||
|
int64_t currTimeNs = bsec2_getTimeMs(self) * INT64_C(1000000); |
||||||
|
|
||||||
|
uint8_t lastOpMode = self->opMode; |
||||||
|
|
||||||
|
// set new opmode to what bsec wants
|
||||||
|
self->opMode = self->bmeConf.op_mode; |
||||||
|
|
||||||
|
if (currTimeNs >= self->bmeConf.next_call) { |
||||||
|
/* Provides the information about the current sensor configuration that is
|
||||||
|
necessary to fulfill the input requirements, eg: operation mode, timestamp |
||||||
|
at which the sensor data shall be fetched etc */ |
||||||
|
self->status = bsec_sensor_control(currTimeNs, &self->bmeConf); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
switch (self->bmeConf.op_mode) { |
||||||
|
case BME68X_FORCED_MODE: |
||||||
|
bsec2_setBme68xConfigForced(self); |
||||||
|
break; |
||||||
|
case BME68X_PARALLEL_MODE: |
||||||
|
if (self->opMode != self->bmeConf.op_mode) { |
||||||
|
bsec2_setBme68xConfigParallel(self); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case BME68X_SLEEP_MODE: |
||||||
|
if (self->opMode != self->bmeConf.op_mode) { |
||||||
|
self->sensor_status = bme68x_set_op_mode(BME68X_SLEEP_MODE, self->sensor); |
||||||
|
self->opMode = BME68X_SLEEP_MODE; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
if (self->sensor_status < BME68X_OK) { |
||||||
|
bsec2_errormsg("bsec2 sensor error"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
struct bme68x_data sensorData[3]; |
||||||
|
struct bme68x_data *pdata; |
||||||
|
|
||||||
|
if (self->bmeConf.trigger_measurement && self->bmeConf.op_mode != BME68X_SLEEP_MODE) { |
||||||
|
uint8_t nfields; |
||||||
|
self->sensor_status = bme68x_get_data(self->opMode, sensorData, &nfields, self->sensor); |
||||||
|
|
||||||
|
if (self->sensor_status == BME68X_OK && nfields > 0) { |
||||||
|
if (lastOpMode == BME68X_FORCED_MODE) { |
||||||
|
pdata = &sensorData[0]; |
||||||
|
if (pdata->status & BME68X_GASM_VALID_MSK) { |
||||||
|
if (!bsec2_processData(self, currTimeNs, pdata)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
for (int i = 0; i < nfields; i++) { |
||||||
|
pdata = &sensorData[i]; |
||||||
|
if (pdata->status & BME68X_GASM_VALID_MSK) { |
||||||
|
if (!bsec2_processData(self, currTimeNs, pdata)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
bsecData bsec2_getData(struct bsec2 *self, bsecSensor id) { |
||||||
|
bsecData emp = |
||||||
|
{0}; |
||||||
|
for (uint8_t i = 0; i < self->outputs.nOutputs; i++) |
||||||
|
if (id == self->outputs.output[i].sensor_id) |
||||||
|
return self->outputs.output[i]; |
||||||
|
return emp; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to get the state of the algorithm to save to non-volatile memory |
||||||
|
* @param state : Pointer to a memory location, to hold the state |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_getState(struct bsec2 *self, uint8_t *state) { |
||||||
|
uint32_t n_serialized_state = BSEC_MAX_STATE_BLOB_SIZE; |
||||||
|
|
||||||
|
self->status = bsec_get_state(0, state, BSEC_MAX_STATE_BLOB_SIZE, self->workBuffer, BSEC_MAX_WORKBUFFER_SIZE, |
||||||
|
&n_serialized_state); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
bsec2_errormsg("bsec2_getState: error from bsec_get_state"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to set the state of the algorithm from non-volatile memory |
||||||
|
* @param state : Pointer to a memory location that contains the state |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_setState(struct bsec2 *self, uint8_t *state) { |
||||||
|
self->status = bsec_set_state(state, BSEC_MAX_STATE_BLOB_SIZE, self->workBuffer, BSEC_MAX_WORKBUFFER_SIZE); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
bsec2_errormsg("bsec2_setState: error from bsec_set_state"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
memset(&self->bmeConf, 0, sizeof(self->bmeConf)); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to retrieve the current library configuration |
||||||
|
* @param config : Pointer to a memory location, to hold the serialized config blob, must hold BSEC_MAX_PROPERTY_BLOB_SIZE |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_getConfig(struct bsec2 *self, uint8_t *config) { |
||||||
|
uint32_t n_serialized_settings = 0; |
||||||
|
|
||||||
|
self->status = bsec_get_configuration(0, config, BSEC_MAX_PROPERTY_BLOB_SIZE, self->workBuffer, BSEC_MAX_WORKBUFFER_SIZE, &n_serialized_settings); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
bsec2_errormsg("bsec2_getConfig: error from bsec_get_configuration"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to set the configuration of the algorithm from memory |
||||||
|
* @param state : Pointer to a memory location that contains the configuration |
||||||
|
* @return true for success, false otherwise |
||||||
|
*/ |
||||||
|
bool bsec2_setConfig(struct bsec2 *self, const uint8_t *config) { |
||||||
|
self->status = bsec_set_configuration(config, BSEC_MAX_PROPERTY_BLOB_SIZE, self->workBuffer, BSEC_MAX_WORKBUFFER_SIZE); |
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
bsec2_errormsg("bsec2_setConfig: error from bsec_set_configuration"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
// copied from arduino lib, but why?
|
||||||
|
memset(&self->bmeConf, 0, sizeof(self->bmeConf)); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to calculate an int64_t timestamp in milliseconds |
||||||
|
*/ |
||||||
|
int64_t bsec2_getTimeMs(struct bsec2 *self) { |
||||||
|
int64_t timeMs = bsec2_timestamp_millis(); |
||||||
|
|
||||||
|
if (self->lastMillis > timeMs) /* An overflow occurred */ |
||||||
|
{ |
||||||
|
self->lastMillis = timeMs; |
||||||
|
self->ovfCounter++; |
||||||
|
} |
||||||
|
return timeMs + (self->ovfCounter * INT64_C(0xFFFFFFFF)); |
||||||
|
} |
||||||
|
|
||||||
|
/* Private funcs impl */ |
||||||
|
|
||||||
|
static bool bsec2_processData(struct bsec2 *self, int64_t currTimeNs, const struct bme68x_data *data) { |
||||||
|
|
||||||
|
bsec_input_t inputs[BSEC_MAX_PHYSICAL_SENSOR]; /* Temp, Pres, Hum & Gas */ |
||||||
|
uint8_t nInputs = 0; |
||||||
|
/* Checks all the required sensor inputs, required for the BSEC library for the requested outputs */ |
||||||
|
if (BSEC_CHECK_INPUT(self->bmeConf.process_data, BSEC_INPUT_HEATSOURCE)) { |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_HEATSOURCE; |
||||||
|
inputs[nInputs].signal = self->extTempOffset; |
||||||
|
inputs[nInputs].time_stamp = currTimeNs; |
||||||
|
nInputs++; |
||||||
|
} |
||||||
|
if (BSEC_CHECK_INPUT(self->bmeConf.process_data, BSEC_INPUT_TEMPERATURE)) { |
||||||
|
#ifdef BME68X_USE_FPU |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_TEMPERATURE; |
||||||
|
#else |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_TEMPERATURE / 100.0f; |
||||||
|
#endif |
||||||
|
inputs[nInputs].signal = data->temperature; |
||||||
|
inputs[nInputs].time_stamp = currTimeNs; |
||||||
|
nInputs++; |
||||||
|
} |
||||||
|
if (BSEC_CHECK_INPUT(self->bmeConf.process_data, BSEC_INPUT_HUMIDITY)) { |
||||||
|
#ifdef BME68X_USE_FPU |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_HUMIDITY; |
||||||
|
#else |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_HUMIDITY / 1000.0f; |
||||||
|
#endif |
||||||
|
inputs[nInputs].signal = data->humidity; |
||||||
|
inputs[nInputs].time_stamp = currTimeNs; |
||||||
|
nInputs++; |
||||||
|
} |
||||||
|
if (BSEC_CHECK_INPUT(self->bmeConf.process_data, BSEC_INPUT_PRESSURE)) { |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_PRESSURE; |
||||||
|
inputs[nInputs].signal = data->pressure; |
||||||
|
inputs[nInputs].time_stamp = currTimeNs; |
||||||
|
nInputs++; |
||||||
|
} |
||||||
|
if (BSEC_CHECK_INPUT(self->bmeConf.process_data, BSEC_INPUT_GASRESISTOR) && |
||||||
|
(data->status & BME68X_GASM_VALID_MSK)) { |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_GASRESISTOR; |
||||||
|
inputs[nInputs].signal = data->gas_resistance; |
||||||
|
inputs[nInputs].time_stamp = currTimeNs; |
||||||
|
nInputs++; |
||||||
|
} |
||||||
|
if (BSEC_CHECK_INPUT(self->bmeConf.process_data, BSEC_INPUT_PROFILE_PART) && |
||||||
|
(data->status & BME68X_GASM_VALID_MSK)) { |
||||||
|
inputs[nInputs].sensor_id = BSEC_INPUT_PROFILE_PART; |
||||||
|
inputs[nInputs].signal = (self->opMode == BME68X_FORCED_MODE) ? 0 : (float) data->gas_index; |
||||||
|
inputs[nInputs].time_stamp = currTimeNs; |
||||||
|
nInputs++; |
||||||
|
} |
||||||
|
|
||||||
|
if (nInputs > 0) { |
||||||
|
|
||||||
|
self->outputs.nOutputs = BSEC_NUMBER_OUTPUTS; |
||||||
|
memset(self->outputs.output, 0, sizeof(self->outputs.output)); |
||||||
|
|
||||||
|
/* Processing of the input signals and returning of output samples is performed by bsec_do_steps() */ |
||||||
|
self->status = bsec_do_steps(inputs, nInputs, self->outputs.output, &self->outputs.nOutputs); |
||||||
|
|
||||||
|
if (self->status != BSEC_OK) { |
||||||
|
bsec2_errormsg("bsec2_processData: error from bsec_do_steps"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (self->newDataCallback) { |
||||||
|
self->newDataCallback(data, &self->outputs, self); |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
static void bsec2_setBme68xConfigForced(struct bsec2 *self) { |
||||||
|
struct bme68x_conf conf; |
||||||
|
struct bme68x_heatr_conf hconf; |
||||||
|
|
||||||
|
self->sensor_status = bme68x_get_conf(&conf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigForced: error from bme68x_get_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
self->sensor_status = bme68x_get_heatr_conf(&hconf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigForced: error from bme68x_get_heatr_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
conf.os_hum = self->bmeConf.humidity_oversampling; |
||||||
|
conf.os_pres = self->bmeConf.pressure_oversampling; |
||||||
|
conf.os_temp = self->bmeConf.temperature_oversampling; |
||||||
|
|
||||||
|
self->sensor_status = bme68x_set_conf(&conf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigForced: error from bme68x_set_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
hconf.enable = BME68X_ENABLE; |
||||||
|
hconf.heatr_dur = self->bmeConf.heater_duration; |
||||||
|
hconf.heatr_temp = self->bmeConf.heater_temperature; |
||||||
|
|
||||||
|
self->sensor_status = bme68x_set_heatr_conf(BME68X_FORCED_MODE, &hconf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigForced: error from bme68x_set_heatr_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
self->sensor_status = bme68x_set_op_mode(BME68X_FORCED_MODE, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigForced: error from bme68x_set_op_mode"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
self->opMode = BME68X_FORCED_MODE; |
||||||
|
} |
||||||
|
|
||||||
|
static void bsec2_setBme68xConfigParallel(struct bsec2 *self) { |
||||||
|
uint16_t sharedHeaterDur = 0; |
||||||
|
|
||||||
|
struct bme68x_conf conf; |
||||||
|
struct bme68x_heatr_conf hconf; |
||||||
|
|
||||||
|
self->sensor_status = bme68x_get_conf(&conf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigParallel: error from bme68x_get_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
self->sensor_status = bme68x_get_heatr_conf(&hconf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigParallel: error from bme68x_get_heatr_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
conf.os_hum = self->bmeConf.humidity_oversampling; |
||||||
|
conf.os_pres = self->bmeConf.pressure_oversampling; |
||||||
|
conf.os_temp = self->bmeConf.temperature_oversampling; |
||||||
|
|
||||||
|
self->sensor_status = bme68x_set_conf(&conf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigParallel: error from bme68x_set_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
sharedHeaterDur = BSEC_TOTAL_HEAT_DUR - (bme68x_get_meas_dur(BME68X_PARALLEL_MODE, &conf, self->sensor) / INT64_C(1000)); |
||||||
|
|
||||||
|
hconf.enable = BME68X_ENABLE; |
||||||
|
hconf.heatr_dur = self->bmeConf.heater_duration; |
||||||
|
hconf.heatr_temp = self->bmeConf.heater_temperature; |
||||||
|
hconf.shared_heatr_dur = sharedHeaterDur; |
||||||
|
hconf.heatr_dur_prof = self->bmeConf.heater_duration_profile; |
||||||
|
hconf.profile_len = self->bmeConf.heater_profile_len; |
||||||
|
|
||||||
|
self->sensor_status = bme68x_set_heatr_conf(BME68X_PARALLEL_MODE, &hconf, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigParallel: error from bme68x_set_heatr_conf"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
self->sensor_status = bme68x_set_op_mode(BME68X_PARALLEL_MODE, self->sensor); |
||||||
|
if (BME68X_OK != self->sensor_status) { |
||||||
|
bsec2_errormsg("bsec2_setBme68xConfigParallel: error from bme68x_set_op_mode"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
self->opMode = BME68X_PARALLEL_MODE; |
||||||
|
} |
Loading…
Reference in new issue