datasheet folder added
This commit is contained in:
parent
e9c9eb4282
commit
3ca97c3056
BIN
Sensors/BME280/BST-BME280-DS002.pdf
Normal file
BIN
Sensors/BME280/BST-BME280-DS002.pdf
Normal file
Binary file not shown.
BIN
Sensors/BME680/BSEC_1.4.5.1_Generic_Release_20171214.zip
Normal file
BIN
Sensors/BME680/BSEC_1.4.5.1_Generic_Release_20171214.zip
Normal file
Binary file not shown.
BIN
Sensors/BME680/BSEC_1.4.6.0_Generic_Release_20180323.zip
Normal file
BIN
Sensors/BME680/BSEC_1.4.6.0_Generic_Release_20180323.zip
Normal file
Binary file not shown.
@ -0,0 +1,239 @@
|
||||
# BME680 sensor API
|
||||
## Introduction
|
||||
This package contains the Bosch Sensortec's BME680 gas sensor API
|
||||
|
||||
The sensor driver package includes bme680.h, bme680.c and bme680_defs.h files
|
||||
|
||||
## Version
|
||||
File | Version | Date
|
||||
-----|---------|-----
|
||||
bme680.c | 3.5.1 | 5 Jul 2017
|
||||
bme680.h | 3.5.1 | 5 Jul 2017
|
||||
bme680_defs.h | 3.5.1 | 5 Jul 2017
|
||||
|
||||
## Integration details
|
||||
* Integrate bme680.h, bme680_defs.h and bme680.c file in to your project.
|
||||
* Include the bme680.h file in your code like below.
|
||||
``` c
|
||||
#include "bme680.h"
|
||||
```
|
||||
|
||||
## File information
|
||||
* bme680_defs.h : This header file has the constants, macros and datatype declarations.
|
||||
* bme680.h : This header file contains the declarations of the sensor driver APIs.
|
||||
* bme680.c : This source file contains the definitions of the sensor driver APIs.
|
||||
|
||||
## Supported sensor interfaces
|
||||
* SPI 4-wire
|
||||
* I2C
|
||||
|
||||
## Usage guide
|
||||
### Initializing the sensor
|
||||
To initialize the sensor, you will first need to create a device structure. You
|
||||
can do this by creating an instance of the structure bme680_dev. Then go on to
|
||||
fill in the various parameters as shown below
|
||||
|
||||
#### Example for SPI 4-Wire
|
||||
``` c
|
||||
struct bme680_dev gas_sensor;
|
||||
|
||||
/* You may assign a chip select identifier to be handled later */
|
||||
gas_sensor.dev_id = 0;
|
||||
gas_sensor.intf = BME680_SPI_INTF;
|
||||
gas_sensor.read = user_spi_read;
|
||||
gas_sensor.write = user_spi_write;
|
||||
gas_sensor.delay_ms = user_delay_ms;
|
||||
|
||||
int8_t rslt = BME680_OK;
|
||||
rslt = bme680_init(&gas_sensor);
|
||||
```
|
||||
|
||||
#### Example for I2C
|
||||
``` c
|
||||
struct bme680_dev gas_sensor;
|
||||
|
||||
gas_sensor.dev_id = BME680_I2C_ADDR_PRIMARY;
|
||||
gas_sensor.intf = BME680_I2C_INTF;
|
||||
gas_sensor.read = user_i2c_read;
|
||||
gas_sensor.write = user_i2c_write;
|
||||
gas_sensor.delay_ms = user_delay_ms;
|
||||
|
||||
int8_t rslt = BME680_OK;
|
||||
rslt = bme680_init(&gas_sensor);
|
||||
```
|
||||
|
||||
### Configuring the sensor
|
||||
#### Example for configuring the sensor in forced mode
|
||||
``` c
|
||||
uint8_t set_required_settings;
|
||||
|
||||
/* Set the temperature, pressure and humidity settings */
|
||||
gas_sensor.tph_sett.os_hum = BME680_OS_2X;
|
||||
gas_sensor.tph_sett.os_pres = BME680_OS_4X;
|
||||
gas_sensor.tph_sett.os_temp = BME680_OS_8X;
|
||||
gas_sensor.tph_sett.filter = BME680_FILTER_SIZE_3;
|
||||
|
||||
/* Set the remaining gas sensor settings and link the heating profile */
|
||||
gas_sensor.gas_sett.run_gas = BME680_ENABLE_GAS_MEAS;
|
||||
/* Create a ramp heat waveform in 3 steps */
|
||||
gas_sensor.gas_sett.heatr_temp = 320; /* degree Celsius */
|
||||
gas_sensor.gas_sett.heatr_dur = 150; /* milliseconds */
|
||||
|
||||
/* Select the power mode */
|
||||
/* Must be set before writing the sensor configuration */
|
||||
gas_sensor.power_mode = BME680_FORCED_MODE;
|
||||
|
||||
/* Set the required sensor settings needed */
|
||||
set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_FILTER_SEL
|
||||
| BME680_GAS_SENSOR_SEL;
|
||||
|
||||
/* Set the desired sensor configuration */
|
||||
rslt = bme680_set_sensor_settings(set_required_settings,&gas_sensor);
|
||||
|
||||
/* Set the power mode */
|
||||
rslt = bme680_set_sensor_mode(&gas_sensor);
|
||||
|
||||
/* Get the total measurement duration so as to sleep or wait till the
|
||||
* measurement is complete */
|
||||
uint16_t meas_period;
|
||||
bme680_get_profile_dur(&meas_period, &gas_sensor);
|
||||
user_delay_ms(meas_period); /* Delay till the measurement is ready */
|
||||
```
|
||||
|
||||
### Reading sensor data
|
||||
#### Example for reading all sensor data
|
||||
``` c
|
||||
struct bme680_field_data data;
|
||||
|
||||
while(1)
|
||||
{
|
||||
rslt = bme680_get_sensor_data(&data, &gas_sensor);
|
||||
|
||||
printf("T: %.2f degC, P: %.2f hPa, H %.2f %%rH ", data.temperature / 100.0f,
|
||||
data.pressure / 100.0f, data.humidity / 1000.0f );
|
||||
/* Avoid using measurements from an unstable heating setup */
|
||||
if(data.status & BME680_HEAT_STAB_MSK)
|
||||
printf(", G: %d ohms", data.gas_resistance);
|
||||
|
||||
printf("\r\n");
|
||||
}
|
||||
```
|
||||
|
||||
### Templates for function pointers
|
||||
``` c
|
||||
|
||||
void user_delay_ms(uint32_t period)
|
||||
{
|
||||
/*
|
||||
* Return control or wait,
|
||||
* for a period amount of milliseconds
|
||||
*/
|
||||
}
|
||||
|
||||
int8_t user_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
|
||||
{
|
||||
int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
|
||||
|
||||
/*
|
||||
* The parameter dev_id can be used as a variable to select which Chip Select pin has
|
||||
* to be set low to activate the relevant device on the SPI bus
|
||||
*/
|
||||
|
||||
/*
|
||||
* Data on the bus should be like
|
||||
* |----------------+---------------------+-------------|
|
||||
* | MOSI | MISO | Chip Select |
|
||||
* |----------------+---------------------|-------------|
|
||||
* | (don't care) | (don't care) | HIGH |
|
||||
* | (reg_addr) | (don't care) | LOW |
|
||||
* | (don't care) | (reg_data[0]) | LOW |
|
||||
* | (....) | (....) | LOW |
|
||||
* | (don't care) | (reg_data[len - 1]) | LOW |
|
||||
* | (don't care) | (don't care) | HIGH |
|
||||
* |----------------+---------------------|-------------|
|
||||
*/
|
||||
|
||||
return rslt;
|
||||
}
|
||||
|
||||
int8_t user_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
|
||||
{
|
||||
int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
|
||||
|
||||
/*
|
||||
* The parameter dev_id can be used as a variable to select which Chip Select pin has
|
||||
* to be set low to activate the relevant device on the SPI bus
|
||||
*/
|
||||
|
||||
/*
|
||||
* Data on the bus should be like
|
||||
* |---------------------+--------------+-------------|
|
||||
* | MOSI | MISO | Chip Select |
|
||||
* |---------------------+--------------|-------------|
|
||||
* | (don't care) | (don't care) | HIGH |
|
||||
* | (reg_addr) | (don't care) | LOW |
|
||||
* | (reg_data[0]) | (don't care) | LOW |
|
||||
* | (....) | (....) | LOW |
|
||||
* | (reg_data[len - 1]) | (don't care) | LOW |
|
||||
* | (don't care) | (don't care) | HIGH |
|
||||
* |---------------------+--------------|-------------|
|
||||
*/
|
||||
|
||||
return rslt;
|
||||
}
|
||||
|
||||
int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
|
||||
{
|
||||
int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
|
||||
|
||||
/*
|
||||
* The parameter dev_id can be used as a variable to store the I2C address of the device
|
||||
*/
|
||||
|
||||
/*
|
||||
* Data on the bus should be like
|
||||
* |------------+---------------------|
|
||||
* | I2C action | Data |
|
||||
* |------------+---------------------|
|
||||
* | Start | - |
|
||||
* | Write | (reg_addr) |
|
||||
* | Stop | - |
|
||||
* | Start | - |
|
||||
* | Read | (reg_data[0]) |
|
||||
* | Read | (....) |
|
||||
* | Read | (reg_data[len - 1]) |
|
||||
* | Stop | - |
|
||||
* |------------+---------------------|
|
||||
*/
|
||||
|
||||
return rslt;
|
||||
}
|
||||
|
||||
int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
|
||||
{
|
||||
int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
|
||||
|
||||
/*
|
||||
* The parameter dev_id can be used as a variable to store the I2C address of the device
|
||||
*/
|
||||
|
||||
/*
|
||||
* Data on the bus should be like
|
||||
* |------------+---------------------|
|
||||
* | I2C action | Data |
|
||||
* |------------+---------------------|
|
||||
* | Start | - |
|
||||
* | Write | (reg_addr) |
|
||||
* | Write | (reg_data[0]) |
|
||||
* | Write | (....) |
|
||||
* | Write | (reg_data[len - 1]) |
|
||||
* | Stop | - |
|
||||
* |------------+---------------------|
|
||||
*/
|
||||
|
||||
return rslt;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
|
1105
Sensors/BME680/BSEC_1.4.6.0_Generic_Release_20180323/API/bme680.c
Normal file
1105
Sensors/BME680/BSEC_1.4.6.0_Generic_Release_20180323/API/bme680.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,225 @@
|
||||
/**
|
||||
* 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 5 Jul 2017
|
||||
* @version 3.5.1
|
||||
* @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, 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_ */
|
||||
/** @}*/
|
@ -0,0 +1,529 @@
|
||||
/**
|
||||
* 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 5 Jul 2017
|
||||
* @version 3.5.1
|
||||
* @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>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#if (LONG_MAX) > 0x7fffffff
|
||||
#define __have_long64 1
|
||||
#elif (LONG_MAX) == 0x7fffffff
|
||||
#define __have_long32 1
|
||||
#endif
|
||||
|
||||
#if !defined(UINT8_C)
|
||||
#define INT8_C(x) x
|
||||
#if (INT_MAX) > 0x7f
|
||||
#define UINT8_C(x) x
|
||||
#else
|
||||
#define UINT8_C(x) x##U
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(UINT16_C)
|
||||
#define INT16_C(x) x
|
||||
#if (INT_MAX) > 0x7fff
|
||||
#define UINT16_C(x) x
|
||||
#else
|
||||
#define UINT16_C(x) x##U
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(INT32_C) && !defined(UINT32_C)
|
||||
#if __have_long32
|
||||
#define INT32_C(x) x##L
|
||||
#define UINT32_C(x) x##UL
|
||||
#else
|
||||
#define INT32_C(x) x
|
||||
#define UINT32_C(x) x##U
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(INT64_C) && !defined(UINT64_C)
|
||||
#if __have_long64
|
||||
#define INT64_C(x) x##L
|
||||
#define UINT64_C(x) x##UL
|
||||
#else
|
||||
#define INT64_C(x) x##LL
|
||||
#define UINT64_C(x) x##ULL
|
||||
#endif
|
||||
#endif
|
||||
#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 UINT16_C(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,42 @@
|
||||
# Change Log
|
||||
All notable changes to the BME680 Sensor API will be documented in this file.
|
||||
|
||||
## v3.5.1, 5 Jul 2017
|
||||
### Changed
|
||||
- Fixed bug with overwriting of the result with communication results
|
||||
- Added member in the dev structure to store communication results
|
||||
- Updated set profile duration API to not return a result.
|
||||
- Added new API to get the duration for the existing profile
|
||||
- Fixed bug with setting gas configuration. Reduced to writing only relevant bytes
|
||||
- Updated readme
|
||||
- Updated documentation for the type definitions
|
||||
- Removed mode check for get sensor data and setting and getting profile dur
|
||||
|
||||
|
||||
## v3.5.0, 28 Jun 2017
|
||||
### Changed
|
||||
- Fixed bug with getting and setting mem pages
|
||||
- Changed initialization sequence to be more robust
|
||||
- Added additional tries while reading data in case of inadequate delay
|
||||
|
||||
|
||||
## v3.4.0, 8 Jun 2017
|
||||
### Changed
|
||||
- Modified the bme680_get_sensor_data API. User has to now pass the struct that stores the data rather than retrieving from the bme680_dev structure.
|
||||
- Fixed possible bugs
|
||||
|
||||
## v3.3.0, 24 May 2017
|
||||
### Changed
|
||||
- Name changes in the BME680 device structure.
|
||||
- Removed sequential and parallel modes.
|
||||
- Removed ODR related sensor settings
|
||||
- Modified get sensor settings API with user selection.
|
||||
- Removed sort sensor data and swap fields API which are not required.
|
||||
|
||||
### Added
|
||||
- BME680 set profile duration API.
|
||||
|
||||
## v3.2.1, 17 May 2017
|
||||
### Added
|
||||
- Took the reference as base version 3.2.1 of BME680 sensor and added.
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12768 0 984 13752 35b8 (TOTALS)
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12768 0 984 13752 35b8 (TOTALS)
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
11996 0 984 12980 32b4 (TOTALS)
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12004 0 984 12988 32bc (TOTALS)
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12634 0 984 13618 3532 (TOTALS)
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12016 0 984 13000 32c8 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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-initalization 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 initialised 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_ESTIMATE;
|
||||
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 phyisical 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 * const requested_virtual_sensors,
|
||||
const 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
|
||||
* behaviour.
|
||||
* - 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 );
|
||||
|
||||
// Iterature 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\endcode
|
||||
*/
|
||||
|
||||
bsec_library_return_t bsec_reset_output(uint8_t sensor_id);
|
||||
|
||||
/*!
|
||||
* @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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const uint32_t n_work_buffer, uint32_t * n_serialized_settings);
|
||||
|
||||
|
||||
/*!
|
||||
* @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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
61876 0 984 62860 f58c (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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-initalization 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 initialised 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_ESTIMATE;
|
||||
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 phyisical 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 * const requested_virtual_sensors,
|
||||
const 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
|
||||
* behaviour.
|
||||
* - 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 );
|
||||
|
||||
// Iterature 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\endcode
|
||||
*/
|
||||
|
||||
bsec_library_return_t bsec_reset_output(uint8_t sensor_id);
|
||||
|
||||
/*!
|
||||
* @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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const uint32_t n_work_buffer, uint32_t * n_serialized_settings);
|
||||
|
||||
|
||||
/*!
|
||||
* @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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
61332 0 984 62316 f36c (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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-initalization 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 initialised 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_ESTIMATE;
|
||||
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 phyisical 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 * const requested_virtual_sensors,
|
||||
const 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
|
||||
* behaviour.
|
||||
* - 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 );
|
||||
|
||||
// Iterature 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\endcode
|
||||
*/
|
||||
|
||||
bsec_library_return_t bsec_reset_output(uint8_t sensor_id);
|
||||
|
||||
/*!
|
||||
* @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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const uint32_t n_work_buffer, uint32_t * n_serialized_settings);
|
||||
|
||||
|
||||
/*!
|
||||
* @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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
13070 0 984 14054 36e6 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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-initalization 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 initialised 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_ESTIMATE;
|
||||
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 phyisical 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 * const requested_virtual_sensors,
|
||||
const 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
|
||||
* behaviour.
|
||||
* - 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 );
|
||||
|
||||
// Iterature 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\endcode
|
||||
*/
|
||||
|
||||
bsec_library_return_t bsec_reset_output(uint8_t sensor_id);
|
||||
|
||||
/*!
|
||||
* @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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const uint32_t n_work_buffer, uint32_t * n_serialized_settings);
|
||||
|
||||
|
||||
/*!
|
||||
* @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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
19804 0 984 20788 5134 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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-initalization 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 initialised 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_ESTIMATE;
|
||||
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 phyisical 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 * const requested_virtual_sensors,
|
||||
const 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
|
||||
* behaviour.
|
||||
* - 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 );
|
||||
|
||||
// Iterature 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\endcode
|
||||
*/
|
||||
|
||||
bsec_library_return_t bsec_reset_output(uint8_t sensor_id);
|
||||
|
||||
/*!
|
||||
* @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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const uint32_t n_work_buffer, uint32_t * n_serialized_settings);
|
||||
|
||||
|
||||
/*!
|
||||
* @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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
26646 0 956 27602 6bd2 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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-initalization 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 initialised 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_ESTIMATE;
|
||||
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 phyisical 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 * const requested_virtual_sensors,
|
||||
const 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
|
||||
* behaviour.
|
||||
* - 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 );
|
||||
|
||||
// Iterature 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\endcode
|
||||
*/
|
||||
|
||||
bsec_library_return_t bsec_reset_output(uint8_t sensor_id);
|
||||
|
||||
/*!
|
||||
* @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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const uint32_t n_work_buffer, uint32_t * n_serialized_settings);
|
||||
|
||||
|
||||
/*!
|
||||
* @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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
22129 0 984 23113 5a49 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12697 0 984 13681 3571 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12697 0 984 13681 3571 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12175 0 984 13159 3367 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12175 0 984 13159 3367 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
13167 0 984 14151 3747 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
12193 0 984 13177 3379 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
13970 0 1216 15186 3b52 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
26333 0 916 27249 6a71 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
26543 0 916 27459 6b43 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
14721 0 984 15705 3d59 (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
17714 0 984 18698 490a (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
13095 0 984 14079 36ff (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
text data bss dec hex filename
|
||||
14023 0 984 15007 3a9f (TOTALS)
|
@ -0,0 +1,481 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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_PHYSICAL_SENSOR (7) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */
|
||||
#define BSEC_MAX_PROPERTY_BLOB_SIZE (304) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */
|
||||
#define BSEC_MAX_STATE_BLOB_SIZE (65) /*!< 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_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 (13) /*!< Number of outputs, depending on solution */
|
||||
#define BSEC_OUTPUT_INCLUDED (162287) /*!< 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
|
||||
} 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_ESTIMATE = 1,
|
||||
|
||||
/**
|
||||
* @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_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_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_TSINTRADIFFOUTOFRANGE = 4, /*!< Duplicate timestamps passed 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_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 */
|
||||
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-4
|
||||
*
|
||||
* 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 Heating temperature [degrees Celsius] */
|
||||
uint16_t heating_duration; /*!< @brief Heating duration [ms] */
|
||||
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] */
|
||||
} bsec_bme_settings_t;
|
||||
|
||||
/* internal defines and backward compatibility */
|
||||
#define BSEC_STRUCT_NAME Bsec /*!< Internal struct name */
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,564 @@
|
||||
/*
|
||||
* Copyright (C) 2015, 2016, 2017 Robert Bosch. All Rights Reserved.
|
||||
*
|
||||
* 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 purchasers 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 BME680 API and example codes |
|
||||
* | Read results from sensor | See BME680 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_ESTIMATE;
|
||||
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 * const requested_virtual_sensors,
|
||||
const 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_ESTIMATE:
|
||||
// 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 * const inputs, const 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_ESTIMATE);
|
||||
|
||||
\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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_settings,
|
||||
const uint32_t n_serialized_settings, uint8_t * work_buffer,
|
||||
const 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_PROPERTY_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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_PROPERTY_BLOB_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 * const serialized_state, const uint32_t n_serialized_state,
|
||||
uint8_t * work_buffer, const 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_PROPERTY_BLOB_SIZE];
|
||||
uint32_t n_work_buffer = BSEC_MAX_PROPERTY_BLOB_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(const uint8_t config_id, uint8_t * serialized_settings, const uint32_t n_serialized_settings_max,
|
||||
uint8_t * work_buffer, const 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_STATE_BLOB_SIZE];
|
||||
uint32_t n_work_buffer_size = BSEC_MAX_STATE_BLOB_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(const uint8_t state_set_id, uint8_t * serialized_state,
|
||||
const uint32_t n_serialized_state_max, uint8_t * work_buffer, const 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(const int64_t time_stamp, bsec_bme_settings_t *sensor_settings);
|
||||
|
||||
/*@}*/ //BSEC Interface
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __BSEC_INTERFACE_H__ */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user