diff --git a/card10-cross.ini b/card10-cross.ini index ca8d05402ad57e3585656580a40b26748ede7e8d..5e5e68ac1db65f81ea5b646c18ff49b83267efaa 100644 --- a/card10-cross.ini +++ b/card10-cross.ini @@ -6,7 +6,7 @@ strip = 'arm-none-eabi-strip' [properties] c_args = ['-mthumb', '-mcpu=cortex-m4', '-mfloat-abi=hard', '-mfpu=fpv4-sp-d16', '-Wa,-mimplicit-it=thumb', '-ffunction-sections', '-fdata-sections', '-fsingle-precision-constant', '-fno-isolate-erroneous-paths-dereference'] -c_link_args = ['-mthumb', '-mcpu=cortex-m4', '-mfloat-abi=hard', '-mfpu=fpv4-sp-d16', '-Wl,--start-group', '-lc', '-lnosys', '-Wl,--end-group', '--specs=nano.specs'] +c_link_args = ['-mthumb', '-mcpu=cortex-m4', '-mfloat-abi=hard', '-mfpu=fpv4-sp-d16', '-Wl,--start-group', '-lc', '-lnosys', '-Wl,--end-group', '--specs=nano.specs', '../lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a'] target_defs = ['-DTARGET=32665', '-DTARGET_REV=0x4131', '-DBOARD_CARD10=1'] diff --git a/epicardium/main.c b/epicardium/main.c index c90d008248e0562c184701099be9ff59d7639b60..4f42d372b1384b5e2bf38c9a356033eee1cb6094 100644 --- a/epicardium/main.c +++ b/epicardium/main.c @@ -87,6 +87,18 @@ int main(void) abort(); } + /* BSEC */ + if (xTaskCreate( + vBSECTask, + (const char *)"BSEC", + configMINIMAL_STACK_SIZE * 4, + NULL, + tskIDLE_PRIORITY + 1, + NULL) != pdPASS) { + LOG_CRIT("startup", "Failed to create %s task!", "BSEC"); + abort(); + } + /* API */ if (xTaskCreate( vApiDispatcher, diff --git a/epicardium/meson.build b/epicardium/meson.build index c5dc701d6164c79246e9a6aa8bc761c01626b32e..8fc1c81738163fe2b908b2bb337d444bce547189 100644 --- a/epicardium/meson.build +++ b/epicardium/meson.build @@ -75,7 +75,7 @@ elf = executable( 'support.c', module_sources, l0der_sources, - dependencies: [libcard10, max32665_startup_core0, maxusb, libff13], + dependencies: [libcard10, max32665_startup_core0, maxusb, libff13, bsec], link_with: [api_dispatcher_lib, freertos], link_whole: [max32665_startup_core0_lib, board_card10_lib, newlib_heap_lib], include_directories: [freertos_includes], diff --git a/epicardium/modules/bsec.c b/epicardium/modules/bsec.c new file mode 100644 index 0000000000000000000000000000000000000000..f14ad83237eae631c68822261423bc3ae3120c43 --- /dev/null +++ b/epicardium/modules/bsec.c @@ -0,0 +1,245 @@ +/* Adapted from bsec_iot_example.c and bsec_iot_ulp_plus_example.c */ + +#include "card10.h" +#include "bosch.h" + +#include "epicardium.h" +#include "modules.h" +#include "modules/log.h" + +#include "FreeRTOS.h" +#include "task.h" + +#include "max32665.h" +#include "gcr_regs.h" +#include <stdio.h> + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ +/* card10: ULP example specific: */ +/* BSEC configuration files are available in the config/ folder of the release package. Please chose a configuration file with 3s maximum time between `bsec_sensor_control()` calls */ +#include "bsec_integration.h" + +/**********************************************************************************************************************/ +/* functions */ +/**********************************************************************************************************************/ + +/*! + * @brief Capture the system time in microseconds + * + * @return system_current_time current system timestamp in microseconds + */ +int64_t get_timestamp_us() +{ + int tick = xTaskGetTickCount(); + return tick * 1000; +} + +/*! + * @brief Handling of the ready outputs + * + * @param[in] timestamp time in nanoseconds + * @param[in] iaq IAQ signal + * @param[in] iaq_accuracy accuracy of IAQ signal + * @param[in] temperature temperature signal + * @param[in] humidity humidity signal + * @param[in] pressure pressure signal + * @param[in] raw_temperature raw temperature signal + * @param[in] raw_humidity raw humidity signal + * @param[in] gas raw gas sensor signal + * @param[in] bsec_status value returned by the bsec_do_steps() call + * + * @return none + */ +void output_ready(int64_t timestamp, float iaq, uint8_t iaq_accuracy, float temperature, float humidity, + float pressure, float raw_temperature, float raw_humidity, float gas, bsec_library_return_t bsec_status, + float static_iaq, float co2_equivalent, float breath_voc_equivalent) +{ + return; + printf("bosch data time: %u, iaq: %u, iaq_a: %u, temp10: %u, hum10: %u, pres: %u, raw_temp10: %u, raw_hum10: %u, gas: %u, static_iaq: %u, co21e6: %u, breath_voc1e6: %u\n", + (unsigned int)(timestamp / 9e6), + (unsigned int)(iaq), + (unsigned int)(iaq_accuracy), + (unsigned int)(temperature * 10), + (unsigned int)(humidity * 10), + (unsigned int)(pressure), + (unsigned int)(raw_temperature * 10), + (unsigned int)(raw_humidity * 10), + (unsigned int)(gas), + (unsigned int)(static_iaq), + (unsigned int)(co2_equivalent * 1e6), + (unsigned int)(breath_voc_equivalent * 1e6) + ); +} + +static int bsec_load(char *path, uint8_t *buffer, uint32_t n_buffer) +{ + uint32_t len = 0; + int fd, res; + + printf("BSEC load %s %d\n", path, (int)n_buffer); + + if ((fd = epic_file_open(path, "r")) < 0) { + printf("Open failed\n"); + return 0; + } + + uint32_t header; + if ((res = epic_file_read(fd, &header, sizeof(header))) != sizeof(header)) { + printf("Header failed\n"); + goto done; + } + + if(header > n_buffer) { + printf("Too large\n"); + goto done; + } + + if (epic_file_read(fd, buffer, header) != header) { + printf("Read failed\n"); + goto done; + } + + len = header; + + printf("Success\n"); + done: + epic_file_close(fd); + return len; +} +/*! + * @brief Load previous library state from non-volatile memory + * + * @param[in,out] state_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to state_buffer + */ +uint32_t state_load(uint8_t *state_buffer, uint32_t n_buffer) +{ + return bsec_load("bsec_iaq.state", state_buffer, n_buffer); +} + +/*! + * @brief Save library state to non-volatile memory + * + * @param[in] state_buffer buffer holding the state to be stored + * @param[in] length length of the state string to be stored + * + * @return none + */ +void state_save(const uint8_t *state_buffer, uint32_t length) +{ + int fd, res; + + printf("BSEC state_save %d\n", (int)length); + + if ((fd = epic_file_open("bsec_iaq.state", "w")) < 0) { + printf("Open failed\n"); + return; + } + + uint32_t header = length; + if ((res = epic_file_write(fd, &header, sizeof(header))) != sizeof(header)) { + printf("Header failed\n"); + goto done; + } + + if (epic_file_write(fd, state_buffer, header) != header) { + printf("Write failed\n"); + goto done; + } + + printf("Success\n"); + done: + epic_file_close(fd); +} + +/*! + * @brief Load library config from non-volatile memory + * + * @param[in,out] config_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to config_buffer + */ +uint32_t config_load(uint8_t *config_buffer, uint32_t n_buffer) +{ + return bsec_load("bsec_iaq.config", config_buffer, n_buffer); +} + +#if 0 +/* card10: ULP example specific: */ +// Attach a button (or other) interrupt here to the ulp_plus_button_press() handler function to +// enable this interrupt to trigger a ULP plus + +/*! + * @brief Interrupt handler for press of a ULP plus button + * + * @return none + */ +void ulp_plus_button_press() +{ + /* We call bsec_update_subscription() in order to instruct BSEC to perform an extra measurement at the next + * possible time slot + */ + + bsec_sensor_configuration_t requested_virtual_sensors[1]; + uint8_t n_requested_virtual_sensors = 1; + bsec_sensor_configuration_t required_sensor_settings[BSEC_MAX_PHYSICAL_SENSOR]; + uint8_t n_required_sensor_settings = BSEC_MAX_PHYSICAL_SENSOR; + bsec_library_return_t status = BSEC_OK; + + /* To trigger a ULP plus, we request the IAQ virtual sensor with a specific sample rate code */ + requested_virtual_sensors[0].sensor_id = BSEC_OUTPUT_IAQ; + requested_virtual_sensors[0].sample_rate = BSEC_SAMPLE_RATE_ULP_MEASUREMENT_ON_DEMAND; + + /* Call bsec_update_subscription() to enable/disable the requested virtual sensors */ + status = bsec_update_subscription(requested_virtual_sensors, n_requested_virtual_sensors, required_sensor_settings, + &n_required_sensor_settings); + + /* The status code would tell is if the request was accepted. It will be rejected if the sensor is not already in + * ULP mode, or if the time difference between requests is too short, for example. */ +} +#endif + +/*! + * @brief Main function which configures BSEC library and then reads and processes the data from sensor based + * on timer ticks + * + * @return result of the processing + */ +void vBSECTask(void *pvParameters) +{ + return_values_init ret; + /* Call to the function which initializes the BSEC library */ +#if 0 + /* Switch on ultra_low-power mode and provide no temperature offset */ + ret = bsec_iot_init(BSEC_SAMPLE_RATE_ULP, 0.0f, card10_bosch_i2c_write, card10_bosch_i2c_read, card10_bosch_delay, state_load, config_load); +#else + ret = bsec_iot_init(BSEC_SAMPLE_RATE_LP, 0.0f, card10_bosch_i2c_write, card10_bosch_i2c_read, card10_bosch_delay, state_load, config_load); +#endif + if (ret.bme680_status) + { + /* Could not intialize BME680 or BSEC library */ + while(1); + } + else if (ret.bsec_status) + { + /* Could not intialize BSEC library */ + while(1); + } + /* Call to endless loop function which reads and processes data based on sensor settings */ +#if 0 + /* State is saved every 10.000 samples, which means every 100 * 300 secs = 500 minutes */ + bsec_iot_loop(sleep, get_timestamp_us, output_ready, state_save, 100); +#else + /* State is saved every 10.000 samples, which means every 10.000 * 3 secs = 500 minutes */ + //bsec_iot_loop(card10_bosch_delay, get_timestamp_us, output_ready, state_save, 10000); + + /* State is saved every 100 samples, which means every 1200 * 3 secs = 60 minutes */ + bsec_iot_loop(card10_bosch_delay, get_timestamp_us, output_ready, state_save, 1200); +#endif + while(1); +} diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build index 113e3cb8ecaebc932a65ce9e6124cc2ff3be60ce..3ef274ad30a7214f1db079b5511f27acb9445ac0 100644 --- a/epicardium/modules/meson.build +++ b/epicardium/modules/meson.build @@ -9,5 +9,6 @@ module_sources = files( 'stream.c', 'vibra.c', 'light_sensor.c', - 'rtc.c' + 'rtc.c', + 'bsec.c' ) diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index e273146fdd0d97bae3cfbfad3de3b5a510fa4a53..32b2924a1f60d708adb77da33e839d934a543d6c 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -21,6 +21,8 @@ void vSerialTask(void *pvParameters); #define PMIC_PRESS_POWEROFF 40 void vPmicTask(void *pvParameters); +void vBSECTask(void *pvParameters); + // Forces an unlock of the display. Only to be used in epicardium void disp_forcelock(); diff --git a/lib/meson.build b/lib/meson.build index e43c62dbd5ab9b144d6189318973f4db212cb9eb..3c280bc625bd271d141c3a0f95accff1e0ee5c92 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -2,6 +2,7 @@ subdir('./sdk/') subdir('./vendor/Bosch/BHy1/') subdir('./vendor/Bosch/BME680/') +subdir('./vendor/Bosch/BSEC/') subdir('./vendor/Bosch/BMA400/') subdir('./vendor/Maxim/MAX77650/') subdir('./vendor/Maxim/MAX86150/') diff --git a/lib/vendor/Bosch/BSEC/API/LICENSE b/lib/vendor/Bosch/BSEC/API/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..ab7a8c8b24296b6528a060a50c4d13ad659a2bb3 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/API/LICENSE @@ -0,0 +1,39 @@ +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. \ No newline at end of file diff --git a/lib/vendor/Bosch/BSEC/API/README.md b/lib/vendor/Bosch/BSEC/API/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7f3f2506268b14716085921788eac54f2c9ca5d5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/API/README.md @@ -0,0 +1,282 @@ +# 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.9 | 19 Jun 2018 +bme680.h | 3.5.9 | 19 Jun 2018 +bme680_defs.h | 3.5.9 | 19 Jun 2018 + +## 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; + /* amb_temp can be set to 25 prior to configuring the gas sensor + * or by performing a few temperature readings without operating the gas sensor. + */ + gas_sensor.amb_temp = 25; + + 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; + /* amb_temp can be set to 25 prior to configuring the gas sensor + * or by performing a few temperature readings without operating the gas sensor. + */ + gas_sensor.amb_temp = 25; + + + int8_t rslt = BME680_OK; + rslt = bme680_init(&gas_sensor); +``` + +Regarding compensation functions for temperature, pressure, humidity and gas we have two implementations. + + - Integer version + - floating point version + +By default, Integer version is used in the API + +If the user needs the floating point version, the user has to un-comment BME680_FLOAT_POINT_COMPENSATION macro +in bme680_defs.h file or to add it in the compiler flags. + +### 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); + + +``` + +### Reading sensor data + +#### Example for reading all sensor data + +``` c + /* 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); + + struct bme680_field_data data; + + while(1) + { + user_delay_ms(meas_period); /* Delay till the measurement is ready */ + + 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_GASM_VALID_MSK) + printf(", G: %d ohms", data.gas_resistance); + + printf("\r\n"); + + /* Trigger the next measurement if you would like to read data out continuously */ + if (gas_sensor.power_mode == BME680_FORCED_MODE) { + rslt = bme680_set_sensor_mode(&gas_sensor); + } + } +``` + +### 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 \ No newline at end of file diff --git a/lib/vendor/Bosch/BSEC/API/bme680.c b/lib/vendor/Bosch/BSEC/API/bme680.c new file mode 100644 index 0000000000000000000000000000000000000000..ccd1bf89907c8931f7b2dbc7cf2bf401a8c6d8ee --- /dev/null +++ b/lib/vendor/Bosch/BSEC/API/bme680.c @@ -0,0 +1,1367 @@ +/**\mainpage + * 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.c + * @date 19 Jun 2018 + * @version 3.5.9 + * + */ + +/*! @file bme680.c + @brief Sensor driver for BME680 sensor */ +#include "bme680.h" + +/*! + * @brief This internal API is used to read the calibrated data from the sensor. + * + * This function is used to retrieve the calibration + * data from the image registers of the sensor. + * + * @note Registers 89h to A1h for calibration data 1 to 24 + * from bit 0 to 7 + * @note Registers E1h to F0h for calibration data 25 to 40 + * from bit 0 to 7 + * @param[in] dev :Structure instance of bme680_dev. + * + * @return Result of API execution status. + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static int8_t get_calib_data(struct bme680_dev *dev); + +/*! + * @brief This internal API is used to set the gas configuration 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 + */ +static int8_t set_gas_config(struct bme680_dev *dev); + +/*! + * @brief This internal API is used to get the gas configuration of the sensor. + * @note heatr_temp and heatr_dur values are currently register data + * and not the actual values set + * + * @param[in] dev :Structure instance of bme680_dev. + * + * @return Result of API execution status. + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static int8_t get_gas_config(struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the Heat duration value. + * + * @param[in] dur :Value of the duration to be shared. + * + * @return uint8_t threshold duration after calculation. + */ +static uint8_t calc_heater_dur(uint16_t dur); + +#ifndef BME680_FLOAT_POINT_COMPENSATION + +/*! + * @brief This internal API is used to calculate the temperature value. + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] temp_adc :Contains the temperature ADC value . + * + * @return uint32_t calculated temperature. + */ +static int16_t calc_temperature(uint32_t temp_adc, struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the pressure value. + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] pres_adc :Contains the pressure ADC value . + * + * @return uint32_t calculated pressure. + */ +static uint32_t calc_pressure(uint32_t pres_adc, const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the humidity value. + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] hum_adc :Contains the humidity ADC value. + * + * @return uint32_t calculated humidity. + */ +static uint32_t calc_humidity(uint16_t hum_adc, const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the Gas Resistance value. + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] gas_res_adc :Contains the Gas Resistance ADC value. + * @param[in] gas_range :Contains the range of gas values. + * + * @return uint32_t calculated gas resistance. + */ +static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the Heat Resistance value. + * + * @param[in] dev : Structure instance of bme680_dev + * @param[in] temp : Contains the target temperature value. + * + * @return uint8_t calculated heater resistance. + */ +static uint8_t calc_heater_res(uint16_t temp, const struct bme680_dev *dev); + +#else +/*! + * @brief This internal API is used to calculate the + * temperature value value in float format + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] temp_adc :Contains the temperature ADC value . + * + * @return Calculated temperature in float + */ +static float calc_temperature(uint32_t temp_adc, struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the + * pressure value value in float format + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] pres_adc :Contains the pressure ADC value . + * + * @return Calculated pressure in float. + */ +static float calc_pressure(uint32_t pres_adc, const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the + * humidity value value in float format + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] hum_adc :Contains the humidity ADC value. + * + * @return Calculated humidity in float. + */ +static float calc_humidity(uint16_t hum_adc, const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the + * gas resistance value value in float format + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] gas_res_adc :Contains the Gas Resistance ADC value. + * @param[in] gas_range :Contains the range of gas values. + * + * @return Calculated gas resistance in float. + */ +static float calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to calculate the + * heater resistance value in float format + * + * @param[in] temp : Contains the target temperature value. + * @param[in] dev : Structure instance of bme680_dev. + * + * @return Calculated heater resistance in float. + */ +static float calc_heater_res(uint16_t temp, const struct bme680_dev *dev); + +#endif + +/*! + * @brief This internal API is used to calculate the field data of sensor. + * + * @param[out] data :Structure instance to hold the data + * @param[in] dev :Structure instance of bme680_dev. + * + * @return int8_t result of the field data from sensor. + */ +static int8_t read_field_data(struct bme680_field_data *data, struct bme680_dev *dev); + +/*! + * @brief This internal API is used to set the memory page + * based on register address. + * + * The value of memory page + * value | Description + * --------|-------------- + * 0 | BME680_PAGE0_SPI + * 1 | BME680_PAGE1_SPI + * + * @param[in] dev :Structure instance of bme680_dev. + * @param[in] reg_addr :Contains the register address array. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static int8_t set_mem_page(uint8_t reg_addr, struct bme680_dev *dev); + +/*! + * @brief This internal API is used to get the memory page based + * on register address. + * + * The value of memory page + * value | Description + * --------|-------------- + * 0 | BME680_PAGE0_SPI + * 1 | BME680_PAGE1_SPI + * + * @param[in] dev :Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static int8_t get_mem_page(struct bme680_dev *dev); + +/*! + * @brief This internal API is used to validate the device pointer for + * null conditions. + * + * @param[in] dev :Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static int8_t null_ptr_check(const struct bme680_dev *dev); + +/*! + * @brief This internal API is used to check the boundary + * conditions. + * + * @param[in] value :pointer to the value. + * @param[in] min :minimum value. + * @param[in] max :maximum value. + * @param[in] dev :Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static int8_t boundary_check(uint8_t *value, uint8_t min, uint8_t max, struct bme680_dev *dev); + +/****************** Global Function Definitions *******************************/ +/*! + *@brief This API is the entry point. + *It reads the chip-id and calibration data from the sensor. + */ +int8_t bme680_init(struct bme680_dev *dev) +{ + int8_t rslt; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + /* Soft reset to restore it to default values*/ + rslt = bme680_soft_reset(dev); + if (rslt == BME680_OK) { + rslt = bme680_get_regs(BME680_CHIP_ID_ADDR, &dev->chip_id, 1, dev); + if (rslt == BME680_OK) { + if (dev->chip_id == BME680_CHIP_ID) { + /* Get the Calibration data */ + rslt = get_calib_data(dev); + } else { + rslt = BME680_E_DEV_NOT_FOUND; + } + } + } + } + + return rslt; +} + +/*! + * @brief This API reads the data from the given register address of the sensor. + */ +int8_t bme680_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev) +{ + int8_t rslt; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + if (dev->intf == BME680_SPI_INTF) { + /* Set the memory page */ + rslt = set_mem_page(reg_addr, dev); + if (rslt == BME680_OK) + reg_addr = reg_addr | BME680_SPI_RD_MSK; + } + dev->com_rslt = dev->read(dev->dev_id, reg_addr, reg_data, len); + if (dev->com_rslt != 0) + rslt = BME680_E_COM_FAIL; + } + + return rslt; +} + +/*! + * @brief This API writes the given data to the register address + * of the sensor. + */ +int8_t bme680_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev) +{ + int8_t rslt; + /* Length of the temporary buffer is 2*(length of register)*/ + uint8_t tmp_buff[BME680_TMP_BUFFER_LENGTH] = { 0 }; + uint16_t index; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + if ((len > 0) && (len < BME680_TMP_BUFFER_LENGTH / 2)) { + /* Interleave the 2 arrays */ + for (index = 0; index < len; index++) { + if (dev->intf == BME680_SPI_INTF) { + /* Set the memory page */ + rslt = set_mem_page(reg_addr[index], dev); + tmp_buff[(2 * index)] = reg_addr[index] & BME680_SPI_WR_MSK; + } else { + tmp_buff[(2 * index)] = reg_addr[index]; + } + tmp_buff[(2 * index) + 1] = reg_data[index]; + } + /* Write the interleaved array */ + if (rslt == BME680_OK) { + dev->com_rslt = dev->write(dev->dev_id, tmp_buff[0], &tmp_buff[1], (2 * len) - 1); + if (dev->com_rslt != 0) + rslt = BME680_E_COM_FAIL; + } + } else { + rslt = BME680_E_INVALID_LENGTH; + } + } + + return rslt; +} + +/*! + * @brief This API performs the soft reset of the sensor. + */ +int8_t bme680_soft_reset(struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t reg_addr = BME680_SOFT_RESET_ADDR; + /* 0xb6 is the soft reset command */ + uint8_t soft_rst_cmd = BME680_SOFT_RESET_CMD; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + if (dev->intf == BME680_SPI_INTF) + rslt = get_mem_page(dev); + + /* Reset the device */ + if (rslt == BME680_OK) { + rslt = bme680_set_regs(®_addr, &soft_rst_cmd, 1, dev); + /* Wait for 5ms */ + dev->delay_ms(BME680_RESET_PERIOD); + + if (rslt == BME680_OK) { + /* After reset get the memory page */ + if (dev->intf == BME680_SPI_INTF) + rslt = get_mem_page(dev); + } + } + } + + return rslt; +} + +/*! + * @brief This API is used to set the oversampling, filter and T,P,H, gas selection + * settings in the sensor. + */ +int8_t bme680_set_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t reg_addr; + uint8_t data = 0; + uint8_t count = 0; + uint8_t reg_array[BME680_REG_BUFFER_LENGTH] = { 0 }; + uint8_t data_array[BME680_REG_BUFFER_LENGTH] = { 0 }; + uint8_t intended_power_mode = dev->power_mode; /* Save intended power mode */ + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + if (desired_settings & BME680_GAS_MEAS_SEL) + rslt = set_gas_config(dev); + + dev->power_mode = BME680_SLEEP_MODE; + if (rslt == BME680_OK) + rslt = bme680_set_sensor_mode(dev); + + /* Selecting the filter */ + if (desired_settings & BME680_FILTER_SEL) { + rslt = boundary_check(&dev->tph_sett.filter, BME680_FILTER_SIZE_0, BME680_FILTER_SIZE_127, dev); + reg_addr = BME680_CONF_ODR_FILT_ADDR; + + if (rslt == BME680_OK) + rslt = bme680_get_regs(reg_addr, &data, 1, dev); + + if (desired_settings & BME680_FILTER_SEL) + data = BME680_SET_BITS(data, BME680_FILTER, dev->tph_sett.filter); + + reg_array[count] = reg_addr; /* Append configuration */ + data_array[count] = data; + count++; + } + + /* Selecting heater control for the sensor */ + if (desired_settings & BME680_HCNTRL_SEL) { + rslt = boundary_check(&dev->gas_sett.heatr_ctrl, BME680_ENABLE_HEATER, + BME680_DISABLE_HEATER, dev); + reg_addr = BME680_CONF_HEAT_CTRL_ADDR; + + if (rslt == BME680_OK) + rslt = bme680_get_regs(reg_addr, &data, 1, dev); + data = BME680_SET_BITS_POS_0(data, BME680_HCTRL, dev->gas_sett.heatr_ctrl); + + reg_array[count] = reg_addr; /* Append configuration */ + data_array[count] = data; + count++; + } + + /* Selecting heater T,P oversampling for the sensor */ + if (desired_settings & (BME680_OST_SEL | BME680_OSP_SEL)) { + rslt = boundary_check(&dev->tph_sett.os_temp, BME680_OS_NONE, BME680_OS_16X, dev); + reg_addr = BME680_CONF_T_P_MODE_ADDR; + + if (rslt == BME680_OK) + rslt = bme680_get_regs(reg_addr, &data, 1, dev); + + if (desired_settings & BME680_OST_SEL) + data = BME680_SET_BITS(data, BME680_OST, dev->tph_sett.os_temp); + + if (desired_settings & BME680_OSP_SEL) + data = BME680_SET_BITS(data, BME680_OSP, dev->tph_sett.os_pres); + + reg_array[count] = reg_addr; + data_array[count] = data; + count++; + } + + /* Selecting humidity oversampling for the sensor */ + if (desired_settings & BME680_OSH_SEL) { + rslt = boundary_check(&dev->tph_sett.os_hum, BME680_OS_NONE, BME680_OS_16X, dev); + reg_addr = BME680_CONF_OS_H_ADDR; + + if (rslt == BME680_OK) + rslt = bme680_get_regs(reg_addr, &data, 1, dev); + data = BME680_SET_BITS_POS_0(data, BME680_OSH, dev->tph_sett.os_hum); + + reg_array[count] = reg_addr; /* Append configuration */ + data_array[count] = data; + count++; + } + + /* Selecting the runGas and NB conversion settings for the sensor */ + if (desired_settings & (BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)) { + rslt = boundary_check(&dev->gas_sett.run_gas, BME680_RUN_GAS_DISABLE, + BME680_RUN_GAS_ENABLE, dev); + if (rslt == BME680_OK) { + /* Validate boundary conditions */ + rslt = boundary_check(&dev->gas_sett.nb_conv, BME680_NBCONV_MIN, + BME680_NBCONV_MAX, dev); + } + + reg_addr = BME680_CONF_ODR_RUN_GAS_NBC_ADDR; + + if (rslt == BME680_OK) + rslt = bme680_get_regs(reg_addr, &data, 1, dev); + + if (desired_settings & BME680_RUN_GAS_SEL) + data = BME680_SET_BITS(data, BME680_RUN_GAS, dev->gas_sett.run_gas); + + if (desired_settings & BME680_NBCONV_SEL) + data = BME680_SET_BITS_POS_0(data, BME680_NBCONV, dev->gas_sett.nb_conv); + + reg_array[count] = reg_addr; /* Append configuration */ + data_array[count] = data; + count++; + } + + if (rslt == BME680_OK) + rslt = bme680_set_regs(reg_array, data_array, count, dev); + + /* Restore previous intended power mode */ + dev->power_mode = intended_power_mode; + } + + return rslt; +} + +/*! + * @brief This API is used to get the oversampling, filter and T,P,H, gas selection + * settings in the sensor. + */ +int8_t bme680_get_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev) +{ + int8_t rslt; + /* starting address of the register array for burst read*/ + uint8_t reg_addr = BME680_CONF_HEAT_CTRL_ADDR; + uint8_t data_array[BME680_REG_BUFFER_LENGTH] = { 0 }; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + rslt = bme680_get_regs(reg_addr, data_array, BME680_REG_BUFFER_LENGTH, dev); + + if (rslt == BME680_OK) { + if (desired_settings & BME680_GAS_MEAS_SEL) + rslt = get_gas_config(dev); + + /* get the T,P,H ,Filter,ODR settings here */ + if (desired_settings & BME680_FILTER_SEL) + dev->tph_sett.filter = BME680_GET_BITS(data_array[BME680_REG_FILTER_INDEX], + BME680_FILTER); + + if (desired_settings & (BME680_OST_SEL | BME680_OSP_SEL)) { + dev->tph_sett.os_temp = BME680_GET_BITS(data_array[BME680_REG_TEMP_INDEX], BME680_OST); + dev->tph_sett.os_pres = BME680_GET_BITS(data_array[BME680_REG_PRES_INDEX], BME680_OSP); + } + + if (desired_settings & BME680_OSH_SEL) + dev->tph_sett.os_hum = BME680_GET_BITS_POS_0(data_array[BME680_REG_HUM_INDEX], + BME680_OSH); + + /* get the gas related settings */ + if (desired_settings & BME680_HCNTRL_SEL) + dev->gas_sett.heatr_ctrl = BME680_GET_BITS_POS_0(data_array[BME680_REG_HCTRL_INDEX], + BME680_HCTRL); + + if (desired_settings & (BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)) { + dev->gas_sett.nb_conv = BME680_GET_BITS_POS_0(data_array[BME680_REG_NBCONV_INDEX], + BME680_NBCONV); + dev->gas_sett.run_gas = BME680_GET_BITS(data_array[BME680_REG_RUN_GAS_INDEX], + BME680_RUN_GAS); + } + } + } else { + rslt = BME680_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This API is used to set the power mode of the sensor. + */ +int8_t bme680_set_sensor_mode(struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t tmp_pow_mode; + uint8_t pow_mode = 0; + uint8_t reg_addr = BME680_CONF_T_P_MODE_ADDR; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + /* Call repeatedly until in sleep */ + do { + rslt = bme680_get_regs(BME680_CONF_T_P_MODE_ADDR, &tmp_pow_mode, 1, dev); + if (rslt == BME680_OK) { + /* Put to sleep before changing mode */ + pow_mode = (tmp_pow_mode & BME680_MODE_MSK); + + if (pow_mode != BME680_SLEEP_MODE) { + tmp_pow_mode = tmp_pow_mode & (~BME680_MODE_MSK); /* Set to sleep */ + rslt = bme680_set_regs(®_addr, &tmp_pow_mode, 1, dev); + dev->delay_ms(BME680_POLL_PERIOD_MS); + } + } + } while (pow_mode != BME680_SLEEP_MODE); + + /* Already in sleep */ + if (dev->power_mode != BME680_SLEEP_MODE) { + tmp_pow_mode = (tmp_pow_mode & ~BME680_MODE_MSK) | (dev->power_mode & BME680_MODE_MSK); + if (rslt == BME680_OK) + rslt = bme680_set_regs(®_addr, &tmp_pow_mode, 1, dev); + } + } + + return rslt; +} + +/*! + * @brief This API is used to get the power mode of the sensor. + */ +int8_t bme680_get_sensor_mode(struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t mode; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + rslt = bme680_get_regs(BME680_CONF_T_P_MODE_ADDR, &mode, 1, dev); + /* Masking the other register bit info*/ + dev->power_mode = mode & BME680_MODE_MSK; + } + + return rslt; +} + +/*! + * @brief This API is used to set the profile duration of the sensor. + */ +void bme680_set_profile_dur(uint16_t duration, struct bme680_dev *dev) +{ + uint32_t tph_dur; /* Calculate in us */ + uint32_t meas_cycles; + uint8_t os_to_meas_cycles[6] = {0, 1, 2, 4, 8, 16}; + + meas_cycles = os_to_meas_cycles[dev->tph_sett.os_temp]; + meas_cycles += os_to_meas_cycles[dev->tph_sett.os_pres]; + meas_cycles += os_to_meas_cycles[dev->tph_sett.os_hum]; + + /* TPH measurement duration */ + tph_dur = meas_cycles * UINT32_C(1963); + tph_dur += UINT32_C(477 * 4); /* TPH switching duration */ + tph_dur += UINT32_C(477 * 5); /* Gas measurement duration */ + tph_dur += UINT32_C(500); /* Get it to the closest whole number.*/ + tph_dur /= UINT32_C(1000); /* Convert to ms */ + + tph_dur += UINT32_C(1); /* Wake up duration of 1ms */ + /* The remaining time should be used for heating */ + dev->gas_sett.heatr_dur = duration - (uint16_t) tph_dur; +} + +/*! + * @brief This API is used to get the profile duration of the sensor. + */ +void bme680_get_profile_dur(uint16_t *duration, const struct bme680_dev *dev) +{ + uint32_t tph_dur; /* Calculate in us */ + uint32_t meas_cycles; + uint8_t os_to_meas_cycles[6] = {0, 1, 2, 4, 8, 16}; + + meas_cycles = os_to_meas_cycles[dev->tph_sett.os_temp]; + meas_cycles += os_to_meas_cycles[dev->tph_sett.os_pres]; + meas_cycles += os_to_meas_cycles[dev->tph_sett.os_hum]; + + /* TPH measurement duration */ + tph_dur = meas_cycles * UINT32_C(1963); + tph_dur += UINT32_C(477 * 4); /* TPH switching duration */ + tph_dur += UINT32_C(477 * 5); /* Gas measurement duration */ + tph_dur += UINT32_C(500); /* Get it to the closest whole number.*/ + tph_dur /= UINT32_C(1000); /* Convert to ms */ + + tph_dur += UINT32_C(1); /* Wake up duration of 1ms */ + + *duration = (uint16_t) tph_dur; + + /* Get the gas duration only when the run gas is enabled */ + if (dev->gas_sett.run_gas) { + /* The remaining time should be used for heating */ + *duration += dev->gas_sett.heatr_dur; + } +} + +/*! + * @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. + */ +int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct bme680_dev *dev) +{ + int8_t rslt; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + /* Reading the sensor data in forced mode only */ + rslt = read_field_data(data, dev); + if (rslt == BME680_OK) { + if (data->status & BME680_NEW_DATA_MSK) + dev->new_fields = 1; + else + dev->new_fields = 0; + } + } + + return rslt; +} + +/*! + * @brief This internal API is used to read the calibrated data from the sensor. + */ +static int8_t get_calib_data(struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t coeff_array[BME680_COEFF_SIZE] = { 0 }; + uint8_t temp_var = 0; /* Temporary variable */ + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + rslt = bme680_get_regs(BME680_COEFF_ADDR1, coeff_array, BME680_COEFF_ADDR1_LEN, dev); + /* Append the second half in the same array */ + if (rslt == BME680_OK) + rslt = bme680_get_regs(BME680_COEFF_ADDR2, &coeff_array[BME680_COEFF_ADDR1_LEN] + , BME680_COEFF_ADDR2_LEN, dev); + + /* Temperature related coefficients */ + dev->calib.par_t1 = (uint16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_T1_MSB_REG], + coeff_array[BME680_T1_LSB_REG])); + dev->calib.par_t2 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_T2_MSB_REG], + coeff_array[BME680_T2_LSB_REG])); + dev->calib.par_t3 = (int8_t) (coeff_array[BME680_T3_REG]); + + /* Pressure related coefficients */ + dev->calib.par_p1 = (uint16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_P1_MSB_REG], + coeff_array[BME680_P1_LSB_REG])); + dev->calib.par_p2 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_P2_MSB_REG], + coeff_array[BME680_P2_LSB_REG])); + dev->calib.par_p3 = (int8_t) coeff_array[BME680_P3_REG]; + dev->calib.par_p4 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_P4_MSB_REG], + coeff_array[BME680_P4_LSB_REG])); + dev->calib.par_p5 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_P5_MSB_REG], + coeff_array[BME680_P5_LSB_REG])); + dev->calib.par_p6 = (int8_t) (coeff_array[BME680_P6_REG]); + dev->calib.par_p7 = (int8_t) (coeff_array[BME680_P7_REG]); + dev->calib.par_p8 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_P8_MSB_REG], + coeff_array[BME680_P8_LSB_REG])); + dev->calib.par_p9 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_P9_MSB_REG], + coeff_array[BME680_P9_LSB_REG])); + dev->calib.par_p10 = (uint8_t) (coeff_array[BME680_P10_REG]); + + /* Humidity related coefficients */ + dev->calib.par_h1 = (uint16_t) (((uint16_t) coeff_array[BME680_H1_MSB_REG] << BME680_HUM_REG_SHIFT_VAL) + | (coeff_array[BME680_H1_LSB_REG] & BME680_BIT_H1_DATA_MSK)); + dev->calib.par_h2 = (uint16_t) (((uint16_t) coeff_array[BME680_H2_MSB_REG] << BME680_HUM_REG_SHIFT_VAL) + | ((coeff_array[BME680_H2_LSB_REG]) >> BME680_HUM_REG_SHIFT_VAL)); + dev->calib.par_h3 = (int8_t) coeff_array[BME680_H3_REG]; + dev->calib.par_h4 = (int8_t) coeff_array[BME680_H4_REG]; + dev->calib.par_h5 = (int8_t) coeff_array[BME680_H5_REG]; + dev->calib.par_h6 = (uint8_t) coeff_array[BME680_H6_REG]; + dev->calib.par_h7 = (int8_t) coeff_array[BME680_H7_REG]; + + /* Gas heater related coefficients */ + dev->calib.par_gh1 = (int8_t) coeff_array[BME680_GH1_REG]; + dev->calib.par_gh2 = (int16_t) (BME680_CONCAT_BYTES(coeff_array[BME680_GH2_MSB_REG], + coeff_array[BME680_GH2_LSB_REG])); + dev->calib.par_gh3 = (int8_t) coeff_array[BME680_GH3_REG]; + + /* Other coefficients */ + if (rslt == BME680_OK) { + rslt = bme680_get_regs(BME680_ADDR_RES_HEAT_RANGE_ADDR, &temp_var, 1, dev); + + dev->calib.res_heat_range = ((temp_var & BME680_RHRANGE_MSK) / 16); + if (rslt == BME680_OK) { + rslt = bme680_get_regs(BME680_ADDR_RES_HEAT_VAL_ADDR, &temp_var, 1, dev); + + dev->calib.res_heat_val = (int8_t) temp_var; + if (rslt == BME680_OK) + rslt = bme680_get_regs(BME680_ADDR_RANGE_SW_ERR_ADDR, &temp_var, 1, dev); + } + } + dev->calib.range_sw_err = ((int8_t) temp_var & (int8_t) BME680_RSERROR_MSK) / 16; + } + + return rslt; +} + +/*! + * @brief This internal API is used to set the gas configuration of the sensor. + */ +static int8_t set_gas_config(struct bme680_dev *dev) +{ + int8_t rslt; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + + uint8_t reg_addr[2] = {0}; + uint8_t reg_data[2] = {0}; + + if (dev->power_mode == BME680_FORCED_MODE) { + reg_addr[0] = BME680_RES_HEAT0_ADDR; + reg_data[0] = calc_heater_res(dev->gas_sett.heatr_temp, dev); + reg_addr[1] = BME680_GAS_WAIT0_ADDR; + reg_data[1] = calc_heater_dur(dev->gas_sett.heatr_dur); + dev->gas_sett.nb_conv = 0; + } else { + rslt = BME680_W_DEFINE_PWR_MODE; + } + if (rslt == BME680_OK) + rslt = bme680_set_regs(reg_addr, reg_data, 2, dev); + } + + return rslt; +} + +/*! + * @brief This internal API is used to get the gas configuration of the sensor. + * @note heatr_temp and heatr_dur values are currently register data + * and not the actual values set + */ +static int8_t get_gas_config(struct bme680_dev *dev) +{ + int8_t rslt; + /* starting address of the register array for burst read*/ + uint8_t reg_addr1 = BME680_ADDR_SENS_CONF_START; + uint8_t reg_addr2 = BME680_ADDR_GAS_CONF_START; + uint8_t reg_data = 0; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + if (BME680_SPI_INTF == dev->intf) { + /* Memory page switch the SPI address*/ + rslt = set_mem_page(reg_addr1, dev); + } + + if (rslt == BME680_OK) { + rslt = bme680_get_regs(reg_addr1, ®_data, 1, dev); + if (rslt == BME680_OK) { + dev->gas_sett.heatr_temp = reg_data; + rslt = bme680_get_regs(reg_addr2, ®_data, 1, dev); + if (rslt == BME680_OK) { + /* Heating duration register value */ + dev->gas_sett.heatr_dur = reg_data; + } + } + } + } + + return rslt; +} + +#ifndef BME680_FLOAT_POINT_COMPENSATION + +/*! + * @brief This internal API is used to calculate the temperature value. + */ +static int16_t calc_temperature(uint32_t temp_adc, struct bme680_dev *dev) +{ + int64_t var1; + int64_t var2; + int64_t var3; + int16_t calc_temp; + + var1 = ((int32_t) temp_adc >> 3) - ((int32_t) dev->calib.par_t1 << 1); + var2 = (var1 * (int32_t) dev->calib.par_t2) >> 11; + var3 = ((var1 >> 1) * (var1 >> 1)) >> 12; + var3 = ((var3) * ((int32_t) dev->calib.par_t3 << 4)) >> 14; + dev->calib.t_fine = (int32_t) (var2 + var3); + calc_temp = (int16_t) (((dev->calib.t_fine * 5) + 128) >> 8); + + return calc_temp; +} + +/*! + * @brief This internal API is used to calculate the pressure value. + */ +static uint32_t calc_pressure(uint32_t pres_adc, const struct bme680_dev *dev) +{ + int32_t var1; + int32_t var2; + int32_t var3; + int32_t pressure_comp; + + var1 = (((int32_t)dev->calib.t_fine) >> 1) - 64000; + var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * + (int32_t)dev->calib.par_p6) >> 2; + var2 = var2 + ((var1 * (int32_t)dev->calib.par_p5) << 1); + var2 = (var2 >> 2) + ((int32_t)dev->calib.par_p4 << 16); + var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) * + ((int32_t)dev->calib.par_p3 << 5)) >> 3) + + (((int32_t)dev->calib.par_p2 * var1) >> 1); + var1 = var1 >> 18; + var1 = ((32768 + var1) * (int32_t)dev->calib.par_p1) >> 15; + pressure_comp = 1048576 - pres_adc; + pressure_comp = (int32_t)((pressure_comp - (var2 >> 12)) * ((uint32_t)3125)); + if (pressure_comp >= BME680_MAX_OVERFLOW_VAL) + pressure_comp = ((pressure_comp / var1) << 1); + else + pressure_comp = ((pressure_comp << 1) / var1); + var1 = ((int32_t)dev->calib.par_p9 * (int32_t)(((pressure_comp >> 3) * + (pressure_comp >> 3)) >> 13)) >> 12; + var2 = ((int32_t)(pressure_comp >> 2) * + (int32_t)dev->calib.par_p8) >> 13; + var3 = ((int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) * + (int32_t)(pressure_comp >> 8) * + (int32_t)dev->calib.par_p10) >> 17; + + pressure_comp = (int32_t)(pressure_comp) + ((var1 + var2 + var3 + + ((int32_t)dev->calib.par_p7 << 7)) >> 4); + + return (uint32_t)pressure_comp; + +} + +/*! + * @brief This internal API is used to calculate the humidity value. + */ +static uint32_t calc_humidity(uint16_t hum_adc, const struct bme680_dev *dev) +{ + int32_t var1; + int32_t var2; + int32_t var3; + int32_t var4; + int32_t var5; + int32_t var6; + int32_t temp_scaled; + int32_t calc_hum; + + temp_scaled = (((int32_t) dev->calib.t_fine * 5) + 128) >> 8; + var1 = (int32_t) (hum_adc - ((int32_t) ((int32_t) dev->calib.par_h1 * 16))) + - (((temp_scaled * (int32_t) dev->calib.par_h3) / ((int32_t) 100)) >> 1); + var2 = ((int32_t) dev->calib.par_h2 + * (((temp_scaled * (int32_t) dev->calib.par_h4) / ((int32_t) 100)) + + (((temp_scaled * ((temp_scaled * (int32_t) dev->calib.par_h5) / ((int32_t) 100))) >> 6) + / ((int32_t) 100)) + (int32_t) (1 << 14))) >> 10; + var3 = var1 * var2; + var4 = (int32_t) dev->calib.par_h6 << 7; + var4 = ((var4) + ((temp_scaled * (int32_t) dev->calib.par_h7) / ((int32_t) 100))) >> 4; + var5 = ((var3 >> 14) * (var3 >> 14)) >> 10; + var6 = (var4 * var5) >> 1; + calc_hum = (((var3 + var6) >> 10) * ((int32_t) 1000)) >> 12; + + if (calc_hum > 100000) /* Cap at 100%rH */ + calc_hum = 100000; + else if (calc_hum < 0) + calc_hum = 0; + + return (uint32_t) calc_hum; +} + +/*! + * @brief This internal API is used to calculate the Gas Resistance value. + */ +static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev) +{ + int64_t var1; + uint64_t var2; + int64_t var3; + uint32_t calc_gas_res; + /**Look up table 1 for the possible gas range values */ + uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), + UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777), + UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228), + UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2147483647) }; + /**Look up table 2 for the possible gas range values */ + uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000), + UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016), + UINT32_C(8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000), + UINT32_C(250000), UINT32_C(125000) }; + + var1 = (int64_t) ((1340 + (5 * (int64_t) dev->calib.range_sw_err)) * + ((int64_t) lookupTable1[gas_range])) >> 16; + var2 = (((int64_t) ((int64_t) gas_res_adc << 15) - (int64_t) (16777216)) + var1); + var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) >> 9); + calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 >> 1)) / (int64_t) var2); + + return calc_gas_res; +} + +/*! + * @brief This internal API is used to calculate the Heat Resistance value. + */ +static uint8_t calc_heater_res(uint16_t temp, const struct bme680_dev *dev) +{ + uint8_t heatr_res; + int32_t var1; + int32_t var2; + int32_t var3; + int32_t var4; + int32_t var5; + int32_t heatr_res_x100; + + if (temp > 400) /* Cap temperature */ + temp = 400; + + var1 = (((int32_t) dev->amb_temp * dev->calib.par_gh3) / 1000) * 256; + var2 = (dev->calib.par_gh1 + 784) * (((((dev->calib.par_gh2 + 154009) * temp * 5) / 100) + 3276800) / 10); + var3 = var1 + (var2 / 2); + var4 = (var3 / (dev->calib.res_heat_range + 4)); + var5 = (131 * dev->calib.res_heat_val) + 65536; + heatr_res_x100 = (int32_t) (((var4 / var5) - 250) * 34); + heatr_res = (uint8_t) ((heatr_res_x100 + 50) / 100); + + return heatr_res; +} + +#else + + +/*! + * @brief This internal API is used to calculate the + * temperature value in float format + */ +static float calc_temperature(uint32_t temp_adc, struct bme680_dev *dev) +{ + float var1 = 0; + float var2 = 0; + float calc_temp = 0; + + /* calculate var1 data */ + var1 = ((((float)temp_adc / 16384.0f) - ((float)dev->calib.par_t1 / 1024.0f)) + * ((float)dev->calib.par_t2)); + + /* calculate var2 data */ + var2 = (((((float)temp_adc / 131072.0f) - ((float)dev->calib.par_t1 / 8192.0f)) * + (((float)temp_adc / 131072.0f) - ((float)dev->calib.par_t1 / 8192.0f))) * + ((float)dev->calib.par_t3 * 16.0f)); + + /* t_fine value*/ + dev->calib.t_fine = (var1 + var2); + + /* compensated temperature data*/ + calc_temp = ((dev->calib.t_fine) / 5120.0f); + + return calc_temp; +} + +/*! + * @brief This internal API is used to calculate the + * pressure value in float format + */ +static float calc_pressure(uint32_t pres_adc, const struct bme680_dev *dev) +{ + float var1 = 0; + float var2 = 0; + float var3 = 0; + float calc_pres = 0; + + var1 = (((float)dev->calib.t_fine / 2.0f) - 64000.0f); + var2 = var1 * var1 * (((float)dev->calib.par_p6) / (131072.0f)); + var2 = var2 + (var1 * ((float)dev->calib.par_p5) * 2.0f); + var2 = (var2 / 4.0f) + (((float)dev->calib.par_p4) * 65536.0f); + var1 = (((((float)dev->calib.par_p3 * var1 * var1) / 16384.0f) + + ((float)dev->calib.par_p2 * var1)) / 524288.0f); + var1 = ((1.0f + (var1 / 32768.0f)) * ((float)dev->calib.par_p1)); + calc_pres = (1048576.0f - ((float)pres_adc)); + + /* Avoid exception caused by division by zero */ + if ((int)var1 != 0) { + calc_pres = (((calc_pres - (var2 / 4096.0f)) * 6250.0f) / var1); + var1 = (((float)dev->calib.par_p9) * calc_pres * calc_pres) / 2147483648.0f; + var2 = calc_pres * (((float)dev->calib.par_p8) / 32768.0f); + var3 = ((calc_pres / 256.0f) * (calc_pres / 256.0f) * (calc_pres / 256.0f) + * (dev->calib.par_p10 / 131072.0f)); + calc_pres = (calc_pres + (var1 + var2 + var3 + ((float)dev->calib.par_p7 * 128.0f)) / 16.0f); + } else { + calc_pres = 0; + } + + return calc_pres; +} + +/*! + * @brief This internal API is used to calculate the + * humidity value in float format + */ +static float calc_humidity(uint16_t hum_adc, const struct bme680_dev *dev) +{ + float calc_hum = 0; + float var1 = 0; + float var2 = 0; + float var3 = 0; + float var4 = 0; + float temp_comp; + + /* compensated temperature data*/ + temp_comp = ((dev->calib.t_fine) / 5120.0f); + + var1 = (float)((float)hum_adc) - (((float)dev->calib.par_h1 * 16.0f) + (((float)dev->calib.par_h3 / 2.0f) + * temp_comp)); + + var2 = var1 * ((float)(((float) dev->calib.par_h2 / 262144.0f) * (1.0f + (((float)dev->calib.par_h4 / 16384.0f) + * temp_comp) + (((float)dev->calib.par_h5 / 1048576.0f) * temp_comp * temp_comp)))); + + var3 = (float) dev->calib.par_h6 / 16384.0f; + + var4 = (float) dev->calib.par_h7 / 2097152.0f; + + calc_hum = var2 + ((var3 + (var4 * temp_comp)) * var2 * var2); + + if (calc_hum > 100.0f) + calc_hum = 100.0f; + else if (calc_hum < 0.0f) + calc_hum = 0.0f; + + return calc_hum; +} + +/*! + * @brief This internal API is used to calculate the + * gas resistance value in float format + */ +static float calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev) +{ + float calc_gas_res; + float var1 = 0; + float var2 = 0; + float var3 = 0; + + const float lookup_k1_range[16] = { + 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -0.8, + 0.0, 0.0, -0.2, -0.5, 0.0, -1.0, 0.0, 0.0}; + const float lookup_k2_range[16] = { + 0.0, 0.0, 0.0, 0.0, 0.1, 0.7, 0.0, -0.8, + -0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + var1 = (1340.0f + (5.0f * dev->calib.range_sw_err)); + var2 = (var1) * (1.0f + lookup_k1_range[gas_range]/100.0f); + var3 = 1.0f + (lookup_k2_range[gas_range]/100.0f); + + calc_gas_res = 1.0f / (float)(var3 * (0.000000125f) * (float)(1 << gas_range) * (((((float)gas_res_adc) + - 512.0f)/var2) + 1.0f)); + + return calc_gas_res; +} + +/*! + * @brief This internal API is used to calculate the + * heater resistance value in float format + */ +static float calc_heater_res(uint16_t temp, const struct bme680_dev *dev) +{ + float var1 = 0; + float var2 = 0; + float var3 = 0; + float var4 = 0; + float var5 = 0; + float res_heat = 0; + + if (temp > 400) /* Cap temperature */ + temp = 400; + + var1 = (((float)dev->calib.par_gh1 / (16.0f)) + 49.0f); + var2 = ((((float)dev->calib.par_gh2 / (32768.0f)) * (0.0005f)) + 0.00235f); + var3 = ((float)dev->calib.par_gh3 / (1024.0f)); + var4 = (var1 * (1.0f + (var2 * (float)temp))); + var5 = (var4 + (var3 * (float)dev->amb_temp)); + res_heat = (uint8_t)(3.4f * ((var5 * (4 / (4 + (float)dev->calib.res_heat_range)) * + (1/(1 + ((float) dev->calib.res_heat_val * 0.002f)))) - 25)); + + return res_heat; +} + +#endif + +/*! + * @brief This internal API is used to calculate the Heat duration value. + */ +static uint8_t calc_heater_dur(uint16_t dur) +{ + uint8_t factor = 0; + uint8_t durval; + + if (dur >= 0xfc0) { + durval = 0xff; /* Max duration*/ + } else { + while (dur > 0x3F) { + dur = dur / 4; + factor += 1; + } + durval = (uint8_t) (dur + (factor * 64)); + } + + return durval; +} + +/*! + * @brief This internal API is used to calculate the field data of sensor. + */ +static int8_t read_field_data(struct bme680_field_data *data, struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t buff[BME680_FIELD_LENGTH] = { 0 }; + uint8_t gas_range; + uint32_t adc_temp; + uint32_t adc_pres; + uint16_t adc_hum; + uint16_t adc_gas_res; + uint8_t tries = 10; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + do { + if (rslt == BME680_OK) { + rslt = bme680_get_regs(((uint8_t) (BME680_FIELD0_ADDR)), buff, (uint16_t) BME680_FIELD_LENGTH, + dev); + + data->status = buff[0] & BME680_NEW_DATA_MSK; + data->gas_index = buff[0] & BME680_GAS_INDEX_MSK; + data->meas_index = buff[1]; + + /* read the raw data from the sensor */ + adc_pres = (uint32_t) (((uint32_t) buff[2] * 4096) | ((uint32_t) buff[3] * 16) + | ((uint32_t) buff[4] / 16)); + adc_temp = (uint32_t) (((uint32_t) buff[5] * 4096) | ((uint32_t) buff[6] * 16) + | ((uint32_t) buff[7] / 16)); + adc_hum = (uint16_t) (((uint32_t) buff[8] * 256) | (uint32_t) buff[9]); + adc_gas_res = (uint16_t) ((uint32_t) buff[13] * 4 | (((uint32_t) buff[14]) / 64)); + gas_range = buff[14] & BME680_GAS_RANGE_MSK; + + data->status |= buff[14] & BME680_GASM_VALID_MSK; + data->status |= buff[14] & BME680_HEAT_STAB_MSK; + + if (data->status & BME680_NEW_DATA_MSK) { + data->temperature = calc_temperature(adc_temp, dev); + data->pressure = calc_pressure(adc_pres, dev); + data->humidity = calc_humidity(adc_hum, dev); + data->gas_resistance = calc_gas_resistance(adc_gas_res, gas_range, dev); + break; + } + /* Delay to poll the data */ + dev->delay_ms(BME680_POLL_PERIOD_MS); + } + tries--; + } while (tries); + + if (!tries) + rslt = BME680_W_NO_NEW_DATA; + + return rslt; +} + +/*! + * @brief This internal API is used to set the memory page based on register address. + */ +static int8_t set_mem_page(uint8_t reg_addr, struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t reg; + uint8_t mem_page; + + /* Check for null pointers in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + if (reg_addr > 0x7f) + mem_page = BME680_MEM_PAGE1; + else + mem_page = BME680_MEM_PAGE0; + + if (mem_page != dev->mem_page) { + dev->mem_page = mem_page; + + dev->com_rslt = dev->read(dev->dev_id, BME680_MEM_PAGE_ADDR | BME680_SPI_RD_MSK, ®, 1); + if (dev->com_rslt != 0) + rslt = BME680_E_COM_FAIL; + + if (rslt == BME680_OK) { + reg = reg & (~BME680_MEM_PAGE_MSK); + reg = reg | (dev->mem_page & BME680_MEM_PAGE_MSK); + + dev->com_rslt = dev->write(dev->dev_id, BME680_MEM_PAGE_ADDR & BME680_SPI_WR_MSK, + ®, 1); + if (dev->com_rslt != 0) + rslt = BME680_E_COM_FAIL; + } + } + } + + return rslt; +} + +/*! + * @brief This internal API is used to get the memory page based on register address. + */ +static int8_t get_mem_page(struct bme680_dev *dev) +{ + int8_t rslt; + uint8_t reg; + + /* Check for null pointer in the device structure*/ + rslt = null_ptr_check(dev); + if (rslt == BME680_OK) { + dev->com_rslt = dev->read(dev->dev_id, BME680_MEM_PAGE_ADDR | BME680_SPI_RD_MSK, ®, 1); + if (dev->com_rslt != 0) + rslt = BME680_E_COM_FAIL; + else + dev->mem_page = reg & BME680_MEM_PAGE_MSK; + } + + return rslt; +} + +/*! + * @brief This internal API is used to validate the boundary + * conditions. + */ +static int8_t boundary_check(uint8_t *value, uint8_t min, uint8_t max, struct bme680_dev *dev) +{ + int8_t rslt = BME680_OK; + + if (value != NULL) { + /* Check if value is below minimum value */ + if (*value < min) { + /* Auto correct the invalid value to minimum value */ + *value = min; + dev->info_msg |= BME680_I_MIN_CORRECTION; + } + /* Check if value is above maximum value */ + if (*value > max) { + /* Auto correct the invalid value to maximum value */ + *value = max; + dev->info_msg |= BME680_I_MAX_CORRECTION; + } + } else { + rslt = BME680_E_NULL_PTR; + } + + return rslt; +} + +/*! + * @brief This internal API is used to validate the device structure pointer for + * null conditions. + */ +static int8_t null_ptr_check(const struct bme680_dev *dev) +{ + int8_t rslt; + + if ((dev == NULL) || (dev->read == NULL) || (dev->write == NULL) || (dev->delay_ms == NULL)) { + /* Device structure pointer is not valid */ + rslt = BME680_E_NULL_PTR; + } else { + /* Device structure is fine */ + rslt = BME680_OK; + } + + return rslt; +} diff --git a/lib/vendor/Bosch/BSEC/API/bme680.h b/lib/vendor/Bosch/BSEC/API/bme680.h new file mode 100644 index 0000000000000000000000000000000000000000..8274a8e385e0136430f11f7a799acdb801059b5f --- /dev/null +++ b/lib/vendor/Bosch/BSEC/API/bme680.h @@ -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 19 Jun 2018 + * @version 3.5.9 + * @brief + * + */ +/*! @file bme680.h + @brief Sensor driver for BME680 sensor */ +/*! + * @defgroup BME680 SENSOR API + * @{*/ +#ifndef BME680_H_ +#define BME680_H_ + +/*! CPP guard */ +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Header includes */ +#include "bme680_defs.h" + +/* function prototype declarations */ +/*! + * @brief This API is the entry point. + * It reads the chip-id and calibration data from the sensor. + * + * @param[in,out] dev : Structure instance of bme680_dev + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme680_init(struct bme680_dev *dev); + +/*! + * @brief This API writes the given data to the register address + * of the sensor. + * + * @param[in] reg_addr : Register address from where the data to be written. + * @param[in] reg_data : Pointer to data buffer which is to be written + * in the sensor. + * @param[in] len : No of bytes of data to write.. + * @param[in] dev : Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme680_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev); + +/*! + * @brief This API reads the data from the given register address of the sensor. + * + * @param[in] reg_addr : Register address from where the data to be read + * @param[out] reg_data : Pointer to data buffer to store the read data. + * @param[in] len : No of bytes of data to be read. + * @param[in] dev : Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme680_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev); + +/*! + * @brief This API performs the soft reset of the sensor. + * + * @param[in] dev : Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. + */ +int8_t bme680_soft_reset(struct bme680_dev *dev); + +/*! + * @brief This API is used to set the power mode of the sensor. + * + * @param[in] dev : Structure instance of bme680_dev + * @note : Pass the value to bme680_dev.power_mode structure variable. + * + * value | mode + * -------------|------------------ + * 0x00 | BME680_SLEEP_MODE + * 0x01 | BME680_FORCED_MODE + * + * * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme680_set_sensor_mode(struct bme680_dev *dev); + +/*! + * @brief This API is used to get the power mode of the sensor. + * + * @param[in] dev : Structure instance of bme680_dev + * @note : bme680_dev.power_mode structure variable hold the power mode. + * + * value | mode + * ---------|------------------ + * 0x00 | BME680_SLEEP_MODE + * 0x01 | BME680_FORCED_MODE + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme680_get_sensor_mode(struct bme680_dev *dev); + +/*! + * @brief This API is used to set the profile duration of the sensor. + * + * @param[in] dev : Structure instance of bme680_dev. + * @param[in] duration : Duration of the measurement in ms. + * + * @return Nothing + */ +void bme680_set_profile_dur(uint16_t duration, struct bme680_dev *dev); + +/*! + * @brief This API is used to get the profile duration of the sensor. + * + * @param[in] dev : Structure instance of bme680_dev. + * @param[in] duration : Duration of the measurement in ms. + * + * @return Nothing + */ +void bme680_get_profile_dur(uint16_t *duration, const struct bme680_dev *dev); + +/*! + * @brief This API reads the pressure, temperature and humidity and gas data + * from the sensor, compensates the data and store it in the bme680_data + * structure instance passed by the user. + * + * @param[out] data: Structure instance to hold the data. + * @param[in] dev : Structure instance of bme680_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct bme680_dev *dev); + +/*! + * @brief This API is used to set the oversampling, filter and T,P,H, gas selection + * settings in the sensor. + * + * @param[in] dev : Structure instance of bme680_dev. + * @param[in] desired_settings : Variable used to select the settings which + * are to be set in the sensor. + * + * Macros | Functionality + *---------------------------------|---------------------------------------------- + * BME680_OST_SEL | To set temperature oversampling. + * BME680_OSP_SEL | To set pressure oversampling. + * BME680_OSH_SEL | To set humidity oversampling. + * BME680_GAS_MEAS_SEL | To set gas measurement setting. + * BME680_FILTER_SEL | To set filter setting. + * BME680_HCNTRL_SEL | To set humidity control setting. + * BME680_RUN_GAS_SEL | To set run gas setting. + * BME680_NBCONV_SEL | To set NB conversion setting. + * BME680_GAS_SENSOR_SEL | To set all gas sensor related settings + * + * @note : Below are the macros to be used by the user for selecting the + * desired settings. User can do OR operation of these macros for configuring + * multiple settings. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. + */ +int8_t bme680_set_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev); + +/*! + * @brief This API is used to get the oversampling, filter and T,P,H, gas selection + * settings in the sensor. + * + * @param[in] dev : Structure instance of bme680_dev. + * @param[in] desired_settings : Variable used to select the settings which + * are to be get from the sensor. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error. + */ +int8_t bme680_get_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev); +#ifdef __cplusplus +} +#endif /* End of CPP guard */ +#endif /* BME680_H_ */ +/** @}*/ diff --git a/lib/vendor/Bosch/BSEC/API/bme680_defs.h b/lib/vendor/Bosch/BSEC/API/bme680_defs.h new file mode 100644 index 0000000000000000000000000000000000000000..b7c52d8bfb664cff7202010e74cf92c7be46bd51 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/API/bme680_defs.h @@ -0,0 +1,545 @@ +/** + * 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 19 Jun 2018 + * @version 3.5.9 + * @brief + * + */ + +/*! @file bme680_defs.h + @brief Sensor driver for BME680 sensor */ +/*! + * @defgroup BME680 SENSOR API + * @brief + * @{*/ +#ifndef BME680_DEFS_H_ +#define BME680_DEFS_H_ + +/********************************************************/ +/* header includes */ +#ifdef __KERNEL__ +#include <linux/types.h> +#include <linux/kernel.h> +#else +#include <stdint.h> +#include <stddef.h> +#endif + +/******************************************************************************/ +/*! @name Common macros */ +/******************************************************************************/ + +#if !defined(UINT8_C) && !defined(INT8_C) +#define INT8_C(x) S8_C(x) +#define UINT8_C(x) U8_C(x) +#endif + +#if !defined(UINT16_C) && !defined(INT16_C) +#define INT16_C(x) S16_C(x) +#define UINT16_C(x) U16_C(x) +#endif + +#if !defined(INT32_C) && !defined(UINT32_C) +#define INT32_C(x) S32_C(x) +#define UINT32_C(x) U32_C(x) +#endif + +#if !defined(INT64_C) && !defined(UINT64_C) +#define INT64_C(x) S64_C(x) +#define UINT64_C(x) U64_C(x) +#endif + +/**@}*/ + +/**\name C standard macros */ +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *) 0) +#endif +#endif + +/** BME680 configuration macros */ +/** Enable or un-comment the macro to provide floating point data output */ +#ifndef BME680_FLOAT_POINT_COMPENSATION +/* #define BME680_FLOAT_POINT_COMPENSATION */ +#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(41) +#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) + +/** Settings selector */ +#define BME680_OST_SEL UINT16_C(1) +#define BME680_OSP_SEL UINT16_C(2) +#define BME680_OSH_SEL UINT16_C(4) +#define BME680_GAS_MEAS_SEL UINT16_C(8) +#define BME680_FILTER_SEL UINT16_C(16) +#define BME680_HCNTRL_SEL UINT16_C(32) +#define BME680_RUN_GAS_SEL UINT16_C(64) +#define BME680_NBCONV_SEL UINT16_C(128) +#define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL) + +/** Number of conversion settings*/ +#define BME680_NBCONV_MIN UINT8_C(0) +#define BME680_NBCONV_MAX UINT8_C(10) + +/** Mask definitions */ +#define BME680_GAS_MEAS_MSK UINT8_C(0x30) +#define BME680_NBCONV_MSK UINT8_C(0X0F) +#define BME680_FILTER_MSK UINT8_C(0X1C) +#define BME680_OST_MSK UINT8_C(0XE0) +#define BME680_OSP_MSK UINT8_C(0X1C) +#define BME680_OSH_MSK UINT8_C(0X07) +#define BME680_HCTRL_MSK UINT8_C(0x08) +#define BME680_RUN_GAS_MSK UINT8_C(0x10) +#define BME680_MODE_MSK UINT8_C(0x03) +#define BME680_RHRANGE_MSK UINT8_C(0x30) +#define BME680_RSERROR_MSK UINT8_C(0xf0) +#define BME680_NEW_DATA_MSK UINT8_C(0x80) +#define BME680_GAS_INDEX_MSK UINT8_C(0x0f) +#define BME680_GAS_RANGE_MSK UINT8_C(0x0f) +#define BME680_GASM_VALID_MSK UINT8_C(0x20) +#define BME680_HEAT_STAB_MSK UINT8_C(0x10) +#define BME680_MEM_PAGE_MSK UINT8_C(0x10) +#define BME680_SPI_RD_MSK UINT8_C(0x80) +#define BME680_SPI_WR_MSK UINT8_C(0x7f) +#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F) + +/** Bit position definitions for sensor settings */ +#define BME680_GAS_MEAS_POS UINT8_C(4) +#define BME680_FILTER_POS UINT8_C(2) +#define BME680_OST_POS UINT8_C(5) +#define BME680_OSP_POS UINT8_C(2) +#define BME680_RUN_GAS_POS UINT8_C(4) + +/** Array Index to Field data mapping for Calibration Data*/ +#define BME680_T2_LSB_REG (1) +#define BME680_T2_MSB_REG (2) +#define BME680_T3_REG (3) +#define BME680_P1_LSB_REG (5) +#define BME680_P1_MSB_REG (6) +#define BME680_P2_LSB_REG (7) +#define BME680_P2_MSB_REG (8) +#define BME680_P3_REG (9) +#define BME680_P4_LSB_REG (11) +#define BME680_P4_MSB_REG (12) +#define BME680_P5_LSB_REG (13) +#define BME680_P5_MSB_REG (14) +#define BME680_P7_REG (15) +#define BME680_P6_REG (16) +#define BME680_P8_LSB_REG (19) +#define BME680_P8_MSB_REG (20) +#define BME680_P9_LSB_REG (21) +#define BME680_P9_MSB_REG (22) +#define BME680_P10_REG (23) +#define BME680_H2_MSB_REG (25) +#define BME680_H2_LSB_REG (26) +#define BME680_H1_LSB_REG (26) +#define BME680_H1_MSB_REG (27) +#define BME680_H3_REG (28) +#define BME680_H4_REG (29) +#define BME680_H5_REG (30) +#define BME680_H6_REG (31) +#define BME680_H7_REG (32) +#define BME680_T1_LSB_REG (33) +#define BME680_T1_MSB_REG (34) +#define BME680_GH2_LSB_REG (35) +#define BME680_GH2_MSB_REG (36) +#define BME680_GH1_REG (37) +#define BME680_GH3_REG (38) + +/** BME680 register buffer index settings*/ +#define BME680_REG_FILTER_INDEX UINT8_C(5) +#define BME680_REG_TEMP_INDEX UINT8_C(4) +#define BME680_REG_PRES_INDEX UINT8_C(4) +#define BME680_REG_HUM_INDEX UINT8_C(2) +#define BME680_REG_NBCONV_INDEX UINT8_C(1) +#define BME680_REG_RUN_GAS_INDEX UINT8_C(1) +#define BME680_REG_HCTRL_INDEX UINT8_C(0) + +/** BME680 pressure calculation macros */ +/*! This max value is used to provide precedence to multiplication or division + * in pressure compensation equation to achieve least loss of precision and + * avoiding overflows. + * i.e Comparing value, BME680_MAX_OVERFLOW_VAL = INT32_C(1 << 30) + */ +#define BME680_MAX_OVERFLOW_VAL INT32_C(0x40000000) + +/** 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; + +#ifndef BME680_FLOAT_POINT_COMPENSATION + /*! Temperature in degree celsius x100 */ + int16_t temperature; + /*! Pressure in Pascal */ + uint32_t pressure; + /*! Humidity in % relative humidity x1000 */ + uint32_t humidity; + /*! Gas resistance in Ohms */ + uint32_t gas_resistance; +#else + /*! Temperature in degree celsius */ + float temperature; + /*! Pressure in Pascal */ + float pressure; + /*! Humidity in % relative humidity x1000 */ + float humidity; + /*! Gas resistance in Ohms */ + float gas_resistance; + +#endif + +}; + +/*! + * @brief Structure to hold the Calibration 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; + +#ifndef BME680_FLOAT_POINT_COMPENSATION + /*! Variable to store t_fine size */ + int32_t t_fine; +#else + /*! Variable to store t_fine size */ + float t_fine; +#endif + /*! 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; + /*! Heater temperature value */ + uint16_t heatr_temp; + /*! Duration profile value */ + 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; + /*! Bus read function pointer */ + bme680_com_fptr_t read; + /*! Bus write function pointer */ + bme680_com_fptr_t write; + /*! delay function pointer */ + bme680_delay_fptr_t delay_ms; + /*! Communication function result */ + int8_t com_rslt; +}; + + + +#endif /* BME680_DEFS_H_ */ +/** @}*/ +/** @}*/ diff --git a/lib/vendor/Bosch/BSEC/API/changelog.md b/lib/vendor/Bosch/BSEC/API/changelog.md new file mode 100644 index 0000000000000000000000000000000000000000..af3cce9a32310bcdd60b8c3edc2a6be5ba28d7cf --- /dev/null +++ b/lib/vendor/Bosch/BSEC/API/changelog.md @@ -0,0 +1,51 @@ +# Change Log +All notable changes to the BME680 Sensor API will be documented in this file. +## v3.5.3, 30 Oct 2017 +### Changed + - Changed the compensation equation formulae to use shifting operation + - Updated the "bme680_get_profile_dur" API + - Fixed Checkpatch and made linux compatible + +## v3.5.2, 18 Oct 2017 +### Changed + - Fixed bug of temperature compensation in pressure + +## 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. + diff --git a/lib/vendor/Bosch/BSEC/Arduino/BSEC.zip b/lib/vendor/Bosch/BSEC/Arduino/BSEC.zip new file mode 100644 index 0000000000000000000000000000000000000000..95c33a20240612e31eb86543666afa81788c47a7 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/Arduino/BSEC.zip differ diff --git a/lib/vendor/Bosch/BSEC/Arduino/Bme680_Data.zip b/lib/vendor/Bosch/BSEC/Arduino/Bme680_Data.zip new file mode 100644 index 0000000000000000000000000000000000000000..719ad57960167a8240a7ff1edaa68a77b1412997 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/Arduino/Bme680_Data.zip differ diff --git a/lib/vendor/Bosch/BSEC/Arduino/Integration Guidelines for Arduino platforms.pdf b/lib/vendor/Bosch/BSEC/Arduino/Integration Guidelines for Arduino platforms.pdf new file mode 100644 index 0000000000000000000000000000000000000000..011a12db07cb9d5fadf2a73e90af5f8ca7483765 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/Arduino/Integration Guidelines for Arduino platforms.pdf differ diff --git a/lib/vendor/Bosch/BSEC/BSEC Binary Size Information.pdf b/lib/vendor/Bosch/BSEC/BSEC Binary Size Information.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0361ff5036b430527cd533b2d16c3cd6e6ce8496 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/BSEC Binary Size Information.pdf differ diff --git a/lib/vendor/Bosch/BSEC/BSEC_release_note.pdf b/lib/vendor/Bosch/BSEC/BSEC_release_note.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e7242e68ba15f37da7be3b3b230cf45aa642cf0d Binary files /dev/null and b/lib/vendor/Bosch/BSEC/BSEC_release_note.pdf differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..50bef35ed69f9ec6ef9f6cd6e0079ecefc813f12 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..d1113c7abf9e8a01d0e8c3a974ec89343e0a8c4e --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0+/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 15814 0 1120 16934 4226 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..fcf8f82c7a00e5eb06959383ad7e342d4110626e Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..d1113c7abf9e8a01d0e8c3a974ec89343e0a8c4e --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M0/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 15814 0 1120 16934 4226 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..282e43052aa13883295e8142d6b8594aa97735bf Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..d6706501ca2b1c7fd02d71b1fd20ba2c2dec67c3 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M3/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 14600 0 1120 15720 3d68 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..baf4de978b00de551a282c37a6c9675d4ceed53c Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..f6ae4dc61924ff6c403fd2c387fa077dd3abad43 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 14604 0 1120 15724 3d6c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..9a5c21850f6249e12e804a82655906d45e3f303e Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..ae2ec585a8f67e8188a9696e2b0769f646caf1b7 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M4F/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 15168 0 1120 16288 3fa0 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..7edafe396e89247875f3f0eeea32dbaacb69eb55 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..f6ae4dc61924ff6c403fd2c387fa077dd3abad43 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/IAR7/Cortex_M7/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 14604 0 1120 15724 3d6c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..5308f5c2fffd845bafcc2e8eca3c3279c55c2e03 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..9560c9a9b7f9213a68969fc31fe9f8a6967344d6 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 34260 0 1088 35348 8a14 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..368ba86e05c54f27478121f8924a9667643ba1e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_interface.h @@ -0,0 +1,402 @@ +/* + * 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; + 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: + // 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); + + \endcode + */ + +bsec_library_return_t bsec_reset_output(uint8_t sensor_id); + + +/*! + * @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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..4c57fb66b496cbccc58e4bb9f5ff04093c9cffe9 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..b11d94774ce33bf7eb8b5e4b76ce0086d755df68 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 34096 0 1088 35184 8970 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..9c5addc77aac93d1821fd406c8d8b1e8c706f7b2 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..abbbdb50417c3aec9ceb2e782f912950804c6ba4 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0+/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11607 0 1088 12695 3197 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..ac966695532e8208c177a771818acb64b96fb423 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..abbbdb50417c3aec9ceb2e782f912950804c6ba4 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M0/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11607 0 1088 12695 3197 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..12c6eca96b8f4ecf92c65ad8b2ee482873ea1854 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..d9c0a25dd62263efc2fa6d53373542121721c1b2 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M3/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11119 0 1088 12207 2faf (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..f434dd7953c0535954cc361bda3d28823731ce08 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..d9c0a25dd62263efc2fa6d53373542121721c1b2 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11119 0 1088 12207 2faf (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..91423b1ead569f5c6601fdbdf833bf063b92d9b3 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..b0dcf55abf3b365cd77400e2da7884c63c00ea37 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M4F/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11979 0 1088 13067 330b (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..4ac166ac84d4974b2271ba78aea423a4e7a6bcc7 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..d2d7dc9371e8a6b32efa1cc7d2b03f6388b4595c --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/armcc/Cortex_M7/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11135 0 1088 12223 2fbf (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..8244c6ac8caeef45864a602aacd702f62b69ec0c Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..5d0d0b6c971e9ed329429696a269ed79ba0fac22 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR32/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 13130 0 1428 14558 38de (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..79b9e6ef34f7198b2f9d05259c6bec27fe6a12a6 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..ccdeb65221389eaa4669ea1279bbc92b444f3f0a --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_XMEGA/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 25883 0 1048 26931 6933 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..c369f7610e3a55b0630ee2a0321141ba3b8c6b13 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..9be6461002a285cf2db7e46fe50ec6f786a22e37 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/avr/AVR8_megaAVR/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 26085 0 1048 27133 69fd (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..02c33ca27b143a204424dca80820880b72930f29 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8176349a021a03483b6631b827ebe0be668a3184 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp32/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 14046 0 1088 15134 3b1e (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..3d6c7705bd6080ff8a28c0253226cfacf82a6d65 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..fda797707930a9dbbe206c4f31aff0ae181d4cf7 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/esp8266/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 17111 0 1088 18199 4717 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..be7e39602a69bdcd5f005e6eab2e53e175318861 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8312302cfded15529c0ffc4e3c55215b635da311 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/ARMv8/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 13412 0 1088 14500 38a4 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..8e7329f37a5b2836014f4de475e466406cade494 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..1ab892f490261b2f5ce57a5a13eecc735f70da26 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_A7/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 12652 0 1088 13740 35ac (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..6ce886554266f9d2ff3dfb36ca1d36425ae447a7 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..5a7e473f796e07feba252f577cf9ce31ebcd317c --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0+/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 13240 0 1088 14328 37f8 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..f55100ed32cf9af52ba27b2e2409e6c2c4b9677a Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..5a7e473f796e07feba252f577cf9ce31ebcd317c --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M0/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 13240 0 1088 14328 37f8 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..6c703cf440b0735c5c08eb425438a09f7d21804d Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..806639b03a428f378160f08eb21941daff6ae3f9 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M3/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 11972 0 1088 13060 3304 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..d3e223053a85829ed9c79e8c69044f539afc6d01 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..566650d27d80ad11804dfb26adef5bffa0ec485b --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 12020 0 1088 13108 3334 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..fd83ae6253828b63adc93a69a64885a5781d9db0 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..235f10a3c6ac161ea131ac3049960972c0771869 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M4F/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 12112 0 1088 13200 3390 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..7c4d77afdaea3e69b80a2d8ec850c2ee7872a069 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..503084227cd19e777647cff52dfdf34fca939212 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/gcc/Cortex_M7/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 12268 0 1088 13356 342c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..aab72d26b915410f0f7e8bf92d520c53eabc5df7 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..ade957eb207e7f355e9a8ad21bd4450116ae63d5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/bin/msp430-elf-gcc/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 20802 0 1054 21856 5560 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/inc/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/lite_version/inc/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/inc/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/lite_version/inc/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/lite_version/inc/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/lite_version/inc/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..7534eea1706fffaeed70937488b132bcf6c64355 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..cd4dfecef11c917d81887aaf08a0dd39f3606b75 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0+/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 24628 0 1120 25748 6494 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..717568ebecb9d227490b8f469b20952dd0d17945 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..cd4dfecef11c917d81887aaf08a0dd39f3606b75 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M0/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 24628 0 1120 25748 6494 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..9d96647245f2352614b8e48cbb1826fe889a63c8 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..00b479cface9558f9be5bf6cd6f5a11f5c5af5b3 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M3/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 23436 0 1120 24556 5fec (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..579615e07eb35c5c2d408a3e3492f978f2648560 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8d978df0a1bb8de98c8b1d19194c670e94217ad8 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 23440 0 1120 24560 5ff0 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..ef081d891dd463853e14887b61c509a1024f9864 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8a82458277e5bfdb5123778eaf8b282bc488c897 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M4F/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 24036 0 1120 25156 6244 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..b3bfabc15cc4c5eedf44ab6479a5269da4b99aa0 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8d978df0a1bb8de98c8b1d19194c670e94217ad8 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/IAR7/Cortex_M7/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 23440 0 1120 24560 5ff0 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..1e38d5993929619e28af60ca6d55247e6c256abf Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..eb794d03ff1d59ea65e17072382c5ed204ca4708 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiThree_ArmV8-a-64bits/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 63036 0 1120 64156 fa9c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..f28550692865e144897c49ef5eed4c36daa07269 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------------------------------------------------------| + * | UNRELIABLE | 0 | Stabilization / run-in ongoing | + * | LOW_ACCURACY | 1 | Low accuracy, to reach high accuracy(3), please expose sensor once to good air and bad air for autotrimming | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, autotrimming ongoing | + * | 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..128bdc014e880d557b16349cc4812680e4f1e74a Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..736b654121c9f9de8f66594812c7b1ae42145aa1 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/RaspberryPI/PiZero_ArmV6-32bits/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 56180 0 1120 57300 dfd4 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..b14fb39dd8e1aad98638ffcd4b817d587a29d7d0 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8d963d10e88e53d754814454a39d44dba46acf98 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0+/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 18909 0 1120 20029 4e3d (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..548f694bf8ac8ff1948d846fcd82632fcb5772d6 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..8d963d10e88e53d754814454a39d44dba46acf98 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M0/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 18909 0 1120 20029 4e3d (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..b1ffbb6360739205a1080fd200d4f153eb4beef3 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..971857bd3533422e548139f68a387fc023055aec --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M3/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 18129 0 1120 19249 4b31 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..04610600bcbc37a8e45ab9aed3d97c161d5228d8 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..971857bd3533422e548139f68a387fc023055aec --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 18129 0 1120 19249 4b31 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..58214e37e2a7ae44b764f10dc36f982f79976cf4 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..0338df5b55e85ec00f6529f641b62a03cbecab1e --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M4F/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 19091 0 1120 20211 4ef3 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/libalgobsec.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/libalgobsec.lib new file mode 100644 index 0000000000000000000000000000000000000000..fa684f6a26c880ce571133a29c74221f1518e474 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/libalgobsec.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/libalgobsec.lib.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/libalgobsec.lib.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..cc67a05dd026f7a4d332ecb17f992c0543fb1e43 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/armcc/Cortex_M7/libalgobsec.lib.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 18145 0 1120 19265 4b41 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..f7fe01a9da7604b6df760168e16872a3005d38f0 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..0f274f942b8ca842dfcc6cd11c8c9a3ea1093013 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR32/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 23760 0 1460 25220 6284 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..9660aef848c66f5ce8bb04aff20a5e93ef3ae878 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..c5ca8ebc40a5a2b78d049157d962506ac7b2a590 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_XMEGA/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 42505 0 1064 43569 aa31 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..73f7059903047fe93b1818d5864dd7efbd2e938f Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..06543f4f00ca4ce3d7940be1944e5f9cd72ad69d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/avr/AVR8_megaAVR/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 43291 0 1064 44355 ad43 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.dll b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.dll new file mode 100644 index 0000000000000000000000000000000000000000..16033769b3b4e1797d32a5e3076959e69d1fd81b Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.dll differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.exp b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.exp new file mode 100644 index 0000000000000000000000000000000000000000..c26120c3adae267881a70e7f774bc08878543750 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.exp differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.lib new file mode 100644 index 0000000000000000000000000000000000000000..f82cd3430ceff2f8a0b06530ebc71b281c6c9340 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.pdb b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.pdb new file mode 100644 index 0000000000000000000000000000000000000000..a298db1c392bb67a64c359e3ea89bce988cd07e6 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x64/BSECLibrary64.pdb differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.dll b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.dll new file mode 100644 index 0000000000000000000000000000000000000000..043c9d46d26326168e05fbd0780f0a47c97d1dd4 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.dll differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.exp b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.exp new file mode 100644 index 0000000000000000000000000000000000000000..1538b904a91361a3e5baeedeeb077d4554672d5d Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.exp differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.lib b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.lib new file mode 100644 index 0000000000000000000000000000000000000000..1e7e4642b27623b9ca82b52a8c0827c4f8ea6ecf Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.lib differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.pdb b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.pdb new file mode 100644 index 0000000000000000000000000000000000000000..efc380dd81d30b7c14fad9a845085d6b1f678b4f Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/dll/x86/BSECLibrary32.pdb differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..e9e4ae2331153f5a59560498f416e64519b189b1 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..067104f7566f39968bf3196839e0576780c93f5c --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp32/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 23809 0 1120 24929 6161 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..2bba45dba2feac4c99cb980924d069152e384a61 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..ffe768d4fc6b24ff76263753cfdeacf73f179895 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/esp8266/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 28581 0 1120 29701 7405 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..dd1703d72b99b8f1744fd635e363cd0a020c3f5a Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..a5fbeb5297c29d007b9bf9763953815feee8e9cb --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/ARMv8/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 22524 0 1120 23644 5c5c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..f6fea32d0951b40340c2d6f2c9e696cc12181020 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..e038cf9a396f8b2c684e7c23dc787f3bcd4772db --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_A7/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 21428 0 1120 22548 5814 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..84d7f8261340ea229037d4129d99d57cbc4408c2 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..e0ad70e5ff4e238c04d4791dabcc12667f440852 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0+/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 22444 0 1120 23564 5c0c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..0678a905c0136d644834f15228414db4e0d9897d Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..e0ad70e5ff4e238c04d4791dabcc12667f440852 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M0/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 22444 0 1120 23564 5c0c (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..d41517506223ba197191243a68f580ed11224aed Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..801c2c2b6fa32f9acadf279bb06e0ca44cd5b9f9 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M3/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 20608 0 1120 21728 54e0 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..0750089ed2e891a7147813b09f9387ab9369df8d Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..ee82b55fbd6d1c2b8924f1d5674cff546942ab80 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 20620 0 1120 21740 54ec (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..c94845173553b8ae0f9f2d6d60b0957ae31a581c Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..0a28272c4e38e91e75a2274db5f9176096752366 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M4F/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 20788 0 1120 21908 5594 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..142b6cd66fccbb29d8971633950a44ed7b197be8 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..5c542da4e9ea44230d5c99c370c64dac0bb5a272 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/gcc/Cortex_M7/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 21172 0 1120 22292 5714 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/libalgobsec.a b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/libalgobsec.a new file mode 100644 index 0000000000000000000000000000000000000000..1b4e45534fe3ef977a61bff017345705207664dc Binary files /dev/null and b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/libalgobsec.a differ diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/libalgobsec.a.Size.log b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/libalgobsec.a.Size.log new file mode 100644 index 0000000000000000000000000000000000000000..97d5bf2fe2dba2f245d7edc64554c31dfb909e1c --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/bin/msp430-elf-gcc/libalgobsec.a.Size.log @@ -0,0 +1,2 @@ + text data bss dec hex filename + 34180 0 1070 35250 89b2 (TOTALS) diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/inc/bsec_datatypes.h b/lib/vendor/Bosch/BSEC/algo/normal_version/inc/bsec_datatypes.h new file mode 100644 index 0000000000000000000000000000000000000000..7b45f7f2359c881f1c39d2a795615eda4c438554 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/inc/bsec_datatypes.h @@ -0,0 +1,488 @@ +/* + * 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_WORKBUFFER_SIZE (2048) /*!< Maximum size (in bytes) of the work buffer */ +#define BSEC_MAX_PHYSICAL_SENSOR (8) /*!< Number of physical sensors that need allocated space before calling bsec_update_subscription() */ +#define BSEC_MAX_PROPERTY_BLOB_SIZE (454) /*!< Maximum size (in bytes) of the data blobs returned by bsec_get_configuration() */ +#define BSEC_MAX_STATE_BLOB_SIZE (139) /*!< 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 (14) /*!< Number of outputs, depending on solution */ +#define BSEC_OUTPUT_INCLUDED (1210863) /*!< 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 = 1, + BSEC_OUTPUT_STATIC_IAQ = 2, /*!< Unscaled indoor-air-quality estimate */ + BSEC_OUTPUT_CO2_EQUIVALENT = 3, /*!< co2 equivalent estimate [ppm] */ + BSEC_OUTPUT_BREATH_VOC_EQUIVALENT = 4, /*!< breath VOC concentration estimate [ppm] */ + + /** + * @brief Temperature sensor signal [degrees Celsius] + * + * Temperature directly measured by BME680 in degree Celsius. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_TEMPERATURE = 6, + + /** + * @brief Pressure sensor signal [Pa] + * + * Pressure directly measured by the BME680 in Pa. + */ + BSEC_OUTPUT_RAW_PRESSURE = 7, + + /** + * @brief Relative humidity sensor signal [%] + * + * Relative humidity directly measured by the BME680 in %. + * + * @note This value is cross-influenced by the sensor heating and device specific heating. + */ + BSEC_OUTPUT_RAW_HUMIDITY = 8, + + /** + * @brief Gas sensor signal [Ohm] + * + * Gas resistance measured directly by the BME680 in Ohm.The resistance value changes due to varying VOC + * concentrations (the higher the concentration of reducing VOCs, the lower the resistance and vice versa). + */ + BSEC_OUTPUT_RAW_GAS = 9, + + /** + * @brief Gas sensor stabilization status [boolean] + * + * Indicates initial stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_STABILIZATION_STATUS = 12, + + /** + * @brief Gas sensor run-in status [boolean] + * + * Indicates power-on stabilization status of the gas sensor element: stabilization is ongoing (0) or stabilization + * is finished (1). + */ + BSEC_OUTPUT_RUN_IN_STATUS = 13, + + /** + * @brief Sensor heat compensated temperature [degrees Celsius] + * + * Temperature measured by BME680 which is compensated for the influence of sensor (heater) in degree Celsius. + * The self heating introduced by the heater is depending on the sensor operation mode and the sensor supply voltage. + * + * + * @note IAQ solution: In addition, the temperature output can be compensated by an user defined value + * (::BSEC_INPUT_HEATSOURCE in degrees Celsius), which represents the device specific self-heating. + * + * Thus, the value is calculated as follows: + * * IAQ solution: ```BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage) - ::BSEC_INPUT_HEATSOURCE``` + * * other solutions: ```::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = ::BSEC_INPUT_TEMPERATURE - function(sensor operation mode, sensor supply voltage)``` + * + * The self-heating in operation mode BSEC_SAMPLE_RATE_ULP is negligible. + * The self-heating in operation mode BSEC_SAMPLE_RATE_LP is supported for 1.8V by default (no config file required). If the BME680 sensor supply voltage is 3.3V, the IoT_LP_3_3V.config shall be used. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE = 14, + + /** + * @brief Sensor heat compensated humidity [%] + * + * Relative measured by BME680 which is compensated for the influence of sensor (heater) in %. + * + * It converts the ::BSEC_INPUT_HUMIDITY from temperature ::BSEC_INPUT_TEMPERATURE to temperature + * ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE. + * + * @note IAQ solution: If ::BSEC_INPUT_HEATSOURCE is used for device specific temperature compensation, it will be + * effective for ::BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY too. + */ + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY = 15, + + BSEC_OUTPUT_COMPENSATED_GAS = 18, /*!< Reserved internal debug output */ + BSEC_OUTPUT_GAS_PERCENTAGE = 21 /*!< percentage of min and max filtered gas value [%] */ +} bsec_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, size of work buffer in setConfig must be set to BSEC_MAX_WORKBUFFER_SIZE */ + BSEC_E_SET_INVALIDLENGTH = -104, /*!< Internal error code */ + BSEC_W_SC_CALL_TIMING_VIOLATION = 100, /*!< Difference between actual and defined sampling intervals of bsec_sensor_control() greater than allowed */ + BSEC_W_SC_MODEXCEEDULPTIMELIMIT = 101, /*!< ULP plus is not allowed because an ULP measurement just took or will take place */ /*MOD_ONLY*/ + BSEC_W_SC_MODINSUFFICIENTWAITTIME = 102 /*!< ULP plus is not allowed because not sufficient time passed since last ULP plus */ /*MOD_ONLY*/ +} bsec_library_return_t; + +/*! + * @brief Structure containing the version information + * + * Please note that configuration and state strings are coded to a specific version and will not be accepted by other + * versions of BSEC. + * + */ +typedef struct +{ + uint8_t major; /**< @brief Major version */ + uint8_t minor; /**< @brief Minor version */ + uint8_t major_bugfix; /**< @brief Major bug fix version */ + uint8_t minor_bugfix; /**< @brief Minor bug fix version */ +} bsec_version_t; + +/*! + * @brief Structure describing an input sample to the library + * + * Each input sample is provided to BSEC as an element in a struct array of this type. Timestamps must be provided + * in nanosecond resolution. Moreover, duplicate timestamps for subsequent samples are not allowed and will results in + * an error code being returned from bsec_do_steps(). + * + * The meaning unit of the signal field are determined by the bsec_input_t::sensor_id field content. Possible + * bsec_input_t::sensor_id values and and their meaning are described in ::bsec_physical_sensor_t. + * + * @sa bsec_physical_sensor_t + * + */ +typedef struct +{ + /** + * @brief Time stamp in nanosecond resolution [ns] + * + * Timestamps must be provided as non-repeating and increasing values. They can have their 0-points at system start or + * at a defined wall-clock time (e.g., 01-Jan-1970 00:00:00) + */ + int64_t time_stamp; + float signal; /*!< @brief Signal sample in the unit defined for the respective sensor_id @sa bsec_physical_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of physical sensor @sa bsec_physical_sensor_t */ +} bsec_input_t; + +/*! + * @brief Structure describing an output sample of the library + * + * Each output sample is returned from BSEC by populating the element of a struct array of this type. The contents of + * the signal field is defined by the supplied bsec_output_t::sensor_id. Possible output + * bsec_output_t::sensor_id values are defined in ::bsec_virtual_sensor_t. + * + * @sa bsec_virtual_sensor_t + */ +typedef struct +{ + int64_t time_stamp; /*!< @brief Time stamp in nanosecond resolution as provided as input [ns] */ + float signal; /*!< @brief Signal sample in the unit defined for the respective bsec_output_t::sensor_id @sa bsec_virtual_sensor_t */ + uint8_t signal_dimensions; /*!< @brief Signal dimensions (reserved for future use, shall be set to 1) */ + uint8_t sensor_id; /*!< @brief Identifier of virtual sensor @sa bsec_virtual_sensor_t */ + + /** + * @brief Accuracy status 0-3 + * + * Some virtual sensors provide a value in the accuracy field. If this is the case, the meaning of the field is as + * follows: + * + * | Name | Value | Accuracy description | + * |----------------------------|-------|-------------------------------------------------------------| + * | UNRELIABLE | 0 | Sensor data is unreliable, the sensor must be calibrated | + * | LOW_ACCURACY | 1 | Low accuracy, sensor should be calibrated | + * | MEDIUM_ACCURACY | 2 | Medium accuracy, sensor calibration may improve performance | + * | HIGH_ACCURACY | 3 | High accuracy | + * + * For example: + * + * - Ambient temperature accuracy is derived from change in the temperature in 1 minute. + * + * | Virtual sensor | Value | Accuracy description | + * |--------------------- |-------|------------------------------------------------------------------------------| + * | Ambient temperature | 0 | The difference in ambient temperature is greater than 4 degree in one minute | + * | | 1 | The difference in ambient temperature is less than 4 degree in one minute | + * | | 2 | The difference in ambient temperature is less than 3 degree in one minute | + * | | 3 | The difference in ambient temperature is less than 2 degree in one minute | + * + * - IAQ accuracy indicator will notify the user when she/he should initiate a calibration process. Calibration is + * performed automatically in the background if the sensor is exposed to clean and polluted air for approximately + * 30 minutes each. + * + * | Virtual sensor | Value | Accuracy description | + * |----------------------------|-------|-----------------------------------------------------------------| + * | IAQ | 0 | The sensor is not yet stabilized or in a run-in status | + * | | 1 | Calibration required | + * | | 2 | Calibration on-going | + * | | 3 | Calibration is done, now IAQ estimate achieves best performance | + */ + uint8_t accuracy; +} bsec_output_t; + +/*! + * @brief Structure describing sample rate of physical/virtual sensors + * + * This structure is used together with bsec_update_subscription() to enable BSEC outputs and to retrieve information + * about the sample rates used for BSEC inputs. + */ +typedef struct +{ + /** + * @brief Sample rate of the virtual or physical sensor in Hertz [Hz] + * + * Only supported sample rates are allowed. + */ + float sample_rate; + + /** + * @brief Identifier of the virtual or physical sensor + * + * The meaning of this field changes depending on whether the structs are as the requested_virtual_sensors argument + * to bsec_update_subscription() or as the required_sensor_settings argument. + * + * | bsec_update_subscription() argument | sensor_id field interpretation | + * |-------------------------------------|--------------------------------| + * | requested_virtual_sensors | ::bsec_virtual_sensor_t | + * | required_sensor_settings | ::bsec_physical_sensor_t | + * + * @sa bsec_physical_sensor_t + * @sa bsec_virtual_sensor_t + */ + uint8_t sensor_id; +} bsec_sensor_configuration_t; + +/*! + * @brief Structure returned by bsec_sensor_control() to configure BMExxx sensor + * + * This structure contains settings that must be used to configure the BMExxx to perform a forced-mode measurement. + * A measurement should only be executed if bsec_bme_settings_t::trigger_measurement is 1. If so, the oversampling + * settings for temperature, humidity, and pressure should be set to the provided settings provided in + * bsec_bme_settings_t::temperature_oversampling, bsec_bme_settings_t::humidity_oversampling, and + * bsec_bme_settings_t::pressure_oversampling, respectively. + * + * In case of bsec_bme_settings_t::run_gas = 1, the gas sensor must be enabled with the provided + * bsec_bme_settings_t::heater_temperature and bsec_bme_settings_t::heating_duration settings. + */ +typedef struct +{ + int64_t next_call; /*!< @brief Time stamp of the next call of the sensor_control*/ + uint32_t process_data; /*!< @brief Bit field describing which data is to be passed to bsec_do_steps() @sa BSEC_PROCESS_* */ + uint16_t heater_temperature; /*!< @brief 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 diff --git a/lib/vendor/Bosch/BSEC/algo/normal_version/inc/bsec_interface.h b/lib/vendor/Bosch/BSEC/algo/normal_version/inc/bsec_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..d6c09a392958a326a5553bf2c5bbb4afa2d0cedc --- /dev/null +++ b/lib/vendor/Bosch/BSEC/algo/normal_version/inc/bsec_interface.h @@ -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; + 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: + // 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); + + \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__ */ diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..ba71808c56cc0b8083584688be8d61780cb42888 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..25f389c894112357c96d8ae31099a74ea6c020c6 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,133,135,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..2578ade4f3ef8927a18d3c48f28867b0de59fa68 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,133,135,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_28d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..255edea35b6759a9ffe7c51345bb6b9227f2b756 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..ec45f85341cee8fdd6704532f72a3593f3c3e59d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,166,224,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..7a1b214fd929a833f04539ea8871a6a9836e744d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,166,224,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_300s_4d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..0d0f06dc1182515cab969d5e9b323105ed481a91 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..84c7e00fde7f4a8de53e6ac3ca3cface0fccdbd6 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,23,142,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..922c4fcee4921328e2406bd6a106e1e1ea107a25 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,23,142,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..565ed67ff91fec461a4d709420411c0dd703a6ec Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..9b52849a7472344248110e46953ae2f064dd44df --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,52,233,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..62fc60ef251c9c156412082484f0389f5e94774b --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,7,240,150,61,0,0,0,0,0,0,0,0,28,124,225,61,52,128,215,63,0,0,160,64,0,0,0,0,0,0,0,0,205,204,12,62,103,213,39,62,230,63,76,192,0,0,0,0,0,0,0,0,145,237,60,191,251,58,64,63,177,80,131,64,0,0,0,0,0,0,0,0,93,254,227,62,54,60,133,191,0,0,64,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,52,233,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_18v_3s_4d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..96fe3234ba08432765240858079e1c3051d632de Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..beb23ae105712bdf03c807e19b96d1cced6256e4 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,59,62,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..17206d19d8082ed0b1d954d136233c84144e50e5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,59,62,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_28d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..7d181b0ccb8888c90475e93d8fb5d1697859c71b Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..2e17310e4b917b20177b61f8845622084f520e5c --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,24,89,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..a146e676539c0bb340478f665df9d398eaa6af64 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,48,117,0,0,0,0,24,89,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_300s_4d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..82a58c2716e154dcf9eefc5fdda9cdda615a074b Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..becd5d76150556363da8f8a4040e7a5bb3756d51 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,169,55,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..4a76a130be1f71516c9226fec83fdf1e2cf0a537 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,168,19,73,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,169,55,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_28d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_iaq.config b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_iaq.config new file mode 100644 index 0000000000000000000000000000000000000000..4ebfbd45c12468cdef0bb525c8244a0466f293e6 Binary files /dev/null and b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_iaq.config differ diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_iaq.csv b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_iaq.csv new file mode 100644 index 0000000000000000000000000000000000000000..687e6fb32fe393a17729ca8373ac2364ba9f5753 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_iaq.csv @@ -0,0 +1 @@ +454,4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,138,80,0,0 diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_serialized_configurations_iaq.c b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_serialized_configurations_iaq.c new file mode 100644 index 0000000000000000000000000000000000000000..d53ae58ab91035353207ea090c282ee6547a947d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_serialized_configurations_iaq.c @@ -0,0 +1,5 @@ +#include "bsec_serialized_configurations_iaq.h" + +const uint8_t bsec_config_iaq[454] = + {4,7,4,1,61,0,0,0,0,0,0,0,174,1,0,0,48,0,1,0,0,192,168,71,64,49,119,76,0,0,225,68,137,65,0,63,205,204,204,62,0,0,64,63,205,204,204,62,0,0,0,0,216,85,0,100,0,0,0,0,0,0,0,0,28,0,2,0,0,244,1,225,0,25,0,0,128,64,0,0,32,65,144,1,0,0,112,65,0,0,0,63,16,0,3,0,10,215,163,60,10,215,35,59,10,215,35,59,9,0,5,0,0,0,0,0,1,88,0,9,0,229,208,34,62,0,0,0,0,0,0,0,0,218,27,156,62,225,11,67,64,0,0,160,64,0,0,0,0,0,0,0,0,94,75,72,189,93,254,159,64,66,62,160,191,0,0,0,0,0,0,0,0,33,31,180,190,138,176,97,64,65,241,99,190,0,0,0,0,0,0,0,0,167,121,71,61,165,189,41,192,184,30,189,64,12,0,10,0,0,0,0,0,0,0,0,0,229,0,254,0,2,1,5,48,117,100,0,44,1,112,23,151,7,132,3,197,0,92,4,144,1,64,1,64,1,144,1,48,117,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,48,117,48,117,100,0,100,0,100,0,100,0,48,117,48,117,48,117,100,0,100,0,100,0,48,117,48,117,100,0,100,0,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,112,23,255,255,255,255,255,255,255,255,220,5,220,5,220,5,255,255,255,255,255,255,220,5,220,5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,44,1,0,0,0,0,138,80,0,0}; + diff --git a/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_serialized_configurations_iaq.h b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_serialized_configurations_iaq.h new file mode 100644 index 0000000000000000000000000000000000000000..1986e2be683bce5daf7b3432abbd406d59bdaa2d --- /dev/null +++ b/lib/vendor/Bosch/BSEC/config/generic_33v_3s_4d/bsec_serialized_configurations_iaq.h @@ -0,0 +1,4 @@ +#include <stdint.h> + +extern const uint8_t bsec_config_iaq[454]; + diff --git a/lib/vendor/Bosch/BSEC/examples/bsec_integration.c b/lib/vendor/Bosch/BSEC/examples/bsec_integration.c new file mode 100644 index 0000000000000000000000000000000000000000..081f27b7d49143e4285fba6a988bd1b14feddb84 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/examples/bsec_integration.c @@ -0,0 +1,559 @@ +/* + * Copyright (C) 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_integration.c + * + * @brief + * Private part of the example for using of BSEC library. + */ + +/*! + * @addtogroup bsec_examples BSEC Examples + * @brief BSEC usage examples + * @{*/ + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#include "bsec_integration.h" + +/**********************************************************************************************************************/ +/* local macro definitions */ +/**********************************************************************************************************************/ + +#define NUM_USED_OUTPUTS 8 + +/**********************************************************************************************************************/ +/* global variable declarations */ +/**********************************************************************************************************************/ + +/* Global sensor APIs data structure */ +static struct bme680_dev bme680_g; + +/* Global temperature offset to be subtracted */ +static float bme680_temperature_offset_g = 0.0f; + +/**********************************************************************************************************************/ +/* functions */ +/**********************************************************************************************************************/ + +/*! + * @brief Virtual sensor subscription + * Please call this function before processing of data using bsec_do_steps function + * + * @param[in] sample_rate mode to be used (either BSEC_SAMPLE_RATE_ULP or BSEC_SAMPLE_RATE_LP) + * + * @return subscription result, zero when successful + */ +static bsec_library_return_t bme680_bsec_update_subscription(float sample_rate) +{ + bsec_sensor_configuration_t requested_virtual_sensors[NUM_USED_OUTPUTS]; + uint8_t n_requested_virtual_sensors = NUM_USED_OUTPUTS; + + bsec_sensor_configuration_t required_sensor_settings[BSEC_MAX_PHYSICAL_SENSOR]; + uint8_t n_required_sensor_settings = BSEC_MAX_PHYSICAL_SENSOR; + + bsec_library_return_t status = BSEC_OK; + + /* note: Virtual sensors as desired to be added here */ + requested_virtual_sensors[0].sensor_id = BSEC_OUTPUT_IAQ; + requested_virtual_sensors[0].sample_rate = sample_rate; + requested_virtual_sensors[1].sensor_id = BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE; + requested_virtual_sensors[1].sample_rate = sample_rate; + requested_virtual_sensors[2].sensor_id = BSEC_OUTPUT_RAW_PRESSURE; + requested_virtual_sensors[2].sample_rate = sample_rate; + requested_virtual_sensors[3].sensor_id = BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY; + requested_virtual_sensors[3].sample_rate = sample_rate; + requested_virtual_sensors[4].sensor_id = BSEC_OUTPUT_RAW_GAS; + requested_virtual_sensors[4].sample_rate = sample_rate; + requested_virtual_sensors[5].sensor_id = BSEC_OUTPUT_RAW_TEMPERATURE; + requested_virtual_sensors[5].sample_rate = sample_rate; + requested_virtual_sensors[6].sensor_id = BSEC_OUTPUT_RAW_HUMIDITY; + requested_virtual_sensors[6].sample_rate = sample_rate; + requested_virtual_sensors[7].sensor_id = BSEC_OUTPUT_STATIC_IAQ; + requested_virtual_sensors[7].sample_rate = sample_rate; + + /* Call bsec_update_subscription() to enable/disable the requested virtual sensors */ + status = bsec_update_subscription(requested_virtual_sensors, n_requested_virtual_sensors, required_sensor_settings, + &n_required_sensor_settings); + + return status; +} + +/*! + * @brief Initialize the BME680 sensor and the BSEC library + * + * @param[in] sample_rate mode to be used (either BSEC_SAMPLE_RATE_ULP or BSEC_SAMPLE_RATE_LP) + * @param[in] temperature_offset device-specific temperature offset (due to self-heating) + * @param[in] bus_write pointer to the bus writing function + * @param[in] bus_read pointer to the bus reading function + * @param[in] sleep pointer to the system specific sleep function + * @param[in] state_load pointer to the system-specific state load function + * @param[in] config_load pointer to the system-specific config load function + * + * @return zero if successful, negative otherwise + */ +return_values_init bsec_iot_init(float sample_rate, float temperature_offset, bme680_com_fptr_t bus_write, + bme680_com_fptr_t bus_read, sleep_fct sleep, state_load_fct state_load, config_load_fct config_load) +{ + return_values_init ret = {BME680_OK, BSEC_OK}; + __attribute__((unused)) bsec_library_return_t bsec_status = BSEC_OK; + + uint8_t bsec_state[BSEC_MAX_PROPERTY_BLOB_SIZE] = {0}; + uint8_t bsec_config[BSEC_MAX_PROPERTY_BLOB_SIZE] = {0}; + uint8_t work_buffer[BSEC_MAX_PROPERTY_BLOB_SIZE] = {0}; + int bsec_state_len, bsec_config_len; + + /* Fixed I2C configuration */ + bme680_g.dev_id = BME680_I2C_ADDR_PRIMARY; + bme680_g.intf = BME680_I2C_INTF; + /* User configurable I2C configuration */ + bme680_g.write = bus_write; + bme680_g.read = bus_read; + bme680_g.delay_ms = sleep; + + /* Initialize BME680 API */ + ret.bme680_status = bme680_init(&bme680_g); + if (ret.bme680_status != BME680_OK) + { + return ret; + } + + /* Initialize BSEC library */ + ret.bsec_status = bsec_init(); + if (ret.bsec_status != BSEC_OK) + { + return ret; + } + + /* Load library config, if available */ + bsec_config_len = config_load(bsec_config, sizeof(bsec_config)); + if (bsec_config_len != 0) + { + ret.bsec_status = bsec_set_configuration(bsec_config, bsec_config_len, work_buffer, sizeof(work_buffer)); + if (ret.bsec_status != BSEC_OK) + { + return ret; + } + } + + /* Load previous library state, if available */ + bsec_state_len = state_load(bsec_state, sizeof(bsec_state)); + if (bsec_state_len != 0) + { + ret.bsec_status = bsec_set_state(bsec_state, bsec_state_len, work_buffer, sizeof(work_buffer)); + if (ret.bsec_status != BSEC_OK) + { + return ret; + } + } + + /* Set temperature offset */ + bme680_temperature_offset_g = temperature_offset; + + /* Call to the function which sets the library with subscription information */ + ret.bsec_status = bme680_bsec_update_subscription(sample_rate); + if (ret.bsec_status != BSEC_OK) + { + return ret; + } + + return ret; +} + +/*! + * @brief Trigger the measurement based on sensor settings + * + * @param[in] sensor_settings settings of the BME680 sensor adopted by sensor control function + * @param[in] sleep pointer to the system specific sleep function + * + * @return none + */ +static void bme680_bsec_trigger_measurement(bsec_bme_settings_t *sensor_settings, sleep_fct sleep) +{ + uint16_t meas_period; + uint8_t set_required_settings; + __attribute__((unused)) int8_t bme680_status = BME680_OK; + + /* Check if a forced-mode measurement should be triggered now */ + if (sensor_settings->trigger_measurement) + { + /* Set sensor configuration */ + + bme680_g.tph_sett.os_hum = sensor_settings->humidity_oversampling; + bme680_g.tph_sett.os_pres = sensor_settings->pressure_oversampling; + bme680_g.tph_sett.os_temp = sensor_settings->temperature_oversampling; + bme680_g.gas_sett.run_gas = sensor_settings->run_gas; + bme680_g.gas_sett.heatr_temp = sensor_settings->heater_temperature; /* degree Celsius */ + bme680_g.gas_sett.heatr_dur = sensor_settings->heating_duration; /* milliseconds */ + + /* Select the power mode */ + /* Must be set before writing the sensor configuration */ + bme680_g.power_mode = BME680_FORCED_MODE; + /* Set the required sensor settings needed */ + set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_GAS_SENSOR_SEL; + + /* Set the desired sensor configuration */ + bme680_status = bme680_set_sensor_settings(set_required_settings, &bme680_g); + + /* Set power mode as forced mode and trigger forced mode measurement */ + bme680_status = bme680_set_sensor_mode(&bme680_g); + + /* Get the total measurement duration so as to sleep or wait till the measurement is complete */ + bme680_get_profile_dur(&meas_period, &bme680_g); + + /* Delay till the measurement is ready. Timestamp resolution in ms */ + sleep((uint32_t)meas_period); + } + + /* Call the API to get current operation mode of the sensor */ + bme680_status = bme680_get_sensor_mode(&bme680_g); + /* When the measurement is completed and data is ready for reading, the sensor must be in BME680_SLEEP_MODE. + * Read operation mode to check whether measurement is completely done and wait until the sensor is no more + * in BME680_FORCED_MODE. */ + while (bme680_g.power_mode == BME680_FORCED_MODE) + { + /* sleep for 5 ms */ + sleep(5); + bme680_status = bme680_get_sensor_mode(&bme680_g); + } +} + +/*! + * @brief Read the data from registers and populate the inputs structure to be passed to do_steps function + * + * @param[in] time_stamp_trigger settings of the sensor returned from sensor control function + * @param[in] inputs input structure containing the information on sensors to be passed to do_steps + * @param[in] num_bsec_inputs number of inputs to be passed to do_steps + * @param[in] bsec_process_data process data variable returned from sensor_control + * + * @return none + */ +static void bme680_bsec_read_data(int64_t time_stamp_trigger, bsec_input_t *inputs, uint8_t *num_bsec_inputs, + int32_t bsec_process_data) +{ + static struct bme680_field_data data; + __attribute__((unused)) int8_t bme680_status = BME680_OK; + + /* We only have to read data if the previous call the bsec_sensor_control() actually asked for it */ + if (bsec_process_data) + { + bme680_status = bme680_get_sensor_data(&data, &bme680_g); + + if (data.status & BME680_NEW_DATA_MSK) + { + /* Pressure to be processed by BSEC */ + if (bsec_process_data & BSEC_PROCESS_PRESSURE) + { + /* Place presssure sample into input struct */ + inputs[*num_bsec_inputs].sensor_id = BSEC_INPUT_PRESSURE; + inputs[*num_bsec_inputs].signal = data.pressure; + inputs[*num_bsec_inputs].time_stamp = time_stamp_trigger; + (*num_bsec_inputs)++; + } + /* Temperature to be processed by BSEC */ + if (bsec_process_data & BSEC_PROCESS_TEMPERATURE) + { + /* Place temperature sample into input struct */ + inputs[*num_bsec_inputs].sensor_id = BSEC_INPUT_TEMPERATURE; + #ifdef BME680_FLOAT_POINT_COMPENSATION + inputs[*num_bsec_inputs].signal = data.temperature; + #else + inputs[*num_bsec_inputs].signal = data.temperature / 100.0f; + #endif + inputs[*num_bsec_inputs].time_stamp = time_stamp_trigger; + (*num_bsec_inputs)++; + + /* Also add optional heatsource input which will be subtracted from the temperature reading to + * compensate for device-specific self-heating (supported in BSEC IAQ solution)*/ + inputs[*num_bsec_inputs].sensor_id = BSEC_INPUT_HEATSOURCE; + inputs[*num_bsec_inputs].signal = bme680_temperature_offset_g; + inputs[*num_bsec_inputs].time_stamp = time_stamp_trigger; + (*num_bsec_inputs)++; + } + /* Humidity to be processed by BSEC */ + if (bsec_process_data & BSEC_PROCESS_HUMIDITY) + { + /* Place humidity sample into input struct */ + inputs[*num_bsec_inputs].sensor_id = BSEC_INPUT_HUMIDITY; + #ifdef BME680_FLOAT_POINT_COMPENSATION + inputs[*num_bsec_inputs].signal = data.humidity; + #else + inputs[*num_bsec_inputs].signal = data.humidity / 1000.0f; + #endif + inputs[*num_bsec_inputs].time_stamp = time_stamp_trigger; + (*num_bsec_inputs)++; + } + /* Gas to be processed by BSEC */ + if (bsec_process_data & BSEC_PROCESS_GAS) + { + /* Check whether gas_valid flag is set */ + if(data.status & BME680_GASM_VALID_MSK) + { + /* Place sample into input struct */ + inputs[*num_bsec_inputs].sensor_id = BSEC_INPUT_GASRESISTOR; + inputs[*num_bsec_inputs].signal = data.gas_resistance; + inputs[*num_bsec_inputs].time_stamp = time_stamp_trigger; + (*num_bsec_inputs)++; + } + } + } + } +} + +/*! + * @brief This function is written to process the sensor data for the requested virtual sensors + * + * @param[in] bsec_inputs input structure containing the information on sensors to be passed to do_steps + * @param[in] num_bsec_inputs number of inputs to be passed to do_steps + * @param[in] output_ready pointer to the function processing obtained BSEC outputs + * + * @return none + */ +static void bme680_bsec_process_data(bsec_input_t *bsec_inputs, uint8_t num_bsec_inputs, output_ready_fct output_ready) +{ + /* Output buffer set to the maximum virtual sensor outputs supported */ + bsec_output_t bsec_outputs[BSEC_NUMBER_OUTPUTS]; + uint8_t num_bsec_outputs = 0; + uint8_t index = 0; + + bsec_library_return_t bsec_status = BSEC_OK; + + int64_t timestamp = 0; + float iaq = 0.0f; + uint8_t iaq_accuracy = 0; + float temp = 0.0f; + float raw_temp = 0.0f; + float raw_pressure = 0.0f; + float humidity = 0.0f; + float raw_humidity = 0.0f; + float raw_gas = 0.0f; + float static_iaq = 0.0f; + __attribute__((unused)) uint8_t static_iaq_accuracy = 0; + float co2_equivalent = 0.0f; + __attribute__((unused)) uint8_t co2_accuracy = 0; + float breath_voc_equivalent = 0.0f; + __attribute__((unused)) uint8_t breath_voc_accuracy = 0; + __attribute__((unused)) float comp_gas_value = 0.0f; + __attribute__((unused)) uint8_t comp_gas_accuracy = 0; + __attribute__((unused)) float gas_percentage = 0.0f; + __attribute__((unused)) uint8_t gas_percentage_acccuracy = 0; + + /* Check if something should be processed by BSEC */ + if (num_bsec_inputs > 0) + { + /* Set number of outputs to the size of the allocated buffer */ + /* BSEC_NUMBER_OUTPUTS to be defined */ + num_bsec_outputs = BSEC_NUMBER_OUTPUTS; + + /* Perform processing of the data by BSEC + Note: + * The number of outputs you get depends on what you asked for during bsec_update_subscription(). This is + handled under bme680_bsec_update_subscription() function in this example file. + * The number of actual outputs that are returned is written to num_bsec_outputs. */ + bsec_status = bsec_do_steps(bsec_inputs, num_bsec_inputs, bsec_outputs, &num_bsec_outputs); + + /* Iterate through the outputs and extract the relevant ones. */ + for (index = 0; index < num_bsec_outputs; index++) + { + switch (bsec_outputs[index].sensor_id) + { + case BSEC_OUTPUT_IAQ: + iaq = bsec_outputs[index].signal; + iaq_accuracy = bsec_outputs[index].accuracy; + break; + case BSEC_OUTPUT_STATIC_IAQ: + static_iaq = bsec_outputs[index].signal; + static_iaq_accuracy = bsec_outputs[index].accuracy; + break; + case BSEC_OUTPUT_CO2_EQUIVALENT: + co2_equivalent = bsec_outputs[index].signal; + co2_accuracy = bsec_outputs[index].accuracy; + break; + case BSEC_OUTPUT_BREATH_VOC_EQUIVALENT: + breath_voc_equivalent = bsec_outputs[index].signal; + breath_voc_accuracy = bsec_outputs[index].accuracy; + break; + case BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE: + temp = bsec_outputs[index].signal; + break; + case BSEC_OUTPUT_RAW_PRESSURE: + raw_pressure = bsec_outputs[index].signal; + break; + case BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY: + humidity = bsec_outputs[index].signal; + break; + case BSEC_OUTPUT_RAW_GAS: + raw_gas = bsec_outputs[index].signal; + break; + case BSEC_OUTPUT_RAW_TEMPERATURE: + raw_temp = bsec_outputs[index].signal; + break; + case BSEC_OUTPUT_RAW_HUMIDITY: + raw_humidity = bsec_outputs[index].signal; + break; + case BSEC_OUTPUT_COMPENSATED_GAS: + comp_gas_value = bsec_outputs[index].signal; + comp_gas_accuracy = bsec_outputs[index].accuracy; + break; + case BSEC_OUTPUT_GAS_PERCENTAGE: + gas_percentage = bsec_outputs[index].signal; + gas_percentage_acccuracy = bsec_outputs[index].accuracy; + break; + default: + continue; + } + + /* Assume that all the returned timestamps are the same */ + timestamp = bsec_outputs[index].time_stamp; + } + + /* Pass the extracted outputs to the user provided output_ready() function. */ + output_ready(timestamp, iaq, iaq_accuracy, temp, humidity, raw_pressure, raw_temp, + raw_humidity, raw_gas, bsec_status, static_iaq, co2_equivalent, breath_voc_equivalent); + } +} + +/*! + * @brief Runs the main (endless) loop that queries sensor settings, applies them, and processes the measured data + * + * @param[in] sleep pointer to the system specific sleep function + * @param[in] get_timestamp_us pointer to the system specific timestamp derivation function + * @param[in] output_ready pointer to the function processing obtained BSEC outputs + * @param[in] state_save pointer to the system-specific state save function + * @param[in] save_intvl interval at which BSEC state should be saved (in samples) + * + * @return none + */ +void bsec_iot_loop(sleep_fct sleep, get_timestamp_us_fct get_timestamp_us, output_ready_fct output_ready, + state_save_fct state_save, uint32_t save_intvl) +{ + /* Timestamp variables */ + int64_t time_stamp = 0; + int64_t time_stamp_interval_ms = 0; + + /* Allocate enough memory for up to BSEC_MAX_PHYSICAL_SENSOR physical inputs*/ + bsec_input_t bsec_inputs[BSEC_MAX_PHYSICAL_SENSOR]; + + /* Number of inputs to BSEC */ + uint8_t num_bsec_inputs = 0; + + /* BSEC sensor settings struct */ + bsec_bme_settings_t sensor_settings; + + /* Save state variables */ + uint8_t bsec_state[BSEC_MAX_STATE_BLOB_SIZE]; + uint8_t work_buffer[BSEC_MAX_STATE_BLOB_SIZE]; + uint32_t bsec_state_len = 0; + uint32_t n_samples = 0; + + bsec_library_return_t bsec_status = BSEC_OK; + + while (1) + { + /* get the timestamp in nanoseconds before calling bsec_sensor_control() */ + time_stamp = get_timestamp_us() * 1000; + + /* Retrieve sensor settings to be used in this time instant by calling bsec_sensor_control */ + bsec_sensor_control(time_stamp, &sensor_settings); + + /* Trigger a measurement if necessary */ + bme680_bsec_trigger_measurement(&sensor_settings, sleep); + + /* Read data from last measurement */ + num_bsec_inputs = 0; + bme680_bsec_read_data(time_stamp, bsec_inputs, &num_bsec_inputs, sensor_settings.process_data); + + /* Time to invoke BSEC to perform the actual processing */ + bme680_bsec_process_data(bsec_inputs, num_bsec_inputs, output_ready); + + /* Increment sample counter */ + n_samples++; + + /* Retrieve and store state if the passed save_intvl */ + if (n_samples >= save_intvl) + { + bsec_status = bsec_get_state(0, bsec_state, sizeof(bsec_state), work_buffer, sizeof(work_buffer), &bsec_state_len); + if (bsec_status == BSEC_OK) + { + state_save(bsec_state, bsec_state_len); + } + n_samples = 0; + } + + + /* Compute how long we can sleep until we need to call bsec_sensor_control() next */ + /* Time_stamp is converted from microseconds to nanoseconds first and then the difference to milliseconds */ + time_stamp_interval_ms = (sensor_settings.next_call - get_timestamp_us() * 1000) / 1000000; + if (time_stamp_interval_ms > 0) + { + sleep((uint32_t)time_stamp_interval_ms); + } + } +} + +/*! @}*/ + diff --git a/lib/vendor/Bosch/BSEC/examples/bsec_integration.h b/lib/vendor/Bosch/BSEC/examples/bsec_integration.h new file mode 100644 index 0000000000000000000000000000000000000000..a15177f9c7a6d3884fa017d50ff1dfd0ae593ae8 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/examples/bsec_integration.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 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_integration.h + * + * @brief + * Contains BSEC integration API + */ + +/*! + * @addtogroup bsec_examples BSEC Examples + * @brief BSEC usage examples + * @{*/ + +#ifndef __BSEC_INTEGRATION_H__ +#define __BSEC_INTEGRATION_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ + +/* Use the following bme680 driver: https://github.com/BoschSensortec/BME680_driver/releases/tag/bme680_v3.5.1 */ +#include "bme680.h" +/* BSEC header files are available in the inc/ folder of the release package */ +#include "bsec_interface.h" +#include "bsec_datatypes.h" + + +/**********************************************************************************************************************/ +/* type definitions */ +/**********************************************************************************************************************/ + +/* function pointer to the system specific sleep function */ +typedef void (*sleep_fct)(uint32_t t_ms); + +/* function pointer to the system specific timestamp derivation function */ +typedef int64_t (*get_timestamp_us_fct)(); + +/* function pointer to the function processing obtained BSEC outputs */ +typedef void (*output_ready_fct)(int64_t timestamp, float iaq, uint8_t iaq_accuracy, float temperature, float humidity, + float pressure, float raw_temperature, float raw_humidity, float gas, bsec_library_return_t bsec_status, + float static_iaq, float co2_equivalent, float breath_voc_equivalent); + +/* function pointer to the function loading a previous BSEC state from NVM */ +typedef uint32_t (*state_load_fct)(uint8_t *state_buffer, uint32_t n_buffer); + +/* function pointer to the function saving BSEC state to NVM */ +typedef void (*state_save_fct)(const uint8_t *state_buffer, uint32_t length); + +/* function pointer to the function loading the BSEC configuration string from NVM */ +typedef uint32_t (*config_load_fct)(uint8_t *state_buffer, uint32_t n_buffer); + +/* structure definitions */ + +/* Structure with the return value from bsec_iot_init() */ +typedef struct{ + /*! Result of API execution status */ + int8_t bme680_status; + /*! Result of BSEC library */ + bsec_library_return_t bsec_status; +}return_values_init; +/**********************************************************************************************************************/ +/* function declarations */ +/**********************************************************************************************************************/ + +/*! + * @brief Initialize the BME680 sensor and the BSEC library + * + * @param[in] sample_rate mode to be used (either BSEC_SAMPLE_RATE_ULP or BSEC_SAMPLE_RATE_LP) + * @param[in] temperature_offset device-specific temperature offset (due to self-heating) + * @param[in] bus_write pointer to the bus writing function + * @param[in] bus_read pointer to the bus reading function + * @param[in] sleep pointer to the system-specific sleep function + * @param[in] state_load pointer to the system-specific state load function + * + * @return zero if successful, negative otherwise + */ +return_values_init bsec_iot_init(float sample_rate, float temperature_offset, bme680_com_fptr_t bus_write, bme680_com_fptr_t bus_read, + sleep_fct sleep, state_load_fct state_load, config_load_fct config_load); + +/*! + * @brief Runs the main (endless) loop that queries sensor settings, applies them, and processes the measured data + * + * @param[in] sleep pointer to the system-specific sleep function + * @param[in] get_timestamp_us pointer to the system-specific timestamp derivation function + * @param[in] output_ready pointer to the function processing obtained BSEC outputs + * @param[in] state_save pointer to the system-specific state save function + * @param[in] save_intvl interval at which BSEC state should be saved (in samples) + * + * @return return_values_init struct with the result of the API and the BSEC library + */ +void bsec_iot_loop(sleep_fct sleep, get_timestamp_us_fct get_timestamp_us, output_ready_fct output_ready, + state_save_fct state_save, uint32_t save_intvl); + +#ifdef __cplusplus +} +#endif + +#endif /* __BSEC_INTEGRATION_H__ */ + +/*! @}*/ + diff --git a/lib/vendor/Bosch/BSEC/examples/bsec_iot_example.c b/lib/vendor/Bosch/BSEC/examples/bsec_iot_example.c new file mode 100644 index 0000000000000000000000000000000000000000..8bc4a216f22c68bfba863894fcb1c81820cb2014 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/examples/bsec_iot_example.c @@ -0,0 +1,258 @@ +/* + * Copyright (C) 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_iot_example.c + * + * @brief + * Example for using of BSEC library in a fixed configuration with the BME680 sensor. + * This works by running an endless loop in the bsec_iot_loop() function. + */ + +/*! + * @addtogroup bsec_examples BSEC Examples + * @brief BSEC usage examples + * @{*/ + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ + +#include "bsec_integration.h" + +/**********************************************************************************************************************/ +/* functions */ +/**********************************************************************************************************************/ + +/*! + * @brief Write operation in either I2C or SPI + * + * param[in] dev_addr I2C or SPI device address + * param[in] reg_addr register address + * param[in] reg_data_ptr pointer to the data to be written + * param[in] data_len number of bytes to be written + * + * @return result of the bus communication function + */ +int8_t bus_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + // ... + // Please insert system specific function to write to the bus where BME680 is connected + // ... + return 0; +} + +/*! + * @brief Read operation in either I2C or SPI + * + * param[in] dev_addr I2C or SPI device address + * param[in] reg_addr register address + * param[out] reg_data_ptr pointer to the memory to be used to store the read data + * param[in] data_len number of bytes to be read + * + * @return result of the bus communication function + */ +int8_t bus_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + // ... + // Please insert system specific function to read from bus where BME680 is connected + // ... + return 0; +} + +/*! + * @brief System specific implementation of sleep function + * + * @param[in] t_ms time in milliseconds + * + * @return none + */ +void sleep(uint32_t t_ms) +{ + // ... + // Please insert system specific function sleep or delay for t_ms milliseconds + // ... +} + +/*! + * @brief Capture the system time in microseconds + * + * @return system_current_time current system timestamp in microseconds + */ +int64_t get_timestamp_us() +{ + int64_t system_current_time = 0; + // ... + // Please insert system specific function to retrieve a timestamp (in microseconds) + // ... + return system_current_time; +} + +/*! + * @brief Handling of the ready outputs + * + * @param[in] timestamp time in nanoseconds + * @param[in] iaq IAQ signal + * @param[in] iaq_accuracy accuracy of IAQ signal + * @param[in] temperature temperature signal + * @param[in] humidity humidity signal + * @param[in] pressure pressure signal + * @param[in] raw_temperature raw temperature signal + * @param[in] raw_humidity raw humidity signal + * @param[in] gas raw gas sensor signal + * @param[in] bsec_status value returned by the bsec_do_steps() call + * + * @return none + */ +void output_ready(int64_t timestamp, float iaq, uint8_t iaq_accuracy, float temperature, float humidity, + float pressure, float raw_temperature, float raw_humidity, float gas, bsec_library_return_t bsec_status, + float static_iaq, float co2_equivalent, float breath_voc_equivalent) +{ + // ... + // Please insert system specific code to further process or display the BSEC outputs + // ... +} + +/*! + * @brief Load previous library state from non-volatile memory + * + * @param[in,out] state_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to state_buffer + */ +uint32_t state_load(uint8_t *state_buffer, uint32_t n_buffer) +{ + // ... + // Load a previous library state from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no state was available, + // otherwise return length of loaded state string. + // ... + return 0; +} + +/*! + * @brief Save library state to non-volatile memory + * + * @param[in] state_buffer buffer holding the state to be stored + * @param[in] length length of the state string to be stored + * + * @return none + */ +void state_save(const uint8_t *state_buffer, uint32_t length) +{ + // ... + // Save the string some form of non-volatile memory, if possible. + // ... +} + +/*! + * @brief Load library config from non-volatile memory + * + * @param[in,out] config_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to config_buffer + */ +uint32_t config_load(uint8_t *config_buffer, uint32_t n_buffer) +{ + // ... + // Load a library config from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no config was available, + // otherwise return length of loaded config string. + // ... + return 0; +} + +/*! + * @brief Main function which configures BSEC library and then reads and processes the data from sensor based + * on timer ticks + * + * @return result of the processing + */ +int main() +{ + return_values_init ret; + + /* Call to the function which initializes the BSEC library + * Switch on low-power mode and provide no temperature offset */ + ret = bsec_iot_init(BSEC_SAMPLE_RATE_LP, 0.0f, bus_write, bus_read, sleep, state_load, config_load); + if (ret.bme680_status) + { + /* Could not intialize BME680 */ + return (int)ret.bme680_status; + } + else if (ret.bsec_status) + { + /* Could not intialize BSEC library */ + return (int)ret.bsec_status; + } + + /* Call to endless loop function which reads and processes data based on sensor settings */ + /* State is saved every 10.000 samples, which means every 10.000 * 3 secs = 500 minutes */ + bsec_iot_loop(sleep, get_timestamp_us, output_ready, state_save, 10000); + + return 0; +} + +/*! @}*/ + diff --git a/lib/vendor/Bosch/BSEC/examples/bsec_iot_example.ino b/lib/vendor/Bosch/BSEC/examples/bsec_iot_example.ino new file mode 100644 index 0000000000000000000000000000000000000000..8d03ec70c60365a5f4756ff37d12bb8231f71bf4 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/examples/bsec_iot_example.ino @@ -0,0 +1,291 @@ +/* + * Copyright (C) 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_iot_example.ino + * + * @brief + * Example for using of BSEC library in a fixed configuration with the BME680 sensor. + * This works by running an endless loop in the bsec_iot_loop() function. + */ + +/*! + * @addtogroup bsec_examples BSEC Examples + * @brief BSEC usage examples + * @{*/ + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ + +#include "bsec_integration.h" +#include <Wire.h> + +/**********************************************************************************************************************/ +/* functions */ +/**********************************************************************************************************************/ + +/*! + * @brief Write operation in either Wire or SPI + * + * param[in] dev_addr Wire or SPI device address + * param[in] reg_addr register address + * param[in] reg_data_ptr pointer to the data to be written + * param[in] data_len number of bytes to be written + * + * @return result of the bus communication function + */ +int8_t bus_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + Wire.beginTransmission(dev_addr); + Wire.write(reg_addr); /* Set register address to start writing to */ + + /* Write the data */ + for (int index = 0; index < data_len; index++) { + Wire.write(reg_data_ptr[index]); + } + + return (int8_t)Wire.endTransmission(); +} + +/*! + * @brief Read operation in either Wire or SPI + * + * param[in] dev_addr Wire or SPI device address + * param[in] reg_addr register address + * param[out] reg_data_ptr pointer to the memory to be used to store the read data + * param[in] data_len number of bytes to be read + * + * @return result of the bus communication function + */ +int8_t bus_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + int8_t comResult = 0; + Wire.beginTransmission(dev_addr); + Wire.write(reg_addr); /* Set register address to start reading from */ + comResult = Wire.endTransmission(); + + delayMicroseconds(150); /* Precautionary response delay */ + Wire.requestFrom(dev_addr, (uint8_t)data_len); /* Request data */ + + int index = 0; + while (Wire.available()) /* The slave device may send less than requested (burst read) */ + { + reg_data_ptr[index] = Wire.read(); + index++; + } + + return comResult; +} + +/*! + * @brief System specific implementation of sleep function + * + * @param[in] t_ms time in milliseconds + * + * @return none + */ +void sleep(uint32_t t_ms) +{ + delay(t_ms); +} + +/*! + * @brief Capture the system time in microseconds + * + * @return system_current_time current system timestamp in microseconds + */ +int64_t get_timestamp_us() +{ + return (int64_t) millis() * 1000; +} + +/*! + * @brief Handling of the ready outputs + * + * @param[in] timestamp time in nanoseconds + * @param[in] iaq IAQ signal + * @param[in] iaq_accuracy accuracy of IAQ signal + * @param[in] temperature temperature signal + * @param[in] humidity humidity signal + * @param[in] pressure pressure signal + * @param[in] raw_temperature raw temperature signal + * @param[in] raw_humidity raw humidity signal + * @param[in] gas raw gas sensor signal + * @param[in] bsec_status value returned by the bsec_do_steps() call + * + * @return none + */ +void output_ready(int64_t timestamp, float iaq, uint8_t iaq_accuracy, float temperature, float humidity, + float pressure, float raw_temperature, float raw_humidity, float gas, bsec_library_return_t bsec_status, + float static_iaq, float co2_equivalent, float breath_voc_equivalent) +{ + Serial.print("["); + Serial.print(timestamp/1e6); + Serial.print("] T: "); + Serial.print(temperature); + Serial.print("| rH: "); + Serial.print(humidity); + Serial.print("| IAQ: "); + Serial.print(iaq); + Serial.print(" ("); + Serial.print(iaq_accuracy); + Serial.print("| Static IAQ: "); + Serial.print(static_iaq); + Serial.print("| CO2e: "); + Serial.print(co2_equivalent); + Serial.print("| bVOC: "); + Serial.println(breath_voc_equivalent); +} + +/*! + * @brief Load previous library state from non-volatile memory + * + * @param[in,out] state_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to state_buffer + */ +uint32_t state_load(uint8_t *state_buffer, uint32_t n_buffer) +{ + // ... + // Load a previous library state from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no state was available, + // otherwise return length of loaded state string. + // ... + return 0; +} + +/*! + * @brief Save library state to non-volatile memory + * + * @param[in] state_buffer buffer holding the state to be stored + * @param[in] length length of the state string to be stored + * + * @return none + */ +void state_save(const uint8_t *state_buffer, uint32_t length) +{ + // ... + // Save the string some form of non-volatile memory, if possible. + // ... +} + +/*! + * @brief Load library config from non-volatile memory + * + * @param[in,out] config_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to config_buffer + */ +uint32_t config_load(uint8_t *config_buffer, uint32_t n_buffer) +{ + // ... + // Load a library config from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no config was available, + // otherwise return length of loaded config string. + // ... + return 0; +} + +/*! + * @brief Main function which configures BSEC library and then reads and processes the data from sensor based + * on timer ticks + * + * @return result of the processing + */ +void setup() +{ + return_values_init ret; + + /* Init I2C and serial communication */ + Wire.begin(); + Serial.begin(115200); + + /* Call to the function which initializes the BSEC library + * Switch on low-power mode and provide no temperature offset */ + ret = bsec_iot_init(BSEC_SAMPLE_RATE_LP, 5.0f, bus_write, bus_read, sleep, state_load, config_load); + if (ret.bme680_status) + { + /* Could not intialize BME680 */ + Serial.println("Error while initializing BME680"); + return; + } + else if (ret.bsec_status) + { + /* Could not intialize BSEC library */ + Serial.println("Error while initializing BSEC library"); + return; + } + + /* Call to endless loop function which reads and processes data based on sensor settings */ + /* State is saved every 10.000 samples, which means every 10.000 * 3 secs = 500 minutes */ + bsec_iot_loop(sleep, get_timestamp_us, output_ready, state_save, 10000); +} + +void loop() +{ +} + +/*! @}*/ + diff --git a/lib/vendor/Bosch/BSEC/examples/bsec_iot_ulp_plus_example.c b/lib/vendor/Bosch/BSEC/examples/bsec_iot_ulp_plus_example.c new file mode 100644 index 0000000000000000000000000000000000000000..33edb90c863f725aad4fa6aad95964facb30afc9 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/examples/bsec_iot_ulp_plus_example.c @@ -0,0 +1,290 @@ +/* + * Copyright (C) 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_iot_ulp_plus_example.c + * + * @brief + * Example for using of BSEC library in a fixed configuration with the BME680 sensor. + * This works by running an endless loop in the bsec_iot_loop() function. + */ + +/*! + * @addtogroup bsec_examples BSEC Examples + * @brief BSEC usage examples + * @{*/ + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ +/* BSEC configuration files are available in the config/ folder of the release package. Please chose a configuration file with 3s maximum time between `bsec_sensor_control()` calls */ +#include "bsec_integration.h" + +/**********************************************************************************************************************/ +/* functions */ +/**********************************************************************************************************************/ + +/*! + * @brief Write operation in either I2C or SPI + * + * param[in] dev_addr I2C or SPI device address + * param[in] reg_addr register address + * param[in] reg_data_ptr pointer to the data to be written + * param[in] data_len number of bytes to be written + * + * @return result of the bus communication function + */ +int8_t bus_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + // ... + // Please insert system specific function to write to the bus where BME680 is connected + // ... + return 0; +} + +/*! + * @brief Read operation in either I2C or SPI + * + * param[in] dev_addr I2C or SPI device address + * param[in] reg_addr register address + * param[out] reg_data_ptr pointer to the memory to be used to store the read data + * param[in] data_len number of bytes to be read + * + * @return result of the bus communication function + */ +int8_t bus_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + // ... + // Please insert system specific function to read from bus where BME680 is connected + // ... + return 0; +} + +/*! + * @brief System specific implementation of sleep function + * + * @param[in] t_ms time in milliseconds + * + * @return none + */ +void sleep(uint32_t t_ms) +{ + // ... + // Please insert system specific function sleep or delay for t_ms milliseconds + // ... +} + +/*! + * @brief Capture the system time in microseconds + * + * @return system_current_time current system timestamp in microseconds + */ +int64_t get_timestamp_us() +{ + int64_t system_current_time = 0; + // ... + // Please insert system specific function to retrieve a timestamp (in microseconds) + // ... + return system_current_time; +} + +/*! + * @brief Handling of the ready outputs + * + * @param[in] timestamp time in nanoseconds + * @param[in] iaq IAQ signal + * @param[in] iaq_accuracy accuracy of IAQ signal + * @param[in] temperature temperature signal + * @param[in] humidity humidity signal + * @param[in] pressure pressure signal + * @param[in] raw_temperature raw temperature signal + * @param[in] raw_humidity raw humidity signal + * @param[in] gas raw gas sensor signal + * @param[in] bsec_status value returned by the bsec_do_steps() call + * + * @return none + */ +void output_ready(int64_t timestamp, float iaq, uint8_t iaq_accuracy, float temperature, float humidity, + float pressure, float raw_temperature, float raw_humidity, float gas, bsec_library_return_t bsec_status, + float static_iaq, float co2_equivalent, float breath_voc_equivalent) +{ + // ... + // Please insert system specific code to further process or display the BSEC outputs + // ... +} + +/*! + * @brief Load previous library state from non-volatile memory + * + * @param[in,out] state_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to state_buffer + */ +uint32_t state_load(uint8_t *state_buffer, uint32_t n_buffer) +{ + // ... + // Load a previous library state from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no state was available, + // otherwise return length of loaded state string. + // ... + return 0; +} + +/*! + * @brief Save library state to non-volatile memory + * + * @param[in] state_buffer buffer holding the state to be stored + * @param[in] length length of the state string to be stored + * + * @return none + */ +void state_save(const uint8_t *state_buffer, uint32_t length) +{ + // ... + // Save the string some form of non-volatile memory, if possible. + // ... +} + +/*! + * @brief Load library config from non-volatile memory + * + * @param[in,out] config_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to config_buffer + */ +uint32_t config_load(uint8_t *config_buffer, uint32_t n_buffer) +{ + // ... + // Load a library config from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no config was available, + // otherwise return length of loaded config string. + // ... + return 0; +} + +/*! + * @brief Interrupt handler for press of a ULP plus button + * + * @return none + */ +void ulp_plus_button_press() +{ + /* We call bsec_update_subscription() in order to instruct BSEC to perform an extra measurement at the next + * possible time slot + */ + + bsec_sensor_configuration_t requested_virtual_sensors[1]; + uint8_t n_requested_virtual_sensors = 1; + bsec_sensor_configuration_t required_sensor_settings[BSEC_MAX_PHYSICAL_SENSOR]; + uint8_t n_required_sensor_settings = BSEC_MAX_PHYSICAL_SENSOR; + bsec_library_return_t status = BSEC_OK; + + /* To trigger a ULP plus, we request the IAQ virtual sensor with a specific sample rate code */ + requested_virtual_sensors[0].sensor_id = BSEC_OUTPUT_IAQ; + requested_virtual_sensors[0].sample_rate = BSEC_SAMPLE_RATE_ULP_MEASUREMENT_ON_DEMAND; + + /* Call bsec_update_subscription() to enable/disable the requested virtual sensors */ + status = bsec_update_subscription(requested_virtual_sensors, n_requested_virtual_sensors, required_sensor_settings, + &n_required_sensor_settings); + + /* The status code would tell is if the request was accepted. It will be rejected if the sensor is not already in + * ULP mode, or if the time difference between requests is too short, for example. */ +} + +/*! + * @brief Main function which configures BSEC library and then reads and processes the data from sensor based + * on timer ticks + * + * @return result of the processing + */ +int main() +{ + return_values_init ret; + // ... + // Attach a button (or other) interrupt here to the ulp_plus_button_press() handler function to + // enable this interrupt to trigger a ULP plus + // ... + + /* Call to the function which initializes the BSEC library + * Switch on ultra_low-power mode and provide no temperature offset */ + ret = bsec_iot_init(BSEC_SAMPLE_RATE_ULP, 0.0f, bus_write, bus_read, sleep, state_load, config_load); + if (ret.bme680_status) + { + /* Could not intialize BME680 or BSEC library */ + return (int)ret.bme680_status; + } + else if (ret.bsec_status) + { + /* Could not intialize BSEC library */ + return (int)ret.bsec_status; + } + /* Call to endless loop function which reads and processes data based on sensor settings */ + /* State is saved every 10.000 samples, which means every 100 * 300 secs = 500 minutes */ + bsec_iot_loop(sleep, get_timestamp_us, output_ready, state_save, 100); + + return 0; +} + +/*! @}*/ + diff --git a/lib/vendor/Bosch/BSEC/examples/bsec_iot_ulp_plus_example.ino b/lib/vendor/Bosch/BSEC/examples/bsec_iot_ulp_plus_example.ino new file mode 100644 index 0000000000000000000000000000000000000000..c96fa2616638ad0a3775c510f3515c2aa4760ca8 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/examples/bsec_iot_ulp_plus_example.ino @@ -0,0 +1,342 @@ +/* + * Copyright (C) 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_iot_ulp_plus_example.ino + * + * @brief + * Example for using of BSEC library in a fixed configuration with the BME680 sensor. + * This works by running an endless loop in the bsec_iot_loop() function. + */ + +/*! + * @addtogroup bsec_examples BSEC Examples + * @brief BSEC usage examples + * @{*/ + +/**********************************************************************************************************************/ +/* header files */ +/**********************************************************************************************************************/ + +#include "bsec_integration.h" +#include "bsec_serialized_configurations_iaq.h" +#include <Wire.h> + +/**********************************************************************************************************************/ +/* functions */ +/**********************************************************************************************************************/ + +/*! + * @brief Write operation in either Wire or SPI + * + * param[in] dev_addr Wire or SPI device address + * param[in] reg_addr register address + * param[in] reg_data_ptr pointer to the data to be written + * param[in] data_len number of bytes to be written + * + * @return result of the bus communication function + */ +int8_t bus_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + Wire.beginTransmission(dev_addr); + Wire.write(reg_addr); /* Set register address to start writing to */ + + /* Write the data */ + for (int index = 0; index < data_len; index++) { + Wire.write(reg_data_ptr[index]); + } + + return (int8_t)Wire.endTransmission(); +} + +/*! + * @brief Read operation in either Wire or SPI + * + * param[in] dev_addr Wire or SPI device address + * param[in] reg_addr register address + * param[out] reg_data_ptr pointer to the memory to be used to store the read data + * param[in] data_len number of bytes to be read + * + * @return result of the bus communication function + */ +int8_t bus_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data_ptr, uint16_t data_len) +{ + int8_t comResult = 0; + Wire.beginTransmission(dev_addr); + Wire.write(reg_addr); /* Set register address to start reading from */ + comResult = Wire.endTransmission(); + + delayMicroseconds(150); /* Precautionary response delay */ + Wire.requestFrom(dev_addr, (uint8_t)data_len); /* Request data */ + + int index = 0; + while (Wire.available()) /* The slave device may send less than requested (burst read) */ + { + reg_data_ptr[index] = Wire.read(); + index++; + } + + return comResult; +} + +/*! + * @brief System specific implementation of sleep function + * + * @param[in] t_ms time in milliseconds + * + * @return none + */ +void sleep(uint32_t t_ms) +{ + delay(t_ms); +} + +/*! + * @brief Capture the system time in microseconds + * + * @return system_current_time current system timestamp in microseconds + */ +int64_t get_timestamp_us() +{ + return (int64_t) millis() * 1000; +} + +/*! + * @brief Handling of the ready outputs + * + * @param[in] timestamp time in nanoseconds + * @param[in] iaq IAQ signal + * @param[in] iaq_accuracy accuracy of IAQ signal + * @param[in] temperature temperature signal + * @param[in] humidity humidity signal + * @param[in] pressure pressure signal + * @param[in] raw_temperature raw temperature signal + * @param[in] raw_humidity raw humidity signal + * @param[in] gas raw gas sensor signal + * @param[in] bsec_status value returned by the bsec_do_steps() call + * + * @return none + */ +void output_ready(int64_t timestamp, float iaq, uint8_t iaq_accuracy, float temperature, float humidity, + float pressure, float raw_temperature, float raw_humidity, float gas, bsec_library_return_t bsec_status, + float static_iaq, float co2_equivalent, float breath_voc_equivalent) +{ + Serial.print("["); + Serial.print(timestamp/1e6); + Serial.print("] T: "); + Serial.print(temperature); + Serial.print("| rH: "); + Serial.print(humidity); + Serial.print("| IAQ: "); + Serial.print(iaq); + Serial.print(" ("); + Serial.print(iaq_accuracy); + Serial.println(")"); +} + +/*! + * @brief Load previous library state from non-volatile memory + * + * @param[in,out] state_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to state_buffer + */ +uint32_t state_load(uint8_t *state_buffer, uint32_t n_buffer) +{ + // ... + // Load a previous library state from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no state was available, + // otherwise return length of loaded state string. + // ... + return 0; +} + +/*! + * @brief Save library state to non-volatile memory + * + * @param[in] state_buffer buffer holding the state to be stored + * @param[in] length length of the state string to be stored + * + * @return none + */ +void state_save(const uint8_t *state_buffer, uint32_t length) +{ + // ... + // Save the string some form of non-volatile memory, if possible. + // ... +} + +/*! + * @brief Load library config from non-volatile memory + * + * @param[in,out] config_buffer buffer to hold the loaded state string + * @param[in] n_buffer size of the allocated state buffer + * + * @return number of bytes copied to config_buffer + */ +uint32_t config_load(uint8_t *config_buffer, uint32_t n_buffer) +{ + // ... + // Load a library config from non-volatile memory, if available. + // + // Return zero if loading was unsuccessful or no config was available, + // otherwise return length of loaded config string. + // ... + + memcpy(config_buffer, bsec_config_iaq, sizeof(bsec_config_iaq)); + return sizeof(bsec_config_iaq); +} + +/*! + * @brief Interrupt handler for press of a ULP plus button + * + * @return none + */ +void ulp_plus_button_press() +{ + /* We call bsec_update_subscription() in order to instruct BSEC to perform an extra measurement at the next + * possible time slot + */ + + bsec_sensor_configuration_t requested_virtual_sensors[1]; + uint8_t n_requested_virtual_sensors = 1; + bsec_sensor_configuration_t required_sensor_settings[BSEC_MAX_PHYSICAL_SENSOR]; + uint8_t n_required_sensor_settings = BSEC_MAX_PHYSICAL_SENSOR; + bsec_library_return_t status = BSEC_OK; + + /* To trigger a ULP plus, we request the IAQ virtual sensor with a specific sample rate code */ + requested_virtual_sensors[0].sensor_id = BSEC_OUTPUT_IAQ_ESTIMATE; + requested_virtual_sensors[0].sample_rate = BSEC_SAMPLE_RATE_ULP_MEASUREMENT_ON_DEMAND; + + /* Call bsec_update_subscription() to enable/disable the requested virtual sensors */ + status = bsec_update_subscription(requested_virtual_sensors, n_requested_virtual_sensors, required_sensor_settings, + &n_required_sensor_settings); + + /* The status code would tell is if the request was accepted. It will be rejected if the sensor is not already in + * ULP mode, or if the time difference between requests is too short, for example. */ + if (status == BSEC_OK) + { + Serial.println("ULP plus triggered sucessfully."); + } + else + { + Serial.print("ULP plus request rejected. "); + switch (status) + { + case BSEC_W_SC_MODEXCEEDULPTIMELIMIT: + Serial.println("Request came within 20 s of a previous measurement."); + break; + case BSEC_W_SC_MODINSUFFICIENTWAITTIME: + Serial.println("Request came within 20 s of a ULP plus."); + break; + case BSEC_W_SU_MODINNOULP: + Serial.println("Sensor not in ULP mode."); + break; + } + } +} + +/*! + * @brief Main function which configures BSEC library and then reads and processes the data from sensor based + * on timer ticks + * + * @return result of the processing + */ +void setup() +{ + return_values_init ret; + + /* Init I2C and serial communication */ + Wire.begin(); + Serial.begin(115200); + + /* Setup button interrupt to trigger ULP plus */ + pinMode(2, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(2), ulp_plus_button_press, FALLING); + + /* Call to the function which initializes the BSEC library + * Switch on ultra_low-power mode and provide no temperature offset */ + ret = bsec_iot_init(BSEC_SAMPLE_RATE_ULP, 5.0f, bus_write, bus_read, sleep, state_load, config_load); + if (ret.bme680_status) + { + /* Could not intialize BME680 */ + Serial.println("Error while initializing BME680"); + return; + } + else if (ret.bsec_status) + { + /* Could not intialize BSEC library */ + Serial.println("Error while initializing BSEC library"); + return; + } + + /* Call to endless loop function which reads and processes data based on sensor settings */ + /* State is saved every 10.000 samples, which means every 100 * 300 secs = 500 minutes */ + bsec_iot_loop(sleep, get_timestamp_us, output_ready, state_save, 100); +} + +void loop() +{ +} + +/*! @}*/ + diff --git a/lib/vendor/Bosch/BSEC/integration_guide/BST-BME680-Integration-Guide-AN008-47.pdf b/lib/vendor/Bosch/BSEC/integration_guide/BST-BME680-Integration-Guide-AN008-47.pdf new file mode 100644 index 0000000000000000000000000000000000000000..49804ef10c242e953b466a4320a167fbdfe22932 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/integration_guide/BST-BME680-Integration-Guide-AN008-47.pdf @@ -0,0 +1,17895 @@ +%PDF-1.7 +%���� +4 0 obj +<< /S /GoTo /D (chapter.1) >> +endobj +7 0 obj +(\376\377\000B\000S\000E\000C\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n\000\040\000G\000u\000i\000d\000e\000l\000i\000n\000e) +endobj +8 0 obj +<< /S /GoTo /D (section.1.1) >> +endobj +11 0 obj +(\376\377\000O\000v\000e\000r\000v\000i\000e\000w\000\040\000o\000f\000\040\000B\000M\000E\000\040\000F\000a\000m\000i\000l\000y\000\040\000S\000e\000n\000s\000o\000r\000s) +endobj +12 0 obj +<< /S /GoTo /D (section.1.2) >> +endobj +15 0 obj +(\376\377\000T\000h\000e\000\040\000E\000n\000v\000i\000r\000o\000n\000m\000e\000n\000t\000a\000l\000\040\000F\000u\000s\000i\000o\000n\000\040\000L\000i\000b\000r\000a\000r\000y\000\040\000B\000S\000E\000C) +endobj +16 0 obj +<< /S /GoTo /D (subsection.1.2.1) >> +endobj +19 0 obj +(\376\377\000B\000S\000E\000C\000\040\000L\000i\000b\000r\000a\000r\000y\000\040\000S\000o\000l\000u\000t\000i\000o\000n\000s) +endobj +20 0 obj +<< /S /GoTo /D (subsection.1.2.2) >> +endobj +23 0 obj +(\376\377\000B\000S\000E\000C\000\040\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\000S\000e\000t\000t\000i\000n\000g\000s) +endobj +24 0 obj +<< /S /GoTo /D (subsection.1.2.3) >> +endobj +27 0 obj +(\376\377\000K\000e\000y\000\040\000F\000e\000a\000t\000u\000r\000e\000s) +endobj +28 0 obj +<< /S /GoTo /D (subsection.1.2.4) >> +endobj +31 0 obj +(\376\377\000S\000u\000p\000p\000o\000r\000t\000e\000d\000\040\000V\000i\000r\000t\000u\000a\000l\000\040\000S\000e\000n\000s\000o\000r\000\040\000O\000u\000t\000p\000u\000t\000\040\000S\000i\000g\000n\000a\000l\000s) +endobj +32 0 obj +<< /S /GoTo /D (section.1.3) >> +endobj +35 0 obj +(\376\377\000R\000e\000q\000u\000i\000r\000e\000m\000e\000n\000t\000s\000\040\000f\000o\000r\000\040\000I\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n) +endobj +36 0 obj +<< /S /GoTo /D (subsection.1.3.1) >> +endobj +39 0 obj +(\376\377\000H\000a\000r\000d\000w\000a\000r\000e) +endobj +40 0 obj +<< /S /GoTo /D (subsection.1.3.2) >> +endobj +43 0 obj +(\376\377\000S\000o\000f\000t\000w\000a\000r\000e\000\040\000F\000r\000a\000m\000e\000w\000o\000r\000k) +endobj +44 0 obj +<< /S /GoTo /D (subsection.1.3.3) >> +endobj +47 0 obj +(\376\377\000P\000h\000y\000s\000i\000c\000a\000l\000\040\000I\000n\000p\000u\000t\000\040\000S\000e\000n\000s\000o\000r\000\040\000S\000i\000g\000n\000a\000l\000s) +endobj +48 0 obj +<< /S /GoTo /D (subsection.1.3.4) >> +endobj +51 0 obj +(\376\377\000B\000u\000i\000l\000d\000\040\000t\000h\000e\000\040\000S\000o\000l\000u\000t\000i\000o\000n) +endobj +52 0 obj +<< /S /GoTo /D (chapter.2) >> +endobj +55 0 obj +(\376\377\000B\000S\000E\000C\000\040\000S\000t\000e\000p\000-\000b\000y\000-\000s\000t\000e\000p\000\040\000E\000x\000a\000m\000p\000l\000e) +endobj +56 0 obj +<< /S /GoTo /D (section.2.1) >> +endobj +59 0 obj +(\376\377\000P\000r\000e\000r\000e\000q\000u\000i\000s\000i\000t\000e\000s) +endobj +60 0 obj +<< /S /GoTo /D (section.2.2) >> +endobj +63 0 obj +(\376\377\000S\000e\000t\000t\000i\000n\000g\000\040\000E\000v\000e\000r\000y\000t\000h\000i\000n\000g\000\040\000U\000p) +endobj +64 0 obj +<< /S /GoTo /D (section.2.3) >> +endobj +67 0 obj +(\376\377\000T\000h\000e\000\040\000E\000x\000a\000m\000p\000l\000e\000\040\000C\000o\000d\000e) +endobj +68 0 obj +<< /S /GoTo /D (section.2.4) >> +endobj +71 0 obj +(\376\377\000H\000e\000l\000l\000o\000\040\000`\000\250\000I\000n\000d\000o\000o\000r\000-\000A\000i\000r\000-\000Q\000u\000a\000l\000i\000t\000y\000`\000\250) +endobj +72 0 obj +<< /S /GoTo /D (section.2.5) >> +endobj +75 0 obj +(\376\377\000R\000e\000d\000u\000c\000i\000n\000g\000\040\000p\000o\000w\000e\000r\000\040\000c\000o\000n\000s\000u\000m\000p\000t\000i\000o\000n) +endobj +76 0 obj +<< /S /GoTo /D (section.2.6) >> +endobj +79 0 obj +(\376\377\000T\000r\000i\000g\000g\000e\000r\000\040\000U\000L\000P\000\040\000p\000l\000u\000s) +endobj +80 0 obj +<< /S /GoTo /D (section.2.7) >> +endobj +83 0 obj +(\376\377\000T\000e\000m\000p\000e\000r\000a\000t\000u\000r\000e\000\040\000o\000f\000f\000s\000e\000t\000s\000\040\000d\000u\000e\000\040\000t\000o\000\040\000h\000e\000a\000t\000\040\000s\000o\000u\000r\000c\000e\000s\000\040\000o\000n\000\040\000t\000h\000e\000\040\000b\000o\000a\000r\000d) +endobj +84 0 obj +<< /S /GoTo /D (section.2.8) >> +endobj +87 0 obj +(\376\377\000S\000i\000m\000u\000l\000a\000t\000e\000\040\000m\000u\000l\000t\000i\000p\000l\000e\000\040\000s\000e\000n\000s\000o\000r\000s\000\040\000u\000s\000i\000n\000g\000\040\000s\000i\000n\000g\000l\000e\000\040\000B\000S\000E\000C\000\040\000i\000n\000s\000t\000a\000n\000c\000e) +endobj +88 0 obj +<< /S /GoTo /D (section.2.9) >> +endobj +91 0 obj +(\376\377\000Q\000u\000i\000c\000k\000\040\000U\000l\000t\000r\000a\000-\000l\000o\000w\000\040\000P\000o\000w\000e\000r\000\040\000m\000o\000d\000e\000\040\000\050\000q\000-\000U\000L\000P\000\051) +endobj +92 0 obj +<< /S /GoTo /D (section.2.10) >> +endobj +95 0 obj +(\376\377\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n) +endobj +96 0 obj +<< /S /GoTo /D (chapter.3) >> +endobj +99 0 obj +(\376\377\000F\000A\000Q) +endobj +100 0 obj +<< /S /GoTo /D (section.3.1) >> +endobj +103 0 obj +(\376\377\000N\000o\000\040\000O\000u\000t\000p\000u\000t\000\040\000F\000r\000o\000m\000\040\000b\000s\000e\000c\000\137\000d\000o\000\137\000s\000t\000e\000p\000s\000\050\000\051) +endobj +104 0 obj +<< /S /GoTo /D (section.3.2) >> +endobj +107 0 obj +(\376\377\000I\000A\000Q\000\040\000o\000u\000t\000p\000u\000t\000\040\000d\000o\000e\000s\000\040\000n\000o\000t\000\040\000c\000h\000a\000n\000g\000e\000\040\000o\000r\000\040\000a\000c\000c\000u\000r\000a\000c\000y\000\040\000r\000e\000m\000a\000i\000n\000s\000\040\0000) +endobj +108 0 obj +<< /S /GoTo /D (section.3.3) >> +endobj +111 0 obj +(\376\377\000E\000r\000r\000o\000r\000\040\000C\000o\000d\000e\000s\000\040\000a\000n\000d\000\040\000C\000o\000r\000r\000e\000c\000t\000i\000v\000e\000\040\000M\000e\000a\000s\000u\000r\000e\000s) +endobj +112 0 obj +<< /S /GoTo /D (subsection.3.3.1) >> +endobj +115 0 obj +(\376\377\000E\000r\000r\000o\000r\000s\000\040\000R\000e\000t\000u\000r\000n\000e\000d\000\040\000b\000y\000\040\000b\000s\000e\000c\000\137\000d\000o\000\137\000s\000t\000e\000p\000s\000\050\000\051) +endobj +116 0 obj +<< /S /GoTo /D (subsection.3.3.2) >> +endobj +119 0 obj +(\376\377\000E\000r\000r\000o\000r\000s\000\040\000R\000e\000t\000u\000r\000n\000e\000d\000\040\000b\000y\000\040\000b\000s\000e\000c\000\137\000u\000p\000d\000a\000t\000e\000\137\000s\000u\000b\000s\000c\000r\000i\000p\000t\000i\000o\000n\000\050\000\051) +endobj +120 0 obj +<< /S /GoTo /D (subsection.3.3.3) >> +endobj +123 0 obj +(\376\377\000E\000r\000r\000o\000r\000s\000\040\000R\000e\000t\000u\000r\000n\000e\000d\000\040\000b\000y\000\040\000b\000s\000e\000c\000\137\000s\000e\000t\000\137\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\050\000\051\000\040\000/\000\040\000b\000s\000e\000c\000\137\000s\000e\000t\000\137\000s\000t\000a\000t\000e\000\050\000\051) +endobj +124 0 obj +<< /S /GoTo /D (subsection.3.3.4) >> +endobj +127 0 obj +(\376\377\000E\000r\000r\000o\000r\000s\000\040\000R\000e\000t\000u\000r\000n\000e\000d\000\040\000b\000y\000\040\000b\000s\000e\000c\000\137\000s\000e\000n\000s\000o\000r\000\137\000c\000o\000n\000t\000r\000o\000l\000\050\000\051) +endobj +128 0 obj +<< /S /GoTo /D (chapter.4) >> +endobj +131 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +132 0 obj +<< /S /GoTo /D (section.4.1) >> +endobj +135 0 obj +(\376\377\000B\000S\000E\000C\000\040\000C\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e) +endobj +136 0 obj +<< /S /GoTo /D (subsection.4.1.1) >> +endobj +139 0 obj +(\376\377\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000U\000s\000a\000g\000e) +endobj +140 0 obj +<< /S /GoTo /D (subsection.4.1.2) >> +endobj +143 0 obj +(\376\377\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000s) +endobj +144 0 obj +<< /S /GoTo /D (subsection.4.1.3) >> +endobj +147 0 obj +(\376\377\000E\000n\000u\000m\000e\000r\000a\000t\000i\000o\000n\000s) +endobj +148 0 obj +<< /S /GoTo /D (subsection.4.1.4) >> +endobj +151 0 obj +(\376\377\000D\000e\000f\000i\000n\000e\000s) +endobj +152 0 obj +<< /S /GoTo /D (chapter.5) >> +endobj +155 0 obj +(\376\377\000D\000a\000t\000a\000\040\000S\000t\000r\000u\000c\000t\000u\000r\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +156 0 obj +<< /S /GoTo /D (section.5.1) >> +endobj +159 0 obj +(\376\377\000b\000s\000e\000c\000\137\000b\000m\000e\000\137\000s\000e\000t\000t\000i\000n\000g\000s\000\137\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +160 0 obj +<< /S /GoTo /D (subsection.5.1.1) >> +endobj +163 0 obj +(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) +endobj +164 0 obj +<< /S /GoTo /D (subsection.5.1.2) >> +endobj +167 0 obj +(\376\377\000F\000i\000e\000l\000d\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +168 0 obj +<< /S /GoTo /D (section.5.2) >> +endobj +171 0 obj +(\376\377\000b\000s\000e\000c\000\137\000i\000n\000p\000u\000t\000\137\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +172 0 obj +<< /S /GoTo /D (subsection.5.2.1) >> +endobj +175 0 obj +(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) +endobj +176 0 obj +<< /S /GoTo /D (subsection.5.2.2) >> +endobj +179 0 obj +(\376\377\000F\000i\000e\000l\000d\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +180 0 obj +<< /S /GoTo /D (section.5.3) >> +endobj +183 0 obj +(\376\377\000b\000s\000e\000c\000\137\000o\000u\000t\000p\000u\000t\000\137\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +184 0 obj +<< /S /GoTo /D (subsection.5.3.1) >> +endobj +187 0 obj +(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) +endobj +188 0 obj +<< /S /GoTo /D (subsection.5.3.2) >> +endobj +191 0 obj +(\376\377\000F\000i\000e\000l\000d\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +192 0 obj +<< /S /GoTo /D (section.5.4) >> +endobj +195 0 obj +(\376\377\000b\000s\000e\000c\000\137\000s\000e\000n\000s\000o\000r\000\137\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\137\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +196 0 obj +<< /S /GoTo /D (subsection.5.4.1) >> +endobj +199 0 obj +(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) +endobj +200 0 obj +<< /S /GoTo /D (subsection.5.4.2) >> +endobj +203 0 obj +(\376\377\000F\000i\000e\000l\000d\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +204 0 obj +<< /S /GoTo /D (section.5.5) >> +endobj +207 0 obj +(\376\377\000b\000s\000e\000c\000\137\000v\000e\000r\000s\000i\000o\000n\000\137\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +208 0 obj +<< /S /GoTo /D (subsection.5.5.1) >> +endobj +211 0 obj +(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) +endobj +212 0 obj +<< /S /GoTo /D (subsection.5.5.2) >> +endobj +215 0 obj +(\376\377\000F\000i\000e\000l\000d\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +216 0 obj +<< /S /GoTo /D [217 0 R /Fit] >> +endobj +224 0 obj +<< +/Length 1012 +/Filter /FlateDecode +>> +stream +xڭUK��6��W�h%ͧD�'�m�h�z�䠕h[�-9��������M;V�.?8�8�M0��G�E���W�0E�(b��J��D�E� z2�����XjBc��-�c�iF���W�ڍ�-G��џ�'H�_�+0�M��ľB�'�2��ee��ջ�Gm!1�� #iI��瑮�!EL��P�Q�{X�;`\���@�"!��;�:"� +��b�������*�u)F"-����2D��[��8�D�U��zj���U��v�(�)�81W�?��Dpu+4�z��=�+� �BH㪙-F�_�D���B�%��Z�J�b�z(���&/� �����N�,>�� +�!<8r��㬬ӵw����%���+��,��h���z�����g��l~�V���u�8�� pr�L�/��ӝE��]�JYO"�#{U z~E�z�^�,c?�����ӥeυ���E�-�1t�W��bbb��H��W�������iK��_kek[=�l�������>i���O۴�M��t���6/y�.��AQ6yjOC���q�3�o�l�f��T��|1Qj�g��"Mq@iܲ���R�e|�n@���Q`3$(����/e��*��Kk�u�m��]��#���D�N4�g/�=�(p����������C�qI��Fnh0���� +�r����ޡ�p�\�Ĉٯ�Q'�h�ϴ��^μ7;�/�c�s���i��+��u����Ĉ1f$��%�,�/��-��2E�� +r1q�m;�ΤeSڒ$���<&�����(��_�0�b�� dc�/A�xn���������o��ƴ�&,��l���W���~���T�8��e�X%U�+�������M����ݦ̛vNt[��Ue�O[��fy�:�T��>�Ij�����w��Y[�a����K@�@�Gnq#���\�ɖ�v��d�.��͙����_�p؝��o��n�!C3�_���M +endstream +endobj +217 0 obj +<< +/Type /Page +/Contents 224 0 R +/Resources 223 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 230 0 R +/Group 226 0 R +>> +endobj +220 0 obj +<< +/Type /XObject +/Subtype /Form +/FormType 1 +/PTEX.FileName (./Bosch-SupergraphicUp-Gray-Medium-top.pdf) +/PTEX.PageNumber 1 +/PTEX.InfoDict 231 0 R +/BBox [0 0 504.566101 1275.590576] +/Group 226 0 R +/Resources << +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>>/XObject << +/x5 232 0 R +/x6 233 0 R +/x7 234 0 R +/x8 235 0 R +/x9 236 0 R +/x10 237 0 R +/x11 238 0 R +/x12 239 0 R +/x13 240 0 R +/x14 241 0 R +/x15 242 0 R +/x16 243 0 R +/x17 244 0 R +/x18 245 0 R +/x19 246 0 R +/x20 247 0 R +/x21 248 0 R +/x22 249 0 R +>>>> +/Length 1151 +/Filter /FlateDecode +>> +stream +x��WK�7�����EI$��/�U����f&�K69~��UK�<�L뵨b���|���EO�b`N�c ,�?������?ݧ#�������VR���{�������_��0!R�-p#�8#Z�{��j)pU�:δY�?�'�T٧ZC[w=�MTr���늉#[��c����1q��:EKP-& +L=�-����y��(�e�e.%�DJ���k�fFih�V�{��(�K�t�T����{]��E9��ޖ�/�=ܭ��R��G̅;�3_�e52&�Q���֫��M��9�KD���*%)v'��2l��rʶ�B�����X�� Q�3�jH�?|R�n2���&�A���2�!��V x�6�7.�|�� ��p>e��y;h�D5��t���p4�m�ȣ� ��RCQ��%��BnˎD���B����¦̌���!"�@��Vu�!Y�5e�5� ���}�@�-|���.,�)� �:�ɐ~�0�%�J�01p8.��X����V�6�L%�r�lT�#�Ώ�:�W1u:���hL:�����?+�T ��nP%����[�(�kR�2^��$'tA��ْ��aئ�E��Ϧ?(�Z|��R������Vd��U3=�q�Z�+�(�E�;�"�e{N�us�'o�t�ZPu�z�!�������l��ʝ�'�o�� a�o�6 rP��uݱH T�����4B9Zw�@�AW��$o��sޥ�4�_m"�,q�u�L�5X����m�݁xJiJ�gb 6e��=m�n��e��.]«�����5�e��l�͓n7�����f�z�����K�'a�� +�hA4���*n ,y���m�����f<C{���3R� %��P�"V匢�����`��lA�0w�ןc7p{�8���Pn�G��RP��.�v]b���y�Nc�ͨv�@�'�l��@���i�N�nt?��>L�5+�_n�v�o��ۼ�u��kRߨ�I����.�Q��3,o��J%�M��0�-��x���vb���`@�k�M��"ū�N�)�S7��a��d��I��f��c;]�₪�=�����-�ɮ�O�nEp�`nK���R�����.�u�e?m�Ŀ�ڌ�;��8��n�?��9�p���u2����C���[G, +endstream +endobj +231 0 obj +<< +/Creator (cairo 1.15.2 \(http://cairographics.org\)) +/Producer (cairo 1.15.2 \(http://cairographics.org\)) +>> +endobj +232 0 obj +<< +/Length 250 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 251 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ02Sp�� +B�}�s +endstream +endobj +233 0 obj +<< +/Length 252 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 253 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ0�Tp�� +B�}�v +endstream +endobj +234 0 obj +<< +/Length 254 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 255 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ06Rp�� +B�}lp +endstream +endobj +235 0 obj +<< +/Length 256 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 257 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ06Up�� +B�}�s +endstream +endobj +236 0 obj +<< +/Length 258 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 259 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ0�Pp�� +B�}�v +endstream +endobj +237 0 obj +<< +/Length 260 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 261 0 R +>> +stream +x�+� +T(�2P04�4г47V050�353S�����+�*�+�qr*�!�L���O4PH/VЯ01Tp�� +B�x +endstream +endobj +238 0 obj +<< +/Length 262 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 263 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ01Qp�� +B�}�s +endstream +endobj +239 0 obj +<< +/Length 264 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 265 0 R +>> +stream +x�+� +T(�2P04�4г47V050�353S�����+�*�+�qr*�!�L���O4PH/VЯ��q�� +B�A~ +endstream +endobj +240 0 obj +<< +/Length 266 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 267 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ05Pp�� +B�}np +endstream +endobj +241 0 obj +<< +/Length 268 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 269 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ05Vp�� +B�}�s +endstream +endobj +242 0 obj +<< +/Length 270 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 271 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ05Sp�� +B�}�v +endstream +endobj +243 0 obj +<< +/Length 272 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 273 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ0�Tp�� +B�}�y +endstream +endobj +244 0 obj +<< +/Length 274 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 275 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ03Rp�� +B�}�s +endstream +endobj +245 0 obj +<< +/Length 276 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 277 0 R +>> +stream +x�+� +T(�2P04�4г47V050�353S�����+�*�+�qr*�!�L���O4PH/VЯ03Up�� +B�C~ +endstream +endobj +246 0 obj +<< +/Length 278 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 279 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ0�Pp�� +B�}�y +endstream +endobj +247 0 obj +<< +/Length 280 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 281 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ07Tp�� +B�}�s +endstream +endobj +248 0 obj +<< +/Length 282 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 283 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ07Qp�� +B�}�v +endstream +endobj +249 0 obj +<< +/Length 284 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 285 0 R +>> +stream +x�+� +T(�2P04�4г43T050�353S����*�*�+�qr*�!�L���O4PH/VЯ07Wp�� +B�}�y +endstream +endobj +250 0 obj +75 +endobj +251 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x26 286 0 R +>> +>> +endobj +252 0 obj +75 +endobj +253 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x29 287 0 R +>> +>> +endobj +254 0 obj +75 +endobj +255 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x32 288 0 R +>> +>> +endobj +256 0 obj +75 +endobj +257 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x35 289 0 R +>> +>> +endobj +258 0 obj +75 +endobj +259 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x38 290 0 R +>> +>> +endobj +260 0 obj +75 +endobj +261 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x41 291 0 R +>> +>> +endobj +262 0 obj +75 +endobj +263 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x44 292 0 R +>> +>> +endobj +264 0 obj +74 +endobj +265 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x47 293 0 R +>> +>> +endobj +266 0 obj +75 +endobj +267 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x50 294 0 R +>> +>> +endobj +268 0 obj +75 +endobj +269 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x53 295 0 R +>> +>> +endobj +270 0 obj +75 +endobj +271 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x56 296 0 R +>> +>> +endobj +272 0 obj +75 +endobj +273 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x59 297 0 R +>> +>> +endobj +274 0 obj +75 +endobj +275 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x62 298 0 R +>> +>> +endobj +276 0 obj +75 +endobj +277 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x65 299 0 R +>> +>> +endobj +278 0 obj +75 +endobj +279 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x68 300 0 R +>> +>> +endobj +280 0 obj +75 +endobj +281 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x71 301 0 R +>> +>> +endobj +282 0 obj +75 +endobj +283 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x74 302 0 R +>> +>> +endobj +284 0 obj +75 +endobj +285 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/XObject << +/x77 303 0 R +>> +>> +endobj +286 0 obj +<< +/Length 304 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 305 0 R +>> +stream +x�M�1 +�@D�>��gׄ5ǰ�mt��X�o>�S*iH)�Q:8M��y���Z0�Ⓢ�_"{��wd�j�y�v"֊�n=Q7�n4� +endstream +endobj +287 0 obj +<< +/Length 306 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 307 0 R +>> +stream +x�U�1 +�@D�^��X[����R���g�Yܙ�|�)�LTұ,I�0���tA���'� ��e��M}�d�Yw��]�����}����� +endstream +endobj +288 0 obj +<< +/Length 308 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 309 0 R +>> +stream +x�M�11{�b?߆�q�*j�׀t���i���j9�PIC�I�hp�z���[��� )��m\rw�n�y��`�eI��0���:o���kb��蘻\W~:#> +endstream +endobj +289 0 obj +<< +/Length 310 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 311 0 R +>> +stream +x�U�1 +�@D�^��X�j���R���g�6��o>�C&*�0KjFE�kL74��x�'����yf<�(�h�L�u�i���2��u`[O�M��b�` +endstream +endobj +290 0 obj +<< +/Length 312 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 313 0 R +>> +stream +x�U�1�@D�ާ�ę��`|*j�i@ +{��������B'��r@Wb��"�y����gF����<Ȃ�\������X�Vs���}1� +endstream +endobj +291 0 obj +<< +/Length 314 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 92 505 193] +/Resources 315 0 R +>> +stream +x�M�1�@{^�/ �w��<�M�8E��K� +�FB�`��a�;��S<��M��H���M� �E��^���¡=���iE]�*������Z&s�c|���� +xѓ��%< +endstream +endobj +292 0 obj +<< +/Length 316 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 317 0 R +>> +stream +x�U�1�@{�b?g������B�)��%Nth��s�)�t���!������xg��fEU�s¶�捶�y�6n��d�ρu���/|� +endstream +endobj +293 0 obj +<< +/Length 318 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 289] +/Resources 319 0 R +>> +stream +x�}�K� D�9�O��>F��M�Im�/��G>j��o���KP�.b��'�I �=���#0A�#��#��� }���ɧcM�jP�ƶ;TTP�ǂ�ءV�R��Źg��7�RDMiw�- �$�Z�Fli��T�i�]2'�����my�1��4�Vl��;� 4#�ގ�g>dKJ����7av�w_W-e� +endstream +endobj +294 0 obj +<< +/Length 320 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 321 0 R +>> +stream +x�M�1�0{�b?��6�<��! H\�/]Du�j��GI̤A�2������wǂ[�>y��I�����(�ȓU+��a%����ʂv����� + +endstream +endobj +295 0 obj +<< +/Length 322 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 323 0 R +>> +stream +x�]�A +A����d;��l��'�"�^��?(^�KQ�ю�)�C�(�A�H�oO�n8�ٺ� +S�N�0q����H��(]e��%���\���2we`�m��H�0 +endstream +endobj +296 0 obj +<< +/Length 324 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 325 0 R +>> +stream +x�M�1�@{�b?p����gPQ#�HR��K �h���!�4S3½L+ݨ=���3�y���4�U�UU"��j��9\�6��[�&�+q�r3<'��� �].?�9#. +endstream +endobj +297 0 obj +<< +/Length 326 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 327 0 R +>> +stream +x�M�1 +�0�{�~@�}gY�H�:718�?Dvev�=��L:��\˄��(HW/��xb���Q�v�}�R!��SyQ�Qxmx���m��6{t�� +endstream +endobj +298 0 obj +<< +/Length 328 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 329 0 R +>> +stream +x�M�A +�0�z�~��ʑ*�9�\Bi.-��?��T�3���RXI�jg���i��n��w|��7�����@��ZCF�l���߲<���2�1�&?��� +endstream +endobj +299 0 obj +<< +/Length 330 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 589 505 620] +/Resources 331 0 R +>> +stream +x�Mɻ�@�ќ*����s�a &�h��?�8f;oO`�K�ݚ���׆�¸��轨�<���#>�Q]I�cH[¿��]�R +endstream +endobj +300 0 obj +<< +/Length 332 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 333 0 R +>> +stream +x�M�1�@{�b?p�>���*j�Ph������f5+�Aa�j +g�p1�@��[�aƗ���Z33��Zf{��]���! +��Z5���c��YG�i:��� +endstream +endobj +301 0 obj +<< +/Length 334 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 335 0 R +>> +stream +x�M�A +�0�~�~��Z���=�\JH.-��?���2s��T +�h-)�N����=��pǻTO�ј�f*:43�z:C��������*˃�'�y4Ụ�~|I�. +endstream +endobj +302 0 obj +<< +/Length 336 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 337 0 R +>> +stream +x�M�;1C�9�/������1��BlҒ�K���Yz��L͈��4zA5j�HP��y���$���1ࡍ�rZ��e(;�����B�_��ωm��+�.��/"t +endstream +endobj +303 0 obj +<< +/Length 338 0 R +/Filter /FlateDecode +/Type /XObject +/Subtype /Form +/BBox [ 0 0 505 1191] +/Resources 339 0 R +>> +stream +x�]�1 +�@{�b?`Y:���g�J�����?ĸ +a�ev9d25�p�)[ �j6L���p�xb���,d���e����f�y�%���p,�_���<6/c���QZQ +endstream +endobj +304 0 obj +92 +endobj +305 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh80 340 0 R +>> +>> +endobj +306 0 obj +99 +endobj +307 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh83 341 0 R +>> +>> +endobj +308 0 obj +105 +endobj +309 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh86 342 0 R +>> +>> +endobj +310 0 obj +98 +endobj +311 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh89 343 0 R +>> +>> +endobj +312 0 obj +98 +endobj +313 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh92 344 0 R +>> +>> +endobj +314 0 obj +115 +endobj +315 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +>> +endobj +316 0 obj +99 +endobj +317 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh97 345 0 R +>> +>> +endobj +318 0 obj +194 +endobj +319 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +>> +endobj +320 0 obj +99 +endobj +321 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh102 346 0 R +>> +>> +endobj +322 0 obj +104 +endobj +323 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh105 347 0 R +>> +>> +endobj +324 0 obj +104 +endobj +325 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh108 348 0 R +>> +>> +endobj +326 0 obj +99 +endobj +327 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh111 349 0 R +>> +>> +endobj +328 0 obj +99 +endobj +329 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh114 350 0 R +>> +>> +endobj +330 0 obj +84 +endobj +331 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +>> +endobj +332 0 obj +105 +endobj +333 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh119 351 0 R +>> +>> +endobj +334 0 obj +106 +endobj +335 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh122 352 0 R +>> +>> +endobj +336 0 obj +105 +endobj +337 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh125 353 0 R +>> +>> +endobj +338 0 obj +103 +endobj +339 0 obj +<< +/ExtGState << +/a0 << +/CA 1 +/ca 1 +>> +>> +/Shading << +/sh128 354 0 R +>> +>> +endobj +340 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 355 0 R +>> +endobj +341 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 356 0 R +>> +endobj +342 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 357 0 R +>> +endobj +343 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 358 0 R +>> +endobj +344 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 359 0 R +>> +endobj +345 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 360 0 R +>> +endobj +346 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 361 0 R +>> +endobj +347 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 362 0 R +>> +endobj +348 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 363 0 R +>> +endobj +349 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 364 0 R +>> +endobj +350 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 365 0 R +>> +endobj +351 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 363 0 R +>> +endobj +352 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 366 0 R +>> +endobj +353 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 367 0 R +>> +endobj +354 0 obj +<< +/ShadingType 2 +/ColorSpace /DeviceRGB +/Coords [ 0 0 1 0] +/Domain [ 0 1] +/Extend [ true true] +/Function 368 0 R +>> +endobj +355 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 369 0 R 370 0 R 370 0 R] +/Bounds [ 0.998902 0.999891] +/Encode [ 0 1 0 1 0 1] +>> +endobj +356 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 371 0 R 372 0 R 365 0 R 373 0 R] +/Bounds [ 0.42145 0.471603 0.943808] +/Encode [ 0 1 0 1 0 1 0 1] +>> +endobj +357 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 374 0 R 375 0 R 376 0 R] +/Bounds [ 0.428836 0.829244] +/Encode [ 0 1 0 1 0 1] +>> +endobj +358 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 377 0 R 378 0 R] +/Bounds [ 0.219969] +/Encode [ 0 1 0 1] +>> +endobj +359 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 379 0 R 370 0 R] +/Bounds [ 0.445434] +/Encode [ 0 1 0 1] +>> +endobj +360 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 371 0 R 372 0 R 365 0 R 373 0 R] +/Bounds [ 0.42145 0.471603 0.943808] +/Encode [ 0 1 0 1 0 1 0 1] +>> +endobj +361 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 380 0 R 373 0 R] +/Bounds [ 0.557724] +/Encode [ 0 1 0 1] +>> +endobj +362 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 372 0 R 365 0 R] +/Bounds [ 0.16318] +/Encode [ 0 1 0 1] +>> +endobj +363 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.905882 0.909804 0.909804] +/C1 [ 0.862745 0.866667 0.870588] +/N 1 +>> +endobj +364 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 380 0 R 373 0 R] +/Bounds [ 0.900901] +/Encode [ 0 1 0 1] +>> +endobj +365 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.905882 0.909804 0.909804] +/C1 [ 0.819608 0.827451 0.831373] +/N 1 +>> +endobj +366 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 380 0 R 373 0 R] +/Bounds [ 0.900901] +/Encode [ 0 1 0 1] +>> +endobj +367 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 381 0 R 382 0 R] +/Bounds [ 0.900901] +/Encode [ 0 1 0 1] +>> +endobj +368 0 obj +<< +/FunctionType 3 +/Domain [ 0 1] +/Functions [ 369 0 R 370 0 R] +/Bounds [ 0.621891] +/Encode [ 0 1 0 1] +>> +endobj +369 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.776471 0.784314 0.792157] +/C1 [ 0.945098 0.945098 0.94902] +/N 1 +>> +endobj +370 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.945098 0.945098 0.94902] +/C1 [ 0.945098 0.945098 0.94902] +/N 1 +>> +endobj +371 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.945098 0.945098 0.94902] +/C1 [ 0.905882 0.909804 0.909804] +/N 1 +>> +endobj +372 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.905882 0.909804 0.909804] +/C1 [ 0.905882 0.909804 0.909804] +/N 1 +>> +endobj +373 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.819608 0.827451 0.831373] +/C1 [ 0.819608 0.827451 0.831373] +/N 1 +>> +endobj +374 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.921569 0.92549 0.92549] +/C1 [ 0.921569 0.92549 0.92549] +/N 1 +>> +endobj +375 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.921569 0.92549 0.92549] +/C1 [ 0.819608 0.827451 0.831373] +/N 1 +>> +endobj +376 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.819608 0.827451 0.831373] +/C1 [ 0.776471 0.784314 0.792157] +/N 1 +>> +endobj +377 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.862745 0.866667 0.870588] +/C1 [ 0.862745 0.866667 0.870588] +/N 1 +>> +endobj +378 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.862745 0.866667 0.870588] +/C1 [ 0.819608 0.827451 0.831373] +/N 1 +>> +endobj +379 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.733333 0.741176 0.752941] +/C1 [ 0.945098 0.945098 0.94902] +/N 1 +>> +endobj +380 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.945098 0.945098 0.94902] +/C1 [ 0.819608 0.827451 0.831373] +/N 1 +>> +endobj +381 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.945098 0.945098 0.94902] +/C1 [ 0.733333 0.741176 0.752941] +/N 1 +>> +endobj +382 0 obj +<< +/FunctionType 2 +/Domain [ 0 1] +/C0 [ 0.733333 0.741176 0.752941] +/C1 [ 0.733333 0.741176 0.752941] +/N 1 +>> +endobj +226 0 obj +<< +/Type /Group +/S /Transparency +/I true +/CS /DeviceRGB +>> +endobj +221 0 obj +<< +/Type /XObject +/Subtype /Form +/FormType 1 +/PTEX.FileName (C:/branch/ku_algorithm_environment/20_Documents/20_Documentation/texmfbosch/tex/generic/images/bosch/CD2016Graphics/Bosch_4C_S.pdf) +/PTEX.PageNumber 1 +/PTEX.InfoDict 383 0 R +/BBox [0 0 425.196 94.487] +/Resources << +/ColorSpace << +/Cs6 384 0 R +>>/ExtGState << +/GS1 385 0 R +/GS2 386 0 R +/GS3 387 0 R +/GS4 388 0 R +>>/ProcSet [ /PDF ] +/Shading << +/Sh1 389 0 R +>>>> +/Length 43794 +/Filter /FlateDecode +>> +stream +xڴ�ˮ�ʒ8ϯ�����1�A�@�=4JI- y�.P������I�9�IF�t�{{l����=�-�����^?>Χ����Oj��B��^o�kx������}�����V^?����XC���9���~���?��������/'���T?���Ͽ��_?���ç��J�K~��ܤė��&]x���I��#�OK҉>��WL������G�՛�U�i�>I������tr�����������>dy����%]��?M:&�G�������Y� %mm� +EF�����?>��R8��W��#wx��I�����~�22a|c���_��\�~��r�6ٷ�7���[{�����=D�q����r���TE�r���6���r�?�1 �c��h�&����5+u:n:ڣG�{W�o�>���M^W��{����[���<+��2s��V�&�;~��VdF� �gw�́�;h����'T��K�H�c���^U�� +]�ƻ�O�Ճ)�ӫ�cz�ݻ�[�������Y�W��ˏw�n�t�6���������j�4��/c�a)�|b~�yƿ��ǒ��g��梭�?5������.=8Z"a����o��L +tY^��!m-y�]�[���e��U����Vn��h�/����r�ĵ��h`(�7l,��cT���W���r�������3h��uk�cK����x�7�kGS�a�������z��û}0F~j�l͟?�D�֒��A�?���Ji{OK� ��')���z�]��:2y�YKg3��e-3�*���k �q�QN~kr&��*�M���x�7���Dj��x��.����k��~L���}���l�Y����wu���2��:��"O7���6�CFFk��>ha��v�$\�>A�n,����h�y�L����<��&?����;����âȓA�2"2hAV�h��į��~)�-�Ɨ�"_����㎮T��>�3`4�j}�����o>i:�ۨnp��12o�#��1FS:5��hq%����/�c/[;D��������[�?��bF��?ʶl�G�����@ɏX�4��ʹ��0���0��k�W������/�R�}o�\zwD�D�ݧ�x���:&���wm����eL�1�cڏW0Z?�E��FN�(ߖNʹ��8X乂�ti��E���3*Bw�9'�֒U�8����i|�d�*�}�� �;%�:���������⍽4�Y �L�t�� ��h9ݷ��F�Y�Q҅UȤȸߓ�l��i0��t�Vړ�pc?�>j/��k4�E9���cj�wyU�����\ +=X����|�, +�A��DN�*�S6��Yޣ�t���o��e�+6n��̉�3%��#.*3��wh�V�f�{P�����@�De��Ae+��1��~��1���J���p���G�]N��9�dV����[�ڧY�>��O#~�x����9���T�[�:G)�I�ko�W��!�kc��>}�x�Rݴe��ǯx3OYq����i�wɭ�껵;��Y��̲m��$g��WG==ű ��6� ���ήp�bW#(��mHO^Wlq�&/� ���|� ��]9��#�ll�R���i=6�*����]K�cC�u���P���t*�ݦC�m�{9���־����MC��hSI[Kﳟ�ڍ��.9C��d��y�_�Z^���55�Elڜ̶^�N����>ڛ���fn�Nm���z���ƕ���q��q���������7������0��H8,/�R�[5���礒������-���j��9��io{��?���PH�y43Ԭ��Č���}���1E��"�����@�u�~�*�P_�mP�%l�T���+o��;�M� �az��@u�,�O�A�N'+\������3oȺ�w##�2X�I�D�����}&�7��R<6�цJޡ�M�!���XT���(�7�0�Et��m.�0}�����){{��2>8������ 9Extyo� 0n?>��c���`z:X�aN�����az�X�2�@K�n�$���G���.����r|��(�����1G�b�@6jX;�|g���1��8�^���k{z��kyRY��FV��:<t`V�^7'f�9��n�fKro���0d>���������r7��E�@�}k�:ǷG�m_�|c|ޤg�� +O �EGճ������qo'�DQ_-��<�!��<un��?qx���F_�<y8�^��<p��0��3�y�?�\�S�OS�pǃ�t��7�3T� +Ln�&N(��p��Mx��!�;"�����kA�Ӗ�J7Nz�1&U��&�G���B� F<�=b����ٖq���Y=�p�BߔLv9�9}�,et�A�M]��� A�B'e@�zM(^�oHw��[i�?�cW�����\���PG<�Y`���qy&� �A�-Ky9YA ���[�'�N�����N��tM&�P�#\�"c*�}}a.d4��@C���ʀA Vy��;y��I�u(m���~4UG�@/f�X&��l�D��`Ft� +MM�Ҏ&;F����NulYr]�w�e��j�� <c���tX�K'�ۜ�h����i���/*�R��Gu�%��&��9��l���(��tc#�_�>�s��FU9'�s=���Y���#r���Hw��&��%�/�����Ο�9�2�4m�:�lM�]�%Oֹ>dagm�Mm��!=�j4����M�q��T��/������_B!��D�:^�([���+s||����x��w4�L����h@��8"����;y�A}��WU�����n�O6�s;���x�/�ct�Ʀ�'�fl:9&�-�t�F[�H�t��&�������w?�}���ď�Sɾ즇�F��lM�h��1�E��z��5�q�ì��� �;������u^,�QXn�T3\9�?�@'��bT^�p��Gk^yF�v��]�Z� A8��/2��0�>r�{�>��G���C]�ǭ�`��Dz��{{=�%w�@�ADf��CY�M|4���X�18�;�D����b�ȉ�:ڥ����`����p6h�H&���i�ɞz'��N��@�GD`l��q�S� ��9�]K���9F�J�uK��q�6�p�l�zO�h4��֢/4Ծ�o�>\�V�U1�d�u~�|�'o� ++f�̔���ڂ>Q��RT��xU����y�4u_�]|���aT(��ݚt4����Ii��z4g�lS_7,�_G�f�`�n~ͱ��D��G�J���菴��_8����X# +�50�HC��)��q��PɁ4�[��j4\48�����-����8�G9o�����M����Ǔl��6pJ��6�A��<MW���L��;�Z5o���V�Ƌ%��#���_�#�Z�yZ\2���.�oR�y���l�(�� +�҅�t������r����̀��p�n�E6m� +�����[o�%�Uwj����B��O�t�)� Ɛ�w�X�O�����e�_��1��ZΪ�%95�D:]SU�zHC�k[� �1{��z��i([�T�EWv�>��hְ9y��3����~�(��69#�!��c�q�f)gV�[c��v�|��P9��-;xͣ-�1�����厶�t|q�������M۷��?��212#�q}�PlM�bd�mm@_��ʗ��8�W���g��A�?��6��h����֧�ե�?��?���*%H��G��$����������4��/���+����?�G��?��-���m~Sj�fd��?:�]O[no��Ʊ�G���E�j��I�S�ф�x.��5�3�ME]p��e�_L���_C�����YtZH��%���(i���48���,��.SL�zV����ffaAN*��t�e�8:��^���L��g8X���di���V�h���B��$�F���,���vo�%6]g8�gY8�`_��C� �/�|�3va1��qgy鯣Ww����� +� +C@QfJ8��vy+H��з��,ڮ��G�P���(�**�eM4��p��څ�1ݞqԠ.BM��u;Y�@^�rL߬�L?Z�L�h=3�o^��z0K�}���pzR������:d�k��@�,(r�:�����䭂Dq���em��j9��]�<�*,�N��-�w9va�ȉ���S��J������JG���C�¼J��Ф�e:{�t�L�kA�9�L��-��'{hJ��NK�����DOC��R�<:9��j�`�:�]:��h��M-w(���3�����o(bm���aU��t��2��K�"Kg���K(a�ü_ʮE�U�������kF>{�nǵ�^h�����sE'�H�7O�e�l%ot�uY�b3(c�ց�<�9ޚsgh����;�"��k��1�bw���խ��w��:�]�9Bt��iv�1!� +c��ְz�Ha��s������Q�'8��W��6�)����u�%"2�-C7�HzE!+����*�@y���e�~��G6�W�Djv���2�Da��Si�8���ET�0���YQ���,�Z>��C4���/&���+P(�}#�3O�IƘ}�1�恱�ym]�;���sY�}q�I66ʊ�}=�V5'�䪜�����[5����f�A��Yz������YV����}#�k2�dH���1�f��l�N�� � |}\�����fFS _.F�3��8�9a�I�c��&�n"FF��;3 sxs�]���y3����O>��0-7�qqcD�'Y5�����5ys���?>��H��'M��ֳ14�EE�͙�Cc��E���]K�8����5t�3�=_L&��I�C{_��uG�/4��3B _Y��vr�dsm����t��o��ǹ���Q]��2-w����{��vNWs�f��'\폎n֨���Q9'�4p�aMo��w��� �Z�Fȵ�x�7�j�1"���X�V�*�4��B������ؐc�O���S���� Q$� ����j���*���狣�; +n;����f=�ꇏ�w���D�|� �AY��sk����J��$ +�H��c۽TF�DV�����U���EV���.�9��xf@#�"��rg9�q�=��Et�P�IV���[{f@$^P��;"� �<��X8PEEoY�⇜����ό�� m�@�Y��4�۰�3-Jd�3+/���C�������Yw<�Z\�D�n���g} t����&��;���!`f�����.���.�lX�D����ʂ��_�,����+Y@�0�&�G``����c�����D�N��o2@�β��Y��h��"��.R{e!04��4�X�h6�"/�� +�yC�w~����f�. +f���9�O���I� +j&�u����ijiW#����y�)�����<D�l&�"%ʂ�E�\ǿ����q�1k�=�m��6yb�D� �9�]wȢv���#XYM�w��2˂�F�e�b��"Y��i-�Ͳ�VEO�&�#���g�y�J7�X٭�G�p`�?ػE���y�b^5#f�,�_�m���I!n�$ +�meu����D��3�LT�}��ɳn?T�")�BY�����vY��l?����,Qo�Ń�B:�\<vQ�ԍѷEP&���a������z�V�^���$KL��h���;����kM�����qzW"+��>�FQ�b�2���J<�@����z:�S?D�������)0���^�ȼJ�����A�%HT���D�0��d�h�q���*�Y�,�����zv�gFk��5�ن� +�j�,nYۿg{ "�g�j�`H=!Hmą��8�1sV������x�I��A-�pâ_ WM�0�.��3�h��B�> �i���Lm��Ud��g�&DM�paBv�7坋��L� G&l�C��P�0\�2�����1�Y�8�K��R/��.엎�d�)�(,��o��5_ ��=A>�cE�)�o0�vQ*C��pautx���qռ��a�S�h5: � ��f�BE|%��N�jH�d���&��@�W��-|�����j(��\$u�qF�lUxM�ը���RPy� =���LfC@,���{xJ;3�?9�{d��]�DeZr�y���O�[V$9`��cQ"*Iw�#���-$<�ň(D]�B�gQ�S|���%]�SS��,Jn���m@�r<�D#�M�zJ�����5oa��c�CUTr^�&����Z�e}��)�����ӎ��8����H��p�w��L��X�χ1BS��ũ�..��b�1�@9���^������ '��ޟ%��b����%j�6�sb����-:�g X��}�c���qd�(8��դ�`ds�\י-9>�[�9�ڞ�:���/��Q{�3әIm�rX6��*Q��t�Ť֘�8�#u�,�ƑIa�Đ�Kf��G��4b�kD7.0v_������aϼ�ٶ +GV�S�*,�rbu�����t�N��m)��,�LW5���: ��ʁ�3�D���x:i)_���c&�|5 ?+��M�����#� =��A��j&A~�:�KǢ��lv2�tۀ]�l�����ج0�e®o�22ۢ1 �/��\ͽ�Y�D.��4���{m�:2(;G;������oM$�5_�xuq�kx��l�h���^�{�L�*���������{t1�w��ӆq*(�H�>����\h�; +�&}?��@1#������y�&����nZL�>]�XrI&��I|��=�(��ٚ�<�ؘr\_�n�^�D�!���r +�8�LBB��=پ���n�����4�S��Z�]���H�!�ӑ?�oȏ��,�<�GT��lqS D-/��HR�D�B��Xmw1MJ���4�/q?F����~�C.Kn �h��;��Q�"�y +����z97���rB�Rn��"(Vb���7E�=� k{�w t13|�� �q����Dx�Y$�l�3����1�iP"�i��_-���؎s�j�6h��oyl9(C]Aި�,b}�l��́�Q�����u~��&��xE��tq9�{��q>.p�[��W�)(�a �j���؛Τ:fٸlT!3��{ӑ�Ȅ�ji�3��7�^S]� x� �]�HK"�(6�(S��c������e��H��M�@�6C����ȶGBz�Ά�:N�v����L�m� +ה�<��i��~�nF*$E�_?^��-d��?�8�1)"C�V;Q� f����AO2d���2�ZFW�s��l�̮l���A��or�� �y#��6<5l��c�.���� G�A\����ɏz�%i(p�.V�1A�v8$�]�HפFb�O��ry�L �OC��H��R�NЀy,�L�a!�{/(�A0�P��B�J>������CW��X�LT��@ܻ/��g|��@]������������"���f i�Ɔ;��sUH����M��=V*5�� ���Ѹ)!%�-a�ʰh~Ӏ�J��[��]�>�i4�e�rX�A���Ai\y��*�|�ne�d�����Ĝ}����Yv��i���%���Qq�aܢCDT"����xB��CȖܔt�LB�0�I���M��KE)�ڔ�E24"�c� XS29��wDZ�gճ���tV9gӔ�uJ!� 9=��3����K�6?Pjoa��L��9d�����e�x��/��ѯ ~�b~�' +��l�6���>��1D�Rژ"��$�W'絛�����'��-��hT�c�} L���O�S��Q�PAVF��c3 ���d�MG��l�N֗ʬ$��C$��;,�W�����c��m���������0@���[�|��&����=I��Kd��5��;�n���G8������L��ڠ]��g^��du�����O&�����I�9ʷ�F0��\1(��*����6��Uy�ˁ�������.���Z㇔���u��y���+����/�_`����~���ՓaT=�0w�l��Ҏ��\��F?,�$�����j�y��[�s�i��ǹFt�f���[)8!⪡�<:��*.>l��t#l`ɂ��,�<���VXboR]�@m�q�xz�r�<u �B��S��m��pFР�O�!��9G�uR�b����A\����;!F�����:ŭ�:��@����iFڞ��Ŧ��C�hi펲�A"/p|q�v��=n:�9:d{K�"`|���1�,��/���+��SL�%�ul[�i��}Q�F�xVm�:� |� +;��h�aq��ھi��Pa�ƹ�1al$O�0��0�4���Y����$�~홣�t�h��DJӔI[U�9����YYS��-%Ӥ�A\7���{B$ݢl��� ԛsj0���P4�֚����Hox,�)��è{&D�y������GB{� �5_]S���v�s����3�`��|{x�b&��;�+Nk�4y��t�D���Y@$��av�������$��&����ZP�m�!a�I��+�A lĦ*!t��>,�|Z6ė5�j%%��dfzn�q$�Q�Kb �1��,���D^�vtO��=Rh��d.u���י�_��t�1�>MȢ��������&&9&�4�mܞ�f��Tx^��2��cr7o��e�˘4��^��t�ea`����t�Ψ7��l.�t��7�U�؝ L��ٛXc`>��3X�b↾)���?���b�~��<Az�����g�P�&R�y�H%FdM��W8I��(� H�f����n��e�S��gApg��՟�CB �(rj�} �\x�U�Dž�@M��ڞ�Z����If�k͘����E��/���؇�_�'#���0��#� }�A�*Jd���Z�Oe�i�����n}�EIT�|X'���hi#<���w!E��P� +�6�C��C����/��K�(�͘�!��k�M�)���b�A�%t���L"�|�����Ʌn���r���K]��a� �3�c�1n��#A?�.�D����Հl���PTo�r��s'ف�0;^��jw�e�������C -;ԏB&N��7�sE�XUI��+�2}���Qgc��~�G}����j�B�:H���b@Qa��Eu�x9,Wsz�`�B���Lq��>��J1ay����I2jn�����u*�.�DHP��Jsd\���(�/7E/�,����p��F꺞T��� +����5 +�4��k��2vZ +��\�����e�Lb��y"��i� +Z�n�~'���XOX��п~�'>Y�W�:y����X1����ևE� � +�~[Z���V'�\]9^��ɿ�6��)V������dX�5m��@�� "h��4�Op[�H�S)*� w��;�Ms����>�����f=!"���W��V��V%��� pm�Q�)�,�`�8�Q�MP� ���g�D���XQTr����Z��S��ط/T�����f�%���8Ƈ�=�j4��}*��I%�(��<� �m'-��U���M��[�pBM�.�J���G#�#����tGOX��x�(*΄j7n|Tāo��lcIc�q�"E�sapΐ���6�?cjj��lL0�{KzN +���b��&� ��� +�-A�ڍ/ss�����"���p�,<��*�U����lZuY�V�!����_��n\�e����@�����P�G%b�<j������0��Y/�(J�Z��X(��L�v�cd�ᵄj��)�d��c���PӉ����z�S>�="*x-� ���M�[dX$~��ҭ*��;�ڠyx���(-.E�b�R$�h�T�lA�Vb�6���GIbt�=���[E����Z��<?E +��a* �w6dA�>�� +��KV����;��t_��� �s�.��m��%)<�H�����N���؞E*B���p�>�'�����U}Q����e��Nu̟s�r�X�Y�O�dn_����'�i��I��CMV�� �x���0f�͛�d�9�Y&���dm_L(�Nx�[& ��,\���H~юŏ�?.�)���Q� Y��L��[.luZ��n�(�������;pa�7���P�g�=�3��A���f�q:4�;�`;q���q-ĸ��D�0%�>^�*�M�Ā�m�mE�.���0��2`�pK�zIZ�!|��yZ�BT���E�s�&���� vv@�X��ղ�+����J�Y�0����J���`���$@I�`{�2����@e�6�yd�/� ЄĞ� GסHJ,f|-�s:�%G�~X(S-8p�:��N��z���`�Z�X�9\�PL��ȕG�/���&u�Y8YB%����5 Z�#ID[���ވ¦;�<���p �����%�R`��b��>|� G�[ �� +w�h�Q$47�q�P�{��h4�8g��9�\�+���JR� )Fk�h�#�D+{�z�E73�8@�{��d1�,a+������4O.Y�837��zݫ%�2��!5[e��|z�����;&x��N���v����b�ͭ����|��\/)�;JH+��XR�@��Y�,w$��)=VK��r�F���ju�S��jI�4r��`����tw��T��Q����� �@�܇ZI�[���z��B�c��F�Rk�����^^J��`-}#���m�\1Y��B�[M�#���i:.Jϩ]urp�օ��/:՝{IDU���)XM��h��{I^1�VN��ܶ)8p�_{mc�:Xb�e�}���!������^��F������U��'�ǃ�C���k.�;���s�F�q�k*��̽�a��غ{��_e���ܽ���<Q�������)�#ܭ�r�HM~Xd��y��o���"zޟ��Z�wK��y����������4�������{i�u�`9rw���ܻ�t�-x��eB4@�V�?7�~�Z/'���$���Q��� + �&�]EG������ya�@�� 6��Ά�h~2��yQ���l�D���@<���`q��Q�T�MK*<�"��|��e�0��Z�]���h�����ئjwaD��"�!ۄe�kiD��qĆm3��3ٷ̘Ҕ= $vG�i���4�4�o�FuI�(�]a�$��6J��Dd�dOf?#�����ծ���v1l��q(�;��\���b�D�pK�0am�ٶ+#��q0Q�e + �'JΑуL$�t"�Y?�%��&�"8��ҩ���H�Z[v�h4������C?)$b��t��`fBiw����Y��X�~���/��ld�#�I^��h��G;v�D�#J4��:��x�&��]CṲ�_K��o��[��V߹I���>���w�<��/w�:� +=�� ++�H��x���3@ھ�*�X��g�;�G^�M��3��w&��[yq�GD�eclF#�W�j� ��iF1i,�,�Fd������\���N��%�tF��e%�$ kڑ��<��^e���^�s�9ر�sR�Y�H�w/��[�*���:�BXN���6{��A�t������\�U�D��Rn�(3��4�Pk'Y����H��hҕ��0g�=*b�?���o\n��U�ЕR?a�8) dc��<'f`����<ٟ�́h(��g,�H +��:Q:���`����@��Z֨��#�"2�)UOd� ��*M��r�%CB!�/X�,�|i�"��M�um����30t����v�y��C��Z�Ϭ�S��6�P�pt��ќ`{if(w����X���V�e���[���n�$�F�� �]9�ie/M +�X/-��d�2~��Ɲe�6=�t��K�7P��]q%>w�~�u�kNv<����s�-k"�O�f&����ê� +���3f&�X�3E�#�ņ�y��-��������:��<�.C�� �]X�Ŝ��<��y����,d�3L�_��9��c��l�y�>@\�9�a�z�F?!?�2�U�9<�m��4��w��)�)1<���+ڜ���9K�L���������� L�H�� 8�lJL"���b��N#����M`��([��2� �i8�KH��N=��E�>�x$��>��v �8Z�(%�[OA��l�ʯfM�[��Z�*^lً����?�Y@"h]ԗ�ڊ��wE�9��������2W����,�·�J�}�'<u�2N�l`x��^Uk��~3����,���P®��9��6t�3r�"�@ګ�J�ê��ݑV/^("�b-7��� "���0Xb��0J���`W����X���$��������8���z|ҙeFb����~e�N5C��ro�pP�� ��IZ怾y�0����c�YCe4�ɿ�{��f�E'�Vk�t�����;K1RIqP?(��[#/o�sfi5Zj��d�*��B�AS@ڕ�1�������BW#��,�x������W<����NN�oQܥ�3�:U�>K�D�ptG1'�dD.���+��CT��{�2"cPSy�ۈ�6��J�� a.+t�'(��,��A)/-���g����hbd�Q-�q*����(��T\����N4H��\\�����.�(���b[��*5��=�6����"�2�fK(�s":(K�n�dmFf�N��ॣ# �m7���k��8�4�~!�q:�C���J��ٜ�/��vs%]Ŭ�2����5��� '�� +07�־��W��r��0c]��E��u�A�cU|�{�B�P�9FY=Uٜ,�d�hsϣ��x�d1ch,$���*.6G���*"�*�/B�(��4�Ҭf�w�C}��EF%�NF\[sv�}����̎,ij(�q�6FW�3(�f�8G?eb,� �U% O�Fh*,�ȇ�4�`h���e�k� ?�/U����e����< D�I9i;�5I��Х�������Ҙc(3��Bh>mu�S���"�_�����-Z��63�����"=*;6��!3�[���0L���3���<��zu:������1]���13)�S��NCF��^J�xzj�pL��4,�P�n�fit7�n�͵&�z2O� 6Ps�߽b"���[�F�V�x)��u�lh-�}�w ��P�ӏ8��;S���Q��e��T��`G�= );aɣ%&��6�G&Z���]H�T�>��s��h�B��h3'l�����=��kk�^I� ��,7�3��( ���F4�o�ha嵍��<;���'�7l~[���+p�hL������[d�P "��Y~f�Α����|�)�R�C�����֯� �Бbd�2�k!�ٕ����|S�����M�Ce�=��݁��9=L��CXx�� Ǖb��\��"Ma��M�n+>@V��2�^�"{r���( +q��)ʅ�\��<G[�(x��� 3� +Y�P_�c��b��d.�i�o|�1щ.�z��p��C�R'`e�'yzifapBD�|\���N�]ä��'J Lլo#�t���r�DP��]��5�,����#�QЇ�Y�������;o��g�~�h3��A����i�KE�f���c�љ4�ޅ� +o�+������j�F�`i +#Mn��:� 7! %���2�%��f@�?����� Ło*�<elCXz�>���JV>ɺs E��p�r"��9#����~����_b$��4Qa�����ozv����U�%�D�����>������%AU�|٫��'�m:aw��u�D)p��y��^��� +�~�{�H�;LwVC�x)� ����a���������,��=�U�CX��}@�$v������=��BJ,7IY���s dU����u�$A�^��~'��KI�ļ��|)�ֆ����0�ga�hX���j��r��:�&d���C�X��%��0[�5���z�Y����SB�$:�)��U}̲@}o|ߏ��A��:�*�J�d��'DF&�A� 6�D픝�T�eAY���Ǚ��N�. +d�,�Ԫ�C��M�)�%����V 1�����+�%�kfc�5��\�V$����`�"�����W>�aY ��H�>e��V@e��=�i�l����7ّ�w�|��[U�bȀ���V|z���Z:��s��d:�%[�w7 �O��B��^��,���?��s�"���+��tYy�1۾I4,�5���[HT5�Dv�R�G�f)��*'2�y�M��,��Ry�)B�mI�di��<W!����V�@g:Py�'B��]J�K����� u�,d��ЂjG�d� +ޅ�����X\�_P�|�ϓ� �3חg$��ܯ[�������C��E�܁2�Q���$Q�< E�����*6�Z���j_8�Q�|`nU�sa"l�"��S��;������-�Ӱ��[�����欎��H�U H�uT��vL����"�rYϓ���)K���ot�H�W;Z?�}Ʒ�jx�1��2�{0%��}��#��[XFQ=[�f`|�����`�ho�����>{0e�c��^R�'��>���/K�_A�?FFZD\n�42@�uP�E%�n�h)_�/�kv�x��+ӕ��ir�: ��d�w��Y�iF{<)�})�-�k�ǥ�P��R�c�����:���s���T��f�����y0��σ��1��`�+ai�j|��� ���U-��^[�2�Oȁ�e&c���{���i������^_=�A�>3(ɈF��8^;�0Ր��/�G���*����+�C���Y�-����q<"���ߏ�4"�E�����F�w6[[�N��v�;m��� �n}oc�I�����w)����k�n/b�����.�9����Z��*l�{����z��<�����,�_�>�by�I���L8�Mȳ*�.(o�13�y�T��.�!K����Q3'乼5LA�/������7�}�N�j�u��FdУ��V����z���>2ҩ�hZc�^��C��2�:|k�<莅�EU��x���čV���BJ 5u���s���\���}��f{G����$�O�0k������;̙���� }oq�;��_?8jH���tuҜ�i��B���ݼ�F�6�t䨭%2X���T�ǐ�ݺ����<��8��`}���57����<~",�Wu�0R��_T�Q�q��%z�cb��$`�xN$�H�nܭ��C����i��zJ��C��jt^�0�&O@��0y����U-6��������@��,�l�:o*�~���V�,����si��i��Q*Ƒ�3��0�/�*q�+�� �����fB�)�G���\��NG,\E����<�ͧ^�D��/�K湐���1��wE����M�Z��{�ܾu7FB0C���Cvh����٨h#�`�R�a���9{q/��Y<B�r��1_�K�����Y�/D$?��}Ƚ(U0O^��E���A�22��K���N9��i��$|fe�9�����4��)���(` ?ԏ�D>OSp�7�,�����)��_阚�_�,���R�K��`�W�P'�ɽ��1�6�EO��A�\�:���T� ֔(�W����T�y�˃�<N�Y�]�� D�t�#���\d�h�7�sѼ�X6%1a5�E�d��l��k&�bE���@��g�'���NG|��Y����b8�Ȼ��YT~^��hY�����r|��t������Zq!�ަq|,d����.*ߤ�n��Tq�#�0'p�{⇬L��������]�T����?1]q�;M̲�d��`=���t����/�a��/�/�́�F7�j N%<��X����1|�0;;�_.� 7n_��_��}�2������-���5�I��֟t������c�Aۗ��;���|9�G"l20kx�r�x\�yW&����:�K�WЪ���,R�?'FW"�x�.�ׇ�g�j�8Ee�Fۣ��b}]��(���1��|9^�ї"M��E��}�Y��b�x&B{M�7�Z`�?G�x�D��0_�5����7^�x�i��n����NI��b������w�v����:��֫Ej�q�|����qs���H�D��:�x^5Ĥߵ������iq����4�x�c�O 4�s�f�}��;gH</��ᾛ�N{l7�"���or�H� +ѓW5���0;� ����D�Ͼ��y�ʢ���<w=�;�#�*�^u`���Z�w���dm�F�81�o^Uo}"��l=z�����y9��*�'PM̴ӷ��t��I�l�:$(������_�J��Y�g��]7��p�$ +��,�� �Đ[��i��: 3u��q<`�l�x�E!L��g*m��Ҡ���g� ��`��l�}��m� ����ANJ����)���[��b5�(���-�}�Ww]�3��~� |��#o2}�ڞ�b�#�Uh�tX.���_�e�����(�3׳�d��O��梇4O��>�a��+|gi.�t����*'f��N�]�IA6������Tk~�(��F#���(M�u�C)e���P`j��BZ���4���7:�c#S���d0���U_��Z@��h�v�4����[�d�R1�m^e�/�����kIOeoʜ�g�C&L�'��3M�ҽ�6hqX5�C�&��#ʼ8��>��o_�OA��2���l���/hu��� ,����DU�/�?<�d'Qx6���֡¸���J���`��L�A�R�Ѕd�;��g� 8�b�ě�������b�!K��gz)��m:���o˕�u�5�@ zC�҅"�w�A������"{,h�8�rI6�yG�@C��M�\ +�Ȥ�<(���v���5� ��;D���dm�9;`������r��k�����d����Er8Ec�#�&��;���`����6%�"f��3|C�DO���ʶ{��]*z�B������>pe�������v� �S�� +D#f��I[Τ�H¨��%r�7�K8�+�o) K~�3'-���L$ő�v�2���@�AI��`�,KyOD�C�P�x����rz���<��n�n�~���)�~���eV������6Ѕe���fe.�t���k����dG�������\�,��+8�b>�R�V{��h�`�����U�i��*��^�3Ι��h��/Ұ�4XIٙ�R��1;����#���@�Ϧ�����U��ú�p�ϱi3���w<�6-Xh�%�[-_��'�Y�8�nC�J���#� �mV3�dwVr���-�C�V._�5xe)�{�r�VC�+ϫ �n��bc�-^P��xX���r +2�)�����6�Pb)@�ۮw�~a�����C���,`�g +���(�bD���ސ��9�tl��Ӵ�dǞK����@Wt�E��8��}�(P�����]�[��c3���Eo�m$+��&�/��`hrz%�T�6`k��Y*�,�j��*H�jCڞ�z⥦-8�37fO��&f�����`��V�+��j]��p�V.Օ�CY�3�I�m,�Zj|f�p�*���X�2NN3g�v`����;��e���"��d��\�K�9��?\�+fB���s�����/�M�����|��\��6��5�ّ*Bi��t���Yh~�𦗏���k1`}�}v����>$g=|" �T?)l������t�z��?8�F��m;d8o_�3:�zP Y1��N�i +���x����U��M a��=e�����Kd]�k7�l��ӵt�f���ĺy[�LtI����Q��d���5�k�ζ���hH�.��6HgbtX/�lJ���Wn���2��9�%�^@��J���*5Ѻ �����E�Е������=ݕOU� c���k( ��R_�6����mG���g�"?�Ĵ� +����_F�'^E}���R���l�n.�&$S��~����n�|$q~����a�Dx�ӽ�}���B�U��_ŐUY9%���V�ϵ���j�Ajh���k��q!i)i���E�5D5-g_"�������/��5NqDO�l����JAF +f�ú�x.��֢�!,�������rl�̓��9��}!��T� +��7g�;� �b��D:���XC��);S��"�qNN�wE%�,[�=0���٠$�U 8MMb��_x����(�O5���������v�R�������::K�T��O���O��L�9]�etS�0���D)��`욭ZD�j�l������c�w˲^�By��IZ�>X��H��M�:��F���$}M��5�X������ff^!<�S�Ɏ`/%�E%U�Nm�Н��5R��8+!U(�J�ı�ED���C�ۚ�@��8}g� +/��1)t�REq*0 ?X�Ub��7�� ���/3j/��砍�D�)�(�;����$�6t]rC�����8�O�n�ɉ:p|��H)<k�͂ApF,�KrC�6�l��=_��<N�b���/����}~)�;�^�eŰ�=���ݙ��RE�E0��zW���Z���(I�+Bh=X09�R��c� +n.>^ ;y.Q����2K�g����+����b��\�J��ő�c��Ս�����ӕ].˺��\b�>y�o�U�(�_��z����{@�����3]�'_H���d}-�,˓�>u'�[U�Z�0�pqT�w����Y� %� E�<&�����Kq�'�g�RD��G��c�S9�pK��_'��G�Q=g�1٢^��z�V���^�s�9߱���mJ�B,O�,n���﨓m2��S�2�w6�������Nom��Q)G��!�s +nmH��*;��ER,�u#���R�^e�ؑ���o�πS�)m� X�ac�6��TC��T��-H�0�1)�O�ϓW�鶅����P����\ok��^��E������,os� :_.2p�e�U����K��HS�[�8}K#�>ߖ�r��`Bok�_q�!7z�7����%f���-�a&,����3�L�wd�T����XՋ�-Н����b�*%ͼ��ۚ���ٗăL=w��!\�,��c�-�L������HT�����jY[,����DH.��� �o.z��]ȺV��y�����S +�OxA�+"�w"���b/\05ڒ��d@����T��*M��a20���*���#��hp�a��LX�L��Ѧ�D:a��?���,P�Ԩ��&ws�W��j��fA�~�i���j�r8e�n��铺�ׁ��4_��R�M��š1��aɖ����� +�Ɗ"ky�p����@8�K[����� $u��:%�c���� +�.�Mp�{�N_v�J������s��y(�4:EM;�m-Y8�!����x��B�Q4�G&ϡ���z^�ɛ&��j�����/�j͢j�G�(�W��$N���4�eϘa����Q����>�DW�I )�m����Dsr�����CԦ�8_<_��K,���kqiǭ�����l,Xl=3����mb�3�ߊR����8��n\�5�vUZ���K<��2_p��"%aY���� ��o_�j,��-7�}��ۏ��{g��ĩ��#rG?5b7��m4���oK_dB��w�]Ͷ0}!�t�E��ϢǞD��"�R#�~ �� �)�p��V$Z����3��5Y���"���ҝ�88!���[�T�j�"�D��T��Z���2N��Hɂ��GY�)k�O4b�DpU�`q2���w���V�8l"�`�(&�#L���4��""�R,�����m�����FX��z�,��_m�iEVt�"GY �����E�>QX���-��q���"$�"�{��$��Lɒ��!��*�ςOe��| ^�뷈(��9ے7Jt78�ƙjW~�L��, +Tlrn|Q�Fd�Q'�B�IN����UE�� +P1��lq��6(`q� ����7y�FDF��@��A}����_��*��d�0�ȋj��VI�r���w�g}F��5����i>��tG�bD��@Do���Z�L�aD�9�Sg����w�AV�_ͦ�+����{"�>��#� ��#����`%��9<Е��BJ����s[�i�'T�盠�͗�gp,�]��0����w+/���S7,(��K�[ �s�焂7�-͵8����n�9W-���s;�Qͳ������b�F��v�[�@ߤ����H�f��N�M=vc��0�Zbd7.�j�A�5ߺR��%���(�.���� ݑ\����&� ���X��58���R�UO~S��3�m ���Æ�}Ę�����ԗb�H��Θ�ƨ,��۫��:`ZQ�eKy���&����R�q �!����=s�����w���j�� ���#��P�Ge?w��JRIS��I;A�3'w���4dz[_,��ԷS�K$��r5�A]�S���|qE��`������]��͵�4)<��y7�N�W�H�\��r[$�I�bJ@G�d�M�l(|ߑ��p���TU/���i9[�{UaTU�]���]U�D�폲U��p#�iMu0�YOk�wڭ�j����ئ>����y�=��G}[Tݳ�D5���z���s�`����|XU�C�:U��}Ϫ��9�d.NU�×U�3�յؙ��U/�JY��G-�^�*�.묀��5��@d�UT��"c��n�gQ��eM�DaK�Fd���z���z�C���B[\�ꤌ��Oÿ��zQQ}�f���eUu� +�f�迨��>�e�OZ8>M���ʪ�SƻJ�Ϫ�S���ҿ����_D�g|VV]e٪�E���/��g���Nأ��{�q)�YU�!,�{VU}���I�mQu��"��ˢ�C�e����^u��������|\R�r����:��� +�Ê�I�[a�*�a����UV���Â�uS��iAu� +�Fأ��]e�Ê�T�REu +���%�"�Q�BSQ]+����S�J�J������X�B�l(Z�<~S�Ik�BX�W��\�(�6M��(��[��XW0�������6E��,S�\��i\�W%��|������AX�e���Az��U�%@��:��9�����˨ޔUZXʩg� ?ђ>)�I������:RT�q(��9nn1@X��� +���z���ʢ�f�5���-��Y�}*��h��C[+��l����"�2�����L=u�t��ޣ�2���ݬ43�k�=+Ύڪ�з��,���@?�sDŪڊ�~�*ώ���2V��z��gxS$W�1lլ�N��vyV��QXZ�p3èL�����Y�*,�ջ��~���f��<x.�`�3��p��fg��*!G��*zY�11�=IQل���8�Oe�?��Qʴ��:�t���UE�!+_�y?T�c��&ʇs��v���*�kEj��~g��ѡ�z�#�g����mk3@U�5ڴ�G����vu _l]�������C�A:�h�ι�_��~���=�GloY�:sǪ +.gExԤZ(jօg1p�]����b9�����_�� �R�[I��F<�[�}��sE�ѧY���X�ik��6��F|��kJ�~�;�J5�G-��f���l������ ��_A�8F�<.~��?�S�YK=��c�7���;��(��~ t�`�U�(�G)���P;z�5^9�:Z|̨��� "�x��j��Ǝ�l���>�1�4N����� +�lMQ�+��27��h�]�W?z�����1�F����Ӎ���U���1s�Qc�>�M�ʎ��c����|S���z� +ae��}������,(�+z�Y�(E%ڕ)j?P�!fM)�l��G�h8 ���fԔ�_[�qBB#�ɸjX���1:=ɷF�bc )�u.w���k��֎]�U�6j5�kc[������ަ���q�}��l[3��6a<}�n4�y7������!gk�&?�'��go�#�ڭ�� +�t�ۘo-}!"M��}����2�$}��6� >�n3���1{FkA�=^���x������MP�K,�(��d�~����GTͭ�# *��Fk��hWM���z$��9Z���hkg��LG��=�IS<�(���?P�����ˑu��M��N����������A������_�"�w��o��[���q��M��bc��L�(� +@_��p�k�Y1�HeiaJ��O\ +T���BG-���B�U,��΅e^~��L�$i9],��9��%����/i���V����珷�˯���ϱ?כ����|�Qx�zs��6~(B��A��љgY#�2�㕏p��'4�����ҽ�ĵ/�9�y��]C3�룩�����냃M�MM-b�s�n�hC�������YC�vFK���曞�����Y2:�ϒ��1��Ìٸ?� +;Nc��ÈQ�� �7�� �����ڥ���~�ML������.�B\��z�9nL��{�s� +�F"�ޔS6���Ʊ@���A&-�& �o�����~l� ZEh�+��[�Y�W��0����Fh�m kc_��<���F����X�� "���Nf�}7p�o�����8��tm+�����8�9�a¿~p��6�v����s��_?��Ƌ���_Tݦ��S�k�oq|s�b�}��Tr=f��`<�[&��q/��F=������)G����Y� �Z#���~�l�>ۯ�W���m�,E���=~߬э��ǿ����_��/��Q�E���yA��E�ᱺi"Y]���vײ�㛣u�"ڮ������ڴm�@�]G{�h|��/��O0ژ?�o�A���U)mP���צ�>]g,�6Z�*�U����b���e +-Nk�r�Gw�7mgE��7Ч�OT��2��� �|�-�����Ժ��?����x7���{�;y��GQ���+����?�G��?AK��ĄqP�C�q�)0+vE(�{[~6(t�T�EW���=%��fbSz�� +Gw��{���/���W|��a�s���� :�G��0bU�r����7��.�U�����ש���{ G�(mYm��S�?���S��WU4J��{�Ui�6�1� +��rnчS�~�������uٔ��@��l/� +#�2�Z��g2䗃T�h��*��^�v�߬l.�G�k�,L'�E +nRC>��u�;I��(uV��ԋH +0�Y���Td��,^� So�67.PSdH�1hj G�azj��,�֢��z0Ҵ�m�O��8����eqn\��`�6ۄ�j`���_�N.�ɫ�(g���Ύ�������(w-j0jv �I<vL� �͢�07�M��ދF9�į�%д�����#�\ԝ?fG� +KB)a��\�I�̵�9/��-xq������/`A��Ml�n�+�l`DX֘elƛb��_!�+o�,/Yn��v + ˮ��6YНD�R<�\`�'֎J�T�n���EJ���)�L�T�T�]�bW�([!���QΰnB��?���R��]Q��J<��O�e15>�Sƾ��Nbm!"7o�2���e��ȓ�N�Qn��ɮZ�딩?£������ �!M��v[�u�L��X�T��"��zS�{�G�&�j����g$����粬�l�N�e"�(��LM��"meJ/���&Rb��˜�͢`op+ +b���DʬQԃ��L�� ��4��N���03@YO��&������"�?H�1���Q�n=�S�U��^��H���ͯo�����Fu�LHTI#�X7a�Z�.�~5�$��,�LL �J�,N�]��<@:o��bq�>w����;r��_̓�T<3����nمqjv]:�B̎�!�Y�"k��u6u.�~�fύ���g�7;��OЮJ�.�fO����>塥vݸ�N�~��e8�!+%�8A)���m����P�8b�d�����6YM���{���vdGZQ:]p`��u+�W��59^��7�0�<��ڽ�� +�����P�㗢��!��V�I{��ey���r�= Y�@� ~S��]�o��5�p��E,��@�IT�Eѓ-��f��:�����Q/�Fre�BO:��7���x�^�۩z����An��A� �(�6WSIS��]��rC��Kԉ���!j�7�$�7wjw��,*>*T��̛"o������0�Ez�r��U�W:�2MUᦶD��]:���h�w���xLU���)Ѯ�7�~���e%�z�zV5��+H�g!1x����:���I�aM�O� +�����̤��,m�^iz�5�H��6p-���rFZҾ������YO�RY2=.*�Oh����y�гv�7QHRݵı҆�h��+^��bH]a���M8`��k���%�6��?s�a�����Gu�zE������ЊM�K��@�~���=w#�*T�x�߸�0�V�dv2�^��Ge�#w�K3�Ju��坃����o_�= +���E�CG��� +�Ze�$ D�q���y`T[�r��J.�V�=;�"�^84�ťv���,�-�B3���C7� n^5��@ݍS�����[*$D;�Cz���p��(�V����\$�~���E��vV�@s�)˰|zx� +�Zع�]a&T�s�̋5��_Q�y�:m���ͬ9���ת*�e�Z����N+�v�Rl��gu�8�d=g��bx�`ע-��X�p��P8M�!�֫oZ�|�~9OQy��(r�\�i5�'��Uɕp�D���y,����o�ժ�?\9Y���:R�b�<d00��|��H�M�������P�o���Y�ZOLY��*R�"���lm�TGmc�R^�]��:C�P@D���|��ߕѐc��0-ۈ�H��2A�(3�`s~~��=��U.���3AVD�`H����� r�.:挞�Y��n�S�N���e��R�Yπ�J@��(d$1�je��SIx��gݷ����TA�g+�e <�����]�����`Wo��K�Ȟ��6��!_�-��-J�<�,�}��f����}��r�Z'f�Ў����g�f�+�,џɡm���@��&Iw��-^Qe%�XXY��|!!����?���Z��o��ޅE��j���o�B)h�w�'9Y�e���}B�����/i�*Q�ņ^clm*o�VcV=*_(8�+a���@O�,�ִ�9��@dU�7���NO��%�T�ՅJ��)���X����q.�rgǬ�p�@���ڝ!�6�s�.9�cV\��Y�v+�4�eӞ�eFBʘIl��s�-u��iz�#SfdH\( �,�[� y7D��q�n!'�۸��4�G��I����h�FN�nѠ \[���X^{"P!�1'.�HZ'�G��HEƁ��k[�hL���Ǝ~\��- |����v�6%�A��8ur'"x�v����mB\��1%?7[�$2'�s� �`�6.T����"�E۩BZz����Q媥���p�� ;j�6��L�3b��'����>B��4�F�D��+nXѕu�V��<��u=��NN�Ee��QVwc` ���dكU3eK�τ��8,����%�doi*�0�j��8��ID��X�(2��a�aL�֔��8��{�q/�J�x{ba�#�q�����"j�]=�'�۹�1z�/��@���VCZo�Ź( +�D��I�8gr�٦�E �@�[��~y����'�G�7���W���j�n1��{$�@��Q��o��е3�a��W⬱.O] �c��\@�aI�����Q��Xm%��������a�Ҳe���Y�m^D��'�<���7��X^�U*�y�Z�G;�(s��_�p8+SƂռ�� +�2��zw�精ȚV2����� +�gN�-����p���06�+�Q��N�p�{ ���33L���I�f�'�j +ae��=�J�l\Q@ί�o4��N�]�q�j4����bl��/h�ȋ��/�@d�O\,Cu|e��|W�>�o��h�Oo�A���e���|�cgF��MY�ǩ�6J0K�I�0h�ՐCޯ��c����y���ع�7��[�OCJ�WNY$o������v2�;.� ����S��`:��U�(pe��Y��LY%�a(��� �G=P`��'���WxI�������Y�m�3ϔf]�3���� ���rU&B���d�� +D��R����ԙ�������t4͢e��nS2[Wz^]���\u��qdB��q�˝A��F5Ӻ�,��ؾ����_ ��3�.� ��� ���h�$�)��Q~~$s!�iiL���ZM�[MM<�(H.,e?�+�0���86��u�=�] �OK�P�+���P~���=� '�^>Nu/nω�F5�^�R��� _'-���C�m#(�TD+��vz�ȕ�2a��(��??�Kђ+�`�<!i�\$뽣*��^��Q����B�>>�GǒBx7�NJ2�= �M�/��m�<�4d먖��q�I�T�,��@Qg��r�Jq哇��F�e��h��}r�c�5E:����kQ�p��r·b A��k{l*�"�V�he"�9E��;�\���&C�Ϫz0dV +O���EM��Ǟ[yYOLh�E�q��VV�`H��Ws.S��[��F��S����+L6�]K�/hJ�!�]��]}�����>�\y �`��E)�d�?@�1)N�3�0A�Tt��H|�-y��1)��[�,O�!�cIt;�g���zǜ�9`H����`�K�xL��=2�ZczLYp�t��M�Fk��"F,��thQ�>%:?�PZH� �]x�D���?� �1_���#@��ST��U�zZ�?������,]��p�}�(�q\08�� �� ���C*f��-�!�p�7B+}�zEPC*cxL +Lc�>W�~ ��-nsR�Bd�!,�fG�'�"n|��I��b5+�9�Fw������U���b������&ts�1�X2s1=~��ݜ�[��b�U�U���h(i�d"��\��I(Bp1X�QZSIѻ�K�<��ر��������]`0��0�|1����1MV���������.� V.j1jZ\pkU��������������kq�`�����QG +��� +AQ��2� 2uѤ�!G��oʜ0CX�� ��N���0"7��\��z�v�'d�-z�mLY�hJ`ȌK�^R$�xI����3Э,��3+�2�PT�N�d��J�X8f膌���"��EV�Ft+ �u�B���g��Q�j2���ˈ�<����*�H*���o_X*tb��TA͊�t�n@����b$n���T��}�)��1QD�4��2�̿�hyz=J�i�9姂r��" f�@�߬������r~�/��` k�d��&p����,`����TN�L��"��y���{��A<h;IQ��3,hpɔY�%�����ɹϰâ��inE�קԜ��k*Y�m�>�V���ϯ��#��`��D�+�q~�a*�K����/��� +��E��m�~�����gW����&�E���ٟ�+�ܡ̎��"���x�[�Lc�ؠkD�Vw|�Z�0��%�I?���O3+� g�c��Y��ۍ���>��� �, ��g*�� +�,�ۀH�F�C%]�D��W��*�V�7�Xg ���1r�Si),!M8�r��t�����E�N��:ɚ�_o3i�ZH���y��BG&�}"-�X��S"�����}"-��|X~�Bg��|�\��<Z�Ge�M +%1�Xp�pQ���*�?I�z��U +��<Zz�Y�[� �p��y�J`V�(�Ӣ�*����'��Ռlh� +�xY��z�I�r���$�x�0�0>N�E`���h�K��\'�"��s����ZZ�����h�� d?I-D$#�jNn�ˣ}�m#^� ���uR��*\�T8RtcC-��h�GV�w�!��O�ە�����[�kq����:轴"�y�"s'S��4�{n���/�ނ�L�K�%�v�D�}kDDo��;���h�C�dg|s�T*I��q�R!� �!����1nȖ�d|e�俈�����l#{�P��y�W~���F# +r�@ÈAN\�=d"Y�0�}"�**<�/Cd�^�Sp�|�X�s�fָ�HJ��������kΘ�6���sd���qƩoou#�9+n9+�|6�1�ꚧ��=Y�M��n��uc� Jg��2$��څ�f��l�Y+�T�؝;���D�BW'qG������T�:�2�g'Q=����9 ��B4��TK��S�;�i�!���cbk:�6��p�_U�pd�l��8f7' l���t��/��yd��t������ڜ�}����S���I�Ty�����,/�:'���=���2����5��9Zd`� Rm��T4a:>�~��Y4}4/Y�D_L ��V��dpK�=#!K�o&�2��\���?�|�s��܉#�\_3���!� +��kIW@ 7�s��O�+~q����N =�h�ةmbg3�2p.��Z0;`��m߲c��d;�W�%�~|��F\ 4�@���ZAIn9I�'�vfl�����������`� ���\n�N#w�����xm[���ժ� |��ȃ�D iz%.A8���E�}��Z�!��U�G�By-��h5'-@�OIˮP���<j�����gP�'_���)4V�X��p���z�o+��3"�;1�-2��s��>�����P��[c@����s���J���BS��U0RH���e�-���D�i���&^,�,����t�ǔ+��*X���#�ΑpC3}�T3e�9�g��%���ȇ�n4 _�f��D�/H�pdk����*��9�_��5l|�]4�.�H�̴ ��^42�tӌK�i��g�����֭�m�B�!N�؎6��s�bA�8{��L��z�{P��<�� +ɝ�aU� ����RX�)Z�N/���]9���W���9!��L�d,1�����ӂW�PVU��R�I��� $s'8+�`�=M�?���mN�*��8y�4�zB��3Y� �}?�Ǐ�v��,�@-y?����Z ��0�`�v7�x�ɭ'��;��.3g6���,���n�h�٦ÒՖx�Q�y�2,�?k�țD?UECߛ��>x����$ĩsڶ�$��I�]�G��2��d"A�L�e�Є�Mu~��k{�F9�A��=wܽ&����#�N*�jf�~�935Ƌ�����K�l��3�vE�v"��L�x��������jt�)�wM5���g���~�<��#WQW���3�R��t�6�h���:G�-���| e<�0��+�v��'�`��a��>�uꑑ72&%�4��m���4%�M2|�LJ�*��ZW�0����jN�@�y����}Z���*�#(}(6���ދ�����H���O���v���� �*�����^��"^qJ�˰"�}���J֎��*��pW�����وH4��V'�b��]�_|���UJ���P���U� +J��;����\��Г�pIc����v�u8�`C����P��v֍��� ��EAJ�/��(}Xܡ�#��?��*��%��l~p�P���l{Zx�_�a8C����d�M��D�&���SC',��=JUIN�姅��i�*g�CB×r~L������N�ǿ�J>��X����� (W4�t-jpidH�q�����|%M��L?�Б*1�,q��r��A#)B�',4۸�6����iͫ��H��hj��i���je8�#�����(��P8ؕ;w]��8GUfkg�2rS�,LV�/N�XU� ��kq��6�%��k �O��[�o�� �X6i��3�"��R���2�ܸ��d%�:��u�2�H��;�Ol��{\�:��h�D��,�m[W E� Nr�,���R[ ��8�ʪA'���ߙ.�j��@q?���*v7�ώh����K!Ұb��z(����!�3�&�X^|�����}� �P2�$��-KU��XJ߽��X*�6a��c�\��N�;���X�/�.�o��6�T�E[(0��~�N������[�,�5'W�&!-�����Њ���V,dG���N���I�/�D��'f +�vw��~(����j���$RI⇦i�~ +���m2��fr>���B���sy�+q��lb��H�/�b +ORs��x���?��|��{���A��/�-��N�����u�DŽ ����Xn_ �ڶ�=x��x^�!{+un@�P�%l�����|�{e݄� ��eQC����mK)��NPeV��6�M���d~�h檲��]|��_�Y3k�Ȉ��ؼ]� ξ�ke k�A�p }�k��8��Ł�w�OrJ��_� +�l`��>ɷ䓶cA��4PQ6�O-Q4�?+��iY�������Zt�8�*���D��(z�)�!���'���a�C�>���,�1�j��'+�Ҽ�M��z���V �I�HcdF��%x@L��؈�VR�ШDO�%�>�-?fv-V�+� �1o�2/CGo�O�/�eNm�@��3��vt� �n��N${�u�u��;�.E}*�(�g��d�*���3� �,_�ߕ Z��v�b��P�/?{��%�wׅ/�9DA��:��G���$x6L& ���ۯwʲL8���������3[ r�u�-��e_����τό�@�º��ԶX���X��7d�zvN��v�!�g�H?-��#�lߝ �(<��zE�c�Gw��C/ݜx��"O�v�N��n����wh���/;ܹۆ�E�a>��#��?�g6�62��i�b�G�Y[h��{l(j�|���i��(��ߤvZ�>^z������J�St��?�<�W�9R5M�R�yq.�ED�-�E�ݻf}��4U��If��?饢z��N�%��p��+ET��̔��9��<�p/�}|�h��{�%�oۓ�8[b�9NV e�ǽxRD���xU�4���Nr�����(�պ"{m�7��O���ǿWH���ui���B$ +�' 0�þ������ +���$��5z��HZ�E#����No����_����:��H��^86������WK,��o�µ +��k:�(��e���_Fx�M7�� &���Bֹ]|;'(�z\bM�~÷`����}F�c����)��]�S�^����Z �ҡ����S��E˷ł�l�T�V�����~�b��4o��8���~Ϸv��{��1������^Z���~ +�������ߎ��w{���`��q�y�x�&��hP��KIX?�Cd�m��kp�=���Q�)V��zX��A�=?օ��#I��Z�"� ��7�it(�ay +�P|�ݨ�]�!�la ��mp ���WL��X�:y׳��_�����J@�J7�\P�P]ad��{���W�/��cdQ7��0��/�! +oۨ���y,��ޕ��@70D�6����<�#� Gߖ1�h��y~`ެA���v�6���QD.�HV�b�)���S�`�ZH+�avձ��d4c)4������`�&-q��mGJ�W�PY��U`�@��1�Kp):�d��:N�^ l�9����q��;$���H�7^(&� HВ�>0j��(%�e˅��0�cC���l�L�ZP�te\o��\@�w�;B��+��U)��K�O�ʨB%2LƖX�蝱�h�\�:���e�Y�����V�BQC!P�u�%z����^���pE�����i +�i^Vh�E�T(�y�������A�g����,����v�V �t{���ʥT��b�MF?� +���ʙ���&����-�l��:+�F]&be�휤~h�LF^ Rf�@nb����H4� +xO+�U:�3�M7I/�c"ch; ���"�` +�EdF�ey�U���^������e�Awz��kXԃ4�f +T�-��g#E2���]%�*��ROk�}�`��F� ��H���H���2u�h��d4�(���}�}-_[Y�"ܪ��K���.����t�E`R�LE��5��^`����OE�� �˶&�϶�}�2ߘ��4��n+�O@���8R��ݘZ6��}B���| " "�ߜ\Jv���$Ɉ�勞9��ʔ�� "�5�-0gGF�A�d�j�ᅤ +r�D��u2�:���:�@"3f�Np+ +v���'*$;5���2��@!ȓ�\��K�G���49 +�~JW�x�}�B9DR���Vq�P��佴L.�H`���h�:��G(�d�%��1�c6���6p�I��,l�c�i"�{��my��� 1��~S�e�lu�dwP�I����ʥ�I΅��c��t�T49�$M������Ӿh@�]D͜GB찦��lj�8���ͫ���������yC{��lE����� �x����^{�3S'��7$,��5&k��)d[�"z��F��JV���4l�=+��y�#�'�DTG�v��b��|K)�\?:zw�a]�8��?{U�PSM�6)}��C |Nj���(e��dd�}ϬV�st�2ϱT:�o� +J��J���|�� +*�Ӷ<P�c��*ܫz���$��و�4j��v�G�e�Xʾ�Q��8��r���S��8�Z9�oP�W���]�z�1���]�-]��y�B����q���#=�$Ij݄�L�����h�X��3�\�%�B$�}_~(���X��8o˷���>�"�&u�am�ʷ08�����V$X�G��` k�`�O,��h�v>7�o�$�)�[iڗ�o{R��M]'G_�����L>1�[~x��l�[������+/�t�p�S�d�����c�GJ�e=����w�ݑ5���� �?�E�@Yz�E�<���Ĵq&_�HT�A<�#��!҃_�lgG;���tT'&<m���5_��b{LZ����F��ʐ"��N� �י;F�E�!'���x��ז���&�ܷ֓u���}ͭl��JK�{2��_�-��3 +�JG��l&�eMF8��0��#i���4�o�mδ�z&��y,�j� K�v2ϔA�=%��1ɚ7�=�obY +y�����T� +;�C"��A��o{^"$�����k�Zms���zz��D+)�yVi�dJ�W;������,*b'�!k��@^h;�պO��b���ѕ2b�J����,�8&]��CA������''�ly����.�Ҏ��%�ܓ�r((5 >kW�.Qvk�ӟ� ���X]�bQ1�'�HH������rU,Ϲ$I#8���ձ�� +��MX{����f�,�����üFe�y4CkT��h~r�8H�K��� B?!�-:�ٛ0w +�K�� ӓ��.T ��k�E���Re�����CkmÐE�+ �S^�,���C�p�H���o��c���7�0v:�H�َKA��ZqT�:9�◈N��+�Y���,�T ~ ��,J[�d�##�a�v+���YA�, ��`��OW�)�q�O;�A��M#V��r��E������i����#K��My����?��zL��{B��؈%y� �?��g �@�)f�=�Cn�u�fbD�{8G�B�x�1/?�/�_Ȭ�����u��y%�;�.���&��#�O�|�q�0�������*���H��������_�Ƌ��mW��Kf��ʿfV�[|�\��_N�r����J���G��WB����о7Ϩ)�#|&���=J��/�#;�C����~I}�W_m=Ǹ�6��ȇ���� 8�vr����'��v=G�@8��R���?�[�6�Ξ#�m�f����� V����T���}��<?0�<qH���l�eI��ͮ�r`xI�?�j�1� ���tU��إ����V�6�kq]��zJ��x�jAv��s��D<�o%���۪����?=�b;�@�狒[�A����6챦ɲs�e�K +�R��º����{x�=y9�/,m��!�f%����y���UߢsO7��-���x���-��O�x�ut +�O���I:�(�����rC���BI���E����俞cC���������2��2��2�-����\ �~W�M��hd�E�5-�>���%�!1���H����= R�2P�T~�HA����j*��Dx�b��_m�O����~�0����A��3�:����#�����yȻ�M.]�>�s��dx��$�9����Z�2�c\dc�~(�������Ƚ���u�4A��Y�B{�� ��>��7�W���/�����+/��b|.TYz٢�;H�B��������0#ӹ���Z�}����q��H��Z�2�WrC����v��\�2��m��5T��6�$\⩃"�Úܯ2E`��G�*��|g��t��W9>�y���l3a��z0����r��ߥ��9��|�A^k���q�+Ak��<����j1���^RP]^����c�B���u��?o 5�z�Z�IAmG&� +~O~�����d���~dܿ����{T~�Q>�ؿz^M:������������)�զ�������k�B����aPԊ-Yx_��_5��"��h�矹� G�q�y>y�[�(vC��"����ק�!���:����5Y�UA��8�nP%�.���:��EQ# ������X�J�/%�rTt�x�A������Z�W��#�c�� (>����幐�cVbw�7�<�=#��2ҽ��s�k��2������ʿ�<�̾��U�Gd�Ws�g]�9�v��k�X|��j?J�f���@N$X���^~{!?$^�`�50������D��H�Qte���h��?2_����`�/��p��(�BQ�"؆7/����X���r�zA��E��-���)QL���@��P�]W�=_m�+�#��&-DQ߹c=X�9[,_uյЇx�y�������:�R3�$�KJ��U5t +�%L\Q?������������XL=�LY�j7%ұ�Dbj�$7�F�3P�z?��<������mF1�$�m���D�O�e�-�Wy��d{�9��`��_m!�-��8*�\y�i<�v���PZ �B��K^���}�}�z�X8:P����X��I�r�E����.N�W,Y����=�\�r���AM�x +%� &P��J,�_�����q�>��5V�;FǶ�:��N�0�������+�q`)��aM�0����Гh�X�#҈��v���}�y���'K�i��vq$vl��dV��e�z��H�%�[�����f�t<�q[�J�P?h�(�2ql�/T[:>:�j��$䅱-&��]��U��>��+�%j�EJ(zD �eP�;k��D�e��Z��J(�> �D��B� a���E��C�J�� ����m���M����)2��+�#�$��N�c)�7�ׁd���E���B�(��h�u�d��+����6 +=酲U�l�%S��%E����m +|�#�����o�a�,u�D��(m��o�z+�ViW���&OO��]�Vid�V)hax�a���]�Y���vTt�'�c_O�M(�T-�@Oِ��hJC��v��m�ZuP�̨4�U�%Ԁ�\:9��L�CZ����w7��g�� �罉]���έ[�+"�cm7�:ZOG3a&?b���\�=�b�5m|��b���"����jG{%�U@2 ���DE��S��� J'��K�R^x^@1 �o�[;~����Ȱ��l�~��II@V��O��h���0����M\e��������a.� ��E!O?���,���l�Bٶ��o���!Y�/��044�� r�~��RJ{g@�P/e���� ^�{ݹ��r%dW���k9?ԇ�\U�X�;_CRPE���g�7IAy�c.����;�����_b��I͆��ֵ�r{'�D�:�i�Ѡf������͕��yBY�E�}W�D@xU������z�M[z���5��~�w�����(�{�T���ʚ\�T-G� �LkX�u��_����!lz8�!��dF�3�$��a�9�pG8sP��h2����Mn��H��P�����ҥ�4�T?�JK0�{[��%����*�V�4����Ԡ��w��/2Ă���_ZԀ�����"��@hY�7�&�B�^�\�YX;s��ϕ���C�R_Ʊ^�zIM5t +�ōY�J�թ�/�A�um�c��6Īt�r�=��-W��C��QVg�fKQ�:��k�M���<�A��y8�X������踡����X��a�Ď���Q���~��?$(_��"OP<�#QN�A��ӕz���Z +�>:�G��-�3wA}ec�w��.����-����B��"�z��C�#�]��k���<��Z�!�;UZ�D����G�"k���r:c�B/�A�Dj�rc��i��#Fj�T}��P*��*[c��n��Tc�\,���s�;��)Q6�{HGY�R(~��%����/�.&M;z���+y ��*i��1���{�o��lˡ��Ɠ�?�Bߎ��k�U�e%����A�Z��� ��t�j��8���Ok�H��o���Ο�|� +�<�mP�����o��k�~Qn����� X:_.i_W����O��3����}���C�W�$C��9}QYTC��(�D�}���}Xp�.�*5_� ID(�W��3�66����H��g ��Xv��fN����CY��*�)=�5+�� K���V�l�z0T>M��� +��J�{���cѶ7Dk+���ב�'��ek�pE�����IDW�{|��(�7d�+��[�A��}ZU��s���WZ���W]�N��w!�ʛH��3��D� +�>��}4�����w�kJ%�d��|�i���|JAH������=>��� =�^�C�]:%dǎ�q}���R�M������+Fe�� �)G��[B%��TQ-���ŧ���~�S������SB�Z�I�����ʷŧ�[ M2������xŧl�J�n�R�)�_�)���<�MJ�"S���Oi �5U�v���V������ZU9��� ��[tJSD�:*��=D����S&j-٤�H�m)g_�)��b��2����M r���� BBD\wؔh#��NS�Fs�ؔ��2������)������Ȁ\�)=� +\�gB��RV�Lnr�����/bm�)��۴ǧ���/�/ +P����G+���?���2ɼ�����D��X�.nu�XYd��3�ϿcV�2���5�R8քQp�Z)�svqM;�J�U�*�?���2[ ��E�t��L��be��oY���RȂ���g�5�R4���<e��J��������o���Ԭ���bV*~{��ק�)��P�L@��g9��(PG���a�2�&un���P�cId���B�6-5&���"}h�WLUj�P�:+r�Z<�@� +jҿ��piu��Mn_i[���<�~?�Wޟe��<EG��`��TDf��)�S��X��x��3m���e�B���� �W�#"�e�E*�TdqF�].��5>|� /����#>;J����vM5IM����pC���6X-�[Ɔ�]�(�eJ�Hg,;Ʋ�aQ-��3$�N,�[8�Zj�?�F�<��/�����c�@�ƽz��l~|j�%���t�h�:9i3qB�$������0n��3�{���H8ٕ�:_��'מD�*c�(�y� +�Y&��$�^4��⻘�!�'�J +"�g���J#V�����D��%���g~ ��e���/��{�Dj�=l� �y��e9%�$+j@=d��ln���媈��-zb�˝0l�I�$�2��h�>`���@���dW�}Y�)^�jQ PD���7[��nA��_Al� �|�$�y:)#V�XN���d e + ly(�'�#��x��0߯j���$y��e(�u&Ɔ���., V�}���I�<�˯�I�%S�Ւ�4�-r3�P\�9)!�< �iK�p6|)��)�Hd���'�j��F�]�><[�hG�5��K�ɷ�p t���"�J���z�b�B�&�-m?� / ���6lɈ呗�ؐ8��y���3���IgO(H[bE{ɸ@<�ۯpg8Pq�xJBp� �����}5W8�������5 (����%�>h�/iN-�Έe6�� �|�AP�@�i6lql���g�2C�G;*'�{ix��yˑ�>��h��e����P���� ���K~`��!�gOc)��R�߾��փl�% b��#{m���B��d� ,����R_�E�����k�"p�v�-��0��EC�,���a㒧�30[��FD8OW�̜��Ģ��CX���si�vE,�� Zj'����ڹ�vi�8��1��Y�Y��`��!<l�'��mυ1��}��eqදZ۹���eBŁ�G��mU�Aj�;���,������,к����A8�G5�� �� ��<;�� +�R#2�u4���F���U�vD��^]y�/���\�C(k&�Jw�u��h�2T��6��zqO����Y����"ڋ!K]�J<ٜ��2�y��L1T� ���/�]d[�����䢴�-$�4�Hhd�H3� ���}�BT�oS��s�����5`���ٛh#ϲ#J&����wD�L�C��v�빨'��y��x���p}.s1/���̟J��h$�(�O���)O`!�?o�$y��K��s����O�ˣ�0!�υ)١��]���k��ڑ]I^��"��U(��R7�?��n�)�;]�I��Џ/�AS�%��&������d�uۦ����i���4�����O�@7�$z6@���g�!-����B��N~��`��)R_���}}2���?_��S��}�i`�[���$�9���pqr┨�Y&we���o�Lr�(�����$E�{�C�\,�/�*�9�O��G7P)Q�H�jʍ�'��s|��+�㪍\� +��r��BN�3'}���8�'j�(�v8��8���l��?����o���t�܀�r�*��m� ���I�F3|r�C����?]�t� ��ܩ,����aǙt0l�l�>:B�/g�M���n̡��������53�t^%A +�J�h�X����sM���I�T�n"Q�N����-��N }v��H�h0Ó^2HC<U"��+.M�8���<ܲ��}�v�4T.�d�n�'��� +�T~���$�W� +�����x�کl����xH�mލ`����DtL�����?Kጡ��n� ��d��(S!���^��!:�c2�?T�'*h�����X,djN�V�)||0/��e�4�S���7� ,�0*n�w�TES'M^ �|������+z��dL�;�B�ў�|_a쐯�[�~�e&�$$n�$��L�T7��wO7�!1q~s��ߙ�V]�K��U�QA�#t�]��D���usڑ�����|J��ڨP�!��?�����r�Bn��bUl�����FAsM"%�����A�-R�b}�����k}oj)�X�D�s�,;�[�G2ZU���K�g�O��+����k��(<����b��JZ�4PyxcĈ�2"VZ3��Ov���$MRe��fԊA|���k\8:N��eT(� �M���_`d%�+V�����SKh[�&UV��as���aOW�O��'���&�;Tf8����)9G��NیxVd�}���{��R��u��.90�~V���J�Ts~��_��#X��:k�0�W��F���� +�#���P����-mQ���nJ,č���0�yE���+B��M�o!XaceZb�7���l^��ؤ�\U�gi����h�nv^�t3g^tn�#�����}n��!��M�yMxޤ���K#`��T���E#�����4FD?^N,rˋ�ɗ�!��\��u�h�7�ᨻ?��D�Nd���ay�q��,�A/?��dR�h��8�-m�A�t������J����$D+��4o�w��Tn��B�č#���hx������8kyZ�_h�a �X��g��c�b�e�o�iq@���m+��+;`��E�A�` ���"Z�<��]�KK`Ē}�N;�,�!�X�!ڴ0�Ȃh5��#Z���n�N����m�)_k�#��j.)�G�%B�^���B3v/���� +e� �����b�e�4��&�D����M�c.�@m*H��P�@����%܅�����_(�'O�Ζ���W7��N�`�cd��&% )��x����82W��ca����N��$2TiJ�b�8���IXg<�u��2YΕ7u; K��'��UmXs����%��&���L�������7�h�k�8��){Y�Ȍhmٙ�����Yl� +�Q�H�Ǽ`; ��Z���v�i���u@���3�F�OX�M���Dꟃ�9��I^S~Sc��4~z�&��_9i{9A~�,_k�IX�P���'�� ��_o��# C��DO�����Q�����?�(д��@4�98ݧtӝ�l�4"�f~�V:āF����0ㅅ<]�ǃ���(�����æg��0�ܓ)�P�����X�?����f��P�䗲�� �B���6�2b���\����+ �z��S��;���oTd�B�PZ�2ܽ�-�*�p�I<��j$o$�8�%���u���7�e%���И��W����6��,�^�Q־Khd*\O)f�I>q��ˡD��! ��l��H�E�4b�)���������!'�7!�(�.4upM�Z���:��! �ݜC���dk�6$�N��RԆ�h��6"�^B��Ŧr]���q$�⯢J0-p��Y=?sçgQZ����6���&$Q ���\X��>x�]� +��<=��4�I%h�)�Mw�{#�E�A�hp���A��~�D�����pN�-=�9���u=�Ҝ���W��.?�@�JCݙ�3�����l�+�Gk)Q2ܖ�O�=���VY�ɧ\�e��� +�Iw���6��N��A7jV�7���7�Ŗ��4V�-O�����[�K�Ľ�����9la���8A� ��5���!+�@&�%zf�'j�6��CP�-_Py'��z:�����0(�#� ��-όX��ό +��ް�aحSu,��R�K�b����Z��]ஒ\r�)xz +��A��T0�=3�P'�|E٪͙Q�#%�<K� �y�&��Dm�@=��_q���lWz]�TyP�]KzX�I+���P��abC�*ÈT�J@���]� �p�� +/��:3=�x獡�R@�vE��h!|pY�P� ��㪝�,��}�`�^&�<Jİ~b�,�g+Ω��������_�im��,����ې�P�"ILɎ�Բ;����R�G����b������7-C�ձ��0��/&ᖦ)�M�?�qf�4j{��_������q_ }�1���� ����,H��#�\^�l ���5tl�'"=��_�Q�2V��������H��5FnU�!L�ہ��`��ȉ���_}�.lj�v����?]�n*R��}�����?��-�ѣ�P�$�Ym\�N�����D�!ܽ_��e�mE�W�����Ge�I~�8KU�>ǿ��cs��z�������m�_����ʖg�>�M��@y����}���s̫��)����M�c�s���|t���z]���{���u,G��l�;6���; +t.<Ǹ�̊��!���v<�G��|{$�/���P������#s�C�ha�zE{n�������Cy���<��3����z !������z��T�� ��ҎE�"��N<8��*i=EDJ� +�ܨt�9�=��_xvv�!THZ��wЊ0�C\�$��GN�i���T����8b��*�k��,|���?�(��!n+��x�;��|�/��ĖʿhI'���������D�� Hෑd� +�f4���Ѕ�m��q�%>���c�R�����|������U�����r�D���$k)ޣ�#R���x�V�鉖� p<�&§�ޏ6 �����/�>����h��s����6|2��^�mQ�m�)O���=����!�Am�e+|��.,��5������8j<�0�i��BS�߿�yӗ�*��Ѫ��[�?;Q�����_�#�fY����L�?���i� ��ׯ���-}}}�܋� +endstream +endobj +383 0 obj +<< +/Author (Werner Messinger) +/CreationDate (D:20100305103803+01'00') +/Creator (Adobe Illustrator\(R\) X) +/ModDate (D:20100305103850+01'00') +/Producer (Acrobat Distiller 9.3.0 \(Windows\)) +/Title (Bosch_4C_M.eps) +>> +endobj +384 0 obj +[/ICCBased 390 0 R] +endobj +385 0 obj +<< +/BG2 /Default +/HT /Default +/OP false +/OPM 1 +/SA false +/SM 0.02 +/Type /ExtGState +/UCR2 /Default +/op false +>> +endobj +386 0 obj +<< +/BG2 /Default +/HT /Default +/OP true +/OPM 1 +/SA false +/SM 0.02 +/Type /ExtGState +/UCR2 /Default +/op true +>> +endobj +387 0 obj +<< +/BG2 /Default +/HT /Default +/OP true +/OPM 1 +/SA true +/SM 0.02 +/Type /ExtGState +/UCR2 /Default +/op true +>> +endobj +388 0 obj +<< +/BG2 /Default +/HT /Default +/OP false +/OPM 1 +/SA true +/SM 0.02 +/Type /ExtGState +/UCR2 /Default +/op false +>> +endobj +389 0 obj +<< +/ColorSpace 384 0 R +/Coords [ 0 0 0 0 0 1] +/Extend [ true false] +/Function 391 0 R +/ShadingType 3 +>> +endobj +390 0 obj +<< +/Alternate /DeviceRGB +/Filter /FlateDecode +/Length 2597 +/N 3 +>> +stream +hޜ�wTT��Ͻwz��0�z�.0��. Qf���Ml��@DE�����H��b!(�`HPb0���dF�J|yy����ǽ��g�s��{��.�$O./� �'�z8�W�Gб��x���0Y驾A��@$/7z�� ���H��e��O���OҬT����_��lN:K��"N����3"��$�F��/JP�rb�[䥟}�Q��d[��S��l1��x{��#b�G�\N��o�X3I���[ql2����$�8�x����t�r�p��/8�p��C���f�q��.K�njm͠{r2�8��?�����.)ɩL^6��g�,qm�"[�Z[Z��~Q����7%��"� +��3�������R��`̊j��[�~�:� w���!�$E}k���yh�y�Rm��333��������:� }�=#�v����ʉe +�tq�X)I)B>==���� �<��8��Xȉ��9<QD�hʸ�8Q�yl���£sy����0�OZ�k�(���5�Hݠ��>��yP�������:�8�����p�����Lg ��k�k Ѐ�$��t�!0V�87���`��ɀ2A.� +@���JP�A#h'@8 .���:� �`���`��a!2D��!UH2�� d�A>P ECqB���*�*�Z��:]��B�=h��~���L���2� �� ����5p�����N��������:|��ó@� QC��!H,�G6 �H9R�� ]H/rA��w(����Q�(OT��JCm@�*QGQ���-�(j� MF+� �6h/�*t:]�.G7��З�w���7����Xa<1��:L1���s3���b�Xy���eb��~�1�9� v�Gĩ��p���+�5���q�y�^o��ó���|=�?��'Htv�`Ba3���B�DxHxE$Չ���"���XA<N�B%�#ɐ�I.�H����t�t�t��L&k��dy'��|����V�"a$�%���(Q%�.1(�B/�%�$�V2G�\�� �i)�����Sj�T��)�a�Yi�����t�t�t��U�I�����[&_��E�1 +BѠ�PX�-�z�%�8CաzQ�E�o���Y�e���Y�U�gdGhM��EK���NІh�(/qZ�Y�cI˒�%sr�r�r�B�V�;r����n���;�)��2*\R�V�*�*�O(�W������)V�S�UVQ�PNUޯ|QyZ��⨒�R�rVeJ��j��U-S=���.Kw�'�+�=�5%5O5�Z�Z�ڼ��z�z�z��# �C#V�L�[cFSU�W3W�Y�^����O�WkN[G;L{�v�������N�N��C]���n�n��m=�C/Q��M}X�B?^�J��l`i�58`0���z)oi��aC���a�a�����(Ϩ�腱�q��n�^�O&&I&�&LeLW��v��j�o�2�2�mN6w7�h�i�r��2β���ZP,|-�Yt[|����[�XNYiZE[U[ 3�F1�5���z��i�w6�6�6���&�6�N.�Y�Y^�|�NݎiWk7bO���?d?���t�sx���vlp�p�sJp:����ę���<�b���+���Z���&��V���]�=ν�}���c��yO����n�a/e/�W��� +��W�x����+������}�|a��{|��Z�[�������=���O��>��P�4�407�7���&�9�$�A�n�0�;T242�1t.�5�4ld������+�s�;#�� ���V�]=iY9�FgM֚�k�&�=%Ō:���n����c�1gc�b�cfX.�}��lGv{�c�)�L��Ŗ�N���퉛�w�/���p+�/<j���$.$�%�&㒣�O�dx��������T�Ԃԑ4���i3|o~C:��&�S@�L� u�[���Uo3C3OfIg�����wdO��|�����;W-ws��z���� 1�7jl��8��c��͉̈́��3�+�{�%lKW�r�����[�$ +���l��lGm�n��a�c��O���kE&E�E�Y�2��⫅��;�K,K���������h�tiN���=�e��²�{��^-_V^���O�o�§�s���]�?T�Wީr�j�V��Q=w�}`����嚢�������zԶ�iו��8��>���k� + E ���� <��h��ؤ�T�7���E����7�-�-���֢�����o��:�}��$�d�wZ�U�Q� +ۡ����������S+Nuw�v�}o����j���Ȟ)9K8�v�\ι���/�]��~pq���==���/]��~�b�S�+vWN_��z��Z�u���}}m?X���o��~��F�M�]��:^��z��m���לּ302tw8rx�.��佤{/�gܟ��!�a�#�G叕����c��șQ�Ѿ'AO��ƞ���Ӈ��������f���ܧn>[�l�y���邟��~���_�Y53���r���W^��{����7�s�o��}�x��>���|�쇊�z�>yz����������� +endstream +endobj +391 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 430 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h�i3Baǿ�5�e +��m�Bn��N5-*Q�DRZ�M�;J�C8f/���^=�y�9�����V��_x���k/O�n���/��ZϽ<6�ht~xj�ך���-Q/Tk7"[~H�J<W�ݔ.���t�<�;�g�X&p��_$|��,�9��N"��=pn= +�M^���]~�q����6������f��h��m"�U�� 4f���Q���j��cKC���� +�l��.�d��"�e�f��)�`��_�V�Q*{��>�� �}3������O�v�2�2��V84.<����4sB�Y�xل)0k��M�0X+�5�Ð[�Cz���W�amfk�Djt�&D��s���9� ��sl��_��?-.�,yBQ0�$�h:x� %��TĂ�D���y�(Vke��Q��!���5E* +endstream +endobj +222 0 obj +<< +/Type /XObject +/Subtype /Form +/FormType 1 +/PTEX.FileName (C:/branch/ku_algorithm_environment/20_Documents/20_Documentation/texmfbosch/tex/generic/images/bosch/CD2016Graphics/Bosch-Supergraphic.pdf) +/PTEX.PageNumber 1 +/PTEX.InfoDict 392 0 R +/BBox [0 0 1190.553 504.566] +/Resources << +/ColorSpace << +/Cs6 393 0 R +>>/ExtGState << +/GS1 394 0 R +>>/ProcSet [ /PDF ] +/Properties << +/MC1 395 0 R +>>/Shading << +/Sh1 396 0 R +/Sh10 397 0 R +/Sh11 398 0 R +/Sh12 399 0 R +/Sh13 400 0 R +/Sh2 401 0 R +/Sh3 402 0 R +/Sh4 403 0 R +/Sh5 404 0 R +/Sh6 405 0 R +/Sh7 406 0 R +/Sh8 407 0 R +/Sh9 408 0 R +>>>> +/Length 1596 +/Filter /FlateDecode +>> +stream +h�ęK�7��} +]�4���zd��E�p����I�.U�MzíR�?�䧏\��}���y��,����˟1���Hs6%��m7�arѦ��__/���~z]7����m�N��b�"e����/b~{U�V5v�X���䭯�\o��/�ļ~3�/�Wk����њ� %3~��Z��u�fb[��8��ٖ66%�g+q��wV��lriwz���μ\b����Y�Dl�:Z�l�o���?|1C�Ƽ���IcR&�\Y�:g�m�;Mt�0�:E{�(�66�^7|�?�7[��������C���l��Н���]L��P&L92�}�.I}����=�fs}56�P�H�P�����3�Ȥ��&V|X��������??��2$��Yt*l f����U!Ve?�EHH���`��������e�>y(�����q�G���T�q��6 +��� }>Rv�R�І��R�o�7�V��cz�ƀ퐱Eo�!��X�� =d�����Dlۛ��������8���i�v����S|�ʧ|w[��Uyͥn�Yz�;���]��3òv����ñU��� +U�������L:e[+dm�A��A�Ma1�7�h�{`U0]�+�"-��\\-@�{ � -�P!���(ݠ�p}�h��tE��Y�c�l'd��k���@Ry�D�EG*� �X��^tZRD[�w*Nl.&V���Qb]��zi-٘�-�"˦E] �d-O�'�Ӫ�陕l����Vͱ��(GO��I}˘YJ�QKz �����hF�ȡIѧ���nr��N8�l�=��{gS#�����8t�n����v�y0�<����=:��۳���t������}C�)e�Ii[��(|�5*��i��ZV 7�� �O^����,�G�O�2�Ϫb�+��$Hm�j�l@q�f��%�c���1ӣ�q�b �H�!�ԕ��˫J�b�&�x���_ޡ +�f�PC?���F����J���A�5UA6L�I@� Z�ݤ|5�J�3�+֬MR�N;*�<�?�y/�@t��V ښ6 +$��CW�o�4`���_I��O�,�4����$0��,Scr�x_��C�.� ( +@ +K�: +@@���=G��) Ն��|-����?���g����r +��I��wg-�H"xd���K�ۥ#����G�0':P�~�q稪e8�aU�K�8U�� �TXLP��yi��Э(S�v��Ď2O��R�#k%�̔w�-~3�ZѠs�Z����P�g���:n|�Wmӥx{��:[��cA�� ��oMV�r�.���o]��@m]��a�عG뻸�ɻ�G~9�ϑ�.h��s_w������`���B�����aHߴǮ�š����E���>�����A��\�Oƽ�.��'�U�Lt�@�jI-�2�ZЎE�,Z�$�eA��x��&iiB����������x���1=�ѡ�%mo���{s�o +$�A��k`��i&��n�\�;��S��9�]P����>��@Ɓ�#�J�ѣ�v9ᩃ[���g�]��K�G���<!��>\�7r7����*(YM�����`��+ +endstream +endobj +392 0 obj +<< +/Author (Freelancer) +/CreationDate (D:20160518202519+02'00') +/Creator (Adobe Illustrator CC 2015 \(Macintosh\)) +/ModDate (D:20160518202528+02'00') +/Producer (Acrobat Distiller 10.1.16 \(Windows\)) +/Title (Bosch-Supergraphic-CMYK) +>> +endobj +393 0 obj +[/ICCBased 409 0 R] +endobj +394 0 obj +<< +/BG2 /Default +/HT /Default +/OP false +/OPM 1 +/SA false +/SM 0.02 +/Type /ExtGState +/UCR2 /Default +/op false +>> +endobj +395 0 obj +<< +>> +endobj +396 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 410 0 R +/ShadingType 2 +>> +endobj +397 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 411 0 R +/ShadingType 2 +>> +endobj +398 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 412 0 R +/ShadingType 2 +>> +endobj +399 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 413 0 R +/ShadingType 2 +>> +endobj +400 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 414 0 R +/ShadingType 2 +>> +endobj +401 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 415 0 R +/ShadingType 2 +>> +endobj +402 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 416 0 R +/ShadingType 2 +>> +endobj +403 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 417 0 R +/ShadingType 2 +>> +endobj +404 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 418 0 R +/ShadingType 2 +>> +endobj +405 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 419 0 R +/ShadingType 2 +>> +endobj +406 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 420 0 R +/ShadingType 2 +>> +endobj +407 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 421 0 R +/ShadingType 2 +>> +endobj +408 0 obj +<< +/ColorSpace 393 0 R +/Coords [ 0 0 1 0] +/Extend [ true true] +/Function 422 0 R +/ShadingType 2 +>> +endobj +409 0 obj +<< +/Alternate /DeviceRGB +/Filter /FlateDecode +/Length 2597 +/N 3 +>> +stream +hޜ�wTT��Ͻwz��0�z�.0��. Qf���Ml��@DE�����H��b!(�`HPb0���dF�J|yy����ǽ��g�s��{��.�$O./� �'�z8�W�Gб��x���0Y驾A��@$/7z�� ���H��e��O���OҬT����_��lN:K��"N����3"��$�F��/JP�rb�[䥟}�Q��d[��S��l1��x{��#b�G�\N��o�X3I���[ql2����$�8�x����t�r�p��/8�p��C���f�q��.K�njm͠{r2�8��?�����.)ɩL^6��g�,qm�"[�Z[Z��~Q����7%��"� +��3�������R��`̊j��[�~�:� w���!�$E}k���yh�y�Rm��333��������:� }�=#�v����ʉe +�tq�X)I)B>==���� �<��8��Xȉ��9<QD�hʸ�8Q�yl���£sy����0�OZ�k�(���5�Hݠ��>��yP�������:�8�����p�����Lg ��k�k Ѐ�$��t�!0V�87���`��ɀ2A.� +@���JP�A#h'@8 .���:� �`���`��a!2D��!UH2�� d�A>P ECqB���*�*�Z��:]��B�=h��~���L���2� �� ����5p�����N��������:|��ó@� QC��!H,�G6 �H9R�� ]H/rA��w(����Q�(OT��JCm@�*QGQ���-�(j� MF+� �6h/�*t:]�.G7��З�w���7����Xa<1��:L1���s3���b�Xy���eb��~�1�9� v�Gĩ��p���+�5���q�y�^o��ó���|=�?��'Htv�`Ba3���B�DxHxE$Չ���"���XA<N�B%�#ɐ�I.�H����t�t�t��L&k��dy'��|����V�"a$�%���(Q%�.1(�B/�%�$�V2G�\�� �i)�����Sj�T��)�a�Yi�����t�t�t��U�I�����[&_��E�1 +BѠ�PX�-�z�%�8CաzQ�E�o���Y�e���Y�U�gdGhM��EK���NІh�(/qZ�Y�cI˒�%sr�r�r�B�V�;r����n���;�)��2*\R�V�*�*�O(�W������)V�S�UVQ�PNUޯ|QyZ��⨒�R�rVeJ��j��U-S=���.Kw�'�+�=�5%5O5�Z�Z�ڼ��z�z�z��# �C#V�L�[cFSU�W3W�Y�^����O�WkN[G;L{�v�������N�N��C]���n�n��m=�C/Q��M}X�B?^�J��l`i�58`0���z)oi��aC���a�a�����(Ϩ�腱�q��n�^�O&&I&�&LeLW��v��j�o�2�2�mN6w7�h�i�r��2β���ZP,|-�Yt[|����[�XNYiZE[U[ 3�F1�5���z��i�w6�6�6���&�6�N.�Y�Y^�|�NݎiWk7bO���?d?���t�sx���vlp�p�sJp:����ę���<�b���+���Z���&��V���]�=ν�}���c��yO����n�a/e/�W��� +��W�x����+������}�|a��{|��Z�[�������=���O��>��P�4�407�7���&�9�$�A�n�0�;T242�1t.�5�4ld������+�s�;#�� ���V�]=iY9�FgM֚�k�&�=%Ō:���n����c�1gc�b�cfX.�}��lGv{�c�)�L��Ŗ�N���퉛�w�/���p+�/<j���$.$�%�&㒣�O�dx��������T�Ԃԑ4���i3|o~C:��&�S@�L� u�[���Uo3C3OfIg�����wdO��|�����;W-ws��z���� 1�7jl��8��c��͉̈́��3�+�{�%lKW�r�����[�$ +���l��lGm�n��a�c��O���kE&E�E�Y�2��⫅��;�K,K���������h�tiN���=�e��²�{��^-_V^���O�o�§�s���]�?T�Wީr�j�V��Q=w�}`����嚢�������zԶ�iו��8��>���k� + E ���� <��h��ؤ�T�7���E����7�-�-���֢�����o��:�}��$�d�wZ�U�Q� +ۡ����������S+Nuw�v�}o����j���Ȟ)9K8�v�\ι���/�]��~pq���==���/]��~�b�S�+vWN_��z��Z�u���}}m?X���o��~��F�M�]��:^��z��m���לּ302tw8rx�.��佤{/�gܟ��!�a�#�G叕����c��șQ�Ѿ'AO��ƞ���Ӈ��������f���ܧn>[�l�y���邟��~���_�Y53���r���W^��{����7�s�o��}�x��>���|�쇊�z�>yz����������� +endstream +endobj +410 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 738 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h�L��OR���Z[[?��Z���| �"�!�GQZiV��*��]v�QD-�)(��S|dYb�������������C�}h���h��&4OFs%4GH�'��\z/dz�b�C�*O$��<*�J��)�:C��RC����ldeFV�g) +�eEլP��e,)a �K�p��Q� �I�gR�|#��$���~�?���'��²V�^�=�U_�i�3�{����v����������A�Ԁ�~`����72���s�'-L����� ([��uxV`�T����bg�Զ�ɭ�m���f���.��n�k�ѵ����\��W� �Gz�Po�F(�T3,���u6�z�Jm�VYkTVe��v�jH��)��5u���G��Y�uй�q�~BnxZix&3NIM/(-1ψ<�F��y�o��[�ɣ~���u�SA�3�=&�E��ܮXEw�ۓ�\Mrn��[)AoFt?K��*r�'KJ[Ae_�s�wQ7�b�ze�_7yW�}o,��#���H�x�Ԗ\?�~ב�8��ѹ\>S���X>͖;������ù���1��M���%yb�{�w�͖�*B����|+�[��o�%��0��\ +�$�c�G�D�� 8��B^�g�y����N"�F̅��$mHb�1R��C�2w����5�z��F���_D��K�]F��+�\C��7����^,�E�>�}H�#���!�Q+��`Cda;£9r!8�[���[ � +endstream +endobj +411 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 117 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +hބ� +�@��ѓJa���K�v+gƼ\�c���獃��{x�=�q���j�C�l�`l��梉ũ�`��q��[_������67n�&��=i�c�ˑ�������}�~����� +endstream +endobj +412 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 174 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +hެ�Ia��9�p���H)%eIY�D����,�of��}��G�}ߩ�������?|そ/<��GVxl��N�H�n�;�B�E�����Ϧ#dT<��d>.aB�I��SS�4�%3��Ȃ���.�%�<�� +Ye��6��ְ��&�RW����hK��qO_�~�`q�^ +endstream +endobj +413 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 323 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h�L��Va���1)![�=��G)JI�DD$��J*�"d�]3�e���{^��wa����,��`�]��۫c����<*/����C+�o� +?�߁�C50"5ġ��q��n�����!E$��<Ғ"�($���()=��,F*b�F�P�1T�����@�qHo��m���m��AtIH���h.!-���S]bHC�tϘ��&Ę�3}S�d������h�������`�fX���VnF����b/�[q��Gi��Jg��(��*��2�S��a��3Ou�jsom�A�������(� +endstream +endobj +414 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 313 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h�d��Va�����ef������H)�-�Vm���B$I�����f��y~<���ob��\�|c���R���4�C����ȸOE����9���\G�Y��b�q���������1.�������&��vٱb�\���:��;�d�m[���f$�La�-K�e���jZ�l�曈���F'�9�0�7h�J�S�E@�JƸ��PH�u�R7�藟Cl�{D�K�Ek�h��t�6R#��6��F��Ԙ&T%BU�J�`Q*�@���w�r�����(��S2��[�O��l�a� +endstream +endobj +415 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 200 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h��ċZ�p���1�)c�� +Q�Jr)��І6�s��w��C����ӣ[�L�#�h������oC�}m��l�f���dc6B�c�I�c����GA����]xc�_�f-t�d�$�^�I�R7�� )�K��*TX���JH���\<�A�%�.r.Y�˸<�{�G�:zmw,I$�p��8�["���k�؟��Д, +endstream +endobj +416 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 222 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h���{OAa��3[��f5iEE�tq;E���B�6 +�/��Z�U�^������ߞ=,�e��<率�g|�-�&KN�J�y�b��� |�#�Ov< �:�i'}�z<v��<o�u���������O����}�����n�� ���2V��� ����PM�U��p�llD��H*��Z��c-�k�ܶ����H�](Itʼn^J��(�g�~��L +��i<`2pG�h� +endstream +endobj +417 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 137 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h�t�W +1@�U)*�iNS��ޝ�$�V�#�y�Sx����_�r~��v��ʼ���S`�{�.���)_W��E�p)s���6�p��}�%v�f�� +�1��������}ͦ��u��v+�?�1m0 +endstream +endobj +418 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 203 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +hތ�kK�`�`�"�ZH(�������QK��4�?��w�?��������S���{��FF���1t500ɦ�4�p��ͰO`�Y�����[�%4J`�i��3���*�k�+[G�m8�ܤ-j���]=}:@���ܦF��h��N�7���w��sN?��.�O�E�n�[�q[�t�����n��}�ˇ���Q�`���B +endstream +endobj +419 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 117 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h�Y�@�ú�+ *��"W�l&|�t'3qb�FZ���� ������ݓ���#�����^����֢�� +�C�������\E���31�NUb3Q���b�/Z��W��;ٳI +endstream +endobj +420 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 140 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +hތ�1��wX�mq8��i�ɶ�&/O|¿�MЇ���͞(b�1���=�)��2�,�q���R`�EP���*JU�SӎR4�&9��@[�QG�2��'[����ؠ����`�d%�<�`!��+���� +endstream +endobj +421 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 222 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +h���ko�P������L&�Y�[]K�����_c�����O�紎�>I�<��c�K�_��o3�1'f�L�9�����������;W8�����P��LHHHQ�� +���Q:!���m��H���w���"g�B�jv�rV�R��k����V��3rV���Z���I}0�7 *�Ho����Rk�J2^/^��Q����c���Fzz������Q +endstream +endobj +422 0 obj +<< +/BitsPerSample 8 +/Decode [ 0 1 0 1 0 1] +/Domain [ 0 1] +/Encode [ 0 255] +/Filter /FlateDecode +/FunctionType 0 +/Length 163 +/Range [ 0 1 0 1 0 1] +/Size [ 256] +>> +stream +hތ�U�@����'��Zo)��]C8%lyo��0b<����~���TP��^�Kg(����ɣ������ZݠkXY�2���,Ι�����M`v���y�������3х���a��t�nnm�5�ժ?�Q�x�����]f��%��ߎt +endstream +endobj +218 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1600 +/Height 1600 +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/SMask 423 0 R +/Length 425911 +/Filter /FlateDecode +>> +stream +x����r[i�&��}:gs!;f2E�{cw�7)eVڪ,����_�ʞ=S�]U�<�� E��������/���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`��t>��?$w��_�՛�����������������?���������_~�������ӳ|�\�T_^__?~sr~�)K�������e�Z+�*�b)�-�+�r5���������E�v|z~���7?�����^����>y����������;���q������4_,G��3�B)W*�˕p���\(W��Ë+��\���ǥJ�\m\�J�z|R?;?=��x�{x���n k}��[�?��������}������y��~|rv}w�/UJ��Q��-���r�P��W&_�� +���a&��ķ�ãp�r�裙B1[(G�&�*�J�^��ķ�R5��g�W7��g�ӟ�����������_���]K|WR����T9���|�0W����*f�{G�݃�����ݽ͝���ݍ������ֵͭ�����}(�v�v�3��s��b���r��z|]��z�V����=<���|�&�N^^_�����������_;~���l�T?=/U��J�P:�C`�+� +���af{�`sgoc{guckem}qem~yynaq~a)��]X�������6zr~qiaqyqyuie5z�������������A&��7��J�^��FW�ƽ�/��.�Z�?���_������;~��w�r�R;��O��r�PNb��|��������[;�k[�+k����K˳�S�sS33���S�5619699_���䚜������������ٹ��Ņ�奕��������ݽ�ã�\>_,�븑bEw�g��חW��7yy}���������|��O?TU�Z?������ţ��j�(��������������:��8=7?1==619:>12>>266<]�C#�5�GWxfl$��ƣ�kblbb|brbrjrzvjfnvn~~aqqy%������;8:���r�o��R;99;���I��&������?��Z�{x~_��ʕr�8_�d�V!�:���3;���;{k��Kk��+s�S�sSӣ#c�C#��##���C��C���pg(�38и?}tphxh8�ZI�5:>]���ɩ�0�5f�旖�W�V�7wv���2�wR,W˵z-�J������ ]^?���������3���V?͗��R%� �V��Q.����!�����]��ZZ[[XZ�7g��jrdllh4�VC��8�J���L'w���vh��e �k4�b���ML�#X�ӳs3s�sK��+!�Z�\���������0�U,�� V�Kݞ�O�nn墹T����?�������?�X��+��|1_�dBl��<��v�v���i���յ�����ə��0m5:64:2��VCCqT5b��@*��Ə��f�5�DX!� +#X#��qx5>199=Z��C����������������������^t�]�\�\ +�X'��Y��)<=�H~��uX�����`~���Z�?�\��Kql�+��V�8�:��m�i�Pl��:��437?9=3>95:>1<6��[�ѕ���R�������@H�sY��.��P��&&&'��g�������ͭ�흭���ã�L�(��� +����ã��a�(�����h��Y҈U��]^%?��ݽ_:����߹����w����?cK��\1[(e�0m�/$}���������ŕ[M���}�S#c��ccaCp8�J��ff������U��2�J')���P�_�ɫ�ٹ�p��������������Q6�/K�R�Z�W���N1�r3��Q6��ч¹�gѕDX���F!����W��� +���ϟ?���b��UŰ$������av� �cO�\Y }�3��I����h3�llƱ���sVɕ�W��Tt�/�M�ÕN�Ov�W�����P�>>>9���?��������«L6_�{���'�秧��W�g��j��/�3�B��*��j�#���i�v|}s���������~������\?;+���\�(_ʄi��a�p�ͅi���͝ݵ�������[MM��OıUG�@{��������*�������J��+�M7��T��H}́�����j|rr&�^-���on����f��b)�W'gg�W�w���w�7w�W����Gˆ .̒�ʵP�ur]��I�I�e�����?��?�����ӧ��Y�\������=_8����2;{��!�ZZ]�_Z��[�Vq������h��=^�K�~sΪsU0 ��Q�o\=����$�j�`��j(��G�F��'B����������N8d0[�~��q���_��������������O��o�N�/˕�\���[�J��D�FV�R�����X�����Y~������'a��(�o�V��Q�pp��=<�� }��K+ql������������g��+��kU�X�9�ƒ`���[Wt���Tr��/�m���҃���#ãc��!��_\ +�W�{��\�T�7��//�nn�������??����������ы��R>�d����vR,ג +���K-������}���������z�R}���Z��k���a�Ў�2�݃íݽ��Ս��յ����1��cC##���}(=0���LB�f�U:Y l�W5Ҫx�*� +iUtۗdV�+�h���+�������d8y0��5��2��`�N�'���W7ww��I~����9La=��=D���K�L��͗��J�VoFX'�j�T=>�h�H�cG������D8@�������b�r�-����k�!���W!��?��m��on/�o,���-�c'�g�&�F�'�GB����H<m�l���2�7�V�=�t_{10$W�9U���K��W}��e}������{��������ŕ����������l�X,W��'�g��a���1_��o�O�/+�z�"�r�r�R�����q��裟���������П��煍���ϟ?��_����R�z2�\(c?���jg�pswo}k{9�c�[\�����������p��=������Ju�V��e�͕�Μ*Φw������a��==0}K�CC�I������������v\�+�ʕ�Ex~quu}{w����������Kt=�"��Exrz^�Բq�W��,�:I���j��~�}�^���������7tus�/�/��˵�|�|�����Ut��V�{�1�[[+k�+��Sq��������P#�hdV������ +lMXu�U�̪1j��vT�����L�]o_g��nĊ˲���n�oV`E�����DH��V��V|a��������y�.��߇�x�}�z||{�xqys\?-+�|!�/J�r�^�U<�oVj�ϟ?Go��Ó�+��������·�Wס��]�b(w:{���\� ��;�l��}�[�c�ff� ���*�V��֨U�R�!�T���X5�l�Y���V�!�p�iU�������7ձ��9���S��D8<}�c!���[X\ZY]�����;8���V��~vz�+��wq~�������O��o���/��-�r�Q�U���aUj�"���Ol������Q���!V�b�R�Kql��V�F����A����������ٱ�������PlZ���*=���ت��g�[CV�V�� �Tk�5p���s"�ш����K�㲾�������>8�F����Hhr�����������Q|a�Z����_^_]��?<==��W_���뛻�Ӌr�8"��,�j�Z?il��X�^^��������?t>������r�R�R͗+��\��~���e:��\Z]�_\�c����ɑ��Fl5�V��=j՞}j/�%V���y�wOX5�덣���woۮ:{���Î� +;J���]1Zc�0����陙�����յ�ͭ��$�*�j�ӓ�p����C(r��������V����q��X�f��L�T(Wʵ�8�ja�-��ǰ?xqu�������o�������U�~�/�s�R�T=����0p���fv�w�7�Bl�������H���l�����V���#;J��ZG62����_�eV��*���m��ǯL���V�d���1�������ﭿ��>808<42:2>>>99=�ܗ�W��FV���������������9�`}���;�O����Z;)�*�|!zW�-8�J��˕Z�Y���?������|���·�/��R�P +MM�R9#'W�����������r��>��8=;71==:19�[ ��j`0�&�j�V���z�;}��/V���ہջ֓��O�ܓ �d+0�d�kDR鮪�v�V�q+ye�)�I~���"������x��(z�J�����������]{��K#�zx|}swzvQ�� +a�2z{K��j����",Uk�j���ʟ%������������J�J5./f��*>Cp�0���[������\|����T\l56�Va�j0����PS���7}V}�C�C���oPuMX���c���ޞV��������Z9L�{S���F�U:�Ә���[쬋�Ot��%g�BV\�>2<2:>9553� �+��Q�{!��Tk�'gg���������}a�|x�]��_����o�����\��`[�V��[��x��z|zys�/a�P�������?�������|��/U2�B&_HN<h���cCl#8;�093;>15:>���C�U<m�1j�D���*ݹخ�j��u�Իv�U��ʩ�5��+���^���[�7R�Ɔ`2d�j�J'�X�N���j�Yo��3Z���xr(4a��%3X��˫k�a�0,��j�~r~~yus{���x����19����!l�[��B�P.VB���a���_?�D���E��������?w>|���T��K�8� +�A6�L[�ƱU�Ǿ�>��<3b�p�����H��8��*�j�D�����/�w��)��!������w�8�����I{_{70��Ol���ڛ�}�s3ZI0�|囃�/��h|Z��@�E8<:6:��΅-µ����E�Ɇ"�J�~v~'X��q~�����맗�a=<>��=D/��[�G�B�"�ԚEX��=zX��N�/�������~��?t>||z_�����\3�ʄ%���1��q���������|�c����G�i���@��Jw �,�J'M��(T�j��W�������kM[������P{I�?��0g�nP؟�J��ds�^�6�Z�:�$p���������j>�(r�ފ� If�f��W���7�w���b��'�������Ղ�����Sk����~z^*W��R6_ʗ*�'U�q�uR�#������e�[;��E��������:>�?��e��L�(W��d�*��n��om�ll��ji9��OM��O��b����j`�7F��qP��C�;«���$Uo{��'N��̪u�Qo��a��{������;��:o��V�����VwN��C}y"aR���ੁ���=�E866>95=7�����������p��K�Z\�~�����+�!� +]����/.����C�U(�a�Y��P�U?�����/�����������T��K����Q6]�������~���6�V�6WVg��fg�Cl51<:�,�L77�ڣV����1�ɄU#� +�R=���w��qB�uOO�aO���N��*9L0��Ӎz�/N�Kun,6J���6WS��Y��s�ۇ�Zۅ���R͟=)�J��$g�+.r3X���|�T���"�뛻��`%~|}��������ǧ�7�a��\���U1WEX���q=�P�V�������?f������:�s����r��/�����|������ތ��VVfBl��&&��Ɔ��V遁���lRg{���W��ۨz: +��� +�눭��U5«��� ��۪F�!���n�8���lOw�Z��k�]���٭T_��U��=�>��d��:��������p����dX"\Z]�X�=XG�\!��N�/.�oo�#X��������������E�\���|�PN��Ok'a��R;�{��gN�_�����s����¯��Z��[����r���o����?�動��a� �k�V;����ql������23�0�اF�LJG�´U8C0�V��<����:40I��̪���=����2��m�U��*\���{��� ���8.k}�u�����T��0U{y�=�>+�n�S���8y�^ �w�6Ңw,z�FF�F�'��������z`��"�J�������*,>==�����1��*º����O�_E��<��49�0��:=�������������/�t=��*�Z�R{~�!W*�僣�a��!�w���?������]]�\Z]�_Z��[����b��с�ḏ��Yu5�7��PţV�q {oRo���װ���B6��S����V���}_GWOO�c؟Dd9U;t�M�-�J��t�+�'���ɝ���=H֪�jJ�qa��������ۓ +���8�����[XXZ^[��ڊ�"5Xq{(r��{E����a +����SR�uqU����J(r������Y��4z�\=.Vjw�����O?��s��ϟ?W�O������r����3كL.�v�v��v�vV�7Bl��<�8Fprxtlhd4��c�7��nbo�Y�ZsV�`����*�j�������!������U�qYVo2m�:�����1p�<а��Au�u�1���9g��h�JwD[�f}V�m={gx��x���g�o�?Y!�����&&�ff��VB���ܣ�M�Z���F����ۻ������$[��O�o�ON�K�Z6_���r�\=���"[��O��"�x��� +������?�غ������i�� +�j&W88��� �d�� �V��ˡ�}mnqyjn>����V�3�Q����ͭ�����8�$�j^��d=������V�������t_�� +�z��ǮZ�V�T]���i��FRԗ~s�`xY�O����x>��}Nbkj�+�J�ͯ��^��+z7ڻ��V���k�` �khxdl<�"�{��W�ַ�"�l�P*�g�W����))ry����7��I�#�|������˕d����"����r�^(U�/��I���_�������}����O�*�z�R)V��Bi�0��m��m�l��mn��m.,��-.M�ΏOM��c�C�p[��J�v�y2a�4����V�U�}=n���L���Ts��9[�UgB���{�*���b�f�Uo*��ol�5�쌳ڋ~��T_{O0��ب��m�`����`�e����T��_���w�Z�_�J���3]���t�_ ��EX�kaiy5�`m���M��Z�����������1�����$Vr������U���P,gr�\�R +#X'I�U����"�����O"z��&������#�J�V?ɗ*�b9�3��������z�Ǿ853��V�`<m50��OR���=�Y��7Ӫ��IĔ4��&9Ug{O�q�k��sC�;� +���7N�qYsȪ[u�`u�W��:����g����z3����=����պB��]˾���}b�Cãc��ӳs��K+k�[�q V�T���g�W�������Ç���>~�6�������������r�E�",%[�'a��8��*�b�z���yD��������o:㌢��R�5jՈ���7�wV7��W���g'gf�1�c�Cq{Ȭ�1���U���DUo�����0a���J���uVZ5K�i�W�J�w_N[%O6���x�V`#���K���jdY�f�U���qN��&�Ju� v'W�1�TG�Usެ�>��⩾t��ݽ{��c��u t�N8��` �)����ѱ��陹�xksk{��0��~�����������}2��!����ۏ�և��ǧ����-�b9�"<#X�'���o�V?M�����?������_���V�Z����ā�Q6�͗��9���:��n��ű��R(�Z�����������GBx28�N��E���с��*.K�� l��*�FN�ȬތW�]��>�l�%e����q�֖b{��'��j�b5㬞�fV�=���&��nk�O쬱jEX]����_Ld�u� +��#X���V�����T�T8�����,���ɩ�����啵ͭ��d�E��o���/_>~�1���E�������u��$_,g��\�\��*���q�"��H����������������?v>������R�<:��Q���L��b���������[MLM���>�$� +�VI{�^��Pk1�����yh`#��'�z�+~�T%�]�_Ł�W_��#�V�{F����T����;|���y�(� +��ԛ�����ts4+ ��o������������7�U{�je�I�:��V���n���J���'��kxt��E�(r���;<���J�����������%D���7�����O�~x�����������\=�JI�Y�6��맕j�T=�����c�������)����o��������|�r��� +���A&�w��<���[� +���J��>7>9��F���;��[uL�2��7Gv�Yu��l�5�տ8"�k0n��Ӫ��Y�[��' ���ƿ�Yf�Nf�zZ �Ͷ��ӽ]'��u,6«��W���ds0�]��.�JE?�W������S��G�K�}9�oMv��_3Y�l�J5��w ���_�)����ᑱ��ɰD������������Ɇ�z|F�no�"�p��ǐ_5��>��>�[����R�C�+� +�j9�"<9��@9�",U���/����/�����?�������T�e�G��~6��Z��>��p�������l#��� �VI{�O�:�����U{C��ɪ���������]��U�L����f�U�0��$�+��)�F{o<y��:�0��zR�� ��ō�/?Ա*����+�jV��;C��b���{����_G���]��ʗ�W7���K v���z��4ku6\��ꌳ��"L�B�50<<�E8>1j��VV�I���G�\1)r#Xwq���/_?~����O�|�ta���z��tyuS;>-�-�R�X.U�����K��ԯSC������^���C��Ӌ�j�~��f�a�*.cOb����͝��ͭ嵍���مp�`�co#8�Z%c?��O2���9aVI������=��i��|;}��O @$@�J�V�B A�4�ݷͭ[�I��{A�I�wUu������7�ug������� ��A2�$��9�d� tq`��"x� +:�"+l� �p��U�˼��bhA*<��o��VBHPYi�2��X]e�R��iYbRpXc+Y�&z�6�L�O�O&�y��BK*�+�%��J�[Q&�>��L/_�KQp�P�P~�h"Ij��F�y���E�'Ău}�[�����noﯯo��/��O���&�Eo0��1�E�ɺܧt��dvx�S���@ �@ ����x���d�X��8���I{����p{�dT���-S�\<����m�� +�T5ٌ�q����V�����p�W��&�Z7W�&v�V B�����Z܌��XE�u�*��@mqŧ +�1lH�Y��Jyì�uY��"�]�p�Ǎ�F�>�/OΎO�dzy�٪���J%_. #���� t�dB���̸��b���7-X��<F���*����a�ѳ��P���h����_R� �`=P��������m6�r8�'d�挦q�Sy|t�78���A �@ ���ī�g�����[��z�q[5Zz�^��V:�Vd�`,!}�~?.���C�����V�`�l2+���H �r��4��t�u��.l���ȭN6���$����7�.�jh�V<HW\��+��.B-qn�ů̠�[��BOo����T�њ.�Gg���ٜ2�r�Z�����K�D*��T��^I�|C�ĎwY$Z�E1���'�^'-X豼~��h���a�����#�,q �>-r?;������,¯h�����)./6�Io0��,B��5�Q�5�Η�?�@ �@ �tvq��o�n[�^�?$تG�Vu\l�2���Q���B1�!cc�@8� l��>v3 +'`+��YQÕ`��n+7/���9�3+f��B�w[�� v[9M?���2ۮ��"�b��B�Lʒ��-�%�-�J���&��% +��Nt�D*Uk����x���d>���\.U*]/�J�b1�J��!tby6PV����Ã��ge6\�+��b+��dk7̲T��8�0� +�a,�k���r�R���p<��羳�wpxtrrv~qq���`�?��=�"��㳭�=s�?�)BR�5[�&��l����>��mH�@ �@ ���m����u������f+��b+��^'}�z��$�*�����c3)�`�"EvSl%&+�$>+n�ڠ�I�Pvl%.a9���͚�-X��J�y���bWY=��2� �8�b�W�'��J�,�m� ��Ɏ�w6a�J����=a��������������l���b�h�r���B!��U�[��.[�"\ +y@��d�KQWw��PKa,�K#F/t�����P0�f�I���hu���x�=Xۻ�G�'g�,Ex����#ZAWq���k����)AXKl�Z,'d!Z�ѧ����CA �@ �kӫ�]\V�������x��� ��V�N�ٮ��A#W,�s�D:cc�[�[1�=�J�����Ҋu[ V+�4�պ�Y�Y�r��.¬��u�}�w[��"�r�J+k;���P�CI�@��fZ�&-�%��,�Y��utЭ�T���,�wN�/�/����"AUŲ^4�|�����T §T��I�2�W���>��i�t��Y�jxP�*or����Y�$H�����P8JF����Q�5�-7��i��)+r��� ��ۻ˫�ӳ��|�9O{}��&S<�p�f�'��t>[nя�&��@ �@ ������˫��x�����0�̚�n���ت�{��mE�#�Eb�`�[y��mŘ ��@�)�Mr�J�\Ѻ*�5(еj����[u[1���eZ�L'�e�bPKQ��c% +Ze�`�5��]J��)�r� �4c(�Br�LgZ��bs������r��S2*�|!_.qH�1�T0F�V��B��$��4��%��],���W�/�#�&��� q��ǃ�z:���38E�������}k�����]�_\�,�"�&)���흽�l��-X��h2��'�%�E�-X�39��g��o~zA �@ ��I����N����t�SZ[���]m6+�F�R+��l������L$�E��P���^/�cg؊Z�x �[b���6��d%��*u[�7�U��73��=].����m�X�W�W�Jّ��K�u�[E�bG�G.��#��P���$�"�V����>9�<9;_nm�Z*�ɕ��r9_*e��D*�����V��� ���A�b�RޮXv,+<�v�${�����6W�]X<��ÑX"I��� +�`����x���/.���� »��{�º�{@[�/��N6�w��]b���X���k�����lgo��A �@ �K�8C��ׯ��Z�J�?�6[�+��}� ��L����b�t$'cC^��ι�(���0��d��_����@���q���J+�d%�B�쌋����V�+ڲ�A�e��Õ�s�2���:%�.^�Ώ����7���D���+��a}���bkkg�X�Z2�)�J%�(�ʙ\>�Lbl��褹�ȡe��o��ؔ��YB�7���J�u^io�ݿ5�мIQ!�,������P$O$әl�"�Zk����h:[.�vwwq�;z���www��O�O���W覽���rk8��dw8MfĂŊ���9������3�� �@ �@�������F[�VMܬ=���^�;�� +�[�Z�a��Q�n+��O����/��|v[iܴ#[���^iűՆ�Pݚ(x�D`E.���\9y��bh&{=�l�R��Jʯ��U���D��6��$���F���p1�kIr$���^�d�EtY6*F�Vk4����c+X�{��*B-e%��\ɫW5y�����vme_*hw��<^�����p#�T:���*�z����x~���-r?;������������ +��n�/�nЭ�;{�ٲ?w�C�"�Z�G��l��ɂ@ �@ ��ҟ��'�K_�V����O�F���Slզ؊���KF%_*g��m� +��A��/#���Vtz ��2v[�&+�� ��/e]�n�r�-0��X�[�Lo��d^lżX.^?e 9�"�*�װ����wK;��E��b�P<Z�Z�+�젮ml�Ɠ���L>_ҍ�WF��ĸwK2G�+[`P1��@�,EU�jNP^���|��j�9jP[�����4r|̯4�����A��R���Ч��ONN�//�i�WOw��hKn���{�Q�?�)�ق�+�"�-�cܩ�x�� �@ �9�ӧO�կ_�N�n8��Z�Zh��Z5[U2F�P6r�r&WH��Q:F0��[��v�E�����@���F����Y��@ $��p�)ٲ�v��1�V.�r3��+%Y��f h�J���A+!���Օ�+�,��x��&tBp��,�{������yM������t6[�T˕JQ7����Q�%[��U�.v���A��]k�Ūv�-�,~�Y��U�&.n�z-�\�Z����,�D*�+�t�Rk���3H���>:,X�̂��D���M�Gt!�[o0�)B��X�p4��Z�G'�C� uX �@ ���ׯ���ޠ��z�V�ǭV�F�Ro�1��s�r:����x�`4���V��PR����ۊ�*Z9��g��J������L���{���ؠI��vt')�"=�;1x%Ӣu�" )X1��+�L��LV�.+�Un[���V,�嶛���!zz� ��E�.�LV��b�hI�8Pjq���g*�yy���v3�B٨��j�X +�#�-�u^ A�a�؍X�U�.+�!�&��E��ؠ�+T��w���-X�����b~V�`�%ݨ��_�?M���}�"�,X�ϴ���������|w�`:�)��`����kkJ,X��l8�.�v�/o������A �@ ��>�W���w}������N�^lU/W����+�R�\"� ��H�y�~;�Ɖa��6�SV��S�W�\���i�����Y�KƯ�o��hB7�x��@;���GR\bb\K6reY�Њj��b�]f�;��dA(+��K���P"�n���ۻG'g;��˭-_ �y}B[��~ò� +z������!_*u�d�j5����Y��f<����d��}����[���En�y����,�)���+��ڷТz<�Nj^�7�g�(N���2��j�;��x:_���wpt�-X�W7�7w���/w��7w����'g�[��ɬ;uz�k<�3�E8dzg�+���@ �@ �_���ī���h:��:$$دfU# A��(�m�-S9\l��>�`��c5Y�$^%�Yao���G��XY�V��X�۫(������s�EZI*��N6��f]�h��X +�j��d73�Y �o[1��cV_w^�a@���F�����u +��#܄�h拥\���d��fr�*���F��W����L�\��*�r���5��-���+�M�ī�h-<:�h�h<���h<A����!Tқ��m��;�x��,��BX�E���/�)�D*�͕�F��h5�������:u�W4Ex�����3)�z�EXh��rk0���u��d:���x�O��d�\·�@ �@���~����_�.��Ƴy��n���ۊb�F�Ro�5�ǎ�U2��}�Q�������5M��؊v[q`%Z���+eV�Mm8l�j�]n��+\�̊`+Ω��@��J�T� +K�=�2�N�.ee�lu��`J���%��H�K���{�R��?Xn�t��V�Si4�r�T�5�� +6P)/��m,!Q���|������)�|��� +� +�{�P,�R��L��zu�d�X6F����������q2����,�m%N3\�r�1+�F^���BUz�ъ��z|>_��`}���X�+�:E8��ѹ����� +���H�; ��?\]ݜZ)�Ig0�q֔���)CX�Ţ���[�~��@ �@ �?�����Ǔ�p<i�q<����y�U�eT�%c�L��`�*� �� AӨ���;�l Vn�d�:�\����L�Fi�ƆI�6(�a����>v��N�P�N�����|%���uI��i5V�Sy畭�rg�����VIU���f�}s{W�V��b�T.[ �l��R�Z(��HT�E���eY +�O��L��W�r�R�����ϜW���8�Bw\sl�H��x6�?:9;����m�;�V�R�� +8�GA�U�ō[�p��� Vt�ʃ�d�Jfz�>��O��C�h<��� +����Vg0�L��ͭ1Ex�-X�O�O��Ϥ���w��d!ZX�pNR���x�Nf����G�����|W�@ �@ �ϩϟ?�l��;hwi�U���Xت�0j�"v[�ӹB"�a}졐74�j�{0@�P���C�r���|>�S�Wf��Q�Uk�nwa�!$�v3Z%�n�u���hdOb Wf �l�Z�M9m�,y�V�0g�%v��TZ t�b%�ݬ%ٝZ��h~���.�����\�P(���2:��eT�e._���贻��0~�#����p$z}}���J�r� +>�Q�#Q��7�Z�4�_#:�.I�'S�zs2_���]\m��6��V7��"~2�L.O&C�Ad����z+�s��&*��bar����͗E��0��0�Ҽ^�?�i�{"�>���n�'�C�� )r��?<>==��)�[ڂ�����������z]�����a��x:��Y�Ԃ5E���)k��@ �@ �??�������q��kv{�f�a�VM�R+�������Hc+_@#�V +���H����^�h��ɕ5�)ԭ�b+'�T�p�6n8YH�n7��}7�be�� +���UEy�Ã���2s��(�E�Te��ի֬@��)����������s��X"����f8͗J�� �ϕ0��D:�z�b~P�Wb�;�D�Q�>>>�:�l�X&��P*�A��"DO �绥x2�>�����������^��*W�z ��QlK$}����VbQl�"]��o[��4�U6�ų����5U�h���GO>���X2���Ы�+U��{�k� )�ã�ӳ:�[��)�z||�����E���N��ф��F��W4E8���M{8Ex}s_ �@ ����$����n�huk�6fV-Ƭ�Z'�t#[(���xc+:FP��b+��T�S �r�l�E���.c����@�R�FC�4H�M��/��Gv8qH����j��M��q]2�V�t�v�ڝ�RٽU�n.��E���4>QE��z(�`E�X�/ ~-��r�����l��������'^^^��zQ�ˆQ�T��R ��I�pw�p�[8��x�[;��''%]�UZ�z#�z�~E��f�3�o��_^\����7Z�B�\���b._Hg��d��6~I�vU��Zծ��AU��)��ԩEh�*$'M!,$�¡p��X"����������l�����||rvN-XwĂ��]XOO/�����ꆤ�ƳEo0��i�p!�"�k��������@ �@�Z=??���_�.�v��i�Ѭ6���6Z�1��Jz6_Les[���p�j>���a��'�aleO��)� ����@������5�P���}� +:6lQA6IPr)f�O�V�٩�a�bk�ZaPB�9�dۄA���a1��� sd1j��Wd���.W��A�,K��"T�?�����|0u�������Ggu�X�?>Ɠ��z����=���j.�J���� +��EoA<���N&�B�dT +e��흞_|�����������a������r�PJ�r�x��p�ƣ��t�`Q�"��JlW�ӥj�-����jOz|~��I�0��3�\��W��Z���ƳI�"w������B���������k��&NN�,��t2�R�#�"Mf�}�@ �@ ��l�j�� G��e:['S2=�%&�>�2#��%�a��"����R`�Eb��iV�MV��M��VB�>4P0V~��+����& �t[��R�v�Ĭ�*�b��eᬕ��$��ś�x��da+�s��d W��Rr% �KR��CB���_��z:�ʉL>M$n��鴛����ǭ��T.W2Zc�'U�W�0M�,ӎEᒕ�C:��n����Ff��R�R�Mf�F���f�e��2�B2����>@&�׳�S��|"EL�%����v%��)��[�+��� + `Y�h���i���E�2�"�.r/�t��lw{��d�\nn�E�W�ȝ"||~z�������.�����ᘤ�Y�s:��w���?�O?��6 �@ �{�O��x�����非�����p�~�W�Z�+VlU�cvQ��*����p4�����F��)|0]C,!�2Z�r��Vtb��I�,f�a��L��]�l��9Op͖t�I���J��~n���y����7�A�M�2��Y�b\nE�Nh>��e'ss��4p10e%�=U���⼡�y����_l.�m#�Mg����B��!��d����W�Z#��Ы�\��dM���ч�1�!�Lf���� :&I�M'�e=��'R�h<�%E��`�PI&��*�*Β�-+=�oc�<9(�)�;H��Y���Z�1���|�CK��h"��拥�Q�7[�ٟ�H�p����?\^]�I�l!FX�/�Ϸw������d�� �]2�p4���d�S���?��1��_; �@ �����_���F�3���;�����U�Mj��c��ZQ�䊥L>��dc�T(l�z����)�m c+�me�!��Rf%� �}V��V��2S����p�"q��]p@іx.9٬C{u����J�-Ӕl� ��AKu)��W�̓���)�%TBە��݊�:d�1�ZVk�o���n�ss�����R��G.�KQ7ܮ�����d&CF��H��;(���*�����(�e�__��r�ϯ�6��"� +��B!�Ϙ�F�N�V���1(�(d�-p-���4���i +�G�Uʛ:wji������x4���E��D��dd�EH�|�����xtrvvyyEB��W`Q-º��:<<Yn�&��E��KNf� �E���W��vpx�? �@ ������w�]�Wѯ�v��7�v�n�ۯ�,le��J Wp���L$��#�P��Y��d2��$� ���ro��V����<�a+`�mq0`EmZ$u�dV+� +�l�@IvJ�ؠS�����da)��J�"��V|#��>�կE��x)2�Uz��T���=8���J��y�,Z(sZez����W+�����5��ë/����N�����w�$EC{z��ۻ��r��0}�TK�J8W�^��N����f��R&����x2����+��n����`84�u��-�X��U{� t+�#ke7�֎e/(V��ow��W4T(k�Mh���"w��|~ D,X�h<�g��(B�"����������`]\^]�ޒ!�Wh�x���;=��;�)��h�����t��)B�e��E��>|�_G �@ ����x��ׯ����Η�M��zvlU/W����~��>v��2F�����$M1�����a�!(N4��xT���6Įuj��U�[�c�6X�U���"�U�@1f咄��"��̺uI�I73(�]X�s%K�Z�%��6�p�\]�xЩK�3��xw�������|{g�?�������:��q�q�҂,�g��S��'Z��i��?�o�]�z&�+W*�/����7��Q2fT��f��b�j�\!��Y��)���bK�ћ�$Exu}��ܤ���)V8���d� w^�B�P[>Ȼ��9��9�{���h 9AMS4�hB�V|X��y������P ��b��J�z��x:�on������� +rg������绻���ۓ��m�"��2���ń ,2�p>ij������@ �@ ���x���+n�nwѯ�v��B��6����V+U�]���X2�'�[��W1����)���"���m!A�*�Z���h6�����:sX٣��\m8pG#��sZ�+�4%���v�U+�X������r�va�[L�IQB�H���=8<>;?:=�������l.��e +�f�3�L�q:�U�^~4�Tlj����t�Jn��.���%��H<��?��w@9% ���ퟜ�f�a�� +�ē)�"�l)BŖ"������z�P���S��,�u�"�Tk�PH���qKzC�V��� ����ɲ���!���d�i6��/-[��f�b�wj��� +�`Eb�d:S(��U�k2�/6wv��O��H ���-XO�_Y)«���M�"�S�5���Y�aMG����=�\nm�w�@ ��j���"^���+� �� Z����:�z�Y�� s����R�l4���l��=$hb"<@�U��5\��2�� t���V+>�5¬ޯ���j�Zg����� ø�v[�Z*��Jv�l�)ٓ��*���7Y��VA��-���DZ�߭����B����j���r��l���$���2������p<� Gz����Xs -�Ŧ�q��eвX����w����nw�E����?~���D�$:%)�H\]ߌ&�L���C�RE�G4��^]e[�LY�����|�����K��+�\�L>0^���o$W�o�Vx!~;$�${��X<���z�A�?����*��+ +WyS�j���鄚�K��GKE�ǣ2�1'�,BB�п�����[�@���_^_]���=�A��/�/������/������^�>�EH,X[ĂE���x-�z����@ �@ �צ��[ ���h�lu��~��%تY!}�:�c/�3�B2��&R�X<�j�YQle�]�r�q[ar�R�N���J�ub���ޯ[[� �E� +�=Z4�ȉ���(Ia�JR�&n�����A�f�Rx���lW�tJ&Œ�e�2#�V�:���\��'���f*�-���L�r�L&W*���B /���?�{�P4�N��-��x�L�uC�� o�B+������v�`O��s�R4��|�Ģ,c��6�N�{}s�S�@��1��Y��zK��n\�0 +�sţ�?<n�줳8�X$�%S��KS�o#�6���1hl�rK^�'[(������Ó�����t�VV��畅�����(��Kōd4EHgF� L�0��E��x�XnaN^^���#D���S�O��\_ߝ�]��L���pBf�G�9�`���+�)��@ �@ �צۻ;[ F��p�hu��. V�-��\l��"�V�t&��c�x�����b���I�A:@�c+b�b W,��tذ��9V����n� Ȳ� :k�B���$ٖ +4' 2f�.��L�����,�ŏc�/Y��Y�B�U� +,7�#�oW�-XfZ�v��Xc�j"5��h���܄_0�l�����Z- +%ә���*�|�Tk��Io0Je��χ\h�aY�A1�GA����/���������B-;{{�\�=��Y.������v����J7�Z=�Hz�~I�<�RJ��8�dU]sl���Rk4��r��*%�ET�� + *��@�Y�c+�Fk^:E���ǧ�'g[;�C��4��l���b��$+B=��b+�d{��ʤBB���x!�(�A�"�%��-��'����|s{wo��������?>=�-X�a]ݠ}����7�E���DL�H�p2[��� N��7�@ ����~I�ت��u�F�SouЏn������ +#H�U:����1����k��ȳ #�&�ʴZ���eV��Vk+���zo��i*���P���ӑ���ʹҾ.��$��$�c��9��J`S�݅�r���,���GJ�TA{ǻ[�K�2S~.�;����|[�;��2[, #_*��j����%O"�*W�%�]�V{��p:+0�ĐM&��[�Jx�DX����7�Ln��S�L�\��^��2�Z��-nn��>AXU$��GX�$x��:w��,������s*�EO[�T�J5W,������b+�ĥ�% }�О�L�R�'�Ó���M\k?� ��s�-���\"���b�X��5E�\��nvY�<��nչ3l�zH�3[�4<^�����p$� �`�t"D�W��|���Mk�.//���#��gӂ�S��Ϸ�4E��)���;'��l1]nM�hl0��f�������f �@ �K��ϟ����Dl5�N[8ة5Z�� +]�F��c��R*�O��Q��ݧy�A>��-�N�D{�i��i�` +�m؊��D?�����X�`��_�l��t�d��*`g�A��lS��%ّz��Y�o����D���n�=T��i�ϥ�J�ם�L.rz^o���b�0ʕJ:��� ��12ί�/�����t��9zOcɤ۬��s�)���o-X�4�o����-;��R��=<>�����X��r�z�Ǔ���5�!X�*��mN��z�u�-�}VO�/{��dJ�T˸��>i4E(3��&���C-U���\��MgG�gW[;���=�J���ҙ,�Vј?<��wbf�>RP�l��*�+Y]-��\��j������P8�'�L�W�z��� F��l���3��/�nno��p���+CXO/8Exs�v��ݟ����S�J��Y�St���]�N�@ �@ �_�~��Y������r���6��j�]k�)�2j �VG?�e�`�\<����p��1�n�T���۽!��@�m���Vi�WHݺU�n�u���Z_[_�$��n� �{I�4euXq�%YW ��^�7�+ˠE\Nf���C�m"&;��ݫ��Yɮ� !c�y�c�(�A+B(r0��]��+�ƻ{%�@�N�D������}��@0����j��K�^�5Ƴy������q����B�5���P�.������w�������|��>����_S�����+����/f�yQ�K���Ro�cq�9Y�e�>)�Rw���;���>��h� +$Eh��_��(m���W� �$k�L.�hw�����������n�߯5[�Z=W���d(�V+6����ۚ�u%E�0B�v;�b�E'�$<�j,](k<E��|��Z���D&�/�Q��noHR�[;�G�'g��N��������J�������n�ONY�p0F�b�5G�.6�Ă��L��6.���݇o9�@ ���Ç�o�U�ޯ5ڵf�X�0�ҫ[�B1��Ɠ�p,�D����V�#{i0���N�m%�+����;����c��*�[[m__��� >O��\��+�����b��,�\��YQA�M���PRĴ��,R���yY$K�w]��l�������~��o�N:��P-�@����������R�h��+N�3�� �@����7䊸� ut@E��n�J$S�}ģ �z�0��p<�4��@=�[�u)�b�+YB�,}��)��t=�}���w������zg�J���R��+�Z�|~V���ob�B��[� ]ln��~H��F���ZK� +@�x�s���V��r������~kg����z�V��'6c��g5�3f� �+M��es� ERt�d�\��k +P���X���S5���j,E +��$E��5X:z��߮?ij7wvp�;�`�p��+wa=>>����'��m<\r0�i��Z�(�Gt������@ �@^z~�M����Ш7*�V��&e� ��u�A�d� ����I{�#�Tx� ����:�6�VfB�!�Eo���0�Z���YB��PN'#�VȒ�-�UQ���g⫒�<y���7����-&�����% �˴Hq~�N��?���I�R�^��������Ǐ?~���ϟ?�����a6���a����bV(� +���4JQ:9z�zv~����ej��'S�`�ŧ +�j0)K%�(����7:��b���$2�Xl� �G +�H&����7�����K��*W��H={���ȡ5�p}ñ��wqyY(���A��|A�zij�V�X��8��>v������(�L�a���p4���r�7Xn���_�����5ZJ���R2���h7��ŏe��$�x���vάޖ\ٺ�5M@U+�,f�RI��^��zp���`\�MX8E�ΐQ��*z���h<�mn������E�l!ua����'�"ij�M<Ra0�'��L�E�R�{�����@ �@ ��"����ſpG�ZG?���v�[alU+�\���[�"1(�~wk�<hfh���}�&�r��@涢��l!�T�u���7����n����=WfՕU�E� n8�:C�۫�V����@������i�i;(ث~ŬP��-��u�#�--�}�,贠�j��Q�on�=<�|���?��_Lg��|�lwJ��+��h2���}~}�{xM���A�f�;b +CX�˝ڥ6������fQ��Q2�J��'�.�%f�R5�/�ˑw�(��r����Wou�Z�b�!h?�P��x|������/���t�\N�S�ρP�YL�Ɋ�������?t�lTt\�UGc�T����(k����>��c����x�1������>~�����j��!�*�cs���I�\�Z�W��%s]�M��n���AY���A,�E��ݱ�taa���D�|\�I�0�J�sta�������|��^��������������#�`�!�zw�x}}{rz���;��z�Q�?DwG���,��x:�-&�Ϳ�!�@ ��e��M��F�Z�+u��ju��W��R&�O�1���ݏ���1�$����U��`�r:i��I2ǔ��B�&��~��N[��Vv|d��L$%1�$�� �"�MV�ɩqr�)���i-[~�%y0P����K�j��Atd��e�S6*������������t�� +�T*�/�K�|��+��x)t���j�P�f[���� �H�5��B�97�>���t�����j�^,�%��+� �����a@DZ,����䊥�rs0ךm�ZS͢*��T�������tqyQmTЫ���{��l= ��n�|�~��j��)_*��S"�I��T�_�EȘ�J���[�O������:i�j ��R)�ˣG��E]G��9Dc�`8���(Qt+B�ί�I��jg��XA�U���h1S�TV~��*��b̊�+�CԈ������P4����t����k�V{�fKb�::>;?��E�w������|z~y|zF�/.��N����^辝�h0��Y���)�`�ao8^ln��� N>��!�@ �����ׯ;�{��W/����p {�0��Z���j�X��c3�D"����]�k�c+7ZXY}��u�s��ڰ�l����"1@ +���X[��̛�bvj����ʁY�P��"�����NS�2E[�َ.�@!E()49h�b�J�5�K�9XP~��X�tU���z<z����{~u���|y}=�3�B*��K�|>��$S�X"���ch�'��t6�nŶ(���F����ӹ|0�=�0FE.�*��� +S�z�~��럝_�K�8�ȽZ���8Eh��v,0�/��%��J�v���mvz�l���W,K����������c4Cϳ?4�����j���}|zzzv�˨�Ũ�Щ`P���P�%����+�E�<�ϯ{����R�h.��Fb1�ռ>�%��;�Rx��2\if����A���q;me�l���lS�����k��]�,X�����,�X<���!.r�F��}r�,����"��/�q������ N^���X�p�MF�,��d:O��!E�@ �@��������Ӌ�k�^ln�Z�mb+����j�dd�d&Kf��x ���c�n+s���m�r�V+ėf��V�ru�\QBE���~X_���L��\9ޓ��耸��t[�ȕd���>��"�2�TN�� +' +Y��D[.V�.�\1�%���+-�VU;-HGgF���j}kw����p<���T*[(c[:��YQ�Cl8]fm~-����r�FO��J��p {���f����]&�r����h<�%��8z�J��%Z��+�e���s9J� +e��[l�4I��d�%�_Q�����?�����@�� {{��=��7˯X��S��H�Ç��v;�H�;zJ�p�[�d�� +��&�"�����fc�L&�N#�z��QJ<?Q۫8��E�%���4{�P�G�2[P�ò.�Ҹ犳/2�Ѓ�Y�k�.wR��B�h}*��]/W�V�7��˭��}�"�������)Bn��)B��������7�-z�Q�?�'s!NNH�p�@�D�7��@ �@�}��Q�z}}����ر��F�[o��j�Ll�W�%=S(�1�8$�l�S0�R�χ���,!H��t�v��h��Q�}VFm��*L�����o��<Wf�p���X��MI:��+��QA��y)��s�����e�V�`I��j�Ue�V&)�[����Q�o��_^�^]�^�ލƓ\�K�r�"v[�ґX��g��A�?;Ւ5�z�"�hIe�aU��J��H��'dM�;�,��"�,Z��њÑLg�J�JF�RA���S��iճ���z��d�d���ЬX�mn�F�F���"��zv���w_�|���-㊭�������Wa��E�Z�A���]�?����t.G[�ʕj٨����q�/����1�M��Z��y<hq��}IfeY���G +�J{!Tl���u���� Z�V�Y�e>�����bY��0/���}�`0E���e,\���t��l�=XGǧ��W������Z�������������Ս�"��#��� �`MKs�x��}O���O�oN�@ �3HlbG����F��h���ت�.W��je�8!hT0��1�J���e��0��u=�P(2�� sX�Ka�����8�Z��n�`�5Ʋ̛6ޛN�u'�b��J�-[�D�'�Y�̍R�b;��K&�Yl��(�e�R�bC�m���ق�-6H��[�uO�h��h��\��^\^_^ߌ��\�Mij�b6�K�B��S ��L���R�qZ���MV�z���P\��y]�f�� �����:��� +����拳��L�P6*$EX���O˪�"=�nI�#E]/���l������vo�>-n�=U��\x�����t���aĒ�痗�~�;��G����%z/.��ON���Wda*�S�^L�����Y�oGG�p��-��9��l�@��[������\�l���:LP�n+�B0�4Yq���2�ZBT�+��f!,�����0ΐ��L���*L����d:[nm��sv�>]�7w�O�O<E���症������"�����?��3�����}HR���ksk�BA �@ �[���W�G�i��~�N��~���ku\lU�}�5��^�c��h"���!��T���L0\4$H`cVB�+cw8��M��Vk��Z鳲�1\1�-�b���4$�p��x���s +��g�L�%��k�FU,�gk� +�����ݑ/��i���b������������d:͕�hc:�Kg��T:�l��s�u�M_��.7&h����G㉣�v����F%[(����*�H�me�(��x*�,x������b�LZ����� �V��pGt6�#�/�Y*�z�ޘmn�{xt����"�?گ~��O?�X�U�F%�}����v[�J K&zR�������ncLC-X�J0�<>�.�!�b�����i��Ep[i6�����Jp^��_ip�B��,�"W�eѝ�;�m�7)v�?�3��H,����Œ^�5����ZlQ�����`��3N��~D�r�x���=9;���Gw�1�5�ᒦ�d�`<;>>E_h�:�@ �@ �?��ī����m�?lu��wn��$� +���[�F���sy����ױ?��ʋ�e��Xn+t���\n���|VNX�**�b��L�@b�Zc�,!ȬV?l����T�l�v;l5Vfϕ[�QA�P{e�H���Xᗳj�k�lSr��iz�s� ]�ٴ~X�(K��8W,���l��+�j�f2���|���A���̅Y�dF�Du:�36�L�wwI �Q(���`gwo�0�..�|Ű�*X����|�����P*IV�RMf��ϯ�Y�V˺y_�%L����k���2���)�t��a�p����W�������'�L�n�|��wI�5C�͇ j�HG�?fy:ѨV����fe�d�H��+YY�c QA�}� ķ���I��J~о'�Y�����*�v7�[�G�4�wQ#�0�� %�x�k����b�x2�Ίk2],�v��NN�//�on��������U@XO/4Ext|����gƽ�x8���,��|s<]����h<_l�"��~� �ZA �@ �O�ۻ;���˗z����n�ݫ5�z�q�U�^�Te=W,���x:�'�/b0�����d��ܭ�N�9�pL�EW�m%.[���m�Z��Z۰��[a�wUYn��(���b����Y�ܼ�����$W�[�7VqH���.�Er����m�%�٢8��l;S�S��y�������t����w�r���W��b�)s�E�8���[[�CG���2VX��V�}xt���ڛ̠mD ieg-U�����99=K�r%�R�.�J0�h�e�Rxߔ�L��H�P*�� +z�B����Ų��œ)�И���7w���Z9[(�3�%�Lҙ�V~P�}�:��O������i:����j�����X�����x �*��7,kU� $*�d�J�۴4���(˵�B�D��y��ѐ !T^�E�Wa���qa��`��q�{��j��B�}8�-61�:<>=��������x|z~y~y���FX�����������-2�p��Y���r�f�"��xs{}��:}���@ �@ ��v���ׯ_��fw0lv�h���!A�4���L�`+\�F"�`���_�d� �Gk��� +[qTEs�RaZ�t��t[ M�,�gB�w�l �"n+Ru�F�V���M��m�@�����X@���{�l�W�0�Prʲ�x�����b"���$�p�SZ��2+�ȭkN':�ۻ{�f3ON��^o����� �U,��V +�m�����J����ngg�\���t2���?h4[�d%1?����qU����7d���%o �>�_q�H�ЫHe�%�(��r��&�I�X������7��ͻ��P$�����Fs��e���Wt=�X"���O�A?�˧s�X"�Lg±�_�S i��[x�M#�/]}��bݺm�П�7d�J�z��\5�e�HіBGj��"��� E��h<�He���hu{��d�X�E�WWww���OϯV�������������������t�'4E8�.�V�5�̇�i4=?�D�-�gg�e�@ �@�/}��Y����S��i���Nc�Vc+��^�y{������#�q��d&�y�A�����K-c��V�2�5+H����^�Q�eSl�e\k�0�� ���[�+�Zw��n�%��u7wL)oc�d��$}V|\��'+u��-�Nd�*��}u�݊u1P ��h�ڋ�VA��dV` ��+��!����#���R�l�✊��"X�H����h�s�\�4��=^%<.y[Y�+�� +-�g��?==犸�\�)�D*���e�C��V�b�ʲ����B�\��[�Zo��Y,k�V"�j�Z�? DBe�����[��Y�f�W1�q���tv��n������UV5�>��C�ڨ�4�ʄ��Vv���78KY�����jb ;7Y��j�J,U��&��(l��z�\Y�������M0 ���+[(��J����� E�O,Xu��ܟ�D�'V�u�xu}KS�8-8�)���'�k1���� Z�)��_��w/�@ ��Q}��A��~T�{�F�Sou*�&�dǓ1�*U�%�R�c�L6�J�c�@(� =>?�V�о&Vl������K2Ip��[QT�&�����5^ �9��w1��p�� q[��]�ͣ�fR,<a��Z}�frP`SVH�)�zv��1Cy�{��Sh���[�T���"����[Bg{k{������n`@T�Œ)_0H�ObI���.��p-R�.��rss{wo�� +�l����d"&����օE�l�\;;{G�'�LF�THd�F��#�%�K��,z�r��Q��������;x}�p}{7_n��%t�Z�yz~��~#k�l�^��/fW���"V�Lr\qLI�}�u� �mYBE�{)߲Z}s��Ɲ%�U�O%�,�(|�d����_�S�X��)��&�X�пp �X<�Hf���^�՛����`���"��[l�zS�>`�����n����?8^,���iw0�)BR��g�����n��K�@ �@��g�$��_�.[�v��lW�j�I�V8!X�TI<����1��d�`+<FP���qsw%W��D�-�r8�y��Y�x neNj5I��� �{��W�t�&�����4!�ęD�,He�J����Y����3+s��Zi�9��R%I�O�:�d�a%ɶ����+�RWZ�݊PK��Q�,X�\~��X��^0�������!_ H+��0��값�@Y�p��;[(����tݨ�̼ܲp���6U$WV��$8�О�@���7d��Qѫ�t6���bgb����.�����R%�XF��n�;�N��;��d�t6{{w���~/��*�z3=�n�eY|~��s% �+1B(웱��Rw�~��e�e���v���&-hM'��j�,f�Ry��dY�|��w���E�p8���L.W�d�&�/:��uptLk�H���3�Wa}z�����nn�q�p�`:_����"$�G$E8O��ї���!|!�@ �@ ��ׯ_'�Y�ӭ��f�a+2I[�F�X��*��&��h�{�~��UHH�Q:FP��L�� b�-�Z'QA!!��F0�i�Z{�!�zgr*�B�Vx�u��}�$�"��8A�lW��J�j���A�r��˒L$e�*^9�.�%4��Gw��W��[H��6ӔlD(`��� �x:O��`��ad�Eo ��#[�;�i(�,���u�C��JF��Lf�v�_(���p2G�N]���z����"�(z��� I0\�*�ej�R�Y�T����B�DlT�J}�T<*Q���(��+n��GS4O$/�u<������bQ���#�L<>�l���7����I�3��`���nn�N�ջ+�ģ�_2_�qU��Klw��* +�x��[�*T]�3=�J�c�#�0��X^�?��܃!Z��'��\��Np���O�rk{w��������c�D���+�����o�OΖd!M�"��b���1��-X���ˏ����O����@ �@H��"��&��Ш֫�V��4p%;.�� ���-�R�|<����X�ф �-,��� + �yH�ګ�.����9l� kh�X�ꭸ�j��(�z��7_�Oj���wa�q� A�AY�+ʣ���2\�$�f��f*|�T���Vv��m�1�k��}�v~y��$��W*�e��ev�[)B���U�[B����yѨI����e��%лƧ Z�+~4�a����d��x��wpvq��Pk�ء���ݽ�?��ǿ��?�����3���矿|�������O$ם.��U�eU`��g�����t�Rի��=�Q�� +B�'t���h���|A�TK:e�]V*�|���V�y%� �>yP�wU)��+��� +�.,� �z[�%�2����v�M��tO�Ж��-�P�Q)>��M-�����dsF!�H�1�Wd��.2��C�P8�F`��;:�Η[;�������掤���"�?���ǧ�����k�/�[��ݻ7'��lI������)Z��|9�@ �@ ���^�V�V��뗫�J�Qa!�zc�j���Vx�`2�'���/6��<�B��1�d1�h�%:Upm}�f)�Zw8�]ʬ�z�{���)��ʂW���5q� ��Gsll8����X;O�`�ʲ��>v>=���o^�C-ϕ�S��uU�M�\�M����Y1�\)+�-F�D/]Agƨ���q�K7�8E��K?�x�EF<Q*}�w3W,N�ã�������]F�#_ֳ�B*�I�r�t:�J���l��-��l�T���}x|>:9��:�@��Fɴ�qk�X�Db��v��+`[���Si_ �h��-� +�X˒��K�,a #�JE�VK��L���c���f��7��o��%uuO�[c9>A�?�|C�4��](�y���!T��� ��)��ݪɢ�Ak�U~E,X²�A����Y�a<�0�H���1W�k2�/�v�H��%I�?<=>=?�A�>~����`��ޟ�_����Kl��Y��k�4��p5����v��ށ�k�@ �k��ͭ���N�?ЉɊa�jC����L����⸏�b����S�F��L[�Z9]l� �YY�.�:)N�9� ����V��{�ZG�W�*Z~��ݷ� n��� :��A��Mtfګ��JdY�de�[��OC��"�ȹҸ.�[ �W�v��"m��JqJo' +-Xo;�e T�ɀڒ^ce�H0]A��\�����\�T0H��RMᎩ��in���)�k�K�P�-��O�o��_?���6��L�Pԍl��H�"�X0�nF�#���@(���I&[, <�Xև��x�@� +�#t.� =����N�wuu��L߽\���1:��+Ӌ%�+;��},ñ�I +�x=+���p9��P�wXI���I�����W�#Y���o���]��Ok�4�r��LUW�\����ZkZk�#Eefu��~�Q�\�3ݳ���0���@" �O��;��}��n�U-d�[�\$�ׯժ�����xaJ7�Z����Fep�,�jw�����2��������P��3�|�R�7;������wpp|vF@�������㧗�ϯ`;��Ƕ��Fc�E���CLf���p������ ��z}}�_�r�ȑ#G�9r�ȑ�o~�~��������ƍV�T�$v�c�n�r%[,g��T6Kf�1T#�5����0(؊��,[)ɮ�r^�rX�� Y���%$dan�r�9W!k � WK��Ί�9AJYg�+vՔ�4��2QW\�PgB���U^²��迢�u�'h�_i\۠�C��n�e�^,�P͵��<�C�����T&�+�����K�@���;�K)����뛧Wwϯo;{{�zWͥrP�������Ľ�|_D�Su��r�c�l.�+QڴXo�����uz� +���"ǻ��1]������&xPp�r��He�� xDƁ0���������OUs`q��T�jeQ��E%��UC�x���^�y�K un��~!/R����E. �$�+�>s7����4nYMYD�b��N�8]:�`9=������`8�F�D:�+�/�f��Qp�����9x#q ���7!D���O/�˫�ã�����d��A +J��.B�"M���uʑ#G�9r�ȑ#G����M��۷�l����g��f�\k+�R z�J�����%S�h� +È��\�|�A��m�e+x�x�Ͼ�PWˈǾ�x�o�aKU�r��n�%���j$ث%\&H��%j��~2 +�-Z�m��b�U����!Rqf*�Ǝ��A�F��,�*�m���8�L�Ka��lm�NET,]�TT�"�I�|��?�/c0�?8���D�*����iw;�����������e��R��R�t>��f�l��:Î��H�r�s��X����^2����\5��K�z ՝.���p�A�#Y��g�9�<*�z&����C!��Ǫ +^��W +�s�D�t����E�ArGMϋ���]� +V�l�h톾H���#����� +U�����t&�L�?I,�X��~��g�)�P�B砹���)ï ����� +i'�[�D��W ��ܽ�������U��z���Ǔ��������3r�)Bh�z1-X�n<;���?�����G��xAX(E�%��x:]��_e/b5�9r�ȑ#G�9r���+�����nw0���M��V�T��lU� �[�������"���L��JB��Y� ��3\a�����!��hN����'�C� �����#\����� =�-��d �,?�S���ʬ d2���6>H��̮�[U�E{�v��L�ҹ̠��t�p� 5�LSX' CZ�(�G��A;���,�Dw�}�f������BQ�J�N����ׯ��_����*��dR�\$��a�$�0a�� ��5��O������N����I�|�M$ ���be���]���yxx�)Xcw���"�f5��jb����Wl�QJ]d�Z�th<#��OI��ҹl�b��NiW��� W,���;{�o�>�����_�|����o_�}���_�ON+�СԤF��i%��:��NE�Vd#^�r��,'�h8݆����\^�/���H4����J�������t}sgb��ϯ�������u~|����O�����������|{go<������?B]������h:N`�p8�ɯw9r�ȑ#G�9r���k��gA�O���x<]M��N�T��L�2y�P�B5��m�8�^��N�U� +�L6E[E>+,�u*Ķ��Y��5l�Z�Hv(X!;�V�9�8$ȳ���2�D�-D�� +'(�&�]�!A�CǛ"��h�nj��e3��6�Ţw�:�8����R7�e+���<\7�(��Es�:�T)s�v��/�IP�rؾb�œ��ۻx*�C�L�����h(����L�``���,< ��E��Kх�xVL#�=�C�m��b�7��̻œ����ܡp����?���MZ����-�����R�]�VE�"Ii"�j~��+��J?觊j��N*P�A�a��`���6�O.�o��/ƓIo0,�+��/M,^��[��x2~x|����o�;=;� +:B�kXU3�W<��A�*�2�D,*�ؠ���8��r�����V8 +���l�PO����!ksgo��z��������Z�>~���3X����� �S��������p4��`��������Ǐ���w��9r�ȑ#G�9r��u���u4�����l�����A�R-Vj��x�\>��D�P��C��pC��H���l�BDt��An+j�����qTp���>��u�SA��� +��VV~��֗�I�� ��!8 �wQb�ʂ�vN���M���,U�`eV ��M����������[3�~�Yt����.��4�OP�I�W�H��*���q�S��ߤ:�,/onmolm'!��N��/���!��#��dI=Nb��*������X�����ѡ?.T*�|a2�h�����S�Ɗ����7[����r��+B�V���j��^e�_q:��Ď�(ݚ�S��*G�g&.��� ��t�Vx�a�#ד?*���tkwokg��j'S�t&[(��˕r�Z���e�R)��E�/+Fc�L6����������R���0� �QT�2�]�jEK םnG�*��E�.3H�.7��|�` ���d:��CV��@����pt +A��O�ψ��?�HX�(E�p~q��S�����0E8��o �����X���r�9r�ȑ#G�9r���˜������V���'�v�����@�T�H�ʕ��| ����x�V�rz<��T��-�R(�B+q��}͆����5Ԭ�֘Q�t[Q�6Y��e��$vF�Z�5�ˈ��Vv;x\�+�=%��e"��$E�+*Ra��Y��Ү�̓�P�H���+�e�@��(8���u��n�99�tXi�J8�N��P�� 9L�yL�����R�e�(EX*��N��'�p�����C^��X��M��geS��X���1���@�Vkcs���+��%�*d��>xg�llner�L>�L���d8��+}A����չJAf �$9���.�j�#K�X�s��\�P��L��ÉN�'��֛��d6�N!�>�/��X���|1[(�l� +�b�X*�`�J��B��Ǜ����������C�P�x���s%����,+4x�;��Lf;�;ҬH��p�e��n�����`8�"��x�+h�����c���������Oxy{��S�7��''�ۻ���:�"�)��l��,X���;������9r�ȑ#G�9r����o߿�W�Ia��� ��V!��D��`�j���l,����F���;�n��2�)1 ����0���M��f�+D�+�;�Z@�V�e B�M��ܾ�x���x�/l߂�."7q�>J��Sf�дT{����T33���U��2�|�N�X��ٮ���}8�ƉWL�R- +إjf*Pd+�E��\X�`Eb}��c���Z�\9�����P�,��{���ē)͌ +�*�d[�&>�R�-w!��������?|��9��K�b��p��z����ׯ��]�\ncs+�L9���.'{>�{�v݊��g�[���v��3VY�+�}̻�a����ҙ\���G�Z=W(��U�J�L.K�"�x0�^�������L&_,�=�ȎU�T��T��;=��{|���Ec�1�d,�� R��NW;ȑޅ� V�t��Br7�:Qɣ��!�\��t6�|��z��d�����,r��{xxB�7S���v>���?^]�����p<� F`�`�JXӍ!LN`4qs���|�m���_9r�ȑ#G�9r������_��W�^j�V��iu{�F�RGM�lU(W��R:_Hd��mE��?��5�P���f:g��2�Z�hv[�� ��3��������@�P���_�T%�%�d_&q�%,��a�;x,��P3�涢 �T�����fR�y�Ѹ,)B�Ty�� +]�f���W �:/pqy@��Z۱�,��n瓆{E3���QL@��-�B��5E��ݟ�f�T+K�B!��<^��05"�L�IX��q���������d&S(Wҹ\�՚�o8=��2�:'Cq�@�gT4 ��}����3�aJ'�uu��צtN���R��;A �-Qg��P� +2�|��jv�d�©�4���|��Q�`�"��k�������"�D:�+�y��ЋU���������h������W.0�8�̗��W,E((Z��r��B�<�������`<�X<�Lg�EXE������������ �`���#�`��R +֧ϐ������������#�+L��(��h�M�Q?|߄���A�9r�ȑ#G�9r����O�����V�So���n��(��D��J��3�h2��!��p{|��Xd��e�T5�n+͆�{6� +�Vp���lpAlvl��b�B3�Z���)aYXl��By���(6�%��{D�"�֬�Ue���8 ��W�e���M� ]��1Y�D��W\�4R��ƥ�Ԝ;KT�ؑ9��&D�8��қ�&$ bZВ74U,�L�4--_^�ʕL>)X�j&_��B��Be.�⒃*��]ez�h���C��G�DZD�X�ē��l�\��"Q�8�9U����ܑY�H��(`���5j��YDk��SV����=l;�],����W,W��n����0-���T�����!���בĄ^]�M��`$�Se�Ȃ��J,�B��ln���כm������a�����lWN�/d)Bf�"�]�V�pN���qy|�9�a,a���`�\4��ol���^@�=���O�@Xo���7���g[;{8E�� � /a�.��^\^�9r�ȑ#G�9r���ם��G����Q0,��v�RoTj DeK���P���2�D*�!{��5��m����H�,y����8�s�D���+EW��K�a�Y��M��~1�W�p��VkP# +����Vv�:����Bo��� +��إ�.,�a��d"�Zi\�o�N�6^�bB�>�_�+͔��X��j�E'Uc&+�q�'1(<��p���\5�.Z��:���ڝã�D* �r�R�5��f����A����V����'L���4��ިG' �ϔr�b:�+W���2�j����<����s�ð[���v�H²0��&A�}ÕΤ��K�W �}��d�^o�� +�� +P�.zUs@paRA���IG�h₾*'xIәl�Z���R�\���b �UF����v��E"Hsp��Ԉ�4=W�m��B +da��.\���B�X,�D�Z��0E����������� �`�!o��]�`�������������`4�p�u�F��p<]ߔ�r�ȑ#G�9r�ȑ�2//B�����p<���Z��h"�[U����A�?�D5�:j����- +� "A���� +���WVW�P� ���H�����?,֬p����GQ���ʜQp;՝����T�:E�V� �]!G�*U�Z�����tzG�� �7Gq�*U���b���S�\k�|�o.3hI� .1h��(A���Jw�9��md�*pX��}px���t�\.�*�R9��<^&�a�?�DY,O +>(z�#�x�V�ǝ� �W�x2�F��a��W�ê�J�ʥ������`�u�:ǶBW }�����;���*C�j�D�X2qsw����� +1�K�vo��d�Q�����@�\������3�F��l�s�"�)���2�F��Z�G�nA�T���Z�tr���=�l�"DwL�r�����#)�p$�%R�\< Hro��T��N��/��o�1�����Y������rw�pyy}px����!j� ��d:Mz�����������r�ȑ#G�9r�ȑ�/0������e07��R�Vm4KU,[U1�=[(���x:�'X��<vT#h*f[A?����Q������m��W6B��A���q�oy�$�c6;y�o�B�� Wg��Uiez�I~N��q�,�4�BW�3��MS�?\�r�5N�b�v��a�'Cq���%d�)"=����+�ag�RŋW�leר��*W�Ne��.l��.�_1ǔ�_�3Og�g�R �� _�RMe�^@w:�=��t3<HU �4��Z����N�7o�춺�Rf�b��09W���K�]ULe�ϯ`�H�hS���l��VA�ⰴ9�:w�y�K��n� Y�Gl�����*%�3������d���0��IU��y�LֺC�iNW:��`IX�Tk��U-�+�N���?n v���E�v�k� ,"R9I���ɉ`.�_n������@0����x��q��1�w��!���斤__9� +��^^���oo�O�/w�&� �^����l��1A���W�{�߾�_9r�ȑ#G�9r����{n��������z� Nc�i&�\��`��`�`1��A{,�D�� 汃�G �V�o�Bd�k��y�Ȟ���?N���5�p�D��K�� +��`��F]1E� +��j��� ����l����v�ۢZ�� M<�]c��K��(,�)�����4�7d�>�N�(���4h���?��N�8g��)ѝ�Qqm��>�0��!H�S\PT�4����a�6����lE�3�Uٷ4M3���tkg7�N#__�T�#�/�RJ�J�3�l��|T�i����h2�?>�����ܮ4`�@2�CN�K�4E��b��O�sR�**s�w��� r��F��W�5��E�,CGβ,,<�e�ϟ�F��^�%��o���;le$;3����c�ʒ���z\q:������`4Ne��Z�\��hu:�f3[(��!�r��������Ɋ��t3��p�xJz�+���=�/���F����������������܉��Ody�� l|x|���=>�)B(U Ƚ?�]���)J����x��<wv�寉9r�ȑ#G�9r��>��Ϗ?*���� +�8$X(C;��哰F0���@Ѕe+䂠b�ML +�bxv"[a�jumy V��S�+�,�<��$'�DmWPԂ&+����#�jm�����"e�c-K3 W|u���i�Umng�ҭP,��1���Gx;�T9 +��,e��V�2g��My +�\Q�ŗe��[\� �Z�\r�iSv*j����Պ�j����%�����:�T6��>Fb7[u����7h�ڳ��Ӌ˛��������R��T� +�a`j��Ieǚ�!��h8Q���UΩ���EJ�nO4��X����������9��>�c(��+ +~��-���@(.U�ս��R���f#�fx�� :�P�N��T�"�,G._<=�N�Pª��C��T[�^�TJ��^ć�̓N����S�^9�� +Y����; ����0���XVBV��A��������cTExs���_^�ސ�W_����'��zqy �7��I�?���g�)�"��G��`�_���E�9r�ȑ#G�9r��ϧϟ��?~��7Z�f�P���r�^�B� +��ea�`!�F5�1X#� ��!<gD�v��7OO`M:�B��meWUL��QA�;��`���a�³�K�N$��_Q$����*�k�Đ�0�J�WvL��`��n��'�XenD�w|�M��+l����+f�B��P AU�VL�������?Ţ_i�Í�`r�iàIV��⁚�n�&ÊX���̑��Q��Ѻ@N SYdm'^&���f���(S( V찣 w�f#�'�����jol�]\�?<���o��+��.W,Fbq_ �t��]�� +��L��|i�"�J�s&+�p�k����.�j�XRu�?Ƕ�86�ȧD-�}���f���ߜ^ +����Z�>�b���j� �� WNs�AES��u���j�����gr9�^*W���� �_6��x�^�r8���N����D��V+�<��(��vZ�\^�Y��0��Ɠ�L����h2�����?<>9���� wh�B w�_}���3�"|z��{8C)��t�?�#�c�E8% ��d�%,�u +�T�}�&h�ȑ#G�9r�ȑ#�Q��$�V_�~ǵfe!��X�J�m�)@;8�'��h�V�F�؝��`�#sS9�M�Am��X�������*&\�2��_�V�*E�*�,���eJ�²���*D���T�y �B���n$�'x��G�� +2:��ܨ��*�³���U]�d.�D��H+��ŘWfϠX)�3�8�+Ԭ=��{�AA��P�M��� +��]g@-a��\X���^���p4�$3Ђ�+�*������� +S�TX)�h�w��/���n����J�j&�� +�}����KAb��z�ҭ>�y�e��]W9��HYR����+�F� +���bA��"���6h`�ɺ�@��އ��2�_J�F���C��י&+$+$E����E�TN��������6BB|��(��J�����H,�LD�bl+b�2x�;tv91�i�L�����R���0����_K$��,�C��`4��6�����������GN�� ,�"��=99��������<yp�"����d6@ ,p����#G�9r�ȑ#G����yy}寞^^��J���V%,[���[er�T&�H�1_0���p� =7S����2�^a䔶�d+�\[[�H�U�[bM��IE�+���*��ٱP�p�4 �P� Q�(���*H,U�������!h���tw�q��E�+���5�:/v�9A��x��n��43�g�_i,�7<*̅ŤEݪ}��*j���d+}�܄���j��v^�R-������Ӵ�ƅ���f��G'��Z=֠)��- �G�����������������~�VKf2�|>����A�fZ�6�w۽8�F��+��-D����J�[���@}�n�v6���� �=���?���������?�>G��a�I[�9��nU���e8���^ã��X2Q�@[T�Ti����$���|�a�S�-X��ObԷ4H�-X����/�oR�, +*V�U��S����r5�J�A��r0�� tw'5b�&+N�rr*��Ÿ�P�r�q�����P$�'��T��܇��������� M�?� ��D��K�ol��n��`�p�1Y�]�0E��P����R��ȑ#G�9r�ȑ#G�����3[���k���;8<8<�F�V��!�U�� ��P�5�)X#B�䱣A�p�0�����N�I��d�� +W��� � +!�mN��PVX� ]YZ�Yؾ��W�p����m����d+U��느�y@�R��a��9��:BS������L�Ka:��� +m�& 5�"U�D,�[!J ������.@�\Q�n!\q=�f��I�B�S�y�I�*�î����L�b�v���a�s�K�}csk}s3[(�ȂU�犥_�~{�� ����w�*�z4GL��/� �,Z|V�L�E��b������c�>�ԩp���T:���Gi�fs�<�L��hnnm_^]?���}�����_���������|���k6���DV���Rb�����_�b����b�\o67����<��"m4�,á�.��{�����ۇ���D2Y��ʕ*xDpYo�c�t"�v��Lz"B����Nj�2�]�> +�\��A��C.�p$��l*X�^8�nln����]\^�`��h��*��O�_�>�� +�w�&�ur�z���X�և�io4�Fw���H�9r�ȑ#G�9r� ������G��N�����B��y�R\M�)䶊ē���\>"[��D��즂A�+�"J��jVve���W��� P8�V�6�D�%3!H��+�R���݆��.a��Lu.!HU,l�b,�����rŪ � +�+w�.�m�vE�U,QH��� +r�Q��hc.,M��f �*E�y���b�Ť'�&���Z�b�U�e.�d7�ꖸ-4c��Y,H�w����ν�:B��Υ���"����y�����R9W,���x< ��f8M���x��@�<��KTS:s���:/RY�(ǂ-�i�Ю-�.\r_��2�T:�b��`4><9�{|zE��_�~�����O���p��~tr���������O:ا��`l���g-�D�a��ǟ/���<^֯0_}����k6�P9�'� +�C�:sg*+����d����?ery$^UʕZ�Ti�;�x2�;\.�p��x�t9��2���0�����lW�N7:]���>�.,�`�c�d�P�y�8Og�;���GĂuw�@��� +���Q�"<���M��!ԯ�8E���@X$E8N�W18��m�#G�9r�ȑ#G�0W7�lUo������89����R +Vh���mC��h2�%��/��V.��� �5���5�K�SwV�0�� �� � .��;�S��S}�������D��D��Ȼ�X��R1������($p��A���2�c��+�s�LV{Pz/�L�LS�]'�i�R�Ԟ��6�T7�1NSR���/=��D��p��fW���i��*f��y_�x��-�.U�By����[��$r� +P� �� v����^ʗJ�2�́�n$����"�2���Ӭ��*�R�p��l��T��[�!ML.�OiVݪ/�������������������x:����x,�%��L.�-��R�P�d��D��iu:7�w_~����c��s��:���;�̫+�k�^���?Uj5�p���M�(?ȫR�E�)ƿr��k�;^�a@��������P*�#Ukp)W+�j�Z���2�;�R�N,����X���`�Ax���nW�(E�G�P$�'�ih�����`4F ��Ó��r�$w�"D���_��������+�������dck{0�i��p4�LF�ur!�{o4����_�ooo�wJ�9r�ȑ#G�9�}�ׯ_#�,��:�k0�S�5��N�T-�+�C��l-�+��U*�5�AX#�d+|Z��Q/�6���`v�4��ժ��PBjP�aE�*Db_�ު_>,�-49Hj? w���ڪ͎B��"�h^τ��?�R�lW\� id�)f�R����W�~-��YA(ުY��8N��(�jW�̠�RW�J�H�Bc��� g���U�oe�:M���Lu�j�Zl�23�Պj��|!�gY�#P������t���uz�L.���� +��5��%���Y?e���"w�ө]@T����Wڜ_K�k�4�����t#�N�����t�{p����T +��KE� OT����"�H!�!�Gb�R�z|vvry��G0�n{eѲ�+�������K?Wj�ԯ*�bq0���PX�wƳ"@u���^9�n�UStr��`�]Q�^����&S�r�Y��W�5���*�H���Ja�jep�v(I9YT�`;Na7��r9�n��q! +�/�"!�"���+Wm4�(E��R�����R�(?�IX`� ���W{����Fo0���k4E)B$a �S��;�7����#G�9r�ȑ#G�0�Ǖj}0�4��j�U,��%��l+h�B5�Ypb����4�X�L)��_�(,vd������0*h_��y*;�c=�l��ѩhT���0� +���4��}���ZWT^hb�+zU� w�y@��S ڔݴZa�:K���T,�aE�Ud{� �n> +��&�:aa�|�ƥ)����C͡��D�3}vs�Θ��y��Z:���U��K$_��+.jF-�t��9�,����d�T�(o<¶���̄����n �w]�_t�پ(-�rѿ�B���-���d�@�X���x2���\._,���|��/��l2��%��D"���8��r�"��e�R��T�7M��۽~8ם�y�e�P����OJ���r��+��h����5A�r�w�U��S7�!�>�^��,�)J6�|zjw��|�R�#V ���j�����}�"�E��Q(� +y��m������>�Ñh<�H��k �[�Mf�[;�G�f��������P�># ��^����o�ONϷv�Ɠa�G��d<�0S�Ȃ������_��Vr�ȑ#G�9r����a���_��ݯ5[�N���k ps�%����l>��`�P$��ݾ���u�ʰz`�#XQQ�p�5+H�Z#T�% +]�ƪe�\B A���0�%�n�� 䱃������u T90;�`�},ྼ��p6-���KU�^���%��k̲E��ŋ�ϧ�AA��9K���AM[`��,���� +�RٹH��q�+M�W��*Ү �,�&�{�A��~IՊ��E��.p���?*F�:�h�R4ǜ�j.ѽ�bO��r��^���#�E�R8a��xK���{ڔ������ &^.W8Cx��tV�V3�|��r�b*����~����x0�K3 )B�Fb�T6�/��%�ψu�|�X�7:�A<��#b݂pg��������[��H���Ѕ=]%��ʕ���!x+$��t!)?x��A +��yV +�{:����3�,x�(�Y�j�?���IN�2�Y�ą��(��(�����)d��=��� }�@uF��t6A��f�7Of[��)X(E��0X0E�Y���������������tcsg8�v��>%���"Mf�K�U��ȑ#G�9r�ȑ�oz�NN����u�۫6Z�V�\�c�*_���|1���R�H"�B�����^L��t����e���X�B�&�+*�n��e�$�i��uT#���D��sn+�Ҹ�@S�Z�� +ϳ�_}�LST��xJ�I�k���0cQ���A +c��+�[���y�J�yf�n*Q�h��M��|lP�y����#����K�S��% +ià��LT�U�B�,��;o��WsB���y +��t��tO�f��Z)8o�ҭ�����]�������;�\O,�l�:�ޠ�n� +�"J��D:�!�� �����n²�_����|��t�>�Eb����j��/�������&�|�?���������+Uj�*�k� �D�bA"C1� aQ(S��#��p�VVW����s��Lgs�r�����V����_�p��LY|l�K.��+�)B� =Ѕ�����@(����T:�/��PH�C������������-�`�@��I��lv��?���f���7�Ǩ�p�1���"����T���ȑ#G�9r�ȑ�ow�_^���?Z�^�Z�5[�z�ؑl�x�*[��H��s4趂���bV]$�XOl��@�DZE�� +A�C���`o�Z-/#��Q������Wp����A����#{���W�e��&�r�����S 2ê�L��T��-Bb�M� +ìtB����?>*��T:؇�Z1�J ڰ���+�E*����+����2��vA��V�$%���%���^?��Ns뼷��? +�E��)Q��Z���?j���>�ꢮ@�LJ�u����S#8/U�︰�O<��!�R�Zͣ$`�X�ds�H���.EUE]�L;��ԐL���[�n��� +Hw"�J������r��4�������E�b�<B�R���L<%J�rR���q�L}�5r�Ba�ab��춭����\���� +�"�֊���مE�T��s�+���9����n�#������B�h4�L�2(E��)���-��O����ܟ��_Q�Z�H���p���������������>N�:Bd��.���p2�.��t��nlo˟69r�ȑ#G�9r�����{p�hw*�f�ZC�U)�;%p~��<vX#�D1���ᰌf�9���R���0�5j�ԤA�ɮ��� D��&A�@�� +2Y<;��&��%�$��*W8!��e+�ѣn+� �yS,9��T���re�|����2�/��1;�z1���X� ����לfe5\͗�tM(��W��ӱ��㮋[xE�a�&HU��Ys��LE�.β/�P� +��,��4t��XY+,�T)^�r,��V��"Тbi�XL+�u�a�c�t�V�ʪD�B�V}~�x1�T:[o�[�N�\) z�Pgr9K�YM{��~��5��iZ6_8;�(�L�l����L�@��,!җ�a��O�W����@�VR�Rkd�P4f8�&���D�5J9�݁��y�+Q��"�I??�T�l>_����j�\-�ʻ��bI�-�Q�S�L���d�+�yw0o�]�����`0��c�d:�S�P�� �-r�����{x|O�ܑ~�%�7�"|x|�)��Ӎ���h +AX��`�@X�M�"��G��p2�̾�x_�O���7N�9r�ȑ#G�9���C����yΕZ�R-V��R)[��Z��i�������V���t"��a�O�ߠ���dt�ރf�ZS�l�s�++($hJR�P���7�e ���� ؊Y�����ɶ�.,�B�ZLqR�@�Ph[`��X|O�e1ە&���0즴��BwG�*W*sI�R�;0+]���;*:uXq2OqW�Z|���`X�|Y����s)B�I� �X�"��E9�ai!�*��&�%�X�J���4P�Y���T}q�ςq�}x�<��"m�#֢ؠ���Ӛ�w(�.J������J��++�T6?�('(6�迲�P�i�������E8-��X���6��G�H��� +Y��hZ<����Wp�Y���Z�&��Og�*S�"��c9�Պ���|���trF,��k�����?�� +(^A��{�����8��M���ltrBvɕ +)B'�b!wԯ�>o ���!(aœЃUB)�����w�+wS�7w�,�"�bJX�����u^����7(E�P�:�a4��ڕ�qr�ȑ#G�9r���kp���Ǔ)��T*��5+X#���aB0D A�?��� ��c2��@O{af�T����p������5�}U�������XH.�^�$,̶Z�M��Ǿ�1؉��{��:�Z�AӅe����Q� +n�X���Z6.3H#{&Pݦq�GM'>4��5�3��?���o��+ +�����d�)�|eF5K��7�!�>i�T +*BՠCL.���H���Z䤲"�Y�Og.�u��[��CP��V,��ͷZ�U���bc���|V� +�g����?����"^�*��t=�+�Lo���D�.�^�Kd��z��ϟ����"�W`)a�6[_����r�+�l}�f���:<: +�ÕZ�DA��f+�H�I��Ń�u*[��D�Wԅe����I��H�����__�R�T�P�x��K2�}{�����(X��WTŢ���4.����B��8�nr����` �!+�J��j ��ӍMHr?���ۻ�"|y�!�?��կ�� +AX���$E8]��F�Eh�dz�x��ln��B���'��ȑ#G�9r�ȑ�W7��-N��� +S��l��$R�H4�xA�?���\^?��9=^�ۃN��&�X\t$aiD�2TLSx*�5 ���@�� ~����[p�,��G�C��e+��Ǫ�s}���$�<W�h�+S�RL�����\*��QY���[e�\�����2B�n��l�"��N�U��P�HX*�\q*'g���c�d�����@U�9ەh�2%2K*�nJ[�%o٢v,]�/tpE�sm���)E�ӑ�I��oq���$-.,������֮�����v�8�����Ŧ(�J���5�/��_�X�'[�;vE�:V�T�pe,�_��r{�������w�L>G#��=� +��]��ÂjD���H�>~�\�ղ��d�P$���xE����\qb��3e��n��5�f(����\6��BraœI�4t�vţ�y9��{�ޠE�,��B�j,jA ��qy�D� +@V,�Hf�9h�j"�tckk������� +���y���/����_���oP���w�S�}�"\�]�C�"����K�U�,S�r�ȑ#G�9r�������K����](WҹB�PJ狩\!��Œ�P,G�I�?+�P���`8��h �þ@������9J�a���j�d+De�a����L��ةf��,�$���dG��R��ƩU��R%��8��A��L���K�5+f�"倜l� !ȶ�B�� ,RPH3�<o�2�5�`�����x W&h�HI"���r���/�/ЦL���z���V�B S�֍|�O3}��JyG��ߢ9�G�8�TQ�2)[kߏ�-pU鋷[Y�B~;�R�L�ye����wW7���(��W�jukg�7���a�;C��R1����?�������m<�ľ)�T��c�i|G�i�2!x��p���gg�d�W���K�H,��XxPgf0A����.dr�"�Z��^__�PdC���2ٻ��p4�⇺���)����h!A`�����M(��v��� �+�?�q�0��dr�R��@������.L��_���`An!�L~y{����z�xqy�p4���&���7�Sh���x������#G�9r�ȑ#G�_�|����}�{���L����J"����h<���P$I���ܧ�p�����|*����W8������� :�#�l���Lp�� R�� +E��� &�/S� +��WW8���QA�b���v&d)����c��vWŨV|B�T�0 ��bP��ca ݂f&���X~�ب�#k><�YxV��������P�u;��W����X<��Zd���~|P�K;�Ld�C0V)�M��,�+��Z��E�j1���iANP��t*K��*����YV�����߱c�����<����>}�\���x�j�����h���=�K�Pus1@�����������I&��ǯV�U����(��1o'�>⛲+�/xy�8�Nc�D�Z��U,�V�_A���f���! ���MN;C� �+�yw�����x8���"A`U��\���,�� ��F,�\�:��1� a��i����y|>�?�C�(�&�Y��Z�5��>�������#��=�?��gj�� ��OO/�w0E�w0������`�2����&� p��x��.Bp|�o�H�9r�ȑ#G�9r�ҧ���n�HgS�B2��`�T6�L�b�`4�ƣ�T +�sU*�F���U�N���:�F�[�7��j�PL�s�D:MBa�/�t{�9)�㐂e+V�H��ʪ�M�`�X�~Y2�X�B!�5p��($�0�J!n+oe�Mo�G Y�{�9��PHB|�nc9AE���,$R����i� ��8��f& �h��]$�q�A�n�4KP�������@_/(�����y�t�^�6e��V*!b Z�T݉�r�E�b����Z��r��0�p{j��Ce��4���[9��X��2E�����8-��[�g���0,;����� ���������/�T�@+��:Y����S�0*��j�a�9��x||��f�U�`q�7�[��.0h,��?���J����j�/�J�a�o*�כ+9C���BՈ���ẻZ�K���R��������p�� ��b��^���DZx����T��$2o�\9�(���K�%D[P���B�H$Oē�T&_(U�6��6��a�����������c�;֯>�S���77wGǧ�ۻ�ɬ;v�M�'��?�t�Cp��}��/��5�#G�9r�ȑ#G�_漼��^�/U�l�r�T&�Hc�`4�'��\�\��:����P������͝������d +�y'�^��h��L��Heñ�?v{}�HuHQW�v������p3�zI5�%���%,�!�� ~��2E�����`i�Re���+e�N���ł�Uԍ�1 ��_�9Õ]���Gk��M��&AU7C��I�d1ξ��M�&K�ZyЖ���u`7��O���麨S ��d�p��uNM��|f�d���f'ŢJ�s�>�=�9̸��A���u�y�����L[��S�ӥ�R�{x+^ R9�֚���~��aͮ@���V4 l��?��쨚�@R*g{�"��\n���?���oo���+��"�]X�F��hz������."s���������c�Z-���l��@�<h0,���"��+4�?�p�6�����"2_��U�k0��}�L.�q0$I�>SÁ"�m�.,j�B^)���7�7�����C�T*���\�gr��˫P8DE0(I�Nt(�鼂��c9(��WP�B�����v�4t�� ay<������h<O&S�B�\���mr�)£cr���� ��W�"�-�_0v~z~y�x���98<�]��1a���'$E}x|�����(G�9r�ȑ#G����iw�x��4��X*��� � +�ٓ�h<��b�d:W��Z��"X�wv���N��w�6�w'3HYivz��/�/�Sip����/8kSucM�n+Ķ�-#���"���@����|�v@{��.������[a�vF���@����P]�px�y�c�[�1���,,�1��2��̎���M�K�W��)��� TūLwB���.^� +�H�l�lW��E�&��. +Y܊��a�Yu �;1{��G�@*sq�_Y��*濫�&��a�"�ܽ��X0���EW�+4-O�]��S/8��F,����H�V��߿{x~zy���۟�������߾}�~{w?c�x�����o��O��q}}�����qa�j ��k�L>?�^V��^�XD�C�}T�K�k�v�?@BS<�N'��pj��1t�X���dE|S6��������&�G�(�r YU���Q]�j��r��HU����-~1��o��?mnm���CZW��X�X���g��O�)��IA�V��������҂N����h9�p�A���w� +��0�CV�P��j�v�?��om������_���`���}��X�>�:B$a�����/���t}�\�"�.�ɬO�q����^�8ʑ#G�9r�ȑ#�/d�|�bx}x}{?[(A�*��Q���rOe��j�4�����^�]\�sɋ��������݃���p<muz�j-�+D�@8JÃ8�^�#�� *;�V�`Ŷ`;�2ԬV���R�X���ڂzAf�2A���b4���R�*+�� +�A�kTy���r}��^e�T \,^ݢm�6V>��w�-݂�a�<T�]��_��'�D��]�v~EiZ�E���9W�����%�u�)�f����U�.T�VIV�4%�FŲE]X�b�*�W���Vꢻk�^�@(�w��_��?}����r4w{��h�����v��������~˧_��ֽ��N����ڜ/�aV~��ׯ�t�@��r�R�t�X2����W3��Ƽ�ʒt{|�pU�F��U���|qo� ��c���,ON'�'cN;�T�\� �89��$��˫��p�+��U�r/W��F�?� +�x*M�U�.�gn�2�N��r���ǥ�G�{���Z�\�#�U-��<y���*T����e�A巻���r;�n��pq�Q9��\@ Y��`(����x2���˕z*X���&NZ@�$E�)XH����3����|}}w|r���7����,��dD�7�c�E�� 7�v.����9r�ȑ#G�9r�B����?~��]�Y�cI乂݂QHh�%��B��N�[�{�G���,�����������\^�ܞ_^��]��3���Vo8n���r5�̓�__ ��WvM_��!���)�}����W�%ԸVl6��Z�*E�\1��;��A��(�O���5��4�-f!���8/���E��b�xmJ�nUM��U��l+���V kQ� �E�E��rAB1Pi&���^)&Ν)N�P�1Y���W,T���vf�R��->(`�t�F��\Z�)f�����a�-`+K�o�yP�K Λ�4���<����Ng,��6�O�.�NNOG�i6_G�4�/�R,�R�T*�ʹ|!�G�F�uyy�����������Н.,��2��?���{���b�$FT�^��luz����hz��0�G�&�mM_0��W�Ց�g:��P]`_�ekw�����_�.�n�wv��^�ш'S�i�r !��ܙ��Zmv���/.��naWbId�fs4��k�T&�u +¢łԗe�,��(� �·w��;;�<��W�Z�ָ����~�V�(��26���H�W8?H}Yn��2�0T�E-�sw{��&x=}��Dc�,#[(V����&�;�{�{�������ܿ|�����>���'��6�� L��5���&��"<8>? ;���P�9r�ȑ#G�9����H��ޠZo�әp<M��e ���P8Oe�F�7]���?<���[pZw��x��N��o��o�~u�wp���=��w��J� γ��t qy�T�RVl6�Z^1%,sY����V��7B�Ȏ�|v�OP�Z�hQ �ea�H3yV� ��E��T���Z�֮������+��LYBi -��W⥪��v�n �S��E�+�XP�h�L����vM`�3���[$)䮋+16�٨x����Ձ|Q�Ì +�=�x��� Z�nbەE�?U��).��1p.0H'}�5�w2�d7��H����o���nl�� +�T&�U�b�R(���"�X��l�����p����b�z|v~vu}r~M&E��MS�;��~pp4O��B�ZEA�J���L.�o��o:��/p{�N7TZ�.��か�������nl�o�����{��<u����F�����1���a��#�/_�|����?�8=?��j�@\�N��͊@î��J����X,Cq���ַw;�A�Tr�<8��IX8HH�a����S_��j�f�������~U�����xz��ͶAJe�9A�_9�vj�"̓N�rbR��tr;��/�ۃW`�Q���` �c �",�k�V�?��������C�u^���ǧ�"��/̅�AXϯ`����ݽ��t�;v��h2��IX#�"���������?�r�ȑ#G�9r���ךkzJ�������$\������!o0�'s�28G��o��ӣ��{�\=<>��������������zx|��w8�����V�X�&�Yp�?�N��J� �P�Z��A�±A�Y�������v!ʇ%&�����pu���"wԄ0�"���:�4�a�N-� xG�?� ���b�Y!2G�,���ʆc}�5Q���J�ZQ�K��ȡ)dibr�q�T�_�Tv����!/[�5�_iB#!�e�T���s�������N��.�Ӭ,�+�a�/�.T�p�P[���ޓ��@���jsiA�^���Ie�̽�9��� +�L|���R)[(�3�X"�}~�����H�Eb�T:�/%�a�)�L��f�G�Z%�棅���.����#� +�"��'�/�Ë˫O�?�����i}c}0F��d���s}w��t~ �v���^�P(�D�Btp�P, +�L6�H��d4�B^�?��5Z�ͭ-�e��˗����v ���W2�:|%5�P,�o��M�T��W*�������dc����$1_9��A�NY�����U��nl������k5T>X���{��:�yGX-Jnw��I�rr�]q�,VP�+7t[�7�qa!��\XP�ߢ�`0�D��D*�˃W��lC�|�oޣ���"|�)B�����_P!�������rsswrz���7O{�"���x�>�z���ܿ�.4�ȑ#G�9r�ȑ�/?�xe����9�� ���H�����'�3�R�ݝ�6��N��)�L<b� +� �˻��ۻ<>9���>p������8Ŋ���&�ٱ�XST�l_Y[#U�ȅ�le#V+K!�\? �M[��<�J��5ce��}�A�%�TvU��+�Hk�Qʤ�[IV�eS-�vTE����m����j��N}V�cr^,EciA��X�b� 5wq�*;�G�ê4$��tVA�G�>H,X:�eY�*Ѹe�JYW�+]�YD'KЏO.ta�&ݘ�__d�z/<�w����\�����Z�����r�X���D��<�������vN����"q��ͣ\a1�J���^T��T���JX�x�X<�N��YX�W�� +xF�d�R�����ˋ�Xywsw~qyrzvvq�������Hv+���H�˧2Y�OGc�H4��H���������r&��&�N������yg�0�L.7���� +�����j��AX�(UFD�Zm{o���dg~Ł� ��0xH����X"��E���v�X��o�g�� 9`�R�R�%�vE��+��-���d+�s�XXx���!M�����f����`8B@�i�ʫ �h=X{{��k��1�z��� �����!r[! k��]X`c<n��(?V��9r�ȑ#G�9r���������T.�'��D0����`�������2�Z}0�n��Ӣ�+x�z��W89�oo� +�wp���;��Cl{�����T q�����4 �NC�$��y��@fWU���nZc�+��'�k�%�[W��J�UpEԵL����(�ݤ])�me��5����/��L� +�uM�Q��6g��LXӣ���b/!���F�'��H�"|W �j��w1�C�/D�����@M2����E��{���*|�Gn�(QxE�,Ԡ"ܵE�A����u�ח����3`��� +�d�:\.�V�*�#�r~n8�;�No ���H���)HE4m�~e�_E���&���D:��r�U��BoA'X(����$X�ޕLfsy�w��[,�������q����#u�*�����](����t6��c0X���T:3��ַw���D��v����(^�`$Z�50"�T��K��xzvqy��<��Le�N�gu |h"�݉�0 l�v"�.���^�ө��P���K�J��#���b��r��Y�.D �B�*�k�:BJz75�E#�.�)X>��-w�P$��X��֛�Lnl�����%J>>=��`�"���W�"�6�������t���{0E8�g���x�1�̆�Io4�F�g�����_O9r�ȑ#G�9r��������{u���۾�ޗ�t?�m+�9�l+K$"3)Q�"Ũ�s����P�]k-���:=�>/{� ��Hɔ08k������އX�@8�%��Ú/����~�Se�����$Ln���������g�2�4v�}��C�������T*7l|����G������WnE�p�m.si0b�J��� �%��3(u�xd�geګX�J1E*� ���� ��rEa�D�"�Q��n+٥p���c҅6a�z��0�2g)cJV�WTbB�=ίŤ���2#IY!����\<>��K���1Y)n�f �j��T�̥Z�*��F� +e����)����U�ϩL +n,O����-+ӗEZemW&����O��MZT +p��R����xo�����r����%!� ��5�ti�~ʼnTN^,�H��4NG�`$�\S�=�1� S\r�L��J�����?����Z8�c�St�8>��k|�C���ӹ������T�0�Ju�b&�JŸu���)���@0B�0��)3�����������������x��'���Jْ�{#]]=}���$h�3��K��A���2���T��~ѿ��#B;Xk��� 5���z5Y���4s�^H�2�+p���+�x���R� E^�P*���.��WV�7��l0�F���w��w��]�_O�?� E�Z(�M�T5��Q�p�W��,�k���S�Cň#F�1bĈ�g錱��z�B]ݡh�X#Q_(�y�������^_��;�L�MM�-,��v���>������#��h�Z��1���!���)㳔� +��@r0���� +H@0�,X.X ���ر��M�E��!W.��P�eM���.B�]�٤�K�zd=W�N7�l�0�(ى^E���+%s����#�uܣB#R�~@�K������Pk�"B�_�F)�D�E��m�R�;o��NA�� �M�B�r�+�+�J��I�+V6�����b��3\IN$��/�������ߝ�I��(hF +�# !�����ش, ��6�J+�"t�������l��> E����ALe�������n_ `�����,�A�����i���2P5h,�`(�� �����t|zxd4;:�D��X�B iA��+�^_ ���H���d\$��WJ�ML..-<8�����ÃC��������������·��ã��թ|atbڮ�.7�2�/��5~H�R�~E�+N���($,�&i5!&_!��4H��J��^j�����;����d5������Bqnqqem}sx�`��+J^^�H� �K�"<=7�0�������I�*�" �P��|��?��d�8�iq#F�1bĈ#F���ɍ�#Q�_uu"]�`D��݊���ݲ��E��djt|�d|n���v�v���F�>Ɨ[�+k��+PbU�L�F�to�`W�'���������QȎЫ�������`;C\�x<��v��)����M��rC��,M2�L�(�=�Ƨ�hPb[�n"[a��d;����P��Nh�Y/���H��ͪ[��V ���Vx�Q�"L���Tq݂�&A���6@^�rcX:���{ܪ�(�\�l��҂�C�]��=�݂�b����E���~�ei^����T>�H�� ij(���N�e���lJ�l�ti|<P+㼲X�����L�A ��<�xo����@"��l"������AEӑ�JV��`�:yv<�!�y��x|yembrj(�B�.�Wh�Q��Ƽ>�BE0Z ���* +�Ñ�u+��+�L$3����L�TZ��<8<�xp�ևGk������Ladl<�����AН����uFhBJ��q[Y2�:a^�=�)^1 +�&�Uļ�-l��l����{A!p`�;�����q��m�?�3��zyucs{�L~�lggV�)a�.�O������"HN�� EX�)B�Eh��{���#F�1bĈ#F�����h8 +hW��� �ª��R���l�T-�����cSy�^XZ]Y�X]�Z�����������rqv~&_���0>B &��+��t��k|D���a��$ ��p��D[�ڍ5�_q倒���Rە��ZX�)O��_�>1w.Bh'_�J�Ć�`�!�,;P��Y)$*([�-|.�������bê3 A� +HwsvF�)K$y��l {��R|� R���P9��ݖ���솲+T�M�r�e.���d�~㕒���J�9�X��-c�.I;<>I�z>��̍�.�mD�q�Q�"������l������R�t!AfQ�IVo ���)����p���{�~��db���j��f^ٔ}p�=�r�GFǏ�O�~u�4�Y�����L.��i��q���B� ����p�63�Lb�<��JVfxt472b������H�2�� +1�a���sj�F9]˴Z��L�J%F,S�)[Ay +��Җ��Ѕ�%����0�"�"��hW7�` �inx�-g��VV7��w����q!�`���ȅ�����9���O>���/��gO����tu�"D;Q��"#F�1bĈ#F��\^^���O��t;����h��[�UCs�����M-�n�������}*o|,*�-��/�-,��/g�A�za|rfdl��(8����b��1�+d-���'25��s��.$4#�`iik7�$C"U�r�EȦ%�"�qI�@ZHD*jy��`G+,|Y�*V}��*�!�agZMyJbR~��A�yE�/�K�m�ȉ����H8�\���|�$2�+V�b�P!Z��Ar���?%�t��^�H[W��H�b�P�U�����[K��aPq�����Zkln������� �̥S�t"��_\ZX\r9H�_����h�blT$����>>Q��J�yc����c�әЂ���@� �V�f��4�X��6�r�AQZ������wv{���O�܍u&;<9SȎ�O�W�ܥaҲtvHF>�?nW�@b&43ƋOg���ɦ���N�}��XO_$��*�å�p"x +B�"�bf�Wc���[E4. ��P5��PW:T��� +^�����%,�?� �A aEc�XOoO���Z�2���z ��wPe,P�Nq��;�"�.���g_�|;<<���]X\��R�`��!k��`� +�y�&����~*F�1bĈ#F�������HW0�+_(�����mu��77�~����7��54����Ec�}���jxlbtbj|rf|bzlbzdl"72�ɍ�2�C�L�`��0� wF������E���`����BF�jG*��݅�d"��X��,,�^��@ +�rc*;Nr�+�9(+����2�X���D�V棎�2_Ț�8N;]������O1C��٫,j��"��+��U�a�p*0�T'>Gk�D*�r<#(��WsB�[d+���J�(Gֺ�7�}v�Hv�ZI6!�\�ϢA��?���;O���P:�����7�GG�[Z��1�g��`���p����X�O�'M�����ɩLn89]��p2��p�Q�"�\1�A���4�CP�)BU�:\�hw���E����~&��Z�2:>������N+��dC�2� +�C +} �����vG�cݱxWw�+�tEÑH ��|�'Q5I_�nnh�N�U���1byLI +z�p�N�Wf���]ج�`Y���Et�7_�m�_y|��� ��XO���o �JeGF'f����5@-������3����!�.����_|�vzv�������������Bqr:?��sH�t�bi2_�)���7����ں���#F�1bĈ#�c�g +�:���"P��BS �x|������ݻ�/^<~��X�~����٭�_��p�1> ���`2�փ��@"�;��� D㽑h�qAo �y���n|����F5d�!*��ڰ�5ba���m%c� +��� +I�T@����l ��?�Ju�$HPW��Q��"~�jSDԢ�A���ҥp)B�b)T��+"|�:�MȲE�^B�r�TSrY ��~z��ȣO��,M�؟�*ǰr[�H�R�'�Z�l<v�G��SD�*Gh�}TP��Y�Mz��Y��e��UDr�r4���# +"�S"�_[_���8<h�X9Z�w��4U��N9�;�t�J[z���1��Igs�\�x�������@(,+������?D\G1f-��<^o���ãC�I��@a&�=�>:�}^X��M~;y:�������0�]'z�C]����B(HDdxK� ��NS�̎��4U)s��_�QA��� +e�CK 1��Z�6:X�Zu��X�P8��������J�*B��ZX4{7>~�@� EhR�P��'J~)��;���+��y��Ӆ�B�P�-�C�{iv +[�N�~1�&��+F�1bĈ#F�1��s~qa���W=�P ��w�7V}���t��64>{���'�>|��ɓ��_�y������V��L��?��F������XOw�/����Dc!H����/�֚��-�?��!��C`+@���W���� +V2v[Y�I����]�t�Ȓh�c�;d��HI4�&(�Y����nKH��Q�;�k� �z�)� CYwq$v�Ԣ~'Y�D%Q��-�AK�ρ��r1@�f�"I=��p%����p�+��?��ʺ��hW���k���JbP�� m +��8=��XU����:;������ߏ@����;�{�/,��/c��X�D����556�ohx��`�����\ż&�m'*�W��܄pU�'_(��of�G � +����on���qW���� +A��I%��`�mE�5]�������o����W�2�L$?}�j�aQTE�6��)�tX}R��J�1��B�2��?�{��3�D�mG_�Pc���hS�@��Y/���m�U < +��8��=>#�����7�M�;J��'�)�`MN�K�������z +-X�����M ������N6�w�@�p +JU��R�A��3�Yr7S�bĈ#F�1bĈ��4��P�B�������{�%�����۷��=������woݽ{����O�<����� �X������������4>NB� +~����r��6�W(B�������v�� +�X��%�+S�� AV��r�dP�`"~@�RD9�(TȸE +�pŧ3 +:���(�J�}V|~Ѕ��*e2�m�E�+k� �t�\�,V}�`��� OP'6*�^�CT1 w� +�IЭؠU�!�r� +Y2��Y;~ �]q����Ro%�I���(ЂFw�����rduM{�����q���tbp|jjw�����f/���5���[�x����'�WV�O�./�����������B!�LvF��ZZ��Ms"��5�8�璤xO���Iiv6A)��xx�HA��_8�G�9���6@���t���iv~���?⽽0?:�dO_���Ϧ� +�Uj��}SD�RY%�CY��E,UՊ�R� +��� +i\��du��(c�n�A�*��3�-,Uk��HB�U,�wմx�Ȼ�O���`( +C����k0a���NL���W�66�v>��*B�"4)X��/.���������������2LRVav�P�5S�����qO�[X7V1bĈ#F�1b���Nfd��@�*�E<�����Uj����ѭ�w�ߺu����wn߾w�������_�|��]CcSK;R��}>P���'AX��3�+���#Eˤ`A?��R�@�QQ� ��:B�_�vӂEB�f^�*7-t� �2J�B@3�GS�[�@:��1��`S�bWT��L�hbXqR�\�y�U�d,R)�Tń����ea��c8[���$E�lQAV��$ +Y��d+ �X +�Ww�ZɼB%;Q�� o��ldu��fe'_���5����b�X ���NTY���KU�>yxzv�����`��`"1>1����D�ׯ�O�윚�o�~��������o�?�q����ɧ�ݽ��c���_����r�����fw<�~�,,�jzSsK&��xp��咠0��d�b�����G�"��L6 J|)���d�/�`����c�>�B�d�����wvv�76�d+:1�+�T�� +��(� +�P��J�ʘ��/5������� ��ZY0B�%�+���^�9��W5�7C�0KL���E��>�,������O$������t�0���������a�������_�o�sj����+(a�.¯g'�>��.�����LA�p����51����cčU�1bĈ#F�1�U���k��O�z ���B!�R<�vYihi}����g��ܿ��ͫ7n�_�~���k7oܼs�V���|����7��74574776�4��5�u��$7$Ҁ�w^��1vai��ej����Q�[�L#V{{[G��3iA7���+ ì�d�X�Cf/!�tJ$;��b@X�I�rpXYJ%z��!k�����fED'�H���bvJ��%� +��ں��Lp��f��ABl��`v�Z���EPWnU����v;q�^h1P�ߔ[��.t��7,U�Jq��ނ%;�TVד�\>�YN���Ȇ����9=;�eX����Tzd|byu�����eb��z<���+�[�O�O����'��}}�]]���H $�Fw,��{��g +���M�W|<<L&u���Ƚl�6��������6Q���70��a(�A�=�S���Z���DM"�+&?�$&|����_��x��l*�͗JS�M�ͦ~E�WHk"�n�������ƺ�h� Ҹ<���T��r9A�>�XX� +uz,�+�:�Xe +\>��B��ye���\�L����P�0 +�:��?|����p(�6S�sK(E��S��NOY�;֯�������ã�������N�f����<��!H(�-w��2��,n�bĈ#F�1bĈ�/�XO/���P�i����n�}s��ׯ<~|�Ν�7n�]�V{��,Wk��ݸq�Ν{<|�����O��|����7��������8�@�}��̞w���+N"T2�`t9*$E�X��w�D��`%����(W�E��&�+V�b"��N[Y�������+���hTP�x� �J%G2�)��b��sK����,�*���ÃD�R$' ���L*���~%�N�� +Gk��sڕ�:\H��mI@7�}ɶ +B�5�����G�Q�*o�2+�խ�|u�uy����իã��p�0��+c�Y^]� ��$����K�����[\X^���^��Le��/���P2�J1���1&���d:�70����|�����/�˫]�q �,pF2���ֶ�ɩ����T:���O�ǧg&���K�9�ʔ�p�P5 N$�g���CM�edl���Kfd���T6�L�C�+��K$2�N�' �2�+�j�yl�����Z���q��>+�Y!H;�{Y��ۑ0�i��E�W(��,$�_�t��o�\�>�h� �� ,�q����^�`�2�ѱə|qnaieu}kgo����$�;;;���D֯�Ă����%H~��������q�L�815�S��0E��3����b�����1bĈ#F�1b��9���X�|�� �A���P� +)�ץh��7 �O_������[��_������3���ښ�uu;oܺu���<x���c��������������x����B��ԯpٖ�X���-����~�rq,���v�ۂm��,�GƎ,F����9.�mgW8*(aJ�����ͳ��D�b��n��b�� ���Ĝv[� ����}�.* �8�¤���ߔg%����ZN�*����B�f��iP���(1����MYR��b���+Z�3�,x��e��RH%����ᑑ��#0�RrЂ��_\�K���Ey���T�xtv~qiu5�J & ;+�N%}����X������_&�GR���eٟH,���ml�nl $�<>��4�s��|�r ѿ����EW��(�:�Tv8�e W��/i�|� Y*ƶ�@s����� +�������ܞ��o1��t�{�].*[!)ɔ�4��KRLY�f}T�*Z�s�઼T�"Z�ǣ�,!Ƴc���� ���)y1�B�habaH�0ۑ��.,/�_������C@� +G:�����?�S��3�"x��ol�)Br')BDq���X�@ ,�"�]�{{��Givaj�0�����!�9���!n�bĈ#F�1bĈ�/�p4�Ϋr^y!��5O��4���~����߿v�V��k�@�����������������7�_�y��m�b�{��ѓ'�_�2N|�����������2��O$,��8w/�`i��PC�Du�j�d�\H�B�U*"dhWl{`��݂ +e^I�N@ȹR�#r��Iz2i�2�XƂE�V4�gy�q[a;�_a��2�)�]�f��&ƕ�l+�Q�8�J�v��AN�b��l���Y�e�ƥP����8a�U��e7YI��*N.,�6��*�9]�l��� #�ʕR&Th|�o߿�������]&�Q�t&144�/�����{��-x�T67<>>7����T*1�����F}� p�hX�:h���C�]��D�X��a�`�����tq~a�4;04d�v"MI�</^�u>|�00400�H����^s&��ÑN俢'��?�ӈ�e�TS/B?(������T����R�,x"��L�z{���ƟSD�x���fŰk�������)�YL��Z�<|Ϡ�-H�|0��ѐ�d ��(��,D�������-h���-��,��?������;��o������tavnqye u�gd�)B�r�i�/��)�s�"<:>���[D)B�]�@��/�`a�(�K����Ҋ�ۊ#F�1bĈ#�?�?~�� ���H��!�K��3> +�IJCK��7o�?~|���k7o�^�Z][[Q[s������خ���������z��q��;�A5���O_�x�� h'lljnE)B� l�YG����?�ʘ�n,�O�a������S������ idx�� I�,�p����yE<T]3�p�"[ɼ~����Za����]P�"��&A���9=�ڴT�?d�#�ʪO +�f�\����m��)m��I����r,|)�%)�-���ш�(U�|-�\���i�&;4���������n��oգAG�6%S��ѱ��l��O� ��y��d�G��D25�J &��x Ru�N���-ɒ�� %_IVdE�=^_ ��$�I" Auhȸ��L>���� @6J�JAP��k�{{3��xoo&�3Np�Tzt|�+��z��.L�0�@ԩ�FÃXg�!,$����3��� ����iw<�����T�e���ʜK!Tv�n�*d5}�`�t.W��$Z��S�m�������H�Їj ���U�T9��vB�2C���S���GB��HW7��za,5;l����˫k��;{���G�'_�|;=E���!�ԯH������(E8;�8S(MLf���+�R�;��狳s����q�#F�1bĈ#F����?���g���q���Д�nUkqI����~��ɓ[w�^�q����������JueEMuemMEmUu]mm=�a]�a �=|�����/^�z�Y�Z�;`�[�������+�e|�D� �ۀ"B�"D-�$E�@X�nJqg*�YQ���s��ʬx�/��F,����.J_W�� Ch璆ĵEӚe��ekc��!�"L��Y�*Sk�&���͛��6��U�bE��B�#xJr"��KJ)s)�^�{���w:�,WS�ӱ��*�a��R����7�\���?S��5�T&;5SH�����(��iC�������L"�J���|���1B�"�PPd:h�$��ƃ2��{|��h8�R���I�Rّ���xW<��)⿂�yM7~�s��3�����/5_�O�FF����{ +�t� >�1�Mq�x3�����2^����*���)�\e������h����� +�� +Y ��ԩ8l��:������v�D!��Ik�Ʃ[ؔE$,݉�[��`�u���Җ�jg�+S�!As��~<ZX�2�{�� +G�]���xw�` ����t�4�������������ɧ� Exz~qqy�t��HX��N�N>}�����^�]��y�"� �Y`�2�4v拳>�{�1bĈ#F�1b��9�x�t�����W���P��vƦg��܇�����k��fU]u���HX@����������)�[�nݾ}��?y�����oohljjmkm� wE��'G�~A,��a�+̾F w�tH��X�ŝqa��Nz������v�.X�����Zǧ� V���X�i��e�,��+LVq�O�s�����0���ذW�J��.&��Vl"����Wl��m��ܘve�Uq�*�j��T9�J��Q�]1Ӕ2T+���J*d�Ri�n�R�U,MqP��1��J>���Rqmc��GH�� ���xnd,�<I��b�����| ����⽽��놆+�_b0Y�E}RYyMQ|����d�CD���|Vnd4��B�pW�����nU�76���W��(?���-���.,n���F�W���E3UQ��Zьw�q)�$����[XZ�ځ��qz2�NgrC�tO_����� +S +W8��=&^����K��y��n5Y�JA�$d�U�qUǨv�9�{���*�a-�X�Pfz ,o�t$X!!����B�k9�}~_ h�Ќ�-�`�zb��}�d +x���y�"��������/..a���/N��S��N��?��~XZ^E)©|u� +��<��@A��/(n�bĈ#F�1bĈ�fck�Xw��zCa���@��|A��W�>I��JS[��Ʀg�^�{�����u�������TU����ب�����������յׯݸq���{>z��鋗/߾{���,X�n�U�*��+ +"� +e��G",t�#��v��jikkw�pHx���Q���J���}��C���!�ݶ�A�n�i���헡��)B�K��A7�3H�+��2B��r�v��.� !�ș�T*@�-�(��#Ґ�OJe�U�~@Ś��Fc�b��e"��R�g%���W�4'J�-U��p"i��ċZ����O�4O���_��S��p{��ix4�ۯ{�Ư������b^ ���$���\���,��@*�"���|��d��f����D4���C)B�w2}S.wg�{m}cj&��/(��)�JJ��ͭ���GNjK�ãc��x8�E|����;��C�#c���+k �vp���<�/O�L�U2����tu+���<�n'Y!s�N5�&&���v�@����$-hӯL���!�Ƀ2��EV<�t�c����<E��P����pc�Bʕ���w�R��^��Ca3E���Lfx|��1�.,.������c@r�)��K�_�$�a]\~?;������������q$a勳�����@�Z^]�_�4䳸��#F�1bĈ#��h���O�S��r��W~�������٫WH���~������*+����ЂUU[[SWWw �܍Ì���ѣGO�=������!��$rWЧN�DB�@�� �_a;� +�)��.���eFۍ��iK"D��{�d���/I������(0�� ;�[gE*F�"��N$�+l��N���RT�r1�+�v�d��� ��`��e�&L�<�>ݮJ�m,,��f�'Mq���.%�vq4V�&�5GYlW/IY�����-��omWf�O3��7��~��e�P����3X��dӹ��DH(�������`2�����j����&+�svi�%i���~�Lvxk{'����B��J��#����`����Z�\��ŧ���1x��R����g�P,��o|�����������������ǃ�㓓���ã���8<>Y�ܚ��exd�x���?���y}~���+�Rq3�î۰���٢t&�JX�H��x�� qm1 �@�x�` �Zy�� T�LV:��x�D]��m��y�3ABS�"Z�cu�����ȑ�)� �`uEc������P��NL�K�K+�ۻ{�X�:;� w�"��'�"4�����O�ٹũ|q +v�Ks@E���L�q�1n=����W�1bĈ#F�1g�����!O �z*R�|�|.Ek�d�_�ox��ս��~u��W5�W����JeeemUeMMUm-�`��_�Z������Ǐ�<� �&�"�p�d$Dh�{ˋ��^��У@� �A�VIR� ]&������qX1�A���}Vn��R�x WȻ��B@��I��r���\�b�S�uXk��&F�y''RY�U�'�ͤ�܊5�gH�O�E�A?�Y�����-�*����].�˲�Sg�ҜpU�]�����>�'���[D*��C�n��p�����"�L6��$@���{ +����ݽ��L6�۷���ꂉ:��zi +-�3���� ?�Je(�ϽqH�3观����d +�W*-��u��`8����?848�[��0P۠�1^���ѱ���������������qg�����������������jB�����������($+�M�� )�!팖e�&ԉ��a�I�P�YB�aP�E��CE�8-h��� S�2#��pE�)�|�I�ɶ�!A�(��td�2�{P��kf �%�`(�J!��+ރ�����e"_,�fVV��������o�N���///� w�"4�)�� E��V(�MN� +����4U("�q�1wa1bĈ#F�1b�����`gЯ�r���O��d��R�V����f�W��@��:���RU����+�5U��Uƪ[���a���ur����^�z�-X�m�mn|C� rk迒 +C����X�:Z��;\uLQ�-��XJ�a��M�\��S�6q1��E�h'�B�y˶��Jb�W�:����X�}v��)��H��T��,��O%��C[�Ov�S)jً�U,V R�G���f��4�9LÂ{#v1QA�3biܗH���̋�kj�vz����BPiJ#����gߋs�C��t>���e�:�]U2�Ui*í��%,g�>O�����}xx�� D�#��چ�맒�@]��|�#�]���$Ce�%�Ch��D8�2@�6��Q�K�V�X��=�M$S=�����`(�{��w#���-d�W:G��n+�ՔE�*�ZES�T�"2�j$WH<Z:c�b<W8]�S�����nr��":�K{M#�������5� +u��qB([阅R�Ђ�)�.���3~̃�d&72>�I��#H"�"��_ ֏��p������������p[��L� !�"��Ƨ��[�����X܈ň#F�1bĈ�w��?�G��� �W���v��{e��R�V���������������7���*j�+j��TW_�����^��ʊ�*`�2���ګW�^�~��Md�z����}���{ro���۔��A�$D,EM�I7��Ѕ�i�� @��}VT�R�@�i�8�W>�p ,�J��Q��O墮*�B��슝���,��;�܌�Şk>�:+T�:�����)�t�T�����*���Ձ�-?�Di��Q��+�R��;y���Ʈ�K�S��^G�A?�յ�� +������I��+�E���2�\vx$72���B�ȷӳ�DBU��]ӭ�v��г�5|*|4����ۅ���e㩓�b�F���^Ww��wiĻE4%S(� �*F��h,�708�҈� +��,,�F���}�X,���A���CI6� +n�@�L�����'ȃ�ם1biԲŊQ��Aw���VH�"2���5��yeҫ����+3�b��^�e���`[�9�&���S�)��O�Y���Ǿ,�t�,��x�$jy+ +�@��O��]��Tnx|r:_�[X\Z����������ӧ/��R��?���P���a]|?=;?���������q:�^�a�L��T�4�/�O͠�D�P�1bĈ#F�1cݺ?���� "�ye���WRc[�ۆ���<x����{Woܨ���������RS XU���J5�_/Vmme �_�v����nݹw���G��<}���+r�,�5��L����4��_���ԁ,XP�2A�.�������p�)���e[i�jug�b楳v`�� +��!��N{�Tn]a�(�Y�Bޝ�N�P�H�H�M�"��N@ɉ�.�'�[���$�Y��D���P��2N->��sy��Nd�;�����z�f3Y������%3H�Q�xYQ�_����B����)�,\�ɔ��Ҕ/�����#�>N�RMm]_cu-�(]P��ғ�i�p#�/_�D�����T&C�S����#cƯ[��B੨�� ̨{]�}>�?���G:C�H��3j������Í�JY�/Ma�Sf{��e7���9ҫ(����d��V�Q�Bng�X�,��6jL{�N +͆A6��L�"�� "��\a�K�0YBH�b�Wf� �K5+�R��,X��0���? +S��щ�Bqv~��v?��!�`] +����� S�g�G��a��8:_��PawN�.©<�NE�P�1bĈ#F�1��ӳ3c���;T�����|�yܪޡ�-Rck�����o�>|������nݪ�v���� +� ��RY �+ aUVWU��T�`]�~��͛��ܹs�ރGO?{����7���������%�dR�4Z[ϥ=D �'䞂�$,���\��ȂU�U�Q��T �1n+ָ�X�Wn���d���倷��K�|�B�#��J����@7C�r��Y9Y�L2��;R��CJ�I)�Cwd^Y|YJ���+W���Jrƭk��B��9�f'��N;��V��m&+;�9ۑw�5��Rh��U���{{��O���d��'*�Mgr�H�ׯ?t�W��:�aE.�%,��*�O� �$ \��7}<���r�d*f������Ŗ�6F�R�����8Ҕ���(��~�bFqe�$*;��hVÕ���"֩l�+":隅��ڱtޝŲ��� +�Z^Kl�W�t��n +ST�b�)ӎ�5�+��!��GC݂:�ey�L� R�|�~���\�� Gn7�,+Z�����@0�B�pg��;�m���R����$P��W�6�vv�?�|�����������wb�2%�?~��uy�������o�G'(E�*(U�g��Ȃ5](MV~}kӸ �;�1bĈ#F�1b~?�@H2>���ԯtF�R�������ś���=�}���۷�]������VEŕ����⊱��������������������)B�r�s������>}���7o�64646�!�`��g����`A�; y! ��Qƹ�n����!�������ࢂ2GtW�-��f�b5(ي�rY�W��f �]�\��$Y�XX��m@��r�?V�rۭV��E-����;z�ʵ�ɿad�G����T+Ǯ@�cU�����%,�|?�}ے1d�R�u ����:��re�I��(�+�kk�X��3i�Jg2]�����h�GeD$6E�mW\��B|�PÕ����潽���T +;���lnrjrum�xT3�E'ߋJR~��D-�����Fe�Щ��u2�.�1b!_9�,^,�Ya�U��w�Ø�<|�n�:�q� +B��,b���[�|�����&��K<W>�\�� +�� +z��~�m�e�=@�B]�������{�}}0�9<:>5S(��//�ml�.O���)��ﴈ� �4������������&�")�|Q܁�4%����̯?�0�D?~��c1bĈ#F�1bĔ����Hw�Wȼ��ү\P�j������Mͯ���G�nݽ{��ͺkW��j+���JMŕʊ�ꪊ�*�+�������������Z��`�0A�?{����7���{kS[{;�`���|HğӶ�I��J@��]���U,`ŵ 2�v'�;�x�x$(��*ޣ��c݉2�T.��?��Xu�b��tB����hϠlCZ9l����Ni���I6 +�%�gwO� ZJ�Jq��KqP�4�!-���9��]2g�� ��iN̓lHЮb��-Bȴ��n%'�1\�]� +M��������㓓��4���Tx������tvX,&"U�p�uB�R�9�fy��Pcs������J:�C��F*����,�f[����(T��N�T�5�B�҉�� M*{�O\�I����b�'�g��M +�XX#���L- ����;S�c��` �_a��Ni�� +YH�ҡ�q����sӂ�X��1n+N�2�@����fe�qS�Y_�����PX����xO�t���������������;>����"����d@�e�/@��������2LN��3��B�gi�p +���hcSܔň#F�1bĈc������WDkWY�J��[�ݪ����WCs��w|����;�ܸ}�������ʺZ��*�eU ����Wuu5�uu^�q�ڭ���ܽ���'O�>�� H6457�`��)��9���i��B�* d ��R���a��M�~� +kV�d������G�Ê�\1*N�b;�H[L��i�RU��I��جňN���(����d�P܆R�Leaa��bՋ�2q�r+����6��+���D��������r�Y�q?M+��VY�VT���?�"s�,� +���ǨQ���@M�e(������4ЯL:4be�G��\ 1}H��iU��b��(��WC��|���N�������}���d*���A̧�$�G�X�/89��9�� ���mi����@;�e�3"��# A�b�"-��Z'!Ab�+3hn�� E`�,w���[t�� +��$<����p �[�Q��B�70c�(o��y�+wF�c=��������$LNJ E�������?�vzvvqy�����[��������/_�om�.�.�Y�2S3E��*�]�������nL߿wg1bĈ#F�1b����d([A� +�% �W��կZZ�64�x�����=�u��`]�Z]����TU@� +d �=�5��U @Xuu���ׯ]�y���ې����ӧ�_�z������Z;�@�RL KC����Đˤ�S�B��2S���HX46%��H���ds��[�T�2��c'J#()Y��8�:���Te[9C�x�;WHW|TТ_�����#��UI�_`��b�£��F,��iw@��МC�ϡI�R(�,XHϑ�1�S� ��h$P+w��A�GR+��HX��"l�ϔ���ǃjA]/K����� �L�*������wEc^_����cf�3��F"{��d���߾�NL��-����}�v�(UD�wt�c�YY�:��,a<J£~�=e�� ��C1�¤"�+�,D��B�:>�C�(;�H� ־t�s�-X�0�x�@��ߡ��&i�GI� ���+�Py|�2U,���s� _0G����{z���t&7269��V�6�v�>|<:��@�g�0DS����ta�.�S�"��x���57�8],M���Bi�8KS��3�����ֶ�#�#F�1bĈ#��x�A��)�y�d�#��ׯZ:܍�m��_�kx��Ճ�O�<0-XuW�+kk*j�����Q�ՕU��^][(X�~X��ܽ�����O�?�����!Ƚ���$Eh~tŋ�E+���`uH&˝HX��� ���R��Ên�ƹ�U}�#iYL��W���J��$^�2�,QEQ�v�뿲kV����l�=G�˞���l����d�r@�A���N*IV�I����$ E�In��*����U�[�9��+�=��0X><�p��_�qq�$����ť���UGAB�126��|��^�㱪R�����\8h�fX}2^��XY�\���������\"����[Xjhj�43�h8�gI�iM�<�]g�T��м��$mٳ���ED-B�Ҩ��V��*�-�^��O�5�i'�,͒"���y/�V�X���u/c�2���h��*!$P,�v�'�u�'������Xc_�V(������� $�ҙ����Lavn~i�x�|��xxt�<X��߿�!ѯ~����};;9�������R�3�U)Bd��)�P�t���w��� qk#F�1bĈ#F;����h�[�e�+�H��%��,��ƶ����7 �/^�3-Xw�]�y��ڵ�ں�ښ+�Pª��RYUQ�r���)��ګЂu���[7�ܻwZ���|A� M-M-m���̂�����M�Kk��4V 4�;��]nRDh����ږ���� ����2*$���)���H)H+~Ca�-����|,�JU���+�[P��Iq����{�)W����u��m�F�b�2��&;%�����N��fsmie��oJe�~���"?��5 *�MnJ4l����"�;�>�.I�tEg +���hb(E��t6�� ���@8���<�<Q����Z@E���'����Tvqim|r +\�Wƺ���P���2�C��u.�S�t�������U��;�c�A^����)����j���Wq�v+��a^yh��fԻ,Xu*�A�����N��*�t��1�*����p~lxI���vB�_��� +}����"]������;�0�ZY@r�.���V�7�wv��O>}�����`��]�T���A��v���J�875 ����,a�V��Js���tv~.n�bĈ#F�1bĈ!���8���ʭzHr�WH�j������,X�������Ђu�Ν���aa핚j$���Geŕ�Jc���������j��@��ou������?|�����_�z��]CcCsss[{Jʊl@��T����R�)B +��������U,��I qO�����Q)��tq�j�`qI@^������5���",���*��.�S�$�iJ*o��+o�s���.9 VyV�ֿr�+��E�*K�*�PIJv�Ԝ�X�����JA�y�����g���?[Q�J�/�$uu��&���@a!�U:�L��&&��l:7�7�����Fa�N���8)��~���`25:>995�� ��� ��tvnj_4��倫RX ��4�rD��1CMs�r�*�\yi�!R��,,�.��iվtBb�V����{T6*���٪A�sG>+�gE�X��eż�^,�2%/r�<� }>�J��j\h�BW�B�i� +�o E�HW4�����ᑱ������2L~�?8<:��t��_\^����]\�@]���k[sKӅ�d��$,�r�)©Bir:?9SX\Y�f1bĈ#F�1bĐAM��x�?��J��+��v�j���I2���on}��(X/^�(X�oAV}]EM��o�w aUWWB�����_�v�捛�o'�{����_�@��M E� +A��BX�ą(X��B?�@7s�X�")�֎�S��x�� !��s�D�L�ZĻ�][2G������Q +g�b{ ��.l�r�3�3��g���R��#��MZ|��d'��]��*Ms���2dz{T.r�9۩B�bӔ\�Re�ki� �9�22�0��~�r)?���МJ�"�Q��z�ʖRLS9畮0���$+���T:�H����s����LN�L��ˣ㓱x�8� e,K.�ⶌ� �>����?7:> ��#�c�s0���'��10�d�c��l�A�X�����,]g���e+$^)�U9���\hD��4"O��-N��YНL2=��5��_i�>��ba�ʇ�W>ޮ�l�y������@ JU&���iA��b +�%K�;�& �Ñ@(�vuǺ��S���ظ�^(�/,��!�"<���/.!��W���"<��y�����:�",�]��Y�"�')����q{�]Xwj1bĈ#F�1bĠ�A��c��x�u(���M,h�j�������oܹs�ƍګ����X��TU����+���HX5@ª�3)X7o{��?z�@�������%�"��s&�ǔ��;�A�BAB�s�u����R��RE��ʔ�$�P������l��6�� �]U����p���@k{ s�U�R�:��/������o<Tv�ɉ�n} +{��)ʧ:ѥ,�vM�=���JP��jBͩ|Ъq�� !� �����$s�Og+"i�"ރ/N[����k��$�J ����L�B�b�2���K�>|�?���H$|�`���r�Q�$�Iodo��E�c�Lvt|ru}sium:_O�3��p2�����aM_�e�$� �NSu�p���,��ٶX�t;����b�*�CP�X��pwP������,���d��(ȝ��l�y�74�X$0�jV�<��h��)��B_�� �<4TH*��P�M��Nh�C�A `E�������?�J�a�p�4k��V76�ww���������&a�!�"<?�������d{goqi%_�]���L�T��3���������Lܦň#F�1bĈc|@G��%��L� +��6�T�~��[\RS{GCs�ۆ�o�>y���`�G�������+5UW���!�P!�����ܯ]�q�ƭ[Ȃ���'�_�x���;�ނS�. ,P�&�� \2��%�X��~�ruH�=�N���]g�V�B� U~W��E��2AB��B�%�';��N�uɩPr��)6Õc�O*� +T�T��\� + 5�G�v�ӯd�d%[)Xzy��t�e��_F�J��)]*֯&H�XdN��D��N�THՁ >j�2\�.P'%�t'l$Խ^`���� � ����t:�+�ͯml�_~������3;�02:����F�c���>���������������Ain~j��A��l�Q���o��g���OE�!�r���-����ĊZVȕN3����[AU6���e �2�F�N�W�`��҅p��W�JA^�"2@T�����`^� w���H�2�XxV�g��W>��\�ϋ��j��sB�?@���`(wvuFc Eh����/;26>�/�/,���om��}8� �/߾���_�.B�\�����������_��7�g���vp*_̣ai�ؘ.'f@�p~iYܣň#F�1bĈ����~wO_�[�� +�Z�Uh�r+�n��[��7��~������O��}����;���jUmmEM l!���"������1�EXg,u���L���Ǐ�={����7oo@����6��Z�X�; +c#� +��@��M(X��_ϕ��(X��<z��T)�v�Rx\���*��B�,�@&?h���!AYu ڣ���B�l�>��`�ٹ�l��[i�����F��~�R���TG��D����5{��a�9QW��jM�N�V��N����Y鄂�b�,w�\�B���p4H$���XC�tvxdrzzaiyw������ϯ�N�?}:<>><:�vv��?���x���55���)ds#�T&�� %���?��_I1�ZT�aqU�o��:�r�;X�<�i�)D:����<\#!#Xi���Y�u��@Bq�-&�ƞH�W��nc��|&���\� +=/~�ѯ�)˧;��~ #�(�f53?��|>�6�G���*D���ǤT���wQ(�)�x����klb*_�]X\^[�����������ׯ�gg�)�?~};=;��������z�4gvJ����@�D�����q��_X7k1bĈ#F�1b����ʺ�n�ꀴ+�b�mEE{���&�P�r7�AVc�˷�����'���X��+jj*������ +L�DaMuu�YDX(X@���w��ɓ'Ϟ?�������[�Z�[�]�0E(��vf�P�f��"B�3�0E(!�;Я:�.I��JA��B�V�"�*v��:!�9��8b��U�c���8�'ԕ\�O%9E��u[�nhVʺ�iY�m��a���h�j��t�Cw�V�1�N�Ql;�e�iJ'~*+Z$٧`e�hY��^V�Y��)vi,�cI)\)�Ru�'G���A�b!�P* ����������������L�4:11:>>=33>19<2f�Lg��o`0�����$I�B��P�zy�#n��ckM +Хt�jŔ�r���9�g���/5�v�kVUJWˈT�ᷓ� c�������^,� +Ud��k�C̓X�2U)�V�`�PH��Q�� W�#��,r��в�P��R� +h\~�0�?�$,�= +�@_b(�A +L�mln��}<<<����//������O>E@X(E��������ťՙ�d����"��@��x7{&��������q�:=)B1bĈ#F�1b�GO�+� aNP�+�jVt�%��%AV��������z��鳻ݼ{R��B +VMEMՕ��+���S�U�����U���_�v�� `��w��Cr��͛� ��[ZZ����`� u,��hn�n��$�FE�R;L���.Y�j��9Ahʲ����ғB��<��m[��2�)dHV�+�w�(����إ�8��ô�$-U6���X�:�4��U�:P���e,"�*��S�p�=�bá��ni�ؠ��rq{� ��Q����`Q��b���f��`�M���Tժ_q)Ex +z���PgWwOo��`*��d�aAa&�L &��T*���CCC錱?�JGv�b�PH�x��K�P%(W�g+.���=�;E-�* +N�k1�*�)��V^}�'���b���,zڦ�u�4V�mJ�0_A� �t���0�+/[J�D'��+�O�^)�g�,,V�(���cjV�j�6�����pf�� +�~��{���@���1B��������.�T:;:61�/��/��nlm�~�?8����8E����yy�����˗o�66w��g +����t��/�J�0E8�g +S��P�1bĈ#F����syyi���NO0�Rt�3�D*�rE�۱��ͤ`�|���˗����`UW���X�T@�{EUe%��"BcA)��n{��Ç?~�����/Y�{K;HvH2��8��t !dP&JX����u���%�N-쏲JX�c)�2��H�a�TnV�bi�,���X>��|� Z$)�液?�x���i<Pbt-L�''Q�JO2��X!��H;�]�S*+%�+��0↢�\��X c�4��2S~�g��m��d�}X�� ,�)�3�R/h�Q��ڤ0r'��4"1h��� 5]����`0�� �������7������ꎅ;��^�_�x��\�/�,�*I�ʄ�*OD�/ ��T#����W�������@��x�t��u� =@�w��N!�j��;� _�K���KZ��1ՄD��ao�^yHT���0N�al�Nu-s'%�o���+�+Zh��1��>�"�.���h,���7�H$�����8H..���o��~8�U�߾�������H���S����>����fqn�L�K3E87S�5.=1�76�ss��jqyEܸň#F�1bĈ�;�`�CV]�Ά��]v֯�$�rGE�Ȃ)X��=|t���k7o�^�������VebaA ������������_�@�7o߾}��������y���������������\�ĩ�v͆�"Xu��[����,X\*�FU�H�V�T+k��Y�(X&SK�r��a�|���QA��uJrrU)�w9��� �/��<�Jc}S���l�d�A���tVeRi��mi�#FJ��<o�*�FEt-F�by�)I�:g��9n1zan���d�0aZ;��V��sE-sMV�ҁwQ��BI�����{6���m��r��o؏ H"l0�6`��P�^$�q��q�q ���s�9ϔ�^�Z�[x��O��}f�U]T#�Z�}s�y�E�C�빸�����p�7m��O�;ɤ��X� �rC�)W�N���]����ߠX�\����&`�� �-�pg���a*��Ţ̊�$�7d�*F�Y3���QYX]�_BPHҪ*��Jqk��u(ۂ�z!��mA���oBi3�o��Z��?�Z�>3KE�s�`=�˯�O�:�����K�kW�]�y�������;i~�D"X�d��"|�[��k�\���X��и�������r�"�"�:?��z����7�/�W��ͷ�3f̘1cƌ3�����lj�N�R�̊{�$� +� �ȝE����tzd|r��H��][�VWW[{b3FX��mlᦶ͛�Z[cq��0�H�]���-�]��=۶���oܽgϞ��q�"̑V �9&��������"ªT +%���rY�S���Mv(v�uX�wE�,�����- �*?;�]BT���)c�D�7�<^Xi��8ؕ_X5�ME+مG=T�C�]",��R{��'�Jr! b��CJv����M]B'(��{�p�0"R�Qj�kc5zd/���أ'��L�F{�� +]X�>������pE��U9����LjAZ��&Q��纺�≠�?P�z͞ �+5v��f��J[)�j� �s W]��mE�V�%|o S��X�{b��<`+v=��F�(q���� Y��Tip�vŒA@-\�kU`�k(� +~�j�bU�^�NqV}zvfv����9��P���V.]�z�&n>~�������o��k�4��w���n>�-�{k��.4V.,,�/a�EZ�kK+��E���/,�mƌ3f̘1c�̿sN�>;�o���W��W��,+|�+�EH#X��ѱ����;�{i���=� /"ܼ���Z6o&������D�����]�[H�������FF��=��ܧʖD��G"ԋ%�R��"����p��=�^G�X,�NbY�\�m}��t�3�dI�ů)�]��{�#rY��a�z�Is��D�~EV�z�T�F��٪h���b�(* ��(0eGzԛ�,[�G�ξ�����S,�I��-����C'S�K���P�b[��T�*�B*�r��A]T(���j�(�e�:)�������U�C (�Z/����*_T�DT�4�z(��Sr�G����-�F\���8D�G1������8q��+Ǔ��.¯�"�K� ����2 #]�|�r�ePL��W���{a��қ<�q��R�r��Wu��� �����5Gt 1Ϊצ�I +k���%-���~���Rc���o�_�z���?}����/_�K ���X��ᣧ7n�^Y���Dw.7�k��"�"��-̷�3f̘1cƌ3��)�N j�+8v�/[�'�X�NaQVv��.��x*�gbb��Q�ڲu+�`��!^A�ڲ)����c�-���X[��=8b��������ݍE��qk7��{&���:�!,V���$��p�Lu�d!�E8�#Xи�- +,�Ձ0X���KJ[�q-ꤊlVB���b��,V�&AH��Ѯ�f�BT�Hd��u��:� +��M +�T���B�x�m#]�n�L +���3�;�[E$��?�8ݲ�,�c�-��$��l�J���:Nz�#pk �� �>r,A�!V���P)W�Ki�J4鐫���X�jIK[)/!(W\Cv:�,�Jb��v��nLPB-�������ˢ�"Jv�Qw]���h�O����a�m�_�~�_�b���̩E���Q��W z4C� +�d!}k.x��w��۩��",W����Iy�W�Nx�h�g�Z�קg�y�Б_�;~�s�˫k��ݸE[�Ϟ�\_'&���>�BDX�B�'EX_H���G������_�rwq�jy�E�.5��+�K�s\ �n��͘1cƌ3f̘�W�G"o��pmvߔ��l��&W�<(���`�X254:>08�70���G��V[Q`��n��U�_���8�_utu']==[{{{�o��"�������d2��"wl�*��p���9cB���(]/��U��[�D���b�H���f���d)I�����lG��*��VZeE1�J�*7UT阫Q���TB�Њ���`�j��Ԫ�r_�Q(�X��ꁧ ��J�i�ɒ�=YH(L�QE�l}�(-*�+���-�bQ(ž�� l�6�4\�ڝ�b���螝�.D��z�:� +�*�-��ȅ�*"�4S\`�E���G�l��Ў��'ʉ̬�`+O���U�Ĕ�hJJ���n�r�A�TV r����@~��]�m�r� ��,��i+��X�����f�V�O�=E~z~ � e�N���{l!yЫ���O���}s>r��c�O�<}�����K˫��ܸy�O��;�`a �g��P�`}���˷O�y����;w�_�|u��2�ؘ_j,6V��E��:�X��ظ0�����������K܌3f̘1cƌ��x�۫��U�R���_�=���#XV�XJ�$����ܽ[�����֖-xa�D����m�����Z�X;����`Ggז��n�������]D�RX�+����y����c9P��AX�_U��W�"B(���eQQ�������U�m.�E������v����d0l���Q0�T��T����(��v[��o���\��գ�Hy-R끶��� Kd��� +$�T`�v�,�m���L�D*�6Yы��6��7P�P��i+'Bۮ��ܨ%���Eש�x�����]�(U`���\�ˬ\�Ro�l�+B�Ɋa+��V�S��!� ��>+�ZY�s�q�f��Պ�$Y,�rB���@��2F��/�SR�Ÿ�#� j Az%�Y�K��7t��cY�X�^U�[���A�|��=~�էI�p�F����G������N����Ņ���������cI�>|���3�`E�=~z����KWp�p���-�K�a]Xh�/6�?�����܌3f̘1cƌ��������cT�^��ʕ-�,�����`q�{p�`�k,��36�sp�o`gO_�`%��M���hk�LSX�֖Xkk<�F�;��;�"®���[qk�ݻ��V:���2����%I�l�"T�S� +�W�ȝ�#� �J��Ў�D���̕���**���ZE��2�]����}���`Sa�UQe����J����l �� �Tȵ�"�PM[! ��eV��Au� k��d ;�I���i[i),�寐"6�{u9��D�S�����+��S�T�� rPX��LL��[h�-��� -�@}� #HZ�KY�D�DM�J$�Π�jG�D[�\&�4]W9h�O.�˘�]v�������l +ÕY����)��P�yڊű$��da�X������B�r�2e���VmUYU��Y�J>��Ł+rM�/%$��d�̾����8t��O�����/6�.�u����O�?�����wp��D����;o~�<�����/��?x|����K���EX�E�h����v�*� +�믿���3f̘1cƌ3��y�����g�� +��SZUƑ�\QP,�R�?��=���.S��D:��E�vo��O-X�DG�p��eSk����XKK,֖�S�{�=���ѱeKg��-==[��pk�]CCãc�X�Τ��\����������*��2�;�EX,�"a����k��Z:��T�q����*G���mY�n��U�e��:�Q�Ù���M���k��z}�[q���1{���> yS +�8�rt=;���}��_�>]6�,x�͛w�y0�C��U�5��W�U ��hS8 Z8����"�����FGa�:�+�C�(�3�♨��]H V1��X����"�rAUP��b����=����-����RW�5�hֶ;LT�6����sA�p�3Ze��!�W����9ג=A��WX���ȶAR����� ���?����ku���V���>�O��"��:r�cxᩳ�����XŻoݹ�f��_�y'v2��w�� +�-�7o�=}������\[�k�.�K�E8��֍[�����˗���3f̘1cƌ3������ψJ &WeK�r0�U�[�aq�+U2�b:W��dF�ɡ��!f������8�`���Ev�Z��-�� +D��:�l� ��w� "�={���'''S�t&�-L�0t*r�E\XH�׃:�����EH]�a��b�R�lZ?�HM\a�U�PW����Ɨm �jbq�!UEY5�ı4 � EQ%>���Po��MzF���ʱ�:�V����P�,�D)*��r@�j�̕�s*+�,x�Vl�0�~Ҫ|�M�N��LH�Da1�.Hw�����4��D�"Z~(�-"��Z^�z�J��i��_ը� +��X!�r�1��\��9��9��C��`>�yz� +�,���I*��S�Hra� +���Aْ�2�E���s���[e�vί�"�v��鯤3�˃8�EE�T�U�M�g0��%��G��r�����9s��������k7n�!�E������>|�� ,�"�.a} �z�������O�ݼ}wu� +v^-4��-q���X�_j\X��/q�>�a�1cƌ3f̘1c�=���Z/ڨ��W8yU�K�H�{d��Y��<�`�3ta:�gG�v�ܶ}�`�;�[�M�V�l%���֖X[�Wqr$��D�չ�E�z���w�""�ё���I�"�g�S�b ��*�T����q��<W4�5���,�eK)j��G����o�U�H�7�ފ6\I*zm�|��R{�Ĕ����CZ�k���P�����bU��nd'�t3��`��'�b��V�� +)D�ɆA�,�����+�V������F���%A'�@d��Pl)2��8Qx� -�Ss_�Yݕ���k�"=WҮ�4�/t����d���V%���)�&+�R��(��u�%���"^w�S�Z,%���Z�ww��@Wd�|�"T��$]._ �w�0d�j�9�bl� ޅ��q,*��k4jE�WR��$HWpO�ê�5�" #�����^&r?x���_~��&X��[Xj���{?~��f����`������G�"|�[���]��X��#X����l.5���7���G�E���7�mnƌ3f̘1c��?u��������l/d�+F���_�K��6CX�x\_�"�|a2��L ������ގ�DgG,o�w��� �cm��X+�BH&�˂���[��m�-,r���L�S�\&�Z�4UT��N��q�U-ʯ*E��� �Rł�uP�"�Spi�K=A�&$jô���R�j A��4{U�<�e��Ȕ���e�; +��Y@l��o�`�v�tb�í@[�XYa5���nv��5AOډ�^Q��g�\K!T����g;zI�:�R�MBn��`t�/��_�F欼%{4��@��a���j!+�%D���JV2s�!�&l�E$�D"��>K�d��/t��]8���9�"Q(�prV�Yif\'�Q��[���Uy�Y�k9�E�A��i����)���U�fg�+~���"�G��G�Wu�V�O�N���7�֡#������v���+�._�y�����<}�����"��Z�_��O)����ÇO�{����{�E�;����E��Z�+ktṋ�k�?�ۙ��w�3f̘1cƌ3�왝;X�[>X��Aʯ��� #,K�B²�"©T6?I����Ƌ��+�����ljۼ�䯂���XK��5�-�DG{Gg'�`m������݃C{F���FX�|!7U�*�"��E +��E���2�`YV���I��g�w�6\Zt��V�5Ve���U� +Yi�J���K�s9��I�[�9#�)-�e��\h�@N��[QQ�Hȯ-Oj)$J� +m��/���qߔ�*��A�/���WZZ��Q�����9Q�(!� +I��'DM��k�Q8I��P�ZNtg0���('�p���**��6�[�����u���u?�����.�gP")^t(�r�nA� �� �M1�wa����`��!��йs�{���\_y7�W����!,b���+z k��!S�W9���P)R#V����U��X�>�wv��9�"<v����Μ������ʥ��ns��'�E���;�"�,.������E��˻�_��;�kl!i�]�X����t���������3f̘1cƌ������*a~%��%;W��E��(��D�� +�a[ܱ+?��dǒI�&�{�"�Dgg["��o��nnk�",R!lk�[���EX�$���D����mرk���ᑱ���D2�Je��\�@Z�Ųt�ˤ�'�'.�b��[��(W6�������#�*�>�A�2��� �ԅ�aﺭ�*������*� ��V�s��0��dFK�)���ݓ����@$��Z�JP��p���̓Q�+��n�B�B;�"|V�x +��� +��R�d\N�0�hr�r� &?w�$��F�Q������A�B�^w��sE7�"�U���x�ǂ�,�W(J�0H�=��A�J��(qb�,�'�$��wR6z�byґ�:a �UU����v��+��R��� )���^�z+²���*#WL~EAEX�Z�>]����ݷw���CG=v���p��"�NZ��@�P�ܱ�������O�"����;�"||�����K�l!m.�!e��_ZXZ�-�O�?��u3f̘1cƌ3f��s�������]>���̓�b9[�~U!���[tat�� ��T /"�&p+982�c�`o��-[�u`VGk�M1�"l�x�%��FXq,rO$::�;�kkOOoo����v 2�{r2�J�����SX��D��� +� +�r�����@[��e��T��F�4�.�BR�e�d���V���BI;ԭ+Rw[��bZQ�+�uW<����X��J,����q���H����~@1�Rė�-�<y��)=%i���}�Κ���^42 +I�#�Q�]J�E�W�h�MZ�hC��4�n�d��K)r"wF�� �{d��v��x���m�RN�AlB�A��� +�}��Ж}�.�P�eu�㒱+����vF�8e"/q�ם a�P��]�j�}@*f���`W����+�>HZ�윦�8���^!3��[��:V.����k�h�����7�wn߁�9�˯��]��.�7���\�u�����>}���q��n�FX~'"�/a}���͛wϟ��w��kח�W/..a�%[��4�u~~���|��_���c��͘1cƌ3f̘�G�����mg����%����!���`�I���� +��#��T2�O���O�}�.���E��"��� V��%8�Zcqʯp0����������ݽm+�� �����q&rOe�|!�����w� +^Y�IH�� +_G�SXxap��T�IT�I�J�Y��ҽX�}�5��e��v� +*���� +��lm�H@9�l[��Gȏ TH'K8�lLq�zT�/��B�e�� +�.B39UX��K�n��:أ|S�'UE��6>"T�ѝA��n( +L��c��\�$�q\J�+()t��٧���Jv �[y�h��r<zPR�(�����M�}�;��ڮ�Ӱ��?Y�#؊���A���v�X��>�d�ǘ�/�~�����b>$Wv���.�@�E[�$yE�W�W)ݪ��CXtG!%W�i��Z���-½�f����С�G��z���]����z���������ɳg/��.���E� #������ �O����q���'O�ߺ}we���������E��:��|qs��_j���5��f̘1cƌ3f���f���3�樼����?� �b�����z+�YD8UJes���dr�����m�;��m#�;H�� ���Z�:B��j%.w\!��G��::�l����m۷��ܹs�n�""w,��d�T�>U*��_�B��<�d5�N ��Z�e�"��V��`�9�*G�ّ�� +!� !`��Vz>*�ڸh�� /)Q+&���Y��A�eD��*��p�+*ɠD��q���z%0T��:Q�t-����p�rt���V����r#���4ic����A��`-J'��'��'�RBx��6@�1�� +� +n�SX�"f�t��Z~�v���*��d�Q����]@'zC��S�@ +��Ξgɕ"cguB�ɬԧח�hS��!����D���AK���l"�{��w�l��I�����k�h��Wkx۠_%��<Ȟ����/�*�6�ק���i̯���w��EX�O�v���.,.-_�|����w�?x��ً�^�~�[�T����ܿ1~�~�"��?�}�������\�q���Fh�l�]��l�ťm75_�f̘1cƌ3f���&_�-ׇ�v"���);U�?I�0��l$T-XB&r/� +S�Ln,�����][��+����on�"���6r�SX�㱶x,�EX�X���Ѿ���q����``����=�E�L&S�T��"$"�R��SXV�{�����c�.��r�K +!MzYwO1�ж�tS%O ��X��k��m�Z%0zQ`ER&;$�r�Ê#,�?� �"��%��B��V"%�V:hB*q��<ʊ�T�([խGP�HC� +����Ɨ��lq��'��"���N��)ං�AZ��F���S�����x��l�q��\5�E�PZ� +��}�� �������R6�^�g����ti�շ"��⠉F�D& +�Y��v���!�-J�(ڢ,���U)��7 /%�Q+�kUnġ,!c���ʓV+WڮXΊi�H��a�yK��|��pd�`��KZE�W4�EQU��r�{��ܧg���#"�CG�����g/\XX^Y�z�k>{���k���çO��|"wƯ�������_?|���h��;���༱*[��Ehƌ3f̘1cƌ�����c���+� �B̾^�i��V ��ɕ(6�W$��%"�T>?�ΌL&G�v�����݆�`���6���a�f,¢E�Xk["֚h�w`�oo�������w�ص{�����(�`M&��L:���pk���²��Y������8��h��/bq/w���rs�z��J} +i�u pA��Z�Qa[P*�b�Ɵ�M���b�(5(V��S �e����,����x�IJ��y'P#H���W�`�?zGګ�h{U(�����Pi���T��Q�-wc?U��� �&l�r�w��*�r�x��A�)�P �������� +}UE��<�Q����RSaC�k|��UA�lW����X�`\\��+�vyL�N�]4"ŔY�U,Cŀ�'�����SVMj���@ib��,���8�b�v�X�� DO��iP\�Y��V�� �����z�������)֧�+i��:=]����7�o�������:���V�._�q�����?}�=X��*b!�`}g�܃����������nݾ�v��Bc��B��h���,r�t�j��v��M�oƌ3f̘1c��?f?~�v�2]>X�q�������(��`�X�� +�"$,,� +n��O�2҂տk�־�]=[q/"���U[��aVk<N�]D؞Ht��wvR�����K[���C{F���c��WfӹB�G�H��*Z|Ϡn�Bz��䯂s���BV�U���ɬ4!U����*JyP�b���Z+���"e�=�2d�82��9�&�*� ���=�A;��g5i�Y6�d�r�Q� �~z>*�����jV���a�4Y۷q��i�j*E������s��;6[�w %ί\����m`��I'��`��;��JV=��r��?z��6��]l'�BξH�I���2$���)�����z����*�R�D�Ig9`���V�P��������|?�^��P�b�jU(�]�d-Bi���v��������-�U����v愯I/���<�%��.a�r�j����Ă5=�o�܁d!��>{���K��"|�q��G�"�,Q!d.�/߂g߽����k�"\Y�D�V���VI�p����������Ç�[ތ3f̘1cƌ��Tg�z��)�.�"7e��/��y%�[�l!MjQ�����"Bf��S������P�ݽ��[��B��B\�Ă���J��m��'_�u�T���ݽuk���};��}������^E��-�L.�+`V����-�d�.)*���˒"���,XS�r�bm`q��z��hE�ԭ�.!�:C�AU�7m}埭Hב�R�R��lg�u�=0ĩlyM@7{�k��(��څ���z||�@]W��F,����ՑW4���Z�l�|��� =T�����u��A�� ��� ]��@��|] O()Q�&�($-R��En +�`�K�/��e��k�$F�9��b 9a>+O�X����y*_��Q��X0L�94��͒9�U4d�V�O$��K����T� `�� +F��K��%���'W�jŤX����GO�0(�_5\�I���6H�V��Z5fq�� Vuz�>M[�s��:t�c� �����\�~���?}����u��g�h�����"�-��h�pi��.��2�E���@[�����K�;n��U�Eoƌ3f̘1c��?`����K�S��v������Ia�sa1s��U���a�XɐV2�#��]�#��voݾ�s��v�j��mnk�ی�X����-�kk���q��"�Ύ�n�"ܶMD����HN&S�L&�-�]�SE,r�",ʣ�SeY!Db��[��]D�V���!�(��p�/"�eE���;�_Q��ݒHJh�(�r�|��D� +��n�%�ٮT�d+�)�v�l$+~�)��Rx�R߳C<��(e�Dd��r� +�z�*���n�S��Q+Ʌ�(T�$��~���g��徟�ă)�Dz�ҽ�B�qA*ŃO�~.x�r*���q�+�lȠdn�#4I��\>H��A�/��<�&�K|HX����h)��AVߣ�,����@�mdL�9�|�m����,`z�z+A�e��D�����B�����AR0d�,�DX,�Şe��J)�0�W}���8�]�k1#�]��U�g�jگN��4-�������쾹�s�.�#���+5���'-��7nݽ���#�"\��ݻ������o����_�O��a��ۧ�^ܺ}���k���K�����r_c-���������{�����7cƌ3f̘1c����yS �c�\�$�0�*�y�d�*3��UF�,E���Z�H8e�),��J���` ��Vߎ��wt�&�I��� �[7c~�����CX��,r������u[__ߎ;v��5444222�3X�D���i�p��V�"�W%���B�;s��]�8�U;�&��0Ԋ�Vx�Jk�tK�r��+���m��ez +x��� +A�UD� +0+�m�t�'���e�9Cn4tr��U���������(���!�j�?��"�p/� +���L�Y�P�*���jtȁJ+MoXi�KJy�������Q��Yϋ*6�5�wyR��i���87���. W����} ��UT�J�b�R$����<���"T'��(�c1G��`���J�ܤ�|vn�gJvnn���D�0��{�v%)�qa�T�Bj�r�����.Ӷ��ʃ�D���J���k���c�+��H슞7�iL�Z���֧gY���#ǎ��3��qaa��"�s���'O��x��h~"wʯ���[�߾|�-��7�E��zi��"��",��p��Ņ��rp���7cƌ3f̘1c�1K+��c�v���di �V0��*�8�`�{p��UD�lS ���E�������{F�w�ڶ���D��l!��?7ǂ�-80���DG�`un�B[����v��"�]��ã����d:�ƻI�X�b����-B���"�*�{�bc�BH#Xa{(�4�hV3�V-k��l%ѓÙ�#Ү�}=v�w��]~��榰ݵm>�֞�]z> +f������Q�P2��Vv�R6 F���dVS"RڝEO0*�6L:E�,/���|E&��%����Q���^���z�!YR��� ��ww\�;9�JA�����j�=�N����UHeSvH���v-�"F��/�|��N(��B��o0��sĄ���g�AeK Oa�̕/ڂ�g�x��J�V � ����k̂%��U������k�X��o!� +�a���e�R�[�$m����Ū�c:xpzv����{��;x���_��r���S���~��|cy��5�"|����_�y���E������_4�EDX�E�������2�E��XY#-��"�t���O_�o�+Wo��{3f̘1cƌ3f�GσG������k��� +�U�➙* q�sV�f +,Ղ%��-�\!��b����������hK$6��6�Z��e3��?q+kk'v��:�;�tuvo�Bvbo���Vn��'�DD�%�K��E���J",Z$$.�"�`)+-�U���G���A�����9+�+��+�%Y�c�,��� +��-��b��pDp+���t�܇�<T���D��"��dE�`t +9)�P�\V3z(�j�g��P %�z}���M|:B�rU��i+�dS�5��?(W�I0@���i�+��Б�"����6z �gM�D��Yq�<�xpE [��Qps����r<��,�^������Y�X+�c<����Z@� Z��$���Լ�_�w��*�~OR9RcUwk�;���V �%`�_���[�x�^�P`�C��|���>=;3�of��}s<�[�ǎ�8y������E�����/��{���G��B#X�E����E����g�_ܾso������+�#X�I�pe� +��[_m��͘1cƌ3f̘��;gϝϗ+E�*K~%��X�����p�0��Wai-B*�ʗ�����T2��HgF&Hk��m��[�nm��w���onmŻ1�%������gpqǖ�-=��Ă�E��GFG�'&S�d:��d�ȝ��D�"�����,V!$�+��eYJ� +i.,U��LU�큲XA�YGU�;"je��a��R�d2+���)��J�v"7Z0���jbPoR�s�U}��OG`�_�A]/:M�S�8!�X0|+�oD��ǥ�����q��֮���AAO�#-Ȥ��s��\���HO�]Eŝ% ��T��(L��Q��/�1�Y��AZ�� �-KRr�(�@Y'�0_vy�� $��s0����+�-O&�`����d� +����P]CU�VU��B!f�eP�<�d�������((c�*µp%���IlUe�x`)��%��v�8�Ɖ���{U�e���3aa����>r��X�~���痖W/_�v��'O_��,L��]���]��>}y���W�=~z�杕�K�X�>�X^����-������ތ3f̘1cƌ������NO�W���A�*[d����W�|%�U�F�H��E�H ++_b +�<�W6�bQ�a�T�0�Ɏ&��c�;���v���vlْ�lNjc��Z6㣵es���1���-B¯:;::;��t��l�����߿s�ݻ�����$��`�q�P,��b��+[`u �< �"�C����#X@{�`��۫l]W�,dT���-u B0@��xPk�)�>>��a���O8� b�VSX��yo��rC�>'��� �&q)�d�nx����?eM�&*��)�U�p�^t�Ё�(��%�\[M^)F)��W��qs�}�kfVGJC��Pi� +��W����Jy6tO �E> �`q����=�/�y�T���Q'��h�Ks�j�� ��j^R&��g +9�b|��2���P�(��i+�F����o� _DHW�;�TSW�^�O;��tQ���{�1+���Tx�զ�/����"؊q-�.µ0�"-B,r?�#X��������_XX^�t�ڍ[w�=x������.B�"�"�o�ȝ�?~������/��?x���Bv.4H����W��.�K�� +B3f̘1cƌ3f����7��?�_�3˯��J�3S%����*�D�{ +��T~U�-X�ȗ�~�G�R�p+�H�V����V �jm�w\!��Ύ���N�"��ٺ��o��~,rO&��E��-�2+�hв��O�X\�e� +չ�df�����Ax%�T����&v�m)]��J����Y�U6����ƟB�*%@%���d_0(�7t�NR9 .��-�3萪ɖ@�V�+��ÉX��6 Bp*��_]�pw�k�b(W(�P�k!�� �8q�#� +t|Q��DU��I�����l�"_n ��Kd���2�%CS�\�'n���.,���H���WB�=w�5]�dVv̵��C����=��)�����;"�4�|#�HvUN�-X4dE[~t���h�.� +>@����n�X5�J�#��#X,^�+��bU)���,̣ȯU�aУ�vL�h����㽊cW���43bUk�3{Ik���C�=v��'N�:�[�KJ��ū��o߽c-BU��"���n>�-«������������%�b-��a]���W�M�Ќ3f̘1cƌ������W��S���gf���T�l{U�_Q��V���+��+���BI ,�*�a��XA���Y�DD�ٱdjhl|��p��Ξ�����DGGK<��m��mjۼ�u�6b���E��D"ޞ "�v"r�� "��m۶��m��#X#����ta�T)�,,ª��eW,e9 �_!ε�9�2�U�U�]B]�.���*h+���@!Z�rO;l%~� �B�&� R��� "�d�Q�Ra~� �P�IOam��oc��_9M[��k��4�&N(���&A�e��4��a��*�B,��]�+�#&�9�h� ���� ��mE�. �/[��f�Һ~>������ȓ&�BJ�O䝴��W0@En��|զ��D�UR�N`��mP��U$Z���>)� +��\)�J_8H���t�dV*�␊�ҝjM��V�*�Y���hʋЪ��9���J����а��HCYʃJ��)ߩ�J�V>/�5�Ȫ{<�E�W~u�>^%�֦gf��ۻn���s�9z��"<��������W�ݺ}����d����0$rWEX�E���:nyge������bc��w.�\ZZ^[h����_����c��3f̘1cƌ��3�ٳg��3��w߾|>����eOʕ���H���]���Y�_��_�u�%��Т",�o�8+O���rp�d/"���3��F��m����6�"��f��j���-��x����0����$�-[���������Ȟ1�"$���R~��EX�M��e.�*G��T�PrEV�*�=��ҬV��rxF��NHf%�Y��R'��)'������茖�D������<��rT����*B�����>-j����壚���^�*��*U�f��l�����0Aϐ�iF,�z��q���.��)�����R̮J�(8r��Hϕ�R<��E\i�����4��S������ +�D��V`i�'�#�cD +�r��������8�l�4��AO����Y�<�E�����˸,�&��#�� A����<�Ű)����w �Kϕ4\���]q���+9����Y��UM�+){������,n��;p���G��]�g�0����v�ڍ�w�=|�����o%-�ϤE(+�r�g�"|����<�z�fce��B� ��%�"\�-�s�������+�� ̘1cƌ3f̘�?d��x�~�F�_ �R9��M�J��T6���#_,����s,y� +���b*_$K>��OQ��#Xؚ%[����,��I�."�$,j�ھ�F�z���aV+.�V� [���X"�)V{{{GGGWg������;vP�������$�E�KsbaŚ*U(�B-4%Z~̂U�.,�B�j�`�C +�\��_!ab�FuR!ȣ,�R:�,y����5(O�H�^�QR-UQ-B��RNN�l +m@��7��V��o.t7�}�f��&��U��,儒ZA�\OA^�RŕP�R�)��Ɵ�篢"R��o���+�>��*�1%yQ��]�|'m�-��<ꞧ��<i5w���"e6%�UR��}d? 7���'�S��o�4�h�OJ���@O8����Ps�*ٔ/K|��(^3d^,�%J�J个B��(,�.Xt� ~¬� q�c�aS���W�� +?�W����� �PZ1#�Vզ��ʫ�y.kZĮ骒���ޙ����8p�ȑ_~=v���N�~������+ׯߺ{��c�"|�:�"����p����y��ً��\�rm��..5��5V.5VH��|a�q~~�ƭ��w��W��� f̘1cƌ3f���;��<�����ze�J�ҹ�T6_Hgs�\>��.���b�l�X�n�z�5�"�*�g�*EB��9FXE����u�y�"��+��H� +^�.L�p+329982�c�`��<�Ղ#Xm��~Պ�x�_�V��#���ݽ��gk__o�������=B�J�3���a�]��_�v�J Bb����3��D�H�����4�c�t��z�PY +Ѣ�,.��{:� V8 E�B�� +2+ۉ(��a��j�>W��wS +r~�j�� +��70�;�]��R-t����.?�X`_j�Ʌ[�l�X��}�&A�D�� }�+���_�Cj�=u��t��@F�|Ų�����A�fue\CX�r�1`h��Ir0���d�.W�M��(�-ϕJ+O."��pu �L�č�3�<�U��(��r?��T�0S�x��;�*YUE��z�|�m����g_,7ť�89`ɠ���մ�H�h�S��Q�_� +^!TQUh!�Za�`�5�N��]���.wh����7oq���"��]�E����"��q}���'�nݾ��v��"$"�n��a���E��_�?̘1cƌ3f̘��?w�����Be˚L�2�Bp��ʐ�W�\���˕���栅�T^��S8s���j���'?��HX&����"B����"� +S��T2�K&���w+�X"�9N*�-�_�a~E-Xta�=��U��o������g۶��;v��=4<4222>>6I"X�,w��*�!�Y� +�0P�e� �W�%x#!�`�f��6�P�(�X4UE��l *؊���VA���-��4Q��^ckJvW�CPHCU��T��(�ʲ`R5�?9���O���&������\}ު�TT��՜PWiK�]�=��������@�o��(��&�U���<I�D) >�\�V��2q��p�D�EP�;�*��AjKv�lW��[�\j�tޟ��I'N�d���a*�� '�l��/)i� +?�@�J��=ł�T��TT^��ݱ݅�AQ<�}���r�A��O��UpR忲�`�apIi� 9��}V��A����@�Ѫ�[��_c�fY.�\4vU �d�,B�pߐ<K,X�E�EXs��-��'N�9s��������os��)����E� ��"��[�_�v���F�2�Ex�"�y����/��/��̘1cƌ3f̘��6ׯ߀�j�\F�3�J�s�,�V�V�&����?��a��+�)_ʗI&jJ�XmӪb*GVn����sv��e�%&r/�; \Ux���%ĖxʂV:=�L���/"X��4��+��7�ZZ�m��-�X�T[��+����wl�,�"$"���{�GFG�'&��=�"ٳl�",[S�aUxa",q^�&-B�"�,�f�Bu�(q_&(*�N!��8Ca�p%AS�n 3J�̀�"R솮ꭊMZ�Ev�%F�ī���.���&p�UyN�:?�U�)��8x +����P��e=%a�v>�l�������d�H�*�¼� ȇ�Mq�;Z��1*`�ŕ�@F� ?�(��Ф���K�E��'t��J�gз���4���UbG����D�����l�����r�$�:|���� +<����a*���X�9+�1�;}PY� +-<uO�s����z�� ��P)�����]����ؕ/VB�U�����k>�SZ�LY`à�e�s�JW N��#T\�Uc� +�*�2�533�o�t�_��z���Sg��q�H��ܸq����O�<{�r���w���E�ϯ߾�]��+�=y���W�/.��AXk��K�d�Ņƹ��[wp��Z�7cƌ3f̘1c���\�v b��?�II0��f�� ��*r.����0�*���=��RNUHf���Y`i+�"'�)�`a�.(�"w��(Ų��FwA��J�Z��d&;�Lc��������m���wt��V+�nn�*ޚ .w�������;:����D�t��if��}p �"�*M��b��@X��&���J�Z!,ZV�-d�u�Y�m����?�r�e�\5Hw�E������r�&AN�����sV��B.�[Ҡ�ۨ�P[0�r�:��j�r�d�~Z�tC8+�����8!�B^&�@���)%m�v��NG�~@_�S s����.Q�,��+�5]vŇ}=�o�C�*�Z��E�G�5�@�U��K��nr@FˁL�����"Nu�X��� �9q�U�)UN��4̆|��r�M`� +\z�,�%x�|�����]���"U��2p%��"mŸ�_���xG�C���<�%ʆ�q�r����*3T�R�,�%�T�U%[�Ht�4^� �G�y��H^Kn'���N��7��G�~=~�7�"\�|���[x��g/^�z w~����ʯ�}��?����wW/]]l�P���BZ�+k<��t��m~����Eaƌ3f̘1c���|��ͩ�ů�>~ܷ�\Ng2�t& hq=����e�+����_��P=8�̪@ U�c�fYa���y���s�K�v�(�*�!u����H�/Y����Of2����ѱ��!�joM�E�m��Z7�Z6��j������D��=8!���{˖�[����v��������8�`e�a��SX���J<%E��+\',�;ug�2��j���,�l���˶��U���L=A��U����T�6�a9 +�҃R�������0s�Pi���~�-�J&J2�IE3H�~g�H�w���B��e +� ��Y,�k�Z[�>�XA� +ǔ���`)e�P���S?�g�|:�1'Qǃz+G�%��l��"IR��)ɠ\��~=����)�`���)��A������!�0M�ߕ-EQ-t�@���gSS�bIckr�$M���]���v��(��9+�5A�D�PVy��è�=%�)�u�g�k؈� +��g���Ҏ%�=!Q+jʢ$��,*lg-Bft�mA���I���`X��?g���7�o��>��/��8~���3�_\XZY�t���;w�?|�����EH�*r���#����w^����.¥K�8���E��DXK�� +3f̘1cƌ3f�[�ӧO��Ǐ�/^����t��/��Z(��l2���ri����JJ�đ#«\.�+�Yʯ��L����O^e��L.���*G�Ia�0�@ҭ|!�w�W9bӢ�������`*V�Du[S�����Ρ�~�����q+� +���ͭ����*і����D�/"���;8��n��;v���=c܂�ʤ���ߘ!-�B�2U�L��U ����b���ràp���aɲ+Bi�끶l�s�"����rB�@I��UxW`�V�pK+�jm>Gqa�ȗ82��� ��y+�� %'���H;�H�('2Q��r���;�$����|�<��P�ړ<�+����l%�$e��K�JI�;GU�Z$T�]"�n���THE}찯�W�@%=QL!U��Ar�� +@$�'�dPJ�,T;���!� psT�S N���I��-��';�����9�Bb�������T�8I#����!�b9��.��+�V��(:�5������đM�:Y=����b�x��س\�%�0_����,�<�r�V�U�y-Ƭ<�,B���}z����� +��c�~���8|��`����ٳ�[X\^�t���;��=|�2X�0�����g(r�K���}���뇏x���/��}p�����y�b��VV��.��7n�o�/_��?9̘1cƌ3f̘�O���w��ӿ�����O�:U,����$�[� m�`U�� +�0(v +���ZER�#M�l!��M����<�Vy����w �p��sY"�E���b�-"�����8D����ȝD�ҙQ��p`p���E�:�"¶6̯p�o$l���ư+F*�X��[��Ԃս������������]������+��䂃����}�X���穨�]����@VDL䎏�z����p�#�jI$�W�hݍ +h��v,G�T�J�!�(TY��nT���ؔ*��Ml�?���FR��u�Ty��f�ೠ(yx<�Iw�=>e�������)�=��u�k{<줇�D�L������%znxǟVq��)�0�L�U<.��EU�d2v.~�7t@QӶ�+{���|���# �b)Π�'�Ay����ܗ%3`�O�\�"e� kVY���AzJh�D1P6�XaP0+�[���7��vk�A�̵�33�K��17��NLչê�3W^q;[)H�ǣY�U�U�ȶ¤��EX�.wfw�O�0�b �$�5w`��k�8��o�Ϟ�0�X^�r����w<x���W�^�}��e��|S[�8��EX_�}�Lv�f-µKW�.�k6VV�q�����s��_�1u�1cƌ3f̘1�������Sg�8�x����mg�y�LP��I�U6_�D+�خ2m����d:K�UE���` +��L.��%�#8�� +���A�X)���g�Ŵ� �`�]��BHʯ�r#a��s%̯�,rO���'�k�v�j!"w�ro�Ժ�-k��1�jO���"!Na��wa���ݍ[�����1��9488�gxtld|2������zS��bpLQV�c���#.Zw���G�� +�+n�"�*�&�"�.f�[C������:�� +�dV�U��{�h����ڐYɓ&�*�-������ �{���l��2+W�R��P�r������|\����|�����<OJ��Y>R�Ur���r�ФN +�m�de�q u��|hb��=�[���)�G�=Ua +K1ne$ +�yZ��J��:t�6u��`������������1����0[ŋ�F�>��P '�Xa�o����ʫ�ٳ^�cfu�I����� oz>[�D'K�aE +}���j� O��K�U�(vR��/���zu����0��,�4�V8s����4-�pm��i��k +�Q����7�w?�=v���'O�:�Dž��+���]��[���<{���"�� ֗�.�?���}�����"\\�g�W�_I�"m.��[���!f̘1cƌ3f�l0���G�++�33~���_��d&�L�Ӵ$��Vv���I;�Zg��H^��Ŵc���,�Jg'Ɂ˃䘤'��d:���_�Y�3��W�J� +�E�+�E+_�"�����`�E�/��� ���ށ�����-[�Ă�F�WT���� ,�j���ۃ#��َ���-[p +k۶m����e�p��S����"�M��b�X�*�aْBv�S�;�ZT��I��ZH�YY�ckl*��"�)+���D�Vx`ij���!\D(�j��3+e��܈�_ ;�[~�̀=�ǥB*b��IP P�h���GA;���9��pw�T��䨝>$vz�zA��Bq)��q}h��-���$�T6�[!�/�$��������3A�ɕ�",[�d\1W�ύ[��B�:>H(��"5�0_B�!�)�ʇ��A��T����DXU�QW��uJث|�@P�����O�`��y����sI;��b��DZ��&�Y +�+뎸�F�u�\ne��bA.x�'4�%d�U�#ta���������cF,&���B�.�ٻ����X�~��/ǎ����]XX�-B����/^�~��������`IfY_1������=y���+W�c����|c���+� �"��v�KW����ϟ?��I̘1cƌ3f̘�[}��q߁9����Lv2�Ngs)�,�n �T�bN�U� +�U&�d�&�x%_2��He&ҙ�T:8&� +~%D���I*��P+��,j�"��<�b~�����E�R�E��S�g�Շ�BHʉ�������=�w�ܺ}{�֭T�������b�n���$� +�X{"��K���EHvuuuo�"�����;v��544�gtd|b<IZ��m��.B*�b����+���^�m��-?[Ȭ�~@�9���]�&�������R:�������f�Sl�ὁZ�I����r#I�a�r�{�I�k *�U}n�1��xz��&�8��$H}_G�Y��� �����&�l�1`�5|����`4A��8�O�Q�R$tE{�c�@FL�Y�\_�\J��>���Jj=P P�"!�Y�.�F*�J� ��ȧ�J:�N���̀ཪHT&}O��x��٫��C����*��P�Y�ʫ +�7���Y�pU�B��l1�ijX"^�0.�WyC[�� +� �U�Amq!b��"��Y4�E�U��N �uʠ� �Ū�>�I����*_YHEX䘡j,�b]�������}{�8x�����`�����"\^Y�r�ƭ��<Ļ_�zM2X�>} +E���-¯�?|z%w^�_l\\��I +k-8�v����f�E�Ε�'f̘1cƌ3f̈y��8�������W-�Q�/L% �ʐ�\�Yz*�S�V$�b�+��ʅڂ��B�� �l2��W�IB�����V���W�¬�W$���",,��"��T)S$"wz��|���HsP�"$� +/",�2\c$��YD�70н��G��[���ئ���n�����B�����h��-B����}��C�{�����]��4�`e�E�/�q���"H��+�2EZ�|!�W$�U �+�E�\([{d��Qj��yP[;�4�Qa�B��|V�mA^BD�=AW���� +@'�j����j���Π#D�b�+���JK@�^�"��%j���v�� 4��ك��'�{�G��dM�3ȂC�^n�R*ś��ĕ�vM@��%'���9rM���*us�����H4A��)) )�,��xz���:BE�Zl�bU�[Q% �PW��~z�Ї����}�x�ʫ�cW"�%SR�X�D����دA������Ja;�X"�U���*�^�5�g��ѨSi�X���T���h��8��ȝ�&d���Fº�_I�O^U� �N��ٷ��"<LD�';}���V/]�-�G��>�-B�����.�o߃'d��ѓ7o/�^����WX�N���Bc�û�������_)f̘1cƌ3f�����S���j�Z� �rŚ*�'��T&���J,L�"BV�p� +���BF� +szX���R^e���d*3�L��d +�RY����h�0��$�\�,V���d��� +Y +�+�"�+ o",���ȝh�q+���ؽgO��][���V�WD���B�[�X"њ�%:��$�Evtuunٲ���X��o�����"�HN�a:� �7/�V�P$"w��D��� �UH �28��U�"�����j�J�Wa��i�C�v +kE�܍�~C��6���� +�����)U�����^���k"f��T>��� L�Ĕ���RNN<φ��2�#�X�������rŎ�Ɩ���Q�Q�:���~'��q<O�BJ~h����jR=QQ�(G����$ +@!U����������@bJ��"C���5ee.w�C����"W�ĔK���8���K�n�V�R��U���M��A�jaU���E��),fh�Q+�,~�ϜW�nJ�J+*`gZx�/2��J��U������\MK~U� aզg���ۻn�ࡃ���ד��v���\XX\�t���[w������/�_�y��}T��O����v~~�������p�����څ�����������EXK���.,4�W����_,f̘1cƌ3f�����C�����z�^*��b�b��`6�Su�"v��)�?�?�=ȩT�%�|�@����*��Le�'S�I|�?q�0C��fr�H��J#V&O"[�$w��F!w��EEX�HX�p������W�bG�r��ǒ,�ջc�������X��?k�Զo!��a<�h������N&�Ƚ�{KWO7FX}}}�E�spp��ᑱщ��K[���B�Pd�q��,"�",J�h�n�S��eQ�E,X�-~a�ae��Q!g��U����S$��&^�`+Nu�)A�:'Q���4�:} +;��W���ZHu������=��m�Y���Aj���z!U��U� ��FE��s�9t��H�$Z >��-�zB���O`+y=@Xp���A�&#I���UMx���J�]Ψ7��D����)7DPu._^URX�K��@G} �%�&��Q� �UGeq0 %tU�@�0X�>R�9�*�o��o<.UeC�}���ਉܔW��*Pq��x%�V��^��b`����"7�&v�����6����\/Hx�{�H8-�Y4aE�)�� +��rYV�w �gfg���w����Ç��*��N�>��y��p��U�"|B[�o߾������_�]�\�.[�_�~�����k��.,-�"�Rcay��#\N0º�xqq�����3f̘1cƌ3���u��V����?ϋ�r:�-V*�Lɞ�sL�.�Q01�ƨ�U�9����X����`|�T��Tp�&�#�d<�&�*MXD��넔h����Zl_a��1�Q�U�NU�.BKZ��*�Մ�R%[,��S�}�S�=8�5ҿk����[z��wv��"����M��k��'�q¯ڃ�E���h�"�{zz�m�ݾ�oǎ�]�v ���t&����`)"� +�����d�X��^&*�(١d��cw�2T���ԧ��ܩ�D� [ӕ�z`埫D�O���z0peS�\���Qz#:���Z�.�"uu`�n�l乊*��O��$lћ�%1F.�D�JD2j���~@ȯB�K���b]&��2�!��'[���P��\�:J% �V�O��A!5L�ȣQ9�KU� +��J\���*�X2�UU��)�ߕ����C�j���X�*�TPێ�~\{媋]�'�+��SW +˺�_ a��I�NuE�^�zj%��JK�<���b+�*6 +;��ק��Jd���6�W��]���"�1����]��Ȫ�����"$y�(�5=C����Y�"<t�Б�G�����Sg��~������Ex����O��x����n~����"��,����O���^��y�[�w�W//,-�acyqy��#X�#��+ku��3ƌ3f̘1c�̿g~����m!T*W��B�XJf2���1`�U*��$'�WB̮�����0�<.4Y��~��TzWӣ�����Drd2�#Xą�\��Ȍ3�; eQ~���� +�;�W�t��ӅIaU���"�� �� ��"w� +^K"X�����C�};�G�(��B¯��m �"�+�� +,bqO�E�B�>�s`�����C##���\�N"p�EH���W,�����@G��C~Uf,���ȜLd��cYn�l�U��٪��� k���,T�P�_!����X���P�aE6�Si%>\T�T ��t������"�}Dy���|�����S�F�"�Rp������@�J�Y2���y�+�(���\J4���H� e��0v�'"��?@ +��N�ppT=}OS2ڤ�!5���*�HJV���g�7�n+�ȃ/��Ƀ��W��7%>vq�UjCЃ:,��+�5��A�XTN +�����|ՠ�ZU}�` *��ea���\~eY>9a� +1��R�_��B!�"�,��j�"�U#���Ikf���.£ǎ?y���3�����X�DM�x!n�y���{R"����7m�DX?~~��}����p�pie�Z���=8���������~|��}���cƌ3f̘1c�_2����t:?U�J��@���rܾ�U0.�岢� fhC��.�B��]�l.��ګ�tvl252��H��O?�H�p,a�(�",��Rb5ap��T5�\��-BZ$�",j� +���,�������~���<��=K"%�$K�}�ݽ����[�RY{��ڪ��ں+˶E��ԓs�4�a��t���'vr�ɃH��9��&�x��?ߧ���~��ouu��t�����~��L�X��(�`u���wu���7��6�����kir.���V���ho��he"��`��� � ��D���E������g�B�N#X����Y�T����e��<Wηhsp����_D����]�Se�*�}X�� ji�y^_�.�/�ؕ���(���:C{F��?��G��j��U9T��Ss��*���J7\��e�Y�˚Kin0䅤R�[s��]��V�� 9�ܒ+L��U�t�@��t7��iN~����������j,�ʔ���� &S��?U`�Q��R��& +G����4u�O+N����%Q�mA�`M�b)6*�����_)H u���5�T»n�!J����)�떆�\���2Z&k��q�X�S�_��N�S��n�!�S,g�h�M(p'�]�JUƮ$��!Lr�e2HŖ��v �:!�[V��V�vu~~��M[�oݾc�={��z����]�[��/\�*Z���z�駟�;m +�W�E����O�Ex����'N/����2CX+kǖV��WC�p�nz�;��w���x�;�t�on�G'��V)S��"Q�TZMN�X����*���Jj�� +#Nx¯&R��xr,>O��OD&��D2�J�R�sa:,v��,j�"uB�X9nz'��4��DXb�pZ-��[���T��,`k<�5������D�>"roiil!�������I���������~�#�Pptt,�!�`%әt� D*r��.N�NMC�����l�[�ap�ċ�,�5CW�)�=���٥�J��0��2Y��,��u�T�$Js5 u����r?^g�@]��_�A�z�[%��rk��Ұ�J \�;��J�J�` ��lWC��!1�J�gV.Qy�E�4$f�<�0]�s�����}�/�2��^����;�XbG�Z������7��(u�������0����B���;=�-���Cѩ�3�%�ThP�TЄ����W�*Ų��z`�/N�To2B�tX��ޔm����t�n"��W�de�b��S��&3���A�@��+���+�,��"���,r'8�m6;H_����U�+��^��<�e�V�"ܵg�^�E��a�Ex�칋��^�����(�z�[�O�R[�_<y��G�ܻ����_'-£K�+�"\Y?����� +�Y\v�<v��'N�����w���x�;���?������%�NgP�Ϲ%MVn�����(L�&U��Z���\����J�5C_%�Yj���'Fc�����x�D�b �D�qVDuBƬ� �^���$Y'$��4��/��&kVl��Ue����V��$C�Ԃ�������D��a555476�|��_V�����+�B���{{�����H �Zhl,�G�'��EE��I&r/N���^��+r�;TK�_)�iVa����ON���_������@MI^��z䪌W�4��WV��e���ĉ�����H�pN�Z�; �dW�U�S�V�궢,HC�p�������H��")��e�JC1'M��) >C�&��Gf�=��g�)=d/�������ۥ0 �u���E.�eԔ�j�R�<�a�"Xb��_r�d����\w�ȘA�SH�e��?I�t����,��U�w f%~"�R���{���橐�JE?Ӗ�D!`�F,��hm�y$��t��"d�@9)�sY�Ɗ�r1�PcY�/��;+��nC^��Mʩ��ݢHJ�)v��+��b����X�笨����,�"� ��H,X[7oݶm��;��o߁�������SgΝ�-�����`}�)�i��+������d����g�W�I�D�Extq�������' ����#��x�;��w���<����O�����Sr�O�Ğv� L��K���Pc�p�.�� WsP$�H�k2�Ngf +S3I8%!y���'x +V4��Hi&ˊ��t�� �h��Ma���%��LMX��l�!�`9���.�\�f3���d>��:�>6>,�g�E�`���X�}M�������W$�E-�흝p��v�����;0�E�@8��x<��V*�Ng3�E8Y�b),ίh+�E�Je���[����x��������[��Vi�?ȾJ�5�nѺ,�B��pXKQ�#�D�U*��J>L�%�g/I��!L��K*EG{sb�̭Y�NVQ�daPv,��)��Q��{㹥��(�tr��x�I�b�I^e�j�E��.�:�]� `��'�l���*)�)��²q|є���2��ԧȣ�杉�y;O3rU˚�0~0Zĉ&��Pd���*�(QB�������h����~u���>�j�Bu<G(rSe�e��Rce����V�U $U�l�,�����'������ٌ2٬��� +���?���+� +�H1�d>+K�+zCH� ��"�� +{ +���'��L� 7����/ ��a-B����V�.ʯlF��b���M[�m}l�ٳ�����:rtiu����g�Ex Z� r��o~&,�E���Z��}�<棏:O9��P����� +�;/��"����W�~����_2��w���x�;���p���ſ��~�����L&��S���_�I�l.����]�<�%fw���c�\�%`W*��-��<T��M�2��� _E�C�0:��L$� �K��"� +�V�E7xk<�N�iB�����D*��L�!�4�`���=��� b�;��V*;鼲�B�X��G��������Xܛ���Z}�D������������!�E�{��(����P(�� ��H%�T�|/W(�ta���a�H��4�+~�X�N�d�,ί �%fki�V�N�x�P{��W��IA����$�Kx%�U�]J�_�T =���VR�T�%�K�;��īd���t��(5Y�X���ߧL����o��X3岠�PC��i��}��c�S�%8���d)�wC���*��!<������:�@7P2�B����S}P�����ڠTI�Y!�c��L���e��� w�P�,Y4D�I�R�;y�����`���gi5�C��3�ߒ*���K��,�r(D�RT%�Q�2� DVvEuE��$�T6��(�|�]ҸN~ +��b�+���z]�ҷ�y*��I��]T��s�E�UB�.��&Y$��˰��A*�<(Wm�,XVu��M[�nپc��ݻ��!l..�'-��\�q�����|"w X�E��"d-B��'O>#-�γ><wa��Ʌe(.���"t�����_2��w���x�;���p������o��?��a�,��p�"RYlV�Ia{�y���(��v幘=/�W�I�d!}�D:3[*��w`y�X6W����xp,��9�OD&����a��ĈR,�%L�]BI��y�P�RA�aV`�d1C[�S�_!�{a�X�X��.x��\K���C}�C�=�m܂�-B_c������������{GWgGg'"�� �` ��h8�"��d*��!�4�>�<��Ԍ@X�_͕T��� r�E"T�Vʳj���^��X�����=R�RX8UU��"wį�]T�&��Z�j�\53�J�����Y���W�aVZ������Hd������D5��t�E��������`���j�ч�(��v�ڠ��߂b� �9 �!�O�Q+S�Pa����gv_,d�2䠞�j��q@��Q�����Jt����5 D�&K�)�QҔ��jY�EE���.���U�7%ؔ�]��x�c�.���V���,���c�H���BO8%> 8��҄�ݠ�� +����J2+9D(]X�gE��c�����@W�=��>[�mA�4%�B���*�MM˦Q+��Xg��,�B��B"X��l� +[��a���[��~��ѥ��c'N������W�ݸy��=h>~��ɓ�>�&wT!T�>||��}����y"r_]Z]_Y?��v�D�V�.��d�؉SK��^��;��w���x�;��O~�'?��?��o^Ke��/q��&v�T�V<d7����R��Z���§ҙ���;�֢�'���dy0�'xp,:�;7B��X|�S� �%L�iB0b��% �s���ZY�Q�I��a:+D��MaA��#,�Bȶg����t�@-X�Ec#`��VGwwK{{s[+CX-MMD��kk�V�����ko#.��6b�������-�����a�"d"wh&'RI�"�fɯD���-��N��!i���ʽE�,$r�,Ml��e@��u,�r-�]tg���kP.G���O�ǧ� �!��T�M�@Jv�����@{�n�:����>�@w��8G���+VR�tܼ+�=�O�,H�5�ĔL�Д�b4�� ���1��3\�Jp��"��U(�Uv�$��dIS�R�ˑ����S1�(G�4]�$�^�]��LC%KfIEp�;�Up�����z��*J��?_�G2ZE�QY�eS/<#h�/M���#j���Ol��>�Q+ݰ���@�+��B�2��o&UW��K�rY�$���ɃIcʉ�F� eS���E������� ��� y:DhUD:�Ul�ЪXVU*��<8o�P��aU��6S����v�ڳw߁�~����,,���8���._�v�i����O��*�\��T�"����[�-B*�ZX^]&",�"\; +����K�7n�v�)?u����x�;��w���<��ĉ�����O��_����韎���|��(�R�X�Y�Į��J��w�)�J�B�H��朋�l�ZZY?�����c��d|"��=4Eb��H(�V��������<�EX�Y�^a��ݳ�iĂ-B���&+�IfsI:DX(�;�`M��V�E�~U$��`M�VD��a{[�������������"X-m�>��� +akgG+T!�����������������@ �A���O�' �JgH�2�#[������Lqvv�"�Ri�mj�z �����p�T����e$W/�1_i��$�U�[r�2TM[�ʸ0hԘ���I�G%�]�@t��ʻt���(�?*��>��b_�"s%�U����ŐӁC̅^�w2��Rg�*_���Q�J�45��,RX�D�Z.ez��;��Q��N��P�f������Wӕe=�wr��SkR����l/W?�!��G��� S 3ݮ�� ���,�&����*?���*� �ӟª��f���� �psP�Vv���-bqg�D���5��Ґ��������V�»�X�)��lC����>+��"��d�a�*�vG����RY����Tr�|$~�U+H���ԅ�m��]_�$sE�XB��ܨ@�pۖm;��ܵs��}�A���{Gh�����\�v���;���-B�"$��-B�"����[g�]X?~��K+�Exl�l�!Toݸ��k~��=��x�;��w���<����?���ҷ^��_�m����Bu�:+U۞e!�IᳪYd�w�/bzϥ���{�3g�߸yg���t66������X`���e�c��8EX`t�a���!yE����*5�&��t�ଌ�`�v!a�r,�%�sS��&�� +��)Ng��`�3щD( ������;��Z��as�����ZZ�[� ���X�����[I +������"X܂5�F��X4�HL$��t:�Φ��\���!�EE��I���(T!�:��,j�Y� +��jU���W�I*��^����}x"����E�蔎�,���`�*���Jj��i�2+����VO�T|ܻ�dV��+��Z� A��۸��N�ҧ�Q(���ϕ.ɏ&����V��B���N��+Ȫ7X��ru��u<%qT!�c�{tS���t��2S� +����5[~���c\�I6%���skCY��[�#����NeR�t5��{�r.Pj��L@�|�xN��r���L��ԄOF�3�SZ��V���@���H�|��T���np~� ���$�W`�+)`'q,�/ +A�ɈSlUдy:�<���v�bw18(\�PU�����U%�:/�Vu~����EZ��z���.���[���\�y��ݻ�?���?e�/�� +���/>y"[��N�]]?����\�V�V֏����� +D��w9~����������w���x�;���s|^y��/������� �OT��U�SJO9�H���\�B��ҙlqzf��K+�Ϟ�z���7���D*�'F�qx����aǢ�u(G�ñ�1�V��΅Iݡ֗���4H�Y�OAV.�&"w�",f +�,�`g�� �����Z� �����d!�͍�R�q� +��Vk{{������������� � �)�jrE+����uGw7a�� ��P8<�F����D2A"X�l.��$�j�0=]��.��L���_�%hbX�ű��{��������v<#(�S�jWu���?�S�(��!�5���9��ȟ[�y�Oh���JG�*���XV�V:ͩ@Y�:t�XW8�X�GG*u��Qy�*��J��|Wr������sݨ#w!&�R��\R)�+h�!?�t������y�H�t�V':�d���T�ꄾ畎�V�{�5�R!UGc�I�'f7Ix���H�n�}�j+Н�2��L7I��+6�w�ϊ�-�Hj�B�u���(ab礋B0�'ɯx�P�-J�&���f1�ET�eYq�+�6�]1�%H'W2�erI��|V�Ӡ�+�W�Lx��_٦�<�e�ob[�; �����..�;q�̇.\--��>��L~���ӯ���Sh~�%k~����;h�pe]��V���/��9_&�¥�ο��{y�x�;��w���x�<o���s�?���W_�g��{����W�`�a�l^aV�Fޝ���+��r]�9�NH���W�K9�W(nݶ�����^�v�ƭ;���3s�W�H,�GG��Шs;8u�-±8/�J:7�E�$:��La��s��KH��3�D�"�5�+�NN��"$̊��i� �9($:��������HO{WWk{;h�}-��� M�$���L�iZ�`qo',¯��{{{������G����h8����Db<��a&K~��l����V-����!ua��=A�ª�W��K�n+�:�_�$/ +���:�j5n+� �9���R)�9ɵ� V3/�j��0V�%�R%�U�(�B�)^$��9ͽ�'LV%���擷͒�_�X�]�&w��d��AEN�M��/�j�TV#-/�f�o)��p��tf��:�uM�[*c���6V�aY�a�=(wT�Ϋ�i�-�վ�V���o�WW `�*!�2T1��_�ĝ�2�Y]��������Ⱂ�A��'Z�9�-�F�8 �!v����]B�<(���sg���T�V������4e�JCY�$�$�+�X3Q���B�+[���c,�W�qٕy�BhC�R!k���;v�g߾��z����?����~�ę��.^�r����w�=�-��b��K�z�Z��B�����oܸ�����N�Z\^;��������ڱ��u�+�-£K+�=r�A�~����w���x�;��w���귿���/�{��G9eʥED�&I��, 1��JS�{�N�?�@�<h�r9� +�y�ȱ�/^�v��ݓ���05;�ʌ��CcQhl8���_Q�����:� V$O��E�/D��\Xq��;%��l +D�������g'k�)�r�$5�i����|2C��'��$�54�������֖Ɩ���M ͍M��&�+_{��-hB��"����Ξ��l�""��Q��{2�L�ә���|�0�Z���E8K�Ԝ��)~M�X�̔U����*cwq*U],��R"U���%��N�f7TW�l���`�d=�P<�ܻ.T�%�R�R%��dh +G�(�2� ��FI��*��2X>�ězn�n*��(@���,�#��TbBF�"�Q��������:���=�;�U� +,�8�뤉L�#}2�(T�0k�)�'�������jyTm�I��ni8-����*=�E��)+~f��@),�ȋ�=�:���([������%#UKO����A�����`�eXj�O�)��+i���,&��h���]�xU)�Q����)F n�5C:�ЖE�WR1����$Z\���S%�B���\��v�j2`7LC�vuD�۶o۾s��=���?p�С��}����걓�Ex��u�E�L�OX�b�b),�"|BZ�w�=�|��gέ����*i���/,��_~��U��x�;��w������/~�\��?���_y�����_���ԩ���=A���O�k���'����*|�ٻ�-���_�u������?X6����x2=�Bc#��P 8��P$�Ƣ�H�",�E��OP�;�a �E��B���UF��d�2t��d1�X�@�>�D�a�ᬰ`��!�D�ұDr"X�$�������hj�5�{cK3�`�������K{'X�;���a������ �����"�Ţ�J�br���T*�s�ٹ)HU�V`�&��<����Y�Ph�eVG�vI�x�O�fu��E<�� OL10���Ɵz� +��T�T�� �Q ���� ���!$U�!T�S���!��z�*����5n\���o���p�vɠTI6}r��tWʨ�Bax�!�zA�n!��ݤ?XY��ۂ���TN��x7*+Jsw +��2�d��W�S�&~G���AmA����VyS�P�J�dPJ��K2�>��P˔:)�:ү._W]��ASvM�������c1[�(wҤ��ג�+�f�l9,ȳR|�PZ�i4�@�Km��b����w��A�g���-���WL�nӎa��.�[�1��M� r߾D�{��;p�C���х��c'a��"�o߾KZ��>���}��`���;?��s�Ex����>X^;&Z�+�r__\�!a�8y�����K��6��w���x�;�y�Ϸ^}�ŗ_��w�� �ʧq�Fޞ� �<���ꄯ�<�EG��B�k����Y8u����7����؉S�]-i��ly"�Gb���?8���0i��v ��.wί���DDX�_�D�0�J�I^A�JF���"_L��!EX�9R!���<�X3sd�p&�|2�s^�Y��2��k�{C3�W�,��j���6 +��:;��ۻ��{{�K�� �������H4�O�a���'3��d�HDXP!,�@����@R:sa͕�b�v!`����?<^��v�ʈ8I �h�J�Qr��rMgP^t]��$���1a麬 +QQN��e@����T��|�q@�� �z+����B",��*!jT�Q+~10�o�wu�,�& +��5Ѧ��ݳ����W�֧ &ĸ.y�����{�gd�e"����*��"�e������X*e���DY���ɰ�ǐ�K1��� j�a�����Jyk�nY�_]���+-�2�R�&GI�ه:��HQ�͈.:�X�����"�:�c:w�(�*�!ȇE�Um��b�:��[��`�% �!�V6h�ؕn��m�t���[�U) ��ފ��-���� �4i"�6Κg,fz��l�2�e�V"r�I[���y��#�+kοngΞ�t�ʍ��ܹS����Ϲ����/E +�sa-�ǟ��[���]p^di��W��a�[�",�Exdq��;�?��w���x�;��w����� �����_�����x������"6Vn�t�ܕhV��`>�b.�|�`+h��v��;����_�r�����n�ڻjv��[S3��d&<�jh808�b���XV���X���a%�KHX�l�0�d]�q������W��s��䒀� +i�R��%�X��K���a1��'�`����?�`�����5@*���Z��[}��6zi�ho��h#���.�)�==Ԃ-�!�? +�F��b����x2�H���L*�#Xũ��`����!�ŲU��Y��5.,�z��bZXl�\��@�U�se���J�4�Q+���ү��s��ߧ��u��0M�X�4�Օ8�I���ꪒ&+�&���V&2V�R��w�jb]h�O�")���Eg�_JBVu�z�`�<�,G��� ++�Ь��qz�#��4�j�)Vs�v*����SV�.���TrMJ�N��cd�&��G�#r���"K�F���gT���P����B�=�AB*v�%Q6D�*S�fuS�#��"U6#K�X���|�����%ڂp�ar~%*��M�A�4:%�T���/��Y��Πn �$��"�EY�oh� B���-)ig�,�-(��S�� �_UD�� ���Yvu��f���{Ͼ�������>��Z��.^�J[�>��ѣGO�<�"�/���k��s�"t����sk�N,,�]Z]\!"��㋫��k�"\\^^]�����ޟ7��w���x�;�y^ϫ���K�z�o'4:��TNY̲2`^\\-B�{� _�/Y��Z���L.�ͱ��^�q�����?˝����s�5=W�HfB���@h`hdp�?0���H�D�c�%8"�p�����EEXb�P ��]�`�� U��!B¯��=ME��)%�E(#W<�5I�W$�5�#X��P/�`uu����Ƚ������D�ZZZi��������~��ݽ�=}}����C�EC�D���a�F�r4�5�'kj�o�q0U�I*��t����\�6u�B7�G]���2J� A���]F�s�H@ k�ۂ|(P�]���db�iu�R���≮��������rܡ)}@)�����P��Z�ŝI:�i�i<m�όc�-��֡Q��z�\���g��I�X��TX�;4eZ^Y��D���B$eJ�YeCS�X�{�"�E/K�%��$�r��$<.'u� ^/��Rіi!��d!% +�T����@��S8�]�u�k�5���|VB��2Q�.�����^�p� +*%-�%�5�gר��*���m�b+�9+R�eڦ�Ȓ���O�-�WTWE_SB-���X�P�i[��c�੪p��6�/����A���l�'�U�rA�� ��;w��[��}���`�p���><����E��C�`��h��X��'�"|t�����<}�Wb�p���ڱ%�ExdaDX�ǝ�s�Y��x�;��w���<���K��������K/�����������;=��1*>P��˂!��ޣ� e�+���L6���g��?���v�¥�w�ݼ}��3�0=�Hg�fː�Je���`��p��p��H����FBc`���V4�9�W��[!�V�����Iݩȝ�f'ҹd&�"X0D"wƯ���}�YƯ&�3t��F��+��{�ڻ�[;:�����L�USS�Ϲ����W��D�C��EH"X�E8<"w�`E������D +Z��t���s�B�8]��)��N�1�%�V%w\��\�<GIW��ZD*u��#��BXB�+ŵ���@^P�Cf�9V9$-?M��H�O�uX"�Tr{�t1�'�����Bu�,�l�*Qg��A��]<=E�L:�W��z=u�^��6=��W���&�� t&�|�N���T�+���"�](�z�V�:5�A��g�$����eJ�a�������7%���5�RTNѓ��� <J=)/������Q�����>;�b��RY+Q�)����YXY| P��j����a᪠ W�1 T���I���VDi���M@eU��-,X\ێ�W(LE������n)�J4y��j"iӼW��B�}$�UL�.Y��_��y��'P�2�i˦-۶l��=��8x��;�wdie�����"�|�v���Z���-�/�!����姟~NZ�_�q�������������2iB��Y9��|ti� Kο�|����w���x�;��w���Ͽ������o}���P�F��9<A��X�I��N�V._��+ՂE �\�JO$�vu�[o��~�ԥ+ל?�Ϟ�`��t.�H�� +�s�D��@��P��`��P����TGB�#T�> �E�+��"�8��#Ir�)�$�ƥ�ݦ�+���$�9��Je����9�R��� ,0�S���rV"X�����k��jikklkm�5C�����kj������UkGvv�-Bpa�wuuvwC�p`����P0< +"�hV���L��#��ũ��X�Iӳ�V�1G��rL�<G�ݦw\�+�Lw �Y:7V�5�% [�Y�c��TQ%���ڐC�j4���XBN����$�R�~ +��@4��dJAOwI��Xa��>C��R�z�ݨ۪����E��]Jƴj�<�z��|5�-���(�H�<;|��UD&G�����-��]�> ��x�^�j��tN`lUW�&Ejw�T��a!���n&2L$���L��me�����0�-v�4�[%�Ur����䐟Ld���Zu��l�1����I�"!MRџ�߃�V�h ��dE���VWl���$Q��n�HiE����z��2/h�{L$��VvJ����7+l�ж��(�ɛ�A��2I����,�(�����JuSu��-۶o����{��?x��;�9���~��i�"�|���[w��{��Ǐ=~�D��!GX�宴�^����W�Z"km�D��W�������_������'�6��w���x�;�y�Λ7:��o���/�������M���>`��)���1�r���V�0����ה�$�;�۶s��G�N�����;w�����dq:�ˇƢ��b�0�'��сa� �^�W��;CX�"�V��0���"a<��,N��VI�{��ȅ�� ��~5Y$),�*�p��RX�b�i�ɩ�l���L<�Ckl���������ƍ�M� �`YĂ�\�� vww���@kpxxhxx$���#��x<611AE�,�"�OBk�05=537-�U�)�xމ�#I�J�l�UK�b����Z��"mŒT�\ g�b\��v!�N�\,���J�*N�$(����OQ��!��8e*ߒ)�-T����b�2]�v@.Np�Y��zz�����ܕ��@�v���K���չ�\�w8�dZ��빰\xJt��5 +�r�5�4k�Q���DOY�C�A'�N7�2T��1��(%%��0asc.Y4�����(�A2+�1��zM�O���W�O盀��'p��0,�e���D4Lt�c��2����˲t��]���*%�y*��4S>`�H�ؕ��U��U�c(� �l�EB(� ��D���������d���� +S��Je��RTm�+�̊J�X�Z�ny���[wlݾc={��?�&���+��O�-��b��㇏?a,�E�EX�E��'�|��Ǐn߹-�S��[\Z=�����",�����"�?l���x�;��w��|��}��/���+��ΐߟ�İ +\)�vz�Ρ� �-���s�L����D2�+w�ٷ��r���oz���Ɲ�es�`(��er�H|b$��������$��@HD����s G��R��X �rr�-B�Wq �D��l�;�a1�E"Xn��),B� +�a9�L�L�!B�Y�l�y5b��C}���}��"C�Ă�������B���Va���;:;�"aGgWWwOOO_o�@������p ��ccc�8D���E[�T�^(����,EX4%��Ig�3\������]�����E���� + ��d��y5��*�*θȷ�2`�P��F�A�H����dYO�2'�aԶ��B����MW���5pUP���>����Wjq�*���>.�Rؔ� +��x�T���s��A��(�Ba��T5�( �l��3M�m��8e*5=��� +���J]٨�����i��S�Gڊ�Ju���ӐBJ�*p�*ĩ,�L�j�]�k���H�a�P�ʲ��bv���^�D��� +4m�l���3����̊��dIP���Y�-�y����8t���R�P:�b!��5��/�;��D��jUP,Zla�B��4)����W6��W��[�n}����w�g��o|��]\^=q����Ex��;w�?x�-B�����"��经?y���7o�;�X�.,��-��4����zxayqe��Y�^�|����;��w���x�;��iljr��^x饗_y�/!�U³�u�VR�.���t���0�Je����^�'�%}ϾK+kΟ���?���x#�q�20<O$���Xl���3�������30�?420� �"kG�Fc�4�E�X"rw.L��+����`�E�ѹ�Q�D��KG���� Oal�-�ӬE�-N��a� FG��ށ�Ξ�֎�����jnnhjl�!�Vʯ@��D���� �.2D�C-X��C~�H0H#X�X�d���-�rY�`�_��4�`�� G͖5�}��2.fqG>v]��������u����#u7�k��bKR&�:��?�а��K�\V+�����M@T-��?�����Ӎ:���:�s�^����sa��3�X�K|6�Aj�I��-����TR^�:��pP�������X~��w�>��z��g���1��I��<��"FJ@�~6�rW���e�2�J �GY� '��L��R����s�����4e1�:z���4?�b��0��=A���8��g0%#EB���,�(8w^��?�- �@X6�K�����@���B��/�QH�VGO�NhKHe�WfY��@[�n�U<;(��A�����H�"7*�M�jն �"�JU>�5 ��u�uӖm[w�ܱ����o������.���-��\�~���E���"�"X�DX_~-��>||���9�C�W�W���N�s��G����8��?��kz�;��w���x��<���^|��W���\�(��5������4�]e��,�W�d:͒W�_E��=����c.]�u���ʚ� +c�xh,��7����hd`��]�}ݽ��Ź�30�,*r9�"�,����-B�Fd"���d�V\��t� +�_�az� f�ȝ ,��"+�\�3Y���D8 ��GF�H�G"X -0D�����cw�`��sio��"����Ξ�n:D8008<<����}ll, +��D����/���(� +S��Lq���hK�)��8�"8�,�iLK+�IA �����+�W�t.i� �����춬3�z s$�D��VfU�\� �ő��ˣ^� �ew ��a�]�U��������x��#���g����%�+��l�0��cF�q���nZ�.�µ0�R[xJٰ��h��v$3���p.K���Nz������7���j-����b��F�����R!��6�����ʌKU1�a�!���#K�wd�@Y34me7PX��KY� Κq�PK��x�ʐJv�'h3�%ʃ�\Ʉ�L��dI��]q#�_q%�'N�5YOЮVE�J���J�b~EF�T ˲���"�زN(�gV���fbĚ�[�r���\�`�ڴy��o۱s��{�|���W���Ë�^�~�i>|���Od��7����"|��GY���g�W �Z\Y~ul� ����Ë���֎{�x�;��w���x�9>#~�7^x�W����3��T�<v[�%����Ru�����]�J����R��W�dlb"�H��[���ڱ���\�z�־��h46vt����H0�?<���K|=�]=}��}�� �5�|k��-���p(LSXĊ� V,>J���1@X$����!� �Wl�0-B�Ţ�+ʯ(�Jf&S�|��I.,5#/<Ѭlq:E#X����tt�D�:���[}�4����� �vN��a��t�V���������H �Ccc�x<:�#X�L*C"X��$��g�3s�9�`�n`I�&+��ũ.[�$����bRP�]q�V��]dLwc(�mʋJOI�e�ҟh�WP��%�V]����G�+ju���`S�:�LBK�L�U���6!om>�U�� ۮx����X5|���v��I��,��P�KX��Y�v�O(c��,��a��U8 ��$���e���&Tn�93h�b�P�}-W�� ����F��eY@ih�O�qX�<�%eSH�.���߂��ej��͘Ҡ�R[t����}[�,)�2Yˏ��)BQ%EX�PQD�"U�KhW +#��v��5���Y,�K(2Z�]A=DĸتRE�� +�ش����]I[�pd�-B��R�e�S��+&kR'<�~Se~�b��x�p��m�e��;v�����Co���{��,.�Q�;is�ރ�-����W4�Ŷ�Ex����8E���˫����ąE"X��/,A���I�/��z�x�;��w���x�y:�o��\���~��K/�������/_���dA�^MN:�Pl��uB22�ͦI� +�H�-� �j<�$�y){~��Cﭮ�t�t�x���;���p$68�o����G�۽��=}�=��=�uGO/�` �F����aA�F��h|X�$����8X�k�����"LǑԝ7 +3,��#"�D�(��Q����V��NA�`�!�ɉT*2�Eb�P���i� D�_5�Z�Z}��6J��::: |�"XL��#Xa�"��C�@3�4��)� +���TazF�`��A��D҉� r�`II;Ve̲��J�'��cWt2.�� +t�w��Pŏi��8+%,���%A©��`MD��.��ڂ(eh��>i(U���YJ���zR��� �2M�Z�2�'"Lnm8~w�W��R���Y�����m]I��(D��gT�ʆ%�e�6��68���3�}: +k)&s���D��ڝLL�3$����R�%#LR���؎��e�B�K�7Y�S�]Y��g�8���p�J��tŦ%8��.i|UP<Kg����'���6� +(��*>hYB�N��a�H��$�"�@�b�,��Ī�iV���%DU"pEX�V��S`IU�sgU>�%��\�UQˆ6���� ugQ�;O^��R�{�ƴ���lۼm۶�v�glB����ʪl�-Bjr��3�E�"XO���)k>z|���kWo|p����q�V����|�pM��W>8s����;��w���x�;��iok�C��o����_�核�X�j�%���T*���`*�;��D"�HFap|"���7��핵��/^>}��W����h��`sk[gwo��HO�`W/����nr���������"��@p����� �h,LEXd�9u�S~�\XT�F�4�b�Fa�X�E�t~"�G�,d +S*r'w�"��!B��z�39�`A��y�X2�|����p H-X�]���6�_������������\���,X]]��r.}}}������$��G#cc�X��I�"�W�;gf���f�J҂Ŗq��K��+�$-�(yE��HҲ._JW�U�G�6P2[%��l��}2�%�T2s%\RP�QW������߮���d��h�@dYwK�-e���f�R��\!�I:��Zs�Qs�4���:)�����N�_��\/�?��v�RQ���o�Ø���P�ɲ] +�:O�@I�'$��G�oQ���ΠQˠ�=�l����3�g |$=Ꚍ]��G(�łX����ʔ?����gf�(�{�W +�ë��Z�a��+�V�0k W6ECx(дyD�b!+��LrUaMC�X��CƝ,���d�g�8�r>!��+Jv��Z|s�%��l����J����ފ?�� �"�� +���څ�j�� "X�v�صg����<x�mh.����+�n��O?���.�W_|��n~������"<u���ڱ�\��-B�E�|di�؉�_���/���'�?o���x�;��w��<� $�����/��������8=S^��$yElW�0Hm�I���������b��DҢ�j�؇�/�?U���������� �������������niko��t.`�"-�~�`��"��`x��� +!��F�\�>N�i�0I.@�h��X)��JS�5A�W�L��a��P!,f +Ă5=��,��0�{~�8����`a�"X�p4��FFz��I,X�B�kj�57�VkG���+�"�,����1�;�`C�����`�'��c.�!+_�.�@k�E�4R!Ԙ�]�$�RG�ѱ��v +P"#Y4Q��t[ӹ&��}%A�0�2L��*�<�"]w7u7hҌڶ��*��,��z�h�Y�և��)�@KS�RU� �%'� �I�U[ ��Zr�Rl=C9%ۈҗn�����5Q+����JIF�"aH%x�� B&(�&Le�G%Y��6���d�~rL�\?,_S]��y��Y���ߋ�����-K0�GP�� L���r +I�XFK���/�"lWrg��?!���=���X��i�m>ȗ-���+>(BY�q���;q6%��&�ҷ0�>�}*��2�R!�4�Ƚ�<�,�[B�^e��e�X���:�l^d��W�@1p�@�,*��S��u*��6�]����X��l���;v�����z����+�'N��+�nܸ}��}h2��d��*r�/� -�Ǐ�����[��_�t����u�"\�",�ZXr�\]?F�}w���#�;��w���x�;����������o}��o�������\�����*�+���䨪�Ʈ��*�$�j�W�x$>>��'�f��K+kg>����:�Jwtw�:�{���[�::ۻ��k�W����-�m�]�]ݝ������E8�?<�?� ",�`�F�c��+����X�j���u����(!���|��������&ӹ�S�b���!�_�r���`Q��/:�J�3q�`�;�m(����u~4_{[l6C +�,���Y����N�"���� �����������a�? +�"-B�,hf�YʯHkzv���YK��L�,M��4��DJ��f�����d���I_���U�տa��&�L��r��t������J��W<�U'�Us��<Tf���Tʃ�� ��L,<W�S�%U�P�դ���� +h�R�� UҮ���.�z�&ΑLT�3U�e�lVH!8�n�%����~Κ)�AC��W��T��%#R^��*%���=%����$&ҕw�5�i-�bU��Ќ���A�+�N�KS��4.�����L3(�tC�ZE��8㪈�A�gM��gI��[�(Z"���Wbag���r0�c.2_(nW�"�xJ���l^�* +�X�J2.���B%����^����"�%�Xi+���",�ڹP5VuӦ�۶l�N[�{�8�-���u�<v���s.]�v��-�"��c X҂��ܿ����_|�<�ѣ���?�z Z�k�N.����*�`��h.,��^�|����;��w���x�;���Ƌ/����7_|����Ɩ�����U^AU0#2Wtg0��+�(�r��Fc�H$w�?h���GWN�>���G��uu���_57����������kmwn4�¥������� ����������a?�# �-B"X��� ����"a|�x����$|��%�4����Q8NZ�t�Z�D�[��)"�w�Px�G����d�$���M��Q� �����������,X��.�2D�F�i���y;;8��V7�쀰��H�0������'&���� �Igs"r�"t[!�2�FqCD��r->#@%��ǜW�bq�|;7���� �&�e�5C}W�O7�z��gĢ0��ɰ��\>Ln�IK�X�3��M��T�J:�,� +q�/k�<��6ܦ)�m��U�_���smYH�d��9���v�)��>Kd�$�B-<M��ջa)���O�L")�<YW�+=^�Y�V�}B���0Ųإ�Q=����'���P` ������ +�/��q1M�ar;i��9}���rY��ΉS�K�<4%�+�K�xM��$����v��"�EUZ<�%1��B\�m��VU�y�ۂU�l�&v��$��n�e3�e�|�1+¯*�MV�5 +���v 7U7oټu���;��ؽs�����;�Z�-�3g�A����ۢE��S�"���"d[�O?֧��Ν{�._s�1]Y�[�+k+kD侺~�����<E[���w���x�;����w����W_}����g?�NRxE�U�/��x�U{|"�\xm0�D�c�`xԹ��������=|t�؉�o�;���� utumll|�� ollhhiihn�����l���kjm�\VwwGwoWo_w�@��Pl��)� +���a�����a4��J� V�[��(!�b )���S~5��",���a�0 [�E�W���+��L�+[�N�av<�r�"X�`�А���;;�����`5��!�Wt����"�N*����)�������!�`�Bcc�"�C��X�R��峓��Bqrj�0,�`Q~U�D���MX������ Vj�e4�WB5@ĵ�����W���\1�唨 � )�Y�e�����Ϛ4����&�$��rRa]����h��P�QeêM=Ik�E3T��X�5=�����#7�[%\�X�TC�,]����w���<KR!��4��rr�}ݴ����IN� Rd)�G|~�$E�R5[���k�!-yE��x~I�M�l�)'�S�6)?�wB?�(E9���U�������!��]>F8�S)�SU$+�*���FuB^3�E���B̚$tbK�\�n��� �79�2�%_Ģ��<Qd�d�>���>�+���*bh��*�-HV��tK(���b�b1�;Y$��ϝ�"����ٻ֡w�;|tyy�ĩΞ�xL�E�у��E��g��֗_�"X�w?~��Gos���'?X�[�KL�~�n^X>��|��i�_����y�x�;��w���x�9�mm��O��?��?��/�������8=C�U%�2�Le���ǓI:5rɫH<>��#���X�,�3e��3����[\Y�sgskk����666�vÆ�nx㍍ o46��и����Ʀ��F_������������` �����AƯ�c0G8� +\�s���+2)�h"I�X��κ�)��"Rw�"�"a2�K����b:_���a�K^�Ep��� ���R��D:��h,�� +V[G�`Q��5�Z|m,��A���:;�^u����������Ȉ?�G �&@�N63��` +�,�5;MD�|aP�ӌڞ����3�dH{�0��t��N���(��`�n��5%e����?��ͧ�\ �T�QJ +�B�˪�}��z&�t1(���75u��j�QJ��BV%FBj�XJ� ����z|�.n��,���znO�`�]+����<5���`�ڲ0w+�r�\�I�!q����@����� i<J+�߀�َ�>r鯎��ي�������࿈arI�V(�d�?I������b�ؖ���q@�K�Ta��=��wahNH�,W�I�_�B��[�����E�\�g�ؕ-m���'%��EB���c����*+�@���qU�ם�h�p�e� Vٝl��LY6�Y�v���@�57��H�p��{a�-B�"�����.�-��>~(��D���-Bh~r��G�n�<s�������U�����@����..��y,�x�;��w���<����O����|�ş����TZ�Au�mA�3��$�hmp����Ccc��Q(<g檛�:�YXg߰?����K������6lx���_����ܸ�͍o44nظV����������)��ޮ>aQ�5H\�E�q�ǂ�_��� ��;�*����%�� �"�+fĂQBF��<��&-B�����i�BHSX�H"�b:�Ofr�K9o��}�$���������JX��jnmmr��h +����S ,�_��-B*r���Q�"�D��4iNf��\a*O����3$���_Q6e*1$�`��s��fȓT%����l��Ⱦ�=[���,���TM�Ϩk��Wя��\�=Y�� >Q��*Ǫw�@��D�� £XK1��8�5l'HV3�[x�8����)#�:����AUW^�cy&v�[�\�&���j����+J~�g�܂)�,���+#z�k}�����*�Ej�m�����"&S���d�TU�v)Y�'Q#�@w}�H2��˖�?R�Ij�u.~G����[��k�סZ*¯l�E�L��D���)�Ȧ�Y�P�(��W�PA�*J��g�l��4�F�Qa�fE>KI^�ĺ� +�Sժ�fa�u�ӆ��SLrŰ�Ue � +Lű��B���M�e��m�E�s��o���z��E���s.^�v���;�<��,�"T#Xt��I����Gw�t�ک�g���K�E��D[�K�G�/.�?���N�X��w���x�;����qZ|>��?�����?��o������G�S�^������W�����h$���@(4�����2�k��w�?�c�ޑ@���������^���k�op.�ݰ@�o����f���ڨ�������a�"X���Ma��.4�E[��Hȶ�YEƓa�,U`�.!aY�u�'39�� +��b�P�f(�b���Y�fE��ާ�ǧr�8��|Ԟ��Ξ�֎���6(K�B�`�;?#T� +!�vv�{wo/���kxx$�-±h�����d&��|q��"�)�"��+����P�^����`!�����(T-SR�U�[��,��o��X�n�[3e�/��I�˪J]5b�BP��,xe��w"����=S%K&Z⫵�����Z���ID�,�:�+rXH�I�l�A�����w�9Țn"}d�"R��R���WUr �\�4ńG�lە�2L���h�T T*_�pL��DЋwQ�I A�p�>y������F�d�"&�b&+N�t5@�>�)BM2���Z�]6�$%�+��'5=�Hbe�d��@�*6)�CS�~�(}��?�}�м[�w��X6VW�ɬ�U��eq\&_�ۮ*�0�3�U5y���-�x�R5d.� �� �\q�J�ʼx�q[�iBr� +�� V�Q��&���¦�[�l�-�w��G[�����l�����w����㇏�-B�"|Z�"���?a-�/�8-£�+D侶BE�kK���/,�9{����֝;��9��w���x�;�y�����ʷ���^�w��?��'ҙl2EG!pŒW^I�x��H�� +��!`p�?�HΕ�-�w�;xhێ��666vtuu��645����z�5����^��o�� 7lx��7�6657�|Mm�-��m�]==]�,��74<0��K�+��"1h�9B��$�",E��V�4�5��&29�`� +i"��g�0D� I�W����B2�#�"�,_{{S�����l�jnkmnmm���vʯ����ẋ�{����E������(T��9��"Ҙ͒aZ��_�a���� +�s��q�t]NҖ�p����T��U*_��BN��h��f�$���(W� ��z<�ͬ�2`�E�T<[嶩��;W=�����SYX6��u�ꪁ +M�);}�Pٚ�*1ʄBVVm"HE@rP�Kq�[�h�iR�����D^2�d��t^����)w�.�SE)�m5�k�0#2TU��0[%Z��� ����/�n�P wY2ऱ��m$��s{�P=����v�]�E���^ &�����E���&+�ll�O�xS.��mD�.�e?� [�4%e #~5�c_�%�\�eW���(��+�DQ+"��@�(!�c�x�|EF�(�"+�U�_�[UJ�6mپe��E�g/l�����GWa�Z�W�ݸu��=�EHZ��"���E�<��'��|�ƭ��ί��XXZ=�����FZ���-�ŕ���.�x-B�x�;��w���<g���ѹ�Ӵ�}���|�����o66N�4pE�W.x���k��yE�h�Ba(48���P$25;gW7�ܽo��]�H����������6l��o~�����sa�� Ν�������j��5����w�wu ���ᾡ����t�pt�?,ƯH�����!�a�+),ί@ꎃX���.�3�b�0�S�Y�J��`�*�y"r��֨�`������k�¦��MM�H��,XD�E[�$�%Z����=}���EC�D��F ��$-�TD�$�U,��F�JL�Nd�:���VI�,\��uq1���|� +1%�Vi%��&^����Fa*����P��,��U˺�䵌�=A��)�Ʃ�z�8:e����>5&�tԼ�K�3v������p�N)��~�Ն�j$�*h�M=�}Ȋ�Z��Y:N+��i�Si�U'i[��pT �qީ"��)!>�.�U0%3\�*L�xKuIUt$?�E�R1�ś�J���o`Q�J�X�J�!���+��) D�ٔ +�P�JF�*�7c�c���?U��f����RY��^!�U�-�`�[�J�PEX�$�4����k�6�����ZU��<�a�<{��B�W�KH��� +�W[��K��ER[�6�-�-۶o��"Xa���х��c'�ᵛ������� �h>�{���+�"d[�K�E��v̹,��/@�p�����ʺ����g��s���x�;��w���������w��������R�4N^�`���vV����v�^��΅� �FF����^6o۱y�N�Yo466��t���������z�����/�������o~���_{ݹlx�͍����}�p��aO_W_?�#�+�{h4@#Xa�h� e�F�`�F �� >G�w ���gH����_g'as�"r����\q*S(�&Y+:�G�#�P��pWX���{CKcCsSc�[�`��+� ���N"XP!�����FGC��X,����'�)Le��\~�F��g�4�U*�;�)���s��˺�*����~=�� q��E��� W�J<̒u�M��J>@��h��u�7�� VW L�z�¬t%LU��,�����'�F��ba-]ѡ�d�L$SB�6�ʚ0��{����I:dZ���O:�4C��Z-���RE|*��g�&���[~���:.a�P�� +%��X:~.Gg���(��`*}��9�#���I�&Y(݄~.��E�J|Z\���'4z�Jd �%����i����dU�2%�����X�߹���BK%�Fp�5�UAӮ��,[4 �l'�>��4�%�a;�\ټ'Hs\������b�A�<(A��-��ڼu���> �+��H(2W�V����o76oٺuێm�w�������{�]^];q��]�t�ꍛ��ܽ��`�-B5���_|��g�BZ��nC��8l�Y\9���D"X+�Ex���.�;w�������_8��w���x�;�y>N���s���_���ŗ_��w���ܜ���ΫD� ���4yE�U�8�C�Px�T¯��#�\~N�+�[�lO��o6l|�acgOo[G�7���o_��_��o ���_����_���kąE\>_s[;auwtC���g�m���A?D� �E]�H�-����A]��m1J�܈�:!���!r",�"̐!D����j���Xk675���IOR��D&#���ؠ?�30H#XM���"lnj�57�46��|��̀��ڨȝ(�`����ST{a����ί:u~��E��"�D� +�B�05S���&,:DHBVF �"\ߓ-B�2\VvU�n���TH��FU5Q+���C�*�]�]�+��@�l'*'S}��*X��h�Be�OW3Zx�s-��c⦅�8�4��n/bc��e��=ӳ=3�{�3�3�q{���?�H"A���-� +(��!A�JS�HxSH�%�IшF�R���5���"����Jdef%D|�y>ߩ�i����`J���y��X��Y�jJ>FM��KX�c�{^��)W��+5'(h�'�}1w�v�I���)4��?�Y�Nq +���$VS��OԺ� �}�����8�Vi��c�F4)) ��x�J3;q̀d'�w����h��wb-�vZ�نA�@���� Y]@Bb?Se+�mWfR�zumi�Au�O��YlPE] 맢5V�="�<��0�]�Tv=&�S� +��Y�.B���$<=����oʁ!��i��شd3�C�4D�,b��/%�d���G�G��&�'��L�\��_\ZYFb�۸�R�����/_&�"|E@X_~�ճ��E�S����E��0'���=Q�`���8E����U�k���k��ƚ�������#G��O~�����QS[�A,^5��v̼j��4��<5u89������r ��YYᬬ�o��Y����o�����IM;��_P`/>������t���'�u�ɓ'RRN������a:�3slY��ĂUT\T��� +Gq���YYF�k�~�� +X�j6b5B/!��Y�;Zꛕ����� I�������ގ�@���,wR>�]X������BGO�^�M�f�`�jT��+;;Ӗ����_X��,hS��vL�R��� +��:���jj�'��x<���`�jmnkk��l�� ���Wy섂����˫ӯ��[,X^��>�����U:Q�0��%�TkbLV\�q���y�W�p���>#3jP���hL^� +*;��c�rS��z�T��7��6���#�����t1C&����_��@$p�#��v)U�+�U��(X�8_93�d�`^��H�4�qa�MF1���8��f��U 6��S?�ָ�c�r>F���C�i�U~x,9�h�'�����#q:���OSu��A�qIQ����Xd�@�ϊ9��p��XI��Ȇ<���d�B���lˬK w�����B��]1�����N(�ي��%0-�l��mP��+�t�mI +�\���on��yis���RY�ߎ��"$�v�ݢw?%�S4�A��#�c�E8>5==s���������jX��������~��=�"|��/��x]��|� +w�~����^�"��k5E��ǟ\ۿ����S�X��a�{�#�P$n�nc�5�Xc�5�Xc͏ir����/~������[G�d��Z::�((R༪�o����` �^��U�,@�r��.�`�U8 B�rut�\�ty�+v�����>���]X\�����v���SǎNj�} S��u�|:HXY�6���-(�+,*�# ����~,wg���]W���ea�xEYX��u�-:���C�H�P�!E���,$a]@)]}����"�݄�Տ)X����������Z��T�UHqyy��n+(ȲٔϮ,�s E������gD��<�b���؋�����D+*��)O�U�V�mg�j�����F��`]",5!�|pN����M",Mz��`Ŷ^�S~�9+�����#/�fWo��i�pu��g�Y��Q^QU�T�JS��~=�Pd�(Fkb�!U�bBsf�2�B�J���&<H�)�Rx�\BMçk=w�x��z!���6*�I\���dߵ��Il����<���.G�<��5h���`�k���%�}Oې�O������ĨO�ט[dt06a�"�8�O�JAQ�PQZ���PFQ��E�l(O�T����'Fz��(�!�G}䉱�sN�|v����RE$�HyE-�Gc},�/��+T�VjPIbd+u[�g%m'�c ɮ<����>����"�`$�ŕ�e?��3t,�āD�˒�ZE��89(���<4�����BN�v���߸u磻�H�S6E��M~�ݷ4E��Wx�哧_|v��[�E�� +wF�!B]�� C�k7��w�Y)Bk���k���k~$�������/�[������5�M���y�Hb��j�`-8�jܕ.p^�~U ʕ���ΊJ�`5��w�]�����/)+OIK;s�|~�='/���3'O�:v����$e�t�8ƹC)��4�"L?�������k�����ۋ��^V,� +G��� ��r���aVR�j�Q�����Z�-�H�j�H�"�wrVG�ܻ{;z���"�pWք�~�+r�k����E9mS���pU+w[TR�WX�������̌�쬌�,�e� (X��U@�W�v��BX��+{i)�`9�EX�B wOC#t�� @�: +�%B�R�)٤JX$Hx�ӯ4��Ir�:�80��P��=���~Ȣ]�2��1�+����xE�j�}\=��3*W�m����AF/��=-��Ǹ���r�N�bRxҀO"p-�fN#u<�����do���i�cSiX��1/u0v6��E���<�(E�w\rMY���P&Ϊ�9�|�h& H��c\�G�=`^�ȸ�$V��qՁ�$�� 2@-��!���O�2�+�:�3G�5%����8�(��X*�JK� L!��"ҙ��S�2�q��@��WK�_����"��z���A��J=�&e|X�z�(��ԡ�܇�)�_I���������݃��P8�F���SS8E(���vP��v�b�1�[�0���/�Ȃ ��ё���ir_\ZZ[F�[L��!%�����W/������?���g7>��������"�o���pd-�����_r���k���k���͑_��7�|���myyM-�P5���iP�W89XG���*W�lW��*P����^�t�9n������B�ŋ����gϦ��|\Q��s'SS�N�d-X�rOMMMK;����� ���",.& ���� +G��@rW��� .,��~U窫 �Ӡ�Q~��Y���L-XZ�P��Fck[s[GKGgkWOkwO[O_{�Ne���@�X���>`�w`�{'X������J�`! +V~vnn�-;=h�99��0'Y�TV��PAX�_XXh�ۋKK(�ݩ<gd�����Ƚ�����,X�����w��"N�"B��T �噓b���Į J�(��H�c�2�����E2�D��,,� ��Fe2IR�GC�3f*.����Ƃ��My��4�q�9t��i����O�o��F\U�q� o�R��t����6'(�}�[� +z]H��q�n���q�����8^��t������sQ�K�ĝ���1�W Hu�S�x��^�b�H�Z�P���TEΕĻ�|�c�B7�ٷ���>U����*�>NӬq�^�?y���F,-�'�i>F +�4��e Tk�:����-�G]X�kPw��TwB+�s�U�Tr��Y�?���\��_ �'�g� !&�_�ii�/�Ñ�P8�m��]��rEQ�8$(�U�de���+����×��P���G�Ʃknaqyy5��on�\������c�E�R�ԂE��$E� +R�|��r���������pt��� EH�C�(��~磏�_r���k���k��L~A��������#G��O�O����q�C��W`��w�y@���� +k��j�uA`�!�XUU-m�ݽ]}�2srN�����(�+���ޱcG���O" ���S�O��u��"L���������-(�+*� w`��]�U���E���`A����u���&�ݬUb!��6 Vs[t�ao_HX8BHe+~����`�w4�����Y]S�p�KK~���������a��r�➟�ū�B$,*̷�xU�B�����**�g�ܫ�n�ۡ<����&H�VwOw��`]���q����+a �^�!��j�����T �m���.{���JTi�Zu����QJ�=���Dhbe.���j>,,�����L@�Z͟�9� �UF��p�OW��Օ��f8=�ds|:p�|$//F ��kL'[�7Ȅ�8��+B�]�`���L%��k�8Τĉ3��y�X!� U�D/�;����5��t�+��&����F�f�F����r�Q�b�-����4�=m��"�V���i�% �.�3��D+��sjߧӝ͍qCr��GղT +�ds��L%J����D�+P�T�Jf�X�d%��M��©�?��S3��������������FFi$�DE�ypp����O?Gc�p$�F76�߿ ,*^���؈%H�p%#~��%Lw��`��B$a����a ���� MB��Oq������W������˧O�A��6Nn#�H|=�B�`�.��p4��];�?�?n��c�5�Xc�5�Xc͏f~�_����o���-/ߣ�W �p�㪭�����T;�x�+G%Z#�W䮼������������(5 �����܂´s�#�HXǓ���'N��(K��ӧ���u����(Eh˵)�*,̷��^Va/+G8wg���ҋDª��!X����Ƚ��Ќ%,l�-� �W��4�#��?�b�.掮�Ξ���a�.B5E�ū~�_! (X�ݘ��\��Y�����m�Ȃ������������m���|���+�� + +�Kyt��b;*"����@V5�`56 ���My��]ݝ=��}z(KC`Ѡ������*��.E0�j�a�}F�:�4�+Q�ʬPK�i����=����`���[ 25s�<�J�kT�;/I <]TI�Z�O`B�<��k�d��Q�4���*�Z�t�;]�Y���^�R�(Is=��5K6י�L\C�D��éOz�;���kM:��I�41v��d�%H�l(V���$A2Q���c�Z:u���99�O�IL�|��Y:�� ��4Of�H����X���X��|��A|!Ϯ YD��}�r�`H? ���n�R�b�R�-��]�P��_�go���WW�ሲ���K�1P �]Y_�����v( Gc����իp9��R�P6�$ +�%�&TS�/T�B;epa�����0P�&�&&'�ff����/..���侽w��?{�S�/�)��(�[����g�_*�r�7omm�F� X�cH�Z�)B�`���'���]��k���k���k~4�������?�総���~�_�韪k��k=���$�^U��J�_� 0bUT�r�+���V{kGgs[���\��S�)�33��陙'SR����$�_A)!�`���,ү2�eeg"��-� �Ȟ�@�Ee8E,$�R�XX5��HX.$V�B����T�@z �j�V'lh� �N�`u��u��C��X��.�~�%�wЯ�Q�X��Y��s�r3m6$ae*�,[!��/,���{ +��n/&,�������F-E�������������w��g��)B��a}���HM���tn+��$2��T��ꓨ�ݵ���l��W��A����9=j@�8tՠO�`��<ޜ�G��u ��&��P���֩��� +4���8�����,��0�Y$�A����$�4%���tv#&?���.#&(lK!� +eL?��P���ez�[n�-L��H4c�.�1�I�����f*��nM��)Z���Ϡ��Ǩ����4.?� $v��� M�Sd�$3яcR�,櫲-�ݡJV�qʕ���Ŕ2�� +x�U���U�Ԓ@& +��0֎��W�����'O�����Z( Gc�33>�@_Bg��������[���8Pܣ����-`�(Z,�W�+�hw�?� +\�b�R.342:6�$����+3W���� +��m�`���"|��ŗȃ�Y��CB,aA����RS���oll�"@�����Z$��Db���[�G����o;�Xc�5�Xc�5��h[�~��9yy�l����:���rU�v1���\ċUUE,X��r�Xu �-m�-��յuY9��ө�g�r +�����%�<y���w��A�c'��uY�RϜ ���s�Y�9�,��a~��������]��� +g)�]�����^�JXu��^,Ocu=�&ĥ�tѼX�Y8E�%���npa���1�~ʿ� ������B{Oo[WwK{g���U\�<�`edge@a*"V��������"�p/d@�e� a!��]�,�!����������R��ݽ}�/Oq��<>���T�e\S��jr�e�L�5�P�.0(��)�1'��.&�(0D01��d+<j�P�ǣ���(�����A�b4.�%hiht&�7(H<��)�i�?M�����20(���(�&r�*3%G4�>z�:��'�F��H�����,�b�=�(l�}Mf��d� ���| ^�<C�J�*Mb}�Nk,d���)Wzx��O�E9�R��n�x{��bO.h��w��%i+�V���'�YZ/!�jiA�$E�?4<65sHR���PDY�W��W�FF������|������P$�F#�u�e?�bbJ9C8 +�}k�h0�Dc�(����@z�%�O��BEb�@���ԑE�W2�bS�Ef!����8X��f�^�_XXZQ�<���ۿ��m�E�R���P�`��V�`�.�W��B)�'(Ex�Ïv��c����Q�`�6����S��`4���?�Y)Bk���k���k~�SQQ������W��~箫��vW-���~�vDn'�+RAX��+�PVeeuMSKkSK[]Cc����ٳ�RSҳ������O$�:v�Ļǎ��t�(�'�< Vjj +��9�|VvHXy��6/R�[XRRTVF����!E謮uV���u�HXKT�jOү K��M�E��T���V�[�� �W�=:{/v�1BՂu�P�:z���������\�wVW�:�E�������+��2���k˥w���!Z�~U`������ ���Ry�ʷC���z��������Y�z:{z{.\���R?�W`�����B�bC��^�cJ�����?�xcf��R�u�uxJ`�T�<��B=F�b�U�1�)ݠbIf;����uҊK�i?�-|���S�a����(.����ЋE�β�;Ib���7#��J0y�OϪ�Z�x��>�g���>+N�9L�c5�3��{�v�{�y̧� ��GOW,���p�&Q�;�|gs�H_�<ZƗ>�����!�7���x�U�"���HY����~d� ��R�y�J`j�V��f�,�������V|skkgo��������k��+{�&�pà������O?�lvq1���p������������ڎ�֕W� �������:�py���;g�2R�EYGwB.,Y��FB���G�FG�I��������ʚrō����I�.��(���?���������n4�����E�ð'� ++�U�5�Xc�5�Xc�5��h�W�'o�����|33'�����WU.-<��+�e�;����JY�U8*�������Y�>����4[~A�-7�LD���{RN�HNNNMM9}�������-�����^Z^\VQ\�(uT�Y�����q)!V�p���� a�b����@��-*Ƚ��/jL#!����`�6" +V���lDq�����Uүp�Xv;��paqQq���DM"M"VcKK3X�:�������������F�ج�ȴ +����� ��R��L�_��ᠪ>�z�i�K���*���D#���>NE�P�7J��q&��"� � ��DC;�&����}<��+�c�OFl���i�M_+��8T:ӎWb�kF�E�Ⓓ2�Kt�D�?��c�<�{:�FK5����� +�A2I����pfaC��iƋK>1���y�|�}�8��Ȋg��zG&Ya�v����<�3,��v���2*��(���'�������Z�?0����������Gc+��J0�,˫kK+��X\���*���?z�dcg{ai) +�����k��ַvַ���P$��Bp���Eegl}#��cq嫁�Q�S�݂X���Al�¥� R��T�h�؈�����1$a!M�"T>��?���"|�{��� +�ܿ�]��2]�(E�|��KH*o���{��o�on�c��N��(E�a4����Gʏx�z��9�Xc�5�Xc�5���'//OY�������[?{�Ϳ���������c�k 9誮�&��躪 +E]�������,w:���[�[�u������gN�&�� +�������GO��Q�"<v�����rgR��Τ����L���D)B[>J�q�����Q������B ,��^KJ �<U���{ � �~E��ބ\X$NH@�m�H���VG/��b + �-����u�������������A�0uڲ�rl9�\�sH�R)�E�$$)B{,Ÿ��@��*�`������� �����N��w��b��~�`�)��KU�X� �� ֗X;.��!��`�8`���D*"(����m���&�R��kP��SZў����D�&Djݨ$�t�I��D�S�\�Ӱ��J��.>@���D>�����n"Iq��9'\H�_��ƹd���^wf3H���e�SID3ѣ�/�F���/�T�2~R�p���e}��(U�1��tr���TU5�v�� +J:�����h��?��� �~A�b�+��r�+?e"LyE�4PV-�p �v-Q��,��j��Lɠ<su>�����B�P$������:��8�������-,�GX������/����X8�����VH�Z][�_X��redl\�;{��?|��/[�D��hT�!�<Šڵ�A-ĉB��$�_Y��!�n���34:6:�����+���G��{�nܼ}8X�"|���s�"���o�6�`A!�_B��������ݽ����! �Ɩ���=�(�h$���S����O�_x���k���k��q̯����x뭷~��sD���!�+W��`6_�� E`�X�Ve�� E�u�M�� �-����J�*���K>}��{Q��?v���S�N$'�LIA)B��+�q>3+#ǖ�W�,�"�#V�CYJ�RgU +"��,Xn0bU�:B +uGB��Ҡ�ԅՈ#�t݄R�m �m���-�]����m��k�Jq���K�[�(���I�� +��Y�l�Y�➅@X�Y��l����A�_��x�U�����2��r��n�"��7A��1Ƚ����O�`]���+Hj�'5��5�Q�:�d�~��N f�s� ��+�idhW���1����[�9��[�.��O4���Q +�QL[m��^�%c_���hh�v��o<,����!�f�n��Z�����e�9�{��%�^�� B��9��d������}�|����eR�V�Ҍg�dZ�&�t�)���66Nn�V����ST��:[/�_E���^���2�W��DIu[iCz��������pd-ZXX��Tv����GG��'��FFG�1P���>K��?h��������h,�DC���Zpnaq����I��r`�\���_<�~����r,X���O�W�R��A�P�-�2�b �A�ºr!e����HX����`0��ܹ��[w�wy����9J~ )�W�4�F����_}�MR�{�Z��1�=���,X�E����[wk���k���k~$c�ە�ѣIo������o����uj�+!$F,5Hȴ��U�p�a +�Y�Z��^SW��,XɧS�gd����8q�䱤�w�{S�U +%%�4�`�?�$���Y�Y�y9y�r��a������AªDVu�"����Q��CqX�_-˃��]�kY��â)¶������;SDxI�����b{υVHv5��{�[� �55eNL�*���g�l��٨�0��\RD���Z��� B�X�v�0Ž��DYJʱ��D �D*�k�a3�wv�uu,X������BȘ�������{J�Q�0vpOy�ݏ���+�%Y�KM0\>����TԹ*Ķ%�P���ߢk���}�x%�;�̨M���tI4CE��5h( L���o_b���d�'����}f���'SV�dF絝ÁNz�H2y所N�>>� +�;^2M%�x��s�1V�d�D��H`�k��'�S��;9.��T�Cӊ5��J��J�jbs�ȪXL6P�Y�� i�vAf�f"Yc��q)�������C0�Ñ�յ�J��!*(�� +�S襌�Ը%��F=~�����,:Il5���� ��@t��}yppai�X,8�x(��� D��D?�`�QAĶ�r�����@�`[FF���F�'Ƨ��f�^���_\ZY����u�"���}�E���H�]� 뛗_~��ً��?���k�onl���B.,Я�KXʓ��olo�)?�7w��_x���k���k��q̿��o�x뭷�IN=]][W�W�vUSU����{��=�*j�R6��� +@XX�Rw]}C3ؐ�++ӑ+�t* +�+G���S�cǨ���@�:���E��ϟ���)���<�E ���ҢҲ"�*ͪ\�j�P��H�^B�`��CYX ꆻ��M�+,d�6"!����[ۛ���R�}��Ǻ�.Q�T��փ,Xm��m��\u��U\^���`�r2r��%�R�I����܋ +�r�U,\GhG,;ra�UT(�S���j��U[�@�--�E���������E��}�H!��T �h ���U��.p�>��\i%���. �G2����5��x�J����N����ە(1H+6�ǿd���=�OIf|�Q��G��d��'��+C0M<�G�g�&H�%,�̽R���9)ݬO���DY'�RB.�ޅ�ؖ�x�n�ƶ>�O�K�e�n*�J�n$�ؠ�N���M��j������+SAO�kJ��K02���D�k�� W��t&h*��T�ʇ���$B6Y��-���G�FF�#�ʩ.]�1�/���H|s{/����E����08�@QZ��ЏlW`�B.,�V�|-,-?|�h5 +Eb�JEb�S��~�}ac~�����7>���ɓ��%�`�o�CR��W�JhW�@����!"g�x � a� +���a�B�(Y���y���F�&&���5;��P8�$�7o���=x�9�"� +���$,H~��%t����w>v�.�8 ����R��k��J0�؊m�*?�Oj��c�5�Xc�5�Xc�zJJK�uMu�o����o�_����&͂�[i~�JXՔ��+�B�X��Ng���tU�7�4�˓�����3��y��s�'N� ���w���$��N" �tJZZ�YTD��u>3;ӖKA�E��*�{yyqyEIү���-�@#��v�^�*7����x.�VP��Y��������։�[�P!0�.P�c�]�� +�rdkGWs[�����S_US[樴��P�����-;7[��� w�²�,!�`�������@�*����R� ��roA]��]]�}�.�������_`)�zƵ�b�U��; 8��� +��ĪX�$%p�@/�nyu�u�T�Sݤ�Z�XD��i�����T U��IJ�/A�.��ù�t���26�m��}�ț7�I4��T+c�kF�2�TID�2)�3�K�D�W�`db�+��d&:�~L.�'�����%�z���I�@�Z�W����g�2��#�>j�} ^�8���jq���Kd�QX��֚��Ք$�ndY���WY�ON��ίo��M}s{��ʲ?��(�U������b�G"�;�H��d��E'�\�m�H�PEKƬ���7<|8}u6_W�+�s8�'`B;�Qƥ��x��Ï>Z\Y �++���#c�I4���gZ�p%S���2��Z�G!�� �������8���g�^�:?������ĔG�����;L!�"�Faa� +u~� J��᧟=@]�{�t��kc3��j8�ƕX��Xc�5�Xc�5�X�c�?��o~��G~�˓))5�uU.F�~;�:4�;HX�UA�+d�r�������Z��\�p�KO?��z*5���SR0��{@XIǎ%OB)�S)�)ig0�lz�ٌ��l[�-7'R�����(XȂ�AX��P%�Խ����][��u�����W�u *�sݕX�-��������������u^b]X)�������FD����TTU�"��BZD����E-X�r�%�B�AX���*�;*"D ,�"����u{<u �"lim +VgGwwWO_�E�`]��K��)��T~�� �� �Z�D*Վ%��*tZ�ȓ��KuR�0v���*M���J�~%��1���3;�ǪIfJJl��w�K���*1�I։-^C�̛8���>.)�͘*]F��8��I=��N=�ɛHh2cd����!�D/�41�Oyu$+��9�cO�}4�q;q<Р�C�9m� +�����4uKXq�y�� +�R�^�.~(0�v����6���s����[������r0������on-��� +��F�>�����v( G����W}�(0:�������Z�Va�������7��/D��������(J~�=�r������ޝ�������!��d��Jb�K��2_ #/�d?�g���a�f�v`dlxt|tlbKX�"\YYkk�?���=�"|���g�r��I�+\D�{M������������S��p��+EV0�ZQ�k���k���k~�r��u�[?���o���ۺ����Ue ��B�K[���*j��p8]5�M-�RS���I;~�ę��+�Dr�Ѥ�w8։��'�''�:}:�*ae���NϱP�����B�",+)w@�\XX�Rn����nLtV-���(�W����\w�R���nh�4��!�`�!��8 +�EU���m����^�ܢ����.u:��eyEv[>�gg#�;HXX� E1�HXv$�ە5va����UQ�����r��4Ƚ���������^�#,�BH,X&��L���2����&+�E N$08ȼ�۱h0�'��*V�bR�"YI d6T�+W� +Z���2�g��L �6ϲ�n�C\^>)��ʄݝ��m�`2O����a7}�P2o�;L��x?�t��d��3.&S;�W2�ybbKL�q��t۲��fg�u�����t��Md��,%��+Nn��;�E�S�4E�� r���DV7�|�ey����C�H�������5Уb��ԗW��k��PXy�S��4���ާ�m�l#�э�K�"#7 �Hy�P'����@qW}Y�zaiE9U0G��x|%����,̭�*�O�Hk�ʯf� ��X�4�J�S�jH��v�"D,DABr�.�����ٹ��kw�����}]�>z���s�"�1�W�~��v~�{�_A��kH>����"�ۿ���<�x0G]�|�p-����w��~����5�Xc�5�Xc�5?�����˟���/��O�N�t�y��lE�n�b�T�U5� D]�U��Jب���)BD�jj�44�V8����z25�怂�t��ǎ��+�a=~<���'O*��"�3i��J?������V��܂��";X�JP�����IX�J�r�,�jl�r���pXԅE�+e��X�8W�j +����� �j������ގ��Tº���IYc +VW_Gυ6�`u��w4���66W�yU�������s�4 +V�-;@�y��WP���H�� +�Xv{a1 ��UZJ@�.�����Ur]��!E������������}�b_��~D��4�Q܍H�A���a�����4a�K�^A�ha�j��zԠOMJ�ҥf��,�����rΩ,�{��F��L�D�"u���I�w(]g +J�t%�yL3� �DٷD�q�\5J!758� 2�Aur_�.�f�%Y���^��f���4x^�1�>�z���A9��$�ʕ����%Ư��Pi�|��$�^��?�k!�D'��.JF�����`����0쌊e(d#{&;�3Hr`��\8�)������������h�� pRu��]�?���G˫��H$���:E�S�J��~�������'�{����n�ɽ�ss��z|csr�J`xR�*5��`�p6�%���3�v?һ��A�4�:��lW��W�X����F�F�>1=15s��������w���[���_<�,X_!��`%J����H"V(����f8��A��p�����/9�Xc�5�Xc�5��h���Ϗ�⭟���������US��Wn,aᅸ����,XU����+�",��P��46�75�����3�R��Ξ�-(L��>���^ұ��}����= �O�<q��ܑ�ES��X��A��$,�"$)�� +eq�)WtT�)B��rW� ��]W�֮:�c��ê�F�jO����[ꛡ���`����v��E�a�p Y����������̓,X�n�r{���|;�`����d�azNvVX��0�(BXX�)�v;�`)kpa�a��Q�ph��zOcccsKSKkk[[{gwgOOw����߿���*"��7�7�Q�KC6�L�A��� Ut� +��7R^� 2v��Od���`�=�I��whdϘ�;\�2���d�t7`��N�t2��֓WLC3x���rc���L����:����d���>�����_d�R�Aђ^Z�,�Wԅ�dc��( +����A���z�Mf��5������X�IG\y��z?���ZE�"R�D�ٸ�)�&�hGC�SH��C`0<26F;e��P�lc��r����gϞ��B�p$�nl�v����G�K�"֝���<���ɝk���`8�\t|zF���861y��������C�r;��ˠ_Q� +�Q���P� ��/9K����$gɴjP�~/�F_����w��aa��������+@r_Y^ E���;$E��'�"|�H�/1����*a�.�/q����"D]��H<[gS�k���� ����C˅e�5�Xc�5�Xc�{***�7J��կ���[[__U�v! �Z1����k��IA���J:+)���V]Cc��y>3#95�Tj*p���O�>v���ǎ��{cS�II��u"%%9--R�gΜO?��q>3;�f˲�w������RRT�A�",u�uB!X�������*��<�K�rBVm#J� ��HX�=�EV�*a�,���ξ�����֡�����UW�p�J** +�Krs�r����� Y�,e#[�� +p�0���WjaqQX��*Ƚ=j�P��Ur]C��� ����������ۃ,X9�Ȓ�t�h� P��4R�i6P����0/#jEKЊ�ڵD}럐�����n���QW�Ld(1A�P4*?:�Ϥ{�TL(�~|f0vc���3կ �#/ ���T�1��Ktr1��^k�$�����{vHhQ�S&S��K��?�L���K��>�g|¬ �K���ؗ���^��D-Q�#Z{ [&(j�� jm���R,��B|Hy���+݈on��#k���������dյ�������vgO�����O�.*��6w��ã��M *�hxbjfs{w�����7o��pva eA� +�#���tyuurzzdlLT�*TY(�*�D7���_�]i�Ve?F�Ө�Lb����Z=@�fa��?4��ĸrC��ZX\^]>���� n�A)�?~�������W� ���Z�@¢)��>���ݽk��[��z8��k��"����?���[�wk���k���k~���o9��[o��_�uM�Dž�*"X�� �� ��`a����ˡ�ih�onq����奁+%��ټ���YY'���O���H�:v�(֯P�Ib�" �s�8E����o+(�-*�/F.������CY�+]ʢ��Q)!�a���X��:�(t�"�^ud)�F"a�!�`u��濢�.Lq��涎��wP���UV�_Td���*Z������E�y��@�*���+Jq',�Eh/) ���������Y� ����������������ή���=�/�_��j��l���W�?� t��#Ui���5S ��,Z,���Y��C���zFVB��d��&2��4�5hD&�s]G��7t�F����I������C�()_=���+��"�¡'��:���9���@�̮+$P�}�'�'��=�3��&�����P�3��"O�1����l&ʌN%�IFUh2�Z>J�2h>���㟧��X"öB���JF�� �~���A�%��4~�4����/}������J(�Dgfg�C#�y�+���(#��S�����a��u���ɽ�����r��o�Fg�A�R"�����2�����RT6"� d���O�O 015 �D�Ƴ"�+j�R�o(ʲ�خ0� +�(Y�R��X��d?ga_��0�1�����% �����O�OLMM_�2;?�����c�[����ߺu���O������/�! �t�z�-��~�IXR��/>����>��<��H4�G�7��Z$��*˝���p5d�ܭ��k���k��a����?����sD���_����y��بF��f@�j;���r��UIS����Y����23R�N�LIɲ�l��g�$�8�ޱc��ǎ +��N��V-Xg���geA�0/7;//���� +�K�e��r��#�����D�UuyU��U]���]��x�)�J�(TYX�wַ�6�����S�� aub ������.A��T���݇(X�M�����q����+,)��E�6."#VN�-�a �jV�_�#�;�����X���^][뮫��o� ��VB������R���/�P����~%yN�R�{|NP�0�vrv��Pwr�����B���Г�����Ak��ҹ/�%]:O0x��bbnU"�Tb�GM��!��}T�D~*�0?��8:�Lu�L�+�)av��/'su{�3Le$��?�x�2��b�/�1\%����D���I��I�6̿}��J�y�#v������Q���������66�v������'_ZY#�hS���������ݝ_ZV����Y\^ �#s�K���} +��������k�o~p��ε�`4>9sE�������۷�|t�^8S.� +���\������gy58�������k��X���<:>A��R�vE�W��JDQ�h�r�)�ݯګ�W��Jsg�&��F]Ɉ��Q�+�DQ�pdDy\��pzj���չ��嵵H4߆�� E���.¯��)�o^�R�+*a���Ϟ�|�S�7P�0��ĕu[��7Q�0���#�����5��y���k���k������������ٛo��o��%�\n����]�N�r�" w�_!�{���������\���+(L>�����z&-��0,X� Ex�(�܁�u�*"<�|�DrJ��3��+#3=+;3Y��l��� w�bU�:�%L���� +J ]��êq��:�k�����N�� +���,X͞����֦����+��d�8K�,X�ro��njkohi�mht���+����pa�-Æ�������rrss�� ?�����Ă��v�`Ƚ��������D�����Z�ǃ@�����������s��/�,��W��+oDa�,ĒR��f�u2=Ib+ "�����@c`��)��{J�ٽÉU�j?S��=�c��uq<��="{b��������=!TbBv�a�E|}P0��%�W�dq��K + �CL541�Sb�!�"w@"�.�����K�8�:6k���?�����,p�.�sq�.�Y]����ٻy����ͽ��{��ۻ;{�vv����`����k�k����(�5����mlo��r��>V�;�ܸ������[;����j0G6�w��\;�>3;�\q������ٻ��G��F$�"k��r��n߸����[�G���H4�,HDI��*�&��Z��uؖT���8�J�oى��� �}H�� �(WC�d�,Xp����ONLM�\���_\Z^[�������S�"| +)B���q��}��q��շ�n�"��5E�=��r>�"TS���Z$��ll��������_x���k���k��Aϟ�ٟ)�O1�w= M�sE�Z� �*"dUTQ�,X5`�j��o,w8Ϧ���N=�����m��{���%AỌ�u�ԩ�ɧN��NIKKM;s������3������(XD�*������ܡ����Y欂 aeU�˅��@����_�8!�Uԑ� Y��RW�i�.���z�`�7�.�Nd��A)¾�*�/}�����+��w6��z�����pՔ8E%�yE@��VVFVf� $���\���j w��"B;����J+�'����:O���������a�� +V��K�"�>�B(�:��UfP`+u�R�U̻�E�9A��53_}��k�N���̨S��t��?9�8c�`�7��g��C��+����\���M���M�ht�tx�(K�$�'r.&�;R6\Wf's1���X $ .�n�V + +�?h��L7�d6i��$ݢ��|� �ׯ�NY�u�����W����zh-Fk�E"�����������~$�2;'ʁ˃^��$�q3�x(]\Y]Z][^]]Y �C���%�@�/^Y]���[Y[õ����\^����N$�� �U�X�A���H��������� �ZP� 2Yɔ�P�)Q� �+$: aj��,X� +� +�l �eI86��*ꪒp<�1�}����"z�xtht(XSS3W��6;��L���n|p��"|���"��+�E�-V��e��.�/�|��O?{�S�QhT���"���z(_G��B{������=�k���k���k~����7o9��7����������:!tc� +kY�N,XU�����ʊ*B���r�~���r�����>���z���� =+�D�Ǔ�R�G���ɓ�~���u.#�<P�l9yy��B5EXXRZXZJ$� +G�� 8wG#a�FB!D ,�j��D,Я��h�z�V{ HXS�R�-mMm���H�"]�}���O�"Dr�EeC�jhV���������@+"�F���d����������W��P�4Vq1�+**���ʪ�����:O]C�r����vHvt�t���" +�ܑ~u�+X�?��>a�{�Ĥ��| �� #�:�{��$��V�yͺME�.B�.%����ߡ$��K|��%��^�"<��'��%�E�S��C�)�Fd��ӻ�=�I�П��Y ���f��D�:�P��V���ǥ�d]۠���_Q�}�� +dLVl����|p���� �ϕOi�D����7���:�؊�׃�p(YZ]�277933533senaiy5������Z(��{mc{��ܼ ��>904suV9faiinqiqeuayynqqvn~zvV9�������rskg}sK9(T���A�R�E������+W���,��.��-��-.��/.]������JA�����J&<+YU�4G���F`�B��6��k�+��0��UH;ai�b�A�B�,|��e��!������Y�9- u^#]��>{@9X/h�7���.��!qa}���/�z����O>����7ni)�(�# R�`��>����ևw�_x���k���k���NYY�������?������O����y����P��i���� )W�����.�%,s8�*5uOcsm}C���\F:�$�ge���S��0�_��,J�:��S��)���̹�g�䞙���i���',e)(.Q�B��VEEI� A� ��*'8�paa�;Jb٪R٨������)Ba5�557��6���aJv�~�$���¾�����V��R�wVW�V8�0+/7��!B�������k���� +T���fŲ�1ȽD���w��@�.��נa=�`!�{{{g7��.���_�t���K�^��Z>t��Z�����d�_{<�q� ��F����+�XF*{BO��g�ޱ5��(4��G��T���*&�3SID84�vȥy0��Ɠ0��+6�xs��(C�N+��N���d��Xq&a�N0�E�_� s�R�����'3}�(1��+�5��Ki*�� (�oFf�9]����$~����`��7Q�O�\YA�x�Fv����d`��L�\]�����] �B�hl}s-EM�O"A �(K`x�a:B_h}���փ��76+[���(����P`hxxdttl|dl\ـ�!ǔH�f)�J���Z�h�PB�+QS�4�J^!�Jöc�U`���A���W�_ጡ<4B�,��� �డ<4��'�g����/��v죻�"|�HS���$w$a}�-�����5�g�^<���Grm�z|s+�ñp|#�N@�j�0��������o>�Xc�5�Xc�5����/������#?�����?����,X�l��F�VX��+e]�,w8+���Ʀ��F�<��ii�R�SϜ�����<q +,X����E�ǎ?~�����`�J�.³g�p���X�*�e@�E��E��@�%(H��W�b9Q)!qaU� !�*����X����W�����Zp��R��mݽm$E�ϤU��,X=�ʑ�� -��I�VTU)7Y`/V�CVn.fe�gee�+7;�Be),��v��ÃX�*.)� �r��骪t�\��l�jjnjniikk��DE�{.^DE�����V �-,��s��=�Ÿ�D�ddzωҟ-A +ϫL���!�(�Pj�W�L�O����}��u�%�mxUJf�ڼ�$�O�~-!��"j��s�pdt2jP:��tb��+E*ʉ�O�hc|Y�����e�������K�T�2�1&�ޒ_�p3����%+���"�S�߆�O.���T ������&�T�FR`d4_GH4�-.����}{K����?�𣏗W��X<���Ox�R ��t�$�H��H���ke�ML|p��͝ݵPxyu�֝�ǧfp����$En�PjK`@�V!l;6\�u�L`��mhm�C2sBƮ��N��� ����J{�LÁ�Qbʢ8,?�Q����kr|r�Y�aAa$�������m�"���珞<} + +�K ���+D���ߣ �ﱄŀ�>W�w�S��h,_W-X�H���[[������/<�Xc�5�Xc�5��@��t*������/~��7�|��/ �F�`!�;�X�w��FU�0ȝ����UT�B-��ªp��z����9*�gd$���JM������KNK;v�8}�_�+))�ĉ��"<�z��鴔3g�Ξ;s>�\fV:�� �� +�%�",)+*�]�X��,we����KX��Y�5���M]X�_a9,X�M�M͞�ƶ6-E���A$��]��]��:z{[�z���,gMM�`���IX��Y�`!����WH,XȅE��1���n/.++�,��\U555uu������TD������u���A��cY���X�%�����ۦ�z��O� h��S�KL�YrN�0����$��G����lb�,�&�n��#N��%���#�IGj�|&�!��̲)˨Vɼt� b"g|�3ϕ��h�>I���g�#��E��$�R#�HLO}��J^���{�D�_K�L�/�uO����>��L�R?���>A��x}^A����FF�G�##y�c�A����w��A�_4__^���`��GڵD���ܓ�Ϯܘ_Z��o\���|Ή��������90�}Y�DH�R`h|rj%R�x�pd5�âD"��鹿�P�)����V�$6!H����G"��?��2�+Lk'n+�HXD� +0\w�q��Ar����$N��,�� è�pbj@�PE�����D�7�vn}��'��� �/�ܿ�X��7PG���g�����폶w�"���p4��c��p#D����Gw>V~�ܼi��c�5�Xc�5�Xc�t~���������#��'?�����^V^S穂.�Z�ָ+i��W5U.�����r'���U��feq����=�TjZZvn>P�N%MJz���~(X�%%;q�� �JQ����gϜK?��q>+;#ǖ���i;��������²���:BH:��ȈUF�A�GV�K%b9i�KX�T��8wDǪE,�z,a�5�4�2)Br�)�KL��t�^h�F�6�`�"*����Ȃ���̜�,ZD�`���.Bl�B.���`���W�Ky��nr�o�E�-mm���r�"������������Kҫ�T�JI�%�C�}f�*�ȷ���}��_��+���O8�����>�"9��v?�Y��kE�������-�!hɇd�T1��>^c@tڎyN-��f�X|��©["�m�,9�A�����2�Ƈ��KIFw5�ɬ����E���eAf�T� kOX�;�D��,����[�3�I�������\�]eikwo{���������ԴWE꿒��h|���s�K�H,����� +y���ʏ�Q�!�r8}���j0�ƔwH�@��ˢ߯9�C�3Wg��ML͌��������������P4 +%����ܜr!rr�=_�hP�ĵ +�"�j0P��H����� 9A��"��H���q� ~�&R��~�B�Y��W���!d��u�X���~52>161519�$����%�r' �[�?�{��}�rG9B��₄����o�K9J9�ާ�oܼ���F���H<[G)B�`){VC�K����/^��~��k���k���=?��/~���������FP��ԅU�vՠ a �ba����W��E�N0bU��y�ݞ�r�,X�S�SS�gf���>{�؉��=�N;z�5����T���=w6#$,�E����_`��`�������,�2�R�r����.,�vָʝc�;��UR"V���v6y�[Z�H�Y��{)��B�E!D)��"VWSk;�`Uה:1,X�r����Ɂ�͖i��rȽ@�|e/(��Y¢�b�aaViiIyyY��Va ���46b ���(X=�u[�KU�T�3�'���OR�I��nL��>+�IL�)}��u�5�a���[���e��>>d'�Vz�R��N��Ks����^B4��½ѝ�*�HC���د���D���[�X5L�dLD�v�ҙ�3�&��+g03{D.c<`�\4�6��KIe41r��^��~k�|�yI�����}�4O'��|�����O +_�]�ml|pk���{�`�?0;��__�ܺ27/��*YG��_�@|�h8����D���R�`Y(��"��442����;|ev.��quaAXV��Q����o�����n��l�^�ݿ��wmc{7����W����WeHJ"��$ �Ma ��Y����P� ��x��Y�T/I��`����v�>A���U��R�+"a�%��C�E,XPA82����c�E89}ej�ʕ�������G�[;���Ï��� ��|����0�]5b��*_U�}�=�{���������|���aQ���k}��U�k���k��ƚ�����_)����_��ȑ�ӟ���~WT\⮫s�k+�`��X�H�A�s��]�*Q���UF)Xʻ��RϤ�JII=s&;/�|&*"L +Pܱ���$�rG)�T�`�9�v�ܹ�LՂ��0+�nGVY�`9�R�p"�{%hYN�bA)!@�q)!���$Q��+�|��X��� ,�E�R���� +Vkg7M^0�܁�Ջ,X=Ԃ��V���E����b[AAv^n�͆������l�-��s���`a1�ܕ5�����UVV� ,�ۡ|����=���-�ro��l�����s����R����PD(��AA��'��IG/�D��|^��P�\$�U��^?_̔7Q' �Kd�^S�we]Nd�z������$���gn �t��L:�Iԇ�$6���8���D��&pғ�Ø"oT�4X�4$���撦&����1~rK��{���;\��ʠ_� >4z�l�k���+u�+�:�h��@�>������D��>j��S?sr���A�rΩ��1P�>����;{���F8Hk��Z0����*��1�0?@�V��G�ƾ��˥��P4� ���e���Ӊ�R ����������`$���yЅ$b����ml� ��!��E�ו{S6Vւs�cc�l�?��r�z��&�|bXђ(�J�mZ/Ў'P,�vE���(T��lϠ`Ԫ�!\'�9A$Rak����ᰄX{52:�d��щɱɩ���ə1�(߲+W�fg�VVC�¹ܸy��;����C���ŗ��E�X�T��+H*_U�{��чw��^;���W��k�h0��o�+���a�r���������5�Xc�5�?{��Ir�y�?�C���9���Ύ٬q��~<��w�G��P@� +��Jh��L�!H�Тt��UՒ�[������>��Rg�[v 22�C ����^��2ˬ�ZZZ�«���ʫ�����/�uu�`��W@q',����# +��b�U]C#ڠ���������V���ׯ_�~�V^^AqIf� hDx1��ϟ�օK�~�ܯ�^�@��y���ۄ��_\RTZ +a�WUaV ��1����j�7%T�X- -�đE��X�j��XMm g�D-KgwGo_go_O�@��P��X���"��I��5I\X�����1҈��������������(XE��]r�N��aiyY��;x�d�;�EXS)B,a547�������ܡ�܈pbjr����筶E��j�[9z3��#�'N��q�5z�w�Oٟ��jM���s߂I�[����Ƿ�Ӹ�D�����m�AO���( ]�ttvQ���n" �I�g�x+�q��"��ۋ�3��rW;JP��|=�Ν1Q3�($�Y=: Ѯ����][�9����VP�;X�!�EV�iJ�S1��:1vVv^�S�:�="A��)�Jp��X���+����C��|p��,V�vwc�d ���/���@2��%��Tjg7���>"�d�~�$����g��|+�v����%��f�3#���`&F..��g���4�.�XJr��n��C�����v8M$��p4����Hlk;�����x8�֣�:G,Rv� +4=��)����D W�l%�V�Tk�x� +݀�`9��2���颊�D�+l�r�l�ӥ$ +������0�� +�+�^-��/���k�Ѳuݷ�F�Xk�ͭ`8D� ��{�ƛ������S�a}����|�/�P#����M~���|��7�>8<�'w��� +R��)@�Cf3�S��<��s��_���e�Yf�e�Yf��"�`��~M�`UT�X��[�T�;�`Yh���d�74a�������������[�**2��.^�|�Fvai���+W�^��q������Xºx� +�"���)���[y����%D�*-)���V�!���`�v��� �"�ڦ��fY�"M -� +�!b�5A������ѩ��>8BR�4EH�W��ENL ����b�j�V=�`���V.P� EH"��X�*��+E�*��UUKS� �M�---���������?0 w�_�,���P��QA��x��X���ơbぶ3yS�k2Ⱥ���7�@k���fZ��j���E�Δ��R�H��F���v��6F���m�S�pV$η,t� H�3�{`T2Q#"���4M�����n"�t���3�`Z��b�b�w"�F��2/���)������ng�+�ׂu@Q�M��R%2�@�D��D1�+Q�d�wv�{��������9f��~gm��v胏>�{����A<�J�w����Vз��6[������I;�}�q4GD������Q:��wv?��3�7������>.�B�� J�����!�8�L�F�I��C#�:�=.����>���t��l%8TV�D��C�c���R��d�t���.0y@�iAHt*��!�Q��H�_.�N5fH�D�"�wɥ�� !���f��d%Ц�h��C���b���v��eͿ������V����������Zl���� g��F`#�����?>������y�?�䓧�~��_|E���|�U,���W�_������_|��ɳw�}���G;{袄c�r���}zV,aE�o��2�,��2�,��P����h��嗯\��V��cV;mGP�v���J�.�z�`5�v�-��MhchD��Q��x�v���L4r���K�n�ȸt���8��322���KX����u ,X97n��`�{^�����U��W�V�=VT��fa#�a�;చ!B�YXD�"v,paY���$�p���������[���G��GGǩkbftrvD�E8�%����ѱ����������O4�ʚ�R܈�+҈��7"�)BB��!&_U�����UY M �dVm}}CSS��� ���^܈ppxpdtd$,����܈P�N-0`dŅeW��,Aϼ2@N�D��o��t��KU:��9e5ֲzZ�b��x���+�X��}�1$���I�ʡ���F���|G�u��� �Kt�3�����~D=�߮K��m OqR��4YBQ���ª'U��S�7�A36'��sC.��c�(��O��=��=��@���IP�N�Mp�60A�2���U�d,�����{|����`8O��t,�������L�q�f_^Y��/�t,��&���Ȓ��uKV��t>y��[o�� +'�;{�G�x|u}��*P���!Jk��݃C�vɽ���pT�dz�|���JiH�)�R�%�cF�u�bF�VX�pU�b�d���oM��f���ca�YB��f��r�A�\a_���]t{�/v[�=>���/�V��+kk���4���M@]mn�6���m4�hac+�֣�V�։̵�l��K�v���{�����"�'O�}i�/�/!X���8!ߠ��7��7�g�~��G���;G'w�B�81paA�0�S�h������1��mf��c�Yf�e�Yf�e[��կ^y����ॿ�����i��$��\� ,,^�5 ^AGB@����ÒQ}#*���"�ƍ+efg����\�̼p�⹌�ߝ?��/_�+++3(X9�ro����/� jO)4",+/��,�VY5e�W��Wb� +w$$8��:9BX�l�.,ڎ۱Z1�B��#!aa.VKGW[ww[7�` B�,Xcc� aMr���� +�4Ԃ54�C(X��--������%����E�� +�a!X� +�!�`�����,�Λb��Ԁ�R�-��B����P���5<2<:>:>,ڈpqnѺ�dS�+Y����,��؊D���*�1��W��JV�Ĝ���]�V6^�bxڒ�0��*Z��M�zC�wa����JE�P,p:_����4��D�H`�V#�*%#�FaC�����\�!%s��PG�HX|JNݹH�nK>=G'�� ����!`oi�M��3��yv0�3�K��A>9�3���4pu;� Өd,2K���0.2���W���df������?���=�J�b���!��+8)A$��� +�ީ�Vpfnn�fm��v��V�����X<�H��ܽ���k��Ks���m�_]CO�B����0�킂X�1,S�:���N-r�XkH��y�&l�@�U�~�6��.J*�]i,�YH�O��TvAFZ�M1J��رS���$�\ [y�� +:�^���%j}e �V[�A���ۛۡ�Px; �c��X0A+7�BX��X^]�-C�pum#�^�%S;Gǧ��=��XO�=���Ͽ��˯���?�� +Yߠt����~��ǟ<}��������G���v�Xj'����E�%������e�Yf�e�Yf��������� nD��������,K��p���Z��~E���Ȳ�H���� �)BK[X�:��rn^����+����/*�~#;�ҥs8B�{,a] wLq�|������7nd��d�+����UZ^RA)Xh��)B���� +���HR�&E�ֲ�,mą����A!@�[)���~���}@���"�A2�!�W�"VP��j�+���*+�K��n���.*�+*ȇh$կJ�H��#_с)�D�",���zro!VWiD�?8882:<�X��f����A�j#B�Cn�Ń�Dqd�zђ�;9��̈́3�z�������<@[����uo�`Tm�Ogp��ʴ�(;��(��]�>�Ѯ0Ǵ�c�aD#��hW;�q��LLc +�S�5k�mI4�#Jظ3 �Y����;i�^�ӂx���{Gو��nJ +�!:x?�j�F{�#'��yAϮU�̸h�UD���`mQ� �z��� �d�zB��z�y��_8<>��7��A�J�7����E���3��E�N��c�T,����Y*O.��A�7Ec}����4�L�����7ߺ�����I4��G�����r�^<�N�w��mln}L�m��*znm��!#NE ҷT�U$�'��J��WNf��VD���+QYoWY����e� �OhWr�Pֲ.��z�dx;�\I.'�}n��D��+h�W�1�j�V�[���v ���VX���x$���3�C|�|�eP�B����z-@��W1�}uem}3�C�zg�����r��ɳg�>��/>��/��#�/���_}���>���O���އhct�����v�p,��`�#�T,�spt��?�����#���2�,��2�,�^���_���W_��K/���_k�,�$E�]X���XT�" �$�4B@����p��vtc +�����,[��ge���^�v��ŋ�3.��ܹs.\���E�"�;��g�F�7+��6P����UV^R�+$,���� ������$l��!�#$ ,ً�\��Zq���Z��D,�s�M [�zں{;��!E80�74�WC�r'�5b�ք������#�"�����tt6�X��*��K+* +��U�WP���(�F�!,/�!V����T,pa�T���@�-�V��wu������~5��kzrfv�Z�@��,�ɗ���0|(K�-X��'�wh�o�'R��0S��N�SC���<�KM��xZ�Co��ؖt�t��-�s|���f��#K:D ��ν��;|�yC��F�5mvO�Kp���o �<���Y��Y�����F&V��:;�w��ڹ ��(�uJ}��FEA�����D�8��IA7OQ���7� g��8!ԡ +k��M&Paa��1�-,,-=y���~��R;��xb�nw��[������7�y��N�> ��c����ɃG�>z���w���#Q��s������o�J+��R"}����=|����4�H�,O���/�K6���s�7�2=��;!]H�d��% +�KU�D�!(MNL�"�%��E7��,6��X��6%�Tv�hAl%H��J�`�[� +J�Ϡ�p=+�<N��V��o$��U?6\��m�6�6�b��� +�����P$�UP��z���%n(�K���|���&�ڧ��8��[YE; ���������М��w��࣏>~��鳧�>{��g�~���O?���O�<��Ï�~���8:����x>�H<O�&v��c,��l2���(�G�믿6��1�,��2�,��2�����+���o����9-�K�`��B�B�M<Ka�C/B0�v���vt�64�������Kʲrr.^�|�t!�,,�E([��]�~�*���rnf�ܼ �|!,)(-�{y%����U^SSQ[���1������4"�q��Ղ�W���oV���%�#�����"� ��N�` � ��50J@�S$3H�Ă5<154>1�X�������*�k�*��KKI�(XEy����� ��Ҋ�Rl�����)X0@�")����roh����Z�;:��������������������4"$���n�p'ѮRb�`,|��>#RF�x@�q���R�2�yD����o���&�t`"�R%�x�Z�����Î�_�� S�M���V��o@t�j�T�{�a`�r(Ґ"h؍ZL��0$2�vK�߉3���&|�IԽ\T�Z�CyY�+H*F��)R�j�43W\@"��2��x� +�KR�Hԧ&Y]ˆ[�W����J��&&�<�[J��a�N#�h1��F7�$�yvam#��?}��O$S;;G'w��֛��荷v�C�x8� +I`}ss+"�,�:�swmc�j�@����DzĖ$��J$R�JE������6�v;k�c�W��S���������bQT�9o$֔%S�E� PV�d��hS2�JRÃ��Kn)ȃ��l%9mX#۠��t{�pcÕǷ�jV�0V7kɾ�����B�XN84^�ƓQ8oi,�f������GW +������^"�M` +^l��nx�+.�Otމ�ۿ��h{;����{pr�ރ���A����G|��0>A������ƛo������C�XX� +E��T" �8z�xz;�=8|�ͷп���c��c�Yf�e�Yf�e�W-z��o~��+������������7"$�)�]��5YښZZ5DwBq����]�`��Wd�̹z����삒�[y�W3������Gfd�֥���\��%����7��sn�{�v^naa^qq^1�c�;�`ՔW�TTװ)B�EXO��h���j���-uM�"l�[�aV+�bQ�{[GKG'��!E8�;0,������F�ą5D��c�@'�`��������tЈ0?���܋J��aEy�����"�j�Dk@�V}}}cccss��b�`��� ����O�MN�e����Qr-�DB��V��Ͱc�]#j�P�K%X��&'�H4�gu�w��Q�6���}��`�r2�QQQ6-I���<J��ace.�ük_"��Q����������e0+�NpӨUl��\1 +�&Q�E���4Gļs�"��D��KP�QR�'���AAd����;Qx�Ε�[�O���� �������V(M$�)�/һ�齃�ãdz7���n�_rB�;ܻS�zdok���X���K|s�w����˯�B�C0�HFbq�.��h`+�]^��^)�����s���"h�t:�J��c��@RC�x|��յ������ƃہ���F`em �y�jCC �)�M��1XuI=��Pd.N%��l���L�A����qTT�,.�(� �f���K�@�]A����et)�~\[�� ����A� �����B�t�A��'�qp[���٥��>{��0�����;8DwE"���B��fp�6�����G9^4��QA�h�G��w�������������{przow��a3O������v$%m/�d*KE�ã����2�,��2�,�^�������`�˯��o���kYY�ER�m��|EY�*�����P�0�JXh����`�7���efg+?���4�fN��K�3($��/\�x�ҥKW�P� +,X9�"�u� +KX��UVR^A(�@������-X��a]} P���b�{]S��"$��v���E������n������½�e�����&g��N,X��G�`MR���pw�@kwwS[[]c�[iEeQiiAq1�����QTX\\TRRRVZZ^VVQ����e;X��SUU�"������ml�kllljA��HX]=�@��!�ZJ,X8B8?���#�v��]�8H�G����DI��O�Y���m|#< ���Q�Y�:�P���F�=�6�[�9��'}�;�����Din�����q�"��/��«76��Ě�l:��3���D5(�:��_D�Z�1�ʦQo�7��c�5�{k�l���I|,Qи�X��a��x�8���X�j�SK� +h��^ ���',t���V(K��{��Dj}c˷��È$��e���on#�������,��gE� ��uE�9��}�z#v9H^O�<y��;���N*��Ƽ>?�����M�e_��S������D�f�t:�Hn��ٶTaG$X ��F���iЏ�֝tV�1O�R"�{Y�ğJ_��- T?�TSfU�IH�X�DQ`�������(�?�q���ˢ��t{������{�W}h���jucCF�C'AE�;f[�Պ�V�I�wST�:����Y��88:98>A�h���A"��%�Ͱ�\^[��W$�����ѱ��ܖWV7轣��̻�{�Gh'�G�Gh�98<Fk�;�hh����W=~�ȫ��BL� +E����|H@Xf�e�Yf�e�Yf������o_z�4~��cc�E��Z��2�{+��+*ѯZ���Z��ۻ��:�[Zۋ�ʳsr���-X�W�_�p1�܅8�\ѯ.) �+��W2��g�Ȓ-X8EX�_RZXZ��V\N{�UU�W�@/��ZL�Vva�66c��"�ji��YկZ,� ,ڗ�ܱ����a�E826H)XD�R(X���֯ +VWcKkMCcyu5�vaI X�p/¼�bƂU^^��ۉ��C�+�5��ՠ_�F��MM�-K[[[ggGwwwo_��@?���5>5=53;37�բu�jS(�j�.I�:H���HX@��.�t]�x����$��9������ZgLP:���L$(���vI��&}tΡF������w�^2b��7�pY)*�(��d�T#��������|^��������kD�ƌ>v悁��9�.�L� �9���w7p�B��������O��7�D�saiiaq�j��+�(\���������(9�k�P$��ً���5�BǢ�Ę�$� gޝ��o�#�|�?v��`��A�%zG6 �&���f�����ǤkaԌ$��9ղ���t*h]vX�sß6変��q^9l�()� J�e�h��m&�:H)�JR=W2̊�M��KʄI�A� I=����-� +B���U� +p=���IB�4!�U0 Ec8$H�V�"���~zW � ++WG'X�:=89������;�'w�����Cg���v��oy ��+���d�[��-Z�lV�jt�}���յ�F ���I4�%#�d8Gk6���7��W�\n/:@����v8O�F"�%�����1�����g�Yf�e�Yf�e�Y/b�7"�я��+�������eK{����� �#ה� G�#�ZZ����I�`u�64��/���y����[��%%�7s.�+���Α�KX�"��_G�z�`��ɽM,X��K +A�*S��R��c�J�`Ub���8�&�b������֬fP�H�P!�7�wZ:��a� ��FF��ǰ�E\X� +kS��kx�op�����1��Uuu�Ј�4���vaanAAnA~^Q�b��{eE)�1� +p��UU�\a�;֯�jj���A�-��l����������04"���� �D痬J@��~��%,�f����2����|��a� �L*6I���ˎ,.�'o�CI\FO�X��Mg�Ѫ^���� ��H� ���r�*����������K��ȡ�~���ݢR��9$>�u�p0�¡ +\�N$ �J �9xALu[)�c�n u�� +���4VL���D�K�Od1Jւ"�2����P9�9Q�����h���-,Y!['()6�=�(:]�����&8��+��ٹ�%����Eb����P$*H.��4L�*���ȳ�$KhW�<|��X�һhJ�O�� �N�v�������q8���xz'�Jo�$��$�3��JJ�!_��ĥ��iE�X�+Wv�m����:Un�<n]��8��J,�]�坊��,�k!�f��y(� +LJ2�jx���- nR�*�ae+��H` +4+��fu�/��������4���;d ���!�`�w"�D0����^4t��l3��{����֠��<HN7n����V�VV7�W�тϿ������e��uty}�����<%[�b�p<qz�����>3��1�,��2�,��2�����߾�ꫯ����~��V�\� ����C�`5���MQ�,M�ł���[����������7o^��D����vA���W.\���d ���W._��E�u�f�͛7��и]T ��Ң2*a���_U�R�`#�H�TۈAX`�<W ���h!ఀ��+�ba�{��������������^���Ê~ES�$B��(X�z;��Z;��U�@ +VaAna>:�8EXL����R칪�&�i���*Z��"*V �7Ƚ �ܻ����z D8J(XS�Ă5�0�d]�ٱ����%�����d�dez�Y��{�>Ȼ��k��q�uMC:��gYƔ6)�Qrt �t~-Ѡ�F_D-��8n&�MD��)�66p�%�D��z~�|�>n~J�n#i���'X)/ϐ}H�K�8��`�}9T��!hN���TiT�7t{�%&�'9X����u*�F�5t�d���PD�~��6)���9��%���z$�X^]*i�'H�=&_n� ����|������������ʪ :�VA���G'���]��o�ۍΌ�BQ+9�3��������v����鹹��%���'�O�[߹� ����I����Aci�ѣ�V���$n�LV�ouB�����i�X>�CnW��4.b�Ҁ�eɋ��$��v2������py|D����}+ ����jcm�V�F0�i#l�H4�l+p[��ɝD +�VX��ߡ������@�:Ց,^)�1b���$wv��d0�!�W~��Z��֙������陉��I������<�mV;��%qHL �����fG�����-��$�oe}3�&bI��G�p,���5�gF�2�,��2�,��zq�P�~���˯|�?8w!�����F%,�|��@�[.�-$H��6745�76���wt�����7ܺ}�zV��k�n]T +�/]�r.#��܉+�2�b +����kYY�97Ж7rso�����=�������@�%�eU�0�k�kjA��U�"l����H;��&Ņ�\G��P��K�_�� E����?�30�78<0 w�` k�ѯ&�G&���'q#¾������������f�`�aVA X�n�C#BB�*���ʊ���2��Dw�ȏtT�!�����)X]=�=��r�������"�����CnO���_�eN���� ;��x��>�g�JR��Jx���k�m`gcMj[=-r�����S\�=�.�f�cN�Bv�S9l��'ؓtj�VRD3A� ��)�����I��%q�.IJb,RL�7UD5F�Xa��789K�OI�<9d͇��|����kLVl8�Vj����\�i��D����x�Jv7��9Q�x��p���,ɀ)���U�l�D*���P$L�{'w����V����;�{؝%8�l {��%�L�P�UНK$����{������������{�O��?:��t��4���s�=�6ے��ş&KI*���� P�.�sV>F؋%��!���TDu���D.H��dGT�Xh{��#:A�ry��2:ô� ���*������6��G�ِ`<��V���nrw/��������J���N��1�Uw�#^�+A�:�A£�}@`�; �B����E�m���������������(c��S����4��1���h����%���֠����i�.�~�ۿ��9X�n.�aV4NR�����ǏYf�e�Yf�e�Y/h��w���W^}��~��_�uv�!�~ծ�@VS�b�;��ꛚ[,m����h}qi鍛9W33�(*-�+,�r�څ��_̐^D?f����+u-;;�FN��[��U�[X�_)���r�_A#Bق.�!��k�d�X5 @�"F,$l�.,����~UO%,��+�nڋp@�`���,:H����VW_?�C��R��XYSSZQQTRB(���*�F����E(�eU����~U^UE)X55��55uuЋ���[�,��]�]��5482:26>>��y�"\�,�]���2��/��J%*h70\�Lu��7��iP��Ӝ���sgٴO ����sA<���N�D4��9�J�|�w����Q5��'.A�K@~��;bU)d����,��E-q���T��.h�%Arh�& i�Q���Te��<s�<�[���Fv���$��'�*��J�Ai|��� +l=>����� ٩>7��owOr�<^��x�N��E�!��v8z����� �LJA���Q�+����Ar��|��?�(��w�v�v���5�-D�����/;=nMԀ���x��]#7�7�z��f8UÕ���D�8qLvg����.d,U��Ƃ��v�L�RÃ�St�$��9A���,�jM��6���$��mEd�P4����#����0v[�`͊Z��Z�D�������az���h|k;��Z^]w{}����Y=37?9=;>9 ������������ZFk�'�&��'&aLMϢ19=3 N�� ��h�du�<~ �G�"L�p�0�6��,��2�,��2�,�^����~���_���+/����ϝ���Q5�v��"�YjGB����&��F}Sڦ���4"�+ȿ��u����������7��u���Ν��9�`���˗Ѹr���jf�W7o��ͽ ��",-�� +hGXV]SF$,�a=�X�u�!�ܛp��)�C�����_AGBe�&t��"�i�������S�� a �Kaa�jjD�`ɍ�k�~�[�����,��8���6:�|��Ƚ���ʕ.��s�(W$?H$������ں�`5Y,-�r��������% wb� +�m�FIV*CF���Svg�А��Z����~F*P4L���+Ag��R��IW>A0tg��$&��Kx.!���Ǽ)>��CGwL�Jd�u�T%����n��B�:(k}1�A1�RM2�S�%;����T�����{���+��Aɲȋc +�ۡ�X뚪�9؎x�Līg�Ƣӵ��3�@s{���UܛO�"��e%ja��[^��ÏbɄ �Ik�;����6 �����Ç���%9�[s'_��9��.B����/�ܻ���ӻ�4Ӷ��������n�7*wQ�����T���O��$��<%;3mW�r�$'���v��N��d<�̭(P����8�^7��C�G\^ÝA� +@Hp+H�VT���#�$���I*[AAʶ:���Z�v����]uȶ�c99x�X�D�:8��?D�M��v����ۑh ����[^uy}�i����q�P��O����1<:62 +��b�M]��Yc�0��Zc�����鹅%������C�#��~�%B�8z�}l�z㭷�?~�2�,��2�,��zq����W_����J����I4+K�a!Ka�rei%�͖�F�"�-X]m`�j+)����� �넂u����p���!�`]�t�ʕKW��~��u=;;;(X�^�[X�_\L�����ʪRpa�b �+WuhT�v����A�"B@�A�j�kV-Xʲ,dY�aWkWwg_g�@/�"!)�!4�'�&��'d� +"���D��� +V?zy���������YmDXT�� +���KK����B,X���X��TW��T����^�`�jmm��h��V�@�� X�0kbz}��ɒu��Z��T�r�A�����"'���(����ڙ�D��ݮ�bi;�i�Vg�J�atN�F�L6��ܓ�mIE�����1M����(�����~=XT����+<�v�h&��q�h�,��LC�)��i�a(%9T�KRӾ�C�O�T_�/�L�C�;3lb�WxX����I)rHy�Mĝy�����e�H%�����v�~�����E�KI��QJ�ݱh�9����Vzw����v$"�����70y��w#���*mA��YvH��� +L�w(��{*������W����q0A���ä` lr�)Q�:v�x��%�du����d�p�:_�dg�XZ�;�s'#p9�Kh�Yt�Ֆ�X�x�� z�j�_��9��dl���V��� +�`$��"����8q[��v���`[��lu@�V� +� +KU��� <���Wu�e+��;8Fw���Az� �ދ�w1�*��6���[h�߲�B����d��[�����)0_�������(hy|��!c\~ +\ha��������݇�5r��d�U,��H�_c��c�Yf�e�Yf�e�Z��կ� �`}���^�я��������H/���NKGղ�ݽ͂-X�^a�6��� �WͲ�m_��t�� �ƍKW�dߺU\V����q 7"�p Я.^� +��H��jf&z P�n�B����vqq�EXTZN"��UU���~UW����� ��F4j��Шih��F,,X��Eī�&�\�*���Մ �"l��)Bł%���DZk��� +��F�`�����R]__^�r�+,�a1D�JJ������ +�yUYM�+Y������jkѨ����;M�vt�S����70004D@��8HB"��̢�Nb�J↤���6�'+�E#+ٴ*��wl��^SR;��T,]��&��)`mM> �ܡ�M�N|�;5���6��4N�t-�QѵT!K#��! #H�<Z���iF�(�d$�#&�;����XI�_P]7|�9�.j��g4��+Qbϧ��_1�׆E���ј��O�� +/�]��XH���$��+�~�����X,�� �=�?]haiIt�ԣ��l��^����}����4 +� +G"�������E��G'w=~<�0��=�������=�h�F�a��������eu~ ��a��<�{��)��Jn&(Iڄ&պ%��r��r���������� ɇö�x+�n�:��,�Jt��n/����˫��5�*�� '�C�D���d�Ul;�C��ۊ�w�m���`+j�:>8� A&H�<��![�T��O�r�� ���Ajg7�މ�����Ltī��Z��_v�=��(�}v~�W�`��Ě���`5AV#�ql�l�(W�#�Cx@�|rzfn�.J���!t����9�v�ѿ��oR��2�,��2�,��z��QVK{Gka�R�]�E�� +e��0�"l�o����n����2;'����`1�`aֹs��~$*X��]������"��_�[X$�W��!�`UՔ�@�����Ba�� nD��T�*k�-��r���N���hM���hQ,X=�=}�}�r�����NNN�R��iD�6��QVceMm)�`��F�y豰����R��VxU]͆�.�h��������ܛ,��B�wvu����a +���0X��'��57���mLq�P�ѯ�.&�W +��D�Q��9����1&�Y�Iϕ���G�r���Y���6B��쩳BR��I��f%�,$h}�Jg���&^�a��i�O����$m�No��F)6�e����Iԙ�t.N�P�E�1�y�!��f0]h�ۀ��IM5/g�b���j��5!���6��WO��_^['giem���4���^A��o��O���������>x�����������y���-�lV������ɳ��^"WN��~�����^߲�.�n4�;�����"���� ��N� +� +M�~�8U�}/�3�N�:AH���~�JKAAtr�Ŵ+�K肼14t{<�e̶Re+t�l����"m�����(�ڕe+lE�V�Ne+�:�ʕ"[���+�@���rE WG;{�齃��^2�O�c�t$�G ������@pMM���w�.tW,,�f��fg'��~5JT��P�+v��3�,�,^��������,ڭ���P$K�A�Jb�U�%��e�Yf�e�Yf�e[?��/��_��?x����?��?wS�_G�Z�T9�Wz���P�Zꛚ���ۺ��u�M��u��5�`��߸y+��%҈�X�:w�"�`]�|��+W33� ,X�n����."�K +K�T�{5��Dk1�� +Y5�M�aN�!K1_)ABP�p��x�-Ԃ�����K-X}C#� a�}�aM��� L����������f�`U���7",����⢢R"a��VT���+ +ª���_U�TWT�~U�-XuĂ��������ݍS�`�B_a&&��53;�)Xj�����!��X^#ٴ�:�X%�\,ܡϦM��:K�һ��`ױ�:��hi��fylH�u�(=�d�6C�f��R�T��GqY?��E�a�y5I�OI�Ej�].vV�щN��ç�^ǀ�(N�Q�L3C���c�f:�I��'��}: �K�4Zs6D5����Z�J���I�ʗ���;{��~φ7��b ����_]� ��`(O��D:�t���ov9:ɯ��v?z�F"��]\p{|�S�'w���N�%�}w���������l�Q��D>�)JL�R��Ԡ+���d��,;����9-Kr2�u�.�<AݩjYd��K ��J��Y��+�o�J�ß?�qx��\���X����lE: 6��U0��nc�*��c�� �V�Dj7��i�[�)n�Ó��SE��*����(W8'HW��pup�v���O��w�'ӑxxS�X0�"��������چe��_��� +�!�V�������$�<85*ì0�j +�V����e���XĚ%�W��X�EkН6;�d��-�`���U(G�6��Ï?1��1�,��2�,��2�E������g?�98�h/��V4E����������L(XD�V{�����[���������VRQy���������]�~,X����ܹ�_8.�M^�L-X�@����ɾI��a �����[������kji#B̿��� w0ba��Y��\+�"�#��z��Τ�Z�;-`�������a�"'��0ѯ�G҈p(X�a[wwSk[mc�`�����¼�BЯ�i#�r�V� +G�xUM�W�� +��k���뚚�,t]�:������?0�~��L��L�AKub�"BF�´+�� +Y��vw�.7�HE W��J0���p��*�����4I@>�ƶcc�`�4WQ�M�OUu�l�?�Ǐ�������W:�����"K%�n����t�J��e R=�D횳�N8kW��q�p��)ݜ�>�Cu�6�L�Z��g���{]�[o�{�����E�� +Gbo��njgo=��˯����{���{���Ņ�%��A�P�7O����յ'O��})�����_~�'��#�6?��3�ʪ�.02�h (iN� +<wr�< �\V�_Q�_;�� Q���,���6��i�B�t���������\X�ry�.������"[�n�677�h'��P�Va�Z�qH0�L�RiH��l����������N �J �=����]�S�eY� ���� g���lv�F`�6{*�����`(�f� +�K���{�W��CC��y���Z�j��&g�H5�B�'��aL�ON�#^�U,j�����Q*a���153�dw�Ӹ�R+�W�������'O�?~�2�,��2�,��zA�������~�������=���y�ūv� ѽ����+ �7�4����������Q��t�����W�]˼�S\^q�֭��/���8�-X��a��ʕKW�^�̤ ��7��E(XE@�*( +HX���U4E�Z����#�,H�9�a� +:b�����Bq�oim@�������������)Bق560�-X�����r�� +X��[��d +X��n���������������6"������ +�� �~USWW�)X ���@��F�ݽ}��4"$���D��P8Z(�� +��|%� 2�]�v�SAU��|WeS��%�D�Z��A�丙j���ɉ,��1�#N�QN���f����Z�4Z��p.���U]'�h�(zIG8[��pC��#A�IR� +� �Pg�Oؑ(iE�������$8�|��s�lp�� �Zv��e���g�����.J����'O>�%R�~~����S�ϻd�A�Prtٓo6A���N��s{�vA������Ç��t�}З0���'O#����o�s�>4''@i�_�d�C4����~���ʳ�,k��sy'����{C� +��j�E��Eg"�� 4���ʾ��Vkk$��F0G�m�UX �w��j: �lu���1�!xrzt��Vw��Q��l��suJ!W2� +W̾���^G�`�ih+���X��Z�+���o��V��v�ve��/Y���g�prp�U�`yr�������rl�x�(� ��~504������}��W���v4��WA4�Ԏ��Yf�e�Yf�e�Y/�x����/���/��o��ڻ�@�����d i�����ISB�bu4� �h474��vv�ut5[Z�*�2s�!�y��0Ph�¥K�.\���V�f\�|���KW�A�0�R�rn����ܢₒҢ�������R���������B#^�7 @X 8?��X [�F��&U�R�,9Q�ʃ���58L{�+ �)Ղ5>E,X a u�F�ԂU[[VYY\ZZ�whA�WHA�%4BX��W�����B��^�!d$,�`���a�{O_�`A/�ɩ l���_X�����.�/��['(W Ua��%�(.�}����A��T�N6(���T~������5�I%j��\jO��b�wv��|F�������� �I���og��Π�2�]�n�|D#;��laM�vs���ܷ+QN#��pIj"z:Ss~���ɿG����?�⋵�-�Yr��;O�>����+��>�ܷ��`���V�x�0�������X<yz��ɝ{��=�ߏ~��WV<|��{�[���7�|������%�Y�:A�r�u7���N`Y�fũ��_K�vE+3���銜�&w��$P�|2��Q�V+�~��ZY�; n7q'A�Ya{w��� ������;���N��� �Y�H+�ju�����0���˹b W��p�s�`���S�x�Va����=�9�5����;�^)�{C��KV���mnaiv�W�����䌬\�H51=3=3G������<��Yb�R�Z��E�W�#C�c���U6�����+c�oǶ±��(Z��7��������?~�2�,��2�,��z�����P�~������'�`A6���[a�WD�R\X +���҆U,�k�,�YmC����̬,�`�������^�r�\F��ϟ���s8��E��2._��%��2ȝZ���r�r�������Z�*I#Bl��]X���u�!�_�^����F,�am�j����J��4� ��nHv�t���~��/` kh|J�`A#���!ق�?8�3��-�ԐF���!,*�-(�-�ˇa1P�0Ž�|V{�+5<�� +I�BЯ����� c�����8��CC���@�t�fgg�˶h�|;#��`���+�N��9JaLq��@� �OT��9|c5�θ�D%h�+'.��t\)�MH8�;Ī^�����b)نHp� �vVrP�H:�' �ŧ�<cـ%��TFg�Q*�:��� Z��v�4H JN��Ę�����I,�����������HN��E����yglj���.��;{�'w�8$���GI%�oe-O��y��͓�{�p��@�q��≭�v<�~�����ĵ����)��_���]'��N�U\O�aC'�=w������UU�D1C�a�"��@Di(>�8<�������e\_^��������V`3 �mH�l�`�8�V�D +��DzWv[����A��}�YB<���3V+P��ܣ�d�T�\�ʆ+%'xp��Os���N,����h<�9��� �6�<: +���|8'� ���X����s��ٹ������YP��e����6\ML��������������"<.Xѧ7<"dMNc���$&�O����,^ �126>93�`�Kn���F��I�_a��V(Ǣ���7�Yf�e�Yf�e�Y/t�������_���/����o���n��+F�jg������A�jiml��75�76�wu�wv7YZK��o��dfg_�~=��%`����Å�;(�2�g\<O$�+W@��̼��E(�ԂE@��^^*S�ʪ�˪jʪ��� �EHXX��E2��yլ,��D�"BV=zlni��6��7��[:A���a/�`A�pT��WJ#���1�` v��vu5���VEeQii^qQ^Qana�`�S�{y��_�N���m�P:Ƚ?USS__[__���D@�]�==�}}}C������ʟ��E_��KvALSs�_�HX�_Qѯ$�1h꧲��i,��Z�q�����O�q�Q�n�M����В�W�βE=G&�b��-��oI�:�t�'�AO�6�G)c�t�J�i�4Rޜgjk+��P���MS�g19A�*Q> NU��'"��#HΉ��w�{�f� �C� o��}afn�jw�<��>~�XG8���&��������N�܋���9;7���Xh������?������x+�H�[��]>�so3�ַ�u������XS��\Gu�&Mɫ���S�M:y9T{� �Ǒ�$���΅��u�����w�XY��������vr���"[��*��V;���Ǿ`+�*0v���{���Z�D�"�+�.$����#�~�����C�x0� +�[�Opm}s������ Y�%�c���V��3���$���W [a�ZI�)��������9�V�.��d�/,a�mn�d��e����1<:615=�������fp+QīM4�p�و�,��2�,��2ˬ�����_��/���_��_����?�� �vt�*,�e))B�F�`5��6�����V=P��;�zЖ�afvֵ�̬��Ⲳ���yl��� +�:�j��~�jVv&�f +V~Qn!�`����A��������Ꚋ�Z +� ��6"TX� �U���M$E�LYU�lQ$�: +r'YB�C�����[�z{�0�}|(X aa��`` k������҈������8���v�"�/��������2u�� ,���z�1�A� �--�-l������������� �]i,X�euV��i�N�_9�� +��:)�o�<v�d�7 +��C_�8IJ 8� +�!j�n�n����eC}�3�h(�*��Z��mr�F�1�b�3���:����p�uZ�o��sv.=�4���WXwا�5�� Ij(��r4''p�8^�C���~�q������[��ν��OO�<���x���[��Dr����ރ�ӻ�x��_ bq�j���n����w�{?���J�m�z��tݽ�H�ntg�|I~��l�Lяګ$��ip���$�iPLA���(1Og�Ð+"�9]T��!����Ipc��A�RB�X��G�dO�v�;�h�w�w�v����Ah� A�{z�.�L�����8��y���qWAL�:R���̎s�al��G���Vh=��A�ZY��W�-!� �*(�l�d�ia}��05CsS���s53�(W ^��b��"��� 8� ��j��^;�b��jq�>7�83;?5=;61=:N(��T�����[��E7:݁-|z�v��b +�~<88F��?}�����Yf�e�Yf�e�Y/\��?�������_��~��۲ʪ��^��@�ꔵ,j�"Pw��R,XͭmM�ac��������������/���ʹ�L�`�+S��-���@k2��D�fe����۠_A#������� +�V�˽�������d i/B��j�nh��k�xՈY�8K��+j��U��Ź7�u�a+X��d �X��Ǩ��@��d,X#�hK��6B�jVieeQYi~q���B!,)B?���P��a�����X���UY]]US��:�6555�����uvvtww��� �X�fgf�F�����~JBՅE@X��(Y��H�������o�Fٞ�Q��Q+���.eg2MvC���)��9~���H��. cu�l9�y�A�4�S���<cb�N�7�i�5�gτetk�����w�.(V(� k�&�T�2�c��Y:��NC����䓧�sv|/�<��ܹ���E������>���/��-X���lESr���~�_\����;8\^]'\w��Eb�X�*�������XurV+�K�q�.?���fKQ�D��G�e�3 AEO��9>F��t����]^ ���=���B +I��b1�Zœ�D:��I��v�v�v�qH����+meي��l��3�l�� +�ٱr���x��+�Op?�ރ�`"�+�<��7�Ch�8'�� �W�J$�� -�� .Y � +���jff[�pNp�*W�h�������<�xn��`�-��x���g����.{���D�r�$�W����hs�w���',,@`�� ����~528<::����-�6�Щ������f��,��2�,��2ˬ����~���W/��G��O������VTȢ8,��"m +eVGK�_VK}s3X����USߘ���u#�Zffv�͢2�`]�r����?��ºp.#�<�E�q�4"�~�jf&�`����[P�[T����"HV�Q����P�ʫ��ѯ�T�;�T���(��ua�(,l��tu�u�v��w��M��ua�~5����ᑞ������������[�JJ�n����c�VUV�ժ���Y +V���"Y��Z"a567Ƚ������@����#��Ј�*����"X�p#B�4����)By +V�=�z��f�j*Pɔ�YB���!�Z�4G����3T������7)K��b�tV��yfX�����`M�Rkyr�=�)Uerje�U�Ӧ��_I���Jg)]N�@$Γ �I�8&fJ0��B��jE�%��a4�3�Z.��N���_\ +Gco����vIn�M�6�G�>L���_ ����;�ƒ ��a�;� ��ǥ�l���/X�6�V��2�c,��@16b[�{��:+�ifx����P%��u���������W��n+�����l�������4H�h,M(H�Dj'��I��<8�Jm#xG�Z�U+춺{��3�+Bh��ս#�UWG��G'{���jN0��e�h0�� +��������wy��[v���A�}jY�l��e���Z��D�$6\M6�V���|5E��s�s�s��E� �D�����[�L�Ս<���ʺϿ +^/�$,��#�T�8F`�~5B-X����Up��������M�"#m�"��x����,��2�,��2ˬ���W�B�?���~����������]iyEWOo5_�hÃ,�v���-Xˢ�a5��6Z,��- M�m�]h4YZ�*�nܼy-3���뷡�^�/�,a]�p���_ �:��s�o�n��~��(X5eU�ER��4EBa��x��T��,��Z�Mv@��"������b,X�r�������V[{]s3�[YeUQ)X� EX��Q!�`)� +��,�r��-�����^����Ra[kGGG�`�k�P�ff����-XT����I�+Hb�Jva����#��¡rHv���IO���va5GS�Kg�J�٭�Ûⅈ3AO�wixgd��X�����Ig MN��KFy:�2�d|Gz���\��i$�eC?�/}��S�O�fu��J�Q;�Mҩ+psR��^F�ӕ\�M�^#�d�D9�4�d��w��NOCѨ�r[��9��5���nl�һ���6Ap�|:3���lI"�h�啍�-��g�X�E��:�uN�MrvL�I����;�?'�_�qB�S�.�OF�CHpu�V��� +R�E��6��D4��'�L��>�Zb;�����~��d�Vw�?�Cd+y��<W8*����pEZ +���^rg7�ܑs�19'���z�� .�y�+N8��l%Y!'h_X��-R� +}3s�33�ʎ�N�xv�f�$�6\ᐩ �����\y�+�� Z��fpcs;� +l�� �������8]^���������G�� ֯�G�'���dG�������@0D�W�a�����п�����ǏYf�e�Yf�e�Y/h�����_��˯���k����o�!����{E,X����e��U{K+1bA#�&Kkc�Wh��������ge +Vai��۷/_�J�?��wc�y���i-uuwuWb���V�(g�ig=g�Zc��;��w��%u��T�f�$�9�D�ȁ`s��չ��� >>���>����[������B�@���Ѕ����s��o�!D�D���ܜ�|�?�{i",/#X��B���H�D�[ܛ�!|�,�^54C��"&�Z�[�_���&J-��F�,�R�Ǥ�"��Y�S�rǏL@k"X�:�,�`�j�QF�JK����io0TVT� B�`)���(rG�E�B���z�_�E�����i�X�=������`�b�c�'��Ȃ,'Y�)Av�\�Z�P{��,��"����Ϛ'�% �N�H ��7�te�iq >�Λ��N�;���Sr>����zS�>�Q^W�jj��4.w����BF��ّ��>-"�]��j~�U�������/��j�T4���h�O{5R��b����j�l^1�$�.�y�w��>{g����N��P$��L�<y�q���������B�R{�쇎�4��%� (!:eɹ���|�t�K�m�H�y�?��E����%G�����<���I��qc�����@�U$��I��K��J��c�*)O��K��d�;8�?:>8�UJC���!ȭV�z�Ï�c���d~��Vl?����� �uxL���݃��݃͝=v`k���֗�'���*�����?���E��ff�msӀ���>!��(y5�U퐶����՜}~��`g���s���¡p4��X^[^]_]�XKn�'��%�ג[�#+��b�.��r���v� [���?@#c�C#���G�F�����#���P*�+k��^��[���/}�K_�җ�����������|�{o}���*���`���j��X rWܷ����(rV��Ԍ��֞N������"X�r��<(*{���ܛwn�}�Ư�]# �[7oކA�l� ���\��aY�+hB��"X�EXg��7VC��WT$d�����[��erՆ�+�E K�c5���$������A�`�����*�P$���;�����0�pp������ӆ���ƪ����Ҋ�������+ȂUUS�B���Y���E��(��\��������f2u�!�e���A�ã�4�p�f��� ����r�B�?� +�Vl��D��X���T�1�iKy�ߡ��>�� ����t��p��)��ɛ��I Ҝ�Jyu���`�v��@�W��J�5�I�$0� � n����\["ӄ�4��Ӟ����5�)���ć���z��T>�Ӻ�>�|4�K�@LC)}�%�a���;ye�����g+k������� ���Dt)���-��x" �_��Ɩ�{�S؏�<RP�uOSʓ��-c.A+N� +�G��*�"n���{^�R2@��0AP��|�P G@�%�Ub�� +��6�67Al�%���=�´��V$�z����V���V�x�}�Y�~��Ω��w�eOb�'��������í��$Yٓ���Z�/��S��`+��b����0��;��C��[��V�(l'l�~�� +�բs�}�8��G��! F�ѥ�8��\�olol�ln�mm���c���;��-vU��"ѥ@0��B&#X�c�SC#c"�bw�F�Ǧр���7k"����$�国������/���ۿ���ї���/}�K_�����z�K_�|�jf����/��V3䯤��Nh��:w�E���4��������������Un��� + +�* �u��ݷт�BX7o^�u�mDx��ݜ�{���)�UXPX�-X����4TU��*�k+kk�EX_]W���D�EB�ҭh�j�"aK+ű���AV�d��� �#�{k�����d������#XC��#��� +,�`�kj,X��h����V��dln�VM���+��l�����*+ʫ�*�BXUWK�A\a#Xdq������Ɔz���]|�5-X������{/��m�������nw���"�RO7�+,�x��#B��3�v�#O�T �§j�S�fA+n��W��)�I�UҘ��榄4 .-2��N +߸n���Gì$��7����<Jn��t>-:K���5"�dCMEܩ,N~Z�F)>.g���lMu)�`���-�OuqTA/�Ѧ|Ӱ>5��~��}�����fgo��0���p�a��Ӆ�u�rHL�N���������{���PX1�S��� 4]pN¡�����gp�q����G���Մ֨�)^�TXʞ�V��Ĵ`�Xb�O\__[�XO�A�VT�I�[Q� +�씶z�Γ��i+���e�J�����*����U���P��� I�+��Cb��� ��p,��c����)����� +�8�p���c+t[��}f����m��jvv�fpl�� �����*F��X(�ŗ��* �o��������������.ж�r��XJ���(�r���ئmsc��#�?80��j|ljffna�=�F�啥�V�x��������kG_�җ���/}�K_���?��`덷��������ʊ�;-V�迒�����b�ȯ�buv6���v�����e�X[��+kjr����<���AaIiiE�����n]�y��W�n�-Toݾu�."�anA����>*-+*��BX][QS[Q[[U[�-XF�`5"�"�{�܍�-p��˃F^$�WX$$���Jn�v�����m�����#��A��T!$ք8�D��0c���"Xuu���RDH-R����� +DH��1y%��9Ū�c����3�E����������ab_�������ѱ�� ��j�6k��*+�~,��J�`Q���{ߪ���:�����j�=�ӗN��*�J�JJ�8 Z�� +������)���#���o�6�M}�����\H�R6�<j(��I>�W�+��G ;-�DR�V�7���NM���ͩ��m�|_}��X�6O%����(�U�6_:5�bܞlߒЍ����^uT�E�kGLJ'O�v������f?P�vǢӉ!+�v�s�nwBF+�����ٻO�y7_����%�G�EG�X�L�I�8��e�-���Jq�����!4����Of���%�����$�n+1m���fEn�=�mEi���ORJ��=C�d�aV��� Į���'��{O�p��WOO��;<��������������Fbe�$���*���݃�n���W����9��Fl51MUAt[��q� �+.f�[�����b��OS��g�D�e������Bm��������Ҫ�����>ه��G�;���{k����z4��E�3��`�8 +� P` c�������<����Xti%�����\ZYO�^�����B}�K_�җ���/}}�o�y��Ջ����o ye�6[�fK���MJv�b��li7�;h4a������X-�m��2���ji)*-���{����|�`߹�ƭ[o_���k�q�:"���a=xp7'�A^^n�"d�X\RXj(2�s�{M��j���+���� B�Xȯ���ZZ�^�!P,ҹ7�j�:!�,�Q�����v����e�a���,XC�C#\�>61<>5k�G�&&�FQ�N,��G�� b��� ���*l�KbV���+bY5�r.65�k�����if_KwOO�����������"��}��F�=�#,_�ڂbKV` ��/���n��*M+�wjS�+�Ҫ��j!E%�ն���'o�֞G��f���S����UiZl^-�Q���a$���IeB +��)�[���^ +/R<�/��rR*���r}/�5'+N��?���0*��O1��[3=Pq"�K{�=ڔэ�(_��|E���O�����w���������gck{{o�F��O�yww� ��n�#N���dR;��SB'���b+��@A��-H�7U�%���Q\pw�l��� +���h��V���2��$l��*� �j{gkwK��b� +�V'ON���Ƕ�R`�f�Q +��@I�������J� �<����O���<�ݽ��]v��\�� �=�����N�@=A�W�s3���3��Ē ��&ygpb +���[�-��/��1p�t+�n�x�4U0��U��ٗW�+��J�K��.�����Ó���Ьd�n������$7vVV���z���[`�1:>�+��ȯF��&��g���}�@8��/�*"�u�^^��������/}�K_�җ���������~����_���7��������������m�������2�e�2��j2�;���lwu��Ooi飯����~^���E%%����`!��� +� BX7n�����wsr@��*�Q�â�G%���e���� B�`�Ƚ�^�WdqG�4��W���:wJa�D��6J,�W�b� B����A�}��ã��B��� 9�54"�������`��M����M�� ��Ң��b�qa5������X�q$Z�jh�oj�Z�f������;D�Ƨ�!���g�q��[�`ɪ+! Q����_y��㺐f��']�)ͬ7uAIÔ<�\LRwL3�Nz{��,�넠J��q��Q ���tz 2�H�'1��Y��9�R���J)�C���f�! �Q`%_��U +��)��k�&ɏ�P�+���T .��� + +�GN��:�%�<2��P��N\�\4�+��WU�:����)W +) ˧���XޗF���Nׂ���WWג��ɝ�}DX SZZ^�v�.�V�=Av��߱�[E�ߊv~'�t .e1P�P)�������j/5��b��$�i+R�ǖV���]<I>����$�����i�ャ�Cr[�@I�V����V(cG%7?��-J�E��\�b���ώ@�~�D�� +\%7��Po��z+�[��U(��h?��w�<�N��"�Io5�{��X�+���&y� +� �z+���v8=N���A� +�1��a�V쥹l�`�D;w6�v7���!�:��������ұ�:9yw��=����U^!\� +A���^������(W`��A�W�.��~�EB�D4�BK��K���l����җ���/}�K_�����z��7�\�z�ҥ���0uY�k�N�,t�\��[������aj5u���Z�;����^D��Rj0�a�0�a~YEţ����5N!�5��o~�֍۷oݹ-BD�G����� r�V�4����X��:�_A�D�0����v3��T��b�)�DV+"�"aS[G��fZ:����ZzA�-B�`�����I�"��j +��w`���g�X�5ihn�5+�� ����"4�,²�2�`U�TW��]�Wd�hB��b�ȯaaSkkK{{����������A���w48������!��,��#���-b�P�b��a�z:MP���V��),U�&Ua�����B*�Q���tB�y��}��������o~��?��7��rf����/^�x)��Ō�W����������/~�+CE%{��lF M�IM]4x*bJ�C���Tȓʲ|�v>%�J��T4�:ludK���������>����Sa.d���C����Ti�[jBLe�JwYR�O.?*������dϓZ#������Aϕ��60a��72�T}�SxQJ+S>H�K�dS�I�JI�rgPF�nmOQ&����A��ARh�����d_^__Mn������ +�V��7;�;<�?:' >9y��1�� j��V��4!d�����r��\AU W +1�ɓ#� ���� +W;��y�I�'��/�"�@(*B8O��ؗl�V������������m|bz��$�¿�Br�E�d+�� �_���V�p0z+hYƗ�K��ؖ�Ur�0n�nA��Ǯ�^�2W��}��j��dg�}���&{�P8� +,;vT�p������(:gfl����P4KD��_)�Z�[�?u��/}�K_�җ���9X�ӟ^�z5#3����^M}����� -B�Vf����e�,X|"!�+t�#���������N���TU[���aNn��`��W<�ͽy���7�BHSX샷���;X��r���������`�A���j��ja!����)��4���ݧ� y��#lmkD��G�R,BX�Ƚ���� -B+�zaakp|�N�A,�W�Rk`���������^��T]_o��4T`��\���� + W5��u��k0Bm��5�(����2�������]s�������A��<��-X���UADX~K� +�YT!�KŠR'�yO��{����M.ET�#�RieS��Z�;����_�}�����ʾr��Yٗ�7sFf&�������K�6����g�z��3/����~�}�Ox�Ȋ��ZQ� -����(5��Ƞ<�p�_Mf��jR[�R�� ��%�LL�,�+�)�y�ԓu��dJ�$�v��藊&����z�bT2~���V�\�Oi\��)~b +�R�bR�,M�PI8��NWx[~9�O�ULW�������QA����=RPy�r +��H�sG�(�Ul)�%A�δ �e�c�M#� +J���w;<99>y|����S�����8F��A�!�����d��,rr�Ξ�=����Q���ɳ��'��::�=�y��{(f_Þ`bem��V�x0�È�����t�SIWs3��)"WS6�d�����+� N�l�o�ͱϚ�_\��l�bO���h(�k�����ե��Ԥ�&� p�)a�������Ý}�Ch����!$��(����S�W�'��b'���U��|A��3;�853;2>5H������ё��q���/:����ᨖт��W˫�� +�:� +,}�K_�җ���/}��������ͷ|����߸�!�nP`q���o�aY��N),bu�,��6ئ������765�������{p?� �����뿺)����q�֝�=���ˇ�G����U�K**p! ,�V��W�k� � b� +DXu$"a�b����ը�W�"�, %4���inc�h�6uC���?�38�74<0<J,>(�g�'��_���Y��L��VS������PY[k��(1`������,X� �:����A#��kExU��c�,Bn��A��2[�{�a���������$"���]��A�n�T!��+ڒK +e��!�P�K���(�SM�����",U.(M/��Ig��� U?�ɟ���뀧2�����\eefe��vFF!,�Y/]�p��s�_{�ܫ����_z�3����1���/�U)M�I��i+��K����BM�I�R~�~�� �_�W2_�<^�}R=�����Y.U�Q�r�{��G����VC!�7�q��5Q(eS�B���*�䖹���(%�©d�NS��i2r���Vu0e����K��RP=fQ5SR1.��ߕ¸�V����gyIy���!�V�(�/-/-�� �B�$�V� �B%;�VT�?:><z|DI���ۊ��T��d0�̊6��5� g�h���w�}��J�~t�{p�s�b��]�'��ʾO���\o��7�2\o�d?���Yne�����D;�N�̊��i+��cO�V.�� 4�y��wcWa� Fb�X|�����������͝�&��b��w��v���\Q� +n(|����W���qx">�}���^r�{ vv�G{����'�l�c +~526:>51m���.! �#���q�`���Y^�6��*����.��%0��W��/}�K_�җ�������g?�|�Jfv�7�����F����,qC +���o^�[�.wsW����"4��K�ށ� +-M��U5��=�VNaiYYe僼���o_�q�7ׯ��n�Bx�����a�+�[��K �U�JCeeyu ە��`���؈����1� +�A(�����_��������`"as� *����,ޮ>�"����"��8�P������eק���"X�UU���ņ2H���"��X�x����)�U�#X�ڽ���������]j��V�����������${_6=�-Xv'��,)���L'� +�?����I/�J���W *1�D���*U�[��|��^R��P3s�����v���323��ٺ��'++;S�/ed���Zp�R��K.^:w��믟{��k�I����E���?�������E�+���S����̄��-�Rd�R2HBD� ���W�Q���h>1�W��� )F��IcR�ؚ���(bQ�4(L:x�P���iD�x]J�ҭl� �0:��Օ�NV/i���t����`%w�H��6�e�n��R'9�Բz���h~EnMJ[E��R��V++�\]_]Gl�� cw�6���(mERzP�CL���S�Dl��y��Շʆ V~��Ï��/>��\}$��El��g"�l���!����;�������&���[Z���[B`�c���[�=��¢S +\�� +���\ML�Ƨf� ye�y�SH���j��Qo�tS�[�!\�e���t�`�!)��-��� ���x��]\!�:�������c@��O1�uH��o�'nA�jgu ʃ��r qy��0�����ۇ��i�36����_��H|%��E�K �J��/�����O}�K_�җ���/}����|�{���_���Wٛ�k7o���V�+BX�",������(�ej5� Bs}cs���W����܂��������>Y��ݸ�����֭;w�Ex�"� �¢GE���*/G~UE.�������W��qam#D�j�_Ջ +���&�a[Zq.��"D�Q��r��;�;Lh��D�{�}���}��D����'��5<��Q��b�wp��7`�������G�J�ˋpa����7TVT@Mr� +�P"X��l����F�� +aK�`��Kw/ ""����c��r�<T>�B�_�+@S��l{�����f�i]��k>��?O����R��O�L'>����jim��w�����.a�*+W��������`���FaFF�įؓ�z���W^}��/|(�����?4DD(�A}��J)�H��Y��*i��#HGi:3d����ԓ|�'"?����L K�4K×�g�Q��|:)�ݝ������&Ɩ�~��w�'�����o���_q��__EQѯ�Z>�G�OQ�DN���1��,؏�/E j]J�ˀ�`�� +�VP������`�����݃�=( >9z������0I�>�b�w�_�V�z ��>z!b+is��4�K�+�V�A���;��<<恫m�V��7�W��˫ɥ��xb� ���/���F���~'����>z+\M۸̊�+0���V|� b�م�y�¢���n�V_z�����#K�� B� +����ފ��ۀ��vŞ `+�]a� +��<��pL���l#�;��އ���fbe��/�" +���坷;fl��F�&�F�G�Gdž�&Ʀ���Y,,���~u��x0���rd )e������kG_�җ���/}�K_������}P�}㛍--]��(����?v�F,���),3T���a�X:��0�#X9�yw����<'?-X7~}�گ�_{���k@�`��;���"XA�^X������"X���UՆjقŶj!�F��7���-��j1"ȒX��Y,�p�aG3;>�"X1��78202*��Aގ.,�'�V�F��{ۻ,���0(�U�2�`ʊ ��rCEe�� +���A�_��ЖT!d�`�o�"�v���b������}htltbbbzf�f���S,.��������$�B�F�Bn��\M�)��<5Ń���^��d%h"X*��plb��kh�]�H%����ٗ��-#,beq���,����d�d�}�����/�~��k��{�ճ�_~啗_~�������j��4�)��ꌐ�ȱ(mDJ4<�P�,Y��. ���/���_��ꠗۛ>���E��������%��RA�R�T")���% �<Bձ +~��7S���XIsI5F ���RAe�ri�NZt�V���)�/M�R�U��� =����A��ja�PT��]jS�\Q*�EbKT�/��u�[� <�!��J�[��1��[�`��)w[�>v�Պ��^(BV�M�/ԝ���\=W��{�λ��z���S�?�y�������;lv���jt)��p��ӄ���o3�V��L[��gf��}Z&81=�bvv+��f�[�q+�ݹ��r8=��<魨k�BOpy)�������\�0����������;��'f%���#�,vg�G� ��� .��}�76w��^-�D"K�@��D/��A�_�ML��M���=<:1215>m��e�ޝ�.�[�p ŖB�p|9"n�X����ދO�I������/}�K_�җ�~��~��?�V��+�/\��o�6[���{�V+��;�Ȭx������sV'*����;�����[J ����<���7TV=,.�s�� hސ^�u�����nN�}D���D�JJ +K!�U�#X|!�"4A�nD�{W`����i1b�������W���v�b���|!�+�`��6YA�n�����4��,XS�%dQ "�v�vv6���64T��*+K���n(-.++�,DH �Z�\����Q�_�Pº����b5������vt�V_�yk�6�ެ�"Xn�`�����A�� +�s �_��b���i�G��}�j����M�J� ���J���Ǿ������7l�� ��"�����bg��^�\�%�W��u���_y�5_�}�ՙ�_f�����/<*d�&@�җ6U�R�m�O��|��z��4qU�0JF4n�I�">�& ()�y~O�X�ĩ@{�ҹhs_�P��Ro)��)�3�+>-�Q���9�j��G�Z���� 5�F�t���)Y��y* ��+Ck�3�f +\��[���H-E����{}�n��X<O�D���X��������[� �:<><>Al%��>��V<WE�>�4V�VZrE�+U���{Oq���S�VO�y��'�������H(z��H�s��WXty��¢svaqv�.�'�g�[M��j��V�S��$l53�}j�[�'q8=N����3>�/��*[b/��V��Z�\O"�����ޣy�h�:�VGr��P�V{<����"w(�bO�I{swckw����Fb�U("!�r�]���!����x5696939=��v������h ƠE�6�Xbkie�����}�K_�җ���/}}>V4;|��/}��mm]=�"��N�i:!R��.��bm��j7C���������a2�-�0������!X�r�ܿ�++)�����a_�v ,�7o��փwssa� �ŏЂUl(/�!"��������M.����"�ZN���� `���6cK/��ԽMDX\��� +)���`��-®^�` �B�DX�"$~E���'Gy�{`����C�`��׳c.+//1 UZ��U��WU� �_�aª��]X ���"��,*6`,X�"�V�����`� �y�DZ�p�AZ���x0j%�VHJa� +w��.����욁��T�OmhOq��MTR j��N$ V�����Ʌ��������-�+ W"�"~%",e�0CD^T*~u��_���+�����3g^:s�/��/~�}��KǮ�ljJ��ä�̎d£�N���2��F����# ^I��Q���ԖGI�� �/�a���W���%d�"��|FrJ�#���Ҡ6-�Is�~�R^C5�����n�_�aS<@�<ʓ�*Чyr_��H�S$�҈뵑0�1L�LS��Ԏz�,��;^_��U +n�X<���rl�*a+h����͝���=h����Hi��0I�4IP!�� A�(�����)�J������.�D1������;8��?���cǙl����Nb�H|)��Che��VN�[���s��Y\M��Ռ8I�V�g��>Mi+`��Y��¢}ѹ�p��/`+�[EB�J��*z���Y��ַ�7�a��&�����+���h����}`V'��'Ĭ�1{�\��������Kn�&7v�7v�6�`#�b/�^:���p$�"�r{]��Evc�P��jt|z|�6c���;�.vF_�`��#~��K"�J�:a|���������˿���ї���/}�K_������я�n���_��ξx��?�����sw7E�8Ȳt���G�`�t�3�N��l!�Պ"�6�,XfsCSsqiYn~����r�*+��yp�x)D�a�D��#Xd�*��E�"Cyqy�"X��55�d�����UCc�����^�.!E����J��B +�VA����.�,)���e�a�CE�#c rg�,P�><1M-����������Ak_?�\�&�`�56V�֖C-Xee�e(r�����D�{ �z#«���B4�7 �V[���l6[�ݽ}�� �5>6 �ߙٹ9��v����T*D��aK@n�LU��wJ�JzW�w�:�O�Zr���1�_ �i������+�W ��&���寰HHȕȯ�6+�rF&�W���u�Wg_�B��μ�2�μ�������ŁH��)A,��ȼE�dT��/��� +!�:��Y��)q���BQ��R�Sd>J������h��$�t�x��ӗbW�s�����s�#���Zs > �r)�-�O!q-���R�~ړRb1U&ͣ�u�>EQ��c�����d��S�X~��_�oŒ�������"�n[��U<]IpK�ۻ�n����������b���OK%�w [��J[)�Ջ����G/>�?�H��zO� ��>b�w!p��\���z�[RO0���B7�� +�������u{[��ʎn+\I=A�������Br5�z��Y�Zt����}^�[[��bn-�� +������&�d�y��<Rd�(XE�v�#�`?�ٓ�V�<d� +�8?��Z2���^qiy-���/Gb�P$�.b�cN����,�+v�c�ӣ�S���&G'��&m����v�[��Tm��7D$����R�XKR+�^rsG������/}�K_�җ�>O+3;;���/}���m����_������N���c�Dmr��Ƚ>b���aᣜ��;��=*))+���Ͽu����7s����]!�۷o��{99h�*�VQ�⒢2C�*�e��B(Z��_�A��Ej�k�[�W����1����f"�E�m��P¦v",)�����g�V��p?Z�0�%*��a �O��� ¡��`Y �el�VEuuYE����J)��r~E�+v[�h��.wa�"!�W��� MM4���d"��1�51�Y�`-�,t���*����{�(��+�W�PX���J��4!u$Ip ���FU��3�R#(�F����~�!���=W�Y�2�b�2�+DXR�JY!D�u�RF��_���E~uV�W��^z �KgΝ?o���Ė\^_:*�����r-%�ID>5k�+��:[��k�MA�T�)U�IE���{ԁ1��Hgi_K��O����b#R����J�C҉H3��+Mx,5�&5�R���$���)�J�%���V �~{�Gqx)�Q�6q���S�M���A( ���(w[�K|-��L�.��ݭݽ���#�� �}L[�������$���Hb+�!�!+�V���!�~��ODr���>�ق/��(p=�g�zz���!��Ş��`�� �[-�Ė�ñ��������!m��8;g���i+�S� ����?1=��v�V���y"W�v���^t�8��#�Oz��R4���W֩*(b+\�(l{� RUp�T<d�J�0��\�>���[Pf���绹���� ���U4�G��v�1v`���^<}�g�����鐂~tbzd|��Wc��|�|5;�8�p-����r�* +��(n0bA+]:<z������?r��/}�K_�җ���9X?�я�����,x��?���yOOWO/l�W]��J�T!]�ѽ���dnm7�w�;��춡����4���>��r�U�JJ�ܿw��-�_�A�h��u]�`�"�\�`�aI!�+��*+˪��kd�UUW_S���U�8��������ro�",��HuB�YAu���f¢Z��a��������kh�B��df�Y��XYSc`_^^XVF��Pf��+����kl@�OaQ�������a�Fc}�ܛ[�Z��!�e�Z{{A�N��� т5,�d����B��w0�%�{_�� ��[ã�5@ͼ9�XLǯ�E_���M��+W� �u)��W<}�%b+��\�,X�"y;�I� ��,�W�οz���gq��g_9���"���"X/��=��o|cxt��.EH�JL)��G��4�"���I�����J[���*�fk����<��� +H���T���N��x�br�O�|�3cT����oO�'��e@'F��Sp�k�̰�|�|���Rz�� 쑚�>͓��ɬ��t�z��P8���1���jyu2Br� +����`���xI��ɳ�O�b+�A�j�>v"T~��ǿ���í�=A� +*��bO����y��v��ml�^Mn��gg��`$G$����E+�s�Ղmvz����i>C����<�i"Z��z�Ǽݱ��Z$���]���������y�0��z�ɭ���$Qw����J����V��H[�@�jk�V[��;딶�z`ry�U�U$�G��H�(�`��B����_tx���/�f�f�^�qx5�6���i�&3s�v���pį���s���a�����?����/}�K_�җ������ʾr%��巾����6KO«^�E(ű��bwL]��[��C��V��l�nm7U��<*�+(����â���܂���o_�u�W��)�7nܺy���Ww��}���*,�/,zXRR�(CiEX���_�p~E,�_5��X-�[�����w>����h�jk~��[:�)c��"X�"����8��Ckb�Y#��1=(r�0[Z:L�fDH�b��,����r�BXK=A�l�3B{M}]5>������E��f2��]������ᑑ���i�`���A��V�$Z� +�JuBv�W�}�����L�Þ��B%���ZE'D���UN�`lh�ַ��$��W�4[�ʃ��\�UDXW%��|��+ W��22�.^�����ߎ +��8ł֫R�#X_|��K��v�o~���RB>rMJJ}GC�4wR�ԧ�+u��-����K�`�K�I05tR0(_��OÚ�4��됁4N�y��>M%SkS?��x)������/�,�42��p��Xd�k�Z�Ԅ ӁD��^�9=�l�DyI0���±� +/ Bڊcr[�$�]t[?�V��zn+hj�V�����K!+�V��؈�T�������h��y��zL�� ����<A� �`��2�D(���?�^��z�y��c�9� NaO8�4�*���������<A +\��j~qn�z+H[yٕth ��'�E��H����b�s��E�jskO�[�SŶ�T���W������ u�l��XMR� +�VX���������g��[��.v +�Dff���mS�� �W��S�"�������v��m<~�?�F~��J(�g��X@ +b!�Z^M������/}�K_�җ��������?�v��o|#��ۿr�o��aKO��c+N�,�oM]�r�XL]Ve�� ����n����[�� 7�^�CeUai�{��ߺ����@���"�%Z�rH"��b�`�V5�`�Ƚ��@+�b�E�b�P�E��������(��J���WȲ�E�{�Z��^s��G�GF��&�'&q#��d��#c�������NsSk;;$�`UU�V�����a��PQ��ka�½��U}�#l�A��rG�{�ȵ[Z(��7���ۋ"���QD8i�ּ}��X� +!ŨH�.��09�U�P$�[+��:k:A��J��2�R�p�n�i�P�*�����?�|�jf��+j���W�œW�"~E�C�Wx���W�_���뀰^~����WϪ�F�^>�o|���G����H��)�f� +�Ӹ���h�HO��}�Ҿ���H�I�:��>��i����4���ӄ�$��xN�8�s�������,Q���:Btkj��������_�T��Q����>��~pԄ����!, ʓŒ���چ�$�ãV�����' S� +�ճ��K��؊7S���\a�WK#U��� f'r���V�'��ˎv}ckeW��j$������'���^p8��̡�jv�V�0IPjN�����A�j�65 ��f��=���sQ�'�.����`�P$�y�+qne_g�z��-�[m�Bzmko{�V�{\r��w���[�b�sr%��Hɾ��`J�|�� +�Wp�"`+hG��>���r{���[���cn�a3|��O´������F�$�&�����0|���8݂K`��_y�a�`�;�"�������b�����W�_;�җ���/}�K_��ܬ�W���/7��Y{���)�dV==�`Y�D�ܭݘ�b�]��L��`�[�;�k��>�+ȿs�^AQ���*'/����nܐ^� +���"X���r���>*(,�A�%8�����B�`Up���W�ȯpK,Ha5�HB�`!Ѣ� t���X'�A,E���]7o�@�P�`���O�k|jEXC�S���1���t��[j���R�PVT��B(F��-X�#X u��Ν�b������ ��l�/V[g'F��{���50L��i��-X`qe��E���_I[�(�+�|=)���F��� *�>m�E�$J�N������o;���̬,2���*�ʃT�rUBXW%;2^��r~��}X�.f�;��s�_���%|�D�/��ʙ3/#��u��3�/���_�"�XN�2)y$!}0)�f�K �|f�I�y�b)��|��RHZ����e���O+�3�����6"��i�.%�R��R/��E��g�P\@���=J#����"Z +ѽ**���Q��Ĝ!��|~!��U,l�XZ^YZY�i����L;�{b:J�|� ���<{��ݧ8FP�V������%A1gţV�tږTW���c +\����;(f���?%+;;�m� nn�orl��XE��;A�[�Po嵻��<ƍf�Dnc���V�� ��,kr�W3�Y� .bOW.�����_�Ao�"�J��˱�����������q���&ې�1�6��#�B�J���n�V��f��GcW��8<J��c_��S�.���P8F}�D�<~v��he�_p�-8g��4��Y�S��p�3P`526����� �AT�c��6�h�;�]v�Ay��?�a/�.2",�b7�bJ.����Ʀ��}�K_�җ���/}}n�7��-v��� #3��o������G,��� ���vY�bu����,+�+@X��0D��Ⲳ�G$r�_VQ���7nݺv�Ư�]���ºu���{�������}��O��9 +,X���ʪ +�`U֢����� r������[ꚰ6(���~Ʈ0�Պ�V�_�A�m���VW����ν��"X�"�-�A�W�E(E���E��?�,��V�թ"X���<�UUY]U�,2�ד�]Xx�ë��:�KX_��A���J,�C�phhtltbrrfff,X���><����W~EP*�AP������(�� �Z��Z�x��W����|�����wo��fVv����K���������R�+*�"������2"�;�9���ϱ�sxtz�W@�N�+�BH�?��?e���9�5�"�T��Z�S�/�+!a�JP~n@ +by���RZ��NaM�_��JwjF�CY��U��@��^K>?��~�H��y՜G�@���/�<§5+%n�.Z0�cr�j5��������&������?���1*ُ�mu��V �z�Fl%5 Fi�V����ؕBr�&WR��ٻ(fvx�d��� ��� .��/��Fˑ�R(��z���P�s��EQoe��������i+hR��V|� <���������v�Cz+7X�}�` �Vv���/�+�z./��ి�$HԓheG1����+@R;��^Wx�df���vt[�0AP�o�$�T�X]�@���c L[-�q�Va�7����^tz�7D�����`+�uS\�5�%AJ[��M�N���p�i����4$��y_-8n/ȯ �p������� � tXR ++]�g�����җ���/}�K_����+W�f_���~��������+K/�E��U�ND�;�#����:��j��xݝ]֖���z��G�9yyw���/,,���{����߾q��MHa���Ν�w�R�*��y=*-E�{yqyE�A�UY[���7TA�^mVmZܛZ ���\/�+�b!���"w(6b�J���ȝ,X- +�� +-®��ni!��)�5����Ak_?�\v5[Zj���55e����*6J�� ������ +��(�+�����V��qR!܂#����D�m�N��l�X�����`�b���X܁_d~�+x�R�V`"4.MQz�&����Lsk�B�z}찿���^��FV�����(��3WJ�i��$(�!|E��6� <w�(��\Ȃ,�����˯@��*��_}�k_��� Gc��}���5����R� �H�Z�����KTWU�Eyl��G�t^�_���Ӻ�҂�t<*�r����j*_|vn!=���k�5eO3���SH��|)��f�x�F��[E��W+��k�ɍu`,���Dlb���=�$�i��V���\�|�C�������Te�^|��l�`+�]A@�\ �%�١'������<Av��-�'��+vF`e���@oEu9;t�(g�Vvp[�d=�'8=N�� �\���67�z����;`� @!/���WV$�CQ�'Hz����X���vrs'�� +��ږ�젗?��j���վ[�� +� &�Wנ$��K���(�#Q�V�`�{}8F�-8܀��aK�1g�n�U#cS#�l�oa�Mbm�WT�����.�s��y����,��K��^ ȯP��R,�%�q�{,����sp���F_�җ���/}�K_��������������̫o��ӿ����Q�V�B���X��K�K�wkG������)��v��[{ ���\b0<,,�������ʢ��;�\�u�m����"~u-X9y�y��?*,(,,,)-.�()�(��D~U]QSC��zc5��Y�s�.a]��cm���|�6��{C���NH��FQ��b�X�:����Y��a���A�OL��Ck`�g`��������ƪ�Zv����dqG~e0TV`�����rV4���������V]C��"���A�FzE�Z�VOO?D�FF�&�h�܂����A�^�`��a�f%E��+a�S]�H���R��_�t�g��)+�x�/]�ra.�WY�Ĭ^�S��+�p��WY�Whg˼x1����P!<w��yv{�(�Y�z������+W +>b��S��)a*-�#�<%#���4 +#�'Q�����im��B�HyX@C̴�/_��Uzچ)�(%|;�c���[P]d�8�iH-UA�µ��R[�i�>8�H tI����0>Ez��o�B᠈��m��n�M [��s��<IK�OO��[�G��?�f~��VD�� ���?��'*x��\�BÕ$f��ٟ�s����ɓ���}�l���uv:���8 ������Ʌ�z�3�;��䎰$HVv\M��}jfbrF����<��E��V0u� z�>�[AO0�$ l�=���frc� ����mF����hGQ$�EDK$W�[;�Ȭ8�B����*/ ����J8�Ny)�C1_ ��*�v��.��V�s\�Ni+L��H52�� ������C���W�X!���N���y�$x�_ A�_I�(�7[��H�#XKK�o}C�G����/}�K_�җ�>O�������U,p}�k_�5{�,����)%��8BQ�9+�_Y�V(B����v��ba��������ѣ����9��>2TU�ܺs��M@X��-��n�},X�ow-X�*(�}��������K**�*@�NB�HXm4b�����i�Vi� ���V����-��#|"!N'�,X����1A�����P��H����!yE"X�"���A�&��,X��1�U^TVRd()Q"�B�W��_� +,.��B��h4655������e�vw���� ���2`�Zt�n�����Iwi�`Dra�a("",h���ӌ��z��Q�4No5�a{~��w��W�˃�D��+J[I�A��g��y�J�W��L +_ee_ɾ|��ȅ���_<w�a�³���Y��SϜ}��_��?F� ��9%������R�TtsZ�/��R��)8��Y�49+����8�%"H˗��.�6~��R�Tv ���DN��J}d@Q0L�� +���l���8�d�ٝ�US��'���B�h,���-A�-�������h�V|����1��"�:~��1���m�* BC}���Cy� �)@U�V���*p��Oh���P��{Fz+\)� b�j�V�I�V0O�\O����<���^p����y��,a+���x�jZ��G�_I�g����9\�������/�]�P8��P�������jr�z��"�=�ف\��������>����#lJ����q��>Ml�܂��j�V�����x(���x�B�#]n�������~fnۑc�b ���с���[�Wbsp�bW2�����^�-��9��.B��fV�� +R, +b�V'b�0Onn������ї���/}�K_����o��|)3���?~����Q+�^Ko��� ��*(��W]��"�B��ei7��L��@T:�]Ʀ�Ⲳ���`ݻWR^^TZz��n���A,BX4��^n�=D���a���ŏJ� +�%�8��� +\�55�u�u�ʺ�L^�`����ŝ����B�R��B�WĬ���Z�0���ֆ��_�:�;:���vv^��=�>K��!,���}p|E��r��4�P�`���ghjm'�����``����������PQQ^UUUSM`��7�_q���Ԣ������u�1�,X��B��d��-X4��gK$����"��B�0�VZ��ZI�,M��S�D�,<�?7o�˿��W�x##���2�у��߮�3�I-1v��/\$~�P�k�$~�����u�O!�p��ya�>{�5�`����<���|����G9�R"#��'R#~��O)D����P�TH�s${4�AՓp�%��& +P��W�6SWZ��~ �:��qf%��)2��>#<F ��r��8^�47WzA�?pʈF�<B ��bK��e�VI��R���w����%l����S���%AIl�1Y�>R��>���?����ٖ��'�ق������\=������<<y�wx�g� &���66�Y$VVc��H<����t�<��l����y�\�DbvJ[M��<�ٹ���=A������� +@�}�HW1rL�<�����$�@�ֱz�����P������ +��� +�J;>x���x�*���������@o%���� LQ�A�Gp�`��¢kv���Æ�+vF�a ���BZ� +����1 +bAsH�D[�m +�[��^9\N�݅� +�Wȯ2��)(����"�/ � ��+���/}�K_�җ����\?����_�RFV�����������G���8ȢV�����P +������nB�{ggWw������QYS[X\���?7'���PY����ͻ��݄A�o߸q]�B�Z�b+'??>,V����,X��5`����)�u��uF(@���� B�`�Y�ͭu�Ūkji���b���W�T'$�;D�L$roG~թ�` �gB +kr"X����Qv -}����VSgCKK F�%�K� �e�������9Ū�)�F*6i +! ,�0#���1��--�mm�f��j"��fog����t9�4�Я�B���`SX�h�#1�`��� q�w�Bz���TݷAH����~��?�|�JFF&��_������.) +��/�-R�I�~����Wa_����u�W`�����Bx��+��z���H�̙W^}����/"K e$If;��)���XPP�����n�"�/I�IM���XS*R1ZPy0��,� g�� ��Rڤ��H���05U�Mg)N_��O{��JM�|2�K�[; ���O��[E�wa�����Zr �V�d������n�J[q��b�Lj����.#ȣV\ɮh*K���U�7�])WT$7�Z�N=�g��N����}�V;[������Ɖ��B ,魠.��+;a��Y��Bl5=6�{b +�Vb�j��6�`�������y���t/:=���A����� +`�*�'H=A +\ml����n�2 �k�� w[�z u s�Od{}c{m}�D^ ( ��+��@DOJv ,�1m��;\(���v�mn�6�z�iL[M̐� +�VcC�k��Df�7���+Qx5��A�W �bO>�h[p��� �+�<���hc���)�/%��"�h0Db��{_W��K_�җ���/}���~�����,Xo��ӿ�����B�n),�W`q�?���a[�T$���VgW�����e��i7��Mͥ���ܽ��H�X�0��6"�,X��ܥ��ܜ������G���E��K��_A���������`W�ד� +*�^5�6Q����E���8V+!,1�ժpaA +Ka����.+��{�a� ��[�`���Z�C8��Z�}CC��r�����ۍ�MUu��UU%���CQi��CyeEyUeeM56�I�nlj�o4�76�;�?���Ű�l�2uB�������hNML�������N�`y}�B��W��H&�;�+��'��1q�;Mv;]v���F:,����� 0��bn�B���\]�x71(�s�WY���ξ +����6+�rffv� �>E�т��+��}��W���Ͻ~��M�>Z.R�%��*��,���)�)�D+*���۠�u��ϟ���A��*�.������gS���UǮ��MqqTׇ}�OuU�� q�%�R��rS3c^E�Q�%PB0�v�!������{|�` ����ե* &Iɾ��#��v�$xp�w@�������cp[�$���Ĵ1���!���f%c�S6z��U�>&7;7\����(f���� ;���C� n���*��q�[�Iod��&u��y&���T��m( N@�jvf�P0Lp��~ -,���{�^! �C\o���rlieye�Vk��ַ�9����n�J���$�#J�A[p瀛�w����vE�ۛ���L��ji��/��1H[��E����m呔쐶�A+�4`�����[�%A�#�*w�9��560,��)T�sx5i��"[;«�E��5�L����W>�+���[�pI[�cq�,�U0gW�}W���ї���/}�K_����o�={�ͷ������7�UV^�?4l���K��hB�c����f�r�Y��;;[;L��Ų����ѣ܂��99���W� »w�݀�a!D�P�~��DX|aAA������*4��+J+�EXSSQ][UW�SX� �r����m�_�����4��n���N؊f*�Vۚ;:[L4�v�� +��^BX�c�bkJBX��h�����0����Z+F����-+/�-X5���3�aa�����_Չ�����F@X--���f��j����#X6�mn~��t-��.�@o���2W(��y+�n��<�\�+Xҙ��������̀lե���(�Ew(��>αҪ�2�"u�RX �R�)���H E~u��$��P�ES� +��2�2��Fy�Jm�&��H��rP��,)�P�#z�D�T>~<��aj>&?^�Iy��)e�I��I��P���=ΔC �������,*�Ӡ6�Y���2?&�8oʓ���1z����3�|�E$�O���B%��ٶ��Ʊ�����!`+�:9l���V�d����X�V�3�j����,2+��g-�z�Ju��+>R�]�V��;�"lu|Bbv\��on�&!p%�����;��Zp��'837?3;�J�[ML����IT�O��}zfr +��4��gg��v�{�=A�G�x�r�U$�&�q4�%p��*�����!1;0��Cms�41ju(O�;;�v��{[{It[A�j}�&�$�?��3���<���m�F3�ی��$��$.��,�v;99�9N_�ZKT��I�`'���^�;щB��T�(Q}4�"i��)i�W�����{c�q&��Y�]�`� �n� E\s��#�t�� bI��s8=�Y��� �2��:�E�5�h ���ChjFp[�C�����9�a �e{b��1>E�+R�O���M��Π�hѢ��`��+ +_��9�v)�D�E),�#�����������w�?���T�G^�%/y�K^�����~�+_���#G~��10<��?�#�+v��o�u���1%�"��Z�-$roV{wOK{�����D������s)+"X��._�<{��ȯ(�u�̙s�N�;w�ҥYY�`aV^^n~A^QqA�Bl�V�,����ZLa�,B��Ujί��X�"l$V��)VC�c��i7S�VsGgkW��`O� �܇I����IBXIJ�a���W�`5�(��jk�*+Kpaa Z�JKK�� �j��0y�V��.�Įx� +�Z�R)�_�75��g����������M�K��"�YN�L�� +��oO�% ,��'aS;��%1�t�p�tV�O���7�ܻ7###Ư(��.���ȕ��{�V�:������{� ��9~��1�R�\ց��p���y��'B���]��,X�����U�`Hy�/��3!D�����# �/I�gi�."I�$>s�MĊq�x��@�$w�XLx��P+1%�-9��\n�2�z��d��2d�bt#?�D��MxJ��x��ܛF��qz`(�?�Ga��w[Aڊ��B���M�Œ��-t[I�U�$�X������V�j�"d�T�\u�L�\Iz�����=��y�7o��ܺ}��-vxk�n�^^�X\^�,��Io�y�+��aBl�7`OP�z+ Wq�'&�q���a�3Z=��`�p me5[� :f�N�[�������<A� �F�ʾ��ʞX�Z�y��x��W趒���Ík8F�O\� +�jy W��%;ہ`$��υ�1��s.�o��;أv�-��f0��Jo���cAR��z�C8I0�!��j ����&�ǡ-8:1-DU�n�lW¨A��,���_!5!�2���P$t[�Hh�l��ng/~��雃)���/8�������ؿ���o�&��#/y�K^�%�O��ï}���8q����������KKGF���>�K�O�H����Ƚ���gB�"X]=0�����VYp�JnA��l�`�S�B�3T!�A�g�d�>M"��`���� �"D��~UV����V�8�*�uj�`�Td��"$�{�#l"�����6K��4�P<S����چ"�NBX�}��"�%�'A��+��� +�8D��$6���-X5uu�55��`�*U*J�(�rh�WUR�V��9�R��8vP �AL^��}V]��[���]]]�q������VG,���ޙB�����+hR� +��=^R�� +�w.����WI��D('r'�f���_�z�*rx=��={�� �J�ڞW`t�(`~Ů@���?x�W�<J +��e�;�������)���b.wv�/�K�`}�����U�Թac +X��I�㈁w�lR +�����Дp���I�f%d�RA�8�p'�\:�P�J�`��.Or�K��%D�һ�dqm�xF���ъI)��A��?�`�Kt�J��˫K���m����z���7�[ݼ��V�P�*��V�3c�@�S�ET�>��l'$�(p%��%=�����՝�[�won�ƞ�Mv�쀗�6�VV���'�����|��f����`es��}����I, Nk�f�3�譌f��j�ج�Y�}��V���Up. �"�����<��e�V f�JU�Ut��e@�7DՕ��+@Cp���*�[!�Z��Z +�/���`(2����t{�\n?$�f�VH7͂��d��4LpZ���֒|��V�BIph�������b+� N�NL�NN�� +RjZiapFg�@�D�+��Wz^��b�*���b�bK�c�v��+�s�p���l�_����q���9�%/y�K^��������<p�С#G��G?���UOe��\a +k��UM$��� ������UD�:���u`�*�������u���XQz���gΜ��[�X��C�RX�hq��-,�+,*(.)RP��Ui����(V��jA�.�+.r�*��N�+e����9+&o�3u<��Z�҆�Nn�B�{� r�Y���A�ÓSb�PD��������ܪ�o�R*˫�J��E~U\Z�(/+������z�&�������+%"`U�T�)��������Ɩ���6�|� ��A��jttbrJ��� B��j��zt��xKL[0�� +-���/���8a0Yi%B��j4D��;R/go���|��_���9�Bf�ۈ�^{���v�~��Wv����=��W�_������ aQ0#�����س'C�pg����/����������HRQN��k&aoR�N�;).OJ1����J`�!�_������I�@oB>*��œ����$�W�a�K����8+Mw2m�M|����?���yr[ i+�$��v��Z,m+ ��V�w[=xx������ / ���V�S�����Ϟ���y2���9�z��G���}Ż(f��z���on��������2�Ao�,���=A�[��2�[�u��b�/xOpFCUA� ML�HA���=A0\ح��n1�m��j��9����V� �/� +шF�VK�K�k��Z]�����TD~u�F�8C�]WW �������ŵ��Jdqy�J���b+?`���n+���13["����ft���&�[M�RC����X���\a.���8�������)\���MA� +bW�:�\Qg��W���W�<(F�8Ų��a���:ȋ��X�H�Xį���Htq{�>��}}�����%/y�K^>��G��+��;�_"X��{���Ccc�"�"!�n<���������ˍX<�u��nj�j�q��]=�=��-������9y8�0?�"XgΟ�<{�g�c����=օ�VAAnaa~ѕ���+1�{9E����jHaq�;���| +!��8B�W0PGH�+�B�AV}KZ�(�� a�� A����^aN�_�kp��6�u�56���UTהVT�������J)X��*�т���B�l +*��յuu��R��R���"X �jniikV_�Gػ�qD���&��j��)��(lR��Ů0�E�A",�`��}6�6(��y��%i���>�%�jo�� +�ڍ�j�+�w�� +�����_ٵ��X��F�%���W���� +ᡘ� +>��,� +�*��ݤp���_����K�+�B�t�Ƒ�[v��ç"5�J`M��TU2���t^��ô��#9��K�"[ q���W�3�`������%�`��q�A�)���I���AlDl%A�$������K��0mu�f��j������V�����w�Õ�1;o�����p'«8� W�Dr����'�K��� n߃��� n�#��V�˫챀� +�OaR��cw����f��Yg0iu��ҡ�J\M%Z٧f4�3`ngW��:�Q�{���b�X�'�g_�U0��pF4�WP�#r��n��5�Z�@2\qZ��W�Dl��N� +J��D��*�IɎ؊���r��'��mN�m�l��E��i+P��#�����ۃ#��i���� ߢ�] W8RP� j[����|�ؕ0gТ5Xu&���q3�ȯ�-F��6��tBa(�����]�X�H�=�K+[[�ٿ�����,��#/y�K^�%�O�z�K_:p�Ё���~���n�W�,V?�(�Շ q�ȝ��a�8���vv���κ�EYyn^^6"����+%��/�9w�����y +DX��įg(�u9�RN�����܂��"DX�P��������V%�"�R�tX$oW�7���&���Aq� �� -X��:Z:�Z��I����>�`�����aLa����q0� ��= -���U�UV�Ƚ�=ȯJ���*** �U��*�+eo��hB�|F,b�R������L,n���bo� �e4-VD蘅L!����a��+R`B����Iu���nw�}I��XF�� �W?��翰w/%\����ˀ��+�B����v�L{�^A�� +P�ݯ�y Z�y����Ľ���}0|p��0(Z���W��z�^|��o����7������)�U��xP��CO��o'�OHƒ���ܹ�?v���/o�]����$��#v< �TLZ~L"{�h��+����*@%A ��VkW���M* ��j�6���D��$m����O�p����D����Y������+>XP4\!�z����0O���m���ھC���~M� .�!��U��V�����n���[AOЀ#y���gV�$f�%A�[�� +��z�ŀ=A�[AOp��^���@o5��o�a�(�Vh����V�y��'���,�V%�jiy], �´|�Pt.������J�Y��V�u4LP������V���� ��/ I��r5��af�=o<p���`�J0��"re0�mD�Ѫ3 �+����?h��XfdI�XB(�)(tQ,�^����U��:�^^Y�������%/y�K^�קi}�{�c�_��7��8���o�����?�I��;0@��Q��^,��K��;)�-B�b�4��T�*!���w9';'/���<'/�̹s�Μ��2OA�`q�p���K��ae�B�`������[�˫k�BH� +-X�"�V}�RP`!�j�:��fJa�l���R��b�����Z�]���;����Fc-B��fg ��1�����ޡnj���������S����*/�����0��! "����T*:�� Q�Ů@,��4X�#�4��"XfE��.��"X>!�~5��AN�B�&�� �E�P�^X��]2���р��*�^z��ݻ_� ��ݘ�څi+�/���/����d�+��k�&Yh��V�����!�� �j���}^8ƭY��S�?���/���={�7��W�PUJl�?�L<��!h�����}H5:�g��H�{�˯��T)��'>d�w�{���Vj��{VS��kJ��LѣL�}I�e���H��V�$���kW�S�j���k<m�E��$x��m1m��0I��V�z/�������b�Xa�c+� +R�����f_����w�'x���u� �Z]�.AO0�؊=F�/��-�l��o�`��`����&�<����i�W��]J��4n��8�2[�۬��ͺf��ٯ�'EB0Op��aP���Ձ ����u +\I�V�D��J�je�& �ZX��B%{0��>[y��.&%A�2-�2NcOp�&ƹ�`��l`V#�Ū�0f��R���VӸQo�5���j�l��� �J��ȯ�T!4�3V �[%ıBY��bV¯@����C�`��1���Gi���[�:�%/y�K^��4�㯿~�ȑ����7?���#lՋ�#,* +^������b�Ƚ�������v",�`u��4;/7;'�rvvQII�Bq�ҥ�3��:�����~v +�X`q?{��s�A�~�bv�圜l�])(.��]���+ʪ�˪�˫��+�uUJ�֊�v�]��u=ʯ����B��E��B,u3� +�ɂ-B�`���p����}b"XӔ���X���Zg_?�`54��-X�y(�A��R�`UVV�B~�D������,pa�Q��Fa!�R���VE��ٷ-Xc���3 Z��X��nw8���#�9>p0����A�F� +y�����T��#�<"3��v^g4�����3���ݻ_�9�]�z�P/�L�/�����^~Y�c��w _{-c���2�Exd��C��ܷ�5Ѧ�g7��b�����o�/��K/�~�տ��I/�^O�DO �hG��g<�jI��|\J*ŧ$W�$\�.��hU�t�t�:0���'�)���M��(ާ݉�����m]6�d_Y$l���~�J��7[�ܺ~�N�Flu��ս��V����`�Y�+F��0�x�>p��A�=��no�es���뛷�^��~����ե���%Qo��ϯ��g��pY��f����Z�aF���y�(`'%�����1���[�5: ��F3����� :����`� �V���|tiaq%�$�p�����*H��qf��W��8�Z��c����u +\�Lj�jq��$�6`+�輜���4Y�F�MoD���Io��:��,Q�%AάxOP��� ���'8���Lht��yUPg 7{\�J�W0m��"��Wz܀��&~A,<�ʚ�&�,��H����lh>����.���=�������#��#/y�K^�%�O���w��N����=vl���������� �������+jvRw�W��a���ں�autv��� +#X��y���r��K��s +Ξ?�y��[��?;u����\��)���Ν�x�F��{a��b���Q�^YE,����N�`���A���FA��(R,�<X� ����ۤ"����`q�����:��x�{r�+P���S��\�VS�BQ�(f��2DXYQYS]�����:@X�j�b�8B@X��5�B������A�������� F��N��S�s�%�+v���P���yGӸ7�R�aI+i�r�������o~�3�yy�+�z���/��i#��P,�N��^���k����"X�"<����ތ�V����h|!��`���/�_�ڵ�k_������� DőDE��������#U)�WbJ ����*땈��n�Iy� _1%K��$�� ���ѓ���M�r�A��_��rCI& ����]L[��$A�V�nܼ� i+)�ڒ(��?$��;BI��w���λ<m���j��?��C:G���ȕ f��1pz���������M +\aOpu�������*�����\(�~Z�>�[�.�}�b�SO�Vz�X$%;b�), rC��4|v +J���L���h���o��fG+�������@h.8���q�!m�O2�\� +Cׯ�{]�r�l)���cIp%]��� +�V�H 8�+�}gّ��J�VfL[�MV�ތi+=<^|�cde�B;�)g%«�!�Wc�� o� Vv[Mrl51�� Nj9��z�Z��ʂ�̕ɪ�m#m;�&������H��©���*Ư�3���+R`���9��������G���%/y�K^>}���㇎ٳo������=}��B��w`��X�%��u�>�K��ɍ�==���� �E�[�;��**s��r�/ee�\))�p�r�3�N�~��ɷa���l��A�Yh�"�{QA1��J�J+@�^Z�iK+��*5�!�8�����Z>��I��X�$�"l�t�+� ^Q���M�`�,B�`uCkh`x-XB�pz�[�&Ђ"��>D�ڪjh��VYٕR�_�{�����������-XT!T���^� �+u��A�BvZC�zuCSSskkk{�{z(�5�ٻ-a��,X��ry}^���*�_���-�W��A~�ȍ'M�(�P<vu �G����>�/~����c�^䴊p�_`�z�μ��K/�:�.2�C%[�{�f��ؗ�q`Ϟ}��zu/�,�w�fW�k�����W�����'�����|<YJV��7N������UB6Iz.oj�t�t+�r�yˊ�C���<���Jt�`�WKfq����,i�Г�XL�n����p�S��%h����f%�͍�4F����[n�j����[w�߽����"�z�^Ĵ��O���[���U���\=OA�������>�|������<Ĵ�����=ؾ{����ۛ[��ABO������`e_Z�_X�G�B *��XG�[���HV�-X�AɎ{|rz3WlCI�`+��2� &��l4z+X�ٳ ������@x�V�P$�y�������E��Z���ȬL%�1g/�;��V6Hɾ� +�jai>���`��� �"���酒�z�� �f��h��[�ۊ� NΠ�} +�V���^��E+;�� V��1( ��j����Y � +���ε�4� ���M3 �+nh�i+~�d�R,a�c-B����P�ł^��z��x�E"w�r�;T� +��W���v�&���}�?r�%/y�K^��)Xo����3�N:|x߁'�����bpd�w`P�b +��Wb +�(V?�`u�8��ND��م� !��T\������Eyy."<�y��[����)I����g/�?w #X�9Y9y9y����%�W���(r~���B),%��������Z�v5�#T�7��W��_�B!E�)�jhmol�!D�`a��E�F�kb�Z�<�5>546>8 +-B>�P�*��(~�(,a��"XUU�(r'�a+v�� "�{-�ZGX��^��(����98442>>65=�ѱ����l�[ ��%�X!�X��k�W�Ba�;n��G�.���_Q]}������g���/~�/� �+�W_|�%�WT*�;�v��{�����*�������w�~��w㆛P��l��*��ǎMku.�//J���~֛x���GJ �)%��!j������M���\���'u�*�q��Q�Hq'�b�a2(Kfh��Cg|���l%�(�#�KK+˫�d߸�~��V�W�o^������[�[�Pɾ J�;��܇�`\� +�>�/ ƢV������i��X��#���?|�.�Dl�����`����5�VK+k���'HV�9�[�����tF�Vo�h�3T���[��i�\M�bW@��N�5�tF����+��j�:�`ewz�3���y����68�����B4ʭ�˫��(f_1;����T�����W�t�� +7Ē`�V�>#�d_ +��=F|��΅�m��;ax����lb+�ެՙ�[itS`�Ł���� / #�F���U�����6�Ƨ(mz+ +\i�<A\bbv�Q+m�z���Y�3p�S,:�7��d�bE�8�E�B�b�Y���d�� +,�W�[����vFCaL��/�Y���/�"��#/y�K^�%�O�:r�ء#G������m[gW��� aa��Kݻ�d!��]B>��[�-�m�=}�]*�`����e��^�ɹ�P��|����'�B�Vf&;s�t&�sgiaVF�r�Va��+܂���ʪr�W� �j�P!�� F��,�X�SX0�Xp�f�c!�j�%)��VD(�;�C�!",X4�-X�)#XMmm�+V� �� ��D�",/���B�{��ʃ<�UO�Bv*L!$��Y,������Ʀ�ֶ������~�X� r�h�u:WXl|����@X����m����A�`���b!���1O,�N�v<��xiyž��?����W\{���z��!s������ٳ�Uƾ�������A�<�6����ތ}���� +���� �B���_1Z�1���IYP2w�����rPb�K�]R�dK�J��{��X��K�K�(�M�a��B\�<1��jD#��������L\�*`+( �;�$i��w[�lEi�ǔ�Bl�^jl��J�V&WI�.�[=x����G��C� +{���z�+�W�W��V#�P���`0�~$#�PQnw��v����n+� Ŭ��R+�V���5:=����h1!��PO� t{�ʎ�C���/G��)�� j��*�W��F�*�Y��)q-L[����|ay5���؊��Q��$n+�/����$AH[�[a�ʪ�[�Q��6���'�Ǡ���?�[��@�V���08:�'(�+n������j�[�'��I&�V&���2���K�Y��� q���A��D5�hX��(U`9\6�d��c 4�؊�x��p$<���*�"����%/y�K^�קm��<x����_��jk���%�J��qY,�b��Wȯ����������� B�������`,Xg���:u��fR ++�g�_8��E��+�,XW +K�B�+x,X���E���a��Fw�V�pay�H�s ����W8��"�o�!���������>h���}dt-X N�����4�1��`ut� Bu=;�R�`��A���R�`UV�T��F��W��H�B��k~�.w�`544677���uvv ��ѱ��i��� z��d�[�����/�+�_�;%/�V 4�,O��g��X��=9\^�f������c���g�$� +��vcI��]��f��`'l�7##c߾}[ fu��aq:|��#G9�����]��nw���g?��?�< i�Jɠ&�J�Z%# 8/)&g�DFWH�V)�q��yWJ`�xT���O.O�dW��Jz�xN=;�%wx\�ir8- pa�*fo�#4Ip���V�$�q�(ٯ#�������wom���.���$��1���#�����d`�L�;�+�f'r��wcb��o�{�����"���{�7�@o���"��sО�1�dw���n���6�ɢ���I�>�9���I�'�ѱ��3:���&\��&�'��f����r�=���n�s�U0L�[��}FROIT,j�A�ꚔbQrVk����$A��"�U8� +GٞC�����`��� =A��m��Z�03Y�$�����a#rftbzxl{B� +�U���ٯe��.���yA^kb�� �y������ +�0���VҶ O^Yya��$��(t c��WF�e%ű����,K���+>����*�f~E +wz��N�"������������ԑ���%/y�K^�ׯ����|��?q,X��?����f��������R�^au��+@X`no��a{ggO_[gw]}C��47??;7����WJ z�Ϟ=���V�)����+�g�R-X�<����+%`�*+/A�UVYCX���a��]��DX�V�]�z<��U���0��R,��pa\��=|��� B��.�����0���������ayu5",-TC��T�(/+�!"�V�T7���zU"Dy;�"�xEB�b�����#X�}}}h�gom53d�����v�,�WTN)�����P�9������fB8��(#Q|$���l�_����ط{��XQ���� m��j{M�ݷo���D�b��02�#G�����#��=|���#ǎ�}�����&ǎ������I (�^��ƗS��&J�\�Ğ�l�1N +2�M���#W�@�/��q_EzI���Kpd%�/)ps}�Ow\Z,�n���C������Vӧ�n��b���۷no߾sw���;���$��V�؊���}���d�z��Ϟ'`�gI+n���%�J�|������w�AO�֝ͭ[�6�6p�� +�\[X\��.�"�@h�=�����,6�z�[i��� p���iؓp�\Mkh� �t��d0��&��V�7���p9��Y�����|Ab�`���K��}5���W���#�sE� +T���8��51�Jv�^��`��Rx~�V�Q?a+�� �=~�V���ظ�Ko�� v��H�����F'xIphL�Z��)�+�V�ґ����'8��J\M�>�d_]'1\ImWҞ��pI +�FK\�PY���XVm�tB�%�cF,�]Gh� +!(�Q�%�+T�υ|��vx��� ��i�X��nݑ�Α���%/y�K^�קl8th���G��Q�����a��K�P��#X����+T{:zzȂ��8���������('/�RVl�9�`�}+��ߋw��}�����.�����<D�v�BQTZVR^^���� +D���A�*Ha�����;���jT�)M!lդlD�{��so�ɯ�M.���v�#�����"X#ȯ�FƆ��5�+����V��`{O/{6ꛛ�1T�ԖUT������TQ\ZZZQVQUYU��,X�z���^�Ѐ�^�~U[�b��pW�˝��Ս��(ro������������d����X��`9<Wl +a�'(�|Aj�;"��<��N�&(�Ҏ�s��/��sv?��E������{�f�7#C�[!����:����G�=F!�#ǎe�8�'�>v�u��?�.?�Ɨ~���z�R֬��pP2 r%#o"����q�I�t�H�,%� �MR�s��H�;���J�� ��ħ���?L�T�u�t��*�?�ΐ�I0��؋0�`�ji��q� ���Ɣ�[�D%��;���{�J���ޑ`+�C�����~������G���p��z���CB�J� �}�����nݹ��}g��[W�'x�z�K+de��ʇ$��6���f��h��Qo5Cz+&8>53 �)1jE�A�V�0O{��2����D��'h��y�^���~��ss� +s1;`+\�R�j���uArE�@��"��˱!ȣY<m����a�V�d�& z}!m�9�6;�+��'� -(� �����cn��1( �K���%�����O[�W����AOP0\��]� j�p�Gl�ٔ9U���J��!ᳰ1�%�K�i�Y���xͻ�_I-�q��+�|N+�BT`q�{�������/�K�O���-��y�K^�%/y���o�ɟ��o�q���?��O�zz�"X�3X$DX]h����l��n���VW]C���,�� ;7�RVV�BqEQz�����Ν<}Z�`�:� Sϟg��� +��.A+"X�� +�`���-X�-B�`��B��V�kTpF�` !|%�#l�#[����X�vW,�W��"~�I,D(��Q�%L!D~%X��z�[�0���X��R�`���D��Ua��!ª���;���uu��b����~E-¦���v!��kdd|����hu:��h���Xa��G���+ί(�V������=o�E<6N���q�T��fә��.�B��Z巿��/��o<�^�"�:p��A�'���#� au�ĉ�Ǐ?�����x���'^?��l���/�����7���S��Nit~p��R�꾥TN�h�y%�+o<�Ih��8I9��5��=%Ƿv�f�M�/L�L�K�E��R ]�4�>]�l�ً��O[AI�VX�q �VȬn������w�$x��JL[�#i����?|���Y"����+�VO�%�>~����Ď�W�[�7(pu��*�VI +G��0e�3`?\�G��tY��&+���&3��t���'8e����1��J��S3�B��i W:v}�ވ�-8O��ʋ�缈8�'��o H[���� +� +%W�\3�z �V�A`VKK�KkK+�ŕa+��� +�i+_��s!��;�i����d���g�[��C#l5L��iIpd`��VC������섭�\�� +�������f��� r�iĞ�^���5�����AJ�̱gVVa�O���*��W�ҙmZܱ�96�������"D~�G�z�B��ٯ� V�O �|��O�9�����O�y�K^�%/y}:�[>t�J]��� �+ ��t I�E ;{z;{�H��� .�������ʚڂ�+9�����r��aaAY�Nb��`A[��+/;/?��,X%�`�*�P�Ƚ��RX���lW֪��*�`Պ +�����1��B�XP$��J��˃R"����6�`�tv�v�`�����[��A�kP�W����p��pO�`{O�9D����ڲ�J!�UR�P�������UVTVW�lA���C1�Wu�)�-�+ʯjkkj��(侬������֎Xkhtllr�����z��f���#Xs�� +�[���Ba�W�M�o.�ޏi�%J��r> �$q�,���}}CS���w��������7�����C�u����G���:v����ǎ�8� +�ձ'����o�+_��7���~�ӿ����F�50?���b E<�8�"�M혀JɅ���QBw/kJ��Jw��&%�K��R&��`)�<eL+�<?b�*U���Wc�}��KKZZ]�V�յ�� muc��&�o`�j���b%A1mc%n+�!ȱ����4?z������c���|��D���t��=�'��� �C���Ƶ͵ ��Q�.]�C���� :�&��h��M��1;��N��{���$H�j��frJ���Q�Þ��VkpX�N�Å�}�y}(f'l�d�W@��V�p��jI��V9�B����!�����m���ƥ����<��ˍ�];*��m�z$9X�O�hǧ�ȡ�j}��I������0U�aa�`������(p���tP{�Z��p*s������T���+���"&�D�$���R�&D�1�+�����C#E�;�+���P�*��M0�����r�P^�%/y�K^���'��.;��o���Ç3������W� +-B"Z4�����B~���vO �(������o��T��KJ�r���0�U���P\��>s����̷NA�P�W� ��_�t!;�"X����\~UTVVRQ��A���Z�J�W��RS +�Vb�-:��&B���+�"�:w@X �$r�,DX} �b���P��E� �5194!������6�`�c�����A#R��RZR\�(�(�������U)�B�",�T|��t�<�%X��;������GF��[ޙ�X�n�u���.���C�;2+?�+4_���W r����U"zJDzҍ�K�n�0���Ѩ������+(�����?��w����z����_����W��~���k��ƛ��?}�����_����?����w�9�-m&�$�(�w�g��}�Q������V)ˌIۗ.�%\ߗ����J�U�����}һudz���F�� �o.�^`8Ip�V��dGlu�V����`+�$H�����N* ������i[%欀Y�����ю#WR���ϓ(p���HW��@�����on]���vz�K�k(�Z +bO��d��$V��6���Lf�]O��Oa� +2HqJ�i/�=A����A�3ꍖ���>k'������'H=A2PAOpq9������+�Vkҩ��`�X]������ +�V��A��[��=�g_��Ϻm���;*�9��K��3��S�c�Bl5*����"����}pl2��&q� ��4����bOPi+�'h���Dle�3\�a*C��J��T�ʐ������"�b �+��]/i�2����B�����^��p +�Hl�G�kW�>}�kr�P^�%/y�K^��EY���+��Xk �L/��H80����V����nC������VYPX�q��-X�/^<}���@��3�`e�=+"<����K4�0??��0����Dا-X���U��U�*���X���g�������ԍ<�%N$T77�K�"�A��=`���,j�O��*�"�A��)���CV�R]_�,EYY�"Xť������!O;��� � ��NY��SX�ZD�.a�ihn�VD��klbjJ�-Xf��jw�g]�����+�dt� +,h��z����*gz���6�3<����H$�wy|Z��wp���Užqu�:�K��ww���7�.7*�#s����w��?l�fJ��h�����>a�Oz�;M�0�Y���|�������k;SQ�Y�Dž%A�\`���$J�5P�c�JP�o��������wn��V�IK�OD%;���b+�g���?z.aVx�?���{�W�=}������bv�V��f�=������͎��V�`e__X^�,@�.����}�����uZl4\Ϣ3�4z&i+-��f�'�������[AIpfjF35i+Qoe0Y��� +�'`+����y����H�����@�j��ٹ�JL[�n}�bW��@���VV6�x� +�VRl%������[��j���쐶�� ��1�K�SR�O��j����� 'WC����7\�oZv��!�'8>9��G'gF[��}�=�Zݔ������:��q@��T�� +))ibjgZ� +[}"�%�1�W4���!6���+c�_�k�B����+)� 2+La �Q%���A"���?�������%/y�K^~���Cv���[��w�������#Ȭ@V�b Fw@X���:zz;{�;�{т����[�J��r�s��.f]{y��rv��sg3a����˝�չ��_�|-X�� +`a~����R������J���^GX��W64���so�; aaG�K��V��V{O_g�`�Y��X�����h��PW?D�����W�Q�UTW�VT\����REyYYU��������Vub��[�`��RXյ5��Tʚ:®����v�`u�� B$X���&E�B��G�� ,��|��"X��DG$����}q�roj�x���Q8JOz������|��)�qña�1�����I�<�Tt%�nrJ��x��sJ��Q��n������D��N�Ȋ�4 �e�|);�;s��Mj%��v�TR�OH[E�K��Z^]' ���(ٷ j%b�m�V�%i��o'+�El�<[}H����w���� +{�0�Pj�z�Γ�o?���=�[�nl�_���quymcae5Bz�p�V�*�Ϻ�v��b�5�0A�� ��0p�$�V����= mA��V2OШC���V6���~����Y���b�����qz�pd��d������م���`�ӵ�e^�V��ZEf�<]L�V^ȃuH1me��1[M��&�������D���$8<:�CV��� B�J�������0Oprf��VӀ��$� W�$k ��"%;��L)z|K\�j��2([%��t��L쌑��y��^���4�P¯0��#c +,'�@X�V���B�*�,kai�����:�%/y�K^��4�����v���"Fq�O +��H8��uX�HH)���^�`uv�� ���`���g�dg�喔����x,X�O�b;��i��;�F��������-�+�",+-)/WTT(**˪$"���*���,XD��U�p�V}�����y��O!��W��E�Z�����ى�{�"w��5e����@�Hw�`G/"l������,X +�`���V��WVV�TW+k�(l���U}c#wa!�R��_�T������U�DBDXϮ�������������?04<��)�V���"XN!�`�+����$Bx��K�e�IM3>֧��a*E�'�9ӄ����:��١��sY���`�;��p'�<�S����4��x��cw#��v��O}�g�j��c.�� ���l�,@Ipe� �ׯŰ����ھ+(�1m�v�ۊc��bC�6A�.ʬ�M}�������(%���m.f���R1��G�����]�Vw�ݼ ��onm\�\�z}ymcqeua �W�����`Hܬ� +�'��Q�V��i��!m%������h�'h �b+۬�6ks �r������p 8��=Bz+0\E�V �&��(«u.c_Y�N$��+jb�*<�H�j.� +/�?��ι�s��fݐ��:�f� �2���V?5�%l���ؤ�dG*+ � �J8�O ��}��4O� N�y�S��), �� fgO��ȕ0L0]w/^E%䬒�~ɨJ+f�65��J�V�i�\MKNg�C�ۦ�W<�%P, W�p7��R~e��r �r����d�y>��ڣa�X�k76�?x��������%/y�K^~�ן~���������<p�з��ݑ�q�Wl�J\X�Y�d����T!�M"wDحnh,.�VA>D��K�KK/��>{��̷2O�< �������9��_��~���[P�WX�v������Vieeyu� B�E���R�ȽJU�z�Ƚ!>�ŃXu��j���,:���Z��m�Ƚ����Z����PKhB�p�WǸ�=?m�=<�U�#X�eP!�A� +DXYA���fR������bK�V����Zv�j�X�jl�V[[g'�.��� D8��k F�V�G���͆&�o.H�j���_a�)D�噛�$źOƝ|�D;�E���s$�˗��EX��35J�J�H �&^��M�;�9PcTqWv'm�W���/ ג���I)����)_:�&)6z�(X#l�D��0Ip& n�l\]��%��7)m����ͭmP��$���w�ݹw�����D%�;O?y�����b�*6C�V��l��/$;�_ �,q����a����<y�� >A1;ꭨ'z�;��n�C�@������ +,,�E|s!�o����׳9Lf� ���aOpZ39 �jl�����'9��NCOР��F� �mf��j��ς�� =A�'��Q��~<Ñ�\E��bOp3T�*���T�� +�����\l:�hBIp+�q%����.b+��V��i+��h`{ +{���щ���Ip[ � n+Q��j [���������0���>���$���Io��Mbڊ���ii���Sjx%�Y%���T5@�S"�J�S���u�0��u|��3솜q�]Bs*����H��(Q`�mN�_Yn�,�+����P��� ��~�g/�����=b����� ��#/y�K^�%�O�:|� "��U���.�$V�����듌#�[��X�ZZ�0��WP���});���<�����K�Ϟ=y:�'��3g؇�:��l^�Į��������_�WTTP�(R��RH*����U��W�jr�"w���.w���.�fj����@�gZ�,Xmݽ�0��#X��拽A���0��\����x�]���������U��P]�,��*)//R( +%E%%%�����rDX5P!�S5ԫ����P�nl�olD~UW˶J�X`q~U�ʬ���Ɩ�����w�������{95��,�}��t�<X�����+dV�:!U�h ;D�|�SO;���Tʒݿ��HCD�1�;)Ԕ��O)/w� +;%��܉H*�+ s�wbA����X!��;�>]q�+�i�_b�˝��\;�>ԋaO�;����W�����o����V��n���oJ�V��$������$�����[�1�ϞŰՇRl�������N#?$1��|�ɻ��y�ّ�� ��js�Z�WAol'�@T��sy|�.��ᄞ����`�¨;������մ����va��fzF;=�c?�Z�/��0peu�lNǬ��y�Aq� ����b4�DnvP8Rz�¸��ի"�Z�˗c A؈�"�h�Zc-���趚c_Z���.�m�lu9�3�;-0+���& %��j���������hz��El��c���͌M�0A�5�I W���#5������?�(LiUjl%6)d�.�x +�+��C�S�pC1��"�����b-B��p����aF�e�#�B������ +s~���a�XhĊDWV؏���%/y�K^�%�_��g?�;�֛o�ۿ�Б#��oOLN��+��D�aA��������;�������т���I����܂��/�)�*.eq�I��D�g(�u����B�sE�W�KJ��VeY%���P�P wDX�F�,Xj"W"��m66��Mj�E��1����zHa�5��7w��j��n����q=���a>����Ђ5�=0�����ޮn-X�WJK�A�$r�T)�j��"~�"X�u���a���*�B��� ��M��������go�G�ƹ�h�A�D�F�;V���įh�`0����������ZZ�Sr� 89��K��KU��R��v� ��w��^\�)����Ku�1r去øH�;�qy����������L�&˛ +��}rR«���b��7��Ñhdqiaie��V趺~�V�d�q���֭������w[=z���HɎ>v^�i��rlE�8l����\��� + W8U�����z�yO� ���6�ol�f��~u�����"�GaT?͡���!+;���~J����Ĕf�դ���$=A��b?�`eכ�F��l5#���R��ݿ��R� ��UA��bv��3W�- +�je���\#5V4���*Y`?�b���{�A��ې��;�v'`+P�[[a�lJp[AIp|j���!F5(��b=�xr�i�!�[��1 ����f����m5o�� >J�d��>��J���V�.�f$!��A���"�JyF�1Va��9�� �+E�,V|�"L!�9�R��?�ψ@x�Vd� +� +ap�DX�e�����ln��ڑ���%/y�K^�קfQ�����5��������$�{w��)����X�=0��*Ud���˽��UR^�_Xt���S�O�:��ә�gy��D���.pV^nA! ��b�*//%VM �����UY���;�+bA�RX����z�r������J��+�_�n���[Zpa[S{���[�{�{{A�-�>�`�q��"F��G�uؕ[;�[�T� UJ�`��'��N�EX��֩ �U�V�s~����.A�-X5�r���,uSSSk+�ܻ��w��aE�,XF��f�90��I�`�0�� �S`Ꮈ|isS�cG��I�x��MLJ�Bz��K��QR2* ��W����N�|ɌN��tw��)蕘1s'=pw�'����$�1w���W���T�1m���J�u[]������7I�~�Vwn�J���=|����������$H؊|�O��?��<q�ȕh�"l�UA +\=y��*����{�0O��Ğ�����[W�'��s�'�U�����=p���js��v#`+ 9&��D+�8X�!j%�������f4��"1��`���i+� ����uz�'腞 � �<A����W�P�[\�&���.P,:���]$�2+�Z��}!��`0��ٷ���9�V^��CI����F���q�,b+��S�jd�O[�`_�y����ȠheǴ��&�Y!�"f{F7��#�2�9J��tR����>��*��](��D�T�<g5�J`SS��U�nŏ\�Ɋ�߹���_�lZSL�. ,R`�2 +,T`�c#�B���_qVD��#���TF�7�n��?����?u�%/y�K^��+�Ȃ�N3��?|�����Ƨ���1s%�IJaqVw���.������֎NuC����l_���/,*.+���u��9aa��ӧi��g�_�}�҅˗/e�A�y���W��\)+/.+/A ,�`���J���@���P~E�A�X���¹�M�R�7�q��r� ,��ַ�nl�-�֮�A��7���!������"�� ���1�`�wC����V]WYSSVYQ��K��%��Ҳ��ʚ�*�Za���D�u h�j�K�H�rU][��P(K�V�������ʞm����H"X:���7Y��5��}8��+���D��R䃽����_�s}�v���\;�v�t�;v�P�xޒ�j�S>w�0]�w%����'CI)�;�u|;3(:��ʕs�V�D��O�JC��� +�o2sz<`e��m�jiuML[��j�V���6N�}���{��l��>(��y��ݷ�$+١��L#�!�@*BU�����W~�G +>}�� fg_��|��1�d�tk���m�[�dau����ztie> +�$�#�@���V�Bl�z+�D�a�\i��+N��Qo=A ��j Z0\��F���Vv���Ϻ"��[�a�� .��B�5��Y��J���ȬHlE>vv�H[��m�?0���m%�q���b�5�қ�:<X�VSڱ �Vc�èd���/ ���`�*84��h�r%����Ia��(��g1�V7���������K�W)��4g�C�*��b���cb+�q:�VMIv��IsY�ExW!���k�J#XF��$X�-4�PT�KXD;C�f����r�,P�������I�kG^�%/y�K^��u���������~!��O�����,��E����������-X=M-m�Je~QQn^^vn���EyE~ѕ�/�>{�g�N���S�*���A��,U�_A+'?��������BE ,a� �Q�U�"�*�8�DXT$���`+d�BR`ayP��,�U���Z@�����������V[D��� a �����"w���wp�='�]�-m��`UV�`�",~UQUUYS�,u���х��>T��j1+aaK�$�;D�ZZZ�;:���za����hl��$X�Fa;)g��fg�s� +���F��v��ʛ�hK��ܩU2{I�:w�:w +�ו*�>k�C�ʟ2��b��;�I<�w�WR�З*��n�N�4��Zq������؋$�@gmiyquUZ�z��[��lm�Elu�.���[=|�1�V��z���O����qi��b�*U�*[�<�*( \=CÕ���ՃG���y� f�͎������W�Qo!�� [yg]�[�0_Ok0ņ j�$8.&HmA� Bk +j���Qg�=A��f���m� e^�[�[�Cl�� +S4�����'�n�г��cW�Z_���q��� +�|>J�0b����G� +����fwYmN�V�����Fk�i+|��c�BIpK��I��1�{�#�'8Lb���Ē��J��Br�����1m%�+��G�)s%aA����R����@^�JU��T�@�SU��>�<( n%«x�&��$�ʜ��b�+i�.Q`y��'��U���E�t�G8�b��_�A�w�?u�%/y�K^��+�~���N��g����cǾ���SR~E+��E8K����za���V[G�,X��/,����_�,D��w�`�A�u�,����c�0+'�rNNNAAnaa~QqaIiQY�2�`a�������55�JUU� +�毠<H��W!��B~�j�Sk1ō�迪kj�F�f��pa; "���{z����K�j�M�D8A���A�`�u����SW�֖VV�g�V���+��**����`��V}#�������F�P!d���T�Z%n�>� ���mm��==�C�ãc�S�m�^k0��n�;]dq�� B�B$`E{����PBA�o <�L��ǧ��I�*�0j��RBjȝ&_����D���� y����i��41��\'��� +~�������tC��0)1s�H���\ 8fEJ������[aI���6o ������8I������B����$������b�����1lE���CV��>�E�̕�f�� +���El����=���������c��u�ꍛ������jdq)]"����\^?���:�v�ɂ�r�[i��G�+jύK��$fG���V��Z��t f�������>�u�J�� H��u�/PU0�#�*��$VWx� +�V�\�!ڂkBI0��n�V� +���!� +�ctym7W�[�l�ۊ2N:�������%A�{lpxThK끄����`eǪ ��\��P�)�b�����>%�!jS�J���,=#�]�'�L;(������Đ�^��9+��|B"+�c( tI2c���U2���u����W&A�e�;-��X>�WX!����b�p>��^�����~H �B��G^�%/y�K^�����;=���z�K_�+,�����H�W�4�P�����������}���Z�R������]̺\RV^X\|�ҥ̳g� +��ә�g�` +�[�pa��lb-X�+X!T�W�",!�U[�TU��H����U ���+^�)��<��y%��ԼK�"EX�]l�������"w@Xc�BkxbJ�����pVWWc[,���� ��+���������,�u���� Z��aճ�l�j�T8�P�:,�l�ͮ������,�` ��krF����F��f�:b,��J���ګ��?��BaE��ݽ�"���S�Z_*r��tK�lJ��ߕ*z$�#z +���OII��pe�4�����K�鮓 +g��?�O��r���)<�.X��[�������� +���q���M��c��:�V�[ݹu�����w�=�������VO[�D�.b�T� +�G �JRĞ�[�/���� �� +� �z���7V�7�V֢K+�^��ԽsA��?����+4�m(*7j`� �&�A��i+ړ���P�������2�b���LV��N��BO�c+�υ���� ű���z�%�W+|t��*��jx�eJ[����\h�쁰�����I��' �D%���e��a+P��%��1R��?�}��Ng��G +r+;��!� +UAt[!��z�i�M�/��!�aO�Q�[IJ��6�F��Vf)�ⴊ3+��[I-UB�*���d���S�0���ر�%��i<���8���ƦZp!!,�e��_q�2�/ +�G�E��*�A^�1�0d��̿�뿲�om�),y�K^�%/y�ʯ��/�e�����Ʒ�5:1504Ķ 3��_�Fw�Y���������B���m���M͊��������KY�s +���e��9w����o�:���ӧ�_�A�/��t�bV���lί �UTP�(*-�R^^���A��5J���,B�W�*���j��E� ������$=��"���A���[�-��l���u��w�lhd`dtpl�M!�5:����ڻ{��1��V�������m��}o����-��L;3v��q9��V�Jrm�K]燛��r��%j��}�$Ap�wb%n�� A��D�%Q�.uKj��3�{\v����<�{�{�P=��Tu�:�:��x>�~?OUuy��Wee�ȯ���j���j!�����b6C +��X$lnTըD�j��"��`���Z�������7884:::a�:��IvT �g���Ȏ�1��-���V�S�+�?����\::��Q�[�Qo�B*�9J'�^ �砢?_j�pPs�ʭEe�tt�*��n(�J��hF1z�Ų<�%���13�e|K��]=������ڼ����#������d��K�l� ������i+.�b���R����m����+~��L\��] \=��s�[!��˱���=��k[Wv`����$Y�WV"�e��Qo��_�E+�g +�t�n���C�b���W������ozv�����Y���K!�u����s�U2E��5�T�Z����JaV�T�1����Fg +��Dl�+�$K$#��Che�_�.���L�� �PoEn+'�M�9&�m�Bu\ql5<2Ɠ�C#���YU����&pc�v� �ފ���V, � pE�+r[�&�/�����;-g�U�UzC�%E�$lſTLVi�*��Jk��$����6��=�r�(����O!S�5���"��� �B��Z�/(��X R`-c�*���ŝ� $�Y���E��?�L��G_�җ���/}�K_����?�Cv�ݏ>z�ر�����OX�D0ae�%�[�����Y������SaI1�� +.\�Xf0�֩Sį>�V��`�A�����/^,(�+(�+�{X�*J�F�EXe��!;xUo�X����E¦�&>��ji�� +r� +7�$ookjmmR,Xm0�P�w��"X�"���� �&\�܂5��/�[jL����+��JcU-Z����jenn� +�����\��&�o��d��C�E"w�]h��w��������4�P�`!�P�f�V ��Sra�A�*�_-��"�D�қ��o�/ip�.��`�g;E��xT"9��3ZY�N��P�������34ʀE��_e���QE�Y�f��P+�`�����"�p4�{W�R���Mi+��߽�L�i���H�~������`�����%A𱋴�sH[�J�!(hU���7R�J�����[=��i������;�A���cgw���.`+� ��bheGA�4��/,��S��N����Vv'�D���vƭ�rZ�*=A�V�n����)��C�*�0�V���p0�^p�'[�&V��0ɵ��j*��.�������W�E%pCl�Jm^Ƌm�U���؍�CUJ���b��%B�{���R�V�$���ip[��is�մ�8��[a�jX%W���bv$WX���q��Bleu@�J2\��\y\��m�LC���M1P��8���:�j;v I94�*�rj;�N�W�9�P}0ٞ l�saA��s��}ZQ`!�"�;TC�E�k� +wA��'���-����d%i�����?���g����/}�K_�җ����D~�������?�������ddD�Xʄt^*�'� #���`wo_Wo_/~��b)7� + +� +/��������0�"X�~Lw��N�ṋ/��]�/�TP�O�+*J���\�� B���64Vכ�9H�����fl��+����"y�a�,+ma[wo{/"���528264�� ۈ���-B��`�m���75W����ʌFDXQ^\^^f4T�TW��@7���+���f���l6���I����Ʈ�h6�A������^���A�`A˅�)���\`�Ȏ����w@Xį����RX�Ht�m������0[� +�Ov0%+���'���'}��HR,�qk�HL��.SR�]&��k�W�.�T$���^ J�kE2/�59 j�{LV��p�r�1&��t���E���k�����.o���I���!m�/+�o�D%��;��v�ރ;���?|�%A1F���?}�*�!m%��CV�J�]Q@F + +1���R���Gw�� b+�h������_��ݼ����geu=��d��P���!��Ҭ�s��Y���$Z��Ii� ��fC��V@� m���f|S3S�s3s�[�/��$1{l9�i�f��ƥ8�bL Dr%+��s���'� +�j��� m%���p|1HJ�P��V��$��Yt[M;'�va��9�$HVv�$���Q�aq:"W쒰AI�]q�::a'��a��������p���}���D�@��U.��v���jؕS�33V��#AZő����V�,ɫ̀�#��Jݤ�Zu�L!�"��M!�H�J�`q~5 +,�BH +�%T`�w{K�+��\Q� q�&��w<|��������ͣ/}�K_�җ����wz��_��`���Z^a��Z���;<42��,Rc)F,���z��E�-B�Y}�l��� ����t��`()/?��OO��EX4����S4��4"dFVA^a�Kˊ+�Fc���PUe��;���iMC#�ܩE�X| +!%�p���̖F���B(RX&��;M�VDX���F������Ş�:�[����E�ba��`GO/F�����U�UYi��PQYYY]]SW[oj��W-���_5�Ƚ���mu&�B�",��s�a�vttvw�������ѱq�#������"XKA�`�S�~"(֊�J#�bG@���[bN�,ZrSѬI�4آ�4��NJJ�*5z��2"c���K�JI� �+~]�VX�^xN$vT�I��|�!7E4_�_W��+���t��+$�Z%Wҫl�`?�������/�\+���ͯ����P�luK��i���G�p��St[�I��[!tR' �z�6 U���+<� W/yU��K�'��ؽ+=A\ݺ�����mm_E��&譒���� +,���%�[AO�ˇ b{0 �Q+* Z��V;�,'�&.�k��~�&%��̬� b�jq)L�*MDc+$f&"�m��js-�տ�͔2UpW[� +� 쬮#�Z��� +�$Ȟ�� +��"�!�|p�U`zF \Aڊ�����@�j�Ƈ �h}PìFԒ ĮF���\q��u��΄}�(l�!W.�Y�� ꭀ\�))���I*�`Vi��w�(x%�� �K���d6���3��cWr(ˡ�[v�3��r_:,�8��be�W�B�_i�WSb +!� \� ��}��B��*��� �r����",Y�"�X��Zj}����?��?�\��G_�җ���/}�K_�������?v�������������2yjhxX�`ɣ ������P�����;0�N��-�ʂbD�¢r�`A듓'?>qⓓ���֩�ӧO�>�#X�����^P�_T\XRZ\^^b0+�Ž�V�`U�7pVY�pa#�rx� �S,�K(�Z�fx�&"X�v%�"��>h��kU0V>(fچǭ��VWkW�5�`(�e�()//5T��ƪ����R����Fs3����+aA��� ,��xEEFB^J�,X##cV���t���)���,;�^X��A�hqO$����)��Q���V������M������6:�)�I,+LO"���vJ�CJ�/#�;��(T4�5���]�qΚbj+"�I�riB\=���G1�(�I�m�t���_A���]B�V�F!��R8�N#Qh�.����oR�j�컚��̓�c��8I��g�?%���$l���Lo�z-+[}�:3s�W$1��1p��sv�r� +���ܻ�� ���=���k�m\������ &���B0X��@7=뛚q��H�dwMڰ'��5�+H[�=A�[M{0m5=;G=A�<X��'?�`+\ŰɅb����Fru���R�*����e�X��a��Ɩ�ص��Q+h��c"�CI0$a+H[-���s�8I�Ki+T�;&A�5a��f߄}�����"���ª }����>�q� ���$����Q)peu��r A���"��\ 7�[L�|�?C�ʣ�W�̤SfP*#F�!Q2��Hd�W������[���$�%{�5S1�E�������]ï�B8�+�VD� ���@̊���"�\�`����v���?�����ͣ/}�K_�җ����wq���G������w>��[������/^�ڝ��FĆ�6܅5"v�-X�����;�E�Ͼ�����,Xy��� }TVv-X��� +�99�r?s�ٳgΝ;{�¹�s��/������ȽDja�։A��8���N-��]Q��A,raQ��Ԣ�+<GaQ�Kiv�Z��E���!�,v���x��p��`{OoKGGc����XU[K��u(/+3ʍ���*��74������b6�Z`C�ž4577R�������U=�<Y� ������` �����A����e��`���������?ȯ�� h��a�'V�B�`���7��D2��ג[x�P� +I�%�A����7UX$����`D�W ��DӪ�*�R�]��h�4[B,����ƞQD<Z %E4/EXI�i"d� +��/�������+[�;����ٽ�%��{J� +���nߖ���I������R���䨕Y}��˯r�Z�\AU���V[=�y��q���0O���V{�WHo�yy�U&�-�`Pfd~1�_X���O����g[a�ʁ�9��7a��R,��V�I�s�9�Ar�s{��'8=���������DO���Z��/��+k�)�Y��6I�N�*��*��O�ea=pc5�' bCp=���+v�%�)� +�V�9rl%A&8O-^V����1�����(V��G�ئ8� O^!ע���'1��� f�+�í� �R���Ց�* [��\���H[�����*��x��>Y~%�|o�X�Kq��SU�%U�+M�.��B��/�wx"Xp�I��3d�a@@R�O�aA���)�q�\K!�J���7n����������/}�K_�җ����/�տz���o�������c6p�3"ű�T������^(� +agOo��;m4� UU�E�EEd�*��rh +�'a�֩�gϒ�]DXRPRZT^Ql0p�;�k�5���Z-�"V3;%�;T��(r�Щ4��D�Y��� �e]B�`� �v>����"X]�����A��aYi!V��h���V[gwsk[Y����Gi��WZ"wcuUummmC�`�@%PAX�4����� �B������UZZ���;;�z{��Ogd����n�`���`�<"��sQ!T�vO�h�*'���mu-�g�JI��l5:M�("y��wӵQ�L����%�S������I*�Q�QX������RnP� +N��xKy��a�i�H������*�kKy�a�� + +L'�W�F���0a���jjcc������;�X�&& ���J��nܾ{�Jvt[=D%{��J�ع���K�V�Y}�JVo�z�%b�/Ux�PWD�^}���|.�<�\`��w�#�:ܧ����흽�+;�[W�d���+{����C���V>�[Mz�lE�'+�Ǹ�>�q�W��[��N�����X٧ٍ���Vs���B��B앏G@̾���`���`r�`�uN��� +��39�B����T2�N�m#���D��d��� +& .��>�4;7?#�V�0M9)W� ��"R��H[�C���Ƞ"c[�а�����c�$8�>�l���J���� �����g�O$r�����T�S����hL�i� +�V��2ᕬO��Ri0�g?L�<�J�]�������Gf���d���'O!�S�z4�J�p���B(�"��+A�W�Ru��%�`-)ܓ��k��[�_�`�ܳ�z�o}�K_�җ���/}����������o|��_��{��W~%7/��pQ�L�P$�Թ+[��p��������lik��o(*--(**(,�ͻTZQ��<{���3�?�;=���驜��O�>sf�?� ����;�nI X�4�hr�{}5Dh" ���N��&�Wf%y%a+��"l�.w�6��;E������"X�"��Q�`�[�q +�b��b��l4[�(�UYI�� +h*+�jjL!wn�B#� EX��`���.��:�W�"��,D84:,X�<d��_,�E�V�+IU۞��7���Z�C�;D��R�$J��SI��G�-JU3E(�-[�M=) ��H7�Ө��(y-A��ZJ�� ��H�Ip��UH�eI�/�G�2�hK�/#;q;�tr�wθe��C�%V�[���o^�� `�������[�߸�>��Ȭ�v��.`���z���#J[=I�V�3��Yɜ�K�V��W_Ra�͋7_��+)������bO�����Ս�{�ۻ�Ho�Z�\Y['�U(g���R(��j����7��������I4Y�bv+�.��r���=A�w�V3s3��Y`ο��`p1�W �'V�����ĖZ���21+2����&]�V�*Bl����=���U0J� +J�R����GOs�5�u��D�L�i��� �تP3(V)R�jhxT�[QO� �HA�8�ٽ`OІz+5p�!l%F��T��v����V�f`_6Z�%Eެ٪���s�+y��D��g�����(!,5��Cf�W~5������)��Z�%�b�m�����~��?�@��EHS�<|E-Bҹ+5�c]�����_������K_�җ���/}���]�����}��/�������u����O����0gYT')GX��]���E�7���Ǿ���355*� +�� +��.�����O�={�T�'(r?!�U��X!�=�{#X�*).,))B~U&R*��0�����X����"4!����5���WMD��҈��ik[E�Z���B����������yE������܇'��c�#�h�R#X��5$r/�(+7*�FcuUUMuM]Llnjn���xjiikE~e6555"�b��q��B�؈�CsKkkE�Ђ,�,X����9vl�_X\���D≨�Rd�b|F��x����h<!BP���tp��PkR���*����zR�QXË�A)a�וH�L��Qm�.�yי\K _Ɉ)��.�|���D�P����br�K}M4�G�XR�*�&x�j}���^�I�����i+ᶺu��ᝃ�යu��^l%�V[�c[�L�Vo�i���Tx��+>R�RD1��ϟ}���g"p%�ս��nyx���[�n��j7Mo�_IFb��Z��}�V`e�!lE�9�$i� L[����b�xX�y�j���+\MM�Q���V����UJ|q\�%�U +�V��J�UA�T|t �`�Q��BCpm����W�������_��/���s��0m��V.��ᆴ�U`+( N�|�1r��U�)��&ÕleǞ�0��0p5�n�>iuLڨ'�b+8U�쪞]���!�� $U�{ʩ��'���;�l��c�&f����2�������5A,��J��_�e���I��XP!\� +!*�qa"K����>�)����, +_!�Z]c�� ������7����/}�K_�җ���E������"��{��+,����xgttX�`a +�z�)��A��haWoWo_w��D�LE%%EE��*.//*-;���s���99`��u�ĩ�OO�:��3h����w� �=���DXl0�a���`��(���-XR��� [H���b�M��N��RId��۩HHB!r�,BX �WE����`������tt6��,C�������Pa��A���~E��K�������ji��Ž [� ���U�E���0�������D�؏pҍ�gf�p�X +.A�,�� +"Xp@�hۓki +w8�Im��p4. U,(��r\f͍���h�BG�� +p�J�6��T�W�^8,c����"��(�ND��ꚻGer��P�L������yW�݈����g`+dIy�H8O$W�)H[m^��i��k;{趂�����՝�mu�����ql�DS���H[�~-�_f���|�#�\)؊W/^)�����}����>������}������:�s��p�ƭ=Eou�V[��}9�/���T�@���=8Lp�c+�d�I�R��9awR��9���J� B�jΏz�����#���?�%b��#R"���*(��D��M���Ǟ�0+��"mE%;���Pt��~i.�8�i+�$8 +/J[9�6;M���$A�V�[Pe�jڪ�F +�z+� �������Vv��� Z]�\��+N� x����u�鴴�7*��䜗 ��F��Xi��ϊ���ۏ���y�Y���Bȣer�ЭL!$�OAX~MK�W~�_�+ *��8�0^��(���6+�+a�>Ů�����c�R%<�y���Ϟ���ܽ���/}�K_�җ����ww}�˿|���������?��Ξ�ѱ��Q:�S\��TS$���Q���A�`�TTV��^��vJ+y�gΟ���O?�+��)a�>}����UP����ʠEXf�,��4���k*k�EXY��+���*��"l�Ʈ�[��J���݂s �_� +��:H�e��j����܇т��C� +[�8�"X�C��h��6��74�k�#/3ˌ�RHa�W��"��k�G�wK�+E��uB�W치L�B��y�������������-X0����V XXZ��$Ȃ����B��_ё8��y[PK�"��LTX�'E�kP����$yGK��p��Qߍ�2sS��[�����3.� a��ߴ�ɱ�o�w��+z�"1�ܬ�6�1'ܹ���%���|����7o^� �����$x������������xI|��_�R�V߲٘�+m� +��^<yF=�'8O����xx������Ս�����mn�or�U|e5���V�%�V��s~ae�:�Ǥdž�r�'��+�a+5pbv0\y|�ojfjfnz60�G���<��Ë�H0��0P1;��H��*��̕J��VQΊ��+�Z�ފ���bH&���(m�D�ja�/���l��V�?wNB�k�Q�>:J�� p[a�[UZ j�� +���]X���y��F�m��胞 `�I4\�m��`���.�N�ɴ6�<.P:_6�Ü-)Z?Ly��v�ge�_e1L�Y}C�J�n�E�I�_M��+�?�Z�fq! ,)%O!D~��iXP�K�jOa%�d�DKƮ :����/_�-¿�ۿ���ї���/}�K_���;����7v��>��w�{�؇}TTVƎ ^q����)���rG"�~au��w���Y�;j��K�� +��.���啔����9�O�b�'sr`�֙3gΝ;��{����.��+,nq��1��� BaU��(� B.r'�{s�������+��R�Xł�����ήV�W��}�}���=���D�� +��a�2��b��tt5[,���2TU�a!Z�ˍȯ�B�`�A��ȯ�m��V�Z,����f�7��,B�`5�L�d����wtu�A�����fs�#xD83�`�R(���D,�U`))��B�#X��~ZK�"��'�����Ҫ07���h�������pVXN?G���*a���b�p:��gER�W���یj�WT9G[�f�r�ӭ\�X���7� [m_%%;w[]���>����Α�1m������x��Z�Q�Vi�JeV��n<p�.wI����s���c� �x�.b��;���N=�����[W��7����-'�1��/���0L�����\����D���Vv� ��ڝd�BlE�+�`���������� +,��=�pW��'�lv��NHJIU� +>C��+�V+�c�ߝ��5�m]��/b���CI0�4`O005��N!�#J�N7��l�� ����&�i� b+���������VT�Fl�=��q��7\���%��qS��+��N��,�ʣaV�����"��"�o�Hi�@p�L�}7��'��К۵�+����>y�f@��w �Fz��Be~5�L!\K�Eί���{Ǯ$�?�38ШF؊���ӛ>�!��\C�N������]�/�o������/}�K_�җ����ww}�/�D���������3:nE���jT1�#�����>���Z܇�z��-�*�ͻ�_TTZ^q)/�̹s'�B� �N�:u��i��:s�4X�.º������bDXb�,3+*� �Օ5�_q�U�,ؚ������ f3R,��˲4bK(�H�e�;F���� +B�wc��W�W�,Haq��ux|bpt,X}��=�mm ��58���h(5 ���XUUSWW�P�-B��������v�a�Ђ�� M�lCVC�Ʉ�M��4���������҄��p�=�)D蟧"LD5���U�"�j�¯oB0F$���QR�*����fKi��ʙ����R8*���4hH�$��E��UQG�x:��[��bE�ʒע{�k@4�a˯���yA�E����`��+W��j��U( �$�k4I�V +��wxGq[�c+���Ջ/����|���~������2W�\�a����SOW��z��V0O��M� ��j����������۠�lE=�{�{����F�L�����a�6T9������p��HA魴=���i�[����ZX/�"K�R�8�`� ���@�[ɒ+ά�S�Zhb�� ��#�*ٓ��TH\X��/�q����d~�4��<D�<��[퓐����M��0�@ɮ���Yi�հB�p��8%�[�0A�ۜ�v܅J��I�nN����p;�+Y��6P/mt �=>�Ґ��S-)�J��<�m�C�jR�]e�_y��`�:�P;�PæҚ��3ߢ��J��$~�� ,�� +��+��B���W| +��l�//'Sq�_��}�$�t�� +��U%IK�+��s����[�ٿ���D��G_�җ���/}�K_��������o���Ǐ�w�xi��'���Fkt�X0� +g����`�PEXl�w`��W�"������Q��PT�����yy��Ee`�:u�̧9 r'���ɓX!T#Xl��˃!",�`U�"���ܫ����k8�R�AX�#Xf��2�S��WB��AHa�6��&RX���Ζ�b�P�`aU3��Qjr���u�,X܂�die��G��RVqaeMuM}]]C��,X�lik���!�ji2�!�enn��{#��_��׳/����!���~�`��AKD�,C�X�i +�P`a�JFXb +�:;rg_FT�"�P!~k/��K<I�g�p4RI�)�Ʃ��65�A��h<K�*�=ՠ'��(d���2 ��0�H���3x��*�OU��L�ߺ�yK���lu�:4�mu������ AL[=���c��0I�d����$�������Y}��Z}3�z z+� +�z�� +1��?�y��a@O���û��������+;���6/������2X�Che�_��X>;癚�){���&mv�[�9�����a�;�0O�mw�����M{� p53z+p���B8O0���D�m��hb�� +�L��ފ$W��J- r{rM`+�Zŗ�j�*�`�mvG`�%;=;�b��V�I|�N7/ N�� +�Vc[��$A�RȕR��j�J��$��� B�ʉ��I�[�\J�ʍ#Q�H�7����fbW�q4�P0�)��w��֖�)Xq6e�J|9��Q(���Y9�^I0ʫ�\��J�@v��|�\���l�v�_���ӦB��,MPU`E�?��co��r|,�a�+XD{� S�r�7-�O� k����/ؿ��7����/}�K_�җ����wt����G��������;�D^)��"r�s�G�x +kD�X�P$�����ED����� +��.\��NˌƼ�3�sN�����??q��O�8q +SX�N��Y�gΜ?��Eł�Ϯ^RRTV��sc���LX�!�%fB��ޔ�p�oBx��RA,۩on1�� ���,\��h���&�V���,X�C�@�F�E8���:l�)��Z�� ��AvEsk� "X �55���*/5TTT�U�U�5u�zSS#T[��� SX-0��]���E�jɂe2)��ήΞ��~�`�C;��x�|����y���B0��^)���m?��mM(�R�p؞�;J +e�����Bj�..ў��[���hLԣii�t�\2*"Oj�* ��Ci**S�xz�/��Q�-k�Wĸ4,���bqMiQܸ���[E����ۘ� b��R� +K��nߕJ��=��V�?��:I���_�|�B��^�c��m�S����bw���V�?y���}v��'x�=��7��]����y����#�V+�ʾ��_���f��X��������VV����m`e�:�6���� :&�\o��M� � �ۜ�/��6�^� [��;�Ǒm���Zb���l�$�S�*�"�U����p[-c�J!W��b����ZX�K��Z����N��x�!�j�J����:U%�0#�؊g����L�[ c�j|X�[��{�� ��*ف\M�&�V�\i��j pJ�R5�{�咠䶚J�*�'�2=�_�� +ȕ[:Ui����}�[��?���g�&�䜕]��l%5 ���2�+)篔VZ�P�����i�-�E�5@~� +��{��#�h��Z!�,ȯV`� ۇ �F�* ��k멍�k���K_�җ���/}��]_�?������o�kF'���(���O��/tX�4 kD�H����1�"� V��PkGgM}}QII~aA~a��K���`��ܜ3gT�+����A��"�ͅ)��y� + +� +�_��a���XY^UUQYe�������5hq�"w�c������Uv ��<���[��"��PB�b�5�a'�"��!�������8oZE +k$6ã�C�����]<�UWg��*7�y�VuU "��Bs+�`5���-P!lljjl�{-Taa}#����j���o� ��Y���Rka~)�>v��PK;��&������#��V0�RU�-?�}�"R= X$C!����h�]*��Eia��������O1e_z0�~L|�N�M���-��(��Ώ����\� �6.om��jJ��m�/��M���$x��������%� +�����Ջ�/^�z���-�z}��7[���WJOWJO�����ɃG��G��nݾ~px��ͫ_��ۺ���u%���LAO�b��'���3st��� :&!Fe�� ������A,���y�ʅ���s{�=�i����q� �C�a���`�U\�R��\�e]�� [��@�%i����[!@f�AfűU$��,���Ű!8�_��[��՜�7���3���h������uddu����V�& +�D�s� *� +YV�t�<A� +:ݴA�Jk�J3�O��J�Vx:-���L��~ZC���2 gM�ȓWj�J=6᳒�YZ��Q�{~.��h��J���/��B�</Eʲ,�G�_�+)�W +����tK +,5���W<�5+)���B�{�{2I�ALa� +��V�v�!łH-v W�k��w��9��˿�+�/}�K_�җ���/}�[�O��O�Z��}���������t������[���]B�x +���]������������Z,�ʪ������/��+� + +Μ;G"��O��!�ٙ�Ϟ�A�$r�˿TP�_T���Rce L�2� +aeo����-�����Bh�X�Z��N.�F�܅ŝ�Z�⎃A�N�֮���^1�"X}(rb/���`����-X#���#��jkk4���� ����CEiyyiE���XYUU][Skjhhj4575�4SK��V������dn���`�5ԣ�*��f����������g`��P�y����+�,��A�p\�$S��Wk +���������V,��El�p*Axh��Q�@9��h�Qr��Q,��R���Dr�JEX +��KW�iHTT͊e��h�"�'�x�[�)-�Z��˸uY`+J[�_�ۿ!�V�7n���6��/�V�Ĵ��$����z������Bl�Z���h�V��~,N�--p��$f#�dwG� +z���z��������GV������ �Z��[n��V��7T�<F�=A'��q�m�jk�f�����&'�DOЇ�jz6��/��*�8�B1{���(�I�.�Cx�Q�)�+^D�զ�ط�x����D2ƣV��0���>�Ğb+?*�g����θ�� z]�(��l5<<�6��U� ���M,��v�kq+��8`+�����8�&mN� G +ڑ�8`�6 O��Xq~� by�咠¬d����}��}2�H�n�9(%��:! /%ae˘9��ׂ[���W2�ʂ�ڮ��"a�kJX�Tu��7�Ma�[�i"!(��_i+���Ks��� +a0O��[4��d�| +�*e���J��'��;��q��EB�qe���{��|��/}�K_�җ���N�>�����/�RUm�ʯ�(�����(%�(E Kչ�Ƚo���"Xu&S1",�/,<��[\Vξ<w���3gN��|�駟��+�$"$��ٳg.\8w��a�*(.),)-b��V寪kiaU= "DV�Z,�)�\��#1��+3Ů�&O!lU�X�E�i���`�Ƚ�4�"�� GH�1@X��܂���Z��#XeFc){"e8������D�͖6�W@��_˲��jjb!,Ja��Y���0����������9']������R"Xh����_�h۹KA�� �Ŷ�"� +��5J6)OOXE$�������i�3Z�jˀNj؉S�X��i��� I��Kܠr�J�J�\�[c��y\N��ol\�ry�Vۻ��R' �A��:�i+�Zݽ��.b��>Gl��J�O�x���Z��9Z�_��U��&a���-[�J�@������ϸ���c�'xx��n�Ϟ���}��6[��[��=����p��Vvh���� �w#�h� ��&�[!�r�����dW����,��g�s��y�VA���=E�� +z�P�Zr%$W`��v��3Il�X,�t�P1�U& #�K�Ő~iο83���g�7�W��&=�� +%A�$H%A� b�j��V�sR���j �_6\�Ah%�b��EO�[�[�<A�'hô��W^�;�9�\�s8��+ySsN�X��i�J%PP&��y�n�Z�,�A���ܞq�#J)���eەב-�����R���`�*�& ^M�eZ�)囥V�,X<�5�����T`��_a�5�1ʖX��m"��W�%TX��%W)�����q����_��ͣ/}�K_�җ����wq�1F�����;��������'^�kL��`(!�܅kt@˯��z8����kn������JJ.������ + +N�=s�ԩOO����O�H�O�-B�`]�p��ż�K��y�*()E�����"X���A�8��WX$4՚@�^KBN��&�Y�Z�?Dv�V�� [�^5Yښa�� B�`����'V�����a�@"���l��ii�0�Xj*kk ܂UQ���G���M���XH� �����UKKc3 ,���7P +����utttw����IQ���� B���EñD,X�B��S��jm"X�b�4$�%���B�v�%�8�ƣ�T�;�l�Ŵ#�#�l�HOa��b��*�G�\��Zl��V����]Ǩ����mupx����ݿ�' j�VX� A��^�~���#��WӱՏpӒ+[�y������`+vפ�Rz���z��흽��;\o����$#�e��Ao5KV�ae�a$���j\r[��`�U�ʎ���I'�[�f�S�ӳ���y��X\\��۠ID�+1�/� +��SI����8@�OĴ�:Ϩ�� +�V�c��D��*�Oj~)4��i���,(��S[����q��>����`� w[���ld����R=�O��f�0�5��+� +��ը�bv, N�''Ԓ 2)#�Q+���+�+�j�V5d�R:�Y�Y����@�Tϕ¯�D�l�,7?�����A�W(߅����W�4��!rOgV���eu���U��i5���f�Ha��)�Y+��K�X!��%�q��>�7��p�A�ve"XI�b�Πh�D����DO7���]�gz�P_�җ���/}�K_�����������X][�j|bd\�+dY\�5�R�ѱA�E8L-��!�"$����U�`*.-�/,,(*<�{���PB�aa���S9'rT�E�������r��/��Ƚ��,��0���X�BT`A +��4�����aS��p��X��� &�j!�j�:a�,�X��"������������?�;D"����1�E(�� �5�.,�2�VIEE����j1�<W͖�V�Wm"�E��ٷ���U������!���o�����g/;�ьNج�ˍ�9����|,X�[���XQ�Rs��X�_Q�j�(�Li^�X��]$�^���R"R�@�b��Q�i�{lY�Ui>��ģ��[Y�X,������[�/��^i��k�V�nݾux��$H�<��*ٟ}���s�V�_�B%���zͣVi+�VɛL��Z��|%z���� �/��\�'x��[�a� �V���Iq���Vrm���heϓ��?�`����V.��� +VV�l5a�v������q��z��V��f��f����E0\AO0J0a�`�W��"��rخ��謦sf�A+�ъC�J�c�P8ǖ±� ��[�03��7��K�$�:�$ȱ�W�Ç!��y=�o��>�W��>�G +rl�!���� p�j�=A ��=N�<jCpR�UJ��O;:��oAr�O�Ln��J�*����b������ߒ���l +,�[ꄊ�*�L��i�w�ey�*�]Yf",�ŝ��\��!�9�B��E��ۻWvvC�g�҆^%W��� )��k-���z���㝝e��җ���/}�K_���;����v���Ϳ!�����d=0��� ��c�:�!4��5,�a����v��7�-���EE�������K�ϝ=��C��,X��� +-X�"��_@-¢��bDX�h�2TUk4� +Z� �l�&��,B�ª���Es�v(|��J�M ,�W�mݽ�=4�p���³�"� �EHEB���k�g`�����������d���%�;Y�ˍcUUUmMmC=�qaKK+� l�:���&�EhV*�u&�0Vk{GgwOO?;:�'ݾ)��ܬ?�_XZ�`���+"�"j� +��T77W��DaP�Q�0�D:ʌcE3BP1��9/JdAO�H*������#oAF^�L�y� ��§�#��Jmnm���j' ���:�n}��V��ܽ}��5m����Ǩd���gO�}��N$l����ׯ_J� +uU� ��~[6r%��=Ai��i=���!ݽ����V��@ou}{����Սˈ���=�/q+���A�;6g��ءsM�0A�)L[�`� `+�� B�� :'=����7=73���<���a�bh�z�ax{D� Q��y� +7H[ C{�<Wj� +�?)� El���4�p)]�I�J�j�=���oz�%z�����Xy��1���H�>4"7�Y��cO��� +��$��i+���a��i+���4RPXٕ���47���&�� �l��d'��P9�7�������<G�(��W�]��]BO� B�7���{��J����3�W�gL愂_i�<���,?��T~�Bn�b���X�Cl[��a���͇��s�-�.�Y���V��:;�*F,�WT�E�`�qp���߿~C��G_�җ���/}�K_��:��l�?~��յ#�"r5��+����� ��+DH),h� �uv���������ŋ%�l;w��)1��S�W��r�_��K���ЂU�,cEe5��5��Z ª�U',X(r���+e� +!�Um;R,e���EX����M,��u�v*-±an���,h��� u���vu5��645W�����)�e�A�FceuUu]-E�� BT`����b�Y�*��Q,�V2��ή���AD8:a�9�܂E�E+���#��&��_a�0J"�h���,��b٫|6�H?3�/eP �gL�-��'�, ��irY��VL��8�l��d��������{0I��>���v�`��-� �9�}����mŕ��I� +�R�V�!m%|�_fb+5j���Ɂ�/3W�^+��jWBo�{�7n���sgo������m�C��jy%K#���p`z����a���������B����� ���pql"w/��Ny}3��9� �<���|���0���J<!a+��q]��6�.�Vk����G�ɨ�$�$�p�����[�f��A�N%A�@^��KJ� ���96�i�� HLA�j�����]V}ZÕ���\!�RWN4\9Ao�P� �y��g��J���x�J�X)UA��d0+�1����Ƹ�֞�\[F[P��R���]Mdi0�$�&3�W߬�z���:�j�����B���R�mRPV�+��7�SX�-�y�E8k�*��H$����~������ ������ZY�'!��H�A����:���B"q�}�ݾs�������_>�җ���/}�K_�z�֟�韲����;������?�0_)B�kL5��D���P)f�Z��P!�Ӿ�fKkEeU~QQaqqnޥK���ʼ�BD���W������^�x�ҥ���",,,().,)-��(�A�U�����U}CM� ,�&�`��+5|��ʬ*�D�"����E��ڮ��;�"d�np�E�p@����Cc�#c}0�p���"X���,3K�` U r����7����!m#[�ۨBH-�Fj���B�`ՙL hw7�Ƚ�������,�h��p�ܓ4�p.X.� �x"����S��LZK�Wk���KM�/zD�)�&�:�YE�cQ�$!)u'[0*c�Dz�0��h"ۍK_���<NQ�V�[�$�k7�QI�����Cr[�:̜$�K������ϟ=G�Ջ��zCi�W<m��/�T��ʩ~�?9��"Wo~�Vy�J�'�Z��[}�� >x�ٽ���>xx���[w��ٿy�w��������[Wv�7�V�7�WS����*<���_$��wj����`ew���[�YU`E%A�Y!mz+���@o����^�gJ�Q�>�#yO0�Ca� ��ˢ*�T W+B�.2Wp�s1a��u�Tby-�,�V�d���`� (كr[A��V����}�x^�w�]VN+;|���\}htp& r\�K�C� �En+���A#��iE1��V�1!f��b�I�;.7+e���и@Xi�lY��2�Q�V{��d��P�=^��Kzm�]�bZ~E#����w��i赧7 +v֑�´ǡQc�U�$j~"b���;�E�囅-�E(!,�, "�"X��b�|0a����g_���O�6���&��:m2��W�Wo�D�����U�E�sU��G_�җ���/}�K_�����;~���{���l�j),9�%*�įF�H�6jr�;��z���]['X��JJ +�� +K���斔������=��?�"!!���O�9��9)���WP�_��HTˡB"�J�"D�� ,� ��FBXMȯ̰57+���f^�P� +K�4��X��]D��a�vuS��U��"rđa0�Pc���ᮾ�����ֶ������`�*0�e��4VB���������l�� F��Z�Y���4,��C�������::�z{�0�5�,����A�����F��rBX��ZWZ�~�����˦���{R�pP,�aVr�J&H*�R�I�ǫ��JQ����x���G�+�]�VlXM�0�mR�_�FJv^$�N�{�%��i�G�d��c+L[�|��V��RK��H�J�+�UD�~%�4��Tz�ϞcO��3.f���G��>xt�ރC�V��������������z�8魀���g����Y/��&��dw�Z��!,* ���)p�+��3��N��'����\`�X����Rx�U8o!vd���Õ80��ȯV����oN�� +J���L��� ����ٽ�� )���a� +[���� ���� +�U/��^�WR� +�B� +>'G'�*�J�'�wL�M* �a��r% ����N�:��ʩ5�gmfd�$ݺ�BV�o�W�7���J/f`4��8m���Ʒ!,���"T3ii�B�F�F��r�J�"�K�WP$���jF �9M�Pa�fX$TE�d� +,�ߌ�Xb���G_�������X$� V\�����W a{Cr��1E��[K��o�a�}����K_�җ���/}���Z���N�~�����?��_��;aw ��j��(��P¡::�EB?�?<��9����7�������KK/��]�ϯ0V���ٓ�N��ɡ�Ia��9s"X�Ν�p��ŋ��م��KJ +��e(5V����P]-Za�D�x��H���� �3GX0���bB�K(@ߚ�ڛ�:�E�������V��0��т5��"T;�x"X�}��35���h(�(/�(/3U��5�5u�jn2�j���[�� a�s��&�ªm���,v�f(�wtu��}xll�f��a� +������(�A�_�#E�_�0��!��V��8B$�EO�̘S<_���4��I������\>���o��B7{t����}ygw�*w[�c�}�V�$x����H�~�b�G�>&�U&��1�/_c�J����r1����i����DO�K� �l�R� �y��'�����ފ=����l_���&l������+� +{�B��V�'��ʅVv���tY�N��`� W���=u� �م0OP�|3S��)�V"m5�Z�lU�P8#��Gbvl������� ��<��m�y�*��a��_��/�j~z��,��$H� [�Q�6����jbxd|p�}���k}����ت�W����� +������0�[��qlE�+�CO��r���.�RCP���\R103m��D�|��@ٚ�veueVַ�-W���,^,�>�ؕ,��*�+��ͮmf��7�+�ʯ#�O�N���.�)�.��ǟ>��d��.,�W���"� +!��_ +,�C�D(�`;_��?��O��݀+d����ԙ���%��<��sfq�����փǏٿ�?���?���/}�K_�җ���.����c|���c�%%�6�脍���udl�z���}���GFT�; Q�E¾�����:ScqiIAqQaiɅK�K�J�+�_�x��i�`�8���)���P��,E�.��+,�/�A���h��,������U�� ��`��),�"D�įZaY��+8m0s������V�P���"X�}��C=쨖=��!zqaY�į���(DH,a��a���=���r�`���kkj����0��� Z�|!���fea���a�75������`uv���W��D��n��py<��in�Z +� B_�m�B�SX�<��,�_���J#?�Z���x${�)��L�Z�^}9[yp9��"�JÎ@[�x�=�-bv�[�ڸ�}e��6W��P�V�oypx�����L[ݿͱգ��(m����O>{n�'����D�Ul��Y��^iF +~��� +�z�m� �!pEV���oݾ{��v�o��]��su�V�络L��_���ʾ�8 +���73�eG�`e�9]vDŽ��Vr��&� :1�s�����)���=A�>-,�����V�D1;;�'VyU0)g�R��ZY�6W@�i�x���[�/��"l�Œ����.���i+X� [��W�V������UAU̎�XG0p��\PO��leuBO���H���V��(��E�*�P92P�Tf�e�=^�z�4VGJ.ί���t�"X�pu5c +��z��+�;n�Ia���+�7 ,���]�Z�OJg�����Bܙ����&e֔�b�Y����(�۴~[�sh.Eb�嵽������믿��O�6���1ŕ�Jr*�IDX���$̻&'�x+�SX[����y��/}�K_�җ���.���v����o����o������ud�Wx�A,밬sW��c���8Bl�Q����4�X*�� +K��/\�T^Y���O�>��4�,Xg���6�`��B+#X�E����ee�b!F���UU]Cu}CU}}M���d"�{��W�b����X*�j��7�plE"w�W&��*���w�A�܂� ,�W�"U#X#����m"X#=d���hji�k��2#X�K*��`!X�j��M��"4�Z����f�"a��bA�{K�h�5@�P���^�pGwwO?���B�5�������ɂ��8ґ,X8�m]U�op�ED�Y +�G�����l�c�l�K�.A�x�"�2�W�D$�F�9�e�t-�/�i4��ev8��i���;�w��^�%�����ux@�o�;�I�w�$�Gb� ��>+��g_�����/_���+����D�ނ��\��/%��+�Vop���_�x���?Q� ~v���{he�u������ܿz���M�[]fO�Ʋ�{4�V�`d~)4X�� x�'HVv��V��l�1+Ъ�q+'WV�&l f�;]� ��=A�oƇz��?{���������G�A)S��0R0�pŷ���r�"fW�"���ۉ��+���Rx~�V��¬a���S�^ߴNj� +��Ǧb+���V4L��Հ¬T`%a+4\ ���!��}���G&@oű'W\�.PX�S��\��U�̡�NA���L��䨕�v�IQeu�i�5 ae\����f']�v����R����VU�'�{��:�ܮ�#��V��ݧu�{剄N%�Z�%l�u��� ���"wHa� +,��}�}l���7������������/_�f��X"!Z� �Br%&@�*��_�Z[]� ��Jm^�z�����"ԗ���/}�K_���;�����?�������� �+��\Q���B8<��!�@�+� � �uu՛L������ �UTVF�s(�u��ǔ��"<{�<F�.�b�0�������������h,��4�ª&Ve]]�*ba���"�'V��^��[-�D��{!,atV�:��"Xlk��i�����!����*"wDX�H�ƠE�;�#X���fsMC�����VT�F������VSc��ٌRX���v�X$!�+����DSن��K����:\.7�`����;������' �ZMmЎ̯(��LmH�D�fJ{�["Ox��+-K�+@R�5I�: +F�}⊫��\/�z�D�ԭo��a����R� +���H�~����?�+�V[��S%m�B���(>����G5��̕\�|���z�/>{Jz���?z��ܺ}����������w��U�V���b�� ��Z������y|Sn/���d�<�Z���]��/`���N�[��֤n���M�N��gf[�[��}1��U$�$�8%�*ȱUB�\ii�UŅ�*��a�*���;Q��p��V���%�J��X��NOz����t�� �s�ꀨ�q� ~j s%;���Y��!�aڊ�=A�[��z+ �r*VvN����C"'��R�f�8�#ی�4 ���p∉�$�:Q�*�K%v�~u4��(6x��H_j��S)���ň�~Kry��.��� +�YY^�nye�(+� y�),y�dqWN�,�ܧP�N����g��į٧���������_�����?}�ӟ���}�1G�{b9��ߑ�$��sOa�b���I%��b���J�6>x������Ǐ���/}�K_�җ�ޡ���N�������?������''G�C�J b�K),R`�q;���bP��78��?`nm3TU�����]*V��gsN�>y� "�-BDX�Ξe۹�\���`��������Pl0��V����Um��Lp +z�F�_5*S���-Xf2+j�B2b5a�*�&���Ki +�@� �܇F�Q- ,l�X5"w�������~E���U�,c ��*ʌ�"�������D�į�:�[��-�Ehij17�� �h��� ���ȝ���;;{��(�e��]��/�`-@V|�[�T���ZjgT��\!\,"X��������@�9R�O�TĴL|IMUŖl�Jމ�{�7ѐ+���� +� +�������&�AɎ� +�V���u�&L�����[w�QC����i��m�D��^�T���7Ȭ�!�0(mI�G?�:U�����pz�W��=��V����C�[!�:�{������]?`Og{�����뗯�6�����h�Ide����{�g�[�� +PN\ـPa��:6aW$WH���ns�HA�W� �`� ��)pűUz� �b�H��xO��X{y�o�5%jŝ��Y�V(a�S�j1�����s~pvͰ�~, ����^* R�j�� r�yxlh�Θ��*����4O3W +��ٯ9�D��0b�� ;��q`+�Ý���L��������y9�d2�r�Ȝ�-I)����\��Օ���"Tڂ�������r��-S)�6N��f�ޞ�zۤ�� +���f��Rg3�PHQ$B�_�>���9�_M�),��D�9�;��ۋ��7xe}��r2���g���?��O������0��q����C[�u� +�+�ֱJ#;�6x[|N7�����k��}�K_�җ���/}����~�ޱc��裳�/�]n�\!˲�(R�1i�(pF���0C�"�"!���VQQQiIn^^aIiY��|n.X�N�||��'�"<A+�4X�O�={67Z��.�� B.r/+/6� ƲJί@�E-B�`�V��+�`�8Ba5��Js��������tNSk+���!�e�Z�(r�Tƈ�� +���� B�`u��w�*�J�`U�T��ʩEXY] �������fa�jmmo���[�_5[ZaA��D� � ��P�N�����` �����8F����� ".*��X!$���,Mp��+(��mpg�G�jb�C'��� +���~�r$��I��Z�(���P.̭�˔��`YZ�%ӳ8~�� v��(ٯ^����%At[� ��m[��9�z���x���V�A��Ԅ�_h7�eeJ��[a���7�����?���V��Gu��C�8Io���ۻ�wAo��z��;��������{>7��w��acb�RwWfVWu�F��B#���̎4��?Ҫ�dzC���=ὥ���$�2���Tu������{ν�`V��KW�=qq �,���O�~��������B$)�� �*�Vv&�`��G�+\R[J�� +�������`,��%� ���䊝hc�jbt{�3㓳�������\��A�Y�3n~>��7�ǟ�}9��Q�J���[ ��q����/p[�� +$0��K��N'%����L؝�(a+Ir�h��+'�Ttz5���� *Vv?)�5� +� +�JE���-�R1��v�`l;{��*X%_�����J��W�@VT.�O�ߘ\R�H�8¨ӊ�Sq��;�a%�j��RPS'��+5v�n�3(Kݩ`ȃX�RX�j +�\��̂�c�3K+0sae���Wo(�u��á�1�Gl���<e��\��!����Y�.�^^^�8q�������G_�җ���/}�K_?���_��]����صsǮ]���?vy}l�}�d�G:wQ$�B�`�A_�"�;���<�h��mvE�J��3����r�33��UT������Aj�w7�LK��Oc�:x���t�`ee��d��e���Ƚ����*�BX�vYuu9Ue�e��+��B�֚D�����5IJp�U�`���Kj�KD�~?|!�]��`h���76����,�`���� �b>�����>+5��j@�ՠ��k���nY��`Mu%�k �:�`Y��Z���mv���#Xq��'F�&g�aQ��ȕ�`��+�E8=7/1+�;MK�=+͒�JA^�\�PS�-囩mA +Yin�~C�c�������������$���ܙs����$A( ^��u��+<m�6/ B��ޭ��`��}1IP�Vl� �d�Ъ� \�H�z��V +�B�՝��Dlu}�2�<wa��9����8�r|��i�W��qj�@���y�G��z���=�مz�X0�a�<�= +�����>0\E������8��ƻ�]���zٙ� `��������1\�O�M�<A�A9;9�SgypzF��f9ŚSu=$c�/A���F&������F� v��ۊ�V�h��E}����(Qlǒ y�yI��ނ=A����3�+i�`�]�+xj��'�}!7���>��| +��K�U�N��:�Ů�x�T ��3��!cW��U)mA_�m��7���~� ��� �+�Wq)m%�G�B�룱���w3��Y�_%�CE�H�Ҵ���b��w$Wt��,�,A-i!�.h������,�_X�8q���m]���7�������o���2���<{�S���Qsp�@�:�k���#�<ݗV֮]�������.H_�җ���/}�K_?��{��� ��cLJ��՞}�ٹ%�\^�]�Ј%��b"�[�%#�`Qz,Xp2�lhl�6r��E��s���������G��ݿϾ}��}Ϟ��ڗ����<��СCǎ��E��9Y�y���م��*.-~UN,�W� �����Z�4�������WFS� ]X�!gVxPSϧ��7� 4����(D��į�xD�N7�60y�E��b��nojk�4�P���������8��0�� ������t^e��3B��d�aCB��h2��V ��b�b���כ-Vks3�`�=�@(�F;�zh�����8Y��)G���!,v,�WJkqyUFU�Y�DJ0%�� N3Z<��)� 8�(�=W �J�����,�;+��X<s�ԙ�g���yt[qlu�VWx�Ju[�R�V )�ql��|�(ٓ�V�5�*���%\!�����<A����z���+��s�O�9�~����[�/-O��jtbjxt|px惝X��q{8L0� p��� m��(p=A_0��Q!f�uv�A��O��~��6�� +WC� U=J�x�jf�U�T��jZ�,1CJ������k[��3<:i�avwƐ\ ����ʏHҺ#��p$�����^ݵ���CfQ+[�(j������$�b� �+;��\D�Aj���a����i�`��� ��G@)���N���!��R�~`7P!Q�N�&um0� � +�N+��i+��c����Ի��� �ޑ�zGL+A�.˲B��;�V�,/*F��²�ҕ ł.aw_g/Q��n��=2>;���qzaquvn�ŋW������e��0�a�k^�W r�_����+���ZY=N-����� }�K_�җ���/}��֡�w����Ν�W���*�����<�����\���;��|.�`��)ak���^�`�e�d9v,��(#+{��C{��߽7���"TDX{��u� ������{zvNfn^vAX�!�E +��� +�`a��-�5��� L!��AA�:��2rx�#��¯̂_�!Z�Z�[��m`�갵��1�,�`�;�����Z��d0���*.�A����ŅŅE�%�eģjx�����"�m�7Q�Uk4V���,���J�`a��dj�VSkk����(.�?,e�����������;ߙ_ �����`/��j}eu}y���¢bhx*EtJ!Tbz�&j%�*)a�AR){���@���� +ĭN�<�������:�<�7/l]��Bl�) ���֝{w�=�r�%���<�I�Ϟ?y�%A�ZIi��UJx��J�|���+�'��n�ފ�Aou����#�Qo��qrem��p�/.��ə9��O��j��q�z�b4L#Iae���� +��F�Dl�B���[Żc]���$���`�����#8OpD�ف;M�NL�!���R9�������,Y��$�؊}���)��F�}��I��#}0I�����"lEwM�����{!�p�������V��R��m�vP`ٸኽd!�b����8�����`�l�Uz�a�f����f�'��D1���'�V�w��'�+�M)x*�J�U � 럕���@m��"$O�9��wM�P��Dž)+�Y)�r�0U�J����8�Q(��]�K�_�"��k��5Kt ٣��7����^�����7N�?1:>y��������~��w�e�#�e� ��4o���: +w�%d/�ł������"{�_[]������җ���/}�K_��e�ٳ����?����c�/~�����`$F-B8���C���K��e�����hln����+(����-�?|�XVnn~Q��G���K���Gii��`/ ,�� �Ç=��QD����������ST�W\\�"��r�`�TT��B�W�8��6GX��B�K���ɃJaP���cί��*�KKkc�`�9N�`�]���-Xn�`9�-!�e����U��������y�y�*--������uu����`�����H���j*Vs�;�`�)���"wZ�B!D��G�GЂ5���f�k�D��W��"�Vր_�4S͌o�Z~2�JВ��D��5�j�6�fnz$��7N�8u��i��:}��V!mu �V[��n)i+��ߔ�V�� �z��[�!m��+�_�H[%0�Wۑ����+�J� >�{�����ލ[�����ՙ����8}���S+k�`e}���<�ۍ�O�ު���/�����v�*�RP��bOa�'ȶ?�V�@(��<�X�=Jbq������1�����džFǑ\M���Uqc�JLT�Vt%��繌f����i, N��jbp(�o��(*����;��y� +�$F��da���{."W@�l��J�W^��1W`q7�3)p=Aa+���p%��[�B�M�N���I� +hZ29Q��)}V�5���jY�W�Q +��'���W)!XJ��2v%ѭ���h�HD���b:��%$�=W�`�� �Rc�R�R2�T��ģBQ� +���x}���ʡ�zE�g�X�=�����!�d9�qzeu�=��W_���շ�}��� 3��E� ���r�(f.-,,��y$W�Ǣ���ZY;~q�+����������/}�K_�җ�~D�����sǮ]?}�����/v2T��NdYJˉ",'way!��t�P����^�v��"D�� %�������:���[P�������B�ў�w���8m�}��A� +�:�-B�B�����]X���K� +paIe%Y�(UV,����HX�la��\��{� +������+��26P����-Xm�m�����A���������ľgU����������8� ��E��%%���UՆZC����dj��G��"�2�K�`) +,�UU5�5$rGVSKk��fw��^��`�A�fhxht|lbjO|D�pIm +�E�+%����>����Pms�~vf{05�}�jɕJ��f�痖��Ol�<}RQ��Ò����[p� �!p�i��W!mu��mT��S' >x%AH[=}�A�¬���Z l�*�b����3[=}�{��z��JO�ʵ���^ۺ|����6��aw���S��7�/���bwt|�������*�@ڊ��0I�#��+/�+���A�h`7�+�V0O��� "����1��������$��s� �����=O��%R�i�&c8I��������#���V]��bg�p�cw ' F<� ����/5�H[�0A��+J+�����FD��[���R��>Qz�a�?� ��+�����#S����VJ�,�BiO�����m�IO�Rr�^� �+ ��*�6,K�c�6�w$��X��=��(fFZ��R������~�8+��?a��P;Rv�%"Ǻ�#XZ�&vF_��'�C5��c����w`htrm����ѱ�7o��w�}��o�������ã��g�g�� ��>+��؇^A�X����W�����?11��җ���/}�K_��h�����?,v����"!�+JaIEB�_yh��"��p��E{��ns���-U������YY9yyGҏedg�B��{��k��"�"�}�?t����`�J�A�P!��.(�)�VIIaiYQYE��Vy5�*k ª%xUA,�@X��2�0��Jt 1�e�),i�E�`� �ƶ�`a���,�į|$u�9��Ĺ��fmn55Xk�L5��8�Z�E0���������������Pk�7�Ճ� +D��`���^g���U�5��U�@��5��:n�jjnm���� C�h�����,X#c����<�@kyU���+k��7������f��[~���%)��+�oM���y�C���[�9 mu��ի��'xC�5���}��"�b��O���s[�L�Z)��՛����� +��*Qo���O=A�[]+�����.BO�ݩ �[�$����� �[�M��ü�o ������.��Y��� +�����|�[Bڞ`g7`�ށ�^������GƇF'FF�G!p5�Tq�$�����y�]�a� +�"a+p[aIz���$�`��~#8�؊ݣ�. W}Qt[�#��@�� +l�a�|�)ԓI�n��qۚ�;8�jC~�Y,��.������0A�'��=>� ��(V��=��Uv�B +_��z`�N �y��V��%�xE A�Ĭ�� ]/�,�V��a�$c�w��o!GO�JV�+aL��Z���� +����?�F~T��6b��W���UW8�_�v����A.�B1d��X8���]^�����"{=\Y����π_}��W_}=37?E�'b�\X�B~E�"X<|�D�A(�,�2���֎o���G�� }�K_�җ���/}��֟����c���g����6����2�У�x���)N$t�D�SXv@�w����̜��\vy$�XnAAfN��C�h!���ˎ�WH�:x�[��fd�� +s +��BXT",DXQYR���� +�BH�v�����2ԑSX^��\Beaw�b�26X��L�&�W�V�6�3e��"X\���q������� ¦�vsS�#X���A���**-.�;"��3�L&����j�o�~e�Y�X!����;����������-X��A��x���Akr�EpF�w�?��ʧ"�Z�������� �`Q%Pn�;a5�"R�MU����a�b0L�������[���V7/ln]Dl�)�업��ڍ[7nݾy�ޭ;��mu������$A[=!a�W��^��V��*�*!p�� >l�����<z���u����wQou�ʵ�[W�^ܺr������ʾ�~���� �465=:������+;�!��B��IRǞ�n����\yAr�!s�3�8��SO����g��o�o`���!5<:�z������i�V�����D�j��:��&��%A0���O��O��M��}|xd|ph}��=}��dG�U�R�h`��__�Vl{NND$�+�S;FP��6ߤg������r���ʼ7�-�T+{ʞ�Ĭ={����*�oRg�bI�F�mV)�R���UJ$��R,L%(���ہ)��N(3.��z�R۽b�n`2��")T��ӱ, �Vx��&ߠSr�wjq�4e[��ŽK�XJ�� ���m#q���pL�_��j���{����/�-,���������䃇�����o���믿��,9���gf�P��y�B8#�Ȃ�SntG��� �+��D���o�wA�җ���/}�K_���_{��a�������>�կv�����:w8m2B-ta�8¢Y�I��p��emn�6�Yeg��������c�`!�س磴={���x�^�W�S��ѣ\䞙����*� ��(��$��"X܂U�������W�bx���j��ȋ���B�R�Z�d���T!�*�f�@XN�`I���n�`u�ؗ�,��:SyUuiEE","V~QQQiIYE��&����-�����X&3�`�Ѡ�"�"!��� B��������!"X�X������8ۇ,��Q��$XJkzna\����h�H{Z�q�/��%�iv΅�����$x�쩳�Μ%A�$�uy�+ٯ+J�k7o]l%�V[=l���c�$����d��VD�49+e�~�$���+� "�z���<�����Vhet��թ��O�:s��ɕ��K��"+;���� +���H�K���[��ȕ:R��� ��!b+�'�Gb�h�+��þ[gw_w�@O� ;5�Cl�+� ��G +N�M�LL�LL�� ��Hߑ̊����j5136>=6652�Q�Q#Jv�"�U2+���b�Qvv��b b�' :=P��Dl�b+r[�Us�Z��f�z+N��'�Bl�7�����p��|!i�`�'q�����\R�'!,>IP)�)7��5Z�x +xۮ��G�%��-��4)�������T� G�{,1��b�b���/:�sɿ����7V�U<Y����v��Ժ�5�*9�E�~� dE��� +�c��R�j>q�7��ؗ���܅��ᑉ����/}���T!���/�k5{�BLaAZU�!�5G�v�c-�R�""����������W��7��+k�{!}�K_�җ���/}�(���/�%��������?����������O� +�~�q,��ܠs'E�N<�t��E�N<��d��fj��VTfdg���ede9v,'?�G�0v�{O��=��� ��+���a� ������@l�8�`�����VV�UW�U�Tp�e�� +!�X��H(�����IT�K� �+�l[�0�Pm +����1�e�#�|�%�`���`�2�*kk�*+�O� +VA^aAQIqqiIyUE�paC����h5[� H�L f���:v�Z��TC�������d6[��M-�r�}>(��ޞ������ �`��R�$+J� +��+J���W��b{ay%ɦ�9��ٖ_��kZb_3�H�`~�<b��'O�� +�)�/n��x��֥�-H[��������b+, >x�6N|L�����Oq��s��Tf��V<^��* �R3WjO WOi���瀭?��������y�.�y�ݼ=��.]��y�܅�Sg8�Z=~��n�Io537153:1542604��?���*��Nx�ފ�쾀[�\��Sȕ����B�@��#�p�}!��Gc��xw���z�{��\ \���8{0��@���<pųpĩ8���!+UƎ� +}�S#�'l%��v��M�9�"%;L��t�/d��s8y���mvJ[qf���UG{�qϕ��Vlw�K��� +��� ��<�� m�z��Vjn=W!���Sh��G4���'ٵ�CS��>��C�$�:��]�*�Iir_͊��%[�����䲒�Xq�Q�;��Ăa4!�%�&�_)q�@$yd����.v&]���`���u�<��ڠأ�/��_���{p�G)�;�Fb]=�)6��208Be^v����ߢ���/�b�u��ós�X�Mq,�`�Z�Cr=�y>�PBXp���r���'O�7�w����/}�K_�җ���#X���g��������cǮ>؝�7��]������N���.���=d��a4X[���TB�WP� +�hFzF��`��X8�p��4h����8rD�`�g� B�`�痔�Ž����RX r��aMYu �+,�*),cU-������D�8��c��t�3\��ZgmD�;Dhmm�ˮZ��n��X��r{m.7�l3D�ZLK��TQSSZQQ("X9��%�E%�e�ȽF +�BxE)�z���M�� �US�"��j�EȮ4b�������`�4,�`͒K(����T��������� !�I-��lj&1���Y0���`�ji��<}J- ^�i��˛���]I[�������Jvm� +��$��%��[�I�To���$WP�F +��� �AoE��<��0O�V7@o�y��ŭ��^�9{���렷�����*�����Z�������U,����|�(6�p�S���n��(��X��sl�7#��}`h�� B�j|j\1\M�R[���WM�r�$���W��0�V���d�e��o���c���V`���Ba�V~8Ogw*���넒 a+G� �D�ڔ�U�+�.1��.���ܹ�N&�|<p��!p=A_P��PUP�O�$�Q\� ��x@;O��ѷMְ����6e��x��R6�K�]��_?|"aʟ\tc �}?,�%�YD�ۂd}��TQ*���b��|��ʟ(��~x��Eة��v& ���F�¯�^�`4��˺�V��;@�R��ƞ �h������2{������������o���}����������,�igp� %��., WsK�������Z�q���ڥ�W��W_}��җ���/}�K_��`���.~��_�z��?��O�������� +��� �`Y�K��Hhwq������f�k�A�Y��9yyY�9G32r�Q�s��=���NK� +��=��o�^�`a�Z�������]P�[T�W\�_RRTZV\-��ʪLa��]mBK1bA +� +��|!űL�����Z������*"wa��m r��f!��@��j��i���Pe0�WUsVQaNa~~qQaqqIYiyUeUM "4S�jijl����j�,s}�шE�BXc0��2���V���t�?�?����`��M�M� �9�`-��rku�?{}�]U2 Iɨjb�������,(ٗV��6p� �ϝW��R���u( JJ��[=�b+1IP`�W/�Y%`��ۑ+�ފW bv�'x���σ=A�[]������������5v��Io59=<6>0<�;0H�*�ٍz��&�:�Z��ʋ�J�Vl��*�� �#d��2O�}��~�VC��džF�GF'����( +Sqr%��8ɬ&�`�rV�`�����'i@�����[ v���#Nd�� +�c~P��=�*���x� +J�툡�J���Vʦ��Xd7�� ���SO���²s�� *�*B�@�[I]3[��������vz��qS�V����#c+͎��T��Z�DҕRu����TX�O��Jf\�j�������)Zj-X~i@�_k���nJ^+������]#Xڡ����.����.E�%p~�!��z�a�/���,m���KA� +ث6{������������<a�/���[���7�_��5<:>=c�983��ł���"U�y�PL'�_�A����������[����'��B�җ���/}�K_���_�f��������v�رk�C��Ѩ��/��� l�`�#��A�Wnl�r�ST�W$R�6�T���dde���MO���Q�`a�H�-´�����O���ѣ���ӳ�2spa^~NAQNQQ^1����J��+"��r�W^�H�Z0�����VM�J����E�P�uXȯ� uR�D�ښ�!���N��#X��,W���L,kcm]}E5F�JJ�EX�[���KJ!�U]k0�M4�V# ,�`Y����7�L��C +KQ`U5F��_hmjnQ"X�`v��(�`M��c +-Xr��~���¢�������EB%_*{���Ƨ���N��V��7!+;a�3j����%�V�.����Ui���ܗ�VO��V<j�R��[�U����b����<O��oݹw�엯�غ�z�ͭ��/�:sz�'W�6�[-Amgrzntbz�P�����}���]ݑ8Xq�!p@y�'H&+�!�\���bv�ݒ���H,D�+)����������r5ԏ���Q0\ ��������iN��R�=N[䬐\M�Ai� ��F�F��>��%A�ꊰ3z�VP���7υ��.�Rl�Q���{�m�$l������� 'W4�ß<m�w�n* ��= �UX�Aa0�(��C��sɺ$�6�����徰�,%���eP�S�;�E�9^���o�"L1�p�����i��"T��W��5�+')y�>�J�i&ī8W��� +��UJ�%+������ë�Z�<H��`���<'��pÆ�L+� ��aw�|�PWO?{��:{:;{F�&���K�۷����˯=z�^Uff)v5 .,H[�B�ba5-Z�k�q!� +��{���7B�җ���/}�K_��q�_��;w���������Qo��C`����_�`)]Bn�"�;���.��aQ���`).-���������9r�Xv~AF6X��� �_� +���=lS���>��"X��\��ܢ��DX\V^\Q��ʯa�s���A>���Ra��!����q,i�`}m�r�D�,��6E�P�ނ"�G����|���j�7��74�`�P^U]RV^�,�`�� �����J�#�2�B�W�X'�X���:���~l���P`� B%�emnn���\,X�(;"��`��W˜\-��Q +k�G�8�Z�8���65;�Ъ�Ym�jV���'8;3�Ⱦ`+���:s��Y�V��0A>Ip�VH��mu��;Bɞ�$�(�_=����چ�kq��x�4O�����Dl��ɳG�'(� w��]ne�zm����:{~��6Po�X�g��>J����Ξ�8d�:�����B�*�z+��H(G�>5=A��1;� ʁ���ށ����~���ƪ 'W��"��� J^a�J�NLc@���f�Il%A����^#����1( �������S(�� E�Z�R1{��ݬ��X�V������ :�he�<>( z4O0*Y������:�z=��ED�Y�@M +r�ęRd��J�`���d�� E��Vr4+!��K��+-�')����u����cRa*��z�d��|xMTU�k��IR,��W�p�?��(���X��)�I��k�UWHj��C|�� ��A'��:<d����cs���ƞ#�u ���F�㴅�����^|��w�|��W_}�^W'�gQؾ@-�iLa��;^�� +��$����W4�cai���G� �g�}��җ���/}�K_�����ڇ,�v��������?����a8�/]\��W���uX��]3���;]M��U5����YYٹ���K����/<|,,Xii�{��=���~�� ������We��f��=O�����"d��Ue�EX��c��h��XmT(��z,�L +,ҹ�Z���,Xm�V����ts�G),�Xd�b��֖�zk#Z�jK++�JK�sAJ_�_\T\VZR���h�35���e��EB+���L��:c 0�Z��DB���`�/inko��߽��ՔV/Z�F'&ǧ�1���b��` ~��k#XS�Tf�!W�dgR�d�8�~��3����V[��\%��m�V���x�!)ٟ>z>v��zI����W(WO�ȁ��O^����W"sű��K=����� +�V7HoV�뛗�'x����s�'��~bi�������;mD+���(����W�V����<m������@��<W��<ހ��A�Ng��XW,���UO_O_?��G��*88<��JL$�*���A�rV0+��(gž�V�˂�Q������U4��~^E���c��^�R��9�(��615۠�hW�V��Zr��1O�W��$Õ݁�ʉz+�V���� +�(���|�`�W�����@M^K� +jh�v��Ğ������ +jcW m��2`���O�u���[�&��v���gO$�&��� V\�ɒf&�,�9(���`L"Z���b�xH�C�����!5�D�?��+[�������ÅD� �h� ~���P�=ˈZ���ǃ�n����o�_}��g�._`5� &����Y^��C4K)��}�,�K@�W����?���FH_�җ���/}�K_?��>���g��������@����.�>5�EEB��b�����N�_�����d����C+77#;�HzzNAafNC�����H���P�4�`��:|���#<�����-���B�_\ZXZVTV^\F,P��Wa�";@���WD���nA,M����u��� �"XVSc��#�VKK[c[{s������� E�^�ņf0D��K��XVUU\V�-��\�q�%`�������V=E�p�����m��b�4���F���h@~�#X�Z"l�665��vt�����e�AaD���ᑱ���鉙Y8�Y�D���_�^^=������'�Wק1�5%��� �b�L��Z�8�~���gO�=�܅3�x�����ŭ˨d'lu� +��n���q������zp�����?|Di+�V��Ǯ�V0C�ejl%Ǯ>�«7/�F;Zٵz+� *z�[w�^Wz�W�q��9� n�:��~ry�8��s��#���`�^v�� ��XWw��C_��Vn&��Vv�WPD=;{Zy���p��'�w������=h��"����[��'fƨ085+�Vx=ı�Į�'G�Ali�����>R�cڪ����$ռ?��C0I��L�80m���ģ�m%a���v�-�=AH[�Y<�8��y���<��%A_�E��V�L��IKW�r+/;m\G#�@�0����ԥPZ% ))yQ�@D���G%d�<2��^��o�R��eF�0��"�D.I�vO)�J�)�/g%^�&r`��`��|W�YJ�P���� ߉4���@RR+��_��wz@�B��\����e��|^�#͖҄6[SK�m�6����؋6{A��]��>4�^L.\����/�F~��g_ܽ{l|r��ff�g��ܾ�43� +\X��x@�+\-Ρ���X/��}ayqi�]�={���v��.H_�җ���/}�K_��kϞ=t�s��;v���?����,8�F��+�`���X�BS����<(�rٝnz��[Z� ����̬��������-(<���4�`}�,�{���:v���c��_��"�� ²�r_�K�`�½�W�HB~)���%����DB�TSXJ��Z�بD�E��[�P�B0�����cWB�CD���+jjJ�ˋJJ�`! ���"@X�e�5�5Dh������)�z�W�z�_a����U.BX&������������V�� Le����3�JQ��̯�B��������Ɖ����|G`�9ܳ��/-��l�:�q�̩�J�J) r�*�o\U�խ�7o�QJ��<�����GO?~����A�VH�dl�B��I[��D�뭔��#1O���GwEO��m��߸�`��N����je_f�����Q��cOp������7�x����[)n+��V�V���avҪ��"Q�[uvǺz:���{�{�[ SU���8��h��(ƨ�Mq����YM�B�(�G�'�rlrxL#808*|��]=�[A��;�CI��n+T�SI�V�B%��l[��ٮ���J�� +\9y �����E9p� Z�CB���>a�t�N�֣�v)ٶ��-rIa�J==0�-�!XS���� +�+ �Gq���w ���l���� J`�g�aRyÿS�*���R��HB�Pa���*&�er%��� i+��ULkt�KZ��?oMV�6�����⬘�����c�@�=��./{�����s�Z���n�4�4����g�����e/ ���o`�����8����_�͗_}���_��J� ��Þ�!X�����""D����*������,La-.�(]��w�7�_|��vH_�җ���/}�K_?����g;��������o�ͭ�x�P�by���P�s������),�k���Uo����e�����g��>v,'��<|8m/X��a�����k�b��!D�8p��!��K,D�STT��GAX�*��,��&�ŧ�s7� +!�a��A1�) +���%���^I�JDhmmoD�!���)�z��B����� +#Xuh�*+*)�-,�),�'~UVZZQ^),Xf+���M �EXoi0�8�C���`������W#�2��f����tt�߿�������������4(���⾰����*���Bw +��� �`A�p�� �� +�Vg����셋�.l�t�ҕ���(n��r��`��w�l����Dz�}۴�B�$T�F��$rEUA1R��K�V�z +����'ȱ��{7o߹v����7.aO��v_N�;��Yv�r|}q���������,x�� ���{��l��{|��*i+ +(ⱟbK0O0��y��p^t4\�+;���G � ���M��䊪��r��+�V��/�xE��>v�VT$��ouqfE�w[EA�Nn+/ b y��$�"�운U«v�j���JO��G +z��}�V�w�C�U@ \Q ���D�{��惘ŴT$���)Iƾ�z=B���UU"2��R�U ���oJ��m�Ug���p�tVB(KM^�� j�X��퉓���@V�(S���%�d�$W;�Z���>��%f�}"��M�XR�3 �SJت+ �aʃ�X�"4y��ڮ`�fkGck��������v\6����0Ɨ�3��������].-��|�櫯�~�ٗϞ�X�8919���I����yD�+�\���"w_q���D�🀅��j���ї���/}�K_��n�رk��]���0'���`+,��lG�� ++�xiw��_� ��j�1'??+''7?�H�1���IVھ}����т�SX�=X!�!D��ӏee�ggg��f��S�0����,�Ee�� �Ҫ*�VJ�AbY����ձ��몌��y7�P ,��ڤ�`���6��A��B���j�;i!Z��+k��U\V�E�EE�%0������Tuf�UJ� +��l���FS���Xc4T� �j��jkk�F�`5�Q˅�X���-X#c#��3���B��V�W��B�B�� +7��ؕ�'O�<}�䙳P<��/l]����[q%{�z%A�V�yI��3[=��V i+���$����ի70��eRO�� ާ���n]�� `���Σ�J`����������<Z�'�F���{��z��݄�bA�E���+/��l����魔��?�#��y�]���[u�"�����������}�<O�=A��k��Ij�Պ���G�1j��?Ⱦw����:��m��uC�$�@OЃn+��gw��U;��[��J��Zځ\Q�]��[�E� +��[9[�5؊�a�?�`�T�U@ֳo� T�%�y��p)^%��"�2+�V� +�dr����J�YB^��aP�["�y���лBV�P�y��H�Fa�E��}��m�;9��������,"KH�%�ɘ��t������W`�!�d���Xr�P�kPȯ����N���~E� +��ۭM�����MfK#;nljmi�h���������u&�LM�=y������⋯~���_���u��M��M�γK2�S[��9V˔����� ���>�(֩3��=����L#�/}�K_�җ������.��/�|�Ν?}�������v�Nc���AE�.(E� �����]4��I��;haYyVnNnA^fv��c�r���>�A�`����<�o�^�`:���Q�����|D�ST�_�aay��y������W�dn'�Ue���X&����T��)�P$4PKTM�Fe!E����E�fWZ�t>�"w��ns���ݠ����#XF�������B�� ��W+��_�����&�`5��V��l��3�5FcUm-!��j���u��k�������������Qł5B��D8��/��D�p�_R��:���<i+�[�������7/]lue�ʵKXĞ��k�d�����mR�?x�%�Ǐ?y�' +l A�Z�~��d�D���f��:R��VϞ?�����������ʾu���K��]�<#YٗW��V؉警g�&'�G��Gz� ��u�"����N��3+L$:�4O�m�Vh� +F��r1{��:��p�ӏdi��WPr�+�*(ǮD��] +����@�52���b�wPeV� +����H� ���z+��G�1+�J�����B +�USK���R����0s�TF +bUP��Dr���`e+bv����+�$��d�"���)��:��6b+��6�0������+y� �F�b��d;V0���_7�_%���Q�ɉ,o�A8�����b�_�.)��B��J����j,�&%L!��Z���`j��v��I--+����J���1?6L��0�\ ogϠf^�[�[-M�fK���hn����{��Vk{���nÑ���`(2<2v���/�� +��o>g����\�������� +ۡ98óX`nGBE8k��.Qs���d-.�,@���r��FH_�җ���/}�K_?���?�v�s���v���o�r�%�� Jj�Y�B���h�q>�� ���.ws[{���WX������4==#;'���ȱc{��G;�{� +����{�A����M�8����������W�SP�ST\PRJ¢2h�VU�� +a�y�J �*�HH +,l�� +���K��,B�T[�"����,�W�V��`��sa���v���fojk��6D���4��dE��%��X!,���68²X�<���lmj2�ԽEXƺ�Z�W<E��Y��KSSSKk�qVLD8 +��f�f�T��U��٦ +��q_��8u����gϟ=J��[m]��%�V[ݸu�(�!m����4I0UIpl��J�V���)���s�\q���V���=�[��]ߺr��Vg/lr+��Iv��W�����'�g�&��G'�F���Yd��7���!��U��z4Vv2\y�C���>��V�\��Ȇ+!fG��z���a�`����+�R��BNE� +�W�$H� +�V��o50��1, �����/�a?@4����H[� +���Ӆ�=�������=��Ǯ�$H�I�\q1;��Y٠c�=A2�y8�r�����@o�{�>MOP��!�:��\i�:��UD�k�PZ��ʧ�P_R@�+7B*v�![�&�E +�\\K9�cWJaP�N�$��fF��m[�����Ao8�hBg�5 U���`8E�0Ր��ɒn&�T{��I�q��J�]Q�9(���W~MHOv������6�T�E�C�D�K����=�mN7���,�474�7X�͖����h�Xa����g��b/=}�@�=y�]���g_|�ŗ�~�{d��i$W��]���=;�W3sH��8�� +!gY�_-�!��%{��G�Ex���퐾��/}�K_�җ�~�/��/�۹�g;v��_�5;o�bN���#��d�B������!�"taK���d��N�F���"3;;'??'/�h���¢̜���ݿ�#�R���4.r����:t�ȑ#�Ђ�� +b���mP`�UP�������*�58����E�J����"V��H�e�B WD��_!�j�g��j�A�M�-6���"w��}4������v[CS���ZS����B�*�Ҳ��ʚ�Z��UX���0�e�� B�`A�Pq��RXX!4�Lf��� +љ��`����=��|�D�T��_����Wk'A�~���/ln]�t���˔�z��J�VO8�z�� `+��%���b�7�oe�`�� +�U�<������}���V���6/]��y&x���S�n.���s7�����+;魆z�������ٹ$f�Po���>����^���^���qB_Ї� +W�(��G�'�u�ƻ{�z�{z�{����?<���с�1������hO#��R���8����1 `RO����4I���& ����Jv#����S�lvdV�D�UK;5ٶ4�6i ���(l�+�m$fw�b+�I�� ��~`>\o�*�+cRD"T��]� j<~L�p�ކYi)��[����Ĭ8�JhJ7S�O�A^y��2K;�0����-�,՝z�K�[�ߌ��Jb%(�R����JA�� +$���R�0����p��ӣ�%��Xr.K"WQMy0����L��n#�ƃ~ ׇc>���r�Ǽ����j��Uc���dn���� u� � �zz�oik��'��=Cc�]���D\�r��'�~��쒽���۩�����in�"�;�g(p�̊���E�NH�jnQ�a--,��bR +k}�� x��������/}�K_�җ�~�����.w��>��������8(;�",���s��Haq�r� ���Xͭ�5�������lvy,3=#;;���HX����}�1X�w���}N!L�/Z��<z��旔` +�*�˪��k`ayu-���6 ª5�;��i +a}��W�B���ăXP!���L,@Xd���@���������vțyl<����)��l�9��m�̥�"Xe`�*�'"��ʚ�����D,�_5C� +tX���`�S�zC]T r���)���ՠϢVcSc+�1���#�x'E��1�E,�` ��k'Nl�:}�T���|I�Z luS�Vwlu��㇀��<~���3����J��^l��!�r���'�z�/�>������*z�[w�ݸ}����JO����s6O����+[M�/L�̎ON��O��� ��sl�w ���Y`VUQ��]h��xAo��}�P !7;; C�*1;����z����#�C0Rp�S�#���)sx� +�X�Y�җ� �ڝ���a�m{�[��u��ت[(٣<m{|!�7�F%;�� meS�V��Rf�Q+��[ۚڐ\�����;�'�Xٽ�\�8�'H�+OB�� ��*(�G[i�fJwL�kKsې�dL䑱�Fq$��M���j)�J�0�\���g�O��4�9�����D[�/Iʒ_�L�u�iY Ĕ��B�|߃�Ԫ���K|��D�$�ۣ��mDY�%��VR�4�$�X<��(+:źx +�Uԇ�A�'��� dO���Ks=�w��kR߀��l27�-Vx�nni��~��N��Ӄ���~��go�|����7���/NN�N�.��"X�Ȳ�C ��8BHd���( ���1������r��җ���/}�K_��c=z�]��O����;����Kvn�*(Q�`HP,�_a��T�),7V�hĘ�Ŷ�g����g�� B�`�+ [���4���C��A� +��A��}�a�Q���#,�EX���P. "T�� +s;� ����֫�)�e����VD�[��jK�}���Á"��:����TQ�#Xy��K����WB�P��-0����),�� l��fc}=E��jk�,��`�k�&��0Ҫ��V-X}b!F������������ډ�H�@�~����- WW�_ǐ�+�7nݹ �Ꞃ�<Fl�i��Ϟ'�_�I. ���ܩ3W�(�+>O�ūg[=���#�V�p��M�V짽r�譶@o���I���^]?�D=�������)��r+�`WO_�K���}de� A 覆�,f���`�0�=�p0e�k1OP�C��W����jWcãBr�u�V�с"�5�̊�RI[ ��j����o�F"BI���� mg?�����|A�$�n+�dw���V�lQ�V"p�ĮD�����rtة/z+��������� +WJ� +��/��&M�*K�~I W)`�/9S�T�K�H��J��F���V���T8a%� +%���?�e��| d�K�&����\!K��Pb�J�b�é��,g���=܆\i�TTX X�ѿ�dTL��Ge�)�'v�N��"��ңE%-|,�l��ʤ���Ò�XD_C0|�㏸�A�[���m֦V����[��-F{7���2�k}sk[{{aa/�U��rwv�nn]y�擷����>������� +F�AH^�,B�)p5C,����J��0��AjB�|eeu�֝��m�iatח���/}�K_�җ�~o��?��]~��;v����g�C0^ ��j +�TH�8�B����?=rcNi!�E��1�� +'�,X�YY��E�22�<��o��4�P��I��>{��G�M�H����������/ �{^1�����J*�ŝ����AQ!��*M!4qN! �T�BD("X���Y���r�;E�:��T�kSnDXg�����fnl2ԛ��2ua!���EE%ť�eh��5�L8OE�͍4�D�8���l6�L�:cum ����Ȫ��5!��`mlnim���Nv���#�ή��`��� Bv�3���������'N��y�[W�^�~���[7�Vݺ{���{��}���{X|���c�m���P|�T*���ߛ7���V�$�+[����I=A�[ݗ�V�@ou����+�Hou��œg�m�<��z��e(˰3��)&8ا�V=�ή;eg�!* �mE&v����<A�ۃbv?V�s�V� +G(p�waષ�BP��w�7H� +�T��� v52><i���q�p\ ��Hl512 +WQI�����ꅴ�Pw�@'b+v��D�U�3�C��<y�$$Oa+�Mv'N��v �"+{K���jFZ�̱7_�-�-���b� ��ܨ���̊�U���؊.K�i2W�$�K����o��J�����JѧK� +(�?�eS^yT<��VnqGrY�R�Wa�#Z_VX�%T-X��]#�O�V�:�`���S�\K�W! ��ERT5j��Y��k�j��U4��8ESŜb۔ U��?��=�F��,Ǥ���}�������6A,����+�k8(������@~���`� �+3��W�ٱ����bmjik�y��t��l��ɞ�g�]`/��U����5������"~��v��Y,,� +L^ ��<�E�:�%�rx�EB籰��v|�P���������/}�K_�җ�~��_�����������?�}~�]�����^���[���rx����r;�����fkcIEEVvNNnnv^��Gs + +3ss9��������'-MG�oE�>|��1�`e��=7/+"XȯJ UV�6 ,�`)������ʃ��2*FwA��x�XJyPU`�i"!�+��W�:�`a +K�`�[mP!�6��p�9��[�[L�`UTW�VT��(�� ���������������� ��-��d��-��F���Nwa�A�P),йWUJ,Xm�v�ѱ?X��z����`�������e�W'O�=s����K�._�r���[�nݹ{�|t�!��)���� A^��͛���w +l�F)i+�V/[�x���Uo������n#��~����7/]��y���ͭ����~��k�˫���&�g�&��F�[ ����a�����lE� +�Vn�2.7Z�V��l�"��`O����]@��p5 ��p� �EO�$W����]q�5�� +nƱ�85��[����Vq�$؋ A�VA�yi<�!�m�{���Q��alEѩV�T�UsK{csۊ��V6�V�mઃ�V����%���b� �_0Bz+oH����1�2CPᕶ��A��5��D�#Jy��v�*�S!�>��Oi+� V"X�t)�$Y���"�@�S+� �Ja&M>�N?�j2W��lzO���l�JPc)�"���jџ F�������;�UjCYQYr%s$�A��Cɔ%���(�"RSf���,����E�8h E;阃,|x��a��]� {�uر?��nmjm�4��ȯ��c������l�B}��`�*�h��������3g�?}�ҧ�_>~������u�&��Z܅�}�6%���Y�HHE��%�o�B�N�#������g�wA�җ���/}�K_��Q�_� ��{;w��O~r��!�^��+�`�PBn�b�J +�%��9�4�ϚQ���Q[g�-(@VAzf�̌������+"XX!L� +�^�`8����0�����Lhf�d����"�U�ˋˑ_UV�W#�B�{e����X!�#��8Z���_U�Q +�WJ�P _a�P�`��Z�-��vkk[s�����c"EEX܂,��r������#X����2�`��VKJ�ˑD����������1�e� ��ں�j�W��ª��/3(�[�Q���N���p8���������]XZ\Y]xu�셋/]a'G�nܺy���{�?|��1װ����Zl�VvP�ȁ��qr�굦'z+v���ڞ`O����Qou����w������7Hou���e&x��gֹ�}U��OL���� �>�[uG�AvL%AԸa<Ir[a��=zه.�Z/V1���y�[ź�<pՋ#z�dr5��jlpD�WD������$��AV4C�����c�����1��=l�[��[��i��4y]>v��@%;���4M�donor�� +V#\�J)���Az+|l���W^���EO���@i[�7�@Oj�*�%j�J�Z"ڼV$�ϊPūBs���:}�B��]x���T��z��+��R��x�*��.w �xN�B(uD%��f(a�5K�,'W� ޗ*�%c+�a%f�DF�نM%_~��J[!���`%� �J�/�|�hT�(�kGF��bbuQ�$�z+��p�]�ф�H�L��(��?���_����D��fmj�oh4��<h��7�k�&��!1�����x�?��`��tٝ����<y���Kvy����KWq� Į^M�`�W3��Z���+�X�!$�Hx��+�V\꾰��ijX�`aqeem��a�=^G�/}�K_�җ�������W����رc?�������sv_(��\�dt)]BE�ζ�K��w��N�Wnvi�4�VT�*��+(8|�(4��9��o�@X{>R*�����ՑtD��*+7�}mNAQ�9�*�A�%�Ueh��{5Z�jk+��4Ա�4!y�"wj�ԙ���#� ,y��`�`�����F-�vn��y��>�)�v'Y�L �`����V~QQNaa^QaQ ���**�kj�:vf��`57����-B+E�@�^k�A��B��.y��557���C���X8����OLͲ��յ��Ϟ=�����_�y�֝����� +h��I�(�����xI��+YƎQ��[�M���`�P� rl�� >z젷��z+�V�� +z����"�:��v|~ief~�V8L��4L�/���a���{$[!�qPڊ�VN~�z+��ߚ�iCz���Ĉ\�y�`���U/���� +W#�-ș��#�����Zp���Q>Fg�؞� o�����X�U4���QՅn+�ݞ���N��\���0+�b�`�RT�� *� +��m6�B�$l��B�ˇz+��$f%��5�"� ��g�ɷO����V��� ��P��&���R!zr��.��[��£���`K�]�i[���Uؓ����kyS�.T��ڑ�J�*^q@�qVT�=j��P(�ݓ�X�&�w����Nx���Ӣ�ĘS��_C��]�V4A��)2`�Xҗ�R�DL�"�C�Ug����h��U���O�������amD~ՠ�+S��h�3�k������������N����ln]y��)��>�}����[�ӳ8�pA�<�,�T��`0�0���H�9�`��/Py��W��V)� kg.����{'���+�퐾��/}�K_�җ�~�ׇ�����/~��Ν?}o��Ļ�_!���#,ba� +��0��*8�������� �����ΔWP����_\���u$�Xna����}��}����"B�Bx���C��>t���cǎeff��d��f��+�����Wb!��aՔ�Ԁ���R�ف:��(�QL!�AQ!�-B���DX �Vk[c[E�a��}����,����d�johl6�!�UVUU\ +�<l������� +���-M��jl�),E�e��c��h�+�4��X_o�66����C��N�"��n�W��3��֎o�:}����K��^�q�Ν{��?|����'Ϟ?{��+�_*���@��Fk�z+��[^�U��<p�.�b+�[=�l�ݸt���K��)� +�V'�֎�{2+�V#㓠�Bl��������eg�ެV�݉�n�l6ٖl�C��cfBԆ!�~*��Mhbf�.��G�H����� �=2�Q�vU{�or4?41:���s���_3�8qy��L� ���>��t~l<72 +���ЂÜ��R�U�ȴU�z�H���ԓZ2��=A���0OP��[�O�41�����a� � +.����f�08��<G���F�<8/���3�I�m��$���&G�$8�%A�� +z�Z�J�I�r�q.*��+P��D�s*�/��̕�+����< f��B�P�8�r�y�ɈF�*�������$ ��]��J�Ve�� �R EQ�s��ū�M!�JY�Vt�f���!w�"��JYYe��_�ݭU%��D�2eY��`)�ʪ��3W�PX����.��L�~��j��7��v!]WOJ�{951e�;i�Ne٭IT�y�kː���0 �ʎX;�#i*�i�?����A��*�����^�{�J�<������^��~����,{���'�H,����{����|1��o�����ziem�P������A�� \G�;�ٛ܂�X�<s�˃����^wD������o���^�����e/{��we�TW?�G�����N"��[���u�8�bE5=;Iɖp,��0�s�=�������kl<q�Թ�����"���Wa�0;}ZF�*���ՀȽ�64�w�oa��������-�]�;:Z:`a��!�",�W}}=}�E���]�����)�<��?�30�+D��܂�sz�.D������� +��k�B/����h��nnms47�7� ��F�,���t����;w��VD��;;ڻ:�ر��=�������x��`�} +`q���_Xf�?[;{/_�~����O?��/���ko���;o���{|��G�e�O?��3DO�aV��kؿ�� �+KOPb�O[}���l����P� +��+���{�ŧ�{������Mne�q�ҕ���4Lpz�ťյy�[M� +��#`eOq+{� B0�-�* +�+�0?��$d��P��y�F.c�`� �F)p�z�)�QDO���9���܋+��2��o�qK���s�S�"mE�j����䶂�zu8�����VaH[$�FiU $Z���M[���'�ɪ`�j�8L�����=bv��x8'cF�d�,���GT8�*%TK�tz`��`WCV<[%w�rV%;^v��.!�����ǔj);k5�L��G�^[��G��. Z�9(�^���ɫ�XRYo,�v�j��R�ʯ��oM(����=FO�*�8�R �C+�\�"����.�WY�f�� +Gy�<�D~�&�����W����{15������ʃȯ�.w`8�~��t&��C��"MO�-,����^��W��?��._]Z]_/n�!��V4�W8m����+S��+����� qN]m +_�.���K�n����'�?��e/{��^������u^?��O~-X>��#�>�w���� t�B�JS��h(!���q����Z���7��hp4A���lչS�g�M�窎� �'~�С'� +!��ǡEx��qDX���>[��E�ϟ��:�����w{O��`!�+�o�(܅� 1p��,I��=��&�r[Z��`�U(���P,ί��1�c+�:=��AggOo�`9�H�h�GVK[[k�|���58�,�Wn� �;�=�<�������ݝ��z�!������a`���ə���u�W�R����w�~��^z���(y��������_|�ŗ���/��5;��_~vZU +����Ǥ��ɕ�|��wL�|���^y�ŗ���'�> z��O^�v���/�K��������Ba {�3s�3��S��=�.<���4 +�N6�C;���UB��S�4��F�c�X�'`�����8��i W3sӳ���Y�����H���+�^͈��f��j��rlž-�[AC0?�>������`2Õ�q�$�P�i�a��">�d�@���~�Mr�WG +��<m��*"��\o�i+��VH~�hؐ�S�d�J�0aY��t�bR�S0^�a���̕����J��i��^ KĮ2q �(�%�ꇳt�{�2��(�1Z]i��[s\i�1m9��w襔��c +��\�K��Շ_N�ʙU2k�]%��rj��l�_�R��s��4k������薟Xjѻ��ORx.œW�?�k��H���?��X�wֈk�0:��/��t�}�p��;��<���+����4��f���p8�^�VO�y���_b���_b/�[ۻ+�k�p_/ ����ō"� ��� ��(���A�Ymo���6��ٛ[dt�!�[;���mv�KW^x��߳[������e/{��^��Y2��t��du�'@�d���+�E(�A8� V�����w�������ol8y�t ��O�>mV1���(M!d��ɓ�O�&�u�ܹ��공�U��0���T���hqok?���VWWkGW[wOk'Z��{�zz�a�S�V?�����x�"�� тw!r���Z���/�0F�b U����f��?4����������h>����ш"w�`utuB�j��94�r�]����N�D�}���=����kA�{'�d�t��=�P,�.pscS�K��gg�¥�7nݹ��sϿ٫��~���^}��gD�����_��7r�AQ�/kUТ���/�[��z��^Ǟ��V�>�gn=y���'�ܸy�*X��'�� z��Bqym}~iyf�`����踑Gړl�Q��%j%7�t��)�'3I)=A�$��F�|�����$��� +WsȠ����7��*H^-��9�祉����Z�F�{ᶚ����$�D%{K��Hg�me�� +�vmKn+l�$Av]̊��[I���A�V�� +���\�g�a�l�#�� +�z��i��� +�t��p[ 'R�,�R�):`�eJ�`u@�J�0���؎"���o�%s�Q�؉�r��2�V�4��>����"!Y�Q!�ɸ��MøY04��������N0T�NK�$����̕�Q�<(�u/�u����`9�:�T���,`FK�����^�;�O��gҬC�0c&��&��!�ʫUGl�Bm0ǝ��$�5rcv��O#��陸����*6��_R�' ��N��5o4_��b�2Cs0����|~tg���}���~��;w��~��za�W�P�����`�:!��Mr��DX"�]�ͭ�hm��cQ� +u�l��]��W�����e/{��^���X��qv���~��C?�����o�vt|*���&~��:aڐBA��ů�q� ӂ�F�?���w8�jk��k�O�=S��x����ı#G�>q��/:t��=z������`q?q�̩�J��EXC"��Z��67� +a[��`��V[w�ۺz����bI4 +���L^�.�D"w�Rˏ��Z�a8"�h,ĭA����+�@kP�`���A��"~���Q� ��}��Br",�����Ƚw`����vtv�u��v`�opЅ�*gׯ�щ�������=�WO�}��_z����x��w���Ï>��S^��7�D�Kڂb����]�?&��G�'�b���y����!����'���BO����O^���¥+��7w��deG�������<Y�G�&r����4�g`��4��Ǐ�a�@�����x"�H��EMO�)��� +�U~df��<A�����r5=��j�ڂ3sK��Z"xE��ޜ��h���"$r��jT���&s��l�]��/$���t[f� +<]��B�Jv�M����;��<�"r�cW�U�p?�٣��*<L?�Tt�$xO0N=�TT#+;L��y��Գg�`ACͺ�(sU&��S�P��]�&�{4��'#dV�� +�����)�UzZ�,�U1��*y�J�Tƥd��q� +���"\2S[&XKZ�Y �Q(˃�74��e]�bf����/E_o��Jd�_a��J|M�Z_Q3ԄK��L[Y�Y�d���_ct�Ģ�����c]%"o�O��JMX����SM_��(�'�,�4���$�G��X���A���8��F9���J�^� ���������sf.�"�p4����m���'�<u��3lߺ}��f/����P\]G�{�+ܡBX������P!������-�ZACpo��n��H��%�����.��n� �^�����e/{��^���{��GK],Gp~�Y,N�41�0�xE�*�'1�E-B-M� B�]o[Gǹ*D��x���sX<q��ъ��G�8r����Qv��E��S'т�-s�uUu�� �uM�"lm<�B"w�[::�wt���U��@�E�A�`ur��N�_���@W��W� +�~�3h"p{�E��"� +� +D�PȢVB��p<��ػ<á!``h�#X4����X��P�p48�`uwu���B���� B��ǎC�shh�����������"���N��.�W�8H�jlrz~y�]��_�r�歧����o�������G�|��g��ŗ����7�����[��_����(�e�+���y����'�z���z�]�'=Aaeg��s���._��+;��*ll���W��f��'�g��[�gGLleZ�i�`L�bf�*B=A�V��a�`* i+� �s8R�mO�M�NL�a�9�PX���� Xa� +�Vӈ��Q2+PrM�@Cp|K���@l52n��_�09&�U"�ia��qh�#�`ď��cQ��*`�=~!������p�'{�a�dO�.��\��J[�F9O{�T� z$�{i�TDpp�@H������%�3�0��V��*<*�**��Q�N(o/��PMO[��I��n�K�,�,K�P�+K�L�eN0,)!&xF+[�Ʋ��x�NX��J�S��ՎwMEX։�%]�߲�TT�h�����=I���)���ג�@I���& W�eYG.��=eZ��_er����V�<��2(���oNӍ(���P$1B����W���}P�8����=��H$��}Bg�����^�y����7n_�~sckwe��Zؠ��J� +�X8�����7"�M!/�&4 +�|� ���k{W�-��m���8�+W�=��3�/�w�{��s�^�����e/{��^_����������������T���[�+�rV�S,v @�����Z�B]�}���sh����9y#X�*p�a_=!#XG������P���Z�k���A����{SK+�"lkk���!�����-�8���'�D����,�}X�:�P�w� tc�V����`��E +k�=�B�0Z�""�%*�l�Vz��NggoY��a�/����U��֖��v�'�;�tR����A +��n@X��3��Ξ����.�W��!7��F!�ZZ)no_�t���;O?��K� �z�?��W_~��o~�^���?��+.������> ��|� b����y�����+�A��}H�VϽpWXٯݼu��͋W���ު�������V\X^+�,X��&��c���L.�f��GNO'4�QѸ��`�V1�f�� �!�y�i����L6�ᆫ�|��[� �f�A!�BC;Į��� +�V�f1��V��BlEn+hN �����Μ|ێ[�A�B�la�"r%J�h_�J�Vx�͎�v<0,�UD�Q&M�`�` +K�X�D�J��{a+�c/�d+["���Y��{iE!%�O��Į`(�)�M��U���Jҭ��e���E'%wH�Թ#ԲĴR���oe�Xߍ{e���hN6,g����Z�@F�K����W��+������,����{�r���E͗-I��Rc���zK+#�ctKF�+DX)CR,�T�W��qD�2y��B��+��0a����rz�]l��n�+�F:`�8���+�F�i#�����w���kW�r���KWW� +kt^6�_A�j�Z�[d�����*�B���I��lolmnr`�v�m>�E])���������}��S������x��S�_D�����e/{��^��:�+v|��G|������L~4�",La �%#Xi��J#�J�����`_"��8B�����q�����������ꆆ�O=v�p��_>��C��:t���"<\QQq���>'�Ex��%��P�� +,�`��!����N�W���"aOa��"�btG~���� 𪿳�O*�e��m�W��� B�f�|�"V �[��J��Y�P4>�����rc��|{����:��^lGsskG[;Z��\N�_�}�������t������������vWOOO_ߠ�}R��?ed�&��_mm_`EOށ��������������X��+��R�{�Gl�y���.{����'��_���O=�ܓO=�>����/��+W�.^���g�Kk0�ȭ��S3s�3`e��R��l��0m��*\E�'��@I��1-�x�*��U:����pE�� "�����Rr��+N�Huř� .R=��m�B��V�S����V9�ȳ�.<]0I�}z�c��#|!�pT��������n+?u�bWÔ���+/�+�cOW���al#F���=���(��G�a[�,�f=��#���m�=I�$Ĭ4��J��Գ����Sh�Jɭ���©��Πŋ��*^-�ʚ�R5�f4nd�`��-��2��0b���T�V2�%�i� K�Vx����t���ķ��Z���Ja��P�ߒ�RqV��2�{9�� +�iUW��-��0nYʌ�Ҽ�d�f�1_�T�h��=��y���+c���_a����"��k�X��±a��~[��A���^���v(�:7�W@�c��^���7v�.�_�|��v���%�� +���Rx�V�@x�%RX@�Ȃ��EX���$��Mc +7d:�W�p'���w�w�h���.#�|��s�^�����e/{��^_�����?��w|�{�?���#㓔��;f�t�(�C �M�;Л�`i�P������8{�\��q���T噚���*1��С_:�+�_=q��!�`9v���N�>qZ�g�0�U_�[�h�mjnh>O,Gk+�`�C��E�]aQ���+�W��\��˽�B��W�.���w�` �;E��_�k8� ���0��-Ba),�����tu���vt6��6���,X MM-mmm]]����A琋�W���Y��u�"� �#����[}��@(ʮ����酥����E�Ww�}���_}����y�ɯ~��W*��7��3W<p��V"�2{���z��[=kb��7n=y���KW���}kgJ�����b���Y��c�n,�Vv&�%A�0AJ[qxi+��z+�V@�Rix�f��pb�I0\�CUplb +�}���fzv��p\ � ΐ� +�`��,WZMM�NN�NLͰޱ�����1�Z��Ap[�@ۑ�V)x����J�Ô��sf��V�'�4%�2� +z�&��ZWQ\��*d��؊�Eѭ4#Y5|UF����:�8�Ќ]�yy�T�� �|�vD��8�2UWa���%DK� %;�l��*44K�f�\�nE:,S�ni&-9+�3X���� �G8�0%Y�5�%(�&�4�YF��1�P/%Zٲ[�b�<�����A����WQ˟'��/������z�e+����31�H��$W�v%�W �3�N�v_%S��� +���@0��:��1���&2D��y�Q�u�Le&�gŭ�����K{ ���^č�����+p���������&R)�b!¢���ܩ`��3W� 7q�h�M�KH.������7_z���!{��^�����e/{}���G{�;>������ـV6I��., W�,B-�f"X���xu.����_�Ѹ�r{ۻ��jkA���x�l噪�����g�=~���#O �z����"��E�"���gϜ���VmU]}m������Y"lk�Y��a�,��.�`A���"X�ݽ\�"����^P`�Ƀ����(���,3�E�Ez���Rj(r�V$��т������:Gc=�Mr!�ZG���v{|>��B���,k������,VOOw__�����CvE����[Z.n�\�r���Wo"��H䯈_��7������Ͽ��ϡ-H����'���Vo�z�g���瞿��3��<u�6�.]�������-��7����W��f�ǧg�&&sc8L�]Kf�������>�Y��HA$W����)��2z���U6e��=�'�U^��G'`�U'8�������+�\��ʬ����4b+h���jtL��rcF.O���4dV���`+���a�`8���� 6���'��V~7V�!����=�� r��0t՞ � p偫�ViQv����P���U�x�RUсb+5d�SK1�\��(��$�D�J�4!���Zڅ���*�b�Qµ%K��w�K[K�F�XC ߔ��e%K�YU�+3eI`E��*�2(gG(�#Y��v�Q�,xJ e�K#X\}V��J��%,o�7��>��*H �J���j����W+��x��^�#Ha[v:i+���lAz~l�ފ�;�k>�1F :�����Ԓ00�~V��_A8f���@8� +� ��\ �>��Ecvnq����C�w�.�olB� +�Uq������(��aAU�Ů��_6�p4�VqsK���R�6a+����܁��+�qs�X;{�[;w�>�{v��^�����e/{��^_��g��d�z�������_#���J�En�Laq�;�a�qC +��W\�O��kv�.�{���Mg��58յ5�*+k��jj��8q���F�#���bq���X���~���luM�k뛚a�ŽM�W�"��"a������ݽ�J����˯x���U��A�C�C\���R�BajO���Р��a� +Fc�p�B�����k��lnmmhj�u8j�����D��z�{����54��x�~?F�|��� ���>���t��ٝ�?/���C^��fߎ�������&��nܾ���/���ko���{�K����k��,��/���/�3��(�r�ֻa��7�|��7^|�U��Ͼ���A��o]�z��嫻.!��aY+녥�����鹅�鹱���V 37��&Sq�<�8��rM���<m�W�ʮ�2)�'�1�p5 +� +F +����� +$W�Y�v�H�>K2�9z�b�q��"b�<���� ���`+�l� ���0������[�Z!�ry|����Ozv�$Hi�`dX�� {�h/�u�����P1� +�+M����5~�̗�{��8����QX��,r$�`>�����l�S�N��*�oQ���u�hr-ܒ +Y,W�G��1����U�����(�Z�Rf�JpBθ�}�K�a����V���0k���TH���LNC-e�b)�w�z����������]X~R��RoQI�D[%st��0�,�%ge��A�/+��b+O���|�Y���_y�\����ȍfs�l���A�+���\\��U,����2�j��=a�i -Ŷ<O����Ʌ���bqs{{gckgy� ��� +b���a�7�sU�V �юe",�,|sPՖ9|uX�¢� �(d{g�}D�o����G���e/{��^��������?� ;>��c�}�{|�����t{r�c)�*+Ez"�`��HH +.�_d��)��8;qy��]��U�u��� �*+�������CGɂu@��`9�V�8y�$D��CΜ��ٚڪzD�h�oj��!��y�,X�-��m]ݭ�]m]�B�#��į�;a.��^�a�P��9{@�z(�5�,����,o,X��WB��0�V�r�VD��E��Y���M-�8����|�Ch��x�> ��P ���@Xn������?8�����z�}�f�ٵ����7n�y���_z�5`���a����/���/>�;�~������{����ie����r�խ�W�߸p���E述�������������������������8Xٳy* ������UBNğ��(O[��P'lE�+�Vp확z�\n4'W�c���&�TAt�c� +���]Ȭ�����B�jj�7'Ql5:1�b�|~��m�]>'3 -O$c��S�*�5l8�q)_ �@��\^2+n�8ʩ�8R�d���`8��-���d��F�p� 1�\�IvZ�,��dz*y��Ń]�c7�ZZ����K�N�"Ɉ8�JF��*�by�ve��z��\� +�#��H�,��t��ҭ��ĬY,�t�+��r��*�i�J�f� +ˉu�!��Շ��9+�3+k��2��x�� +S\��H���Kڅ<>'Yij��m�2~�/�$Q�f!,��g���B��ҙ��ߢ|��1jI�[F���p�{:+�W�u^!�%j��)#�͏Q�W�|�`:�L��N����?�y;��b�Z*�6�랦S&3�^.؋��������z�P����Y-��0v��W��՚8a�e��k� *�* +�;b�Y��r�+�p�F��C8�W{$�B�8kcs��$r���_�?��e/{��^�������]������z�G�������ˏ���9BX)�f9�jw�ta%St�izT��Q(M����Ά�������ƪ�ړ�gj����;y�HE��8rX"�"���+N�8q���3�g�Bf��U�7�8��h�jimji�A���Z:�Z::�:�_ _�q��>�� +� ;�0���AYf�P���G�pa � �aa8:��^�'d�*�C�x0 �#����cO����������hn�kr�46�56649 ����� -�D���P(G#`��FC�0���,������@����x�PTӌ������zaw�ҵ���>�,��~�=R`}��g�~��g���b��+�bw{��z�]"W/����/�$�V��z�)ne�| ��6��[m,���-.��-N��}��#cdeOf2���mW�V��� +�� �6D��͞��HA���(���J"W�*H�+� +B� +�R�j��W�SMOc� +Xhb�������a� )�Ql5қ���%�8L[K�X���cI0:�6u�[B^�V�\��sV^Y������n~� "��� +z�a>O��U8���]K�H�8*�)m��3����2�u����Y�4��� �)!+5�T���+��`���[�`Q�[���\I~e�,Ջ��,-��$ג�+%����d�ċ+�oLJ�͂!�%���%"[ґ��,5vU¬���߅��X��uR�E��P����RA���vڂ�Jx�ۻ�(�{�Txu�A�j[� ��Xi��*mA�I��M]��t��c39R�S.Kj��HHB#;�6��n�P����1-E+g� 0u��U4��3��5������+^*m���9�W Q�[�������� +��Vש9X�� �D������n��MN�@�{cs���M���i!��ŏ{ĵ�w���;�{�ڵ��E�����e/{��^��z�������~�������|�/������!,lr��ͦPR���3b(!waA����q�DT���{[gWUM D��38R�"Xį`:�����~�رc'O�8 ���"VMCcMSs}Ss#���V#X��K���{z�yG/�,a���lw���y�p����r��a��E����qz�N�_"��E�#� ,�� a�a c�"Xn���C��v�r8�_A�����������"Xn�7"����X"״X"��؍á���фN���r�08Ʈw��S�K��[����^����Ͻ��˯���[�����}�ч��ǟ~��g�|��'8a��O>� �@�>���w^���s/����goݹ{�֓Woܼt�����;{7wv�۫� &��g�؇Fl5j�G�^z+�V��z�H,Lz+��s7;b+dV4R�U +�U.$Gry^�cUp����d�����+ά�0��4Q�>R��1>Fp�=g~�f�Y$W���JO��+����!kA%A�$A�U�}�0p�V+/�����#l�����V��=�S� +� ��_ K�Z�� �� +U�$L��gp��`*cY%�v��U +Lͻ����yʖ��,A& E���J��J���h9�R���V���1��"J'��TD�����Ty�P�Uf��jĒC�J��d�B���"�4C�o�T�S,�%�%��i�xR�ie\�{�,�J�L�{JѼg8��73*�R��m� +ˊ~ҭ�A�*U�V��W��ϜU+��3mWF� `�*O"�$��t��;H�r8pV�@s;���Ye1{i�-p#�i�~�Ѝ���_��Jj�0��س��O�dU�2�Г���ޡ�F�&ff���<y�L\^-����o��yU�+�Y��A/H{s�r�y�jw�[�?�Rwa�-<|%څ������WZ�o���^�����e/{��k��Q������y�G����h@[�1mP+KC Ɉ�����)�ȝ]�R`EL�т5���\US����g+k�VWW?~��� Y!�u;�������O�<s��ٳ���j��j���A���frV"�ܻ�ۻ�ŝ�;{!��IEB$W]|�BL^I�E),';���5�B�r�e�0 E�q�V"����1?D�B.��,Xm]`�jln�A� �� ��`�jmoo�����ry��`(�FA��ԓ�T*�fG-�Lh��6:z|^M�廟+��'������.߸}�g�{�W^}��7�~����G~�����$퐹z��w�{��ի�=����<�� +\ݸ������Ev��V����Zٗ&g�'��J-7 +�zde<3��/� +w,�f�P������a�`2Ebv�#��dslgMl5��'�Ƒ\Y%W๒���y���5�Z�Pl53:1=2Nb� �̨d��U��!�O�]�&�m�_�%R��"��xI|�<pEb+h�r�s���WZ�[h�`�o������H+{����8��VbJ�yQ���J����A] �h%�J����s~���+S�n�r`���ܨ��-i�c��*�&�T/���*�n��-�|ô��J�wp%M�%�ZЩ_��v�)���E;!&��w� ���+Yjz�ֽ(V�P)V\g��^�M)�U��¯J;�k�O�[�ҝU�Z��-��Ҋ�UWz�=ٍ���3�F,r��`m��"�Ex3dEɫT&ORw%��<��P�hv&��y�`���#g�;�H�ׇ8��cS3���33�1��E\�Г�����������u2�/�V��kE�3��j�Dk�Wd��9�6�EcK"X4��]�-���\bm�K �K��"w ].^���-B{��^�����e/{}-����b����G}���y�/���{���qBX��rd��J�xQ��a!��",����9�xo�VmM]]D�Ξc� �'�T9v��'�%���8r�F�P�~�ة�'��u���s�UU���!,�`���ݜB� +X�"�� wa� +���>�E���~Yx>��@�:Ɉ�����a!F�|"�5� ��a���=�� � +F ��EJ"XM--u�j�m��s4:��Ϸ��wuu������p(�i)�o���s�\��L�H�S�D<�����^J�r���@(��l~tjfny�����ڍ�w�~�a����o���>x����}�\�# +r��37��{����W��_����_��aP+k���չ�%�[MώML�����X:�.�@o�cxq-*& rZ�(O[�Q���+ �L���*gd�b׀�������������jN�+n���Iq���* ��jbjt�V�ʍ�����ꈭ`�`���$�\ +C�*�8���AS�.}��bvP�#������i+ W���a�<pY�D�oN��!\)��0*�������4+ݲ����%da��A*�1�VQ�(e1YY8?�č)�JX�>���d��h u�w�r��I�L �9�P���[1�V�ч�-�h���ʯJ(V0��`J��rS�X&��PV2+co�qY����+������4�� �H�Cٝ��?3������>�3�Z"��Jٗri�R ���ja_���Sќ>���U��W83��[j�iV9�]����dO��=�� W����Wp��RX��iP�3|�c�Z�egqyme�0��42:�^��'����əٹ��NQ+�������Uῢ�&(�z���*la� a�*���X6�-[&����@�pam��n�u�� ����v��^�����e/{��^_���c�=���y���կ2�|�m��R�_�фB� &A����� H��4m8��otTVU�cm}���J�`�@��Q�`�:r��#��:z�8E�Na�=�lMZa�j:_�Ԍw�WMmm2���AS�HH",�_��x�N��'�Y����j,�W4���W��B ,ί ���m���"!D�"0���"X�m�]�mm�r4�66�9���8����������GD�z"�IgG�#c�ccc�c���|6m�m-��~���t�<_`8e���щ���ev �w�����$���+/��ګ����o���۴_{�W_��W_�W�{�g�{�ɧ����� +^���O����ήͦf��U��Ơj��`+�A��h���W�a���"��ٓF2�b�l. ��<��s��k���cb��8V�s5i�T���!�I����Q=��4=4��e�$���Ē��WOc�"%���(6yIPb+Y��]��h�������<p5� � +��\A� +{!�������z+H[rl��%f!)�Δ_��\�Je�D +91D"Ht�zD X����T_���*9��$���{X���AM�nY>s��ZX\:j�?�!fAv)N���#�䱒Z�R3$M>[��]1a���(�Yiȗ��߬���J��*�2�xCQ���*�wN�D�22@ƴRj�)%�%���Q�$!� ����E8+%+ˏH�dN,E��,�$=��Y)��N�@��9M�MKf����H���(j�ɂ� +��ydb��<{H,�������ѱ���u�RY(n�/,��=���i��4f�k���������:������_�prE���,��AE�on`�j6����F,<�"wv�Yb� a+q�#�XpT`�������+����xᥗ�?��e/{��^������5\?����'?�٣0��;�W�7�̍��s��ʚ"��ܳV�{ U*��ٛ좾���\mmummcSSe����a�c����C�p����Z�į���A�X!���V}CuCc���,X-��[�ZۛE��|{'�ܻZ$��B�;",�;{�Yup��aA�������DX.7!,�"�� aq"s�!�v����m��lji�or�:�_� ��&�W}=�!�8����d6����������a�3������T*���Aa � ����12:9;ˮ�6�w/\�z�:�ܟz��g���_~��W^|�^y�����\�TAv����z�{��;{��_Z��_l59=26��ZMN����4�$A`"l�{�q�\��߮��dBO�)�v*%A#7�͏d�\a�O�٧q�����4z�x��4V&��@[M�Պd�[���=?hm�[�$�>v�BZ���Ba�d�a�`��0+��˶� +�%;��yO�c��ۊTi!�:#8O��V4>/��Uy0/�E �O�N!�ʲD�E�YYR7��JH4e�NeA&_��z` �*�Q_ٲ +���@�uF�Ց%��dy.��1����얈]�U!��U��L^��W�x(�[fR�ڂ�>K��I��2$���;L�7J&H&�&��Ŏ'���h�{�@��/LL�2�0Q�FTݙ>4"2C5Y��U�Ǵh{���ґ��V�(C7+�8d�#�âƆ��f�7���a�;� a�'s��m�J�ه�k�HTc��Ueaqeskwo�{͜_Ze����_���1�^������ + \]+.�����WחW��d��^��BU��@�A~N�j�HF��bq� "X���M� +��vaq<.�]9���;��}kg��l�noc�Z�{���E������_G�����e/{��^��ڮG����}��8t�h*����2�E����#�`�"aL� ��0T�`$�7�lln>WU��䨮�9UYYC�'=�-��"����������,@XUU�j�0��X�p�Q�,ֶ�V�"l��jA�B���-BAH�~9���܅��W@��dq�;�+n��w��8�>��"$��?�E�M��'(������ru���wu�oks�?_��X��P��VK[KWOπ��D�T&��ONM����/�-,-��������]K��H�y܃.X���`$��3�������uv��w���k7��|�֝�w�z��3�>����՝�nܾs���KWAr��w�]㰋�������U~2K- � �cp���z� +�U4��U�Kh�DR�S -���]١�*odQ��1�V�\AIPJ���n�Uӳ�S"jE9��i2��rf�>g��& 3�q� ��[a_O��#A�c��(c���$W��^����U;�C���i+4\�ٷ�'z�����y� +9Y�Po�P"�b+S(D�*Mmf���8H�-Ё�6�(C-�EM䒒y����#�`*\��R�ԇuR�Į|��<8�U"{/g�J�Kp�=Y��VZ5k��Wg�X������"�{�SE���cq�|L��,*-X�EK2.U��15��4��}��.�Zm)�K=�]���x��Ke7�թe���\��j ����i*hU�Ը����7�5I^I/}�W)L��dV�+�]�N��4�+v�A��n�%4�V�Ȃ;I��`�d�ũL��<nn��_�z�ҵ�����%#7 +S��J2�^��+���2Ů��k�����5Ҷ���NX_@�.��*�� +!��B��[��$~%�W��-zW�|�X$lǴ��k�DX;{�;�츳�՞Bh/{��^�����e������~Ǝ�'��c�}����/�b�5�K�r��(�ťX"�����b��0(-�.w��4���uvV�����68��Ν�����?UYy����ѣ�� +,�:z��Q�EXQq���S���9s�[�`auCCMCc]SS]ss��[����EX-�`q�a;寺{�p!L!�� +�~Jaur`5�EX�@Ϡ�Wp�,W��"X�A�OD�A�aea����f/#X�@p���tv���tt@����������֖��A�ӏ�*�I�O�O�N/-/����������0=3561f��EVb88���N��n�W"��@��Ʈ\����/]�t����7�u��k7`_�v�W�Xd�>�*�453?>9 z��H�Dg �"%;�����!��+��W�'%Õ�dO���t�U.�� ��쐕��+�V���������\�����Ǟ>F>vPⰫ]L˰�'��##�J�0�DC�MV+�z�2pŎ�v2_��J�D+{D) J+{B�#�m=A3��.�\)����ʂd�jJ�G �g��#Rf�JaV������/aY�}�{q-+�R�_%i.U�U�2ccJ���2j�ҰYY�P",�G �<�d�!�|��QX�[q,dPd���DXĬR��&�,*-ԦŹM+�M����p�[����2y��] _����Un7����g�~b�3��1=Љr\�9�r&���B�4Y�$")�� +,���J�k�8��*��i����I4����<�!Ȣg#�žF�\��b=�a�K�����^�v�⥫�ŭ�i-����{�glbjv~iqiG B�jym}���8�%�Z+�DyPV��6��"X��69����A-�Vm����y�ɝW�B`Ź�AAX\�E��т������WG�&N�>m�]d/{��^�����e���z��G~�������ǒÌ`�V��%d[3�w�C +.f5 +ᄢ�>�����٪�Ɔ���Sg���7@�ر���<�毞8|�#�c'Ђu����S�܂UUW_��q8jM�M͍���,���&BX\����ن������E�G��P�E�A�Eh�`�)��B�b��"����g8����N�C1���qӂ��V�k,X�b�|]���������r����p���q#kLNM�/�-�,��Rf��������85=���I= {|���o`�op������h�]�yvM5;ՕB�����������/��_�ރ��}sk�]�+�����ŕ�������x��\����#���6�{���7��f�{<p�1;{������� ��IN�ƑPa�jvb�lr��+��5�*/��F^65�\�1�X�D�H<f5�Ȇ ����m�#N%��W���� ��<���yLr5�U�U������4�))UAŀ�+QRoe��M�e�1�L�lW�{���Y��ּPYB�J��q]`7�Y�u�aN�ty��k)��%"�G�]�=D�ԑe��p+8K�k�*��z���.���R$���B�i�� +b��\�.� �7���?�.�5)��� +f��gP;����v�^y.;�B�[�J�{ܺp�%�ʘ�-:�v � +�RI=IY��C?�� �8�@��_e��-p4�S火,u)��'���qZ���5dV1+pܱc4���Ē���L!�J����i� �+���~���rBK��O��o\�x����W���ݿ����^vbX�f�6#��+kk�"����ul�r��+�l�Vk� �p�q����X�u�l�]B��ڀ����1��m��#��DZU(nq������+ά�-� +wv������ޅ�W��;W�=�'��~����^��!{��^�����e/{}m�OE롇��C����]�〹�����Sj�Z�(��%(V\O��q��Jz}������ښ��F��T��Ꚛ���O����աC�"Oa9\q�8�"�ӧ*++�UUVU����������< �La��������Z��-B�_Q�*������~9��T�ӉHa ),�,�WfK'�{(�F�>�` ;=����Ξ>�`�9�����F�W�}���?�%��19=��4���R�(loonn�e���������X�H��į{�z�{{{���� \l%3F6?:69==7?���.���֗��� �յ��������������I�V�i�䰋�O[�$�h4�b F�"*�"��g,��ˮ�4=E؊l��l>��A�*?JmA�Bɕ�*(�Ԅ�X�d�����3!m���1r4,L`+�$�$�>ia� ����|�����v{�A�<�H=A�)�)�cO0L� +J���F[���V�,FI9��t��5���r��ڜ!��U2k�)���줘�f�-���P�xJB-A�� +���*���k�~��^���V�(���u��¨�< �eugE�-�f�R04����]�FĹ��O��|�R����'��eD�.�x��Ye��C@^ j� 1�P ,b�Y�2�Ϗ ��Y���}F�Y��ߥ�p"zJ�PE��(����E���i�9�Jf�H�18X��;ŁAebZ&�Hs6��(�D�b�����wA� +��q�͂rq"��W�����j���+�oܾq���Wnll�NNϱ�ޱW�XBc/��s˫˫���M +;� �Z^-��jm��E�^W�^/l��Q,jb�P ,YA�j���6!�U$��.,(n�j��<��V�h�R���[8��W[�нxy���_����?��o~�����m�I�e/{��^�����e/{}m������"��߬8~2��2�<�[r����+#+u�E����t2��.�_ȍ��g���5 ��Ϟ���?��#����C�0� +��G���ر +�`?}�de��`A��,X���&�R[����;�qa[WO��BH��$Y�4|���4_����~����~���s��P���R+Pb��� ,�G�b��p8��������}������ڠB�h�� +�־�>���Dz����������܂z�����X/��'�&�9#����NgogOOgw7��<^ ���T��#�#��ӓ�3��s�g`OLόN�0Av�U;�f�:&��<�v�+��$�7ي�;�p��\��� �W`�Je�'Ȟ���������gW�g��J�4��=�B�T��n�F�3��Q�,�V�c���C��"����ǾM�a, �1��J�!%p%��n� ��j���à� +F4�Cwa�I�U�� F�T��v~In�N�u�`��W�"�\[�� +�VpK�M��g�tn`�T&�2#Uj�JS��_+�S�b�A���h��SU��_��f�K�e~E�/+Y +�eB����v!=J�h��5���RYD�dI��yi�\���\T���S�T +� +���V�Qj��,$�8�oa?-"�)!��M]}�@R��8(�E�<�{G�b��&`���(�I��Ue��I��Q��@�ɬ�<�i�W�įا�1j!�tPU�L[�Sp�%�\��GX0�I ^�_����`^��q���,.��_�ru�֝+Wolm���-�2Y�[�6�S3s�+��kEz����]/n.��."�~��.�W�U�h����jq��X����V\fZܑe�ם݁j�;��66gQ� +�!���'#�X�q� \;{FF���'���������a�o���o~�[��C�����e/{��^���X?���z�~����o䱓��9qįҀ��PBS��+m�,¤�`��|LKz���N�`���567�9{�lu5"��<\Q��?>�į��aί�A��:~�4GX�`|�ٚZ��Z�:�a��� +!D�:���!�aQ� +]�=���),$W��>�ɥX����I�5�3H,���g��u�TV��"͈Q�ñ�0���.��w��������>y�U������������Eb#����\ZY*�wv�v�vv�����66������T.��kq���9���������������?�t y}�P8��7-��_rJUB��:T>��)D���f;�b� �P$�x��p��sA����N�*(OSs��,�%��� +7f�&͍� +5����1�y� �,K�D����9�ۤ��ړ]��5j2�$A�Z �\�P�nb+/���jOpp�cv1mEVv��´U ��I̮�b�'(Js&y`����z{�D���T~����z���: C��28F���X=K[� +�aG+J��2y\*,�UH���y��t�lJSlW��ڊēV-�����:H�u@�K?�j�*n}S��:�:Q�DR�����h��w�)�C���JU�UD5٥��$�R9���:��E� +��4n��D�sśH�T2�R�'F�Jq�L���Dsi��2{��L�����2��bsP7�(�P �Q�U9�������4X7��@�dP� +Q���D�����UE�pTcG8��h�� �+��+w�c0p!m@�ʳ�Z�ۿt�ڭ�7��r����崑g//�X"��M��..��a�j{w����������������_-��-c�PD��<�v�Z(�7��[6U Oq���"��F!�V[dq��8n��}�H�+G���7n-.�6�o��?�������p�}��e���|�G�O�g�}f�9d/{��^�����e��������������#d��-]X�",:"��`��]�C�4���%���Ʀ���Gssm}ݩ�gja᱓'�Ex��?<�Y�~u��!a��S'Ϝ9}�le�9��k�q��+��҂E-B����UW7ۈ��a'�_�q�;_ �s2��-Be!��0�"w�����A��P$ ҅?�B�8�e8���r�����gSj��� �[[:{�\�P$d䌩������Faww{����������Vqumyfv*?�Kh ���p�������|k+ ���Ξ����}~�p�녣�X\��5LX��'�0�p0����o8�}�a_ ��vv�P8� +W�HW0LPOkɌ�2H��.� Wy��̕�*���'���!aE�+��J`+Y̍f�e���R@F%�d<��i�0)��m�i+[��YA��M�S !�"l5d�+���E�*��#��hB��RW����M�Œf�D����GUW���3��R�^2�M�3�G2gU����L�DЉ�l��d�+��/�| A��f",3pE!.�s���Ϋ����(�~@���z%�Jü����^SV�}ɠCqcTMy%�",U�Eߗ�E�ey�:�P9�K)�F>y��RfGj<�eMv��QE���vz��h����(��x�K�3�Q��1C������*C�+z��`Vq +�a�K��w�����*0�����@f�ތƓ� �"�Y%�Q�m�Z[�sA��!^�1�C�o�p( +�*�~�3�3����\�~���ۗ����ޟ_\�dG tK�������Z��������w���K�k�ˋ˫��^Y[^]_b{y�������W�V��}�@�+�r_/�.��_����+�\�Eaa� +cW�M���� w���j�Pd�ې������r�}������e�}��������>��������^�����e/{��weut�=�ȣ=������P��؆�X���K/���B��g�eo���<!��M���p{Wwu}]]C������ʳ�U���'�T=Vq���'�A��"XG��@~�-�3�*Ϟ9��kj����a�55��U+D�)��� ��c�l`s�������� �"�",j��\0�-X�!@X��_a�0 +� +,�p�ώį`a8,��{`��������Wu���������`0JgRS�K��������ۻ{ۛ[ŵ�����ѱM׀_9;���t�<{����X]]=}}���.���u{�^_�;<;0�c{8("I~�?�n�����p��X�p4�~���b�T�2W��� �V#��}�4s�SUH��x=��>6�ǻ���1'��ь��#����/ �O�y1��G8I���[�/mi+�P��LT��'C��$�'��z[�� +�`�#�ɕf��f�����2U�"U֨?7�U�gT��J�$(�/�2�i�mUB�Jy�Rul�jf���Yql%�&�R��RZa3uf�â`�H���V��*�n)G�*�]q���U�=L�@,�7)�G�W%~��f�Ӓ%ƨE���b����R&��&�lĔj��s%�Ô�3�]pԩxhNW�hK}Bs"�[4f���E�Da���"fEL��`G5d\\�%:��F]�UD�wqn 'W��`VIf���S����@5[��*A� +���u��Er�b�=��C!�8%�=��O��6�/\�z�ڭ+�n]�xe��15=�L�X<��ӳk��ٻ������Uv���入�V�k�+k��kT\�v* �������4��ؔ���o��*1�U��#,���^��)e�B�`mm����gjf��`�8y�������߃��[��������������g�g�_A�����e/{��^���X�WŎ?�я~��o|�[O9J���g�Ţ �c���! a�V�%��k�q����jGSSM}��ӧ�*��*N?|�ء#G~)D�dq?RQA�c'O�8}�$"<[]]Y]]U[,�E��|������`�jn�8��),�Wm��������Wbw�f'ȯ�������� �A�E�?�F��W��%�b-�E&PBC~c��B.��wp�}�[��?Ec��hhr������>-��O�-,έֶ�7w���K�jumevnfd$�����]��--������p47#�jk�����������p�:��A�Р����r� $��t y|n��Þ�U0G��X"�HR� +\��l:��Nb�z���QI�� +���*i��dVt^���E��yJ[���J�Gl� Ap���*G:��Ao��+t[=~���ndVNkC�Ii+gV����sC� +2WL[y!�'��i�8������*�'���"f7���7\��+�IB�S�2rT\J�h����YA�2��LFI0�S�*,�W""H�*�Qf�ʂ��g%�C\��`(�Za~��v���xQ1Y�Ȳ 2���G��'K�Z�3��*�]�L㞫�\���`DH�)ꭃ|\ �0D�����Q�8��p^��+JyΗ"�{�}F1'���'#��)>j;�I����L˦�dY��R��r-`S����w=hˀT�E̥��@<�/~"A�z�U!�"����D8�;��*B��H��0�A����w0E8a�S�����ja{�¥+�/_�q�ҵ�����5�:�В�&�%�����[ۻ�{.��N؛3s#c�ӳs�ˋK�ZX^Y\^���?�F=A�XX�Q��8p�W\x%RX��֚DX��; ���6�DG�P�a� l�n��n�챯ejz.�'Ϸ����Ͽ����o�������x�7�y�7��ﻏ�}�}����7���-h��������e/{��^������_��oz�����7���|-�"{�I6����EJ���ؒ,�G���m�=Z<3f�ltc_kP�¾j���ZQ����ػ�w7Iɿ�������E��sν7o@���y�q����������ʪ����=�_�q�W��;�M)XįJŹg0�=��K�E�JKg�L6����(���k�o���͵��w�_A�;�����.�Jr���������! ����p@#�r���Lq�p�U7�+��H��a�TF`���+.���P��0=J#Bt��k$ ���R��B�.�TBA$�a0402��?���[��.������������>=3��������K�����l�ۣ{�������mm��fG�����jme�-i�z�]]>�������������w`�o`���!6���m ���r�5�"�����L.�d�Z +�'8=�jR��i#�j�uenD�%z�Qw���Of'&��b&�m3�@���!��C�e[�Ԋ�!�J2�����0cㄭ���bA�XE�U��-����w6�[��rY�� �L�Q��JKA1-��T��ӊ7���:�c��l%\��y��)�M�$).$R�Y 6��*.��rO%��0#5�Ĭ�S�+0s��s��҂z ���(�(��)� W�0s&��?ݟ�ʖB�T�j%�Ē�i�ԟXb<L����g��P%�,UV¸����ɔ-�qIti\'ݣJ~�I��W3)Z!�T!�� +C��`Y�)@U2��L0��8�Jfaq/!罈�(8=�+�)u��+�I���+���@GQ!�B�.����?�$Ǥ�� �JG�l�tfbzf����G����|�ɧ�y��ׇ�O7���[�OL���]��-ml��?y��g�O>��?dK��w"������V���jcgm̓�|P����J2+N����!^����{�v�)�b|$�Wȯ ���.a�#<z�t}k;�˳��O~�^�r�wPpE���Kl\��"L/�q� s�ϳ%�����w�������[?����*����*����R_��W����_�z���_�/�����l���N��0�&b���ݘO���g�Q%���4����p���9\.�`5779���啕d!~�� +����ºj�`5�a�;� +,�Ј�ӌ,OG��.B@XЅ��M�?����,������7��gH�d�{��'W�y5��+jD(S�Ga���?��h0$\�1a!d#��������pdhl�wp��#��-v�����io����%���b[��-�v��lmo�>��po>_�k�6����vu�����dg��� ����nko�v�wtv���������������'�5�?�����8�p0}����l&W�����}4W���q2�}ZV|�ybVSs\j59S,NO[�I��J}C�i�Mr6�c\m��*A'�(J��Z��`���j�V���X� ~%�F�)� +M��� +�V���1N�R��!��$�ӳd�b7��Ȫ�Q!U^X�1�ȩԑ��VJ[�lA��+5��\�s���^�a�`S1MB��A�R�"��S�䶂}I�7�[�����D>�Ѝ��>�N��0�`4���L���������sh��U)�ʞå*�N>uj���o}�|KFi��^��P�9�K͙�Nx����w�|̔�fN��o#�PL�% +���!OR�?k(�H@�i]�$���Κ ��LO�2��=b��\RG�0�Z��)�l"XN��z�F"�' d%��K9�2����xRg����ʃ��{��O�~����'����*�i��"����W��wA����gO?����͝GK+����T6ϮZ�7o��������k(�ڄ�vɯ��j��+p��j�!�_��,0�pB���jB�pD!W�Y��}1=~��T�������Ï�������K���.^$lE���6. ��q���s�ϳg/]z�^|�����g�N�`��!����*����*��խ;w�^�~�ƍ�7^�%�Ԉ� z��Pw�Iш���L;��� +z�ې�aÑ��^���p9��m�����&WKk]ccEU՝����ܹ]VV��F�;!���*�`5`����鴹 ˉ�ֶvH��)X�^t!D#a��.�"D�����A�=<�{`X�E�+�`a#B.�B�%��y#�8J�@�~���� �bZ2O"���@��HWo���u�ݐH�t���]�C�C�X$�����,�_�.��g{{s}cm��[��g�����XO_o{��mhw8m66�W�3�jnmm&Ga����������ur��#���Z826��0��P|� ��fG���W*��A[!�Ҭ9k'g +�Yql�j+�F�c+4 B{B#�W[�b�� ;���F#١����*�Y��V����'8��12 �x+3�J�W���2� *�V�We�E�UJ�`�$v�F��x�l+���C�U��b@C�����4u��"*yk)�O*�:^�1-�yQ�4�s�Wh��6��Z��q�k�yEy%�^J�VZ�l�q�fsѶH��&��B���/1���d�)�0s��a<-����t�D�ČI�u22�aeOz�`45�>�-U��%�F-}��҈��s3fF���i?�VI�J".�_��$��:+dYi>C�$ ���J�0�*C�?���qm�!��Ɠ8�hL8|�� +�V �� +E�'�LM��-ol><8z���_��o��|�h�`eu�85��7)�S;��|k�������O?��?>���;��˫&�gu��JSO�ə���{��VWV1�jkl�[뛂_m~"+�nsZ%m����-vq�,hD(r�!� +JfE�W����?8z���V� ���-���w�{� /|�gϝCl��TX]�H��<{�̙�l���.=��/^�z��7�T����?VYe�UVYe�UV�˪��y�M���;W�_������_��ꄭ�S�B�%sݹ�� '���V^�#x����djX�`��y\-�Uu�����Y][[^Yy��ݏ1ŝ� �����UY[)Xȯ@�����v�A�E����FL1�X=��:�R-� ���AX>jG(�۩a����с�1�`� ��X(�GƣЈ0'��`� +KOAhpBF�����({���NWk+�\--o{oo 8�ԵBqbaqauun�6��?������b*���C#�]~��6�;�6[=;3MM��&Pa9��f������n��y�bu ����}��*�B�H4�m���-��� �Lv�!Wb�ތ�V[ i����C��= [!�y�P[A;D.� 0 & �]��(�S�C�VoE=9�����J�\�lvLeF0����"�UD���fGd�w���T���V���1pR�(�=���'��j��� ��J�o&��Yj%}j9��K� ���Q1-#�#fV�4EdʼnPJb��H*q�Qh�A?���LHe�k�K�z&.aW2#M���$y����J��Ą)nK�����S�T��U�� ae��y�PՀ�����x.s���Js� tV��e�Vė�KQ����椯S/�NK��O�y��r5hϗ1u��j)|)�`IN�eq+�YH�P^�>�y�\��L�'s��h�[Q(�ؑM�4��X Z��cҞ�l�P8���|&_��[\]���C��g��x��c�dzv>���Pb�.GsKk�$gz��o>�����VV'g���|�z:Ǿ�&���ӳ3s���@|����5l��+~���p] ����j�u���Q�'Z8�Hu�,�3������ᓧ���Fb��ں������ڗ��̗�y��ŋ�!xQ2+H�Μ/��]����^~�ƍ�����7�_��_[?{���*����*����^�H�u�F(�������Laj� ��E��B,��b��D����nj�MFC��D������ry��� �������D���u�N�p�� �������������Ʀz��R�\�f#�������.J��F�=�=}^�R +��E�>�"����Bn$��5�B�`A�;��" V,��d, 4��R�����Cc���~�����;�6���t�xܾ��H�R��������ŕ�e6]�7?5=��e�Z̃����r6�mp&ٙih@�ek*,��<n@X�vo����������D,�` �������� ���y�U.��A��N��ITU������¾���`I�ZM���Tn�K�[�@��nWQm� +nHѾ��ʡh<�6�aʶ�Gǩ����_J��X�(�^� ��}������Nj�8���WӉ�Э�&$+$�Jq���W"_�d�T���+Cg�lH�Jİcs7��͙�������H1G>A�� +�`��,M�P1.��� +8�&|�x�>�b�Tn�O��� QI�~��*�0�t\��Z��WûT榛¾d���i�%��p��[�J�J��8%gb�D�&y�iD+���(��ɴ��рK���L}O��Nѡœ��� +ɡ�G5�����'�\J>��P:ŭ��b����RH�Hd�̊��i�d�����\�L +�_D���?�q�R�; +�1 �8��]�&��WV�>:8:�|�O}p�ds����b&7�MK�7R~zv����Σ���'�O?��3�� �w�I8��b����w572Tv &���������y�oRl�Onߦ���E�W�,�T<�-G�*��_m��<�;�dGB6s��_��ٝ��}�ݯ_�x�_����\�G��� lu��g�\�x:^�|���o}���W����Ϭ�9VYe�UVYe�UV�K����?`�7�|�ʵkW�]������eT�L��7��r#!�o�*�8wJ�� �$da��0����<^o�����x�5 ���f������NEyY9H�n��.�;ԅ%X��U__����Q��)Xm�`!DZ!���X�����ψp��G` �����A�W��,�Y���G��Ga��� aq �`i@H��H�R�$��S�(۪w`���nmo�0x/vgs3����Z<7��������[��������O�{�d(���i�z]--Mv[CSc]CC]C=�+Ч��*�f������8�N������0��� +r��-[$��W:��W����]��WSl�hT�N�!�y��'s�b��1H����7�:f[�{�D��ށ� +F��a�Z���F8�R�V�-(��)������$��b����*fV[��7�8���d,�����ʗj�8�"��/!Wi�I�y�Y�zҝT�虄�QDVb("+3�R�(z*R��0��f�\�"�J�j�4A�4^�����ar�R�uҖ����G�zJ�zu ��͉�UL�]����S�LQ��s��KA[�*,Û0�Tܐ�k�i��Z +U���W;ƍ��{�l���)�|�ȋ��� 嘉�ō�:���A�b�T��\�LV �l2ͧ��s?�F��(�J`��W2+%z����70I:+R^E^œ�Ʌ�+������0�l'���ť���G��'H�V��/&�Vl�T�8=������p����1����_�ml�K�eE�c���_aZd�ٕ�.���K˫��זW��o����6�I�%��e~��p��n���;<�jk���-� B����;�G{�>_Ϗ��o|�[/_���g�9s��\�₫��U�g�e3Ͽ��Wo��ꫯ����W|MM��;�*����*���ʪ����͛�o�x���@(<9=[D:���XSEї�� +�y�s�@�u�����A�;�� +���9�Y9=��[S]SSs����`�\V�1�",�{�",6�_UUU��U��V����p49�vlD��������zeV[Wv!�w�W}؋��"��Hʫ~L���2����ˮ��E +��!����B(�2�GX(�J��TTK���hld<�?4�����z���M;DW9�wWw���`0ԴD:����O�\2��{�Q�h��@GW'i�� l����Qd]�į�`�[<�so��v����~�#��_����ίؽ�qKes�vpZOr��\!��>�ق`Vl51���(�*����3�F�`���1� +�V�`������C��� p�.�R�4WH���>A�'a���*w���HH��_S�@Oy��J��*}J�\�B`�S���J ����;�j%%F\E�dT�eI�1!�Õ�"$A�ʵ��JFi)L�bZt +�+%"�TU:#���W4%��X��P~�\W�j6̔�VLȦ�%�M/ �JI%���qs�F���`�#�+��� ���OQ�R!?��̘���τ�I��-��)]�s��5K'c�H�>��TM���ȕ�Cf)� +V�Ҭd6���q 2+�VYh�O��U\�֢ZL���f�#APKƳ�� +%��3�����v���?��㧟=�;\��ƮK��������������h�`���ѓOc��^c/E��<`@vE�%�DR��lb��S�S3ӳs�įVV��?@~�������7�amml +!��E,r��v[ۆypCB���#�~���p�[���7^�q���*�� W0�_8w�ճϞy���Ƶk�_}��+W�~��T����o���Uc�UVYe�UVYe��z�6"|��_����7n��G?f���BȅX��f� +�Wl*�(Ă����{������=^o�����im����ۜ�&�����ne�n!�kH�PU�S�j�����lįl�fGK����a�UX��F��>jGHK�X=����0d�A���W�)!�{�F�L��(���E +���b���:M#h! �G�|}}m��.����zDW9[\��ݽ=ã#�h��E����S�T2���c����Р������lnn���j��^q~��؈]�n!lq{Z�B� +"�|����?�������aɯ����ʀ�*� +�ۉ_ax{��f�ǎ������ \A� ��O]��-� +�9� t��1_]FW��&����Ј�B�x��d���ƸO0��V���Vp�5t!��xgʠ�&A��:�����\M{ !���J�U�P[��Pqfy�d&g�!X�����L0*e�8����"�a��`�2�/��h�r,��i} �4U���J]�ɭ�WI���tqU�Y�%�O�2q�LL3܅ �m���"�Ӯ�ieN�E'Y٩_����R]�>�]�}*�T���1ؗ8� ݐ�))dRӕ�J��xPEs&�)}�)��R���IL1�r�_ўL��R2*<$�"�U�DV�!�!o`�N#�Y��c&��1k�Q�ViQ�W��b�$�\�uG�^2���{�6vw��z��������S�����v-�/��[z����h������ѓO��Wس$�cד�P�]�±x4�ŵdBӓ��NL��*9���������ʃu�V��$fEڪ�M�Ya<��T^m�Ip�=�BZEY�[�po���~��|��f��7�q���/_>{BׅO��V2���ٳ$���z�7�x��w��We�Z��_�����*����*���ʪ �~B_{啛��>0<2=;AX(���)��*LMQ(Q�\�g��"a.������]���=BO_���lw:ڼ^6�khp���55UTW��F�l���B�{EEEeeUm]U]5"� ���t9ZZ�nO������V[g����"��ݽ�=}�<����LW_���O��s�E�A��؊TX$��$�",H�B �@X��?A �+@(��`%9� +�c��ਟ�n{����fs9�����fw����o��{4 +�#즍݈E�M��?4<���i��h�ƅ�UM}}ummU]mM]]��6b +� �WN�_y<�Ј#��D�{o�@o�@����D`�Q~{��k�QOeә�l~,��ӓ<�j��V�-"��O"��l��4�?(=� ���+�Z��Y�p� ��V��ƇF��#�Y ��I�����&�(&\�^�� %� W:W[�Lu��x�@.�J) ++(�R}�E='큼��f��|Q���)b(S⼋��P)<�4�h���M�V�ꬴ�Xi�S)#3DS2 �&WS1O�HJ,WqY�y��.T�X4!�'*�K9Ը|��RD�X)S&থͺ/��R7�u��D�l����V={�I�D[��2�4U/��S�Y��.�E��`�R�/��g��t�ǓЕӨ ��1O���Q�d�T��E�� +�U�ߟ@XĬ�F�f�������*�KH�@��%"�j+��b<;�oŮ���م�89�r�����O>�5��O�vv��-�KPc��tvzna��:[�h�p������'�7�������aWU�m���D��%ө4���@ͮxE�m�_X����tmem������ �_m�oI� &_m�l�<�`c:�����!,��` +������#v)����w���^�L��3�0lu��9\a2��/�p��+���o���W�&�������z�7�UVYe�UVYe�U����gӷ��+W��x���?\��: Q���&�1��X2��Eޑ���!UX�a&��'R������4�s�64@��U]WW^YY�,�Ww�E�)X���5���uu�į��1�����pS#¶V�_y��!��������a��R��yp@L���5ܣd��AjD8�,?�x +�X(�Gx�;oD�I!�k�Xb<���u��F� �����a�����oht���~6?04���y;:ZZ[�GCScM}]u] �ښj�W�쎅7"�Q����L��v/D`utvR�{O/E���C�h,�AO�d:��f��l�8�7qD�r ��B�ZDAj��l�4�c�;eT[�'�0�P$�NN <����*8���Gn $� +P[��C�e�U���O0�섭"qq�5��\a�����G�7|��Y����#�bI{�D� +�!��J�+_):�t�� +�+��N��D���MI���MI(M�d��d;|}�s4 +�>iB4�Y�LTV��~��.v������G�WL����-��(�$�܄��(���h�0����.il�o6�'�S��S�г�qbKEki��C3��t,�8q6��:g����/ͶՑވ�@���]+�/�H�TI}���������o-P'�S���).~��*�$J�S�)���Փ�QO�R+$WhD�`8���B����Ʌ�f[A ^8E����+�ۏ�!��'O}t���G�+k��$�f��Tqjvyu}k�ѣ����c����㝇����?��Ӂ����A� +N ĮK�0d��K(���T�Uԧ��e735;?=�0��H����spc{ ��*����<ks��)�dW����`܂[���;�ã'���/��7nx�ҥ�+q^�HvEpuW�>��ŋ_z��7�z�ͷ�f_��w'�����n����*����*����_g�r���민��[��3sEBX\����5e$�c"��"D V$X���톯������mo�۫kk����Ԉ�����;�~�į*�@!I����6[������7"t�{��!��B��k�b +��UX��.�$�� ��A1�,Ra����!��F��`h,&��%�F�p�p<����}�#]��o�����n�ol�k�o�5ٜ��֖��N L�����C��������lv��\��r}}Um ���U`�$ v!llj�ٛ�Bg�"�<��į�����-������tp���ӹtv"�+���'Ӥ��R���TV�l+�Ң�m�&��} D(� +�U��V�H�1$W[A����V�`�;�B�q0 �O0%� �aiL1ڨ��x�T��&�U�h�*(�E�IP��'� b'AoE���]!(SR��Hv����vT2$?AHe2����L�@u�hB��# U�QfM���c�R�/�J���$�:zL;����̤�R���)�A�EFƗ�s�FM(�&���0P�"}4Q�����Jh |-�`Ѽ��Nq����+�$�L�vI�r?�$���m�e�,>�T�Ntz9�I�$M[i���%$��R��DJ���D,ML�'Zĩ�Tg4L��'Į��y�h1� �� j&�`�[H W +f��V���ٳ�L~v~qm}{w����O>l��ĖLMϳMp�Dn�xo�����������������ù{K��H����w��������Ό� +�� +��$���4D�er��D._�(N�f�f �}naqqieiy����L�z��Q�;k��� ƶ�+6ot�,���m�n?���?`{p5�~���җ~b��{���K8.��˖�Rp���o�����w�^����h������/����*����*��5��|�������?������N*,BX8?CB��r�<�=[(RG�T6���_��������$Xյ56���tUC +V�rr/+++/��)�l9���V�dk�;��N������F������������E����x�b�������v�P%_��BH���!��>�S�̍G��P� H����X8�b#B��$�_A�{|4��~oWW����p�56֢�����lq�s��m���:|]����������3�9�����Q]UYSU�,���h�5a�;� l���=nO[[�����"ܻ{��I�54<4Xc����@�-��@W*�䡍`:;�grlI��ٽj2��ٝ`4�6�!0 ��$��j5T\d��jn$�FX l5*�U`�c+�' �b(�B�`L�'H� Mi��$\��ȯ��$+�S�s2��ȶ*�]!�۠�IpBC5����@�I���9�J&G)�J�~h*�T� +A3���pd5��n�L �8�b*݄��K��,����UIRTx�$���O9<08��jz �Sd` +�82r�R1��<�Iz�T(�2xݸ���I�0�8�.�[ !Tf+��1%8����'���ROE�IJ6�_�UB�����ȏ���G �E��һ���=�pW�U�MSW�(e�֏�.�]�� 2"�⨊��$v Q�N2�(%��`�8�1IjEr,���+�a��L<f`�85�����h�����O?����������R*���Q�[6�vv[���-�m�����k������郫������a�U/wzBO��'j8�+��Wqrj +��3��K�����?x���`cs��&$��sY�6�,rJQ9 +Q��h4�����3g�y� +�24W��(��Apu�[���W���W����������`�D��*����*����*�������nܼy�ڵ���Uv#0�por��y�b��H�sݱa�8E.BhGȃ� � -�H<��?`onnr8�;;�NgmC�����WT�ݽ�1������jHq������ojl���N������r�[ڸ����.���N��N��xBjD��W���_ �k��oJ��J�_ � �����W��5< �(J��)%XBX�d(��h"���lW���\���������������F���lmnm�a��xܮ�f{�2���^ݭ�(��~�4�W��acS�+;F`��4���6��j��vvu����u�������fhxl���P4L�4��V�sGfŅ���� +�8��6��@�1v�dȾ�ddw�8�C�_�����?���!<��� l�VA�V�,���46��*p�d䫣�cBv�+m&���9��Dk��*A&A>T�u|��D��))��L����*��*�B�,]�H��$/~�e�%`I NR"���>M�I�M��Y:E��R��4�$G�2�[�L@)�Ie�9�43��E�z)�E�;qx��Q�QJ�?QC���%]��$�$.�����ǒ���@���J�ĝ���+)=�ɧ(^/��pF�&$K��9Td�m�� ������؊����U�����`!I�"` ��Q|I�"B|�+���x+.��ƒ ��$�%s���om?:8z���g��|vt����������d,��k��*N��~����wx�wp�pw���V�0ɮcm��vec[��Rv}cW$��d��b�1�>��[�泹"��987��8o���+��Zۀ��u�m��J评�j�!�m�~���겶f��}|���.�_8{�.�x+� ��[�={�̙3�Ο�����|�����^��O~b�8��*����*���ʪ��G��߾���_�z��+����`aiyrȕ3F_©���44"�"!��|�R� +���"Les�|��2��]]Mv{���no���kr:l�暺� +�`����n���W��ب�����",hD�j���:A������$X<ˇ-{zِBn$��U�p�jP4"&9Vz i �!~�7�������(a� �E�WԂ�=;�� ��q{����������ښ��ں����F���r8Z���6���746��ձ�_Q]U^Y�L��^UEMUUmmM}=!,���Sۼ�\m�6�vy��_�z�_��p��5�.ol���d�#�(��Z2�R�$)@j��� {�A�Vl�j,�rf%�]�j�a�V��+̃�����'�V"�*-5NJW��n�V�O���yټ��cNe�A�LPSQ�R+�����=#��?�8��FL��?h&1�Y��wbȄ��1�H*�">�B��[��D.�g�(]�99 �d����HIE&�zlw�ɗV�f'ߝ"�ވ�M A����Tޠ�_-b���Op'�l2j��䒤�/�4��+Ϧ����\7�:^=�S%�����ۄF�3YI�0"(�!BK�(Ts��Ht�<���VD�bq�Ŕ�a�Ē4f ��'����CQ�'�bq=�-���[�����O?����Ӈ{��l'g�d:�E�Z�P\\^��yD�j��hgw}sgf~!��w��إ �i�=��?�G��Ql��`|<���%�`��+����4D�p��x�M7��W��A|���>�!�j�� +���js�4W�Ӿ��>�������?��2��3�\��v�aX[��V�q����������Z?H���*����*������k�^}����^������u��[4�+�b�8,4�v��"��y +�&�E���ф��?�hnv8���������Ro�S#B��u�Ν�rn!���VSUUUWWMqO�M ؈���c�{�,�����ʰB�;���B��������y��0� IG��r�.�Јp��(k4&~�&B��D��`!�DGA����������4:�#����j �̀� ��h��چz��������.�e�S�ei`�������1,�M M<���r�Zݭ���vtz;}��n��(k����������H,�CS?N�J:�� 4 zR<������ �c8?z"�}�+ǂ���I���q��J$0�*If1J�Fd�Ƅ+l)�� +��u�.,��t^F]Az����&��Hv� +l%�V&{`F�L�`+�BT�<R�Q��� �>�$���"F�QR����GJ�)Mʀ0 +�Qw"#�"")=�Ka�T��j��"O�(GhȊL��,��k�D�u2А�ۤ8��Z���$iz�ƫ��ؐGE ȓT�]�Xb�/ �RbMMUFET%��xJ�{�*�"\҄�*6 ��k�E#N�h��H�H��YV\S�����ճ��xP��+�+�]���ES�4� �<��؏4�l����w8���痤V��Ga<I�-Z?�j+�\>�G��O����Gk�ӳz:G�<����_z���p��"�?�;\��^XZa{���y;;�{|���}�}�u5�~�ʉ\����� e`��)MOCo\POP�A��U��������������|��VV<X�f��(�Z�����,� B�������<����o����K�;W�ͮ�+#��͜�p�ʕ����f$�_���կ��!VYe�UVYe�UVY���nݺ��w߽r�ڵ���ӟ��[�" ���I�U�Z,rNS;B����"d3l:tt���V��������[Zj���++��� ^� +����%X5�j1���p�]-�V����{ �����&vt �^$W}h!�.�\y�f��E8(h�����)�Cd!����p|$ ����x$�ƃ�Dn0B�� �=6a��������fs������XYQ] ��5���d�����4W���w�˱3㝒p��j +r�#aX���f�����ogW������ۇ(a����h���&�X0�Hv�b*;b+ Q��>:>8��An���hQ0��V��\mE��x(��,� ���L0I)��7�l��ف>aK���Sr*VAC��� e[�謒̞�$v�c7[�Je7h�.2��q�(oȨ�����@IRp�2Q�S �DUI�w���3I��%�.��R; :��' F~��)i~wI�sUߥj���c&2��O)J��`M�_S!R����N%Q@k��Q&�V��`SZ)}*�IRO�ɨP�Iqy�Y�"��5��H<~��T�,]�U��p�/��J���r'fZ@T]ꬰ] �a`�@�!H��D��P��ۀ�I0���� +Z y&��~�1���L����V��w��>~���O��7�.,���E0&�ճS3�k��~�>����{��3���x;�<������7�c���o`x`ht`x�R��RK�h�r<��踦���vP�&�웋}��/���_-,.������[k�h�Y#!�X��ml��gC�hEe՛o�;:��_�p�" �.�ꂌd?�؊�.<���_��������*����*����*��y����6��r���W_}�����^gw����������"w�(^��ƹ!a�5�#�d:��(�kp���j��Ngs3�`A?�J�`�)�EG�",��*.�"���r9Z[�n�������#����� ��rbV��¢,�WЈ$X�0�\ K��)X0��U¯�"�]iD�+.B�T��`,>�����tRB����C�WeE9�[ћ�TܽS'� �pV�sRQA�k Ž,�� <������.�����I V�+_�Vo���"#�(���C�y��㈌�7��C�������Y��ՠH����lM? ��$�"l�+h)h���x�$�FQ�4e�k�`���A�h���ʀT�|���.�V�VN�t�$�+������ +fR��Vx0H���*�4�3�?g�~�SR#1 �n�s�Der�%��K?�}�fE�I���bJ��W¿fY����*�A&�sBae�zR_3z���Sr�Z�� q~�ʓ�]D�0�Ni"f�@X�\JaSƁ�Ъp��SR|�+�B�����@r,�N0Ok�]�9����L"��d(��p��G��B���)�U[2�B����:+K�ō��tJ_�ցQ�V�d�`+1�#N �Ѹ�����x�������7����!��ɧ����w���S�d��P"��(N-���pw��������c6���`�0��:|��6�����;�h`�l��ap�Ү�gp,�= ^�g0��Wq-���YN��z:�������h��g�ff�^�[���+֠�������tcs{csg��������H4fs8��;߽p���p�ե�%�ϣI��9N��c�[�_z����O��O�k����O��VYe�UVYe�UVY��+�����߾v���k���g?������'~��#�"� )����Eًp2�/@/B_�ҹ<�b +���no�x<���MM�v������7"����BkTVQ�G"Ƚ�����p�|����۽������l��" �Wݽ���]�au�"�R����"�{��c�^т�S,E�E)X#���S +�+�W�[T0 +AB�X��BȎ�s��Y��PY[}���Ny��ʅȪ�6��;Ԗm�eD�贀���x +����;�W�����v7�`y� � w�"�^�C}�C�CC#�ã�#~$T�a����ã����ʔp5����V!�V�O�c+����qn��V��ql�� +� +��l!�5��q�$� +Z(�0v���P�"+�I0G�DsA��j���j��s�L�$O������Q;͝`M�?L�Jf�# O RIWRг�ilJ7�#M? �J�uE�9R�'Η�� ����DJ�O�k���[.Q=iQe>lZh�(\�����:���8�R�TqMP�D� Wp)�K�(�����ľ��hh!���.!�%RL)�8��(��r�`����f���)�6�#�c�¢��\i$���*�Q,��X)He�B?�`(Ɩ���3��w��>~����Ӈ�VV�&�f�z����l�0������:�l�dw�heu�05Î�w`���.\��nv��j+��AI��1�=�!J�t4��N ٸ�H�z:Ǿ�R�l6_�N'�S肟�����]��8�`�y���*�u@X�w��Kh��֟�ǿ���k�� WK�ru�ܳ�N\��˗_}���~�\���;�nݲ~oXe�UVYe�UVYe�?�����bӷ�~���^{�ʕw�{���^XZQR��8��)ί$�,wPa`�1��U%X�!���:�]5� ����&zB V��`�)�W�t�F�j��l�F����7����ikmkw�yy�;��|^�O�Hy�ك�^���� F����a �u!�%}�#�8�Q��p,��0�����5����l��Q��`GwOk����\�d���+��do������wn�)�����w�|Tv��������>�){�LAX��l�%X 촐���la�� �U{G;8+!ȝ\���>6z��� �F0�/��� fX)�V +�⚫Q#�}����{I�V���DlEE�r�ͳ��ڊ�+l�'c�����g7"�2��5A�7� ��Ig�� �H+>���ڊ3+Ѓ�a�Sؔ^�9.�9l���'4K������R�S��Z'�"���f^��d�����&r����Jߣ��$>*Qa���X��ɵS��D[a15Q�d���v\�d,1�(.��ۈ y�vR[�b*��v��"<��6� >�S�UJO�GC`+\A�<�]!�Ҽ&;r�G)�0ȕ��øa�aVQ +`�C�@r�wjሆ���d�)�]�g�>;�`����o�}'g�Vl��==~����Ov���mN�.��y��Ofr��6���:8z���d|���m�]�ݽ�}l��k*ʮ�{@s�?42� {�#p��Bl@� EblP�U,���vP^e��H&�^=; '�;kfj +2�g���-,-,-/.�_Z^�����յ����G`f<Jgs�6��/������◾��_z�¥�.\��M�F*���g�`�/]z��˗�\��կ}M�����R�*����*����*����ko�q�W؏����MLN�%XF�����SF�;���RV���Wԋ0��:|�6�������u�;�.H�����]n��,,�W�5�\nqO6�J��퐂���ikmowC�;a �U��^rv*.B_��%A�_����WC�4�F@58L�������"�pd<�,DX!���C$6�}C�]}}m��N��Mcc������V�����o}�N?fK>"VY�<-\��)X5u��Yik��퐂��luF���6o'�"�����������8w�w~���q*?�ac`�*��!�O�w�B�`��Tvf�ql�*��P�x�WD�Pm��eTN6�H0Jt ,��9(�LH����y�9WX�JS������YѠ�x��ₐ��t3�:)�*A[�o�P'%F%)bfG�1���B�����DN��:�JV6H�l�y(��RԤVJ����VH*(L�eN1%��)z�*,�{���AIfE��k��Q��/A*!�RDUD�h9'K�ƒ(���"B�#��9Ԃ)� V�i\�P� p�����E�A +�"1�l�,L�� yQdP(���0�I�������h�C3�(�xBK�S�+[��������{��7w��2ىh^4����]��`}��u����������{��av9j�vu�z�{�Ap�؊k��-8�?4����A����t|d<�G�s C�TLkO$� �$�U +l��\*�g�D�B���������c���"8�<�m�v=�����7�_��?�7����_���={F���Im�ƙ�g�}W�=���/���_��_��c���|��]a�UVYe�UVYe�U�m������+_�ʍ�7_�r��w�i��\X�_ʯf �]� 'E;BDX<�x� ��cZ�x���v���.�!59ZZl���*Ir�]���� ���,�� ��lv�:�������@�;��_y: a�t�z(�\�=^�,�sa���E`u�wίD�;���"��c�0�+��G0������x�m�^���& V]SSU]my�N~XVv��Ƿn���~��G�>���nѺ �D�{J�j�)���hs`#BpV:�E,O;GXޮ������*,b� sm�O����Ig%�V\p��d��G �F��DD�i\�V-e�[Q�:��R�2ɮd;Wd��*�U��)�}��#c[�$��H�O�Bc ��\w^�aP����ENH�N�c@�HSdN���¯�3]I�� ����p��r咅�ʜ���O�I�R؈�*9�dج���Q2�\ك�ar��j�S�AJ�RE=��� +�b�R:%�O\g%����b$�2�-!EZ� r'I��a�}.�l��:;� ji�(Mm�(���Iͅ�A�ީ;���@;�L�sW�`�l�HL��� +b;�YE��*(�"<���}������|an~im}�����1��l���[�Tvh%S�M�|���t< ���S��?��vv{;} +Er��+u�ץA����38��zc����N����D��l"��ʫT�U6�j��+L*��y6����-�/./��������~���?���w����_���<�̳�b$��'x�����x0��gΜ9{�����/���͛_�}�����m����*����*���ʪ���ʍ_��������܂�W�%YX��*L�)��#�� �f�cV�X���?�&��$X� ��e��\�aE�+6�`�{����Ta#B�ˡ��tٚ����_Q�;�`u��]���!VO��B�W^� �U?��h*̃��<���X{���G8�B~@ V���a�� +#�"�����X��PW/H�\n{��Us������Gee������[}����>���ْ[�os֝;�e�`�p VCcSc� :A���v !!,2B;B�0B��Pa�[E��!x5hX�O����5�*����*C@��{�)� +"�(>=�q� �N� J������݅��.�6-��y��lI��9�J�a�<��4l<Y"*��EN w:�O��4���x:��O ;[I����J�{��n +8�� $�����)M���u���s`^zT(�B̒�F<M�)ތ��$�Q(휴R�D��}B:ş�T��{��O�TAEm4C*CC7������O: �<���тg#��9�"��7^"܊�1qE�Ae�D���I��J�*TXn"c�c�tO@B�+ +�� +N� +�q�d�!� +Fb��QM��fVl�<�?<|rt� ;��W�� -�Tv�-��|�L���||p�dc�Q�8�D�G����IMQQpe�*>A�b�I@���0u���r�L�A�FIy���m�����TFOgS�|v2�r{5ɾ��W������������ַ��ON�V��~����w�z�ҥ/?��W�`v)�:w���Vg�=s�-��矿��KW�^}��7cѨ���l����*����*���ʪ����{_g�o|�ܼ��իo��64"\Z������1#�J�rG#���t~r +%XE�*���?.;1Ӓ}C ��,����\���hnn��+kj!E`ݽ�˫�*�k*a��7`���[�A������vwG�+jDBo7L;{�E��������A����\���!~�)XIJ� wa!�1.�(w�,wȿ�;��`���6����������f�������SQ����e�oݾ ��?��C@XlF������|�K��*���aVCcS��ns8A��lq��e��� +�EYX�}>�s���C�ER����1?a+�6� �+��N�O���x0;XQm��� �R�TEVf�UA<[L�$vjD�͛��> ��ʬ�$���@�$��� +�8i��L'5T�4���t�M�t՝gb�d��w���!?�(%X� +����r��K&JIw�%� +�d���[I�%�TQ��Gܝ'B�CJ~�*�RtP&��柗����@'�R����B��J�FXq�T jZ�4Q��BO�������T�,�������� E�\"� ��Q�r�br{O���I,�̀2��G��0Ɋ��#Q�H"�Ъ�Ҫ@0 +MC�A&�E Wlʖ��<�>�d�09�����������o�553���p4K��uq����&�[ �ࣽ����ص��w�e���~L�x��O� +�ؔzCH;8�ѳn����x�/�U.>������Ȯ<��J���l2�Mer�L>;t�f�¯�)�\��������uO��'?��[o���K/��*ȵ*�V��:w��ٳgIpu��^�r���kW�]}����/����֯����*����*���\7n��+/���/~���|az��"4�a��p����,Jt'#!faӹ�T�R�&�C��ή&��������p�\�چC��F9ދ���.j�*�k�EXWW��X�!�����t{\n!,r�" V�������Q��A�P��l�w�Wh!��<,K��)� +�+,�_���=l�Dl!{��68�g�� V�����tՃ�������ݻC�;��Bx��[}x����8ºSf�"�)Xu5u u ��L64��E����a�s��g�w��BTro�+��7���ơ! ���0��Hp%��_@3A�yLs��Le� � +�J�UP���+�7�#,lE�@�]�70��y���)�_:�g��J0�t�,�:BeD����S����;�Nɏ"�%t�x)y��)��5%��+'���T��<^��*=�2b�"�dK",��+�HBS�!�*��|���e��0!��] +�iʆF,UH%W +���* +��A3�B����M���o�ЉT�X4Sq~�+kFh�I���f�ϓ�Jt�=�e��,�H\OHy�]G��ȳ���a(����$��̊+���8A�A�y�f���l'���? ��8��������;::zzt����㍭�soE��J�f��J�{���O���=^Y]��L��HO�@Ww_�����$���AnABX����V�[��7� �*���E��v���Sؓ)�Ay��W�=���¾Ő\������g�qW�^�����ٳ�/\ ��Ir���g�=s����W�� �|�_�翗_�������*����*����*����7��M6��?���7n\�v��k���/.O ��B��Sݧg�,�B!6",����K��#����l�z]-Ђ����h�,"We�"Ž���"�PkTUW_S���Ehoi�9]N76"�z�8�aG��������=ax{��R������2TXF/B��!�B;��,�W"R�A��-�Q�X�#gO�C$�b�o���q:[[�������Zt�7�X}H��[l�e���$Xh�,+G o�H)XM��$�� ����j���� �b�%X��E(l; ����d�m�`�� ��*D�ׁ��섭d4:�%�J �`�� pC���S�<� �NQW�gES�Ҍ��^���9��RQ���k0o�V'��J�T�iA岡�=��35�d$�����\�4���G�K�<�w +VRR�U����fw!6�K�b��P����N�dp'bJ���vNϚ#Г!ـ�BU��O(��Ѫ�`SB�$3�8���X�`T,�)�J�f(�NaSRF� +W�pp0%Q윖����8��� +�=0�c�0��C�Z����!&e�[�SD�x�[�����@��%!�d��4:�O����1=���Yx���p���|���Ow�--��'&��$[�}��w��;�{��G`<~���m3Q��w��u���i{��x+He�`v�����g�r��� W~rr��#�0�]!ͣ>��T$�_q� `+���29ȼ�� +EP^Mb�Av�l����+�s��KϿ����UfE�9�:���YJ�:���/\�v����~��L-�����G�o����*����*�����P�u�y�`���sa�@��J�a��8�*��l��-LfD�P�����r�x<�����zH�rb#BT[�� ]�l���`�u�a������W[[K[[k������ �W>rB�{go/�+.�R���h�-���w�I��vB��?���`���W�@r��P�b�{��4"��jik�c|={;�55����|�*�n��mT^}���f�_�|� +J���&~U_��m��dw���ٍ,���!��^�;ʞ�AT^ �gp� +R0{$ ����¾j�$@��&AT[q���+��RTU4#� �<���u��Pg��*�:�j�UF`+dV��Y�|����~j�xio�Ϟ�/|���/|J����D*���~n2��S���2��H,�(�>$��?~������1i��P��P�N%L���ߧ��B<�<q�!��@0T������O�R�tt�BH�)¦0�����P"�����M!t�J�+2F�� +�l +0Ը$WQPU��>2q(:.tVRs%dW�q�Y��X�Y兣�� +���*�GceBUl}���b���!@X�_�$Xa3� +�O0������g�Ss+�wv�C����G��k��S� -G���Dajium��������Ӄ#�V���� +���.���A'�!v��"�~���=̹�Er�O�g�:RcSlA�A�v��+� b�U\�As���J���HS����|2�����½�{����|�{Ͽ��Z]�$�Յ&�����ϝ9���/B��o<������/~e�����g�B��*����*���ʪ���؈po���l\�vmxtl��"�+Ta!��6�%����>19���*�L��n+�T\O �x<Ј���hv�75:[[l6����+5ewp�WVVb#�*hD�)XvhDhw5����x�_�۽/I�|��A�Ј��TD����Nk%X��NqX2�UX2k`T����0,��G��nl�B�Hq����OGg����bo�V]_O*�������������9��!SܕF���:vB��4�wg��X�E���9�B�;���40H�B�������6B<r���� �l&(���O0#}��RP���K K�n���6�8a�|��Z:�J��I0��$� �$����X��<�$�GN�J%Ok�WʋNt�;�=_��'5Z��.�S��z��J7�� +(I��J$��)�Չ])-S���R�x .�SES&5���S� U��������0�\)R�RO_H��DƔp�C�"q����)��8�<*f�*�QT�a�PRj�p�>jg6�j\�1+A���`Yw�|�F+��<Ȩ�\��Sj H�!Ê\��a�Yq�U<�f�`����Dhx���oY�^��l.���˫�w����'�����3;���ra���tvb~qyc�!6|rp���� >����Lo�P{��c���"�j���w�E��â��`��Q����I�z�Q� = �-�!̞A6e/��i=�Ŵ�\:��� +�<��Iajfnaq<��/~���/�9s� ���h)�j�s�Μ=��g�̋�/_��W���7�xC\�7�UVYe�UVYe�UVY�?U��?�#6����o�x�~��_e'��s�s��R��楋�I#"�}rzB�#� � �J���E!�v���.W������75���媩�+I���Y��j�VV�C�SmM}�`�VMg��eG V3�����{::ۻ|$�jG���m�i�^B�W���U7�q(��a)B�"��^����x"V����@��X��4"dGŎ��nkr��m6lGXKo����X���P,�B�g诪��!־����6gt�]͎�V�v��3�{�ގ���?aH2�m�[�N������I$�p����뙼�Q����D� �cG�5!tVF6��WZ&+�ع�JJ�p&.�V�e[�M���!�y���*^�\�Ġ�ډ�(c�qO͞*�Kas�zX���⫰IF%�#̀q��2XXp'N�����;���]���d34Id7[�-[�����HV����=o<�XV�M�D +9B��ֽu� +9�@�`0�����z����{�s���{�M���Q���� ��Y��gg�)@O�4��<Oery*5�<��r=�e�T���]��'�T��z���4��Kyjt�e)N*�<�ӛ��D��t�ٔk�"U�5����� �žUINe�C*m`+�B�e�I[�,;�=�p������f���JᅅD�8�W)����\o� +����[l40pV+8�a��I�{��.z����"9.|�����K���ܸu��wnݺw}}sy����d:=���0�9�ʍ�[wn߽���[w��k�Ss�Ѥ����������,w�r+;)��bS��{�Y�g���Jl�=fҴf*nXI�6�4��3�Ig�W���a��P��p��V�LJG��&�Ʀ��Ǫjj?��/���ݻ������R� +1�n���ۿ��c�������/���Vz��ѣG�=z��.�?��?;~��x�cG +5��4=���E<2�5E����D�Cc�c�C�c�����p,���\SW�����J(������2�<}��b���Y�`�+):WZTVVZ!��V��C���)��\-¶������\D�х��I��v�[P����+����P�E�B��A�x�0OD��O�nل�0��7&�_Q�0�0�b�`(�>�֎�ƶ�چ&LaU��gi #p<<�"xE���Y��(V������V�У���ں�@}���� ��U[Gg[���� �خ,�\�V/J[Il+[�;���Z���� �C�+��V +�牭p��h6X��*V�!��ʠ؊��SUV�m@@�������lEQ��x�*�u��d��>U�[y�s2>�>�9���BɔR��G�)ҡ�g�Q0o椟*�}�9����uU{�Od��m>K���E?I��M����:��>�z?��+@�r2y� +���̕��XI}�A�*�3%�]������/\�dz�$*��] �bזC,+n�Y|��A�?��� >a���l +� boQ�f�x 8���k�z�t���r��:X������o +�Kh�������������>Av{c}s�����l��e�����Z]���� +�{��ڼ}����������li����*$�UO_��R��q� O�bA�c'��v�sep����3h��`"qrP^�J�C#ã�c�C#� ������~�s�_zi,�a+v˙���ڽ��o�z�J��/Y��=z��ѣG�=z~W�[���=���������/5���U�4a�bknbv�"�;Y�G@�J�;���@���������������-)9#��h�:--X��"X%���*@�^YSS��7�65�K,"� +a��S���v�cy+�"w�o�+�_ x��P, +_��u�}�x8��$ 8�'r'��W>rx�0n�Ѥ�'��t�P�}J��ZZk��j�HXZQY\VEŐC;sl�g?Fl�1q�3g1�F;ϕ��VV�Z�ں�چ&_� +�<(�U�W��$t�� +���бCbv�8A/o�g�|z�1�R����=ɕа�n�W�5�p�+9���jh��꧞��"`%2Wޮ@�@��ҶT�6'U�_Q�����oI��8��귷%�d�J��z],��+C(l�ʷ��D��V�ea���dnP��r��܋Ty���S�T�盩䱞Ǧ|=A�fZY��~���tWII�k���Ul�X�'�z�I%BS�%����lW(���U�U2E���V��9+^ �TU)�~e���%��2sE",K��,$WP$D��l�&v��DԊ�R���k���UҀ����1��,��#j�R���ZZ�x���֭�wP]us����kӳ��C�6ڱ�FƖ�W!���������ܻ����vehd�7kn�������T�K>�p�+�Z� � ��!v����P�G���� ����+�1Que:�ul�wA՞ɹ�\&������Cap`x4�0L�o������f/X;�� �V����ܵk7��������w�}O�������_�=z��ѣG���݁Va���fjz~Z�<5C)�Y/�5 EB^!d��E"�ɩ�� bM�E� �`յ����K+*j*kj�ϝ��/"���R`����Ⲳs<���ڦ��Ʀ��z�6���!��.����w�vt�p~)���Y�_�����������W4 +{#T!L��WR��+�bgG*���Ş�%�G`4�L��;�'�>��� K++Q��}�g�a_��"�x�C+:[\"�W�����4��?�jimo퀎Ogw/X���*GU�eC,�oCZbv�Rz�Y� +��}@nT +���8!�,ZD�����]�\ yV���e���U.�YI%�6�y�y�EY/�۶�_T�^OPD��$*k{�n_(d숃���}�����'�Ь����s�D �TΟ���E��_l�ʅ���7����P�o�����o���_�������H�+i����)��b�R�~�����Bc.��{|9�4�+��Ë$�'�MX������\�M+Ǥ"�[�ȢwǏ����}4Z&(Z���K�&`�w�b l ﺊ�Hl�D��a:X��I�N�B�P�%z�����=kbڊ=긹ᑉ���KW�ol}���;����+7�����6�l���I~�����w��x���;��ؼ�v����\<i�:���V(f'r�+�Y��[���V���J�a��ۂFܰp�) �f�0�lW���(�����[a�*7D{�7O�e����}�^x�E_�����2A* ��j]�i�9rꭷ��/�����z=z��ѣG�=z~w現�S�N?��ѣ�����<�`a/��k�й�M��}z+��܂5��'���S�tg0X][������^^Y ���������Ӵ���`�):�sG���*ЂU ܦ�6@�k���@�� +"wl��-B���������-�}�"�#y;䯂}P$�u�=�s�����|��A-BXG���a��-����f8�d����G��-� �m������ZbŪ(*-+:Wz��9�%�*)Aa{i�B�ʪ�*�j*����MuM-�o�������ځ����`_W Bg0���+�]�\�����)�i��هF���~n�����='rV��D��K[�>A�L�VX��U��J�[��A���)����K��z��n/OT���<M���(T��JY��a��Z�: +�Q+��[�'5��TГ_��)R���3\�N�������|��>���M�C��J�����K��*���Ð��͏Qy���IgpZ�ZuóT��>��k���x[P8��B@�\���ĸ�J�C�u�@��0�Y���L'�6ȁ�"�Wp˞/?C��"�%�b�ʅ�t/���g��\Q1��*����10��x�+�r[af�c+K�V���������7ַnݾw�ͭ�W��\Z�061�f�t6�?493w�ҕ�[���t��#v�./]�>���~tv���vt{���!H���Br�d�`eG1{( +�/�Db� �� �� �J�)�r,��� ǃ� lD�Upz&;@�j`xdxt���>fCC���}���^��p�/�� W�b��Mv�����8���D��}�k_�/�z��ѣG�=z��k�������nX������R,$WaM�"��yҹOL�LL{",�X��c��S�CÑx�������������������������G�N�� +w:į�b��DAXU�@u}}@��v<�-�"� !��p�[ίdE�7�����L^���P<�",%�e�/� +�rb�3R���-�w�#�jlk47�44V�*jj+���*�J+*ϕW�[^Q�̊]����«�j��UY� X}cm5(A����`�ڡ ��h<O��0��A���I����[���]���ڦ^Y=�B�(s5�(�Ul5�5}i+�������l��� ۹"�R;�� E�(̞�s����O���9Ye7�HU!t�;�2��1*�H�O�"R��>��z��8Uj[���3+�I��g��l_�@*��'TT>EE?�I�J$�Ҫ<��gS<I�!�X������E���ʡo.WZ�(%OIqB�䭂�DɦR�=q�Veo�u�?��;T��-��,�çM*DX���0\x�v\����D�2(cw U�k�$l�$(pe�ʐ���� ��ᓴ�E�hbrvy���k77oݽ}������ol�_�493�?8��Ln`t|r����7�n�{p��cv����7�WG���Dk{�X��*�����b ���"p9�Z�!g��X"K��F4&�V WvҢ�i�V(��� ���h�b�j��0���cI�������o��җ^|�_zi/*��}��� [A0�գǎ���;����+�e]�=z��ѣG��e���[��9v�O�����W3���bgj>O�.RXj�p��#�#���F'&�/,���@�������������������lq�@}�����:�t%gϝ+.++)+�E��5���Ձz��57�!��-���"T-X r��a r�ӇFw���"�n�_!�.!D�0|�*���om�$Ue +���SN�����Lo�A-1�~Ol��O������5��TS�P��� TTC��2��*��b�倭jQ�`_uM}c��� -mM���b�}]�d�s(�� ������E�vE�+�]ɭ��h���J�Vc2yկ\@�jHTe=�Ǭ(mŝZn�� �b+<*�J����������S2WY��\)�m_���YՈe+HJ�������A�m�����+b+���W�S�~�r��g�&<y�,�M�i���S���T��P�&�Z�S��*�²��|6e�lfdP��ɯ����W��*�+~� �� ��G���*!��x!4��R���r��Y�,`Ai�VM��<�"X��"lE�-!��3�s�n �,�JC���rE��9�J��@\��$?�X�p�g0m����Ȟ��;@Rc��'��+766ooݾ�����kWg����.T��G�痖���������������ʅ��I3�t{�[�AoBZ�"� �����Vv�V�f�� 2+8q~h�`S�J��ݲ!'�J[|gD&;O��}�Cg0708<::���Ϳ��_}�;������h�]��JTS��z�Ν���W��;x�P�ɓ�W�_���ѣG�=z����3�O�8|�H�L�-����d��]��}�w gf'Ʌ� �� DX���SC#�D����JD�J��jٛť��`KV?���y�XФ+--.-;W^QZQ1�Z�9���f� 5��/"����b+�",�Wa�vzB@X�s�[�D��(��G�ℰd������"~��fSXP$A����������������5�Y����꺺�@��*kU��ެ������D^�� +_l['|�������p<a�H��Uڥ�Z�lW +��͍�* �����ϋ]��J(�G�i�Q��8��b+��U�hO[���{�.}SY���[���� +������k����j?%s�!����}�mOHyO�S��Qyf*ۏ�$,ʷW�ޝ^�TX�ۆ�|u���;S��~ҝ��9���LL�A*�MWZ��NݯD�X���<�Nn�@�r��a��r���m<ӘT#���F�*$W�M��M@[qӆ��).R�eAsЎ��&��´�*x�5,��0sś�����n�����2`sV�2d� +`+#�Dɕ��[Am���Y����:�[hxlfn��ڕ��[�}��������F&\X��?0<ʞs���[w�>xt�ѓ���nݽ��%�Ә}��P�����T��&���px���P��V�Ğ`��Ȁ���[��'�\%�[� г�M��r�P�v������i����W��I�u��w��~�������_z��_������?P�M=Av[8x��ѣ_��/d����q=z��ѣG�=z�u�7�������;ZP�·���������,?�rG��ȗ�)]Y��OC +k|j"XB���ɔ����ilnn�訨�����mh(��8[RB�����~�� .",//�����V]mCS��������� -X`q��, W�p��"¾>ɯD� +��AR���_�R�",�W���I#j��$���f*����8f��a�b � ����l�6�w�ϼ��������9��̾.����a��7����\Ea��}�=aT�ǐ\V�J��4�]�|=ٮ�38�#�:���j5:!�V>rE�j���U ���<��p�4��D���p�JC0ׯ����Sλ�(���D[��E�u��ϑ�s���T�<��Ke|�K]��Q&�\�B@�'��}n��}>��Si%7����#�TFF�L��R����RUD�T��/m����}@^�a*��6uo!�, ����µ�b�OŻ��U�VYi�& O[�x��{M4����DYI%0a�����Ɏ�ޣ�aM%pE�h/Yʰ'��@�`������3(𫔓���-�V�VQ� +/� ������oN>�6L�f�$#S�s+�ר'x����[w�`pdl2�d�������vy}�=����'=����קf�ٷ8���6A�V�I��'�˱UDn�� ]DH�Η Fb�0&��[��]a[07��aS��La抰�ñ|���4���G��kDOo�lqɏ~����{��]/��Ү�{��j� W{Po>v��;w��������y�������ׯ<��G�=z��ѣG��s���xa�c�±������2Q,�aA"����mEBJa͌OO�:��La��+�L667W��::��J�Jk�*kkKJK?F�;�?>s��*9W�-�R\DX^]M����>���B���G�Z�B���ӎ�vί��[�mP�����s�{O���-B����`�5�H!�1+%|%"XE�����郒cW7��٧���A �����6��㭈�����lC��X���$1v�r&�\\��O�[FƮFx�jdLث[M���҅5��=��Qi�ʰ3�W�� +ڂ����Y�i�`Ɨ�r�~���R�NrӟZt�=�7��UT�0Uѐx�ln���SH=?p���ۖ��)������*��g{Pn�s3��w��)�W���2j�zoʞ��Ha(n�rT�@W���~�@y�\�����N����-�'W�"U�# +}�͘Iy*"��Bb�i�).�J�b��X�S�+f��-�>2x���B� �� �{ʥ�� +@�)�� +��S/%LVPt ����r�I��q��G��O�>*K��ְٻ�������Wollݾu��֭{��7ϯ�ML�d���t6;0415�����}����O>~z��ӛ[���3����� �u;�{�$�&;O[q�Zٹ� +2�Qp[�#q�V����SOP��-7,��!1�Bi�e�6��mV����&�3���ʪ����>���=v�^ܹs��c����jǎ���W��ۿ��CǏ���թS��JA=z��ѣG�=z� �w��]v�����~�(8q�����KWf�)��7�s#�4�)��.w�"���u�`��d��{��j�MM����-�ml*����{E���ӧ?:��+BX���BX^2�j�`�uu����M�u--���U������֮.�"��A�{_g�P`� Xܻx������V�_ �?��@v�,��o���k�+vw�<?�*��%u���O�=H +H,�E�蹎�����!�\��=(i�c�f�_*�9c�-�W���{]���W ��]Ъβ�s����U�!f�����{2vl���0a�OJ+'��D�O�*���Ϭ�#]�+�^954e�.��}Y��B*�O��w���mSW��)�Z�s�Q��~��Le��T��g��,��퓁�T�n=#ʘ~����ru���� +m�.Y��J��\�S^�r*ά�X�=Z���S�Ȉ�f@鋋�iE�Dz����?U7Sqj�<pE�1#�/B4Vp�!<J�.��I��肿i�-��8���`�TYA�\^D��� �dV@��6��N$ŝ�AV�x��0��0p��������KWo��ڼuw�ֽ7o]X�253�?0���56>��|�Vw������?�s�!{Z��Hܰz��\`����A�8��[�[ �e���N%�hL�[��6���[%[E1m��x�@ە�� ƮpabWp������?�����?�jቓ@�v�Ğ _#Hdz��'�Þq���ï�~���'O�.��W+�RP�=z��ѣG�=l��8QPXXx�dkG��ʪ�"�ZX��,7b��OSku�"���E89:1=0<K�--5u�jji.)-����ԗ���)*��"Xį�B(�U);%e���}|����@]M}C-,"���jC«n�v#����� +���>���!,JaEaax;�J�œt�V�d\X�FB�T�U\��d�7������������g��|���#�ؓ9���A�~UO�h�^ag���b� ꪳ�W�j���!����x�K�H��\ ��&vWQZ�Û���*����|2��3J���ʛ��{|�)�9}@ǿ�o�D};�����Ty��,5O���U�5�����������Yy�d�ʣX���)��DU^�ϫ*�t��Q�T$�J��S�5�R� �kw�ΤgY']�C��d0)��߬�H��9���L���I!�B�!�x|SXR,|� �U*.>�-@d�M��5�����mA�T$��{,����;��t�@���ē�$e�8�"���<i6.L����r2��c�3�.^�vccs��死���\�1��284f�sN�}����ڍ��w�=x��ѳ�_�qst|�}��p,����a?4�zB"p�9+Y��5�F+;5�O�[Q=�<W\̞4%�J`�W��,T]��m�L�W ������W����'��߿��{E����wv�����_{���:t�xa�� ����/}I�@�ѣG�=z��ѣ�ͷ��mv��o~�ȱc�O���7��v�*���e���kfa *�P$��a�����Ʀ�F�@� kl��������mlj�+k1���H����h��Gg>>}���"�W��g��٣%e�*��(������� +amS3;��j$V{gKg' A�l��j��U{�E�}���UC �B��P�;���h�ǯ�- �E),���ݹ����b���A,_��z�q�d���>�^�s�'C�����M��f܈$�ϊ��4a��� m퐼�+^�J\���]��\A�j(�a�A����+��k�:��)��\J�Чl���\����RVuUeE0����9�/�R{j���+[AX*�ʻ&�d�A����O�Z��'�'�TWVz�J�-�>Y�$�/Ue8.��%�ʘ��J�⅀T�:mzP��T�QE�.�W|?����Ur! W�c��J�^�Ѯ�\a�o���)�TIB�*�����x]CQ\Ē���̕%��M$K������v�\^$�:��_����W�rHiE +r[œv,�J� !,(Z��Bl����i�ҹ��ɩٕ��W�ݼ�q{���ͭ;�\Z�0:>�v�SN&70<3��v���֝;�=|��;��nݹ7���>x/0�pg����/�b��� +RO�VpB�D_8��.TR��5��ē����sl� +�VȬ|[!Kf;��q� �+��d�W5:�?4\U��w��X���ٻw�����^�>v^i+ +\�y�UX&x�(�co��E���G�=z��ѣG��v��8q���7�z���c��E�Wa���Y�\J���H83/"X�� r�������(E��kk�;;�Z���ʪ����J��>..� +�3��E�g�P��lII.",*+;WQQ^YU���@����NF��ښ�ۛ�:�<H,Hay���M^�˝`���B([���"���\�,��[G�9���Wy.,�%d�����x0������Ĭ��OF��@[0���vEq "W���7_ Z%�@U��8��k����� )ىYq���o� ��� �l�'(�s2m�d�+�R���|Jʷ�Oķ|夁�F���٨�u���U~l�5@�&v���=>Wy�ϗ��{���k>���{���Umy�tţN9+����~�ȷ�y���I�Y�`�!sVD���x�X։e�P�r�%�&+�������f!cUJ��eIle��`a��?��A�����x&11�Vx�v�&]�� +:�Q�����U�U6�) `I.��� ;�d�]��$�6ᛂ�K`��R.4��a��Lntlja�����n��ug����[�.ON�es�);�f&�fW/���������.�칁��^���\��Q�� +��B�x_�z�QdV�c��X��!�U�����(���a&(pe����� +�V&`�40+!�����?�g?������ۿ�8�t[ɒ�$W�bo8x�hAA��9�_���b�����Wd=z��ѣG�=z�l�?�����}�[G���7.^�:��<������Ҝ���n�~E.�9�E����'��L�#X �M������Ҋ�������%%g����_�>�klz[�Kأ�ee%�*����E�5uu5 ���fBXMm�M��j��!,a���U'�������h�Q�X;�-B�<���W^��DXR��_��D�`� ��F,q�P�b��J�=� m��.osvڥ�����v��y�ΐ<���]2+^)%A�8B�.i,b+�LP-��� ���Sj�)ϝ����l�8ݳcIB�~N�j��?�A] Ve�|TZV�=�>oUڗ���P��]�R��%���)!�������D��r2yO3y�ʕ�uo ����kE+Pm*UAۓ�ˠ����y���d70��c��q��\��Raɵ��M�4I�․D� +��O�q�߃�S=��,+ ��W�%���$�§��4JA��W���e:de�xB*G��� ����4 +q��?�t�H��'�eJ����]��v����ͭ;[��o�Z�tufv�p��Nfxd|q��������������>a���Ē]PĨ5C�INo�/� Ca�V�8��H�NUA��TĴ��%�$L�$HQ+�^&�5.^Dɕ �v�v�*h���6�ͲO������ջ�}iZ>�����n�\�ܵ�W������O�<�曥�*�+�_��~9֣G�=z��ѣG���)��[o���ڶra�G�q!��x^,�`Q� gٙ���������������X�0����i��hni9W^V]WW�+.-=��?:s��B��n?�"aQɹ��������� +����!�#X- ��`a����j�_�t��!��D�0v��c +|�<(����W��_IE�(��Z�+Q�������&Q�� .y�t�~^H�d�q��UU;�%������W����W�Y�x����+���z �=r5 �U?ᩔ��'�#�O� +}���u�D��W̯�������)UKe�����T��w��,���%�<��_]�-��Y,Ω,%Ueyu?_��=l�T)�*W���s��]y�mE`%���D%J�TOH #M +����U@��C��d� +P�T�#�R3W1�e�v�$e+����v������,+兲U᷏�X��� +rY 3.8�{!�B7;]���yE�@�W�� He��U,�J�-�D�&ZE�+�(��]ܻ�I�4� &`C_:�?<95���v��͍M� nlݹru}qiudl��{�������������O>yv�ᓭ;��W��������M���6�p=�8��������2mK��rVhh�����`��"+;�:i� +�i7��q�l&7004R���������^�i+� �b�]H�v�`~���'N|��v���֩S�u�����J�=z��ѣG�=���?����G +������]�[�"X�K��3d�Z�.��Y��RX���������䴓��� �������*+j+���Ν;��3�>}@R�Ӕ�*.>[r������������"X5��@}M,"�o~�X��:Z;�d��=�-��B[�z;q�_i����F�?�Y��H�/FB���E�aqx�t�<"��b.Z�j:+��.,�Z1ク�ش�XGʥe|<��P��j��|E�vv����k8�?$���\���r���jŏÃ^9�I�oTsM)�M] _e��&�k��M@�?�G��L�yu�<���V���.� �r-�� +"4��ʋZ��DUR�倞�J�[�\][����yn+�#W�Q�N��}]tUf�5��hIN��^�i��E ;E��|�W�C<�. +�į��"�2W�'�1O[ѿyd�� +�JB�7*�p�U4��, ��/@�\��9UB�����@BR*��U����V��~��ĩ`� ���0�M��fʵ]���\�W +�ͤ}�#c�������X߸��ugc���7WV��'g2�~�r77>5�v����{�!�z��]ܾ�����C#��P[G0H>v��zz�m��xT�����-dW�R0��Av�mE��ع��U��g�7!m�bv:$��1Z�n�l?�8������ï��2�(j%�W��vC��[�ܵk�k�=�λ��]ԣG�=z��ѣG����w?��˯�r��ɣo��nm}���kP~�<�,kV�f�Ʌ5�� ��"���]���3�C�c�d�������������\YYU PU(.-��$W�ΐȽ���s$�*.++��*�������T�5�64�577�ȝ"X����j��l� +vt���F?vP~��!��bWd�B����T!����f�<�%L����;b�Q$uBO���F�u�*Ԣ7i}���&�_��QqOM^�Д� +N58,���������D�j ��p����T^���9�?���\{Uj��3�J���f��J�QRK�䠼�T^1�[��z��L{�@SD�=Iu� +�CP��$�٪��J�*�k����WWW�Z�(�Ww�I����*տ4Y�=���F���Ζ��EB�MU��)V\�Ö�?e`���7�o^$��M�D���AS!W�0\��&y�O��,.u���Ay-���CxG�:R�t�R$�r���q{ (�A`e��%,�P��=��+���� y���GY�M,(�d���f��._��� V��;��7/�]��[������������[�>~��v<zz����77gf#�dk[Gg����� a����P�ӪH.��p,ɭ�LO$�G�L�TVpn+^LN����)peA� +ȕ�� +7': �r�3�ϕ���/���+;v�Al�W�v��.fߵs��C�����~��:�G�=z��ѣG���!������c� +�?��?\^�0��B)�Y�Z�] �幰8��E�;��f'�f&Ђ +�����t6� +W���76v�j��ʪ���e"���iJa�-³%`�bO8W^QVQYV ��@�������-XP!�E�m-��E���6Ha��Vm!�a�[�CdqS�*�� +�+�6�^��¼h �����*����y3K�b$�0�j��|�Ӹ +�*�_q�o(���8�����+�FP�����|a��")���'�y~*�r��=Le���Rc]�Z���t)8K>$�U��S Zey*F)��J�d,o`V�(,�`U��@bV� +�Q�%[ٲ�6�5���ÇD��v�����B��<6�u��*.��D\ [Q�P6�H�簢�Aڸ�V�~)����t������'����'@���) Wb5!V ��B���*G��`o H����ߴ +\!��x�Ł�+��\u����)��O�O$Z��i�>���koll��ܺss����k�+�#���6<��tm}�����<{���GO>a�뛷�;��������� �� +��� �R�`���gEVv�U� �pp�+�&f>vvˣV��[Aώ��}�T�lг�Oٴ�x�hhj�яz��A������'�g��f߽g�.άvB�p�k/�����|eQ)�=z��ѣG�=z���#G��������]�ten �W�,b�#X�� ����.� hN�C�pjbzfxt<n�-��55m-mm��U�R"X�����Gh�:��Av`!��ρȽ�"X��@}M}CmcS������U{{sX�(E������UwoG��W��B�{X�B��ɯ����0���q�@X�NH1�m-����7;�\�j8�S6eyqO&��k��*#ȕ(r�-(t������r>l�Ѥ��]�&+Ux�W��^ٓ�Bx�m*%���f\��L�,�}�+u����\��S�T��?W�WҲ���>Z��)%6 �J��������%������N�J�W���2T^CP�#I���?����D��,5X�Y�R\c%Ӏ^�J",^�㰈��+u�&�]�����=�eY2[#���k�i+����\�!�����b(cg�dASJ&����& ��5�M��@�X�V4n��@���D�&P,��ȯ̔k��� "���M��'���O/.��=��;�7��\����:>1��������[�r�����<}���GO?����ͭ�/]�鋴�utv��Jv� +���� +끄��[��h�d�����ۊ2WQ\)HmA +_��n �=�2W�$�Q+:���w��F���ο���<u�-�r� +ʆ��O{�;٠�ݾ�o��������E���G�=z��ѣG���I�������9��dvaia������2P,�"��:w�_�/Nϱ�03O.w�`!������L:�� +Wj��;���ue������J�q!� y��Z��e%�*�E�5�U��Z�������,X-��d�j�V{7�`ARX!�`�.Bhv��y�+�W[�U��B�`!��0�0�|#��P,�"t�1 +,|�"nW��T�����1y5�F˺�]ϗY�S�J0+z���Z�yI0-��Y_\*�y�ɟ���5�l%����#Z����}4�#��I���P#��@��9������J!QY�=��Py�*�9�*ξ�HU�O�����>��aGX�9�z�IK�e�,�#�%Vr(jq����M�(�'T������dC�����fuo9 - �xŨ�w�@X~feq6��� �Bx�0���8���rKU�$�'(h�-V�Պ�K3Z��v�Ŋ����*�6xO0Kbv��f'I+i�N:7<21��t���7�nn�f��u�[M�����wIg�G�'�_X�غs�����>}�쳇��mݾ{��u�4��Z�;�:����@f���>�PT���� +���0a�(��؝��le��*�mA�O��씶����6Sp,;��F��nn����Ɠ�]�|���x��W���/P���V�*(� �� Q+�?�Ё�O�<��o�{ћ��ѣG�=z����?s����[����7�8r���y�������J�.$:w:Ss��p���ܧ�_ ��%L�� �������UVb��\yyQI��g�>:s�#�D�YjR +����A������U[{���"���_uv�t�E��.��p-X!�_�(%V�6�ի��ԥ���_����R��WD$Ď9�A��|��~�C~���������GQ�Kr���R����ꪾ��Ml�<�}�ye��s�S +��C^r�"/�2����'VF&�Dt*�J��H��[�,�c(���(�>�:���� ����>S]���Dz�VI����ܤ�@�U��t!`��u5��r%�QV���-�1a%t��>+BR)e�� T�]G*I�bæ��čpܠz Od��� xf��n����#��a��_��A2_q�:��Ⱦ�� +�7��)a�a��D*3�N�%&�ohQOЅ�x��v�r2��#�3������y{c�ε��ՋWff��F7�f�F���_��y���GO?}��o?��ν�W���-,;�\Ww_K{�� ��V��`����!<a[�"{�Vv�Lr1;<q������)�����|rC��tv��++����ر����W^�b�<f%��(��o���_|�\����eT�=z��ѣG�=�+�w�=v����_����tbzf��y��Z�7.�)�RX����$D�8�����bof�z�ᚺ��F���UYY��PQ]�"�bH^!��-BZDXRr�����Z��U��5����uu5���MM`�jVsD��Q�����`��Wp�߮�1�E,Ha�p{�_!L�}^�ʒEBe)���C�E ����KdT7s�|)����?��v��#�����d��D�*gg>Iy���� +�J��Sj[\j��@�PY�"T�o��N�*���L�P)�?���%�V���V<�%�B~ex�z:O��9����V���x����Y!�]B�GUS��Jy'���iIG�~�I��&���倨�Rˀ)[�����"=�i����8�"~��Vt˾5� ���p�E�+_��*�d�Gq[Y�*�5��~@H[�� +y��B��� +bK`��� ���ñ]�E�G0m��3861���z����ƭ���o��\[�:;�442��2�-74:3�x����<z���O~��Ϯ�o�/����c������n��ӭгG{#(� +�Qƞ�[*r+{<ɻ�Rr�o�ۊ��I�V�'hZi�V���O��,�6{�¥��W����_��/��⋨aW{����j�\���_}uߡÇO�����Wz��ѣG�=z���_<���z��`����k/_���Kd���܂�w��]�܂�'�g��&+���QUS������VVYQU���/-/?[Rr��ُ�B����g�~L�,�_UVUT�"�*@X�h�j�o�E���-�`[Ww;T�_�����U_�/�q,��cy�������^m�3.���� +%Y"�%�@8q�?�a�X`�&��2�� �_�w�KZ��[)b�~[����/D�dy�x_�OMR�XԶx7Se������<Jy��u~�z�}),/s��Z��$�"c����r�m�@I9ۚ�JԊ�"�S������TW�� �$���"6��uWT]j���=HeK��G��(煯��=Ze:^M��Ж@�W�x��J��`ܰſO+�+K�I؊ʀd����V � C�a��T� +�9����=xM��(�UI�E��H�@��%y� +��"�:��H%A_a�ʈ�J[ѝ`/��O��r�w��?0269��r�����77nݸy����K+�c��Q�����Ϸ��n��ɳ'�>{��o?�t�֝ŕաщ�����v�=!�p����(��XE�`��q�# +�-V��_�)-���=AC��Kz+vMn+v�Jg2��C���TV��������}���^ٱ��V�Y��eOp箝;@ʾ$X������G�������_�h�ѣG�=z��ѣ��z��`��'?[^]������Ě]�kifuX�K���33?%-X��ƧfٯQ=�pm}}]CCGWgM}����#XE���**�5!,b ~U\,��JV-��тhn�aS[[sG(�:��=� �{�?� ,��"!�P$��v�0��i��/�����$܉�7 +�B� �7����"1Q���s1 j䈢����#���Հg �G}>v��\�G�DW���z��[�'}S�m�?U��=!�lJu[����Ol��k��rQ`�@�������t^���J�aya*���<H����W�b�Z�|K`�vʥ��Hd��թ�+'��\�"W��z� U�[�y+�K�¢�� w��J��v5������J]%�Y�Z���TT$��>��70�4�M]�WT�H�KZ�TI�9���9���bE�d"WR���Zȯ�bAQ�B�\U�ge reEE� +�Ҫ(��V>3�bv�V�?�d_2{Ȱm��52>3��z�ҵ�7o�q��������3�����e��3+��7o����'�=����>�-���vutbʴ�=�H{g7� "�B�U�/Œ`,�Q����V��" ^`� �ꔴU + 0+�W(��5X)�k�\��H��������/����8���/���+Eo�{Ϯ=P�}�;v�d�ݿo�~v:LFw9�*�G�=z��ѣG��������~����o-8Vx�D�������"y5��"�E�PF�d +���s���'�g�&��&gF'&�V�������ݶv�WTWV���Ђ��עBxZV���JJ@�UVv��,XU�55Ձ�jXD�������v��.Bnqǃ-��>La�*��B���U/�������z�"��,��U8�K���,X�&�~(�pG)o���_IB�����>�~�+ ~�]�\I`�KI�e����Z���=��SI�r3V^�*�%�Tٗ��s�%�:@���m���� +4y�/�/ί�|��]U�s��_�4Qu%�z�@��'����+��n�ǬD����)v�V%ix��+�N����(O��J�z+�5`��"y�*�RH���M�(��^� +SX�E�ACƮ�犛�Q~eQU0��z�$0��vK�T��x0nq���=nFbF8���b��2i}a�z�X4��6�A�����f?�֮\]'1�����>丹t�dlrqe�V�=~��O��߲��ə�T:�'����:!pE;��zv[�� +��*n����V��)�V^C0n�M� ��J�%���W�C=����q���ۯ������yw���^xv�-$����{�$�k�+��`o�۷o���,(,�ï~U�:?��{��WI=z��ѣG�=z����7�|�����Ç��� ��.akayE",2�C��Z��\�>3�-Br�O�NLό��}rjjf6;0��j��:�:�"�ʚ�Ⲳ���=�;�+�����lqIQE�*ʰEX�VS��"X�m��-����j�� ���nς�#X}�`(���0�WQ�RZ�۱�����J܉�+C���K�Ā{�� +�,¦<e��$x�\{�Jʲ�c+U��I����O�s��Jn�xTZY��'`�~@SaY�!h���+oW��M��u�棔{ ^G���/y���[�!���h�tOһ�;%��[�z�*r�#�JH�)���_��L)�u`V�ڗ�� ���SyV+�$q:��e����X�2`�/����+�Ɗ��WD��� E7Є z@f,��JQ7�}Ȳ���I��-?~�XO�:��Q���z`4f���s4\��@ǀ�{��Cl��n����0������k7�7�7n�Xߺ�vufnqphؙ́�����+��Ao��������g�e�[����/�n�}���H{Wwgw,z��0������Vq�Z��X<K�aCr� ��"F����͞J�U��T�z �ع��tҤ�r���#c���������_z��ïy��Wv�ܹ[���Vv���f�W_��ځ��v���ç����~�m���G�=z��ѣG��i�������Qx��тv���W�.-,���k�CX��"��,vH�����陉�������щ)#e�vtV�ֶ������WUUՁ�9�`�-.���-� +Ϟ-9WtD�|!{/�`���k�т����������U��B����W=����V�U�RXJP*�i� ��Rz�v��Z��������E�<��UK��B�Y�D P�YIxegy���L�j�O:�}�������I+��Q+�W"O�r��\�2�T�� +��5������Q��2DΊ*�r�%�xG��8UF�(�U:Ͼλ��*�, +��lU�.��6��47�sle�D����d3S^�J�ӈ\�n �*�_���2Lɯ�ʊ@�(PP,N�d+��� BR¸� +�> ���(pZ���'G��*�LEdm�=-f`4�[�TJ-R�û@���,A�R���B7��!�d$jP� +cW&�.�z�����u%ὒ�����щ���._�~s}c��ͭKW�/.���M�����ُ��+����`+\=x�t���l�P<a����`oWwѪ�P��� +��#��i+��ű_�A��>vZ}���&AJ�P��U +���,���[�e�����dsk�����|�K�+(ص{ώ;�'���ڽK���v�|e����^;p� ��'��_��'O��_��ѣG�=z����/N�<YPXx�������ȯ �,��>��L-��9paq�5;?9=+#X��z�����]�`]}}yUUM��;w+��>}��;�3g!�,�Wd����E���5�������fR`5��C��CX��� +!y,X����B��s^=�Ld�=�{(���U�{ +[�i��Ε�*���*89����Y��=SF�\�DZ���y\*�*�3�kU�ѺW3����j�J�[��ʕ2U%���Q��tKX���'��n]ӻ�Uʀ�$h�3�hz�*���x�KE?���?��M슏=I%�6@u-���I�:R,;�!�C�f�2+[Zٕ����O����TU�@ W ��@��Kx��J�����`8n�����B<�ڮ�� +����`�=�W"mEb+JX��@x3n���HpV(����_�Q�n"�A�U:��+��L+�?82=����v����������^��r����L&7��3������KW6nݽ��ɓO>{�`�'�>]=2>7��P��/� w���*� +�w[�� +W��8��E��\QI�UA�U�FP�x=�b_o��c�i"W�����G'؛������+G���ځ�� X>v���-��b��+��zu߾��>���Q�V�O�?=z��ѣG�=z��N̟��g��������'�8t�=ؽraMD��e�ߒ�}+����",���&�H8����i�+E�Z�[[;�a!$���u��,X�Oc��4a�ڽ����*������E��@-X܁_�577��6)��{7_A����wR���T~Em��Xl��J�H����T!'ů�"�G� ����Ao{+���2%��9�i��J�~x��2)�;���t��J���?N�2"��Q��� ��WW\U�R4�U�����t�H�Yb-��(P��<���!,_P[�� 仼-�R��k9���?qA�;ĩ5|%��l&S��*�⥿|HŅWBi[)d��z�YI6%�WpmZ��)U��u�`IB�]�kN�D�/����Z^� +�T2*POR�E�J�+��� �a0��?�0ȱU���@��a���z�u�[��q%{8j �´U��Q��Ao����deOA�)n&�v���]Z^�|��ov}c���i�[ �0�v�GƗ�_��q���'���7O?��O>�����Ҋa9��PO_��7LVv�Y�`�`���|�`H�b��JD� ��M\$c�/��+�_�FEX4�� ��4ؓ�*��+:v:���ol��w����#�8�g�^�V{=f%K���$����9p�����:|�������'��S��˟=z��ѣG�=z~��[o/,�E�?��������E��|^�,���� ���[��th!�'78�~44�54t��uue�������㢢�Ξ�� ��"X��J+*���U������ڦ�zXD�������.,�A�sVogU! +�P�����Dy�CX���-%��U�6xEB�B(�W�GY�PBƎa;Ln!�a��P���Z�2v�/�Xȵ��q�'�2��Jm�"��wU����k���m6ue�"�r�G����)/��d�+pS&O���Q� +�d�=�~7��Sj[�v�;��r-�K�|��d��Z��[�N�|�*~����%����Tt�A�+[ Y�"UE}@�V\l��+�me��� ����-z(����[��&�ō��B�d��A� �CI��[��@C`+�s���=a����� ���* T���A�Y��~3B5 ��2,'��� m�؊�{#���_X��v������[��._[�_�ٿ1�}3 �-,_��q�Z�)m��g�<[�|=�?� u�������po(b��aP��E⽑h_�-�`�]�?>=�Z��CP�G|� �3!�?-��=fe���n�?<���v�#W�l��H$��˿�ʼn�'!e��U�B����T���]; p�s���G�+<q���Co�W +�ѣG�=z��ѣG������?���Ǐ;~|���=�������p�X���p���f@�.��ٱ��������U����A�-Xu���E%%���E��E�,l�Ž�Wu5��-��-"�E.w������m�B^$D����zcjs0��մU��sWAV(n��W���@3-T`�$�"~"�C�|?��ʉ���5�s�g��]? �d+Я[�-��T~��_6�*��X����$��p��+'�$�7�ed����Ȩ�Z 4}����J)ު�Jv�h��_KTe��h=�5=o�V��NR��s��-���rR%��@[��x���ɕ%��Boe)ˢ� � +Kn�C�d�� +ؑhb���*� ��m̌p[;�]IrE�+�M$ mѻG�K��{�'�Br��U��!lo9�+T�G��.Pc70��EH!��v��`��>��Ğ`,a�����������W��\_ߺ��u�ꍥ�c�S��c?v�tvbjv�����>z�ɓO?#+����nܺ;2>��w{�{ý}�@0�}��D_XTcPd�c�*ǃ�+�z ���I2}��t��9+�L���F��VpḎ��1p��ҙ��3g�����/�BZ%�V>7;.����=x�P���S�N�ط���ߗ?�O��~�ӣG�=z��ѣG������?g�o}��9���`d|r���"�E_-r~E:,u#!����/��������\��p(ԃ�34ԗVT�44VTU��~\\|���gϞVE�JK��"�ʲJ���-� �5X$�{[��WP!�"�`7寺H䮈�ؑ�vv�m���),ygL eI~GV���?N�^����)�I�ڻ����RY�l�<#��9�r��=�92v���'���z�)��,���ū|<���`�� +��U��*�@<W�Z)w�������>G���qe���Nu�1�WD�_)� +� ��V+Kѭ�`�X(LV�M�R1ӷ7��V�YY�v%oe�ʊ�� +�-y������+���*L=y�u�a�XU��9�b��bI ��*���E��h���-j1��W�p�H���A]�z+I�h{`��LRZ��*��*�\����{f�OڴA�n�>Al���{����K���Xqs�굛�/\�����L˱R�ѱ�յ���>��٧����>��7��}r��å�դi�uyC01�^�1j!�Y�q�!�iHrEd�"z(&�)�fW� ��J���m�8��]�鬓β�t��#�����={����+*�R���v����W^������Z���w�{O�T� A=z��ѣG�=z��+���Bv����/���"��_���K�H�jf@��'�A�>:��I�uv�m������:�r!�������Ⲳs�"�ڪ��T�h�jhmkn� �%�Uw[��Z�<��E.,_����*�eIP�+�H�ҭ�GV�-����>DY���1~�uO=q���] [;u��R��J�/���r����Sy^w�������������t����rE�oW�_��Dg����}re�ʷ0�&�E�u��cV� +_�5V�&;"������Kle�9+�J'D+���{��J[��剭��6� +����\y+j�����(�'���A��(�BnP��A�&<G� nKx�A4bq�ū��`[m��fǐ�'�~u�;�ׁ\E(�2d�*I`C(V���q��Ĵ�a�_2r0� :n�������ŵ���y�����_�s9����ť��?{��o?�����>~�齇�/_��?4������ ��/��M� RZ����$rE��'�mA� ���\� �Ya�*�4���c9\̎k 2W����3��q� +��X"�����+(x�w�ܕG���ٻ�'�U��{_}��ѣ�����=z��ѣG�=z���_�������=~��ȱc���� \���� +�]Z��҅,/��8�E�P�>=393/"X u� ]=�u ���˹���lq��`��YU1�%,��U��"����#~�T���� ,nq�]����"�۞�^Haa�����lϓ_I���p��UB _�2���B�ZR�N6/�CV +\�� ��� ��E�M]�])9+?��K[e��*�:��q*�(PyH������,S1\I���~��J=D��&�0Y��P�$�+�Ty9B`ŕV��V:��.���$��V<_�)�1+p��G���JMXYR�%�$*Y�H��wzi+��U��$��ʛ}f�{�L��XbW �+r�!�J`73E�Hl��� w��n 9��O�ya�'��З�i������q���V�D(B��#��8S�$le��{��+i���8p��������kW��_��q���ڥkK���Sn�߰'�����|�����~�٧����<������b?�؟������Kv.f��zC�R0����U�d�[�R�@b�`��1pe(2v +\�k[Y$��%A�L0�McU�=�>Zqi�7��[/��ҋ/��[T[qx�+�'���Pܱ�݃=����������·�~[���ѣG�=z��ѣ���?q��KS(]@f��� +)�<2���#��֢�E8��.��ɩ� v����J���k�h���,�(������E���o��D���>..�X ��VmCcmSS���a�=���+_�"� "6r�)J��h��F��Y����~c[�d��$:�C�to��9��3 90��Oy���s�=��ʚ���:�gպ]]����{�����m]ݴBh��>P�i�#X�N�qA�+����ގA,�hY"X�g��o���Y��B`,���d���6����"^EmA^$d��\��_�� ��"P���H��x�dj�e�z�%����l+kP�Sr�*˰b����peB�����X�_����c8�*�I��(+�O%'�:��� �B#��_Ei.˃ḹh�YE�x�5p�Fv8*G�ȧ�V���#&��j��cF�u���a�ȶ�`��x<��uh� yS�rSe�)�_�=HJ�_�Uټ��\2?���=h�5A���Ъ�x�xԊ|*xwdX��~������q���Wm+�������Y^��ڹx��+.��}�������l�(����щՍ�W_��+^�y�ƭ��o����_~mym#O�ڜ]=6^�%AY���F<v���${�g)m@6;�`:����8�*.�����+r�R�G�L�'Kx|����?�я�2�r�[�`U��(m�UA�����G�{��'x��)��-%%%%%%%%%%��*��_��� ���'����wf��V#̫%�_� ù/Ckn�RX��������������Ј/�7��6�������njm��G +�^ ,���Uee)"��{S}D�����������%"X�Dqw8{��q@s�XN,����D�� +�2�v?d[�n��[�2�W�܈�%;k�U�2N�,~���栥$h� +�6��Wf8*�P������5U7�Ta]e��N���.Y�J=�� +QO0nY 1�:í%�U����IfRIӁ`@���`�ܼ���� +�� /2���b����(�I��V�]�Z�����@o���Ү����9T`=�8"�� %�|�*LX�#�� ű0|ū��bى=l(�i1#+��V���1�:3�� +`P��2��\y�}�ۋÂ�g�ja0���=A�[1�{0K��GF'�V6�Ο;�¥�ϝ����953?08C#h`xd~i��˯���ի�o\�q���[���˯����342�py;�{mN7���������� ��4F܂�S�Ѱ +SΊ��T�*B�@v)V���U8��V �$�NeR��{�����/���<�ȣ �� �s����#��$���=�w�����}FU�����������~��_XXPX�g�>�˳������.�*Y�E��e�bȝ���R�8kjfrf"X��765A�f����IA�`UT��#X���_!ŝ�y����������B���� ,A�b,;�!��"�����v�?�?���x-�Xx�&��a,��(�4�(?C����D'Gr����[Q ++�Έ�U4�mde�����(�R�/���?i~0g����++�J$���V�m����SY�U�'���%^�l�iUE٪#�U��*�xVz�����XK��g�K'� �a�O%V��w�Ȏ��"� +}-����Caӿ +�%AFhe@_�<��\����WT�x��,��И��`�C�������Vؘ�;���B���^�9+ ��}�ܧ�!v�(hba���´��4�h�0�2C��sK�'x����/���q=3�842��X230<=��s�қo�w���k7o_�y�ʵ����������`8��c��s8=~�+0��sE A�~�jEc��� +��V,m�����x�qM9+Ae�y�*N�8ld[qzpH�;�z^x�����O�9<p%V"p��\����������7�!���'g�?)%%%%%%%%%%��r����Ը��������+�K+k˫kda�D,fa!˸���"t g0�,�2�q10<�ׂ�m��;�-�m�� -H���.)+{�����ܿ:ˇ���K++��T��T�����������Q�;�ڻ�;�E���e�c��(�.�"tC����~B��� O^YW�K�[�+-�K(�WA�Bܼbcsd��J���og�AV!��UF\ӫ�t��MY�#������PV7��cX��+�(?&�j}I��.�R�Θ�'��+�b1J�L�B;�@�ⳀQ �.��lU��TZ��;��-��6�� +jr��bXa���,�*`&V�������A��� \p�cg=Ar��R���A�z�1�Nq���� +����ha�BtM-B�s�!H�@�Y�D[6q:�V,p�f�N�WXX��"���Q!���f��f�`$ +s�#�Ss˫[;�_�|�����s�+#c���@<�N�ML�nl�{�ͷ�|x���[7nv�6Q�g�cɌ��IAZD�����Ɏ +:Ķ�;���4��`I0�K�1�p;c[�' +�M�6�q�nI���jM������D:��g/.)����iV�>��c��k�wϞ��1AB��ލ��nb=���#G���n*�JIIIIIIIIIII)K4D������ ɿB�t�h������5=�8=K,�y��%S�vG]CCwo��ᨪ��ihhhm5.�EXV��4Ax���(X%e�"�{ �����C��-���ro������)X6[�{��#X�B�1nl�0 �t�\�,���fC� +!ϱ���� +n��3SX�:��L��'�@�0,2WfgЌ`��Q�$�*��T�3m Y��@k�0��'���H+��Jy*Ӷ�v�L/+ƺ�,C��m�8Ť�U��� 6�_�P�S�#ұn +��!�#Y�;f�*��q�('�X�*�m���b�@Pz1�J��j���P �[�xzV�(UdXnBV�g%*�hL���·@�T��T�oѴ��V�j��`��י��aū�̰b0+8ƛ�HJwA�Is{1y僌��,��E�������q�&��C�3��[�v�_:w������e��������ƧV�6^~�u��u�֝��~p����/��/�������G`v��ΕF����� �Y� �&F�x���bK��6��"�F�t�0�Ǝ����2�����Q��_V^����w��lNn�#�>��{��}���V� o��]99Ƶ�}��<�g<���sωg�ӧO��%))))))))))))e�G?��q��/�x~~Aa�3_�������:�����Z��W��K�b�\,�ˌ`��׃#c�ߌ@�jm�;�m�0D��Z[�C��l�P ���*�!V1�������"$�����^!D +V����t�9]��"��<ܿ��o�9+�������C��n�\y(c1��� �d���d�*f^d���<��h]�9B�3ȭ����HK�?Ә��yҚ�z�ݴ��N��|� ��I%�9�Jf[�{xU�Sf7����/����\�4�ǎ�j�� ��laE5���1���a%�V�eBש!HQ� d � �]ҊVl鏏�, #Y��~��$�K��+���ƫ�A�xa6����[�c����>� ��ܪ��YyxC�.�0�Ε����# ��� a[�]7^N��N��/�m�l�\<����K+������X<Of�G���.�����]����7o߸u���[����l30<f�q���gs9\>��E�hRЍ{�>�I�>�$���ߗ��2�[�z0J����!�� A�Y^���ȶ"�* '�J�ԄƟ��/���o>|���~]2� +ܪ=OP�x�999������o������<��x*>yJ�ٕ������������y�>z���}ck,��%ad�]b�c�Z�s�pf���Z���#���������w_��^�����kw:k�j��Z �UZQQRVv����4A�8DXRQQQ]SYS[UˆZ�L�����������+�H��#XHq������sa�ogEB���L.��H�As��������2I�9I����R�iB+�=��[-������T�J^�[*٪z�� Z��T�G����b�2(]H�u�1�jV3*(q�d��YE�ZĚ�b�UL���7�Ȱ���@�t �dT+K7��������l+, Ҫ 3�|A3^�C����C`eZX������x��^��X,�E�tɰ��Ae��H��%��R��#Z�¶���V.O��q�p��8B:���s����57��A�xjpxljf~�ϝi�ܥյ�际���86��F��w.\z�w�\�q����ݸu�+W�6��G'�7����.���(�a�f��٧a�Q����gEl+YaCP�|��W�Ex� +�³��xVɴq��'R��������>�����������'O���<��c����o�1Ap�rP��ڿ����y��<�m�Ͻ��s���������������?��q�ܷ��VQ�S�<c�ѹ�����EBqV���"ù����p�@�sSӳ3�C��`��������v�wuVTW5���56�WU����E +��Z������5��r��ih� +VKK���;�::Z:��� +a���� ���v��ſ�끒U�Y,�Ȳ�4��=����փ�A>�����$� + +�*&���������~f��㪲CS���FP���R�O�&�ڂ�>�iL��u�*b��BVۊ�,��2�խ'*B����SY��3a���@��2��h�,y%m�æs��y��1�U�`�� I�c�*`���] +\�eU:�Y�Bt�qя��~�����f��*Ӟ��Y[^�F�����u��؉j�Dt��7�A�V�`$������`,�?0<15�����u~����s�66���/�=��D������������x��+݀�Ս�w?�q��ŗF'��фO:\^���w +{��Rd�x��/�\��B����!�J� R� +�V4&(��0��Ȱ���3�b�tf`�W�z��|�;g�zz���=�xN��,�E��z����{��;���w�б�ǟ����s�V���������������o�SO>��_p<?�����syuRX����F���,�e���Z�EBb���-���ə�D:��p�5�w��:ݮ�������6�`UT�!緟--).+=,lVVU��)XHqoi�VGkWW[F�p���׆wG����p��E�п�����%|%�L/�7 +9���E��4a�� ~��e�W�D�Rf�*�=G�=2(����낸U��JJ�@���� +Kv3!�+��'6��I*BW ϊg���ad^EM��S Q�âV�*HƔ������A��@��Z^E�U$F��� +dӁ1�V`���̪`$�{�<U��T��b/r;���fP[�Tw�n]FZ�HU�-�~`Oi��ý,�tȌ�C��жb�+^�i+����@��VPdQ�������+�ۏΕ��V��W��V��Bh[� ��ށ���������s�]���u~aiml|*��Db�x2=>9������o����E���[w�|�=� $Oz��5����8=>�����C<v�� +�~Du ����;H��0� ��x����+��Ja�*E��xR��GLJG�k�������g9�����U�x++��x̞={��2t�p�ɓ�e�V�ٕ��������������8D��?�����o�����:T7��6�ł�� �Z1Y��]�ö8kfz�E�Z��Y������������������,YX�EH�A:����P!�������f�`A�����l6lڻ��E�*�����L*+�]w�.��,�e%tY(X!�=�B����xP�q@�B��+� ��<(j���+fg��d�x�����d(!�U4��=+A� +��`L +_1�ɧ�k������W�J������5��`�a�D\���b�Tv�h`��2�J* F���W �� +���V�x�0� +d/��@w���.l+f^i,�%�ṲB��m+tit4� R��ዄ�bmA�������Z^ +b��Ar��M"_���i:Ѝ�����2�9�{n��Ҝn�2�̔�+t�`:���ʎq2��`$�H����-��mmm_8w��q���915�� +G��h|`x�x�x���E���[wn{�����\[��I��;��n�qhC�<+�$��rWH#ۊ�+�8�z ���!s�q�Z%iI0�=A�Z�I��ubW����ҙ��щI������N?��#G��?��c�zV¶2ή]`m�?p ���Ç;q�I�pUx��3g��n������������������'O�~��x��%���Z�[���,,��}yp��8G��,,jN��M��O��%R�>"���uy\5�u�u�M���uue�����/b��lII ��ʌ���*�*�����^_��P�����J ���������n�`���{���W �%�4��ث�ǐ���Bn)�%�0��X�J���P�� ���Wt-e�x�yVҶ�HXY�b+^�����ޙ�j����+��M�dG+*%�Tc��z��uq�ij2V��ULXU"I%ū�̤��,�*�hq�X� +�T��dU1�*l^Ε�V_=(��E��bO6�Br�X�0DC�{VV�tJ[� nzY��C����X�k�7�����=0;(e�B�a���B��e��#���t#�����sŮy[0@��@�� "�=L��#��A� .�������==��?8�&C�X�pnq����z����o\�1�;�oz�楗^�0��;��b%A���'�L���<�����z�dK�̶b0v@��re�Ů�s�%M�*�����TƸM�ҩ����x"��bqɗ��C�8x������s��w�>�9r�@����������TRRRRRRRRRRR�����s��'?�ɉ�������y���te��.!�`-�"�g���"��g�E83��8<6��#-���M������������� "Xe�_A����'Y +���������������#X��� -�M�j�!�n"��� ���f�Q�ЉB��E),]��,�U@�j�O^ _!Գ&���cqK.��%���T� +M-�?�W)��Eo�{SVV���K������xv*FE=0�%G��Eݪ(�r�U�\c�ª�J��H6���P�\1~$� (�Nq,�MeWY0DHv����@ ���b%Pl2OR��[�j���J���p���E��V��X�*��\>�M�OE�+��� A��;��]�`U���8z�O�+������+�`x+���t�]?�M��0A�7�C1x�>��=�Tfplbzaqucz��;7��/��O%��P8O�'�g��_|�m��_�y���k7n����s�+Z0js�)��������1���6�>XZ"�*�T�0Q��$�� � bU��U�d� gK���-� �=���q�ǎ��D*�i�T<�� ��ut�|��x��c�xV�s%�V99��v�2�9��w����'N;~���xR-((P�gQRRRRRRRRRRR�WD���O�9��ٳ�.����� YX�:��� +�WKR*��3s�ӳ��T����kh��.W]cCeMMcKKummiEy1zV/�=�b1��J��K��UZYU^U]VU] ��چh��4��ŝ�WD�bw䯸e���>?��D�*@��u�Y1>���A��A����>��nB�%|zJ �BNHF�����8t=%V�!��ڠ9h�o��W*nxV��bFV4�^������UQaRQO0N�@��?����Qم1E��x��y�5m+ �n<�/<+�\�;���� ���V �X2��+W�&؊"X&��� +dv��{t�Y6 ~~0[��+�^,�)��~��y� _�-Bj���^��+����e@౻�¿҄m�Q+8X����'x��gsP�qW"3<:>��=�s��]��:���115��Ж��Ս�W�x��]�y��m( ^�q�����]�O��_{�����]4b������4� ԂĶ"�<+ZԂaA���P4d� ��l@��ǒ��� +y�Q[!��x1�U:��d2���[����_P���]� +�����"�rss������|0��?���|��BO��W�QRRRRRRRRRRR��֟��G'�����ٯ,����or��W��� +�ű�Wп����f���B8=�01=;;�0<F���������W^U���R��XQUURVv#X�_�q��_�TT��UU[[[�`�����"�VWW{wOGw�h"��+�:�>�_9}�[`�*3�EG��t���,��B�V�1�QMZ��教��+1Dh�ܓn���R�k�%���y�=�P�4H}�`,k.0���Y�+�Z��fn������dFɣ�A3�ۂ¡���!H�A�Y�cd�w�"��Si��9CRȊӮDIP�W����ؘ [����r�:�����̐��p��¶�xv��a�J��i:� �9�����i._�ڂX���� �Do9�.�����@��\RC��(j�ќ.�\ �� ɫ��G`���7~6�'�G�O +ʃz8M�OM�Þ������]\]ߚ�]�D��H<��_\���k�~p��V��W>���koNL<�n�W8@�7>_�dwͫ��-�wJ�8Wt��=A� �� �V��[8?���J� ��" ������ɌXĶ`:��$�pg}c���]�r���س�8�%&w?a:W���2^�w��$yZZ,:yR��CIIIIIIIIIII��~��_=~�ԓ����9�������h^mr���p��"!� �� +�#\\�]X��;LN��O�-$3ND��z{nW}cCUm]CKkummyee�!ᰨHXRQQVYU^] ������������`ut`�����[B`9p�']��L~�%e�]�C��������@O������+s���#�:��� +�r����]"\�UJ���f�J�[!�+��)�� +����Ķ����PW�.1������{'�Oe�W,v�+ƶ�!+�tI�+~g�t�p�BQˌ`�t�����o���|������1J!� +���!��V�!Ȫt'�t,�rWӋ�+��$+r��:g[ᖥ_��x'�N� +d�� +ꄱ�R+m�D+и�}@�XQ� +���\���pz�N��{�A��E��=L�bOpaqeccg��ŭ���۳�K�#�D&��������~��}��{�oݹr���g�;=���s�|PD��ƭ ]:vC4#�Nj��4��� +?-!�ZQ� +�Vp q/ \��N�@Z�&��$�� Fb'${"�I�����86�����<��G�ݽ;+s%;WbO0''ݷ���c�d�J- *)))))))))))��w������c�O|�w�5�������զ�r_�,,�"\ZY�[�+s��8=o�a��.,��M�vv645:ܮ�ޞ��斺&�`���S�\,:T!,)//��aeu5B���(�@q�h��������ٻ0�es��ȿrx����5ye1�c�S�������*�:n�:'��R"�%�W�VY��upP2�,5����n�Ĺ���LUYHVhd���X��J3�r%��ϊ�ti4P��|:��ĝ�� +��g�8�=�ۂq-i#�J�م`V>,5��������!+䁛T+��3�J�xVZP�=� ��0+���i= +Y�u���{ +�Vܛ#cW�V9yV.9?�ڢ��b��UX^Xt���tc=��s���"�^LQO� 2Qڊ��ã��6�V;�Kkc�S�����F��6�_띫�o}����7n߽r��[}�b��H����p�<~"�ӭ��ȶ +QC�l���� ���+����C���6#��"��&iO0�� �HΕ�)���V����'R�p4� �?��/�y��S�c�?.㭲�+����՞�{�*(,ϐ9O<��RRRRRRRRRRRRR�?����fg�P녳�� �����-,�H\�(�"XX��EH����f�&g�f���������������447U��6��U�חVTP��,�W�������+�ª���,���6��7�� )X���E"ܑ���w����Z����rf�Xd^A�+����&�1n1��bJ$e3J��?�p��J�+`��ʌc������.H�A �nAZ�X�*$�ᆕ�@R�*(��b+��V`\�}*��P�*���x���ޥc{��.�V�ӌ�M���d��Ѯ|�H3��z g��Hv�f�Y ��l+0(WG��NmA�cUAƹr��� A��"�Y:�eX.cW�t��e����;�)�\Q� +9�N��s� W>�V^|��pO0=�p|�p����z@G㩁����wcs����ō��K��S��'�������嵗^}����@��8�n�~��.���������9.~�� +Ԃ�bl+�Ցg�H����*j��a�+ qŀ��?��$"�U4��V�#I0*;��p���`� �?���]}���w{�q�� W{�!W��f��{<x�ĉg��U��X�WJJJJJJJJJJJJ��d�ɖ_Pp�ر�ɩ��s+̿�pX+l���+a���2 Wf��[��]�4�<^Z��2�8m��lh�VwooeuuCsK}SsEu5E����9D�UeYU��T�����[����������Vo/�m6�_���v������ +�����+�XAj%��EX03�WA ��`�,[��<������ao�ˉ�OŬ*�^g0+3|ųU�1¿ +a���@�1��:�`�@q8�J>�]�$vv�xV̹�R�*��CV|.0lV�t`Ăa�gY�Jr��]������+��h!��$(�E��� �L$��%A�#嬄I�&l�OtՊyY�bY,HOQ� +�T^�ODO�Xn�Y��`+HX���V>��T+Yte����W���7�V�'��P$�����YX\]���ڹ��u��u��Y�?��d�pzv��ŗ�y��[wn߽��G7n�}��+�_y��}�ƒ�vgO�?<?C���ʏ8z���`įC�����p���PTAOPђ`����NÂ,d�'�@�ZXP��`��V������oik��O�ǡÇ�'��w��D���{���Aۊ��>��3����S� +JJJJJJJJJJJJ�����7��SO=u�4P��N�z�ų;.�llA��aAK����K�,,rg,`�/L����/��nO}SSGw���ijm���mjk���/���A��:�8w�VV�VU��U��������������n\!$~;U�A`Qs���NK�0@-��n��X���W�a$f�H(��(>d0۹��t�f�VI١�"��lvΪb��2`�,r�UBJ��Y�*Nb���=@2�d�zL��"Zފ;TR��4���e�Xr;� +���@Q�xG��������.�sů�JD�� y�fΊ~0(�Ӑ�@���Wҋ���P�������c���_!� +!�H�V~1 ��Ε�gwzɰ�N0����W���mE��`(�H���M�bOps�����յ͙�š��d��x��ə������oݺ{��������ʵ/�����f�Ш����s��ƅ�#����N%��� �=@�+���N�����X�V@�"�*���d^��^ıO�e۪p�xn�izkG�����_y���?�+����¶ʅE�'rsw�����xݞ=������χ�O�V�SPRRRRRRRRRRR���/|�EE�����|�xdc#X���8w��*c�kn�X��"\��[���3^��Fc== MM����W][[��T��TUS��22��EHD���(���u�Dqokl'�{W[WWg_ ������{|�e��ZV"��+An�9����-�+ٿ�)�J��Ck��\��8��%|VRV�m\, ~Ɖ��+���J�n��XU����lai<vE�&;�^E�� �����UT�]�� 㱳�7o�T��tu� �~>XU��b�+l��Q�y�"g���*\�n�����<XŠ��g��E,��6u1H��#�Xs�wӫ;]�v)a���� <��Ɍry mE��P1��kw��8�8,�r;@����i�@������x"=42>=�@=���k��s�+����ƒ�F�&�_�W^{�oܼs����o�����;��������Ĕ���9��n��Þ����1|i+��Ӏ V1�Œ�T�*Ü�� �i+��ȳ�O'C�U"�1Nf`ppx�xUK[���ï������#G>����� p���+:��n=�g��G�=-�����()))))))))))�[��~�3���_���S�N���m�����g}se}kE�9ԝpX˫�++�徼<���,w�aM��O����/��]^oSsKgw��wpSKsUmmCssM]]��`���-�[j�����Z��5����X���������̆�;zzL�����/�_1{*`f��m�3],���AL^a��y&����RB�����`U�����k�g� +ɵA3sŗY�*�{�W7�T�#�[��O4o%��c�V ZX��C%��b=P��8ٿ�YcWr�%�d�J���H�@�� +�)|�v)s%�V�P�8��Ů�-HG�|����(�4'ٌ���9�ʼ&� +�,�Z��s�b�U�_+ W��Ei%���m+��A'V�b9]�r����[�����['� +�O�S�c@���ׯ�P$�����Y\^[����:OT��ət�P4��'SC#c�k/]~��}�ν���������y��ֹS3s�D����ڜ.�ߋ�e��!H�+?31vŻ��P8��g��@�n�[%.pI�����` +��$Ůl�����+�������<04��k��g��?=y��#��r1Je��vs������{��;���_P`�m�~�����������ҿ�y�邢��Ç�����6�] ky����),^$D��+�#\�"!�������t0���iln�;�����VEuuYEEqi�gϾX��+��-R�`U��V!Ž(X�jnoo��l�� +a�W�6;�W6k�aG{صfu����x������`$���daV*��Wi�Y=��b8������u%�WI +\�,IM�K[1��L^��lgE���`V��O[�̴��n�x��VVoJ.�� C�C\M��M*��mb�vt�-��u���%j�> ���O% +��(�V�$�T�{�{p¿b}@ڠ�;�Q�}@V�@P���i+8�ͮ�C�2�n��Q+^tz��Sц���!��VHJ��ud�G)�� �C�x*=8:>=7������u~c��{:53�?0�'����[<w������;�>�{���?��ƭ�^6�Lo���-u�p�Q�� ��=A�/ �m�I�Qƶ +G�!#z<��l���Q��I��R�D:J`�d*.J��_�3�t����Ĵ7���W���������}�>��#9�0(�V����V��(���}�8z���yF<��'|%%%%%%%%%%%�w����{�����E�:r�Xye�������Սmba�����azY��Z�-��E]Br����Rf"X ��]�.�`5��������,�|�S�p�(X匂UW]��&j�������D�l�^'��<Y��_�_�$�B�L����U�/�����g��9;(�W�Y%EQp��J��V읢sE~�0�X�*k@0j�ZEū�+�L'v�إ8�%[���+fL=�b��� H��߄�s�����2؊�i^��x���$+Z�,�@^4'�`�@Zi��.���b�f^?!^��� +�V~�Si�g�C�M-v9+0���$��q�^���p�]^�[��@]�<~>�0� �@0�t�N?�����)������:���IT�(�����ə�������k7oݽw��Gw?�����������R�HE.���$"zV?��D��qk2؍o._�H�[�y��!�x�p<A�ah���pL0���mm+�6m|�S���M-�?��?��~�ĉG}��]�����tA$v��rrs n�l��yyE� ���"����������������]O>�Q�����6wDk�/n0(XX��,��j��1��,�`��ybz&��ww767;\Ξ�ު�������Ɗ�j��w<ťe%e���������3��ڛ�;Z:;[��:��Bh� B���q<���M�+jJ�w���a�I���;?srb2���L�{(! JEB^L��/&�Ƞ�_���a�������/�E(���J �wQ7����5���˶�,i���(�����e<vFY�n�튿�sVĶ�aVtK��73W�\�,v��� ���@1# ; tq�:��e�8�=@e@�[��m�q�J�XN�2;Q���i+r������G A1|�!W.������K��a �A�j`hdbr���[����<x����щD2��c��������+������7��ô��w�}���k�[ã�p���K=A���SI<vVX�ב�zV�c?-%��ꁸ'�1A�&�[h�I҉R�W1j A"\%Ӑ���v{�?������ݢ�'w�����C�j�^lũ�̹��م�־��<x����ǎ?���♭�P�VJJJJJJJJJJJJ����g��((8x�P]c���y�_!YXx��,>JH,�E�E����Z���b�а��mjmig����:�`5�UT�������,���A���Q��Ά1�� whv��v��z�N�_����?`aiV��ߙMq�-+�,�˃t J$���b���RrOP�dr;&���,/�`aݪ����7>��F�>���b 1���Ǐ ��XUܛb6��Y��E]�T>� #��>&l~̈́UH�DC���� ��GiV��5� ��`�� ������4�_���!+°C[�)�i��-�@b[y���^㷃���V.�r�n���wP7�p��@��Zٜ�؍{\���2ވ���Qј`��X?��P$����O/,���k���Kk�ө����E�ãƯ��W^{�ʇ�o����7o߽��+C#�z(�ӂd�aQC�*�z����|_Ȱ�%A ��:[��� �V�x��х���ɭJ�` +OO��V̶Jg���pxlbʸ�ų����*:yr�����nF���#�����Ut ���:t��iuBQٕ���������������SO9z��o;3����U��6�}��W��Z�.�ܗ��1�5 w`�O�.��/NNφc�N�`�]Ξ��ʚ���:1DH�<�e\�`����������ڪں���`�4���vB��(X]6{����� +�W�m�|8���2cW�&�"ϣ�d�� ��d����DV�Jky�+ ۞0��T�1;K^EX ���b�)X�VM{ +f�x�J���� KX�`+��B<]f6�9Ue��e�z��)�`���X�Yr����C>�'��Z ;ѫ,T����8�Jt�-�ɼb�+� t�E�?B�?$��Yy���ޔ��*��U~���Tv Y��nZXހ�ɪr�=�+e�l��>�ێ�f��mx+�H�b���w�A-I�2#c�3sK�+��;k�����|:31~$��Tf��u�p��wr����w�su���o����k������o��<v����G�h��#� +��[E �ƫ��p4Q+@��g����bHv�b A���������Ș�y�w��������C����c�����Un�\�?p �С�yy�N�x�ٯ�OejRPIIIIIIIIIII�?�����¢���}45��mn�� )��M�HHBb�EB��B���, kafnavi)34��x���::\wcKSu}]CkkM]=P�i���W�r/++.-�!B�`����������`u�tv�e�q8�\.���^������&篨<Hw�����a��.��aE)����2_e���lXP:��┭�Q8>(��1+ҊY�P �rK*Ν+� H�+�W�gGa*, r�z���+�h��*�l=0�I_I�*Yy�y�V�U`U�1�*1`�+o@�V����`v0@�u�N��x���_�I�Y,���a�oy� +�bT~��FV��\8<ĶB� +XX�H�=A�`�g =A�7��B�Xrphtjfnqyum}{}sgemsfvqph,Kj�p,����:w�ͷ���ƭ[w�߽�l���o�nlŒ�#';�Y� "� +@���*��ȹ +� +x�����ـ �h"b�H�`,��*����$0v6#�fl�4����O`b�x#��?+,,���۷��M�x+k�*��rr���w����G��:TPh!\Z_TRRRRRRRRRRRR�����'� +�?�����������h^�np#�X&�}\,�C�K+�˸E��4��əY��"t�zm���چ斆�� +�`����P\lZX�",�aY%T+�BX_S�����V�6wvvtuw��z 岹�v� ������v����A�|��D����0�t>(!�S��2��3d�^%�6�Q�2Y��s�x���V��E�U�qי�.VHb�[�+3X�o#�kE1�W� �Pѯ� ��B¿2��~�� +��%6����x��W�v��0��7� +�� ��4�\�=̉��m��[d�*�l(�"���bQ.l�s�e�+'��-��q7��Tf=+0���.�"�q����T,�zѶA-�����'�ߞ����u��nmknaetl2����p4>4:������o_�v��{w�$x��G7n߽��kC#��r��m��/��8�ǯ�u��#���C�V�0�����Ķ��oŗ�k�] �P٣�x*����q <v �g�j���d*�����xiY��M��'��E�rs����ڼ�CǏ�8j�رS�O�g��'N��n%%%%%%%%%%%�����tQPP�_X�g�ޖ�����U�`���&� +�X�0G�XX�|�@X�s�[\6������V��G=>Skk{W���nnm���khi������.��,.-}��Y�EX\\�+����H�bw�`57�������х������կ��,��iiV��,������˃�(�` ����J���ʊ`IfK^�������2�.� ���h1*���b�( �y�J�X7P�VQ��7�R�J��i1�BkG��_�п"���)���+^d��ف�$��:a�%���\��H3G�'0�f[�g��+��sIE�u��YL���45 +���U�2����@&�X���g�C�+�Ī �V��e���ˢA}l+��CO�tlrv���X��Y]�Z\Z���Mg�h(���V.��������h[ݿy��[�o������s�H[���!B����%��ZX~�T+�[ў`$ +�Y�*�f�mM�t �W�H" �U�)j�L�cԪ�N� 3044:�kw����g�^[1� +/��+�[A�j�.�z����-,*zb����¿�뿦g����?���[IIIIIIIIIII�MgϞ5nO?�䉂�����~�k������d��A�ב�N)�U�H��<�� ����߿�==M�-v���n����oi�oh���)��()+{�W`^�����U�qJ++K��`��G�ꛚ���ڱB������i��8�6���������ɒ������ �*,�K2�=(�C��+�J����A"�#���j��@DZE�z ���@ +Y1�U\�YIl��X�"bj?;�� +ȕxы�u��V`X���V>�"��Ǐ��]ypC�HV|a�� +��`@���m�3W�4r���Q��kY��o��@C�������� d����E�����y��@��n���B��!�mVNO��E�+�\�yE�8H�nҰG��߃�h{��K��+k[k�ۋ+k�3�C#�xRFb�������y�ʍ[w�����W>��}�b4�6ޑ��h|�TK��@㞀�[HXa�����A;w��ܰB0;�ƒ�\��x��hc�$ȢV1�[�3�E�bW�L��S��Tf��W�z��S�O?�K�°��DvU0��w!�=�Сcǎ��3=A�xv%%%%%%%%%%%%��f�<u�s8ݕ_Ph����ٵ���&"X�[b�p����b�púE��s�p13�43�8��<4:�����;��=>oskkU]]Sk[u}}yeeIY9�ϖ�� +a�I��& +Vu]=V[[[��j�� ¾�C���W� +a�E� �&��D`q�9�Wf�J��IAl +��A�U��� �*I�V0��"Xq��8k=.��Z�4�D�J<=���N�u�p�V���*fL z��D����> ����p���/R7��6��yL'ϊ�]b=�@U�·��� I� p� ++$��Uv��=JU!��gÐUP~��|,|�dTv����!����C�+����O'(:���{�~���'81������e���͙���щx2 +Ǣ��������o�w�֝��?���'4&x�ڍW^{ktb�xk=Ƈ� ��Ue[��jŐV�ҋX�J��BZ�(P٣ j"�����gEÂ�4���N=�Tz ��O���;�7����s����}�VY�U�nP. +Vw�>��w��q�!x��q�䬤�������������S�N��?QP��g����[��,w)�Ō, +bA�j )X�p�����)�����q;53g��������t��v�`�U]SSVYYRZ�bq1���KJKJK�EX�V�`�U�7�56�7Ž���}�pw�\�?�p�ȿzX��lJ����#��v��g����'����u�Π�/��,,��&#&���_�=e!YA��mZ8W���@���Xm���Q+ 2�XAi=�D�c[0d�D� +�J�b ���x+�$+��Vhdi��^�� W�VQ��DN;5��p�Șb�+�_��h �Tx��ο����� +p�����,��+�V��mw`���c�v�s�~zV��Q��c=A��{�ã�3s�K+�k�+k�s+㓳���f�����K��_y���w�t��O�}������^������\z8��c7>B�����mA2�ZX@�� �4��z_�jh���l�P,�3��jE�����`8W��JAU0�Q��t�`"�o�C�������T�rs�؛�Y�a��*������>r䴵���JJJJJJJJJJJJJ�F�EE����_��-���[`a�ل[bm������}i],ag�+�`�.,�/���{|�Ɩ���N�����RS����������Ⲳ!yU&�K� �URQ� R���掎����n���������gbW�_=���%��e巛B���&tɌʂ�g�۹E��I�o�y%#ٵh�E��E����`��'��^%�Y����JD��T�Y&���\�Ε`X!��%�(je�5�$H9+��_�L��Sa�,➠`���UE/b��4��ahL��g� +x��ס����!��O�+�� A�����,v�xѡB� +sV�6W���<+;ୈ�N���#�������1^�%Ҹ'8������������:15�?8��B�X"�?93w�����|x���{}z��O����ڍ[o����΅Dz�x��v� bn��صCx�u���T��b���Q ��g%A�Y!�*�=A�_Ƴ�0|%�V \dl�T:l���P(s��/�-���<k<{<�裻�xb��1A�4��0���=��� +����7-t)|������������������y��K_�����f��-��e-B,2��qK���m.,3 +���������|,����mhnv�]6����Ƹnhi���.��(�� VK�b��������8e@q����5NmF�����;ڻȿ��b�N���W��@�PT-�G�6�����ha!��Wpkv9+,�,~gP���da��ܿb�.��#Y��;5٭�\��fȣ�!)X�|-,��r">kU�����Â���u���ة*�����VA�0�^�Aٿ����YX�J�<v��zY�ʉs{�_9�����+\��S2�Y~��K$+;+�mEӁ̼B����ks +���ت��z�^Li��q3� ��P8�`Op~queusl���م���x" �}�������Λ�w���{r���������}p��Kc�^��m�K�h�[�A0;� +� +|3l�%�P��+���s�,y��$��VE☹�*O�i0��p��d���V��Ã�c�h�����7������O<a<o<�+�L[��8W��� +��w�۷��ѣO}��m��e%%%%%%%%%%%%%��\�'O������sk[���ٖ���HHB��Z����Ś� +*��+�#c^��������V��4����חWU�����UZ\��Y^!4�/�����������1�UcsS[[[ ���r����t�����X�f^��&��,aQ,��E�� +���^�8 �aۍ[�oyaP���gG�����,�Fn�9Wa�$��N�K +��2=+>����IHv١ZP2�X�l<�҈s>��Ǯ8�Jws;�T�o��0��Μ+fR᭹'� { +��N~�N� +T��rShCх�ɝ+V�g��������K�At�hR������R^�s�m��k�p,�����������"�V��#�T&KD��� ���7v�ֽ����ӏ>�ǻ�?~����_�]X�&R}0ʨ�`� +=+�3�0 ����+ R� +�A��`0¨�HbO�me\`Ί�V��� !��)�X�������������\]Cӟ��S� W{d�U֞ �� Ҿg�ރyy�EE���/}i����)WIIIIIIIIIIII�Ieee������S��\X^]�����Yۖ����Z��Z��� +#X�f�pemai�"X`a�/�/�L�-D�����&���p9+k�뛚[!�%*�T,.-3G`A���)�u� �uƿjkk��V�M䯰BhR�?#m�k�Yf�����;��$�W���(X�Q��k� ��E�v�\�=*�a^E��*ٿ�L{�8W~����-n�/h���I� +9�v� +�b�0vM�Y�� ����� 5��<g��-%A�"�����U&��]hdX!���z��\Q�ʉ&���<d�p{ɭ�a�ʎ��r�ۊ��}�\�Lۊ�,|��� A��+Hj������4=I$2�ãӳ�Kk�+����K#c�����V�d�����ʥ�^}����}�ѧ����t��O�ݸeܹ���6�E��e|.XѪ ��� +0>E�PXC�RӉ�s����`$�%Ch^��`<I�+����*-J�,m�;� �������76���~��o|���?j<K���fV�s��V�o����cǾ����&�v����������������$����ԩ���+�v.^Z������}e[����0 �E�s�`a�,,���ظ�~cssGg�O���UTW5�����WP�������S��8�����UU4DXS�P�����j������;"�˚��eu ��X��Wt��G��c���� +��N�#X�6�k�l^��X#�3�*���u�_��� ��\dq,�$�F�>fa�,<� �#:#\Y�V���d�+�� +؊�ֈj�>�[�͆ ZU�Y!��{�ƮQ� +�*�V��F����YA� +�VTd�v<�baI���A��Vv���rVN�����r��Ma}�HS0&HTv� &G&����U��V7���&����Q�L�2�+�]���{ܼ}�V���ǟ�ӝ{�_{������ -���e��m��V��� � �l+V�(^%A<�D +3WI[E�(����I���2t�Uf���F�'3Cm]�����w�w���Gy����M�j7�rw砈�e(��!9p���������������/�/?�,E��N��]X���a֖y�"!���7�B,8+�X!\���ʬ���2�6[CS���ry�U�յ ����U�ե�����g�K�VD���J�`U��Ž�������}�_9M�*{E���yY1���%�)��\ ��N|u�����ն2_����hB��+�Mq�&��ܡ�Π?,��Da0J�+3m��1A5�����_�ȰB?����E{�Ҙ ��<ZE�@ƶ��=��0vef�\��� ���n����ў�RX�UE%A�49�n�ba�v*Ҍ��+������c���>�Y��-\Ëda9��r"u +�Vh�4����'��0�Fǧf斖����թ�����(���Ə�������7�~����w?��O0p��?�������щ�h"���m�ۧ�%�`�]���w���VTD0{�ꁡh�BV��c\�clI��4�1ge�#${"��Cટ���@�pdlblb������������3gv��>��\G� +�iL��Vh[�m�m�}�<x����}���)���O�<��Z���������������t<?�sHT>���رx���_&� +������s�kP$\X�Tg�vayed|��a�/�o��(��jhm�mh���.)�(.)�YaaUTP�(�����-M���p��{.�����8�J�����7���@�#�����2���B�vS����� +!/ �9¬��*����4�+������@V���\qÊ^Թ[ +��u��/]r����H�X�I>�N�+7�YY�V����hX<c��vM��hXW>��N�|S�?���Slz���7�`���'�:����/���&�V6����瀄c[9Y����r�^���!�_�S�C� F����������ե��ťթ�����h<G��������֫��y���;�>"��8�o�*���|Z�Å~�?��¾�p�(g��!� iEK�ƋA��#X��C�[�0��sV)�È%�ȫ��$�0��W���2¶Je�G'�f�tiY����w~'//�Gمa*f�Ε89�����={��3����'����G��'U%%%%%%%%%%%%�qUTT���ַ� + +��N�:=;���s�̫���.!bm,��/�0�;��p�p�"X�L������p�\^OUmMMCCcK[UmmiyEiy�Y2�$�W����@q� +a]}]SSS{{K'G�;�6�2�����G����'�,,$/$�J�+�a���`ʼnd��m&EO��\��A�+.Ƿ$���V1XE�*���ȯ��V�C8W��YA� +'y +��WdR1$��Y���WfU�##�ܹ2.|XD�yS�㣁,y�%A��1�hLм�b �|�ʎF���z�CV�;��i7���*�r����U�cn����=����n�f�#�S�h<584653?��������:3�8<:�Hf��h85~�/����W>�u���O>����;�?~��������̀)� ߞ�V`a!�]F� Vӳ2�Vtx+�Yű$�U�!�� +�WcO�[�Q+㖢V �\A�j`pxlbz|r�����g�~�kǏ���ߵ:�{�R=��wKT���]�v�ط���y���?v���O��U�� *))))))))))))�+��3g��x~��������]~�5�_q� �RK�.�p�jiyv#X+��҃M��m>-���UVY���R��XQUU�C�/ +�K��K++K�*+�ª���7����������e��86�����*��bIi+��_�-tw�E�-��[�6�!�T�c�uӞ/&�3( +�h^Iɫ�)vřW�XEÂY��PP��aAB] h��;Z>���+3j%%�|�!h�Y�E[I�hXin��gH+�k$��b�+�Jq$���Wb7�M�l+VD��kL[��:��p�ؕ�Ηm./D�(mew��`+l:zz�}��^����e���[�!`�� +��~������`xlrfv~yiymie}n~ilb:��cA��������^z��+7o߽�ѧ�'���חVG�,�x�P�E� + +��E��̹�JC�U�Q�b:F�B�8[��� F)B�ǒ�Jq�U&�H'�����Tf AQ����H�2>��9�������W������={�=�k�M�n<�ʞ��kWNN�n* <�w�ȑӧM��J[)))))))))))))�����?�/(�/,<u��������� �b1ܮP�8���1��_����������b"��s8�q����Vc%��������������_�- ���!�UYYQSSYS[�������������g�q8mn�� �N�)�~Ak��,�øx�Kh��D�Js���7�b���+A�ⳃ�F���l^1�U ���0e�+�����fVA3s�bW�/{��$�u���$���3�D��$Y�ھN��kˮݽ^�k�r "N� �s�9�������3H�9�AD�����=�����PU{�k�:O�:�=�=Ux�y~���H찠�g lŮ����]����$�U��'�E=A)jE�/�D�d[�W!��n.�0gV�V0C0����L*t��ܤ��W�e��py���ܶ�B�cW81��Ul7Y`[��+�\�]Vp�<N����t�0�My�!_�Ş`&[����MLN�mufbjpx�P���P$�He��Fٗ�7�����7oE#?����KW��@RU@��}�0�٩$H+�Q�<j��+� �� s���п�v�$M�H�d:����V� ��`�& BI<�b�V�\�����B�����;��{{��m߾~=� +D�j�y�A&\����Z&�e�Ν;���Q����{�-[����BBBBBBBBBBBBB��u��'پo��������������K��/.�/��],�s�;F�x�pv��,�Xӳ��3�5�����3}�áhL���F(h�Z��ۻ՚�e[GG"<S�u������Rܛ��ަP(�{z�j��0��isyln@�;d +�j��W|_5�ja��e��)� �N�@2�j{��� +��\՜��D͞����.9T�ʀ�jOP[ђ��R�W�����Uȕ�0[�*v%{V�(�մ�t�H+)^��V�jO��5hO��إ�/ �TG�S� +�V~�.��|����<��9=V:إ���+v6[!p��Sv��`v_� +"<pETv�[�±d:W*� ���9{n�������ؙro"� E��x���?=����'���w���u���_}㭁��`8N�@������12����4C�J�Il&� � +F�p����V��^V"���$���T&%�<�$H�A�3�B.O{)��B�P*W�Fnϟ��Q�аu�6�n���WWk�y�֭;������(�_K!!!!!!!!!!!!�[>|�a�����C����.�_����r�pv�-��B +�_A�pnZ�r�>;9������ ��k��ݥT:�.���i��������6^!lj:u� SXP!d��B>���=�F#"�ȿ�B�T!\����+Nw_maEd�W�5�#�*)�Wi,(�k�t��� +>�j��|�����Ѣ���f�%A�`�b�t�De��V5��7��V� ���`��9���!9jU���3��U��{J`vo���`Mmv�7ञ �>��1V2���hd�݃v����v"\�U�~�Xdg�N +:�\DT��w������D����V���|��?82~l��I� � es��M�la����^z���vS. ����]��]H���-���`��c��V<s���V ��"{��J�$�X2K�����lRA70�Φ��!�0a�VU�DHv�s�B���0������ȓO"�j�CQ���V�ڰa��uk֮ewޱc�]�v���9����a��/�������������п��������ih�������������KEB��HEBa�B�<�"�87=95sv@�lML�� 1��`�h67�����������ts3UO��S2����C���٭TK�,.�۩<�>�0��\���u���q��UH�t��W�K��������� `;]��*��jhW1��}�0� �6����dXUV~��"U�Uys�;WX��-�b0"W}R� +/�<�^���k`V�S���"{���' ����Va�D��Ҋz�v�-H�@`��`� � +��۸[��i����R�dwA�� kz��y���&�y� �=;151�>��C#�B9�H�}px��ŕ7�}��Oo|�P�o���O?�|��Ro?9c����D�H�b�Ђ�`5mp���@��Vi��b��ȧJ�3 ɼ�P�3��ɹ*`I��͕x��Pb����W��u�?��?Z�f ��ѹ��L���'�m+v���[w��E��BV¹�w����5���֞����~��o���e���`ͮ*.��skFJa!�}����͜97u"X�_�O�c��v���J���������[�f{3��ZX'O�>��@�jmnkk��hW(:{�n4���nu:�.��:k"Xr��s���ê%�ȹ��Hs�J��"�F� Ay�`$��Bg�Վg�|��+�xKQ� ƿ>@���B��U`@I.�Lb��e<7��,JR��\�d%Q٫�!vUe�����P� +HV��^"���.:�|t���Eh�in V��rpĺ�(i��[v��`X9L��j�SX��r���i��.�{G���]� ñT&W��?3qnbr������Ro_z��h,Y*���/���[���_ܾ ��]v���_��3��@���-��|��_��QFH+��#h[���GrO�0���N�+"\A� +���4R��l+L[oU��U�z�9d�gѹ*���k�/����l���c��zV���Um� +z��@�6m�no��@�V ����#�>�Ğ��}�����K/�C�����.!���]X�ZXsܿ���A�; ���������^����A�����,��������Ts7���b;�ܡE��ޡPtuw��j�Qo��$��M!��|{%u W�W�*�=T�w�+u�>JC�k�&(O%ūx�*\ _�"�T(���Z��}x�`�l�8��U%��8C^�]��H`+��VU�a�R���y����I�`�<A��B�bI�A�G$���s�I�\,2�xC����$v?ƫ�V ;�s����@���.����&��0�dX��Fxv���y���N���C^z%�?L=A�'��z�X�8;9}fbjt�lo�`*�G����NL]}��?��Vw�~A�է7�y�����L���!�`�9W2�*%�{B�Y�8�=Ni� �G +�g���Rr�*�9+n[Q7����Y�a=A�Z勽�-���O�j:r�G}t���7n��V�\�x+"\��m�o�������'v��%�� + �����q�}���y�[�*���/C� +\,��"�lm�Pj���?7=G�'п�8w��4��?�nOWO��a' +VGg�R�Qtu����F���fp��� +ak+[� +EGww�J���&��j� +�W4��\,���g:�.��YX4��G�S��*�da�#��JHy*2��D��.V5y�HӤ������a�U� +i�ƫm��قU�UMUڂ����dOQ�L�'�Ay�`��{J�U��Ϋ�U��iG� +~�H\�`��'�j�*yV��c� +�Y�f��.YX��y�H+�Y�,v�g�*���h���v��Ng��(�`v������a�����{}����� �V}ùB9�~M�x2�c��_��������[��ܺs���;�?��އ_}��r��{V�=+XAt����=D���"� +f�=N>XU��i%R�D:OgآI����gya��V�g���z �X�ʗz���t���\���O�tݺ��K�� ʙ���s��~=�8(��]HHHHHHHHHHHH�WP�<���C��44� �åk/-.]� +��HXJ8��4���E8�@���>953A�'�M���F�I�Ѥ�i}���fkS(�U��ek{Gsk+�`��W-�[ZZ��[;:]]]*�J�ӛ,F��lwX�n�ۃ���ɼr�Ww ��Ò�W<����Y���hQ�JJX�;�9WU�܇Fʆ����γU~�_�j�j�+��^S���d��L�k8ɪֹ +H�+y�����Y��4OP2���B� +j��rz���xVn����V[�5��";&�-��뀱r�mNp�ز�Z����=�'��o��V~�+�s*�����L���?846~��V�C��b%��Fb�D2��?0;����o_���[w�u���>���W_?39�&,6����x�T�s �0�T|��0�<�$�Uq���ɞ�KQ�$F��8:��¨Uͪd{�X)�*�\1KXmΟ��?74B��5kd�j�m��C�ȶ"�;l۾�X�\���������������Я�9��r?�֮�����w�?��/]]X���tAv�䡄h^��#XX$����={"X�@t�K�[�V[�_ �T�:`�����Z�����+DY���v�_uuu)UJ ���pwX�.��m�x^��,w�3���-E������'>��G���'RIS%�{2��g�ǫ�+ɶ"f�4|�����˒m+��#+^�b>�(�WU��������k̫��U�+we/KB��A +_WǮ�nɰ���]f��� YXDb�z N�ڜn;���l�.Z.��]V��V6�w0�lN�YY촛�pEΕ Y����y�!$\!�=vy �����H<�.�*C��c�gύ��+����l$���[������^y��O>�y�έ��o߽����?����ߜ]X��K��J�Hb�s+N��#�� +�Q���<��4F0-�8������4R0��&3�'���*��J�U�@�U�Pm�[��g�)O���ٗ�G� ���K�����V�@^֖-[���?��s�w�A�VBBBBBBBBBBBBB�!��7�������������x�����K�.�D��K)�řE�`���B�E�sg&&�5�@���j��(X� +E�(Xm4��W�_5������������毜ܿ�!�WP!���<vpU +�W�-B��$�������X�B�S�7U3^P�6��v����W�:������_�QFX�jgP�]qϪ�]�<�U��`��^��Ѱ�z�C��գɶ�J N��R��[�Ĺ�Dewyc�����Hvd[!� +pU. lEUA��b��YL��f��m�qb������D7�<~�?�&��R�hx��ؙs�g� ��{�3�B4#����ؙɕ+W�}��7o�Fۊ��}�ڛo/-�����{y^�z�ܼ";:Wd^E�I \�� +�4_�=��J>'�9�f�2W��I�Db�Tv�����U��WJüO[G����O��g��5k�l�m�ǿ��WP�6oޱs�����/�������܄�������������c����l������w�������d:�r����E�Ś�q�$GH-B�r�������'ϝ��>{n:_*;=�F�p:}�J������h;:���ji9 w)��Ԅ���N��Z��f��,��EB��dx{ ŝ��Wr�̫j +�'������8��T+�`A�*U��J����4p��ANk��\�l�H5�j���f�&U(��T����5�[hU=F +JH��|� Aɹ��>7���jC�UX̄)~^'8W>:W0@{���91j%�U��r������g%-��l�"ٍ&-na�sE=A�j�=~)�y|֡���C�x:�/W�����L��972z��o(�+��h<���GƖ.������oܼu�ޝ{_�%;����/��OĒ���<d%e�B4�b`Ϫ�-H�+��$;@������hU%q�`2�Mg�4I���<Ѷ*e1m+_*��*����A�������?��S���&>��#�p�xu� 5���V�jmڴu�=����ַ�ot�xA!!!!!!!!!!!!!��H�������76{��V.-]X��� /��Bu�YX�`aa +kj|�������X$���j�� +�����.��K�d�l� +ak멦fN�jnnnmmiog�Qtq� +��2�B^!�BūS�9����W��pXr��va���J�T+�B(���W��6��+9p����d(jETv(V�B�*�ˀ5Kb���[`U� +0V�0Q٫�?$�٫%A)j���U^n^9�~���J����S�Jn�]6^t��@b[A�V��L6~ <;zY�`[���e���E��������n���� HT��@O���������\�Od"�D2��f��W^{���ݼu�ν/���{�Ï�/_�vfr*_�u������a�Y�9I!+Z��"�*E���y�*�<�x2�U2�Hq{*Ë�ܿ� +�V��\I=���U��^Oo����X,���V��'���������f_�n�/��K`v��ȴiӦ͛w��;t���#�VBBBBBBBBBBBBB��E��O<��]������\��x���b�\��"ጜq��"�����٩�3��>95S(�:=^�Zms8����`�������mm'�NSy�4���_�t��j���+��B�ʎ� ɹ�;}��*�J�_����d�*$��N�S��N,wٶJ����!P3g0��Vo%�����zO0H`�H�(VRC0�^5L���ؕ��7�J�����h� �&>@l+�[�\�!+7�W�H�+��b;��� ��1����6'�C��&��2���2W0U�ƗӍx� �|��V8�Ѓ�U,�ƞ����ٱ3��c���R%�ʄ��x2]����^y��On|q�����\��_e��b�/K:��rV�P4��e��`Ua�Jr�� �Ye� ����жJge�ժ���r�YesEJ[勽�b�����1��؏�'��O���~ݞ=�<��c��!� +l��ܭ�8O��M�7o��u0;���#&$$$$$$$$$$$$�k�_���hػw�Ν�N�Z���ta�+����^u��Z�3��bUgr����ɩs3s�c�DJo6�50`��:� �խR�+:�,��jjmm�P(����*�Π3q��������B�\�^��5��U+(q�j��wH�E���."Lk�� +��ܟWR[� +��QE1�]�*���.�W|t �*�+n�I�y����W�Vn��S"\QO}*�;�}I0v8{8�~�X����K����h[�]@edž���$h��M�<F�h��V�\ѭ��=A�a/��(�CQ/��XW���p4��z+��#gF�&F�'���J���T6�(�|�<>qn���w����Ͽ�����/��[�753_,�ǒ�������`$�y��G�ʞ +x�IiOFiv�%�Q�'3Q�cO�bWo���<�t6�=A���J[�q�`��!vU(J������x8�x���?���9����y�u�7Ԧ�����֭_�f�Z�oܴi˖�[�n�U��С��/�������������Я��<�$ۿ��3�ع{����f"�,�V�7�/P��G�)�s3�S4��@X���-�+N�W��X�v#X=�J�N�����N �S8�� �W� +ٿ��&�esy����xk�>����1�\��T-,)��.�hS(�GJ�e�;Y���D�y��� +�+�5�vh���G��C��4L�篤��^9m%��� +�.B��x%�v�`�'��جDJ���Cܳr�Tv/���сn/�lmN7��o���p�sew�ce� +=+^4�y�v���1n/{^�'�a�PW����B�x2��x�������������T:��C�X:[?�|鍷���Ͽ�s���/��p�ރO>��>����D:���^�t�m��1 ���/b[�z ū��Js�*��L����{�4I0�ɳ3&�̞�gs��l^������[f/kd�P�4����c�ck֬�0MD�J[I�+�[�]�v�ƍ[�nݼe�m������_�B��644�?YBBBBBBBBBBBBB��ڷ���'����/]�$E�x����5���E�Y�aM�B���������X2e4�qa��+���Rutv���7���8u�ts3��~Sk[������[�R��:���Wv����v���>0dȥ ��� +�uBvpjYX�����G����yE8wt���hMK�d��%㫶!ȱW������k���C��9W�`U@j� +2���[�ȳ��`��x<y塜_�\��He��@[��B�l^Y�n�ۂv�c�� ��r=���KmA#� W.���'���@�w{]_ A�z��xd�����Fr�R����l�� ���ko���ǟuz����s����\{嵡��D:�%���7�� ���ND�U����d4���U��Vh[�s���*�J�a.V:#S�1pU౫��ٞŨ4�jũ�8�}�C#�cg�����oyrw]�� [����U�Ն�ɰ�+��ֱ+7oӊ����5#w��!�F �:�g�e���=�w߾�{�<������W�-^\�� +�b�_^�"���K8��],a-krj����EX���}~�Fcs�!�`�wv)5������V�jiijimS(�;;;{zTZ���GZ�.�ln�{��.��hd=��F�פ��yū���{hau� �W�8�U�b�e`;�W<�Eث��d�*B�+9j孭�!�SU�$N���£���,�f'#��#/7��R+�ֹ�F��m�yVv�]6�٭4Cw&�0v��2Zȳ��n���Z�%�V����'�m`��m+���c?�x2�/�|tW#�bo<��c�h�P���K����G�ܸy떄��}��{|�>W�T�B� +�V�h<�i�0��B8>2 +HvZIr��gE�@X��dϖL�0@���sUS��9�ϪP���x(�D��-� ��MfsG��x��gw��ۺmA�!p��Ư!� o�~�Zv�u7nڲu��]�أ�?x�]��)l+!!!!!!!!!!!!!��Ըo[���O���[XZ��+�K�,w���/����H��E�E8;���陉�i���̍���'�z�Y�� ������V�����Ek{;�W�ͧ�[�ZZZ��]]]===��`0�-�r�]��v�h� T�؉s�eKv�F��y(�+2||hCn�S���T�I�q)�U�C� +2W�钀��Y���Ʈ�f[U��!�9���?�tI3e�%Q�Э�s%� X9+��A����mN��"� +�a%A��Y��� ī�FzVF��h�Ͳm��I-��P �{�~� ��qz�o*��2�ro������Y�[�����t6���t�0~�ܥ�/���G�~~����}���{���������Q���h �d�`��z �W�h<+2�b@������T&�̀a�0+�ʞ�V��), B�*W`�w\E� +�*+�bo���x�ohD��~���Ӯݻ�nۆ&ժ����:�'�f�����Վ�;�n����G���ĺ={ğ#!!!!!!!!!!!!!����3ϰ���kػ�����C���.]Y\^Y����U��"XX���1�,��9`�s�4F��]^�J��:���T���j�^����V�?������.vtvv)�*�V�7!e��� �+��W!���/aɿ������o��!e�d�H�"�=��+p�|�X�,�v�[1��8����Ճ#4@P2��d[I�gXU#X>���� :���S�Z�� �w~^�esy`���+Ǯ����X;���t�;�v� �:db%�ț2`=ЀΕ�`f;��\� m�-������=�7i1�k9�N�Ϗ=�B��ptdd|d���șJ�P&[��3�!�S��#����;�]��s��(m���;����5�W ��)d���|�H#���z`2K�� �'�F�� �WQUP�[����4L�v�!X��`�X��U���8W�����1_0����466�0�U%A9m%;W�Z�~�V�v�ܵm����z�k���(� �O�w���`;~bz~��ʥ�ep����la-�},,���bk +Y�daMRkvv��D"�6��Z�! +ڝ�v��G��Qk��ͭ�M��-mmlo��Ptuu+�J�Fg0-��f������������ge�e��|&��I=<�嬱�\��<�6Tm +�*�q ���x���Q����+cW�*�Um�σ�*�3W>���($Ɓ]�`չ�Tv>IZ�����c�� �$HS�ht#!�9��~0C���-, �[l��Y�!gţVue��6\!W^?�"������8\��Ē�\��7=�����3}��R%�L�q�`�\��[x�ͷ>���V��u�>;��u�ɉ&���0�P4���DbO�x� +v^�T�M� +���;��d��VY�!H<�T6�� �*�c�9�YAO���!jEUA o�/U�k.�z�����S���|�G{�<��m� �����պu�֮]��m��]�wﮫ۶}g}}ƾk�.��GHHHHHHHHHHHHH�������644Գ���78t���%)��T�%��b +�"������55�,���O�k��{+�n�`i.W0Rk����N�գl��h�Y�������+�^o4�m��嶳�v;=^��|� @��ұÙYUS�+�W>��WkvQ +K"��|��)U�Y�KX�skK� �B_3�� +�UB�T$��㯆�Ъ"��4I���+��`v��묙*h���AhJ%Aڡ!��++���du�lvB��J�KΕ� W��h��,�\Y.����'���4C����#�T:W��ô�x��H��/��C�@0����Ϟ�z�?A*���b�O>��|�j���^���xL��iAI0��a�&9+2��)�¶`4�N�r�t�� ��46!j�O����(v�͗p�`���B*{o��^,�K��_������֯��ؚ5�$m�Ab�s�j=U[�e���uul�_4���o<��o �a���[��x������� +���W����DBb�J���o�}jfjvn��D2�5��:�1 ;\ΎN�J��Q�[�v��M�h��hik��`O�J���?h��mN���qy��_�X�{�V����>����O%�Zջ����-/�9�"�ʀ0��&�%�&��x%Ŵ���PM +�wC5��`-ۊ篤ق��Œ�_B�����ۊ�7�}ɝ�$;�_ITvt�.>XP���mN��I A��� +l+��R�Jg0L����A���F?�z�0O��}����CL*�.�*}Ã#c�#g�FK���L>K������������э/nߺs���7oݹ��篿����Y�?��){�� fE��P$!��9� +� �� �`� w�2�LLI�@�K;�q�`a�X��TYJ[�ʎ=�r%_#+�H�ݏ�k�n��X�n�/ \����XA\�}��� {�_�Wl����7oj���������������?껿������ƽ ��Ccc�W.Q�P^���yh�8�s���Z�Z�r��̹�Y�`���!�Vkw:��"�T� =*����]�hiooS(�߮����b���v��n�υ�A$�{�ł8毼6�ª�cy��G�[67����6�4�,,@�ia��E��ļ���a����+9|El+v�'犻XRa� 8� +1�no�*_��^��sEQ+��\�6VF��$<�*��&�Vܹ�e� A�mExv#��<A��!�<���n���py����J����������X�(W(��P8�%K��ٹ���|�S�[ݿ{�[��ܻ��ͷ��`fn1�̰�������b�P$�i�d4��P[z��8����h� ;$ѹJfxIzV�r�\a�z�9�d� �\� AX}�b/�,�ji��ַ�ž�>�(�܈mAy����m���7�E0���[w��=�����j߾}�o����������������y�I�<x����/.�_��,ba��U��Z8�<��[��¢��"����������d2�5�-Z�>���vEG�Z��j]]����R`��G�����r��<�s��n��+9WnYX<�����e��dž5C��0��0s�Ӎ��D�G���D�7�� ���s�/;W�Z���sV��[";9WNo� +i�����v Ǝ�'���.R�<�Ɏ A^�9�f��FJ A;�����2����z�Y'�WH��Pڊ���i� �5�"=��b��,� �����{��L�~�|���k������nݹG�՝�_~zl����ʕA��7�&�I�� Ů� �Ya� +�+�F�-����S�H��gB�*���9�������,6����T�r�X�n ������L��^�Vo����M�Z�~��Y=4U�l+,�'��=d�]O:T����U�����������������?��?bk���3�\A +ke��׃X�y +k� �f`��"��)�S����� ��.W(Q���R��]J������S�����]���f���<>���w���� +�)�t�NSnyy冂!�XV�����6�0��"X��r�Um��p��$�*E� +!�8^�-��5�����"�iI�._�<AX�f���e� + �.��C� +�U�Z�a YX���n ��-6�VF��d�I`+���Qb����<�9���!_ ���������y��B��z��c}ÅR%��Fa`"�͏��Y�|��?�y�����}��o���^}���3�p���O ��U���at��1��� ƫЧJB� +3W�2���J�TA`[es�t&�+V�B�*����9�xVYBZ{��J�w��?��S03Yl?������ +<�h��^ \���z&�ZX�>[�o�۳���_�_��ڕ����������������Z}��~��O>\�ظm�����?-_�rq�ʅ��V.]���e�;�#��AXK�`a-N�/"ȝ������&&S�<"�냑�������T���Ruvw�yխT��Z��`2�m�t�]n��-�`�Ν+p�\��(�`�<l��;W�lq��v�����n�g�Y~��'O� +��~������`-�][���� �Y!��O#�ij�T+��(p�Q+��ʶ"� +� �!�=A�K9+�B���a�yE%A�ɊVxVZ�Ik0�fn^�,0R�l����w�z�!o �Tv?��\n����S���F�ж*�+��b�%ӹ������o���g7oݹ���/����g��}����_~���مd&�p���@xV�P��Wa>O0Of(vnU<'�*�����cG��2W<y����Z���ɞ/f�1���*p�*_�����gf?�������;�7l`����������HA +\aS�]���͛w��}����o����ş!!!!!!!!!!!!!�� :z��=� ���mݶmd���KU��� +e��,,`��}����}zYX`a� �}�op(X����"z����]��*��.��+��G�Ri4Z��l�Xl6ο�@���Dq�ؕ��O[f\'���0���r&��ds��N�͎�A�r��Nm>������ڞ�jH{ �&v� + �NmA'�/$*;��$�V^Zv��hA������8�Z�$A���ȿ��d3bI�->:��fr��*H�u )�������a�\��rz�n����"�T&_*������{�3�B$ +p�X<]��O�ο��z������������{��}��ko�.,��������PG +� +�V�������K}W�X*�H�l�'� d�D��VR[P��Ѱ*b� +W�����V0C���7804R,W�.ϩ������7��c�=V�||5�j�4L]+�۶m������Wf����������������6}����~���= ;w������˯J�U5�u^M�q�dd]�_�.���y��/�8¹��鹉�����3�S�\�l�!+�;{��Wj4]J�R�Vk����`�X�6���B~����y�~'F��.2����̖�i�;ȶ/�נs�4�s��j7Zm�lv�(�`������ +���yYU������� <��� �$�����<p�F�ZgH��A�_ ��D��q� v����aE�N�u��Ue0BI��P4���Vi�&H[��e&ȕ<O���{�A_ �����vBW��py�^ M���b��h`h����@6_�Ł���B������k/}��'_ܹ{m�/����;��z罅����c�D��/o �B�D0�Uۂ� ĕ�%��8�-�HK�U6�ʐg��d��Y�S�ж�1�� D�U&G�@ �N�+v(���`��T�=� [�:�����7�~������MN�"�j����{��ׯ]�62�6n�nϞ�_��7���khllܷo���}�C+W�]D��"w�0�D�K�b�8,,��_�0�E��yJa-L��N��O�-� �Ca�Nks:�����nStt)�Z�Q������V��j�:�_��v���t�<���������v���C�e���V� me�ٌ�\�y��X f�-,3��<da��$�����` ��G��]/[I����I��VaԊ�/G�ۊ ҅�G���@Rq�Uu��M&�Ӂ�)p�&v��M:�I�3�$<;D��6�Ձ�⭤�����ǁ��@0O�s�%��F�`�`o<� ���K��/]y��nܼu�����~��Ï�_�x�ݚ�}�{��0C�d[�A0�ЪB�U����8�����U*�K����A�Jnʱ�,�W����U��W�b{�\��73~6�-�(5�7?��o}g��֬]+E�6�6���Z�u�6n�����[�l��ظ*a�s�N�WBHHHHHHHHHHHHH��P�B +��#G�44���������Z�te��U���e����PB�����#��[87;79=;��8>q.�/�mv�N�ES��llioS�tj�A�ժ0|�3�f��aw��N���ry|�����9]f��b��h��vySHX�n��5��f����df�O+� �%G���G�?�� +�,p������րۇH+���� +�VHb�cCЉ������H�%$;-h�´�4�1meq�m%����A���J�3�U%\Lz��l���v� �<n_�{����������F��t�P����.�+�T6�A+�c��7�z������}y���ȹ�y��^?{.W(�cI�!F�g��l+� ��V�ɳ��S�`���t&�i+�������4���\�a�/�a��_�y�h^Э��0A�J����3}�#���~���w߾G}��5k�Cp�ׇ r�j�:\m����V�m���<���䯆\ ����`hػ����=�J����Z�R�%�%�WK/-R�qX�s�)��`�����]��[� F�j��j�er�X<���ݪ�P���^�հ��&����vC���!#��pX!|e7�ge֛��Eo6�=eљ-:���V�ɬ1��F��hb�Ѩ6�F���j7a�PNa9<| ���K��P��G,(-LX��ay�vH��B=���+��m�v�R�ʌl+�[AՑ�V@Y�� +wp��>CP�7�2j�<pw3YL�������^*���{a/��;��z�[�c��V��.���2�H$����d�o`v~������g_ܾ�x�� pu��[�fr:_�'3�P���g6{4AvX�$����& �SY�$�a�a�T+�ʥs�$H+0��>F����H[!��l{+�J�����{��ǎ������Olܴ�5k���� �m%{VU��ֱ;ou˖�;v�|��!�����(� �{�7�~���<�lݞ=���������`^]��J ԝ�.-"ѝ�XK|"���y�r�]����[X:;5�/�]^�Z� ���r����+:�eP��j��`2���_ٝD��\^�ܭv�cW�EgWJ�Ie0jО�p�ʤ����`P�J�A�3�خ7j��-6�9Q +�B6�EB��`��?D#%����<gE!.���`D�\��Zd��r�c��rYlN+����+��d��B���w�3��{#z��`B0��=A���q���!�7�p�l��}�[��ro���G˕�l��%��1W(O�����|���[w��@`v��߸9;�T(��S�P4�C�ue�g[%���=�x*!� dcĶ�$v�g)g�nU��E���İɳ���l�ۊ],C�U��[������V��_�����;v�\O���� ��+�ڵ�K�e��m�A��������������������~U428ظo_Cc#[�L��K��\��[�P'���� ��/q�;L$�0�x],�bkznavaid�L"�5�L&�9��JE�������ӣ6�z�Π�[-V���t8�.'�����f3Y�z�I>�A���h�J;�C���a� J�^�{7`��}t�jM�F��6��&�-,Ghu�m�;AK��B�0Hc��mE<v�l��� +0���Mn�7�V` � W��#�ɳr�q��h�J��Į�2 8Wz� + +=R١'�G���*hb?#�����}�?� ����^��:\���Eb�L�P�������X"F�H2�;�|���t��;���'���z���0���X��X���V������B�� &�$�\W�d*K$v��C�LK��'f��^&*;f�`{� +�*U��FGϜ����o~x��C;v�ڴy3�V�f�x� ���֭_��+v��;v�o�s��k?��"s%$$$$$$$$$$$$$��^�F +�s��f]}}㾽�����{˗��BKJa]� �W2��X�"������xnv~a�������h8���ހ��_)�KF�����[�ҙL:�Qo4�&��f�Y].��\N����1� +�����R��5�.��[��V����N��K���J-�U�N��n��ht*�Ac0�(�e���0��J.����"(�Sx@�:�ܰ�%Ap�Ч"���@���� +YA� +l+��-�YA�ʎl+Ne�����F��hE��Y��n�Z�v��W�[���n��<A���� +i]�ග��E=�P$��� +�J��p�o`�X�K�s�P��F�Iv �5���{���sON[ݽ����>�8K�C�x(�`{8�����@�at GZɶ�Lfc�4Ůp��¢��W�l.�/�9تH �,[�R�� A�!X���$ϊ�bo���Δ+G��x�駷�عy�r���+�*�� �y�@�Z��ƍ[�m�]W��=����|�j[��+��BBBBBBBBBBBBBB�Z��/~Ѹoߞ��ƒ�k���r����+�����u��X�.a�¢���ź,,����.LͲ+V&�g�}N�Wg4��鑱�B1��j�ZZz4�Ѩ1�F��d��B��fwح6��b1���V�^߭Vw�[��V*�{==t��QvtÙ��"\ߥR�htJ��L�rG���Ų�=V,�b������b�� +@v|>�-���`�&��NH+>-�|� ����`�P� +2W� +��Jk�bKg0���n��� #�`.Y�t;]�eO$��|�\۪20\,�e2�H,����h��;5����o]���[w��}�ս?���է7n��N:S�#�� +�����T8`�H<M���4� ƞE*;�4�iE+�%�U>��c� +V�c'�U^��ʵ���>Z�R��hd�̄J�����ɖ-[7n�Tc����'��պu�� k˖-;w�bk���xB������رC|߅�������������~��[����O���Ӱw�|�{o��� +�WWW�P +�V�E,,u�ȇb�����g�����_`���� +f�R�}�g'���T���tkK�J�E�Jg0�Fba�����dbW�4�n���G������٦�j�d��sg������.���gE��S��VkUz��hқ�z��l&� ('9QV���+�Vܼ�;�M��r�Ȱ��0�� ++݄Q+��l�& b ��8II�H�2����H^���{�f��jw��<��7v���J�f��C�h"�/�+�������re �+��)0��S��ؙ�+/���ǟ�������{�������ʀ?Ȟ9�&��8[�x*��A�ZŁj�S�*C�Z�*'0{�Vh^�2@b��U&�!0{6/�i� e�r�^^��P����Y���7882�^̏��';w�Z�2T����Z�Z��qӦ;w�74�رcwݞZ{CC��� �J�g�e��߷?լ��K���r"X��b-_�"�d��ʥ���KH������:?��85,v�م����d&k�X|�������D"��Vv�nn�R����`������Y,��b� K�T��������l��l�P��w4��7�w�s3��P�):١��ٮ���|-EOO�JM),`a9�'�цY,��0Uewb� + +��V�U���C0R�7Y����U1�f��<D��n3���E�Ɣ��Vz�Zg�ΕΨ�!|�7A��l5Y�as��ހ��!��.���h[���P8�� +�J_�P��po�`�ԛHf���?��S���/�����ߺ}��* ����~����s3�x���RI� &�y���%�$��XLe(pE�@jr���W4R0�G�*W�P�*HvL[�g�[�1��r�Y!mՏ���[��W��SO=��ck���jW�?����6l���h + ��ַ�����z���~OCß�韾�ƛ��rU*��T$�|�:���ѿ��ELa��]X��_X8�=|jv�h$O-�x2qn����t*����:�ܤ�Q���^����Z-e�TZ-��T*Eww�B������v���T[-M���r��������V0��}��jWP4KEBM�V��a"!��h����8��Uvɳ�����ڡx�&���)���U:�%B��+�B��D9+��5 �k�F�Π��$H#���+x~����C�@��:�����v�}�`$O��������J�P�ԗLg��8e�������ko����/d��ޗ_}q��'�}~~�r�Pv���`8c��(��q>I��Y��@vQ�'H�UrV@�ʳ%e� +�J����|rV`[�h� �,��=�r� +eH^��*W�"{���e�V�9\�a��V�W�_�C*�z��ց�oڴy��]� ��w�_g!!!!!!!!!!!!!����S_�w߾�uuO=�t ~���ekE��._�%�c�P��V�����_�r�=jzn�x�Y��R�4�077?�J']����]�*�Ne0��5j�V�VC�J�Ttu�+ͭmM-���[N55�<}����'O7�d�&\ͧ�[�5�h���nimjmo��hS@�����K��Qk{�:�ޠ2�d:a\J��S��BS�-���M*�\x�I�7�tF� ���ҙ�h^�meR��j���d[a"��q��{�a�?��n/��n����ƒ�l���W������l!O�Q�2�����+/������ܻ��s�q����>�����F��:�Y�yT�07����UB&\eɹJJ0v� +R%�B70_�R� +l+b[3�*�*��+�[�g%O,����`g�eo�'���O:�>{��Y�POp}�<A\�_�����w���SO���������������Я������#u{��������_���ꥫ�j-�e��.R�p�2�¹/]� ��B������{*��f�+�N����� �/]X\\�K�]=]���Z��{4Z�ޠ��{T�����ή�������M-'��N�>}���c'O?y�8����N���X��!�%YX�@tW��5���Z=�FHF�L:xS#���P�k�����֛T:�R�����ѩ �eP�7�*�A�M-� +�Vp�Ơ�k(�e0[LV����?��.o����@C����=�L���booe��Ro._�%��P��D*38<�~����w�m���ٺs���}��;�M���Si���E���pT�\�S�d W ^�*�K��q\���`�{V)����Э*�3�ʑ[U��V%B��sE �ށ���!��`$�����~�Ge����7Tm+RMIp=V$vy�Ν;�8tH����Չo��������������Я��}�9�7���={���3n���E��AXX'���,$�_^�_A-���K��O�/,������˗����+����^o 04<��ra��B��Uk�'N�:�Ң�Q�h�=jm�J `v�����Ts3����S�N�8z���c�^<v���?~��'��E��N���Vө��ӭ�%lU(�:;a.a���GݥRwkؓk�:�RoP�BJ�v���p\�w�uJ-�=j]��=J�գf��գV��U�n��G���[UZ#w��z5f���\�<A�� :=r�*���./��{=�d&W(�z�Ѷ��ˉd&�B�h<��78�x�ͷ߽q���_=�ٿ>������g7n�z���/_*U�� {�p�R�*OG)���=� _ Z�,/�*� WY"\�Y�Yex� +F +�gUe[��%A�!�/W�*����S�a�doNg0����_����I�j����Xm���ƍ�m��>������C¹���X�r��'�w����~�Õ+W/]{i�굕� Jx��ׇ.K ���>�tav@XW^z����`w;7;W��C8(>sf��K�+*�^�A����N�ttvk4J��K�Rtu�tt4���8u���`^���?}���/��±c�;v�؉��؉O�8ƽ�S'N�>y�4����[�rKѣTt+�3w�����n0�ЛR��u�5�q��Z��N���/eg�R�����Νݪ�\Ju�RӭԨ���MC���h�Yp�����mb���;�����./�I��l�X,��+l���T.�C�H4Q(�NNϾ����?����_~�sp�~��[w������42>�%�[Ţ�t8�9�x:���U�V [�=��٪8�V�2�s�èU.S Y�9��:�0FP��Ȱ*�b7���� ���E��h�8OL���O�~�Y���� �* �s����oٺuw]��#G��]���THHHHHHHHHHHHH��V�����~����쪫{��p{�����X�敄ú�re�&^Zma-�,a�:�pq����|��W�X�|uf~���������ى�KWV._^4[ͧ�N�p���斶�.2��=m�Sͭ�O�>z��O_8���?��������/��u���/��c/;~����'N;y�ĩS')���z������&�wv�FVWOGw�R�eu����\�::�ۻ�����좢�-v�k:�I:��]=��F��+�����4O�jw�]�/��ayDeG��8�H<����r��[�R%�-���`(�IJ�����K�����Ƿ������������ރ�}���W��<95���>\aI�2W4Fx�8=0>vq� �3T�CV�$��s$;���ϊ�y\�_���C=+� +�CO�o`xht<W,͖現���Ǜ6mb��5k����T�U��:4��\֎�;���/8��7THHHHHHHHHHHHHHH����44l۱�o��GK�/����ի�º +벴.]Y�� %�;�.�_^YZ&�E�b!�}fa��������[���<�x>_���|�Xttl��e�L+c�#���Sq�ر^|��� �R*Mg��������TS�'!y�����O����g�O_x�_^x���Ǟ�v!�XǢ VSө�f���5��h��� +;:[;��զ�"k� �p�w�˫��� +�q�DzG):;]�����n�F�ѩ��\���n�:�.��!Ne�����pAO���� �'X�(��2�R,� +���p,�� ��-]\y���?����?{���ٿ��z㋗^y}rz�\ENo �c70����b�`�SI��V#��b1�#���K�mm�Bg"����2�V�c/����N A���*#ã��c6�������o��#�>�KG +��Vkɷ�:�-[���������g��"}�[�b��#G���-_ ��o� +�C-B)�u���H�q�Kr��Xi"���⥫/�������_�[<_�����P$<4<x���+WV�MM&R �N{����}���ӭ�0CP��.V{�����o�������v&!@B�N38�=��q�I�N2)�I�r&��q�q�� �fc0��*T轣��h���Wlܒ�y����Ykכֿ�s��L;��}_���VA[��s}ː�7��뮿������_7���n���t-� 7��ě��z�+l0�-�Q8|xh-~�m��34\�v��I�at=34�ht 'z��5��9"_��0a�ֽc����'��8%Le�:}괙��5}��$�����������fϝ�`ɒeUU�uյa߲��3����]�hiݚu���ĩG_x�7�z�3�y���Ͼ��[ѓ�oo�� /�ᙳ���Y���T���$�U(�Z��._�x��%��*�I�ji*�ʔZ�j�Tf��� +;�y�U���� +�Hb��檪fUu���kߴq˶��~�]?�я?���w��=�+���%DR��*ά�n�n��]�t�͉į鞗�ߣ��W�����Ƃ��K����+���+��,(*���+��iO�U�X�3{ �v¸+�r?g�L#᾽ �G���gO�~�ȱͭ��l�8{�g�ml�oݿo��]+��&M�<d��k���ʫ�|�C� O�����Α#o���n������x��o��B�U8!Ⱥ>:�^?8+� +�!Ⱥe��a�{XS�l*��B�W�!���p��z����;�v���� +�� ����Blu�� �'N�8��)NK��O�5g���=<��S}���1kμ��/]�bemu��L�*Le�=g^��G�-\Y�j���x�^�ϼ�nRpu潧�}���eͺ�K���=w��0+^&�0��N�Fp�x�Ղ�˓yVIZ�l\�ly�U0 ���*\ťV˒�+j����[��:I��yV!�Z^�\ŭ�!���[�4֭Y�yێ�Uk�}����?~�/��*�N�;w�Zu햞m�\�&W�srB�U^^�=� +JJ˾�g����+�����o|�K_���^zi�~��KK���?wނc'N�?t�-I��^�T���%lMf��a��$�jm�a�64�4ij��6�;~����<w��'��ʮ#��n��pьY���X�i����=�v�[U;���#F�=��/��+����n�e���w�U�YU#�ֿaA�a7�r덷��x�1I����8º���n�!N��tӍ7Ǜ +���a�a�n�{O� +���a��1<����¼�1��;f�0����&?0q���N{pڌ��5mƬ��9u���>���B�ՃӧϘ=g��EK�/_QS]���f����������1k��G�-[�r���?������ƛ�y�������ξ����Y�~���+�-X<s��9�>�����j���Ip�a�`�V� +�p�&�E�>������api��jI<�=�X��m�k�W�ų�k�:���*�Ǟ:�u!�Z�i��-ۣ�?��/_�����.���uꔛ�53�*7�$���tM�V�ü�����=z��9���3xeb+�����PE�>eE��_y՞�ƃG��9'�:������㰒Y�M�,��}a�{þֆ�}aaCS<�驧�{ቧ�9���G��ؾ{˧Ϙ1g����6o۾u�����q���u萫����]v��_u�5��p�Æ�sĝ#G�r��G�1b��0��Ρ���!Æ�:��[�z�!7 zː�7���8�aCB#��!Æ >���s0N��w���7���ƌ��O;a����L������x���g>4}fX#8��)���IS�8�)<�дPo�`ᒥ�WV��[Y����vɲ���͘�H������۰9��<��S/���o�>�w�{���ξ�ΙS�>�y��s.Z6�����Vq���Fp��x�`jo���K3������X ��Y�<u���N�Ǜカd��ʚe�W�XY��YUլ���~��Mo]W��]S�jmͪ�k7lں}��e+n�e�W����>}zt���Wu�=�=�L07T[E�7 +v��=�G�¢����0+�>A������_~=4s}��_��ӧ�����lђe��N�e�`�/�a�*��8��*���ER�tV}S�ކ����x���_z9I�N�~���u�� ��[0}��y��]�fuuM���&L�t�]w]s���]q�?_���_���.������[n:����~�]w���6�݂wFτ/9*��ݣF��G�3z��1���;r�}�ǎGU����TX�?iʄ)��j҃S'O�6e����x`��<��S�N�}hʃ��M��L}h��Ys��_�d銪��aBTuݲ���Y��N�֮^[ߴ�ԣ����+�z��w�='Wa���/��ko��d�U�LpQ�!8Qtͬ;�ʫ0�=�Wqc`�CpE�&��R���Y��!��� �j� Wq{`��V��WW�$���D�5ukjW�۰y뺍��O�����NyEEQ�^]�uC�CX��R0k�`n�'عst�ߣ�g�^��={��UpUn� ����oV٧Oy(�*�⪫�4��T�ա�iK�g�rO�Wq Vtm��r�OCjVs����g�{��W�{ᥧ�}��>r�Ď�{��X9c֬�3��`��%�/Y�ȼ�S�2rԨ���z�5W�◿�����_�����+��2Td�pӐ!C� :�����w�AUcF��wԘ���7v�����?z���S=��M�4v���'��8y��)&?0aJ8�:����3e��f�S'Ny0z��ы�8��I�'L�������N�>3�V��-_Q���.�V+�.^�gΞ9���+kv��s���g_x��7�z;[��Ι�����o�n��ُ̟�p�����>��@0l�q`ߤˮ�,_�d��tr�,\���"Ug϶�����J�0�*�_ų��j�x�U��je]�'X��^�a��m��O?�YEeeaaa���$��Tf�5[%'.���{aQQqqq�������e���?*�s����F�|�����k�-��(-+�ٳgUu����m�ت-a���+��:Բ�@R�"����[�R����UX��{���o{���^z��^z��_~�{�����n�8w���ӧOy��iӧ͘5��O�2i��{��6��_qՕ������~�e?����/~��+����2���p��7�<��[� ��;���G�u�c� A���c���� ��?1��&��8i܄��&N?i������'�7n½cǏ�o����G����/�%w��I�C���3����K�/_V���&:���yg̜���9/ݸyہ��O?����z�0�*dVo�y��w�=��S���=o�ܤ�j�ҹq�Ղ�q�U�I0y��DZU2�}��'�$Ω/[�o�W-[^�l�K��a�k<�}e�^Oe_Y�jEMa��[�ԅ��Ԯ^�����Y��֡�.���~��`�n��V���Y�U��Νs���E��KJJK +�����F��.�����W߾}�++�z���W�7�;x�h:�:�n'<������+���[4g���,����8�������}���~��k�����/���Ͽx��齍ͫ��`���S'L�4i�q��}�#F�}��a�o��k����+.����/�������_�ϗ]?y��W^y�5�\s�u��F��p��7 r�m�nN<�����1�����;G�1����GEg��{B�uϘQcƎ�w�cǏ�҄�S�L�6}�̙��Ν�h�0)=�K��̝�p��y3B)֢U��E��ǟ|����x��w�>�3���{o���/���.Y>sμG�/J����.�w����:��iU�I04��qHU�d���a�YU%�ղ��*�*��+�'�Vf��큵�R�x*{h�[�n����7m�<e������///�#��n�n��V��ܸުK�����ťqW`iY��e������%����?���s�**��_PP�z���Gj�+���k�ҍ���ǹ�OJ�B���� +��es<�q���d�{c�������g�{��7^�՛������W_N>�x��Uk��ydޔw��{ƌ1�������n����o��뮻�ګ��暐Y]u��W�v«���ʫ���LN��k�����'K oHo!�e��x���� q֝w�9��w��;N�F�;f����'��0i�)L�6��3f͙9{�#��6��s�Ϙ���3gGg���˫jv��{�ԣ/��ڛo��λ�T�3����������j��̘=w֜����]�8�� +�����O�F�ęX�$�h��K�M�!�0�j����K��9W��&��$M�5�ÐYU�T�����T����Bc`�Fpe*�Z��\�^�a��˯�����S�ι�A�{&��zn�U�O0''�sNN������%%������������� ���0Ƚ_�~啕={��������v��ࡰ��@|m���ZM���0N�����9=�=ί��M�8��]���>��+����7�z��p~�����/�r���ꛚ߰p�Ӧ�7~�ݣF �㎡Æ�r뭃o�����s͵�^s�u�\}t���W_{�u�G����5�o�ip[�|�[�2t�mÆ~�����λ�q��#Cl5j��c��������'��쓦<��CӧM�9��Y�5���5�\P][�c��#�N<���!�:6 �{��[���O?�m��G�/xh��x����<���jaz{8qx�0�'�W�R�ؗ%��y�� Wa�`Uuj�`UuX#«�_�kkWԬ�oB�U^�U�&#����}�uk�E���+��F���K��)�Xe'W�>���*��0�=7�G���%Yì�V���������J���+*���^�>��j?p�HR��X���P�,���0��0��J�6��onMR�ֆ�t�ռ}מ�c'_~��_����o���;g�~7:���;/��ړ�<w�؉�{jV��=wޤ3n�]#G 6�֡Cn���o����O0\�Ҫ�o���[nrːpn�C�ۆ6���w�u�]w�u�ȸ��Q���g�}c������?���&N�0i��IS&M�2假�<8u�ԇB���̙�Y�hɪ5��44;u���^�~�wμw���g����w�{��7�y�����K��|h��Ys��[&Y���q�UR�gq\m��#� +VK3kӳ���졪��::�WT'#���V5˫j��* ���V�u!���Y��]�oU�vCu���s�:���O + +��8�K�OU[����o�tv }�={������������˗^]���_V^w���h=p����T��.��^G�v�,��������ڗDX�m�Y�qXa�{��o��ы�{��7�z;�v&G�y���}���q����Ǟ�^�m��Uk�-\����g��8i���w�u��;�m��!��v�С�]��!Co�c�ۇ�~Gt���y#G%g��1�B��}c�7��c��?.T^M�0q���Lz`�>4��Y���]�tY���v슾��Ǟx���~��3��:�}�����������6̜3w��9a�`��*�Y�`��8Ȋ����0�jq�7pE2�*�=0�J汇 +��l�d{Um2�j���x�`j���������5��db�Uk7D��KWL�9�ƛnp���m��y�F��y��*]p�=�QPPZV6pP�`+����?�������[��uk��[��*}${(֧ƹ'%X�R%X���ut:"��P�Uߴow}㮽 '}��W_��{g�;�����ó|]�y��7�z��W_{��珝:��ڶeێ���K�-�=o�ԇ�O�4�����s��{���{�j�]w�=��#F�s��Q#G�9�Q���3��{�w��c�M?ab$�gϙ7�eU5u�6lڵ�!��=��S/���o���{gߏ���~����|���_|�ԣ�oߵg����=w���!zCl +���e˳J�R��I3��e�I�큩I�U5�5�Uՙ�*���5u+kWU�k<�*�֬ZS�zm��k�mX�~Ӓ�U3f?���W��ԩ�g�W�R+�ʫ��:f��v͉�X��yyE�z���7�O�R�����G㋗|)�8������%%����=�$WY�XY㰎�a�"�x���e��t#a[�����1ί�k�ަ���F�x���x�������?��?��?��?������7�z�ŗ_}���O=���ǚZ�v�n����k�jj���Z�x�y�g�~dƜGf̞nfϙ9g��ُ̙;��ŋ��X^U���v՚�7oݵ���u��N?��3Ͽ��ko��Ι�>���?N���&z�_>y����Y�v�칳�.X/ �Co`�j�'O�3��gi8I���x�U�\-]�2�J� &�ؓSU�"�b��I�&�gU�*�Jo�Uf���I0�%D��Q���яR�'�O��W��qf�-k�`�m�<�֭{~AAIi�%_���CYY��#����?Ze��啕y=�WT�n?~��уG����у饄I/a���Pae�s?������oڿ�1������Z߸��i_CӾ0k��G�|���^㽳!A:��G|��G��'�����7������_��'|�љ�?x��3����^~�_z���{k?v�����ā[[<�+�i?v���GO?��O?���/������Ι3�=��G~��G�:9~�q�}Cb����_|�؉S�O�z݆����zd�K. �Tjo`r���S����8�Z�"�Ǟ>+SeWU�邫��*�\%�VU5�Ԫ�63�*�Lpmf�`]�3mڲq˶��s�}��⪋����뒛 +���\�� vK������[^~~����t��b+������7����:pРҲ����o�?����R���Ta��R�X�6J rߟ^G�:qVS�%��K�����W!�jnٵ�a������S����|����DX���o�/���������˯������o��$��ٸ�/4�}���/����MUs����K������V�7�(z����O<�l��{��oܲh��9s�/X�tI���xYV6����b�t�`�Ϊ*�s������"�e+k�u��ت*i�OU�$X�je|��ju2�*I��nܼyێ�5�Ǝ�p������o�((�N�;wdV];F��������$�{�nyy���Q����_����OEiyyyEEaϞK��h?v������:]C��ɯ����P���*�x)as<+5+�K]���v�8�ڹ�a��ͭmG��|��g^��g?��O~��L�Y!��mr�gt����K|���~�����_��_>IgV�Ï��G��w���_z�؉���ݶc��u����;o���K�r��d�z�0�Wɢ�8�Z�,�P��t���H���̪*]d:k�y��̪&�$��mU�άR�W�ԭ� �U��Z�v��-��o�:}Ƭn�����>}����Ϟw^��x�H��ݲ���F�P�����ߣG�����w�� +�����?5_��W���/��������k���N��*DXGIGX�2C��v�t-��Ùq��@2+Ta�B��P���J�B/aSkcSKc\����yocӮ� �w��]����v�p�������}��q�P��O�D��$�Y��TmU8���T��'���O���_����O?�~�d�-��ܳn����KVT/X�li2��*TI��iEͲ��K��\��jI��j��$��,�_��"�x{2�}�ʚ���&���I�U���g�I�+kR5W�}UծN� F�nͺu7oپ+z��ۆ�{�������&�z��*�J���v��͉[��ԪGaQQy�9��{�k������WV�WT����~dޱ�Br��p�gLM�-�b�?t(�Nx8���{ SK �����GX�qXa5aSk}S(��R�����;��o߽gW}c}Ӿ��-m��8���O��ʫo����g?���S�Y�$9�o��~�����G�y��7�|��N�~,~߷��=�l[�as��U5�/�Z��zEu]<5�n�����d�8��S���Ir����㤫*�����&��V����/�<�'W��*5ުvU�d�I0dV�Uo��6ί�`���6o۱i뎱�O��O��_���;u��9'';�J%W��I�V99ѓ�ܪ��GAAqI������ZVQQTT���������o|#�~��K�KK�++��կ�~�Lx�t:���:�WYK wL�:�U��v(i$ܗ�Hظ/��Z�VcKCsk}�+�b�il��иcw�����ܳc���~�ަ��M;�4��۸��9� +m��ؾ����[���z���%����vnڲ#�[�a�jV�]Y�:��N���Pq+_m��KJ�µ:d�ĵX�Ir�<��O�$5W���M�� +�U��VD߮fU�F0�[����$�U����u���6o۾k��G�]y�5^tQYEE���;ǑT�O0�p�-��*�'��ӥK�x�Ur��.�m-))� ����S^YYZ^ާ_��~��c֑�F¬��G��B���� +�pzVj"Vsz�{sz�{cR�������%���44�nh�S��c5��]�}W����nߵy��M[���jێ�i� ��mز}��m�6nY�a����֬_�vê��W�[_?�]��fU��7�����֮�]*����)��յ�J�$�� +7u�6���4�j����6Þ�Uɗ���Y%߫.|�d$���a0����v��=U����~�������¢�ɮ���*�U0�p�%\%EY��={�*,,,)-�߯_�M[����%��w�]������VT����K}��^e�Wq V�&5+=�=5�={Vȯ�;�Z��+u�S�P�Uߴ��1�]�M{�v5��8�J����س}瞭;vo3i�۸u��m;6lٶaӶu��ߴm��-��oZ�!:�߰z݆�geY!G +�U]��|ie�D*�W�YUWd��jemz]`�X]�2[�\��%^u�u��������jͺ�ԭY�H�l����~���)))+(,��-`OҪ욫��*T\�f�.]���z��ջW��}��ͼ�b+���࿉����~L�4�䣏������*�:x�=�&��q V{���H*��Yq#a|ͬ&㰒���D��}� ͭ��I!־��0b5���a����=�v�ھs�;7o߱q���l��m�7l^�i�M[�mش6am���uB~�6\k�d +�� kMr�.���ouum��j� ��ڪ.Xō�!��g� \����Y%������Y�۸i�e+V^~�U�́yy�Zu=7��Z)����9'�[��E={��ݻwqI��g�Y)����a����L<�wIIiy��.����G=���ʜsʱ�SC�R)���F¶Cqx�X����`k[������Z�d�%X ͭ M-����\߸/��]{�I"�8�ڻuǮ�l�w&�[w�ߴuݦ-6m�n�oؼ6�_�Z�!:�ׇ몸�fUj�Ta�ԭ 'g%uY!���U�6���T�V� 1�YU�a��*��V��������oڲz݆��sɗ/�ܹs����={${[u�^)�%���r{�#�KJK?c4�����-������w��ݲ��~����� 4�ޱ�N?�ġ�G?a���ee���R�d�{2+��jKb��Y��,k_�\�IGa�"Lo'��owCc&� +�ծ��w�ݶc������ؽ%�KƶoO�a�߸e���Iar֮A֚u���Q���8*3+DO��%YVm�Ъ5�5dVq��\��Pf{�WqM8�ׅo�z��G�/���(/?��N�қ��Sp�1�*irrr����,)+���5yw� PXX�����o�+���+_).-��7���#ǎ���|� +�����P�� �ȁ�Y�3�v�XI#a��?5+��jiKz ��{���Z��ݍ�8��k{���l۱;�u���6o�j���: +���[v���Wa�����0��J�o�'���&]~I`U�&X�M�O�Or���*I��֮�Y�&��T �.�V�x�u˫���~��AD�Ҥ��\u�]�W�s�D���|��3oJQQ��L��������>}�����?h��{F�z��?�_eY������饄�;�LV�&��Ƨ%�%��Z�M�����5 ��Z�iܷ��)b�7�O��ڵ7:�v�N 7o۹uG(�ڸ5�nؼm����pӖp )V<k}8k�o\�QmX�ncf�{Ƞ֭���%τªp����<�_�.��x�a��ck�V/��5��o};tb��g?e�C�������&/?�W��>ì*�����������XRZڳw��ַ[:r�D*�Jz ��Y��S ;: +��J�bJ�bHM�jM/(LM�jM5&sݓ�� M-��^�=�ͻ�6�o��;����J u߲c����AXa)��-ۣ��N_CG��-�q��Ukׯݰiu<+=�=I�%U뒪������Z�/�ئ��˖,�z�i?��_���+��u�ܹ[�U��O���U�Y���F*(,����w��]��/-+��������}/��0 L�*-x���p��'g�`u�dEX��ՄIVa8|$t��('u�Tae"��N��X-��Z�P��`��ܛ�4�b5�K � �����ٲ=��JOts��%M�a���P��a�u�h��6%)֚d4���k�����u�'3����I~}hݦ�k7nZ�l����o�e��_�������R�ٳ'\e�W!��c�.��a~������������_��^XZ^^XT��������S��c���Q�՞��03�=+�:�+��FcnM�X-q� [$� C�����ܚ�d#a��0�%�U��⥄q����%�X�C-��P��#5�=�X�2�Xɦ¤�04�EYa�{�ߘ<�6jmL�����7ni���Uk�1��;F|���)�'Su��ܭ۹�չ����]r�īna0{Ϟ�Y}����r�����?}��ߏ�\pA�xa����7�TXDx<+�:vN!Vr���`�\�d;a2ݽ-�'%X���uOF�� +n$lK5���-�!� +�X{��4č�q��b�^�=�w� � �B�P�o'L"��+��j��h�d@V�]�1�bťYY�7mشeێ]�e���w�5�~���|&�p�5)�ʞ�~n�`NNNnnn���=z�..8h`�W]QQ�� ����_m��WV��o�v��=�N�:�.�:|���L���K�=��pւ������C� ��\���9ԖTaH uo��5�+N��P�$�jlji�� �B�� M��qX���= ;wׇ +^M�.�ꈰ�j°�p���q-�歙,+u6fn°� ��lݾs���˫��7��W\��/]r^���LN�.���r�6 �v�����S���z��ݧo���mqq�?0�����������_��WB ViYt�O�x�����9�d��˱~/�JYaV{�\��aXPx�p[�\��v¶�-��r�dAak[cKf�{kcSKC��P��]������U(� +�Xq֞�;�lۑZP� +��v�훷�Lj�6�,k��M[�u� �t���B��e����Mk7l�2���������fIi�g��3�u��53�=�^e:;�[���$]��="���_��W3��~�]������yEEAQя~���t^9z�HH��g�c=�]�un�u�p�+>�8�$�JfaE[���X!�j;����c�%VCsK8M-�M��8��I��'��w�ݾsώ0+�vOR�t�ʱ��M����p��,ܶcמ�����.�������>���.]>{�yaO`[u��=�b���M�[�vΉ^��=/�GAAtz��=��A�_c߾b+����g�D�o}�[}��--/�ջ�S��8�ؑT~u��>I�����B�P���*�jO"����XI-���[��k;�/�Q��k { �[�Մ�I;�x;ᮽ��ٹ�aǮ���,(L� +���X��t��Z�e{������ܲn㖻��������\~��u��9�K�`����\�㭺t�ɉ>��ߣ���g�^}��t˭�_c��-������;�yEeaϞ?�я���s���#GO�W'�ʫ��X��P��h*����~$;�:�uOR�x.����I����^��t���0��u����Մ{3�X�M{�v�s�S�sR��W�4�3�vm۹;��9������?hPqIIn!��?=�*n�\����� +���z��٫׀�����i�������`��\EeeYyy���s�?y��؉�^o?v2n$L����53+5���M�I#aj�{{de�b� +�Rޓ�X�v�ְ�0�b����qXq~���k��46�nh�]w&֞��S)֎d4��={�Oh=�j݆����.*-+�QP�9���&�?[��:w����(T[�UT|�������V������� P^Yٳw��яv�m8z�T�\��*�����8�:����~<=�=k@֑x;a|JEX�qXYC���*����&UX�9�b���++�ڷ��)l'�o������5)��}��-��s��/]rI]�x��O0�-ؑ\u�'\u��ߣ�g�^�%%�z��c�`e�>Z�������'?In�**��ӥ�#�=~�ȱ�\�"�p2�XYV����Oo'<r�@2+N����I���v¸�e���0+���y��T��/�W ͭI�&b54펇b�Z�������S�-X�?~��������2��3}���:���O0���g���e�����g~E�N�������ۯ_YEEo��w�64=��`���!�Jz ���̚�tx�{�U�����R� �d�v?�_��� +' +�Z�x5a��ZB��W�Մ�ihji�X-{��6�knm۴u�#F�?hPN�.ݺwϜ삫��*�sr�������KJK{��0 �������JyeeyE�y�;�[��H��*�`I +��MG�U{V��n'<qn-���h���D+��u�P{<�h^��N�.�j��b����q~�?���^TGaSK}C�y��l �\��R0\S�U2�s� /?�g�^e�e����:~J������(��?�ct���/��,)+��o��㧎?y4.�jOGXI-V�ѓI�a:�JY��*�ee'WI;a|s0.���(��u?�b�S�䴴�z ��hn=а�uOc������⒒����ۭ{�[��h㭒��]�D*,,,--x���?�O�>������$����WV�שӼۏ�H���~, ��"�캬���S����J���Z��P����0�Nx$�b��?x8�� +턭; +���?���i�m�����~5�Q?��ϞX��];�3��S���KJ.����?����;�����~�����/,��(-/�<��W��D��S�U�QxN-ֱ��h�t~�b�AX��Xɉ��'�у���S�x;a(�:r�H{t��m}��E������3��Kf�էg�DZU�U�K(��W��Yì��K�����������+*�+*;u�<��'N��H�2�UG�u<�H�<Lm-Lw�g�y������x���H��0TaN u?�~,���n}��7�ts2V�������d�Ue���*bu�ߣG�o4���?����_����?]��]/��?/+�(��������Cxu"a�de"�L��V�ǒ��#aL���h�d@VXJ�Ta%�t/�#ǒ�[{��WU��{���Ϟw^�#u�������}�Il��w햗��8{{`YY�7���࿒�>}�++s�u�>s։ӏ���L���e�&���YG㢬#����:: +�v�Ԁ��+�|�����o����ӟ���F?�y�:%��9�U�L�`��rr�t�������W���?���TVz7����+���~]/���d���.hO���a���g��̼���=�E�>���I��cO�~�ɵ�7N���UW_{џ�����>�5��n��>��ܜ��0�*�p^~���^����;�7�_V���������۷���������N?����+;�:y�'Z���Uj4։#G3݅'O=�ē�<���6s�#�\{�W���¢��v�2�n�Z)ح#� +W9�3����{�>�O��7�1,�c����{����_�e�]]/���Ҳ��>}�~{�S%�U�ɜt��|�S�ՉS�T�u��O>���ǞX�b���o��w��/�~�y�B`���v�2��>�.]r;��D�y��=z�.-���?�����������o�~e���%%#G�~��gS9U�d7v\�\�DG�u��Ǟx��^ޱkϝw�����͠A������N��`�n��S�Cl�b���0T[����� +�.��;������W\]�����WV8���ә��Xv��:�m��䣏=��G���>c��ぃ���+���7 v,� Sٓ�Vq�Un~�={�.,*�]R2���A�y������ۯ_a �����y�X:�:v����D+;� +:u����~�g�o�|�W4����k�nIl����J�sr�t��^PXXԳg����7����O���ˣ����ߔUT��WċO?�h�\�tf���z��'�}�P��{F���/�E�^���{��ݺ}j�`v�Un��ҹs�^PPسW��� �\��=�}����S� PZVַ�[����s/K_e��Blu�ԣ�=��O?;k�#?��O�w���V�^l��2��9]����(.)).)��W^Q9�;3?��������A���?���**�KK/��▶C'O?�.�z����'N?�ؓO���p�M7���v���T�UG�`n�O0蜓��g�^�%��~aϞ�}:���z�������[���A�J�����mÆ?��I~u��c���0yʠ�}�S��]�-�]�}:��Ԅ��8��nz����.�����_�w���w�������%%_��Ɩ���'WT���'ߵk�?�̟��Vq�U�>��隫����A����^�������g����ߦ���O���_��_�˿�袋�';u�Br�V +&㭒���aaQQyE��!�e�S,��������%��WT�UT��2�d�էZ�k(�J�g����0 ��]x�~������������.���{w��-;����rss��t�J��ҫ����}����?�|��iW������뢋/.��L��*�kn�ܜx${��v힗WRR2�2�د�=������\�����^�����Ź魂�D��Q�=/�wqI��}3����ׯ� W��������/.)+���5�{�������⒒/�˙��������Ov��7G�ˮ����,??�GAA�_��~���?�!�����'�(//)-�ӯ����kO��3p�@������/:t��?y�E�������G���� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!�������a������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8�c� +endstream +endobj +423 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1600 +/Height 1600 +/BitsPerComponent 8 +/ColorSpace /DeviceGray +/Length 10253 +/Filter /FlateDecode +>> +stream +x��݇�������.�4Q��P�I����u��32"�8�8ֱ��1"��Y9�RFI�D���������3q��ߟ����>��z]�볮Z�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������X���us]�J#'77�~��o���/K2�4���/�y���W��ʯ�h�+N̬���=��v����zM۟��%�r�M-!��@�uw�zxf�^�ݾ���?4����gJiƅ�d��غ׀���wZ;� �Zv?�O3e6�G�k�Zmz�4.S.S/j���R�C�=?1Sn˟��5H��G���LŌ��:�k�q���L�Tܬ_������ICF��T�y�����n����<�ntM��q��3�kŝ�+@Vk����d*ߵ�-@�Z�ߘLqU,�;���>9�ym��4S�V��2d��Q�^����T�y����Y�x4X{��M�T��[���Y��z{��u����`[�l�|������F��\t��k�����T�o�u��l�=O{�L x����T���3�35���G ����ț^���93�4����I� ����{�nf�e�3�9;S�nmh,�c�3�|67�R�$D�+��z^&��61$��u���9K2���Ȱ�Ķ���,-ʄ��K���m}ݔ��LD_�3:����t���L\56H����i����eb��,�X�G�f{�9+���� + ��fx��L"�c��bh�u��ff�$s��ݎ�?>;�$:5��a�s�K���Wr�@ �x�/.�$�y��ly���fj��&lw�#���$�����m�sc�f�mō��Z�x���g�o�����lw��i�2�ax+� P-~v�ع�����6C +P�v���%E������j��NqI&����T��܂}f��-�*��ir��ř�5��P���9����6t# P��o����2��w�6@e)h���O.ͤ��C�7@���a���eR㝍�9@��oz�UCR�x|��;X��呷[�I��9���v8��f�����>@9u?o�'�3i�� �P9;_��g3iv�Y�PV�>yi&�f��P&{�=zƲ����R߶:��/�+�t�C�&@���K�[7�cq;s`M��Ӳ%y�X�M������c%�.3;�V������nZ�¼m����ݤ� /�i���� �O�i��C��Wx���Cu�����-k6����o�6���C- ��z����~�[��ҿ�u�G �� +��4`�5�L�h��i_<v����xU��w�64w�4߶���U�r�����T���2��BPNs��R��w��j�w��R'��'~������T�$��'f�����c6�Q�ا,]��+ǧm�( ��ʒbo[U�[�U@�ߴ�����ܴ�t���f���3L�W���L/ [�m�ѹo(��rO�)d������U%_�|Ed�F�t��GU���L�Jí{��v�O{�d���?���4{5�m�Y�x�r��1Z����Ҥ����/}|�J�^�zH��{_��u^�_f� �������k��@B59�cf���ZsH��'==y��֤��MC i�������i_�4�$i{�;� +��=�!�LG )���`��<¸ƌ 7�}�wTv(36/�� +lx�?[��v�&X��_�����|���zݯ�����S����{�8NIG6�, ���y�?[�wEmS��厧���rN�e{��@��~� �GR|�b,^���Ir�IԼ����W9Y�2q������G�T���M3���������Q��4��jH�s^�<�oků�a�t8kԷ�tp�}�O�@u������{�T�����#�#� +�5���[��O�n����I T��� ��q���*%���@/ �o{���d�%W��@Zk�_�6M�f�)?3��*�|Ӄg���M�q� +��z����~��iT����y�3���ES�L�v�;�?uS�6�;Pi:���g�5%V\�g��"��-�k���0[�R�|���.C�3� +���t}�:��5������4���l����4��oa��w�b�eO�����k�/�i�C���Q�w�Th�}�X +�r���v���(�������n���Q��+O2Ӛ�P&MoW�|�a�ʢ�]��:J��k1Pm�/�l @i5�[k��IPJy�u&����L��s��䇾�N(���m���G��'�����/������f��K~jB��֤���=�T4���f��d%�`�Z6���XU�2��`u�,Ҕ�ԓm�X����$�p���U{���U���������X���`�r���qamVj�q*��X����+u�o?X�7ZH �k S���Ub��Is�#�W��������5����?�}�vd����/Q����D���n_Qӛ�#;|�)�g���S#���$i~�j�H��� .��^/R:�C����G�EJi�����Z�R�bK���|�H���������1�H�`]$3�?m��N��u�v]�)�?9 +��"e����j��9E!R�w�f�]�;�!e}������<�)���t��]�l�v�l�)�a�DRoO]H9\P[v �ꜫ +)�m��)��~MHy��/=�n-_Ԅ�������kEH�l/>�j��A�iR]��4�] R^���X� 嶿Az5����eK��j������V�BH��,C�V�@*��ͅ�)w? HE�<�/F�J��ԀTȢ�b�T�H�|�0[H�����h$H�B��~�|A�����q�H�Nαʏ����l!ur��}T��d �&��G%���0A�֏oT��V��RO�Q9����vz��1�a��.��=*ɐ��ir�ڣ�\(O�"�k=*��n)��Q���L�Qi>�/U�����{�6S�Q��,�v��~t�mGe[��pA6k}�sc�:���Y��8�����U������f.RqT�E��d� �|���D�Q��j*k�U��QTl��xF� [��>�m�Fu�w��A6(����7U�i���IW�I���RgT�'e��x��|�K��0�t��Īӡ��n[QSFw�AH�ڛ��7~�KM�cC9�����k�{Q����,H���1��S���qc�GH��mμo�b�E�6IH��.||T��"����b ���/��,"��E,!z�+�yn-��$���"�>� ��'�`�l.����}0H8oזL�o��ڊp��&�w��"��%�ZW��<ф������Jф���U�]4!�d��"� �e����"��{D���+eE<EG�&�߀�PV�3��lBt]��*�)��lBx�.WV�3�Dل�6�NWЇ]��{�"z��pBp�;����&��%���w��N��2UED�8���CS�w� ���5��F:!�41�`5�N���o��\���)*B�fK��Z,�T�4��xBh��)*b�!��ox�i�;X[A_EELC�'���EEL�'�V������b�l��"���`Ahy}�A�S+GB!�-?�S��u�|Bd9�)���\@!�mF�)bZ�|Bh��)��{�|Bd]��S5���BdW�)�*yP>�(�Y�P��'��� +(�� a�[_B!���)����B`Ǫ)��YB!��PM������L�RDUt��(B� �25ET��P�k�o�a=�HD!�k�k)�:.OD!�z��a}���B\W�h)��/�`�p��B\}uquQ+o��"�wE�:]G�%" +a�N�Q�U�+B+�$E`c� +)DU�E� ȭ2 +Q���li!�����Q�Q3!����U�-�KH!�V��(��(!��r{�("{oc)���{CE�=R +A���l� B +Au���lD)����P�v��l!� _�PD��;XUo Ehu�R�����7S�����S��k +��&tS���K5��VOL!��o*(b�UL!�d��"���Si����d.S��Bb+����' +���̕S��W��l1���?�O�6���BH��+(b�NL!������u�B:F?����b���m��b +!���m�mb +1�QP��e;1����OĶ�1��>PP�6���BD9��'b[p��BH��!���B���~"��}�Bj0DAZ�Mb +1��ܛ^ᅘ��YAڼ�b�WA�]9b +!5\A�;��b��A����$)��Z=����b +1�PC�+��bjiBh3��R�E*��NR�ٓ���l"�ԱsT��mc!���<��l�.B +Q�hBd��(D��EE`�4R��x{{�� +^�Qĵ���BX�}���kO��^+QR�uv��Z��뾦" +q�\���jXk ���*�RD�d# ���yBX]�]I� � +� �RDu{����RD��_�Chϩ)���J>!�m�Qu�Om��"�r�"�ZM���"�XOӲ��B��'&�nc����ݫ���|Bh�� /Q�!�Y�[�A}�\@!�n"$���"khBTKz (D��,=EP��+�� �mj���P�l�iz����-�X�j��>q�-D��5ET�`Ad9wk)���:MB!�d��"�:K(���"��J(ĵ�WZ���z"{\K��]$��s��"���Q��O%Z����#��N��E\c6Q��Z���/�VׅJ���ϕQ� ⚶��BX))���G��#^�"�E�j��lq{����Q6RD!�6*��~#��]*���חQ����"�Q2 +Q�ܢ�l�UB +a��,�Q�h;!���VQV2���BP��([�_H!�:��("����BP��QQD�ZK)����4���G�T�I*��w��R����5���(��X Eh� +�BʽDAڂ}�b����"�W:�)��OA�e��B��cEh+vS��&El�'��v*(b��,��V�Dp��)��u�~"�O[�)�t� +El��Bn@&�'��ON!����'b��O��&_�'�{@N!�;���� �Q[ݔ�� +��,�"�Q�9�� +/��4[�_�~"���j�H=���!"ޢ�*X���n�Β +�F;�Su$�=K;ݒ�%��9K;��n� +�4����� +�䟡���LQ�x�LPN��y7Q�x�c�ѕd�l&�N�O��/�nr�n"�9��*��a�r"��֗U�&�d�D��G�N�ẉ��l.��麉�(OV!�M��&�:Y�p�VM$��d���o���(��E��((��Fo�&`��� +�\�L7���5V�����$<B�_X!�~����w��B0mF�&�`��� +��Ժb�j"��˕W�e�1��$��Ki�`.��D�YZ!��4��{G�@0}�k&�`��� +��}��H��W��4�D2��X\!�Ɋ�D(9TZ!����y'q�X�TL$�͍�B9\/��b��H�)�+D�s�^"!��!�R0R/��W�2��+D�w�b"!���;��p�^"!��/�H�j��8M`!����%b�����o�I,��9�DR\V+Gd!�C�� 1���B ��RK$ś�$9�H-��nX���j������B ',QK$Ĥ���zV-���X���z�dxK\!��/�%�a��B,�~��H����b��/X$�����mB��_X!��o�&��?��^ ��� +���g3A�� +DH`Ӟ�jW)���\���i��kl)�%���&�~Ħ� ��BU��A�ti$�ݛ6 ����[�oI�C_��[���+��� ��"�?�ʧ��i-Byֺus��u�E��sg��a��颼�Q�K_?(_!�r��`Ԙ勿�h})����+1jF��AH��QdԀ�S_:���� �Ŋ�߾u!���A�Q�f�w�/��٠{�F����|���R١�@�F5��x߮"�c�Ez�j0��=��d���VmT��8`a�l�c�v�JM�}��|eY��} +��S���oY��J�*2�����d�UC�D��wY���A6�9M�Q�^?�Q�e�,�w���rM��ơ�OUxT����D� �G�(Z��)k��ǁS���|ބ��'H��t5oҳ���N��ꏊX�Ű3� +��s����k��Ԟ>B���u�!�E��yIQ ��?�B���@RV�<�g{(O@l@(�ۺC.ڽ�����.�ޘ���C����{�D)R:�q����Z�TF���_��?4X3�F�^ݥ��h�k�Y�'�iP )��xD?��G�g���P`eڪHV��d��H�*9w)JV�x,[�lO��V���䧊捼��l��Wp���G���`�kֱPc��?}tS��J�εJ�=������,@im�Pq�w�^�qwq�ʠ�ժ�·��j%@�l5C}�����P� �5 +4͖ >s��b��G���hj �p�6"��SmO@R��[w�P[����q�*M�?�ס��TH���4m>��Z�*l��j�̻�k}'B��f��%��ء@e��$k��/oo���9 )X< +>���T�=&���V8�����@��a���oG_��IT�n��l��3f�f8PeX�h�Qј���4��*�y���>�r�6�6P�.W���7��k-�rgi�l2��#76��jq�' Yc����{+���?_�f�Oݮ��T�;JToۺ�@�Z�P�&ܲ��l[�L����&�ГZ4�g]�&4�I�i�up�Pc�Q��T��]�z�ԠzKTq┬u���.P�r/V��R\�u��L\��5S%'Ȣ�/b�!䟧���pڈ��MY ���s"z����MW ��>�9��#�3A ��Dݘ��t0Q�x�� +:�g��^�=�4"�8FI��z��[��@P�g��F 8b�l�Q�:������h�����Ѽ{�6-ML �-�Qؑ|�۟�.0-�$�Pg�1��u|�$E��v�ٲ��� r��`��r-@�l����Y��/�(Z ��-Q�5gE��˚��@"m6R�א��_=��$w�L�ׄE_�x\C�H� >��տ���K;�{@�]W�ϫ�w�e���v�F��wuG����f�����LtFW3��&��j��zxdd��V��������5׀�Ro�v�b_�s�&~�d��|�z���}ed���:�ʌ�x�~�d�s�|���ޝ��5���;U�W�aG4��ߺ@v;Y�W�W�Wv�e�����JTR\��&� +9�����h���y��u&)�ʰ|���:�N@����+n���3���i�����}�I��ii"����B(y��m�" ��y�"P��߹��F��R������'nj��)��5KA�}��Yۛ;@�m5(�ۺ/_�{H���jE(������Y�w'�XJ���ur-��6 /XJ�S7lj����)E��5��M��,�?��%�Ú�[=�c��f +�O�Yj�X�Ni��P��l@^�F�BI��۶4C�V�V��Y��_6;�V��0k��.s?>o}s`��[h���}�9��ż�X���-?�p���s-@i�����/_��P:�GX8�aګ��a�Pz�}�����[kc.��E�{���☻�o��~�"Ջ�����̟u�!��o@�=wg������>2�]�����rG�r���a�52���w���}�5��.@E���ţ��zN��{�i��kς\CP)r�N��3c�lm�*M��iX< +�}����T�_���c��a�40�����!��3>��a��U���Y������T�d�,]<�}�����4y"W��9{cP��ʺ��.x��}�X�*��,��n���U�j�ߒ�Y<�<xԖu )@�l@��-��s���:����]6,�.��}+�j�$��9챮G��խd���n��P��?���c��q"@�8rFRp��~��Pcj?��������=���YGMO�ƣp�M7����D��g �i��"8bfb�e��8���y9!����o��p��sN��<ܫ��啒���'�t4N���(����S�j��"Zv�X��o�of��b�)�A��o9xc�א�O@>|�� � @d]�C������D�L����k���cT���4����/Z�7$���x��cęm��/;@blb�}�9�H��k�P���z���X����œ.hn�����;j��{�0� �q ���~�hW �� ���ǔ�.k��$�V˪{�����;@�5��z�q�1�\u�,��wշz��gKW ;4���>|���zd�]fV����e��w��I�[�|�2��M�\i�,���}[��c7i�*d��۪p���-��z�d�����ţp@��u]_����*Y=^8�Q�e�� ȄJ_<&�k�g���v��ޒ���o����+m�(Z�ֱ�\Q��x���՝7�ƍ]M�����JX=�Mz��� ]�Tp�X<i�m\G����M��P���?s�hЊr/��v{�:� @:u�]���{���H�NJ���ӷ�w��ҬӢ2�/�ݥ��v��յ{o�Pk��2F;��N ]2��wgiW���wl�r�/�J� +��˶Z�#s�~��5���[����G�Z���cd���r�Y͡�����+�N���e��>��`U +._��l�L��i5���s��hX�:��D���V�U`�6���c������4��{2���p9�(�M&}�[�[ǵ���j_�w�q�������ڡ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������}�� +endstream +endobj +219 0 obj +<</Type/Group /S/Transparency /CS/DeviceRGB /I true>> +endobj +225 0 obj +<< +/D [217 0 R /XYZ -13.423 915.745 null] +>> +endobj +227 0 obj +<< +/D [217 0 R /XYZ 29.788 737.428 null] +>> +endobj +223 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F44 228 0 R /F45 229 0 R >> +/XObject << /Im2 220 0 R /Im3 221 0 R /Im4 222 0 R /Im1 218 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> +endobj +426 0 obj +<< +/Length 26 +/Filter /FlateDecode +>> +stream +x�� +0TH/�2PHW0Pp�I��p; +endstream +endobj +425 0 obj +<< +/Type /Page +/Contents 426 0 R +/Resources 424 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 230 0 R +>> +endobj +427 0 obj +<< +/D [425 0 R /XYZ -13.423 915.745 null] +>> +endobj +424 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/ProcSet [ /PDF ] +>> +endobj +471 0 obj +<< +/Length 2380 +/Filter /FlateDecode +>> +stream +x��\�s�8�_A�Ӹ���to��N���Ml��C��<斁��{]u���4��L9vH����h�O��n}����ެ�C��Cޫ=��0\?��q���3D�{Jz{������jq�\�K�o���=]L��x0��t�# ��k�vu�1��^�c�+����ā�5q�Cʈ��?^�m���^@��tݝd[�탃7s��@�vbooƶf��]a�:�2�B�x"�,ѭ�Z�c\B�T)ĩi�*���춶��t>��� "cJ,B]�����1tJL���;����8�"a�>�z&/�*���IONeQ������g���u�o{x�i����'���S�w�f���@�r�ۆ��c�K#¡k�n5�:y�� ���p��G?�6�)j9SI���y�ɦ�m�]��mW��y�|�)�,���,��!��(*�j �X���@��g'�S��@��S�4����|����[��g�fNx�"`*������ʻ��\��B`���@����+��2ym�,/����#�8N�Y~����>� ��$��A�x���Y���e��*n b�:����G�U��b�9�-:M��b�f�*Q��+q +4,��aAx���H+3Q��5���y�E~ !�^@��!�K+0k����Ƭ��SY�Y1�D��Q��I+�2�%��D<�x��E__��n��b��ѩA���8�d�n��c�����Mm�g�"�(J�#���q��<�P3���M��5\[�^8NwM�=�`;Y�6pmA��5�N�h�8|���yJ�g ���n�3��J��T�?NÝx}!Db4�� ����R7�)V�Mg�2�`D���� F�X�Y/�,�VA��S��<8��\_�j#U��O\c&�G�Nk���o� +�6��w2_��VPY���X�}t��B1dZ��E��)���Te�П���?�T�(�@���S��Ź�_n;ߕT7���������|$�~�Ҫ���bJ�NG/�ûq���2�K�Oo�iY*�E�����g��O�΄��;�EG�:�b�&]*�Ey-�9��E����2��� + ��*�}MT6�9x�����,o��h��vF�Ȉ�#!9D1�9_H�Ƶ��GDh%]�n���թ�2��kU6*�6���X�S�e���xR?q�& ���ټɓ���u�4<*;]��4�RE�˳r�����"����>�<���,��j��V���v�����3�6_���8�샮��0#-~l��$���3=��fQ��s�y:ŏӯ��0�![�P�9~�~{x�t�3b��LĽ�u������*�vX�d�iZ~�q�J+�Mz�<��� ��թ�����cL�P��$Ei��I1sƍ��I�6*I������Os���>���N���)嘪%��I1uϔ�i�]Y��ʤڴ�"��N8F�ץ�y��ɉ#�p�!�o��XD��AK-gg��f1?�S՜W��ڨ�68�dJꑲ����K��^�h?�����ms�2�7U�mP.��|4F�;2R{����*�B�3T$��3�fL��qN�a�6���A(t��L���̜��Y��Z�.�a,�����52���`:�a�� �T�l�������E6�u���%���K�c��) *g��ō�Q�<^�03����jȬMt(��XlX���.��m@d��/���:L��-SM����d�`P�l\S�EK�:�;K�5���R;(��Ou�|g�_H%����A�Ԉ�_YJ��N��yI�r��[��~H��ߌ +�_ڭ���l�r}���lF��PO��A�g����1"���x8Q���Jw����b��~]5���Z\���W�W���묾,��(�L�wݪ�z����T����Np���ZV��ۣ0F~g������_��P�k.�aO"�v���ܮm�g,�P�3�t7�s�;������&�;����x�A*c�� ���{��ͷ�f-�a��'���;��w��4�8�Hh������~G�E�������P2(�|sw8�i��];�l2����[�W����]���M�U�������_�!Ӷm�#5p � P�.�mN��M�s�~\]~���M��8��Y�z��c���iyf��<�<��GLk���7�Wx�\��/���l E��P`}��ځz�iu�ܲɫ��k�B�m�F1���s�Le�K�j�M[��e�$ɫҽ�%j�.%ѷIqc��fբ���- &��E^f�����\�rڤ�G�DN3m��PE���S&i�f�e" �V6���k�۽0I�֯�ɫV�uOuH�<[jڵm�Y1m��� v!U�f�Zެ�8}�˞a���n�k��t��%��w +endstream +endobj +470 0 obj +<< +/Type /Page +/Contents 471 0 R +/Resources 469 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 230 0 R +/Annots [ 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R ] +>> +endobj +428 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 632.024 189.599 644.56] +/A << /S /GoTo /D (chapter.1) >> +>> +endobj +429 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 618.633 234.697 631.136] +/A << /S /GoTo /D (section.1.1) >> +>> +endobj +430 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 605.084 268.668 617.314] +/A << /S /GoTo /D (section.1.2) >> +>> +endobj +431 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 591.534 221.126 603.765] +/A << /S /GoTo /D (subsection.1.2.1) >> +>> +endobj +432 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 577.985 247.21 590.489] +/A << /S /GoTo /D (subsection.1.2.2) >> +>> +endobj +433 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 564.436 172.024 576.356] +/A << /S /GoTo /D (subsection.1.2.3) >> +>> +endobj +434 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 550.887 303.413 563.117] +/A << /S /GoTo /D (subsection.1.2.4) >> +>> +endobj +435 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 537.338 210.479 549.841] +/A << /S /GoTo /D (section.1.3) >> +>> +endobj +436 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 525.774 154.428 536.019] +/A << /S /GoTo /D (subsection.1.3.1) >> +>> +endobj +437 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 512.225 207.773 522.743] +/A << /S /GoTo /D (subsection.1.3.2) >> +>> +endobj +438 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 496.69 251.453 508.921] +/A << /S /GoTo /D (subsection.1.3.3) >> +>> +endobj +439 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 485.126 192.042 495.371] +/A << /S /GoTo /D (subsection.1.3.4) >> +>> +endobj +440 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 458.71 194.453 471.06] +/A << /S /GoTo /D (chapter.2) >> +>> +endobj +441 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 445.133 135.893 457.053] +/A << /S /GoTo /D (section.2.1) >> +>> +endobj +442 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 431.584 177.741 443.815] +/A << /S /GoTo /D (section.2.2) >> +>> +endobj +443 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 418.035 165.61 430.266] +/A << /S /GoTo /D (section.2.3) >> +>> +endobj +444 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 404.486 193.341 416.716] +/A << /S /GoTo /D (section.2.4) >> +>> +endobj +445 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 390.937 215.933 403.167] +/A << /S /GoTo /D (section.2.5) >> +>> +endobj +446 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 377.387 153.675 389.618] +/A << /S /GoTo /D (section.2.6) >> +>> +endobj +447 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 363.838 332.856 376.342] +/A << /S /GoTo /D (section.2.7) >> +>> +endobj +448 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 350.289 333.544 362.52] +/A << /S /GoTo /D (section.2.8) >> +>> +endobj +449 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 336.74 251.661 349.243] +/A << /S /GoTo /D (section.2.9) >> +>> +endobj +450 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 325.176 126.195 335.421] +/A << /S /GoTo /D (section.2.10) >> +>> +endobj +451 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 300.047 70.177 310.685] +/A << /S /GoTo /D (chapter.3) >> +>> +endobj +452 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 285.183 234.119 297.686] +/A << /S /GoTo /D (section.3.1) >> +>> +endobj +453 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 271.634 318.424 283.865] +/A << /S /GoTo /D (section.3.2) >> +>> +endobj +454 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 260.07 255.926 270.315] +/A << /S /GoTo /D (section.3.3) >> +>> +endobj +455 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 244.535 282.97 257.039] +/A << /S /GoTo /D (subsection.3.3.1) >> +>> +endobj +456 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 230.986 336.326 243.49] +/A << /S /GoTo /D (subsection.3.3.2) >> +>> +endobj +457 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 217.437 411.511 229.94] +/A << /S /GoTo /D (subsection.3.3.3) >> +>> +endobj +458 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 203.888 310.242 216.391] +/A << /S /GoTo /D (subsection.3.3.4) >> +>> +endobj +459 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 181.399 167.759 191.808] +/A << /S /GoTo /D (chapter.4) >> +>> +endobj +460 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 167.866 158.333 178.384] +/A << /S /GoTo /D (section.4.1) >> +>> +endobj +461 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 152.331 184.155 164.835] +/A << /S /GoTo /D (subsection.4.1.1) >> +>> +endobj +462 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 140.767 199.919 151.285] +/A << /S /GoTo /D (subsection.4.1.2) >> +>> +endobj +463 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 127.218 174.446 137.153] +/A << /S /GoTo /D (subsection.4.1.3) >> +>> +endobj +464 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 113.669 144.13 124.187] +/A << /S /GoTo /D (subsection.4.1.4) >> +>> +endobj +465 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 89.194 204.741 99.603] +/A << /S /GoTo /D (chapter.5) >> +>> +endobj +466 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 73.676 260.202 86.18] +/A << /S /GoTo /D (section.5.1) >> +>> +endobj +467 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 60.127 204.752 72.358] +/A << /S /GoTo /D (subsection.5.1.1) >> +>> +endobj +472 0 obj +<< +/D [470 0 R /XYZ -13.423 915.745 null] +>> +endobj +473 0 obj +<< +/D [470 0 R /XYZ 29.788 737.428 null] +>> +endobj +469 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +488 0 obj +<< +/Length 1287 +/Filter /FlateDecode +>> +stream +x��YKo�6��W�(%çH��i��.�E71�C���UؒW��]`|��dˎ��i��`� _����'�s6����i9�h�(�@1(�BE�*bCFr��B�C��O��@Q^��4�I��v��Z�i��V�H�P��1�p%w5���:)4a"F�0��J��Ƹ!�x��Br����^�_DPڼ�N�V�q��8���"S��}ލ>�p�b$6��V�.J9�DIc��^mnj�.Q�A�*|�T{|������Y������F�l�矏g�!(� Vj�F�[��A��Gt��e2b�Mt�2/*���>.Gg�Tu�kcaO����� ~D6��o��� ��M�"8Sd�� +B�H��j��������TL�f;N�\�|��UnZ��4�B��*��ڡC㩿�������n,�͡p`�rl�� s8�*X�#|�������O��y�Z�� +~t�G�X2�!��;�BZ�����KF�H���ps@ +@�wJ�)���}钻4[����98U�J���{p���� +Nx��^T���℅u�q:w�reR��}'*��t��(��,�X��0�a=�a�|UJ{ܰ`}H��N{�N��vH�W�=q�cè��d������.ɳ?��q� +�~<"����&O<vt@=�1y�7�H�*���=��<��b���^��N�wtHѧ ��0��_�),G�E}a���z�E���k[M����V2"��+A �Y�O�$���I�| [�Q�JW<��k�~��G�j����_�ӭoTy(��8�:_Wѷ���v��*2�u��hkV�{W�<Ě���f4T*��.cCq�����o��a���-���H�����pH�g0��⬓��D�u�@�+� +*����¦���p.9e�s�-u�-��D0���)%4虆z��i������J9<(��ֶ1�@,�eG��&h�wF��dܙ��[���>A�ѿ;�;[�̻F[?nj���8F��pㄚ:1�I�'��]]�$X%aEM�6�$�&��F���u�k �����m ެ�����PW +7�7��[g���J� �:�8h��jq�k��ɔ���|��t:�ʦް�OД&�˼���I�MCs�}�'i����`#��r����tnY�xUl�L�&i�PQ���3g\�a�-c�m�l�7������2m�u�̅�{�y�W�Fv���k��=y�N����F-X�tE�=���l?xvss�ܕ��-��|�n*Ax�Z��� +endstream +endobj +487 0 obj +<< +/Type /Page +/Contents 488 0 R +/Resources 486 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 230 0 R +/Annots [ 468 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R ] +>> +endobj +468 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 728.179 207.184 738.424] +/A << /S /GoTo /D (subsection.5.1.2) >> +>> +endobj +474 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 712.644 218.977 725.148] +/A << /S /GoTo /D (section.5.2) >> +>> +endobj +475 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 699.095 204.752 711.326] +/A << /S /GoTo /D (subsection.5.2.1) >> +>> +endobj +476 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 687.531 207.184 697.776] +/A << /S /GoTo /D (subsection.5.2.2) >> +>> +endobj +477 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 671.997 225.653 684.5] +/A << /S /GoTo /D (section.5.3) >> +>> +endobj +478 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 658.447 204.752 670.678] +/A << /S /GoTo /D (subsection.5.3.1) >> +>> +endobj +479 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 646.884 207.184 657.129] +/A << /S /GoTo /D (subsection.5.3.2) >> +>> +endobj +480 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 631.349 296.584 643.852] +/A << /S /GoTo /D (section.5.4) >> +>> +endobj +481 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 617.8 204.752 630.03] +/A << /S /GoTo /D (subsection.5.4.1) >> +>> +endobj +482 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 606.236 207.184 616.481] +/A << /S /GoTo /D (subsection.5.4.2) >> +>> +endobj +483 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.156 590.701 230.486 603.205] +/A << /S /GoTo /D (section.5.5) >> +>> +endobj +484 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 577.152 204.752 589.383] +/A << /S /GoTo /D (subsection.5.5.1) >> +>> +endobj +485 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.247 565.588 207.184 575.834] +/A << /S /GoTo /D (subsection.5.5.2) >> +>> +endobj +489 0 obj +<< +/D [487 0 R /XYZ -13.423 915.745 null] +>> +endobj +486 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +492 0 obj +<< +/Length 2556 +/Filter /FlateDecode +>> +stream +x��YK�ܶ����[�`� ��,�a�b[�6�A��Cbg�"��ޔ|h�/�h�NU*U+ �4���ss��� �^�����'��@d�d�2�$�EЩ������"��6�I"����|�6�*$�3�F��E��t�ӳ����( RɈ`�05�`�K�I#�$����Ϡ .2�tE"7�{1�Lg,���& +^i���O�qI���K0��x���RdD�2K��j|�8X�2d#*"�u^�5~J�y��_��8)���,1�_�^ݼ��d��4 n���T� ��߷e�1|���x��?���ݠ���n�z}�P���Fx*3��4�?�F�&(�vic��QP�:��3!am�r�Ab���\�z���L$��l�ć�ߢ߷�:t�P� oǪTV����S� Yp +����"$%4��d,%��(��A�<)b]��Ŵǰ�D1���D��<#Y� �Uw_�����可q�&o��q��~u$��Ib�� -0 v`R��c� {{T�W����2E��tX��{�Z����*q�����|_;��N��ةn�jN +��)qx����G������֨��oT;X=���(c��D*ЬF�_���Z")�4�m�4F�wQ,���Ӻ�EE��`�f���* +��͖կ�G��pY��"8ןTӔ�6���ө�<���Ru86�k�[����vd�{ޜj���s�Y{"�$�����ޡ=�dhP�2�H��p����(pm_����������ڪ��]��<�� ��cs2b5��3η�k�.$���\�����)�Q6�D�-a�-t�v�m�cz`@��r�P�%�Z�ā����'Ne]� t +���U]#�����Z�T��|^�ﵵ;� �i� +_�$���x��c�KYh2����TW�.��<&�9��#}�����i��*�PI��*�![P�c$��O� ľ�k4,���#�4�2�o6�$y�r,Ɛ��a̻̭�|��N`� +� U��n��W��̄�0�P �ʝ� |�'1`"�h���Y��c��5��ӝn<sW���m��Q�b��R@����� +;N���"z���u�XV����6���{q�ۃ��{hM�a}nc?y������&�� +�d�g�$0���HB�F�v��H}D�Z]�΅./�����������ڍ��j��G �d\��z�\`�&�f_�e� ���kͣ��4�G��af�2k���@h{f�IP���a��hVO`c���AA�XD��3G���\���x��� +l���I�j��M@���0ţ�Gyw���ڐaTj��p��c+�D��Q�\%�p��dyD4�O� +�t*�V�`��`�7c�I�ާ����hu\�y�5tU��ruƝ2�t��9�썘�X���rs�J0I�s� +����M�t��o��&��A̺I�Ц��TL�x[�E��[��:���Z�C N��I��W5��c�ݢn��p�p�41�*�UA�-B%[�c��ڨ�C���B�-�;�LQ��*-���@L��i��ӽc�� _�MG`��2D���QX�8Y���I%\U +�x1*��|7���/R���j�Xmc���eKH��Y��Y�b��b��xd)�4v*�߀�ۼV1'W�h��*@�>�J�(�آ����+��5��x���t���)&(����w�s���J�O����Ƽ��|�;8��� �UA�p!nӵS3J�t>�+p�-�cV�{W�I�*��w�����qU���L��-�t��do���x�H[R@y�,�\���oM?����g��اe�X���M����G��y�Ku|,�9����4�q_`k�ę��5�lQ+P�_�6�w��Ʈ�z����>9��X���X�L�:^�z����Q��v�W:51�{�"�"[]裮�{',v� �2��Ȁ��-�TO���0x�_��l���b�S@@ �^<X؇�3��g���ۢ5wJ����,S��.�e�#{�Ibj�_�bY��?�_Y{��~��˂��b@�|b�c�¢�m��D��N �W��gv���U���]����B�;����=qg�w��D��;����-����w��{oÍ� ���|��-^{S"����LO���� &�_<��[y_����$>ڠ�e;��@�WQ�{���D�3(��� ���-�x� �L +���������o��R���X�Ep����6�w�]f�_6͟[���o�����F5���`u�~{��<�p�J�+s+Ϳ�h�?g�餈�T1�����/s4�5n����Ǎ�٫5懗��fRf� ��v.^vs��%�?W0l���%�����o��w8ab�]�8��<ZM���ء�|�Ɨ9�8��Z�6_��Y� xo_P�83�I���ԩS�˱�H2TP�+��X� �{��n/�� +mlɂ�N�-W������ܰ���@w~{9r�����w3h��jQD�a"5?���U�b���?q�� +endstream +endobj +491 0 obj +<< +/Type /Page +/Contents 492 0 R +/Resources 490 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 230 0 R +>> +endobj +493 0 obj +<< +/D [491 0 R /XYZ -13.423 915.745 null] +>> +endobj +5 0 obj +<< +/D [491 0 R /XYZ 29.788 737.428 null] +>> +endobj +494 0 obj +<< +/D [491 0 R /XYZ 29.788 645.141 null] +>> +endobj +495 0 obj +<< +/D [491 0 R /XYZ 29.788 645.141 null] +>> +endobj +9 0 obj +<< +/D [491 0 R /XYZ 29.788 645.141 null] +>> +endobj +496 0 obj +<< +/D [491 0 R /XYZ 29.788 483.33 null] +>> +endobj +497 0 obj +<< +/D [491 0 R /XYZ 29.788 353.522 null] +>> +endobj +498 0 obj +<< +/D [491 0 R /XYZ 29.788 250.812 null] +>> +endobj +499 0 obj +<< +/D [491 0 R /XYZ 29.788 148.102 null] +>> +endobj +500 0 obj +<< +/D [491 0 R /XYZ 568.097 63.19 null] +>> +endobj +490 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +507 0 obj +<< +/Length 3217 +/Filter /FlateDecode +>> +stream +x��ko�6�{~�>*���DR��-�}4��]��ݢ�e&���������o�C�e;�8E��ysfȳ�_~����$�n���x/^�/�z2�,�"O���Bz���O~�|P�D0�i2f����ܚ�Z����*Y��,�b��Ӂ<eO�TELF1E�+�)DI�E����U�Q�_N9@Cأ�:`:�.6�{W�Ǒ}��cd�.�D�YĮ0���I���A�ă(.���V(9�:4��*�u�2Z��'H*�Y�%8�����Pʈ�L��wu��K��Ҍ�}��~���m�: �T���j�����W�8y5"&�hx�2�B���zK��/��ޝ���������H*��X�j0x�Z�x�>��� �LX�F3".�O4\T��i�+���+���T}z� � `���@C&��D�0�Z����TĿZi��}u[6u��U����î��T.���F/��C���ˤ4���y��$�U?�J7�;�M�5<�"ւ�B�(�ZF� +ܪJ��,�6#&K��GW��]������� +��v����^R_W�3�M}�ҡ���J7�Z��5���M��6-tۖ� ���r�뺱�,з?�G�P�� Ȕm��J��@(A�%�ŗF���-��f����Ŵo��� �n� �:v<���F�����t7��������!Sqd)35���9�aYQ�_��5g�]٭�]O��rY�� �����Rߖ�I��@da���p���w,�Ԉ�Ʈ�#.N�X���p�X��Hg{ұ;o���ͦ��V}�|�&��df����z���8���]}k���e� +ɳ��| +5B�Þ~[����Uz ���� ����_M�Q�K]���!`��M�(�2�qF��$?hT�ƶ�S���WG�y!0V����v����N2��<�0B��m�i�d�9�Gh�tFd�(���U�fW�����m}����"o�#腜��m2e$c+#�vR���0�H���1�i֘���7�� +5k� ��V츱��=ba7�P��2e��efꧦ$�T����/��V~YQ��M2�w����Q��k���X��f�ͽ�^bC�E^�0���i��^��ڊ�m�c���;Y��\�u}��V����&�i��u�b:[t�F�(lalյ�-�Y����M��b�����$=8�Y�ӳ�E�� �J�M���� +�}Xnjm�<�`�-Pg�(߂��\��W� {gu�����n �rFX'�����g�\��gn-��l�bf"#�wv�D�����a���LƄ��\�OS@=Og&�\:���� xpۆ@�����\��o����mY65S�p���L��b��{b?W�[����0����(�3��4킩��fo����:�c���Z]X鼳��5�n lY�\�rdN�����gZ�r�I>4�Y��Yd�*H�XDI٠���^�(z _ +հ��o�G �s���~ �j,X�;Xjw0��Vu�m_NJ�\�Q�7��UK�9c��$.)JA&Nc��i1c�Un��[��]a}���zI�62np4��fTo)��R�CBP���z� +��6h��쳥����*��1���m�Xkz3�<�w ���rN�FB��hm��гD�j�`��Ao@6Y �=k??����:7���!5�2��^�q.R��y2/�p��]F$���T�yuR$�J����%�Q��R�Ƅ��S����nJ&��¬�I�!1�MJ�硩����Ln��s��+R�S�G���dD�[ь���X�.�t��O��!8I�3��W����4��!,�#��&R� p��"�����=}�E{�W���u�y�_��a'��v�!���~oO<���ش]�1Y����w��q�>��}��X�H�q�G /�(�i{e�8ޞ�L��9(�f}�>���k���>��>����Ü>��*�����dB�!�/s��)��Q�J3����{D� +������z��[�Q�Z�����'��#��Y��)�GS�>T��6 +l��<��>� ����&rXmX��m���;�Н/ ��0��L�� ��5��E������*[z6z�+��V*��w���sYk;��mWI����z�]~��ҍIe'�-�4��$)-��A>��F'3�.�������0���ifu{Y����-�Z3�5o`Ͷ�_ Os��D��� �jG��2�nݽ���&(w��؉���-�y���i�\?"ď#�Q<0}��ҡ-c�j������^i�l�y����6-�ņm�亯�+���'���w�%����b�f�x���{wg���rHT���;:�p�?_�B�L�# �]ʧ��_cn��a�q�k�(��#g}�y,�餱��AR��ƒ�f��HRF�;��6*(�|>C�{X�"�1� +��:�c�y�R�2�թ�Z:2����^��>�i��I�������Yy;�J���vm���z��73��M�j�s����H;��ʖ�ƶ����$0�[̝7K���2oɘq�S�� "ǹ��__��.�L�N0?��_Q�����Lk_�F��k�ٹc"4����M���;�}W���r��z���*s���5�؛>���r���3y�7�X����9�J��4?�Kr��Z$��X7��ÌG�����wy���v���.:zA��b�Wh�"�����C��a�I���nc�3`�Y�b��`\^���/�����\< +�� Q\�*�1d;��"GV�I!�b^�]��TsH 3��WO�˔�K���*����q�!��*�a�a"{�:��zv ��`qBW���#Ӽ�뜘E�p:��h2�{�H�=G�l��N���`69���nX����`�?�<�?�B�BGǥ��� a]��P�T?�#�o�.6��گ�#�J��)�R5�|8h�c�m�����;��"DMO|�_�GV_�Aa������֛\��\�.A«�?n?��md$�sL8��)oV�Ђ����X��O�p�7��Ǜk���l!?��fB���u]v���]��65��}��5�U7v���r���[r6���"��͝v�=�݈�8}�WA\��C�S�����M_�wd�nu�%�voJ 9�0��5J�I��P��� +endstream +endobj +506 0 obj +<< +/Type /Page +/Contents 507 0 R +/Resources 505 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 230 0 R +/Annots [ 501 0 R 502 0 R 503 0 R 504 0 R ] +>> +endobj +501 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [47.105 229.798 169.497 242.301] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +502 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.217 229.798 294.11 242.301] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +503 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.417 136.761 247.853 149.264] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +504 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.213 62.194 343.853 74.425] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +508 0 obj +<< +/D [506 0 R /XYZ -13.423 915.745 null] +>> +endobj +13 0 obj +<< +/D [506 0 R /XYZ 29.788 737.428 null] +>> +endobj +509 0 obj +<< +/D [506 0 R /XYZ 29.788 708.67 null] +>> +endobj +512 0 obj +<< +/D [506 0 R /XYZ 29.788 461.522 null] +>> +endobj +17 0 obj +<< +/D [506 0 R /XYZ 29.788 442.979 null] +>> +endobj +513 0 obj +<< +/D [506 0 R /XYZ 29.788 342.236 null] +>> +endobj +515 0 obj +<< +/D [506 0 R /XYZ 532.587 219.312 null] +>> +endobj +21 0 obj +<< +/D [506 0 R /XYZ 29.788 197.739 null] +>> +endobj +505 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F97 510 0 R /F89 511 0 R /F32 514 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +528 0 obj +<< +/Length 2887 +/Filter /FlateDecode +>> +stream +x��[�r�8}�W��I� +a�\����3�JbO�Cҕ�$Xℋ�Ŏ�����!��,��qUW�!w���^\�@�Ey�����7g��!p�%��@!!N�)�p +�ܜ}ܨ|R�Pb��E���.Z�k]�Q�����3K *�PҮk+�3�9~@� T U���(�qp�y�S%��N����1�@��ݹm��h +.ޥ�y�����=��.���/A���[:\S'D��Ы��.�%L�8�Âi_;|�|]7�(�x��`d�"���?�>�x �$���������u_ϝϓ�y9[���&W2+�߯={u�q�p� �B�i���;sx���!�Թk���:���Ĺ���%"��̧��8� �Z8�}z��"<D}2p����û���"��<�o�x.������\�x��?��)w\B8"�9�G��������6�h@�1���A��:�i�J�sY�VБ�W����_���oVIm��Ȩ���&/v�H�aGr�1�%���q��H��L;><�Y�\�*+/:���$9w�d�ߙR�e@&�}Y���,�r��tX�l-��D +J�H5Eq�K�b.]��Y�����ƫ�N��<+�te���ue�����B�>�v���i]�y.M�gyՃ���2:n�T��S���I�"���aS�T$�۞^�e��:��4LЁ%��K&Q]�)��LW�F�o�"���i%�ԒΠӚ�w����G�%:w��`]Tx�(+��e�-���ty�'�o<����v�ǩ�Е,�|����$�wq�cV�l&��6��m���?��#��Oz\�Ҡ� ܮ����m?M�Ҁ��1�]ӑ� +��L*�L�E�n]�(�k���ƣ�p�`�x��� +h� <���(��I4M����O�c�����8��C��A����f?�y�1�:�]F�d������'��+�4�Bu��tWC%�+�)�@)B�"� +���.��`�qG �5��R����荒� oT8i�po�G � ��\�$����1���I-����^>�ɚ1�G�����0Jy;��`�M-ܩ價~[�5��3 V�f�d�t u�W^����"�#�UI������V�06{�}����/�yf�RwSY�I���>�!/Ě�e@�͌҉ϴ���e��� +��*���H���\�r3���Z\�X%��%>*��A{6�"�&���`���)� �*��Y0�n����$��a�$G�Q�C�$rda��5����-®27 �spI�d!3H�f_���V_a��CjcXa��cC�=c~�v�vժ���1�Zb泞�^�yG��DS��e� � � ���=�ycXa��5�����k��ӻ{c�m�������obD`NO���{�"ʶ��!�����7�^���}�C�%�������7��՛r~�xH��(��J|�����y����g�~����^_�����e���1���7p�DPzZ��}� ��]�� X]�pG��$z�����ڷ��`���k��ջ�Eo�z=�c���o�D0rZ��E=6N��=.����{cXa��5�����k���{�|c�����0�;Z�&�@'��z�3��qr=Ρ��{�xo#,��V��z-��z�N�ch�����@�;Z�&�@��u�Iȣ>�Ñr=F�[����ư��k�������w/���j���a�w��M܁�'m���dl�@�怚��ݲ�˛�N���K�P�}�n�v�L�g���q�?��0�j;���"[m1bvj�n�G|���M��b97�M�_�d%��72�+iXA A��|�V����h;�(b��x�wy�%��G +��'tF9[�Є0��k�vW�C!gq)m���ӯ��f�Nc�Dq��)�f�����J���x��m<�)�+�'jg��O�B!U�[�fY��<���q�Ҽ\-��1'0���_q6��]};��Qb�_��ˏ�v�>8 oerdp��Ӻ�%���*�gf��� 9%�oe�T����{^�qa8[&�;�jʰ����rs�s.�����c�,e��������}j�{���c!�Gf[�g[�N������:��-0������:��o�/��$� �'�mo�Ժ�3Z����l]���֬����:c\d���]���� +��G���s@VW>m�mrݟ;����I~S���M�$��E���Ds�c���w��U����Lm����͇+s^7���ńD�l}�ӭrW��EY5�f*NU���ڙ!��0�k���I��m%gJS���� �^��u�m!R�b+X���R���x��k�B��/��[�?����������i�a��>�Ǫ�-�rσ<��ŭ:�22�C]��eTE�qYO���j��=aN벻�Z浩��J�h�/�Y���T�ө,�v���� +��\�����:��v��p�O1��b���&FT}���ü������b�P�8�x+ @�W����S�#��]��;@�C�)�5�{!�ۿ.1�t�I�b��$<����&C�� ���M�َf�N=g͋�R��S�@Rqk��z��v*�ۙs�����n����V�ϷUt�����5��q��f?�UBp��+-bj����,uU�����F?�~��F��c�胇�8�ٽ:꫰��u���ӭ���k�l1%l��"���Yc��Y��7���~����]A��R�LReE�X���{�B���C�y��.S��(�ע�q���(i��c��q�VE���l^�lP�ʗ�9LU�UO�N���d3&��6jAe���]��y�1#o����:,zke@���d%�v�����ެ7� &`|s$�c�}Nx��;� +endstream +endobj +527 0 obj +<< +/Type /Page +/Contents 528 0 R +/Resources 526 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 535 0 R +/Annots [ 523 0 R 525 0 R ] +>> +endobj +523 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.649 568.316 416.641 580.852] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +525 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.995 393.76 259.035 406.263] +/A << /S /GoTo /D (group__bsec__interface_ga51bcd13812ea62b35749284385a72f98) >> +>> +endobj +529 0 obj +<< +/D [527 0 R /XYZ -13.423 915.745 null] +>> +endobj +530 0 obj +<< +/D [527 0 R /XYZ 29.788 596.638 null] +>> +endobj +533 0 obj +<< +/D [527 0 R /XYZ 562.881 396.823 null] +>> +endobj +25 0 obj +<< +/D [527 0 R /XYZ 29.788 375.876 null] +>> +endobj +534 0 obj +<< +/D [527 0 R /XYZ 29.788 253.285 null] +>> +endobj +526 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +572 0 obj +<< +/Length 3284 +/Filter /FlateDecode +>> +stream +x��[ms�8��_���W-2���r�$��WI�ǻu�l�0#����Y`�xk���c1�K�@H�"��j1�G�sl-��ZZ����,�?�űhDQ��z� +f����|T�d��(A>�ڣ�4�/l�a����ȋ���[ B�6���������QL8Q.� �H���7��z����ʬ'��q�\�j��q+�� G�k�z���O��O�ek�(F~�j��rbE�za<��Np�%Krp�PW꺻}BW�9]wC&?�V�]����_��~��.�� ���P�V���/�O�Wy���$g�,+�b��o��� e�G��asr��~s��������At]�� �k��KS�LC����i ��ZZO��x�OL}D�R�����4�ز��4�d��m�`B�������T:�)��������{ײ}�R�����,g&�'�g���$��m�E�R�,�O�b"~� +��ۂɇ8[țrK^���f�&bL�d?��BX��x/���C�X\�1��m^�$.��[�w,^U +mI\��9���C����Fi��YU<��}���!�3VT��JJ�Vy�V��)�J�iɎ�4�]k�آ�4H�q��D�O8�@~��C_ +r����*^�r?��~������;v������X<�]d�ծ9��+�eVۻ��7U��S�a�X�Y¦�Ch[J��Vbj�:_oV�b��ݖ�q��j+L�{V�d���,��o&�Z�� ؤ�r�����jM�e�/>;n�薝��;�����V�O�j�Ͳ����m��� Go�gg���w\c�PJHq0"�;�!<�]n7|��|~ệ)�!��P���U�fݜT|:��К���ĥ�lS����%�REޜ+~��T�ċez�2ٞf��T�7+&�݀e=Ro�@׀̎W+�� �g�����zeC��N�\��3]3�O@G�����I�Ui�ͷ��*Q�C���h�;�ⴴ��e+���KŊ{��q�f�{��K�(��R���u)���tr��Ap��>�;@�D��r����: z��@t�I�uړ��g.��}��� )Q!MZ��k�gN}��7�2��lඵ��97U��@���U�V] \��:�S.E�%m (Ђc������q���8I�?�<+@Q��ΰ�~d����J��=��a� 鄊��U� =�h���Yz6=��+ +�!������q�t�r���ۊ��n����l�����:_�uqğLN��*h��pӤp��A��"����|���z^���y����t����& &�'��92jj��� �n��P��>@\�]�ϯ��ǿ^�_�\^^]�4"��^v��{�]�!�y��'�ɝY�e��x�)X��q'`�<~�^�O�Vw�.��x� �w���#�q$�O����������)@/{ ױ�p�k���@H�-\����:?�p~rq<�ر��!�j����ur'k��E�,5r ��;� 5r A�#wj�6�ܱ���<}r�(�·D�C �#��Շ�7��?�т!��D�x�S��h58��u����h�B��� ��:��5Z�A�h��r +^�B��p̉�)Z��GOD�o�/�t��=۫!��ݺ��T@5X��t +� +���0�@ SC��(���Fi�� ����)P ��)H��oR��Q�`6 :V�>���8�k}L'�aj�}T��G�L5RM� �� t�5BM��1:�5F[B�X�]��_�R�B����^S�G%�X���v?*i�^�|�<��~wr<�~}��\~b��>�֚p3pZ�>;���8��I�����l�ē�lX[�5i��'o����m�G�� =TO�]��yo�0 S�WL�C��Ԏ�`�c�B�ڳ�D�YF�u-@� _��!����յ��4�� �79�'����s�ך=w䟂��%�^W2 O�J�C=��kOb��H���v$M �����~H�����ɹA�-�$�����9�r~�������g���j���=a@C�ǣ�i�N�UA������T�m0��)�k�6���hȶ%����;��^���.�o�� ������������;���:O ��^�N�Q�t�r(H'�^�t�}8D'�_C��@�r�(�(zQZ���F�t�qC0OF��C�D�\&m��]����R��.㲝��͜q�I7�SS�l[2թ��W*e4�u��CZ��!ɣz`:[�� )x&;���-<�H���"Z��>�aJ .�y�Ww��2{�#�ߪ|ayQ��F�1�3T��Fl^|f��ȳk��b �6�Ԏ�d[ĉ*k(���ٮ�}��d���p(�N�潭Ob�Mɒk��{]��c�Y��Y��(ާ "8�Nn��ʝf�j�h'��t|�'bf�W���m/D��'r��\���[�5�tx��mo=�}���v@fO�`jK&uIŸ���5�L�&!�=p��rÒ�����>�g�(C���r5$/~�-K�ʔ�7@�N��;�e�}Z�����9�t#l�SI�|臓/_����x��(���n��>��V�¦���C09�j�t�R>Ȫު��,8��r�Flu�X^�<+Ӳb"�;$-�{(eZ���7�&�g| ,�ͣ��"��*��v����P���ت5�o�t&�-}h�Z�<��W�t��Tw��~'��;<7"V�"*;��_LW��p �� 섪��B���U�|V0�%���D.���/d�&�b������%�|�����.Ζ��S�|�:��&L��KR|�'۵�$�a��aŏ�v@0X��;v�ᇎm�[�}��'ߘjO/�ޤ:���V(��� �l�"<f��^G����wSO�%��!/L��JVeI������d/�$п�!vÁ�#D|YHm<1�z�ρ�t(�@��<!��y�O�n+��F'u�Xv��l�xwݭ~������~��$�Us��B��v�̍�1B|���'�g�'k��f���¾�e�IךT�EXS]�]/v��@�1�������Yf/[ً�3�=�D�n"./l��C�k��ã7{��y'_p��N�SN�V��;Q����!�!ت���%�2Ԅ�8{��i���x%D3�e���J�K�m�|�M�p�i�T^�T�7[cL\Jg[��q��<��*���fXU�@���:�����R�-�\�����a��u�rrPo�D]�a4��եa���?՛�� +endstream +endobj +571 0 obj +<< +/Type /Page +/Contents 572 0 R +/Resources 570 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 535 0 R +/Annots [ 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 577 0 R 561 0 R 578 0 R 562 0 R 563 0 R 564 0 R 565 0 R ] +>> +endobj +555 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 431.876 215.371 443.796] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea5f42ad42c6bb71627b5ce91d4c410985) >> +>> +endobj +556 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 415.696 237.789 427.616] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea792b0fbeffceea19513cc0bd31ce7ef7) >> +>> +endobj +557 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 399.516 208.084 411.436] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfeab9d6e7e5bb1c5f99d339a649d588b3cc) >> +>> +endobj +558 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 383.336 178.4 395.256] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +559 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 367.156 142.64 379.076] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea2368e219ebbce4e1ede7209486283a6e) >> +>> +endobj +560 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 350.976 258.693 362.896] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +577 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 337.427 177.179 349.346] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +561 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 321.246 258.693 333.166] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea1c0eee38a61b05c5239c871f9cdc85a4) >> +>> +endobj +578 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 307.697 147.473 319.617] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea1c0eee38a61b05c5239c871f9cdc85a4) >> +>> +endobj +562 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 291.517 253.575 303.437] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea9fe6dbe27991e3f9f1a444c40b30af3d) >> +>> +endobj +563 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [35.168 275.337 213.549 287.257] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea1aac5358fbe12702647de81cacd6d062) >> +>> +endobj +564 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.891 201.605 307.126 215.366] +/A << /S /GoTo /D (structbsec__output__t_ac4e7ef20f713075472bc953efb13957f) >> +>> +endobj +565 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [112.486 62.194 222.391 74.698] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +573 0 obj +<< +/D [571 0 R /XYZ -13.423 915.745 null] +>> +endobj +574 0 obj +<< +/D [571 0 R /XYZ 29.788 651.283 null] +>> +endobj +575 0 obj +<< +/D [571 0 R /XYZ 29.788 550.741 null] +>> +endobj +29 0 obj +<< +/D [571 0 R /XYZ 29.788 535.188 null] +>> +endobj +576 0 obj +<< +/D [571 0 R /XYZ 29.788 464.237 null] +>> +endobj +579 0 obj +<< +/D [571 0 R /XYZ 420.936 204.669 null] +>> +endobj +33 0 obj +<< +/D [571 0 R /XYZ 29.788 178.402 null] +>> +endobj +580 0 obj +<< +/D [571 0 R /XYZ 29.788 139.204 null] +>> +endobj +37 0 obj +<< +/D [571 0 R /XYZ 29.788 139.204 null] +>> +endobj +581 0 obj +<< +/D [571 0 R /XYZ 269.297 65.258 null] +>> +endobj +570 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +595 0 obj +<< +/Length 2033 +/Filter /FlateDecode +>> +stream +xڥXYs�6~ׯ`���!H"o���&��M,���\ �p�!�<tl���pg,�[�����������6�Y�m��{������RI��rF.�Vywg���%���� Fb!�\���^��l�"R�%���J�_K:���(!4��$�DP��j�XJd���"�#δ�߽�;)����Ҵ���� 0��w�������}ތSf�]��8����y����Y�f��ॐZqX�"�������l�Y���bádE��X�9��BP҈H�$�͝�$I��K�=����i�|{�$��U�5m���?o~:{w�0�ra"<I%|�j���ȟ�Neރ!�ir�y�w���D���Q�B�p艰�x�P����������~�7kÏu�6m֗MmPƠ���sOh�=J��i�!1�i�qD�b�`y D����Zeպj��zh���Yc��9�X��px@�a�@��o�ZZ�w�4��n�z�طͽ���.��+��Tg���2��W���>�؆N�n��]��˶��B;H�#i,�;#@���Y���I������(�>���?i�˫(�"��8it�@d$��菐��'\�$$��R` ]OI���:ob�ɄEV�/�O�p��m���G(B������B; �������eV��~_����o¹�u�#��|�Ce�K�}{�厶*?�C���m��R/6#nj�q����SBg��o��[gU�d�:�n�fhǨ*�N�SzR��ey�sA:E��4=D�����EM���U�.9"�T���TлlU=����w�h��I̸�� T�����m���t��^�eS�4N�8υ35�9���w���vmw:��}!B��]o���^�O�W˟Ŀ4����V����lՉ�b+�q�a�W�G}b25��{4�K��t�f� +�����7�b��~r��s���x�Yp�Wy��nd,�c����-Z�Gx�Y+O��[Ou��D�ˌ�rU��m}%�QN�[��BX(���� 9���y�&)��q�8�LS�����n. �{l�Hbt�D�і��<����`Ws��b��T�u�4>蜺;��5N�-O{W>��`g�ξ��FDŽc���J��]u_�Tک���;U�W: ���C�������b@-����z��b��p�guaQ��7e���D�z�7��L�.����+|� +pK���i���d� +��W�S��NY�גѐf�g�����m��u$�֑�2�~C�HIh�Ƅ����� <��u2�����(�oKVrj�X)�`Jq��� +J|��<A�p������.�&���a�g��z�D��ڒ��ú ����:߶M]��B��Thp�N��3��4 +�۹g�S�~U���ĝD�s�.k�_����0��"SwS�4F�ʪr�2�ʌb`v��n�1�:�/z�(݄in� +��M=�7��)�VՕ�H�������8r���k���<��އږ���ϟ1L���cr�ׇ.#������h���V:��>U�̷Y�Qz-���G{tuӗz��2���6�`��!v��E�Nf�k��Y�47��\����Ḥ� ;0-Ó����z�9f��CS�� +F�S��p������6�^��3�?���z��i�1�)!�A�v�_�����G4�$,��;��l��}t(J�Ѓ����L_>����FI�8�� r��;V�`�,�4�H6���5z�(~�MG;��mӐ�ۻD�1�� u���\�;���:�Qhűc�kT���hr4��D��-f:���h��Z3����%U��%��*�|]�������(�Ex������-B�6*��������f�wn��Ѕ��(�U�M�n��5������M�U�A������M�p�V��C>�R_���D�my;,x0��b�VRzPm�m����=il-�S���/��}z=#�u1h�jjL�����Y琯��"B �oNw5^p <�0mq +endstream +endobj +594 0 obj +<< +/Type /Page +/Contents 595 0 R +/Resources 593 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 535 0 R +/Annots [ 566 0 R 597 0 R 567 0 R 568 0 R 569 0 R ] +>> +endobj +592 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 924 +/Height 679 +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/SMask 600 0 R +/Length 26176 +/Filter /FlateDecode +>> +stream +x���ϯ$g��y�,�z��HH�`�b�^�`��^�@Bb�^|�Y�Z-�$�`��n1-!�߯��[�ֵm\��r���QȦc�uoU�}�C������ֱ""##ofƍ�|�uT�ʊ�_��O�8�y���h��������@�Կ~�J������0L�����*V�荷��>z��?����}㹿��g���.Do��r鋗�~�K��3�^=y�bn]�����̀��y�;�x�����S���'���on�������4����;w���뇷y'1����/$g������*�`�I����So����G�~�_c�~e��[��r��~~�}_x�M��G~��\����`c 흻�z�E�H�7>������Z��6�d��䀡��<q��� 4�q���ϯ�CbJEl-���C���^<QC+����M��l��MܾsW�1�NQX+U���$i��WY 1� +W:��&RX'o�1����tGo���� I+Ĩ����� ����������Ǿ�O�����7�f{Ĵ�77o)�����Ol�<b��^���`ڞ��abf��i������<��v|�i����M�{�GL;>��O���=�G��y���1���J�������V����B��������������<�<-���i��i��O+O��O+O��xZ!xZ���� +�����{���v;������_�ݻv+>�ǟy�|=���k�OO��O�s|���l}�6�R�[w�_~#�I}��WWOފ��|�n�b���y6���V�iX���ON5�dځ���'��>�J��8��i�O,O����i��������f�����\��%��\�Ӗ�� +is�=m�gzKe�S����C�a���+�i��iWɛ�t�v8�Ezg����$g;P��d\���jڽx{z1�Ɗ�MG�ebC��XI�3�=��б�������������]m$3��@�����is D�Kc�zI@z=���c��i#oY���h��<�<-O��O�O<��Ivq�/WOު?s{�(Mf�2E�@Z��<m=�{�(͝�δ�dGgy���K���Ïtw>�dt��3��Le�i��������y�()s���i�j���R�d>?�g:�D����#�ai����T|Q�-kŠ�Z�Rgyڴ�( (e�:�=,S�Kz�e�sO[�.�#���v?��_��-Io �6��z�s�b�����Ӧ5�w�^������x�xP^qG�k�A��$k��OiP�~�cg#V����+�����W���Y�.~���J�F>Ҝ�͎�2�,gJ���̟B,��O'!�? +b���Ff%��J�L�_�=O��F�i��)s��h��JcAB�2��kh�=m�t��&ӕ[�r���Ӗ��H+Y�8����+���Z��Ζ5��[�Q��xڼ����yn>����C�15@� �~e.4|W�o���L��z��X{�;�Ͳ�Q��X�0w������x����UZ\.�m��C:�0�y���!-g{��y(O��O��Υ]ڴ&+��ȑ���r�5�\�!]-��c3՜^Ԭ��_������+��ZS�_�(r�Hc�O��6��6��u�'�ljeTX�<��K=m�} +��%�R�F?���i�{�n�-��i#wZ�wU�6���o��8�io���:K<-����� S�ؠ ��\�T���'���vk�b�¡eO;�[l�����M�DUì�vO��|�`���tk{=m�������Mk���qr�z��;�ǻ��[W�����i���Ѹ��찻���픕�����k�4�-l��m����'c�K���Ґ/T(��>�X�����-���`��������F��J����A�2q���{�{p=���q2��>����Ӟa>ܖ�^��?��R{Pڶ����Tޘv`V�D��BK߃��mYm�?l������?m�d����[�f�<���O���H����������v��p[lg���,����W�U#Vڶ�փ�Y�6��F{�^�}b��T_yڼ�����zGO[/<��i����#V))$�չS�����'�֟?�s�G�/=��wӶ�/r������|@t��������Y��`��S�b��Xx ��6�G[[:$����iw�O�o^���i���b5��A5B +����p:��{���P�o��.�N����s��ฬ�����V�r�����l���jKg�{�cRxZ��.�l���j�rL +O�9��y��=�:<�f�����C�O�=g�X��fY+����ꄏ�Ӟ��P�����-�@�U�X퓚-���E���� ���LU<���K�V*���lY�� �g�r�'�i��zaO5�`��Wm�D�Z��X<-O�g��"g�ظT��}���l��b%��w�V��Փ���FC��K'o�}7�y��W���/��?�������^O�JR���w%�߳�L������w��[w�j�:�L,O{e qP��H�"���u�I�ND�bځ(��*���zz��D*+)�*�<Օݨ/0볘��}�����$� U��l����=m2H�k$GT��DeJ��<X6r��J�R��2i��6���,O���Xᢞ�~P� V�p���`�'�<Qi�������3Y!����H����G��u�R�����W�l���&����s���$�n';��������f�����RX��F��8;���X ^O�̎.�k�ڭYEi��ZL;+I�DJ��^�R{�v;Ҥi%qy���Wr����L�{+��ȋ擐v)m:��/�Tr�q�˩u��XK�֑�-�=��i�؍��i����<����Ù.��A�j���j����ӆ;�n�����]�D�ƩL���}a�JU�[O��ʙ���+ ��|�,O[���Q�ߒ��Tm����Y9�2w]ݼ��;~��ϮLۖ�\�,&�i��l�"���j;8��kc���έ�$c�Jr2�X��Ƨ��^4۰�b+�Y���X�eƈU�c�VZ�s����o�v�K)K��X�$�����;��:��h�,��i�"���j�i%4|O����ig���F.79��c��\����kZm� I��斧U�����]U��3�]���i�=R�2�=:-T��{��/�˫��.Y�G��*4��.kc���&gO������Ӟmb���QBp�z�ȯ�G�é��1�|F��-��q���i���6�������d-�i�qn?��z�M��J�����ᵝ��2�m2�q�=cY�֏G�{�n�tnz{<o�Q��t��?�u.E����_��A~X��?��by=���p9��uc��:7}M�<+Kmc�Jڴ�rCQm[���CN��}ǢZ#{.6ȍ����`�=�R����f���=��i�ڟ����ꅸi+aɲ-�S����N[��ʑ�eޥ.�����e���bu���U?\����u�s�A���<��x�2�5��kJ��-=ۘ����j{�2�XrA��O�5�G�I���cɒ�+١�Dqv��<b��Y=c��̆����2cW�L�Ӣ�c������;y�W�1be�ڹ������u?Fr�[�7�<�Ǒ 1O+a���o��ˀ�V��{Z [��Hҳ���C�� +1UO+a�2��w���.y�� +1O+a�bz������o����� +���V��0��B����]]��=�!�b\1kB�h;�ڭ;�9�Ҝac<��-������3�{"O+�--y���1�F���-��n������{{�;����b�n6�̖ s��i��s'���O�N\�;&����ҳ�7�PoPI�����'�(G�8����c�������u2�X+&S�p�z��/��i�@<퇿����'P.���LO�+l�$l�����o�9��B�}p�O��S���15j�Il�s�Ν �ˤ�M��e���6/SY��)tۏ"���'q2�'*�9p7]]��#/��ܽ<�n|�%�G��K'�-)�l��iþ��T�nt7��>�����`!v���Wo���ں߳��&�-J2'�I���1=W(�qsVH����߇�T+�d�n�B9�i�Qd[k(��~�����t�ѕ����w/�i��-٦�o��ic�z����+)6O��aG�`El]�2�_�Y�� ��G�]�)��a�? s��I�%Y�l䒱��E�[¡e?�+���?��S�4�J�![��h�C�|<N�[�ڴ@z�|z&-gP�&��Ϯ8-�V�=�N돌hzc�[�(F"4�3�.2�ӛ=m^&�fΔֽh��#�{;w[��̚bc�SoL�Ӿ��U���X��k��#(����6��$gi�<Y�k]�d�kH���xY���!��2mX�ga��U��Jn9��� ��^�S�die���X��3PI�����i+%�s�u��vg�����l-����aנ<m���<�N�2�^7��gk7�w��2���>T^�͋�d/�9�;�Y��J�v�qXa��r�ƣk��h �x�����9z��Ĥ���&g������c"�i��z��P��o��G��K�/>��'W�Za�}��isUC�ߑ8M���yڹ��i�� v�;�sф��K��h�@N�S��o��ƹ�i[\VT����s�$�鯪��������<D�����QY�R���V<�;O^oL�ٞ������N�Y���ױ�n���1�iKf5�J�=�I�*C�UO[�-ڇ3x���X C�[O{������G�XO������s�{�x!L���n��nh�,�vw�zk[y߃�j5�_s߃hUZV�����<H?7qͣ���ٻv+�=�e�f��Z~�zڴ|ً5��t�{pO��rӦ��v��-�6g���FO{����i����?m��<����O�������7�L��쟏�m�O�ح��a�)�������-�ힶ�Cl�n���g����^g�Ӷxڜ �VsV5Ţ�i�k��]��}σ���a���p�w�M ��FW@[�]ٳ��F��ϖy���aS��Y���� +g��y��Gl�}�R{���0O�Uy +E�s�;�Q�#��4�M�;w�vO[~��c�Z��x�Qx\.�����6�t���H{���j��x��A�;ZϞV��bt�Kvo;���:0�_����M7�;#-��w�V��D�+�Tm2�e�o��68>6�Qc�f��Mew�mz�ӊ�E��v�NT�v��VO��(���1��Ń�!Sh��b�ʕM��G'��i��"���c�JJ�|Oy-�lI��f ��::�v�G9�o�2g����5R��f:������@O+D?�68��5�"����&������i�X�����c�����&ihO�Ў�I���9���!z���hȃj�q �ak`Z쌮 ���@���97Ѕ�|�iO�${�(��l�f�0���R+���wۧ�m+���7yZ!z��&l������q�<���� *}xZR�;�X�iO�BmW������n +�0F�����A2yƭs���i�8Ol\Ӻ��Ж��K�^�u,��G<����ۼciW[���Ю<=[������iO�&vo��ng���l-����iqО�����^0O{�t��ȣ���iWN���4�� 7���Ѭ +ZC#����J�i?���1���#;髞���K�őL:v�������.]ҶP�Y��E�{������yĴ#�p;/O{��=��;!bk��]����u�I�fO�Г/�<b�������}Ot<����������;cp���}�E�v�U����/^�yĴ�kO�r����?�ek��ک���j}o���z��#��G��#��[����]�ޠ�v��=��#U������S��~�b$i��i�}�2�:���u�̸?.�i���{�GL5���C(<�^��=�Z�@S�r�R��ޠ�iw��3Z�x {��|��#����/��x{���=�:[�`��U�4��3%i�j���K?��� +J�����N9m�8���5��Y��o߹���l�@bJ�/_8y��@F��_�;�l-�l:�C{�o��t2l������)�v��Yu���|�:���f��.�>�Ә�>��1Bb��_�/�(<�{�!��.:�6��#C���������~��c�Oo���{#2���������F��em���M����L���M_�T4�ڣ�gk/(B���q��nȃ�F��.R��ĨK�ܽ7^C\<t#�=��Vdh�\op��ڨOo<�M��_^���W��<(lԆ6x�������֎�� +��`�Q��F�"����z�g�3��� +_��o�m�ݻw'`h��`k`��v�`R㲭M����?}�c�x�wC��~�b�r�La��Ў豔[�L��_�?�� /�m�77o��W>����O{yt����Y�J���M_���K_��U�?������)l%�B�d7&�X���YW�3���9�u��e�][;�f;�E������l� =/-��st���o�dp�S��h������!*�&�011fa��s���_`m�%���ϥ�kC�ă���|:�0�aέp�K���t����9^�c�0�aZs��8_ںv�X�Z�h0����E�������g���h5�A1��>�عknj9���iokZ�C���s0\�Z�@�C��΅Ӧ��-�,hkW�u���>������v���`k��%ƠZ`J�N�Qԅ �L�A���4ӕ���)Y�20��f����G=��g�8�����ȣ������Hߺ�����O��ǟy���[uق,A���$�ɛw��W?���\1���w�ͭߧo) Yb@�|�,c(ʙ��}�n�Ϳ~x�*��$�����.d�e!�26���ݻ����O>����J1���W�����OLQ��eA����3�|��W���g\�b����~�x��A�� ��L�s��CO����������'� �,YƦ��fQr@9�4�3Ox��,YƦ)g|Ǿ��.:1��]�dY���z����b-1���nz��,YƆ(g�����ӊI�� +.9�e!�26!�_��B�~��bY�,c����7���-&���荷�'ȲC���2d�X4����dY��ɋ�I�Ŵ�c�x�x�,A�1�'\Go������ܼmHȲd�<�}�����=����ȲdO3ԈM����2�Y�,c����'\Yb�����xb,������fY���re��LJ�!��,�/��% ������Gw]Yb�xb,���/_p�� �ecİ��� �B�eO!�'@�� � �BO�,�O!�'Ȳd�S� �e!�2��� �B�eO!�'�2Yd �BO�e!�2��� �B�eO!�'@�� � �BO�e!�20R����ϴ3/ݸ� W�^K��$h��iYF$��z���x����ѫ'o=�̫�����n:����n�I����~���>�QO���,c��3��fK�����M��t������ ��O+Y�F�g�iC{�ne/��S�ċ�/M�Ӷ��!x�.'|b5�dY�����[w���|����o�<-�xZ��#��],Vzq�ڭ�ϴ���J�8���+�IW +D���X^O}��K��ż�9�\�B��*K,��5�������\����G�]���Y�'v2�7{ţ>��I��d�>�Ey�#HF�t:�y��!����S#� �B����3�Q�۴{�(�P.�֖-eIZU�z�,�^����+��o_���o�X7���V�c����a)W�i�;��w��E?5� �,OP<K����K'�>�J��V<m���H�-�L�D�/����J�/�WzK�� ˔V��{�������W���}��ֳy�t���m�����ɕ̱��{>Wg�=�ub���g&o�˧F<A���i���g<I�O��!xv��������2�g��2�_=��_��w��V��x�J���k�����Mg)NK�8ayO[��� �]~"s?5� �,O_<��Ln-l[n�U�X����9I�H�a������堺�Ӯ��V��\���SٱJ�z��f�@w�Ԉ'Ȳ<-0"�^<_���۶F�8UO�s�����ic%<-0%O[��<W��t�!��x&���K's/�FO��0�c��<m�ʣ�s�������T�Z��ӞW�6� ��O=�BR�\�������R��?HR��GBÉ���i��HV�4?ޚu���|c}�m�0�=w�l�S��R��Ii�_��Ğ��8Ǧ�<-6�ӆ�5~��ʧ���D��,=)ӏ-��i���d�� ���=?Y�b�\�:���O��S�iA��I#4�ۘ^\yӼ0T����y�Ʈ2ٝ6�]�q +�x��@��t�xے����2-c�yZϕD���U���O=�B��s�J߃�<:�O�3�D�6�!��Al+�3�$g$�}rc���f�3��G�/�i�L���zV�i���荐}l����f9���8������ �K�m�������3WrM��y�d�Qi_�J���0���{ڹ�.wA�mmr7���g1ϿS��{���\SD������Ӗ��Y�NK�z���������=m�C>�g�������$�����\e�2#F�Q���v��xZ��e����v�O�'�i��V���8,)X�?�����ɮ�}?+�k�fcC��sM��%��L�)/���D�/Z��*����U���q֪<1Vl�R�����+a��i��O�2�1?��r����ug�]>5�d�lU-�s����+y���Чr��5��X�g�uM(/��\M[L����~�b�gR�J�Cz��8-m�J<mZ>�^9��DMv�̞6NŢ�Y�E\��3�;Т���̟i�3-��b�<��� 1.UOL^������%��mR���L����iʤu�2�=m�-%����<�b�Ȟ6�d�K�d�����ï(�*gl/7�v)�7�ɜ�Wb�XI�n�>�Nݍ���.SX��||�<-xZ�V��Jd�{;���+'Cg��]�U<�/=^eo+�1�_�U0j��,ewO��+�������P]Y9P��AZ>6T&*�o���,O�>ey�C�Պo�T��qĬ�� 繦:N9�g]�4�;�e>�qN�g�<-xZ�V�@Ϟ6���<^i�*��M�{�F�kX��V +��4Z��j�^X��Ƹ�|��-�2��q���T7�=�������t��2l�'@���O�� +�����2?�ZiGO[�Ӗ��E=mc��\ٱ�6w��Y��ӆ��$j.<h�]��gl���di=�������(i��;[kt���i��i��reѹ{�Y��y���UV2�q�e�A�������=c{�`�;����vV2O�)OJ����Y +�ћ� Xv'(W0u6O��^^��ˉ�KO��<6��,�i+)�FO;����#˺P߃\̜��6�O��#~�����Э����Y^�?myY�1Vs�i��aYۧ;�7����{��L�2���+�6қ�Ny�g��v�ev�J#��O�>A�����ŭ����ݧ�l�V��i��"I��S5*gL|���;,z�"��pYΏ�+�*�w�{���m��p+�2�\O�+Ns�7w^m)'�[O[��<�*'��-��i�e�ƈ�.j�z�z�����w �G�3�h�A}4}�ӊ�F�W�fA�z�rz��иک<�'6A�g�ۘ^,����i��=�-Xg�Ϊ� +h4ou#�XZ��B}��<]���\O;���˟�&[�����Fh�%n<��!�'��r���ӂ�S�X~=�1���<-��S��b��z��dk�I�;�ؒ}*r�3��� +c�������wOe��c/��>��̞�>�ڬ)2ˣ�3�UJd�J�Xʜ�Ι����@:NaY~di���Dod<��isΡT�p�+���xb�dy�2�h�*r*�2��i�Қ����o�r����Z�YZ�$mbQs��>�O�^_ì�l?�x=��Xf�De�����?'����}[uO[�|s'"� ��+y���\M�� ��!{�J PY���P�u�X�U)�l,��>�h�}h�����<�-;�xe~2o�ޚ�K��M/9�{������mU<���lnL<A�GZ~�X:�ߔ�i��x��@�\Q_�!�:�ҫ�a�a����>`�pb�l{���~#g؇���n*y Qh��\e������g�W��x�Y�g%ӻ��{;w[���p�G� �<�Hr�KvC(���ɋ�i��yږ����~�=�eiʲ�XC��,������ ���cll<X�4X��ݬ���gy�ro�l��6�� +A�1FO[p\6s����=w��ԩ}�h��}��.��>t5��d\����W��>���i�fy�E���<�d���uCR��Lf2^��Wـu�jq��>tq}�/%7� ݃�mOK<���ưs�,cDyږ�O�%/�v�.Q���B�3�CGO[Z�xK�FX��m??<-�O�� �#�����N ����1Y�0=m�ֳ�Wî4N>�P��2�Hv߇E=m�@Y�ѥ�v�ci??������-}�s����0 +�ڧ��o����пUe�2�i���}´D߃��/}�����!_�>-_ڰ(x� �c��}W�s]_��-+is�E��MdZ��J�w��q��{�h߃Y�i�E�iA��9yJ�$_-��i�+|�F�1dO�؟��[i���Z������:7���>�u}��1��:��]U7ȼ�L�-z^s��.ڟ�1%����9�Y�iO�PX�jE�Y��J�.��������х��܇.�/�R�c}"�r"�Y���P��Y~z��#n�s�U��E�������≍��)k�<%�#.�,��#�l_�b������Uͺ�'j)�$?��x0�5����$��dBl(NE�����ò8��0c�� ([f�l������N��������j��/?��% �ѐeL,! �rG1#[R�U c!��Yn�а�g6>�)gQV���+f!O[y����B�}��i���� 惊��Y�n� +��=i������{�_o�PJo��Cn\m��xZ�Bt�,��&!���'�ri�Z&4�?(I�U6�No,��˙ +��JǪ��=H�*6��6�!1: 6�����MeN��Z�_����_%Q��_���+�X��U����P���V�*���Y���Y�N���~@j�� +�}8m}F3� �ܽA���]�i˶0�O^U=mcaC�e�^:-۪��2 +8�(�̔9������ؽ��مf�l<��9ˮ2-�N�����e�}l=�U58ut�{���� �R�j�C+�Mg�ś�y�Xe=��}*���cCѐ'g���jtOk+���l���Ӷ�m4>�_�!���xZ�\���i��d�eB��A��%�����������nzg�P9O��!��i�4�b�T;����Y��xb3e�>�a����ݻv+9��c���.�j�l�}磊#N]Z�ˤ��*�]��2O⹁�v��yZ��M�� +�x��J/�(�<O�-��+1xy�˖�*Q�Zٓؽ鮔"G�.���q������4O���yZ�X�,ϝа2!`�o�|W�g;w7mQ�0��so�M�2�`e�y*���5j}�.��}������j:��ϴ@�,B�sc�؍�I}�*�L��5�[��Ԑ�s8��q^���|@qy�P��vԞv%v���i�u��� ��KXË��Y͆�����l������*ִ�� �e<��f��Ac��83q2��PYo`���l�� �q�]>�\��|������i�'�r���� ��3O�I��si{)f�PC��i�L>8��!�cU��l%��>�V:Q���鴢�,?�2CeZ�<����P��C���#�i�Ӯj���������]fԍ������w!(�f���Y�ʛB]���c8w�����s��\O;w���.�yZ`sR B�el�x.9�`�q��gJ�7wz��C�ʃ�.���N���8�����]�1���1;�����Ν���0.�xZ!�2&)�KN;X:�l����;�`.��tbc���\x�'�T��ZI��ʦ��w�ǰ�p�<����y���2ge�=��H���x<�d"�M;X:�����N/����4Z��i�(��~�W��Sm�Jx�e�n��P��R�W��i��Y�x*��&��O+Y�T�s�i����W��ܩXMڢc�f-�> +,��b�˞�ݧn������s��i���3�T��O+YƄ�s�iK�T���VL��1\�=�=�<-�� +A�A<*�]r��|ED˾�֖-k����g�ǰ�]�b�.�|��m���<�d�&���v0Wo��pr1���+�?���vք�g����=�2��B��]�y���;ge�s�X=-�� +A�1a�\ɴ�����M���s߃���}�3.�� ���U�x��c�xV�C�i.�*c�9���`��ܞW����,c�⹒i+G�י�;�`��4\Y�����s���[9��~��֟�<�����p�'�� +A�1I�\~���Qԟ��D��bzǘG,�?��� �{�f����J[I.4�X}ù�U�N�{��G��H���.ZL<A���i�)�Y�,�x +A<�,Y��xdY��)�Y�,�S� �,Y��xdY��)�Ȳd�S� �,Y���dY��)�Ȳd�S� �e!�2���dY�OA<�'Ȳd�S� �e!�2�ƽ{��w�#��������mO�y>�/����<-��x~��ϻ���#�v�i1Y��7�s͊�LJ�!�X�x��?ﻲ���o�i�xb,������f�����~�,c���Г/�����s?�L<A��N|���d�����UW��||��W�'Ȳd�$j����������[#�,A�1��'��+��p|��#@<A�� ˘�x~s���/1�x��/{��,Y��s��y�_������Go�M<12Y�M�Y���s|�'���dY�� ��w�~�+�.41����/��y�0�e!�26G?�m�5ך�X�`���-�e!�26��������&&_���nO�e!�26M??��C��@|�{{w�ޣ� �B�el�~&���?}����r�o��[ �B�el&��K���֝��('Ȳd��!����MCn������dY�O�B?���?=����-F���K?�m��,�}����[dY�O��K�q�6q��[���}�9W�`|����3��ah�1��6Yd8��&~s��מz�s?�������Gw���u�����^���a�6����OSҀ,�eA���Z�(0��Y�2����_W�\����6A��2�20X.]z}��zo���9��@���y���?rsdw��_O{�����K����3��K~��X�@/\���������=���̥K�;�������i�sd��7l�?c�s�@���g���9�����sŴ����y�Ȟ�p^�uŴ����{��� �{�e.���>�7���v��XL��+��<�t}>����e*�o�}�f�M�s�@��|��D8�˼���m���;��R��}���1?]��s���N���Ĉ��l�����|� + +�8/��y���@��+Ό���M�� �o8�@?Z���5=����-��U�Ā�^��ڤ'�9����z}�x4 ��N�W�_���s�� ���Fήv^��ں��o��`c<m��i}�����5����C���9�@\���b��s����xZ���Z�<�`��+�{05Ok��`��}<-0�뚧��?}�ݹ���gK��{~��Ο��G������טּ<-�` ������ 'X��^�0�����kJG�`ݿR��� +����i��k�����6�����������ڞ����UM����Q�;F��S�����`0\��ϥK�;��4.�<-�`H����>��kb��H1-�`����'X��(I��\OkP �>���q�'O��}�)\��e����<�����e���賝���4<��� '�0(���cz\`��O���w�� �`x��}}�qs���}zڭ+W�s��������t�{��k��l��5�&0����������pi`��:y +O�����U����:<���������v^��:���<-�`��G�����^'s�y7�E��`�LU��6�n��i�K�u�g��$b��a�ggK���Z~��Xo1��0�3=.0zOk1��z����| �Y +�2}&y�m`�l]��Q�������+�ϒx�K��<�&�:�=8Һ����[{��N8���W;>��z���[����i�<�I��upQ;>������w=�VI��xZ��z�����=�ߤ���D�D`�ׯ����D�X��{�v��S�{L�=�VK��C�������������iyZ���������[��M�c�{�i�����5��i�F� +'�����O��O��i�yZ��z�����+e�����xZ������O��O�����xZ������h�9�������՟����iyZ��O��<-��<-������iyZ��Oۣ��9��#���GN8���=���<-0VO�sx� ��<-�O{������;�i�v~�����xx�GO�������k��=����7F�0\vyZ`��������{�A��.���&�`�V=0Z.����$vxZ`��I{��9�`���>�!�i���&Ջ���=����j1�5���x��+�>���,�i�f��1byZ`�p�V����x��9�������@���[[��p`���� �,�%y0��i�+z���N8�`�\���F@�����i/�&����� ���Q�g���#'�0Ļa�����k��M���x�J�0�<��O��ݐ��M�c�T��i�ex��{�#�L���iT����ޱ�q�N�#�/����k���l�����@ `�����UO�$}��tx� �����������W�L�l]��k���|�r������i�g;/������M�$b�4�e����Xϵ|��`s��<-0.�9�<-�``�x^ L����q�|4�������D;/��`غr��q%���k���r�l$�6�ҜX3�� ��`0w�>��4@X��<���������|E�k���D��xH#/`J�R�>�����������i����k�mw@`ݞ��>�� ��.���p���:��뷵=����C ݏ����B;���=m��]+(��>����=y�>�yi}��½��|��@?�U53������'��r]�:�������9��Iw�]�h��B������5���97�㣁~~�^��k?��#��p�\�7��@�(����)�Fu(+���C�/Vm���<������=�Z���p>l\�1�Q$@�<E��p~���r�K�����q����N}��������į��>g^p��·~�K������\q��=��u��1`��܀z�01�@���z���8O��D�Jj���i{��]����t?]��q��5{��8�+}�WO��u�9��F�Ŵ��6��>]j���s1-O���~]���tos�N�i�!���t�u�A�Se�b����*��1�{gZy`�~�jr�臾;���9_������x�;���*�Γ��7����G�"w/�p�{��ݿ�^�}�_�_?&�2YY�����\YN]� ��YZd3Ks���~~��'_������/����|�?��}F�֥�^����7�~���o�**?��L%Y*ϳ�l��_�⏯�o�+W0�7���?ӝ����A�� �@VΓ7�|�'���_?���g���ol��{Wf�ӓ��b�e12Y��,a��4���?n���ۮJ1����/<�}�{��A�� ��X�L_�;w�}��W\�b�����Kw�3�E �,Y�f*�ɛw>��=�u|:z�-i�e!�26��V�E9�d�SZ�dY�� T��5�lKL)z�EC�0^Y��.YS�eCư��[��?n������g^��Y�,c�▓7�N+&9�6*��'Ȳ����2֗ ��O~�B��������l@�� �l����G�ń�~�\�r �B�eL;`��|kD� �,Y���Ӥ�b����l{��,Yƴ��77o����c��7��Y�,c��w�[?���������\ �B�eL8!�Г/������?$� �B�eLX<���]Yb���o?O<1Y��2� �����7��W��.|_� d8�x~�W� ��,�L+6G���J��kJO�,A�A<� ��Y�,�x +A<�,�2@<� � �B�eO!�'@�� � �BO�,A�A<� � �dY�e�x +A<A�� � �BO�,A�A<� ��Y�,�x +A<A�� ����x�,A�A<� ��Y�,�x +A<�,Y��x�,A��)�Y�,�x +A<�,Y��xdY��)�Y�,�S� �,Y��xdY��9������|�t�SA<���H��NK���Q*���x�o" ��ϼ�Ӷħ{��_�=�F�{_�u�ͷ�����mm��F�h,v�����64���>��I:�X �%�s��"��iI�~|�Zy�VTqz���?�u��[��}���� ���i#��%�z�����KR��lIr��xڤ獫M/��O<A�'fh�t4^���M�ӆ��w +�օ�azڊX=�̫aT6��<�p����+o.qJ"�_LR/��൳]����`�_B��>,��&��iO�t���P����)yڹw +����H>��vx��{�Y��x8XO�$�Y��v?�x���%���J�?�<�0e동������<-O�����$_ˏ?�jؘ��K��eV}fYs��"���"��d������G�O�����J�̏���+�$v8�3?�k,-k?��Ϝ��@��i�q��4��3jwWr/#��i��i�IY��]����B^��/��z�T���Vy1��֓w/m�G�]/�<�*��xZ`y�p}e�d,��e{gc�UYpո���� +I�J��^�U��c�Fw�.\O�]����i뵩�w�Ə/j*��q&� g�e�'xڡE\�Id��"&�U��"��7������v���, +OK�1RO[����1Q�O��x1���W�$��I��O�P������g^g�<��؊�LkN2��ı������J�жx�^Z���u�L/�-F6�Ң�i��>gyO��$�;z�$����z�Fr�=�x���E�K�]�Nf���5F��e��dyz�B���K����?���U��M!��x%n+��J<mܿ�j��=�օ�az����q-W�2���S��O�|�74˺ט�KJRYC}`~i>��7&i++�ݘ�S]t�C��e�FO[����|u�O�ʬr�����O;w�h�2e�daV߃Y�o�~S�uV� M�%G�=m����XyZ���z�J�j�Ͳ4y�"�;��s{Ϩp��wzc r��,���6]�\�~�=l?����*cˣ�FO����/C.ʭ���m:���f��6�ӖR��+�_�J�����Ky��,���i+��dc�=�8�s���k�:�A-S�Ͽ�+F�Dҕ�Ғ���ig�]l����p��Ӗ���_�J���f��&B<A�70��Y�5�>O�Py?OK���.�i�yi�X�E}��wV5B�Oβ�]<m�!2ճĪ>�!?�O/Fa��u{�R�� ������J��#E��@�'Yr�.���ժ{�vM�">�y������<-x�Y�*�t���6��c�@{��,6��z���J*���VRӘ���q e�s����5��O[�A<A�'���WQ[�I�o����7��z�x�6K�B�J���yZ���c߃�K��jZ,�_X�����5H+ ��e%mZO)Di=e��<Ru��:����� |ZV�����?���q��&������Lr:?9����i�=mn�Q�G�^VG<A��T=:��"�}�0�ң �I��2�a9��ܛBc߃p�-όB�����Uf!O��<��?<���������q y�YE��K�����Х|t������✼͖5�;[咹��V�i)�s���Ne�o{I[E�g�6����c�<����rWn]��V$���p���u�N���J��i�ï�yZ>��is�؎�Uz]&��_~{}�X���k#��9�kUai ���L|�6����j\��+����`}�6�E�s�镲�N,Vw�y�<1P�u�͍x�,�=[[�oR�hP�}��,�]n +y�IZ;�#�w5nC��Ӗ���,�x +A<A�������EP�eO!�'Ȳ�i�2@<� � ˂�%� �BO�,�,�x +A<�,Y��x�,A��1��xU}fE���E<A�Y�͌�_:��b=h���V��,���i�-��x?��I���m�ڹ�yZ��i�+m��=���D$s�]�O\i��ڭ;�g]�iA<yڡyژO�}>��Ehx��8�I�r&��i��f�*풞6���S���O�i���a�K�V6�ڬ�<-��N#zPڞo<-�'O�Ӗ�_� ����l�<-���<-YO���Ww�YL�V�Rzt����d�~|�Z�w9x��]&^��q���z�&�U\��;�I�S{�'︕����<��ȋ�4Z}�|��d��3�>Uz�إ�Y��.z�<-pY�IWw)�qIf�H֟��Ww�g]c�.�v}h<���lӆb?����ۚ�\mHzZ&?rjQ�/Wރ��b*�O[����ϴ��m�崷FyoӶ������>H�����6_��z�+L,_�}�,P)�̒Xҽ*�������Z�/�-4�+�YJ�~�Ei�Ԣ�g8����y�Y)��t���i��zڊ֥�:�������)3��R��\}��i�=�ok:���f);�����o1=m}����p�g{[�C��=��u��e�q��E����jү��b�&-Y��_�˧���Tg� %_��]��i��]"V����N��r���ab�2�{�>y�I��'bi�Jn6-SI����3G� i��J�^f֓�xc��<O����9{�$h���O��ˤHҗ��Х,�����,2y�JE:z����ώ���CΫ ��+Ɏ�K�A�ic���|��w��Jz�����u� ��(�3<�3�{�]�[�� YO[�""+��6.�Y�0K|�Z+�P�^=1�������<_������ڇ����O�|�s�p8���5O�Ӗ?�#]Y^�ɚ��4^�I�� [\��]s�����<��ok:��jgKt���ݓ$=m�[H��r��6�>H���6>�G��"�^�L�\泈5T*�V5���;}y�O"]w����{^l��'J�$�#0���-���02i-�L�GꑪM�S>Y���\}�^O;�Ϊ�ok:��T�2�6?�K�6Y�.�x���xڹ���C�r����2x�F騗�'��OO�zd����.�y���I�撼h�{����v���e�?��_��<-0"O��Qi�P/�lч!xڅy�6��{S�P" ӛ�����i�1O�r��8�\���V�5����>=mE��j�Y�v�g8*��gL<-0^O��7J��vGWׇX��<m������i���ϖj��{��Ϩ��m?o<-x�3��F O�ޖ�^y��� _���-��7��}^��v��Y�9v�����p%���0FOէ-�* +A+�������eqW������ۚ�O[.p.�v�g�r�]���� YO[�W_�c�2�t��rs���7����&G�BY�#:���bR�4XG߃�ƴKe%m�Z�DH����C�6���D���'��즘�Ė��؟6^ԟ��ͣAsO�(�M�O�c�<�=kcy��Շ�<�>�V�E��ok:�.����Gt/+ic�Vo�v�g4�����.�A����{�Z���ެe��ac�� �ƾ|�����mlXq��H�!o<������g�q����)����:��@��v����T/�,�wчzs�����g�}[�!��F�m�8E��ڃ.�Q�C�{��26�Ӧk-��͚G,�W3U#�}��ɶ:�#�GO�H��yl^f�y�����c�"��g��8�Z������@��T�d�f��O�q��rf�<uTT���}�>d]��8v|��q���r�ר�-GZ>��:�1b�Q�C�2�d�� Y�&{Zя�[���QF��xZ�,A�A<�X<mL4���,��&��Y<-@<��z�\pU�z�xdY��9��ޖ^�+l�z��e�}��i�'@�� � �<��xZ� �e!�2��� �B�eO!�'@�Y&� �BO�e!�2@<�Ȳd�S� �e!�2��� ˂,�S� �,Y�$��xdY��)�Ȳd�S� �eA��)�Y�,�x +A<�,Y��xdY��)�Ȳ ����x�,A�A<� ��Y�,�x +A<�,Y��x�,�ZY���dY����{����l�����}_x&}��wޅ�������K�i�E��o��.+1��ȣ�<-�"���E�|����d��Ooϕ%&�|�≱����Yӏ����e�V<z�EW��||����dY���g�8 �X�x~��W\Yb���O_&�>Q^H�Y� ��G�\Yb��̕��x�,A�1�T�G�uq�M�`�-Ȳd�����Oח�p<�䋲 �B�eL^<s������KLL5~���'ȲdrBL � Ȳd&�$��������X�����z�G���e!�$�o�e�5'�>{͵&&���=�Y�,cs�3�����\nb2��_��$��,߽{�,���Qם��>��_����o������Y�,c���荷觘�r�o��[ �B�el�ӮH�m\���V��Y�,c���ǟy����YW��p�}@9A�� �@2v��[�����K��ܶ�lbz�C�Ȳ�,�E�1[��?��$�_�vy��_?��d3��1�dY��Khb��7��˟���'{�#�����t办�}_x&}��70}ӷ�+�o�~�M�e�,�20���,U�����e`���_Tr��J� �e�e��f�����`DMBw��(�Mdk�>[�g������֕+>��������1[�����sX�ya���`�S �����0ZC���� ��l�>Ack`>�����^�?���;i�������hh���ƅ@�����0"��9����'��Iw���F=�8y��`��xϸ0�hb���v�ڕ��p~�� ��i-C���>�6D[+����%1�F�0�ݽ����ڍ�hFQj:� �K��0���x[�����ۉG�v���S�K�T���s��f�#g� ���l� �{�Әn��be��x������|�3O|��������ÿ�[��\����?�/��ϼz�䭊����n\f ��a��p[;DI�I19[[f�N�_����^�������7�~r�δ����a���������{:���m����������ۼ�r|����M_��՝��=P�a&iݒ��̜6����� ��d ��=�[/�|���%1���W����M��Z����4��u~g�:��}�ʕQ�x����_}��a����.�!�Z�v/_�����Jl��(0{����5�w��{��Y#1���.����=mq0�_�Z�XIT�Z[� Ʀ���D�C+&�y�`�E9�㲹�`���!���g�E����W�!1�"�������k}�`ʭ����Nh�dE���^<QC+�����U l]�2�v�-������z�Y���}�.bz���v����T-����.?;��N�I����UHL�a� +v����G0��������)��7�XALu:��7���=��[��0�l������JҊ���?}y����'ᐛ�0���ֶ�#.^����c/p>b��o<7@O{ab���[�z�8��Dym��6�#���y{P#�^o���[�P��,���}b���ӎ�=��@R�ï7`h��=Cl�gBxZ��M�-w���t�����l����CO��'x1���wu�v��-���K�C8�t�����v��iLJ�9GO;�z����UM7v��ƹxڏ<�����y��=8�/냡�x�ؽ|cw���}����s;��][W��s]�!C{�����g���3�g�5��iO����H4'��-��*[{u,O�w���i����ں����Em�Z�{c2���9a�� +�v�\��� ��Fͻ) [�V��_�i���`���_S.e]�7xZ��n`z6jh��`�d<���$UxZ��n\z���������{#��<a�� +�v�ҳI��q�B�����5��-O+xڳq���cL����e����2-��vg��=���'�� ���l�#�C�?��M�V��<m� �3F7��L.����u���(���\�i�X��g��&��������\��yZ!��i�Zl���l0��5�g�i�/.���iO��x� �no��.�`:����xs2;�<g�iO;��D\<�A��N�k����^�ح%O+x�:�Qo��i�����|_�re�`Ķ6��<g�� +�����껣-98�Q���y���x��v����-O+x��Έ���\zD���m���'l��7>��iO����v�x����a��������w�l����b�=��|+S����mk�N�֞>��3 +�bc=�w�Y���U@�X��>���� ��>v���<��@O��I�����[Yh��p�����V�{:O�=��_�3���n�>���o?��__=y+m�ͷ樂���g�.ޝ�����7�%#���x�֝�_:��Ww��i��|����tf�Y�����+4 7�����BN������i��'o�`���?�jZ���-������f��i������@<m���3� ��&p8�6��s�]�i���6��1Ϣ;vO��ѧ^�ǿ�<�z����=<��i���6����[��nc�7߾ˤ��W�n9�Jk�b?��_��n��Ƈ��[���JZU�6�[�H+/k*����_igҚ[ +n���V��N�R��y��!^O�;�ޘ��v#N`��QC��Uo�����^��ӞW�6��JIj�ҋ6.�(�\}�0~-�6��l�˷��]ݪ�[��M�VK�ЬZ�O�w/o�q���+��r\���C��?<���v_���o��\Wy��=m2��u�y���x%�pY�ȝ�V�G�]�6r���̯���\k,_�ƕG��^�LZ����M���6�3\n�s�k��������d� +ߞv2���<��3��x%~A��J���m������v�����V����3��c�{P�X�5��e�g�a����Y+�V��Y�-��p�6�.���ږefy�2����aMsD�6�<��<��Aya�{��Q��TC.� ����eo$�&��+9��FV�ן�ɿU�o1����������ӚӒeB��,O�|�[���>��VV;��D���2q��:�xK�r�Zz� a�)�y@Vix�d+堽y�Y��-��^�;LO;�6c�T��$l7��6��rӺ�G8�dk���K��i�N�1Vi�x�_�V}�q�i�}�8̹�������H�nn߃���㿒]�ز�p�e�B��Vc���z�XCe���6�N+�;<�ӆ �T��m����F��K=-O�����݃#R ����XOO���<V+�}�b��6���(d��L���t+��2��=�c��}�гX v�R{�DmjZ '�'{�h��O۽�O���������i��k�YMT�eUɆ��Y��J��-ԟ6�V�rIB��m�O�F�^!�k'�������ҳ��9a;O�]V���y�'�J�.Ll�or��Ul��?/�����ګ�|[��m�gi�ʉƒ)�i�� wǭ�ؕ�DK�^�^���"���l�<b<�:zϦ��ҳ����;g;"O+�d<������ak�����1O+Ħx�������0=.읎�i����=m�u���D�0aΫ��<m?�^<4�-�`#8�R�V�k.�=�������q�\��� +�v�c�v/_%k�����R�V�kj<�������Jx�Y�0D3�zc��~�2�le�ƞ���̱��K'��r����[y.��JrK��]�iך�M�/� sZ�p��=�i���� �Jw�g�-#�u{6O��h�������&�\����97���<0O�V+�����,��3���"[��e��<�Wi_Ý&�X�ƛ#-)ֹso��FZy���`�ّ�T�i���?㕴�Y+�6��p�iWާ�7�@�����1Oۛ�͵嬯�d��>����bLt{6O�|r��� �@=K\�'6Zn.��2qt��e�vE�����;�7x�s���z�%>�̫��dA��i���e���jYf����\=y�~��e��@0��Α����v͞6Y��=(��*�f�|�����i#���!-�imO�tR�m�� Q{��u�$���V~�BO��>S���N#��#V)0Ȟ6j�hS��i�.:���d%�&�$�%��Y ��<m�9v�5��`���ʕeZ~�s=m�V��Qc�3�i�l���Q~ �dA#���3��akyZcg�v}����`Ǘ.�Nv��X�>{Z��Ӯ����_�Mf2�m���ӦH�2��3��>TƈE�n.� C���%���v}�6�~$5����ly��ˮ2�W�i���6��e<m9�2,R��R�����iW�iw�Y��Ήw��y��x��$��i�� ���K�8����d�v�N��Ǟ�{���=u����f�8gg#��y�e=mnGP����M22��f�l�6�h�� r�at����1j,�a�'�O������f��]��yڥ�iK�X��f�3{ڼX��q�Xڟ�g���\�yĖ��GD����sx��Ԗ�����qn�JeB9}�B}*v4��p��zyE��N��6���j���6YY�'��0ޝ]�����i��U����q�ՙ=m�F!��ڭ;i��R�p�{�ne��^����r�J���Z�ӹ��uA�����n�Vl���w����F������1O+6�������iŦyZW=��<�<-���i��i��O+O��xZ�����V����B���������<��i��O+O��xZ!xZ���� +�����V���������<�<-���i��i��i������V����B��������������<�<-���{��G�exO��F�i?���1���#;髞��z����i���y1�H?�xZ����iz�E�GL;>��C���i{����U�GL;���+<-��S%F�\=y��ӎ��[ƈ�0�T�'��+�GL5>������i��������91�x��/+<��`��ٓ7�|���1�x�y���<-��R�B�7����*<��`s<��;w?��mHL)>��'o�1:��������$�?�=Vu�����>��1Bb��_�/6O�����~��c�Oo���{-���ik��>��S$Fmh��X���K�j!�Q�ܹ{����� g�//�� A���A����\[��?�鑟��tb�+|�'���]w��eh�@��&��x���o<�;���G�~1}9c�0Z��0��&~s��מz�s?������C��0T����W�?���?����U�?����f +��]�min��p�]Z�����eqq�&6]����V�+� +endstream +endobj +600 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 924 +/Height 679 +/BitsPerComponent 8 +/ColorSpace /DeviceGray +/Length 7343 +/Filter /FlateDecode +>> +stream +x���-P\I߆�#�"�@ b�@D "D��� +��@D ��@ D�@ �UĤ +1U�w7��~da��10}�w����WߧO��F�dlu���>��ˣ�� v-�[WY��ٞ�12~�՞�I�C;�,��s�������fv;�6"b�G��E� +YRl0�Xzʹ���-q�8ƚ?���s"�ڛ,9nGxG���%���{�;�)��[-���,IΘG�3�%���o�R��.��o�R����kƲd1��f5�lڹ��f;�l~�0�l���~�,�l^��~�:�lf죟�d�M�dS6!�� ȦlB6e�M�dS6!�� ȦlB6e�Mلl�& �� ȦlB6e�Mلl�& �� ȦlB6e�Mلl�& �=������K��k�;��;�@6���I���ٟ��h�-���Y�����2�p8!�ŸZ2i�����iJ6�q��NB�:���l\RY�w����霗͢}�q'z�q��ې͂��E�=�8�b�)��l5#������f��Ζ��v�?GO�Yl�Є���~�����;�,�����u]��l��5�1������2,���;�-����o<l �f�OiN�e����s�'��Ύ[������q��b���8�[>/�x��g:[���o�j����b�Wc�[�W�y��b���S����s��+��v�\�y��.e����N���ie����ī2v�ȾȦ���i�>6�%��u���8naS���īu����5$��N����Y��uאM]'^���<m�L6u�x��5�]�,˹K��uΆ�&��i/hxxih���]��f�j|������j\6��b\�����hTM٬�vI�3liRW ٬�}�x��B �l��a���r�;��C�X{ڒ�?hL�O��' ���nmN˲�g6����ۮ�/�nL-��+��F�t:/�4G���e�4,���f�l�j��s��-�!���f�1{Q�:��$�`�LC�.��f��\�+�S���D����59��O6�w_:�~�lX��h��ϲ�D6�k���IM3uf�K����d6��y�!_�$�J�l����g��h.ݖ�� �3a�[�[�l>��߆��%~����tg��7ț�l>��Fc��/^�h�i2|ZA�<�ͮ�l4�K��o}ә$e���W�|!����'�i 5=��/�__���?��K�l4�n������Ƈ�_��?���r6�_χw|5���;�V�Ѽ�����̀l6SŷxXKIj��kᆲ�s^����ݐ͠l6������]���I��d7^Q���<ҹlf��/�O�Bg2�,�v���7���ˁlg���R��O� �!��OΟ�fWZE'l/}�����;�t��nȾ�ͮ��/��I%��f��s����_2��͛0n��A4�������8��8L7�g� +FNlBu��|b�������N7��+Xk��/�]jwO��{�y��?�����pWG�ا��}������O�K7��<s����|nW�L����oR��}��;��D�h�u9��$�kp��^N�7?/���g��F��L�$��[����f���';�$9Ͽ���P�Y7F�D�ŋ9F����4�9S���p&O�u͂Z���o�߅S4�s\�ۇ�����-h��S�9�6���k�z�;�E�S�V�"�)6����R�?��=����'�ys0_���+��Ղf�=(��Rr#�ns������s'!�!�NG-}��RB�����������B�S`��[���t2B?*�~�(��=��)pQ%g.���o�UT�Y`��W�;n�_��Xџ�N���D��]c�c���Vu}~������[���t��/�Wo�*�/��;�j�-������V���Ը+%^�r۾�����rϟ=ؽ)C�w�9�M�-��~�(i��t:�jo�p�[�=Mc$�� G���5��W�X挏ܫ'��!����w-6r��l�Y_�Dr��(Z\�^=��f}Bޝ\�5��ܫ'���Z�=�""�9��O��]�r;g<c�c/�I���4^%o��ۇg�[z}v��:A.����l]eu�f;�y r#f�8�?'��Gn��$rN�����In�L�$s��mr_GL�s{Z �.��ҡ��V4�MiR<v6R�&�Q?X���-%�k��p�G��dƜ�F=���=�#��В3;Y���Mr�^��<&�/��Zr��8K���In�Lg�2W�h�5[��ۭ6ɍ��d���?����X�.�� "7jV�W��{�F�v���,n֗���&����<JX�i����wU�l^$,�:~}� �k�=�� ���ח�W_ȥ�>rɥ�>re�>rɥ�>rɥO6ɥ�>rɥO6ɕM��%�>�ȕM�d�\��#�\�d�\��#�\��#W6�#�\��#�\�d�\��#�\�d�\٤�\r飏\٤O6ɥ�>rɥO6ɥ�>rɥ�>re�>rɥ�>rɥO6ɥ�>rɥO6ɕM��%�>�ȕM�d�\��#�\�d�\��#�\�d�\٤�\r飏\٤O6ɥ�>rɥO6ɥ�>rɥ�>re�>rɥ�>rɥO6ɥ�>rɥO6ɕM��%�>�ȕM�d�\��#�\�d�\��#�\��#W6�#�\��#�\�d�\��#�\�d�\٤�\r飏\٤O6ɥ�>rɥO6ɥ�>rɥ�>re�>rɥ�>rɥO6ɥ�>rɥO6ɕM��%�>�ȕM�d�\��#�\�d�\��#�\�d�\٤�\r飏���^'l�]�l��f̜%l��ټHX�M���wR�l%,�,~}� �۫{6w�{��Մ�m�=��F�D��Zu�&�qs����fݳI���&��V�L���Mr��$Q{���%7r&�7�@4ɍ��$�}k$�Q3r����h�$7n�;����6�ܸY������4��ܸ�H�ɺ�Hr�f)�7��J#)ȍ|X�ΜA{�������u�;r����h#9ȍ����3�$!7r�w�j��~o��Hr��n�\��7Ƽ:��l�LrS�]H��� /�Ҕf�)���"�a1�)}V�`�B +:�Nx�ѐ�t�N�����:�eB���)���}&����C��#�Ȭ�&�b9�1}P�@6 7Qc�UrR�auB!;"N�)���.� A����`cA�C��muB+!�iB���y��N"�b�O��g�M��iW�* �(*lO�ĕ]V��U�̪��ɨ���,-u +`:��s�@�LUEМ��:!��[B�*S�;��P)!�A'��wSA�� ��UC��T*e�Dm5�� +B�m�R��h*�3hY�^䋩 ṮO8+��T��y�M�^��T�`�t�L/r�2!A���A牎��rĤ2��L���ʄ\�x�Q�^ ��B�!!׃n*�|1M���Ԫ^� �E���%oc�42����&�^�^ dFmZ���a��_����C���ԕ��+�� =*���;!���+rr`�4�5�W&�$deC������!�({�ԕ3W���,�8Ϋ;�E��XiB�PF� y 9!N��t�:�/d#�V�'��oV�����M2�d�tzB�Mk�ԅEW�'�ljq_Q7B���}:��_��SV� ����ڒ���'��d��ض ��9��t�mA� �6��ڶ �M{�T��.F����<^<�#B6�9��܀ݖ=��TF)�Lt�G�,ϹW�y,B�-��R�Rٴ� +Eش�������}Q��e�Vw�a6?+S�l�+������PЫ���LϲfL��`.��c��ʄX�}6[��|u6d=bB6K�wcT�P���y6G� �)��M��l� ��;��9�MȦlB6eS6!�� ȦlB6�aO6!�}��MȦlB6eS6!�� Ȧl�n�<T�R�t�6z�M{��e��L��WǙ$�Ӳ��l.* +r^к2�&^����l.+ +�\�r|V?�O��l��R �P�-eB6d���F�ؕ�RX��[f��L��w�H�P�#�,�{� +�G��w3�L�P�UB�}�T����w�J(�u@6��T�����<�۪ԅˀl�W&��]@˺V��� eBn�Z֩2u!d�{F����m-ߔ�6o�7,��R�� +�)r�в6��!|Q&�櫧~I��y�'-�d֦=�Ӏ�5�L]�i=!dW����1�ٴ�^б��,�v=���l@��qP�1eBK�ԕo5�S&�d.�]]*SWB68�yY�e�4!�7�*r��� �� 9ӉA�ˑ��҄��w�L�ɍy�҄��g9����GQ=�7+���*'䂿ez�S�vTΚo(*`�" +*g'�U�(SO8�(�Ǚ/�+`�" +*�.�U-(���U�1��<�N�2���(#*f2$����%B���L��R@��W�90Q�� ���]�^d]Q1��X ![8�E8�Z*a"d�>�N��I���E�>��N�iڊ���'�g�ݛqP�ceB0!�O*S���P)���L�ܔ��� ��z^��TJT�BH�Q��BV�6� �|1H���]>RG(��Se�Ly?�La4��*#h�xZ��THsZR� FC�� �r�M6�Na�\��� �r݂�4B ���ST6�<W�@B>�̦� U 7��)���L�UuBU�M�5�t,��ɨj�iWP8Wvr���>gϴ7^q�鬠pVB +�T4�\V�`& 8��M��{|2�������irɍ��������$|m/��:���y+�d�1��Y'xx.�13��R�Gr��� 7�U�N��iE�ܘ����^J�$7�k�����zNr��tR��eɌ5;��N�ӳ��Hd���r#�0K�DNU$7�U��1IIlje��r����N4"7ff�TI`:�ܨ�IV_���F�M��8��ܘ���e���$7j��W�p�5"����gs7a�58�[��j���8a�����=a}�?��2a��f�b���l',7�__F_}!�>��%�>�ȕM��%�>��%�>�$�>��%�>�$W6�#�\��#W6�Mr飏\r�Mr飏\r飏\٤�\r飏\r�Mr飏\r�Mre�>rɥ�>re�>�$�>��%�>�$�>��%�>�ȕM��%�>��%�>�$�>��%�>�$W6�#�\��#W6�Mr飏\r�Mr飏\r�Mre�>rɥ�>re�>�$�>��%�>�$�>��%�>�ȕM��%�>��%�>�$�>��%�>�$W6�#�\��#W6�Mr飏\r�Mr飏\r飏\٤�\r飏\r�Mr飏\r�Mre�>rɥ�>re�>�$�>��%�>�$�>��%�>�ȕM��%�>��%�>�$�>��%�>�$W6�#�\��#W6�Mr飏\r�Mr飏\r�Mre�>r�}5n�ש{6d3f��w]�l^%,�6~}G �;�{6O��=~}� �;�{6S�{��� ��Z�l��3� 뛭{6ɍ��d���Mr�f�p���5s��[�6ɵ�#W��g�ܸie�I���@4���1�I�;k$�Q3�N�^g2�l�� 7f擓��-6������6��j$Cz���%w/��A3�l���Ӄ5�h�;�Lu����ܘ�<Ie~}���F��E�>4��ܸi.���Ͷ}��l$ +��30�u��~g@u�O��4��\�ė��_Q�>c%��]%����H8��c�}Z4^ +g�|��w;�f�0z/��D�aR�bb�#����W�G5���L8���6�,6v�3F��j;j*Zl4so#�R�7���W�堪��P�t<�ߖ����nGU-F�r�!���<ͽ��m�L��>vQ�J������u�6�]�n�NT�k8�v�ΌF+yWʲ�f��g�V�/��ٮ4c���4�xɽ���MW�J���'սS���|U���W���Foh������jD��`f^=rr��e�O�ى�T����Ec)���@㎜�A��Q��&t�N'�4��N[��?�������h%K��ϲ�#�s�]5`��]W�K��Ҋ�c�Tn���l����j�p���R�����s�8f�vL��c��[�`�&K�ۑ�r� +�g��5�0Q����� I^t�t`7ʹ�.γBc��N�W���h +g�p�N�Ki^[����D�p>,��;Y���w�� �(��k�A�V���}D��~&�(�Ӝ3�W�f�.��ܕh�\8��s-�dɒ/5��gES8��v�|��f3�νbﳢ)��ٻ9�����~��gES8�hˡ�0�l���}V4���N�]����ϊ�p>���N߸N7�Y����3ٷo�)���w:k!���fW�<��ʗ' ���`�;�ٜ͒*Z�K�k&��i���$�e��\/z�٩Sa��l�Ɉl���y�_>�dh���S6��4�}�v��f�x6&��Y��tmj�~�?�6e3g6Kt�ٚƚ:��:e��N�����G�]]�N��/ﶊ?;4��-�/Z��͏%�|k�^��^�h���e3 ��%~�|D#M��o%����|!�e^g-k&�F��x5'�]�Y�u��+�5�e��Ѩl>��R��Yۥ��3Y������'�Y�u6���41\�{�ۏ���l6�K=� +����1�W�M����/�\(y�ހf���u�5���l�#���r?���I�̵K��� ����'%�=�A�o�J��~0*��1zP�g�G5G���ҧWvvG����N��lj�WVJ7���ᤳ�n��oX��SL^�n�)gs��Ox���=��}ϲ� o��Ytc�BF��x�vWJ�Ϣ?Yl��Y�%c��ʜy�E_��5�z�(�/Z��z��+gJH��Jt�u��u��ʉ+o���iB0.�42�:����b�t�:M�:���Y���L��^=G6��+��T)7vϢ"����9��w�����=�)��mr�xx��G��4$x���%͖F/����ͳ���nG� +�^wC<z�衜X7�q�&zO鋲����xZN���wS@x=�D.�+��S���b��`��,^�*/'s��Y����uAs�7�x�tz�}v�)�x�7�k1|*��ƙx�Y!�l���d�/�?�&s^�@���&�r���WL���e;�P@�1�����͚O�џ~J9��&��Ǥ�M�!�� ȦlB6e�Mلl�& �� ȦlB6e�Mلl�& �� �& �� ȦlB6e�Mلl�& �� ȦlB6e�M�D���M�/I�b�������3���l�����Ϭ���M���L�����knR�潋�`�ٗ�q��f&�l.p�>�$�h�{�E�3�f6g�G߳�b4���g�6�h�GyGLwR�fg�uD�b��R2�� iu�[�#�z���53� �ƚ�l�� ��3����L��s[%�w���do�F=��yn����͖`���_: +endstream +endobj +566 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [526.874 692.208 567.119 704.712] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +597 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 678.659 136.095 691.163] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +567 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 651.561 136.862 664.064] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +568 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.144 651.561 546.214 664.064] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +569 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [85.756 638.012 197.82 650.515] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +596 0 obj +<< +/D [594 0 R /XYZ -13.423 915.745 null] +>> +endobj +41 0 obj +<< +/D [594 0 R /XYZ 29.788 737.428 null] +>> +endobj +598 0 obj +<< +/D [594 0 R /XYZ 297.956 214.77 null] +>> +endobj +599 0 obj +<< +/D [594 0 R /XYZ 524.558 63.19 null] +>> +endobj +593 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R /Im5 592 0 R >> +/ProcSet [ /PDF /Text /ImageC /ImageI ] +>> +endobj +604 0 obj +<< +/Length 1942 +/Filter /FlateDecode +>> +stream +x��X��6��@�_z�[s�m[ �61p���%��U�=v�@���!)Y�ڻݤ�6!M����pF���0�kWّ�ܭ�a0~����Dф1KN#�H��v���[�B���)NC�,�n�3�g1�l��b*F��Bʕ\J�6⤈(!�bF�(�a��4�Q9����e��T��/+*�P�dj�� 0�?y[��ו}ٌkf��]��0��������*'ыV��/̊�Y����<�b�|��3��__m8(AY"�������J&h"�����'4�c%6��|���m���y{u��M�����?�ޭ'�0�£8��(��o�a�g�S9y0�$)�ǩ Tp�b�W� *AO�Վ\��pw��B�#�0��X~�:�kҮ�+�p��6�O/���$��D)��BB*cA�PP���� ���?�E����Ǿ���͋]���L_�pr�Y��24@�$d}8�"�^��1�-��9�^W�Ս�c����Ǭ���^�'���;}ün���Pt{;k���z���ڞ������G��M�����l�� I��D>Nh��ݛ�-���.���^��!�LY��u��{0WI�n$���)tebŽN���7��V����C�����+# +�wH�F����Ȝ�XP�@P��p���j��GԭS�=���ۮ��v��a��3����M;�x�m�f�k���T�vvK��Y�b��`��9�q�_m�c��u��ɾ���r}_d���"��zo�����`1w��������q���j����ǣ8���Kw�;�+ۧ��ڍt����3/�c���tyWg9R2>FqxNҦ�7}Q�V�0����#�^���U<�<�^����8溄;�`��������h�P��@�����bӤ��rb��E�v��c`JwiQap ��Q�xe\^���.du��W¯秽c*D�5�a�]xs[�e�0�@�k��P��þ0Ri=Ĥ��� sg�ݴ��.%����^��4�0F/<���P��p�� +H�ã*����`n������ HJ��! 0�w)*w�1<����D�� aQ���^/j,�[ �%��I �����*��F�Pb4��P�@���u�8~8~f�[�fMq���)�e��\@ Ȑ�A���Z�-M��������s���7z���w�� �C�3�X*0s��9��� &< T\��������>�� +m(����[�^���)p��C��K:��>�F�Wú{�1Y��d��f�fC"���>��WrY !����CK�x�^D8����ÓL�W�<�^y.��CDg��Y�N�S}U�^���X�4������sG)E��|0���ڸo�H���U$�Cd�l���y�W4Km(}�P����ǫ����w��~�����>p������u��J4me�i%����`C�6���Ƈ7*���R�o#�#��=��W�&7?��C�P�ؘ#���������x�I81�glF�^ħGB������y��'���K� ��bN�J]���z��E�%����Y]a#W�Y�+��ß�������솅�0N��4#+��/�� �d��%B�,��䟋ߣi�`�Gc���z���i��9J�7�g�u^O�}q 'BC��Odg49Gb�4~ �=��/u�C�5�1�c�*2��^�3`.����[�)�>� �&�������b�*Ť�CYڵ����}7s������6vi��n ��ɊƖ�n��0$�~<�uљ��}l��ƥ���]��9�5Ŧ��M6�l�Ͳ̓.�y�^T��N2�g4����m���=�Q���h{�M�j%��l˭�Eǯ�LB}�r<f,���U*�� +endstream +endobj +603 0 obj +<< +/Type /Page +/Contents 604 0 R +/Resources 602 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 535 0 R +>> +endobj +605 0 obj +<< +/D [603 0 R /XYZ -13.423 915.745 null] +>> +endobj +45 0 obj +<< +/D [603 0 R /XYZ 29.788 737.428 null] +>> +endobj +606 0 obj +<< +/D [603 0 R /XYZ 305.067 642.616 null] +>> +endobj +49 0 obj +<< +/D [603 0 R /XYZ 29.788 622.006 null] +>> +endobj +607 0 obj +<< +/D [603 0 R /XYZ 29.788 551.055 null] +>> +endobj +602 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +615 0 obj +<< +/Length 3103 +/Filter /FlateDecode +>> +stream +x��Z[oܶ~���$#R7�oi�.��6vч�8�J��Z����[��g���8I]��ND�:C~3� �/���ĝmw�;[�w�\�����j|'J#�r��P�$��V9�?����"=�rX$X��Q/��Z�����I$Y�r'߯`" +�3�{��� a<��Drq�'�z�&$K� +q�B���S;g'}�?���ܳ��tR�T���ΫD=/��j�S˳zE��2�������IY�4yR�Ip��%��tP��u��gt ��u2[���V��A�x����]�x ��K�$q����DJ'I�� +�7����w��H�{��i{�_�~�����LF�LaO�����}����6U8G�u����S9�sX x$�o����B�`�u�5�}sJ�L$|�������Mݫm��eScś�,�Q�s���$�}�HK�Y((�d�(����!3o{u�6�^O���+�����7l��g�� $�\ �8��%��U����V]��Rw7�ˢ�/�н�����~���ЪNչ�����j�����f��>�*�+�w���q��CV�Eg�I� +�-�mEK�6���]Yo٥� ��އ����<"0�c� t���0�5p�Y�����f�JѳD5�S�J���5}�ϡ�Σa3����c����4uv���[�ZO�i� @s����u��3.#���f[�:�Y�{�u��ϲ.���`ýّH���7/�gk��`�,��`yp#a�d�~G�ԪV�ʮ��*���.��tD�%*�l���E�`WX��XE�U�RuÊ�d@'���.�y �&o�Z�=��S�g���2o��7Ue� ��>���/�O�ם9>h�j,X�BwCM��i�3� V[^<n��m:c���m�e�/�ɪ"�O�C%�xL���\u�j�i/�uVu�P�E�Bє8S�BE��l�S��i8�vZ�R��L&���m�`O?��.���vơ��$@��V�AڇK��Usث��:U?�mSO�d�����U ��)sE��v�ŘB�m��ݛ3����!:��oSl���_��P֍��4��� D����3N}�뺷�,��O9�<�B�����1K�'��}s������i��@E��g~�Z��/F���P(�oS{f�����X� �¡�k�.��|�#��uewJ(�K�I� B��i���̷bC��]������� +_ ���ɠ�AR{�rYw};�ڌ;�i��DC+�~8`����ͫk�%��#�|��g�p�t�-�'�2� x��Z���k�S�qҞ��x:B@��]f��.��aS�K��� +��th|D"��p�0�/S ���2;?l��б��"æ��ΛO� }�V�X ,�d�ә�٢�>��X����Q�$L��m��g S ��ߜh�Hl���n�|h��-@����d���C �I����X�H;�w����t�kbKf����g�Zfޞ,ԲN +�;ɶ���[<���J�X��~�AB|�"ܾ�z�M?_lTO����0�� �6���ΒO�CZ�)�6��l�;A@ ��8w_�t�M��)�pH\�՚�0 +ʹd��娇�����љr��)�j�n��:������B��*�#2�f��2���#ܴkȺ2���^���4�#(�g��,LɻY�?�7���s��SoHQoJ��(���;Y��,��2�VmKHA[�z��-�h�X���҃,"�tdߏm��QX�9�ݒ؇0D�¦L�3bQ�LB�Z��=E�d�b/͐�s���1ֹ#��ٽʇ��^��F�P�� +]�hk��|�2D���*}3���zU���9���8��ن�Q����d4'�m&C(Hfv��^�5�y)2�~�렱h��\����7 HȪ"�}���������x��Jm�R�`9����3qR��?��_2����bhzѩ��'��M�Ӳz{�@v�]O�Br�|�+��'�#��4�D�v���j�ȷՠ}�W�rfI ���v��J��i���7�=�}���&u�`�k��Hi>��P�Q���Fp�b1�T5�>�ep�|��d����a�bX`A��� ��<l�_X>�R�[=Zol"9�|�~�w���F�K�o�R{{�R�2�d��g;��,����ju�[A�"����n�FOw�����%�T�h.�����Sq`��M�1�dow��O]P-1���tp�ŕ��h[���.��17M����;���҃���n� +D��BO�� 0u���Z�c]�v���j�9H� ʊbݤ9��lhţ90!tt�6�7�!u_c��Ӛ��Zz!{u�)�Z4��36����v��,�D���ٛ��ÝZ�"mwC��K�?�hs�P2�K� 'M\ lyd;Ygo�����ǚ��Tm�r�l�a-M�ի�XR�/����5D�������_2>$:���o����s��As mN�>C4�[�6���;�=��-�|�j:�?����=2.���?:y�r�������@���M+��^<��'�ߞ���� +�/�,���A"���?��BǮ��>h���[?�� +���ݰ��_����|����,��j�\g膺�K�k�㌯�|�[��P��/�D�8p�/�<P�쳭g��z/����ӻ�?} +Y�9ST'<}z�o�@Q�0pD�B��>�b�M_�����<C��z:����`X���z�#4]� ���C��Gx������[Y`�"��@8g�9g�рLBGG�?�T�]�L�}�LN�>g���;ު�[ �f�tw�ml?�ћ�_7��/��i�|�ǭ�m���p̗��z��r�w�lWǕR��bQ^��1���P����a/���L��6�2Ђ�3��^� 0'DI�O.������#A�?�A��o���m��ݗ��C]�s���䅮�~�Æm�╾~��G��(�C�e��^�סj��8�j0���д�()I�`��-7�lL֡���s��6K���\ߖ����٦g��P����q����6�i��_�qs>~m�[i���($��u<_���mc� +endstream +endobj +614 0 obj +<< +/Type /Page +/Contents 615 0 R +/Resources 613 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 535 0 R +/Annots [ 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R ] +>> +endobj +608 0 obj +<< +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [160.043 485.257 200.094 497.76] +/Subtype/Link/A<</Type/Action/S/URI/URI(http://fab-lab.eu/octopus/)>> +>> +endobj +609 0 obj +<< +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [510.593 471.708 533.919 484.211] +/Subtype/Link/A<</Type/Action/S/URI/URI(https://learn.adafruit.com/adafruit-feather-huzzah-esp8266/using-arduino-ide)>> +>> +endobj +610 0 obj +<< +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [76.072 444.609 109.253 457.113] +/Subtype/Link/A<</Type/Action/S/URI/URI(https://github.com/esp8266/Arduino)>> +>> +endobj +611 0 obj +<< +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [111.704 389.978 207.551 402.481] +/Subtype/Link/A<</Type/Action/S/URI/URI(https://github.com/BoschSensortec/BME680_driver/releases)>> +>> +endobj +612 0 obj +<< +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [79.903 357.522 235.74 370.026] +/Subtype/Link/A<</Type/Action/S/URI/URI(https://www.bosch-sensortec.com/bst/products/all_products/BSEC)>> +>> +endobj +616 0 obj +<< +/D [614 0 R /XYZ -13.423 915.745 null] +>> +endobj +53 0 obj +<< +/D [614 0 R /XYZ 29.788 737.428 null] +>> +endobj +617 0 obj +<< +/D [614 0 R /XYZ 29.788 648.325 null] +>> +endobj +618 0 obj +<< +/D [614 0 R /XYZ 245.013 606.185 null] +>> +endobj +57 0 obj +<< +/D [614 0 R /XYZ 29.788 582.541 null] +>> +endobj +620 0 obj +<< +/D [614 0 R /XYZ 29.788 411.866 null] +>> +endobj +621 0 obj +<< +/D [614 0 R /XYZ 29.788 377.425 null] +>> +endobj +622 0 obj +<< +/D [614 0 R /XYZ 467.558 284.213 null] +>> +endobj +61 0 obj +<< +/D [614 0 R /XYZ 29.788 260.57 null] +>> +endobj +613 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F89 511 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +626 0 obj +<< +/Length 3653 +/Filter /FlateDecode +>> +stream +xڭks�6�?��&����n^M'i�؝����$Z�E$U>����]P$-YN��$�X`x\�|� �Us�;+�wޜ�G��W���N����*�"��:s��~z4�f�4N3FӁ�d�ui�ܯ%D��#{*��ZMg:���)yB�NO��'E]�b/��8h��T��O�t�N��'} ��܃��tπ\�-��R�{��cl��/-�0V�H\�8��U�D'�������Z����y�Wu��=�`����q 2��I���ޜ]���KT97wN�xQ;QB��Y:�f�V�b}�Q<��ʦ��lq����g�n����Gq2�q�O���:�w|j����� ��8�C<�XL�S@'���9����!�� &�_� ޖm���6�J���ef�Z{:��S,]��0?�";���t�Px +���9��4_�$�C@q/ +QKo�d�ۼjo���b��<�J����dłI��L�G K禀Y��g9C�d -5K��|��7u�< �϶��EUl�M�$�</���<���x�f]u�n��Z���F��U]g���<^�3�2py�B��]��"�`��h�m���b��:F����¼Jk�+���ɐ�8��%A^]��0$��?_�0�23|C���)`H�&��(%F���J��K�|�t&[���8;�;ݬ�K�%�x !m�vBZ&@�3Vw{���D�Q��J��1�l��F�c�.��+P�a�Ʃ�PkOD�&�9~2�*�P�Qu55��! :I�{U/��d��K�.֠4��Q��%"���>0�fC �8�W��,�#M�X�ņ����R��U�eV��2-��)�Zi*Hb*��}H|C�zM@�FQ�*�T�0��`W#�ci��sr��f��zū�/�I8}dM�+CЛ��~d�����YZ�F2k���Y����&k?�2j��:��)wW���=,�Dz����~X[��:� 1gB8��ݕ��;`l����8KyL�ߢZ�wCXb���A�x1�.�9�8�6�RW��ȇ�b��~Օe^�LԳ�'`��AҖ�u���]Te��%s�k�.-+������!�B�%����w]�ا�g�1h�m�ݹ�c�YL�� �&J�#�G�#/�|C�+���m�=��>9Z����@?b���O�v�_B|1��*]�zr�:k��S6R'ºJ�m��s���D%l�-�/�(6���_l���˼��M�P# +�ز9i��ÔA�Ic(!��z��vMK(��V;�~F�&Jc˘16���s--SY�͠��j���L���7�c���X������e� +��<S��Aޣn +C�)��^_������ǫ�W��>L��� .�{�7�]s���6���t�?�M�A�C��=&#�6m�f��� �z����O�r���_H�;����![D���� ����D�E��5zS��Jjm�)�%����>k�>f����$�c����.��Ap��l��xgV.�.h�3T�����<���a�w��)��U˱�5f'g�m �9"�c� Dg��Fcd �t $:^;�Ϭ� ��oG`�m.�Xdi�<���J�Ǣy��㊼�Z���~��>��Z@�g�3AB�m�"�+���%���m��}�Nk����tßgz��l�[�o�2�t�F:��t��#��^�T>~��H��d��*ֺi�� �Yy.fy�8f^�kj�����o�a�q�.r\lYDž=T':�f��&i"4 lm�z[5S��l�SK��Ō� �du�:aO���m4>�2�"��Vj�|��r1�=�C�9����D8]�]��S�����E��R�1!f=)S�*5�y�X������c +=��G:��G�5w�i���<t -�}>P��k�U"�/�m��6��6�:܋jJ�EW� +��*۸���!�>�"�<{+�P2��@�3���L�~岭� ��:�KE��}Ug�)�ϵB���'W���x�#��U��0�/�&���C��� �r>�J�4� w���عH�i�H��c�pT�O��w����Sy +��+���u�z����:!�V��.B_�ςo���:]��RMx�z����! +QT��@�~��UA���;00 +���.m�c��\���|��l��F!.l>#m]uδ��6�z�:k�R���Ҧ�8b�~2a6NI����<�A:|k+{��T�HB/���h�}5{��#�2j�>�I�3Ie |ɧ�7k�a-�-"����8+�N�h�g�6��94��qg�y�W��|Tc�8|H*�Y���0.�� +���c�"+��a|���D��yD<3Za�`+�����l#Yo��!��O�j�=/(��>������>�A���c�G���"��Bȫ�x"�1�Lg�! +`�*4�� �pG8��Y4�Y�j�������pĨ��`6�c+psn%��9����G" Cȁ|���+�es1Lb��M3�.Q_ �c� ��,�-��x}�s�^y8ŀ��E�g�fح��y"��vD�UdT}�A�j ��x)�8��.{����#ޥ�LE��z�U#�g�/�"�����N��Ii8�=�S}��e/@�U����Slm�c�|QCM �²1��g�<B&����y�6-�I�;��d]��,R���K~=�!�Fb��~su��*G��Y����.|��4��Y��aAM:z�2�k�l!$�CR�r�#"h�A�7K��I�9���LH�m�J `��|R�x; +��Ѣ'SmOq$ ӆcl��$���ٗ�@��:�Y�˲�:Z;�F,��h�6�� e���NgO!��h��ZC<��&Ul6�\�m���Q���X1�z�m�pi*O�`4�ݥ�M����h��ګ?(����8������7��K���B�{�f��ȣ�& +��ٕ���~������j�% +b=[�o����k�G�*_Р��L��͈mQ �͠�俺��ܹl�mb�i��碫?��p±@+�K۠q��m-y��2r���O|zA�y��g[��Yʠ*��\_�ͳUn٦J��eƾ�G�/a�'Cu����Lg�1�T������dC��=��P1���X�=�fT����^ J��9c"��w������n�����0w��]��r������j*8�(�6�I��w��e���ft�<��v�F��p}��(������<,q�~��إc:���\!Æu���i�B)H�<E�kt k"���Ú�ԡ}J�W��N��Uf}C�K��<���dL�/�����=���Iuh�!=�rΎ�9G�A��';��/L��À��/��2���`7Ι;�u'�����a}����~�i�<�Y�-׆���$��-���<�<� ۋ��sR�W��k �9�Q<|\��&�C�5���ze�����"�M������r�^ܽ� %1/�v<z�&�<r��j���Gh�xN-�G���j�6��(tAG*�V�:ViMG;�3-h�e�l�&�\Љu��vS��Tg�UYv��2��+�S�u>�8i�w�Z!F�f���~{˞��T������&���NV�E_vH�=`�j��k�\���=�DʼWXq����s�� +endstream +endobj +625 0 obj +<< +/Type /Page +/Contents 626 0 R +/Resources 624 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 535 0 R +/Annots [ 623 0 R ] +>> +endobj +623 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.215 442.815 210.71 451.526] +/A << /S /GoTo /D (group__bsec__interface_ga157748484a31501acfeee3df656adf54) >> +>> +endobj +627 0 obj +<< +/D [625 0 R /XYZ -13.423 915.745 null] +>> +endobj +628 0 obj +<< +/D [625 0 R /XYZ 124.457 641.626 null] +>> +endobj +65 0 obj +<< +/D [625 0 R /XYZ 29.788 611.515 null] +>> +endobj +629 0 obj +<< +/D [625 0 R /XYZ 247.26 63.19 null] +>> +endobj +624 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F120 619 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +634 0 obj +<< +/Length 2884 +/Filter /FlateDecode +>> +stream +x��ZYs�6~ׯ`y_F�H x��[��G�d˶T�'5�B�9䄇'�����F������l�-�8}|胘˻�o��P��փ�Zo���b��z\ˏ}'f̊wB�[�����L�*��d��|�~<]ui���b.ÿ�9"f�z;a�ᾘR:�4�:��0b��8Em�G�4��i� +�(�_�����4�^��qy����%�z���b�6r�� "1���܊_DqxR��q�qВˈ�\�#Y��Y�)Y�%�M�}���d�y�\�����o��sb��ݽ�c'�"+���w��q�^o�mF�[Y�e�����wߟ]� �a�W�t!��?�V +��[.(�[{5u�Ӂ�ʭۡ�Ǚ�\/�>@��'���:6��͜����ׯH����U�deAo�,�J�/�ө'p&@1�'�Y�8"�,;��{�wĹ Y|'�$�^�iYV�UV���$Ϛ�#IhЫgHC�L��F�ˀ�n��f�Z��[��S,�I�POSҳ���f���_��9[��m�ȡa�f͆f^Ui�z�����Y�S�&�,ǻ��ⳬ��w�Ԏ�\��23SM/+��1`�vf���+䤅u�݁�WD�/�O�Q؎��'8��t�m�wߖ�h6Y}AM��-֛�x�fX7h5M(���-�ow��2g�c��6�qU��2+��ք�&��-����==���\-'vFÞ�����D�I�5G�q^%{U�&�b8� �f�>C���_l�����]��Nq�D�T���}[��G�^ʞb��dY0���Rb��M�{.?<Ʉ7��`�W�fM��5�: F`�$M��iZ��6���Y��������ᯎ1?1�/ +b}W�3 +t')��V�L�O��Ze[Q�V���I��I�?=ĝ�^��F���$�6؛�۠��=�7W��9�[��Z%��֟ƫ:v7e��}���@Q���tr�(2.3��Z([�ڸ���qY� +��3KzVr[��uO�(��3Ut��`잒ʃ��xL�+�Ňs-4�I^�ē�#��d��Ǔ�*�'l�ey�.��E|L�(l]ɤ1l�$r��9�lbOBJ�k{v�8Eg>��v�C��)�u��� + �8t�H����w��S��p�������u��G 0�c�/�����s�D�@`����*��55�[��BI�c"s�-���7Q ��O:���o�"[��������U�Yɇ�3��Vm��c��n?��y��]��z� �F@�m��0��f�]��JI��g�*��`��L8,�G�м݂G5{6�ro�ʽ�t�Ti����������RB��Vz���L�[�p�C����]^��@+h +�Ƌ� ��.%��>�����Տo�^����^��v��ŅvY�{����^��w8�~�s)w +2��x�Ӻ����n6��ك��}�2��R��\��Z/���iE��Ɯ�V��ĭۺ;���= 8!x��p�6O���.�+4�x �?���3���B^��ɔ�.m�Nv|q]Ue��\N�HV<�y15�3U��8�)���/t����n �zR>>���~ +x`�4 ���LL��s�����z��k�1�2���}�h���&M�=]��a$0��N�j=k�� t`�mT����P��%T�<�A��kf`zU_ȸ�IQ?�To�9��(��f�6+�����ǐ���'�R���=�f�d[ gq�[���mvm��ɣ '*b���ow�h�.B���,��� b@���:��Msc��D��~��I������r�C�"d���l�S��&�H������$*��R�}��Ɋ��{>QZ@,pX;�7��F�w猱���W�� }E�V�G�pȦ�Ɋ +25�":��7D�2����+Sӱѳ��R:�K|͊uަ�R3�L� +�������5_��~G=� :IU����t��)�Q����O~�dp�þ��a`9��uy�A1�� ��T��eA� �O�kUc���=5tm�Zǀ�E[��V��O*��ϱ���S��wfD���0�tE��RX������}���^�gU%�c���nVm�E�M���B�:ga��BC'�4�P�mM9��4��� A�l&)9��v8���K�F;���|t�+�ȷ�5� ,�(�`.��ZX��j̻ +b�6�k�"2o�=Vw����F��u�G�C����U�ͦ<�1���j�)�j�6v��K`>�G�k�o�>�|i���9�Il�/�3��"���r���t�1P�����'$�ᡭ ?*"?�����y���*�)k�8:��b2�)x���t�^̭�Cq8����ܷ��q����0�D^n�i.,���g8��bjY��3���7|��k�S��տ亡<�4�9 ���e�'@n�����(�.�-=�ݮd��s;���;6U�����V����?]7�[*�˕Bq�8"����V!!<�����������~��v��_hAs�ګ߇A��] +}g�:i�LхA��.�m7�y���wwe�������Ύ,���p�B{��? �!C�z3o��e�s0I7�֙=�'���*�n�u�s��tx�~L~���F�[%[�k��1��;n������������}Z�v�p%�[aa4��A�&=GOQh�~N�_���O�MH�N��5�ek��=`fX��^ʏ~��y���*o���h�� ɞ��� +�,쫲�MS��B����*U�_�0"�iV��:�/��D���ˬI�vU���]w]�B�*�� @���U;X��x0-c#os�fŤF� +�h�yf���Y�o����EM��ɪщ*)�y2���P?[b�����-|�i�� +endstream +endobj +633 0 obj +<< +/Type /Page +/Contents 634 0 R +/Resources 632 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 636 0 R +/Annots [ 631 0 R ] +>> +endobj +631 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.215 505.197 210.71 513.909] +/A << /S /GoTo /D (group__bsec__interface_ga157748484a31501acfeee3df656adf54) >> +>> +endobj +635 0 obj +<< +/D [633 0 R /XYZ -13.423 915.745 null] +>> +endobj +69 0 obj +<< +/D [633 0 R /XYZ 29.788 737.428 null] +>> +endobj +632 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +640 0 obj +<< +/Length 2645 +/Filter /FlateDecode +>> +stream +xڵ�n�8��_!̓<ɢn�`�M�x�,&�y� Z��5���a����*��d����&E�u��G秿3c�8��p���0��0�A� cF�v�F#���O����� ����� ��:�{��b.ÿQ�~��`��?Ǵ���|/��Q�쀹� �`�$F����"��Fe�Ez}`{����+���G'�g������>��>�,�W��0�Gl���5;��$z���sAJ#t�s�x�u���?��n�h�O�f��=�fI��ߜ��d���Qd�_nbGqlD ��<3.�7u�n-7��3Q�uӉ����o��G�0?�� �4F�_#�������Dp��3 +�l̃��,���L���N0���o��x����g��E<�T�X7�����<����Ӿ�(�8�@XFh��gX�knL$���S� +��W�v5��Q絛R$�}�*�˾i�{�M]����.� ���N4�U����{�;��ȑL���A��y��+�:p��]��8�ӏ'2q��Yּ�����w�g��x�W�n��3N��-�2��$��~����!���Ӻ<m_��R��*�:t��Fؗ ���U[�m +A�5�H�d�?Zy��@h��� �ȣ!M��`�ƅ���1�~&���NtJ����D��GWS�v��y�Wk� ې2>��}��\$#����0O܄�d��w�[��U�"4-��{���������o�4[����营�F26�E#�{�v�Ac�)K�1�96�Ghv�H]����^�����46����&C���X�@ݔ��;�2�ׂ%�.q�h�_��4�����"��ox^��Bh��C��!�9�(����w���_jM�`j�+v��6�)_����ܡ�zI�lB9�Ў@�cY��Ѕ���A{�}�_���_�������������M�������"������! +Bj���ȄS2�̚�D^nQ�J��b;�L�Ȼ���7g!��_U���^7��ð3��Mb�AwFE�{�r���������7����z 7�ě:ϖ4"E�]����ӭ��{����F����E3�[��T��3H� ��E��h�F�ɱ �./��rK�yK���{����&`���8d`���"�fJ�/i� �9@�?��̋"o2�1���(hq�B����D�Zt2]�0�O�L�W�"3!;��2��|[ܩ$N�<T�֩S�h�d��=8�镻Ȫ�ۺ����I]�k��W�V�D��{ч��Ȝ��<n������ɷS��{��K��s������()�ЧyʧyAdV5�=Ԕ�fV�w[�������y�Q�A�%��Q�g(5�� +$'(H�J�W:�����<�;B"s��84�����̬�r���ċ�����&��P���抧�L�6Ȣ���!u��n���U)���?)y +� +�FN����P�43[t5�3s�T�Q��&g��V@أkz�Y�P���˦/�L�:i>s�]/v͓ן���^@rB�d�B��i�+R[���%��UO�Y���U�`Z���!nD5�=Y�� ]4�(x٪o^���PZ+�E���d4u�FA�۾�e���5�`���+僞�S⫢���4�^�Max�Ӵoxz���ͭ��jk}N��F�wml/It�oW�<�w���k�*t�K��A&]`��al{a2 ���WE~�@�����Z�L��w�(��SE�Ras/�I�m�X��i �I����R�O?��1�U=�-�#z�Dxoяҥʲ�P��T���i�� +�?J�6߿�Bb?J"8��nW�?NV����w?���z���ڞS���T���B0e�nh\f��k;�űw��T~ +=���JM�2��P�U*Q�� �tO �s�.���,�<׳�hB&x1^�ktT6�G�a�d8[�ț�1�E^}�|�nd4�9�˭��Z؋EӬ&�W�K�0[�)RL��l4�S]�M�W�C �P:u>��R8�1i��P��M�~��>��0����ZN�;܄�����l�|�"SP�(oխ��4=ƀ�U6�c���5��s��K��w<�H-��y�ھ�>�Y�d��U$�!����A���߰qͷ�V�鶿De��m���Z`?�����q��;y��8�Ʒu�S&��R4��"�Aj~~�E�&���Ȓ�E��;Nlѡ��Bٖgڏ���s��CB�n�R`�Dz�e��2p��X�LM�籝�}��/��.��6�K��� -7�!����N$Kl7��W�`�2c�>h�I��p9��R�c����c/��v���q`�f��bk� +�5�0�h��ϧ���7Ț��8�� O��N07�vb���$���ii|�T��<T�2j�(?�I�(z9�oÃ�'0�n�ۄ������1������)�|�e��:y���`�p ��y\^~� �m�ka���(h��כ�U}��ȏ�fVk�л~��Pgy��[^��)��u�q�v�C������0��9@���č�~�jx� @��M�ͭ(�o�]�������;�n�|���n��G��P9q�.)I8��y� \_� +���W��'K�>���� +endstream +endobj +639 0 obj +<< +/Type /Page +/Contents 640 0 R +/Resources 638 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 636 0 R +/Annots [ 637 0 R ] +>> +endobj +637 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [53.898 228.11 143.761 236.821] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +641 0 obj +<< +/D [639 0 R /XYZ -13.423 915.745 null] +>> +endobj +638 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +646 0 obj +<< +/Length 3484 +/Filter /FlateDecode +>> +stream +xڭis�6���� a xt�;�4N�NҤ�:����(H�"UQ�����H���3N�x�M\̮�Sg՜����Wg�á��f|G$�$�:q�H������{����x�`$���s��:���DL��:����Dp�ӱ��.��<t��An�z���$��8�!���)����qF��a7�{0T��P�7�yQ�lj=��1�<˗�$��[Z\�Ϝ�� N��\� �()�To#_p��~x�����%$�>�q 2��$���gg/A))'IE�l鰄Dq�D�>�����>��l}�(vod�Tu+���g?�]���@( ��d��������A���)� � �)��!�3*b���$�:A�VαWׯ�x�"$,�L�\��yx]�rU�m^�z�U�/�b��t�)�}0D���~l�� �H�O��6@�n-k�Ąn�V�Ϋ�^蹦�nA�z~�f�ӕ�^V����Z���~��M��\�s��}W���rQ�g�]k��ͪ�0[� 1O�ʯ�f[H�1J��%KF�FplcF��P�W�Ê�Q���յ��܉H� +�1�@���7@��("��,�7��< B��r0�D�������/�۔�R`�>M�'ʃ���Eڦ8|Sei���E����a�c�lc�8\����Zj,c ��`�@K�RA.�d���ę�웎W>�L.�_����w����ͦ�c��bz,���$�*T�Lj�wG��rm>%q�m�UW�����T���sx��wf���BVzf+k���h9�-�����J5��6����L�Y�mbjf�kR8앶��i�������ƮY� �"��3.�)1б�=�#-���=�;�r+˅�~Zi�R�^ݼGu�?�(v�Ⱥ�]�]��AZ��]����*��a9�6ʌQ�{Ї>��,% <�NF���Ul}8��+��Qst8£�gVm�p�k�p��BN�n�"�DI2F4�˴ε1��m����È +�0��j�Ȍ��4`��?�Y���p���M@é��G^Z�!n��W9��cm��31���� +���al��'���Z;��S�a��$ +#p�1a��Z��4��88 +j"�Lin�E^~�����qԻ���{���O�(��d�-d�*$I�[�%$Y��T%��{ăY�b���~��F���<熳M��N)�����z�|�]��;��B֭q +�u�Ԩ��)���~4�d�'�L�^eF��'D_䭬��܃��%��ښ�yA�HA��!�� G�Sp<1�`j��� y�apr�/@==uP�a3�T�l��>E�,cH/�M��F��!�ߞz�"�N��q����A<N :Z���8u�b��tz>������O|�_BH* �C��I�İ�&1,��f�uZ��sk��J��ģ�Ȳŝ8�ȢО���s^fE�0���~?ӅB4E���MY���.L��},�/�W&��F��t� #!����z�Sh)XnB��r�!s��l��|F��qa��&��la���m^��2c%����'�0q �>��W �R��P�D� ';CQ��f/b8j�E�bBNگ�@b��O��$�"�O +�ϯ�}����j�ug�x]�c�^W���I�S+�l-��f��]�ɍ�st�8~[�yk�:���め4of�r�SȲ��5��������gC6�����������%&Iu~_ʝl���j��NM�� 7��zm� �`hU���̳YW;�b.����@��#*�^����?�]u��@pT'4.�#���k;�}��R�O=�2�47��/���\UУ�<��*��*�P�� +��b����G�|W��P�P�-G�1\QvՔ���b�ኊc�h2��>W��G���� +�PE�Q�$~�Y�`( �q�7]�ɦ��D�5df 8y�k������^�E����m���+:���6[�p=Q�����,v8�bX;���'��}γ(tG�����q���owz��'0��=3�r����l�U{i��M���;�k���鲖S��B��B��T���$���b+5K�f��=�g9��܄�A�E��>�8�m-= �+�0�0}��v_��Hh�0S�a='� ��{�Qڵ�ca39��%�6�KǨ�A���D](�\�ښQ�����Nvi��nԭQ�� ���6D1�6��0�ڳ�}�V�Ԓ���h���Kd��*�b;�ִ��>��Fu���V�t�M�m�Y�^}Z�(cH�c=�\�g�յ������P�t%��Ba7퇀�T�Ű�_T�ʃ"kc�:�mk4[h���#4�A��O݊VV�W��ygT���'�G6�K��K��V�S���dܫ�U�b��=���X�39Q~[.��>�" �U�r-NC�=�� ���Q��9M+g���ɴ�pM�{7��c����ۺi�l_��Wv�m�\@�Í=�R�;X���U{�CZ�&���0;�� +�7���V������6"�:��O�O�u���cZ��Ҧ�(V,�2Ӟ���9~��!JR��hx�%���#(��laD�$�N���\C� d��%Cy�ہ��Im�8R�PA|��liY-��r�H�/��bD,�=]&�-��qO/�>|��h��?��!���������o�n�/gW�F1�T|�.���4�y���꼕�ߵL�gSH���,ą/1��b�H����J��V��D7�BHi��q�ֲf������O�Ѡ��'��� �=z��z������n�;&�̺1�Rd*���t�K;��Z��D�d�t�e>�D&$���ƈӶI��یl���g�k|�@V���] K�^=���^J�8�7>�7��Gd�4����qxo��@��#�W�`�����c�YП�C�s8Ȁ'�?�������B�M�@���ux� �o+�8�3�k�{A��4�VMDŽS�?��}��_7�\;����O��{e�Ug�l�{��w|Qe&�+�n3�5�6b\�{��Wa�{�)����]����j9�O�(rdU�D�:���!��w��wq�����8]{牧go��E/���P�W�P���8��d>M<?���/i��_s���ȡ��C}��9;��9�U1�9��`S�eA��_P��N�>@f�9g��[�`�7X���?���?|}�~��Y�-7���fU�Ǡ�PwĨ���q�q�M�=&��,���Q<��6���a����Y�#��G��陁7��t�P��o�0�$�2ŎG��8�{q�3p_m�?���P �����\�.36^�]4�}�Jk����z�7۪I� q��mQ孽��S��D�~*v�"�Ϸ��h�|� ֤�v6�,�����N�N˾/�^ +�_�foej�am�gLʼn���s�ck�Z8����+ 6O�h ���06g# +endstream +endobj +645 0 obj +<< +/Type /Page +/Contents 646 0 R +/Resources 644 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 636 0 R +/Annots [ 643 0 R ] +>> +endobj +643 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [112.478 186.253 198.157 194.964] +/A << /S /GoTo /D (group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) >> +>> +endobj +647 0 obj +<< +/D [645 0 R /XYZ -13.423 915.745 null] +>> +endobj +649 0 obj +<< +/D [645 0 R /XYZ 29.788 683.386 null] +>> +endobj +650 0 obj +<< +/D [645 0 R /XYZ 29.788 651.837 null] +>> +endobj +651 0 obj +<< +/D [645 0 R /XYZ 29.788 606.952 null] +>> +endobj +652 0 obj +<< +/D [645 0 R /XYZ 74.046 397.525 null] +>> +endobj +73 0 obj +<< +/D [645 0 R /XYZ 29.788 377.594 null] +>> +endobj +653 0 obj +<< +/D [645 0 R /XYZ 29.788 51.866 null] +>> +endobj +644 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F29 648 0 R /F120 619 0 R /F33 531 0 R /F30 532 0 R /F44 228 0 R /F32 514 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +671 0 obj +<< +/Length 3125 +/Filter /FlateDecode +>> +stream +xڭis�6���;�#gL���v����i�8Mme�;IFCS�� E*<�����}�Фٙ�E�û�.b��zC�Myb�2^���A�� z,� ]Rj#��7�'�ݙ<(�`�e.#�W͛=���!��_� �R#� �u���� 8�� �=�(q)@�&�����@�g;L���ȌI��N�m��M��5%Ў��1����9�:��ɘ"�l�r)��G�˲�� B��Tu����,��e�6��5'hu�Dk����oGH�Mh��O'�A)�MB�����`!���C��be��=��x{j2?�]�̋�ǧ?�\,z�PǕ�!�4��}���lX�Tf�ԝ�8�Fj\�i 6�n�sm����<A�6���Ջ1�����ϐ��Y�7ET%y�/�d�%A��ӗ����!��f�!q�0=�X�F������"�ũ�Ίd��b���l�Ӻ�0D���uA3�S�P"�B�80d[\F�7�Դ:������)��>U���JJ�V�I�4���ٝ�Y^V���q�6�ռ�T������`vSW�<�K��)��L�V9V ODg���Q��ɐЂc��"�H��#y��QY|��6���-W��Tc�[ ����Ӡ��l�KXP�%�c�K�2�|�Wg�e+�g9�c��T��ШE�ge��w)`i~��M�>/�D +ON�0A�U%;Nc�ُy�LK@`c!�8��`�C$MJ���<Æ��P[{B|<��mͣ +d�/�Z$����T��A�i�9Ʈ�X!c<�0��"�W�a�EK�[>@�����j,FQ��jB���蹠(�3��X؈^�̢]����^�����uх�.�6R�Ч�1������ZQ��o�4*p +�Q_,��ڳŖ7��=��$4t:a[HB�uK���(��J�������~)�D�/�/���k�?��vC��r��~oQ�%y�#Ԩ{Y7n+j�w+HmQշ��܆���q��� b��\����.K�6[p�'�oQ�>��aph�Q}Γ�����t��e�<���[B�x�B��RN��M@Ǡ(R������S����q$��hݔ<^����eYߔq�H��" g��+��H���1�UQ���7��y��×H�Q2MM���EPOq]�����g��4N(Ft�Sn��T�L�li�<����m/�0��I�B�!7�H)ñ%��u��1�YVc�S�O5/+�Z~N���R��|G?� �gi��pT��bq��\�������+�ҹ����0RKJ^UI�)���}��.tsyy��囟�s����������_�H���g�yc�6�; +�w���&�'�4�)����=!����hr~�e�ɣ�?��Z({��ti+�!ݟ<�`GϰyP'ZixgSd���o�Pj�N���Z�T[m�r��d���M��r[K���Tk`Gb��Zȑ�VX/ǽ�#��v���b)85&��N}[�$s�������9��]�_�yu��:_\,A�����o�../^/���^>��<��(�m,Ƙ�>;��6�g"G���2���V�m�N�ry�6*�=��O�4� qRQdF2"�{������N������_��W�&�T#�>K;�p��Tɪ�>$jZ���Z�iQ�=��(C'�~�����V7�@�ۺ�����+J�n�p�Q�Wk�w���&��@��V�z��ż�T%F=n�:EU���E��Z7{�����QY��y�(�̅��a�:�d�"h�L��{�ca+)U~���j���m��.̓)�?;O�\ͺ��a[��P�o���#˶Ba��N��%���;K�h��h�d�R�[�UYAXA�m�(��ls6��w�!ղAg���6�ћmꨈ ;�V(��s�S:KNM:��Ȫ�����/��k�bYe�d�m�m{ķ�A�\y���'��=>�nHBw��uS��[g g�w���D3U$c$Z��.�#�ջ�;,�<�,��S�M���9���C�٧�1�C���Q" `M�%g�'���K,��V�kŅ+��E)x�'8�d��X7+���,1��B��G�`��P8��t1[���+�>,p �N�:��R�Q�� +�}� �Ҡ^��W�&E-U��Z��vl�|�5��<m!�ȅ��*��4���7u��'�<nS�i�<Z�H��R�����F|���H�4��-�-�I�l��WM��3L����| �?DŪTu���:W��}lk��H�ҥ���e�;�JL�ԊL�fM*��I��ii�5xS�<��<S��/�������9�&�Q�q�ů�륀*g��"�"�5!Tf~�Ss���./n���&�%�����զ���$]�l��"ױ��O�8묬c���u��jY~�]�ڐx� q#Q�?$e�vا<�4z�ÿ x�8a$�M�ѰH2���B�Ǵ]�5�������_5�����Z�4�%�L?e ����j�!Y9,[~�T�������Gs����:� \�p�EO*4���}N����]�X����$�d��i�w_�ނ8v��!=��b�k�>�Kn�n"�@1�2_a����t<�Z9x���$�6��%l�<�"� /�-�'ن�6־�ZM��0���B|��5��zwË�OM�Q���m>�����}�7��x���e&*�E�f^�*�q�Q��]Hp�lR�K��#����#�Z�u�#��\@�X�� �H|�w�'���U�T%��Y44-��Gi�ߦp6��oP|=��b�L,3&��� +���(��h���¹@2ͳ7I5c������fo���Lk��&����p�~+H�:�%m�� J�ԍ+��d��)���xg<���N`�l�HH��%��&5GM���i���7��M��������2�������4T�aѮٶۻ������'�-J'ԙ��;���I�l++$�8`�e�6��@C�F�-�^%�>/���S��>͓J�Up0֫:n��_%�,� �|�M�[���h)լ�A��-�&�s{��I���>MZ{+z��͊$[��(m]˞��j�9�ި�e���G�:��SO[���b +endstream +endobj +670 0 obj +<< +/Type /Page +/Contents 671 0 R +/Resources 669 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 636 0 R +/Annots [ 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R ] +>> +endobj +655 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.529 544.141 160.498 552.932] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +656 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.529 525.212 160.498 534.003] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +657 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [53.898 516.074 156.314 524.538] +/A << /S /GoTo /D (group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) >> +>> +endobj +658 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.349 506.283 302.764 514.859] +/A << /S /GoTo /D (group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) >> +>> +endobj +659 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [45.529 496.898 135.392 505.609] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +660 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.243 496.898 206.525 505.609] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a06af666972edcebef3302d015f1d56c5) >> +>> +endobj +661 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.874 468.505 206.525 477.216] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +662 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.086 468.505 281.843 477.216] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea2368e219ebbce4e1ede7209486283a6e) >> +>> +endobj +663 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.874 459.04 214.894 467.751] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a150ba3a737fb75f56052c60d55246ae4) >> +>> +endobj +664 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [53.898 449.823 231.631 457.825] +/A << /S /GoTo /D (group__bsec__interface_ga6c18af8c9be0813f7d8e3547e58428db) >> +>> +endobj +665 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [83.188 421.182 185.604 429.893] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +666 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.738 309.149 358.003 321.653] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +667 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.253 295.6 220.518 308.103] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +668 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.86 295.6 466.962 308.103] +/A << /S /GoTo /D (index_intguideBSECConfiguration) >> +>> +endobj +672 0 obj +<< +/D [670 0 R /XYZ -13.423 915.745 null] +>> +endobj +77 0 obj +<< +/D [670 0 R /XYZ 29.788 737.428 null] +>> +endobj +669 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +683 0 obj +<< +/Length 3271 +/Filter /FlateDecode +>> +stream +xڭZYs�6~ׯ`�i�)�77����TJN)ָ�`�T3� � M������"-;�U�� �������-7v�3v3ޜ������0Ë<+��]� +\Ϩ��=�� �%H�<3f�l���)ץ��47� �^h�7�b����ܩ����:���Bny�F��@��ЊB\4|�qm���Q�B;��4�=hJ�'d��u�/+X��b�WcI-S��q�݁Z�\��Fdyn�juZ��m��J���(]O�]��t=�&���E��c��G���g��!(�cEn�aGV�F)�S�����I����;Q6U݊����g��e����l����0#��F���$-����q7��rl�@���a��N���4��͜��-;�%�^�P:\����q�U��x�e�� +}m<}��rp�8�U*��@���܆�����z@<��:��E��"U��k|4=�[5������?G���������-���$\���=+۹�k�~G�=�b)P5Q���))�ߞK��2k�e�P��L�I�:�s�N����,!�a��u���?g��6b���ry�����S��8�lv��Je�������V/,&�;��mE�:��D�^>�ܪ�!�/��T���������nn>�.)�m�����=�vY�Y��F6 +!�]~�ǥ�+���h{}uss�㛿j�q�O,���������>CR&�Zp\��h&,*DZ�g�:��I=�2��72���1k��z]���}^�Cu��+���=��C�{K��(���i��n!k�=n�E��5�?(���gU{�A��@G7`<��)����� +������~u��8����Yl{�û�?�Y+﵈Szmr!2�B��i�6nد�N�r��d�0�|$�տ�́T K�9TB���z8d�H8ܷ���}�V]�j��}����0|����^ +�/�sB�C ����\"5a��]y��Wu������$u�r���~3��/��FlW�SQ���402)�����2����UuxP0x�� �� 1i���q#�1(4�(��������b3�v��Bn#qM���B���dLS��≎���f���hN��#�f�5�)��k�,���� +���K� �D{�f��H(��^sյ�����E�*�/��Ǚ<����PƑ*��d�,���@��7�u�p�ÕPU`S9��)��j��5���m��%��Ȉ}#ڣ�"�&l�b��1��ʄ����H��/���`2[c͖�����ׄz>$�X�5S|6��c�(������柔(oiȆC�7����4�c]�,��G�-��-�[�7\�7�������3�mgv^�4/(܅y!,ߙN,_�n�������f-��+���=�T��g&f�;K�n��5E� V]���c���rG���c��yஆE�L�O�v�f)EҎ���1edSuu�S��f䦊�t�� `DaD�[:ۡk�p]�����Lw��7f�Ĝ`�NS�>DA4�C%B���V����R*2�:Fզ���MJ�,��G��� �GM�yj���AV�������i�2�un:n��Z�����nA�(�:�ld�Ҿ�g�\n�R8��ԈT�Fө�H�s�9�F-r87J���@u�� I2������TFy�Hn-������.�B�����X��#�Җ�-��v��P�`_� ��� �?+S!�������d:M��n/��W/+mO�<�ᔽ��9�;��5#�;������\�:C��9\)��q�t0���ɂ�k;��)'ٯ�����Q�iY]�FFy�7^�,͢Ii�mF�Ğ�/~��V3!�x횼J@z�:% �����=���yS�Zc��x0:18��(O�������N�p�N���0&��jZ5���L�'v�9�����yE��V������Y���p�~�^g$q�h8͚C?��J���c�^vqm{���G��;6�2��T��j{;Spr�#.�P�Q�O���A,�2ud5(��<A�{�LU�8~��칫�L�Lje�Ty���+��^u�(c�z��Vb��V-��u�C�Y=�T�8�����$��ﲽа��b\*��k�҇��v�m��ĸz;�5*gp�vrW�~Cx����M�7B��F?��UUXϧ�ԫ��6����Vr +�^�`���yjB術��䦅i�U=*�T�Zt�� +mi�H]&�͵H)��DLu���'�Wi*%�۪.��w$��X�=E�����x%?z{W�Y�/ԫ� <Eor"��7K*�����XٯBZ��Ä���u� ����!��%p�P�>�V�4Y*�[GX%���b#�T�K25���dF���l%��s����W��"�R7�95�kD�5F��a+����j3�-p:��41Z�Q3�v���DmY��s�ױ�e��GTC��� +����� ن��n�����>a����ڂ=��*�9q]��u$U �j;�ك������x�@�_(wE|E�/��@~������s��k�`�gB���̅�T��{r_0�=���QV����+E=��7t�4zn]�x�z��k ��`��i�j���Y���1]����6L�X�A�}u�/L�X��YVA��-���6;QS�n`��dT�j3�����S&W'��D�1~Ȼ�����_���Ki��=�a�;$�����c���Z��!وZ^�E�cx�ث��J��:���/��L`�� l{���`����2�T_V E�$��0k(�C���5�*����SS~65�~d,T�&�l[~oDU�:n0{Y5�p5��:pޱ\�Y{��س��1��X���+��?�L�>�.]=���jn��GG6��|���)�@���X�n�l_��8[`3��P� ����? +[P�����A���5�̜��fs��䚬�#4O��S���=�ƴwR��Gj`7�b��9'J�?l'���τW��+��y:q�&�!M��$zg�h��I�6�20���Ɛʤx1O3��H^�r����'�� ~����M�y�0��=p�ž�:x�&ۄBX{�!����t�g�k\>*�x���8�P�[��!��V�u����K�.@jزA����6݀'n�ڟɫ�!��.=����{Y~#-�JY���mJ��XX-l�-��+�X��C�lW�������1(B|���h� +endstream +endobj +682 0 obj +<< +/Type /Page +/Contents 683 0 R +/Resources 681 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 636 0 R +/Annots [ 679 0 R ] +>> +endobj +679 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.215 597.21 214.894 605.921] +/A << /S /GoTo /D (group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) >> +>> +endobj +684 0 obj +<< +/D [682 0 R /XYZ -13.423 915.745 null] +>> +endobj +685 0 obj +<< +/D [682 0 R /XYZ 29.788 351.113 null] +>> +endobj +81 0 obj +<< +/D [682 0 R /XYZ 29.788 342.087 null] +>> +endobj +681 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +688 0 obj +<< +/Length 2471 +/Filter /FlateDecode +>> +stream +xڭ]s�6�ݿB��6��w{��$n�N�slg:7IgG+q�J������ H����8w3�� ��"�����ζ;��9/N`�p�~���i�RΝ$,B������g�K��Bd3] +��|���y؋;���a�;�n&�a0�t�ײ��q?rℳ�d��0'�&(�Q�y��TνL?�0������A�X�����D�_؇ոO-��r%�H-2�� 'ea���Zw��+y���>�z���5xH�Ò�&o�8��>�i��^�,��>K�8v�7�HY�$N��y_λ�Ӻ�oN]'�+Yuu�������_���A�=<NR�i�����9L��x`T��j����S:Wc�/x����\� '��ֹo���1x1�W��H���^n�l��/zUH��c�髿ۨ�V�@}��,��8An���aʂ����� E�x��%A��|o$���I��(<.U��*+�'�͖�9*պ�ڻ��G�uƓ�qA�($�lW�jo��b���ܲ�u��V���Յ � +�~ ��ޠ�ҧ�����r�H8��5,�ͦ�f�wˉ�Y�����Ϻ��J��Z�z�8W{1|��#�����R������W�g�竷�.�R�[<1�0oc�u߭n[���q+���R����l/We����S���u�Q[M�'�C\�� Tп�z(E!$6�@���ŕ��%lG!�^5�u:�;������9ė�@�*�sY F! x��u����8Lʉ� �܁X���)�Gɢ� ��0 ��NuD��]��(b1P�� �!M��3��uY�|/n�zG$��r�>��o�+ÐT�bX�ItT�i>S�G� +�������k #k�Y�j:���C@�p4wͳ�~H/�[ρt��=B��[� wt%�y<��\���v& �lהZzA����E{��~o"zS��0�6k�Iy��0n��R��بR>^�6r��a��͂-*rL�`d�����VE ������@5�aVҠ���)~m���d1�Z�֍M�C�����̒�I��FuCQq<�������M������}O���g�2�I���������:������������9dԷ���b����d+Ϊ�H-sl����j,��ޏF�����d7#��{<�?����˺n�0b?����Y<X����}�0�qp�&k�*Oj�2{YY���]��g�f�ʹ���Z�����;�Ά�Z�<���v�bZ�������c�2�P��Ѐ�t��m���$�a�!&>AS�le^��5V6趠V<��(�tZ���yhF-�oH��梗����M��0&���[*�%���JlG�RG��W���X���0 /�!֍�n�B�|p��<��� ��s�Gf�7�yD� q�]4?f������,� ĸ�+b��|��eT + +&Z���˦�]��M�S@vg�B{؝�����&��?�}� ^̒0����O�L�h��`PB����Є۬3��@9�rx-1G�3��4�Ш� ��� ����گ����i�������I|��Sp./!�[����� �vO�(g��r?8k�^U5��~�Y��U���'�&��Z+0���}٣���=r�gu���z��x����A�@�N��O:�i� +wh`�Lw�D$�c��z�5�`�;��B�gL;,ih/�S@ʧ�ϣ�#����aYMӴ)L��h�@�̱3bdf�[Y�f��X1��}�[��4 3������T�b���x[�?�2�!�o1�Z,��X�vʓ"��9t5� TW��$�B��u���V&��"B���=]A�=�7Ƚ�HU_��"��� +�0�)���z�"�ɪ��n���G�p#��L�J�If z�L� Q���U��<?��������oy������%��WE�:�~Ă��|�~���4��_M�4~������� tT +/���/����{J���߭e�éAv}��"�=����=���W�o�DŽН��� ����b���Y@/���P��"TjoxA|���7Ã�C��3��7LT(�ss5�Lb�GБ��S �'O�����|;�,�I;'�,s��]1MB�.�`* <=�v�#}K'c�#"�Ή;�ug���*$�d��1B��>=_?e��yV�+����Y��� �%�e�J�����6�;a�%�*�8�����j���p�|�?lB����TΘ�5���(�~���<y���p���`�b���&з�ǃ��>ĵj{�76YH��%����6k��q�UwĺP]SwY��PU��V{�<���y}>���a�Ym ��ݏ֘��%��|�ml�NL�NtG6�4p��L���h�=��./z 3l�����}�3 +E��1�V���&������ +endstream +endobj +687 0 obj +<< +/Type /Page +/Contents 688 0 R +/Resources 686 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 636 0 R +/Annots [ 680 0 R ] +>> +endobj +680 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [112.478 710.784 198.157 719.495] +/A << /S /GoTo /D (group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) >> +>> +endobj +689 0 obj +<< +/D [687 0 R /XYZ -13.423 915.745 null] +>> +endobj +690 0 obj +<< +/D [687 0 R /XYZ 29.788 690.281 null] +>> +endobj +85 0 obj +<< +/D [687 0 R /XYZ 29.788 682.267 null] +>> +endobj +691 0 obj +<< +/D [687 0 R /XYZ 29.788 482.42 null] +>> +endobj +89 0 obj +<< +/D [687 0 R /XYZ 29.788 474.406 null] +>> +endobj +692 0 obj +<< +/D [687 0 R /XYZ 337.74 394.308 null] +>> +endobj +93 0 obj +<< +/D [687 0 R /XYZ 29.788 372.272 null] +>> +endobj +686 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +705 0 obj +<< +/Length 2432 +/Filter /FlateDecode +>> +stream +x��YYo�H~����4����9�l2I��yHE�%.$R�a������C<"ű���@5�������>�}xG�es�;K�w�O�á��z|'H�P�Ă�HN-����_M>*$@2�e#a�LW��=�������(��H��m&�)�c�����<t����2$�z0�b���4���pJ�(��'���!�AS�Pg7�\T��qf�X��+�$��@,�.�gNB'ѣR��{���|��A����o�U<&k�d���'LƜ�������� +��r��(rfwKH�N�h{�r���j�թǢؽ�eSխ�N���vr9CE�<<��i��?��;9����T���� N��vn�2�h�\��\���j��p}H��Et"���k-�M��e��EU��ȥ����/p&���`rshЀ� �S<Ľ:�E� +��T��""�f5�z��J��{�n�V���j�[�Ff�7��6����?:�O�L�|�}8��z�wU�����j�6Uټs�,�]��d_�|H�����1�����(DQ�f+��}Q�]����_�ޥ�n��Q�,S�/��R�+�*"?��0�0�>���ث���i+�M�h��آ����՛�������ޓ�bY���Z�sW�VUwV��*mӺ��D�ۺ��h��ճ��M�����9��ٴ�fkt�M��W+�LL�M�n�.2�]���Z��� +�eZV�MU��3�j�)p�`�ì� h`�b��i � ���,����f��\� �Y��i�`�٤Ei��߅v���Wbݓ�+K��*bG +�� :�)�bS�K r�;-�Rc^�n@��#���c�F�hW�ʑ��0j����k�z)͊�t�Ɇ�z<�H��/��k��w���fݕ�a0��"���C2��-�b-��u������T��-M�R�|5���ʺ�L��?1�i(F� [������f�C^|�d+3��,d��Ү�Uf)DL���W��W.�D`82�S-��f���vd��-��M\:�Z�d�c�ݪ�y]b���������1W����&m�DeTƨ�C&����� vi�m]d��A��Uk�����}��؈m�� ���O���a��mW�������( +4�j���ۺZ�R���R�l�7�E6����R~i�p�D$�|}��*�b#*ƺ��߬�k"�� (�!������ �����y��M��w�Ή�����'�����k��i�F��*�[%�_pK�͔�.K�d��0њ/�����/S�[���#��!��D7�.M���*r=T��4ʫ�Y�O �8GՖ�3�E�tr�=uC�-���M�DV��7��u �DE��c��i2a����xj&�O(�➜=��[@��]O�8�jk��%����>���4�s���s�f�#��pPȊ�8����x2��� Z���V���r���oNM�ý���3�Lsݾ�k�4�������D��ݽ���f9@ �cL�00F����3�m��?v* [K�������?��@��� ��tVu��k]c��n*=��s4���ܐXH�Ёp!B林�B!S9b:�oF�/�n���,{d����2��dz�?�bQ���\g�vr*�CD!f�R�O�(���-�(�1�~�����WR��(��Nf8���Y��r~������������usq��ݿg�]o�����s-KY�j8�-��|�[p|��F!3�h2#�yaaEe����`��>u�b>�aK:0�r�zh�ƿV�9�����O�A����� ��o2�D��� +S��>�Z��Ѵ;��4<�8�XתTQ������n�ZFW}e+&8�� s�?�a���i>���}p�.��U�@�ܛ +�>�T�T.�3[�i:����{���n��!��&�kk/"T�Zuf��[0��KS�������m�~y�E��a����Wo.����yO���{�V���HB[�����aB�M�0̎��Y����DD�,�Dڇ�^�����/L����86!�Aj��!8���o��=h���P?t9'G�9G�AL��v.�KM�A��/Jb�e��`�ifΉ7�&���*�n���M�z�����1���[9n�l�GBHp7���˨���v�q����NKwx7�����\�Mf����i� +�7�h���hi�����W:�Y���w��$�]��[�����'B���f�O=����$�Jx��.�+�٨�A�:kM�Me�i���~��&� $��Z-���v]mjn��U�m]�]�3/��b&���.�`Mژ����줽�ا#[�S�{�s�t7�ꚺ���{IQ�2`S�v+����r�7Ӻ��x��KO ��d������ +endstream +endobj +704 0 obj +<< +/Type /Page +/Contents 705 0 R +/Resources 703 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 714 0 R +/Annots [ 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R ] +>> +endobj +693 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.326 573.642 366.315 586.145] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +694 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.453 554.554 459.085 567.057] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +695 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.115 535.465 254.748 547.969] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +696 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.238 397.618 386.985 410.121] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +697 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.453 313.254 231.408 325.758] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +698 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.018 313.254 338.183 325.758] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +699 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.922 208.045 319.373 220.548] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +700 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 92.765 326.998 104.995] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a17bf2f98e8c59e29a8eda42c692e5b3d) >> +>> +endobj +701 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.146 73.676 381.73 86.18] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +706 0 obj +<< +/D [704 0 R /XYZ -13.423 915.745 null] +>> +endobj +97 0 obj +<< +/D [704 0 R /XYZ 29.788 737.428 null] +>> +endobj +707 0 obj +<< +/D [704 0 R /XYZ 29.788 650.461 null] +>> +endobj +708 0 obj +<< +/D [704 0 R /XYZ 29.788 650.461 null] +>> +endobj +101 0 obj +<< +/D [704 0 R /XYZ 29.788 650.461 null] +>> +endobj +709 0 obj +<< +/D [704 0 R /XYZ 29.788 536.461 null] +>> +endobj +105 0 obj +<< +/D [704 0 R /XYZ 29.788 514.443 null] +>> +endobj +710 0 obj +<< +/D [704 0 R /XYZ 29.788 300.701 null] +>> +endobj +109 0 obj +<< +/D [704 0 R /XYZ 29.788 278.683 null] +>> +endobj +711 0 obj +<< +/D [704 0 R /XYZ 321.409 211.108 null] +>> +endobj +113 0 obj +<< +/D [704 0 R /XYZ 29.788 188.449 null] +>> +endobj +712 0 obj +<< +/D [704 0 R /XYZ 29.788 159.622 null] +>> +endobj +713 0 obj +<< +/D [704 0 R /XYZ 29.788 159.622 null] +>> +endobj +703 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F89 511 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +732 0 obj +<< +/Length 2170 +/Filter /FlateDecode +>> +stream +x��Y�s�6���n�i�I�����;q�Z��t�����7��7���]<��Tۊ}��9�m��v���.����eq@�tz�/����$C�CJ�B�<F~�3��`����$þ�TG���Zi2�?� +����z �fR9�z��0�> +Œ2�T��S8TZ8h�>L��J�N��0'�iޝ�a�*`:����d �na�Wc�Z^����W���5!�X +�j� +�QV"Բ�����6w�*�ӵ%�,��!瘆��5=8�@I9E��G�B(����{�@�F��b~s�@�&qZdy�?L>O;�P! ��M����A�0*C�f�ZO8Z�IW�� +��I� '�j�v ]�nӁJ�����_[��2^�Q�d��8��Elz,��}��я*DLF �A��������LY��3?�*�5GK�Я�a*��&x�����&�vH��u��v8�>ھ$�Teaۛ�(�/3�6�-����l�*�w��u�g�lV��xO$�?�S�LG�[r��QieR��&J���Ѽ���n�7٦Z�EG;�(�j^X�>�X�����x�r��)��ÀX���fLZwYC�#pabh��L����9�{�WӅX�wɒe�U��0�#C�2Y�`�h�qe�m�tV{�Ûoc �ʪ��H�h���i@XI^�%j��kV����3סA��6?B�`H������<�����˛lQ\�$a�>>VU|>� �`'T娃!�a�jaǒ�v���6���}���6��^!-Ұ�MV�"^��4�kG�,]�>'�h�Udln��<Z��� Z��g7k.�S��k�1"�s��<[�Ӫ��̬���y�l4�v�B����I�4��zgηE\�I�t�Fy}9��g@j'O�W�HkvW�����\a���e=���&���4p��=� +T�+,��U�孨�5�ҥ�g_qjd[Ts��DjPK(i*��}Oq4ݍ'�D�R֕�ּ(!#2.���\��x�6�ư�>�(T���&��Q��^��c,��lL�֥ʹT�����}�B�)(�m + +���Q�F�04�^$8Ƈ�7�?���t��\ʐ��6���%Q�Bmn��1����K���g�����t|1�����������t2�/� p2���"+��z�I/*����~mt�s�q^���I�/�i.�C��\y}���٢9#|�V�k�5vS�7���a�m�$�v�l�`���`���E������h�8YLz�u\��N�{T�Pg�\\Mg������xzu9�=������g��FR�`��ə�A�:E��^�vh�Ϻ��n�EL�Q�;˚����:�j�يtO������� Y���F8+u�(��.�=0�1��� +�g���j������˒u��OY>�5�s�{����`q��R>]�bx���Tk>mv�N�iҾ��&��'eD�I�q8"˯�䧫�o�d�!�%�����r<���1Ђ��ͻ��x��M�o/[]h0� g�꼅�ϻЋN�p,S�w\������ఆ����Q}��J;����o-�O�.ޜ�>��M����_[�>g �76l-!8���1Ö�˧�?��0M�T,>��ϳE�7���8 +�gq�Yo=!��?���N�2��Eu�o(s�F�~�o�����6���r��N����x�ͫu������0 +���]�{u>��:W4����!D���#PSs]Cj}�:b;4z�SB�_9��G�۳�프�io�,Is;�H��Q��%�������`��N�� =��1~X������ h� ��o�;��2�s�� t�49�S�?�`m���b�x�~v&��x�Qo@�u���zZ3�m������o�j��cbtk�)C��D�[S�f�n{�F�Y�Y�C�f��\�i��7�-��7Š���m�ݛ�/��E�6�20bSԝ�9�x-`����U�/'{7Ŝ��M1������';�� ��bt�Zپ<YޘӃn�,��~�VEV,�|��{��_,�ERl�"Z�p��YeIi�����M�-�yӥF�"�_��`Q��uա� +�l`g!����m�r;JT���6y���$�lVI�o{�$]TZ��{H�m����Xc�����@���H����>���� +endstream +endobj +731 0 obj +<< +/Type /Page +/Contents 732 0 R +/Resources 730 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 714 0 R +/Annots [ 702 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 734 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R ] +>> +endobj +702 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.997 725.921 279.307 738.424] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +717 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 651.573 135.199 660.285] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +718 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.613 609.527 369.633 622.03] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +719 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.861 595.978 303.849 608.481] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +720 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.251 576.977 368.271 589.481] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +721 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [488.579 576.977 567.119 589.481] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +734 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 563.428 90.435 574.873] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +722 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.073 544.428 409.98 556.931] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +723 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 458.123 322.766 470.354] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a81fd5b4436be253e0ef3ebdf51b3d193) >> +>> +endobj +724 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.431 439.123 399.063 451.626] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +725 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.207 402.633 227.254 411.345] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +726 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 364.775 135.199 373.487] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +727 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.603 322.729 408.848 335.232] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +728 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 60.127 345.784 72.358] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a5946f4a20c9ba0cd83fed96ce3103c06) >> +>> +endobj +733 0 obj +<< +/D [731 0 R /XYZ -13.423 915.745 null] +>> +endobj +735 0 obj +<< +/D [731 0 R /XYZ 29.788 545.424 null] +>> +endobj +736 0 obj +<< +/D [731 0 R /XYZ 29.788 525.046 null] +>> +endobj +737 0 obj +<< +/D [731 0 R /XYZ 29.788 149.495 null] +>> +endobj +738 0 obj +<< +/D [731 0 R /XYZ 29.788 129.117 null] +>> +endobj +730 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F120 619 0 R /F33 531 0 R /F30 532 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +759 0 obj +<< +/Length 1954 +/Filter /FlateDecode +>> +stream +x��ZYo9~����BL�<��b�X�z�q<��Y ���H�Pw+}$`~��>#ţ$����C6�b}dU}�+��E�� "��>��-�$#�#JQ(�D�Bo�~�h�9H�R�N��2�:o��֢HO��2�"�h���L���ce#N��S� �XR��j=�c!�B�T|��e��2tT��3� iZv�j�v�L��M��e�W�a�`y .I��,�]�0a)�(xU��G��VԈ�kW=�U<����[䗓���!�F���dqv~FI9�D���"�! +"{ދ5z9y����#��d��2/*�z�z���t�C�4��i��|M�:F6���fh����м�sFecy�$��'���]�@��Y@G �ӧ�MV�MWI�ن�:Y+�T{z��,H�Wa�(l7<`W>!G�ϰd����A��vt�)���̬�z�KVq�,�$�ו��"��J��A������.m%.��}\�jm�U�$" �~D,�q�D/ͬ�R���|YVj_j��}X�4� ��B2w�S�y|?eq�_��_n��\�$��ŶL��dr�ө��Iڬ�7�w/�����tv�x1����aዏ�H6Y�k�0��)r<�JR{�{7�*?��Ӱʏ��+'�V�!�n�li���h�U��l��h���[M~�K4��ϼ�z_˖�A��v쿞u`�1L PO�P�.������r�_%�4nǿ$�L�AN�8��8c�����-u��\�%ok���8tJ<ā�B4�@sX�I�gy�|���͗�ϟ�X�+�gS�ۋ'������1��.ZԊ���2��9�y�_=~�%��2Uh��ʮU�*��6�ǧ%�ԍ��\l���\jas�f���P��S� g���<C1y�Um�+��!J�c�Z& ּ��v����,� �J�⃭'��w�\���6W�m�滦e�4(TU���,�[���m�J��r�gk�P�#�~���m�&٦�g[nU�̹���w�xS��_�����,���I���l�c��f�y:Ҩ�{U8�xc�v[�G&u=qd&8b��{�aB���s�rn;����=��m�IK}I�t'�G��l���鼧q\hH�ߒ�N�GcEz��"��s�~l�k� +���Iv��9���y�=�X �qP�ߓWD7��P{�0����DqI8)���u����[by;�0�x� t�#�_[����t>w\����8���-��H���C�f�.��`���{�{o�l���aY*Y�**�����[J�z҈�Q:��7�5x��t������S� �#��.�-m�m�������?�өOq�{��z����W�u� �/�7�������0��������T��*�?��݆14,�nh�}�?���Ek�m���_���D�����ń�Ù��x�=,�t�.��2�b�]�����g?�k�r�����u9y�@ī��`�d���߭��|U�*k����^<�r�=y6�C��r�Ikx����ːG0����x q�B�!�x9b�v�u�S{i��KҦuN<�&�����N�oWf}��Й�C;�g�F�=���4]���Cl��f�M��#���u�=F`B? ����������C8��� r�:�F��h�כ��7���C�N��{<(~�����`k��� +��t�5�F�F��~}�����v%NA+a.m4���Κ�7�XS��l{0FgX�E,��؟�Gy�^��`���$�Y�A��s�K�§�\����ڶ1P���ζ�f�o���Ƹ�aP�M�&.�%]��+z�����wfB4Q��wyR��� +�/�u�j��a�I���Q �Z�9qi� �tmޫ�#��l���V�;�t�^m`�ަ,m�5/�6?��k�@�W��^�G�fs�'�Z2a��p�p1� _`� �e +endstream +endobj +758 0 obj +<< +/Type /Page +/Contents 759 0 R +/Resources 757 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 714 0 R +/Annots [ 729 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 763 0 R 751 0 R 752 0 R 753 0 R 754 0 R 766 0 R 755 0 R ] +>> +endobj +729 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.915 725.921 370.547 738.424] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +743 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.207 689.863 227.254 698.574] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +744 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.207 661.47 227.254 670.181] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +745 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 623.611 135.199 632.323] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +746 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.057 581.997 325.689 594.5] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +747 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 496.745 389.42 508.976] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab87b5a5abeadc975488850bece3dbf84) >> +>> +endobj +748 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.788 464.374 281.42 476.877] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +749 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 418.852 135.199 427.563] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +750 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [526.35 377.237 567.119 389.74] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +763 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 363.688 119.868 375.918] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +751 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 278.436 351.238 290.667] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a0a7f6e18d053c4af5f26f3852ef6ae14) >> +>> +endobj +752 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.355 246.065 335.987 258.568] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +753 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.442 200.542 126.831 209.254] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +754 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [526.35 158.928 567.119 171.431] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +766 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 145.378 119.868 157.609] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +755 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 60.127 402.74 72.358] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a6d707845ea3200a1a45726c2700333e5) >> +>> +endobj +760 0 obj +<< +/D [758 0 R /XYZ -13.423 915.745 null] +>> +endobj +761 0 obj +<< +/D [758 0 R /XYZ 29.788 582.993 null] +>> +endobj +762 0 obj +<< +/D [758 0 R /XYZ 29.788 563.047 null] +>> +endobj +764 0 obj +<< +/D [758 0 R /XYZ 29.788 364.684 null] +>> +endobj +765 0 obj +<< +/D [758 0 R /XYZ 29.788 344.738 null] +>> +endobj +767 0 obj +<< +/D [758 0 R /XYZ 29.788 146.375 null] +>> +endobj +768 0 obj +<< +/D [758 0 R /XYZ 29.788 126.429 null] +>> +endobj +757 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F120 619 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +789 0 obj +<< +/Length 1983 +/Filter /FlateDecode +>> +stream +x��Z[o��~��اB��^�e���Į�"i][9yH����D*��m������q���I�ݝ����������꒢eyD�t~D��f���!�H �!Q���G�~D|R��b�l�a_�c��f�n/�4��7� +���x3R�3)ƒ�=q��r�bI���`�)*���>L�~�2�W�#� iZv���0��NsPu���7c�Y^c���W�g�u!�X +���Sܣ�D�oDrkk���V�9[;��&�l8(�8�4�5��������P��G,āR(�y����Y^ƫ��5�N�2/�$����tt6�C�4�|���7�Z��O��S�3�M:p�F�}0gT*���X��VK�o��|� T��td���sk�EV%�"��<��u�H�A���g�2��" +.#p���+ő�3,���e~�Si뎎�bBDs����\^�f��.�$��/�I�n���6[;��Ub_�l[W���6*�d�r��!����t<&�7��L��"��U�-�I�/���nSF�HT�4��m��n:��tY�URM��ň�ȃ�>���_Tb����u�l�h0���.Ҟ��ϸ�MR��E�txX���� �5�\���홫�[�~�ڹ��j<�PVEWu���A=(�}�v^�u��۾��u��`�@��PJ殒9/�0%�8�M=�ѓ���g�U�e�=7L; ��"��g�M�V�Ne�Z���A��Ԫ����l~�j��ꗟ�OOf'W'���Ur�<+�2/��f�R$Q�g�h�/ ��$K�hm�]$�?�>\�{���Ssw����wJ�rU�8�4��cT�� 1�Å�]Z��9.���4[:jSG�J����,��x����;J�O�W�Mu��>�˧{��P(҆I��sN����;wv���q^g�;l�I�����?�A�o� +�����Q�hDs����/�f��f�����QT�VUȷ��U�w_"o��^�<1�1 ��x2�����S���Kˤ� ��ffl]:M~���z�ʅ������ת� ��0!`_�f�t*>IJ��*-��>��|� 8i��ö�j�_�:��9W�w&��r�Np���xeU6!�m��Xئ�*�����a�4c���".mN�?1�+p����m��4�i��q��Ǥ���D��n7�Q�I +ȅ���X�]&O�hY9�B�*�5t�w����\���>ac,r}���ř.�/.^^̮������'��"��"�������}e�/���`�]U��S%U܂�Cw}Th�����_��3?�w@��-N�a���� -����_!�}h������勋�P������l� Y|�{_+�8��v�퇉ۃF�*�z�z���C��h\g�F��`�C�����W��1Ѝ�5��|(Wv_�T'��4>��P��eR�jdž�N��69���.��~3�M �g���e�ߥI�y���J�����J<��zcz����$�ө0 +!<�J9�<��zM��c��� Q���N�7�(B�k��#oБ���Bp�yC�~Y�%�t�(����Gx�M��E8(ݵ.PNu����Ed��#>ԙ/ +'����C��TF�|��DG{���}t<�BwH����R��(V\��4��{�ё7Z�F�^�K�7d��.B��?^�ů�i������v�)�7��2}R�(���{�A�j����0�`h��=�.��#1�Զ_�����p����5V���</^0;T M���9� s.{�a�����G��c��br�^۹"]�tɼ�,�D�*��̛�eT,���(�Ê^��6/��a����v���In�H�E���vJM�E�#8Q�M��J�҃��t�m�PQ9�T�H%�����̢��t6����}Qk���n �&�u�$�L���A���x�,Dv +endstream +endobj +788 0 obj +<< +/Type /Page +/Contents 789 0 R +/Resources 787 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 714 0 R +/Annots [ 756 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R ] +>> +endobj +756 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.454 725.921 330.409 738.424] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +773 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.871 675.347 364.504 687.85] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +774 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 564.331 316.068 576.562] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a465d9fc420b12cfe3d24e937c5e5f110) >> +>> +endobj +775 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.21 501.049 373.705 509.76] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +776 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 491.584 181.227 500.295] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +777 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.12 441.257 532.563 453.76] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +778 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [101.174 416.144 126.817 426.389] +/A << /S /GoTo /D (index_intguideLibraryOutputs) >> +>> +endobj +779 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 330.741 323.366 342.972] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa5de81322b446f028934aa30c4826610) >> +>> +endobj +780 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.21 267.459 373.705 276.17] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +781 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [74.626 257.994 177.042 266.706] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +782 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.12 207.667 532.563 220.17] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +783 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [101.174 182.554 126.817 192.799] +/A << /S /GoTo /D (index_intguideLibraryOutputs) >> +>> +endobj +784 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 97.151 305.78 109.382] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a178d85d77cf448057897e9b0e0932e33) >> +>> +endobj +785 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.373 78.639 409.362 91.143] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +790 0 obj +<< +/D [788 0 R /XYZ -13.423 915.745 null] +>> +endobj +791 0 obj +<< +/D [788 0 R /XYZ 29.788 676.343 null] +>> +endobj +117 0 obj +<< +/D [788 0 R /XYZ 29.788 657.151 null] +>> +endobj +792 0 obj +<< +/D [788 0 R /XYZ 29.788 629.181 null] +>> +endobj +793 0 obj +<< +/D [788 0 R /XYZ 29.788 629.181 null] +>> +endobj +794 0 obj +<< +/D [788 0 R /XYZ 29.788 417.14 null] +>> +endobj +795 0 obj +<< +/D [788 0 R /XYZ 29.788 397.948 null] +>> +endobj +796 0 obj +<< +/D [788 0 R /XYZ 29.788 183.55 null] +>> +endobj +797 0 obj +<< +/D [788 0 R /XYZ 29.788 164.358 null] +>> +endobj +787 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +817 0 obj +<< +/Length 2068 +/Filter /FlateDecode +>> +stream +x��ZYo۸~ϯ����TI����<���fФۙma(�bk`K����b~�.���i�t.ڋiH���ٿðG��%E����9"����B��$���Rp�}.P���_?Y|T�Pd��Þ��]Gՙ�Y�m�/�%E�U���R��V��c�z�(�)��A�X�e����繜)ڿ��$�����j�v�����Gg+����nf?/�.��J.A���XF]�0$����?+UCh�PCzD�Fֺ�CV�9Y�-�C~�[p`2p]L�������.�����1�� @�4����ދ4�.��Q��iVD����_�0���~ A�����=A3��P*Cwz�J-\�D���eT�����������]S��m2P�a�ӎ�����,)�yq���e<��@���Cۣ��Adb��C�R�)s�#$�e1�>�Q^D��m�e���Z����x2Mˤx��p�^F%:t��MCR�([qO<��ų���h��ć֓�ئ� ����MJ�7W�˫�d��}r���lV���r��6�~��JV�����7�����",�� �^��tR�g��I^^��,^�H����S/�4gL`J��&��={��j>�`�*1��"N�V�g? +�V�G�z&@�!��z�#*qz���4ˢi�VQ�Hg��vxTB:z��� +��}��w���.��U0�0��\��h�B�Edxo������v[��j�N�[ZEVN�2���a�G������(��'�?�b�2L,��bJ��X��:�-�e���E��GP���c�5vq����g���LFW�������NF���׃a<�[3(,���e����r��0O���Ǵ��u%Q. ��hc����������z��te�ѥ��KovE���j�hގ�$-L�..��m��"z��Wپ)��ϟ]p�}��/ ��|s�FۿV�OL;�d�����:���k!f��Z�>Ԙ �����0SQk`&7��H쏙�ko�TL��L�I�� +a��V+��0�;��{��d+��M���JgIUܤY�1TY- 6� +���*��^�\�w��OPbj�4�Lf��WQV��sZV���̎�����Z˸��u"6d�-x�P~'�[��n9r +�y���b<��x0�P�����|PY�~/K�פ�;��Z˓A���E��Wi��zoީ-T�MÍwCB��"�n��rXR-\/>��]�X�Ehz7Y��� z_����i+�X���]�Z�m#�� +�s�n5ʓG�<y�� +���ȴ��SÈnu�;��1�|����ؘ�uAQ���)o���pb�4��D�Ur����'Pzu����c��d4��~�A�ׅ@}�<���~ N���*q��C���0M~E���������5KJU��*��+;| ;.�uYtj|3u���4{T�!��n��w�(3W岈�˖$�������3��c�B����G�w�����v�-�����9�zOj���a`��b�y:��Md��s@��E`�<�n�-�K{���Ntݢ��2<��ʙ��.�d��������.�424�6O�i���jA����燎�(D��P����|��i�59����_8�W�$��W�÷B롍sp?W��<6�� 7�� ���3۞&��j��C��y�GOTpm�ؖz�P�|�I��Wһ�����3��`�6���\����D�JoՈ�� �2U�Xd�St�tf��f��K-��m�-tj�����6���Tr��l�Go�f �w�@?�R�R�k��+�8�nNr)p�u�M����\{�]c�hoڼ*o��Z�^��C�4a`��$��ʱ������߉)8v�z�v]�x�!�_� ����{���|�����m�f�g���&����<�f:ݪa�|4�gq�N�p�7�^���2��<�,Zg鬜n>�h���.�E_��=an� ����m-*�|�{Qt��\�/���b�o�E���ɬTT� +p����^N�r�u�`\��ʡ��9���-���2`͚ +endstream +endobj +816 0 obj +<< +/Type /Page +/Contents 817 0 R +/Resources 815 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 714 0 R +/Annots [ 786 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R ] +>> +endobj +786 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.21 720.248 373.705 728.96] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +801 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.21 691.855 373.705 700.566] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +802 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 682.39 181.227 691.101] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +803 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.944 632.155 531.737 644.659] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +804 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 535.416 330.642 547.646] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a2175fa185bbcaafb28b5c73ca8ff2394) >> +>> +endobj +805 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.21 472.264 373.705 480.976] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +806 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 462.8 181.227 471.511] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +807 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.12 412.565 532.563 425.068] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +808 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [101.174 387.452 126.817 397.697] +/A << /S /GoTo /D (index_intguideLibraryOutputs) >> +>> +endobj +809 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 302.276 372.249 314.507] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a1ba36727b09433f1ae925646864d8a61) >> +>> +endobj +810 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [424.965 283.802 560.954 296.305] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +811 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 239.125 181.227 247.836] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +812 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226 188.89 359.711 201.393] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +813 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 92.15 360.129 104.381] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa1a59666f0af5463087f528473d4ff8c) >> +>> +endobj +814 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.093 73.676 390.669 86.18] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +818 0 obj +<< +/D [816 0 R /XYZ -13.423 915.745 null] +>> +endobj +819 0 obj +<< +/D [816 0 R /XYZ 29.788 619.603 null] +>> +endobj +820 0 obj +<< +/D [816 0 R /XYZ 29.788 600.503 null] +>> +endobj +821 0 obj +<< +/D [816 0 R /XYZ 29.788 388.448 null] +>> +endobj +822 0 obj +<< +/D [816 0 R /XYZ 29.788 369.349 null] +>> +endobj +823 0 obj +<< +/D [816 0 R /XYZ 29.788 176.337 null] +>> +endobj +824 0 obj +<< +/D [816 0 R /XYZ 29.788 157.238 null] +>> +endobj +815 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F89 511 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +840 0 obj +<< +/Length 2008 +/Filter /FlateDecode +>> +stream +x��YYo�H~��觅��>yd����x&q2�<yH�&;��7���S}�"i)��Y Y`��}T�W]��u4�|KѼ: h�:;�D!�%�H�R +�!Q�Ч���5>)Xj1�n�a_F�^G혛�(����@�XD%���I1��+m� `�}�KʴP��u,�Q�����s���w(G;�~>��p��e��F��)8:_qtR����}�.X^�KR쇢˚��",E��(�QV"Ԋ���b�dw`a�t� ����AɐsL#_�1=8���r� @�O�E8CDv��)z?yQT���cA8�RyU��J?N=8���P!��a6 ��� J��WD��ݙ�+�t�h���0gT�ЖL�k`z�[�Ѯ�˳m��1������y^�y�Y�ۂ�&K���?�J�F��@ �F�>!G�� �U��,U��c��E�Vχ�<�*G��Q_�wF0 ���l<V�2l������U����'��WPū�2�����*�]fU�R���WV9-@u��R?"ܸP���_|��(��C�&@�����)z��=f�������Wӳ㫫��o_�_L�x5,dž�`��|[TU����U\��;�g*We��ʦ�J�l������ |���ډ}�10 p�T�@���h�9S��!�{uȍW�r��PR� K��Q��u}S�������4��5���cWRf=�b�L���"3�uYe' F^/��њ<ﴊk[�$�>ƕn�Mq�v�pk��}?�Mlm5��FaӖ���T-뙈5�4b5;I���$Y�M�:-�[�z�ᴅ �JQᘢ^���|yz<=�|sqr}y<=s�(�b����=�V��Z�Y��X����y�[����Se�H@��wL���&I��Z�WM�V@=�?���}�g����H��H�z��N;���oo�]������5uz�w�?>�a��5�/��z���fe�-BY:�pQ}/����o��0���<.�Ս*��ފ3���-��~��������K@�M��Y�N!bgUsӹ�" ���aF���s���*�aE4a�L�l��;\��2{C�;3$!���8[��Lb4�yD5�zK���<���;��2���i�=�vRgn�����{�M^Ć���%��zt�ПZ�",��J�_���l�PB:�4����|�S��?��`U�M�nO'ӝv9����gv��όfLbJ��徂�U�mi�ք��kX���X �Zh�i��z<� 4 p�gADŽ����f���y���YK�ajy��b����[FV]6@홢%-DO --a_�2J,��<L7Q�ÐYsܨ]��|���z*�Qd���V��?�"������W�l��ĘX��s�.�0En!!�Ń�Ńt�w]voE� #�6�f�EY4��^����3���g�a�l6nU�����~��e��0���14L��l)�<�f�C}�-��ׁ�Hwa���75�%�t��Wr��[=_��?u�&'q�j�꿀j���&��2L�2���5�-a�(+�O+�H}<s ��=?��W�C)'ދק~H��]�g�ɽ�BBϞ�f���H�5p��<���b&�3F��@2�{&�$�3��S�>l�/�&J_�g��?٦�sLFh���r'�ߢ�pң�����:�� �G�cJ��� �Ad����/�C�̴i���&���z��^��n�6��5�6�����C� ��8���ю�(wc����������'+�4�v#q +Z 1�4�Oeorm\�MݫX7ك6��n3�EӁ����~+����q�-�D杋�7�����d�br��yi+�o�J*&�˥-+��Bߊ��c�g���Y�U�V��25�3οX�iV��*^��D�{�,�ڐ�+*պ,�&�`�O3��t @D]f7M�O\�K$�ZJls���L�^��۫�[�s�K��z�u|�K>u��<m��Q�]����V"c��+Ʉy}�K�vL����:�h +endstream +endobj +839 0 obj +<< +/Type /Page +/Contents 840 0 R +/Resources 838 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 714 0 R +/Annots [ 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R ] +>> +endobj +828 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.122 706.118 274.766 718.622] +/A << /S /GoTo /D (index_intguideLibraryOutputs) >> +>> +endobj +829 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 613.457 335.486 625.687] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab78d6a66fc7a4205a6caf69ce4f161e4) >> +>> +endobj +830 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 447.021 359.704 459.252] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab810ba8e0fc4425c37aa460e57dc8129) >> +>> +endobj +831 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 294.135 349.995 306.365] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac5899ebab7738c4c99b19ad9d934f8d1) >> +>> +endobj +832 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.305 253.985 363.974 266.488] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +833 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 163.483 181.227 172.195] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +834 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.944 109.368 531.737 121.871] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +835 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.09 95.818 237.184 108.322] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +836 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 62.194 177.141 74.698] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +841 0 obj +<< +/D [839 0 R /XYZ -13.423 915.745 null] +>> +endobj +842 0 obj +<< +/D [839 0 R /XYZ 29.788 707.115 null] +>> +endobj +843 0 obj +<< +/D [839 0 R /XYZ 29.788 684.125 null] +>> +endobj +844 0 obj +<< +/D [839 0 R /XYZ 29.788 540.679 null] +>> +endobj +845 0 obj +<< +/D [839 0 R /XYZ 29.788 517.69 null] +>> +endobj +846 0 obj +<< +/D [839 0 R /XYZ 29.788 387.793 null] +>> +endobj +847 0 obj +<< +/D [839 0 R /XYZ 29.788 364.803 null] +>> +endobj +848 0 obj +<< +/D [839 0 R /XYZ 29.788 63.19 null] +>> +endobj +838 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +867 0 obj +<< +/Length 2249 +/Filter /FlateDecode +>> +stream +x��Z[o۸~ϯ�ӁT�H���yH7��&�����-�flؒ�Kz���7IV�$N��`��x�g��{<�y��Ey�;�wΏ�����=��b�b�N �(s +���vo�1PAL��^� +Y�_ul�l�\&��G4��l�c�F���=-9D�q�&��dЃ1�Q�%s�ÀI���9{�~9B��5I��TD[T���:p�r`u?����O,���0 +9툥���ĉ�<���e����cMZ>��ms���1Y�%�M~;Xp`��q(ן���߂Q���4���Cbq�D�>�������l9�H�ݑ�ʼ��l�y���p�S�,<�1�K�?��q|P*q���k9x��3�ʀ���AD���'����7ts�K�BD"�b4|�e��*�(�*�3�q^�s�:Ԟ{g�� � ��������B�bɭd-@"��D1:������t����txv�~�����d<m�%o�����ӄ��e�NWB�Y��̳�����R��[���i\o����Nu���)P��E&�d�y��rV�yF�_؞F~�0�5��>�������� +O���/Q�U�u��զ�t��������dM�;K����Ԣ��\�V�"��CU(�NK1�ԛyR�IYO��,���lS�����(w��""�ѵ�j�� +����o�3�VZ�Qx�K�Qx�o���+��pM��iڬI���"�{�;���ץmUKQ(d�����E<"ZCIa����� ,{6����3��������/�*�,k�N��������,���3*��f%&�� #������������r#�g��ҹ����E +�40MnN>L�OF��v�X5��M�2�+;�,����0��^��KK���+�a�§��J3-���� ����la���)�! ��]��A>HC 9�&GFQo��6OX�j��d�=<` ��ʐ�(6����(��zV��ߟ�^�Y�U.�ze0sjv��z�f�״Z6 ��E�n=�8�Q��A�i�����Lm��n��ΩK��T�u�0���FhŴ��0B<4�yUǭ��V�r�� +��AW���:0hd6�B[�|Z������tw�Ffx�K��MT�*MTJt"��C��6>��7k�Q)B>�l����ZH ɇ��Q��O����� d�e���ķ��˳��gs�EbL��v,S�/7�.c�P<�*f���S�|�����������_��S�<��yHs��e< �NQ@ص�3)� �"3vf��\��l�b0���o�Y�̼z�1�r]��B����M�a����T(ìԎ3��Dj+�X��Ďu�i ��+��z��ғR�!�,ў�N��4�*%�C6~F��N�m���p�C��T=�kفQŌ�F1���%��4,�4o ffS��A[C i?��E��5��Yǽ�2���}0����u!t8ys}���|���ftq}uy1�<���,}2�>I������e��Nf)_�}���/J v<�^t�h@�n��Q�g�z� +ڛ�� x*�?�|��gT@�Qo��f����v�'$~[Z�Ή�~$hS�B����J�i�{��������~���wg5?_�e�{����>T���UbӁ�ț�7`> �i[��u��r��z�2�����D���9���6XJ��/�ƞ`46���V���) b�l?�Bw�ߜ7h��K�C6G�g�V�e>O%����<4�w��N�V`�O� ��� �!_���~�5�|ΖI���?E䵙���΄��x��j�֪ ��}=�"�!�e%�^C�{��'O�:y'W��=��>"<��BsiEw��ֽ$6��Kշ��[7@�έ[)Ps�v��{�V���5�?�Qc����c���^dN ��>�, G� �=�s�g��wi�1g�)�~@����H�;a�'c��I�9s��ި�[�uV��vZ3�k������o�_J�|+�H��܁C����su��L��m������`�����<��d�)ʚ�K�氷���v-M#��_�tgy�^��`v��kc,�j�n���un�ᕺ����z@�6�tS�DB��ZeY��mP��lU�v`�s�c��$��I��r���J-�]���*O+���"�׳���b��/�f���8�;k���p�Pqv�櫰!))���&V�K�j�KT�٬�oeϭ��L�y-�9<p�Ee ++��`��U��C�FM C�����w[�b +endstream +endobj +866 0 obj +<< +/Type /Page +/Contents 867 0 R +/Resources 865 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 878 0 R +/Annots [ 837 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 870 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 876 0 R 863 0 R ] +>> +endobj +837 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 676.117 363.358 688.348] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a7f2cea23dbdaeddb2d91d861c608f239) >> +>> +endobj +852 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.22 655.737 394.209 668.241] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +853 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.624 635.358 448.014 647.861] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +854 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.21 572.512 373.705 581.223] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) >> +>> +endobj +855 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.811 553.583 181.227 562.294] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +856 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.528 498.728 368.856 511.232] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +857 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [526.787 464.799 567.119 477.303] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +870 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 451.25 148.035 463.754] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +858 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 356.787 291.817 369.017] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a87428d7a4a5d52e48af8db92ab71c83e) >> +>> +endobj +859 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.626 295.648 532.295 308.151] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +860 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 157.261 349.406 169.492] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac2600415df086d1a9b36105ac29396de) >> +>> +endobj +861 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.81 136.882 493.215 149.385] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +862 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [506.839 136.882 567.119 149.385] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +876 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 123.333 74.061 135.836] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +863 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [82.988 62.194 177.741 74.698] +/A << /S /GoTo /D (group__bsec__interface_gae8fc6d614d6a40f0088262dccbb960dc) >> +>> +endobj +868 0 obj +<< +/D [866 0 R /XYZ -13.423 915.745 null] +>> +endobj +869 0 obj +<< +/D [866 0 R /XYZ 29.788 737.428 null] +>> +endobj +871 0 obj +<< +/D [866 0 R /XYZ 29.788 452.247 null] +>> +endobj +872 0 obj +<< +/D [866 0 R /XYZ 29.788 428.517 null] +>> +endobj +873 0 obj +<< +/D [866 0 R /XYZ 29.788 283.095 null] +>> +endobj +121 0 obj +<< +/D [866 0 R /XYZ 29.788 259.365 null] +>> +endobj +874 0 obj +<< +/D [866 0 R /XYZ 29.788 228.62 null] +>> +endobj +875 0 obj +<< +/D [866 0 R /XYZ 29.788 228.62 null] +>> +endobj +877 0 obj +<< +/D [866 0 R /XYZ 29.788 63.19 null] +>> +endobj +865 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F89 511 0 R /F120 619 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +901 0 obj +<< +/Length 1953 +/Filter /FlateDecode +>> +stream +x��ZYs�6~���#]��q�ț�q6;��9�)%�w%R�c����A���xd�n��)��Fw���ţ����E~@�tq�/����$}�}J�'v�DY���{D|R�Tb�l�aG�C���϶/����J���z��fR%�z��w1�r=�%eJ�RІ6�a�S�A�q�`J�(A;�~8��p��dw���ր���r��Y +��V�i3v�e�vI�Ot���"�!K���V��۔����D$�����lmY:�|��ᠤ�9����O&G��Jʱ/\M���y���xOB��:I����f�g�FI�fE4?�e���h�1� +Y!��|������A���CE�V�G+t۵sF���e��� �Z�]M�m6P�`�ҁ��Sm�eRD�,(�4�eF�A���'h&� $hq��8��}��R�c��m�I��t4=�~w~y1=O���.o��'�_���f��al���#�ԛ4���*�6fQ��I�U��gy�����RH����9�V_եW�_q]DI�+�k��,ި����K\x:>� +�@3���B�����[��<o`BD�t��C�#@��A�( `,C� ���̢\�E�< u�gʼn����d�E��~�A馼��da�7A��b�t_o�g9djMmj�P����;" �ў#��#�:́�ҮK��=�@ަ0�T� S� �J�B�AQg���0�y�eQb(V�,�ߌ�֛U���J]��6��)��yc�4|U1� 仾� 1��Q�n���U,Ma'T�.TkQ�hр0��W��Wg�WSg���s�<�jУ�9r!��^$L.}/�A��H�NH�6��^�A�qRjʗ�S�ؖQ��9�قo�-Nǧ_f�������f�Ax_�Vh`��w���q�ɹ[M���㪩�qE_G�j�?*���/�*�t�{X�����k,X$K�^���ĵ��PЍ��j��\��p3U�i,˖&/�,X�X�=�J�(ޞ�EV&s5�oF��h�/�>���XI]2C�ǿ�R�-� +��u���f�A:���F�=8�oE�})O���hz^�L+���K�mI3�����e1��b���@rlC�3[?�i�I�}1�:�6�xԢ�U�seVϊo4{v}=+�8�ek�,F$�m�|���������ѻ��㿟��h�%���O��+��o�dQǤ�f-�f�2�X����\�̓�=�"���%==:�ʯS�*����/�>�qV��YF�zY����6����h�͙��˾�:܅��9x�ǡ+-e!��q x&S�i�����x��P=��wpO��/��������(W�6qf��Ƌ�1v}�����Ӯ]���r�A�.VS���ӛ���h<�iz���������0i�3�T��R?��lS�� +lv"5�`�3�Wi���W��#�&����[>�������ts^�� ��_�N=�s�DC8�:�OKC��E�N�?�ijt^�tEP�gQ�ա�2 +�Ji�'W#�#v�Юn��w�x��a���5�X�[�#�R�T�GLb�op�7���ܐ�X��t�!��D[�Kh��R������o���6F�oP�"8����ֆ�E����w��`�ُ£z@�~A(� ��0��~����L����V{�lw�yMִo#�[���!_�R�Fj;n+ۚ�(�}��īnT��|���զ'NA+=���^�+�M�Ɛ�#����f�{4�c��mMc���u�l���U�ꊟ�k��� +���� +�*����kݠ��a�B�u�Z�,^,�ܔM�� +�-��nXYX�W�k���E�q�I�`U1�V��f�����Te�&K�r�TyV��2 6]����f��CKi/�<D+����B�� b��93�Wg�f���|�;���T +�[�ve�9����[�LTQ��09�9=�ǿ��� +endstream +endobj +900 0 obj +<< +/Type /Page +/Contents 901 0 R +/Resources 899 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 878 0 R +/Annots [ 864 0 R 884 0 R 885 0 R 904 0 R 886 0 R 887 0 R 888 0 R 907 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R ] +>> +endobj +864 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 680.317 351.217 692.548] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ae5d8b5de70152c09b4153bcb41997ee7) >> +>> +endobj +884 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.93 661.627 483.843 674.131] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +885 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [505.397 610.698 567.119 623.201] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +904 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 597.149 112.864 609.652] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +886 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 512.681 323.933 524.911] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a89e2eec8486c2880912af108bbed3593) >> +>> +endobj +887 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.927 493.991 416.752 506.494] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +888 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [505.397 386.992 567.119 399.495] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +907 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 373.442 112.864 385.946] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +889 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 288.974 279.708 301.205] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a76ee5462e14060fcc889bd889b6f7b3c) >> +>> +endobj +890 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 148.436 394.853 160.667] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab5356ac211454109eac007fcc458a6dd) >> +>> +endobj +891 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.079 129.746 319.515 142.249] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +892 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.286 129.746 415.918 142.249] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +893 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.079 111.056 320.126 123.559] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +894 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.897 111.056 417.14 123.559] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +895 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.002 73.676 349.766 86.18] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +896 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.8 73.676 453.303 86.18] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +902 0 obj +<< +/D [900 0 R /XYZ -13.423 915.745 null] +>> +endobj +903 0 obj +<< +/D [900 0 R /XYZ 29.788 737.428 null] +>> +endobj +905 0 obj +<< +/D [900 0 R /XYZ 29.788 598.145 null] +>> +endobj +906 0 obj +<< +/D [900 0 R /XYZ 29.788 578.521 null] +>> +endobj +908 0 obj +<< +/D [900 0 R /XYZ 29.788 374.439 null] +>> +endobj +909 0 obj +<< +/D [900 0 R /XYZ 29.788 354.815 null] +>> +endobj +910 0 obj +<< +/D [900 0 R /XYZ 29.788 233.901 null] +>> +endobj +911 0 obj +<< +/D [900 0 R /XYZ 29.788 214.277 null] +>> +endobj +899 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F89 511 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +929 0 obj +<< +/Length 2198 +/Filter /FlateDecode +>> +stream +x��ZYs�8~����TIUK�8x�͇�Ք���Mv&�RQ,sF$Q�5?~OK�e;5y��m����n|}��hz����2��e������-�a�6�16<F��l#����/�����.�M�c�}�Q5g36����b>6¸��Dl�紫��1�"L��0�1L�M�#�=�8�8eD��h$�N���(p�[Uɴ@6�&15NRX���>-�.��J.#�c-���,�>���OJ�,���da�j�M��Mu���)Y��$��-8,ңa��GӃ�)�S�3�5�w��y����.�O��4�&q�� O�4+x8�}���x�3["��|Щ'���2���a�R���Cc1�@��qӖQ�m�R��� �`��������l��vqqO���a�|�E�&�ᬌ\ +�/��,_$���� *���A����G �!�&��8��E+u4���9�쮴]fLc��a��A�*�Ф��w�Lf�4�s6/o-By��A����V�\˅��-%[� �2>I�y��ْ�0Mn�̖�ډ[˶�w$�4A�x�Ty�[��i��b͵@�h����K�<RmO��F��J�q�5��XA�R�� + �.�;{}�~|=�uvt~u4���6F���d�.���Y�E�34��(��������l6��px>9��^O.��>�$�������ğ���3�i�����M�-�����j�KQ��g�J-v��0��T��� ����۹�`����Y�,�>�A���O�t�AA�%���Hڋ&��r����E���/��I�Ϸ~A3�"��蛶/�/R��v�D +��� +��PR�AQE�MT����EY!/����Z����<��4,Ē +��Q��Rx[Ǟ�q5Y����$ +˥��"F��q�e<l�[̋�t�]���p/$���(�9N�2�;����(u�(uK� +�Dwp�f���$��XE�,��G�W<��:'�6ͭ��E�w(��B��"ߵ:�Æ��Ŭ��[�Y��jѸȲ����mQɴ!EtU�֑�y7m��="kG&w{d������x2��Am|������Є���M5~�شo����w�1q���A�!92�V�9��j���oj���Q��,�g����ī�� vr����T��Yi��t�N�T�נt��ҸI_U��w[��ۢ�K�I�褾����� �X1�PѾG��{N�~�������L{a������&8�c��N�*��y��ȷm� S"m�SAj�ei���e�T�3��Jq"t^d�j��w��^$�s#� +�g7dz�����tr�ه����tru������Z��oP�zw ĦȢ����L�=:(�����k� ^�P͛�H�Q���5�67 ��(�`��H��"R�=��ݾ��^A���Pݝ�tV� �gܗ�#�i���-��,U������Q��*�����X�BV�9�y�5�8�x�"��D�~����D�9SI!�2�R�"�7��_q�~�A���*�}����gm�c,���W���O��a���,]Wx5���o�+��U�QQ���ZX�&|��t�/;�1D�Q���}��x8��w�sr[������Zq��� ��o�s^l8�v�1�篽�b�'F�����~�v�1�Q��w�!;����E*B�EBi�`{�q�ڐ��˧x�(��D�Dw^���"��Պ2����n�{ƴ����B�x��8��a�-�J�� M�`��th���b�x��z�2�3�yxiY��6�BD��>�Jq�vTt��SHPSϐ�g>��[�|.����o�ݫ���� {$êT�D�n[��0�¾i9��� +I %=��]��8���8�Af�G@�mA?����YH���ȣ�LU��jh��^�Gl����jXݿm����w����hV%Ǎ��~t��mdy����]c�eZ�g�V�`Fa�k?u7h�c�uGZ�jכ�#^ܛI�4�0У~�=��x1�lY�/ߩ�x��<�Sj���� ����U��6�0���P$��-���E���A.A�H��X�B���3H�E�C�V����UU>"�2�ʢ�&He�����E�E�ET^�㎷��*A�i�R��*� ��UT�[y;�f���¶ʭ +��+�o�,6a��`�I�x�u������2 +endstream +endobj +928 0 obj +<< +/Type /Page +/Contents 929 0 R +/Resources 927 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 878 0 R +/Annots [ 897 0 R 898 0 R 917 0 R 918 0 R 919 0 R 920 0 R 933 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R ] +>> +endobj +897 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.584 725.921 338.032 738.424] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +898 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.1 725.921 446.968 738.424] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +917 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 628.782 350.028 641.012] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a3975b1dfa3c35829ce97814e04c143ce) >> +>> +endobj +918 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.238 610.24 450.674 622.744] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +919 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.795 610.24 540.428 622.744] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +920 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [505.397 559.608 567.119 572.112] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +933 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 546.059 112.864 558.562] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +921 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 462.469 360.915 474.7] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac2eca8b900ce91ee50004c549a409024) >> +>> +endobj +922 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.47 443.928 504.396 456.431] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +923 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.503 393.296 501.709 405.799] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +924 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 268.515 353.671 280.745] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ada34397de8a8e88ad72e8546748866cd) >> +>> +endobj +925 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.657 199.341 296.562 211.844] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +926 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 97.21 371.813 109.441] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa238cfe9b905deda6f1823ca32378f91) >> +>> +endobj +930 0 obj +<< +/D [928 0 R /XYZ -13.423 915.745 null] +>> +endobj +931 0 obj +<< +/D [928 0 R /XYZ 29.788 713.368 null] +>> +endobj +932 0 obj +<< +/D [928 0 R /XYZ 29.788 694.105 null] +>> +endobj +934 0 obj +<< +/D [928 0 R /XYZ 29.788 547.055 null] +>> +endobj +935 0 obj +<< +/D [928 0 R /XYZ 29.788 527.792 null] +>> +endobj +936 0 obj +<< +/D [928 0 R /XYZ 29.788 380.743 null] +>> +endobj +125 0 obj +<< +/D [928 0 R /XYZ 29.788 361.48 null] +>> +endobj +937 0 obj +<< +/D [928 0 R /XYZ 29.788 333.466 null] +>> +endobj +938 0 obj +<< +/D [928 0 R /XYZ 29.788 333.466 null] +>> +endobj +939 0 obj +<< +/D [928 0 R /XYZ 29.788 181.796 null] +>> +endobj +940 0 obj +<< +/D [928 0 R /XYZ 29.788 162.533 null] +>> +endobj +927 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +948 0 obj +<< +/Length 1286 +/Filter /FlateDecode +>> +stream +x��X]o�6}���L?%�oM�f.�-M<t@R����lɕ���wIJ��� �t@�$����{�.�r<���hV �!����(��`� �%֔"%��D�A�����������2�p(u�q��v/��2�7� +MQ����}O��֝��<D��XRf����c +ke��Nr���(G�~`N8x��;]�t� �����`��qV���Jt`y�aHc)���D� <�X"Ի���c�v`Oa�.�l����!H�9�:��O&��7 JʱQ�&��i)�"��{����IQ%�Ejxm�(k�}���&0TH��Hi�TY�7 Ja�-"@*C�ti�!�躋sF�[1 ���Y�С���}�1�h����c絙�q��8_g�q����'��t�FiD�2�1�]�X(���aɔt��hoО��rʰ{�ܪ��_�QW����n{�̪��0�d&ol⬵Ζ�����4t���\�yV�D��0Z�C': �̏xgܡ�}��>�_��OG����]N��w���|6HhS�{��EUe�Epi�ȫW���Ӳy@a�����Mn�x�MM���� +� ��� 5��� 4tp!���OW�;��2� ������y�Q��,�n��^ĥ�2|g ���b [��A����,6��Z��I��ti�y���/����䫺�f3S��{��y���K�-��I��q>�nR|��/=�5C��#n���ϻ��M�uDv�+�l��&�^ifYH�U +ׅC�W���Es:�f6<���OW��? �`y�m2���P:��uc�u����xV$��3X/��|uD�B��I9N.F�"A�� ���x)�\�[��د��Gȱ1������d�S�DP�m*�g�a[�l@�$���DC?���h��o%�� �^�'�ߢ��Q�Y�kf48��� +R+ L���N��[��'�Wp2m�1j� �٠�8謲��f~�a��ߟ��u?��H���a�|oP�5ȍa�\�MK���'K�c�nv���#|�D�[�o���4&NM��~s�;6�cc��G�3�'G]���K�̞P�+ѩ-pw�68��� x����w?a���D�b�z��c���u���,�< +��U�N��2�����u�U���n��/�E��.y4C�Y�E�N6CjhҬW���d���ބ��O�n�y0�����B��c>o.�⾱]��&�ڑ��l��k@[4B�+S�_�[Ǒ��[0K&�?��/���%��G�� +endstream +endobj +947 0 obj +<< +/Type /Page +/Contents 948 0 R +/Resources 946 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 878 0 R +/Annots [ 945 0 R ] +>> +endobj +945 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.53 644.085 363.348 656.315] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ae8e920ecde96d7d79b8962da38233880) >> +>> +endobj +949 0 obj +<< +/D [947 0 R /XYZ -13.423 915.745 null] +>> +endobj +950 0 obj +<< +/D [947 0 R /XYZ 29.788 728.902 null] +>> +endobj +951 0 obj +<< +/D [947 0 R /XYZ 29.788 710.36 null] +>> +endobj +946 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +976 0 obj +<< +/Length 2821 +/Filter /FlateDecode +>> +stream +x��[Yo��~����c���[�,7r����CR�D�,$R�b7E�=�Q$MI�� @R���g?g'W7?�`U]D�*����#�p� +O��+��A���e�^��h�� �a��8A���+��ݻp���%�S8Xl ��i���1*�"�1F � a��HŚ8��2����`/��D# +h�sk@w�W�64xU����=��>�B��HĬÖW�@!�b%�r�#<��aw�����^�1^wK:/�m2�@dL)�J��/o.�ހQb��2�� �B2����o����ˢZ�]�DƳ�4���N���z����f�X���4������%�D T<��=h��:���(�<��T��� f� +� }|;���L\�����.��U��Y��o�l����ӱ+P���)�(`�3sK��@f�e�N-I��E�I��R9F���@�!.c0l�"0���E���Ay�,��)�-tR��-����߫dՇ���G�,(���j�W�����U�ʓ��ߖ̬�|e��y���.%���[��T����4G�VpK����;��X���� �ɱ�8���]s�iy���3�ڣ�߶�³ZlӮ�V��&��{˝���?χ��Ī�o�!��t����\z�����d��Y����p�ܲ��8�@n�BL�шaH�*nC +� +a�ud���18�?���A @`:� �>�!ɵ�����Q +�E�$�CBr�lmc]ϴ1eu)�p� +����t[=�&�\�3r�e�@��hO�2�/���x��6��aBB���`d�,��Qv�]�?N�D��F4)��w��^��y*U� +LF�BE6l�us���ϫt�%>G<���?�U:��� +[ꞦQC q&�r�v�����eR���(��Pj��~��k�).�h�[=��[ �k{*���v�3�m��ˀ� ʟ��"��*��3)*���>�U]�� �Uuk{S�Tc���9���ik�� &0����+vb���@ΰ��rnCǠ���Jn_�{�Ӵ������:]:c.�5͓���M�m�n����ܭZ�:��;g�\�[%���}}����h�)�)�,����u㠆E����LLcH��Y*K�%X���֘L(, A��J�9VXB �dB#R2dB���J�.�L�+�BL>����~� +9n��V!^�s.<��b/�X�t���ծ�Sm�E�����v��0��Sҏ�q�?�~Sj}��y�(��koSY1����\~��JD��6�i��'�zg��T�x�/m��I�|O��(�#�AEP�����Z+�#b?��&M��� +����yA!���C���*�A8���֪g�A#��l�V̸���̌!���؟x��j�Fل�����D�Qtb�����:�������{�+1���=����m��~�O���\���c�mE47zkZ���xhU>����#C�I��<�!�����G��V�`�U�nҤ���������V�]��SG����E��� (N��{��ˢ����z*��5B��a�a��h�S��>�8��iլ}ew[����������R�=T9��Ǫd�������+?Y�TBM��!-o�rs��~5N%�Q�K�����K�k� �w*ݏU +P��T�� ��U��L"�� ���o��lb�������֦b��1��Eg��!��mY��o`���埲٢)K�W,���l��G�0<Y$q�vY�q>4��H�KKL�b lJ�<�x�3�E����i��|��ő�4��I�.:DW����B$F�Pc;�3a���,�(@d�h�K��|z/J��v���|u��"��LhD�!` +`�S�q�^�@���(J!�>G#F�����n��؋EF�#_2�~����� +_�t� �6~� +&���T�O��4����Մ!^�S Q;@�N(?�'�,��>C6��t"q[B�Ldoj��fF|���HQ�n�ǒ�2�-����E�jJ>�'�3LY��w��Zf��������w�*�f[��=��x~C�WM=�郟��(c�>��J�;�ٌ��2*��"z������������X�{�$�Ғl���t>5�������]z�j���_��أ_��Q�O���EC�!�x����'�Z��O�fgU0b+���O�\G�c@������l7g��O|��b��'�š�u��<;f6i��1���GW>���T�d�\���A�f�b�}���H�zۜ���T���2{�ԉ���_颶?����.�W���F�E�&��g:h�-�?��&4�yZ�|J�A�7���B�A;�VCsd5|��(�C-� �9TH�k�i�{s?�0�dG�)�g�{�k$�Q{dw� +}��ɟ� (��~C�a������%aFTv�9�;o�� +B�=\�Y�}υ�c$�����|����ɍƠ�Lr���"����ag���c��px���Y�<׆���=FJ��Az�g*����v���yRmߤ�B�biJt�����qS�5�'�w���}z~��M���?yН:{ w3B�2� +�7����w���O6{����hۆ��1��X���2[��~��wQ��e��U�VI�45�����,�2��E���5K�ޮ��'w��R�Y���Y�����M����&�l��<a܋6�ڵ��ʗ4�"�z_���*�n�Yo{���|�h:]�mZ֮��A�:N���0�!��q������b� +endstream +endobj +975 0 obj +<< +/Type /Page +/Contents 976 0 R +/Resources 974 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 878 0 R +/Annots [ 959 0 R 960 0 R 961 0 R 964 0 R 969 0 R 970 0 R 973 0 R ] +>> +endobj +959 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [340.729 466.292 393.034 478.795] +/A << /S /GoTo /D (group__bsec__interface_ga51bcd13812ea62b35749284385a72f98) >> +>> +endobj +960 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [340.729 450.111 462.165 462.615] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +961 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [340.729 433.931 423.361 446.435] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +964 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.302 358.411 474.29 370.915] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +969 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.856 282.891 425.761 295.394] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +970 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.856 234.351 398.489 246.854] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +973 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.267 145.281 428.51 157.785] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +977 0 obj +<< +/D [975 0 R /XYZ -13.423 915.745 null] +>> +endobj +129 0 obj +<< +/D [975 0 R /XYZ 29.788 737.428 null] +>> +endobj +978 0 obj +<< +/D [975 0 R /XYZ 29.788 653.104 null] +>> +endobj +133 0 obj +<< +/D [975 0 R /XYZ 29.788 653.104 null] +>> +endobj +137 0 obj +<< +/D [975 0 R /XYZ 29.788 617.41 null] +>> +endobj +979 0 obj +<< +/D [975 0 R /XYZ 29.788 548.854 null] +>> +endobj +980 0 obj +<< +/D [975 0 R /XYZ 29.788 497.059 null] +>> +endobj +981 0 obj +<< +/D [975 0 R /XYZ 29.788 389.179 null] +>> +endobj +982 0 obj +<< +/D [975 0 R /XYZ 29.788 313.659 null] +>> +endobj +983 0 obj +<< +/D [975 0 R /XYZ 29.788 176.049 null] +>> +endobj +984 0 obj +<< +/D [975 0 R /XYZ 29.788 112.679 null] +>> +endobj +974 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F89 511 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +993 0 obj +<< +/Length 3445 +/Filter /FlateDecode +>> +stream +x���n�6��_��60�ERG�f2G A2c�>$�@�Ͷ��:�ڎ���b%JV��#���!ţXw�y}��g\�gQpD��3��@K�\��A��0U:hL�=������%�f<M�a����n�a-�4�7�Y�r���X�)�S��d +�i&B-b�.�/��<C䠒$R���A���Y(# ��W�@l����2xW���}��Sd-]Z�I�<��]Qy�U��R5 �1p)j��D�P=A�z��a���/�&�̤E����g�?�R +�*M��m�a�eA���/6����u��:_�i��l��n:�>��⇳�1Bi��i�O3����Q�����7v��2��}B��X��T#T�'��ep����9�N�8">���h����eSte]Q��c�1����Ӄ�Hz�!�,����Ы$T��I�8#�~��tib�0]���l�q(H�ڮ +.���_�\��iLV��<3��h:�x��ٜ/���cSV�X���^���oy +�8V��F`�� �x�7��i�.��ں+s���0-l;@���l����$�:!�Fx��"Y|.��J�(� �Ԙ���1�*,���_���,�l"!�C8صYu�Z�-�rQ�o��RsWS�/ʪ�}s]��vwK���rO��֚2O�7f�Rݒ��WEkveex�j[7{g5�psUZ��U���������H�Y��[��� +����4v�jm�ي�e+V.��*=%8���]�-BV��x����_ +\[�Oug�ʚPV9�~F�q��YfP����Ů\5$"�X�U[�]K_�(�Mq��k�_�KP��jϣ���(��P!@�g�x���� *��>g�G���YI��ZV;<RP�roB���+��)w;���eW�pŢ�rK�"��Z�eUve�+�k5Fo���9��mۙ=u��W�������H��.\w�Vj��H}��:&Ho){�̙��^Dt�Dco�!٢�S��s]�`�W�@k��D�庨�+��b�V(��aK��9&��MT��ֱ 2c�/13�R� +�0�E6j6��Y�c�Fε��f�#>��6x՚��M��=��E:���@���(�2�# +��67EഓDͬjb�}iLwl�/�h��ץ���sۄx�� ���k �V9F�v��S���5A(��z�R*%��P�"I;�WYwM��Q��FAT�A:<̮�n2�|�X���M�ev��h�F�ꋷ̓Źd�#t,��?��1JG���� �`2ϝT��H M���V���Q�WLW;+��5�#�����АG@��X+F���9���� +vX^�f��l�����:����<�~'\[���M��uRh�w�xb�?�O,�Q��\�����hg=�l8�*^"����Y�� ��9E�Jr�ey�yG��(�!�A/)u�6VC͆�=mkym7��P�X�y좪�ݎM�`s���V��B��Vc{}��mS�P�s���m[�Qw�N8j������N9�6�luKeG� +s�c� �XY���U �^4��������w������W0*M��=\�yU\3<�H� *#0s-�N��J�e�Y���b�h��� 7��6Q�< �Dn���a�)6@�Rz�g����[�� +�d�^��u_^^ur{�q���b? s�T'��jcP��ި 0��W�� +�-��LQL�o��Щo���ݗb�����%�څ�0�r���j�B}j�д��ǡ�6�]yˈ%�=7�|��NlY{��..M�H�K!��ey��ߜ��f�Ņ>Y��>���е�v�{���6������TtNz:�m��@�`iuD��y��cnu-N���np��49�����ǖ��<��ט��Lt��8����!��fl�ݮ����M��?�7ع��}�*|3}1�s���Yi��D8�?���� �s Ĉ���v�O�������Q�얳�^'�#�g˒�{Q搽1s�|�)��Tw>�5�{�{%0����8��c����'�9Շ���#VQ�3e߂��c��HP���$�ٜ0K�/ʬ����I���RK!o�T�x��?�W���)5Tɧ2̲�*%�����<â|��̓ �a3*y�!�����M�q����k�n��RW��:M� �5�<�S��9��t�C��?��}��C�C�2��Xy��<���}�'�[���9_1aY�g�q&(�a'7���ZZ�1-���Z����[wm}�� +��Uu�K�{Gm�274ru.�<�a�'�=��j���m+ެP얋��.:���-���4|�Kz ��S:e�"�ۺZ��L� ���+�*�Dx����[S�|�Ν_�"6��%��Gq'����"Y�������C1Vr�s;P� �In8~�>B&�W" +6���ʸ)��V�"�� ��X���n��43������L�u&kk� ��"hU� +>m��h�4;ܶ�nrt��p�쯒�%�̳��YK�D��k���#ث���Fdsa��,�c4�"�5o��T9' ��C���<HHʧ"���Rijkc�*w9���q�!<q�ցX�F+�i��s��K,7EW�C�����B1�7;�7U�T�w �(�eX��6�����tˉ�%�#��L�?�1N�t������ �8{�E<ZD.�D��S"@�A�4�< 5�=���Ҭ9��[�����C����?�a������I�����j�ѽ�@�Aß����*�ش�~[J�T��50�"�6�A �0:��OBiVG �C� +��e�ݱ��7�oi���K��m�����\���� ��_���[a�9.�{���K=8sbO�<����T��5�7��j�2{�$�aAs�~'�b��❕?v���̺�ܚb��*�K<5Lh{Vy��[JLm�_�]�>�z���}s�Lc�x���|���$��ޫ��}з|�SeK�K�8c,�9�A�?q)�R���A���D�:�B�`����G +�.�5t���ٟ�����(�D����Mm��߿�����\�a�����Ĵ��:gV�5p +���E��;��/f2ɸ���up���.'���,���s��i�t���9:>[����"�sP7�/���#������i\�W��R�b�4����cx��pޯ�h�-!jzb������d}Y +3�Jn_� +|�:z\��{\�j�q���:P��L�xc�V����Ɩ����UAh���)�,� ����[�)�C��Wt�b�<��n!� #Q�9��&�T���y���ru��-9���#oCw+6n��{����\�a��q�î\')��P��6GD�{�q0M�A��s���8s��7�?�`��>^Fӝ������i +endstream +endobj +992 0 obj +<< +/Type /Page +/Contents 993 0 R +/Resources 991 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 878 0 R +/Annots [ 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R ] +>> +endobj +985 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 542.488 129.639 552.039] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +986 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.436 528.938 176.917 538.489] +/A << /S /GoTo /D (structbsec__input__t) >> +>> +endobj +987 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [90.192 501.84 153.38 511.391] +/A << /S /GoTo /D (structbsec__output__t) >> +>> +endobj +988 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.427 451.231 497.059 463.734] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +989 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.363 274.015 262.996 286.518] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +990 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.247 237.525 150.492 250.028] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +994 0 obj +<< +/D [992 0 R /XYZ -13.423 915.745 null] +>> +endobj +141 0 obj +<< +/D [992 0 R /XYZ 29.788 615.164 null] +>> +endobj +715 0 obj +<< +/D [992 0 R /XYZ 29.788 589.922 null] +>> +endobj +995 0 obj +<< +/D [992 0 R /XYZ 29.788 589.922 null] +>> +endobj +998 0 obj +<< +/D [992 0 R /XYZ 29.788 158.82 null] +>> +endobj +991 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F44 228 0 R /F120 619 0 R /F159 996 0 R /F163 997 0 R /F97 510 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1022 0 obj +<< +/Length 2319 +/Filter /FlateDecode +>> +stream +x��Z�o�8���B�6bė����M��tS��b/�LۺZ��G�����7|H�9��.P��Ԣ���o�O'�Z������^,���űx�Q���3�<ƭ\X�������Mw'��A�q-s+[r�����X��(�@��>�]Ϛ��Ե<#��d*��G|�4\�2"y�j��N��u(p��[M�t���p<N��6���>��.��Z/��볖Z�\�C��q�ޣZm�ۘ����A��T�m�Е=��vHKȇ��>���fzp�%�(`�gM ����hO����MVD�C�x��R�E��":���|p:m)�W���ԗ���k�?[�Xw�4�䀁Zk벭�sh�G8�b��ji�ꚜ 逹���{J\��C�0NK���2�R�ᬊ�B)�o<�|�\�M�83��LK�q�"�S�v�@��0�ȋ���k�`y.뛘~cbN]D)��6�w�#�<����jB�3,��1q�&)�xG�w�AciǾ�!F đ�H�������o-q�s���Jg uS����q��ϔ�US��v�_�鵎��Ur#r�����Y�bn>+��]�y�ő~��.�'�S+�^rQVy +<��]H��=C���,��,���1<��aD��1s���D��<��2�r�c��/�gڦw+a�WQE�(�E�6��ʕ���B�:���R��Jw�+=U���ə�l +<G��x�TЎ�mN���K�l�B��ǎ�A���B6v + +tٝ���oq��Q6�t�u��v"�,��S �3栃��ѫI��Da@���M!��9+;<��-�+z�JvʕU�ezl��?3��Y�k���˧»Mk>�M�]���a�;M:zM���v�´�o�0�:�s~[Q�eUa���E���MH@�ߋ�m�R�RU����y��ۚU���l���`���_|��(�:���IN���"Ai$��&Z�"�����[�A�+�l�_�d�;Ig�n�xެ��Y �e��0�%�n��?z~8�h���2�����y�'75H������������r|9�e�c?�+�W"^��zX��tĽ�f2xg:z{Zqe�[=���hzz~q:9�~��>�#�R%�����l_u�#ߙ��}<�O{�$"���w��bO��c��j��T:No�O&�'a���&�d�֬Oz�*[�*����4�����;U-�������\SZK�Q��9j�`��ou=ѬI��K����`���Y�\����R�a<�7"�M�Y�e�,�b�[}� TP��^�X��b�d�<�����XE�����v$�����`e�;�P��\�������~�IL瓞7PPVȝ��yu����:�����~hTt���E�k�W��e��Д��5j��%{�QX��mE��q*����C_��Tm8��6�y,n�峔P�պ4��ȳ�=�������Jʺx�gff�(WM��'���{���V)��E�a.�S\:ઓ�7������*Lnb��;� +�?��lJ�zkǟ&;�R��x�{��g���O���n��t�� �9�^=���EY���e���e�����)@��V����&!.�ɞ;�6�E\#�n�A\�� )�̘�^�Q�:I�.ma�gw��R�ȡG����6�1]�<h�SO]{�`V:� @��-]���Y!�±��\xkLɰ�x���x6 s��_���J.�+,p��f7�b!������5��O�n3�s1�N@[�����dž�o,p��c9k"������&�[yP<�C>���!���n�-�R���~F�0] +��H쫎4+cy�"y��9�͢*QT���m�`���C�G���S�w��U��n������:�@DT&5֙�<W�z3ӝZ�#�o��g͜�֑7d*��%�Ӊ���:�U���[Y]?_��b���v\�ϼ(�@�Z{H�{�G���ì�rԡ<K���L $kI��o����-"ӌ���k�ۭQ��&k���-�~w|��J���z\*ݚ;k��S�9���ņR�k���z�UI*��J����m4C��h}��8�C#/��B�6�2У�R�Me�x��3�%PX^�vn�)�kxe����� �c&o��<^�d���&�>�2y5Vdu�2��ޑ�a�U����&+µ�ė�:�K�<̧\�v^E�'$�\7����j� S��k1�d�;!q�Ks���Uy�[�[��:w|��:n����/��t^I��ah������O�k���*a�?�`�����/��W<) +endstream +endobj +1021 0 obj +<< +/Type /Page +/Contents 1022 0 R +/Resources 1020 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1025 0 R +/Annots [ 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R ] +>> +endobj +1001 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 588.189 80.996 596.9] +/A << /S /GoTo /D (structbsec__input__t) >> +>> +endobj +1002 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 569.26 85.181 577.971] +/A << /S /GoTo /D (structbsec__output__t) >> +>> +endobj +1003 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 540.867 118.655 549.578] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1004 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 493.544 106.102 502.255] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1005 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.662 493.544 210.71 502.255] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650ad30626f0de1be98802cb5e50c8b67207) >> +>> +endobj +1006 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 484 93.549 492.791] +/A << /S /GoTo /D (structbsec__input__t_a000803d39a2be521f2b5e7017c31303b) >> +>> +endobj +1007 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 474.615 110.286 483.326] +/A << /S /GoTo /D (structbsec__input__t_a90d515d57b274dfde74a281de469a3ad) >> +>> +endobj +1008 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 465.15 106.102 473.862] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1009 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.662 465.15 210.71 473.862] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +1010 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 455.606 93.549 464.397] +/A << /S /GoTo /D (structbsec__input__t_a000803d39a2be521f2b5e7017c31303b) >> +>> +endobj +1011 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 446.221 110.286 454.933] +/A << /S /GoTo /D (structbsec__input__t_a90d515d57b274dfde74a281de469a3ad) >> +>> +endobj +1012 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 436.757 106.102 445.468] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1013 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.662 436.757 198.157 445.468] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a381b968290256e77d50c4f7e92bfb27c) >> +>> +endobj +1014 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 427.213 93.549 436.004] +/A << /S /GoTo /D (structbsec__input__t_a000803d39a2be521f2b5e7017c31303b) >> +>> +endobj +1015 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 417.828 110.286 426.539] +/A << /S /GoTo /D (structbsec__input__t_a90d515d57b274dfde74a281de469a3ad) >> +>> +endobj +1016 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [66.451 379.97 122.839 388.681] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1017 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [83.188 351.911 114.471 360.288] +/A << /S /GoTo /D (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a06af666972edcebef3302d015f1d56c5) >> +>> +endobj +1018 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [99.925 295.036 164.682 303.285] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea2368e219ebbce4e1ede7209486283a6e) >> +>> +endobj +1019 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 114.804 129.639 124.445] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1023 0 obj +<< +/D [1021 0 R /XYZ -13.423 915.745 null] +>> +endobj +916 0 obj +<< +/D [1021 0 R /XYZ 29.788 180.037 null] +>> +endobj +1024 0 obj +<< +/D [1021 0 R /XYZ 29.788 161.467 null] +>> +endobj +1020 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F97 510 0 R /F44 228 0 R /F163 997 0 R /F159 996 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1045 0 obj +<< +/Length 2771 +/Filter /FlateDecode +>> +stream +x��Z�o�F���2`�����!n�\��M�kEK��H��8)��wfw�iY��NH-wg3�ۙ�����;f��3j�,j�>���g(��8$`��%'�t�<���~ݩ| R��b��N\'����l�b6��=�'2`V�� ܑCIS�Z�aµ<��q��m��}�^\WH���RkR��3"��i(� +���7[a����4��jL�e�z9���쨥�E)��H?��j��+Q���u�ֵ}��U�ӵm���׃���.���=��H� ��Y�w������]ZfWY��m����qZdyG�n<���(ä�����G�>Qk �(�[���am��]������ p�V�ԧ��c:0�%�c%�_�ux���*�$Ku��*Y�J�C�4����qj�q]��l�!����EYZ��ÝY�����A@[Wt�z��hc�&�?d�����.�/L�~W�� �pLG�0e��������?R*�0D0��P�yn�?�%��e���1(���G�0] �A�K!b�\�J�}�k���e��_b=D�ڼDU��i�l�E��̗,�|U�%c]����a��Mp�Ͷ%�/g�f�=����L��-$,U������FU�����ң<݀jrˀ���pQ��|��X0%��ِ�s[8.ڮ���h��$զ��M�ХqeKnh,60������cWy(��p�q^����`H{���V�~�e�6l�o�A�bc�=$��`�B;e����\�Q|�|���.�5k��qObqWE�.��ڷ� �4R;V��sD[ٌE��<^���saPUE��A�,�E�Z!a��V�}V��Ȧ�o瞜MN=i���_v�C��kF�DB��7C��#�"�M9�z+�\F��rrV�#ҟ�Z�쨅 ]��uh��za��������j&�hGG���5hT�`$'X��_�&xk� ($ �� j��L��`��p���˒�;\A=���D2-���m��6q�>B��w�8,ځ>�y���/�3w�˻���ί~��j�����=�M9c����7LC�B��[�)�co�g^��|�UϷw�+���1��9�͇Y��&�q�K�����g����J�Ƞ�?*!�@ܱ8�� &;����H�( +)��@���y�.�cAA2����!����j6O��}sHi8����;�F0�7P�@A"�Y��IM����M�}� +����7��i���*r�����������H��+����Y����T���@��H8�����؝# B0y�<;Q��g���\�S�f�<�>�q:��yV���8T��j"���pǡ�k�0�㪍�����r��[�}ƚك��4K���0��4��(Y*}+�yX*�-vr48�(I{�F��m�u��Gb�j���k����s~ �MجDLڍ�̝�n5_�a�k(��Ӽ�2_=�(�<|��J��|�Ȧ���9��e�g�[���q�y +����~;g���Ezƞ�mt����y1�biv +�z�õ�e�p�i��T���$L<�gu+��=�q��Y���l#���q&�i�Oq�*�[B����"�w��{�{�j��s �'��e(� +�����+9��3$�G�go�����ñ�a*X�˨���0�as��{<��-��P�`�vi"�8��.c|u�D�~s$����ﯚ3�ߛ��:���U�EqWm.�p�8�ICS/��ڻD���q���J��ԇ? <j�7jh:\+h������k��G�?����<&��K�}�Ľ�l�(,��/!P �e�d�i���� �?7�Q#��ÁۃO����^` n�#�ᑕB4�P��u��%6:�a���:gr��:X�^����z�f�`���wI�;��o��~7�,O��V�LL�E���dUf7�����%;�̌U����z`P<���s�bϜ��� �F��(]�pƔ�cT<'�n���Y������ y���$S�ڠ(�O�R=����f�\��]k�3������{���!i 0e7�A<1��2=����1XS^�IJ�:vL����~������=_��:��)��!]]�w���� +l���R_�s��;L�� ��ޛ�=1�O��iw4F�}���w�- E�$>�쿡A9��p@��S/h�Jq��)r�|RA�n�*��ߌܾ9��R��֨��<�0�m��g<�UC��� =����@�ٟ��Wa��E��_����3Z��*�wGf����fe�ZƟZ�,��ʈ�B�]��?�m�3j��3���^�>�;w�lu��~�3���\�M��|TU�bo4���2�O+0`H}ͬ��#�5,Chs���ѫ����x\ +c����W��} +}��S����@�Z{!`���ꋁ��D3k��3� +r�R��@(��D ڭ�ň/|��٩d^#��|���N+�^Wk��U�[�����}�kT��z�W�5�*�|�'�W���������:ΪMO�l������UƖM�����y��n�WoT��hme���K�n-���n 3%P�aE.�ޕJXw�T�O9{�]�[@n>L�N���j��9Ի�B�BG�)���*�խ.�3L�i�ˤ�ϊp�����&KJ�<LQ��ٲ��"X/��L^Quڄ�v6/(ƴ��y����_�j��tpl�W]�������tY!�:����8/MH��!��=q�T�����k|���� Ս�� +endstream +endobj +1044 0 obj +<< +/Type /Page +/Contents 1045 0 R +/Resources 1043 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1025 0 R +/Annots [ 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R ] +>> +endobj +1031 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.91 678.264 411.796 690.767] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +1032 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.485 664.715 524.921 677.218] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +1033 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.541 625.701 240.588 658.026] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +1034 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.68 598.603 567.119 610.833] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1035 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.953 319.384 260.921 328.175] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1036 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.611 309.919 298.58 318.495] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1037 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [112.478 300.782 227.447 309.246] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1038 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.4 291.317 248.368 299.781] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1039 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 253.132 122.839 261.923] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +1040 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 161.172 129.639 170.812] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1046 0 obj +<< +/D [1044 0 R /XYZ -13.423 915.745 null] +>> +endobj +1047 0 obj +<< +/D [1044 0 R /XYZ 29.788 571.106 null] +>> +endobj +517 0 obj +<< +/D [1044 0 R /XYZ 29.788 230.97 null] +>> +endobj +1048 0 obj +<< +/D [1044 0 R /XYZ 29.788 209.939 null] +>> +endobj +1043 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F163 997 0 R /F159 996 0 R /F97 510 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1062 0 obj +<< +/Length 2807 +/Filter /FlateDecode +>> +stream +xڽZ�o�F���2`����`?�7��i��@M���w%Q!); ��7)[�Q G�̛w��1��݇��Y�g�Y8�ys?�/�;"($� 8E>N&����{�/� +�L{���aw�e9g=q�0��/�C���� +ޥ4�,�q�#�<��*��A�����b��8U��p6�(�/g�a��FS��/.߮��:VǙ}Z�1��R.A���XF]S'D����T5�.��%L9ha���usDV������$�,800�H���wg�?( C!�}��ޡ!���Ccﻹ�qr����ܥ~0���<� +������!�B#�B�i�����9|����T�<�k�x`�ʹmʀ%"��̧��8� �Z8c�>���Q�t�����������,*�tc^��%s�:OcO����#h�VM����p�n]��I�Z���j�I��w�,�D>H�X�F��2�)L� +���}E�4�d��V��6Kc���fa����nU��6��$����h�;=�(L�}����1V�X�����rO��˟s|�X�Đ������� sl���aS뺦C[�����d�̡麐�T���H���������2� >*���ydHd���O�5h����2댟�����[^ȵiϾ�gL�tEB)=Z�@�PM���*�A�ǁQ�i1�/�+Z�z����|xRbL{��D'�i�?�����L+K�O����z������[0j+��L~�%����L'��~/�i&�o0�������z��u���6D�k������\��z��9�B�0!x��*�e�D��{�<˻jl��o���'�E o�JfY�}�L��4�kL�����r;p������0}w�����������߮��o����I��O�A�t��C�̨C�ZQT�S�Dú�C���m���� z!{��,ZKp���d+{ٰ�(x/y�0���`bL@ۤ�� 0��%#疄�⦢a�q����"2$n��t�O�>n�� J��T~�ŋ�bI�%���@Y��̏����R�X��Ê���s0�'(�JgW6�Ɲ��u����E3��F&���l#�l�e����e���V��#�����_�VC[9���U+<�u)?B�=�+����T�o<��q�_n�|�o�S���'gW�z�q\ zN��2yȹI�{��8��V8k�p]�l�S�\��y�����%M�Q�d#�l���@�`����<d���#�4�Ú��@��urd?��a|6y�L�����{Pz##(mr�.���w����d�V��&L�D�}���}�K�G�`��Xz" U�z"/KY�<��pzc�pm��!�j 2������u���zP/�THlEV�������\v��D=��>���OO�i$46�k�� +��"�_ ���0.�<m��E�q���&��͢X�lX<�@�g�誀�_�=݃E��Hzb`=��/�8|�R���V����q5��&S�"`��c�`�m.��b�� ��r�6���������$; ����R���������Za��v�S��`�ae��i��*l,�݁�w��0�߭.�]� �cR�����YVƐ8۳GB˩� L���>��q�Q� v�����TLn�F뭊Z��l��w\u$��6iH�6���*�����05[ɶ�;>D�ڸj�)�iaFu]��{w�ݷ�|~�ި_Ŋ�Ya��e�����y螢�\�Z��.k<l�f�Ā�l������j�1��������qH��X��#�6U;��U�w����y�Ѕ��`�L!ni ��S�C����x_���>��Aʅ�'�`�eԾ-��'P>�Z�Bh筳�r �,�8"�"d1��~�P���������Մc���ĹWx�@`�б=٘��<-�'J�.SF��ð�HP�6�l�v&�E���J���>a�LF<���9 ���[��4z�pRB`�iϡ\4Sr����~$��#��O��s%�OOZ��8��M��X�����Б�%�iT N8P�-o ½�Kp��)=�����c�j��C<��Uo��G��j�=���=��}��:o7��� ��:R��)�����)��t^d��(�Ϥ��R���f�1~�ݭ z��ߞF?˩z�@rc�>���it8�CW Pj���$�_%x�UBr��Q��R�ېu+ˑ�<����G]ٓ"jmqR�������7����MR{�ɮ~`�ûtn�05V���ԍ�=(���L�R:y����f���w��(�/��B���ޡ�l��MZ$�44�2_��n��o���Lf?��>%�t�΅����n�����Y����^��q�K�T��0�YW���������L�Q�p% ����մ�WzC�z�F�~^���h�����C1 ]�4�,<��/�g� Q�����蜍sF�9��A���p�D)x<FJo�/�6��2���6c���|u;���(ս�V}����������J4\�q�e�.�By�Ņ�hIlO��l�k�8�V31��7]�����5�l�E����Y��G��'1�T���o�4{�/n �VB}������5Q�D�(��7�ٿ��mE:�jWļ˒�R]W�m�.�}%���(��Mc�3�|3��I�M�h���u�J�B�*��,������y���@�Ȓٮ1&�M����no5�ͣ,�UDy��;U�|0��u��ɕT��l�;�@�9 �neV�{F9��vkW�P��߄C�ec<c�:��d��z +endstream +endobj +1061 0 obj +<< +/Type /Page +/Contents 1062 0 R +/Resources 1060 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1025 0 R +/Annots [ 1041 0 R 1064 0 R 1042 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R ] +>> +endobj +1041 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [526.903 725.921 567.119 738.424] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +1064 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 712.371 82.93 724.875] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +1042 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.194 712.371 540.827 724.875] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +1050 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.448 659.809 551.391 672.312] +/A << /S /GoTo /D (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) >> +>> +endobj +1051 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.4 388.862 235.816 397.327] +/A << /S /GoTo /D (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) >> +>> +endobj +1052 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.058 379.398 273.474 387.647] +/A << /S /GoTo /D (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) >> +>> +endobj +1053 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.506 369.933 260.921 378.183] +/A << /S /GoTo /D (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) >> +>> +endobj +1054 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.584 360.469 240 368.933] +/A << /S /GoTo /D (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) >> +>> +endobj +1055 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.506 351.004 260.921 359.469] +/A << /S /GoTo /D (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) >> +>> +endobj +1056 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 322.284 89.365 331.075] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +1057 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 237.097 129.639 246.738] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1058 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [90.192 223.638 158.088 233.189] +/A << /S /GoTo /D (structbsec__version__t) >> +>> +endobj +1059 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [78.035 60.127 153.391 72.358] +/A << /S /GoTo /D (structbsec__version__t) >> +>> +endobj +1063 0 obj +<< +/D [1061 0 R /XYZ -13.423 915.745 null] +>> +endobj +1065 0 obj +<< +/D [1061 0 R /XYZ 29.788 632.312 null] +>> +endobj +883 0 obj +<< +/D [1061 0 R /XYZ 29.788 302.187 null] +>> +endobj +1066 0 obj +<< +/D [1061 0 R /XYZ 29.788 283.645 null] +>> +endobj +1067 0 obj +<< +/D [1061 0 R /XYZ 29.788 193.864 null] +>> +endobj +1060 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F33 531 0 R /F30 532 0 R /F120 619 0 R /F97 510 0 R /F44 228 0 R /F159 996 0 R /F163 997 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1086 0 obj +<< +/Length 2323 +/Filter /FlateDecode +>> +stream +x��Y�o�6��Bp�T����S�<.z�8��[Z-w�bW��a'E���$Jޭ�n��(r8���fH],.��`Ӟ��&��7g�`x�=q�3�2���$����#��.�+6�i���g�Yn�q-�i��)b��L�D8�s:�t��$)F�T �IQ�*᠑$���� +�2��ј7��kj������/k����qL����1JR�e��$�gi&�j<��c�Z1�FױyDW����o��'+B��"�%j�����kpJLQƄ�dH�i 2�ߋUp�����<"" ?Ȫ��N�-�?{����ki6M����`��1�w�t��Al����S���pp �@Np�Mpl���!0Ox�ćW��V��4yW֕�xӗ+�:՟���V�kULD�x� �+�l'� �� �� �b� +~qqq��W��~+�tN��0x&Yll6������V�i��݄cp�ǡ��������-5[(��ʎA��f��֊r��$���bx��\��Wֲ��1o�Z!�{6�kK�N��*����=n��O�YV��'���ds����~�.?~ ����yLj�0�E��hp²p�i rű�*;���b�D!$�D�d���0����r��ͧ�Fv}s T��i�ќ� F�;��,3Lo�run��m@�S��"�l��e�-����۰��Cܠ�Z��ϓqHo���סb��y�2�F��3�zm�L�U�湗ͺnv��Y~2�"�n�js���� 4:�(�wv =��q���� l�w��tI +�m}�w�wnA�@��9G1K�A��`J6U��h��W�V�H����5�M_E]���x%��Zɪ3�nO�X�坛�wFO�F/E��Q��јlz����0E�1}j35;���3m�cf��i[n����o�B���x��[W��s%�y��Z�H# +�N��|LK�@�O���нQ/<�[�m-�=�oF���3���d�2.�)nP��n��&�3�V3��ck`�mt6�"湒jk*��G<�ǧ氩�Rmg�L]Bj�vn}m m���U�ܘdi�5�L�d.5ȵ���Q���p�~����\[��%˺�~m:j�Ewe+�l�)�ƩQ��j���N�` OK'6��XΡܺ�j^ōW}�rKg��� 1�����0�R��������I��))ї����M ;#��pfK�!���(r]�X�J��s�Gs,f�-�N���w�Omh�MW�6��z[6]�P��a�\kyڰ�m0H!��&� ����%���Ύ�{Y� +@ +3��<1���2�@5�w�:wư���ɼ��a��|�I��N��,O']��{�=�lD��Ebw&yT�Z0�R��Y����{��_�qϔ*%�`�p��\��a��Fg`���e9��l����Ɖ��M��P +Lqtrbv�0 ���L!�2����{̉�s����@��X;�p�v}�Va��4�x�$<Fqj�<� 2�ru�6��Q�T�����J`�S�l�h����DB 4��Ŗ��6�.\8��L(�LƧ�f�jvoB<yf��S`ى�?�cH�G �E�R��tOJ�J@�ӥ�������9��<?lh��Y���D|^������*��ʗ�P�+�I�?P�z��������x���Z���7 �p���_8 �p�� |����^:Z0���i*״x�<�ьӇv�����&�r���ft4S! +�8?�+S ���D#Ks�n2�ÿԃ�/�pb��~��,:�PI=����H���]��Խ%�j�Ȥ�����.��Nך��-e��y$Z�sF/~x��q���G��7z��8N5� �ʭ���c����$c�Tݰ1s9��'G�x<\~��{�F��3�J������:���+�*��Y'I��'��N{J!�B�I����ȴ��:g�9XJM�0%��n� ����3���f�E��h69�f)rG6�"�F�����)��Z����u>Ea�e�n��(�-�����.x�U�� gR��#���+�%��4|�6{B��C��me`��������D��%�_o��&2�����Q���7��̀�m8Mp�������rs���Tۢ��&b�s�m�6y����j��l�u�o��,��ۺ�4xخF�z�C�puT�6��XtM��9yk��T���6wrk�ܞc�jvJ��ñ����~[x�z֮�(�U����������1�g�i�G�M3(f-�S6?���Z� +endstream +endobj +1085 0 obj +<< +/Type /Page +/Contents 1086 0 R +/Resources 1084 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1025 0 R +/Annots [ 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R ] +>> +endobj +1070 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 720.495 89.365 728.96] +/A << /S /GoTo /D (structbsec__version__t) >> +>> +endobj +1071 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 710.704 97.733 719.495] +/A << /S /GoTo /D (group__bsec__interface_gae8fc6d614d6a40f0088262dccbb960dc) >> +>> +endobj +1072 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.717 701.239 231.631 710.031] +/A << /S /GoTo /D (structbsec__version__t_af823001b85e62b90279f9e6f3c478c23) >> +>> +endobj +1073 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.482 701.239 294.396 710.031] +/A << /S /GoTo /D (structbsec__version__t_a9d47d254d17740222791fa0f53c7ac52) >> +>> +endobj +1074 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [53.898 691.775 106.102 700.566] +/A << /S /GoTo /D (structbsec__version__t_a3d9b11a72027026f492a438342a2efbd) >> +>> +endobj +1075 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.953 691.775 198.157 700.566] +/A << /S /GoTo /D (structbsec__version__t_a5daac4534748c6f0be9f009273613b02) >> +>> +endobj +1076 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 616.142 129.639 625.693] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1077 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.17 565.533 339.469 578.037] +/A << /S /GoTo /D (group__bsec__interface_ga51bcd13812ea62b35749284385a72f98) >> +>> +endobj +1078 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 433.03 68.443 441.495] +/A << /S /GoTo /D (group__bsec__interface_ga51bcd13812ea62b35749284385a72f98) >> +>> +endobj +1079 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 357.071 129.639 366.622] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1080 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 137.485 101.918 146.197] +/A << /S /GoTo /D (group__bsec__interface_gae89eedb131288b72c267c02ec9dea8e5) >> +>> +endobj +1081 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [104.11 137.485 168.867 146.197] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea2368e219ebbce4e1ede7209486283a6e) >> +>> +endobj +1082 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 60.697 129.639 70.248] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1087 0 obj +<< +/D [1085 0 R /XYZ -13.423 915.745 null] +>> +endobj +536 0 obj +<< +/D [1085 0 R /XYZ 29.788 680.816 null] +>> +endobj +1088 0 obj +<< +/D [1085 0 R /XYZ 29.788 662.273 null] +>> +endobj +1089 0 obj +<< +/D [1085 0 R /XYZ 29.788 422.071 null] +>> +endobj +1090 0 obj +<< +/D [1085 0 R /XYZ 29.788 403.529 null] +>> +endobj +1091 0 obj +<< +/D [1085 0 R /XYZ 29.788 281.954 null] +>> +endobj +518 0 obj +<< +/D [1085 0 R /XYZ 29.788 126.25 null] +>> +endobj +1092 0 obj +<< +/D [1085 0 R /XYZ 29.788 107.312 null] +>> +endobj +1084 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F44 228 0 R /F163 997 0 R /F97 510 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1110 0 obj +<< +/Length 3240 +/Filter /FlateDecode +>> +stream +x��ks�6�?�3&L���7�K�Ҧ�o�IFCQ��+E�|�q�?�v�H��#9��B�b��X�����@�u}�9k�sޞ����w��S�D������������D3�& D<�ui�ܯE����""<�N�@��cL���CB�� #Je� ta�E$��8h�����S8��~F|�l���TH����w[�yU���}��Cl��/AI�[Z\�ǜ���\� w))yT���'|��y�W���)�E~9�q 2�}B���_ݞ]���>�y:�+��$�"'��~�.�����N7�.�ٍ,�jdz���dz=f(J��(�F���g�Y����BeΝ�"8��;�s�����`�� P NP��sh���T��t����4�F�����Bw�m��T�O���o(�8 A��"7ċ�㊘Ğ�)Jˢn�]��,+�����~o*̌A==�ɶr^7�vwaQ��� +k�w=M� 6!4�E-���˦Ɋu� �3�}�#���R����)�c�Sa�j�>�~@Y(`B��*���--���!��{�\� ײ�2�E�]�z���ׯ������^�)nM�pC+�J ��~A��na�ۍ<J��G�ELK��;�Te�y��N� +��F�j�����j�M���o�^�^ɤi+T��(����7�F%y^�Y\��ʤ�ףw�E���f#�P���$ם��Le]�N����FzhL� �>%�<[TI����)��fF���F������+ ܍���]�g��5�-By�Fn�mw`���13�"�b��,�����KV��ŶM�"�G����p�:�ͥ���f�\�����Ž�n�;l��Ɍ5���QY��Z�|�x�5��X�<:�=�^4+�8P������W�j%IGI�6�����'.ff����ۋc���c����]��b@��j�Ck���RPi���m6����[�=Б,ʶ�O�F�V�,Lo��8��[c8`$�X���j6�:r�9�tVH<4J����U��Zy��́�iŮ5*�{�Ur�\KYe_Pc������v�a/0��=.Y7z.�}ɒ㍙����-AU�Z:��$=m�`8��d>y�3s�ޜ�x"�fߝ��"�8�N�nuZe;ܧj4SV^�g=g��8�]��/H����F[��2�jDm$�Vm�z������LI,`���ahqR�s�&��7d�����qf��\�H����|����n���� +#��� R�v��/���Ex���E6�b>EpFb #}6��ڞj�_C��3i�O����vBfκ���6t�Pg�����=Ia,Db�LY�r�n˥!g��F��5 ���$A�&��hm��zI�VVI�& +w�������NKz� (����:v���jl �;��9���>���]��|PA�����N�*]���e��bs!5�]R�v2x��ҕǵ���Jj��%dErW?f���E��5�����\�l���Ӎ��R���cf�z������s)w��M���}���E!�6�t�e�����d����O� ��j +ag�&Z�1aE�e�!��-F��`�Ai�h<�HD��2��QW��4��|U�&�;���C�@��p�t@(D��*r`���� e�2l�F6e� Y�P7"D�T���Z�O ���YL�b����lF�x��](<�s&��Xԟ��#_��i{�5����y��LJ�d�x��ƿA� ��((1�Oj^�V��ȚV�>U���w��O]{��l�`}d��w�]�KYI3�MP��e�#��z}4�u�HגO���q��q�=L�Y�c�wUB��Ly[��>�e��<���و���Y_��S��ݸ��fu�٬11p���f�����aM�,�աqo�P�Ht� +ϳAm3(&��SKÞ"$�Uj�����u��0��v��U��N������\���y���fEuu�A�yX�U��sx��ш'j�#/�/JWY�g�eg(.�p�qDB�%�g�U��M;<��%�������I ��*�we��|ѮV����$�5��x�4����բ�p��,�3�e�A�/U�2�/_�U�l��� �y��ڸ�|[�{�����ҩ ,պ��'�-�*i�F�=X;W���R��A���L����V� fVM���B�dE�dI��&WK�X��t˥>��Ӷn�-��wHſ�j�|���0E�~j`�j��}6Yüo�� �]+C��姲��\��6P DyL�QJ:/�m�.�,�O�:��hUq�~�f�T����c�uL���\t��6��FW������ ��~t[�+Q���)��-%V�Z�g�r���>���ر�\ņvܭ�.��}Y�hb����� ��Kn6����C.��W�=Zcul��_�g������o�;����W�w�����Cbe�Y�V]0��:������������m��#�X'8:����(�G�Ğ�FDI��O�J^� �mQ���؆��I�aD�S�� >�^��ى4�t0f$���O�0�ؓ4�c���;k��\Ld�CAFt<�T 0��Y��<�������*�2,`����H���>E��am<��im�q����Ҭ�Z�����M�����ه�ۘ3����D����g�a�߆��5ا��˥�ǧ���ˀ ��;�n�c������J�D���K��C]��7�$�_B)�b�R_�"�?5�We��+�n�zq�_�ܞ1s�"����rՃ*��O���\��T������§��C����}� �4��S0�S�E����M|(~��U��q}E��@�h�\������F��q����{PQ��я��'��فi��uΔ��N�?@��yA��_�D�?���2��9sG��h�ۛ����t������C�dͳ|�(��bP7He"UX������9M��J>��&F�G�{m20D����u�=�����E4730�� +��}q� +3AJ�^D�����q����N��go����m�峗���l��8]���Ёz�ץX'�R���)�ˬ��#�Մx&���2k��0]��g����r�5�~�ESe��7'���7�Q:�6w�>Ұ�3l��sQ�KwM`��0Ygo�����EzW�;Y5&���!���q�N�rp����b�� L$ +endstream +endobj +1109 0 obj +<< +/Type /Page +/Contents 1110 0 R +/Resources 1108 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1025 0 R +/Annots [ 1083 0 R 1097 0 R 1098 0 R 1099 0 R 1112 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R ] +>> +endobj +1083 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [90.192 715.476 181.624 725.117] +/A << /S /GoTo /D (structbsec__bme__settings__t) >> +>> +endobj +1097 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [50.126 678.506 159.06 691.009] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1098 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [70.944 637.858 183.008 650.362] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1099 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.392 624.309 567.119 636.812] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1112 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 610.76 96.25 623.263] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1100 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [62.97 574.27 172.875 586.773] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1101 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.911 574.27 355.984 586.773] +/A << /S /GoTo /D (structbsec__bme__settings__t) >> +>> +endobj +1102 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.817 542.476 271.722 554.979] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1103 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [41.152 510.682 123.784 523.185] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1104 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.969 492.437 445.154 504.94] +/A << /S /GoTo /D (structbsec__bme__settings__t_a300b00f9580b9af76d441cd4db8d7083) >> +>> +endobj +1105 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 303.655 129.639 313.296] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1106 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [101.545 198.939 222.98 211.442] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +1107 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.68 146.376 567.119 158.606] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1111 0 obj +<< +/D [1109 0 R /XYZ -13.423 915.745 null] +>> +endobj +1113 0 obj +<< +/D [1109 0 R /XYZ 29.788 481.478 null] +>> +endobj +516 0 obj +<< +/D [1109 0 R /XYZ 29.788 368.274 null] +>> +endobj +1114 0 obj +<< +/D [1109 0 R /XYZ 29.788 349.732 null] +>> +endobj +1115 0 obj +<< +/D [1109 0 R /XYZ 29.788 118.879 null] +>> +endobj +1108 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F163 997 0 R /F159 996 0 R /F33 531 0 R /F30 532 0 R /F89 511 0 R /F97 510 0 R /F44 228 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1129 0 obj +<< +/Length 2721 +/Filter /FlateDecode +>> +stream +x��Zms�6��_��� �y���\|n:M�ڞ�]���� �w����t��o�)��lK�]o� !`�x�x�X,y~{}żyyB��G����1x~��q@bƼHr�d�ڛ���%|ZH�j��N� ��:��܌�<��� "2f�d�@x ��v=kuR(�D詈��qT��}h��#�0���_��۩�� T�6��*�� ����K���n��Oc״�z^#a$[Ӳ梔{1 d�gg��3V�̪� ��릸c��n���e��H�����=9�;�� K��ۙ�c���S�]�۩�q�6/'��>W��Fge^Tzr��������d��U�M#���3�����G���{4�K�[x7�9�Y��P<�j 8�VsoW����X�Xo7�sx�Uz^$U�g��r�N��о|�����E|\:|` +��OB"#���$J��UR$K]��@�ظ^ʾ�E5&���Z���RG�:(t��t�t�UN�Yq�iۤ����Qh �����r������u��dʼn��_��T{Uuq=�ſ�w�O�]�(���;]s�i���)�F�²�Ab~�K=��*��UR��Uݻ��"��F.C����F��,P���8v��Fv�xv�W$!ּ����y �Afv0e�7�e���M�alT����G��+w���w07yH�Er�pb����7��{1x��m�U�8�z���h����8��~��u���G�g�J>�×:O�.��x���4-ד�.��zq�V�^<��I��.�z�&���bb�� l����/EbE�y�@�a��v~~�<]|M�+$����0��!���10 ����,�$�����H�r]�y�Ld�ЬӬ�ƕ�Uj赀�5������G��zJے�f�6���!BΌ?������立������������.�X>�>�5�! �$x�(`/�����{�3��@�8d1�f3]��ja�Z��~������.��ȓ�-%��*��]�$�f��ѵ*���2�"�I��-�c[�V�o�h\���E�]��B[ooĻRO�x�v��D:0��gv��[��x@��6�:<���w�e��P��w���:$a���t3����@����WX���p���FT�L�H�6.̑1�z4v�B��A`�&!�cn��/���t۬��&FbA�B�p� ���Iu0K�&����T(ZR<"��ګ��φ�1�@ -p"7�b`86fMx7~�x�Sg�'�# �h�: 1,���t�B C8j�k̸5T\���`��x3K�;4�@��x.�:~)���_V��.�d������ґ�T�JQ7B�C�c�I1�oQ%�zW���Y�^T�����6JE9t�XS�s����1���+-��za5�GMm��5��� 9��G����QnetV���@*_U�K�f�d����@�P�&OcB�����JO���ƹRθam�p4OJ�R������ :`��]��l}ZYٴ��=ɗK�M��T��)6�����kVY�Z���<�Q�q_�'=��T�;=C� 3���8 R9��3<����f�Y�ۼh���1w��\{�mv�Q�g�C��s��-�2��T2Kc�� ѡT/9��d�{7"1k�B��ew�.��&tne����;�M.\���8���j��2�)������㒛$���`D���F�}����\���z9IuV�&�6M��PS�/�0j�ZB�}���V�!�����L�7'u���[�VO`GרjES܌��ԛ�;��{&�U�3A}�5��<B�p�j� �K7K�f0�����W����j��� +�y6�/��w1��H�܉�$)��yk�5<m�-nsX{G�.M77`ET}9�#��TD�x2c'A�x"Wq� +L�1� ��?�u���6����\ہ�smmH��o(�� ���H�9;�;np\�[6p����e�Ҭ�j;2g@�����n3 T��8��ǩ0d��z��/(aQp<5��6�����<�B�Q�سm��n���pot��4<���߫+�J�4q�*���5���g_�9�6�6�(��_{)V�ro�ۤR��Saxɸ�ޯ�K��Wp���&e�K_�9rc�kl���^����{j��c�����*6;)�>�y���@���'�|��yYU�N�6@��~ȧ�'J��\� "�!&6�D~@�6�|�.��\����'���^ ���$�k,� +�^�4dy�N�����.����Vi��;]���W��M��4F��aD���2��T����oҸ>\A���6�ئ�����* �,��qi?ej�f�Y�S +6e�О��m~7$,~�S���%;.�.9�)�}�]��)�̿�=;����!R��y';�y;�91��R��@)B ڭ��E`<^?[B�8�N�^����z�x-ִ ����~���{���qc��|���%��E�6�$�_�<Yz�Y�I0@�y~E��8�lr2N�&�k�,vG���bg�LZ�_浥|�C�(��֍�e����Z���O9�\�}o������7۶�H���E1e��l%Y�y�0O +��ğI�ͪ���*/�������"O+�<\U�WE>]O��h��)�>������n�ꓔ���)I�x�G�p��������M?��Y���S�����f�5�_�ڕ.*w���!Of|.��L��~5!�~�?�R� +endstream +endobj +1128 0 obj +<< +/Type /Page +/Contents 1129 0 R +/Resources 1127 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1025 0 R +/Annots [ 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R ] +>> +endobj +1118 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.953 571.579 260.921 580.37] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1119 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.611 562.115 298.58 570.691] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1120 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [112.478 552.977 227.447 561.441] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1121 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.4 543.512 248.368 551.977] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1122 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 495.863 122.839 504.654] +/A << /S /GoTo /D (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) >> +>> +endobj +1123 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 410.766 129.639 420.317] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1124 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.242 305.96 532.972 318.464] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +1125 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [450.874 292.411 533.265 304.914] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +1126 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.68 226.299 567.119 238.53] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1130 0 obj +<< +/D [1128 0 R /XYZ -13.423 915.745 null] +>> +endobj +882 0 obj +<< +/D [1128 0 R /XYZ 29.788 475.767 null] +>> +endobj +1131 0 obj +<< +/D [1128 0 R /XYZ 29.788 457.224 null] +>> +endobj +1132 0 obj +<< +/D [1128 0 R /XYZ 29.788 198.802 null] +>> +endobj +1127 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F97 510 0 R /F44 228 0 R /F159 996 0 R /F163 997 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1150 0 obj +<< +/Length 3172 +/Filter /FlateDecode +>> +stream +x���r�6��_�Gy&� ���}�7n�NҦ�v�۴��%��.E����N?~p(��[��t� q=8������ݶ'�w�ޛ�x���H��Yd�y2�A�^���ɏO�� �`��b$q6�uf�ܝ�<�M���2�2�-7GSH��\$Ҁ��K%b�5P��s\���A#ID�5쟼�;���@��i�N���`��n���T#�y2��[�b$2r�Bv�!�� �d�~���>����!8h��@Zw��F��u��9��HJ!�%z�����PJ&�,JSo��x�Rzi�����]ޝ�<��kU�uө����N.�1,����2�J �㯡�����ʽ�t���+�k��@pKX+R�j� ju���z��'Oل��˿# o�N�6yW��鋕2�T�>���M�yCx+B0O��% ")<?a�|��^��o�v/>l���s�@����US#!w�Hj��R���/_�@�ݩ�hvsZ���n���1����6�41��� �4Db�Dr����ԏy<��=�lK��<�"��1p3<�;/�z�w�>o���Tc�y�?�$��}Qur��V�����Z-�`}�ݰ-J��I��M�4z�P����\|�������_��w?\,���|9F���ׯ��6>�M��Fp��pV-�!�{!^f�p���Qu��M�^��©J���#��Q�oUC(>�oQ��*�|����r'��k����ތ�mu_�}����=��t��9f"�bb`�m��M��t�����e�4��D���V�ܱ�y��k&��i�l�#c��Д�A�B<�Zګ�>l�*@g_������ +�0L(�Dx�B���z�]����i�M���H#�A�"t� �Ds�`�.Y��aWY�4y�hL��s�P{9�Fј(��<�q7�H�u�v�X!�R���.n{��FH8w4�$B8=�� C��OYI(��IX�g��H��[��T�h�>/ ��վ|�q�=�#vOB�$����N`[->}�����9#��w�@��=|����.C�F���ہ{;�ψl�혉#� �Ob�"|���0ڇ�if� h�OR:.� J��<"E�F3��䫣t��;$lJ�P┺�ݶ��`�yЂpJ�!3 7����h�K푧���A��YJ�����iw�i�UDf���r���mj��������U^+�6F�ݼs���'6�Q��S�QK��>��_�}�P��;����SG��m���E�3�=j�)��� �.!�$G�.r�P���J��z���O� ʧg�|��"�$M�3�dw��'3\T@Նj+=���Z�z��O��ۻǶX���)�HN�J� �L5�"8�T&rU&�D�IF(I��!Q�+0���(���P����I�R��E������h-���Ml�FA:v�?S��Kb�]K4�ۣY�T�l&l��+D�'����@�9��Vi�,WF[��=zx�W�jN�hf���,�ŵ���v��1�,�Dn^DȽ=.�4�g����8�L>q$coo*�����].��痋�o��/�]�~�mÜ��$�b67�t�4�zm��[�~/���R�����{�m�t�ĢEOv��6�M^ߘ�^TW�H���]��@�'��–�6�N��g�f[7]^Qw�WKM�`6{K�yY�-����*� =vG��jI�������<��v{��MQ):ˆFh~�N�=d :f�=��vf%�� +�Y�Z���)w1Zo��mRfIA^ѭ���#�;��N�>�8�k��r)Q@�y�C�@�u�kM?u��\� +���d�x=��ݚ�Bw���L9[�b$�-n6�ԣ �Үh{�����s��W��!!����j*���ʻ�kZ9xO '/�!�`Z��lT�z$ksOr�����7}�/GS�Y��xo�Ü��&r���)'�B�F�nj/��D��m�o�©ۦ��`�jU�P)�� +�t1!��� #�3�]^�������� �8i��g�BI��+B�H?9�O��I������f��qB{��}ݩg\ Sy2X7D-���FY)��K�X�sC�H��j +��B���MmA6ꦮW=r� ��Np�� +��u�ܑ���'=��ֹ�������o 5do +n��[�婓FC1�mYNL}n�XqB}������I�D.�V��wy;��>^��v����T�f�2�j&DH���.�W�s!�@���j����Jt� �N��9�@��'�^{���E"�4?6E6��a�yse�N��N�3�����4`�u�0�ɜ���pؕ�Ҫ�^m��58t��kL�Q�>�������+@\�t���b<0�1!�.q��j�2�v�����]9<�҇�ݤ]8C��6g���k���}y��Ș�l`�Է��ؠ�����-X)�~p�7�B dTk a+ +������+L���ܹ�^-a�l� �t�b�`�0m��4�Y����8AƂ4a���ʦ6P<�էJ�ֺ���-� v7��/N�O� ��8q�m<�Ã��"�]�2�����0� �Ik�Ӑn��ģH@11�&����d�8>��c�(`��e c� �}�2�biR 3JrP��kz2�f���λ�!����wɺ������C;ޥ�z�D��= ����^���͂�b�թ�r6��������e"C�y�!���a(}S���hs��ʱ��J3zEZ��c�[��ELڽ�I�8^ļP�� �N�1Lƺ�2�c������e~�����>��z!�R�eO���wr`�w������Sz;�P��o��)$���:����N�ɬ?��;��r�l�߷����NO����i�BKǵ�mx�Ƃj9��4/������r����$��+�p! X*�Wa;m�5�۴�a����i�C�������sW��/�Na����']L'ݣ�iB���4�F�7��oqB�6� 1���!k��;s����� P�CY[ۉۼ�K|�ͫG nx[�y� +����۲.:�<h�QxG6Aʢo,�[Z� :��{g��@����!����r��$mR�Cf;\7l�e1��Iں�56٤z��2'�>q����~hʢ ��T��"����X��� +endstream +endobj +1149 0 obj +<< +/Type /Page +/Contents 1150 0 R +/Resources 1148 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1153 0 R +/Annots [ 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R ] +>> +endobj +1133 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.4 655.664 248.368 664.128] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1134 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.506 646.199 273.474 654.448] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1135 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.584 636.735 252.553 645.199] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1136 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.506 627.27 273.474 635.735] +/A << /S /GoTo /D (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) >> +>> +endobj +1137 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 579.948 89.365 588.412] +/A << /S /GoTo /D (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) >> +>> +endobj +1138 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 507.669 129.639 517.22] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1139 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.436 494.03 247.527 503.671] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1140 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [90.192 466.932 219.283 476.573] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1141 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [51.163 416.413 186.75 428.916] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1142 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.472 402.863 228.566 415.367] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1143 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.536 371.069 273.103 383.573] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1144 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [109.688 357.52 220.888 370.023] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1145 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.35 325.726 320.019 338.229] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1146 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [105.688 185.213 238.997 197.717] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1147 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.318 153.419 564.29 165.923] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1151 0 obj +<< +/D [1149 0 R /XYZ -13.423 915.745 null] +>> +endobj +601 0 obj +<< +/D [1149 0 R /XYZ 29.788 572.08 null] +>> +endobj +1152 0 obj +<< +/D [1149 0 R /XYZ 29.788 554.127 null] +>> +endobj +1148 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F120 619 0 R /F44 228 0 R /F159 996 0 R /F163 997 0 R /F89 511 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1179 0 obj +<< +/Length 2744 +/Filter /FlateDecode +>> +stream +x��Zmo�8��_�O��"%j{��x�Y4m�ػKC�[����%�����E�$�qlwq�qDQ�p^gH^��n�5��kn9֛3x�0<�@�c����c�S�|ʬTXg�_�$�f7F�ǂv��r��Xؒ���qDlMW-a�Mi׳$G]a׳|��D����pp�<ϥD��͊��D��!�q���]+*�T���ʵ�`u7����%�]��0�8�����8� +�<��J�a����`MJs����Y�>Y7]j�|8Xp`��.'���]���. +��[������m��̺�J����&>� E�%i.��G�� F5a0e +�>@�\ҿ��X3����R�����ds����ְ.r fں>a� D�O�������M��y���%�p�Z�p�b��y�ĺ�M̈́�P<�}�E�xc�U80=�O���(w-���<Ռ�K�nf,h-�j��t��Bh!�pU���t����Y��� +S�.\f�.����S�/"���$�P�S��̰�S������O�cݫΓLLdzd��b�}r�?ܐ�@��C<1".m Xd���iO��R����9+ֳ0㬘d�4ZK1w0Y*q����<�#�����(�?��AE� �GU�+�5qE*�.�┈FUR� ta4/�4d�G����OR��"�J<�y���))�C��w�97��.�x.�N5* ŬX��7���@��V�qJ�w�5� L���ZA�J����e$洗�/�Ȕ��+��j7��J=�6��I*�]���z +B����&�k�0��Yy�P�,��1���d).���e7�C2 +�UKvX.9�W�^��^����#ʣ�08 J�4�PV� y���'�R��Mzj���9Ƥ���fQ&�.E +�bs����P�ͥ��-�����L[9�����{3E���������kMĬ�[�a��(7lN̻a�{ZD����0-~�LE83�N��7f�ĉ�J���ALD��zM���i�����V�%����� S�`.����� s�s� ڱ��*Va�ΙAYG+ߜF iP���#��H`(���n+{�bh�X�"�2*�i��+F����S�H� `���sU�&K�?Fi^�˱X�mF�4+�~+���t]x�@��K��6� 0��'f�p�i���I���B�T���T�39��TF�:��t�\n��{�Pĉ�r��h����m�12BW�6���Yr" 5K0F.#�h�@CO���'u���13�8n��W����XM�`OMxn��J;�<-���_��e|�D!U%�.$���>�����ncH`��O���4$�)��A��5 B�M����u����\u���4v��1<���gP}$+ݨn�q��h�t�5��<D/�fѴ���OI����>�plU�p h:��P`�4���O���ܥ�_��/�g�~c�x�����?����ssߥ%���U�ᢀ�M/����F(�P�7�|�;���f�a���詧�dV�N]��j�B�p�l6�=n�9�^�P���P�FbE;P1�}��W�o`���ŋ���̆�~'U���x��A��A����I^�p���]SF�b�$,wJ1���d�%R��<-D\nuM�"��e��kA�e�f�i'�tc���t+�-dž �P3�P�ww���_�K�ͬ�j��̼��yk��Z��[u�:���r�p{�^g�j�I��\�|���c*E]��ٶ��<�a���j-���T6��E�~U{V ��^��T]v�� +��K6��E����F�_�?�B�t! �t!���;�!n�]?��b]?�)�x����ֆ�ˍ�� ��A�퀘u��ؕ<ܻ�,�-Iޘ����)���,K5��(��T7����3 c�q4��CO8d'� 9~�qt�q4��o��4��� +���`<�me�on��w��`�������}����Tw��ƣ������x78�l���l�{4���`8<�f�;���������S�c�����Ͳd�0�y��*sV��4��T�U��f�+˵��(u�)���0�!���e���?Ʒ��sx���v<���kŬ}v�k��"������.���ku�&K{��5��ԇh��q]\������T<��:�n+HJ��S\� bTlu``�� ɿ�F��鏭@����eˎ���8���^yۨ�!!����&���/�2ӥ��g"}�F\��S>H�*�C���o!�|���ϩ �Aꒌ��Շ8ɣ��4����i�q�@%�?��>�0-F��W7�;v�*��n!��w��m=s!�#�4�X�C���:��?W��:[�-��Z��#�T���a�<o�i9K�;M�\���2��4����x6�'� �/��\�ž�D<}��:����9Ι�M`�)���( `$�V�a�]�)��F�8����W��ٮ����f������~�s���B��r�l՝H����F���6-�^����Z��b�J�ua��o"n�dژ& +Mե��؍6�B�f-M%|��Uoe���t��k�X^�k܈t]V� ���f5�E��F�L1�a��K��B����B�GyO���L]���a�U��%k�d�Ru��$ʕ�0U�X�ɬ�VU�'f�tڦ���hR����v6L�q��<�岼f�촯�G���G%�Z���<���Y!(ON�۵Hss֢�Ӽ���O��܌)b�}���y�2U�h +endstream +endobj +1178 0 obj +<< +/Type /Page +/Contents 1179 0 R +/Resources 1177 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1153 0 R +/Annots [ 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R ] +>> +endobj +1154 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.816 706.099 439.449 738.424] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1155 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.264 684.865 280.253 697.368] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1156 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 319.63 196.93 352.266] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1157 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 306.081 173.879 318.312] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1158 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 292.532 163.57 304.763] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1159 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 221.68 143.761 230.471] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1160 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.137 193.366 189.788 202.078] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +1161 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.349 193.366 265.106 202.078] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea2368e219ebbce4e1ede7209486283a6e) >> +>> +endobj +1162 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.137 183.902 198.157 192.613] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a150ba3a737fb75f56052c60d55246ae4) >> +>> +endobj +1163 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.717 183.902 294.396 192.613] +/A << /S /GoTo /D (group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) >> +>> +endobj +1164 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.137 174.437 189.788 183.149] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +1165 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.349 174.437 315.317 183.149] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea792b0fbeffceea19513cc0bd31ce7ef7) >> +>> +endobj +1166 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.137 164.973 198.157 173.684] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a150ba3a737fb75f56052c60d55246ae4) >> +>> +endobj +1167 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.717 164.973 294.396 173.684] +/A << /S /GoTo /D (group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) >> +>> +endobj +1168 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.137 155.508 189.788 164.22] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +1169 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.349 155.508 302.764 164.22] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea5f42ad42c6bb71627b5ce91d4c410985) >> +>> +endobj +1170 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.137 146.044 198.157 154.755] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a150ba3a737fb75f56052c60d55246ae4) >> +>> +endobj +1171 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.717 146.044 315.317 154.755] +/A << /S /GoTo /D (group__bsec__interface_ga216b6f4807227a2c6a183aaa9a8b8d7c) >> +>> +endobj +1172 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 117.571 143.761 126.362] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1173 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [53.898 108.433 156.314 116.897] +/A << /S /GoTo /D (group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) >> +>> +endobj +1174 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.796 98.642 290.212 107.217] +/A << /S /GoTo /D (group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) >> +>> +endobj +1175 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 70.328 131.208 79.039] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1180 0 obj +<< +/D [1178 0 R /XYZ -13.423 915.745 null] +>> +endobj +1181 0 obj +<< +/D [1178 0 R /XYZ 29.788 592.073 null] +>> +endobj +1177 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F89 511 0 R /F120 619 0 R /F97 510 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1233 0 obj +<< +/Length 2738 +/Filter /FlateDecode +>> +stream +x��[[o�6~ϯ�cT���>x&N�6qRۙi1-�Vb-l�#�sY���!u�|�F�b��э�x��E_��z�ΰ�ba��.,Ǐp[B ��$���� +=����Z�K@ABÔ_9BUߺL���"�~M�� +��"�tY�Q��H��)g."̱\I� T�jmxF%RR'��8��ﭕ���b���.��\s㲷d�U������ԲS�A�����Z + .�{T�\p�P%Lb88Âź�{t��t�_)t�kc�AH�"����]^) C���5z��B������ͬ�o�h:���+χ�* +7��s��YwTP�pa�Jc*5��?�5��?[�Z�Mӥn20ka �: F��Ж�T�59�V/־G��]:� ꒊ���X��j㽄����7[������$�!H A�d�q�,�a(�#� 9﮶K/�,�)O�������%f(Db��ț��S8 ��Co� W�M ��Pl�;߁�4I{o�b����T��TXlAū:�VR�HD��0�=ar�]M��1v|> f^��^������Z��e��E�JTN����N��LɌȂ9�1�1�O �4v�� ����L�2��Ǘr`�C(��`��_�L��uN�1�@I��_�&���M��e��N�(z�.� |3��� +�I��lK=�Z!G�Úp��b�ǘ`�c��\nj�fr�����0���:���^��q��O"N:�%qz��vO�X���k�O'8'ɴ��������D���o���H�e<�,Go�M�E�7��A�W��~�� +q������|�,R���%��ʞ�Wh�y�����@��� R���'?�l'�Ҙ�5���U#����!�B[cL �ê���:`z$uN'8�Ű_00���m�7��SH&�\�ߒ4�.\~>YlS�<�$k`���J)��D@!�̾W�KlW�`%�Y�x����v,n�aX��������P�1$�2�E�LJ���Ψ{̟�B�̟�ڮ�Ѝ� ��gQ�������c�1��������'�����dK�I���h�U�:\�K^��e����?����Aw�8�w��v��$B��,I�b-�e~M��X����4�y����O�;'d|��n�P�H��<�����vv������w���F6 Ap�j�-�!,�r��!���;@ ��5VN��a����� iP��dT-��O��� +�/���v��l��W'χ�M/��p�M2D����h���T�8�2m��|��:��8r�[���'/,'Ty��6�*I���):``�iP7�pq�,�-�10���Vu=���I�*����Ѳnj�a�?t�z��`o�׃N��Pt8���ťb��Z6�82Y������M�� +�y��v�j���������A�á�r�5�$>����7W�Qg��~�DSĩ�(��ȉ�;of�J�OV5�C�s�課w+f�'"�v=����)���Z��������d���I���H�ÐX�U����Z��HA��\f�Y������mW3��b�I�Iy\��o����,؝ek��&������+#`��_��k�P�$��W]���';��cKz�'�n�(��m1�Q���N�P�0��yH�+[Q�rs0�D�4�(�R�(^�gV�A����u�yh���m%;��|�jT�mWV��0t� ud�\8��<��E�xǃD$�����W�ܷ��)�I�zI�Xvrԭ?��νzm��e<���Kej�ر�fi\�+P\j��p��l>�u;��v����#�R��{X #��~�:aA- +�,Q�_;�����^��9 ������t�R_�T�4��|�ۮ�9�x�1�����|^op�՞]F7�.���8� X��� �"���^�Mu���$�!�]���O�!S������x�kΨ��� �d+�m�aL�(~lq��g}�A0$q���fz��;�_��;�{��{���I�J`Q�hu�����a�M7��R�y�s h�/m14ϥ��<�DK�C�H�'��Bt���3����&�wQ��B�Ґ���+1���O��ĹG�*�x�X�Y�����4�J��I�KUv��4e���K�>yYv�������m �'�Fb@��F�|�+g�Z������`�~�V[g��.&�ݿ �� f��t�lK����"/��y�9�K����M�cp^��^�\����<�.�aR�`�4�v�S/��+F� +�ۥ�J�/<���]J�G�a����#�]��k�}�v�����-VH��Iwۺ;7֖�9xh��B퓏^�(d�H�ls�I����0Uz�0Ov�]i��8��ecǦ�ܪ�,��=c��" +Q'�o��y���ϙὀ�ү��Rpj�``��+�m���I��F���:�+O���v�-�<m�=�������Z5��14�e�* Hi��4��$-����ti}ۨf=A�¨��.�e���?gS�&i����&��F�� �$�&S��+���N�b��!�2���^�M8��o +����,�~�hn�[~��E���/s�1'^� ������$�߯/'��1�̏�A4Y�Թ�e���qɭ�[��l;�nA̚���I��&����w&Q�u������쥋��J��>?W�ߓu�����²��m����P�MR�ƃ������6��LU��^!5' +endstream +endobj +1232 0 obj +<< +/Type /Page +/Contents 1233 0 R +/Resources 1231 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1153 0 R +/Annots [ 1176 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R ] +>> +endobj +1176 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [52.329 672.212 153.175 681.763] +/A << /S /GoTo /D (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) >> +>> +endobj +1215 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.758 592.64 560.39 605.143] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1216 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 537.399 385.769 549.903] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1217 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.267 507.271 397.899 519.775] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1218 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 477.143 385.769 489.647] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1219 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.987 447.288 410.619 459.792] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1220 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.772 417.161 543.405 429.664] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1221 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.242 387.033 525.23 399.536] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1222 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.242 356.905 525.23 369.408] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1223 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.162 301.664 479.15 314.167] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1224 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.242 271.536 525.23 284.04] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1225 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 201.034 439.125 213.537] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1226 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 173.935 476.696 185.855] +/A << /S /GoTo /D (group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) >> +>> +endobj +1227 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.242 143.807 525.23 156.311] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1234 0 obj +<< +/D [1232 0 R /XYZ -13.423 915.745 null] +>> +endobj +145 0 obj +<< +/D [1232 0 R /XYZ 29.788 737.428 null] +>> +endobj +642 0 obj +<< +/D [1232 0 R /XYZ 29.788 719.646 null] +>> +endobj +1235 0 obj +<< +/D [1232 0 R /XYZ 29.788 719.646 null] +>> +endobj +1236 0 obj +<< +/D [1232 0 R /XYZ 29.788 644.424 null] +>> +endobj +675 0 obj +<< +/D [1232 0 R /XYZ 237.212 612.282 null] +>> +endobj +716 0 obj +<< +/D [1232 0 R /XYZ 106.27 595.703 null] +>> +endobj +740 0 obj +<< +/D [1232 0 R /XYZ 110.503 554.012 null] +>> +endobj +742 0 obj +<< +/D [1232 0 R /XYZ 87.485 523.884 null] +>> +endobj +769 0 obj +<< +/D [1232 0 R /XYZ 43.848 493.756 null] +>> +endobj +771 0 obj +<< +/D [1232 0 R /XYZ 82.03 463.901 null] +>> +endobj +772 0 obj +<< +/D [1232 0 R /XYZ 36.164 420.224 null] +>> +endobj +798 0 obj +<< +/D [1232 0 R /XYZ 117.201 403.645 null] +>> +endobj +799 0 obj +<< +/D [1232 0 R /XYZ 109.903 373.518 null] +>> +endobj +800 0 obj +<< +/D [1232 0 R /XYZ 127.488 318.277 null] +>> +endobj +825 0 obj +<< +/D [1232 0 R /XYZ 102.627 288.149 null] +>> +endobj +826 0 obj +<< +/D [1232 0 R /XYZ 61.019 231.195 null] +>> +endobj +827 0 obj +<< +/D [1232 0 R /XYZ 73.139 160.42 null] +>> +endobj +849 0 obj +<< +/D [1232 0 R /XYZ 97.783 118.728 null] +>> +endobj +1231 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F29 648 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1240 0 obj +<< +/Length 3173 +/Filter /FlateDecode +>> +stream +x��[Ys�F~ׯ��\e�0ح�*��d&����]�łH�BB4i�ʏ�\�M��f�J6��LOO�7}�q1��ce�i�Zє�3��`x~�7��M�L��$W|[y>��V�� .ɔ�q�tnV[]d}��l&��@���r[a�Ϊ�ڞ9F�TW���D�����4$sP�uʈ��Yq�V�_��(P��Ř�~���*������a� K���1� VV".M#��83LqpT{�UL@JN�AI�4��2Vvh��&�N~:z���A)¦.���]\(1E&B�?+�D�0a&������^�|y�a��l7���^��2��l4/3#\&�Ԑ��h� +>��h T���U��:�@��2+�Q��u� ��� �Z+m���Mc�\GD�� f�a2���k� +�M^\G�ʎt,�Z�0�dQ>�S�@LK�p�#fPE��L����<��JIƙv���Ϊ"�����SQʡ����� 4tCGT蠡��3%�k|/Q�#SUhC�+|1Z���?����nr�0��w�:~�)� �: C`ܐ0Y������n��=�O7���� �����'H��]�~R_,7+���<R�E�p��������*�X���q�)U��������` �Q� "I�T���4b��S���0�ѮU��j����F{�}�0{��8��<�{��?̯n;7Tc`Di���(�E)l~Ѹ���adm��S�<E@���FB/5?`c��<uSK�p��������E�[Y����`�;; u�K�DѶ)�%x�^�����4�շ`�]���JF&�\6�@���X���"=w��X�Z$� ����<�!��F��?�� ��R#k)�Ly��O�2��j�AQ~ '��oSx*�Ah��Gc�>a��p�9ߏD<��`���a����I�Ẃ���ƫs���r<�)s�1�O�G��"��do�T���+��ɮ��4�\�U��.�<^5#����*?�_�ї��7���u9A%$�u�%4ff�����r�f�(9 G9J�,M�4�8�5���қ�7#�ձ�:W���eV7@��_|җFHN��D?�3:�\`x�0�~0�A0<��w��p4��}�����!�8����b:�ad���$~ј��� +�Ҹ��M�K�<��+���j4���C6 J�po����)�E#������4B5����R�S#�4��B���e�Ⱦ�ґ�|�U=~�u�r�f�qO1�����3⎨��0t����"��w�����j0��@� ��TdbXV}��g��tESGsSWP �+�' �\�,H�8y�vfP� :"@�$M��4���Dݎg����c��O���~^C�.�9^z������Ź�.!H�Q��;����DW��8أxU���cK���8����[�1 +!���)���C�R�/�:��u�J�V�����D 6���i�r�]yv5/�Z��%�ϪT4M�t�9a�H��|?_;yM��:C��QmzI\���}i�S� +���� ��U�� ���7L�Sp����ȵ�6�|��0�3�T'g�+/L���$��߉Zq�D�� }�0�q�|��=�v���/Ԏ��_�$�����uO1�5����B� �:#�[���t� �>39�������ޖ��G��U��G]G� �_�ߗ�D@��i�=&�5宗ބ�������8: �Jl����2W�x~X~�TZ�m��b��D���~9}_1И@X��C�i���h��x2{��ǣ�<I�S쓰����:��-���W�7���3��E�2f^�ͪ��UF��?�� +}�����^�ӑ�����Ґ�"<E��@G�Fh}܌/g��xr=��cK�$�*�4KԚ�8_�i��MUADi�P���S��V���V����~�-�K�|�@�`d�V��wfk:L\i�x�K�!_K��=e�� ��Ϳ�Qy؈��z�i�7�I�v��9r�RcA�A8���,I�/D�K#6�D�� +���a�5���IX�^�h*�-��������u<�i��e�X;��u@B���4bLɝ`�g��k�`�f�E�h�h�y����d2��j|5��)��aUdK���۾�m�IO�ꀲc;2�i�b��0[9np>�(���B�2pci�~^샻E�/�1x�������F��/��r�Y�=7��U�b`D���zޑ����yE^:�ס���Hn���g{��Z��> gF��[ H�j ��j����b>��8v�i|ws��I�U]d��I�įv6��7�v뱠�fʖ�í�k�T١� 7RGm�?�_y`�o�{���[k߆��x.�n���{�Z`:^�5 J��S֗F�f�}N������%�"����p���L6�n���9o��8����%�� Ւ�L�)ڗVd�O����T-m���5����^73�o�&�7��[�������x���$t�/V�K#��6�o�&Ϻ- +�0WZj��z�;O9�L�C]���9ζq���D8���X���h�������~��w���l`�$J���hx?m���G�R���#�����V���K+I�U��� �ޫԝI����A�/�O~��_�e����|._�cY��r���8�Խ��gB��[F�}�+�gy��N�̙���ۑnhj�ډ�8QM3�l?���0���X�WRJ���S�P[��P%@����#�X?���*y��e�M��S�8� +2UMW�Q�u$/0�|� +�_,l�+�f�r��Li��,�=I���D � I�e���0@3ٳP)-.�3��U�4V�d��Z������_�\m_&�"��e��c��ad��iI~�Ӛ�_���*�'ռ'��+= +��� u4�u�*��wfDse����o�N��䃁/ɟ�k�)^�=`X1�+cX^�*�~cX��?�����c�Ab�S9f���w��~ ���Z���I�xه����,��rOH��`��&n`����m<'��O_����V�2y�ʑ��i ��SThc%��*�W 㒵y���� +Z.aد����>�$"���W��%�*�d�p���0=Đ�,A��ˣGr�3pĩ�O����S�G +endstream +endobj +1239 0 obj +<< +/Type /Page +/Contents 1240 0 R +/Resources 1238 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1153 0 R +/Annots [ 1228 0 R 1229 0 R 1230 0 R ] +>> +endobj +1228 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 658.546 439.125 671.049] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1229 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 585.013 439.125 597.517] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1230 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.914 185.09 468.819 197.593] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1241 0 obj +<< +/D [1239 0 R /XYZ -13.423 915.745 null] +>> +endobj +850 0 obj +<< +/D [1239 0 R /XYZ 73.565 705.286 null] +>> +endobj +851 0 obj +<< +/D [1239 0 R /XYZ 83.274 675.158 null] +>> +endobj +880 0 obj +<< +/D [1239 0 R /XYZ 141.452 618.205 null] +>> +endobj +879 0 obj +<< +/D [1239 0 R /XYZ 69.91 601.626 null] +>> +endobj +1242 0 obj +<< +/D [1239 0 R /XYZ 37.461 571.498 null] +>> +endobj +1243 0 obj +<< +/D [1239 0 R /XYZ 168.103 541.371 null] +>> +endobj +881 0 obj +<< +/D [1239 0 R /XYZ 83.863 524.792 null] +>> +endobj +912 0 obj +<< +/D [1239 0 R /XYZ 82.052 483.1 null] +>> +endobj +913 0 obj +<< +/D [1239 0 R /XYZ 109.336 425.874 null] +>> +endobj +914 0 obj +<< +/D [1239 0 R /XYZ 153.561 395.746 null] +>> +endobj +915 0 obj +<< +/D [1239 0 R /XYZ 38.416 365.618 null] +>> +endobj +941 0 obj +<< +/D [1239 0 R /XYZ 83.241 335.491 null] +>> +endobj +942 0 obj +<< +/D [1239 0 R /XYZ 72.354 278.264 null] +>> +endobj +1244 0 obj +<< +/D [1239 0 R /XYZ 57.179 248.137 null] +>> +endobj +1245 0 obj +<< +/D [1239 0 R /XYZ 125.666 218.281 null] +>> +endobj +943 0 obj +<< +/D [1239 0 R /XYZ 79.598 201.703 null] +>> +endobj +952 0 obj +<< +/D [1239 0 R /XYZ 69.921 160.284 null] +>> +endobj +944 0 obj +<< +/D [1239 0 R /XYZ 61.456 130.156 null] +>> +endobj +739 0 obj +<< +/D [1239 0 R /XYZ 29.788 63.19 null] +>> +endobj +1238 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F29 648 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1268 0 obj +<< +/Length 2150 +/Filter /FlateDecode +>> +stream +x��YYo�8~����m ��K����$�;;xC��n-���'��oQ��:��/�M�G],~U$OfW�͋#͑�Ώ�(@��D p@��b��+t��h� P�B��O{"�:ixnx�������E���� +>���l�q�c�<�K����Ё>*q �pP�<Ʃ��'J�N�?�0sPӴ;՚�F����b��i������r�������\���.��V�B�J.1�� +ft�Tw��麙�a�dz!%c����qvt�8%a8ྏf��ؗ��Y�Y��'�"Z;ԗ��J�,/Ut|3���l�Q�pQ{�/�����o\C����R�����A��h��3J���̧\s��j�vu]�oӁS����}2:\����a�d�i8��X� +=ן� G�waC�d�!�!ǣ��V4� f�;�&��BE���c�D���}[��;��P���<��¢Y�rCN��ʎ;q�����Xr�&D��i���7�h���Bc��8��e��T�t]����+܆ԉi5� +�� �r'���yK�� +�~/T|�0�O�L��d���eX��ZAӨ�P�{[�o���=3�S�幓��pL +#A�,�U+U��X�>�ҿ�敱�>�j�E�WQYl����`��C檬�T�m�̔�B��:�Õ*�]�\���\ō��*�$��7���zV�t��a�n�ꮈ�d�5�>S��hz�"�����s$0�9UV�z����' +�MG �B�k}�z �=��V�a�e`s��N+��}w�3a?v���ܺ�����Y [��Ì �s���` �a`c(�����uI +B�u8�D�ۋ���g��Wg�����q4��a���"����Iq����rՅ?�u��K�Fu���ٯ_�L��2��c�`b@��%�P �)��W���$d��;� �����:�@) ��<:��߿\�^����o#G�]9>W�$N��x��n���o��kVnOq��>�])�Ƀu�E_�2����~�j�Ҹ�N��^�+�j�1�uz��U1�$V*Ի�Ơ�Ԩ�uu������d�v9r�5��ʋ6� B/��d�:��}�OC=VI��a0��[��"Q�x^'P<$yY�J����|��5 N�W!�kih�.���.>$�>ۃڪ�ḣ6��cv������lo�yQ\}�n)�C�֊�s��1!l��fI7��Pt�ޔP��$R��]o����|I�g�p�R�0�?�e�T{ST!�@ F��9�ZY�lo־=�3C�xĮG�'¨݉�f�Ξt�HwF��Y(+�d�R�o�b/�`�9� ��;���6�a�UY̝�ʇpY�>ͰC��-38�m��W*-G���bZоk�褚U*���p�U��()06�K��I�Uy����~���V� ��������xMx�=F��"����cWD �?���SH�/��oW���M$i��'�yX��*�������}[�n:{s��Iv�V�ӹ�b�Mk�=��#��ǿ�}ڑPE�k�ؤq-�,����!h{���A�WE��f怡�>C��x7 ��~�X�naD�h-.��'w�������I��$��aF�����sK�Ֆk�Wݠ�8�]ҹ)���,N��FԬ<�<mt�?h4���:9 ��t��TT��e�4>��b�3)Ye�YY/���x�E� ��ju���ǎO ��ٱ��6�s���·��+�ƭ(��i�]�ߊ�=���!*� +���t<���m�����c��vJ+4�Z��pW�a.ΨK�� �D����7�C�d����S�<�����N>G�����? J#]���|,���i�� [�Б3�u���,=���o�l������Z5��cZ��>.:�C4��SĎ��z�B/�jˉ��4�_v�t6�d��!��l�7F�,m�mZe���R��Xq6�E��~�!� ���`�yZ�O>9_�}6ڷ�u;�˥i�!̔��[z�âl���y��uHӟa�hH�I�ΊpYO _\/�����6�j�g��&9Qq����� )�]ՙl p ��O���h��.��C�7�1\��Iԍ��甸�4I.H�ysCc�����H��+1�k-�s2�:���2 +endstream +endobj +1267 0 obj +<< +/Type /Page +/Contents 1268 0 R +/Resources 1266 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1153 0 R +/Annots [ 1237 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1261 0 R 1262 0 R ] +>> +endobj +1237 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [52.329 699.813 157.883 709.364] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1246 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.296 662.753 237.803 675.256] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1247 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.827 662.753 530.494 675.256] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +1248 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.551 649.204 428.54 661.707] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1249 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 609.879 196.93 642.515] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1250 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 596.33 119.322 608.561] +/A << /S /GoTo /D (structbsec__input__t) >> +>> +endobj +1261 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.492 393.102 423.586 425.738] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1262 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.492 216.83 423.586 249.466] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1269 0 obj +<< +/D [1267 0 R /XYZ -13.423 915.745 null] +>> +endobj +1270 0 obj +<< +/D [1267 0 R /XYZ 29.788 737.428 null] +>> +endobj +1271 0 obj +<< +/D [1267 0 R /XYZ 29.788 582.382 null] +>> +endobj +1272 0 obj +<< +/D [1267 0 R /XYZ 139.844 550.241 null] +>> +endobj +1030 0 obj +<< +/D [1267 0 R /XYZ 147.131 533.662 null] +>> +endobj +741 0 obj +<< +/D [1267 0 R /XYZ 117.426 370.939 null] +>> +endobj +1027 0 obj +<< +/D [1267 0 R /XYZ 121.048 194.667 null] +>> +endobj +1266 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1311 0 obj +<< +/Length 2413 +/Filter /FlateDecode +>> +stream +x��Y[o�:~ϯУTI���'qsr�M���}H�@�G[YrtIN���wx��VZ7]`���Er8�of����gb��l�,l������`��X>��c�*b������#��� ���)ry0�ud�l�"��&����X@�h=`�QΆ�ƞ�s<D��|�8���`І9�����uF�[�5J���9�j�vg(���G�k�:́�qf,ƘX������#�R�� +g~��P��q�P�&��0w���pDV�#Y�-�C��-80�;"�+�/�>�S��ŽE�����ދ�u39����Ц�?��Y�U~[�y0[t�!�K���t��7߰���?-J�ֳ\�ˁ�J�yW�P�}X�x��k |�[������]2�"ꑁ�ى��<��UVI��gu���@����bM��L�*��������X�ː���YV�c`+/z��tl�C\�l�b'�s�E��a���I#�ܧ���k4��0D|�0��[� +�L��a���&�=��|���c6]�/��NfێK}��wqB����.'��2����lSWjx���e��D�?ġ����bNz+:��'��/B�����Ni*�߫��M�)Lk=LJ�,뻪�*^j6�|����y�`~�ww�:gw���}�<��.��f=W�n�QUފVW��O��^�c糋��4���%�p1�.f����DZ<xX�R$��D�b��*�Y�!�=��V�L]�D��<q���'H�rҗc��K߄gqI4�2��+��\=��>�b�N��z_������-��\�b����2�n����������4 + n!���H� >}����D4�E�uQ8CP���@��,�a@�a���������t>�x~1�]\MO�9�z�~S0�yCW�\��zs>i`����]s�R;4�����q�D���#^|��s��k^v����q�`�-�2�Kc �wa�I��G�@��q�k +�ݶz\��ڜIz3��8�ztl�n[� �}����#o��ipP^�z UeE��bp�9�9���� �9�@(��_q�X�,�\FCb��~Y����������x��k*Ѧ���ȯ�c} +�w��J�3.@Q}�0�#P@F�u)�~�L��&��i�o*��4������Z �r;��{��J)��.��|S7l%�/3�����+�p�Z)�5���eU�QU� +2J��D��B���,M�d?4�l�"\�U�-Zďu\B�5� /���2P2כ%��*�2*��X����]��h� �3 ���P`�P��Ba�\���� ��|Mn�a�k��ݘ�r�7!�I����P�����1Yy�wQ>4�A�$�=��v��[���f���wp A�V�qp�-�ä�!p��E9&�S��%�`� ��&i{���v�4qS�sb�ȺJ�L�3��$��4k?�����!�Vq�{�p}�4)}�˓Ҵ�UܶewZ��O3��? +_J�o�.�j��F�l�ZhZEaa�`�05� q�N�(G��NQU��[U�N�2ԾQ����S�jI7y +��_��F=��$[ilt�|7��t�I��6Ƭ�����`�����9un�n5���^C�������e#�k�����l V���bwi(@��JR�����;���X����& ��ݮ#���\J>#~q��Do��I]/���L }_y�-w`��D �R�����Iz�_ DA�S)��2� ��5aӽ(�a�tt�ضߦȣ�,����HQn�r���C!�0�.AQ� ^ZÀ�5G���"�Є��_��Q���j�q��Pn�/@��<[}�낫<o�u�Qڸ�w���$��S�oI�� +��Hp��L��9��y����ծ[ܷ\Hw��t�w[���/Q�zf����$T8d�x��iX�j +��@jP?��������3�]^�Y^�>[��[Q<ͣZ��ZP�������QI~!�h�<cw��my;nO/0�m��B������v���C�����A[�!�����:�����aL%�ܙ�(Nñ��j�I`cצ� ����o�w�]%�EDՅ��u0��=�@�=M���D)N ��_���1��"=��{0k6]b�Y���Zh�����}�B4l�Kٚou�(W��W+�W��q��~M��I�� �x~�Y�Mz�^��A��ؽ5�C]{���f�_fuW��_��av���[D|L�}�0�|���lr���CM߆$� �L�T�+�Ճ(R�X��;��t��'Va����f/��2�<T�������I�k3���!�.��6� ߉�l����H��Ξ�T`�&��6�q��QX�4�q{]f��p�I�o{�-��j�@�� +Qs�6C)�z��)�� ���1��a��_��� +endstream +endobj +1310 0 obj +<< +/Type /Page +/Contents 1311 0 R +/Resources 1309 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1153 0 R +/Annots [ 1263 0 R 1264 0 R 1314 0 R 1265 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R ] +>> +endobj +1263 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.809 675.124 447.794 687.044] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +1264 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.809 661.575 560.743 673.495] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +1314 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.809 648.026 378.685 659.946] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +1265 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.492 592.867 423.586 625.503] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1273 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [52.329 443.666 153.175 452.276] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1274 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.593 405.665 242.91 418.168] +/A << /S /GoTo /D (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) >> +>> +endobj +1275 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.395 405.665 531.061 418.168] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +1276 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.551 392.116 428.54 404.619] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1277 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 352.791 196.93 385.427] +/A << /S /GoTo /D (structbsec__sensor__configuration__t) >> +>> +endobj +1278 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 339.242 125.999 351.473] +/A << /S /GoTo /D (structbsec__output__t) >> +>> +endobj +1312 0 obj +<< +/D [1310 0 R /XYZ -13.423 915.745 null] +>> +endobj +1313 0 obj +<< +/D [1310 0 R /XYZ 124.091 705.286 null] +>> +endobj +1315 0 obj +<< +/D [1310 0 R /XYZ 36.164 570.705 null] +>> +endobj +770 0 obj +<< +/D [1310 0 R /XYZ 29.788 508.809 null] +>> +endobj +1316 0 obj +<< +/D [1310 0 R /XYZ 29.788 490.267 null] +>> +endobj +1317 0 obj +<< +/D [1310 0 R /XYZ 29.788 325.294 null] +>> +endobj +586 0 obj +<< +/D [1310 0 R /XYZ 183.266 293.153 null] +>> +endobj +1309 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F33 531 0 R /F30 532 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1321 0 obj +<< +/Length 2273 +/Filter /FlateDecode +>> +stream +x��Z[o�H~ϯ�e$��T��eޜě�h:I;dF��("��Y����^͏�ST����n�Ү䄂�:u.߹Ź7�#�";��������_� 6�+�K��p�l.�44>�}j >*HH2�i�"K�����5wkCN��m� �#X�1�������%9�lD�e�A�PIT2hBu��H�aY�SI�w#6z�~9C3�&iךѝ�Ń��W ����q1��2K�A��kb)uaL ��Q�v�����0Q䠅S��=��c����t�����"�%�_xg���P�\nۆ�٠.�ǰ]eoon<�.�,X�3����8K�<�=y��M��0����NI�� s�����Tj|-���p��+�.b��2� +���'�ja�uͮ�d �B�&{B�O.��8��GI�\o�yXt*�z��k�)/ך?P���'�3L�#�v��x���$m���qib!���*f�S�X01&����?IÕ40�g���)��IT�i�p�8�c��pw�}����{o�M/���Om�R�F.��M8a��Y���8�U8Wp��y����旭���o�y������6�U)��&\8��>��4;D]�m�("��c2Z2��~yK�'������x��^J��y �-�e���|�����f�~�7��ܵ�e99f��|(��� 5�-P��l�8�m�_�&c���o���g��Uf�s���~�&��A��z�9 ���6 �g� 0����d"?�0$����:�Xp(kc`6��ٛ|������l�o����Xd��ɏ��2 +��з��pVO�-b�-?�z$3uw��h�=!���j�r��°���������ͣ4��7u���d6r��E?��8���Q��|u�A*&4�a���bBK��%U�$��(�����$ywf@�d�R Fs,�z��VDխ�n�(H�,3��O��6��i�E��|�4�Z���}����Q�P��X���QP�݄A+�@�����m-�4`�5ȋ��(���K"W���-� ��XPҐn7��M����pNJ78�K�,;�w>��ɸ؛P9\ \�5��e�E���w�!\���6 ��%�8�H���"����h��D8H�%��WS�~4�+�r��X�%��,\A�xաy�]Gs��`\ z4�_)�b�I��'mTLA�.��4g�tp�ALؘ�tt� *=�>���Oߑh\�2�����x�OGs-��Sr�����N�+H +̥��P2�0h�#�&�E�u��##�\� +\»�����?�� %�l\�ّ�t�\�ɩI*�r?.!R�L����]�K"����r�����/��w^�J����oλwSz�X`�^Oټ��u�e�H��˰Т[��vmْϪt� 4[�d+{�7y�| ��h��M4y��*���k�f>Mx���l��$A谷Ci.�md�#[`D`L�/�1K�8W!�� /��N�9���7�[ÇC��,U8��������������$�ЏK����(�s����(��Xq��}��]܅�p ��s�j��0�I��҅�����<���8ʖ:���}����I���ɆlC\��<L⸛�!݄ + -2�����@��:ެ�n�����Mx)���L���،�:�F�m���<�c��O +^�+���u�ܤ"w�)N�^В��O*�v�8�E`�Rv<�u� 9M�ژ�D������d������%v��J������:��s_ugۗA9�ndm#���m1���d��I^�yI�oE�* �����]��)`Ȧ<�{'��T%�Y;�4��Ms|��c���f̄`a�������40�9�|P�Z���!�FWG�'��~����)���+�o�X`�b������4^@��Tc�r� .��c�g�ѻ�Y�{����D)�8����;��e�km�nƙ��k�M6k���rX��5�����ޟ�$����R��B��C���#��=R������1�V+1\qX�FD��Ѥ��!j�Q��؍1�+��"J�J�Q�ب�25^�`:Xq�o������gp�G���Cb�� |4^�Գ�.y��: +���v �,);~:/҉���o��<�6I�ޫ3�_�U�E�Џ�p�&�۩A�7��=�H�i�����U2!�cB��k��Ug�*˔]%��:)-��٬�����\��(�o%e1�n´<TW�i��i�*R^|1E8di�9�� +�?�ӵH +endstream +endobj +1320 0 obj +<< +/Type /Page +/Contents 1321 0 R +/Resources 1319 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1326 0 R +>> +endobj +1322 0 obj +<< +/D [1320 0 R /XYZ -13.423 915.745 null] +>> +endobj +1323 0 obj +<< +/D [1320 0 R /XYZ 138.408 705.559 null] +>> +endobj +1324 0 obj +<< +/D [1320 0 R /XYZ 104.459 688.98 null] +>> +endobj +1325 0 obj +<< +/D [1320 0 R /XYZ 52.936 672.402 null] +>> +endobj +583 0 obj +<< +/D [1320 0 R /XYZ 88.117 655.823 null] +>> +endobj +582 0 obj +<< +/D [1320 0 R /XYZ 110.536 548.651 null] +>> +endobj +584 0 obj +<< +/D [1320 0 R /XYZ 117.823 518.523 null] +>> +endobj +585 0 obj +<< +/D [1320 0 R /XYZ 147.506 422.914 null] +>> +endobj +589 0 obj +<< +/D [1320 0 R /XYZ 72.332 352.651 null] +>> +endobj +590 0 obj +<< +/D [1320 0 R /XYZ 112.357 295.938 null] +>> +endobj +1319 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1329 0 obj +<< +/Length 2047 +/Filter /FlateDecode +>> +stream +x��YKo�6��W�(ͧzp���I�=$�B^ѻ*�������P����cׇ�I���<>�����%E�∠5"��>��;�$C�CJQ ��D;�n�>��,5��2ɰ'���f�n/��2�ח!E��H�̤s:�6��1���%e��Ѕ9�0��A��`��(C�~?p�y��5�N�z��b�ѻD=,��jR�m��{��e�EC!�"�'��w)+j�A�Hnt��tO��-�m��ي��瘆�^�fqt�@I9���-b!�������"F_�7y������ʊ|W���ůG�EO*d�p?������A1L������t��A�R4��9�2�Z�3 ���X�ѡ���)��0��H�����"+�z�I����*�U��s�t������9�� K�p�ap�z�~h�e�V�X�n ��ƍw��}O�M�à5���\B���#��q(�c<bx��h]ޙ�����Dbx�Ǘ����|�q��j���l�|���%|�-��O�s�@��|����:,�,�A,�Q��H��q ��ń�D:�H��w��6�:[\_����-�ײ p���(���oTT��*���DT��� +���N��/1���)e�p�B��g��p���[�I5��Q�kr��ۓ�AV�����.��YSʝ�w�**�#6_7�9o>̼����MRG;�&��ܨ������,y�X��XS&�WBx����oM[�|�H���vУ�B-N�hz�2�1���B:�f�B���˓l��+wy\�QkkXI{I���Ʈ,L+P6n6��6�4�kG�Aw��jJ�(�aRTww��>O�h��0r"�f���1/���:hP�B]By��g� F�<��V?i�1H.f8��D��Oa��������*���a����*�v�Q�p�͆�*�� +�Ȳ��>J+� +b�7t�ơ�$]��'��I��1��M������O�Wog��/ ��@mlA�w�����Bw��v +�R#���>i�Wq�V�Vy58}8\{.�1����*-a���8mb,78�(]Ui煨h�@���O#����9}�C�B�q.���_!���)ü�v��`-�kXRF�k<��h�,z4�NdX +�I��;��e�1�7ʰ:����+�t~~�G�z��{����f��*[i��c���zQ/���t��W�m��}�LJ0��D/��ցs��@u �R�AjGp7�j{�~�{x�}� ~�S��{u���|S�NԎ#���JX��@|��f�B8Ѡ�qG5�Շ �{�}~�����0[^�v9�Z��:�IU��گ�^ ���ц���q�Iq�{[���Q[_><[^��6���T���Yn�+�q���a�2���^%PYk��%8q.n͔�~h��fN�� +l(� ��{�ڄc��qȜq���`�%_�i��D[r���� +����ؤ'q��Knl{�i�×�9��.>24l��<1~u�J�s���F�Rk�ylj���#�y���v��!��?�aλ���tQ���V��(sӮ6Q�}-<�<$� +g3��e]�i����U����T����g����XB3Pt{�An��}$$p�z�1��!����l5����B��Q�w��;%�=H�P`��`�t��%LJ �z�Z^0��ǖ����%��Qe�<Y@��R_�)�����wtt`:��Q�{ �����2�k�5_�x��i����Б;�uG���*Mސ��S�n�<=^?d�Ѫ�F�y�[�*Mq�&A�>K-����W[�2��;q +R �����o��,�%���>�����'�n�M�̘���\��̄(a��K����M�a�M>�s����LhlC&�T8g��]����bݷQ�D'q���E�L���y�ПQ��a'�]^Di� t�_wi������!}�O*�P�(���-�(w�M�[����P:�6J�ݿG&�'u_ǹ�;R2i���0H���D�-H�Hi�1��Ae��%�����:��x!�O�� �[ +endstream +endobj +1328 0 obj +<< +/Type /Page +/Contents 1329 0 R +/Resources 1327 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1326 0 R +/Annots [ 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1331 0 R 1303 0 R ] +>> +endobj +1299 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.093 564.094 485.412 576.597] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650aaf8083737123a5c4d012783ee10a522d) >> +>> +endobj +1300 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.496 462.581 443.488 473.312] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +1301 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.496 436.17 437.761 445.58] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650aaf8083737123a5c4d012783ee10a522d) >> +>> +endobj +1302 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.234 413.654 560.743 424.494] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +1331 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.496 400.105 432.034 409.516] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +1303 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.496 385.869 443.488 396.599] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +1330 0 obj +<< +/D [1328 0 R /XYZ -13.423 915.745 null] +>> +endobj +587 0 obj +<< +/D [1328 0 R /XYZ 36.261 705.286 null] +>> +endobj +1327 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F33 531 0 R /F30 532 0 R /F89 511 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1337 0 obj +<< +/Length 2076 +/Filter /FlateDecode +>> +stream +x��Y�o�8�����aX1|�qߜ�M��IZ��n�-�f�ْ�G�����(ʒl'�88H+Z$�3�'u2~�h��@]�D�� �$�J�/��D�BwG���,5��6ɰ+��{��,��6��'},�f��Iѥ��i� �a�]��K�4Q͠s�ǁ�����r�4��P���v�9�@M�nK��'�+��`u?�ϋ�O,��%)v}�˨��,�x�J�aܡ�D�!#"��u3�#�xN�͖�!_,80�s�i����㣓w`���@x�!`�����s��w�d��c�y~o��,Is5;�:��h0nC�,-��Щ���J�&A���c�t��-Ѩ)�J�r�I0 ,�O0��75��%�.f�1�.�\-�0��ؼ�(��*z�=�}���~\T�� +�%�v�b�s�{^`��J[I�b��c�u�犮�y��*��ŜK%�O�����=E� F�]�5��Jy�Y �G$f��A|rs;�p;��ף�����?���\}�������;Α���t���x:,�$�A�U����Dzv�ct ���@�C���O��^]�_�?m{�<X����/�և�]c��*��h���0�j^M�h�?̯�?}���7TK��Q�`�m�¬H-�i���j��Č�#C�l��w���~�)Q��^�x�̺��<��d_�$Z:�V'V���E���D���<k�s(�#�7vb�Q��!��Ȭ���Z�\l��ղ�4Y5y���\�J �.<|<�#�Ƿ�����d�&���]�����;�ј$¦%��pp�����v�o�l�ưo��u��Nb��c9�� +�����2�e��ߍ]�jS������#L�S*#.�-ߚ����O�V�|��*�o��1��_A��+Ǫ\�1Z.+߯H�/�q5+F���d��d4�e`� ���[�wbye\�]��UI���t��d�5+k�i���Ci��܇���O�BAn@zo�u���m��p���T���L�bg�2�>X��L�pi�kZ,��T��"�3����`�=�i�Ȼ.��{FS�����>ܠvl�����g��q�b��o�L�{��3��S�l�ƕM���!l �a�eV��!\����0�� +��/P��?�F^NÆC�\�(p$k4��.���3P7�tʽs���lg�5�6H�D�C;4�`j(��s��}������Y��*u����� .�2��6WwQPI&�,gu��e�D��B��_%�b5Uiی��?�hf�)j�j��뱲�.��lS=g������l[���2���;���M��Θd�4���Z'-����#��ׂ�u�ހc�?MN�9��.��B�4k�� ���{�*V����M�a}~�#W٦װ`���$�0���dZ�*(��F��Zx*��4$�- +s�q8<��h��-�����<�?&��u�Ct���f����w��7��K�������xL�U+��{H;����,ڏ�np���;��\/�Ro��N�W�]%s�?��&yL�V���?����Kc��I� ���}x��݇��*�+����t4q��횦�x�̊�!Ղ2�@�1 +�����9���i�t:�%�ӿ&�/��@�ˠo�ε9��i���D�= +���n�v��h�*�$�%�ѳ%�F����H_���%���=M�qDFh�<� K����cN=��̽�7t�g�{�QY8IД�@��S��fQ�s���Ƣj8CGNg��lv��r���ߵ����Nw����kш�cT�Vr��/��$��e�A���_s<[��i�>�S�J�A����k��TK���-�k�[k����!F�Z�11j�r*{q6�����JA�7����\��]���̈́�m���^__��wi�����帊B?�'],f��X��\����0�aHϣl�d������2�r{ۣ_�j�&�bV��{j�@�Z�$�4��=af� $Bi+�<*{id{"�)ꔠ�8�L�z���xۺڊ�y��4p���6���l��i����)X�*����*��a +endstream +endobj +1336 0 obj +<< +/Type /Page +/Contents 1337 0 R +/Resources 1335 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1326 0 R +/Annots [ 1304 0 R 1305 0 R 1306 0 R 1339 0 R 1307 0 R 1308 0 R 1340 0 R 1332 0 R 1333 0 R 1334 0 R ] +>> +endobj +1304 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.689 661.575 503.968 674.078] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a381b968290256e77d50c4f7e92bfb27c) >> +>> +endobj +1305 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.98 648.026 523.965 659.946] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +1306 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.98 634.477 560.743 646.396] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +1339 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.136 620.927 469.998 632.847] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) >> +>> +endobj +1307 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [405.136 577.643 557.456 609.969] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650aaf8083737123a5c4d012783ee10a522d) >> +>> +endobj +1308 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.82 536.996 560.743 548.915] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea1c0eee38a61b05c5239c871f9cdc85a4) >> +>> +endobj +1340 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.82 523.446 434.849 535.366] +/A << /S /GoTo /D (group__bsec__interface_gga832388c889417ed197609d9965625bfea1c0eee38a61b05c5239c871f9cdc85a4) >> +>> +endobj +1332 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.671 325.771 497.66 338.274] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1333 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.318 237.223 413.365 249.726] +/A << /S /GoTo /D (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) >> +>> +endobj +1334 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.318 148.675 374.562 161.178] +/A << /S /GoTo /D (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) >> +>> +endobj +1338 0 obj +<< +/D [1336 0 R /XYZ -13.423 915.745 null] +>> +endobj +588 0 obj +<< +/D [1336 0 R /XYZ 36.261 705.286 null] +>> +endobj +1341 0 obj +<< +/D [1336 0 R /XYZ 88.706 488.007 null] +>> +endobj +1342 0 obj +<< +/D [1336 0 R /XYZ 97.794 471.429 null] +>> +endobj +149 0 obj +<< +/D [1336 0 R /XYZ 29.788 424.97 null] +>> +endobj +674 0 obj +<< +/D [1336 0 R /XYZ 29.788 395.975 null] +>> +endobj +1343 0 obj +<< +/D [1336 0 R /XYZ 29.788 395.975 null] +>> +endobj +1049 0 obj +<< +/D [1336 0 R /XYZ 499.696 328.834 null] +>> +endobj +1344 0 obj +<< +/D [1336 0 R /XYZ 29.788 305.467 null] +>> +endobj +1068 0 obj +<< +/D [1336 0 R /XYZ 415.402 240.286 null] +>> +endobj +1345 0 obj +<< +/D [1336 0 R /XYZ 29.788 216.919 null] +>> +endobj +1346 0 obj +<< +/D [1336 0 R /XYZ 376.598 151.738 null] +>> +endobj +1347 0 obj +<< +/D [1336 0 R /XYZ 29.788 128.371 null] +>> +endobj +1348 0 obj +<< +/D [1336 0 R /XYZ 238.806 63.19 null] +>> +endobj +1335 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F33 531 0 R /F30 532 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1359 0 obj +<< +/Length 1535 +/Filter /FlateDecode +>> +stream +x��X�n�8}�W��^%jї�q�M����0����%ג�-Џߡ(Y��� �pBR$�r8��x:��h� �#���@�O�� �K�S��`�m4���f�1�`i`��$î�����5�(2��O*,|��UG�̤�"�++8�=L��<E��̀�c +�����P���~`N8��F���(>_�8:KA���Vc�ZN����U���5!�X +�{��w(+j�F$����=��C��S��{�� ��S�5�O���@Jʱ/<M���|��i��O�,\9�SÉN�t�������`4m(C�,�)l����E��0*C��Е2p�D���3*���@ ,@N�������@���G;JLF/�I�� ���~8�Ƒ.z,�� �@�'�!A2`�����q)���F4�)X9@�B������h<{{3���NZ���� �{�+$x6 ���#�wq���^��� �O ��_-�a�,!���[���J��r���y�̶"��I'k�.�����M� p+M[� [X�gW/�ܜ��~�]�������6�?@����j�/���b�C�:���E\m��d�lt5>\n#U� +O�� �� ��o_�&���Ƀ�$�Y��S[���l��r�1ὀz���Z,J��(��R:���#��Ol��~��_njp�q)�4M.&ӷ㖎0ʡƭ�\�PI�����Ҭ7i��ly`]��y�&Y$����r�̃��Y*�a�`S5Hf� ~��5ѥӃe�� G�Ds�x^���t8�]�Y���j6�{�&fU`�cϥM�������8����c���t��J�C7�Dt�U�\��J���wsm�]�Q��H&��d�I2��dװ�'7��Ӑl�����W͟M���m7�!$��k$���e����h|2} ��M�Ts},���O��M)�G�'b[�Wk ��ߒp0��vQ�/=��=i�we@�G<H'H��aV�f.�(6���.(�u����泹z����� � +���l{��s��S[�� �kS���8_���v$i��b|��gi�]�Pd9�@�鑔C��r�*�422�HƜ�+B�c�I9f2&�����5+|���F�MF%��d����G��J?k��mR��L���Q��K��`-#�w�Q������W�C�ϩgBs��왆��c���9r��t�(�-G��[Ղ�>W���l*�!8�^�3�i�2ëa����N�����o�/�j��cR�{����1���-G��f=\���n%ȑ8���S���M�rH������٭1�]�^�j�Sz�/A�QN��&L�(~�B�F�a�s�x����n_��m�Ó��~���Ʉ�z��AS�����`�A��BGq�N�`YL�����2��"x��6��h�>���k2@��"�ķ���ڊ`'��m�8]�=i������z! ��e����3.N�� XV7��<��-k���[��d�x�KQ^��ۚ����7� +endstream +endobj +1358 0 obj +<< +/Type /Page +/Contents 1359 0 R +/Resources 1357 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1326 0 R +/Annots [ 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R ] +>> +endobj +1349 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.347 523.174 289.901 532.349] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650ad30626f0de1be98802cb5e50c8b67207) >> +>> +endobj +1350 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 462.152 160.548 494.788] +/A << /S /GoTo /D (structbsec__bme__settings__t) >> +>> +endobj +1351 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.884 390.998 299.316 400.172] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a381b968290256e77d50c4f7e92bfb27c) >> +>> +endobj +1352 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 329.975 160.548 362.611] +/A << /S /GoTo /D (structbsec__bme__settings__t) >> +>> +endobj +1353 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.884 258.821 299.316 267.995] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a9202c1504b464b16f432da6a4dd582a2) >> +>> +endobj +1354 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 197.798 160.548 230.435] +/A << /S /GoTo /D (structbsec__bme__settings__t) >> +>> +endobj +1355 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.006 126.644 327.56 135.819] +/A << /S /GoTo /D (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) >> +>> +endobj +1356 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 65.622 160.548 98.258] +/A << /S /GoTo /D (structbsec__bme__settings__t) >> +>> +endobj +1360 0 obj +<< +/D [1358 0 R /XYZ -13.423 915.745 null] +>> +endobj +1361 0 obj +<< +/D [1358 0 R /XYZ 29.788 737.428 null] +>> +endobj +1362 0 obj +<< +/D [1358 0 R /XYZ 235.359 681.917 null] +>> +endobj +1363 0 obj +<< +/D [1358 0 R /XYZ 29.788 658.795 null] +>> +endobj +1364 0 obj +<< +/D [1358 0 R /XYZ 334.184 593.965 null] +>> +endobj +1365 0 obj +<< +/D [1358 0 R /XYZ 29.788 570.842 null] +>> +endobj +1367 0 obj +<< +/D [1358 0 R /XYZ 29.788 459.721 null] +>> +endobj +1368 0 obj +<< +/D [1358 0 R /XYZ 29.788 438.666 null] +>> +endobj +1369 0 obj +<< +/D [1358 0 R /XYZ 29.788 327.544 null] +>> +endobj +1370 0 obj +<< +/D [1358 0 R /XYZ 29.788 306.489 null] +>> +endobj +1371 0 obj +<< +/D [1358 0 R /XYZ 29.788 195.367 null] +>> +endobj +1372 0 obj +<< +/D [1358 0 R /XYZ 29.788 174.312 null] +>> +endobj +1182 0 obj +<< +/D [1358 0 R /XYZ 29.788 63.19 null] +>> +endobj +1357 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F158 1366 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1375 0 obj +<< +/Length 1310 +/Filter /FlateDecode +>> +stream +xڵW]s�6}�Wh�/0S}�r��¦� i��!��8�w���#����d�B�l�D�tut�ѱ�e��]S��{mA�=x@�o0B��%�)EJ0� ����>��x(Xj��e�aW��U�z��^�e��'>E�m�̤�"�jk8�=L��<E��L�j�c +�J;��i�?Q�N�~�aN8�i�V׀�0Ë-G�\=���a� +˩��J�²t��P��lT{�ʀ%B-��6�}�D��X�KZ�|~u���S������G%��������S +y�=������|�0p����0�ӬW���O�ɢ�(�S>p�4��W��0� ��'c����G1��c��Q���{L�4��?AVtjjv~,*]�<� b>�`c�H�p�E�&v༌֡ �zz���<�<��X(��b_{�]�b���ӁZ1�.����d9-&���|tv9x9�HA�����p���������( ���@4�_�$��\br}������W������]Z�ͪ���6��:ʃ�8\ۧܨ��!C� w���\^�!��P:�o�"�� +�9���\�Oaf�Ӵ���1�O0s���rC����M\d�;u�v��D-����f6�N��?����tt��WM���[�I})�ɮ,,�A\V�y��i�f�fS�Tl�7�n� /�m�T`� s��a�y��+��m������h:y�[@v4�9�Y��0K�����\U�&��s�c�}��{��ώ��?������P���o��G_�Y�t���,���Q���i��nX���˻�B�~�j���!H6����ST<�ee��E� +-��8NW�Յ1(�wa������X�4�M'�"N+�:&�:�+B����j +3���:V+�h�=�#��Bp�$��iW��V�A!�T�<��n�s/aIghQ q���c�[#"F���a�MR����8��C��̵u)�X�N�+ L���P��2�[�D�� +N�n[FUw�zNg��,vZ��ym��3t������C��㘛ؚ�**��0Q���������-�9V��8��?"<ծ��j�l*���hn��F��Ml4M00c? j[9�^��`���2�����\�*zx�����vBk�eKE�vR�C�W���d�8O�M���dc�仅�Zp��Al���vq�p��k���!HX����� �ݕ�5An/�~�o��0�.~0:(:��*m��M�k*��.���V�ܧY�|]j�|��¬�^�6��M��I2a~�S�.��K���c�� +endstream +endobj +1374 0 obj +<< +/Type /Page +/Contents 1375 0 R +/Resources 1373 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1326 0 R +>> +endobj +1376 0 obj +<< +/D [1374 0 R /XYZ -13.423 915.745 null] +>> +endobj +1377 0 obj +<< +/D [1374 0 R /XYZ 29.788 737.428 null] +>> +endobj +630 0 obj +<< +/D [1374 0 R /XYZ 192.29 684.487 null] +>> +endobj +1378 0 obj +<< +/D [1374 0 R /XYZ 29.788 663.877 null] +>> +endobj +654 0 obj +<< +/D [1374 0 R /XYZ 228.66 602.651 null] +>> +endobj +1379 0 obj +<< +/D [1374 0 R /XYZ 29.788 582.041 null] +>> +endobj +678 0 obj +<< +/D [1374 0 R /XYZ 254.722 520.815 null] +>> +endobj +1380 0 obj +<< +/D [1374 0 R /XYZ 29.788 500.205 null] +>> +endobj +1381 0 obj +<< +/D [1374 0 R /XYZ 319.609 438.979 null] +>> +endobj +1382 0 obj +<< +/D [1374 0 R /XYZ 29.788 418.369 null] +>> +endobj +1373 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1385 0 obj +<< +/Length 26 +/Filter /FlateDecode +>> +stream +x�� +0TH/�2PHW0Pp�I��p; +endstream +endobj +1384 0 obj +<< +/Type /Page +/Contents 1385 0 R +/Resources 1383 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1326 0 R +>> +endobj +1386 0 obj +<< +/D [1384 0 R /XYZ -13.423 915.745 null] +>> +endobj +1383 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/ProcSet [ /PDF ] +>> +endobj +1407 0 obj +<< +/Length 2057 +/Filter /FlateDecode +>> +stream +x��]o�8�=���2P1"E��=4�6�{�m�CZ���:X�WI +쏿��e�N.v��; )r�g8��7_edٜydI<ru�A�;�xDƒƌ�Hp +IjE��~{|T�D2�h��@�S���#���CQ3�(�bJ�Pۓ~H��0bT2�DQ@�xD���N��#���$���=�!�QW�*�ο>��@��¾��!��^/�h��Z�\��IL����E�������<f�Aϓ��u�=��xI�-ʈ�o�V��|��8@�����O�̧�CrsGxL�("al�}��[�j����a�\����V���7?�}�)Ä�F1�4B���=������r�A|�&�c�ϙ�����Р䄰Z�CS_����d@y�&J\����lղNڼ*��U�gJ+��xz����.Q2����ȇ��DqQ69s!B�ˤM��ۺKۮV��J�B���y����``~1�B���̰X4*�/ +5oT��岙�c���UݩZ��z����=+_R΅a�U�S��Y�߮G���S��Az��=�f8�AxHb9�c��̣�� X� 7z!�A�y�c �� +�걝��z�l��$S�!�����gnf����M�ӭ�Lۮ�r4=�v?P���<�ʶ��tW�71�Q,}T"�2������8�o�*UM3�0�Nt�En � r?ĭ��T�����~X�}&̆8��ʴ�M�4*�PP�֬�7��4�<�����jׯ��~e�q~]��U��U�FA��4x�w?���c�z�6��@)�ƟԺɻ����p��s̳�>��kށ��m�dt�!뮜/��T�},���#�ӝB% �(��v��;g���<:6�C2��ս���S'��WK��c�v�4uPoaW���(�~��4����z�y��?��П-��[��ΗK�F���@�c��ﮪӾ��3Eaޮ��Q�<QVS��<5��,��\��Tm��{i.u��y��O�>9+M���~��\�8�X�={�-Y{��j@��^�\�����q|��I�h�=�$ +��S��x76+Й+��}���j�?Q�$/���S�ծ������t9�����Vx=1c���{E��"!� +���[T�E�sQ݉~x/��%6 +�aHgn�����n|�@��:<�`�*�?LO+{�zTi�*;�߽�����[���_Z�W�Zf��rwHu. #Yͫw��s��9��B���Ȧ3�-�>S�B߱CI���P>h��%��PK]��V$8����&��c�El�-LG�UwK�G����^�Qt�G�NA��{3�/o���&�^x �'�aפqH}� D�����ʦ3f�Qi��+XP�i�O(�X�0��02|�G��I�ix������e��D�K�o�{gZ{o�'��Ϻ�o��f�����a%3���7"3�)�k�.�.�v�)%����%�y³�#���B��� 6ZX{X�TJ���_Eؽ쵁:�1�,��������v9�mta�g��՛�!��`sO�/adm�K��C�Z�/�vT}�!���n�q���Tx��U�MWI�Tؗ:���U������P��-@W,T�~憐�/�o��pao"�=�����wϋ���B��!4t�h��+ܝw۔� �T�W��+��l� +ճ7����{�����&�G�� ��2~�ݙ $���ȶ'E��k��g!a1Ԛ�]��@#�`(�B���rX�E��_�F~�������̝̺dw���=�0���ҟNO�wɯP5���Z�6�I� �p�ԋ������ӂgՁ��@*��o,��/��h�0DG���78{$�L�6�20c�J2�rm��ۀ�#J���>���H���H����X|6�PSJ&��V�cP���6M�mO@_7U?�L��ԑ�?�,o6U��5B��f]��M�� +6���P�((v���P/��٣���Z�v�̓��x�;��������ڿ%�[�|kO�=z֡��%�¶�_'��g���p\>�Jas��wP >��"ݎ +endstream +endobj +1406 0 obj +<< +/Type /Page +/Contents 1407 0 R +/Resources 1405 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1411 0 R +/Annots [ 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1410 0 R 1404 0 R ] +>> +endobj +1387 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 555.914 121.973 568.145] +/A << /S /GoTo /D (structbsec__bme__settings__t_a300b00f9580b9af76d441cd4db8d7083) >> +>> +endobj +1388 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [82.999 519.353 150.479 531.584] +/A << /S /GoTo /D (structbsec__bme__settings__t_aa197109b334a2a443d9349812865bff1) >> +>> +endobj +1389 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.179 500.539 345.816 512.036] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1390 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [82.999 482.792 180.795 495.022] +/A << /S /GoTo /D (structbsec__bme__settings__t_a500cfa825fa7c6ead38eba7bf7b4b955) >> +>> +endobj +1391 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [82.999 446.23 166.253 458.461] +/A << /S /GoTo /D (structbsec__bme__settings__t_afc3ab51b88f259e5cb76c10ee0732e5b) >> +>> +endobj +1392 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 409.669 118.341 421.589] +/A << /S /GoTo /D (structbsec__bme__settings__t_a4407b04a0d403a9fb35fd322999113a9) >> +>> +endobj +1393 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 373.108 192.293 385.339] +/A << /S /GoTo /D (structbsec__bme__settings__t_aecd99f57df2bc07663a7de83f877228e) >> +>> +endobj +1394 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 336.547 208.668 348.777] +/A << /S /GoTo /D (structbsec__bme__settings__t_aed0450820cd910e06e26fba04256bc24) >> +>> +endobj +1395 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 299.985 190.471 312.216] +/A << /S /GoTo /D (structbsec__bme__settings__t_a7984769929826a36f59e7b9dfd6e7447) >> +>> +endobj +1396 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 263.424 182.595 275.344] +/A << /S /GoTo /D (structbsec__bme__settings__t_aa4a1eeae4e7fe44a8093a3862996fbac) >> +>> +endobj +1397 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.294 169.017 244.198 181.52] +/A << /S /GoTo /D (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) >> +>> +endobj +1398 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.144 134.896 527.207 147.399] +/A << /S /GoTo /D (structbsec__bme__settings__t_aa4a1eeae4e7fe44a8093a3862996fbac) >> +>> +endobj +1399 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [84.31 107.797 320.65 120.028] +/A << /S /GoTo /D (structbsec__bme__settings__t_aed0450820cd910e06e26fba04256bc24) >> +>> +endobj +1400 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.718 107.797 543.208 120.028] +/A << /S /GoTo /D (structbsec__bme__settings__t_a7984769929826a36f59e7b9dfd6e7447) >> +>> +endobj +1401 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 94.248 253.297 106.479] +/A << /S /GoTo /D (structbsec__bme__settings__t_aecd99f57df2bc07663a7de83f877228e) >> +>> +endobj +1402 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [79.408 73.676 231 86.18] +/A << /S /GoTo /D (structbsec__bme__settings__t_a4407b04a0d403a9fb35fd322999113a9) >> +>> +endobj +1403 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [498.934 73.676 567.119 86.18] +/A << /S /GoTo /D (structbsec__bme__settings__t_a500cfa825fa7c6ead38eba7bf7b4b955) >> +>> +endobj +1410 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 60.127 179.344 72.358] +/A << /S /GoTo /D (structbsec__bme__settings__t_a500cfa825fa7c6ead38eba7bf7b4b955) >> +>> +endobj +1404 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.613 60.127 394.012 72.358] +/A << /S /GoTo /D (structbsec__bme__settings__t_afc3ab51b88f259e5cb76c10ee0732e5b) >> +>> +endobj +1408 0 obj +<< +/D [1406 0 R /XYZ -13.423 915.745 null] +>> +endobj +153 0 obj +<< +/D [1406 0 R /XYZ 29.788 737.428 null] +>> +endobj +1116 0 obj +<< +/D [1406 0 R /XYZ 29.788 649.232 null] +>> +endobj +157 0 obj +<< +/D [1406 0 R /XYZ 29.788 649.232 null] +>> +endobj +1409 0 obj +<< +/D [1406 0 R /XYZ 29.788 603.186 null] +>> +endobj +161 0 obj +<< +/D [1406 0 R /XYZ 29.788 221.409 null] +>> +endobj +1405 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F89 511 0 R /F97 510 0 R /F33 531 0 R /F30 532 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1423 0 obj +<< +/Length 1484 +/Filter /FlateDecode +>> +stream +xڵX�n�8}�W��F��i�[Ӧi�L���0d��5�$WK����\�Ʈ�L$!E��syH^f���@ж��h�\t;�D��-.��!!(��\�R����'������ �=N���\)3���!Aq6q�S��H���3�!? X�@�������r*��8U�����2��e���U �� �wC�p����i��崼�^��L�\����YV���%�8����}�W~�ko2������ɀ1LBO�_�f�7 J�p�}� ���z�t?�.�xw�P?�/e^e-�ϫ���Հ�B+�B�i���?�(���ȅ�R���fj8���-�0�D0��T�40?AV[t����"<L}2!��ye8��k�-�:-r�pۤ�Ԅ.�ӹ<� +A�g��!�c�:&0�����ߤr��^q�ɼ6n��`C`]�� K��$l���Q-�u-���M9��xC�������&�k�k��b��d��dr]ɺN�m��_�8>�Y�����Ӹo��ᡩn�O`�����+��Ҧ��'�?�'�W,��>0�:iʧA�5��_¿�3�gQe�j��IZ__eYE�a����o�s���8�YX�����v�ω7q��zG��%܁���};���ł�B���?O3+�Ɩ�����)hS���U�^�E^���Lx�7OC$L���*�s�Q*'�8�=>X��+��C�t�$��K�3z������*�d!�}��*.�MG�q��w��յ�Ƣ.L���;DU%���Ѓ;�����斝����� �"�몖��+\�%ǯLH3UU`��T���Һ���=�R�dʌ�^y�?����f�\�2:�!dm$P���c?U��� yA̼`(��l��6�~�V��Q�Mm�6V�BW2� ��N�2Q=�����Ci�;��<+ �t|�n��x�I�e��HR%�X_q�;��9loY~U���P���bV�U��WƵ�P�Ve���Tu1L�]��yQ��4?b�B�M���+ǧ���b�\�y��3��:/�r��QqU:����XQ�t�T��t�s�KQ*&�dXP2H�}��d���k��>�:a�T� �k!���[���KB��@��KI��eoF|���y^�� 3tr%Eur<"e?�Ja��Xŭ����X����͜I�31vVjx;��?6����S�1�NQs[Kͭ{��k!�Q���F�H�;��z^T����%���ჰW�c�h5uo�n�GcԻ��İ��@����p�c���9�J�_sD��FS���a +�|~�mޚ�mG2��*�Rme�ݩT��)�|r{/َmT&��U�Q��@'iu(�h� ¹�v��y�٦R�4q��%��e�D �y3�1������i�(�L���|�ʯ��f��R��U-Eٚ'�r ���-<�ڜ��I&5����L�c��/ܑ ��?���M +endstream +endobj +1422 0 obj +<< +/Type /Page +/Contents 1423 0 R +/Resources 1421 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1411 0 R +/Annots [ 1420 0 R ] +>> +endobj +1420 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.057 195.541 346.689 208.044] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1424 0 obj +<< +/D [1422 0 R /XYZ -13.423 915.745 null] +>> +endobj +165 0 obj +<< +/D [1422 0 R /XYZ 29.788 737.428 null] +>> +endobj +1413 0 obj +<< +/D [1422 0 R /XYZ 29.788 718.941 null] +>> +endobj +1425 0 obj +<< +/D [1422 0 R /XYZ 29.788 718.941 null] +>> +endobj +1414 0 obj +<< +/D [1422 0 R /XYZ 29.788 648.631 null] +>> +endobj +1426 0 obj +<< +/D [1422 0 R /XYZ 29.788 626.563 null] +>> +endobj +1418 0 obj +<< +/D [1422 0 R /XYZ 29.788 558.212 null] +>> +endobj +1427 0 obj +<< +/D [1422 0 R /XYZ 29.788 536.144 null] +>> +endobj +1117 0 obj +<< +/D [1422 0 R /XYZ 29.788 467.793 null] +>> +endobj +1428 0 obj +<< +/D [1422 0 R /XYZ 29.788 445.725 null] +>> +endobj +1416 0 obj +<< +/D [1422 0 R /XYZ 29.788 377.375 null] +>> +endobj +1429 0 obj +<< +/D [1422 0 R /XYZ 29.788 355.307 null] +>> +endobj +1412 0 obj +<< +/D [1422 0 R /XYZ 29.788 286.956 null] +>> +endobj +1430 0 obj +<< +/D [1422 0 R /XYZ 29.788 264.888 null] +>> +endobj +1415 0 obj +<< +/D [1422 0 R /XYZ 29.788 151.542 null] +>> +endobj +1431 0 obj +<< +/D [1422 0 R /XYZ 29.788 129.474 null] +>> +endobj +1417 0 obj +<< +/D [1422 0 R /XYZ 29.788 61.123 null] +>> +endobj +1421 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F32 514 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1443 0 obj +<< +/Length 2050 +/Filter /FlateDecode +>> +stream +x��YYo�8~���c��<u�m��� ����}p���E��PK����KG[m�N�&ţX�+���/P�k��!����Qh��A2�8�ł�HHT+t{���K���&3�&er�k��Ho�#c�P��1��ǔN�����<DQL��L�0�b�Ě9�!L��7*�I���0'�iڣ�!:`���}����̾,�)�/��8��H,�.BJ�q�(��x@h�PKzDr+��=!�xI�a��?_-80s�i���Wg�KpJ�q"��nKp�(J��W�Y�����y��xq�ʦ�[�=������j$�xx'��Xӿ�FP��#Je��,����G�ˀ9�2��<b\��j�NM}������� q��V�Oe�vu��Ui��<SF����K-p&� \H�<$�"�(ı&1����ɢU���Z��{U7��P��n���2�����t��,�!��`��m�n� ��M����^�ն@�Y�ϝb�9b��c�=�1q'��)����U䄒�gگ�o�H����Y<����I�z�|�S�z���ݫ��Ś�?�ǔ£��n�Mms[�[�����x�[w��;ը9��Ճ�ߒ��O`.�:�<?��cVwF<t��~�������[U�r;�9'R2�WΰL��>���2WE��ߦ7]��e�L<djѯ,�Nq<�e����n��w8MD$�6L���xA7�L�����ِ���H�YhN�Fp�i����dĜ� E��]\*Ӳ�U��Z5U� q�l����h8� %�fV☆?�範�*}���|W������R�uhRSå�����E�p�Jc��-;Զ���۪Aq�g��������Xg�e��J�����Dб����Цk�;g���p�6CuV�lK�*����w�7�Ų�)`ʵ�{�nm{�{l�m��y���h��^;<��������M���j�u~0|,��~�*�>IK���F� ��.�M�֏瑰�=9�=.�u�2K`Ls�n>�6YfÁ|t 7�=��=$��]a�`}��icg,�l��>m`.~1�b���a���G۵��w�����y�El��zy������w�#�QG��(�b�é2���)C����8KFP��#���V:}<�b�N��Y��6m���:V5���� ��t��|�j�B�k�*���j�HQT��Z�tV�� rÍ5]�6S@�ަ���m�)�z��x��2u�˽7)]VA>����O���_6�1x�N�h+}xBt�Z�yBF�a�X�m�:�����Qd���:�jU�ύ�z��q �J���q2{q1��R:�|�W�aꏪi�M�:^�N�Ǭ"�Mm����T�(;ꀚ�C�Ct; +{ޣ�����C�ڱ��:�G��]������"<^+�_Z4� t�AKt�&`0G�`�9l2�6�6��y�8`������h:���B�!�Ao�^�r�����Q_ �R>1�� C��dL3�_�~�P�p/��8����s����<p�D.�2�t�n�{��i���(���Cc�n�wi�S�/ͻ�����Ɔ�ߖ�w ���oT}qD�������?�1 F��������EHh��:c���̊#�S�I� ��Bp�$�z\j��� ��Kҗ�^i=_\T/aRj4����|���Fh�0`�Oy���s!3,��[tvb:y�v�����epg�z�_�>��v��u��,8� �6�]z�_���-��������h��qmd���p7�IlJ�ԭԿ��v�ަ��$@A΄y]�(��ork��M}e�7�d��z�Xiza`���h�*p�3�Jbj�T�g'eo��� �bq����Nh��,���T����Ng����;�rt���lf�i�hIgys���0����PT��7T+��3����Y�˅n�h!�F{���/�q�yP��6'J#꾯Vz�H67��=/�N3���=��}ti�Q~�y'�0�����@�Y-��I�. +endstream +endobj +1442 0 obj +<< +/Type /Page +/Contents 1443 0 R +/Resources 1441 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1411 0 R +/Annots [ 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R ] +>> +endobj +1432 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 489.708 135.304 501.628] +/A << /S /GoTo /D (structbsec__input__t_a90d515d57b274dfde74a281de469a3ad) >> +>> +endobj +1433 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [64.803 456.681 95.29 469.185] +/A << /S /GoTo /D (structbsec__input__t_a000803d39a2be521f2b5e7017c31303b) >> +>> +endobj +1434 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 423.655 168.653 435.885] +/A << /S /GoTo /D (structbsec__input__t_ab535651a26b2e2c44c83e441385e3def) >> +>> +endobj +1435 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 390.628 126.217 402.859] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1436 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.606 260.773 324.238 273.276] +/A << /S /GoTo /D (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) >> +>> +endobj +1437 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.183 241.968 448.691 254.471] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1438 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [28.792 228.419 145.995 240.649] +/A << /S /GoTo /D (structbsec__input__t_a916867811b65988853b69f729b91c262) >> +>> +endobj +1439 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.813 228.419 492.216 240.649] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1440 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 188.297 173.879 220.933] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1444 0 obj +<< +/D [1442 0 R /XYZ -13.423 915.745 null] +>> +endobj +1445 0 obj +<< +/D [1442 0 R /XYZ 29.788 737.428 null] +>> +endobj +1419 0 obj +<< +/D [1442 0 R /XYZ 29.788 680.603 null] +>> +endobj +1446 0 obj +<< +/D [1442 0 R /XYZ 29.788 660.7 null] +>> +endobj +999 0 obj +<< +/D [1442 0 R /XYZ 29.788 595.455 null] +>> +endobj +169 0 obj +<< +/D [1442 0 R /XYZ 29.788 574.126 null] +>> +endobj +1447 0 obj +<< +/D [1442 0 R /XYZ 29.788 534.354 null] +>> +endobj +173 0 obj +<< +/D [1442 0 R /XYZ 29.788 354.675 null] +>> +endobj +177 0 obj +<< +/D [1442 0 R /XYZ 29.788 169.39 null] +>> +endobj +1026 0 obj +<< +/D [1442 0 R /XYZ 29.788 143.316 null] +>> +endobj +1448 0 obj +<< +/D [1442 0 R /XYZ 29.788 143.316 null] +>> +endobj +1441 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F89 511 0 R /F97 510 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1463 0 obj +<< +/Length 1721 +/Filter /FlateDecode +>> +stream +x��YYo�8~���T4Oyk�M���&�!-Ebl�ڒ�#����;<d��MR�Q�-)r8��ᐝ/��hY�Z"��f��(�_`� KS�"�p($���}|@<.Xj6�e��@��U�n�~/��2�o(#,b���D�̤�r:�v�1� +#�%e��Ї9�8��A'�`��o�@�~�aN8pӼ]ôW���m8zS����}\�Cj��^�� ���a(�RDq��V��>e`%B-;�ɭ�}����1]�%�M>>Yq2��8��O��)��r�0D��bF +c��E�.���NWG>#�BuY5*=��x?{�(C�4�li��� �`�="`T���F�����P����I� '�j�M���Ӂ����N��x����]Ѩe�4yY�6ϔQ�xz����]ݜ99����XD� +i�Pʊ����T��Imk���{�n�� ,��Z�W��}�����6��j��?B�ǖ��L�9��^�/�d=b6?�� �A 4@ `�ʬ�Y�Ik����Ŷm������j�����\��X�N6۵�^�۬�@[��e�x�2�ySV�J�[�6���vV�3<��ȻF0�cH��_?���||!N�'��͋&���S'l�7x���B���H�R��_M[u���+��U�v��w�u�hJ�R�J'��� +�I-'���n��O0X,�M6�� ���x4��=X��3KGQ$E {�E�C{�n�txYԟ��(&�&ۃ�0ɥ�1�x3��li<x��nl��;�Uy�6�_��+�¯�VAV.�n�p4y�V*�w�ɺU5>���+uo�Ӥ��Ur�����+�%��3��'T}_7j�W�^O}rAA��* + +V4�����0w�:?]��j;�h+������§qH��96���8&P$�0�"٠�l'w�7U�����Q�*R��ġs��6����o���{��uV�Or�:�秐�&I���O, <�"d4]c���.����r�=Q�p{��X`v��p��0D��_��K}�0�GMژD�w��><$�Z��G/r����3���x�3�?R;<C�Q��#MA���g��ٞ=Tz����R�C�g/$��w�*�\G�r&/ol{�WM��K��.-~\�'i�VIz�R����t�K�:��O�'x�и1��3~~�ݎu�@��8[�0r��23�H� �A��As�}� s������ߕ�i�Cݦ��X*ݗ�]ެ��e�C�cx|�ߔi��#h7ת:>�CF���ő����m�z�����/�D�����}���:b?�FO'p��#&�zG�'����I�%�=�<ч�SI�� ��)��wE��b�a��$�Y�"<�����cNCDc���f����h@���;����2�R��ݺ/�#�g�v@�)���Y������n~���NOٯ�j�����{Ƅ�<��Id������t��g��N��T��IF���M�Ƒ4�� w���7�~��N��� �|���Qb��G�����s9xĄO�m���p��Tx��1�Ǫ|���F�wY蕾{��7�L���P�gR�[�Y^o�:Y����ܮ˼1�� ���*3��uC���\߂�h����Ij�l�$"���͝�ʓ�J0)Pխ�s�7�n��.ߎʠ��Z-@w��[U5��ӛ�萔L����K +��%-|�g��b +endstream +endobj +1462 0 obj +<< +/Type /Page +/Contents 1463 0 R +/Resources 1461 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1411 0 R +/Annots [ 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R ] +>> +endobj +1450 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 705.788 173.879 738.424] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1451 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 565.094 173.879 597.73] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1452 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 223.584 135.304 235.504] +/A << /S /GoTo /D (structbsec__output__t_a74a917725569b67eb14e78a34fa9c55d) >> +>> +endobj +1453 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [64.803 187.415 95.29 199.918] +/A << /S /GoTo /D (structbsec__output__t_a1a046572bcb85189df10c9ac8f362999) >> +>> +endobj +1454 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.258 168.798 394.563 180.295] +/A << /S /GoTo /D (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) >> +>> +endobj +1455 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 151.246 168.653 163.477] +/A << /S /GoTo /D (structbsec__output__t_a91006cd8f20e88a5ff2b6ebfbecdeb95) >> +>> +endobj +1456 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 115.077 126.217 127.308] +/A << /S /GoTo /D (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) >> +>> +endobj +1457 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 78.909 122.573 90.828] +/A << /S /GoTo /D (structbsec__output__t_ac4e7ef20f713075472bc953efb13957f) >> +>> +endobj +1464 0 obj +<< +/D [1462 0 R /XYZ -13.423 915.745 null] +>> +endobj +1028 0 obj +<< +/D [1462 0 R /XYZ 29.788 702.891 null] +>> +endobj +1465 0 obj +<< +/D [1462 0 R /XYZ 29.788 679.17 null] +>> +endobj +1449 0 obj +<< +/D [1462 0 R /XYZ 29.788 562.197 null] +>> +endobj +1466 0 obj +<< +/D [1462 0 R /XYZ 29.788 538.476 null] +>> +endobj +1029 0 obj +<< +/D [1462 0 R /XYZ 29.788 467.755 null] +>> +endobj +1467 0 obj +<< +/D [1462 0 R /XYZ 29.788 444.035 null] +>> +endobj +1000 0 obj +<< +/D [1462 0 R /XYZ 345.082 341.456 null] +>> +endobj +181 0 obj +<< +/D [1462 0 R /XYZ 29.788 314.241 null] +>> +endobj +1468 0 obj +<< +/D [1462 0 R /XYZ 29.788 270.565 null] +>> +endobj +1461 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F89 511 0 R /F97 510 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1475 0 obj +<< +/Length 3305 +/Filter /FlateDecode +>> +stream +x��[Ys�F~ׯ�#Ue��0~�m�q*�a)�ڊS.��H��ò�������T�83�k���������[��[y�{w?<�?�{B +$ �"NQȅW$���/��� +�L�3AQ d��+�sϋx�3�("�%����� +ާ4�t�8a�F BQ%�u4B2R��K0N��7H���0j�v�U�+���o��&Q��}\�!�|�� (�xK-c.��'����j/�O(X Cް`F��뀮�1]�����2Zq2b��_�]\�P�$C��ޣ�Q�������}�*/�K����6ٖyQ%��?��k)C��# 6������*��0�z��F5��y�m�DDЖ�T�49V+o���c: ���7���U�*�*ͷ��]�.��X<=�ɸG�BP% $@<b�0dlq�Dfo�*N�di�z���"�i9��u��F9�>�f��mUԋ�.Ce����������y]��ʼ��f�����yVk[���".�]�|��쑔<A�ܻۀ87��ND�#���iiʊ��j�����7����Ϳ��]��3�@��Y�%ɒM��<�&P[��.��(�o�V���Q}�%��g����E��V�x�<�00����t��3S� \M�-M��`��bk +ܨm �*�n��Pm`���8�g �/�2(��X�,>���\�|Y��9]v Rk���yY���Jn�p4[�4�}˒�U ���5 �U��Y���{�� ?��hQ�+-ꗴ��8�l����0��W��jx�;̐D�Q�X��|������,�B���2�$GN͈Q��I�������rH��V�+>pI]⇮���:g/u/��@(��n����N�U����>����@�a�t�Pn-v�J�M�gC�.�s���iI�6��.�3��#�3�����5���m��lڦ[Sd}o�F��� +529Lc���v����".����6I���6� �lj��(� ��ҿϳ,(_��j�c�z�����������»��'���\HD�)�8@��.A����D�@/�EOS`D�B/�6�Hg�S��aΗ��ߏ�&9CE &�N~EO`�S����������(�K!f�ZP�PI �SCd`���H>] +�DB�Ѣ������q&u�����"�)�Y�LG�ŀ�$�%�ʇ��"�G���Ǜ�_���f�S�V��Q�e�O�i +��������4q������H�4��E/0.[�m����s[��u�\�(�8�F�t�% �b���V�p����c�QP����~�|�����_�{LS0�*�������`��q�`�<�W kzq�r��.��тH0%��=�I�8^����݇�7����L��q?-��b&`����r�L�͓0���,[lb;m�WZ��>/6�v����Xua�i +��� +�4nC�D��w��}�8���ޠ�͞ �h +� �:*��uE��?Z���W%g����c5�D�֞oݨK�ꕪ��t�9+�Wo#�O� �̆!�h%�]�Q��M����f�K�&���_��;�i�I�~qk$v�M9�u�]%��I7�9 �Z��m]%���u�2Cx2�,��O��hHE��I ���6A]N�{zZ^a*̣MnE��na?Ys�H9�V�������Q`�!,��5�2�H ,��E����a��$���(ɘ�܊���⟨Fr���zo�@�B�JH�C�����(��0节��5O�:� +2��W�wn��~%E�b1� +��&�č�Բ~ǵ��VE�@a +���bn�'Pߣ�om�q��hm�0* +8<�a�N�"CB4 Ia�C�Ј")�`��@h�5m�wn����5��'�z7�gIY���m�q�,dZD d��d��Y1!$��L�IrbFR8�u���z:�<6�����L��� +6d��[2@ $gBF�K`gAf$�S��g���2�t�i��[!C��̳{�AF�J4�!��f�N"Qa��4BQw +�"�[tT�����K���1a���tW*}V�i���m^�����*Ua]&�)zX'[SV��+W��I �J!�\ͣ�(�Z�|�D�>��u�::�ɞ�X�!�[�vM�M��*��Q`���`��(�x��U��[�Mzo6 �����%_wy�T�=z�%��j�e�eu�ȓZ:�� ��;����L��⤫-��TmnU;ʓx��� L��̹4��'0_��+��AUq$������c�{µ�N)9,�Z�N�)P&j '�|:8� ��K�(P +F� ��']M�����@��y���J��+ЈIi/)_?� ��3�8�q�'�4O�2��y[��4K���f�2�����hf��34�x+�!���pPKV�#�<�x������hG��q���α]�N��u\��j����F���&f/̬+fEbϭ���쭴Z~�3������\&�����=h��в�-�U�/-��6R$�B�&�F ��åu���fPSR���n�9^6��a�3.f���)~H����X��9�Z�Z� �7� �"�lN�3`�F� �y�A�ݯg�z��0��)G�9���ҁ S�t�i�<������۫O�wϷ��` ���Y�1$;��G�8��Q��É���IX�n�|҆���3,g�(0q^�����gܜI�u:�>R���}�����H����?��!WK5�.tHR��6�� g��+���t�F�]S�e=�O��:�j�QO����=}^�*3W3����Nz��f��B�ncܩH���&��ߺL��{4���G�B�:vM)�|�����\B��9��+��߿��J�{D#;���BmѩUG�_��&��_ ��(&�����d���PL ����/�]|� �и`)�9�Q +�#e7����E�3��jd_ޅ߫�{���Ts�?�����W���_+հ��V����7(n�H�FĶT���<�6��8p1I�!�l�D���6�tv���ҷgb�i����ڭ|��#�H}���J�;}�[w��'���̿3 +�# +�g�z� +�W�Ҿ[/��\H�7[l�*.�:|P?��7Cz��"Ǚ�@��9�Ss��ɮȗ��)�Xt���^����d^���K�l�:r@:��!��"K\lI�4����[�nW5����e�pk7 �.)*�V`��N�i���rwE��'���X��� +endstream +endobj +1474 0 obj +<< +/Type /Page +/Contents 1475 0 R +/Resources 1473 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1411 0 R +/Annots [ 1458 0 R 1459 0 R 1460 0 R 1472 0 R ] +>> +endobj +1458 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.801 666.651 361.949 679.154] +/A << /S /GoTo /D (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) >> +>> +endobj +1459 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [443.971 666.651 567.119 679.154] +/A << /S /GoTo /D (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) >> +>> +endobj +1460 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.21 653.102 240.304 665.605] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1472 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 613.777 163.57 646.414] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1476 0 obj +<< +/D [1474 0 R /XYZ -13.423 915.745 null] +>> +endobj +185 0 obj +<< +/D [1474 0 R /XYZ 29.788 737.428 null] +>> +endobj +189 0 obj +<< +/D [1474 0 R /XYZ 29.788 596.231 null] +>> +endobj +591 0 obj +<< +/D [1474 0 R /XYZ 29.788 570.989 null] +>> +endobj +1477 0 obj +<< +/D [1474 0 R /XYZ 29.788 570.989 null] +>> +endobj +1478 0 obj +<< +/D [1474 0 R /XYZ 29.788 475.536 null] +>> +endobj +1479 0 obj +<< +/D [1474 0 R /XYZ 29.788 326.877 null] +>> +endobj +1480 0 obj +<< +/D [1474 0 R /XYZ 29.788 177.703 null] +>> +endobj +1318 0 obj +<< +/D [1474 0 R /XYZ 29.788 63.19 null] +>> +endobj +1473 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F89 511 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1489 0 obj +<< +/Length 1772 +/Filter /FlateDecode +>> +stream +xڵXYo�8~����h�:��n��v�� �C���Zؒ�#���;<t�N6i8!ErFs|sP���_m� AD����3�$#�#JQ(�D�B���G�g�K�fH&�e4��5���E�&��bQ�ޏ�L�1�sc�N��S� �XR��j=�c!�B-L|��y��2t��� �7ͻ75L;�������D=/��j�S�k�����e�EC�"��'���(+j���Hnu��gtO�ڑ�^��ي��!�F����̮����HZ�#� QY/t;}����ǂp:WY��Z_�->L�.z�P! 0�����A l~@���st����м�����I� '�j��m�\�ҁJ����������>�Ԧ��4���u�&�(�\<=5�dQP�@@�d���#�gX'��3�.<�ɴ4^��@��eA���Ќ��vRs��4��e���J�^�uu��e��Հ�5U'�m��-���ʪ��_�6��Ң��}�,/���� ���'�9�X�s�,y�+�3�NJ�0������XQ���`�H�ި��\:����9�J�N��;�;�����G�wy|�-�'�1�����a�̗:�V[�Pgieg�Ҿ�Tb��bt�P�A�������4���~Y�a@�Pn�9����!*D�$�_�&�O�S�ϡ%8FK��<"���U�p������G����m���jb�a���H�+i<� H(t�}�Ik� +D\���9F���ц���t�p`�L��)hH��Y/ɳ���|Ww�#v�=���d��f ���f�>a+���2��� �ŚÙQ�a��!��m[�̫�^����W�����SIɜ��!��9�2�b��*U��<�/�Գ�0����O��I<p%���GKEי�����%���?��.0H2^`@���{�����6��h����2]�J����TQ}s@z��n�]�/t��\k� ��?��&���#'��q��y�/ I���.�Z� �9m�:���索�tפ�KU���`�Ȉ�<a&��T�&�4����lԚ���J|�������p#�]=$&0�^��m�3 evB�c�u$��*�(�xa�����ٰ�:���Cz-�z՚O���"dh\�Z�ū���]`f��7�Zi�X��H�C�U�r7�:�~g&}q�����)^�M�oQ7�S�V�qa��+����<bh8��?�~s��2�F��"`���<1!�6�̈́�O��#�t�]�� ��G�¥�������F�4�1f�Y^�P����e����i���*^]x�`����xo�x���]�<s��^�IH�i����A��LZ��ӹop�խ���A��y��+��x���7�gz���v��� >ҷI���}������<�CR�!$�����7p h��o����2t�=�@�����B�`m��␇��f�r�5�x�]oD������X����o���Z5��17��ߟ�xD�7�Ih��PwR����=z�U�7q�IL��H���էC�;�4�xZg��O�K�6�2�c��^�0'D��'݆���O����'x��������Pl�����V���N�f�\o�pWM����ĔQ�g_-�$-y�A4U�vyZ��� +]�Y +�*I+`��(#��G�6�@� ����\���èv@Eʪaa��]���A�H���4��=@���c�h"�0������x)$������u{ +endstream +endobj +1488 0 obj +<< +/Type /Page +/Contents 1489 0 R +/Resources 1487 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1411 0 R +/Annots [ 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R ] +>> +endobj +1481 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 638.955 163.57 671.591] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1482 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.188 546.503 400.067 559.007] +/A << /S /GoTo /D (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) >> +>> +endobj +1483 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 505.466 163.57 538.102] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1484 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [64.803 215.194 126.817 227.697] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a150ba3a737fb75f56052c60d55246ae4) >> +>> +endobj +1485 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 180.881 126.217 193.111] +/A << /S /GoTo /D (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) >> +>> +endobj +1486 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.933 73.676 327.241 86.18] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1490 0 obj +<< +/D [1488 0 R /XYZ -13.423 915.745 null] +>> +endobj +1491 0 obj +<< +/D [1488 0 R /XYZ 29.788 737.428 null] +>> +endobj +1470 0 obj +<< +/D [1488 0 R /XYZ 29.788 636.452 null] +>> +endobj +1492 0 obj +<< +/D [1488 0 R /XYZ 29.788 614.986 null] +>> +endobj +1471 0 obj +<< +/D [1488 0 R /XYZ 29.788 502.963 null] +>> +endobj +1493 0 obj +<< +/D [1488 0 R /XYZ 29.788 481.497 null] +>> +endobj +1469 0 obj +<< +/D [1488 0 R /XYZ 29.788 414.01 null] +>> +endobj +1494 0 obj +<< +/D [1488 0 R /XYZ 29.788 392.544 null] +>> +endobj +673 0 obj +<< +/D [1488 0 R /XYZ 29.788 325.058 null] +>> +endobj +193 0 obj +<< +/D [1488 0 R /XYZ 29.788 302.166 null] +>> +endobj +1495 0 obj +<< +/D [1488 0 R /XYZ 29.788 260.796 null] +>> +endobj +197 0 obj +<< +/D [1488 0 R /XYZ 29.788 142.722 null] +>> +endobj +1487 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F89 511 0 R /F97 510 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1517 0 obj +<< +/Length 2069 +/Filter /FlateDecode +>> +stream +x���nܶ��_�� pD�7��[s;)��66Ї$0d-�V�+m$m���ΐ��Z�k���&E�s�pfx|��7FV�QHV$$gG�A�_`$$*Q4a�h�i,��>���1`� +ь�)N#�LW�{�{1����4� #�fB��JN1�k[tRĔ��ĚQ�8"E��&��N ��� {�~9�"� q�iπ8~��R��0�� +Z���������*���A�z��AJ!s�*�x��{x���/l�����Zʒ�8:>�d�&2���5� ��&q��}�$o�:�y�X/�MQ�Uc�W�/~>z{1`�Ie-<� �T#���C��ɟIB��ւnhdM·<P����+b��4�:��Vd�ԇ�9��(�ل���u<�/���&/7p�˗�2t�==�e�0F�8RQ� "A=a���|��,Ns�^:�N�l�1E�Ȝ�����p�7���P�R���f�6������S�C9����u�6����Um���j�2+��|�s"�l^���w�Q�4�0h��[hǦ]b{�k�?�5��]����k�7��<kG=��{e�3U��u?���"AS +~-��=��v���^OH�]7��X�^��fI'B���S4P�װ�`�<D ��h��1D���/���O��L�l(��s{2 +����,0����$l���Hh�ؘ�ȋ��@2�mn���,�x2�#�I���3K�5Ų_Z�����U���R7�.k�J�S۩'`���35�ĥ�ߋ��e��5���JG���Z�3�Zz���qC%�so�1�k�]eս�.�/��U�U���)T!��Ȏ��VSi=�'r�W�����4 Ȯ�rG.�������"�S�.��vp����$�K"���߇���+�6g�j�'8P�b��7=N��v��b{�$�a{;=E͝y�Q\�T��rB��0QS!�<[�OH3�C����kY�����zc�me�U����O`��a"���fJ��!d��8]3c#�CT91������f�jV�C��a��lF�<� �QgS $>O�`�L�/��(��Hzu�:���<�����f��6�8D�S>���h��w��SH��;�����#$�<����t�g]��ST@X��n�a.���G��S@�<��hI��\��R*��R�h��T� {}fj�;��`�Me��ܳU��a�43��Iڤ�M��y�?)W=>��4e�T)�v�ģx�c©-����'���O��K|�O��$����n,mL�?�ܛ�/���J���ˈ +�A �h��)���3{�Y$���q\^�V�}{AS�}����d~ϗ�];|�4��Z�H�u����t�{�n�+'�Kl�X՜_�ן�컶���t�q���� �e��I�laz ��q�a.u�mm��j�(J[��!l��0�05y[{q�i�t��I�%uS�*�._Z� �����[�٢L�{�����6_�;�\��o�f�ٺ��~wmi�!��/��%c�d෮��!��NO�(�Qc�������K��L�8��D�m�,j��\:IZ2� �M�œ���|����O�a~�j�u'�+�|sS�<�?� ����al�`��2��WA�H��d��_�F:e��V�����:�����p�� v��y_3��%�A���M�S��Gۘ��Y�al��^� +&AOXݖ}5yg�C�a��,k��<IP�b�0tvo:�h�2�w�#�+�.�?@�ᬄ��~AB&4h�m@����`2L�Uނu�s�A�:=]?F���-疷�=<z��i������� y�T���˫�&b��B���a<������S���M730�� +2� +����̐��'$����5L5x �O�8�\�sh�n@&?��Ʊ*_���3���|J����UZ�z6|��w�z��۲N�vA�0߶�2w51?T�mU.�l���,s�(x�@w��n�&����� dl�mn�z=�"�,�}k�v���rH��u��[���g�;$�}8�j��j�;��7*��:>lC,��G��Ň�xP� +endstream +endobj +1516 0 obj +<< +/Type /Page +/Contents 1517 0 R +/Resources 1515 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1523 0 R +/Annots [ 1496 0 R 1505 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R ] +>> +endobj +1496 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [90.035 521.522 226.024 534.025] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1505 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.505 495.79 263.981 508.326] +/A << /S /GoTo /D (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) >> +>> +endobj +1507 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.076 479.883 435.17 492.113] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1508 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.076 463.975 445.479 476.206] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1509 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 405.792 173.879 438.429] +/A << /S /GoTo /D (group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) >> +>> +endobj +1510 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.476 392.243 163.57 404.474] +/A << /S /GoTo /D (group__bsec__interface_ga832388c889417ed197609d9965625bfe) >> +>> +endobj +1511 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 283.55 106.199 295.47] +/A << /S /GoTo /D (structbsec__version__t_af823001b85e62b90279f9e6f3c478c23) >> +>> +endobj +1512 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 249.291 106.199 261.211] +/A << /S /GoTo /D (structbsec__version__t_a9d47d254d17740222791fa0f53c7ac52) >> +>> +endobj +1513 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 215.033 141.37 227.536] +/A << /S /GoTo /D (structbsec__version__t_a3d9b11a72027026f492a438342a2efbd) >> +>> +endobj +1514 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [76.934 180.774 141.37 193.278] +/A << /S /GoTo /D (structbsec__version__t_a5daac4534748c6f0be9f009273613b02) >> +>> +endobj +1518 0 obj +<< +/D [1516 0 R /XYZ -13.423 915.745 null] +>> +endobj +201 0 obj +<< +/D [1516 0 R /XYZ 29.788 737.428 null] +>> +endobj +677 0 obj +<< +/D [1516 0 R /XYZ 29.788 719.646 null] +>> +endobj +1519 0 obj +<< +/D [1516 0 R /XYZ 29.788 719.646 null] +>> +endobj +676 0 obj +<< +/D [1516 0 R /XYZ 234.846 638.216 null] +>> +endobj +1520 0 obj +<< +/D [1516 0 R /XYZ 29.788 617.606 null] +>> +endobj +1521 0 obj +<< +/D [1516 0 R /XYZ 29.788 510.563 null] +>> +endobj +1069 0 obj +<< +/D [1516 0 R /XYZ 29.788 389.752 null] +>> +endobj +205 0 obj +<< +/D [1516 0 R /XYZ 29.788 370.414 null] +>> +endobj +1522 0 obj +<< +/D [1516 0 R /XYZ 29.788 329.111 null] +>> +endobj +209 0 obj +<< +/D [1516 0 R /XYZ 29.788 142.709 null] +>> +endobj +1515 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R /F89 511 0 R /F97 510 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1526 0 obj +<< +/Length 1144 +/Filter /FlateDecode +>> +stream +xڵW�n�8}�W�QV4���fs��M�C�d��Uؒ+�I +��wH�f�F��$�m�p�p43�Lo>Q��F-A�#X +�7�!Hj�5�H �c!Qi�b����P��0�j��H�C�I{gEV�����BS�n�L�C�Sc'x�)�P�(��YPk`gLa��q0�".�����$����LhO�mL�o8�(���ƾL����%)�����"�!��P:~�UoxHx�P3"���OOp/q�U�|~5q0Rq������t4����k�h�@L�X)k���9�*]�C����UQ�&�~]Nd��.�c������}!h��2��D7Vl�h�n�0gT*��1�X��VKt����*#�bz@���O��}^�e��Y����]67��k��,�R��d�2���Qq�&��lB�W�YϽME�ۘ��f��c�c |� O���,�x�|-�=��e�'E��.�ku_�6���2���)+0�>;�м��L� +3�t ����h��1���6`p?�-��o���R�����u�@�O�Aod��Y�;ߩE{���{#1`�?�S����3��w���5C���=G�o�|��t����< �b�Y�S��q(�((Me��Bs��.�:���n�դ�_ԅ�U�/����1�WŮȋ:K��������63S��ØQȢӱ�Ax��2R$���e���߄��:�)fR�Ɩ��#⣩l������I,|�V�蠊�P�*���k�F�{ ��H6C�&&����s���!�B��J��eř�Q�Y��4:��N�ccQ+ �����>����Ŋ+x�v5����@9hY�V�;?&���LJ���+K��<n����2�!�&�u7�����y�A����&N�*7B�a'�GS#ӈ�hꚦ��dlC�_��td����h(6��s��� j[����s9��`)����/`cC6�"x�^��2[�ꪙ7Y�X +$�h�I9��_&�w=ϪmQ%k���]�op���l�b�K�-�yVT#�u��v������s����X��w +Bn̚��^?1.��i�hd��u��[��hkI��wր��k������wγҹW�$�3js|S�d����ICE +endstream +endobj +1525 0 obj +<< +/Type /Page +/Contents 1526 0 R +/Resources 1524 0 R +/MediaBox [0 0 595.911 842.745] +/Parent 1523 0 R +>> +endobj +1527 0 obj +<< +/D [1525 0 R /XYZ -13.423 915.745 null] +>> +endobj +213 0 obj +<< +/D [1525 0 R /XYZ 29.788 737.428 null] +>> +endobj +1093 0 obj +<< +/D [1525 0 R /XYZ 29.788 719.646 null] +>> +endobj +1528 0 obj +<< +/D [1525 0 R /XYZ 29.788 719.646 null] +>> +endobj +1095 0 obj +<< +/D [1525 0 R /XYZ 29.788 654.393 null] +>> +endobj +1529 0 obj +<< +/D [1525 0 R /XYZ 29.788 635.851 null] +>> +endobj +1094 0 obj +<< +/D [1525 0 R /XYZ 29.788 572.558 null] +>> +endobj +1530 0 obj +<< +/D [1525 0 R /XYZ 29.788 554.015 null] +>> +endobj +1096 0 obj +<< +/D [1525 0 R /XYZ 29.788 492.707 null] +>> +endobj +1531 0 obj +<< +/D [1525 0 R /XYZ 29.788 474.164 null] +>> +endobj +1524 0 obj +<< + /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /ExtGState<</TRP1<</ca 1/CA 1>>/TRP.5<</ca .5/CA .5>>>> +/Font << /F45 229 0 R /F44 228 0 R /F120 619 0 R >> +/XObject << /Im3 221 0 R /Im4 222 0 R >> +/ProcSet [ /PDF /Text ] +>> +endobj +1 0 obj +<<>> +endobj +2 0 obj +<<>> +endobj +3 0 obj +<< /pgfprgb [/Pattern /DeviceRGB] >> +endobj +1532 0 obj +[799.4] +endobj +1533 0 obj +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +endobj +1534 0 obj +[513.9] +endobj +1535 0 obj +[777.8 500 777.8] +endobj +1536 0 obj +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +endobj +1537 0 obj +[295.1] +endobj +1538 0 obj +[1062.5] +endobj +1539 0 obj +[500] +endobj +1540 0 obj +[633] +endobj +1542 0 obj +[500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 222 655 789 811 549 713 549 549 494 713 823 670 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500] +endobj +1543 0 obj +[500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 222 655 789 811 549 713 549 549 494 713 823 690 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260] +endobj +1544 0 obj +[611 611 167 333 611 278 333 333 0 333 584 0 611 500 333 278 278 744 1042 1083 549 713 549 549 494 713 823 766 333 238 278 333 474 556 556 889 722 278 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556] +endobj +1545 0 obj +<< +/Length1 1416 +/Length2 6052 +/Length3 0 +/Length 7019 +/Filter /FlateDecode +>> +stream +xڍwT���6҄�RE:Q�CH��*�� �$$�� �I�U�*��H�* H��)*J/_PϽ���_��V�Jޙyf���ϳ�Λw���v05$��I�uu5� $,� 89��XW��~��)��#R��PF� X�O��u���W X��K�@@!H�o -T�x�큺@-$�p*#Q�h����ߏ@n(,))~�W:P� ��C!�.�sï����P8����2NX,JJP���S��@��x��=�X'�!C{��#� n�?� �8��Np���� AÀx�+ +C`�)�04�:�HS���!~�u~���l,��W�?����_�(醂 ��G���W��za��!� ����C< pW��uPM���O�g> Ga1��Ō�e�۬��WF���X�?8�ﻷ���uA =>[p�����P�&������������$ą%D�0w ��$x���7 +�+�p�g��A!Q@�0?����@<`@,����?���`0���`�p����n��o�h��������� +�0{$�����_G,htO���)ߟ��TRBz}�����B� $"�?����]�O����p@/�]�ߨ�{��C�? +����O]���L�����/����R�4���2��;R{���+�����!npW�?<u`�2�E�ŀ�o��vua��n���B�rPD8�)������1jp/��]8���6��&�s�#`w�������+�W��`����`���:���?�PE@���B�h�7��xK��������@A�O�g�: р�� +:^�e�m�~�@@A&.�X ���Ʒ�&�V�� �A�H�t�sup�a�"�'�ʐ�Vڡ��P�5�[u�f1�(;kJ���dX�ڹMO��0g�Î�r {���>?�ښ#�]������D��[��O�R�ؤ���wY��������8)}�������EW�&�Ң��^Y��C�"i��!�ɮ�xEt���On�AKі�z��eZ�� �T��}3�]�Q�Z�V�s�b�U��XTD.W��<��3��c3���N�VaӾ��<O�a������M�vq'�$�h��+5j�N) ���i?��N��+�x�1�L�k��+�����=5�9���v���pO0��ٳ��/~u��b<B ���L�^V�����sz���=��2n&d!���b,W4#�`N-,|��VnrM��s���{�>8���;��J\S�Q��h�B͌oF���-���ZhzU�2��mq߷�k�J�� Y�W�kq�����q4R +Ȟ�l�-28�A�9�V��RW�[)a�=A�^ދ��@��=�a�GI`��&�t�0�@��H�߽.m:��(�����Pn�����T��-7E�p�D/]�O+�S��eI�����aݤe}J'?~�i��W���'�F�(.�6�F�U1���R"H& ��s�殰#3�N��5v�V�s�s����J,���=�.�o��b��H�\���z������я� N*�ܲ�n��{Y6�!�����l:;��^�U`���A�%�H��v�MYZ�!���N1�vy:<�mA-�@�I߫� Ľ�iN�F !O�H�Ѡ��G7&���� @7���t}g a����jS���%����'��$y��g*�=���ƺ�ݱ��K���h"�P���(�.mВ�̜����F���.Q~1���G!�TN�^D�z��;|Ш9�`�2V��p�0���;�X^���f�QͺJ,��gPջ���7Mf��o�Hۋ<�7.�����t�Aw��;3!͇�~�<��w�x��`l[��c'���<nҦ� +���{/���T/��Y���1�F��9N�]7+�t�%�����.���L3Gi��w�>�i��y���M���lq ��5��'Bgt�+���o�-��_�p|�n^N>�vj��8�c�g�آ �-ִ�&�h^ce�`��>��x�/8/�:e�4���x��;6x��د�fu$��2T���p�<���L�V�9Yߺe1�����J�IvsȂ��x�`^i�3e7�� +h���� j���g'z�H���֞*E�`���6 p�{#� +mu�d�+pai��@��&EV�� [�����[e���U�`W�盟���^��7����Q���&C,����lQ���R� �}2��G|���PSM�J"1n���l�}@@��s��P!+(��/�s.�������{��ɚ�CC{���r��O�:&��|�;�u]��~�%�nT�����R_��[���#{&��fcZI?�2����`�X��@h�E)!������g���'�{1�=�^4�h����92oe����ù��a�kz��;4ve�P,�1�������̜;+�f�:��<��&�.�,=XipՄ=Xe��VA��S�@�Υf�x�3�(�H~�!M�5���f�<�2���>���;¥�ܒG�ك���r� +ѽ+oFK���$��gz�����AЃAgz9�q������:q���Oz�MR+�3���a���,}��3��.�IO��OL�"�LV$2D�}�Xa���ʌk +��+�JfJRoV��$��Ѽ�1��K�(j 0�(�MH���A��}!���P��W�HCC����x�.�%���*o�z��o�^��F�҈,��x7�sL�i�3����1�@B�,�q3�iU4�4yg-e ui��x8[~<+�Jt^^��M�f��f4#[ΦV'@��m�W�j ���И�N�OPnHԅ�Á���S�3qzџᷙ��?�yjbC�sW>������r�����{����Sr�ר{��W������|۬3[eCb-�c{�w;�f�Z�|�`d����N���C��A��&G}sJ�>��n��k��Z �TD�wR^��|�a>���R��|�bt�D+DF�3�8�=����hI�R�0�e;іIͷ/k��/�Fy�O��$�U�����R&:�)+5�Q�� �l��,q���G�U�MI|��;�� �dS��QQo3m_\���R�wߩz��g%��S�rܤ�T��˪Euk��{a�S��3drE���y��g�{�ص���ʲj!\�����a�#1,�εk���]�j$An3��&�� O����q��5#��B�藷ʋ +Q��ݢT�^:*o��"��v���3$�D}�r��ZR�Ny4�ȫ��Ț���<y���9���X�=GVIĶ�j�������@ܫ��Xt9 ���(G��s +B�ȸ�R�J�{���\��9�C�b +�m a7�7�9���^$w��{��R�)?�K�˦�����ݓ��l�nQ� +s6��~h��<�NCv��F�6�bAT����^�=���|&Q�T�M7��9�ؾUO��r�?�HBI+j�e?�z#��zѵ�D�w�����}��ڗ��Q�+�����.�:K R� �_p~fR��{,�l�q�^iu1q*^�c�n4�ȹ,��gݳ�/���h=�i�9|eR�=��v�9�9��)��5VCy��V�[� @eq�����Z��NT*uc�����O*�2���8?���~�2Y߷�,�,���P@�T�b�Z�� j1n<�7� +�IJ��+�LW����S�t�����6C�/�\�uF>-}}u@]������ ���&8���X����ơ���@|(�&��Ah���o�Kjt�3-���l1NWc�j�>Z�@]��*�Շda�����av[Qw���w:�BO�i75�3{�ӈѯ,��_?zs������HXlF��@�/��rx�<t����D��>*t|Dž�i�P�b;����2�jJr*���8�������U����eYvK�q��с�8��GЯs��HT�+��N�hEȫp[���g.Q-M��N�\k�׃B����̶��K +�Q7Ӑ� +:��T+C,�J\[�_L�&ҡ��#L+!�ȗ�v�f�D�+�~�Jj�{�E��]��p� ���,s=����pP���j�BEs�������P*��UC��6uwp�f\���c�'�~nfY��?�t�p[��_\N��i'�Q��&�"H�����L�����E�뷨9'Ku[�K�6�����>ka� +���e�[/�=ڢ��Ϩ b��r�gY�VEJ0R�V���B�!���]�j��t4�gwvo���7�����{��dB�gN]NW|�I�G���Cy���o{���J�sRG��Z�l�4���K>F���l2��|���J��4�r3��Y�|춄���O�k�w0Ĭ������ߟ�����m~�]����JlA���j$VDbRt)?Ww|ܔv�Y��HIV�c���M�L�����>'4��� rvX������Q�n�{��3�j��9A��x��0�^i���J�`cŋ�2� �g��K��V��Y3!w�og�9����}����DQ��美-�{�5N�@�겹�e��ա�*�T^h�`�'��]m�����k��,c����a��g�䕩�� ���M&��.Dq�7����o�B�}[��百��^�͍l��x�zܩ������"PI�dJ���ƺ���gfo��rד��m�3^9��Z�t�HQ?��<�ơ��{�5�2�qK��$�I���_a��+|S����zR*����t�seW�����ʑ���i���b�c�z�[=��Hh�����h���%��ʏ������*�dg�q#�)�tY��e�BV�m�z0�l��$P ���Q8���uL��5��Զw����e�g��U�V��33�j�v"�іB���&P���<)u"��%��C�(R�%�H��v#�xQ�+,GWU�]]��|;�҆�ш��!��� +���z?��k���M��n��`Z��IF�J�z�g�ЫBi(s;K;e5��#��zm��I2�1�ښKX�#��"�r*�M֬����; �#���w4�k^Y +m� +,�r'���s�֞�=S���w��.������y�qj�]cAt�i{Ŗb��FKo~�ɲk)�+n���|NT���'�mY?��*�z��!b� ��Ƣ�������c_- +��] KbfR:�;I�&�*2<)[V��ߒ_~O(�4������#���!ØcMSw�;� C�^DP�շ���v���S !I<�*퐄K?�����QrVn�%�R.C8����Lb��qT�FhWh5G����[�%����(�n@��t���a�'i�v���)�`u�$F�@����c��l<���V�Ԓ��)�����^Յ��$QSW?٬v˞'R��V��K��*� 2<��X����#�e���el��1}�0g��% ����+*$/c�Y,�z�$M�]v3+���`9O���ִ]�,�C ���+~�lc�-�>E�Uo�W_�?�=$% !lOA +��bG�(�(�w���y��4�m dv���� �K5�.�ES��1�)����]�P�+�ކ�2�l�^���Y��?Շ��*�5}�A��w+��y��?�L'�Ku2R����]:C� +VQ�q�Ռ�T�~�?�/6�d��m�ɿ�\�Dnw��X�G��y];p� +�R�E��*���j��!9;���a�2O��+ͣ��D����.�`1�aE�/%T��8x�֘�:�ο���0�Y�)T|��L��~�@�Rt�|dۆl#/�`��� ��aq��Fz�\�_K�_�g��~��u�Pԑ���9��n��^��|:����6lU־�Ș6{���G����Ǫ1m��tN�Q?�!E�� +g^�ؗQ�>L<���{�������N��<�v���Ҕ����G��0��b�B + +[�07Z�56ӷ e�."����������C�FƼ�G mu:�o�����]\�Y����T/�Y�6q�vMK�� cb���0�aƥ�N���S�:�\Rf�"�Z��K���t��#��/g^U8~o��HOJ�I>�_���E�d&�s<��v�#'S�膀�5�H��K]��<i�� ��z�=E� +�X�uI/�1r2�i�hU�h\Hd����a��!o;�F��9��W.��q�����|� wjY�j��}�akp7�`���g�����?/�$�2$�X�?�ӝ�@�������ʿ5T�-���p�~�q����aj�AtF�*���/-h���ݵIc��nt'�Uj���T��1�_l����`(�X�z}�fӖ��M�����!��ɰo��4RP��sS�S��+�����Y���T����"�n�H�DQ�p�^��0,e�z%����I=�gymO�{,6������,��(�+���"@�!ʚ����{\c�c +��=�������AA&�?�|>�v��X�HI��'���j�g�ҟѐ�:�G'2E�0}�1t���;�h#o �~峊�ƻ5�_��+w:�<��*�� +k?_��.P���6��0�F�P�f�k����q��+��:v8&R;#�X�R*��+�� ���]��'Qו� e�\o�uF��<.���lrN�[D/����6� X�K��a�Q��_]�Ȓp�q@@�u��U�����k��#�$�Մ`�X����cKptzy錔��� AIB�ζt36� �|�E�[����ϝ>�v�圱�5GD-�?\T�u�� +Z$��"��qr���,�8jL�����ŅK;J�2p�rݷ����\s~�����a~�Ѳ$:�cNLJ����j��ux�L>�� ͋��y���->��j��Łyn����c>�yR��X�PHi�d�{��G�%�ź����Q�xz �qKʽ����w���ǟ�;V>|�F�����z`G���a������\��x����m����I6.�r�����v�� �kz�7ٌ��(I����(�^ +endstream +endobj +1546 0 obj +<< +/Type /FontDescriptor +/FontName /SYFPBV+CMMI10 +/Flags 4 +/FontBBox [-32 -250 1048 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 72 +/XHeight 431 +/CharSet (/greater/less) +/FontFile 1545 0 R +>> +endobj +1547 0 obj +<< +/Length1 1398 +/Length2 5932 +/Length3 0 +/Length 6896 +/Filter /FlateDecode +>> +stream +xڍtTS��.�HSiJ���kiҋt�EZ!��ޤ�M�" � M@��"��4�",��;��u��Z;{f��w��ٜlw �0�U'KJ����,*��sr"q(�_79�1��Ġ��@���}�0��A(�" +@ĥ ���`@���.(�<�v����A#��JWw��#̿^8/����%�;PpA�#�04� �9"\�'�a(��G"p>�(�#�ùJ {yy �\�BwY^��s�X��'��50�sA��L��0tDb�� 0�8/�;�;PH8��gx�����p�@]�uE��������w@� �.�7�W!$�w2Ǹ���>H�`�D!�]U-!�7N����~a(,��!Q0[<�w�0@UA���;�t�a��Hԯ���߲ +�N ��@���SF�#��k���Yg4���װG��� a��*l�F�y ԕ�B�.���8� +��%*! + ���7�Q�WyCW�� �?���+�����G�#��~X�'��{ ���w��9�!�8��D���:ލ��c�����܃��_��Y��e�A�|���_a5#CU�?�;�����E��A(�@ `�����e����'Wm��������_-{�e��_u��,��������`(�@����;��F�_U�_,��T=P��a����#sA�|������������P��j#�.�U���JP@;��,���#��Ho��]$���3�F���B�w1X䯏>��^`pg��'��W������ه +���%<�8�sw����W�����P;��oj�Bh��g��1���,��Y/G����q���pw�7���e�V:ፀ������Ü��Z�j��W��oe���-�"�u��Y/&<ʙլP}�Q�rj�Qt;��0��\��G�@���M�ĩ�)~���S�� +L�Y��ܻ ��R����9tpR��{=���u�\��Fx�Nk{my�����%}��^��w�%���Oq�:Y�2����^5To�{稻X:b�5<CV�9"p�*ҽ��b$5�s�W�y~ɢ�U�U�3�.`�g �U*L}��`�Db��B����Ua��GLPƱ(�3T"#o�=�!��Nf^U?���td���;��eE�H3O�������X��j����I>b�������8|�ɐ���.��l �2r%n띊ke��ذz1�_J�d�Pw^�V�����7�[BF��-g&5v�e��)�{ k��'F).�i�)��H��r�������$�U��$ob��k���g�$��YP� ����B�pt���=)��u� T*�3�h-��-���Tb�����������u�/23����<U�N�����4��xplK\1I����"��Lb���Pv����r�_����)?Kk+[�Q���rfK��=&�kǓ ��S����]Gc�iuȦ����л�R>�.�<?O�����jm�G��9���#n�¨�sKb�>T�z��pMM���(����$�&2*Rהc�mI�_��xp[z.#0������h���C���K�XP֫����Ȇ��|�x�Jgi1��u� P����|m�X�����Tvé�|.�������ޜ�pCl;by�ƻ�d�M��!��-��A����*62muu��U���A�sG�=���<���K�^���ث����#R��Z��E��o��a=�w���A�z8��&Y8����'�9)��w��sA���lILD3�qchÁ��Ƽ��S�� +�S����LJ=Hf �/������s�|G�әA�r +'_?X)#H�YeN�u{X�%�E��2����U8|�$v5\m�'����l�M�c�{�����jG�\����~Wz�+N@�,�j�Q�L*�yɿ]�V+Vh�/��z{�Zu[b�1$-�l+��ޕFM��X\5�od�ް��F'�",~w{�朏���Qiztq�^/l��[+�2���'���[�Ci�<�'T+���th1EC��U��ca�����/LS�@x��ra2�!7����:���Yԥ�7��8�H?�3�~�gi�X���!);�����'y= �Pćfܒi���2stWg�_~Is^��;�� +�������w�Ӹ�O���%ay:�b/9�ͷ�&T#��Y���7�͎;��N�k���mj�C>��:r�g�rd%����y�`�j�+�|8xx�J���Q�)���E�����x��bJ�/�*�����q�<d���a��&���V��C0�l����\���ZE� +���;�8�嚦^�¡��w5N�F��GϤR���-N�xȴ/��9�D]8~�Q4 +�2rZ�]C�������H�=R�+�u�,����tW�^�Y�gG�o���Nk�=h��,���?V5Qz�\���Wc��6WhN���6��&�y���9�*���Z�(����F1�ɒ!����X�⻠O�O>��?@�ع#fk���;����9�j�b}��"^�M��Щ�� &��-@�ào���>�MP7Jm�t�o��`�!OȿC��eq������~�����C�Sel���B�Y���f'�gf~N���3#j�.c����p��K]�a� Vg5���'�*���s���V���nF�G�B�[,� �q�.��o>��Jׂ���UQ]��rH`�}�8��z������b}���B�y��K��C�CD���t˻2�06�\�\M6�y��̥>1(��;������/o'P�cd����l�C�?���$���Nw�-��%NC�{�3���R��� CSLC?����[�j�t�]�X¤�$��v�io�n���K�˩l��K��//�mŦ'�~'�ɏp>nl=�p��3vK�:��L��3+p�yH��0�|�l���K�PS3��5����2<�Lj)�����E����O�I�3F毊�n��_�a[gм�W;W���,�y*�u��g���;���l`>�~�K8��S��szT���e���ٛ�/+����a ,[�4s;�.9$f���������r���e��$�S�\b�+��r�2A;�p40�Ƙ���Z��4 4�8������6$>������>|Uw-w���.[�0*�S��mp�n�&5�$�R�&��[\��O D�� ����l^NA��!{�@�.oi-I7���S��G)L�g��E-�{;���n_��{7:ޟ>ͫ;%���Hm��x�8�Tx�ҩS��LsB�얘[l�~F���ej9�SM5k'��}���h����;EvK���T�R�z���Gm�5ϫ��a�#W;�$����z4��������#��z'� s� +�_�@I�1�uZӽh��b�sZ�h?�]9�10���*�C>����e��$ ���j�W��Ã�B���7;��~N�ֈw3t���L^�m� �|}=gٹ��{�wPd�3������������C�Z��2{���N�WG�����B�� +4�\,�A��_������K�mKi@�n����Q��Zy��=��D)!v�'a��%���1��ߟ.�pr�Z��j�ݽ]A��UI9���{���.�����P)�=��9ݗ���k�T�#��;=��F\�V.��:�jB�ժg#()�c��e�I���`~+t��3�Ur%�{�;�*ь�_�vcOEn�p�<a�5����Tk��+�����a�5�O�b%F\�S���"��}�v�$��mIK{�%��5�ͮ40�)36���m)��[h�U���0���k鬟B��o<o< V�8qJ�$���+'�Ng���n�H�������I?�51)�L�5k�M:]m�<�apz�~�s ���䯷�� �K��M�I�ɂ�����dW�Qąmtl�gW���"�:D%�!q�K� ���x��w65Ѡ�͠A�徙ѰǷ[6����6�F�I����E>�6jg�������$!ށ���&eW�����$�D��[\-�[��S߽v��"٨�8 ��4��|G���@4������(VRɃ�3@'�uo#���/ۉ���R�jl�r�z+��#���$mG���]��y!vR����>�ű�xލ�#�ZS�B��R�Ȝ/S�����v��|���)����|RPu���fIt��& �a�yI��|�6Q�a����e�e��/ߺT�^Xq 4k`Z��+Ҿ��bW���~�K�t�?L��ȇ�P~}NN�t�8��#'�ƭ�[�=����q����y��7��lU�!���4�9�G�q��E��)�ԇYǐ!�&1́".��A�'X�H� b��(��sÇ9�v��,C=��dRFJn��q\럔�N��&š7v�e-�O�0S��o���?B<��xqETEX��kŧ�J�G��&�g����m��e�Rq\~$A�ȱ��f3�q����!��l��� �0�C��~X�+��Gi-G)�5��#7�� T�]�'�xFN�|R��l�S��="R�|H9�zo"�L�h3@"8�Ɓ7�31�B(��ި�� +��w���:A�Mă�����`��+C;gz�?���g/�\����q����7���j���B����o~Kݨ�8��|ik��3��R���2��pbR{����q+�T`��Y=x���i�̘�|)'V���FA=����`ڝ/��h�mm�,~A��H�iZKv8�뽈�r�����Z���e�3ѿK�hS"Y��㏽w��<�m��f���h;8�\��:�,&��5�N�:����>�4��#���5�EJ�E�c� K�jJg��y��N�B[^&&�Z���Q�[!��Ω������:!�.�ϯl�ܶy�.�G�g\u�g@���Ŀ�sk]-7©��-Q���)-�{}�'�Ȋϩ7�Ηc� ��[8����Ơ1;١B� ��;�|dzśLe�uˬo�Kא�c �{9��'��,�����/���eHx�T��`PS���o�f�r�K���ɋf[H��r�j����9�6��Ʋf�F&L�$��-����W!7lo��rET��,�o\��E�<�|i��]�KВ��B����$��L}��֔������L 4�'�삘ps��=�]Wk���%�7�"+�a��>�����#dg?�e:�m�(gB�v�YByK�V�Ɣ'd[]ߘk�+4�kC0_c�.�%�4 G�bb[ce\�H�5L�_Tpvg���:`�yF,ύ�1�!�.W��6�<_ٯsB�D��^�����S�5R��n�n#���iԜ���qQB\��U4(f��~�NLJ���T0駆f��)w��e;�����9��a_��^�gb�Q���i^��+'Sgj����&+��rbO�����+�����X83�]9V���=�f+�]��36�)�4뀵<|+�b#�Msi��Θ����G��G) �$G��4|i�V�|���i�F�Ux+��.��e�_��j�)_ڹɔ=!�N���[����ʢns�t�> �ߦO�q�lR�$^�㢿�����G�i&���|�6)�t2J����h����0��ۓ��I�(r�B�NJqj݃�Ԥ��P�O�����O-u���ؤ:U����P�GEf�\�+�����5O\�c7��Z�oV���r��ŗt��CK��QH��Јƍ<��b��ZV�"k����c�o�e?�Ʃ�.;y�u��>����V�su��Hl#��$3��� e�A*��J�i�����7$�2 d G{�� PD��<W�>�t�{�!�E�>1�o����h����5h䤛��3��!�;r�B@�kxi��_���>�d!{w�ȝ���z/�×c���т��%�]KbO�u6N�5���/1۾�@�Z��cX���ȸ�ujF>E�hB�����ǃ<c��=7���짼�1�(��Y�{�]�Za}�ʥ�6И���.O4�O3m[��f�)|��JN�G���4=��'�e��Q��=՝T~C���un};`Q?��[�k�'��L���)[m��ד�J}vW�A9�`Ϣ&���0?���WRV�T�p��������7�=��P�s�r=�9��z��rQ����R!h�}o��=S����J��0�LsȰ����4(� ���7 �'c�F��9��m��a�]�%Pm�:�lj���`*ψ����|�15�Fp-��ַW�ܲ6�¦�,YTόy6��� +�p��N���v�IwC��I~�@n�����p�s��W��W��nE_��a��:�J����g�MCr�U�1���=_ھ?^X�����-�"b� +=�eȱ��^:~�XZ����[��(T9��1�sz~g)}F���r��%���n(���X��I� R�U��ޭ��K@��XΟ�uF��3�.�\�����Ky�Lb���? ��b �Uh!�q`��a�wCj}X�&*�q��?��7C�N��ں��"eva�]�<�����=˳��U�1Y"�~=�_��6A�q9F�NODŰ�5a�� �{G��٣�����.o�G�#�Z��z��gY��a=U�O&˓2L s"DyD�1��1ྡྷ�Gd�Ż/iK�g�͞r��(Lrh�wXU���^��ޭ�w�I`j�|?�N�X�Q�Ӹs��Dy��M�뙕sT&.]��� +L)���kR�Ͷ�U!�;�+��ti^&�E=g��З�G�Zz�A�l�rS_�NY�-0z{���<�b����Q�JX���=�˰�r�O R���ځ���ewF���0�E1�y�e��ï�[ȳ� ie�Ra)i�)�chZ����[�M? +�!����qD������S�猡�U�ؖ��f$ �-��D7����oZ� +endstream +endobj +1548 0 obj +<< +/Type /FontDescriptor +/FontName /GNUTFA+CMMI8 +/Flags 4 +/FontBBox [-24 -250 1110 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 78 +/XHeight 431 +/CharSet (/arrowhookright) +/FontFile 1547 0 R +>> +endobj +1549 0 obj +<< +/Length1 1388 +/Length2 5940 +/Length3 0 +/Length 6890 +/Filter /FlateDecode +>> +stream +xڍtTT��.�����C +"0tHw��H�0�303��� ]ҩ�t�t#�H� H�t��8����]{������{�g�3����Yí �p���(P��R����@�� ;����&a7� �P8L�9( F�Ba���0���#�_�/"�/*�@�9��E����P�� Hv��'jk���� �����>��s� �`�B�A�0� G�>��<���S��r���sww�9!y�[i���w(���� � ր_�AN�?����?z}� ����0 +G(Cb"\a��S��� �q���8k�qx�{7�~^����+�;Ý�A0O(�`u��t�5yQ������#� �ă�@PG���w� �������xH0�B�"���F���s�J0k���B���O���1����g�0�;��`�Y����ՙ�uq��)�u��H�������@1QA1!��������Jo���m����L���w�`���@m �������m��D�����Q�+�-F��5�揌Y>�0b����z�}2���s��������i�*q����6yy���G@�# �E�����?�肠���'V f�D�isO�j��/8�����d�pl!�����(c^���X�����,�/��wCʮ���͜�����u���A�+ +��-8���v}��Z-�5��鿭j(� r0[�y��x�B�P�2�b�E���`�����0�. ��s�D��e���� 1��c!1lC�^�/���?�P���ֿ�' ,�! O��1�0���Pk��oh�xap&���`G��Z����� FK��`WS�7 0e�%��7��|����W5�T��q�Y���K>1��}F��Q�X���H��(R��ͯ�̾M[��$sq����^����=�M�{V1S�G��^nj,S X9O�$�!z�t��l'�����g��_�5��A]�,�ܬ��^Q��I�(n����h�o�.���~֪St�Z�٫$�T ��S�8���}���w;�������^�(��3* +�Ϳ!��z綝J�e�rKvۺ�x�+�J��}�m����;����h'OS%�EjN�@��Pl��X����"��p��C��G9��AX��˼�`yA �f4m{�s�.R8��#G���GOo`I���Ȣ]�A�����7G߳+�g�Z\\��Ƥ���3u��&�4�3��ct徒�Z��L�V��9<D'=(\��8��F�~�pW�~���8���ee�'P λ��R������m�!/�����&��N�:���$�&GV?�"0�e�y\q�:2���[�&�2�/�$����:�V��C������G��c�Bh�"6P��9��9�{�o�x��z���{��J=!�7+�)b� �2�}cB�!c�Hr��ʪ�W�^�ŦI��{D��#�k�<C5�q��^/˕�ْ��ڣ*���Z�M&#ˮeҘ��AsgqМ��l������W���r9�� ��qq.G��� -�Mzo�ӏ�y_~��d�8��(A�U�S;��n���A�бâ-"�U�A;m?6v�]�Ԥq.'��܍���?'uw5���ȨO����z; ���էwB-ܾ�&��:m��b�M��:��#����Ж3���PԠ����'n�U��[�گ�!B� Uu�d�"�+Ӣ��,&�W���k�����i��<�Ⱥ��^ܣ�\��������Tc"X=ʭ�.sتh�ls�iX�6���������j��W�]�A �U�[�����D �x�`ڽ.B��i��=�;.o�T�^�l�1f��b-�x���4U�������ӕ��'�͆W +y��®����F/�+����k�Q�9u�Vӻ�0��Μ��S���8�lq��<�ư�����ޞ�x^��,��7�) +�R���Y#���#]�;�'�8� �Hw8��ݽr^;q�Q^�l�`����,��䈈{��M�<�*����SРZU����sZ| OOwБ�N �O`?�Т�v��%饏�h��a;{>9�IB�s�ǂu3�(~��յ�#�\K�;�v�Q�]�a���a0��Ò'�8=��{N����E�óV������va�`�+"��^S��v�:�~��A�W?���L�\>�u��]�ڽ<�\(��4��w�jH!���ai��a�ie�0�d5�[��F�ȇ>1���c���h^4�Ч�X:�����v,�[�6Y�S}[1�^{&�]���A�E��WYW��Xl����5�v�ޫڨ���r�"�n5��a�x��Q���٢%>A��C�e�n���b0�T����oc��;��ǔ4Oe9����ߐ��䍕Tih�6���}��֩���y�,��|f}r5Ԯ�e9g1su���[�t0�}���c�r�]�Tn��o��O���'5b�c��bI��\���(��-��_�zՆ������r"]m�j�ǐ/Œ[ƺ��+鑜y�5?��;�n��l �N� +K������D�0���-�Aq�� +y��͠)ٲ���ئK��GE7sy켲N��lpi>���~�����\�*���$���y_�z�����3O�&��X��c?\=�`J�;;�$.Y��2Tğ��l3XMW��%��mؗA�S���q� +cF��Mnڸķ���\x���г����x�p�'3�]V�r<9w,9@��H"�>�9�]h���b��]��w<��A��/�wN�(eܾ�j�ݵ�>;�z9���wWx +�T�L��+�Q��Z>Пb�����Oiw̢�<����kT�D*��8�H���6��ޚ���g�,ڮUUS����z.!�1�yذh�Qo��V����X�fR`��-�V����1��-���\��.q@�k��=�!�^\��X��v����"=U�}�ڏ�;��-�? H��e���� D����%��Q��lk�{�ˑ��{�\7xr�'͈G?v��? +N��w�j��|�,jlC���wCL�ĊJC��jb-���#���������W�ʰl���,�d��)9���U_����5�����1�+��R���wR&��������Ǽ%�ș$Gw ���[p'@l$5��?F�ӹ��#C6RN�[ �7�c�W:� �Q� +�1�d&��qpu5~������OK��r?�l�\�%�T\ՋRC������Q�����tE���[�6E��t����u܂���yDɝ�GЧ�y^�K��~�g��\C�p����~�=�Q���~��mk.����v�`��p�X�>�{��Q������佶�����?�!�ڴ�'�e���$d��i�)O]4"Ϩ��{6i�5����'�x����cT�dcJ�c����W�6eZXCMޞ۽��]�8s=���2-��ϭ���� {�]^C��R��I_�s�!��V6�#�azsi;uTk k@���Lޙ�����s.�4����G*��m�v�S,�؈�LlSQ����I�eO���o���T��j���h����b,^�� fI�]��h7%��w/ݰ[��o8��O!d����� GB��rC�8���c�����6�h�4_��%�4�����eƧ�o^o�a/��f_L�ʫ�&��1ȏ�Oڪ��dfL\y)�:c�oqL��;��^R�M۲&�{�Xd��GC�8��D���U9)2_!8L�I��a��C�z���!4�nz:�c�x'��oŝ¿�r�<�:i���+�.`$�`?�)��Զ�|+�T<_ +�00x`�̦�7.-�r�zSm��č�>Y�tS�tw"��V?�H���-�Ȓ`�w�_&?�Y��S��̨���;ڇ-8�S�P)39�IH&M��5���l�^y_Ӊ��[���(�I��:g�8�����������@�pd:��zH����0;��(�r%��܈M +�な�iˣ�-4 +E��yp�;O����ߤ��l13j� |�8�}��I�~h�g�ڮRUz]�R���\$ʈ6Qj*9�GPK�@L�}B���������s�&/�.���TlN���39)�/��S��z�/nM�y� �$@�^]�IX�6���:5፵W�ލ�m�X���;�!���!S��}��B�/�<Ͼù`m)��x��S�����UR�����%�D.z2/��YFm���lO�pDyL��n~��-|Fcɷ&��PW�}�/��%M+c��&��љWt/�n�kЙ�Je�>�}�l� D�4��M/jֶ~씡�b��bl���sep /,uz��JkG���d�4�����hWT���~�@a�O���K�㳞I�+��'R��Z�� ��ᇄ�+���֡�sj�HhQ�߀����r����Ɛ� +��X�Ͻ�ᜲ������) ��L� +2�KǛ�9�g]���}٠�p��K�\����˩1��jaٝ=�`7��$I�p�xw��� o�(���i���3R�~$�U�՜�*�myI�d�vǐ��EyӻH@ʦ��+o8�n���ɠwa|y�i�//����v��I�G�n3�a�B!ޒ�"�G�ÆZ��W�ޅ�ٯ%2��9�6��S�x��y�հr*b4s��aQ*�L�Iu�*x(A����[�I7vc3��:w���U��N��@i@Za`"����ぱ�&�O<0�>����WW��+ri?�䰂N v�S"��s�i��Շߌ���>�N�d?�<ˍ����*���j��(>�r�}�@���\����|i�8�6`��>�reX5�0$rr�5�SJ�e��q�+�u��6%ώ�������r��WZ���������� ���%]�1�0U8* �X��ٟ����#���i��Tq��#� 8'Y\�D �{���Kko<� !���s�7 ӈ�*>)��PF���\�SQ�8V� ���"p�煮�x��zX����{���m���&ˤ���3�������=@�9�z�#"d}���H��5�Bqx��Z�\"�<͙����O^��T��-�*��)&�����H��������BF��>��,,���4��$m�x_�r�QFRW3��N�������4�_�N�.�r�Z�>����I�p�/��wC�:O�V��H�S�#�O�=���4k�+���ӻ�p�H+��wd��v;�~)U�W�<|K������$)܄���)�h*��cwW�ߧ�)�F�ڵd]��u)�Zg�*��o���D��@�n�`����-)���=��Pz����}%����A@I�*Nn��:\��{����'�ܼ]�����Tޚ6u�ofOv��Aג!o�$�i���,晵J3�3[��Qg1{zޑ��Wi�[��H���y=6�8?g\�ށm� O2�7BO�f�p�+ +������!��� u���@�n�&ǃ��.wRq/�I�ޚ�;��_�,lV>���yMb��^O[$�^'lw��M�h#�{�z7&��9�l�ֲ��,v��W�ޫ�%4U���9Pa� ���/s�˭n�E0UJma���R�yC~M����h�� U�ULcg$�z�ނ�+ב�����d1��&�g��ُ=nG�E*�M�5�y���I�7�E�z�bA�i۷)��K��-�Z�qV��sP1��eQ�ی����y��N��r��2`�š���EgֺU��o���}�q~���l�m�-p��h��슄���w��Z�����U�?L&V�hm�IhlZ����+1 +NjhΠ+ +I�sd�<V%z�H ������`�d=Mf�_�CVc��08Z���[�ծ%�M�d�ۤj�tpE��/����<�>&3��i��V�*#��cǍ��%lp?dЇ��k.�^7w�%�knng�����Ԉ>�Ɂ����/Ո� TOU�=�h�������O'_c�O�I�7��9�����ҩR���у��0�l��DE���G��&���l0����S;��-����+a@���Զ�Z�&�rCwA����D}I���$Z��.�� P~z-�?hffd�1�<���V�H!�$P���˶��&N~�x�k����v���:�/g�Z(���6� +we�i~~�e� �WMFgv���$u�;�r�8�*y�F��Q����컔�!����e��в��3)71ǒ���{:��sr2�ԼW�d'3Ro�R�5�vF�6�z|x$� +9��N��,�β�I�X+v�uӋB�)�����F��W�V����e�Gg���g�L��F^�:8�*��;�O"��㺔�,n�bUk�<"�k�N_u���˝�G�����_'Xk�k�A�r�>�j���tN���}�}��ʪ��\3Y�Q��@jM��7��!{/TyV:z���g���Ϻt>Y<�?���� u�c�^��ߟ�3������^�R�g�퀈�������k��?N�79�!'A2�.(�Y� a�3O�%I��Lf뺄�+N��~�[�ӑ��G���<��&���X��ek(Q�gСCɶ��K0]��k;��0M�|�Pi9�f<�l��fH�N6�Z� +wD%�bb+݀�b[�zx���2�#J�tY3&s���KYi�T=�m�ռ��|l��n�ۖcGZ�|[��J7��^*�K�:e�v=j��)(u�2� +ՐRX���������g:��g[���G$�A���_�\De)��h�'�辊�'����B�+Ei�0��'H�q6��J���c��N4�E����@��Iw���`�m$�t�Akj��&u���h���]E0�v���@|S� +endstream +endobj +1550 0 obj +<< +/Type /FontDescriptor +/FontName /QMHUCV+CMMI9 +/Flags 4 +/FontBBox [-29 -250 1075 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 74 +/XHeight 431 +/CharSet (/less) +/FontFile 1549 0 R +>> +endobj +1551 0 obj +<< +/Length1 1386 +/Length2 6039 +/Length3 0 +/Length 6990 +/Filter /FlateDecode +>> +stream +xڍxTSۺ5Ҥ#H7 �& �w��AjHB�$t�^�7�J�]���(]zQA^�x�������}�kk��d30T��`�($F$���[��� PT!��4�c���$�f04��������T�,P���D�@����4HB���RQ��U� +��C!ahN���������%���III�(��<�0��8�ܰ!`���0��H�#���K{{{���B('y^�7�0��a^0(����=���hB$��g8�/�1�� ���C��!�H(���0���Ð�u���l�$�W�?ѿ���������#���p���#�����H�/ �Fa��^`8��nPW2���� �c�Bh8�¿�`�Y UA����4ɯ�T�0v�}���+���{�GB��t6E�x´T�`�&�ۜ`�PJ\\�=��| �¿ +����~;��3������1`�pG��� ��0��@��t�sE�p��s�#I��k�9��ƞ��`���������0( +���7����iݷ4��3���(����@PJ��@�� 1@�?������X-�# + �W��}��e�?��#^�?s顰̅x�Mtk�������;����_Y�W��wG��o?�_���v�#|� ����`U���j��Ps�_�ՅA�n����jPB:a-�+����V����p��/��e7��7 3@���0�( �|X�A\�w4���]0���YW AA�MDL������`��������|~� ,�Da�!�쌁�G�ɯ���ؙ�hW�98�r����������L�V�{�[�0�B2?��Ȅ���8�Ub��<J����d�-��z���Y�0[cꁲ=��~��\y��l����1�W�!����U�}�¡oG��`�P�Ӹ��U��dC +{+|+�T�ً����_�]v���Km��%��lL�x���m�G�l˘aKk�j�LO-��K�G��3�8�o��V Y�?���,zX��[#^I�p��[�H� mr�f4��ةJyz;C�[$�"����颁��AQ�F'=����4y֣�f��{���rL� �ѷ��8�>�P欁�g�Ո" +z��X�]�t�Q�eg�:�Mq��Dm�LП��g'�Dl������*� X�G�.d�4��4Zxzl.˞#w�N���+-n�"�7Z^w�D��8���N�$Ytfo�m%7k����2�S��i�Cu��&�'N���wi��W���`O4�(4�zg�����Gl)�<MIN������B���'r�-r�����'����$R֭�0��v�6��c_X��V��뾳}��=��$x�v�ņ��TȾ��b��O� ;������?N֏� +,���#bҺ��Vힾa�?����rb���;}�G���)�>�ð�� {x1��)Q�M���m����X�㸅ȣ�c��7R�ՙ�ݵwۍF�=��U��sR��պ�\R����fA�d'��d���P�Y���c�BA{��hۊ�QK,U�w ���^�4mu���� gxš�?�D?|��������p{����j�n+A��ݥң��"�ę7Ej�:�"�v"�7�[�Q���$�[>S7����;<�Qd����n�e����f�&N���J[�D�V���ҡ�5r=gU�w8(��B�����J�����3{9Π����su�wo��!�!|���_�m�����T�E�Q����kW�M%�i݈{1���:���O;̴�LV����AOE�;�7�4�7L�������E?��!�һ�$}��MaR4͕�z�Wd���'~��� �3C�?~�Ֆ����S�v[&-�Nn䃼@��jie�5{左��[�F��T���s U�Iȧ���Fr):]����JZ����Y���4%P�!M?Wșh�Ϗ$�ء��aS�zG���Q4c��Q˚��]��W��V��?�X[t8���4�"S�e ��=y�<#0����lZ��p\������7.�E���{:pU�"U�^����hz���zIǶH���aITX�>oxYPb��'yq���)F~Oi��7��&l�T�?ˮ�ge�(��l�~90��q�V9�]\��|>�\��*�Z�d�x����v��]W}�[�?+gM)e Pj�o}q�}��G.A���j��`��{���ƴ5�=��G3W��C*IDz�Z3��+<��p�ʊ-o6���`0��r�����e��Nc�B�č�O[�%��,qe9��E^��Y&�D�Y�u���g�46���A��ѓC���������.�!�1w���Ն�O3�dz�8{Μ�o������w�z��B�>W�-�� �u�˳m�7fHqw0���LgJ��+�h��R��7�RI��[<�]6C�3�WILg��g�d���glt�yͱJ���R%�5j����0��[��0�r'����m�>�8�i�(�s��>{�m�e��Ǐlp|in���|�;ԙ�vgn��]����I������0S?�� !0j��)n��-R������}E:��/���!#G�㨛�U�9:��o۴?5��f�>���b��?�^\�s���N�Mܥ��b=!�ڌ����8w�n�c\6�����'�2,���Uϼ������r`}Ʀk��^�%�]���q[�9NJ ����[x;N��&"�-5�z��.���6���B�<�������{�������5B��K��~'\}�B������ЄeG��4lz�}]g�$-�!�JX�o�*T���2.�?`��g��l�`)V�� +!���d~�oѣ�nW��?w�ݑH]@ O7}oz]�������y�)�����1��X� +R|[���7�2�7��r�4�UE]�z�a�Ei-��U'�U7�yYh�c��-b�0��kx��'�8�t�x�.Dѳ�k�x%������{�@���! ��f +�nj���uɁ���by蕋�Iv|Ho�������J�8�3$%�ͽl˾&�w���I��b�p�a[rf��R��c�����G�(��]�S��6!b��s~P���^���Ξ�}<ѐ�&A$�㰓[v²s��&�>'�+���S��u����o�R!��O��ωm"��)� g��K�[A�!��ţըC��~moC����| [�P���輱��:R���ǯ�.���n"�cd6�7w��K����6Ù���_��'��Sp�|�,��F��|a.2)��)9����\++�ĺ|�,"bB�nUh<gY�� �9q\nn���>M�E��3ƢQ��/�������~��;�X�T悔 Mqw�Q�,;�[����П��!%�7�QM�9J���0�XH�t��vdK�.�8����J�p�S\d�Y�iہQļJ)N���|[!�=��͚�����QbY�%F~=�Q?cґF՛��^gl�����*��Ҫd_-���E�����i�����;���·'Mc���]L�]�ec�gz��z 6��R�� �k�S�HX��ܕ�j^��T��Q��J�̐��e�4>�c��V/cbje`�r��bq�ؙ�a�Ό���O`k�n�_�E�k�V2B�������DKWi7��Y͎r�K���%�ȑ<�Q�Tn��{_���=+V��4�]7O9kc-gG���z��������K/'�6ƲF=K�� +zn�H����H`ָ�@�x��:��g�V�_y�"�h���;��L�㪀)�xk\(��u�ƛ��[ƻ�G�� �u�ɡr�կ�n]��7�Y!D ��M�c$�ƣ8?�(ۏ�ҩثǥ��8��Sy��n鰃a�1��������y��[�[3��e}�s�<��i�[�e��B%{����h���W%-�(�[��AM�E_�,3摍���Y�3\e|� ,���E�����٥��g�ϺX'wk����+�� ���M��}��vвY��!R�lv]���'k�%z9 {��3��q��F_��4P#�D-���)̫���G\�t@����?��`�#�>/ɷ�khԵ�W��{��|���C����zn�,���)�v��_-�v����w�<�r����3#&��ϕ�Օ���v -�>ı��{ e� +�y�����Ѽ����5OR �d��;,�� +�]k<z�l���K}R���UJ7r���-�U��v�?����Lw>A���\��8]�v��n>���&א�Y��8�Ca"�r7���q��֚��啢s�;<�5���L��l����@.��O��r%Ռǣ=��=+�䂓�6s��S��/�n2~ +}���U��RڈV0f�o�0��p��j2�2fm�˨@�.g^�p�d��t�,P�b�쎆D�Y0��g+*�m��ռ�?s�ngS����~�)n����F�XN�`����f�Le鳨N��}t�����2��m��� ��`^uy���u�'�����c����S�]0 `%O�)�Ĕ�� ��J(����RK0)a��䫌���� "M��O�-5Y@��+횃�-�a�F�����$O8���fh���1*��N>n�i�ȩ.��38�Ep:Z��=g�\�P���_k�n+:X�h߄�oqʑx�Xv:#-�"��]�SY 4{���r�#�}�1E(�B�uY0Պ���c��yOB4/�r���ky��8H��������»��r�C�o��27��n'EPf^�X���|;�8�Ԃ&Q�`YKF����Y4@�F3�n���f�yX�ܤE���)b /c�=�u1�r5�|�!*x]m�:1�LJu������k��gsC�:!��a��\�����݅��xV�fO^��z����3z�:G�/NT�+t�kNQg7�ʯ���6�2�OWN�m��7w�|P�l��U�����(�(?�=$F�_d�2R^�_EU�\U��E"����|�|�w��p_*�IA����ӊ)A���Ĩ�q\���ݱD�?jT��I�?�"+�!������rS�� ;/B��،���1��ПKf�v#�{�P�Old�uk"�'�r��O����P5��K����ֺAy�Y�9Xb��iD�*�������NQ����z��)h�rM���3��Sv���{C��OE�W=U#sSc����/�$��.gK����!�Aj�� +�Cb%�\�c�V� ��1�����B&m.���T2@�"��fU��R_B>����kqQy'�E w؋�,%t��=���/�齗�AA]ޣߑ�RFɓf�ab<Ș�p[�Ci���$�������q���6�qn�y�Q7(���%�C�Y�FXf����r�9��b�R�3ȓPW@я��PH�V��rJU�͋�7��p,�lk��_�*���O��h}�'���yIk�|��N�����-��L��K����R���}şu�a�� +s����j��R�8���Ė8�w_n�oU�m��N��f��S�`�{*j��s���,�W|Ʃ����I�)i��"���flvX��=�5S��]��j}1��w�,oPN��5�b��*�� +]*"Kz�K�M�%)���։u.�M�����C�I��.�L��D��b�#P�3p��A��k�˪kS��E�]�u.��z_|�>�M`q��X��>u"9��=z��ڳa����z����� +��s}�%��p�^��5`,���h������oN~J��xd���~;B� �j�wgTF�CVc���l�S���d��,�i��R�оT����s�IX�a��-�s���*:�EG�-t>��ğ�JX"�[s�s�=d_SK��h��ǧ�'���y~{���j2K`� +Íe�xl���TI�������&�y������ʞZ�ԁ��~��������᪸��nUmV}B�WQ�9<N��6�%fY#=V[A��@��6Ym)�D���W�s��j��D�y���}�lҲ�}8��ÝӜkV9~��)3�0P�{���P#�{��E�$�������k�ߓk�}��_��.'���B��� �?c_�W�A����ض]�<��^:� ��}��ږ5N�(��̠3nϯ��l��E��o�v<��y�F�;�%�߬��Z�?�]�Ҩ�������6��h�~�coe��䕎K�����w���S?�ֺL-�k�w�_�lŸ{���6+(���^>M�D��`�Ͼ�q����n� �/ο�`�i�$�T�������עK�r3ݬk-=����m���x��A]�� +Hb`�#�b��\^y�)D��g�w�06|�b��Nm�P`f&2E%�{E�{S0�d���3�)F�y���!P��ש�݆�mO��/O&������h���@�*-�.�>�͍�$�l�mKP�Y�g5�����PCk-�Ǧ�*\���Z&������_���&���F��LX�?�o�-X���=�8�~������8�.����+���"�=`�Yδ�ߜ7W@�Ce�+�37q�㼮T���w��;?F�z��0| ����/�|;�����������ܘ�:��o�)�Ds� =�K-�a�鴨\�gW�E�<����o4�'�Au�@ +��Uw[���%R��*�:��fa����ܱ@4��H�֥�U���#�O���v5*����?$�h�t�*����c����Ҧ� ��[�O[��M�;/:�/�؊ +�ˍ�+a��F��ʍ�m8��5w8��dS�iMfT��]!�I����X6����J���x#��D��WG�joL6Sssf#S"�� +��� R�{:D�qY�d��_���(��0W�T��6��T�v�A����a��#�I5�D��1H��_mʎ�A�Ƈటk߁w鄍X�D�g]�?�K�� +endstream +endobj +1552 0 obj +<< +/Type /FontDescriptor +/FontName /UEIZYW+CMSY10 +/Flags 4 +/FontBBox [-29 -960 1116 775] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 40 +/XHeight 431 +/CharSet (/asteriskmath) +/FontFile 1551 0 R +>> +endobj +1553 0 obj +<< +/Length1 1376 +/Length2 5989 +/Length3 0 +/Length 6936 +/Filter /FlateDecode +>> +stream +xڍUX�}�FJ� ��F7�HK�0@�6ƈ ���) � J(����KIw#!�(HHJ�g�����ι�s�]���=�������� M�T`h;�4 +'$ +���X��ED�A""b�nnS$����6�c�H4J��0poS���8}4 +����JɉJˉ���DDd�Dc��$��Qp,�[ ��A"p�2�z�A�����҂�*.p +A�!8��"�4AC�p��?R�)8�p�r��� ��� ���H����c<�0�ρ�w!.�ߓ���@S$���m��`�@�� ����w��M����p�o��o� ����EA��N�'�g"$�W0 +E��BP�Hh�t� ��p^8A � �8c��x����~u�Q1B��� ]qX��sD�i���]\�(�?u$�_�����:�О(�?{$ +f�s���� +���V�����pPRDVJJBw½��?ӛz��9E������]���!��H{8����x��8�;����;�y��aH(hG Q�����p��g��1H/ X�=Q���Ͽ�l��Q����WX��BEO�����SUE{}��E�B���@QQI���,���i!�?m�����Gew���u���|���g��h<k�@��In-")������+�c��,�����;��ο�|���� qA:{��I��@���?��ߢՇÐ�.����A�BPA!�d���H��#�w�^p�!u�M��v��RsF���h,��%"�>���N����_.8^>������a?u&&)�`0o��Nb�}��� �{�b2P�B��!@���@{4�s��b@a|��n����#=�������u��i8�LO���a����*TX<���~���h�%��|��w9Ss�M���z_���ˈ� ?�ͣA/���T��8���m�ܞ���&͌�N�^��zdt������b�,\�U|�l�� �l%�t�8�bOe�=T�iZ#��d���뵴�������M�͆� c�� qL����������Ύ4�<ݶr��Z&:����.&�G�:�XU���)�L�]"x� m�`ٺw�8S��[�����a'Vf7M������;^�\q +�m؈ʅ&��n��Ր~U4I���H��7��K؛�>R�R�$��e���_�U��hܨ��E)q˽�)�����v��U�OJYA�d|nQ�G��R�2�V2��X��Dz�[~� +twϫ�u�y������>�3n� nD���%���G|m��`)���_�id�*����Yݱ�Y4����%�s����ׁ�B��qu��Y��k�Ü&�6������<�aU͟�"y��p�C����|�P��7�ᶩ�a�w0>�k[n��Cg(�&�n�=�����P���� &�j�6����;ѪBS�ɧJ�}������N��ϗ�<�V�nI6����%�1$!�b� +2��b���i=�U���s���p��*�k�&��� �p,�3G?}�@�@��F�쾍z���1v�!��Ȧ�?� � rM�I��[w�Y�Ξ&�����N�S\�V��8Bns\��3�ljY��ٹF h��r\���L������j4�0c��AQ��ҙCzrEB�;$t����;Ty�_$��V�dJF�F9R1H�}Nf�>������l�J5��G1 �M+��}fm���?����:�Y�[�U�-X^ˬt��C-��*"1z+K̫�iI(�'��}0N>�F��L檥��Z�od�.Ά8�ar�� o�Ie���l�,�^�ݜ-P�U`��s�Q[����4����Hy��e<s�/��$Jz�� �� �� �:�K�4��jN��7��L/�v�L����������hB�t>PW*x.G�f8�a�� +_o����b�r�}���?&ȥ)�~�^���j9L��T�l�]�@1�v �6Sv藄�����t� � +��0W�>�p�u���t�����+D +x3بN��:�)�w��ȍ˪i��-�G6SXT]�������LQ�D���ȹ0ސ�D��RC}��)4֖.�-���{�g�k%aܹI��3�v? +�k^����5���6g�Á�zL�W���9w�j�)��|��E�������+5w�\O��TՁ4��S�G3��#����%�?t��+X�$ 6J�4�Z�p^Ѯ�"�l�@ٸR7�;�������Eh[t�_��J#�}g�H.0�\�G���GR7��io;n|����haA ��Wr�k���n����k�~�|cr�0�t�3�~���Qd1���QP�o������(��)���b���,Z��}]�vԟ���y���9�2:nj�y��-���R�{J���$@ڼo|�#U5��,d��X_]Lj��t��ٻ��V.'|�=2��C}(O�¹����KP�a�`�����v���*T��]�e�s�x���8�f|�V^���e�'���N���(�А�]����< פ8�L>Z=P�,;8yq85Ri��) W�T�LYΎ:����YpW�U$���2�-�آ9��8�gRR�o=[� G9\�3Rg�X�" +��w�a�\��I|W-�I<���5�;��͒;��pF4��'�A3j�M����+�G,�k|�������̵�py*]߬�fPa�s��,��.5h%�Q^�*�&j�]���βyc���|�;�M/�^�J�(� +�A�$��7�CtNg�`E�|�y'�����{`Du�Qֺ��m���Y���npϤp�%H�V�*h���9�q�軜���O���ɵ�s?]|U���O�֙z��#��B�\�&��B���߫l�BXR���E=o�9���2�i3��=�U����d�|P�I�NYڣK�n��9��[��&$��������t�m��O��7<���d/��qE�F�@�j~���%G�F�!���+���iߋ�D;�TA42^��M^�� +�>�J'GxO2�N&f@��7�<��wA��u���c1�>�z|=b�#�i�}�T��4D�w�´�{o�&��5|c2&�"p�5�K�fAJ�{b\Ȟ���'�I� +̓>Qm7�%2g�"3-m]rm�|�J���46���7o�h�+coFt�?�#` kRj�s|IeV�'��d��+S3Y�)>d�j'�!�����f�Q&���&)�b旓���b{��A���y�-���zageU��,9���4�Q��n�E�:���5��=�}z���N,�!@߫��~���=0����&�ݝ��&�>OѪ�r���_�Mj~@�� N8�/z�#��$B��~�FU�鑔!������>gY�sF��E�����]M�6T�i�7���~�Z\s��0'>[������-��=L��r�D��u*Dc� �&�D҇���`�'_����f��g/LO +n�/�lDz�'9ϳ�c�'%*|��m$Оϟ��a��|�+�8i]�[H*�A<��W~f(B�Tlz�<��H�xN(^��x-�>+�w<:@X9��{���ă���c��H���|�j�Cfᖋ{�}�Ʌ�������x +�b���>�g}oô��2�����DU]�3��X5�h�r��IC��m��[���"��Fj5�(��H�OE>�h¡Z���/�#�# +7)�m���x�}��R +]���^ߴ(�U��~V����ƙ6<?�����|�k�h��tٖ�t��-O�'/fʹx�+�j�w~ + +.�hz[��v�zy�,GZ�4J�3���+?�C�E 1�I�='Y���o �k�%o�,gK�Z�FIyo�`�,1O� +�j��.L�f1�� 7tR�T�x�K�z(����O�4��U���ҋz��i��X@u�>מ���0�P���8���5��)���F,*��5���0�])l�g�ߐ���o�]�۲F�稯�7�Ǐ�_b�4��Q��`��:�Fc���%�ԩG�u dNʸ7���:�V>t4 f��W���{�¦��b�Rc˦-�u�����D���vPO䮩R�C��X���-�5t�W���3 +&�Ȍ�(=G��qxt��n.~�Ѻ\�_f�s9�i�@]����aV�Cu��UJo���yp��/�3��?i�Z3[����!kC��jSNC��'�C2��*�u��$��T�2�� +���Z��w��=���g��e�ҋ�-���I}��!-�}FN�ɹ���{��ws<:����Mf� +��`��3�����X��`*^ޟg���G1������U!�C���@���i�ׄw���_{��?dEr��@�#�=�~H��[�����:}3>f�JЇ�p�|���b�r��M߱ʒ�=ϡ-K�܊��ꤐ���DqN�z�04���E��6��1D��!�)���'��=B��[���ei:�t@�e v���[S?$,�?� +IX�*]��O�[�8t$�|�\�����p��]㓝J�γ��)�O��zpMNE3���0���hct�2%w~>|T�Yh���ht�V4X]������*7��R�^2��k8�r������de$��j��{�0� э�-����v�����Y�d��<p�TD�q�'"�>��b�9��IL���5�B�6ԬWn�Z�]�J 4&��"u�s� +s��.q�]���*��IX@9}5�����7�:1 ���9�I�Ȉ�2�"n��A���m`�q����/�f@IE�)6]ۦ�'!~Eo���D�j��܌�@�u%���Dc�����7ty�d�N���TR�#��Ym���v�<ӗq��!F���=*�]IU}��t�I�l��7�|U^�G�xWʱ�A��uَ�@��"d�91�-�k�d���K��2ʩ���ΎR��AS�d��;�Q�b4��튋�u��<��������@!�W�L���S�Z]Hv;�À[r%�a0�y��x㖎�b��0!V��Q<�]�$N-���8�eNPr��<�M��"��k�{���K��C��X�FYK����U��kX���w��M����q6�L�,�"x�H�wѼ�p5�lt���x��0��e��X��?M�N�9���AE�_�-���I�r��]�Q��U�ڠj�>�`Lg��,Ok���z�2^��j�%�/Hm��"U���J�xs���#��u�`����da���K�Q�,�qq�{�O�{̹/�P�O6�7']ܟ�PD��p�$E��I�u�a���/�j��j8�����/'�˯�z�b>�w�LpL���;"b��<�m<��B����F�8�+��٭?H_�q2U{��n���P�{�~X�U@#�VR��s��ϞL9����e�m��s�+�sS��6��� +:u�뵉�Wo���[��P\�YTI���!�B��F��_���f�$�I}tV���:��,;����N˔ +}�������.�0��_��>H���]��Q�1��Q�.�b�����0�9@�dVM+IN?r�ދ����Va���>�I#�F- :�?c1���GO�ZF����%ϊ���� +���V%ݳ*�C[w���8��e�A2��oMɲrGs?`s��'xѴ���Ln){�A�@�o�uMX��� �U�\����l������n#��~K7�����Iݸ����e���z�����]v�����J�.y��p�3���gG�^z��x(L�Y�=qw�����:)���=�K�D�N�J� �,ҀK��* ��#����ۧ�K�ݙ~|=!��7I}�ωXΞa�iv�-���F%�>���lr +CMo��-�μa깽/�r���~T��W��d2W!�^:�]%J�lU�����A2@l�����iS�(�v���ߊ�� ��$�$�+x��O��2hg��W�7m�vw�u��$oP���-��m�{��d������d1����A��[���Tvk +I 2�*��k�@�VV�~w�)nbh1?�/k��:K���cM��,�ȼ�<i{�p���2tĵ�: +�}[O�w��ޜ7=�\�RMm�|���fQ�~k蝗T�b7K=�?���dM���i/��ŕ��~Ŏr�sV�9m{�Rx�ff������o`�K��]��_�6���DE����k<8V%P撚�8{����w�y��r�ԥ7=`������F�y�u�!�q.�[W�:���>���y��#{Q~H?�+i����=��EcO��[ ��,�*�k\����G�8ڦ�ka؋k9nG�P +$�e���<Uy�I�t-ս�:?��Tt��B����:�����|�;A5C�� �����c�?��Va�t��H� o�-�u��+��� +դ������(��&H�<V��n<]t�諛� ���t�P#�m�%�.�k��@��Q����m)S����vci�Z!�^�~;:��u�Vv.5�-�P��ˏK��w_�؎�/S&|���+�w�hE�-|����~���+��Hq��<?l�oRv����&X%ɠ����/.�X��❈#ėb%���˻�1u�q�Cņlt�/��Ɓ�uz�dUE]3G�/]�=�J� x�w�T:"L��?�K��җyh���jr5էSߴ�v1��ҏeÝO�H�>��m@�E|^�����\�0A��M�F#8�I[k&�%�9�CO�I��D�2K�t72=�{_�N1` +�&l�����6��jLu��F"f+�n9zj�ywJ�ya0�ݛ�z��L���.b�1It�� �X��v���cڃnռ%�rJ�Y����2�ݕ���oR��o�}�uIM7����4� 8F�-Q�f�OY4�q�~���i����Y7r��ڠW�&l�}�'e��Z\�%�����P5X3A�$"y����[7����r<r# +endstream +endobj +1554 0 obj +<< +/Type /FontDescriptor +/FontName /HTWALK+CMSY8 +/Flags 4 +/FontBBox [-30 -955 1185 779] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 46 +/XHeight 431 +/CharSet (/arrowleft) +/FontFile 1553 0 R +>> +endobj +1555 0 obj +<< +/Length1 1378 +/Length2 6048 +/Length3 0 +/Length 6992 +/Filter /FlateDecode +>> +stream +xڍtTT����� R�5(*1t7R�Ғ�����03t"HK���!���H��(-ݝ�������[���Y뜳��yk���<����JP�L ��� ���*:��R@HD����q�_3�����QH��P���8�M���tPH��($������ �Կ�(�4P��u�Z($�QA��0pG�̿~����@!)) ���@%#�:`�#�_F� Q8������8ZZP���C��@a�o�=�8G��q�A���]`&������?vC�=����Cb�nH(�jj��0�������������o��Dp��`0�rA��^p�����Դp�8> �#�(|<�G����ߝ��jJ@0~���a!8����F������P����~�� +�� �m��s��H����������4F�]�`��!x�?6(�a�@�'�Q�Wz#/4�S�?����㇀���a��v�q7����v�sB����G��o���Y��Z����~=������B"���}���Z&Fƺw�L�o��2���/,�� + ��%$$�~�L���m��XM�= +(��[�6��c����+�����E�Y���� 1��������e����RsC ~�y��7������� �� +/�CMaD����\�۫�ㅠ�t���_HT�$��Ǫ�=aP}8���2�ƿ���#a�(,��݂���ˇ��`������Ϻ����΄�ā`����$,&�� +���d����Ç��3��Q��c +�����Xg�)8�r�Q����������Z�V5� ���|BAd�8�<i>�Rb���1pyj�5,Ƽ;Tws<��Q�4M}�U�Z�؟���8d�/˝��AO�7�'�42q��u�)o�g��q��CQ�C�asԛ�l�����M?�Kt�,V,䝷bJ�]�T�I,�(���U�sN�\��%U4 �"��H�x�0}���t�5g�������o��Evr�wV����2]������a��}�Հ�tSY�@�81�S�K��I"[��ӱ��M�="nu�*��z����j���~(�,F^�����[� %I��];t ƫ1j���*�}�Ҙ3��8�&��~�T�̨�|�Qz�;�����G2gk��G����3�3d��[5q-Ye㏺�5��%�^�%�I68}.��8���-�Q-zUy�!�w{%���G�6�D���e]�*! +�gCV�S}�c�^c�����tS_����K�j�8��+Q�l����$�����c'�#��]���@CAU�N��T1�mlbC�x���D�Њ��P��qI�T�z�ޣ��-�S{n���g!�"�ȵ�5���-vŶ�F���ދ��ro��<�d�F}$�K�{3E$w��$�U;D���P��n�a�D��8��[��D�x��H�ʬ5�LN�,�-�t35�_�٣�Ρ�s{f�>뮧�[`�6kF"���K�xQ��6��T������`������&�k +��<u+7+c�"�]��w�k���_�}j��p�}��� !�]��O��zɷ� +�b�j4��,���.�9p(,_o�������誢���-��t��|:w'����c�/���T�%Vl���B��Î +r��#�G���C�K��[�������*Kv&s]�'�^���S�G�v��]���D�(� ��_�z ��G��&1as,�&���Y��?B��i=X`5ss-�#[3}U��+�FQ��x���כ�!��� +Z�AJ���� ��:B�������#��l(��G+r+��V,�fL���5��5�8&����X$�|VeRx�¢�z��������+~�E���^:_�L�E��'�����7��A�m�0eD�k�wF2�~�-<��v��^<������ +ׄ�щ��9Sne`��x�-q�X ' a=_\���[��$��2�+E������-Å?��c6WSnw�ϗݜ#4��Al�z0c�%3��r#ϴc�>��Q!�0��(m��WF�i��mJk��U�6�&J�Q�ʵ����Z$U�A���d��G�0�r�W��ϊ��˺Q-�v�����?�u�e�}�b=�Ltf�3�c_[� ��Fqo�p\� ����BujVD�~����+��< s���AC}��""O��4B24�$�N��:�%cfz�!��a�_�(���:�]�Y�_�������x,�U��/�i� [Ru�D'�����*��Ք��4m�Ã��o����1TQ��,;���g�b�^#�E;SӾk�dK��yv#�'��Us� afּZ[�E�NM�x?8y�3��2g�n�Q ��η�V�s�f�+>)T!��~����;��u3� cree�'� +Z�M�ݯ�*2M ���Ӕr���,����#�Vs�hoW��� �S��c�ބɠ���b5)��"�W�l�H4��^ow2xF��mr�����r&%@Y�M+��/^ߣ�~��Rb�uj�;s/-HF{a��ǹZ����)�v�J�q�t)7w ��r��p�r���!��e��N�m)�����;� +`B{�C+�q���QR�uT�G,o��h9�[;�����n��#�줥�=�v��|�V�30��[� '��A��b��m��8��`:y���LR�=*6���:6X3ʁWJ�Z��b��~��Rө a���'XGʦ�j�D%��lPPm���?���)�Dh� +�����}z���4�H1�ײ���\N_�z�Bo�xRe�G�� Z�.�r���MH���Y�"�<< ��Y�범O�I螭�j�Z_�r��O����k�Rvh�ϗH�,ڛS�ԨE�ɉ7�DN�1E����37�?�~���*E�:b�5���;�.� ���č�;�J�64`�B���,)A�#J���Iz^�gDy�|��C=��:|7��(�ċ7G�o1�<��_B��N�6D��|���#_(n��R��g�t���$+�x:�y�H-�-p{�����U�え��j����[B�b�\8�1��뽱j�m*�t���5���X{�3:wo�V*Kd��)���^�,q'su��8dSFj<\�gu��(��#�9<�aў�1�;��a���� ���y���䎜pE&s/۳R'�D��0$<}�-)���%zMe�JeUC�%hۺ�������J��[��;��hѣ����EW�͌]�h�٧����>��_])�B�Ђ��h��Z|u��<�w�&����"N��y�u~�����%{*:n�c�P��fN�~b���U�T�� �I�'a�i�mC]ף@�OdY��1����٦�����#ç�Z���J�(x��\�d�7_�m�2�c��`b\���1 ��=Sy�6���� �J��G�>%x��,�j�=���>6�2m����g~�Wǀ��B�9d���(�\��]U ���|w%noG�$u�s�n^�,���M/u�^g�`���gb�����"�A��~�t$q 'Ե����|��]����gOr� p}��˥��&-}f��`u��2�,��o�Rk���|�L�bb|`9fh�D�܃�c>������L}ϡ�;[��U�Z�=��FA��R�w�>ͩ0- �~���{HǙbR���|���v�#�����º�2EF�5�c䍇��~�WG�Y���tiZ�����&���_W�ȩ���#]���$��jT%KWg,�Pc������j��A���| ��vGa����TK�t�5�KNi~�z��ea|�1�:g��;��2���ۗ7l{����s;Q�jz�<�z�g����?��K������s����;�geCI�^d�M�8v>�רI����H,,���I�Uȼ]ͬ��kA� �Hr)0�CU/i�����ͦ ������g����Ӡ=���ȴG���L�-C�OɊOnd���>��P �夓D^t�YL��ȘO�Cr졞���0Ʀky��l�Vw90N��`�P�)��B�lڲvӭ��Dk�V�sV@�2q�����-���q�w���T���Ǫ��qfϔ#�jO��d���o�Gbh��d.'8�����v��������/��?N����"��0��� + +�ʠ�v�wQ����t!|���F�䍄7��KT�9 +�&�mO)u*"j*R�3�����ƨ���\���SN���ɞ��(A���3��fI�,<\"��S��D�*˗�fQ�P�������s8-��L��!k�u`�� �� Q=���i�#�p��I�+��R��#� ������-p6�nl��� +(�%�{E�U\R���2��q��P�,e�m7�`s�3r �6dy��������^��yF�$����PKs�Q^��P�];RHKMo�Z�����/ ϼ����>}�W\���5b)�ʐ!F���!��<I�I-�\����<�H��4`�YZ���[�x4*�&[�s� ��C^�RW ����D�z�t��&�yj�O��"&l�?Ar���Hj`(sW���-*Ҋ���:n��}X��W�Y{������,�_���v��1��|��!-��4v�0��6uʮ��ES}�\aYM� J���T�s�P���y��uABK�B��S{>�H� ��5n"��S�B�C#����qp���K��,Yf��g� �'O�.p虃[�������YJ���x}�A��&��s��h�1�>bV� +��91v��W4x?iE�]u[�;N��P�W�C�FZ]d�� ��������H���&-��!����Wꏯ���EK���#�敞�(ů���0����>MZo��G�ɷrn��6P���.Yp{�|k�<�5�M��y�0�1��w��l�<qE)չ��u�T�oiH<y��>w���|* +�U� [>:~)�IU��U\����'`}�xғ�W`-A!�Q�����T:�I�J#��˝�s;���K�G�!�-�x�D�P��Y��3���@�f]k��f�WFۢoow!�[뎡�d=�H��/��Ue�SZ)BqS�57�P�z�-�A���J&�m�F�ԗ�H4�����!�=} ����L�)#ut�r��g��2u;�r�;#����7ʂ��XU��y.З ����@�;t���k<H��)^�3,�-�?(M8|��9�'뚰O��Rћ%x�ÿ;�u�܇��ʗ\�r�B,#����Щ~�JFqs��Mzc\p7�X�P-QJ3m+�4q��hߠ��9�ƈ���ma��ט��ɞ0I���/:�xG>�7�w���,��w�Ӕ�����PN��Ϊ��Ck����.�@�H8��8I�����+�o��s+/ ��|�~�'��ǨJq�t�����{%���J�F�K�v�ZBWZLBF�o��rX�-�%r����<�䅌7�Y)O +�\�� +�z8�����WA�, o_:�.VE^�T}�hs������ �t��}�6�������00�6���b��1Ş�a m*�~z��Қ����#�r�A��@'9��z�Q[u�1�5LxtwS%�u�W��� z�X�[ġ;�)���o�fMm>ebrUJ�&�A�B�M�E�~���� ���B�k�)�A�q[ ?�&0�N�: �v|�f���[��^�X�ء���5:�E�S���7��=?�0����O1M�v�Oo@f�4D�i�m�s�U�)WبL���.��9��1��t=I���o ������@�{?����#��^|�IPJ���0�>X�I\l�Q +C���*���?^OS!��T�*_�ĸ����im����!�n6 P��\��f{��F��u���v�/P�Q�:���T�W����l�>*�8n�Zy���R�t����i&vWɼ t����7��Xz�$��l X('�6���f��WZ��y0\z���� �����r�j9s���(��V�O���3b�Yndّ_��l��`�u �j\n�5�_L1���.C�w?<q� �hㄥE�9�?��EKX��H�-�1-�ݺ����nK�f��=9�����������ѵ��V�8�`yT����=4a�O�wz��3UC�mt�d�?�m}kϧ[��Iƽ��{Fum%n�S�z��̑���5H��qC�W�[�E�wθ��3hr��d#D$@�#�]��:�`��n_�����q�B��L�i�� g�s^�q"5e*E +[�ӻS�.Ģ���QQ���ώ��V]tò{�Ğ5�������ȕ���ֲ~�" Z!��H��2k���|�bb���C@�����f��B8�zz�l*�==9�v|-�B�����/K�LBd����C�ir����o4Q@�p.Z��{^��K��~���#=Nщ$�Zed=�) +U��AN�`m�%�D�wSo��YU�����ڻ?�VF�< �1�2ޤ�O�7�P�5�)��<�x- �T,�i</�P����D0�f1A<�s�l?D�`8<�~���\J�Xz�����U�vV�!B&xh���f�R��}�:�~���C�)��==�m������= +�qa������є���;����6VI�d��%��M��i�O�2tv�Hk2����$��lT]-�8�b�����s�T6YuR�g���q`u%��N�˦O~MDǾ�◲�8@��yE-]3�1��'c6]OT<�r�4R9� ���]�TC������uw�yùK���70�Y���Ѳ�e`I�C\�r����u +ֵ ?ޡ��M [R,03�3��3k�� ��Ѧʑ�x��w�`yv�-y��U�����#��Zw]\������S���'v?+��ö���V�$�'Ұb��� �^b�R��^��>n��Q�>��!��� +endstream +endobj +1556 0 obj +<< +/Type /FontDescriptor +/FontName /GJVTUN+CMSY9 +/Flags 4 +/FontBBox [-29 -958 1146 777] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 43 +/XHeight 431 +/CharSet (/asteriskmath) +/FontFile 1555 0 R +>> +endobj +1557 0 obj +<< +/Length1 1894 +/Length2 113985 +/Length3 0 +/Length 113889 +/Filter /FlateDecode +>> +stream +x�t�s|����3�Ķ;�m۶m{�db;�ۜ8�ضm���sf������Vժ��z��~��$�J4�v�&�v��4����A;'#s9SS#%['A;kc�#=3���������@��P��D�������V��ل �h�3r02�8�9����f�"�ٺ~F������)��3�������>͜84�C����!���HDl���llLl����� M�,l���*\����������K�ɜ>�����FZf +�g��v���cS(:Y;�O�������u���5������V���^�_�6�����vV3�03w�����H�����H����@OK����+N��&��Ο��X;��mW�56q���5��s����4,���lnadek���y^�Z3�5�o �M��:5EQ5i ���E�/Wy[ge���6(9;�Y��Y;�����v�ra��2Ύ�����1|:���N珗���;�����@��)�����n6���X���������� +0pt4�����$���S�;����]t��vΟ!�{go���#�_W+�N�/��� +��Cl�:�?���C�:��=�N�1����#�N�1�$��gv�?��]�}f��C��e��gv���gv�?��]�}fW�C�ٕ�3�N�}֢�>kQ�C������Z���g-�!��Z4��g����3�C�qF�!��3�3�~�0�~-��7��Oa�>��Z��#�e;�|���?ś��?ś{؛������f������)�������)��2|���3�g��� ���O�v����_˟b��,nfo�hbkmb��!��cu�_}b���������e��ß+�/r1q��������/���7�����I���2|6�鏪����d�tw����S˧n'k'�l�Yޟb?G�����?��S����?>�p�s }�t�k�9�9��a�����l��d��������O����&���_�������������fS��1mb�nb�4og�d��#={pLX��Q���y��p����;�1�D�2\\Ӑ?��"�������K���*�y��H���(�Y|>gE��"�������U"�%͙d[t��������}�������Ā���8�}"��5��Kq�8����!�C���a�|lE���~���������^�8��{dK惍�E< �P����;����4���Ke{�y+ȭs�ɂ��vP�Y����[9U:𱲈����Ҍ0�� +��U�>Q~�\���v=}��~]4X�@x:�>I��k�AF��%EJdr��J� ���%���$;�@���tf5,�xw�M��gE��'�{δ�h,��ݢ�qiz�y��: `J^�-�S��8��ʏ��@��JM�݇��Wy�r�t���64i��b�d^f����r!�"��7�Nw�W���F�&6��5B�o��>����3,6!SD�7��w���s���Y�Ԋ�V�>7���<���$.�QN�$�-A~�e���t���������߸r�.��T<��l^���{�4�:�8�]ײ-�[�8Dޒ�"�<y6��yF0�p+�ݓ�eW��hs,\�6��b�v$Ç�xk?�����+}�W����u� ���U����6��f�dd�����#���Pq��,�߮��o���@��(��T[Dw3ޘ�$� +��e�`2��{6v�q�'Ƀ{���X�T��`������Y�)�.~��<��m _*�i�t�x��fdз��E��=m��a�=ؗf8�a(�oD�צX�͙�H�� <�Sr^���ʗ>���y����b� +��-DR�A�ڒ1�b�᠉Tغ�3���/��"��_A�����x��9�A�� +�Ylc����Ն�~6!:_yʕ�\�}PM:�����x�(2����F�^ 3�$]S�V���.]I��'��t�\��a��]}[c B��2��-.3p#�UN +e��^�Յ��9���t�;-i'T �k6L�����͊%�*�-D��' +�t,��Z�1���~V%�n:$p\���לi��F��f�[죒9�<�Q���j��� ��R�EEt.$u:���<���>$�L��Gm&�|d���s��^;��~}��<���r�f�0�6�ձ^�]�� +�����I�h( rZ�E���7ŋ���:��d�Ƒ��x�;w���1��20yU���B]]�]U��=m�c#L�y#U�iH)fmn�1 ���c�(A�gi>��oj���C�s��f-˵v�0������wUO]�ߞ�?"�\")�L�q�n�f�'('�#+�x�c5-@�}N3¡�b�o��.��m��[é�|��4��Y��H$ޅ_e�ysjF)��a�ML�l�m2�zw���Mf���H��|��*�g$�8$=[Z�o�B ��K�v�RY�u�#e��ZJ�1>r6�}�)�w����3��p3�!B�<��91��P�������q4�����6\|�����*d�wL�F�;�N��������^,q�����o}����a���jU�o ��hD� Mkh�FڈPs=2 �L8��tz�"h��eܘ�^�ٵ���G�O�+� ���~�gj-&yp���Sꎎ�q v��nj�c���r���%T���\�V7 +���~��bm~�T?��6q��V�ż!�s�N9ǂ��o� =S�ʝ$O:��I�s���צэ8|�G�� �Hl�ྷ^��H3���G���M�����4(t&2��w!��#0�7�ߴ�0E�����jT��v�ʊR���"Z��˨i��N�}�F@FQ>��$���2���;/�>�~�����=�K� �.�T�d�2����O�%;NP�� �7,Z(D�����!��a�h��ƍ�Mֻ�b�H̱���X�w�Z��L�^!�/ښ:郄�L����yi����2|��o6�+����о�h��tO8�7�ދ�iU�Ȃ�,O��4�>�I�[Թ�\3V�G@��\�w�Z�8]}X|k���$�Q��E�i��jF�!v.���W뱄��r:����� +&bxP��WL� +�~d�q�Q�v���)����������-H� }0�]�qZ���&(ޭ=�WG ���z�T�&�z�*Hy��"�ƘW���X�jnX�r�8*�=1 +����F��s4h(��O�m��|�PqK��dA~w*��|�!�iudK�.t�D,��?7���fCmB�����J���y���{RCEx10�N����A!X���lj��'Q$j��I�@�������r�h��=f��xHK��ĭh�_�3����w�`�c�hµ�6�KMR��r�������J�"UAԐ[���i�!�Y����(�- +)m;c�D�Ƴ��i���zK�oh�߈�to��sz�OW��"�.m�s��+h�M@n˟=e5�ɨO���{�2W�����TfM�#)��{~��.0ۋ`����:�--�)i�r�� �^~�'�'T����}��˽��p�>�_�>SN*�������M�|�̙a^#y1o<´z5-K���m��y���S5��ώ�N4O +�<1g�Cr��7w�q����'l;�Ǿ4�MW��'9TO��,�q�j�:�k8�si���R��lA��;q�X��<\̧D�� ŷ�B�ނ��b��U� M8C��`�1Q��i�.����<� ����T��\��k�y�̗߂R��)�)��t��0���Gw>�*���4g�Yx<*]>Y�L/��߸�#sKUf�\��r���@ɹh�,83_B�fw��{\���=���S�:]w����_.�g1f�T��-�� �'��^e<yE��}�*�l��6M����S�4��x�$c�0��X����������5rP +�(��D���|?�nəfSm�*��x��6�Y JmM��9�`��gJӉ�(���ش���ljl>rt�hNo^cͫ�1�?gՆ� 0����PV�*����2C��w"Ӫ�$.o#�:�(I4�&�֜u��m|�p��?����y�,�F�ZW�Pr����;�]DA�'��w�|�&�8�f>�(�����=5���6Xzמ5>���cZwz5B[Q�A����'H��Q*t)�U�ˑ*T^���P��6�%�'�����E|1j���wkC�.��L�-Y2����i�v�*W�+�{�}��@�E]�o��75KЫ@���B�[(�M 1P(q�p�;����q�����2������jLyM�y�h�7uޣ@꣄�o]�SZ�!OP��3|��bE**���]�,MtIr>U�,IB3۰t�ERj���Z���[���I�9�вV,)�?U`�wo�'���W���Nvq���6��4O�/$���: ?g����_�%�e��-�9�FM���O��b�}�UK%�[�I��'me3=Ve��C+����'<���������l n����?PNS�����J�f���Y\�4�2[��X�����5bM�E�p�$���_��vcK~�xfgr�#D�IK������B���EZS]*�MQ���d�e�f�B���p#��U���cEqaU�J,�C�B�k�5�v�=���x 7v�ǖ,�vT�a�mK�7�� ���N�_9�.����+����Ŕ�^�._a���A�P�ė�ވY�ܐ�9��3}1�Z���p/�4���zAvrR�����-�옻�g�[����-��Rr�p!4I�zyH����Y��L�Ԯ0i+ڥ��z^��e��>��s]S�+'c� ��&�Ǣ!HWl%����fM-(�j�~�ۺJ������(|��*����ȒwQN#�oI:R��YW��Q_af,.d�2�RB��<�����K��_Cd�w�K��[7A~#,�ktr_�b������X�I�O����5�f���%)90����p]3�|��w��m��)���_��Tj��=%ۮ���A�X_ +������b���DG�2X����*�Q_4~.DE5�x�U�I t_�L�Lv2�z�J�Z\TrF@V-�d.�є��l3���>�_<��ۆ�D;����͢j[s������#��A�_�j���ye<� +�t�wF�K��; �r�@f�6Y���)b�É_@�,����e�[��3d��BĤ�Xx3p�{kFOMo�����(��M�2���c+6 +�"c����0���]�/Z2 �������S���T�MůW7k٧��`i�bM���d�`���/�⸹�+R�ޑ��{�O���8�n)[��J�A�o�mm�e5Q��/���i����ؿ[ڽ.y�VW�"O��( +^2-��k��i����m.qI�� X���vQ��c�+q�;���h�~V��B�ׯ�@��[�����p�"1�1\/���s5 �����mq��A�#�lʋ%���ɖYU(��Cκ��}�i`y*s^E�6�cՋ~��\�I�#wI7�Ub��H ���M:���"�נ#���l�rⓚ����,¦�G4I�����A�����y��(���صR��V�|��U/Z��h0^��m��n�7F�~�y�;]��7Z}e���к�1��>�s�Q�����+,6�Pf�cKp!��H.y�����=�g�6�;w��e�}x<'x>\����N +��A˒����������Y}0�~h<"|4 �a{�X=����Y���X\��@F��/�9����iZ�-�ޥ��tk�&PU��b(lS�|��7㮶h)�l�=b��v���k8*V��-����C8@�k��h�$%�h����V����5�m���٢��P8���b��$<�[�BSe��������j�)r��}���l�/�;��,qL �x �Ъ�*�_qQ�k��F���[�!?�t11���7�^����5��rT��'���PT|��i����=_X��c�T�[�Ae��ol݆1�IN�*�8(q�!H*X���e��/�KDŽ{\��.���S[z��R�G���:*aֶ���k�'���%��/1�+����h'�9B��x�w������n~�E3h�d��y�<H��Wn|�b�f�ጄ�Sc���/��fg�U��j�F�>ٚ"��:�3VD}�Z$��<B-k0Ou'�j�5� ��*A��Q��|�˸�S�E'�z8������ګ0�>�R���w�.�V1� �߹��S� ���Μ�U�E��~N���5�@�FvQ�T���i���M�OU� �>�Of�c��'!?`��V]d��8���f���+�`F��H� Ĺ#�4�m�a�\�1��*C�����H����O��k�T�z�tJ��@�dg83ɻ�S�ʿ�J�M#�ꕔ�'G�Z�ki�����Med�E<V�|\=�Ja�+�s�d�ӹ�/2ţö�/�;0�.�N#���0b���M��1kuc�Q��p��K�G+2�,j a� ,�]��=r4�s*������J����&���Q��J�nst$A8G����N�NȖL@�8����ݣ�uc�s�e�,��A+VZM���!N1�V���CB|wR��?�7~��'y�3h>�`l��Q��oȄ�u�\+�����cUM��� �Z�O;�ɫ/J&h��n.1rit3�[NH}!'0L wk��-�_d��d����LW�KX�^�l�����o:�9�HT��Ds��`��5���2&�� �r��#�]cI7��ߘ7���j�A7l +��=�と,����%c@��Mj����BP�qQ$��ҹ�^RB�j�$s��6*�\�'=\ljSDk^|J9�NT��'�xP>"Y�6�F��}z���I`�s�ͬ/�*�3��v}:I�����%�.?}�����pڏ����.�t��_D+r?�,��~��/ ��w�:E�@���*����*���#�U�͜������bg�\7"�%�<7*�:6Y����#g��釰3�z\�=��d����͠L��?�!p�,wSF��ݒx@��U���a5����Ƅ ���#_�"���6�R3��.�N+�d�� +,1b �A��?��/�y��1�Kdm�C��ِ�� +Ն�{m7���A%��aq����#����v�����s:��ڐ��,���0,Ǝw�����2�t* N�*ؐ��Y��t=b`\��.�"#1�6���Ruъ�hZ � ���>�%�*b}����Z�������������JFY�9)�J��u���uw�E��e�h���q va��\��z�me�:����{�k������P�H +o�r�� +�|t�ue6M�ຖT+��}SOU����CưDz���+ڪ��jl�ëi3jM�O㐳���,.4H��Q�=��ChPz��0n��/�:���}f(����T�/�F�������:�Ð�Cތ4M���郄�����Z��^��w5Cf`bb#�9���F��9��.#�]�$�_�yt��ŷL�'FcS�hv]+�Ͱ�^07�<���5��u�ѐy�k6i���W�Zt����0����#�R���M�p�<x��tӣ�9�`�K�Vh#4��1[P� +&�j)3�ǁȳ6����WI�����d'�<�j;�~|b�G��`�nA ,?m�:�L�NP�����)v������a�����鐉����H�=p�K�~#��뽶C�Y\7��g|����:}��i�g����լݬ.x$���~��?�0 M��a|�`��P4��#�L���V|a��@\u,Q�ȆQ������|y�cd/DBP=&dH��ׂ0(�|[F�$$ƂCkʎ�:D�A��uu�k�M�����W�w9�������le���{�����d�'�?�0���y�7,b*�o��v] +���p�UyI�/Z���o�(.����3�N��.I�O66���2��e�o�a��wb.=�F7�ks�j�GT��;�Yb�=l�͙:��HJ���1}��H&�p����D��P�"���o��kc+P�TN�x�*Ӱ"� +��<�����'VH��$��G�c )C����(͡�QO0��c �m{��$5��1�w.e s�")�"�����8�����bXDΆF�kW��!�;3�%���g?&6�u�Pň������M�2��ߜ햵��R��&��y��{r�:Oʑ�1��g0��z���Ϟ�ҥxOm6=a����5Y*"��.��ء�>�I��}~S��lb T� �Z�3��I��L���%y��O9��Ŵb!rTV a�n�{n�j�ѨY<���E!��f!5��h%Ά=�K��Lj��4��{S������M�ؘ��f�sl�@��ov�lG�=qTD�'��$&t0�4�����i�q����`���`uOQ���������C:��$̳�Yd+�#)uB�Yw�;�C���� ��~�;���U7�Sᒄb�ٗ�������؏��w�ය%@��O$<%��|� �7���+��F�$AT�q��r��L\^B+Z9t3�䪣2��j`D<l]~�k#{�j���_��(�+4�:�Q�����lӨG�.k���~\]zF���R/9���C8�8-�������L~��=p��emZ5ë��2�2����sx�wg�Mw9l����C��8r܇�Bw ��>�q#��@����b�E1,��G��W�Yv�$DWi��=Ԟ;R��"Z�o�����P� v[n��������8(���ߐ�FKr�P��y�k�d�F���F:M; +�p�[��^c6q������ыjU���C�ޒ��"U�O`ޫ��q�i�t~�cp�T��8���a��2{ ��X���� �9����!3�.1A�p���JY��:��[dV]�����l�}���۹w��9GY��__����8|�~v҅"��Nu۱n��;����:q�� Q�ؔ��O�<L�����t�b��w��Pd֝��:%<�����,��(=-�L��,L~��[��q���L�O��$�#�τ�o����~C�����w0n�uOO�\x�\7�O=���� P��� _k��eF����t]S�f��t=�@���az|V:�8y��l�����Q�G��x�]�ķ�Ky���L���2�d�=��B:�^�\|;�'\ +�E��� �xIw��I4�ly��/�`���� ����F;B� T�2�P��r.ziKG*Y��dK �oؚ�ح%g�Th�-�2v�;m�v|�{���&w�G�W��/��.8n� �I}V����p;g/����1�H`� yL�yP��|b2w��+� <�TÝ��sS$���5��Z[�eLz�g�Pe ��� q��ҚV�r>H]K�Q\���7u;}���#d�N�#cp���Z� +p�!���+�NF5F�Ђ`�_���v֥2��1���u|ǔ��������]PA����o�2��\<�u��y�d��"�m�MC]��Y,m�@�D,��A�{h��Q��/{[���а?�;}�;�h+%$�NE�\�s�R��ō��Uq��@�g��R�Պ�>,���X���o�7e��BB�1(2qdsK�Mc�˳��u�5?�Fdk��grl���<�ˬ���%!#(F��l����C��moo*H}�6Y+�!=�)��]pcv�z�B��DŽIb�I���̡#�"��ǘ�*���*ٔB-" �bO��d^eq��[M�r6s4E&��5^m̀�&���Q��~�� r\Xb�ORC�2�G��0�4s�dx�Tu�0o����wON#� rd� ���H>r�EbfSz�3�G���"�8ͭL]2!L�9*�à��}�������[�R�e�qP*,J����%Od�nSR�y�p�����B���]I�;=l�~��%6�̓����KG<�F�$庸Y�X��.���5w���Vq� $��ͨӡˏ��,iRr 8�)`s25TJ�m���u0U�����0�����dD֠M`�_~�Lh-;?.�.�ٮO���|�L�z��I�w��|�Xf��u�AFN(��f�V����f�c�2���ߣ�[��臉� CSV�����p5����O�7�Ժ��}���L�$JiU�3����X�ceO{�L��Z�� J�J��J��X4gͲ�@a����7� + AUH��x剪�m}�|�� +���!��Z��Ƌ�������_9�f��ӽ������k���� +Y�r� ����v���2�7�Ը� ��[�{I#�~�h���nܗ5�SYG�>r$4a�f�>��D�� ~����� +A#�ןl��x�P+��s��f���=ky�G�l��d3q��ʚ�b�In Wd\/Hй1�����2���y�c�7S5��gl�J�J>��G*?%�0p{d��0��RL��jt�3�,�s������-�S���m�Y�"H5�>6��c�<j��_�2HI0:�!!�f��Jk� �w,UIZ�u�w���@|,"��D�?e�8{?����Y��w} �o�z�/+�q��iɰ�O�ġ��=|l�/u�p>�G?��p��x����U���! �>::��_��p+� ���B�SW��B�r3���0sLiw��"㩍�H<̄������iG�E�1�� ��W�(���6�I����}A��˖&�{"��<���&��D����td�d��Na�W���2`e�����-�4�)�ںF��U����D�x������Nn�=��K_�Rr��fhJ�y�,�6|�ׇS����M"�PD%�)AY�7��U�}s������E�-4́ 9|X���I����s��Js'��@_6�R(v����su�̤9��GJ�����a&pw���C��? +;ڍ!J�H���f�l��+�2N(6�=h�0�E����|����fzu6FR@������ +(��݊<�NJ0��� ��Y*�0Y���({b6����y��%%�jq-մx�b����k�8��Q� ��CSY�����:��d�RΨT�G_At�=�~���&�Wk�o��@��Db�R���k���L��C"�0�K�Sު����6��T^��͂<������ރ�Ɂ��|'�Ҭ�Ė�.~�W�"+`��[�������Ue����R�<�����er�k�gZ�*V����x�y(�8�� +��N��[ȵ߂`(� _`�Z����y<�˫��A�?VC���i�G��i?jb�����&�(�5iF�Q +IL��"�g�j���v�˄�>��h[�Y'�a6!N)���ם�R�|R�]U���4����qb�T�~9�U������|����L���8�IDY�}��1�a@yJu��>��Y����MK��l��$��T +���^ +��@X��Dc��J�iOs̾��B��:�q�����.��U�� F��铹yI�|���$���:�7ѻ�(�1�U��{u�M%�kQn��(����#�m�3dމy�֏ 4�|�e}�!���$B acf���<c�w��a����↳<��jDp���.z:�ʵ���0`�4et�"+��~�Q9B�]m���k��p +gI�Sd�,ql_*��:�1x�r�1���W�㐸Ӹ0���~�� ��>�O��d`YH��d�+��-��W���>�~"ߴGsҨ�@Ƙf��+Q�<��1�[uu�>5����g՛b�]{���tW�w��g1�������eQ��6;=>�J?{�1�ڄX��kӗ$�� +�,�ۊ�6�����uW@ϓ?�P*o_�.T92m)����X� G��:��;���r�Keك=i����:��n�N~���d��z�u���5X�)$�k:`K6�.��]-�>l.���ύx��E[�_��d�멗d4�$�<��+W�$üE�*p�����J��O��}�&�<n5��zCT��8Uj����G���˖-鳞��_9:ac��Fm�`�,J��-�N���EGK��Ѐ��b��Ĭ$�ǟ*�� � �x6��|&!,̴=עWh�N��ǣ� ˒�+���l5�+���w���6Tw6��˄�n�S���Cj��!r%@X�Ϟ�a��=��� Ԕ�^��QdQ�>)�Y����u���"�t������:n���m�@��Q��ł�n����v�D���=g&Y�I��RԚx��G�|��-�qs�����B�9t�s�D�Ms��1��=QE|��� +�2#���j[�`����ֈHA%�(:��rV>�`&b#;ac��Z�����JN��8�����_ǵ��U��S���������W�:�>��S����{P,�yZחI�)Y����Wbx&��$ȳ� �U �̟��-��3EX �]����2�C�p�Q�w0R���@ +�A�-�}}��ʫ!�Cx��� c``��� 9S�݊�X�!h(�����D"�Isy�c#�qy����B��n�̕3v$u�n��T�Z/��E7D��ʜ�:��?$2��~t���s�G��`���5�oe���N״�� +Y���}�HnU���:�ah8<��!��=�y�<�$VU����2����k�F��a��X�0ޗ�b_jߐ�|���{E���L�X�i۔^3ћ�y���e� +����b�B�Yh-����l�C>��� �_¯Ԑh��W�X��1�P^fK�VӦ�#Ə%wz�e}�b�s ��pT&��\��1A[vN����9�#"���*jˆ�5tHJ1�[���ɰh�[��� !�%V�&�v9Z�`ل�(�C�x��|ۗE�G���/3\E�p�_��W�j��2�g�.m�M�C��V��0�c��wa^4,_�\&y�D� t��Ԋ�_�j�8�p�[=�{|���~=����B�,�m�%���;���ޤ�PiA ��-��� �r6?!Ӆ�x�����\e�?j����FB��ѮV��ѕ�d� �8J۩z�g��HG�P��%�R8�G.�UL�5���](������~Z����~pSL�3:��A�DB��R7CE=|!�}R��"�FB����fA�a�InX��Ui�m���g���SύAHTUvn�tpI���@���hIs�������[-�!:���8t��E���H�*_�� K���E���0��=��Q�]�(��~0��kn�X�sM�`� ���L؛ƛ��8s T�T!o�N��S�ƥ6o��x��r�n�H��j����H� ��tV��*�����$��XCb{��? +�{E�����D`2s ޤ&a&څ[~������cw�Cb*�Km0 +%^ �H��d��j}�8L����9ו�b��nGʊ��ƹ��$�oƇ?2$7�����a��j�q�� ��5l潏\����$��]5��(�7V>��ϲ"�u@yE��5v�9һt.N�Q�[�=���8������p�������������PK_+[94H�*�&)���PZ��L�MWj���m��#�D�=��]��o����Z�'��������AF�`�I�t�㨠�f��W2�~^��P鯌��p�gg��z�R�o� 1'o����!��j<e�a͞ܖ���:x���/���JIw�������3L���8M��E-"W�U�w,�i����p�'�=�tJ�k�x�j �E#�3� +�8�:�:f���\����Q�N�/[�]��E�Em�ȍ�q�r�<.��j�$���p/��7E�f�Af��;�ϊ��+��ȱ�k�$�ӈw��Ȋ��f�}�1D'�ܙ��um{��v��¢u�e-] %��_{�єp`Z'�M�5��-�$���Oq!Qb4{����K`S@r�m��p�����"��.�e"�$,�q���"��s�A���)K��=�=���a���8�� +ڻ:R�����<���v�?�.���!�0��K[����l�a;�}��R���g-�'Y��4��*�� �u�;�-l��S�9i�d�Hh��(M&a�+�ۿp�^�6��!/��b���(ni��o���k�����̬+�%:y�3g�����vb�t�~i���/��|����������v엧��X�NM�Y���[:�f���SGKei�Dj2t�ژl&r�Q�M1�mC��Z@~�|��r$"�R5���dh����'���\j��/�l \��M������[�""]U]�� ��*�Gw��d3K�g�~��� �hB~�?���/�zۭ�>O-`����D��+<�U\Qb,I�����L�^Uq=9r���N�|Fk̇�7� �� 8��m#B�=6��a�����Y9G�Q��[(�����B<ǡ���ϐ�|X�Fў�G��A�x=��hշ*�� �t�@?Nдf:�C�"�s���ا߷�lw:���A%%7�Q��n�=�Aŕ��2�l�G��~������v!(�g���ȇX�M�L�u.�*\0����9�<]�اq�u���I'ˑt�Ni̅����q{����OR�����������f�!�;�VSVP��������l�ҷ��m3��ͭ�T-��&�E�`�-_ʣ�_Fy,�����Q�}���U��� ��O2O�(\(e��y�?�I��:Ȝ2�0N^C)ȓ�T$����0��IP0:��7��J�1������/����`ꬉ�ט�>U9��k}�u���Q+��q��t<,Κ��+�)ފ&��YlC��I�}�Nzj��S:�h��S�#F�sPݞ�)�,�߹2rvK�d�k$����`½�r*"4c��;*T`Z�DS��C[�4čƨ� dҨ�NQ`0��;4��Wc����� �`�����47�F^�̰㭰�(���s{��.����L��F�\!����mI�3"b�*B2�]��9Σ\C=.�� 3���f����J�|�/r9�ف��is�vCR��c��P>�φQ`����vT�h�[�?�([{[�dR��T��?=�nJ�/����q��M�(ŀ��[�\�ӌt)���V���Aܺ���/�MBq[�ւ����݉3h��dip"K��5�����A�tJ��!�TV��c��a�IAnϟ����4u�}̕�X���Z����0���x8��Z":#�A�N��6o����^��k9��n'����.�.��ĕy��fT~�����\ �����"�/>�I�7'&�_=�+J�r�|�!*����I�����t���E�}߽�F�c(���<>�?G������h�#��O�X[���Q��ߟ/�fWz������#6����_ZP(��i�s��\)�ju#+U���.�~�4\3�X�/�j0�����ݍ[�<�&ݏ!�D>Wa�VǏg���M�Hɔ���kQ�.�&f�{��{�[��ʏ���%�B����] ���\)��i +���1P!�K����u�H+��$�C����ao�I�V%��%������.kʣ��ɾl��sM�m�Px>cM_�:h���#�su/��C�qUVʣƨ;F�;1���&m@A���(��MN[l��m[r0���l�rhSr@�㔳�\R���B�pd4I5l���pNA�AwY`@�Ao��>��K3��|�\���&I��e��RIG����A����D��/ƁP�k�n@<v��Eks�܆������(�2��a����@��t\�l9)�^���4� +����Q���T�{YňM��=�txG|�y-\@����J�%�W�����$���e��U~�#І�b�Z�/�UW�>d�g��� +���n[k��3'��q����MC�oR�8��K���q�`�ja�"Y,@A��>u�����k>��CF^� �1�my�$��'���G��\@l\�<#�Ì0K���L�[�=�<�������F-fP�V�qf��vɃ��i��V��#��B#��@���6IL����9�^�u�N��k[���c�\e����-�x����O��k�5*�"�Fq&�e}����Ԇ�ܡJP�l*K�́v���P�����jLz��M���s��ras̄�`�:�S�B�+=���Au'��-�l9ޅ�;m�9,�G��<r�H��j>�S����&D�:�{R��>R%�̂��8�b`�Ţ�!3��K�)�ɠ��3R�xr- �4�p�Rz����Xɼ�L�u:,���5��kT�Z��5��v�R�7��(b�����b麏���G�^�y��ٖ�~-��� a��ɗg��.��\;G��(�2�s����������Q1�����#X����;ux���#�����1�����s�Ov3&�L�Ι��-��2��!��T�0+=��o��|�.��>��{Ө*�ueS)"��ϒP݃ ���� �hy,��z����Ddzӧp��Db�J�Iԟ��բctOtg��Nc$�3S��ȏ�>�*}(�)�Or=�+x0{���|��:��+J��ӎG����[�C�Ϟ��hYv�t��Z���i}��+~��:�mQ�n�l۶m۶m۶m۶m۶mu�CW��_��gVPJ�k4�e H��=�8��s��c���k��\<�̵"�3���w��Q�~����D�5/��u�����)t��R�l��*Ο͈��GeC�k�(l/yXoB�{N0YcNE��b��1�;ӹ �9����UKr�B�dn��/��2�[��V���jǜ�c7t�J>7ǾROi�q��rL��5�f��9�w�F)3n@���<C�=9QD��b�� ��KR�)�a�/�=��BI���玑XIN���0�ׂ?ʂ�Z�1S)�F���Qx,�0��]n��q2���1���"ŵ�" ⴶЭ�}�dZ�5XH͢S������=���P�`�g�4�>�h�F�[��(�v�� >U��TC��C��:`��� ++b��5�"*Um�i���[ ��ŭ�Ғ�h6MW�@�� X���tH�oGF��?;���j��l���}$Ik���M��. +��hE�_��%�x��ඖ 3"�aܥ^�:�o��*��PU`������c��CK�%n4#5*�������Y�$�R�bV�[Xljz�0�%�]�����(�;���:� +i� ��ץ�'�5p'W����Ȧx!�<H,Q��x�<��7��G1˒c��{m�5(�v-m~�Ѳ���ȚH7��a���@�����F(�}ѣe^"�D�~�!���Ai�?�Tg^�\U9�O�gh��^˳E�/K�'��%�g�S�d�s_���}�?�ؽ3p�deX�4�ɔx�Of��{�G�W���ʿ��"d��A����XP|�f��'j���{yS8�\t�2���B�~®�� +q�k*��t�㙇ѓN���7��d����H'CbD�cFB�р�v�ܐYv����L]G��x��F��a7��b�W��h���n7 ՖR�p��Q�\�d�~�ki��������Q�P��)��*4Hk�T�vI��W�����y�]a +�W�i�j����p��r�����y�����"�,v$? r��>?�S�u}1B���6xu^�=�PU;m%|���%��\��r䘝lE3֎xt8���}㭊{��#�|�]��=R���|�P�A��_t����ea2a������i��]��l�"u�nY,y��=tH��x�������}��9X��e���x����o)�ܤ�9���t7,�����>Zk���ݵ�� _�[Ϝ��[�b!�8��}whJ}�~�����|^\��%�� ���u�B��l�-t�x{ M��]aS����H�ŅF�dr��#�-n����^ꠄT�3~�ӳ�������]|ǚ��\ �]�ZB�&���L����U ��o�SW���T�t�PH�$�<�a�e9�� +�tC���_U���W��`4�|0����,�>I�,�:�6,���W����R��2h�C!�D��JƎV�a*���"��+0��!k���w���p\I5$�[�H�$v��{%s4��~�}2y�s��k�6x�^ ��ϒmr�"8<�Ƕˣ�}��qO��Jt�J5�qJ�q*�L��5�\�������E5�U�<�Ƽ���k�6����l< +��� ��M���jś��0��$�%��MΕ����S��awRԫ�]vw*f+|zׇ<����ى���̨�����_ Ί�2�eG��<���q�Տ�E������퉇�*�i�AR���/C96O�ˇ.x���p�8��Gr�y7)k��^Xz�Pr��N�j�)Wq�����ʜ���ޫL�Vc>)�/� j:�(7�R��9n.M���B($+�j��b`�{��^����z���AJ0�~�h�S�4=�'�"G0W� �t�cb/��ؐ?л2���g���s���1��ϑ���m��K��v"�8h~�v�]��8�}��%sG#=����ʏ���nn>}���ɳ!/KM�yF�$��L��%���%������&$�������������(���Fx�QHd�u�ןf�4��.F�Λ��y�l�ܰ:�h]&s�_ʑ-U��Ԩ[Vyc�ݐ�.d�p�e��"a��k+��Y'��;����_Y��Y9�t�U\:���* +�X\�,H>�2��j��R�����b,�`!�/���������=P +�rK�U����Ԟb�c��^ٗ��t���Ѕ0���3��:O��� l�594����˽ԙ�[i%{6#y���A�mC�����ci��t����P��A��T�N�X��$�GGo����f0{� ���?�Fj�k7�f�2�\(��8~Pu�xZ���}�q>l�9�s6q&v��D��M���"ZrA)'��kj����"WywVp���7c�eV8����Q��5+�/���`�x�/)�L���~�bSe8�� +ߒ���v ���`�v7����;~� Hf�)n��{wa�続5Ӈ��(����"n���JO�h�VtѧN:l�k��w^5��~��3�o�"i�'������@ȭ�A��RM)�S(K���+�:��9��G�&��K��X���1sU*�y�zyG$���b.�!��8�A�(H�4�樋~$[X<���&������<�4�5� �������E։�W�X."��|�4]������ �UD�t��k��6��Ѡ�K�gȫSKU�HFhq?�f�p%)XcNPc�� `�s�{Բ��k�X�y�����O�d���J�U~3�)��Ba.�q�Vq�Ԁ<T�C��:�/���D�I�<���Ј���^+92�L+RL���'J����X*�8�|_]i����3��gd�Z��=��)��ցָ�N ٯB�+jY���)ħƪ~'IP�]��숽�@�7�ch*�T��%���?zy�����P�j���1,e{$>�+���=zopP/a�R�jn���E��H���Vw���M��&�h�T���r#��vT��M��|�'漜~�=����S�!Lu�S�(��\�X�����fB��{r#��;Z;q���3mT��/u�,UJ�&�.-Z L���"QR��L���F��/�Ȭe�*N���%�r[ɭ��^�. �V�i�hS�"�.8����YZ2n���'ҰY�r���#%����N�z�jQJC��n@f�YP0H��5?� x���ӯq};~/Ȍ_��{�ϓ�aH�C%���]��/j�\�2�<�^5~�o���%���Ye��s�i�n���Z��a���`�����ż��>� �g�%ls�|�=N3���6��Tv��ػű|�t����� �� s��i+0�^��%��m�5ħ���| �?>�_�J�����5�፶�A�)NI��mv(*||s��s�AҤ�:p������B�"����� �Wo*��de�� ��`Ģ&Q��Q筙�-���:�TG���ѱC9eĻ��7���N�n��>��ʕ7�[�S�ϒ���>2��;&I+pt�����ul���'�xc��I&O�.��J&�#����zd��]�F�+U[kpR �:��s�i�4�&:HK�z_Şv���O��v,n�L�q��ѹN��{���](P��j�; +|9:�����1�cE���T�|��,����_։*]G +��q�^�Z驧 k�!���q,��13*a��D�혶X�gc��p_��u�idº�g����C��,c���I�x;P#�A��M +�$�F*�(�m3�5˶c[�\5[,�p�Ay�ǾԌ�����'�[�R����EzK����ZY��fB����!%�ƛ�(�!���H������V-�0O�a�E�p�O��0xV�v:ܮ��ιS4�&�H�=�4;Z]�&��8㙘��_�eP)��M�ռ�^/b����谻�v�Et�سJ3���ʰ�����`�rN=�e?P}iι� �Z4�/,T�PM!(�,3���w� H�[��=�Ab���3Q���Q�'�/�z?��@&l�uWjK0(�/��+�G$J����9m�7�N�c@��A�P d�}g�?S�Uq���֪~7_��ǚ��S���)K���O�B��e��f�0����]9tu�ÁQ2\���7"�۾�z��x,^��P���z�c��U aH6|� tS:�Jk�'�e��}O�s�g�1I+�T}^�˲-��4M/y�,��Fm�4�T��}�6`^yC ��@�ً�u��먪���)˿��V�W������"~d�cJoNdG&��*C�K �LWJ��9�swI�P�u�j�|�L�:`ɾ�"�j��`����لX�~��TC\HX�ĸ�pf�y�M ���� +�Sʹi�)�m¡.B����²"5Xq��RRC�Ҍ>�e��҅�����9�o�?(א͠�I��z�X��7�է�.a�tx�|��o�o'jP_- Q �U0�jX��u����@�?*`����!��lnBʍ;�lU� ���N�5�X�#�4�,'���Y���.��c/f�&��9��}R��f<2�Y"��C(� �dB���h�%�M�f���e���~�=�����%\{}��j�B9���z��o���')Zn�루$��@v���!&ԅ�X�_�9�)(�_����~�-�����W��Â]\a�K����F�N}�3�S*;�����@7�ƠB�V�H��̀,�!fwٱ�E\������Ln����i/��l���A�;�}��p��4��H�ΐ��J:w�C7���d����t(��~� +�eg��M�������S� H +� `/�L���;������6���%=���jg�n�l]�@���� +���[�l\� @�U{ԿX�c�ֺ|�>>E�B#��=?DZ��+s�e���H��<�l�PixMҋB��mU���t��L@������J��#8Pͭ���W��y�e8�?O��+ZPw��Ι3V�zI0���V����n��;����"<,����\��� +��&��4� �/��K���V�h�&�&c�V)��n9N|Jx��8A���g ���WzU䁯�h�O�z�����V +(�%^����>�0I+H�M�N�#�L�%�� _�Q�y +� +�o����%�� ��F|�Y�4���N�UXay)���9��k`͍�~��h�5��d·����"��5��Μ��UE���[�O���ҩ.9�+���Ks�d�{g�$���^:L�`d�Ѯ<�O�F����e<� ,N�L�b���t����4�Y�s.�]��-T����͢�A���?4X�u��� ��7�*���ݪK������g���� \�t�Z��H��n��(�xUa\�t�)z��p�E�l�u_b�FS@X2���##"��X� Gg!\�8�.#����<��6�O�� ��ϨJ/� ����5n��jb=��w��"�'7��_c�Gn�Az���h6|+I�.��4�Vuk�/f�����ሆݏ���T��ӊce��/L��M��b���P�9H�8��e��y�S��=5�$����X���p��j�+MW���?܄�SH#�L.z�yY�]�!��[�6�xA��!V8Ct�z -��U�!�9E���/�[��~�[�Q���A]�zG,]�����k\��J�e�|�j��b����k�,ЭF��Ɩ�f����Xb��W��vo��>�UN��g5����l��U���r)��#R��N���"��ӓU���������г>�-e/�S��!�@��}�����f�w0f��O +�� +�6Q�Z�#�F1�8W.�'�PՈ��h9g������1x/��4O0�[hg�F����NǕÇ���!�nA��x��ɪཕ��َ:���0p�@��ԅ��� +%ûr�����"5, ˊ���~9Y(Z?�(���h��V\t0�II��9�m�h�kaY�DәZi�-&��9� �F�?]']^��G4���6�{��jJV|����͵:L�m2 �w���E���]�v�b{�d����I�.�-��rر�2�A��4���dFj���z��2f�8fǃ{w^մ�]8�U4c�'�l�"�z#���� y7��g�=-�- +`�,r$7s�8P� ��R��*jb� ��@6 +��Q\����杛?��_�i�ǿW�j+��Jʒ�8��2p`4�Aq�f����SsV�K�5_KF�9c��9}�$�J^� Y����Iy����Q7�݊�?�P�t�Y��AX�trT��oDD<�`��BZ&��R�x1��ȶRL��H����.�_�ڋ�k�&_Ȗ�Ø& ;�w礄/�����"=F�E�c^x�AS c��{�Q�ɦ ��Xzh��;�Mp �K�␛Jdhn�O)���~l軖�J����};�|�i|P�k�9������L�B腇��z��}�9Q��Ŵ�~�_�(H̴�yuR� �w�#�d�}�(���4��Mg�9�{�,^24�a��O�_ں1ӊ�KuIz��OV��';��E��:�#��q � 6���O������`%Ť� }Z��-^�7PZ����7��Mf��t���`O&���_�ܓy�L���BM�:�,�q�Z*�AN�b'Kȼ5��aR����l�q|�4� �P +|�Q��Ed[|�خ��_Wu ��%-�ʽ��:�s�r���GsXfFw�},� 8T�csS/I=� +"®��S|3��k�����j*�lӻE�`��L�K�>� +L�+�Ko�ݖP�����<�r|��e�4�����RԪ8="��K��v���P�E4E��<��_(9�N��i� +<����i^��1���kѕ�_���� ��1B�4�0��s����Y@���R�����r��[$ӂxi!��� +k�}�B6mǿG�P�r��NJ���*��1�m��$L�,��6!D�j_5�9��i�E 1WT���7�������v��z)�C���iQ����4e-�<���̬t�o_[q �?o^�)F�N�)=]��w��Bk+z{ZU�A��t����e4�R���M���+͎0�]W&�i�v��P�.�J����wb�/>��n4%Eqc5֗�l��Y��1�+�j]Q���HxpZV�G�e��@I|�D^������3�tyE��V����.�_ '��U�&�|S�e��"L���G�3��� ~)���ĕ�}'w���Kvq�9:\}Z?:]����#����h��U�E*�E�MK�à�$�\�C��gV��DOnq�����3��5�:���Ëʊ���c���O�9N�E��NSS�DG(��V��Y������q�Q�0J_��b8 � R[���T��'Ɓ��C5ѕ|\�(�FQ��A�2 k�f�h�͊Ǥ3RIBL��}gV�R[��M�"1B���+�����dB/�F#�s��t#ꬹĔw���c���{�k�Qۭq�~�5�" ~8w#$���u�@���w�\f� +�C�{�j�j���U�F��Kd�_��J{�=���;U�L|�b�'��ݘ0�r���������N��nC�x�1#�z��y� R+Bn�[9M�� +r��\,T�u>k�ʁ�`���c���rl�>��� <��q��� �8n�!� ����l��o��^��{z��[�wI�ʔ�$D�T��Č�x@+ �5�?�q�d�ҏ|Ĵ�Z�h^%�_��E�s�k���,[�����p$�D(��0�~�У +�P"�]v����ɑ�'���˶w-�M[|A�n��ğb<�6�Mg~�x�⾫.h�{�u1{��+x����v��w��Bߊ(AÏ�t3��.ҕ�ԁ���� +(��h����'$��X�Ů������ź,��0ͩ���;��o���wbj0[T�'���r��h��)~+��X�L��y|��w��/:~�}d�H��z� 08�B�Ja��-3D���]�u#�>����D��>@�����7}�M���7�]$�f��Pk��� ۿ���y���H��5P�~��Ü�Ư�t���O�Vk���M���^o��_�0vg��_�H�<�z!���u�3���Ω��̯��w��Uv�w'�J�LQԃ�ē�H�<6�v9��ā;�ZZ9����|D�y�5J��K'�����cC#���F����.��c&�)���}�������6u��6�q�����l���f�ҞF3~T||��ꇹ�w�$�k���Pn:�>f�K���o�Y�=L�>I�ն��M�fd���b.�t�.��ц��N�*�/�A����"���m5ZВ����#��[����b�^�4���o���������P��-\Br����n�y�x+h1��K���r]_���m���s�����m'UF�2�S�{R�WP�4��ٮŎy�79��A�d;~-����~��+�h&����a��^�^gݢ�F�8Tw5��-�\�i���"�����`�=�K�b�Tl�������mn��x�Xqo^_�&�kۇޘ�LC'R�i�A"��(�K +�gtƂG�_�'���T�W�Iv�r����ß�Jw�Ms^�7�5eeki�e�_��%h֥(Gz��"�$0Wq[P��}6P>��m��I`b��42�p�7�A9T*������s���v2F�_��I����������w�x�+Vn���K��~̓/��(V!�����sIHBt��c�n}�K�븩���|�'���Q�5��c��8b�b���d;�y�y��~T���qH��4 ,�b@��I�a9�3�K�FI�]�]��i���ѝ�ڹ�jrp'�a\�|��@=��9@P��ug������]�@n�F��3l�C������)�jŽn21{�ˠ�]E/?�RN�t�Ř�dYr6�&۴&�o�E��l�b?�2�^D�i��h���5�R$���� /2$�y_X>bǣ��������`��ϳM����_%D/!�ʏ���ik���P�1����տ- t�)a&���6����?^$ja��_���������� �����x\�~�m0��6e�C��5��y������r���/���7m��w�D`�����b!��)����-����-yVK;\��?Nbp7���\9�"�Fu�Cs�q����E�E'DM��-�Xu8fjV2��%1 �!�A��G�#�OOM +�]A��3�:�! +�ɽ�h��t�}v�_1�Gm@�0f� �}?����0�Z�0�{^�jo)�5Q����F�$/'0�Gз�S!�{0�3]p�gz��n��ή�J�]�1lwk;Sp�y��H��۬U��V$��%�#���!b�C��9K�g�C��=]��|q?��^?TG��<LՊ�Q�:�--�~*�1W��Jt�n�]��z�(@�*n�E�Kk'�����ޚ:���g�����H�,��]�K����T N*^�y˭BQ�^�6� �hU�W������S&��;/�O�<�A<2�D�fֵ4��-�z�$�9��/T�c���%~���T�.~�,�ō�#����N =�A�*�.��H�7���R�H��u�������*�[!��랅ۤ�0\���dWȲ�c-`��(E��y9��V6��?HGLDR��p��a|g=B +k'�hI�g@��I�-�=Ij��Y5��S�{��Il)�S_� ۆ܉��cy���uX�:���8���8���k�ưB�4��3XU������O(�S��nj��W��y����a-΄tg�ހ�=.kZW��$Y���[�Y�E�ٟ��{ɲ��c���R�p�VZˌ��R�$�+�~�5��X��Y�YP�����HV>�}�� �]%5`_��'�{�8��?�o�M��W.�LP{���ۃ���@}�ԔŦ��,����b/G��7�4�G���o�]]���u�of��� �Ά?��Vg�3�B��X�ڌ�XL�·�g%�n�������{`���,U�EEp����}^Yo �Wc��E���K��TQr'N(FVQq\�rU�r�۔� �;���;�Ȃ��C4-zk3كp���9�l+O����l?i��Y����˚3P�&���,l���8� �u��tV���sfrs�@�EHp��~ho���g�4��%���""}®Cz�j�+�%�'��ξ"�����;�w�=���PJm�p�V(ݧ�;J^�{�LlM%�����$!n�P�r��lA�b/ݺ�T+Z����k3{D�'� ��?MU�)�P�D���� ��J���������~��쟞�fZ����9��k[ +@zQݲ �@A�䨽��R#,��1�\@6˅<�W|���.�4������t=��!I2C��U��A-�b�)��H+�:�}���SK�%8,1&��A=��)Pr�ut�s��A��I[���<P�/@���N��~��y����wV��iY��9�����%�s���ȩ/UY/��uZ����w"D����r=�;��#f|�w#�đ�L�/�/�e�m��Cn=�jh�o�e�m��,�d�S�ka�I@3ܤ@P��x� +<GO��m2��Z��h��[�Ky�f�5��5}B�r����B�,[��k���Ɲa.H�+��&��u�;�0-酕��r�*�Ӱ� !gb���kgf���j��5E��{fX�o<N�9ܥ�Ng^��{�b����h|��ǂ�q�<m��nX_e^��9�A"lXL'�����O6�Na��YɞD�8��G;fo��6�/��=�*��]��%Uw��=��=�p���p�"����^����]�W0&7A�Y=�A���=\f��-�Ꝗ���ڗ"�� \�''U\j���* +�\TJ�d�%@��8E6��)��-/� ��W1�d��}\pဂZ�f�)t�@ιM�D`Z�Om6{C�`���im�+�c��ɷ�Ɨ� +5a��V �x��a��L{�Ts��p���W�&�1�L���{��-H�[�����8mg�/���|1�wм����A�����<|R#����=bI�Q��!v;�Oi��o���"7"@Ѷӹ� k����"��I��t�ʃ���7XƓM���r,�7��y��(Ul�¹�)�%^׳h�������?�G~�V/��XRZ7k#�z��??m�=���m6I���'����h��XF�A}��^�Cٻ��P������w�dE��4��3җޠ1�z����do-�8����HLe$� �O�<vo�F�a=q�+q���o��D�:K+��G�)w��2�8K��l��3A%��+j�9����I��#���ip���q:SߕN�R����^�+�<�p�O���� D�"�J�Do��mȗP����i�L ��<�E������d�2�4Rv[���hj�S�����A�`�Z��v<({# �V��K��ߣ�2��r���^�ᑥ��KL[��y7�ixi�ט_��R�>0�Ѱ�gd��eeOf6&�YA^�̸J�����s��>�F�+�]�M�K�2���R��Ƴ3W�����uA���i�R�֜ �߲_I3ưL�[��J���p��G�?3����_������ +?4�٢���!�C��Zᣋ{q�~�^�j�>�I�g��U�;��,� +�3c���i-9�~�+�;q;��Mb?�%�B����&�aҜ�f���E(߫��4�O��V�Ԩ��m�*�����!���*t�� �ך�;]�gA2$�өi�|��g������2��FX�m�x90��+�h9�$<P���#&����Ӫ�p�H������@$5���d��nz ٹ�\��o�&�Q��������H71��=�B�5лĊt���$����T�&��f����n33�����Xo��~� A:,6�+>�HA[2��� +�Ύ׆C +�j����chT��O�j��ڢC~��`V/����Bz�6��H�m��so!L�0��1v�T��}"?���Z�C����M�pF������E[WD|_f���cI��'w���3��H:�)VG)%�bX��N#G�h�0 CuW��d{]x<P��A"0�f�"��K��ڵ5����p��x����:���CJ�S����x��:i���7���^����j�<�_$_���_s�t�oj�>�z�g�ө�)�8=ux�or��[��5獖�<C�;L��������y�4�3|=܁��hE��6�hwJ�"���|�)��l�ԕEA:b���j��ђ�ʂkf�(��+A'���c���^:�|����/[,�Fu�lm�S=#��~$���s�Z�36A�U�9�x���y��(vg�s[k��X���^)��8��(��Tl4N��d�q�ݍ��� k����Vw2V�݅`a�9�O�~�������G.@��SoN�,| ����Ʒ��D�|��%��g�`��{~�O�c| 0�3��M디g���\�E��8���)#;����N����ڠ[��]U�C��.7v?��)iZ�NX�Po���'��&�?�mf���"e)[|����Qs��eHg���;�sx�58�=4�N�@��9���6�$|CGb�7����nC�FK�������<0��0�v������;#t�ۖy���}K��"U`��{�����k�/�:��%�?_��23���{QEߋ=R� =66 +GVJ& ��m@z˜9P<mz�j�O8�t��Rd��:0P�^�EI´!U'�f��*���v���ε�W�\Q�ೝ���$+��L~����@��ɢ��~�3�DT+��j�m1���o�%��"�l?�?xP��މ9�Yx�]^�� +1�8��p�B���h����y���xݸ���a�����}9��q�6��*�fܗ ��E-��)�ƟJ3��D��yJZ�*��]��e7�q`$��jdL.�����?� �Y��5�/i�4Z +��T!�%�|�B20��f��0K��pY�:L��wi��� +1�����ozP�G��-�B��M8B�*]�1�Q�G�uQ��9_QLA}�hO*#�s�fx�^�E�y3��7=ɩ�٫{�R /䲾�v�y���а�Z�N�f.�7�nI?V�.yA@�~��#����mcơ@;����wb�`�\��n�6�F���/H^�A5�V��H�I5���()4j�� �R��n�,����� +�]=Yh73> ������?K��kv��� 8C��%+J5��=���݃ٙ��PʙY���ֈ�!(-�F_�rXc���U�p�M3*շ���������?Wlz������ i�pWI��r���$��.�#>���9(ʟ����(R��aT�*_ocn�1��R�,��1/凋840�O�~�d�-�"�Κ�l�� ���q��f't�Q���<��n�ϴ:/���:�����R:���V%B�T?3PE���R'��t6���7����@�XV +����s�B�n�D��-��N��D��x���"h��/� dW +z\v�R^��<�Ա���B��)�@v\�m�+�i״sH��rA�,����{0�˜*|"TK�_�b�(��,�nnl�y]����jF�$w���_��Y �����j�K����f���J��593?����}�U�<4V�Q*"#n:�����Ӥ�[7��0��!��_>BH����E�:[4��o�� �����Kh�X�q>G|Y�����~>mڹ{y;x�!��>P�AM���.��q>g0������x/����X�B���x:5�600F�rx�B �G�6�� ������E�uya�TS0.i��EE�8�.J��<�&��6�`��4b��M1�[�T�*U�yg�$�i����w �&@x�Q��X݆�\.�vs���<�@Z*O��������rV-�B�`��e�x]53�I"�w(��3o���'y\�$uw�o�?�S���gDwӦ�͍�l +�]�!P��T�!���ĝMҵ���T�T�hܢ\m3�cI�ɉ���E-qS�j�y�K>�SSb��.�y-��dE���lx%���#v:#�矃����ٲ�ϵ��e�8����8�l�O_�b�Ik����P\�YE��g�'l|�%At,���t� �$�L?^�~B���M��R�ȫX��f��8h����ʨ �c��]!��N�tqɀ��]��L����(�偵�����P+#_����'w(� ��H�S�Y����{�2��-�M"NI�_b�.�%JV�[�~�y �L�7�����x$b$�)���k�W��4t_z���ZW�y��q�j�G�@�r���ً�c�V���~��|Q����Vr %��0ګP1!��~m[��3����Y�s�o�ҩ9�~Ә(3H��c�mlN��z����ɠ_�Y����^%�pQ�� +ojkڇΣ�t�f�e�"=q�kb8����X��<.�U�{��k�S��m��]�$���"7�}+����Q�-�6����.�ȱ��-�[���bO����gt�L^�^S��\ْt*Q�}SD�d^w����\�k3Y��RFSuY�CHh�{ڪ����˸�`5re�i�/A����X|�t7�i����=�/�S9�̰��1b#�,�?�'4'���L��]at�Cw)���j.��ñ5?2[<���k�t �t�psU�e}���wi+�/d�f���P1>e!z=B1��pu\��Ǽ��J`���7�d�V�d�!��ŝ?�%���<�/����m��q�KB7��PtF=�>�Σ�o1��}�:�,_����;�ep�����������-*|�Z���������� ҤHy�}e��d(�����ovم�?������-�u�� m'��M�4��hD�p�* +�8p`����n�#���L�d��H�(UD���r;�����i� �Y�V�a^᳅ܵ��l�r���`.��NH�q�υ,�Ͷ }�-���_5;�a + W;quPC�0��S7<wӻt�����w�v��3�6����A.`�e��V$6}yd�����%Zΐ�r���ˬ����,�o{���{�o��d� +g��0Q�����+�q��S��We$��6���Ѫzu(Yŗ���Bx�|��m.�}�wI�տp����LL�=�'���+s����p�\�Z���6#�!#�U5z�����e��6I��RG��꺗�v��cS��Y�I�"���0�?�6�Oho��)�`dO� �哣^v4Cje�q�i�^���ddN����)J��Vg�$�@������ӽ=��Q��<���k�9y��x�bt����H���v�nJ�a�g�'9t{cV<�)��v��%�4���t ����Mq�I�x��%=��c�W��a.�{%t��Xo�8u\��W!~�4y wO�f2���鬰k0T����qOT�l�4���τ��pQ4�a�.a��p� U1�,��htIjF +�k���L�u����{ �6�]ߔ��J�;-jK��'�\�{�~�9��8��*Q0� +�����V�}.m�O�l��KހH2`-�tPC�ܙ4nU7k��A�)� +�MLaZ`A��u�s��5��X$�`� ZzgO��xi�А�� 0L��{�y�H!��{�Ԛ����(�~�f�S�,B��ժS5��� /�~D����"�U>���������'� n�1�%������������(�B�3��%�*�4��ڲ�țS&b�k����ˏ�"�ƈ�(~o���0R�t� ��t���x®�It����#��i�EAXδ�7��t����FE�;Be*�)@?1����|�`a%�q��`�8PQ���$�@�).��ZH�5�L����� |������a��� js;D��'��J�4�R�"y��x�8,H�q�.��/"E[=��f���:���¸I0Z�g{��~��l� +A~& �nIy�a!:��������y~������]�fKU��?4�5pHD�#��c2Y�f�����G��Ʀg�'�U��{l[U:�* (�h��s���T͈p6��V,� �Ȏv%�gPV>�������IX��z��G�k�1&�>��Q�O풭����{�k�+-T�[��K�=O����~�rˠ"׳><,&P²ar'��n��U�M�H����<���k�h��ӻ�ĥ�Pmb\Ć��[�X ��~%c␟��������A:�kLa���r��Kk9q����EG蜩tH4q{D�,��t��vJ}¬f;gA����z�.M���6m۶+m�OڶmVZ��m۶m�6�wzt�E���U��"��s�P6%K\�ޑ$h�ƽ�å�a�QN^��dPJR����tk�9��#5KB�)0��0��E��Y�g���}/hHD��>�g�7L�Fh���2��5�+�n�a��D�[�j[�����}ͳ����� ��ߘ�L䞫���*��`B���hc��������5"�ϔM'��6)����r�/<@�ŭ���P�@�~7p/i�+�g� '+�w��,nB��2�h7]��5���Wx��2�k��rl*H�uv�=���a�jj�Ԣ!��)�r�A���WR/���a�=ƀ���խ�E\ز��7���UhA�k�e4�k�zs��OkdB�k���S�}�S�զ� ��2��+b[�ؤ?A�s=ó��u ��}�4p'φP�X�q0��"}4����Y���fC�:�.Z�-��[wר�+_�ou����[�u�@7���nD{�������@�s��^d�iv̨\u�&�+���(��/�R�Q�@�����gP�����@RI���E�|Ru��x��y� +��_�c��g� +ZAJG�a$+��k�:o<�3�~��G�����X�T��B�-?���yx ��J_���Z��0l%c���B�կ���0��<a����H4KRY�9�\�W&.�x�<����F�:dcN+�S��о����a�D�J7z�X�ݙ��y����:(&O�!�D +�;� q�_TsNO�8��T*5���.{���1Ke��[!T?ORM�=J���wv��Pdm>7�m�@"i�S������`I��ፙ�ښ����ďŢ�V����g�h_I�J�J|7�B.��ޮGR!p�C� M-��t���O�e�)vj�m��8o2��b�dݚH4�N����!p��2���I���)ZO9�"����n�������l��#�ZM��]����ny���)�턷�U��sܡ��N�C�y-l!9s+��b7��8_�7��2� ��3�6.��b5����|]�������?&���A����v��Y��ђZ�#������`K�R@ef�GM,L�Wv�aD���@�s�eL�P����;�V&z�t���$��8l�����ztZ��x�j��|�0��uI�{KLքX�*���b�}� �&v�6�A@!0�4ߐ��7˒|i���G�0���O�Q�r�$OTo�]A��7�{ �^�?RȴG�1��_v�i� &Uw�_s)�ڹ��q&Ϩ��Bۺ�T�+���m����ᒔV{��n�j!�W�T+�q�v�J�zҹ����8O���֠�{�ޖ��yK���M����3��R6�(�+����2�AZF��i���(D@�[L��=; +dz�#�� l4|D�K����7i�Cm_�o�#x�l��L�g7��9�/��)���{��R��]��Y��H��_�% +���k#Dsv 7� J����oP��`z_�*\/�N�"M6]eq�xq�"�M�x|ݞH�ٝ[&��n���Yx]5�6w� M��KOU��V�]:���;S=0�EMT�P#1�0|O�f�7���ŷJW�܆����&Q��Eҧ%,ک�n� �2-G"�۰7|�a���4XKs�̓b�}���j�k24&Z7�O � �j�%l�4�B�3U�嘘�.|^����I�A���M!*��&T�,G�t�D9>��azP�f<��^~�@Cx@Wڄ��_J���{Ǡ���Z��q%θ��G�vXQ����{�w-��ri: �\L��G�~�9�B<�z��o�����(u��uQ(��#��E�@ۤLV�Ŝ�|�A��ƳY['\|�bNͽ;G��H��o�p5�an��GI?-Z?][t��(6�u`(�d"����9'�����!������NvT5S,R��5i��j,�l�m�e�HHs��!.��;���,~��41;�=�ljHK>�����&�`�ze%s��4�$���!���q��rP.��4{Rӻ9��W0%w����N��d)�!?*����P���Qf����%������yY�{���<[�)^%�i�U�i=�;��2eS�k� {�H9cM�"c䜺x��3@}������|AO2?�L�+���u�ɏ�+�K,_���w�T,�,n��:Y0 +�)�7�>�eŃ�k�i�LDQ���$�k"k�0�Q���w$��{`��ҁ����6 n[���S�E�nFɖN�[���A��$���Z����qIm�;r��z.��,����e�|�dfu$���+�B���c�����J�ro��ra��G}/����.ӧ}�F��ff��rW���՟��{R��R�Da��-�kV-��a��k�7H�B�'���)��n4��O��Y$���rJ�H�~)��Y��A\� ]�-��F���Ɔ(���8N�P�|�M�4�,z�}db���A�tL �un#�pt>{ǩk� i��P家�Vo*@+�M�,�,�)@|!+�=X��Րj��{��@��:�;WH���j����;���Bv�V��4u�pO���Oh���\vN7N~8S3W7%�e�������V�3_�WKk�"����+�;�I�.#�$$ӕ�A%[m��鞢�&����O<��\�\�$�V��WU�m>����V�gZX �-��%�^,.%�b'��N^�U�ϒƮ����K])�x��[?m�5)v1�X�b#�eM{#�PW�Yx�+��4��r��3��$D�CvQUR���d�|'����E�����s�q���sKi�����P �|�M8cT�/s{�B@�vB`�����ur�N6������:9�����D.� ������ ��.u�ON�؟�v���°.���k���K9���8�����ɇ�k_�6ڣh��e�th |Vګ��'��;�U�|)qD��@T������:zq�7H�������9���a���v�N%a��߅at��/��d!��x��n��4,���E�vh�'�B���� �O�U�(�X�vP�#i�'y��a�3��{�00Zi���0qnc�AV;��F�l;BQz���!��er.�z��i�~(�%a��|�|a#d���5�^��}H`]�&*v�8�c&��M���x�6!���Ľ�鄾D7KV��?�σ>�2.��mB�k����^������s�$ =Ɖ_�x%�?�yQ� ����N��vUEx�ϥ�_f��"�>Ē6L>}' �aB5ןŦ.wO�W�Va<��Jyv��"�����@�1*7��f��?�J�'����A6� +�7R8�=��K��k�?IH�ki��%����i�̌����Ğ��TX^ ��{0|���D1��$�o��t3�>���ڲ��۞��B�H�X�2�&6��2? y��1��8M���z2?�Rq�9�_Lˢ���+����G0�W�B�}0���ջ �����Ϛ����)�TQr6�� P#�*2�"�s��;�����?g�t���>� �Yk��Ԥ�u���}�b�E����O.��Z�+��F��x�A/��x��q���'� �4���Ԟ\V�eH%�xݙ�㎬Ss�t�����ђ�0%�<��r��������Q}]�^�L��ݎ�L?�F%�Y�*��Ё˴�q�;�t�0�((��%T�hӆ�Y9����8��J�=ο��� �QE +Q"3�Ůq�`�nzH�/��@�Q��T��k��b.�������TM�ah�`�׳��?Gѵ�Z���I��I��yE��PBk�qg0d8��~�r���t8�C-z����́XR5�22=-T'���Х>�����˃�OL����Q[%^�+���V���.�^&����Kf��3˨��ʷ%�o�nO��p��+��fj2�O�`�B��r{x���t�{��@t�䛴J��Q@e�rhe�'����<�5r)��Rf��5���ܧi�;q&�~�����@Zq����ˍ�^ �/�B�ԴKbZ����b��>>x�ngYqW�4��م)�"¹��~2š�zd��^+i�2�rfS��ꞇ��d-��Z�i�ƽ�#�Ϣ�����@?(�������(Hh�8��/�˖���O�����6�>��Sv���)�*42��)X��]�"�+jm�����g�%��Z8L��@s�S����C��,_�8 :�C�Q ����3��h�����Z�+&��w8BҔ9 �5i��@M�@����c��P�s���ݛa�;Q'>~8 �������畔ӚF��W̺-�W��$Z.��/�G�HY��n�|ѐ�s+J�z�����}�sAc�����wm2l'�\�a�Y�^�Z[!kw�*4�g�"�a���F��=�)�Ƥ*��~���:1��ܮ�V�q�:�R��Py.G�d�I�R�PZ�yv�UN%����D1/�����b!qk�`v3N4�w�ܷ���R +�Ɔ����w�yK{gJ�㯞%J�v�J*��� $0��{-"v��E����rڄ����=A�ҁ's��Jb�c5��}�d�K�r�~e G^QG�I� �@ÿgH��?X��������s�j���e� +����B�����צ/dŗ�*�=��L}A)����`xԯ1=�D[�2Nj鏸i�)`�����*��{o̺ .E?0~@ݨ F�LG]�P����'dW+�߮)�Y!����v��}�* �;쯸8lFLz�&qL�0A�G��Եl9������u,��?߅W��c�C�U�&LK)�N����e>��u����o>3ud�L +���"��:�W���������~��W�ߌ��T��aݢ�pQ���iSzj[r�,�e�eAfy@�Fđ����F�g��z�e�����*���˂�l�� �!�_�t� ~��1�1���j��s +5}AĜ��f��{ R�9����8������t��v ��Z����Dr1�k�ї��"�O�������U��YV�����n�}6CP���M1�f܌ ����������� �Zu���kz�KA��%[���kM�?����%E�2T�+0p��5����A�<뇫�7�=A�G�U��L>��:�9�ˋj ʋt{� ���/`�v� �Y*��I$�� +���ȹ�\=������pc�����V+&�X݁�>m����U����#���A�.�M'6S���gT�:S��M�vc������sBw���rI1�.3�p���g����FȒ�Իޣ;�{OjѤ;�i^~�8�nR�O�'��%K-h&I'e;�1�S���O�n��mJ�� AYM>���I��v+BM��g?�7�8��M��E"��BQA�z������.�o֠o��Q��Х�(����.��?�1� �TfUXe��9�.�����kTe}sf��C�qÒϨVʽ��ma�z��L__�`C?�2-I,���`�g��p@��K���:����Dј��X �vm��X-�J� �螃Q,_�#+^J���F�g�r���j�&�A 꿃f@f�9.n� +3�!<_E:TB&���r�wP���ˢ�@��������̅�22F�j +Wi0P��@�HD�C�@Pʚ�,I]���4���Tz�6ԯ��NA�o�j��G7uH]\��̴��6w�IKk�W\<�_�̔Z+���*�u[�Xsw[r��è9���7Ζ��4���āQ %2A��Rߠ�y���^�#�� Ap��m]8�t�'XE��FVt��<�G�J����ԗY���1�����U�#1V&��������1����p�[�f!b�=�����ɗG�~�R� }�!F�j *__��f��^!���_K�f�h�L�RdQ��Q��֥8��.�Ѡ�VZxh��mѓƭl>�9ۖ~�=�����H���A5��ˉ��/F�i��'=-ˌ���� 7@{�?�x����'��(G�"/{\�/��s������ȩ����SA��ޤʺ�P�`PEF�ƙH=��z��L�h�&��&M��ғU���Kw[Bl�����a�B���EȜ�֓�7����)�:"�[:� y�ۤ`�����Q<E/��>RB�Xp�(��tε??ӉM�jWMƙs;�^V�\�u�COɾ�e�BE;�m�4������,��蔲d?��B8��T6Q�_"�E�DŽ�Q�X����p��߽�V���-��h�(�̓N��B`�U�x�p��bra���9����md(��BFn�� +���������a�EG��jl��(HYj����z�Hqޕ�y�ss]��%m��ү_{R�$X}�&��\�����py�<'%���T���㗴al�m�\���r'c��*��݇����� +x n��Φ�cg��nB1S<�d�?N�K�/U�Ɓ�Q�k6�������[qz��o�.~��I���eV={���#�HS�p� �e��ՒlA4[<Y^�M�X�{wCȾa���|��י���u�'��;<s�����X!%�1��Ù��ҭ��-��K��dF� �Ì�h�8��z�}oz�@�S|2.D��B͆nzU���Q�w����R���iCI�T~ +���3PZ�1�.Ƭ3�~8_�\���M�/�]ͽxD��*��눢B{K���b�dKIE�ɤX��"g�-Р��>�ݡ����pLN[���"ɟ�=�2�CNU��P�I����H�g�~�y凊פ|�Ŏ�_�fJ=�>����K�� 8#{!�O{(?����m���5��$:�mݶ�v�.��&�\k�i��^�9&��a��a +w�k~���#dd��h�����[��P���S���>�EX��v�q������ =��a���^�n� +�v����؟tbx��ɞX�r�8�h�H��Jc����h+����V�i�?�]Tr���5��h㫓��c�I�H�s��\������qv��b�y�+�VIM:�����1���u;R@��8�dvݠܻ(�!�s���,�{ �g~ꟻw���R���o����7q{0��{� + l�o��E;�JEA �2e|#�V��1�S��N�fs�Z<���-^ǿjPüu��n$�6�y��Trb�k2��M|kX���<�S��F�,����3�W�X��O�����®F�(���HN�'��SZ}������Msa;�,��%���QU�^N���)��w��[O1���=�F��Y��p դ���NfM�2��H9�~:G8c�ݗ�PV�U��4_%��b��F��f �����Vm��ɀ�9ҽ�i#�W���z�V[Z��f�QX� ӯ +nj����i�U��r����$�v�VANŔ�ܫd��S�Q!(A�K���:��&��S��F��#7?�%qǹ�\�r"ݫB����lt��tI��p*X6���;|.����`���Y����I̽n@Y�Vn�7��t��'qA�yOW �Ub�9�}�.F��d��W1�c����1�%`�&5���H~G�T�}���Z��S�h���k��<_�k���R�;��� �%I4�9L��ݫc�w��v��S4"�٧��;C�����S��!�Z�WP����;��ˮ|��'���_+��G��@r���gq4&�nP�l�q��Uk���0rح*4$�l�p� ��[�ڱ_�VAA�Bl�M�t @KL�_�'����IQ�,�ҐX<�r�^m�T�����*kx�ri�r��T���� �ɫۛ�ܠ-�{m�H����*���c�B�&�"-���"A����i�q�:�`�?�+dV���;N+*X�^�dR��A�:s���L^��Q�<l�k'���ѭ�5Η���z�ڝ>�c6�ݽގA\������f9� �WG�,�U����cN�D +��o��~ٸ,8)�`�}���m +��b/`60 A�q(��+��T��U��/���G�|���?���A�+l���U)Wmq{�!z����2�z�V��Q������>�HL]�D���Z�(�,���A�LK��f�~�|b|���6���6�������JU���<���x�y4���`�)_w�%��v �kJ�Cr�Ad$WEꛎm�B9I�$ۜ?�ϩ(WAOʤ"�wc�ӏrL���X���S�l��)�hܜ�]���҅��9k�?���Gj���Z��!BM���ݛ��Z�����a�Z.���Ż�߄�㱄GMs�u�DN�O�-q;��������e5��Z;�C pBtk�|����u�nc@�t�}c��,��X(��cG�6iÐ�y�����=;6"���am~��sQ�Pz�����3W��)?;�m�YXh�<pz�0{�?��1��E^���U���i�|Ú]4�.R�rQ�*������.W��'3�.�M��W�x-�ҡ�V�Z����#4��������/����]ꝿ��'+JĶ��*� �J}��9cg>�Kk�����,�>YD̄���,Sy'[j~�[����B��]�i�����;���6g@�:�aO� �D�Ϻ/�T�"�C��9��>�����zq`��x�i8�����N�3|�A�[�g�_~J܊2�5�H0A�q���|�� ���Y�$-୕Df|�`47o5�t�q�\P~�=��cӘ����dU�� \=�ͮ�:n/�q��o��G��FF"|ո�����o����.� r�$S���,���.,���zYjچ�9�(���٪r6��X71:��M9���t�"��Ѽ�iR�����ꉱX�0����3�b�����i$�x���s�UK_HnN�)""|R{9��Is$erK�hE�ҏ�e�0��y��C���B��Qd]H����RW:c���0��L^��W�`z�z>��XK=�n i/9��zoXV���h1�����������^�sKF��2n㼟s{�"�^���c5�q�H6�ᇽ�>ݢy6w�y+o����M��SS$w�՚^B�ש����<����T��ac(����p*'�֢u���&-BQcOL3uf~��yr���"�ΚC���Obˠ]C�3|�O�/,�E[���<��e��4��p�>J�:�\f��T��WuK���k^�K�,Z#�og�Z�b��H���TLPvUY����?S�M!ĵ�7������~����)���Ћq������_���Y��������ޒz��kn!��d�'pH. �1x�0��V%��~Hc!�t��,czK��)"��7����8P̅B:T�t�O3�1�l����'l�v=7Jh߾TYa�`���p %�"�UI��f�Y��4����*8� W����9l:_R�}�h�I\�����R�/7�2 �gHv��k�)�/6t�O,P �6�2̃�����V;%��)�q�|T��ºdlp�ș �� MD��+�p��qw�!�E>3O�)ݱ,E�r��G�������ſ�����!z�Y�����\�iV��;�Mn&�`%�}δ˩T�-��Z��T�z�p����5h4�h3Z'Zt���i�#nA���Ij3��[ &TL����<���!v��&j��j^~ܵѦM��%��d����X/}-����`��U#>�A�{�K�&]j��O��� �.���vC*�W����y����Y���dQ���1 /��E[/y�bع��3\k4R���ٳ*/����jz}j��� g�f�����)���l��Fu3��G��C���k�PU�W�M� +TP}�>�(f|r�'k�˾�3D����� +N�P�L;��߿g�� h�G'轢�w�˯���.X��w,�5��3�,[��j�^w#��H��Ϡ�%�(co��B������K�?��><�8�e��}1�0�_�}���}��/�s���16o�2��(8��`�,���5`�rm\��[j��u!���uL`�\n#�����a[і�A�@�~�� +�������i�L������ �YK��D�+�-���,�}!&r���9�o�m�3�y�֣�4�����)�_Y|����/����Z�vU��������7m�X6��3�1y���+j�\��2�2�y�� �P��W?�r����Nڞ���8m��84c3~�D��6�G1%�z�Q@�&qyܴo�c�L�}X�v�;~xi�b;ak�!P�C*p�J_��;���{aj����L�ڵ�b�`�)��!=)��Rۺ'���8?R�� +���7"gP7М:��U�XD� ��_+�Қ��3���Ď�]P�U�,&�{O7\�ɼx��2�51EW9�ZT)g��� A�[���Y�j�1�s��� +�}��,?X�CCp����Z1�������2�(����0��Q��w��<>6��kF��� �ױ�3�Te�0�Zn� wNL)�6���7y�t +�|�|M����K�8⽔o����iU��������1��-x<���w�I~���~0bZ���MIr�S�Ik�nb�BF�'|7a�xEM��n<��9�o@ +B�%��?���k�*�������k�1^�e��P�1�������UXv!����QC���D���a�sc�6)�_|�N4��=��7�x˧-l���B���T8˽hšh�r��]y��3<��l�}��aY,� +�s#8��[�ȩ����m���Zc�?�.B��z�����+0���m���]��zٜ�W��n�O�%L���9��ݳ��6�������A6�d�)\��~�&L]y�jِ�4"d��h��OȵG3�k��J�-�Խ6}*�{�u�=���V�Zv'���jb���|��R�f�,�bۦ�B�ZF5�O�Ȯ�?���o%O�m�}��/bg���3@棋�#��Ɲ�T��V� Ŝ:�}E�� >p��Q J���<k�?��p)���3��i�O���^�ju-�ɾ� 4QIQğ�:�ils��$��!z�}�8&�]d'�.��jg�W��V7�-5�7Z������B��5w:>�5�kY�Ü�@��*��>:Ӓ T��eq��A�2Ul�!6���O1����Tݺ+��{�K�f�6��'�j5�!���m�h��^㮍���M�͊�0�ߝ�39�׃�:s0\+��_�e#L׳.ŋc�>W$.H�O43���Ϸ��@�����- ',�-K��P�2N:%�ϾC�m�����<-�����F3�K�Xی�qBv8}����A����N�5��GO�����qS������{R=�٤�W�-K��?���SkC�R�hG��_���F���j�ӭ��Mz}=l�H��017^9��F����=�vG�M���b�sm�t��5�Ǧ����������_��ef�·�$�W�p�/�u�P }�!k��^%��Z_4��|������±@,�{ +�d�,'Ps�C�*cu9�SE�|�]�F��h3'/�B�z�nh� b>�]ء[���� �&�˝�N�|ZM�\Ċe�y����ן�gA"�ׅ$���>'���e5X�� +h���`w�Ar��zN�ª��:�|�:ju����SE;ؒ��3M���-��r��w�t&� ������,;|h ��<���$�"�/Ihej��|v�9?����k��,���T�$�^;����i�\��I�Kx��/m�pF��U�P,�cZC�R�׆���迺����V�G�����/q��S O�oD�~�-~"_�҇�@ٷ� �D��L�|��QH�����p��Hɔ2�U���)����5�Rw�M��ʽ�V�4�F�k��`�)���i���K��QG�`��y�d�x���9�)b ��?��܀�y$f� +o`��V�I֟�����EʐU�V�� {�I���pL�*�/�|�����`��.w$9ŐK�Z3��3X�T���̙�i����`��#r0K�fk#�(��Q&K�EBp'8�3t��WNeLsɐݏbD�n��kg�cW0 +(�$�X��J����>��c����p ��F_L*>�T�s.ڗ~t��'�y�Һ��?�Y�%�?疀3~�(��D��*� ����� +�c4jD�f�WB��^��n`���5�~��>U�;��e�CTC�1ځ{T[0�_m�b^�� ��R�4L�/��K�=У@-���A�|{�w<����hָ�� +����T�F� �4��3f:�t!��n�{�BTac,;y��zL{L�ݽ^ƆH�l�d�<�%<��=H��}��mɖI�����'%����|=����ɛ�����2�0���?3�-G�K�?1@_NL���#DH�����L)BR�6@��!����95�p[ �_�2�G��<��L� +<5e�@�k�����*�`G��ŕ���b���lj���uB�QD�ڭ�Zz���E2V+a=�埬a]��7���Mz�w`�5�⃮V�Y^�qk�l/�ʓߛ��d���/�)�M���O�_�F�8����_�C��ܥ/�����1�Un����+��3�W����B��\����w�]�r�n\M�VqW��Z�v�f8r��N�751� �!2I�~����w�V#<]}�]��r�9������u���]θ2����`t���_6�lO��#M2�BiZ�� L��V�ƣm�C��=���1��D�xK�xin�J!�7�y�=�9|�� ݘaEt�d;����@#�DI���x�3"��ŭ� U�ʱ�f�%'�������s��`�.�o�[�*�i`��Е]�D�xNߗ� x���!��v��<oI�N}V�R\4@G�p��k�̠����O��$4V��Gcqm��g���o���± +��A\��5Z���o-�R�7}ꮔF�P�OF������\��Q��>s]Q�P��ӟ�{��M�_�����jW�O�]�[��$,gǯ!��j�dͅr��/ɪ�(6�f.�l����ڹD��� +�W٩� �:Po� ���kE���� +4�š�����&�y���L�*��\����3�yu�QW��J�e���j�jɅ0�Z??�8E�{)��0����q�ѻ��-���M.�~���q�v��G����i�@���~���X���R�E�m'�ѽUg1"��b�(wx�S?�q�5o!�x�狗��l��QD�,�-6��٫��\��Ef���l97�Ј�b/ �,�7�A���Y©��l��_�����)�4!�6�Br�ud�\�7����<���!/�zΗ�H�s&�>�YuA�2էo�7'�N\��Y�$>/��X�F#��BQI�=Ϙ��'�U��ė��9 A�p�����=��q��f�u��.��AO��O�L��T�;�����[�_f���M`<m�u�"8��� H��ۉ$�_�����#��S�8�'#��� +��t�)3�}�����Y���*vp,a�²�%�ؿ�l�v��x|�\X���CqR��O"����;�K�<EBj�~ �&���o��%����OTibe� 2ѮఋK��i�7���qHN����'��*�-�$tOiN!f.�=_�jK%�������29�d"�\~{��b�$qd�K�B���RsJ{m����r�"���J�P�v+�B_m;}�E�p�5}㈲b�JohY��\� +�� �'`�M���T3�I���} AL�HF'�����n�')�7���ε�V�fY�tf|0���"!j�`�ЃLBpB�3\�#��^�n +����mmQ0�*{�+mv�?%x�r g�e��f!���FH/�2�e���P�S��p�� +�������S̖Jp5r!K��8�r�߁-����� ����� (�P�k�VO�ea�@��v�_,��HK��u�X�l��]��Z'_ƭ�����KI~�G|ͦ���U��)���iE��OJ�J�'t����[0��S`���z�/��sc�cb�gX9��L� �xZm�~t�t���r�\����(!T�")�D�p͗��=�d�!ޥcC�5�w�ר�o& i����o{�B�b�`��x)n�>JJ{��G3�@#��@+1Q!i�c��"T!�S�p:E����uOE9�10�`�V���.n�@��{�o@d�&U�Ɠg�V*j4�{�HOK���˕���k0J�>����!Xj��ئ���{�`mY��lE�Б��>E�$-��;��M�M`�j��sw( ��x��l� �/8�gVxVх;K�#�#D��J���H��,������O�u����:�����oi��ҁ}��l.��,�=ڞ��0@�=2���}rs���wK��z1�r��N�dы�؎�:.�"�h:�>�3W�5�A����ߧ�}��� 2�u+hB���--�5'�!ﳤgq�9��mI$�R�nt�s��gx�p�*�W(C���r�s�D��B5��z�+��?�V�G���_�C!"��Ͻ��n����D��v6k�zi��{�����3q�uVi�֠M�^`�r��x��6E��р� �&��v���[��?����xt +���s����u#x(=�EKyV�=�#��Hc���%b�MThh�EU]fd�>0`9�8��8����[ x�eγ'�lI.<Nz�O����QE�Tdފ�%4Q��r84��>?���:s�@-�-�����۵�9��A�]7�o�>m�g]��z��t�9D<[%n�;5�/`S����}v��U�a +�s5�r���e)��$�^pK���>���=��k���hV�츣��$v�r�V��T�F�j�$~>e�1p��\lj��{���gWE�E�VA:���os!.� ����������1�1��&��F��iQ�>�OD�L����D� +��S�C�Bz��a�V�+8�T`�E� �v �j&�v�:�@�.�����6�A���W�g���r9s�:���߹��:��e^t�y����74��t���M��?I7���PQgf�}Q��v��R���ax�(F)@�Q!�4�v������� Ͻq܉��a�#�m5̟�i�M�s���pY.�C��qZɐn���&w����*�bV��`.�=jv�0;�6����?U�"C2��Gbd�����r;�DV�K���L�;���֕���!X(�%s<�ޛ�t�1��]�������C_���}b+.�ť��}�[��:��|M@b#��붬�Y�ҕ�1�/�J}TB�<��X�ۛ��v�NL3��rD�/�_��� �ֺ���i�M��4�ф��K�|j���'ؒ�U��+����IG� ۇ�2����N��$�l*�\'�8t4r_�p��[:�� �1��`[K���-�]p��w�c]2��JvYf�B/��7�z�Ƅ�0�%��d�:�)6jr���3"܇B��b�W�!��е�8:��P����7��9a�NO�K��"��E9$ΗB���-�����U�|�=�D]* ��!b<� �:ާ>�;3;t�|�q�f��/"y>_�)��њ`;��Nz'�/�.!;�v�|b�ÀL�xx�̪����岽��%o@�W ��iG[�r��^���}�������� 'ԟEK�@�p�c��i.d��FA�`�s�6��Z�o"�m%S\���1�`�qUFw�,;OWv8j�b��Yz�pI�D�y��eHsڥU����tv �d9L���@�=�\�Be�j]%���v�}�No��=�������>-��I�����*�*!4e�~� u�:�F��P6 �[�Y�K"D��\n%���&��(£=��� +�h�M#M������)K�ʑ_�!�����I��ݘ捪 ���[�����q*[j�2q��:�ZB�e?��v���=M�ᚴ~'�K eH�����5��U@��J���5�+����A%�j;����� L��� Y0�RB��r�͑�������5'��A��J>9c��|�T��~��W��T�zۧ�۳^C�.L��o��@�Z���9��v"�a�r�t��F����Md=�i1.�_}�j;�_Q',�cxKx|&ݍAn���>�kq�+���˺%�S���z�a��C��u8y �A�2n-�-�[�0X���=M�*$v" +0�uWti�H��V�`<��>�K2�/SglF��Bꗒ��3��n[�6���nQEݕA�ތm�8�^K�~�l�rx��=�/V4��ZW���V3,��������k�=��. +w9Ow�â�q�q� ��x�N7�Z���6ß�Zͨ��2�IK�lkQ�~�2eG��.c�� P�f�0l ܉�,7`0�i��k�%�����������뼾��*7����sl΅a�t����m۶m۶m۶m�<�m;9�w�����zj��f��9��\1��\��9��4���5vA�,��7F�ۉ^+�5c��/�6zp�<1��U�9�/�Ky�NH?�"���f���в-���Cbd��[��s%wuN����� o���*�S]�U��+wm��5%h��0¸ � @ �.���B!�}܄?TL��r$n8Ҷ����SîΔ}��Ȭ�6f@�x��=6���d�O26$'���ZiyJ��cV�õ�t�x�H�vɣڛ������\mW!�|l����ʘ������̝��1J�q'�ɋ��в$1�8N��1HTW1�L�1�#p�&3�(%��"�C^�����Y�c���#��z�0:��$S�* ֵPM��t� +�dt�bc��&æ5��L\�+�Υ�1z@�G�Se����vT�uʖtwˮ���$�E�Pw{(�W��`B��u�j-�,G �w'%�SY��Z� ����{�WJ�q�O�����jȚ�M���:����lA��y3��%|�,J�"��c7������VW�B��A��Z������W����Vj�rW���;U�za��r�gJ��䐺#M���#Cɾ�����O��O�9W4�\P����3�f����b�|��+�bׅD����B��];YqV����Ofԉ�|�8�2#�b�� %�:8{��U0V���a���-���7[~���7���4�����sV�1��O�$6�=�ll1�B�_����/���H4��_'�S-�?��1��Qf%�0A��b� &�@Fs-=�-ފ� _�������b�0�O�AV3�6Z��ɦF�dB��(�Ydl������@�����zcXU�"��S��qe'h��F��5��i��Q̋U|�^֎I=�9�}j֮;S196Y�c�n/��S5+���ݦJ/`�����B���g��,�e @^BI���B���&����GlL�c5��?����{�V}MV�/��$�����!��8l����� H�y��ע�ij�n��I��P�����VL=�/��l���Mu5���O�/lŮCN�E!'��bB���el|�1�PW���Bl�9j5�{W�����1���������z;��Qs,�8�|����d�W.D`��Z�`p8��F���$Y���i�ڄjxW��V��બ�I�f��|~��}�[9t�SL0O�!����Xr~>l�ǐ#:��<���)|�;��{�_^k�Ü�'`��+���s��^��M<�^�h���$鱕��Ij�MB1"<��t�]3~ �0x;U�� ]u%�ҨL�c-j'��� +w�L��O�-�"~+N/�r�� +���G��VkOS�HN�3�AU�O�b770w�d�i698��I�~��eފ}�H����d���Go8ܒ����x�jz�q��*P�X?[��[Σ7)�������ﴲlTr���Mi-k�lͅ��meW�� ������)��sUF�_�jqz���8?���4-�b�9��y�h�L2����X +j{�R�d�� ����(�� *<�ѲJ��r��#������͙��{ h&W?��Ă�Lr���'�A������d���S�m}�Xjd�P��w\z��i�l +�b9��U$O��3�Ȼ�~������5��g�OP���� +l�ӐخX+�\)�yz>=����0��S͓C Nd���3���Ģ "�������۾�T���=���m�E��M0�/s���A����.����Ss k���*��}���'x?�N�8y�6.��5�.*ɒ��٦Q}�X7��u��n"~gv?�"BEc?�� ����B��]¨6�b#r������I����=�͛:������Y���ӓ:�Fw��jĿ���6/� +�ϣ)֤��4���� ��9������=��}���N�pUG������Ǟ4xg�C�Wi�e��n�Q�:��C�<�Yʺ+�,u_�6~R�U]2&WRV"��r�����kn�{�ɕ����b�rq~&��"�KU�j�Cځ�5?wbm��#���*JY�[���7��, �)�C+�wL�����m؏U��R��OW����Ԋ ��_b�+�|��zU�{�}'fw�\6*V~�%��>��E��FMWm0�H���_Zu��[��2��X\��+�����b y�F��m���Õ}g�P��N���MđvW��_��6>F'�{���À@! �l�4�c�!�ݎ\T\�9��Z^c��B}��6�b�Pr����< t����R�!jZCF��%x�*����RHLbј����}]���D$�Ҙvkr�s������?�`(��&a ��2� ��#��O{�U��Q�ْ��:��2���e����yi��"�{�7��i7�}��D&�I�'�oڇ|J����}�y�t��S�Y4�<�5�8�qA����M��A�TT�`y�T��1�n\�?e����ƫ)VE!�W����Z�7���VK->��\igy� +ɩ@ND��������{jԳv:�&ķ��.�����'n�`i]�/I�{J6�E�o�-��;��$c�pͺ-��6���s�-���i���n�j'z��Д���mS�l��R��{��Gr��r�%<��=/MHn���vպY����3�ߛ���U�b��ք��.~��X1խ�J��J�!�� +��x�t\ۗRh#�/J����=\F��o�ѳ�����Mx����b��N�}�Eԙ:��r�,Ēu��Zt��oW��[������V����?��-Fv/w��Ʒ8;t�i:�O�}RT�$NIֹ�Εeb%v�S���Wlj�Ќ��&cu@�1s���=�/gknD����\ʼ hDkC�\��+Z�=B�4�Pga����ct�|rt4�PS�B��L���ĥY��-@�4���qi�4�n�LJ��⾁^ࡀ-L�̜܅?ɬ��W(ڼ'�h�����%�������U8��'�Y��'y +g��%�����r��3�!Q_L�IB$p�8�lL�wo����=[q�l���SC�|�#����uP�^ �,9ו��!���s�c�������T[��i_ƞ+������µ��1ޒ�hI�j����)�8p�,(��~�*��7a��"�3��I��;Kf�@�X4�((Td� +Eg��aBZ��5̀��א���8���M�l�S䅖%��E���zѭ�I�CB� +�c�o��)�7��4����9�+�J)V�.9�̊@�d��JĶ�f�63����T]�uoUgi �k=3a(�G�ݰrg��>��=�_�mV2�<�\�� �c��\-����V���������̍I99�A#��)P�I��,�O��߸��:!�����O + �b}��!9�����<)'đҏ�D��&��猏u]��u�_��+��Sh}�����9J5��� �0����|9.�эQ��/�T!r�[��ZB��洉_n�����Ny�Za�]��p����E�,#� ��D: P����A�1���eTƋ��ڽ��N�,+|8�V���V��+�.�En"4&������t(L�S�/:K�$�ʪ.��� +�%x���s��x������+��BuxF���<���Y ��rm8����RW�v��+[`��\�L#�����FcY@J��Zc^�R��&Y��N��3)�0^��h�CS���4��#�o8`�Js�"8�1(i����u�j��Ƅ��3�]+�f˫8e���M{)3�-Z��WX8 ��8�N��6ι�[@���ihU\��zg=qR�N����ߤ��d�A�(�k�.ӱd��7���)s��Qj�g%ر�)�Ow�x��-o# �D(����J�q����U[�� +��湷�q$����>#.߿@����B.[���p:�Z��;�o��q7?�^�X�,ɀ��a��WlU�/�L`��mh|�[q�p6|�zP�\}~��̂�$" t �r۶��e�ޔ/���f֩U�9D����(���IX8�H2ɫ�T�F��&S<��dɝ�H,������O�RY�I��%\K�j�V��)�� +�C��Q!��W�2�c��'@'�2)�EE��,7�c3�To4�]�&��� b���a> �tN���g;zW29���72@��Cm��MA"��d������ �nU#~�M��|}��7�r�&8{ +-ۺ�� 1r���"�Q�c&.z�f���D3b���l�'�ϖ�t��[�AfFu�X��� +�`1�xɑ0� au�3t�~i���o�D�,x��͘�Y���?<s��$����ؖ� @���K��"H9��4Lj��x �:{ұ�-�(Uq�E���P +��ݪ�RC�^=5a *��1��f��nu�����,�N�ckZ�I��b8�_K��.�����4W����K5q�3��}뵺#��C����?2u�84��;ͅ������z�v�l�ᆗGg���PJ��uՀ�M�\3m��O[�'<��eo\�/ro�G�$=�xC�{>'zl���]��zq�(����|<s"#!��Z2�G�Q��Ý̎���l6Q5zb;6�V�E"�t��˟����������M�$��"HD��P���v^�$�;�}|�55ql���p96�m^��/"b���ջ�}�k8o�jd@k������ +�3��O�Y�뀄PaVl��r�3�p��uk5�v��;� ��X�R�n~�� +m����i����ș͔q���qP4ܱ�<x1Nm }=��+����zAV���~��@<sk�؋��4H��6�~`�i�r +��J��jp!��z�W_�u���=Hf ��XU���)�Վ���[&����m�._�Q��6�s�%"��?}Л<���B�O,��BoZ���q=�S?~=�H������A�=�=<QJA�r���m��a���dE�7�/Ě2�Y�\i9'�L��GNu�eg�;N4����w���)�2Q��^p�˽�u�����L1�HR^��3O%eҩ��>��T�� ��#�Ģ�蹋�I��\�3&�ix�� +��ȍ7U�شe�e&7v���;:|�C��~�w�{ϟ נg�#-���R�1�BA���NZ�zG_e�� +` 칹3NZ� ,V+S�>jng�d9��v`���U��OPw8JBM,�����٥χ$�1�ݛ<�W�6c�(vF���:zR��:�n{���/d�E�]��Y���3�����z��<791w�\�~9���i���)c��8M�+�Dޚe +��oO���[Dso��7ʳ��Y��2�*C����h��������FThZ4��ԥ@q�J�GtɻR�S�yƾϤʽX�����~��]6ߑ�L�n�_Nv�BsؼA�5'ҽ����!���ڼT���c��ct���9�C��A2���⌡q ����h�fk�Ul�e�7v��<!܌�h�V]��FU&��:!���h��H>�J&iz_Z�61n�&S4B�����bÙ5�BG�=�*�*�A=��&(������Z��EP�y�v�h���Z�zgH��8�'�� p����q<�� +�' �FL�,�4K�T�'o� U���a��)[���u��|'�W2H ��Ļ��ׅ݈��{�J���c+�>��P����0G*�i�9�(t��5�Ij� ~N��b�j���J�(�e�$�F�)̈������B��n��{�iX bX,�h�3l2��#8�b-_���9�(k���Qw�tZ��a�w�9e s������Z傀�{�!ī�9lf��23�߁�,�Z��V�(��%+��ŶBhYs�`�k�}�B �C�d�6p}t)%���^ +r�S�}0"!�S�}K�R2���G0�sF����n�z�����G0�En7�xW���*�;.�����]]�rz�����j����x�+7;/�E���.�+b��r�H�1(� ��ʞ�ֹJ;n]u�H9�^���+�R)�ϼ���5����<>|i��^~���� +�b�����ʔ�.U`Gm21����O�Le�FB�̬�;��+6����qs��fvH&>Wa����p�Y���V4�3t�5�2�ef������o�앫h����+&���^�(��ǚM\Qej�����_%E�R;gfJ���vw�{#+���Yv��� gJ䕂ַ�*�J5Ev���;<9���D{��x4j�X��3C�Yf�!�z���7����EjkּE{y��hG~.��{�y���y��}���y���p��o�`s��[���N�I���� +o��A@��[�9Ι`�/�EE�+mٛ�����[�}�?�*@���$�2�:�#���0Յ�m�Z*X(�g~i�5b&���(�9v����ߎ����N�� +Z�y��'��L�4�=`p�>J�3eb�#��������R����;<�(��놵^��� ��&+��K�/S���l�a�qiy����B��)�ҴM��>�=�^��6`[��jVqbA��/\]�陃��t*j;�����0хq%/N�A�s��M 8?��[cP���g��j< ��G���4��9c@J�`�ppl +�څ}��?;��ԔkrM|'�Rb_�..�� �B�<�=�H�����(fZqO�+K]�W:$���߳����,�4��.t-SS!���pXǕ�?jPF�7E\Țޗ���Kh��`��G9;�a���8x�lXu�2���-���բ-~:y��i��(��gE#�tMX�4`���<�BZ� +�_�AY����Գk~�7�st���=0r��1���!�E�a�٠7r��i�@'_ wM ��g��y�/�l��Ȱ�ֳ��#u�/-����x��gq�K��v���Og���6x��!b ��eN�7�w�Jy���|1�EX����B�a(���\}��y���g�E�F�A��e��ڭ�9�}I?IP&��}�%}[WxmD��M.?x]�B,���8U(�D����y�������l�*���i�N"��4}��S �]�m�}�2lh7���kn͵����%���vF=_���-�s��yQ조(��_Q8�h���s��W���}�9�A�}�i���M���P�H���,b�i�+R������m�@�����@����N�^I���r��?C~J&����iwvy�X@W��<�%�ď:����<M�����rK*�!��l�搡T�j��hӣ�S����Lt8F��5��i�רV��{���. i�+��I����v�~%s,��P�T� +��g1��A�q���Gx���ʓ�ȝmCe�fs�%U��J�����b)%��9|���>[���������Tc�P��O�(�����z����>X�J��� J�L��Q��D�f�~3��)G����!(�ڈ����T����c�U�Tu��RۀI~3=����#b�D��uc܁!�(��mU?�RФЖP}8e���y��ZL0wƸ4��G�*����s�$�!>�T��WU���2��K���L,���C��n#w_dC�2�SH��������<0� +�P�,Ғ��TjK�pP�W������T��r�q�N��<�����e'Y����6�Q�~df|9��@4vW�y;��V����")DqWF�1�j�P:�g�.�o��~�ҏ�Y��Lf}g��M�JE��|CA:n}�eh�a�Mo2x�:v� R�Y���-��F�my�����^qk;�PEmǡ$�0욽X��ڐIC�����{�t7ې7\�1�f挂 �!��iޔ�� +� ��k��v��U��4��+�T�� � }e � $)�&��t*��o�8���"�c�j�>^����Oo.3>A� ����|��]\�Vjl�B3���/*ʩAa�tg*�Pt�m�t��,ڝ���U�����Fk{�R��q�ߑ ��z�Z?=�qu)��1���/_(:����8��;�#BWpXc�"�Œ�M��?�Q�X+��#�s�e�~L{qr/���Lu��2��r��I����/z�+���N��x��!ϼ����>m�:3�^v��ȿٜ���ҕ���/z2����A���)��L���+D��~�<�?a���4���Az�݆c�?�t�[-�Wʇ�i����ܥ�v� ����(�k%E��{79,��<mR(�D���~��ر�a��`獫N��$������f�u��eP��!�Gf�G�J�.@ 3ɶ<�f���,�{��X��zȶ���C=lbV��E�� ��Ѵ,ӫq��z��e� �)O��=&�>x��1_���I���1��|�����ϟ��P�9^�A�,�b!?�!�=�*���$nF�c���<��LFi`��>�������*���T��C�2��KJ;��дs�!*Ł���G-���V ^���+a�l�C{][.l�h2�����k[�x}7t�ax�� +�7,����e�,|�Y��"�I��jn*\8��be�NxxQ�͢Dy�~97��R��fU0\l��J�x*��Fce�z܋�LPJj���"5 +��BY@(�{j�R���J����G�L��ّ0��+�ʬoja�mV��|��`/��m�<q-m;�����ޛ+�OG�o�"��𱓢"mU:��1%�3.��K<}Z����#�Pb���\�ƚ=q%�����f��`*�l#�F*��u�<W��2�G�$�l��T����E�b�Ԏ���$��?�y}_ZxyO�İ�U��F���i����9�����dfju�����(�I��G�\z�%b��k��^�=�0����"��+3�u~t+�m�X�-�*rN�{+3�1��� 3F-�`E�1ڿ������������r̼��Fw�Ņ2�����W�*�ȈA��i�\ٚ���r�� + 2��w9�D��Ș�{�v߳~�{��}�<�����[�+S��b|���>$���"�d@�^��j*|��4��ë+�̈��� �S�`�h����.�9�JB�Ӥ<l2�k��������!Lƅ��9��T0�:�?���� (o�S'm���jgA�L�ȃ����-9O����,��j�ƛ� �"�g��&F�5n� �*�USRs�z 7a�]N�P�%�K������>U9�����_�C)heRc*�d7�a��Y���BoF��c�:)�4CM8�}�u��NI�G���Õ��xu���&kso��+�+��mPu��O��XAZ�M��ElQ�v^�)���n�����'�� �N.1�jv�TTU���� �m�BOy����'[��� :Z�7���@j�5Iݎ�'Al+���න�EX�c��l�־3k +\ +�Bu���+,��<ݞ�'�&{�y,����^mK������Fh���>ă���5O�ӆ�F�|�;lO���I�";ug� �o��bm`~��e�:& $ + +��a!��Zb�����|��_��ZDu�.��^ߞ ��IJ��F�Ǣ�1��ٮ�'�5���m�3�%:�%���%3�� +E��7�U�z*��j:7LI��k Eڻ�1�H�f;�>|f��� + ��?`o����=��X�4.������~��y������o�C��Y�K��u�Eo���c��ȯrKX��&���c��� Ț��س��������?,t�6��N��2N$� �cc�EZ��̥���*Oo���#�����{ɱZ�SK�2/��M��w�A�>:���}O|�(�2�s{/�a&jJ6~�削�?��f��z�濥�}c����rM���P߹�E��AFG� ��Ҕ���� �� +X��;�O�I�mN�KG��-*�6Yj�!���K��j�$;t�Z������q��ꗰN� +k�{��)g�y��������U{ +Y�F3R�B�fC��"���ɔ�>HRv���?�����{��,}O�x8j|�$�#Zra���,�gV���U�vsO,=�(�BDI������k�1>���T���!�a�8���?��@�E܉n�oJ�Q6�S�l��^9R3��B�%�^�2����|�"�|��lZ"<^��95�~���aI�Ӯ��5Q%�f���w�v�q�J���h�p3�5�k-D"1:R����χL�+I7\�;h�r60�.�����Ƌ~I��e��ΔƇ,o��f��`f�I�P�e�M"k����8J]Qx���^9#:bSϾ�ǂm�������F��h1�چTL����W8D��U�$QƂ���]-�ЇʆP>�Tl���&j���zh=���7DԾ.�i�&���s��t�lܶ�}U��������$�p��Ν@*���pEy��95w� ·�r&�M�&��_�W�"��ǖ25�O��V^�z�U����ֶ����ךJ,<�ˍ�����.#��O"-���%���`��%"^��r(Yf���%��+�N<�����8����H������ |���d��Bp ��t8���8�\���C��o*����ۋ��F��l7LS{r��J_9!�F���YSS�D��+����@�cZ +eC���1�PB�T� �'o.,~����T]���M�+�x#�rt�!=t�P]��|y�B +�vcQ�շ���e5��S���Kr;���1Y�^��2]��xy� ��ަ�x9�{2QT�5A>�N��*�����}7��K�%�ZK�ý�t���{�Y�Z���?�fBs�"fNw[U,tI�vx+�8<i�A���x;�J�ݧLf��2���ۨ +�gFSN�Ec6-˗�����m�i:�j;����*Ep�}eXe�m����K�Ėl +�W���D�����鰛Y2x-��j'��s��Iac�#5�Z��/=>�.�q+)�vPfth�x��5�s�"?ʘ�іa�Pֽb���s%,�;����V\��P�c��!��C��`��;����庴7ul彥:Z�Z�Ix�,��< ��M�'r���+�����w�ݭ��M2�3��fkiz�%���>�&r��hf$YU�|� +�&���jp�-��D{!��d3Qȑ���F�X��ݿ]*�%P��ڛ���*�������|�����`N�>h�������ZYO̰V"W0����Zc�����ML\���w�;G�o�?�.WDuF��9�/a{��Z��~��E�F�3�]�[L�ai���xH�p��.��dZQ9��a5�Nʾo�9N���O��T%[�F�j�ݽ�N}����@�ԍ����~�M�&��*��I�Y���:�C�����A�>��`��� Ka2&��/�f��D'�,���pY-4=���p��;kʄ �8��s.w��*U'/���1��u6�<J�uY�Y pAQ}�}��"KXa,��������O��S��������eT�{���o���or)%�ye�tB������t�����"4����n�1\�ʛ��֧T6ѯ�8���ȹ���#@��ב�0��En��ZK�'�?��=���<�_�!����e���P��*�Z:�j�i{t&�J� Y_9���c��3ƫ�`��c6��e�934�"0�W��r�N�Ï��a���hG|�V���^�jI�+3��M�=P8�ų�E4���:�i�[y��;��s1�����cУۋ+���6�i�)o�s�>F��""d��C��ʨ�ڃ ��p|XB#@4�ǧJpِ�?�'��:e���O W�T��| ���E0��7�x=����D����[�۸���T�� m_�2��n�ل��Q�I�*)FCw����:D�-]H�t�t k��)6�٘���Dg���SԾ#3���{ 3����}JY���A���c����v�f�������9s%Mt�?:K4�^@� =� +�C�ۢ[th�z{�>�h�jB�OA<�W��ޚ�:#��*c��A��G� sBÿ�9�|�|/�HV rCa����$���eŨ':&�֜9�c�+��H����Ae-*�\���3A���I�!�����r'�]Ik�� +~��� +2�ɷ����a�W��9�jt�߶J�!��a5'Io�������f.��_,HX��~U|Fr�?SM�����H���$�8�6O@����\��Z"k��@z���v#=�rd��#�2�M~4��S-�.+�=�����4�&���?[�w7�[��;��H1�%@�ۦ OI +a! +wp��2-�n�i��8Ѓ �կ�����)d�;Y��X`��&>�o5�b�وi&���Sˍ�`������ҮL`^e��e�x���˄ob2sS��ib�(��w�Ȭ�D���C�:Ey���z���j��Df�ڿ�JS�H\���+�\T��$!�km�����]d� +B�.x�h�R̟���v��/̬IJM�IͩZ���)��3�E�oFH�a��K��9��ԣ���{��cQ�b�,.�Kl2cɴ��l4��������ez +�d�[���ԉ_���$���?��.�>�}���\(�![m!y�nՋKO]�cu{�fA�Nx��hm����ޟ�}�fs�p^u��� ��,��jA� +垻�n�g+m��O�XI��̈3-߬b���rUZ�Ed+�w��Xټ���S��vg�ϧ7@(�A�'[^K��|�sYf�ݞl�+I�!�p�Kq��[?h��f|&���Cs��&�_��t��L&��}d���3�2�Z��7�����} �Hl��Y�8 6~��»?��զ*2�cЬ�)�s�(�������j�2�D(.Y����{������Գ����i|ROr�C�ސlT�Q��o�s���� N���eL��'��V�OWX,+�B�ɖ��X�]}��Y�:6�Y+�OSDօF4hQ���Z&���c�(;�̛���N���͉}� �&zEܱg����UV��@�������}���h4���|�������:�X;� +Sۘ�Kt��h`������^s���8���`g$9���.S,��t����%�.�k��(��ƖMo�`����`/��+\�M���b�����}Ղլ����L<�5��~_7|́� r��F�DiXZ��y�����g'�lq���m䄤N����?�.��n�����j���ԣ��:6Sɻpɒ3D:���W��B� �R�g��E�@-�Rˣ��s��y"k�щH �)��6��YdGN�A����:c#�x���#eL���ƾ +.@L-���k{�o�5����!Gm��N#��[7�|4��� P������!O�� ��2�oU��n{�Sk�Ċg�ׄ��� +p�\��a�U��?��=�Qr��j(�}dAyk�j����Wu*�U�`.�#�0�\���ݟ��^��,�7�"/�J\U�L��3����:���T�@T�O��mS@�<������#����ܕ�FQ�����#�f� k?}5����{��</{��ݩ�#��gMF5��@u�f����4��Q7��S}�����3���;���2r�V���j8ƍ|r�2����?�'�kl���^�G�v5�`���_��C�]�y9�j�9����_�yr����l�e$����Ԧ����k�Ӓ?�?dj���J�����i�@���e^8���sb\S��$5�Z�Qd- ��aQ����L)\�j�����:�O���1�2��_�@��メHX=��{��cv�S7�t��#i� "$6tC((.��zyc�{g�⦁e���2���x�N�;���B��̗�R�������l�Ǹ�}�ZĿK��>��2 �N�6� �P�L�0�(d�p�+t������� Mpk�:OK?����A4�9� Il�V��`-M�WEE�zY�r��G�=�Hŗ�=q$��d�6��G���:3����)�٘z���b�}�]f�)���z7�jnp�'�S��Fyʲ~P��4r!�I��7(���W���pf�i�j��A47Ki�2���KÊ�u������oʺJ��bI�z�"o���� �8�d�RM=HQ�������(�(�8d��]�4�Ss��GJ8p�/�.a�5�b�U�xhz�]���V��Y��]�Ӳ��R�ЌF 7����-���@E���[��P~��q�.R��e���FDCp��J���2�>0��-6G[i�{S�#��]fV�Ja�7��} ��h|��^l��^Is �lt9T���F�����mh�Z"}���Sh쒛�+�OE,��'�e/`�*�QϘW�gIʽE%w��������r�W�5���ޥ�8K��%'Ql~�u��>2�Bu����[�(6O"���۹��J�E��̸ם*c�9�z��"�c�'�4��}kSrl|�7��-���{�p�!�O�*8Eu:�x�g b$�J��2渟�J�r�o��g'� b���_�Ql������Q���f��sB ,�|Kl���D��{�DP��lʽ +��&H]+]�p7�Z4rﶢ+�0Z�����u@���-#!�7�Ȁ$� +A<�1�l��������^�f��q��`p@��5��T�7V�*�q}�rY���G�r�ؓ�����˻�?�mj-��(M!:g��C�m5�l��H���n�)ކ�̖T�(�����ɨ��>�'�S�\�,�e���7��C�)�[��`5"���qBfU�&��Q��w��!'l�������"��X*y�r�ѳꎂ�%^�px����8��� ����E>���g������������$^�8�����1����=R ��3+ ���sW��^�ֆ���K�w2��ъ��ƴ�����dT��uK4t�[�ׇW�p?8xp�<xV1r%�����x�`�R�:�+�6��+��8E��6�?�E� �cܾ��M�exf�>Pc�u�挷d�b����y�7Q (�����/�p��'bzɌ�up"qS��m�k��X�����q��W�wbڻ+�;e�.��b��)/�n%�k�Od�MB���Z�&�37�r`�X-�pJ�H����b#x�-(��SޕC��mT\Ln���t��v2�8u0�>3�YM�\u��j�Z}�z�'����B��zg�Sy^�1'k3��Z��l���S�k&a�D���������O����ҜM���ƎJ4��d���QH�c�K�TJ"�O�_��br��5�����ѱ}ʚ���_�������#��cDy�g�[�����z�V�f�|oղHw1:K���dh����#�v���JZ|��[���*2Q�a`���r��*o��V�c�b��0�9�\�Q��b( +A(���$$!8��v�D 5EC�V��4�؛����f�/Ӝf�g_������Bxd����� +��ߚS�:�+�G1���)���\Q��Ԏ9K�H��$&ř��~iแA��Q�?a�T]���A���D�la��u$��:�*ǿ��A�6IcK5���r���A ��?��N"�G�n��r�>��:%����\E<z���k��T��?����Ro��ni���K 22��uO�v�G��I��Y��'�f�do�!E-���o.������v��ݹ����y�k�z��L� ~��ða����:�]�>0�*'��} 1� ����jx�0�(rk���)Ui� ��O!��R:K����Y��������.�2$m����{gI�3���R0[��hC�(V:w3���ճ��v�u�r%�h� +�ͣ�[��z%#Zk~u��v_����oCڐ��]�W�7���.i&p��x���1vn_�� 3����36D��@t/�� +É?�������v�U3���9��߉ �ᆐe�IfUR,�hΝ��$N��.Y?��qt36nm�e@}`�&�ך�[�e�3VO��Ӱ=�p�-�A!ƨ�+h6Bp\W��e(���(+��[��W+������n����{���3�yŘ��A0\���l!��?$����-IH��|Q�#Td��]�2Kz������ +�E]��g����n��3�9���{�`+d��G O^SD���}�PG<n�w藒+�2Ǥ�ʛhY�����th�[c�鰋�Z�(FE>{�z x�J�Ӭ��k(��'!�p�#��������]Y�=���.F��������p�j��E��b�h٨Ye��: N�n��l2&����-�ʡ�fr�0�j'NAF�� ���O������95��� +��m۶�]۶m۶wm��S�ڶm�����r�L�I֒�A�T[L�M�[���;/���n��{z�|�����A �;`�'��3�b�md����������p��:yK�:{H)=��> �JH�t��e�ڗz��̨�Ӂ��}^��@ZF��}�xv�<��q��r`���^�`9��Cf:�����g��p�C�ߘB.!�:� K.�%:��Xۙ$���C ��c�Ȅ(l/!�J7�9�����Ox�����lQX���9aO�Rd42�w�Z��Weg�_���û���9y��ai)�ʯӭ��S���?R����y�H��9��kU�Y�Z%��@)�qO~�}kY�`m�{e�q,"� '+�F�qX����5�㺄nݨ9�=�Ĉ*v�P�?�x�YzH�E�E��䛄U�=n�'&�>�X� >o�t�1ݢ[�"<ݝ�1� ��0Q�C�r���cQ�����2b ���nr�w��(��� ���4�0�Y�����5Q��U����m��E�En��)J��Ԩ�ǧr�[�<t +�V��"�R�o����>��T��S�ő�S��i���d$93��� +��I���g*�m��I���2n�Z!���R@w'���3ǔ�am� +�bJX D� ��N��no� +\��_� +W���H���֓��`��^��l�Gw��|7P�C������,�ÿ�7�1�ѻ�K<������xa.?8�6z~�7߯#���i�@���:�_�Wx͒Umw �"��y!i��}@8n����v�RR�ã��E�;���ھ�V(�^"���xfZ�*��4�_&A~�g�`���ֳ�į�_R͑&�B=�9��-��jW��ü���AԮ���=Q��{=���r��I�� ��(;h<`��Б�����,�'?�����'tQ�Y�����?�8��d��r[�l� +��f��S���/J�4Ǿ�;2�"0�����W2u �=�=�"�KOz\ㄎN���`�R��~�>��Ɛb!ȩ�l!{3��C�<.���_�cedW�5�]��zV���#�ނDr0����C��Ȉ�{'فe�?��k��-�#� +�S��l�q�#l2�B�DE8�l#��lBE�Ȯnf.�2���6U���G�z4f^����#]q��#9��o�}P�dY3�lu��E,62C�:Hn!���z�?;pd7�����<r��U,����ݳ����_2M-�c��Hg�����n�)��}j����E4��6<�D�^��'L�ڍ-<m���N i�A8_�/D��3�6� ��:uI<��i���}�%�N�G<\�*���U@7��f��"&'�ְX���Ȏi�l��Q����V�l�{�G�%3���[��&B�V�v��ѕ��e�!�j��o�!�h��E��f��w%yx�����砵>�́�.B�il��[��=7�ԕo�)lr�T.oQ���&�{����9|�C��4Ke�~l��1�-h�@�߹�^�J�b�|����]���6Ѻ�H�<o�W��.�� +�ָݶ��E�v/����s�#y��GO2keV!�⯔p=;amͿ��-�b��-��>n�6���^^� �NO�+�VrTrR$d8����SP��l�q��/�ʤl�l�%� h��|�XY��$]8o^?A�� +,k5j7�)͐� �%��%B����BM�^*�����xKǎ ���.�붷t��|H��[L��0�I�-���Z�[��xo'#g��6�=�4zF@�]�T�[�Z%��{����E�n}� [��֖Us!��m�d9|A>�!���, +�uq3��с��1��E����i.�r�Q���/���̊��U>2]�n�&���^��t�Ŵ�IsSGT>>���~�h�fb?x�A�蘠^�����;xl%����XӍ$���"X�8k��@��;����,����K�=~E�d�24mL�DsRds�����'mX��{�O�ˢ�O�9W`�'5B� c�Z5$�ڢz�R�?p��$`���^r K. +�5���X����X�fmgw�Xpۀ�������HF���R�Irk#�Q�ިHCN��C�H�Ǧ�pma-�W&|���;8��*��~i9�ƌm:ˎ/P��J3�R8��������V,^�%�wV��$ВpE��W�w��"�y�l�.s���'����]�FS��L����kV� X�@��=����W��ci�@y��|�M�eo$>��Y�VߤjI�}V�Շ�� [�H��-�M ���L� ��Z� |Xbq����He� �� ���BSkE�� e-���Z���2��=`">a���r�R�o�e����UոiRJ(���mi +���9��m�E,�����T*P��dp$����s�z٦RQ!s+F2��D �K^��uX�o�j�{��S�s���q�f� %����[��-��1���uΖ�j�;�F{ +�`��c������u�j��Sn���j�{�U���R���K��ҝ)�[@���O�=�a�����i���g������@t�葸���>S�t6dG� Z +`U_��ٰX��y赾:y�vF�JV�l�۴��K�3���P���/��>�C-��֠D����`6�#�|k�:]�n�;�=W�����BE01D�f7)lV�jp\�3!jq��AD�B�<�;�$.��>SD��Q�Hd8��xO7&�m����1T��e�=ljG� �������辿lu\�L���t�3c���\=l����/xo��ĥ��~�u���ѽEL�̦�?:�&�� +�ޟ���Ɔ/^ף;��-2^�/C��]I�v�$�[�Ph�L��1�V���A&�~���/���:7�S������g��}ǰ�h���K� ;6��A�]A��\JY��W�?0���1�a@H�5�U�d�?KJ��� +�y�K��I��b{/�o��v��� +�����d7�3���h�?]�8�q0!�t)��S-nқ��_�ݣ<���)���0d::uA�����f �[�gپ�&�Tׯ8��D�G1��?��uX �.�ӟO�@(�)mg�_a��l�",'Ǣ���n2���B[���|g +�'5&�]�p���������%����cS�u�:��[��gO��'�JJ n���kB�C� +5&|;h��Q�i�?�AW��>_�������}��t��]7;�6�%U��w�Fٝ�-� *&XN�0���xm�HP�☆k�f{鞋��&_?n%�š��jn��P,��|~�8U�ݸ]�����fs�xhG��3��Ajlq�t����uR�G��uϘt��t��S����Y��+�ޒF���y��7��ӑ��@�K�ktNÉM�gv��(�`hX/��<z1��VH$ +XRC���0�����{8�'��#��$j��&�|����̡E�c������Y�B�}h;7���z�K���f>�g_��/d{hay�<DAf�s_����d�B��R<��Ӂ{\�x�8>���J���|GVh�=�QYȊ�&kIEa��ȥS�! �?��[|簗���K:ZJ/�:�0�Qw�D�Xm�Av+��s�D�O��z"�?���v�n�%7WDzZ���� +'u��#yb��֞;\%MŒj#j& _����GsZ܁�ŋNЖ����)�1����Qt@w��`�O��{�8_~��&���'�`�\l��D������"��SK\�1Vp��#�a�C�A&��ށ���ͳ�Ŷ�!��<xGe�b�O0iH/����J��.�EPf{��Eɂt� nޙ#�!4dP����=���$�R70ti�#�J �66P"�]r�� �v��A�����ۓ����/�vZ�0i�~bw�>�d�\���6��5�����l�9����Z�:&r�\��ba�6��38C���-�N�����pT�� +�{��r�J�j��?� �.�X����8�_�'L`����X���ȋ�H��jogl�010Dz3~��� -�rA�F�慁�]�%�v��ZI���p�G�@4��˩vfaa&��LKkʫ]*m"�=Y�K��G��f0L������-O�%�}�����y�mq�.�5t�I�N�4���� +��s�Fߏ�;���{O~m�l��mO��0��̘xZ(Շ�~��s�/�J[�1j�S�d.jG�TH���_ +L��=$� ���n�=�iy�4�- ԝ�i�,��d�de��� �y�~�k�iQ�ؔUyCū�R��s}���uM���#�Qþ��[��U��a��hs�����|T/:.sɰ�Ķ�#@�[�_���ˋ�3��VQ@1���W[e$hR��� ��>��_���w��S�����u=/��v��������\���o�f��+}*�<5�h�����GB/h[CHaI[�w�ϛv��2VB�0\H�b{{��x\<O����"?���Y��_&��$<|\H�д�s[�S���}�W_��*�M�/��ƲR����� ��)%}gF�ˡh�C a۩��Y���h��K��n�3�J�+}cR �ځ5ᇯ�m�9�bUe;�G��xV�7p�� �,���o'x_��b�o:¡��ִl`��ֶ���Y��N�T>)�F�-��e$ +0�y�B���"N�U�Q�=5�D��:m=�Ė�e{I@�r�F��xP(U����<d����H�M_P�T ��]�Gëѝ��G�+A9T\�q�e��AD���J�dpa^�/�����V�R"�E��d`�G���)���tmv��Ѝ�n + +�b��ؐ6�x�q�����c%TPBLĜНm8p���ϐ�^y_"o4X�!{��6M��x-T���ۨ�4x�XR4 �r0����5f�����������پS�h�Ѽ�ЖR�Ӄ����a#�Ř)&�m��xu݂ʫ����6�d�-�g�2�����H�]>ܖ賀� �I�7�35j�T�$EV'�1��\��Z]����*^+��c#�F47�C4w�&q����hA�8氝���[�?0�;]����~�'��I��`/��oD���g��)&FV�H&d�?�����$\a��1T]%kEO��pfh��A o��* +t��;����8� +�@�_�ܕ���� +��`$��s��SV��[��P���G�?�*�ꁉ�q���� �8��<ԝ1�=X�m*�A�C���,Ud��D���j�{ݚ>l0��f���ga.�'[f�N�w��f�,��M|�Z9t1�������,� -��� �J4ES%�a遉�9ڑ�oT����k8���/@�I7��!��N��-�A.�Ջ�o�I�l*cDa�:XBGm���Пw���{w��l�!n@3����x�a�?��EF�F-��Ɗ= ��hYZo��1*a�Q��|̎��V��������GkS��������_6�O��A���Hc��n,��!#z ��W4����J�m���T�ML����8��������`jhI�����8p�̸آ�ڀI�(�,'�H>4a���Iџ�h��� 1�[~BW��V\�tsʓ!��^��.%._�A��īU1��{q��ϢLϺ�Iǀ�j�{���O3���N˷�Z>�Ź�e,��I���e���)�'�o2��DP�ٌU�j�{�|�e<���U��KKҷ��d�c; ;�"#*F�hb[A��v�ſ� +qq�g&1BA����U�D�����B��P Զ9Ŭ�u�--q:2w�����Jo-����1���Ԕ+�Fd�(����N� ��9�.�"`��*�^N���z��Hg��t�h��d�i:+W��8$&<���M88��DZ��c��*��S�(j.��!�ѧ�����M��Gr}�]��L��/��0��s�DP�����[+jX�i�?g�M��c�Yt�D�!��O�]��\7ŕڲ��@n�d���+{��\��I��4�\�1�#/D+��e����`��E������1��o�q\�~�Z�F��u�GN̙�������K��1�q7�pJ�^�L�=������(���K��ta�lZ#pV����^� +�0ڵ�nj,��K�K9rl��ZU���7��U +��ޯ��� +Kۖ�at]��"Q�� +�R�u�[��7?VD����ɀ�<ٚRf-ZH�x#d�*����ȯk��.1�f� +��8�εWEUa=Fj�!��Mv��nU" +f�huĬ�ќ�o�D{�#ȴ:s������C�����������-ˏ��@Qˡۼ�.c��b�*OQ&G!�,�Z�x��~�H��w:bK�P�T\*\�yخ���{���%�c����ʚ�F�]��E�F}�0�~�)��!}Q��1�uJ�;��D�N|���pz=Em>�m���P���u�"t���:�id�ޢ�KҶd��#XϨ<3�Ɣ��镀?��فګٷR�v �X��1i^�zs�5�*��g��Mr���w�qI������|R�o��Л�RE�����3X�쎼�B�lI��rǚ�ŇV�o97��"wY������^��������&��2��Q�<���>Ah&� �!�W�&����Hk��Q��0}����WXޢ��ޗ9��Cx��e5ݵ6�����I*�9;g$���U'�W���!jplh��Px�K��3��ge�>ä�^��1��.�'��u̬����9$�+б�죎��Z'����D$�_����<>mb�Is�Y��C^�w�Ї��� J��w�H�SY)�G�Un��N�#}�\�'��Ƹ���m���ヮE��ŗ�S��D��^�ɘn������M�Z*�Ϻ7f$�-�$�3o.��>W�����9�A�^7 Vb?�}q��]���;-�6m���� ���2z��7t> _���FL�PO�~��\� �,�x����ӂ��*�s\-�d���":!4�6��Vw�~�j�^��@j�7���~�����1�В$ +8�K��u��^&��Ѳ�|���DC���~�2���-E��_>a�?���L�� u%k9Q�6&-n����1��mĠy٠�S�a��5��- ��?,��Ĕ���_��NE��yi�̬���9q�Ve�k���TCpʠ^��h_y [�G.o3�r�<�)h���,�|�/5�ֹ=Q��W�^���MABA,+�̮[�'M9�Y�ʱZaĘ���-'�JK?"�����+�BN���c��^���aWO��%喷2��o<9a��:�Q�!m���v�@��o��qu(Fb�O�t�]�y�&6�C�k���A!�07�3Uv���c�z �+`ߒ��Ym2PsE=y��\T"���x�8�����+��� lI�������Rs�#G����q��<�wDΪ���`�ݸ8F +|�s:�Mu2r�͞��Q��M�m�m�7�"�wK-��j'=P:K�@6y>X��z���t!�zO�fD��.ڏ3��D���Xë�z�e��2�o�Kk�KaN=�,���aO���ce ��SNg�6!��x�J�q5���t��f \��*�w��5��@;;2E�%���ָ�����xG�"�7YȆ���8��7��Mɍ���3Vt(��J* ��lj�t+�_�2��"�>�[���F��:!T������K���zZ�Z6"�s����!�li� +��s��ua���_?g������eg �ֽ� �*��i���^k?���>��vq_��l(���@�q�5�����j�o>[����1�I�Զ�E�.]8�H0��E�p������[�h�2x�Pʛ.��N �}]Ņ�\��E�躰߷��E��4�ZQ���`���_r��Xz���N�1������uF�:w_�����t�R�,��u�����L���r�M`d=��#D��k��!�O#v�h���q�u^���x��b�#&p����C�7Vg�z~� d[t ��-2q�W}%��R���3}1�8�|j�������F/��6��Z�n^m��-J�"���=���`��t��J�[�=��>~*�/#�F�����6J$G�4[�m�>W��ImJY�j���\��U����K�^��5&��v|y]�#�e�P�����N��Ԝ�P=*��D9��f(+�/d5?{�wkQF4$�x����p���7�㞀�����nk� +r@�Q-�c,�IGZŖ�)~IOӟX�B�)iXY�� +@���I���l��]�bN���0��C��̥���醣F��כ^Z%�����Ō��"��E��?�fQ���4 �x Hp4l�wk-.�X�Ĩ0�θ^��Ϋ4^RPT��� �3ռzL��!?c��+&�i�S�N�GB��,p�4�L��dm�HYjD��)R�6&������7����w��0E������� ����֦����Y^'5����r!�֧[o(ޞ�lhv�cT����Cǧ{i��)5&��f4�u�=L%Ӓ!���Ԡt|ѥ��]<����)z��M��n6�{:�P�(ʗx{O���`HM2iʶ~I������W�ҴZх���h�����:�c��Lb%]�iI��C�C���y�îL��\5�u>A��f���*#o�����r?*�Z���[�бS�T�g��狤�UZD +��A:*&�s+�� V��8��?'/�t=AN@��SA�B�uu�c%.P����!9E�3CZ��O�TD�A:�)E�l��Y�>�������<*,���Ep����. .68�@�(�p��X>�0Y5��C�M6`qi�,�;�q�Hɗеxl �I��آ��¨M�ɽ��*כ��㏪���Ҹ�̑���Z���b�S�d4"5*W8?N��e�t����������,�E�'u̓%,]P0�Hn��87-�ͻ�(}-��e���jh�G���<NqE@3��|����TtiV���*��x�ؓ���0Fـ(�;�T���l^|��N����FOFKS�j�*j�}���l_C�pu�2'�@$��~�Ef�K8R�j�D��}����8�<BvVx���@j7.l��LF����3M�OB��E���#\�x甩���T#��@���2YS�����i��UW2�2x�tbj��J/V��$�����S%�U�y��l���9qt�����֚Y�l�D/+"N��qwnS��}�����]�����/y�*G�k��M�-�VF�(�~��N���v��^<�O��}R��q d%'�S�#�����B'_��@�][�(� +�=ñP�`���k�\_<�M�Ze��hi�Zm�:{�b,��_���j�vӧv_t�� ?�J��%�|3�<f���4D���0�������6�(�Q����L�ע���� ��R\�C~��~�1�A7M>�)�b��{d��V�Z`'�w$���.��� sV(f!�=T/�E�q�A��&S�]�I�S�7�IףP��й0T���Rv�_9(��zik��C�#S������4-������(P��vSJ��q�1����/�I�v�}��Ι�;Ʃ�K��[��M!X������E����]�uȜ�Q��9��B�/ZZ���a��9��>�h�o�ئ��#Y��s��j�OQ�����Y(ݥr�nx1 �Dq/A�R��E���<eۍ�FfΪ��g'�-go7_�.F�n���hZ?1���y�O���-�2�<B���)_�vm鿟a�8T��c(�/���N�/��y�L�G�m�����H�z�tm��$�k�� 8[�9�"2p_4M��]b�v��� �hJڵdt�H�rף1��iu�0y��_���;�#�����j�?kD\�{��SѬ��E?��XItWb�8k��ۋ+n#�^�7�ww ���@M�==F+�ꈇrh�� �ƭ������b�D�c}��*� ��U�p��I�=i�[�-���̭��p�;nB�W�. )��X�,Ǭ~b��t�T��|&'d���,5��}%�+A�ƿؠ~�]T<??M7u�-0��6P0)���6ljo��F��U۸u"~���3Qw|��h��TH�eb2� ��[�g�M��BbޝVV�*V +Tq<Y�6�+��G�kq큉V�<j�e��^C$�fU��X�ho�W�����Y0�b(����Һΐ�Ksq�\�:����B���{覀ۆL4 ���WR���L`�9Kσ�����,�3�}n%,�ٗ����}{�>��QAC�Gq7-\X�ţS��;�\8�z�M�j1�������RSOh��H�(^ڗ��܍����JE|��$��Tc��<@Q��-8)�PZb2��@��)��t��a�WkFl���7� :�0����Wd/h]Oc�5�$��u����˙vy���c�;�F�e���9���j�8���+;:��~�|e�SX�8V���r��Ej���\��p�וo�SG����`�g��eK��Kռ&�������:�pdXo��L�?�k���~]=N�2�[bw]��k��Z�U�%_��s�w�.�X{?�j�92=:�]�(�&��|V��4���� .�V�vE�$�*Ȏ +�BMY��g���i���&�t9 �i܋��fl�߯�N��=W��x����ߍ08tĄ�3oאw�fZ)�n;�<�??�� �e�m����<�~�|�š���fy'左Q�[�Cf!�uy���Y���`�pe�~-�VQ�[���%���=@)]��Zh�����_/r9qg�|�C�5�I~װȽ�v9pi�5���E�L�P��l���O;h���ᓻU��6C�[�l�[���Wk_i��:��<Cw�L���I9���h�AT�Y��u�������l�ÏBt[,P,Q\-��3ZٛH�vr��� +<B���~�U��?�5�*�:ڗ�R_���p��B��X�G"1������ݘ���m�U�3�Zy�a���R(lL�����=2�;����_��0��"WjD��AA��Ӟ�w06T�Xl��h� +]���`���3Xb��H�"Wa@a�������9�Y� �e��O�FĬY�� �0S��{`3{P������do��o�����Lӽ�� w�jdG"����>N^��4��1(����kTj�nҔ�Yȇ��i/ՕCHAڪ<�x�Cw]�ف�g����eؤI[�*�d�Oؕ�'j�U����!mq�M�,:���h`Ν ߏ:���XMr)k��m��ϰ�dcS��)�_^��1<����.GH�e*ܣR+��}���g��Pd�a�v�A,0Z�#�~R��5�\�x��=P��6��"y���GO�4����^���!��Z�֩�M��`�yWצ���4��Z��m�7(/�c�g��������}�;�D�����-v$�t�,����qD/�O�% �rV�G��\���i�x����d�eMY�z��������:G�p�J�:l!�F�3�:$��0t1���\�@�-e]��7��E|�X���\e�ng��-M�BDh�ur6 ������ +m:%t�L��_�ҩ}�[D^�C5���SՆ0pa1�c�Þ_��%��5���P6�C����t��։I�;}r!��X�P��f���@t���"��!��݊T0�<�\` ��F� �Ui�FB~��Êxܕ]�1ד7vZʞ�_v�U��o8 �����ᓽ�_�ٕ��z�Ah���B0������2[^dE1[X�z{'�� l�?F'�* �v^�N��0��ڥ��`=�q��/=�����P������g +�&oq�Ө�F�!�?S � p�h��ª��U%R���_|}���T{���3r��O���_�Lk �V�wjtltB�/J��#>qI' +�vY����+|=UA5�~ �겳��hX�Yl��W��$��k�9Ya�ɛc����"���#��P���*i�d ��u���Jȿ�"�?��f5�J�����o��3�o���5\�e�%J�ֱ�)J)a����o|����c��1�������@���?�1�Ai��Kp��k�/z9%� �C��R�P�Y�87��M{s�iq�&ǡA{A�,����7�3e��P��0f)n��j�X��M�]�U��L���^�7N�#"0�����kǦ9�e��:Iv�*l\3��. ��8����N���0���"�M���F�Kc��4�$"�?Я�D����0+Ua]���@-T�׃/a�CQn��{X@���(��4DS�� �eB ����t���O��T�5l&#PC��6`Mj����;��E�! �N� |�o&�lJ�:Mf��(��a(q5���:?�~��CG�p�]��iD##��]D0W��!ݶ�)��+�M�����W��O*Q�tT#,����B<��C�Y�����=t�r�*�s���k$�5#n�B���e�%�D|ዋT^��RW�:��e ��K���-Ӊ��'�+ܸ|||�#��Ã�tgv�lZ1�u�mAe㒪T���گ�:�!�l���c]��仈��)GEɡ�t�Ba[bd�g��!��@Jb��B�k���8ZӺ�K�U�|�)b� ��5��e�?rq��l�E<|ufT�_��YA"�(:��A��+��6�C���j/)?���Ј����Sq1�E�� +2g���6M%�g&ڂ��~��H(v>O�/��J6qB0 `�F�Yl���t�yw��o���Y�F�bѦ��9N<�J���LRZ�IX�D��bT+J���qw�pk{ِ�Z�v��dI�����^��X��0�Z�,�X��)�>=¤߮?���o���UQ�U������l�JO���'����.M�qi�U��,��+��ԉ�-�x�A*o�oA3�O\Nį�<�����#�9�����}�|�V�g�� +�d>0�3���.��i�f[�nC�o��U�]�D(��{Հ(!���ɋ��-��y/���3z�Z���V�?|M��i�b��?�vȕ�5R�j��1N"�G����ј�8��u���b�gH�d ��S�������* `P�Yw�!��߹�7u��#��ڎ�T�`�G�� 23��S���ꁘ�L��F3��Җg_����@_��=��# +%��y2��aƓ�p ��odz*P����� +�=�;��qw`O���X�*��LR�N{�~�������&�>ZIYt +�ɴ:�W��g� ���H+SF����L�`��+���$�,��ڨ���/�ɬV��\�PK���+h��*5z$O���[d����3l�Bx����_x]V�hN�`�����CQ��F}�*��h��JF�1���r6���mT�!��7�&� �*�4s�m#�+ �b��ef�T艶��eJh�S�=�,�!i�q$ݴ�|�&�K��k�)���(#[�N9c�������0��S �=X~C���(7���x��@�\ ����k����oc�>�_��sGm���S�:�W��R�qh�[E���ac����TNv�~���~�L�$N3ix��s-(b���3�A��r�_/��,]>#Uu,�ؽ����p؉p���T�JƤ�6�F�&�c�C���s��jB�R�"I���?`i#&�����Dȧ?~��������+�{;I��p�{��Q-Q���X�{`q�ц�@��"��Ƒ��s��s_.x�x��� +8r� ��Ku;FG<�K�$a�w���Ѓ.x��e7���˦�[EG�^kz�M��x5bHEg�'���;*|��9�U�K��ij�L�P�Գ�xJ��Š�����r�˒�N-se�2�n��^�`#���6$�;D#�ү;V^����nH���i��Q������Z��5��j �������ՁKʱkU���/q2�o��`�&:�3ښ���=i�Iy�Hg�Ls\���[�2��j���y/��NMj\@^Z)�d�5fFՙ�t3��<�d@[�wo�8��Z�,y.� j��j1��z��W��Dx����0���%}�.���j�d��w���@��ַpwR�D9 d�VU�X7���;�Tƍ�V�z��Gk����k�n6��go����J����(P�����?��e�.��T�кon�D��).��HY[L���h�"���u�u��}.�T����r&�,�o�Dw s"�u����N�\�^��zВj~ +��L;��E��1����:Q@��8c����霩˼�3,�.쏄3��M.�啔�!�5��m'�А�ѫ:��de��U�R�����vz�����8 +C��s���wbT�|���S�^�*]�?���#�f��l�) *d�u��ԉc��5,#����Y�M��qR%SP����FUyD�2_��[����mY�c�'$�h�����ؒ}M=�7�����{r}Y��F)����D�<2�7�kڞP}�-����M��M���M�Erzt2������@�������^��e���oOEI?beZ�O��L�a�oɺ _9���� +����RU?|�N�F�]����"�3db�ZY��eA����eo�� ����E���ѵ��'�gw��Mr=b_�L\Lԙ���m�G�E�i��{w:�Gbe�����,{�Ǔ8����4`�c����G��)}�c/I��5�eD� �����e ?Ԧ9� 1�a�]`D:���*�u���`e���|�7t8��˿����|�=��;+��c���B<>�Ũ�^ۍS��p(D��Q,��^fD�+M#�⨠����[E�LD }�dW�0�hz?��|Y�˓6��s�ћ?W����q����,'(;,�jG@�K�L�شy�v\�5<��ǤW�\Q?'ބy3y��~������uc|�F��Q��6�-�'Σ�$ +m�c�r��f���1Y���{�|�#� +=M'�l��}qֺZ��>�W|��1M�Ve}vp����q��Ժ��If���-)�Ge�e�WL�k�:�����=$�I�O���X.��L���Ȱxg%��: ����ְgl����~�$�̎� �S��H˚]@�'�EBv�GgW���:l+��iM�m�G��Ȃ?�O){��,i�@�f�[�S���(- ���n9K E�TLp+�c9u���iPl�Y ��~^�C{�e��i��:�E��]��zu�]����P���aі%��iR��ۈrO6����;!��?��8�vA0��%VpA��١������DV���s�G�}H� �JU�g�L�� ��,�S������>h��TV9�a�Y���:* +��u��+Xݶ���kB�ā���˥���Q-���!_�jR�N4��K7���Tr io�#Y�U1������ʞi��[�#̫�%�^�E-R:��=�F��*�Z�{w ��`��ʒ�$�K��:���Y�,���_�| ��.R�t���+�BT"�C�op�(�,O�l����i㠖:>�oҩs��&����Um 瑹����q�n:��آ8X�~0˧�yɫH���'͉(��vF�ح`S�W�o(�۰Dn��٪ɷji�OHO>�b�@)�#�\�d�=�сڤ�˯r��:�"D�bO��"����I�.�� 43 �<q�r�l��B��Mc�^����g�F�יg.�Hic}�����1������vqrn�J�9h@G:nM~��}�.�mˊ�LY�u���ݺ��`�����l����S'2�L��7.M���0L�gDkYW +M)� ����(����qm'A1^(/�(lC��7n4}�$����z?G�*S�~�d��7�=H�M����k����}� �J�-)���K�.OG�^�L�QL�n�#SMu'R*����(��d��,p�Y��M�+�.N�(��ݛ,}���^���H�ug*��_d�������1�ws�T4��{������.�B9���fV���dw༲M�Bb� {H\�����ؚ��`ʕ[�n����cn�s���La�\E0�j��C��X��n(U����ԇ���l��O�e�gq�om@�G�)�4y�@���ܹ�v�Ty�v���dC��S��`�o�:��$�ׯ�z �(�͊6K2BH�!�H�&��u�葿K&���h��ɃD�~���Ū��rj�J�9��&q���������D��љ"S|㳅S�jV�<�[ ��;�),r3�IL��8g�9y:��۱���=�YU�鈔�u~M�[��[�$��m��U�J���OO$�f��*A�FR�@��g@� & +��}��̀��r�������uѢ(:�=�m۶m۶m۶m۶m�����^��fR+Ieם����KW����E9f���ه"��e%8֏7k�ҷ|�"��?��C�@���=N2. m0��區����&�&����xH�A��K}��Sp�9�F �i��T��[����zZ?+�./U�.�M�WRB�t��䫑��|<�PZ�$5I��ȓ�v��~v2���d +�{�����;*����'Z�ݯMZrJ�p~n��=+* ��Hl���?�_�!�� +�B���x)J*���/���L�o%�k�h�#�d�=[.���a����9֜s�m�`~��y��?~�~���4��$�L�.��h�E��/.�m9�m\a��$�UJ�B�؞��N��D�H �&�f�PW�,��`�%(������P@� -��<3t����(.s��l�P��ZdS���/�袤d%�Y1@��n��s����gȣ�UV��h�!=�CE@�z�p�%d���p?`MuB��8J�6�+�0CU���CGG�.�v�1���{��v�o֦n<�E�C<ahf3j����MW�!��sM%b�ؤ��#���l|���t�q`�A-A��֟f�#���>�OGk@��W�?�9��]�j�Q��Z`l��G�z�# �vJ�T;�R��3�J�֬n�������{����B�D�s���p��Ieq�o�c�>�=������M�H�8�uIv+"�o�~����9��˻����-�s�H>y}/�b�01���=�mT�u��$� U�lq*��jA�.O���J�^ ���Y��z�����U�[Au���p�+RJ5�$f87Pt�"���/k�Ch� �H0<��W��YD���O�Ā)��B�C�"�"���!3Z����5�c��:f�ʵ����Y��E��*�X�?���B(s�A4a��uj���j�A����a�N ����0�80�1�)M�o��$����Q +�k3g�/� x��_���P�ǚ���VW�������Dr�pc-��qi��ˏ�h� +��y~����\=չP`UN틩9W#��E',����3|�4'\����:?� .�&Hv���d�'ŏ�CTy|�iK�|)��(@E���@��`�1�&w���W_��X�Y�?�����Zn�����wLF�-������-^S���Hr]N��4�֚o� +(��+�/�Y�*�5Rޚ�dNe�H��no��5� ~a��.'��"�s�����xͧ�A2���㥚���zA]D���$�';�\�3��t䪾�J�{w��0rѮ$��C/<�!"� ;.�D�l^��#@_%4/�W��9ߥ71سQ�@��Ȧzne̫�/ԕ��5ɯLL��~����o"(��e�CG�ҕi�&)�~������T�@�W &�>��#�W6�ۋ�0*#YE��o�L$5R���JI���q�I�0��zm=]�M��m��H�쇫��-k�1� ��4�ֹZ��8�o��� �6���W�/���o� #(-K ���Y�/��Q���A�{+>�[o��F�#�+@�@A�24?J���f�O�/��8&�w5�E�Q���2��'S�.O���Ѝy�;qnf����T�7�l�<�>�?����1v��tHnLN|iĔ�S ;2�b@��ۏJ<�kl��RBY�Z2�,�^@�z����»xz�싺��>�Vk�iM�}?J�, +��<= �w�}�'V�ꯋQ��*S�GyΞɣ�8��p�gRl!�O�ג-��i-�|��/Io3G!ES_���P�7l>q��v +35e��c%��bn;���eM<�jA�a�OJ��q��7���k��D�%lj_�������s�u��ޥ���-���c���w���n���Q��v`�^\�eZ��LG���W�W٣���PosA�����fu^��O��}� +oOؐ]�-��';���CL|��LJ��ڳ���Ȭe��wMS���_���D{���.vx��W��~��o���Ƌt�h��x��w�(��̌�`a�7�OZ�߃��7��t7�],�6��9O%����k�+�^ +���<ÞL��s��~���.��3Dw� ��2ȫ[ϭ#<�T'}��f(.�Е�ͫ�'k�g�sk��$T_Z��`K�����K^�hpo�Yv�&\@��e`w����v���W��IR:���0��f#��/������i�Sb��FRG7�E���,409]�c��:"��OL�(ϵ>��k$DJ3��-A��إ�#�\��ng$@DDrۭ���\�E�j��[���Ў���Z�O�1Jq�r]��h�qm6�TftN���N�^@%4�"� �Q8BG�����B����s�{N�Dc�� h��)x�K(���@�ל��|G�(��G�v�u� 2ԃ�+&�ȥ���z���nK0���^�S���$���%�S�<�J-+.���4��������k�v�%I�`�A~�W]��w�m�d�Ե��vcC��Ÿ�WA#�E݆��|-��s���v��ZQ�p��[��܍n�+���F�Q~����h6� �W���h +�]H����$�S�m��s�_yĭ�Ν�Pj�r� S���bYB�{f��fH\#��g�[�k�㾤�� +#��A��c�����-C�]��D�I�T?,��K�OR%v����`m.�j����7.�=��X#��?��^1��. +K\h��h�ᒂ$�r��=e�� +�����Ӹ>�DA�Z9����� [}R������$/��8�d�`�E�/L��. 9�$v� ��)�P4�� ���n)܇���r������m�(6P�E`)fG��H�L����N���0,�x4^&CV�a#ۦ�@B?���5�B��!0�l���{]�������[sYIjd�Y)�1���cHWv� �#|D$�j#�+��c"x �k�.�I�w�s��Aoz� � �@*�����a�4g&�T-~0�!�4Veٔq�!Yx��*�x;݃�@�h���&�� n��̒�|t�nԕ��e�7>��Jyn�� +�GC���C��%��ӁNA�DIsZ?ؚ���Q��*��t��j�T^J��=oX%��\эH%R��.�PP=��}ޗ��h H(�2�9E `����ޱ��=���\�DX������F���Qf��X�B�!�ǡx^PI����@�C� +J�L��"�)��'���a!6��ыo#���a�����nGb�zt3� ~{�ލ��DZYbu؏:'�s׳��j��ŕ�-�%fh��mU6%ӛ�qח �����Ʉ��n�(��Յ��o�E +;u�/v�$ ��;�4;e��<������i{/����Ѹ�����.�$0����/��|1�>i�4E��Ƙ�U���,}m��Y*��.��oل�1�1^Dwtjѻ_��*y�(����72~������@:�ʀ0�7�$<0As��;�g�����N��0���L�n�Nt-t�s�²-A�9�/����z(��)���SE�YgϠ<jmP.]w���I%-V���m���� �ĜW"�T�%D��4'&����q��E��c�u�OM �H�iJ�X��tT�࿏��D��h���@0�>�p�Z�ZʖM�qS$r#�OUV?"��h|}�gC�G�/�(���R�%��B0�Z��g������� L`���nb�)��~a�k�\W��s�r(�*Z:,&T^#��I-:����j���*����H��QҚ�jSI�g,r#v�6���w���E�r�t��*���(wX?�iU�Wr=:vE��nb���E`��?c+^�[����ܟ����D�N�'��d�kg��I�g=a�����$A�j���f�d�i����g���A���].��������JNe�s�����_r�O#��Ss{�k��7 �8�2 .���V��,+�m�S�]��]PHX��1�:�2�K�m�&��S�莱�ؘgܱe�p +�Za������`:�d���'���&��� ]�ǧ������z i,�i�=G��{J$'�I_���!�L���z����-�q�C�vNl�r�e� +U�ʐ��W��?�3�w��ۋU(���jhJ���������@>I��gi9XtPAd��ʾ +,"a�܌G���X��������֮`�����6mA�'��l� `��,�3����i�f?G.H�S�q1Y͎�]�x��p��L�r�] +�I�E���3����>Ѵ^.�鷮vw�fU�]����0j�w&���M�%�ڡ�J�5u�.q���ҝ�uߞ1��:�F�������ٽ#�$�%�k�e�!0��g�� ����������C�����Z�ц���du;�6�c�i�fC�o�t�vlq�Ȧ4w����Ta_h���+���j�u�k �j�UiAYm�< +UP��U����X=|*�@y�掞�n�8��?HQ<V�g�� ңV�K S��� +����pN������, +�6����4W���:��I���B_↉7�4��>2�=q@���h2�P��>��6m���t�z�ݏ4b�Ls����� ����|���yN�%�`iu�����f��&se��GfUv�ԧ�����z�^f�Eఢ�fp���#�ـ9�]A ��U�_5�z(�.��<��_y��H}�s�>ջ�J�{���0�5'�IL/�X��jiT,;ԯ0������� +�K�� +D��/����S�������:۴���j4��V�g��<J��'�`���t��$<��5.����M�b6���4�����U���bV�M�~{m����'���~e����� ���@ԩ�Z������}�7�\�����S��h��"A�3���9����E�����,�,Z +�P$��`�ݜe�[��,o��,U���P�E��u������n�Vz����݆��Nyh�9��C�"QҀ�5����!q�^����>�{ߊl�4�h��HU�+�9|�<-Lt�~��,2��f�8����9��Xt�$�g?} +���S��3��qFVd.��1�亏�"ʹKr��ă[�>�J=k��1�����²9������#� ��Op#���ac��In������3�9�-�.d��tZ�s�}2�;�'�-��� \�h�Dezl�8P��� z_a�βw6G?6n��|�p^~�������[����2)[����w�Ύf�����$�8F�������jMo�'�w�������A���n'�ㅢ�6oS��Y`u�Xd���K߮��������J�v_/Ț�1)&�b3���ON�3�I�I ��NE|2�@lƅ��w}��3�N��wK��c��Pv������>�.RLI����?h�ꛖ�_E7 +���hq���.셶����~��d�vBa�l�yŷ��r�*��j xz�UL\le�(>�a�g�$��m���17���:�џ���L��Q�~�آ9c*ٳ)���L�l˩{ǰ8"���l�a�^k����8���V˴�8 �H}�OũO����-fXd%r���$b��6�gRF[�V�qB1bc9�p96�?QH��LA� �Y�|�騄҈ +'+��� W!*(�'f�������k�nj��M�/ߌV�܆',C�=\ص>:,Y�#��\�3��XPI���)ڂ��E��z�nrT~%��z�w<���т���e��U�t���4�$���Ȕ]ن�;����G��M k�x�D1`"�]�C3;���Av{��Z1r��.�15ܗ��P��u�^�����̧]��F@�����D%Sz���Ǟt=�P&�8�XQN���j� Gi���*���^�[�*0��2�)jz��^�8'���Tƈ�Ɏho-�4:���([�]jN����N��1E�`�l=E9��R��#�ޱ}R� ��1.mؤ��*˺et}T�擒Fw+;���XA�A�u/B��<ړ)�����B{I����v�L��<�k"��\��q�N�i�g-�x���MUKq���Հ��hM@"l�a0��M:�j?A���r�bQ�B,����"��ih��CƎG"��������]���[l�Y� +�词@"&��r�I���8B��Ȩ;���[E��3_�(�ķ�|�.�<�I0~�V�'�����2�s3�+�f�3����R��x��7Bsv��X�� +8 +�w��Ζ�� �����Y&߭�_�ie9�ׄ�W�|��-pr����>R��Y�<�ިW.�Sˊh����_�ǎo~�r������ܾ�a��{����JӦ!������멟�5��Q����W+��*A��DL���#��L�uu�5 T�R������G���6��DŽ���v�TH��,|\�,]���M�KI_�~(츄$�i?Qo���Y;P���2��J�ӧuF��QC ȭ�Rz��v�y���nܐž�:��ɸ1�(-�i.pIA��U��d���i�N��>Zk/� +W�m�1`��Ĉ��7/h�F�w�[���*�Lyo2���1�BW���pV� �F�� �]�fS��ی�I�b����ER*�d�q9���Κ�|�Sq�_�:V���n��WX����@6��D"|.}��v�a�Fn�>-�fW�ג�q���Z����L9c���J���G_����<���>&R3�rs�7�$�[1��~�� gr˵�&!{R:^����a���t��3f<��V�����#�ϒI�$M2�H�H"�5s�Y�t�DRՀ;uyP?����J`�c /4�j���>[Q�[O w�-qRu"�&Lܞ]{�^<g^��(p>"� ���|��� +��ɑ�KHw��h�t��-b�����pc�|�i,,����u+��ϙ����,�-����o��G�tU�Qߓ�S�Cm+�l�r'{���%t(�\%� s���V��n�M��w�5��<�F�����2rZ+����3jE�Y��zg��;ۦ�Ч��K�{F�6��_�\�P�tT�D]go~�� +�� 4��Y���m�~��\�bL3���X}�UT�c�B�?�6����|�� TQI�$��$4�����(噓5? f��pK�������x�B̕�Pei�a��ض�٣ +��%S����FDwծ�����a����X�m$��r}������X������]ͪ�d�[a )��=f�!KZ����yXV]l��+ 9���v��%��m�bq�Y����M[Fl���a�F�~�3WA+�E $�a�*d@�HC�%S=��`����R��t�D��deÅ�$��#�l��B�����k<HLj����l�mLjqpeNo�H �øX��(�c��ڋ�p��9z;ϳ'z_b�_�uY��⫻5Rq�����$"(z�dF�p�7X�i�2[<W'C�+���L�ٳSԫ��G�3Bv�\hG�7�����Fp{G�IG����13�>�� Q�V�V9:��]����h[���QЬ�P +�WZ m|'�o���G�j���Ӛ\*�g�1���옹w�pu�%��-������(�CW���N|G2��� `; ���B���wh��zw8�@��vA�G��倔x�c6D]1E�U �;}�Е=��Q�߳������܌��i��|�O3�:&���lt;��B���Lj'[�K;�!J�H�y��`(Y�4�S:>��vٰ~����C=!$'w��,���� '�3BMa@������� (.�G������%������_�}���d��G"��պ=a>��v��h %m���t�y��m�0LY�|-�'���Vl>tq(�UhIm��l�n}A��C��ň(�sp^�a�ע�����৹t��|�D��A1��j�I�=�\��p�Νԝs��] 48(ɸ�dո��^����1�ƄS1-��$ϻ���1�N!���l,�D5U/����A�!<�%Z���/�� 7�D1`T�j>�w�G_'ȅ�4��%$"+c�v� +���XĶ���Ѩ���%��:r��'���ڻľt�"�8]�Ir��"��ɶ�9L�?��wކoNczX�U�����(�'~+N�x+J{�1�j=��;Bc�?FĞ�T4E���e�>�m�V���E�{���IB�3��.�s6���Δh��/��f�W�f�����27E��/Yb�'�O��n��\M�7z�?��Ίꐣ�>����4B���F1�1���)����6t^m��<�WUS�����P;vP@��BiXD��LoT�P� �8�.g��C���\j���V(/O۞\`7�3�s��B#���?�d�lj��߰��>Gp����5�_�4Oc��J$���U��a�=*@#/�� �E�|�GcpA� Ϟ��\N�.�k@�^L8�"Y�n߽8��ҵ/@F�x�y�'Ь��hF��:�h�3��/�S� +��@=����PQ�C9Ǥ*i�c��=!�l:����E� �2����w|�?��q��� +����_H�4.:\Ǡ��+y�(��9�����s��\���PQ{'&,��>k�+Q�&!W|�檷>Ak�._��˃�em�y�Kt��f�M8z�D�'~�Խ$k�9e��,�M�PYm ۋ�{vAHZj�գـ�� +��+o�)2S"�k�d�����3M\��������joߔւD��T�����v�̩ZI��~W�0�E�KEfI��*Bͧ� U�FE��%j��2�-u��s�x{��!R�_ݯ^��1�dX"9������֝���]�c�w1�wܪ�}�N3�G?��O��~ŀ�h��v }FљM�nKN���.��k���U��av<"��w��_�W��f4<���#�"h���(��z���8�bAҏ`5`|�q[�7\{J��Fn�x�%�P�e2#[T�/�6��4�� �u2z0TQ�,�H��tvE���t����0z +��c���ʫa}�H-6�N(��6c��נ���H�ƿ��f�3 �;+4d�"��7=3���(ٵd��7�U,�~��f���Z�+���'S^zf\{���Ŭ��/d��b���6��D[F<�_�����}_SM���yX����][Yg�خ���:�Z�'�'��I�!����Ebw�M�j@;���H@'hm���.�6�y�k)�-�f��\��E2R� L�I�;���S����5'Z���!�K���~L���㞙��c�j/ؿ��g���L�(ؕE&�� %������+�ݢՋyf +� �����i���d!Yj%��\tO�'H�I��2P�;�V��������r}1$��^z�{�����@�Y��ΆSp|� +�6ϗ�P �0�֠K��H�&ma���>M���'���h��J1����-T��@hQ�kJP���{(��$�JY�t/��>��anyF$�>ޙR{C��R���o���#?�.b��ѥC<� ��TT9��4��*iK��1���Q?j�;�Y��i4K� �nxxG���"�=��)ze���+5-ӓ�����h�;����c��\*憰k�F˵ë�lT��َf��x�;���-��<A�H�r�����ˣʒg�Ǫ���N�jB�U0��y�}ܰx�=&n$춱;��P�G�n��<B�<bX�SR��ta&Hob�Yq[��N��������R�HY6��"u���/&� +��4u��̎c�ŏ��nR�u� \�,��~/����k�d�Jd��1���@@9S�����|b�7�_6���(u�3"�[�]�I���E������Vj ������e5q�Ycn����Z��Z��3�.'��ĺ��)-}&���l�\FR2JiW�:��d`�O��INC�Wh���F�}��;�?90�(���彑��@L�B� +zc�y�k�;?�U8��Mg�vm�'�2�9$�L +I�#��`DL=�+Y�hW�;�Y��&@Nz���ӳQ�sA��&ͷA-��˯����r6}�N��֊�I�X0-\�~�IE���3����k6A�V�o�t�^��ح'�*o5x{,� �Wʉ����s�=k,��7�i���"P��/�^:�L�8�;��%�l���x���ڏ@���;��S�Y��Yg2�D�"�N�H� �ݲ���l���bEdĿ-c�F= %���E�u`�G�}<��6�Y�.oA���?��D�nk�J��/�B:*&$�pp��0�q���Ֆ8e6�q +�Ǘի�n?�`+�%�H ݥĘ����N�G,���3tO^.�4_�j&�i�F�L���_��`��mQt�XH�0jW�L��3�P�H����U����B����LC[��c�:f��R�P���S��(��ڎ�?��Tu��*|(3wO=�@D����6�'�V��'ٰT��ad��B��x��$��I�A���tW�o�{�M��j��OҬ�� +��>��l�?u�����z�Ǎ�m2�9��m�iY\�x/�)�s~G��lE��k6Ⱥ��x�<�MT��`��#hJ0�6|�%���I�� EJ����z�dQV�)K�s�%��zR�P�ԓ�.� +UhM5�^|_��b� �xp�{d3izn�.�v�-�c�<���5�K�.�B�����p0N$�o�J�9"�������B�O�T�_�P4W������ˎ"h�f�m���uIݬݾ^�C���Co��5u!�eDG?q�F��!`?Q�H%>[���j叧K��Ƀ ���"q���gM +�t����b�<����&�m01 *�qN�!���5���P���N��Q���!L+���7�������ɣRX��7��E<l0)j�N�L���ӌ�ڇ����U��gO�2����,��#狪@��ќ�r�t-��}�� ���g�����gGb�w�w��l z6��J����a����g��Y�@F�T���0�!�#!?��o�r�-<�=�YΗ���ᬸ��qe-s<�M*!R��4Gq|+��Wf�2YG�?�XBg:|8�d����%��浢3��!��w�C�#�;��[�:�m��G�:¬�n7�EzߡW��d�r:�# +n>��^�^�_��� 6drR~}��P��N �F�ls�YP�~��DZh#�n�:�"RU'��*����`aL��\U��3�wJغ��K8���q � +>��x@����-�2~G���7J��M"0����O�W��|���0�m��J�7_d�l<d*��=gp;wE��I�5�:����u;x�0J�ZB#���y�I141_��A���I1X�BI�C�̈XQ��+͡�|&��8��Zs3���m���E�D�A[Ma9KC � h���е:CT�(q�5��ιu��`Xי��y~ v�t��� +�-d�sE'2Jz) +St���! U���hb�v��/a�o�E��Av�5:�Z>����*zk�X�iz����PM��aF鎡j�G ���R����0���mi`��`4v�Zz�7�fK�_3Y����(爒��ۑ�O ����G 1j��j�4��'�����J�O�"��y�E$?�#��%���௷�r�[�_?���� �� +��&���$ F��[��8|<�j�L!��i���A5�M� �e�c����qNl�q�x}[����Gl{]L�l���/�]M����q⭌�D�I�er��iF��BQ; ��ap=K���z�F�%�rc��q� +;���T�k#��l��i۶�H�����rq�q�fd3�·���/��V�g/�&��<H���w���d]����$�U���8,e\��S������^=D�x쥶d.���$�R��K"-!�M���i��b���)�ԥ���~�s_�f7��hI�1c� �7J>U�ؘ�ۥT���}����tN�r�d�H�!v����P�$�9̦��84�ZV�iu#��4&�t�^�<DSC�HV8�y�b�Pi,j�D]f��1$,����kɟ��R@n�,�xAU�� ��9�����O�� å^Nn:������3�Ħݼ�� +E���� Q A<�=����}���$'�jZl���a�|�t��5!5*-:K���J�CM�k�rmY�hf4�.��߫�C���M��os��|4����.o��*��hw�DN�)b���PE.�#P�m�Y� +�S�.���9W���6M֝��o�l��Z$�^�H�2i� �$�f���-��jC��;u�"uj߁Y�u�E��� ��I��x�����Zp8�u�M���f�`�_����D���am����G�g�1��b?��F�c$M�G��M=�h�CyfV�S�gb�Lh���2V�bf����FR��M$����yN��N����L�Ke�n�})j��{�;���_�Am����7���@U��W� ^p&k+{9| +g�E����?�{9Z�yi5� +9�_�e��G~ѓ��%�[i�Ԙ�ʂk��;������G���'g�e�H����$�l�$t^�D�����돭��KiS�u�����C���Y2��n��R:�AF=n?i�%�p�:���V�;bD�Y���-��q`8�Ͼ*5+�S�$AvOv�~ex���W �?�i͂Tg���Y9�p����+<'DaJI�O�_�����'�֫~�x)`�#���~��?�.f��,Ŏ�*�5[M+L�u�T�:�� @�\��z�A4������̤g� | #�YnUo��Xd ��~{�ۅ���Ve�ڃB��,����lt����3&��w`o)�0��p��ʿ� ���R|������K��A�]���uwg����xP L�ľ�l�T�O`\�,���k����Z�f�U�K�35�})��$��~��ę �6�ʁp�ʾW�v,�o.�f��#�e`� շѬA�jnM�WE7 +]9kZR%H#j0���u㑴,����r�&�D>���-��i���r[���ȱ����<)�t������I�@�� +�V�pf�;ѳ;|���lbl`F&���U�E +Z��EɗB�4�oo�6�Z����VY��������\ϐ��t%ف��o��@����<��ؠ@�Q���_��ߖHB�Vys�P��I�1��� +���uG�oB_j.�!RۧS�s,�%$k��x��l��$Ud���"�?'��l��z61��E�<�{�)���?�ޥ a�a2��d\|M��b� +|(/D�[�4Qn�>�O���h8Q��9���J�&����K���i8N<Y1�|��X+���ί�5�->.}�dr3�J�d�1э��<u%�%����h{�#U��Ht!u�W8�:�$����{��lZꢀ4�E���<�DJ�� +�h�|y�g\t,�ߋR y�,�k��cm��2�N�Y�E�#�Ӌ:��P��(�jg�Fh�J����W���c�(��U�?ޠ�q�h���LC�(@Vb�Xun����kJ��8f-��14����}�`!�İ��P{6�zw���l�Fh�% U��:�T� ���4���������1�)yա����+�,��1A�=��S�h��P�ҼN%4���U��9�;���� �v�ޡ����7R�t�P���,�Nr�{9@�ƭ��RM��Y�E�I[7��8Lgi��1"��_+�_��S�jq}�&��������l��Y����J�s�i�����6�e���*��6��[D[�T�dFӛS���t��:+Z��j�=r�9���H�q +}��0�*�}�gx5־��L�`i�F����亢��Ajg�iD}E<�C#�D���[�{5�Q"^�~�&�C'��IJ��5&��6�!��x�S�D�OZ�4s�ط�]�b�|�?�in�ԟ�$�Q�u]P|��]���֫�r�G��Psu����,�z����/���u~�TV�Y�L�a�'{}�l3}�o��r +{�0[���k��㲰.6]�q0�~t��Y�aD�F���S-G�i9F�u�<7%�k�!o�\_墨�؍O ���5���.���ǯJ`�����Pb<���vrYϚ�G-��a�E��7JE�{�9p�w�y��d e����ˤ�Ђ��ք�G���B��[��p�KTiA�W�.4�&�G���tf[�`��3� +�$V���*��_��̎��E��/���� �1����$��wxjġ���ywD衸�ؙ��տ�\~����Ѵ��.'������DA�!��6cZ�W�Zʗ�b�}�ɜc�:�NA�^Aɶ���=jDu��l +��AY{����fd �ڛj��"�I�>M�(g��o8{'k7����l��\��O����\�?�-�.!�$��GhڸjI��|��H�� ��[�N��" ��'�����(�u�i�i��B:⧯ �;��x���z���WZ~(�nW?�P��|�Rj5�T.����g��� ���A�|���T�g�^���`zcpA�LZ���` �t�|���!�� +n�x�?�y����Z=���$|U�!l�����_s���#���Qu��?��=%��qm�����_.jnD!J�=�-����C�a�:�9�P|���g`����:�8�h�@��oF�2�H��nlo�_5d���l*8U[����{Kj�7��q^l� $B���X�`�^��z!�%�Y��2Ti�(����Z�[���D2&����(��7�&5�2�]ax2xy�;�k�Y(��m '{DC���H��Q�ur6�ٽ"g�AZ��V��%�"� ����&�B+�+��j�����ҡ���b���cAa���+�L�@�.a5���ʔ�w{^�=�J{�$�-�e�v��b�����ѯ@�����d��U�{#s{0�5����u����&P���Ɖ����2�=������)b�%�ZA����qC!=����\W����9�١��*+1���8�7ɛ Q������ȱ���hEՂ�b���XO�����D��D���S���+:�!�dm���-��b8�8��2�z2@u.�+��"&��'j�{e�C��^~���m4@��,���iـ̽0���Y�/y��}ָ�� +Ո[��H_�y�.Ui �AQ����В�i��'gZo��^А�㬝J;ߨ��W�ꢤĢh�ߜ��!|`pnj�˩�,<�^4�0�}�x�/�B�ߖ�Ÿ��G�6*�R��i#�y>W��;mKt�џ����6�@)Q H�2*iy��Eɩ�]��gE��0K��x�s��0Ƙh��W�|wC-��w��<v�م���xTnJRuV���X/3��v֘�N_'WI��B�7��DJ�`�,��,88jl$�F�UNM�d֫HJ����M�d�6 ��KC�K���u��ѻM*1��TL��@��d� �~64�i��ukY"M�=j�"��ڣ⾀�(�^+u���ȯ����tp2ˀ�q +���d���.�"#�����K�c�t������1j�`K��.��I��A���c@��J��+��¢����l���[1�P����f�j}�[���i��*����4��IR2�F.wލ��騔T�#@��e'p�c5�s�?��3V�/Th4s�㑄�?�������� �b��^�ľOÂ=��@����S�q��/?����"�%��ͼ�6���w�v Z���F"�:g�ukd��!��N�HQ���D*�y͙3�Q������mAAS�^���( ����P�e�0��r��o��� ��7le`7D�� U�"�Ȕ�d�>-��T��>�a�S��T@�%V�K�,��2Ў�9/�t����u� ���KWR��Z�����O#�#��8���^8P\���+x }<��6����������p8o�ؤ��S,�p��]V�r�V-K'Z�`��oя��Z�r��gЈ�}��B����~�Lԭ�!1\�P�������7�vU�> z � #A)������B�ᢛ|tg��V����dk�6v�g� +Yqv�sgt,le��ɧC��U��D-�%o� B��qLK��L�+�����ڷ��O�?<qp� Z�+\.F����F�$�8�oM|U���`|(z��y��)k��4]~��Em��-���م V�>a�N����u��ʹ�t`0"��xNx�"G� T�NE��I������9�(H�m۶m۶m۶m۶m��m�=�y�ɼ���R9��'+���BK��n ��FjO���73b��ˌY:�R�K sQ�.�{�ȩ^$�Zls3�}����`s�P5|-Jj��@DA'�J��h6�=��W���{�+{د�o�%gH5t`vKܸ�- �Z>7���4�:Q�htX��o��������J�NjyR�ʌ�Y�~&���Z#+�D�A�N| ��yr �4T�����(��� �e zB�v�꙰��;uL��S�B�H8�K���%]�^a�lg�e����� �h��4��K�М�SPΘ���%Jf�no��Z&���>v��eR�ߛ?|��9��5���$ȧ� +�w.NP>��f.�V|���q��'��� +�rq4�.>���e��9������g`$GPs�����j^�|Z�-��)�t"2&n9j���_u@�u��I� )�'I�l�J[�4�ɐ�I���:65غ\��&*_��(���l�75%恁�U��'@�.����C�d�ׁL�N�)�0QRn�H/�M$Z��cTDWw@LC��.��^U� �+���و��WNL��>��<�[�,$s������R�x�3Ɲx�"��E����?�E~�B�i �>m{z\h`s��i��J�����X��J;�LT�o2>�#�'&�U'Y�� 1�x�S�~X�G{��e�7�Mm�u��՜>�#v�V�fs��~C��7���me��&O���ȇ,Ȼ��*P�>�Zl�T��1-&�����jvsb���ƾ�d �]��m�ܧX1(�'�Kڕ�K���.�dh���b�r����.X����T�B�b���8��?�]�j��ۊ�3�#м�Z�f�X[NM�J�'�&�F�P���i�Hړ����S��k�K�5��*�� +���4��Ϣ���������z��< �4m\a��K���5(�{�݂�P�1�ͥ��Y���&Mo:x�7~C��x�QJ8��I���Z +�}��P6s���L�E�R���Dg�*g����]�J?��δ��WO��B�8t�H?f��V�'�qA��z��̙�@!�Ӱ�๙u�a!�S�� J��>T��=��h�Z6��=25�|���iX_t�E�{n�<��\F�@8����l��*�v� ���k~��e)F�v>�!����+;m�Bv�;{^����+�[7 �y���Q�@�1���\�R +ߪWs�R(�#�Bt��u �'��H��~��X�˻�(1�/������}��RC�DY �I����"#^~�ÇΪw~Τv��!�B2d=�'�� �W��S���:ݬ3#��M�@~tn����Z�Д +������~�a������R=�!L�|d6~n���3�EmY��{"B�t2<HnU�-j�mSm�(jJD��g��^��a��ء̡��^+��G6 �>�vԞUltJ�|��� �ځ�H>0g��z�������Yؔ��ja��� ��v��RxvFAb�xt���B����0\V��c�1 +9,���Ǥ���x�~�ZR^�iv+�-�VF�E��c6r4��'ͤ�������L����`������67����WNj�=��"�������~ !��eR�|�Dd0M��2Q����:���}�LpI���6��[x��e�n�ѼQ�u~"ͥ��Ā@�$R��w��TIx[yМ��z{�FK�+����1#3�[��q� �����A���<���%<A�ZM#�����C7�y>C'0>�n\���c�l����:a�m�9�4��̏zp(��m7�����7 +4���c�x��pIm��:p�X ,)���K��H,��tDҺ|�(��c�m��g����{:�Q$y�����B,�T�H�@q���-�Z��Dul���C_C�z����t1 qd�k���S\0Mb�c���pR��3���gu_�����������v3�� ��q0��Z�^گ�At��_��>�_QO�g��k>1΅�=:Ti;|6��DՕC��]M�|��MV��%ʶ���G���'T]��Pe��ɘ�.��=���w����B�ň؝'z�.U2�w��r���!���}O���@�<�'P�ziT'��/b�|��L��Ϛ�k6� B����羕|Q Y���z��XH'Gme��ي�렾�����ȁz��<O�wr&�N�a�!;J���$�3���4�`�kb�I�:�)�I���f��,眢OZ�e�5"�ڡL�<���8�d�Xۍ�[����C�-�cYJ��伨��45)#C�[��� �Glg��N�����%I��4�9����h��qݚe��^3O��p�@ D��"`��&"ʌ��W�iJ����=[��W��`j邑�+o�gk:�](�u�K��s���e@ۊ�bT�&�i5BQ�~�(��zF9,�s���A���8D�y7$��fC��0�ќ/fZ�V�����8ïʋF��y|K�]��v1GC�2[�hF�&M���� +�fn�� Z�q�c�Z1��9 ����\e<����l>���<\s��f�D�]1���t�gO�0&܅��|>(����5ig ����B�E�?>����lv9�L���s!Uv~)�x��_z��1�����j<�L��r�E�!Z)[�{%b��l��"���RpU�?�h�= �]2���Խ�Y�ob���n^V٫5���W����wѢIu��Fc�oX��,�bT6�{��KJ�����`�ZM���m0�z$=M�$��v�S ��eè���,��|��,+�@�2 +PeMHv�� ]+�s�P���j��؎��!�t>�ڤ��<> �:��xՙ�B����6䬜v�W_?��ż�`�蛵P����ǜ�%~z���t���oc�ĝn�N�L��!����?�u�d�'Kp��� +2��B�`���_���2�~T _�kB-�0�?t|�ң��9FV�m�~;�w]�I7z��#t)�z ���˦�Vc�6Sb�����6i�zIF������q¢x������m$Q��+P��<oXʓ����̪�j_���O�����z�+���m�&ّ⤉d�O,��s�D]]\� +�9_���`f���5�|�T��e~ح�y�^����S�h�M�u��O���8�J��8��U#v[�!"�� +�.���������\���B��P�ج�>Y�jj�3#���-C�дS�v��D��:�%���C��(���;c�u����6�KAYLw%�٪��2+<�S�m@|i�؛,?2��� �'��\T�~��2��'�0cXe���C��V��'O)��3w�}\��&�A܇ZDD�v,���U ��?E�FM<R���࿌���ٚ���~Ͱ��5&�Nj& �C�x_Ż�,dt�����{4��sR�-S�\>��ݓ�I.b���{�d�iг1���&�SwkW८� +ɤ�\E���v��F�x��O�|:R�W�۵�z_���(v�L>U �G�CRR�7Bi����x�0��|�犜��L��h��t&2 L ln�n&�b��R�p��d��F������D9�,� +�3.w�Oy�/#�����ά����|LM�/^��B3�Ŕ-bH.z�Vܘx{V�A(�+���S2FzHMƭ���&����Аs� o�!"G�Qmc;'���0ĉ���s�@zd���c�F&.5_���'g|�\��FE��C�Ū�Vg8�`ˣ�ȧ��8�x��W��m�`V�@��3�4"�|���絈�V��Z�Bͨp��h�ۘ'�����x�i����֥2����EnB`PƩ +A��Y�)�5������`�+]�֯A�Ų���Ͳ��4Ɉ$�F���>�D8\�x��Ty��O4�����b�c(V_cRC�K�\�+Ey�x��g�J�`�j#I+�+<nsޡ~Kf��h�V�܌4�ہ3��E:�Ò��E�K9'�i�^�q"��nqb������٣�og"u�옌��!���լu,��S��y�/l����=.n��wc�T�a� �N�8pis��dc�Y=J�Ѧ�s�e�������ɾ���Z����|�C��D��k{u����ā�%�v�{7v]�.�C�L� '�EԆxq7<Q�C��gU�ޒ�zaG99�� +��J��u�G��c��v������d�V��k��48��[J�'7���yќ3�E�WC�N�6��O+��ap�5w��KY�ҵ=��C`L�~s���v����*+Ke�WCn�f���b��Ñ�օ��U>h�����9�����^G���l���U�k���1� 8nNN�Ҁ�`���ڱ�����@Gf�<��lRM��XW�>`�ؓ�&�vRLV�-�O�*`��qd�5Vw�20I@h�s ���O��c�JV2W�� �����G)����рNۏ�B�N*T��*b@��Qz*�� �VL��;�U�A���a�g��y��������K�Hqn��+z��\�mY�Ǩ�~���ϧ<�q�B�X��*������S�^���<_�0� ��oZ��3�͡�֩�)���^��_A8D�Z{�UH ��h�+t1�>��v;J��� $I2�����2`��wR�]���2��D�0ҳ��ܝ���G��T�P������# AK��ߣh�����L��9����E�L��=P�;lX�h�9{)�\�U�R�=�]3�_��2)����}�γ{�9� �x_t�X�h���-q�;�=,�l;���9w��zY�܋_��b�հ�}�(0D�2�E��vy{C�EФI�"�CP�=� �q�(��@�^�Locj�zkS��D���R��x�Zg���*�M�hi ���h���O�tJ*$��,��Fm4>j +�?�I�Pޤ����?��ƪ}"�Pp9�'�'Sq��VT�����~r���n�t2��~L�6���ڢ}0���|Tx���������=RtiK̙�o� �.7�5��4�!�����U�2�m�!�����E)rg���z���M��O�1hD�6�������D���َ46���a�������T�UB�Y�Kz��� �X���+�8<�@����{i +�e���(�&G�_����,L�`!fnU�c7I-���_���(���.�}憎��2 Tj�SLڝ%'��kowM����_T�_0�e���$��Z����F躿( YY���[��P�����S�2�ɴ���^�/?�W���%L�3`�H�=3��)�&�q��j�w��x���jQ��^ -wo)�oxBk�����q%�Ү{�[�8b'�J�j� ��%���n �:^��* �A}�uF���&��/��˖ �%�&�|�h���WZ��%Q�Z�g\P���d���7���*� �'{@ܛ����t*3e���� +���L�WJA�r���m��n�����ݖ�N�at������J�T<@��bVn'���88̸^�M!JK���f����x��*�� +�cE%<��w��~ȅ�q��a|�&�X(�{������2Y�X]��g��G���m �� �z�ԃ|�0�S�b\�K�e$��4�K{]V��RQ2�0����8{����Ӈu�WZB�?T��.�Q�n��%�LI�������� +�#�aˀ@�ڃ�5)T�W����5��b�a���D�'��+�>��|(I�dD�s�w0��:��/!��T�ch��.��3�X���.�O�|��+rs���(�2 +��P,Ӣ9~6��^5'K�OZ�Qb�#8���~&�^c�9a�<$M�J�<�����J�ut�b$���U�GK��3);G��;IA +)�]ѹP=:�9:W����0�>\�����r��>��;�Jϧ��@��7%'��uE㩆���P������[d���]����}��[���W8!��@+BM�NCG��Er2�"ո�en�0 �\Y�dI�s�b�&�uY�k�5�zq�'��a%�jn2���E2V�gZLJ2װ�ky���V���:&�y��.�\#kCHX��$�!0=$����8�غj��Z\�� ����?]�5s��i���o/���(�^F���ߓS[ٵ�L�/~�M�+�z�Kϱ���H����l@L�<G�z]�<q�]���ŜE�8h������&���u��B*��R�Z*���Kf�G� +OFR?x���F��M�ϴ�������!Y�]�Ђ��u� +�L��z�$Q��3�_�1ӈͥ�x�tD:�"�1��:+�@��&*�|j�Q?-DV��gIKlC!��]L�I���$��ߟ�E7�ިX�,ހPw;d!�|�#3h��ϯ��@RQ�vÞ[q�lz{��u��Ʀk(�s��Jq�?�7��o���C)@�uJje�% ��b��ʬ7�8��'ȗ����mҭ��B��u�\��tu~�vzh������2���L�!#![�i��g�itUם3������#��������?m/��H�J�Uӄ���@#}Qh�c3cY��>q�2���o�C��wpA��*�4�o�LԐ&���)�-�)]>���Q�t �YT��~��P���Hqè:�w���p���]�E��g�������-N�Ԓ����� ��u@:��b&�H��Ϋ�e�N���6W�Y"]L]kuu؝FY�V�A$���i������1T�9~p���v�Az�X�>�fIQ"o�� ��c�=?����>{S�?l�]�gb��, �l��.zG�3�N�FR��UR��A��C�A���j Z��;3&�ޖ���4�h$//�6��RZ��b3�j�/��������cn4�}?�W +�c0t��C�XZ&�Ah>���3��{h���l2���Ք� ��)���F�lC�#g�Y��&sJ����w�m �<�]����L�,�r\~Ri��RZ�[h�ZȜ��A��F�"��f��&��|���k\ڑ���)��:��L|��ni+�<A�ֈ��]�#ޝE��vQ��C�I dc�2�~�����nkY������9�� ���׆A̐��QV���ڋ~)��.{M��.��@�φ���^(S��aƵy.J��Γ@bS��j~��h��7�`���5?xH@�|pB���'��m�e�d��&n���ЯbYyx�g�:4��o�� �����~��:qy��tNip�e=DϘC�:�� rz*���� B=\ �Q\�9W��B%M#m0�՛^��L���oE0'�r������>������z�U��3�-��'{�����0�k��6����v��/6��Λ���Z*a�Qf���H��3�6�����w����(���<hK ����Q-bI�A���00ou����2���5�#���˱Co�`iSd:8�%��@� +����F ��q��`�?����o��$j���V�"�P {l@��P���RC�z.1�m�K��z�Y[�y��� J�,�`�x���~�:ie���c�G���z��7k�lv_l�>�%�L)�l�@�����~�b�x\p2#UXV����N�s��R��HU��ʴ0�I��<^�}_�g�Fy�+�������W���`8�|�=��T98�;l��k�z I�j��D��C��m��AnK������qht�����C@�}��CӔ+���ђ߆8f�`�y~�b����w�nBjlL-�Ȣ��;����(x>���ۈ�� +��)�yh���I�l��b!�a��������Y�p!v?b�7n�a�z�bk2-c��t`����D��2L7�H�*V��|���v�}t����~�3���37�M�#-EY�BV6O��RZv8<)�E\��7~�:�O��͊��5��"����D�Yy!�IԲKl +/�Z�榼��ߍ��nf�D�KEk���&��� ���2�Kx� +��G��~0-�ڠ���[��t2��� +��>��+�O�����+����km��9<W�٭("��BcR�X?iH�� j��ƚ����b,��9�h�=����E��=1�d����A� ��A[W�N�ƌw���8ܝ ��f�]qͼ2��^,H�n}�����t�8���1�fɬ��}��5�E�mA�Oł�'6 մ��C��sl�b�w�bZh���5NVN�nd���e�jB���'���y��~�G�[PC'��=�R�D�Q9f�U�H�4�q�o8��Mb�ܗGxvx'�}B`x��v^őc+�>y� {)��� +yY�~%���Ē���5oU���P@\�o��[�Am=|`{ٓ���T���Q�Ɵ�@���r* +9�����+2.2q��1qR�/�����\�w0�I(�mY�!���R��#��~�̆�L��Lt������57]^�aW���%�]��xSdu�)PP�Z�%u�{�H`�X~��:Í&���R�V�;�*�g��Y����|���l�0�J +��T(*Y��3c�G�,Nʥhġ�[B=�Ώ�iC�FUb�?�����`�G>��چ�)i��}� +��9(*_����phЖe�*h�o��ow$$�N6�ao'�{��%[�Xܿx�� ��8��Y�~ZE���<ٚ�=5#�n8��)��>�����т�� �9+u{��&|�1�X���P��,7��b� +�ƖC���%yƸ����C�3���ĚZ�,!:���spGY\���KD�*'�����U�C���}F7����mv}�?�����K�����J���"�r ^<V�W�߰�C��Y�� ��Og��u���Y�C-�S��,�!"'�m�u�uc��jB��.��v2��\��-�>�R3��Vńɒ�\4n�æ��l���gi�˚_��3G�9[��ڝ��I���;ѿJhb�1q6jQ~����GB6����{�O��R4��˩�Yc�N:�Z�ڳt�C��������z=G���8�j����B�L������Ր�(D�(Ps�)��S"���f�v?���@[���BB�s8��C�ǔhy>���N�F���C�w�Ɋ��S�&���gn�_@Дz�H*v�"?��r.��h1;2 +B9�������5IB�+���Z`9�s#�f���;�`ll��d�p%�2҂�<$�)� �]�!��[B��Y��v��E�20��k��9|��������85ce�K��nL�+�T�@�u���tk :��4��C�}1I���lj@��"���j�&4�� �q3PDTqS��},.�L��n�q�L���n�i�|�����?�6!�W~/��M�HW|Y��I1v��*�Ҝ�|��y�����r������2��M�_�^��l#��]ߣ����f�Kw�q��ԅL���뽵��,��}��a#���6c̈��ަ=Z4��^!�q� +}4]A�eS�po��I�D�_��U������eSO�m�Kù��x/��z9�:A/���$�e"! ��7�1�ŭ_;)� s&)$�WLʓ&%oKhq�.$�r2��Z��ʸ�.�>�[Bڭ�ae�b�c�́��l�m����f�.�2fp����V�m�(7���ۣQ�Mh�!�=�G�Ф�!��sg�$@��C��A����lv�^�T��Cv�M�B3�� ��b� R�$`g��Z�Rw`���|@0�8Z���@@�m@*8�:�ynE�?UBB��^R��2������%����(x�G�����w�[��*W�;���a5x�PKK�f�̧�0�k~�1��8��>��<�lJm̴=�G��.��W/�xo�v��4.v�P&j[=�n�zC��T�.�����x��4CH걖N/vxw�?@��U��`�!ݹyؘ��Y<�y���<S��w��Cuh� +���������%� ;�+Ш)��$����vS"����CrYcu�c���9�pF��M�sD�^0pD@�Ē����R;Ǎ��?Ց��%M�w +�sm�� Ή,�����?�+:8�;��۸��e��u�C�,/�����h��)#��jG��8�y-��?).��awJ�å��K�m�Jyݵ@�?��D��� ��>�M�`p���>��G��'*k��N��`r(��y�3"XO��TД�w�I)(���= 2k�Oyu�C|~��͑~s^�����_�}��"fH��T�+����Yg�� cK��d{OٓN冬;��Ҏ�o�x��Wj�'nz�Vz���+{F�$�݆u� �O�xd�����%E�B�Y�j$�M��e~�ӭ�S�OP�@���f.��H`��e����q�[���X���>��-{�1�3�묌X���me#��w�������jQM`љ�lʇU�rQ�X#Q*�j{� p���W@[@�C)Op��q�>��*�#:(Z�����RC�� Fg`�;��~�2��o�P�J��PX�S��(rv��H��������ky7T���ړݮ9����ݴ����� ���M��b_d�遇����o���r��]8����h籄ҽ�h��ş�1�n����! ���\�K}X�c��N���嗷 +z��"�����!�̥�O�g:�+� �~r,=x���$[��sy��(܈*��О��}�(���!]��m��H����+����4�V6#--�3)���B���F.�1.�|� �N�>��FA���`ͥ�S|KT�-���-���g�D;�F�v��>�eg���*M����=�$�$}0_����W��t!�b�w�WH'��7D�Y�4<A��~,��G*fo�������X{*d�wS��l�;葃3�ܢr�@��2<ś"��L\�2zd/ɰ(=�(�^N|�ڦqA�8vU`�vR������L�%�Z��u*��6C�����O���Q���6�6�<����\Y1��N~����UU���W(�T���G�jP����'��}�T[� ��W��[Jo�yd�óvZ�^�L^S���h�oOq�=9�C ��-�PR� c���@6��c�/bv���/� +v��L�¶�@��N���r�★�.-}����X��?S����ԡjl�x����/?����ga�<����2�_~@�4�Ty�R�!G�>s�k�L�D�To8 �T}0}�Tsq�ˋ�~/������4c�0S����SM2'#���H����1�WV�q��N�!G�ށ��?e�� ¦�' +��Èi)�堤��� ǥ�:���#�w�$�z:�ْ��>0T�HZSB�z�ѻ���,�3�����1��@�K[ +�R���������}��{���I@����|�z�f��~k$��v��;|�Z���� +u��f#���(��;���2�Dۚ`̏�D�g���g��Do6N�m�⟝����T�<Ƌ-]vg�������`ES^R����X���˹k�о�G��c������e7��M�<@���J(E�9K����L����z��:��� �_QA���5��SR�z)�6��S�y&.*+�R�<��_�Hb�2�@�x�o��XɘC��T�l��ʨ�O���K��b��~/�ț�LA��EFû,�*�@q��@�X-�Q��g�ݓ!���?o�W�g�/4�h������y(�!e焯�Y�j�E�.�t1�"p�"�P�����*�~�$o2s��"�f�ލ{�nGO��Ϳ�^�G}H�����a���?��Hc{ʅ[�`�xa�����1�l�OXZ��,7���n0�D�v��-��^2�[So*�{Jw{n�5�dz���7�bi�Z�M5L|�xyy����`s� ��� UҘ�2��ޠsn�Lٟi��z�:��N�����X�,��F��Y�d{dFx�nڜ�TO��csB�+U��N�.���.4_j�<�T��A��A�P��fS��eP�۳���j��f�����@�q4 +ѿ�5],,}���vJ�ƹ��a�,x���?�>�2rV����r��RG�Ж�f�"��Bﵖ��Y��_PԳ�MEj�;E��,ۖa"�w)�R�Ӵ�&��ۘ��Y�u_8@�ݦ�A��̝G����3*�6�c�-�3:��y��G�}��Ss&7�2Yc��7̺rУz{�8dH��fG*F�u�����-1U�z�� +8�O��(�j֫xIn���5�H:�`�;�5-2�>OcϹ����6(�z)�<��[R�-~�B]!g��E�t�İ1���ql�����V�4<%��5�(�&�2�6*.�a#Jl�~�#�>fl�ɕը����xuDVQ�`|aΤ��i����X.��Է�ή@��w�O;N�(3 ����no$7��e��պ + RB#/�}go�~�dq���wX�T��i(e���.�-���h�1;ؾ`�'=[� ���o��r��"�ſ*� 5���o�D;Q;K�>%r��;��c��* ��ψ���*������_�n�����@"VN���i��%^=b!QP[�FH3��5w<����~��%�)�l_s�4b�zQ`��u��;�r�N�J@�[P-����� =]!;��λ�<�)�#H~)�w�i��0A3[�,��g�8�,K�1�3��ڝ�-&'��f�c�r+h�/--ĩi6��<ĸ[�܄��WERyi���4]�R"�Y��0D--<4���n��VT�ܶ'����Y��"f��F��K>[���@�+g����K_]Օf�:��+�k%6�$��+�����^>��8�RJ��� C����{`x{`@�n6>���������p�Z)5�;,�˙٭ +�3�<��H�a8�q�J�Ѩ!|��c��J�cmg\;�w&�KZeX����=��I$�^V��G�d(hM��1��8�.��@�/В+�݄kU��@(�j<�ԅ{-�uyH�9�>W�J�5c}�.3�<�^��7�k���ȏ_��o����tK/1*0o�$t�@� P��)��+u �L����d�s��E(��^6+I�y1�/�����tr��D��K]����{ٟ��������nS��f�lǣ����(����$���-XjÑ��z1R��s#����|qy����'r]hL�����Zj0�ֳG+���koc1�yE��B� w����U&���xA����/W2��3]C�VN��p��\��rK�^���p�Ʉ(�ɵ�Ss2C�[^Ƿz~�"�9r�7�&_��8���3���{K�A3����\�87����֤���v9��̚��_-�R3��~�t���J����e�s�C�������\�Y���<���q>2*f�_H�5X�C~ �55��+���=�>˓K��� �kp��4��M��;���z����Q4��l��٩ł��n'w]�;���oHge�x����)wZ���j�Q �x�<䉚�ղ�2|�Xf鍤ڦc8 +�D�39�'�0Y.�F���W���QE�.u8��X������$zi�D�"��M����.��D2LI���I6p1z�FтzDTr�Ů�ѿ}X�Z�b���3M>��T��ay�m�L1"��G?��<��!-�]�ɚ���gp�'*q��4o���N���ÚP,���C���Sd%U,H�;�'2l�3��KgM^a�6�/ԏ6JIh������6�dw�[����4�^:`�ub�� ����Q7j��P�b��wUwح�?%�M��=:��-*���8UJ" �ݓ��!?dy[+\?���֏�6�=�v;���* �J7���=O�lq��DU��B�6Q$��Ą�_��Y�704��b�3�S�����nq^�Ɛ�'�p<�.)E\9\�P"�-�тg%F��ۘ#���C5��Ͱ�kwʥ�ۃ����dϏ,JbL���]�n�T0�m����&2'[=�.���h�ݢ� +����\�ڷ�ŞO ��,#���l�Fǔ�'�S�{va����� +��h��� �n`*�JQ� 4�i,��$���9xBXά��k�+M�-��w)^�^��o�����Q&ֿ;K���m>�/�٩�h��X��$/���3�� w˒[���3Q78�@ K�}K���?���Í���{��3�E�����PB���ƃ�"na�Zh0��S�p7�Y��N�x�����k�,����sGM3ρ���{j���4}jV����A���V�'��0���H q�����o`��en?.�F����w<C�f�H����Oh�3W�R�1�1� �3[T�feJ���N��.���O[L��qu����:E=�w�ٜG��ۃ���|L" �:7N���]n��/�,�R<M�\}�_M1Z���`��ܟy$zf��60�fM�gC4Y&�1c?n��bc�m�����P�]N�!ɗv�ň$yf�ڜ�q(���J��ez�n5_�\�閱��= 杹�.2kD�o6pPǝ�QP��D���W�xaa�S��D�AFC�p�����z�e�Wt������A=��GG'�Q������D� +endstream +endobj +1558 0 obj +<< +/Type /FontDescriptor +/FontName /WRFWLY+BoschOfficeSans-Bold +/Flags 4 +/FontBBox [-174 -300 1295 1157] +/Ascent 770 +/CapHeight 698 +/Descent -183 +/ItalicAngle 0 +/StemV 150 +/XHeight 523 +/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/eight/f/ff/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/question/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/zero) +/FontFile 1557 0 R +>> +endobj +1559 0 obj +<< +/Length1 2170 +/Length2 105555 +/Length3 0 +/Length 106088 +/Filter /FlateDecode +>> +stream +xڌ�eT]۲����3qwwww'�Ă��Kp���]�C��-��;\���쬽�{[���TU��VU}�AA��� bfo���sa`ad���;�Z*��[�Ռ�T��6�N�Vfv��'@�#���_a�)[i8 + +1'��������� �dP2u���XXxY�y٘�Z� G��s�X 4�+���9���������>D�,�y�������1�� + ;31{[[���3+���c����_�e���<�2��:���c3�]�j�������B��kfog� 0��1)ڻ|��V��$]ml�m?��+�_��ծ�O��������`-������Z��nc+S; �����߿<VΒV@3e+�� ̍m����kؙ�l�����V �����_>uK+��v@gg�'��.���W���k`�ё����������\�=>T�ˠ��d��ee�b����2����]��<�z������?�?Q����o.v��GXXy8>������3�7�����rp����=�>�?�����(����h���������/��� ����Q�_�'�I�q���7�I����$�M\��&�?�`��C��&�?�`��C��&�?��E�}h��CZ�Ї�?��E�����E�}hQ�CZT�Ї�?��E�}h��CZ4�Ї�?��E�}h��7�|h��C����:�?�����������忭,������}�c��t�������������oLJ��Ǟ��6O��Z����������qژ���[�d���?v�����jl�oۇ��#gcl��,�����an������]����#�����O_�?�c��` ��Gć���!���������F��?���,����c��� ��G���|,���G1�����v�10v������>�r�:�~����r�m���3���8ظ:�c��㟙�E�@�/��f��h��Z2�Ǭx���l����'�G�?�����?�q|�r�Z��Y��+����p|$q���������:�,�����-.�N���������c�G�?��cO�xgS{�����?�C��?������]=�������#���_ +���5uu����o㏷�����G�@�)�Ҽ�)_�uzV�K-v��/q�^V��+�5��iHS3���$��u�*���p8*�.��)F��-�w@WH��ewh��͈.=_@��NC �q��n� r�&����B1���%ނ~��&������IAKKf@�pq��!�s_��C��4M��E��>E� C9�2x������g�ۭ��=��Ӷ��D4!?)��I=�4*�lĊb��}��k���<.��=zGp�+�O��>��a�{�~���6Fo���to��c~�s�R=[O����H�kD���d���iɯ �֝� +Dy��9��S;"j��9@hƳmI;�����mL�L�N�Q��r��u�߃�>��EV�fu[P��A�_��xG�@�S3� ���.)���M���E%��7�h%5�J�d�^�?:� iRb��V�?�.�.��v6a�w7h3%���JK6ー�E:�5"�~�B��A��TT~%��|���A\e�#z�-�Ϟ�<�ë_��MV�2��D����s����~��6n���iA�y��ȸo��4� ����B�sؓ���� Jۄ�4�z��۴��]#E�̥58}f����R(Dwk�U ��� +*���P!QׯIT�܂("%'�h���,�xK�Q�'�u��U8��%�*��J�5�P�r1�Q9Rl�zߛ�,J�i���$0���ͮ�� +R�n)����*�O� ƧK8�?� +`?[�h43)�[�OJ��|aܮ���g�D9��1���]�>�0b����2?��+�n5���$o�ēÍ\Xẋ��2����-�Ehĥ���)!���j�� g�ͽL���� ��z�|bu�1���,+�����-I�u�ӒS}9��}���?�`L)?oH�Z���6` N �� +�b�>����ܓ� +Q'Hq�kҒM�8<��먐�e;��?��'l��9��hC7��٫=�T9�Z&c�8��S�}1�m��vf)��j���~��'���O�]�1�)�F.Ni �RR��#ݏ$R��; bU�h0\��}ƒWZ�U���K{Z�d���Q����I����d�3�`�O���Bȇe]����ߌ� �YD����Z��,���>*�?���*s��ܴ�6', ����K�!�Q��o��u�4TݝR�GN��N�v&� �eV�βڱ|圔�Q�eG�fE�6*+�̮@��ΆG'�B�j���m�v�����)��tX8B6�^�����2����rq8 �t�;o��«X��h]��u#� M.Kh�ɫ㗰�Ć���5�P2`�O꿾||:n.s_��Ya����ya*=*J6��7=��=c7�ɸ7��ش ��(5oP�w��SC�!H/RsO��:��6[Tvޙ��of2a*z8�����& >��I'��]��lI#g�&t���y>S�$3�L;v=�b��H#��eX�Xf +����dΘ�9w����h���$��i��f���ن���l��� �|��z�Pғ���B��㤗ď��N �?!�����Sd���?�_��cc4��Eu�`3�g�F�^�zoj�upq�%�~�e$�(�P��ދ����kqP0�������Dlr���1�OLRk $t���-Ûwreg���wA^�G��MA�o/�<���ʷ佼��]�F�5�rˬ�o��Q�:N!�����L����'�CD����/k��f��~��k1T]<*�2���L��@-��>��gA�~��g�8t�Qk�[=#X�BtV������wO�����x��cr���T���>�F��� +��5���IY��d68��/�Ř"+�� �,I���x5P_��'��{v-c��*�e�3�3�W=-̸���~�x��=�`�"Ǣf���Q�H;�i�20���� ��0Z�>f�9)v�+%�l�8�DZN��b�EJX5��7��#��L�C�W�ꆍ���~G%]xx�S|� +1JR��O��u1��={ܿuV��O��;<Еl�=.�ҿF"�g4��p��l�\�<���a���2Q� +� 1qhq�X�g�Z��zW��>�����l���}���Ӂ�]�I!����G�DpPX�gx��"�At���2�V�� ��T���Q���$#4���eU���Сߥ�1g���^����������U��@�x�4N��L@Mᔎt��ub1]|�K l���n��D���|�~�[��aׂN<���.�49l���k*.���� +���/$�m�I�׆�]ǯ�_����7=��h^������ �}�>� !�Z�#o�%D�`7�9Qdd���%�Mn�[�9�M�c�g���KA'�jC�_�)%x�ru�#�o��T��O4V�����ZT@����BW9�&��4I���̏�#��w�F� �!Jdgy�g�R�ܜ��CcV��oO'��U�b%`��P��yE�s��x]j�<�Z��ǹ��cH���(�J�֫��j�����'�uT��7��'(b�'����L�z��Z� +L���v���VT�$h�q�L�5�#�CI �)�&��������a�*D=tl��H�u��H���w܂�] +���F��s��J�9C.�{%�����s���������ݫ�ҝt��{ +�,�����vn�>�Z���vڪ�����C�iR�:�=eP��䌚��5��10 +Ϋ+���|l��}�xܢ ��6<MDƪK�����3pY�x�4�8'}Sr���}�1�G������U�n��;�O��b_ +��'A�4��X���*�p"lY���q���! p�S�tD���S�B�Q����M.�"�߇ +���}Xw�'�Kxb��n�Z���c��2&�M���\ϳ�M�x����jJ��ya) +��FJ���RRj�p����ڦ�S�F1����=��AM�����f��bTLKR|��eL���ۻd�i����ؗ��ZS�0�yڙC�_r�B��*�M=���� +Q$~F���"���3�@w��8�6nt2�^J\}����uODۙ�Ơic�X�6� "�vx�/�6I���U)��bs�S�0�Ȇ 6�a����0��@���\�8W�����ף�=%$�D�����騶ˢ$@i&G���m����Y��_<Iw���������́v������j������İ�� X��J��䉋܈f�{R��cB���wb����0���~׃[?���6�a��g����C\�nCG�]�c?��H �r������#ʧ�XO��6�:�^3a��lh�\��>n>ҁ�PYu� _��6�@b��]s5�hpk�����O���q�o���k�R� |���o_D�f��&��蹙N' ,�8�����z���4�@�%���Ƹ�.e��/Ӈ<m����}�Q{�;/֬s/zt�\��oB�,�0�H��� ����`\��?7�#HY�@n��kUXgv/3�i�PMҨ�����8b"�f���4S��R_ +����*�[�w/��H��@�����M�����A���K�*|�Bo*h�$P~���9az1B�Z��.ڥ�EsKi����@g3���2a�ţD<��tAp膤՛ɡ͕���]��(�N�����^dn����-C�L�Ј�!&+�m�����୲4�R[��d���e���d:Vr^�y��W4zӓ�n��B����$���M�)J��Ug"�A�)k��~�9m��8ؓ�s�����|I۱��/)����c�ww^qv���:���sc��ؠ�⼙�pԂ�H�4��W����%R(]��,']0�y��e�x�o.��S�N�{��5i)�m +�8��թ�}~������ +�u�VCb��'��p�k%��pVݑ� 1��:p�강�A�$��䓳cq��A��IW�h�ֽ�Wlso{�]_+yPO���;"H�D:��?v�.��@��)f$�O�)��X-�����ݟ��;X�I��3���i�����d������� +t=*g��@����⒅����E"�~w�C�-��ʼnې�yo�b��B�H��C�8�A�_�-��ET��c,�f0 �!��{�w1 �l#���!�G�B%�F_)�[k�y�����S������m������@;vЅ�ɃR���\D��r4��m�"l����A[�bB�|K�Ն��"���1�i�1��p'�u"�n;e�W˫ښk�����l�ġt�����ӹI��yaj�?;�� +���j)I�QdQ1��_���@�u�c�~��]�.ر`��w���|_� +�W�6���eB�>�r�8\��q����*��,Z?#�I�ҡ��3)�^�?��O�Lϴ�&v��D��r�U�V|�Br[I�������F�ķ}�5<���{u��*�zƝ|�Y��q�����A���͇\�����E)�A���}�8:�$��������S[�Ğ/r���X��L�SwN�Z5,�]�fԘt�p�՟���EΈ"�Zԟ�{O5��A�YB+���zQ�bg�Ե����G� bL�I�o~H/ +RI/<Z8O?�� �S�/���AYIM��LS�J��������bʀx~�P���c��h�+��rE�7?�ޭ�16%Ǻ�/�V6�jx*$E[e�v~kuv��v�lw��1[>u���Yg���߭�jL���w ��L���e�1O�0�������~�յU�?���L'���ԇٍ��G�k�0�u� +ܿ�V!��˝E�Ԛ�h�J@B� +K�^-��͕qw�����=���v`��]l5����j�����y�J>����r�Z��*�2�I���PoNZ�Ĕ�V�|����ɚQo %E��)`�y�s֟fz�q�ρ�� +�S|��Ys�!o��Q��e����"O���˹���b�*'��.�B�����+�D���h���֖936�k��ԝK��H�Q���w�.u�: 0$�h6:X)�BU�R�&�R���=g#�o��e9]+�Q���+G>���Ń�dO��a�6Yu2�ޤ�1u�`8��ɐ���v��fi#[P��3�f��_���h����)|���ϻu;^��PW[ +�M_�B�L�V +��������u������ٌB$��� +er����M�7�A���W��A7��O}e�T)c����Z. +�7Q�e��+"�PP�0�7�wL�a&$?8���!�e�}6ا����2���J͗�k:h�iU�6����g��A��iD��d��K4�7˽���\�ȯ��I!��S`傴-�5�gTk�����L�=疮��Ö�!M��yh��s/��;�����SG�QW�d7�����Pvv�#�#�.ɨ���5&�K2r��}<�(9��vI֛�}��9�"�;�c$�!d���kv�>�)����C���?��_JC�����8.���C�P�SH6��&��r[3��Lж�۫�!j��ϋm(�D�z�5���C����������\X�E�9�4���CE��a�u�H�h*���k�FG~t!��x���N����n~�\G�����i�����a����i��@����9�&�ê�p�������/6F��H8�_O��X��$n�Kŝ6�w��B�M�".�VO_�g|Y:Nӭ�01n�ҹk���D.6�Su�jތ�Ƒ�q�]�IC����w���20�,�����ő�J��\�y��8�UUO��5��>�#-x�s���]���� PҌ�r{C�/n�����Z���Yf^ؑ~2�A�� 2�]nF�o���"�(H�k�����V��uG�d�D��� .v��8�Sm�,VK��*����t(�.f��N�!�*^���{��.ZN��f�5cp09�]����#f-g�:wؙ�.HU��Ԙ1���Atx5ˊ�t��I�j8 �]"C,%0�Z���8�Y�̅�iD��iN%aB�P=vz�p�7�b=���>�MFﱆ�83r�b��㜿�F_gb�u��D|��\iu|�)X�'BF��I���U�L`y�%�/�/�ff �*h� +��CiJ�H���j �L�~��T��k�̬�{� +o]=�LF�@�M��tf&{h���3�U��f`�_��9&B ����I-��rx�>��{,?{�ї*=kO%�Pܨ�D&Q7d���.�D-��ZnXt8�('uo�����`��@bԺg�����<����|���^�[�}�����$;J �t}A1�P.����R�G������m�=9������s����m����rH�-������,�=����Jm{?8l�}S�k��bv�x/ի�������=���Y?�F#���9��S[���Q�$c���\�VM���D�[������m�L)�q�O�>�D$cEW�}¨Վ�ݜ�����>�'��\�R���qzBIXPEs��f��0�;�,ò�u��Β{�L�َ�c��L�8>�ń�u�˄<�$�,�yC5�s=�<���C�4����<��0�8Gz +�&�A:�Y�P%Պ�}b�ӝ^�x�{��"���ԫ�6�X��˚ |N�TB�P�������hbSư���;+&�H��ƕ +4C4^�JqQ +4״�ۓ~�����t�G���T c/$t�a�4���A��K���)��ݪ���W�p�Y8pԊ ʢp�.%]�ֽu��6{Ma�1��<:�g�T��<+R���Pɿ��0s2aDZ�}�ّ�8-�Δ�D�9eO�g��yŰ7B.p��3?Ge�O6X��=���D�u8+�E�ݤ]Pߣ��)�6Cղ�eQ�Y�;���9�8���%i�Zמ +�D�*��]5 ��I�'5ȻH��Ъ��e}tp�5&����i0�6�� ���LD����f���KD�p�O&�����,=���Z����^Xw�]�oF����\��w]���C70]�O����\fDK�#`茔p�-L/�-;�*�N�k_'?gza���X�Qs����d��֤Ğ�6J�(g5u����� +6�j��_�U��6V�T؝E6�)��"5c�^i�֝.�V)��3t�?Oؽ ���a:����[1έ��_�&��lKg�Ê�Kj+��-�%gD��gӎdc��И<&�O���a+���(��3qo�hP�kyo�R���hL���w�m/����Ѣ�E/�f�J�CȨ�E������.D���0c�I���FFF�l&�"�6Xf�pe�_�.�;<4�̉k���j��9��v���ܑ�h{��ahT�%��K��S�4~.�̖��-f�4��Y�on� �@�B��[�n����q�8�����#����h�AJw�٢[J���U��NX�<�g�D|TÝ��B�]G#������b�0��C{ +�������`�ˀ ��_��\[ ���kr��bqQ�ca#�Bqe�ӹ���T�4��-UV<ٸT:�����sP�Ӆ�f�[2�@v�\cY%��~��G��1K�.ǵ���S���$,R�*�.�iE�&2p���5CWHu)�杏��@�#�4Ǐ�$�����`���p<9���"4�IX)��'�30�71�|Sx��]l��p&R�p��%ш�Qcm1m�5�5����t�h�YH�>�H�ia�\�p��B�����!��&���V�W��&���r�,�>E(A���Bl�j�L����m7��W�5�8�/��ե%TsFu9�K7\��^[���jHȟ1/��G�BHl��@�y�!�E���sܘr���u�\��y��e���;���G{`8BN5��B؟��s�<�9c�B�c�g,�����m1��_zUw`�Z1#�������I�Ӟ}TB��a��z��"���~'.�.��G�e%L��ì{��,���ł'�e�~�%�&��V�گL��;qy���n�x����؈G>�����"����$�!�?�������"#�w��5Rc���A���vG� o���z��>OL����{��_%˘|J�}7$L�[em����&6X����@*>X:�/QNX?�|�؎�ؗ�t�- +�P����AH0��N$���e ��k�xp�+�(����[x�a�(nUn=p2YCw����i�X�����kN��Cl�A�\R?��@�k�ܶDj\y�:�nU���Y����%��5�wO�g�Ϻ+'�� ���8{=l�S����0�$"�|��G��W��S�W��g�/��m����gQ1�-�\�#���t�9�-Խ��˚yd9sy��zW'�G��=D[�+8��q�T;��F�Ut�`��(9���N�(gn��i�(������~�״v��˒jG���j����<r13JQ�5M�:+]�jT�u`���x�?�;˦�+̙�u�܍�|�?T%��S�>����=kq�-�u1@˰������ +��MTyM�&��.�� +��-_R��*Ճ�by���B º=»�h�[�V��I�XK�k�e-̘�]���x����ZW���!���.�=�/�7�Hn�Y��l��L����⽗y�*<� +U��0��9Y)�����J�Q9_��a�#���B�m5��!4����8��L\�sc�w����78�����cS��nu�Am�7��M�������,�[s��jH.5��>AU�o,���s�ҁ�]����&���;=��t����X���d)qEOj��8��Ņ%WK=>?z�I,q�x�xx����_d�D)���qi9�=^m�0�1x�e��JdËt�Ӑ/���뛥3qʟ����q+������aO��,�K��2�����pR�翼={WԂ��8!���~&-6��h���Kt ?������t�'�*��16�Q���;�Z +�Wȗ�9'��Ú�n������RF���Ls��O�$� bo�!���(�QOpQ�H��N�HS&�K����e*�)�).���,��:�r�L��\�x4�p�&��dF-D�{/�����k'D�a�E�����C�J�͕c�b��&�N�� �op�X��N�pq�N��f�0��sD�~|�͑h�ʸ0{�6uN�2?��v�7|뙏�F��߷W ���^;Y�Xq��`��#�@�2c���Ы[��oZ�+F� +�{��=h��UM��C ���287x�Df�K��̪�E+ �V��z�bϧNi��9Z��z�eh)�1�={L����"V��9nOF����dZ&�x���K���٨�ugp�1�(ּ(�r)�xC�H��}{n����1a嚍 �B2,_���hX??qrk3[��{;N �#�a�{]| Sx �xB�(\}Jĥ����\�W� �*�f�����۱���ȅaCm�+����E��#�B�����"-�t�:��֥a ���ښ� ~؊>��3�W��\y1d�}�j�~X�_��6��o\^]�y�#�%���@�t\'�-��0ȟI�H�`T��|�Y:"3N��7!D�=h¨���!V�NL!����zeB���A��d����O�5h;�0����yòw�$�˲���b2$_��L!�=������HW�#Wl����= +#̈�O J���0(*�+�?B8�#c7� �7-B%U�$�䞍fbh����;ͩd^ߣ��WW6*ҒR��������U���V-��zU�Z>�#Hl7����|(���G�\`���{x��EN�S�O���m�#j���m|e{E`��,*����׳p�FN���"F]�o'��h[���Z��'e� 4��շ�wO�I[�OEf3�u{�q�� �0-E-"K����uZ�HkzH�� HLxLX#qB�4�i���V���D�r����W��������&���C ��9�uQ�S���mAV1n�V+5ݩs�P��Q1��d�A��X�Yp�t]_����D;o������TD�"� +[�o���ե |[=C���A��(�$ +6�ѵ��J���>����V���s��5tDsm���p}w��NF5�=��J�z5����q���7���s�Y%��X2����n�L�����Y6.�)zj3v�������r�:�M:=�&KL�{�R�PH��B�}���z�R��B�$��hk*"�;�%Tw�c�S�]�e1���%M�6}��0�ɼȠ���fU�PIV~X�Z-˿)�O8�2�r\�PԨ1iֈ j� D���w��F +�k�ӄ���-|;���-�s��d +x����Vv�u���_��H�N ��학�N���>��Z��^�"C��(�y��D:�֥�� +)�|2J�5�>+DS�8A���1�v71�p�P�ۖ;�5���V�� zQ�� +DSHĚs:�4�Q�������"kx2� �u� *����z��!6{�V,q{¿mb>Mu������t�� ���,��h�ΉwN);X��1�-�<Sd�����ޖ�7��NǶ,T$R�S���6$c�ǔE����oԁ��������+0q�t�[V��7Cs�f"��Oj��i��#��K��������5��rg�'<L��2��SK�it�)Gs��$�kIJˎ�~IWG�4r����e��t����w�ګ����GB���L���F����O��;���K���[J� +�xļXF���D6&(:�����E��~D.k���c\e7�>��1ˆ���Ur�1����P��ѲRi� tِ9|��2����\骬���/>k��A��?!>�����Ug��M��1�4��3��Z8 ޤ�30���E߅���[�|:�%���o6�?\�Ҭ=##{0r�e#_�� ֈ�z�گ�g~Q�=���'�%A�:�p�'Y�EPW��+�j �igWa��0�r���^���:6��"u�k��ܩLe��b�0�ߙ��ys�L�� ����ŝu�> ����f��K�t�볳�T��s�˩��"H��m>�ё�j�/)0��1�^ +?�S��$����D��QR?�g913=go����M �4�1%�&�+,3����[�f������R�bƘ�=��F�~��8e�q�|P��<�p +��$� bN�77)W'x����l�#� +{u�Qu�ܰ���U���;�Wż£��8���f{BЃd�������;����'S?��(W�Է�����!a�d+*S�>�U�E>��j_��{P�7ڬ7��WeQ�m{�H�>�)��=��=<)s��c�(��{?\�<���鏬�lW�n���G���/8���,6H�VbrO�!"%�+ᵙxa��S�i����i������(y���� 1��k��b5?�Yf;���������q^�V���X4d�/^�C���^��=� +�UI�X\c��Aq���%��&�������VXX��%� БMk�S��8g����k��o��kt�� +���c�����x�﨟Sβ�!�i�� +����roܚ|{�4��b���*�O�M��:�����'�bbKoL�Ʈ�6��u�q���Yx�\���ҝ�&�S����\!�7�蟦�<�r�uB1�����[l�`}D=�an�2z������4�v��J�G�����O;)�m�m�NS_���T��cB|��l�bX�j@���D_j����D?�O�V�I��)�H#.Q�8�^l�,{� p��G;J���ғ��ɼc�vp��*c�2�W�`RNl_QV^�R���rl�I�����qA���ՠF�P�t�����O?��9��W '!�n�C}l(e�ՈP�0n�e0B�o�c�ZS��[9ۖ?�^���}��k?�T�Fq.��\�|��=�Mٙ�V�8Hp��7mg�Bu�Xy�ZK�r̩��vJ�$%�ϡ����w'�l�TXc*�& ����K�)��!Rإw2�]S�F�Ƀ���W��-FC��gɢ��*@��2���5��֒����2��9��b�g�AHo(ѩ�ӕ�捐�����q�N�F5{��Dž�Z@����b���)tt���)�¨k�P��0�h� x��A���V~�P"8�v�BV�R>c���*ڷQl��<��tz^��M�[�e��&P`~Xr��l+�4��}�d�~���Z�]��@ž-4 ��^�Xt��+�\ j����Ӝ�i�+�{7�,�}���Q{-����ط��N��&r8�v���/C� +Q2��b�Z0��N����>���&V���bt#�b�E�A� �UG?�:�m�kk�S�a���8�2O��0w.M������~L����7x�o'I��2v@"}���%�����`l%��<};�\�~2o�GC�� w��� ~ǽ���F[�}�X�Tq�S�G�L�M9��5�6|�\�k�[�We�*P� +����P^���LV������6M�ٙS��0���ԓ2C`S��ѕ7cr�p)P^)!^̊Bl��a㷷��]��A��:ǾRP �g>�RFJ����䘔۲�97�ހ0Al�HqE�ݒG�I�.Q#rΧ;�� (F����� +Z�+��o�� .+O�F= O�0&Bb*��䷔A3�#����� `J�v����v�v�e� +�y�U�T7��?�� ����z������b~G�� �G��g�[�!x��v��#���-�DP�,���$���2���a|f/I#67Vѝ�%{H�bC_�4�r?lN��8��0߰w u�vG����.��ߖ.ό�-,q���u׀~�BnS��g4�����r�/�럹�Ć���Ð�)��_�ͼ�+>�m�'�5���N���|�hЙF�n+�a�YeL�UFS�3����$l8�"�M��rϑQ�`�5�" +GC)���O4����3�e�D�#;��U��{z��T�zF�8�0�F�"I/�YE�#�Z�s;��� O NY��:��X��e�~���7�s��;D�Ƃ�������q$*�j�J>t��f� ��z�h�S�&����c�a��d�+�J���be�%��<�Q!xc�m�؛س�l�m���M�A��C!�D�w�u1���`���ny-�f7`���-������VSH���d��D!��� U�u�\�t�fc�1q!�*� �)�eI6��}ƪ���Rk +R���td{W���m�n�k�jk�MdF]�E�~q�9�@}�V� +��S�o���cM�ov�/��ʹh�\z��[<��!�մ�|���Ttޜl�a��'�i10q�K̈�2�~2A�*نMZ��[���.L�e飯�l��_@�?��Y�d�TN�D��V�ZQ�J�z8��>{%��-�"\֏�F���,��>-���s���S`���$�'V9[F4/�)v��mKa��Z�v��9����M�v.r��߉�`�����ȫ1�n��/c���ᖩ�@oX�I�Ĕ"&��) +I�)pl��|>����3�@�BԬ�v<�g��+�(�Mt�Rˁ�C����:L�����b�A���l�x>��+�!/���(�}�Z��5�c�'�v��o�5M�U+���ٛ*ϯs�Ñ�vP�p +���?�;�A:y;j'�r!Gqڡ6�EE���/���s{Y*>O��hc���ۍ�-&#]:��s��&,T�J?ߢ ��ƫ���~���@# + s���;�*j�4NJ^���?V@��/K�1���@�����˄���m6�(����*��a�Nc +��`mR���W ����B�,�!�Eٜ]A��'�_y�j��7,�\/>2Jj{4l��R�9һ���j�/��[��\�%�c�a)nk���M��`%�p�-?&M�$lT�!'-`<:RW���X���٭snZj/@�t��J_�["�nb�t]H!�b�r�6�*��;�w$tv>�X�6�q�mȯ�2f�^�% +%*���o ��!@��$��#M��q�������R t���9&��|�ҹ2� +�`��o��!l� Bx�c�� +l�i�� ��p�r��H���sno�C��z�"���z�QX�6BO]5�o�O�K:U�T�9�`���6ST�����[b���`y��MI��L���f��HYt���YE�$W\�|(��O��O�6�8Q�� Z��Y�����꘥����,��H@k����hl芎2�1�]4qo��g��{{cH�چ�,�����n��A_��~�v�I#��)��+kũ�E�g��*�8J�}�C���9����wc��m�d�,��J�Jf���d�&�r�z��r�Θ�/�Z-�l�Q�\wg��v �Y4/���U��� ����]B|>��J0֚�C���@~�cs�x7��O���.e��˵b�@����R��ݲ�VN.�=\��z{L��2��O�����g'�gڝ�a*Zӹ���w +ܻfGeZ��l����b�'j�ģ��ߟ=�nz��ӿ@J�ھ���Oa�Ħ��V��UB�H��˚���ld�rcz��+ǷEo�#��#�0xR��F�Bz�������5�nP��A~�خb���k�>L���h'�m3� �L���^Z�p,Q�>��2|j�5)M�&_E�L��;]���0�,� +)�v���}��^�ٗ1>3z8j��MA�Q�(?Z���)���ZT�Hğ���I7�Φa����/u�$Ɲr b��t��es���''��d/�@>VB��D��R�Jz�y!�'T8꾵��C���i +չUZ�ު i#��^���量h����~��A�Zu�]G��,R���!dFpk9�|_EhP�H�n��/o*��"-w�����4�̫��^{N�"H�(g +7n�Y���F���DXJ�zVD�+�t���f@�4��o�i"��~���&9�H���s�l =�7�"u� �1�@�3�A�,W���`s��N�2Z��ʕY0>4����ɾJPV(��Κ�H�H�(�t�̼a"�ଫvO-,�v���'�d9X{9ݙB�e"�ҵ�[5惰�c��)��������Z��F���c�I췫���Q���=�b+��T��<���_�n$%{b��x�uF���g.b� +MC�{��hP\�R\r��jDsZ�U�*���5y?�*7���ؾ�m�h����-hp��1�^tIy8����Ö�H��+��}�����j������w�P��.���t�o�Ŭڗ �� ��^��^�^1�n���M�{�.@��<'8�ދ�it]�H����Ճk���y��[(�q�:6�,��o +�N���ey��F�'��yLa:����фF�u��"��B�e�[�{M=�� �� �e��L�������K�u��jT��L�����7�\�`=H��#N�u�Uy̻ܯ�qm�(�AM=���Ý"f��h:�vGHx�c詤,�����`K!�����@��̪�m1À$˵���4G g�*4�7eI����L�B8W��e�~�Ϙ���75 ��@�m۶��m۶m۶m۶m�����}�?!]�I�C�{�_NRC�aO�y���S��Zȵ�a�3x=��G�"�H�8�r��_z����j�`Nh�P��qz���9�6����!��Tl,��+�*�����l~����a��Q��x��s|-K1����x�"��~$�u��/k�����4`XQ��@J���7�����b���^=��:��>)��|A̢�xP%3��<s���2��3�R���lGp +3�g�5�^-�\�̴ߧ�T�Z ���BLj'7,�G�y�~�9ahR�,���?�8mNE�ٳ���7��%~�t��S ���{�a<=�8Ÿ�T���C7�|�v��`��a����� +�:���n �w��)����1�z��Ð�}�E�A���H��/B_��5U"S�Θ�����!sN*�0���:A����o��Ux+�Lb��������a�:T��W7� �[13a�1�*J����N�Q�'�����Y���;�(H��?%�ڧ�;oO�6�� +E^�EX��O+ұ:]N>N���Y����^1��*]���G!��Ҹm>���?H�i�� �O�����A�6+jճ������v�������#y1J^���uA��q���q�X��ʬz(x����&?2�H��H ��ZdF�\^��HB���Y�_�/20��[�v�����"�c�Lh;���g՟���U���dk�Vp�J �{t�G�E��d���G����גW���l.�Ǭ�9ڧ'r��KK�;_��Q��52z���B��}�V��1p����-FR�? �:�6ٖ�Đ��<���t���0�b��$�R�e��m��R�2�� ��)���'��/bAO�����ib�/I�ϒ�7N�mT�X[k��=�3幏<�E��B!W�����#MN(JYͤ)�����m��c��&(,Pb:.�q.g,;�&���i�3��&/��2 �α��爇F��v6Fku�k�Rkh 6~"��!���z"̅���x.�[;�f���g�.���3Q�m�����W��Ih��o)`�k�~���;=,��-!чo?:l����U����`�5w�"EZ�F'�ͫK��i��$�DŽ����K��p��c�n��3ɠ����@] ����t{a�TJ�,�HY,$1D8�s�G�/+$���gi6�ˀ��Ѽ�y\{�_����"�V�r����;L�m�i�?�Esp�o�������Ţ�>I`����Y�#�.�u'�\b,'�2�J�(�G�}�; R��2��2��JM�L߶�r!�>�.8a#u|�9=��ȺC�u��x��o����${��j �9<|��C�c&�o�������vF<^�������x���z�YU���b$q�$5e��ED������)z�-; +;^s��&�C���ĭt���W6���,�s�{�Y�Wj��w.j �N0��.�ƽ� +g�\=*UF�����-!Y��WU>��4�^b�9s��I9�*`ϧ{�J�w�P�4����e˛`^qW��5�Ŀ�OT����o4m%�偽�c~��@�9x� q�v�`�2�VZ�3�6���J�@z8]��Ń�8,�qWk�P���b�C�����h�ʅF��$��RVq���Ajƅv� {yhq8?�%�;�}#z�F��SX�a��%��A�ӿ�8h��2���x��4�q!�ʆ\�p;[+�|�^��I-��s�t��n�̔�m��:@0�$�� +έl�l�lFM.+�V���6�R�.ſ"8�S�bT���W�N9J���(W42�DAi[�S�f&������������Ë�~��S)��oex�(Y�UE�h��ŮL�4�n���I2�;X��N�-~��dT�_�R9��8�(�8 �$w!P<S�)�'����������?��6kC�ofJ�H*p L��h��ݙ�χDm��Q�͜ȷ48� ����W�Je"G<j����:y"��� +��B������(��;�=N#8@��q#8����͕�R�g�?&�5g�!«�3 �c��pf�y�M ��� +�Sʹi�-��a5b����砶6uɹ����rP^�ם���\�~SW>�r�R�q��C2��g��7J��'E��B(i�rw���ҝ��z�= ���Em:]����+�� Q^�%��� ��4���e�.}\��MK� �/!��̝�'p�����l:�l���}'� +��j�#�rPMQ �[Y2Y�W�G����Y$�h�o�ӟ����y�QX�+tSk��_V�>�X���#����%Q�5����N�0!,�X�8�2�(�:� 2N��R���,�7���D�Tx6���P80��=�Ĥn�����ģ���%R��*JJW�Mq��E�5&��A��T</�\�0Q���<v�<����Wa��jn��R���&=���_G�����?�;�+��;>�} p�1J�!�#˧]8�BQ��R�`�& +�X�FX��� r�m����ɿ0��:��d�H�s]��G��r�.�E��K�c;F��rPv�wh�����j:;�#��{��Ǐu���&,���`���1�K�o��yKlp:�=���g]P�"qyg� +�� +ނ�_� +B���ցs�{^�,[�n�|�47(^\V7�O����D%�iy��@ތ� wT*?�"��J�mG����7v$�k��ޖC�71����h�a��~<�t ������ +��sL���35��=ILl��uR�Xt�<7[~mn��&G1 ���f�&9����K@ǀ�R�.)l�����$>�&qXS�SR�7�jf�%��T��e*�k��_����p\��@���.�Ɣ_���^_`7e������I�y�Lz�N�b╛;��\?�2������&74kX&#�z����<�LU~(!ð9�,g��7��xzKm͜2}Ib��O�����:��G,]���!sxn�S:�A"�+�Կ�d�B��e�3 +|�8�a�B��l7 =w���*��[#��5"��)���_���І�A9uܞ� +�ɠoh�l9'�N��/P���H[F���L^��/���@��0|�(��{������vr^�Hc����tb 17�����3&��a��Ҡ�-6uF�ݦ��1���W"w< �����W��H;%6�Yr40Ľ�]�_و�7�E��@g��DKU�(���˹X��[�&IW`=�!�n�d�(�F9��iu���3n���e���X�8����l�g�;c0��i�r��a�~D F"\<�^Vg�y#(��{�60oR=)nq�4����D��r-�f��8�C��=�K�P���Oq�w��a ����Ȕ6�wf�~}�&�;�u�`��H�~nv`c� +a�R��w|��&��G�k��YV�C�S�I��j�d,�f۩�x� _\�ެw,�`1i,��:A�w��>?WTĒ����<�g9�@ W�H�ڇ�1ߧ��� c�݆ƬiNڱ:������N�1�zAj6����<�5x�wU����VŖ�W��N:�WNj`[��(B.���UE*���p���}��� U���daI��)z�j�^�L�-�I��b�ǟ +�������d��>��R%*D���Z���;��k�3N+���! ��1�]�h@];gn�,��oU�ॲ8Zo�> +U��T +<�Bx����E���˿�=2b�&')��� ݞ����9�ų���3�h;�d����w�gc!tL��aD�E,m˷�h��t�&-فg�U+�A#q~���=�q�(�9�P "�X��k�3�xU�# q8�/oU���[rj0gX���f�:�qy?~Y �ܾ˽���M�����[��eg����t�T~2�e��8}�z �����Gh�ՙ�����B#�J����S����b^{�hF��(5eo��&M`�Yn.�R���)04}�ۏ�;f�4 +���}[�yjr�����R�f@6�G̕s!!�5[p�!ە��k_ w��fD��)��@���(;��@k�즌$����Nr���J�ྫ�v�0lj��Cq_+TR6^�H��؊t�n���L�gӠ�D��՚Շ����d�Ҥ��p��3�«�K&7߲���CӞ�Y\JW��q���w�j|���D�O+Z�I�XYD `6xL�ϑ��z�?Ӟ$� 堾rsIR>a�}���b�O��3����yϯ � +F����M���?O..���:�M #�;��� +��� j�8�lվß�^�瑆h�Y/o��*}��Z6��ǐ~��р���:Z�n��_d +��ח�ƴ�Q�z��E-���Y�87;ϹǮc�TAf%x�+V|+��sRJ�DŽ7��F�>6���Bq̸��>�O�B��,��qTE|�����d�P�v��WxR� :�(�����nl=��E:���.�� ���έ��� u&h�c���o�7D�/v7���t����2x3JMn��b�n��g0Όƨ����p���'5�sy���:��'���G��.h5�����D̓h28q�aX��^�&��ٮ ��� �o�vں&ǒY�z�t�l������zw�fI�}�Qc��䜥���ú8>SӨR:Y����s��7~�YR�$I �v�8koÃQ ��,�(nk$��U���C5�������vO:˩B{ bW�߽�D�����ٹ*�nQ&���.4�ݿ1��8��x�rnrFEb���h�M���asot��#�_v�����=��Et�6qp�6���;}�p��L��H��l���NH�ig7���n��8��S�� +C)��P�0y_���K+".�<c�k �U��y�v +��`��7&��:���`�Mp��@�솕��4M���u����ydFDn�ۆY��d�~���/ɱٿ5�N�C�?��}��`��&�>�H�G�z�V]Va�i�Y��Ȃ�hh�Z>��{A���Y�+��dҞ�7CL����Ur�lО���m�X9�14qDŽL��BڗOօ� "L�v��O�XФ�%K~Qj qsD�j����4�`A�&�t[kr2�9�Irê�ɯ���9�;6�"Y���O���)#�p�[��/*���P�q�-%�P�,�����f#σ�<80�a�K�v�+�x� +ӑzUK1��B�k|B����z#m�Q��9t�=6�X%�&�+<� �8C�JN]�C����;�f%�/������t��%f�5�T�n$w�@�K��S�~< ����}e�cw�R`��z��]�_�p��a9#6��4��[�Fs�\�0�]!P,��Wmͭy�F��h�����jMJl�+��3,�����d�|�B�Ǭ'��ѓ��R�ӫ:���$ +{>~~Rl�)���MJwA�rck�@���h +\�<��3/7N�<�$*rU�C+�+jg�|��� ౿��Q�ls��kQ9)D,��K�9_�R��Z�9�wML�WY�Mz���؝�$�y��P�sm8�2��eW�pm�<굓�%��7�x��������r����gļ_��C�����܈���+���'�Do8�+Q��� +*��:ۤp,r���vR@�n*ӛ�����s%XG}����M���$�0�U��4�a�/@t���_G�����[�v#u�c7o^C/Ȫ�\ �+\��i�X�{q �v�P��c0㓱*��Qs��|9�?�&8sh�U��J�J���A*kH�[KX�Ċ5Kf��@�_ �;*��}������qkfW��������T��9q��u��ӜZ6��ҁ�K#�uv}d�+��M���i#�ذb(e����m��L�h�y&h��g��U����M���s;���4#|(<�^Ȑ�W���O�������`�[��M�=�H����BQo�'��9}���?8knI\�,-5oT���3g"��j��(\�63���` +R�t�P=�e���-������K�w�C-F�3�_`쨥���'(�(���l#�%)!�0d��Ń�7����V�䀴�˲ +��.��� +��������N�1�h� KX��P�0�g���"G�۰����>3"�h�,���r��<E�}M��31#1��x��7|�Bz�7+E�R1�g/��f�\� .�|��'�|��Ӕ��i����C-�c�E�C�ϣ��M�&���;e�Iڨ�#3���?@ ��������n�)c���3�;_�^�:�A���x0�B��"����V�� ҴH7s��J����U߁�)�.��Xp����]� x4#f� ;��j����?4ت�������q �y�d�, 6z�1���0�y��#���)����b��/_�m���(<m�`y��o\���E��g��[�y���t��u�Ƃ�N����-����Ą_����X a�� ��9�g&���6�2~X��6���Dhy�����r�*�+q�u���&�)��!�.2�Ocۧ]�ʦ�!�� �S�O��Kˡ!Y�7,V�]"~�sh���J�dg�,fu�iҠXN��Gz��O��jM1�I�`e%�������R]~d(������M���-�J�n!n�#_�����<�ps~��I�d���P�#������0=j��D�������� J���^�ؒx}�������\�6��C�GT�/)��Z֣��b61���kq�[�������Y������bwRb�,��o�Q�=2�6�B� cq9��*�l��-�D�ܵ���¿�� +�@A�O���{q��xC��)I��Ţ.�yq��g=���$b:�`��ܤ�M��c�����>�R}�D��-h��#8�����sߏE�S�`���8�����Q��[Q����l�ٛ�EL#]CXŠ����M-$.���#_s�yKh�Ǐ�BfDYg�=I#�LR7�-�����>WH�b��6&Әo>.H��Iۯ#J�]nD���#\ih�ΡK|�Gf//t�1Տ���s8 ��b�y�����H!� I�����?�,$�u T��Vҫר�}Ƕ�KpJTታ V��� +��@�'Y�K[��i��*�Pd��HJ�;��#�.�'=&B�C�>P�;*�y������EmF�p�ײ5��h�qz��H�V�[$��}7�e�S%�▽B�Z�y�;sRB�9��(t?��[n���LvW�>��������_����W$�;�E&�%%9����q���-Af^�����ٙ?>�tJ�߶Ɣ�j�ʿ��kY�ڃK�d�����U�䎶r�0q��d�Y$���T*��0��ehS�ߢEl�I���Y�>��!���tU��Wa?�}�Z �W��|HO��'2S��� �p��2�q@��9{���5��K}�tO�sI�9�"f��f��<ȽQ��o�>g?L!?,H��"����<7�z�~rs�����:�v�U�wY`t���p��*�O��9�l�������[!� +�xK����/��om�(��!ɣR�����?��̘HZ�;]c��x#@����0��H���/�GDŽk�8��y~V-.;�����4�Nڲa3s3¼;��A��lYJ��� q��|��XsmO���_�m���}�Gv����v�a�3�GJ��LDόA����\-��#�*4���y�x�q��SL� ��B�f�.���r�b�S�����z0��^�80J�X����;6�q)P3�v����YTd����$k�e�|���ͣ#\������\A�z�a������4>0a�̔~9ƭ30�}��D�C�\=@ԪX�x�,�u]8j�'�Nrw��^�=�R֛���͌&ɑ�Umu�ۿ(�F;��Ky��c��(_9w�hw�%��t������}�,%�Ր5�)�C�9���U�0�p��oM��#�G��vݲ�:g�W��(a��3a_X6�浥�}z͈z���������s��f#S[(�B+[]�R�F�t�G*)C\ØxZ��q×��C�0��1�|]�����]�yG�Q�Mʛ/�M����p�ю��;�d����s��73J�l�'�&����t�#%���|���y��*�ˈVs�/'�K�������Pi�����G�w�G@�$�x=.;)/�W�e�8_`E���y٦#)>�刔������>�Z�'U,��V���%�#���!b�C����Zp�^[B�B�;�B<����8�x=JZe'����/�GI�T��mP=��߇�`s�y`&6���8g>f��]��r��}��U�wU1� ��l��� ���-�Ư����[5�j +Ƹ��qhFb�i����x��5L"��s�uWQ�����7Ђ���5�s4��wW�dKd\`<�9s���L�%�z����/�8ч��+v���� ���6�*��0dH�ɫ�^Q��R���z�'���T����|U&��:cƑ�u���]�g���dO�����Y�mS%��u-7�.�V�K��)xm���\B`�+���� 1�z�\r��1U�{��� +b5�@'E�'��Ƶ�_[(��㕒yD�a�z�Et�����;BMe-��b�R�d�L�SsZa?yl9Ng~H5]u���qF*����ij,7����u�sέ����[�C/���j�ƩŹ�!7�(���#�6|�++�d�]D:�d����v��N�Kx$�h=�`�D؇|-��1��J��pe�|+Y{|�4���a�0�o�]:��xSP�\NNp�in�*�8qM�{+iK�w�Y�hx��$��j�dt� i,|>�VOR�+�~��v���ùt��1�@�X)���c�h�������i.clbp���r� +�����c��5�>�}`�7�CRaBT��oo�:�7����撯|�)ww: ���陈��͂������/g����cI�t�*R�d�������Øў���<,�'����O�F�(�� e�cy۞�/�udg9����CNd6���f��"�ո3A�؞2�f"y�ܝ;�� +U���V�QBր�[`�U�V⳽�O�k��������y@gͣ�5p�V�$�B<iw(� +�\G|�.F�5��@\�?^YΪ�\�,�l���^�|�:aCj��$$�Z9,�4je%�3x�g�֤���wz o��Û�ͼ��e�ڬ��j�W�KF�ȹ�A���u|B��5m��� ���l4 �/BCٿ��$:�뢼��;Еk��*����͵@���k�W:����@ +\�� ��K��(0��d�?���������JBz�JQ%C0:[`����,�TQzW1XA(Y[hugk ��-��*Yj�Ւ�G�:��'�*�_&�%���ߎN",�5#�;H&Y�익�d�2}�v�N��z��}g���{M�Q3K� �@�'v +n�����M6���ݮǻ���)���'���6�5Z�3e .�ԑ���v e�z�@� +0�^fKKd���&�:��������hakI3W�L��F@�����a��xxEL#��_ +���]"�������w���Rr��àX�eOƦ ȧ��-� +m��� +!��]i*�J����˸귗҄��R:N�s��f������{K0�恽�j�B;���=w��1����Asv*c����$�~?�������~\�_:@;���jd��Z���tΫҏP� �#<�t3�8j���0����8���"?��`��k�.��h�����G$����_���0�����O�I*����k�Q� L+�I��m]$&#h}h+������?��.�uM+.P�t�eg�p� .�����A)�"��:��˕V'�d���n���.�cU�BG�_R�G�)�X�F���i=��Q�,�4�N�Q+{U?� ���t��d��Y&�� +.XC�R~���1Ot�y[�,��MR,&LU�=4HЕA �!�d���%r�y}�/�sy�j �+�s�}��W�<����ݰ��?�`u�s5��t���}|:}i���ꁇ'������]�+T��so�֡�q�}#Eo�c�h݄o6Vg^K�#>-od�"G�O{�1��ˆ�N[�h���4�r�u��c�O���'z���]|�(��0u,k !"֧��S�RĒ�P�������+�o�������� ��?k�w�(o�����We[)�Hψf�Þ���`%�����c�SO���!���@��7Z�)=w�U�Q�;�Ժw�KQW���� [E���)��Td�+��!�3��j� F]k4��Ϲƃ{j�܍Ok��-��Dup�����^2 Ml�k[�f��HC/M��;��twt.+�ƭ�C��8�)qݫT�_tI7b���>��∎<H�k��*լ���V�x됨|��a���0�I��3�'�(J��F��k�w�[���6LSO�Y��?mW���ױ�\��J�� `�&�� +�R��`jl,.&jHKY*�-��T��ڍex�=1q�ܐ,.S9�K�H�|���D7���=��>�N�x��Qq Uo$EH������V&!��ϑ"�kiu��N���4����gI�W��S[�5���w�3T�C�!&��K�^����c����V8cߏ癳 +rͫ��Mw��0�� +>$� �qN�J�&��s���\�=��*�X�7�+z��\�N�D�T'^S-�U�+�jN�yZ����s]4�=�g� ,=��c�xߚ�rugfY}F������"-��G�\����@�����өBani��uL������6�A�!JvE��m���Q�6�Q���?�VQ�E��?P����ĜӠYh���*m�-|TE╈|r���ĒHۋx�8^Z ��8u��{UN���*ўm��1xϗ�3��$㙾�5��+��q?Nlj͏��eE�Mr�Z���I��{g���'Uy�����yF�Sx&8�a"�kz�! ʝא�� +�}-e��������w �(3�Ff�Hȗ67Ny�|Y���;_w C� �ܒ��Ŝ��Ƕ�.�l�Ē�'#�A��hX�T��j��%�/��ڸ�[�t��XzK��m���� �p��2O?��<� +W����c+��{:��cB��M\5�9�X�hN�AhJ���Ubbk��&�>q�,�Kw�y,a���*^���0� +���� +;��2���h#�N3'Y�fO����d����ί '��j0h9=*pT��7�F�T�����kЭ4]�lWd'L��e$�R�*&��%���U�@S6rm8�]O�Z� /�;���?�x�L���ωʦT�Ӆ�PAF���C�q�!�p46��� �@x�XcL����B���l��_w�/Jh�0ب]�>:���Sj� ��{�ie~ ���ky�a��m0�M\f�f?:3*0ѓ�}���ďw���m ���3��[����`��a���^[����7�O�A��^r*�� ��]��%�vyD���ȈFOd"������+q[K��%j5��ewbv�y��^m�Q���#�����n�)IF<�[Fg�\�"�"���/Ҟ�U)��8�N���hijK����N yX�&5�U��I���邿^e�NZ�/2���+T�Ax�qz�;EXq������i`��\O�$>�2�k.�%`���%��%TT��1��[����,Ь�ȍr�vԤU��B�k�A�9���C�B�V�G� mK��|8�6(��ɰ�>Oo9���� ��셙�1;�L��w3t����xd��no9�7��_��(�'u�� �wC ���>�{�>�.'v٩.�8������P}o�%���TGD�%�!p��M���9�[��ׅ�ں.7�N|o�"�$P(�E%�/Ih7��/iK�Шh�����6��WͨZ����&��h�(����V�q"IP������+�{��W�Ș2����$jbi��}6��gң�e�8�~+����M�F MYgh%��k���9�f=�b(��(�*���lJ�P)s}�;W���rc�fc��;Vq�4�I��=հZ� ��_�����t$k��*D����O���f��}ڥE�3��������B�����ȪO�o��p$S�Z3�I�_�Z�l� �Ba��aCH{�,��a�����NB�:��؋��R1�:��Ma��G�Z�x;��v�+�=B�6�y����7<Ec`[��&� �����Q�2���JY@�q���Z�Ԛ�!��'tp흑��*2 p�~ۂ�ʍ���]ₕ>��c�ÈE�R�g� +��VՃ�F�1�=f��zy���=y�}�d_1��u�+�_i���a� z�I�g��-��q�����V�'�sG�:��H��^g��W*�Lu�H���*B��<�����w���E�~�Cg�<N�=]V�sp`����Soߟ����E�?!k��b�����i��_ְk�븤ӣ{c�I�v� F��\�6 �a]D[�鴿B�K�~y��uM@���Lr� +E�t����NZ��~�^Ә���� �A���[��RtI �F*8�R��b17>�3�J8�ޘOB8���� ����a@�,��Nؙ�):iQ��Yq%�8��s�;�Hr" ����f�Y�B��g�9�q�>�d +9$v���?3 C}��7��ϸ5iK���7�IZ��1t�LLP=d�@�0�DG�Mwf����y��B����Ha�Tm�/q�Z�t�~4�ݮ�(@7��ѯ/��]I���*`�م�B��Y�0�<�U$��xI��e�5�+}���D�"#~�ȚO��b�Z&IZ܋�Q>c��Q�T*����N楨���"����3 +�Bj6@����"X�\�.�s����Wf�3�nIf�T�������rJ������ kL-��Ӳ7G"Oݦ����J���r#e��_֧��P:$�dv~������[,�y�ޥ��u$�Tk�|��y�S�ZA~�iܤTעb�&�KE�)�6������@����2H��1A+�f�0�.�2��A�ƈט���o�7Ĕ�6��l��j_H�k���x�L�ռNа%KT��A�Q��:.���x��m���{W +66`�3��K�[�i i����ٯ��b�ٕZg��=�x��)�g��Kx��f�f����,`�i��O��\#�J���B��HXNvMP-\>�>;^��R�%�ȱ��-�[���b�p�����2��V�M���3�KE�������?�$&�t�f}�0�4[�W*�h\�l�� �zo���=b%=ȏH(�h��Gb�iVA_�|���FٕPnR��6G�V���+�HE~�0�U���Ċ�WW4JF��4�*�>�jWK�� ���_(��Ībq��h$�D-���n�p]DZ�|�� +ϴ7L�iKL}�;u�r�����-���Lne���=5�s�Kٚ�y�@��n�?�:�a���s�t^���t_��[�ɘyx`�Ɔ��1�.r�P��b�k��>�JNE���?/���Hubo-(�B����X�'�� +C ��c;K��T'O�*��2�#c'��q?"B]EO�*��������9��<����R�4TXt�d�4 =n�9쒗m�X>h*:�2d+c��r;�-:���sR�Զ���9�r�:�E���" +��%��o]e�C��J�^0Y,J�WR6�@�vD�" �%"o�PqG��>r���C�]��r�gK�:�NGy\16R�*�*�=R0D[�L��_�B�+�m��i�E�9:�A�2M��7y���=%� ߠg������4� +��8B��J�����Qek�V�*��D{}�d}����X@�q� y�������'B���-D���Y��.�0�;�]\�$����ԭ��̐��2k�T��^a�0b�����5�^ɰB.��j +���-6���^`Ƹ���S���7��L�V��)i��_��`��?Ff�Ț�P� ާ 4ô�x" J� �b+ ܊��K���2�ɖ ��R� v]{)��Q��*�ٟB�}���=����V(X)�K/�H}�DҦ���r~��/|&t�Dw���Px�&�e�������s� +n6�,�fK챊����e�LZj�7;=���iR��=�P:��ܻ���+,�t�ˌ� +���ɍ�=Ťu�6SU����Sh� �{y�?�����p����C638�O������>lU$�7|J� *Ea-)c�����Ν '����ңMܫp�]�JX����%��!�U��/�ۏ��>^*j����Ř�mᩥR��O����++�ƒu�]����>I�{�5?����$�c)�=_�|�?u�_��?��P�8�J���ϔ _���V���kS,ՉKС�m���L���v ��D1R�DF�.FC��C��\�z���Mm�ؘi�G�Z�}��+1��y�k������l��P���2��f����+���T�yY:4Ĺۥ�[�CK8�6��I� ��,.�<qCw,��?kEwYу��g��7���\a���Y���u8+-%]�7Q�9�F��5f����G�s�w�v���MF�w�6�.'������[7Ӈ�:��6gS��oؤPG%Y��]� zj�,��,��7!���+�y�*�|��=�C�]��\̩��w iH����v����2o�2�oGw_���):��TFX��V%��@�V��6�U普9&��"�H[Uy���ő�\�%���`�~8�:�a!�V3B������\�Ͽނ�+��)�MS�������Sb���xX�r�rU�p�]p�Sr(1#��C��=R�= �iт�nS�F��S%�|�,(<|Gˌ�����Y"?���3��+Q�j�� +�i�u�--,��`$�����d����~n>4�!�s�+�W�x�&��>L��۪̥��N��B��ډ��q�I�%U�!��@�q�ј�$���j'��T�X��yg˯��l���Ȱ՚w�v�z%���[���裄��?6��-x�&&Y��Q-#vP�}.琐ۻ�~>�[� +�;��1dܜ��t��/V肱�9�����������!��=H�g���k�W���pҥ��xb��2���v!���ȅQ�e%�d,Ef��Vf�����Uh~��� � +�s@�����`��Tbo�xF(O�bV���I9��BF~T6������~G}���:G���V�F��ݔ�`B�<�CE��ES=莻U���]�,5����c� ��C���T�?O�⛥���Q�֤�)-�mcHa��u|�%�9�'��_�H\UȨ>t%�$n��%��Y��Ⱦ��!�A�E���o[�~��I��e�&0%!@�EţO7c�Z�Q�@��殝٫��$:���DR�O��E���Y�Èa�*��W��� z:���G:f�GA�-$k��$jYn����hL��]�_\�I�����?ڦ.N���ئQќ���$���4�r�i!a|Fzз��]j��e�!�����ƹ�S�k"D��<"(H�,bq�BZ�k.T0V���*p�7Z��DYw��-�w����c�/�:�?r��;�7A�KYҐbz3��\�� �Ū��V�]�@�A:�G��v�σW���Dϒ�Ս��^�+XLZ�LCg��z��� ��?��Ҳ�e9����e�8D�t�v<3�]����5�&���]]���H'8�C����~�`\a Φ�2�U�]|Wm�VHp/��g�!���)e��K�������t�Q��g�ia�^�3�N����1�6 �a�?����l��U��q�-�y�/U@re�#�f}�YJ��;��a�m���D�1^1}S���~p�T +�Ut�֜�-�S�ճF�J� ��&\H��T4�x'L�K&�*ds�������H5✴��\{�cU�Gl�̻F+�Y9j��k�o�������o{�sB�5kN�]��غ)ɤ�y�%%~*<{�I�3ρ�圉�%�����j`g4�����=s�n�����5զ'^p��=�8Iw��6���������t�B� +ۮj��)o� *G�3���F����v���)�C\���}9�ʵӲ_�c��|�Ԥ��bӹ��Eb������- �s�-��f� �zj�pB[��rH8��y��hr�Ue�N�_�yd�>�Ӯ� �w�?�x���"�Z;ɿ��i)@ ת�ie�I�&Wc6��p [�f?�@F+v��f;��K�b5o���MY�8Ѥ���96W��J:�Ķ'�m۶m۶m۶�$۶qo��~�}E㩮�F��^�1x�/8k���V0g���GoV"l�rQKd����&��0�����S1�N����m�/ ^d�H��� +q�"���Qsd�)��,���N�j�����9m���<-�Q4?[���ʍ�0+�2j�݉��-��:Ϥ�V<�������d�7����A?�:NX_,i�D��D�ZO�#�١4∯<�7�a�L@4=������\���5>4�����/�=�����d(�>��(�vY=x���k�,�h������%�ɷQe�s))���N����Q�V�8w����X�Ih��@�^lk����>�k�;�א��I�i~5�.`�z�D�mV����v�yέ�m�$��^-�|xt�`Q.1E�P����NB"�r�5���{�]I�X\���̿���T_�i�}��7 +�q��B�)ԍ���%��(p�w0�Un�>� +�F�B��\% O�h,7 ¶���9��Tx�"�f�?���O�ÁJ;��β�M�����+/�r�(Jѥj��.E��lDHG�P�TS+�j]3�";M���Y�}ǍF0��E�~��ӹA`w�K��"~1K��(��w��Hz�j^����ϊ�S0 ��(<7���-L�y���^�$u��Nh��U������g���G�=F*�$���n��9 +��5VF��x�� `�H����Zpk��P?x4�4r�Z��Hd�l���JY��ULc~��?zUP��@�b��|'J�i�9=�c��=����oG��u�n�����os���F˼�q�rb\S��|���k�ےd�(� +�m4[x� +��6`Q������X�����bִR`���ʽq/�4v�<ש����a���7��S6'�?q +����@.���!��Əd5/KDd����\����E@)�ТP'{A� �`e,Rz���h��M��В�H��w��ff��Ao!b1�.�rf�J=<����4�wk�4 +8��4DK���(fU�4ˈT�"�?��Z�a�c�C�~�KR��T<EbE��, L�a�Ԃd�8l[lj=?�59��=�x�d]�PU��X����m9BF�~FH�5�K�2]\�c9�b����6?��&�)�*l�#���.��Lt����罅ё!��{ރi(�z}�R8!�Q!҉.�-<����#@t��_(�oH T&HB/���j����h���$a�� �^2�z����*�����m��5j�b���;�E���Ixn��_���r�}���;.��h3A�M�,��8^Ejt�/̥�v������JC��D��z pm������- H�Xۤ��+�ǵ�c ��>���j;�����V)��A������XL�Ë?h�,����������`=De�ݔ%����9�sZ����LNV�.c�@Lƌ�fԒ��@^������D������c�4T!ޞr���ݲ���N�)�w�)����z*� [��j�����W��1����JU��Eǁd'��h��H��пgG�4<D�����+�N�ٌ���0[`�%A��E���&-��2_*ZXo�Wh�a�U��b�L���G��+�\�;�� +�*�Ġ�_��Ry��&B}nsu���B��+�߾³>��1[�S��P�6�K}���w/c�yN�O��tW���o�I���E?���Dƕ�8j���|b7D�sUU��(�G�V��*���qFR}�ar�������*�Bٽ��?2&%c��!ؓ��A��_�F�\���9fʛ�����G�$[�Sk�Z��q2Q(�x9� �w��M�u҇�F�0]��U�G+�1f���cdD�r��[�yQʗ�0�'p�:��!��,|{u',7� B�_��m~���[<y�0BQ�0���L�B��S7SEDqj��'���Ўq�Wـ��l�om��O̓�`�'�\2s��[6��mX�K�$��gց¾������u�tO�! ��̰˓��,3�~���"l}!^=��~�}��)�n.�ii���H2J�H����� +�R��,3�7��r�=m`__��j~��PX�}M��&H� �8j!�ύ�6���τS��hI�u��bXKf}��HW@�J�"���u����T�j�[�=�;�qT���~�$a��z�������8:�ɲ�+�c%������P$,���ڽ��1;�֩,���"n��DŽ�voAS�,�m3l>�Ay���9�\�R{�KxG����I"��v|����&U������@�|�"Hy佹|��a +DL���3����[ '���}�zv ��Հ��s,�8�r�?�50,��X�P�������|�+�t�"��!�){ù��V��L�"��ۙR6�v�8g��Iv�;|�n�\O�D��Da�E&%C\@F�>\�^�(�{;J��N���8N����4�FE�f��mɢ0oV|W5$������H�M���Af�߸��Y�����D��ԾK���l���N�Gh)�5/Q�1K_:�<e]��Z��s4�N�Rp��q�С~����((a"�5����_QD��C+���ϓ)�")�?�w����x���\/X<�XF2�w�*�r�@,ʊ��f葆��F�l�..��ցu.@_MF��[�#�!�r���q�������{���j��b���r���������)��@�8�q�s�ح���c��䯹�Biע�4��f�P�}j���D����Z�Y�ꂙy)�p\�6G���d�wY/�g}�3<Ƥ`$�l^2���dY�hY�=��dȥdsȄ/��r�s艌-�S@�eIj��p砳t\��8��S-�'�d�r�*�l�P�e:wf5.IEXa���-�K�k�%��)^ʟDE=���u&�P�%;q��9��}�v��%���/{��FCn�������b��.-��;�����Y��;�-�\lo��YT�R�0���"��9����a�k�^5XjU�|�w�t�3`:$aq�p��)�xX�d�ۖ�Y�\6jy��(��w���Qf!�ty��-ָ�e$���M�'!�2s�w�x���?�S���q3�g��X��!����4�k����a���_pŝ��20����,��U���)�� h�O��9�\���U��R!,�� +�|��M�{��:L�5�����h;�-�����C�~ X��H|ٿ�i2�lj��d���k瘖{\��1;��:��\�y@���e�ƫ�������h�����qsF���Wj:��囜��w���B��yhL���5�9��O_mF��� ��+�9a������r�;-k;&��J5�Mz� �����3�!\�kM:j�O�ƇAqƍ(������/�9�Ws(�4�/Q_d��Ca�\�~�1TB� +^��X~�` �݆`X��(�������c�RݻJ�{���zA��#�}dNQ�p���NbW2"�|�\*K\��*�'��kTG�CX�q]o���%���C�CT#��?L0��殸@����G��k� [�\�[}�cZg��e"�bf�1��.p<��h��c���\�X������"��PTς�$b�y� +����KQ�sS��Z�;�� N������*�+2��v��1���k��-�a}�G�ql�^t& ��[ژ�M3����Ή��:�7�ߥ�qx���?�I�h�T �CC� + +�D�}��գ����:E0�S'��7D����!�%���Y�8�����Ĵc?�Ih `�"� +/@l��?��ua�`��7P�� ���¾�#���J"W�w��j6 +�!���Z�3���נ��.!Wbfj���2�uT�M�U����D���,oU�j�*��h0ݪ��+.j$nW�r��X��1���j �k{,ik�|�����A+���n���_5)��Wm�A��X'�`���p�54G���w v�l����:��P�9�Bg9�[�*��\����|�"�GU U�+����zr6�yt�7�~���noީ�k�,M\::�Ӓf�-�n4lTW�#j�-��"��b�O���.H�a�>�uUL�i�l�-=�T[;I������-e���G&F�7��îk���*�c~g�I�6��E�Vgcͭ+�2_c�v��gj�5*[��ђ,�80?���R�rH;Lj�]}��^���Qk'�0�-���'�]�陙�Ј��}E�I�K �ޒ��,��ʩ�Ȟ�!ܘ>�@ϭn��~�ف@� +�a�];>L�\��8Rx'�c��T%a�qݼ҃���@�v#�q��\g���q�b�w�sL�p;�+v}��������@O�K/�5�PE_k=N�SP��Ml��n��wp� cN^5�L����\�L��*�@�9&� o)ߪ�n�S銠kR0��V����~���D�@����1��������1�Me��֑����V*ΰ��.y�#�X�zZ~uyQ���/Vvu�J4�����I�gT��Q�ԑ�HL���A+�(���=Z"�O����10�i��K;�[sl�$�9{�ȼ%�|ͬ�e�߽̿f��#�bmu�T�=6�r��Ig?���,o�؞��4�6sF�q(���&1���r�d����f_����?��z��yE�+��5��}jH��8,q%�s:�n���ZR�58��b��p~.2:ʥU��<K�G�ꯥ��H1����VSq�4^ZxOV(��"��d���*�̽�!1�wF�i����np�o]�����k6�Ic_�"�§e�U"�t��r�[a ��8��W6��X�@���9H������ ��H���>�d�Q�)�G$S�Z>,\D_�K5@�l��X�p��� �O���%�5C~E�#}�!l[���m��I�������|�ЇʆP>��]+|��<���kw�R� +2�v�hx��������m8y8+.��)k�sV���'�~�[C.C���{���ﮢ +M95{�1K�_^ɻ|��)�$Z�7����=����G!��U��T�w��������߆o�5b�� Ԅ%'�.�ĵ��2.1��n�|�����v>>�T�]D����_f0�GԨ:\���1V�n������I=;/ˣ�.��^]v����q�{�8w��vK�{ ���y�-_'�l�[Sغ�E�0MSi��UT�'�h��JH4������16�E����E�j�)g���R���G�zF\i2b���j�@C�����498��R�A��x|��ن�����O"S����kn��Ǿp2H=�$�J��[��O�}v�szp� ��Y��EhE���dBOǐ��;j}��ԍ l�������bk +�f04���ȃ!205�>Ɗf�x�Y�v��w̫�����uGwj���7�4�ZfX�Q�P`]�q�\t��0נ��物B�|��ڊO`T��ى]e})=��m#�(>ݻ��X�W�2$�2���q��9�s��\�u�l�~�;E�t%�e��z�)#V�\$���߳��E��1���:O�����nw#�,ۯ�X�!�����4-Si�o�D9�/q+^���㌖BM��R�(O�=O(�QV=JrAq~%e����rwEQA���y�m�>v��2"�1��*Bh(�<�S�k$�Lbe5F��*�6��@��c�\��k\��<�������aJ�u�͋�(R|���f�*�0#�����3;r�qF��V�=��T�~����S*ŢY��ҏ6K)�f�iW���b�a��^q���ۡ�:�e�~�I�:�n&1�P�7)�o�ҸVW��ޠ)INg�:��,���M�&�Kw�[�X�u�h�� ������]א9���}�� QZo�l:���f�J^{Eׇ|L���o�����˔��<���G��'`V!�H�9s�T�A���f5i��b�n0���w�Pw����]w��^ꕕY. u�5~�����K��g�_=V]K|�X�6_ߔ������6W��P�O�&�(S���-�ئ7F��V1 ��e��ό@Dժ��ϰVy� � �^=� �� +3,P?i4"� +n�}��n��A)�`���h�4Mfԇn����~�0�6��c�ߐ�����fǡ)�o�z����q˘�����o�eA��JW� !,�m�~:����wa7`��(E��`"*ɴ���bL��u�&�p����A�;��N�Ʒ�{��1��Zb�PT���g� �TT��`���2QJ�<~h�R3�����w��2�����5����$Ey��/�P&���> �W.t��]N�23�m���.�%$��-���mF�:3��o'����&�j�)sV�T���QΛN��40��=��j|;h��T�<:dV���3�+��g�.8\"f�&W���B��6��<RZ�*Ӂ�O�����փu��*�̫�MϬ��E�,#2#.X�aV�a��C� Y����\g�k�*+U���m3?�\�{�-ު��JAz+�{!S2C3�a��е�Oa:�{������eIz��$<;V��~\֭���� �EU�q�0ޕH _�d +XSEǺ�0����Rwӡk�B�w|H�a�j�Cz�K,`��_�����N�i�\RS�P)�vÇ�.tB�ׂ�U-v�6jL��撥7�s�:��g�D�ɕ�9�HJ���]9N,� +@p;������np�8�ʞiD����2�x@�ֵ/�P��yS\��hp�`|}�f�|{M�%Y\y��F2��ݤ��`��:���%A1D@)�yN�5��z���6bz�+S�fU9ipf� [���b$Hգ +�3�4�����3�<��9�MҌ�`�4:Ͻ�Č�i�OS���gdG�KPK[�+Fs�@��9 ^��+,�+99<�/W)��ϊh�h� +��Ǽ�s�WYU�����6v�'�z�7�o���4HW�� ��W�5�Kd���<�dLA�V�n�yr�r�7v��e�����E��4uvcH�*|��bd+4��.lc�'db.�������Y�����z����\��<uO���Կ�em�_�"5L��~PXBi�����/e��o:�Ќ��R�>��E�zX�X�Vm�j�K�뎰���-��V5rґ��;m� ��:������`�+�p��3W�.�q��{��- ��ү�)�GW�����Bv�x;wj�3i���@��D��U~�N�������;)��T[v�}�� +cw��m~P_�Xh������f7�5C7cm�N��]��J���/��#����E�mj�h���A%�N�2��dm<?��&�(�1�x�;�_^T��+���FD�=��OEY��ge!p�)��"/$f��Aâ-&Y�Λ�?�ӰV��_�$�i��twH���q 6��j�=:����KѤ����0��P��O�>�0��YQsΐ�?��W.xC�+� �un}����7�� H�D�pHg^e���MYu�iI�����{կ-_�ST?M�����k�`�unr����L��w��ŧ��`ϩN�>p�Du�̀��x.6���2�����-�)v�Q!�E������3Bo=��}�rR�+\oejz������U��I���4��$��m���t����)�u2�y'�(�u���CYY�`�.�F���?4t�y�xwmw)l�:����NN�}u2+c����kfS"p�yG��Wf�� ��g�ώ�����B��*G��fp͖��6��B��}��[�K�Rx`{�Ǐ�M�8.&�v��UW�����!���PrO�*T(�բ)���H(${�FsZ�ǃ���',���?�!�li�����%^�Wږ��[05[��+���R��4���IZXR���g������E��|�1[l�2Ƭ侓�șD,fr��鐓 [q=u�Tw)�E��7�㶯��UXv� E)i{�ݘ�#O+m��aˢ�S��H4%�����6!׳�;}�k��L2 �����aVx��ɆE������r�����\�sZu�""-�Zҭ�r�i�jG��f�z/-��4 *�����C�(-���c���RrYo�m����)�����T�g��p�Suҝ���o� +mC�eOi<�X��.��㰾����g���yV���u�|a�CBZ�{��\����Y��������ɝ0kP����*��D�& +�)F�任���W���(�쨼�X�cA�U�2��<t����!y�({��h}�'C��O�(���R�� ~v�q�-��Dٍq6�|�%Ƃ��%�z��&�U�Ii���,�As�?8;M�ބ���+��5����j�N��ϖ�:8���|# �Q&p�Sʓ���+`��6���tB=����0o�kI,��,]hT����qo��K�8��l���\�}`w�2�w��I(lm(�H,j�&g!�/�{��aK��ݻ�$�d~!���C±� K�7o�+( P�+T�b�){�vb�b�P��� +�:�.�6-�� U���q�kR���9瘍~�on����(n���g�kL��?}�{��g�K���|��4���V���w�5@��7$�R��Eڦ����w�c�5a�Ί0���jp;�+0��8�雥��.~@Q�>u����B�r���:DMtS;���5��[���ܦl·��9�Ӄ����W�U)�c�����%�f��������XMq_E��,����8i}FU�d5��q�P�d����%q(<�P�cl�K#)���K 8��um�b��e�f��@d(^��nُ^4���x6���o��Kp�P6�ԭ��k��s��6\��%�q�N�0��\�cͧk�s��/p��擼�W�L�Żs~��ﱁk������?����뒪�"�\�@wc��x�p7G���ۜU�� +=��s���'�2%M�*u�����<��*�$l�������t9�^[���O�n��B���U�;G���/��������Q��2� �Ʈ�{/��wG���:s&���C)lc�1�s��~K���MR�����5�Oo +�Y�;,��ps^������)O��^\�t��㾂}�F8ח85[`@��|�5��k��r����(��j[�Rg�~,�T���I}N��H��K��j�/��]d�G�X�i�w6��4v@ݧ�[�6���4�n(� #��J���V*Lrv>b2��*m�fB_�eC#�p�$_�~E��&�P'`=�k:���,�>���H�/�j#UH�>����JE��pˍ�[,6c����3�4/���%Z�G��K}�tp��=�Б�A�����\.E5�!�S��5]�V9���+���L���Ɨ"�!�쭷�Q[3x��C\!~��?��J��,���ĻWAJǐ�ګf�P�V�/CIH��_m��H.6�",�7}�x���y��p��_�-���}�S�m^�t^���<��p��\�Ŕp��w$���q��5� +�6xXT����$'��ցu��ѯ���ʛ�A��E��Ԥ#�š�捷�9J���U'L*Z�.mZh~�i�V�~�uR�Yѿ +#�sǔ��c�ɤ��� ]ʮ1��v��{���i��� [�� +��>��C����>��eFK +5��G�~^_��� �����ɀ��[��R���q}�]�a���_��'1��H�/&�V2��V`��{�ݺ��[i-�%L �x�0�s9����ϰ�i��<�=c���dK!��v|kǣ��79�UI�y�<k��f6����� +�m�&1�ck�8r�%�2 ��0��Ҹ��|'�tn0��T��;�Y��s'5_u�k��ߪE'(�q��f{����� �͏�o�"�ơz�QI�]_�����iK6����H=�̦���q\�4� g��=�a���"7;���z7$91�Z Tu� Fhn},02��kcـ���#�Ń����f�x +�4���W�3�]/~�N�����k�M�Լл�7����7��A��u��+�"��2�Ř{��D�]���-K=z� zAM�0-�#�'���i���a+JO���צ�ee+�nu�)=��ln��B3hZ��YJ=(Q���v5�x�!�ѕe�"s����)+R�x{)(B����!DV1��1��n6��o`^)������i��'w9���B���y���#/K0�vj�m0u|����.y +N��H��9�ţt�J��H/��_�;M�^Ӹ#$[�r�U��JQ�m ���]K�Y˘��C��C����4s��ɉÝ�n��|C[#����ѯ3�����OaYD }����\�mޗ��ϩLs��P!�� +�����G={ +n��:�֫X��5���f|�}.��ꤻ3�� +,pF�r�)Df.�3C��X��T�6Ca�VU�K���$���ri6��w�X�-N� �-W��T�h؟|e���q��"�v�M�K=��#�'�F(Ʊ�?�iܔ�m-�XqqK�0�:���PFne�Y��꺮�����9���ewd���Yt֙Ê��R�Ϯ*x?HN3k}?�J�Rc�v�J�$�)Yװ�l:�?m��Ev,�2�C�"�Ĝ$��3~���tX�nBl��|�[������RV���8�p$��%{͊�v�Y�g�Ի���3������2t;o�k�0P"� Y�sP����rA$��ȩ�&�ed2}��Xz���N��e��*)�����~�v�<{sr�\��@{��(گa�Qo�ޔa�(\�q;LM@������u��"�p����+�^�N2L�G�R��DLkJ�&��������&N�%��Ќ���Ћ�,V?�� �Ag�����u*����;�r�7�ن}P.��eF���ĦY����Z:Pwi� ���mϹI�R]���w4����0�Ad��9���U�ym�=��Ʃ(*Z_��}�v�XU�q��ނ�H�dn�+�n,R�w##|PGb��{�e�D�����7w���-AQ"4Y-�����߈�v�6bp �T�BS�8º���[��3�"�\�kN�ʶ���d�{����F�nOO�R��G���A�*?At.���Ѿ<$:�] ��������qD�C4��[[ʖ�~��/�*�D!?)�3̐�:��;�݀�^��I�|��+����6��o�k�'�����a�ɗXt�kmD����8d,�G��ޔ[l��=���v��z���}u?�+���3�+~d�M +;%�&G�)ڐ�7Fc��=��pX ���/����8&]u�ҊU��l��q�{ ��c�[rE��Խ��5��!ID����L.���쳥����8���Q\���H������!��I���m�2xv:_'���lM��;6�(5��rn*�ܵ��pBnat����b��p�>�˩B-�05̄?�p��c�#�>�7y��%�rE�>�ɇ6g�*�njg����8|��=�A��Z +��m�\@`�r���Ê&Ot��#Q-�@J{����k+��`�� )�I�;N��Q�@�bT�y��������[�וJ�5y�Ոdt�\\�� %l9�9~�>Ȃ>#��9��Z�V_��� C#�Ur�̄��^�t�-�2Eܡ#�"�yE%?hb�Ė�+X��I�����i W�u�Sk�e,fVvІ���Z�c�GԂp`0�5uj�Z+����o,zr���:s�����a���'����o��LK������4�.���/�v#�M�@�7o��I����� +h~�c��2D$�3�1+~�V@�1K�HA��*�h�2"����NR�V�ȞǿDV5R�.$y�z�S�y������e��Kx~�;���w=�Q���s�u��A�Şh�Н� m�9 +:�Ʈ�櫨`�U��I�3߱~���YSM}ϾˑF���U��ϟ%�LUC��$��C�e�b���O����6B��i$>�)*I�3C�@�t>�����F��?�.�Ts���ę1�.c��R��o�aN�v�a�Z�h���O�:�po�k_�@c��� ���l�����]�v��̶��&��z*urQ˃�p�`iB��x��D�p[n;���sFpN��1n�2.�����fhV�k X� +��^(�g�Y���l�Ԁ�0�-62���/S��lu�9�MM���s&�Cq�8K,A&��ޣw�\���X�K�$��Q�x>\�Sj��o�6eƃ&���l���z,@j�ݴ����7�/�]��������nx�{�Z�m��u#L(��ۣ3��L��F�ژY��� �ɐ6�^�#� ;�E=x���;�4���{zQ){˶�5���J���e�%���>Џ#�!W�IL� g����,0V�OD�A��j���(b(P�e��Z���8�,Q))Ǒ�~%t/���^P�HK�#���v�s��b����q�,�(�{<��[Zh���U(�cy��qg꼱��i +n�*p��#�M]aV���4�������-�WG>����b��~ш&�{��$�D�͆,�P\#v-�Q4 #���6W���R��~ +����߉m��z�Յv�����F�/OY�����V�]1����{�Ӽ&Y�Ԇ #H�6�_|^��95�~�Ã��#��6<)�#@�yQUq&��;���Tm�ev�$���(KZ<����.9�=�1=�A�����}vj�lK�*���#���hLΚ��?�y�*+��/N�}9�@���$�O� �/�uqS�c�l��Nۘ����;�&D��N1i{��L�W���14�~�:ݭL��:�B�Z�5�O&�Z如5:�H��nM��>�O���}U���V��/�?�U?�� �_�����1����Ddž�^3ps��%7^���x�U�{k�����Y� ��l��Ȥ�p�nXz@�<@}��iwP��:l�#��̕����v��1]���V;N9��:��� �c�q%��dU���� o�U��y�<���iPq\�ܦ�H��Z!�: +����!�33�nOo� +-<������2� B�P=�"AK���P��̶���zK?��x��N��⽀���d��J���Hѱ�����Env�`��Q�s���S��n�AY<�"7x8�?s�K*�Z+�ꅺ/�e|���ɠM�l��w��>}AK��h�g?�ȳK8��¿��B[�K� �q�_���=���q��8�V��� ��`R�(�BO�+�0�_T�@�lvđ��ߗ�g���>�Ew%6������[B�K�*NM��f�v�������Ì�j��#d�ſ2�T�5�\�&���B���'1r���j���s���,� ���R�-1?�\s����i4Ϙ�4�mZ+�8{���q�6��B�נ����Q0�bS�sİ�r73=}�꞊}ۧBn�>.��Z:���]��Ԉ}iQx�֍���'������^��-x)�{��Rw�K1�dl)p;_^�Q �H�ie����~ztXW����O��:��F�-�������y]{�y�S=�'�۠S�+%�g��{Ǘ��4p���C2b����Ͳ�g���x���p��=�(T�D�g�&\�*��O6¤��{-�:���/�Aa9+��j�u��_�N���K����0.Hv�;]�=֑C9�ㅟ ���9WW /6�A�SD����� �Y�=�Ks\��O�%:����P�X(����9w<l���#i��#~ n�e��{&R�m�T.�3��K���[�C)��a���z�����`���1�������-v���)�/#�aؘ��Uo���|�?x��Ŏ���O�~��F��?5�����(A�����OQ�<�nz���?c�i�#핉�Ip~<_0�ݡds���5RtBN�k��p[�{��)�i����NNʕ# +���S�#�2hNWɹ��q?ϩ�[Z:g�0A����U'�)TWd����0�0t����N�E������3I�����}�<aO�I)D�&�kY���`�B0�}�������F?��ď,Ո����:��#2|����A�ϊ�o�"=��P*���VBO�H� +�GR��t��]��Jr:�!2���;���j٣C�$��8��,���b�O4G}�t斢�+� ��튿w�w���G�[j��c�'g���'n�g�ú��ݥ��y���Ќ�eI�]��hXb�ju#o�h`���&�Z�w���O���MRyae�Zb��je�"9�d>�N�5@�`p�2"�{Zp���p���~M��.��6�ܟ/�>������{��?@vwȷӔ}�E�?��S���q @,��Ѩ����JC��~��b٥b% +a�Qv�]�|W���q �� ��7>&�$V���)$����!Z\n� +\=Jڬ��)Òz��6��I�t�́�%�#�%��S���f��k�h����;ٻ:��̛M��.j��]��1��f4�4��d�#��}�o V!^c��U�`��b�3��wˑҎ]n�;z�qp�w�c���&��^�YB�+%�2�Tt���e�9y�����_~��|��uNأ��Q�e ����믏��5��< �y��ʍ�����<��r,k؎I�N+�.����Ǩ��q +�W!� ���Oi�r��3{ئA�e�6�ƥ�.��!�� ���,��Z3�l��+��jD|�;x̓��M5X�0��J�{?"x��@�"���:8"�]���i���4��T2���d�=������3 ,��Cػ*� HEtI��ԝky0�2��Rm���U��͎u��*��BP3<0�ȝmS��S�Rꥌ�;![����,P��P bS�f�,S.lo\�G�{����B"v�3�=x�䆗d�lX-R���u$B��x�G���oO��L⒙w�S�6T�^���i;J��OA� ��͕U�ك��B'�V����u˃���Zh*]�]���{UC�6B0�c��_���P���H l��"H#�\��A@�x�b����ɛ�%�7��5i�.����+1"�W��vA������sۡ�*]��#6��ߡ�YZ%�H9 ��v��������ˏ��e�뻋��h��uA�3o�M���4��گ6�_Y�������(��Q1ґʻ�4�}�������̗!��x�<Ed?���;�{�XG�m�(�IbM��39�,ǝ�5����!f7��G�, � �B ���ː%Y{ȿ�2qD������t�Z`�����Yh*Z����/�W��`����=u���t��eo�.����+��c�_�a084:ք2�ڴ;~cO�瘉m�wB�_�n +O5d���;��"�Ţ?A�o��l�]|������`��Q�l�bIY����e�E(�}AA]�!�oՏYgqy���U��{=����@�v#7p��*��0�3h�����DE;�;��q*Q�q��� U'�J�vH|]�2㢐���x�s�c±�c��P�O ҝ��7�H��st�^��T�[�� +�}�Nm�� ��1P�Ǘ�d/���:`�iӷn�J���T,�7�C���uw;��P�����H&3\M۠/Х�ɍ���1�CQC�l<'�C`*.�NX�7l1���e�g����43�u d�6}(��7f��iDl���Q5a,e�&\.��@�¡���F��Ԉ�S�*��*�67U���R����� +�q���R�6l4��N���Ay�1]z.�h�"�1'.�\5�W�'$�� W��Z0���_�|OwP+^AJ4���h��Ҷ�O�fi��1W�o�𬄳���=Rk���&hG�,s�$E4e� B��"�<�A�c�@ � ���RZ�5#�\x��VA�=��*Y`�TSvG��nJȻ +�*�5"s.箈�x� $��.�N��������\zBu}��<ڡۧ��M�ķ���8�t���SSQK���!����M��M<��"��ytX�&h�2�t5�����q��fϑcg�6�!+�0Rm�& �nʔ] ��+H�n�చ�&I��+EZ�����#�ysp*�r�� J`�eT(��`Ν3�,��ц銋2Fʚ�J�,��(a�ȉ���=f{Ο�9�Ō��{��T��;��$�1����G��TuCw�����aV��߇�g@�P<���>��9��)h6�xp����G �'��R*��U�o�#��m\aN-�[�,�$�c۶m۶m۶m[�ضm۶���l&�OtTted����>I~df� +��¹�e�cV��hL���h�gB g��H/Z�R�JV"��T�r��z +��I6����^\-�ֱ5��wJ��dvQp���QNX�S~��>>�����Rք�w9���/�i���"ͨ�;�������Js��P��r��ܶ"���C ,�L]��_��RI&�����{�c�v��6��~i�/��Oe�/B�7p)Ys�8�2٨��i�l�v�_&G�t��n!�C ��j�tQ��m�A1�ʐ��v/}��/���?t�A��Q�Z�弸�R�ծ�Ö��=�Ǻ��#9�q��`6�G'��ЉM +^��v�] ��W��4��VkQ��V)����C�.BX���X�c��� y}��2^Oq��T��?٪�g�T����f���k*��n1��>5��� +%��P�P��?���n�o�_�S��ۗ�}����� +���i�x�@]���2�<� In9G��ԺR�6���#�E�Yw�O����=�"��l�t��7&�tf���V��<��&T�~F���Q4��;���*��+2<K�ed ����%��O!�Q�(��+�[�VƉ�6�A�ߵ�����Мs����aW�Dg�i!ˇ�� 5��2J�#�_�!!��,T��A��Cp���ҏ5(�ߺ��W ���>��A�`���,��7A*빡�jP��<M5�Q����@��(�>�2�� +�$+�>����gB���헹bH� ϶��$?'�`+yD���B�/�p�7���[��,��MV�E��ʽ�Ԅ`�����{� r�S��W�+�ak�*������V����o.�>�����R�ɺEW;{�8�Ƴ& V����VR��[q�gGGMU/O�������@���[>���JB�����i�e�P���#$>�$W�?�V˟1/O�>`�( ����8шR�B�H��<-�/��C����Ph� )cF���3}Ġ�3�}[8��+�R�K�1�3}|��g$ `6\��]k;��].F�TJ�u�?����GG���0�QҮ����֥�96|�O�˓���u��ӱ��M�M��F�ʸ@O�ǀ�~6���#��!���I��'�T�Z�5gZ�>vV�-vE����|R(���ڐ�b����0��d)�q��j��A4��!���D'�)�^�R��y�\��(B��9-�;��T�Vej<Y�t�2��Lg�-��R��q�r��F�A�bs���.�h]/@�����<�JF;�A~‽}�ת�݂��D���x���3�k?�v��;#[<9�y$�v�+��G�v��N���7�T�Z]�O ���ISd���k6��A���d��i�9����affq<���rNa���+��S�"w8O�+�uuDz߭�L����� #�E��Qw4��ݰo�l�,J�!-���1AK��9�3(���HzM"@Ϋ�N�տ�4ګ����p�j"���W�I�v`���N�y�-��UM�-"�nFO�CPg��j(SY��Dv�XCߗ <nV�oԚJ��f��J Zc�\�Qb�l�!R�x�{��˽� ���Ȏ@�]�P Q@;(˔Xe�|��Rf��Y�ɴ�*����ْ}��Wt�m�q�9�b|h˭HR��D:e�%[��d6Mi���L�d�������g�^�f�� x�������{�+�F�羚�f�U�"c +�����ń����[m��.;�?<(�R B�ac�m����Š42R:��dZ9wB�1gB� �-�+$���N +Ս���\�q�X����nfW�`R=ȍ�J����b;�U@0]��8�g6��~������O�d�n�ӏ����L^Er�Y�:#�dh��Jo�"Pзt~���m`�N�Wv0M����9ѥ��+.ǹy��t����%y)�$� +��Yu�XLc4]^���a���Fܭ�|�]�Ж�VE筻X:s6�� hxT`,'�'��Tp}gذ��i��$N��aU�6��"�pZ���w���#~+��ӟ~�f����<���0�q�����Z'�H�(�Ku�G��@2��͖���!,e��џS�F� ��Ƕ~������i�7�����W�lrIW��_��^}%�KBr���Y��B�h����ɕ)�3}~�b�f�3`D��f��d���i`I�*���A[��T,���] A��,+y��葫(� +�o��o��z+Ԣ��;%���6�����hOwN����1�LmuQ,��|�IR$�Q~��;���ӫ�/s�@艳*��0�r��T�F�����l�2ĝ��!���we\�n^k�����3��zn��~!����1�ٌo�����Is����Dw��hz�%7��,�N#BjQ�a�W}�#�O�0�d�};�D����f��|1&-P3��U����Y V� q��������UVf۞#x/�.��á����KԐB�O�7 T;���M����ix�?�/�Ɇ������6��f��������ɰU(�=밺 �sE�kD����@2(�yP��Jԛ�Z��#��9M� +�HĞ ��wZ{�w^t�X���m�1X��ר�UC.R +vL9�|���.�|=Y�Jㅦ�ƅp�ol3���������� ���聦8�/W�/��G,� ќX���Fn�gV�#���2����^�.1�����2>9��h�g,hz3T���N��o�o M�'�|��(.�YVY.����[ �&��|?�J�$���������R�n?�`� �X�����}�x(�L�[o^��"���( �Q�$�̞��C����v;�"�w��0�[�w7��z��^@�dv-t_�[6����R��&�b>�3�M�M�����7����#x�U�]}F�c�����7�Ħ�֦���%%�}��)�X�-���1q�:����k���l"�V�C[_b"�e}��/��" ��ߦ�S6{S5y��RM�d��^�EEy�}�F�b�/�������P�Əi2��m'�]����_��{���B��5@Y/�oM�e;�|�R�l2/���9ݓ ?�~%��S}�T���~�}2 ط��y���4��o��������b/��c<��^^]l�`�� 9����XQo��X*(�o_��Fx g����T���R>�k�.T�.�52^#�#�O�|��i�Q��c<*R��C��'�&� ��B��jb�����& ����K��z�fA'7Z +�? qOF�b����?��(�����#��郸i�j�s�#%&=���5t��kA����&Y@nN ���I0ޭ�>έ�fo��R(�'5d$�*+�D�V�*�E�٣:�U6�AY�K��!K��?����N���e��l7}���Ll�j�%���'Ŷ90�e�\?K_Q�_��<,�����E�ެ#�EU֘WS��$3h��`�5&��$I5Gs�S>e�����G���2�(��M�d2�{�*C�����\��g�={� +Xb��N��t%K,pE��R+�ߒIe�y�����J��e#�D�\����f�2��:t=���K�,�p㢊+8�`�T���c�f�A�X�<���v�e��Q9���Y/5���K�I��.�`��J�N�lë�Orʦ��`�!�,n�:6allw�dŋH@}P4��v݁��d�����M�x�UI t�����2�D`�_�����z�(L�7�������'pDِ+ak�!u\��.�٬n�asK�)-w;���i^��)�*QD,��>��4Y�ߓ�/C�gFH�)��?�?J��" 8%��ez1/�ڻ���j(��]�"o�?� V?��&�Ʈ���<k�-��Ɣ�����Ǖ�Dj���� z�w��B�e9�<VM��j�⹕���Y�vΊF8d�)��q*�d覌���To���k��Չ��(vC?EXϢ����W�y��� +V�<tT�i��R�DN"�uc��~?�ӄó&�'��e��:�S-��M��ؔ܌���.�HqR>Ȓ�P�'��}��M�#W���(L�+��3 Қ�`dWUy���mw��- �jK�R��w=�^��{��<k��)/�r���i�?+�B0Y.J|�e�D��l��[n=�����Uh��c�a�^�7���|�?{�Q��<�^����؛�~��S��b�ntY�T�W�m��(NV������e�$�(qoS���D�%� jh(m�\h@��OD1����a��&���|X��5�����|�tg;�^�����ޥ��p�qQ}��ID6�Q��C�LE�����ؤ��q�$;w�`�Y�u�����*����D��+>Q�$�Z�ӓ�9҆F��&zL��B�d�y+���Gɞ^_�QG]%�3�Ƭ3*<H�<�����sć�+Ǹ���6�m�*���u���_��}w�-��>NW�i�]�G��5�.����S?|�y�q���]��� +����,�^pεF +����֊k�#�d�r;z1����ݬ��h-�;ӻ�ukr+�&G��e�E�$3�h!���mq�m��BU�N�>�w� �%��T��Da�f +�S�sgy*���r�|!��0���I�Uq�M8�>8�@� �O?����ˎS�Q^TlWe]�d(�+�\����qS�?{�j=Rf�K\�V��Uh���\ > ����H�_(�g��J�Ƈ��J�� + �AB���}`�O����}me�S��Ѧ�� _2�<K���0Μ����S�LݨΡ�ow �|j塈�O"�����<����#uv&mR��>�ؘߠW��G-!�3�6��aT6����S�[VS��s4�}�W�z2ʚ��nR���J��j:�71[ըc%R��s��Bf��AB.l��~����Y(ݔT��Z=�J�A5Y��$���O��#����on�I�=2Y��D̏I���CT��Vaן�G@I�s�B�ޚ��p�l�#6��WVy3�����bG$ݹ��q�}��qp�˲�\��=U�+�v��QS�;q~Oڬ�F�@����vl���O�D�)VX�(XY>�V�)��?z��@u��w��B=6̟����\��cBui����3lyX{˘�2?%����/w��_|�0T��˟b�̗��t�}?ҮB�?�e�M_%�O���ֹ���*�ߋ`��JY�����y0�Zv��*�n^b���K.�ְ͂�e�W���d�B��o�&��i��܉JO���>�0��#J�*�\��.RYeL7�����:fl��<՛��.�ٻ�ɴ�e��I� ��dܚ{ޒ��P�o:G����c�W�ZC千(P�Z���eY���.o\PҲ@����FjI�Fo6>��7)L�db&��tնu�G/ ����P�1�����#���P������xޘ×��m�R�ŗ��@<���)ү����Wu�9����\�S�e'@���#��*[�|CWe���P�\���*}MCC�����N}h�$��5�/��`��C>�j�ie����ؐ�X�s� +�s����������i �4��'������n�m03Byoq~:4�������.ԧ�Ëy/H �� L`��*n�tT;H�w�1@!Rc,)��r߬| {���[u�����~��~f��d��r?���/���u�5�-�k���%�g�n�)"�6f�7�;�N0��r�z�����^7d�am�����T��6�t@�v� �������T����hCD�YKti��st<9���I���b|ţ.��AߣG�#��}�������#%C�YN>vtZ�.u��`Q�S�F��$�Q!k�$�:� /=1&���EN�4���ژ3��Fܭ��M~f�X � +[G���xm����M�+�~B9^F���>6-� {��9�U��uO\��۫��wo�������!c�����~����)I�Yߤ�4��踇߆̉~��G�ag�����Ғo�����L)���y�W�5�3�{<Ј@�Cy�^�����{F\�Yi��ZJt`9}&GE�Q���{���<���� lE:e�/!�{��w�tX��^]X��L0{a��?i*t*/b-ְ�>��B��n�����6v�jV�u�4�5������Y�R�i�^X ��*O�?�uҶ�D�#��Zx�L�I:�[�b��u�j�?�g:_�����V4�;�x�A�@��β�|L���L�1q����u��[&㯼�ڿ�;��4ߊ���Py���M�'[!R"lSVbkH��U�/�M�-����GK��Vs� +�a`�G�:6�x��ma����9�# +�[b10b�F}�/� +�}(��@t�����ֳ7~C��y�c�1��k�2�1�8a��J��77�V���b���_�~�C�-Pv��J ��`�B�l�b:���� /r��n{�!#]�{��)�o�s��~�*k>+�l8��D���Ҧ�F���;�~VନB�`�7�^#WE<h� +~��)���ovŊ�� l)^t�(����$�*�kl���2Vk��`���IְԦvYQjl��pͺ;��F����=�)ɼq�Ff� 3���~���{�2��z\�a}�2r_��j�� +^FO��X�uFo��6//���X�m~]iVL�y6��7�WPa�H~�E�]8Pp�����x:]d��Ab%Q�9�A������gd��6�q���F��WK�@�=VwF�A�f����2��ӛ��vZy��У�ׂ��d����!�Y��F�3�ީ��'�al��p�����ǭ��Ж<���7�������f�H�0�順d�$���:�x'�N4���)3�(C⧦���G�7+"�1ϭ{�|�E�y�+w���j��8�l�WѨ;Au����x^$�QN �5"�YQQ����dG������%�sj7y�OG��I���k�?�H�@��X&��i�D߹s�r�aR��T��������2kAs��&��d��ow���;�n��N# %��=H2���;i�\:E [}�Q��E �,�D�ݞ�\��ҙ�3�2O�$�i7��m��U�֮�v��� �D��"R�]��P�_Zt����<�#�x��ؼ#+���r���/��/��N��Oq{��N�8V�7�~ +�k�l�w�i8���5�.���߀�����ƶ5R�8�E�ӵ�}m���SE��2�V������W`���#B�u<^|��A@�U�I���4�j��y�]�_Jsϱ��;Y�ˍ5ݱjV�eIW�{�j� cb�mT�G<,��l�����~o"�Ŀ��S DN��M5�[O����=*?n&��N]ܯ��Z� �Qx�UkUo����F�saͫ`6�<�L"�6S�6~dH�q�C�T�U���VДB��`z&E8�H�r�1�߫vsk�����U�i�ur�Ɲ��1W��\�����+lQ�}�I�-YJ}]qy�p�iL��=�INM��EY[�(0 P�����F@Yq�&b0��z�6$�/@�WD�W�n�{+�ջ�����2X�rτճ�i1~������*�I��kޒ�3]��)1))��[XH�a��Q���rP��~d/�J���K�(ked'^f�_���v�����>\C/'oR�.#^$��|gJw�z���#���p��,տ�C��͌�R[�W�U3�$���\ ��c2�1��u���a%��G�Ԉe~Y�fq0���ۼ�g�l[�%=��r��o2��C��0�WAxr��m��@mN����Yi��"��C���%oDe1��9��#P��.�ibm�&��q��0�a����+� � $�"-f��h�i���[����?m���� ��61_�k�Z�b<����A3h���u�QFD�yW +����SK���_{��������̋�ǯ�R���b�B����J���A&\�'�\����8H�(8��x�g�b��O�i\����r�/O�HW����K���mP�����E�B�9�4뭥�#Ce�D��{�:�FNV�eZ�G�e�Ś@W�tHy��UH�P��J�;���M�+a���I�\%N�m�U��3H���d��O��(�#���&�CC3�N���eOX�����ӣ8^�{�im�eX +o�R &_k�[HI�}��<B�8Q�����{1�~��i�qA6�� +~D4�}�H��� +����.����z5����F���E���df|TФ���R�a��P���S�/�K�;a8!�`���%d�>=)P���i�F&�S`=XU�q�Y���kU��QB��'�c�H�Ft��:�+1=�4��%̙ge�Q^&Mw�'���"�G7؋�l�M`[��^�J�8�3_���������КZK:W�{[T1��OLrQ�����r�N�I# 1���r�l��~�6B.�8Љ�: vt�P�?o����d��7fH2N�P6�3]�ǣ�k +�xp����[+�����BO'*�XF_��\6Yo ˫��(�4�n�6�86��с��#��ʜ2g���c#� b?��6ٱ�_!H~�#%_�6C������TI� M��-V(� +Y�i��A-ũ�}XQd�d�$5�Οֻa�_���=-��u�c������2YOXp�)_�n���8h�mWGąr5"�Y�_1��VŽh��NF�.��dž�D��lWpӘ�-��87!_W7�m�G9��:��^�r)�3��xF_���pTd�7�a�R��o��<V9L����6Ѧ�f/���'+���/]����:{�H��ceg2l��gDF�pj'E�� G��T��}j�u����}��{����$?��]1���uxQG�\H+�s4����NA��´1W5�}�R��7���0�]H���ތT^8no��K/)<�m�%�I��bC���ٱ�dGUv��l���I��zvȃ,FѨ���J�~9Y��_���w}0r[[�T�.7ݗ��1�_5��i`昊×�N9n�)e68�L-j?ƻ��%ABHX�Ԓ|":�忌mω����Ɋ��A?^%Qɂ���k�.h�?/kk-l�dV4U<�=쯶��fy��#��q��r�ܜ���s��9h��H����O�����3-b�H(6�U��ᎧT���8��2_`�:Ѳ� +^�h�(~�l��)�T?��c'����~|#"��_V�W'�[���F���D!���^��Οr���rz��Ԍ���Q�Y�W&8��GD�7�9F��⼵�mp-�T���'���M9`�}N6��@=g˫)�f��<�>����J��x� ��pux�C��)�n��e��Jϝ� +bn�U���R�'�F�㘁�`y�\�c@v�*�6��|���u4U0�B*'ެ��b�EVE�~�VP��v:I'%�gqk�Ʈَ�C#�r:p���y���C�S��h�},^������6���U�k�;J��|�ٳ���֘Q�6�8A䖌�3�FK6� ���M7qE̵`5K ��Cq��n.92T"]��k���;w�1@/��T���\��&������+9�� C��Ͽ +i9�[ +����Ɔ�,:� m��e�ˠ��D���� ��p'�w�X�h�cP��|����;~98:c{���MTA�$��J�ݵ���j�X�D\��� ?�tv6�����4�>vl3W�h�$ c$�?���E���P)��b�8~G�rZ +��%��F.s�'�R%T�{����6��;W]���.��2���77YT�0��4��Y���"����% FJ�����8�x\�Lz;N)aJ�G���s��.���U�@Tٚ���2�b|Cs1\A-�ƸWg��5)Bw��VӇ�3��������i2V�R�%���`��S�^��E ��:@��49�!���D¹c�Qf�tz�z�$��VNNd�9�DvRl�C��Yp��&���]AqP���g��ŧ�? �sU�� �a��c+�v���C�/�k��|r8����e�5Nv�K�wb ��~2�s��C6���{y(�5�Zc�����*�L��z��x �� M�z�J[����� +��n����@�Z��,dƲC��kJ�HNpv[I{ +���;#M�k���������nV|w��͏��� CXa���q���ي�Ή!m�[l&����ae��C�h=Ӄ�xOEe2'�H���Y�̼��w*-@>?� ����!�5-~� +�(g�g�.������P�h�-�p +?�!�]��2�������^���|:��G�XPZ�{�hR�/dd��.�VKs�ŏNV\t�d�7� ��bX��Zf�.h�V����~c��ҏ�5��������p�n�+�Wr�.��L�H���7Z�C�p�����[��L��{�ݗ��u'Q���ai;�o�_�W1�������A=�l0��+Υ�����\k������J�b%M�~���M�A9�!0H�zV��9[���<�~?�>��N�c&�sz�B����R���}�6:���&g������`�6�JF�;}�d�/�5�#6<y� +Y~�8�� �LU |G���;�9��<)u[��i�x���.2.pC� co�̃�#I ����b� +'#��-��B�����[����Kʀ@ҙh'�}z�y]">�Ka�(���2V�O�'lB 6f�7 �߅~��G���\c���w3YTԸ���l�k�U���l�&$�p�7��6��m�������-+c�Y�h��̥���@^��f�Ml 1'���QmyA3%Nc����*�6%�L�Xf�Zj�mO�١��I�yAسu��Zx9���/>$���t����U�>�K'{ ��nA��~��gֿ������;1%Vһ�����ܒ9�9��m���b��`ij���C2m��Q���3�->D,�C�Նa�+�4�Ne7э��1��w���3������3�8<����0��8�s1��LJ��TtN}�^�k�뤏W��5��ȉ5��Xx�HSŷ,(3��Y:�`�����z��~�SAt�p:M�wA� ��#d�Wp��U��1��icFM��U����[�@���ށ���!U���,�Rr��"ҝ>�� +�''���t����̇O�Q�߫)�d�1�2~ܢ��{�_��?y�����p�G��i�ٳ9w8#z5�/8��D13���� +;W��L�G��3y���]��`-,�Ӛ5TJ<������\;��k����E�V>9�i�-&���d�Y�6i������&�o)Ph��5bu�|��k�� ���[�� +��Πd^�˅Z�U6`p�W����ƃ�F{D�����:�{���u� ���8���T��V��1'QQk��Ӌht���c�Y�ܸN�.h��+ A�ۤ�Apd4F� ��;0X��E.�z�= O���&���� +��_^�9�ZbHX�z�%�����L�{*��h���d6����j��J�jނe�&� ��'�����n�%�{�t N��G�$�6o$���"�J#%�?�I��.�F���Ah�N(��'�U�^�SK\n�����(;�v�Bw���B�i�@���J�y�Z�߿�ha+{*�B��n:g�@�>!�$m��-:��.<r��*%Wn65�����|�AH�9o����n��*"�����[}�#�n��`$���2��g.;���n���Z��*q�a9�x���W�UM�/�>��nIX�U���+{�+9�t�{�b�d��7;;RDR�/9A�u���0+����a��e� !\ +!x(D��� :�I"m��@3�H�9?��j�Z����n������e>:v�;��c�H�"lb����&����u����9Ο�����_]��H�X�,�3�sc~e�k�� ����S�;ģ�^��co�"U|��`u�h��-�����R��Nf=���>��@F}<6�x�`ܞ9{���lWB?�|� +�p%��3(��Z�)=��]i�di�կhF�ʵf +����������˜���6�\9#6��c=bt�h��X��S�ʨn�#��>�P3/*�>a�O ַǂ� ��(g~��J�̙z�B�}�ͽs)�>'���8��A��͒v 8=(-��|1�����e��H�̽��⯂R_����P�Y��� L����드0?��fl���Q�?��~���12���¯�Un��}B{q-����Ǯn�i��MJ}��=�N�D�����K��vƻ� �Ϣ��F��o�C(� l{��(jd3�� �r � �I��)O�4�RG�~Ƿ��$�l�����xF$�{��M j�|%�$aJ��0?�7t����Gk+$ch�;�ռ1�R�Fl)�7��NVΠ��2�4l�M�+g��WjLu�o(�o)-���^�F�g��8e)�g?���,�%V=�-�T�`R�8�S�g�ׅ*F������"֓t��EA��d qħXK���<�~[Tk�[�+Ӵ��e��ɟ��Q�]�%���+�+�f��*�"c�y>rE|Ǹq$�j3K<h�κqf��ы�m�U�$�"i�DٔzUYFyM��}I�CԄ�j���]b{�E��i��ڑ�$w��G�\`<�Gb��n��L��>QN���Ү$�ϻ)]�iU�b�K��\�/��`\19�A�����轸G�Zi�B���r�L��U`�f���K���5����5�Ѩ�j23�[��i��s +��!Qԓ.�X�5��*�oXk7H�N����T���)��¶T���_� ����M��uS��+�B�$�W7����WkV�s~S2�����78����[��<�7�z�`���|F.M���f���k���^��s��G���m��ѭP�ņ��Q�v����?a�� �62��,tU�ƥs��� ��s4q� �ƪ�$B����3a�K��rRK�'5�h��l� �"��<;������.��������A��%Mrh��cb&u�iw'���mF��}e�\�]����q1�mY�H�n�T�j]�)��h���+��:�j//?L�,�֪�G=Z��q�Xvd!����vI�9|c�, +�\=}��!�"up!W�s]��"ޮrT?���{�T��U�(�ZV����/uG����l��x:NO<%y����<r�N��VQ��N�?�5UDf���#LE�x�uj:���k��6B����4�x�g�I�46��o� +�z�q�߳f\�}�+��g뺍����r�_n|Q!g��`3c�S��(X�ҫ)��/���6��A�N�9"ӕ�?Հ\u�e�Lx��X�Ym�(d{WϷ�sUw�P���������O����|O���yKp��A��S�{ͽ@j,��?HG�&��!��9$U��=���Q��8rB��F}��։�*-&���\������BZ�;2&r�\�����~�'��Ŏ��.V�U�+��a�CG�ԕ��&.�iWW������='m���H��e���z.=�g�#3f=��@v�&ٻ�Q����JF|Z�0;�N����E�p�3[�Y�<k��6*E�o*��|כ_Җ;b"� � eʕ7L��dy 2������Ne �m�ywpR{ +�h�1��ƕ���TB*щ��$��T��x��C���4�>��M�D�O��/����VǨ����-h�;�l�Ҹ$���r���Hq�}j<���Tv2��T(�,�L<ҙ���{N�{��|��\+�j��:���ڪ��2��T�����"��ZPDE1I��T.�.j`#�-�Ӽ�OY�l��I�)�d8���Ε���t���I�Qz�����c1*�s�_�3��EE� ��Z��ͻl>o�I9+J&)��5o�zB�P��S�;�q�|;��o�U�����=��?�36}�Q�9 `r*��5 +��U�������Ll<%���|��i�Ԑ7X�| ��F<}GB +Z�/���в)t��M��MB��8X�D��٭��t����]�ij/���Ⅴx' +12hg� +�d�#��DW���Rc�𧁟�s�3�7��k�@��r4c�T�}�s�[V������˟�XJ�nvvC��+��/�ѡ��N]�*����z�� �G�ֿ/M��ܫ�M@�a��� ��[C 9��_�V/�]���[d�A/T��n�i�fI�1K�{sBDȩ=SV��a2�S�m���MH&Z����ֹ��x�`�eJ��ƨ��Mv�|�x��N��^qޏ��q��h�3571.O����n��@��D���&�iI��NN�J�����>H����j�7& ���̚��&!�ZG(>�隙N��*ESߏ̢˴X� ݫ��&=6�֒�{f�A�ݵO��^vs��HX�0���Q��Q���c|�ޤ����t�x�)�s�����)<�]ԧG�.?�[���>���Z�����S�,��v����f�<軭��J<�W[8ݛB��+�1��y-�����R{���3M<Y�3�A�iӬ�R�=Y� +UY�Ax�^�]��t�m��H���y�*� ?�8o�,�t�|N��E5�j��e���������f=3���Cݾ���ѕ2P�T�����R��8�� +9"���ތ]��CMu 5�v؈c��)�(�ʍ��q'3�(�HOUiF�h�:�ռL����A�ƿ.$��b�F��a�1%H<p&����+6*y6�&s���q�p +M�O���;�.��8l����D��u�j�X9"�M_3���!$�G����gխ��� �#\�����+�"R60����~gG.WX�1n�O*)�5i��]/�HI3��t,����XzҖ���|ڴ��#UM�5_j��B�'��C4(���e��J�� +�=S�a����|Jo֛�����N��L���Pd_���1;�۩V�Y1����yt�����F���[mt�U�� +d�����Q#3T��YI��wt⯰���3�r�8A������&m 紜ĴHY\��,��N3��P�t����*E�f��ZV���^ʞ�?�X���Y4�&����ig訔��t�]������.L�"+�%�e"���� +���nWB�۸�_���t���MؽBD[��l6f[C��b��U�+��M?�y���O�֎"� ��1�@�e�fNb�$F���/1Q�J�$��aY��}7P�#����㽱%�\'F-9Q:ʟ�Di���v�A�fg��:��o]s�JUh���ic�=K�e����8-���A Ix����Z ��SӋ��c�o� m7�<ٌ�c���n�q��ԫ�ʾ5貲�>�j@��k���_uճQo/.���,6�`ˀ@�ڂ�4)T* ��`�N/s1��6ȣJ2*��S�ڬ�ʭ�d�j2�jTJ`��̯�J�����(@rA{w� +�N_YD�.vj��Erx�s!�l0N[�D�����yo��]^�j�v ��v +L�d�B�C~k�e�"��0�c^����djWF� }L_h+M>XHi�3?���L���6�q&{-M���$f�fgs�-k�������B�B\d��xR�)��(��K�,�d��`�1G~�������X��R7z�Kj ��+:`�e�v�v��f/Y���Å�� dY����fL=�m�,�����H"�R��H�*Z�3��W����J�, LΑF<Io%�s4#�M�Hb�)V4+����-ɥB�&�����Q7�S��R�E�����P�r퉉FmM���>�O:���֮�ө�������-�꺿���<y켭�N� Σ)W���Y�z$�C�з���%˱��7����W�ѪC�"o�Ds����1<��5)y%ȸ�i��e3���Y�d��z�*��e$̍��T� �k�%=��?>>c�ה띢�nLG\���(�b}�<tP�6e '�k-�4�Q.��H���i��r�%�L����Ѡ>|��-CS+���g�=pԔ���i��e%�m����Ze�L�����k��Ju�м��P Q�M��������f��p�f������& +U�=��ݺ�cg�^�}����G���'� �{�9�6��hd��9Vm߆#�~;S�F�]0��;�OQjn�HJ��x���kn��\�����5��Sn�r`�?�V?�t��v!����~ӗ��"���P9s�ȏ鸅���LJk>�1X���:o�w\0 ��"��dO����?l�Ӓ(�`Ѳm۶m۶m�U�l۶m۶m��~�8?�22"�q��{�_����[m���K��Y�P��gbI=��~�(�� &`���h�Bꞿ���� +&�|l�X���d�,&�*��y�)r��.Ni�x��^��@߲i@ddL�R���b��S,�ɗ7����L�ΐQ��-;k_L��f��6�>��=�RV�,��S���r��P�oC"���H�sK�K'� +펚2�V,�4a��_�Ωi%P��Ѳvm"�a`���fō�7),B4�G�(SK$�H���Vdrw��@�3S@h*��ͳ���P���c�<ͫE:�k��.�gs/[�a~4[w|S�c��dysx&�$_ i�:��������8-����G<qv�,��>�yl���j'�2�5 ��?F,JN��^��!���3Y�%��2B`2�\h+c՚��j���)HF��*EU��H�*��`�M��$�N�+�����@(/�Tlˮ�^(��6| � �0� +��o���?P�Y�Y�����WQ05����ȑ��<�"��2e��'�S�Wj$�0̏(�Es�bA4���.�4�h�DL��U�� ��MB H���2� W��M�u�}>ۅ�}��|;p��j��g����W� +k��1���cU.a +�< �Ǩ��։M1���cg�脛&�A-�qE`�GA���}ĨgRyRì�?g[�i�2�׆0�B���a">^������{���=��`%�^' +�����bNQ P!��������ѱ����U���#�a����eI� ������۬�ב�����-�i�)���V�|~�B��� w2Q·Vۼduߪ���)�4��8`����X��W�e�7�1�9�7��HW/�������� [��z��oVK0�nf/m��ߜN��4�%UC���������F�j��XI�Q��Eԕ��U�6�+l�+Ln��� g#�uI:x�I�4@��������a3��z� +�é���c��o�Yt��-#;^���� QTb�� ܂��Q�Gk��l�T��5�]�a��A��M�m���3E��!�er'���y t�IC����D�>n��k��L���(��������s�Ү#8:��5�����H��K3]�l&�����(n@�Ѹ�x�-�&�!��m�"�+�`�6}�H��.�H�����ر�����_��� +Ο>E?���]y���4��g����>��lc�5:>��������ɴ>�@QUU% �����i3"k�]N��. +��a<$eOr���Hh� ���k)�a��A�3`q��1���) �7���~:ߒ��ʛ�� K_��k��N�_��HHg0�V5b�Q0+0~IޯV �چ�1���SO+�=�6��K?�%���K%Vu)ީ<���� ҝ��� +����d����d�Cwd��Y�4kc��Vޠ����uQ@�Y�A"rzάm�u��*��4@��0`�3O����?@���}�<���V��� tGI�HU*��3��uy~3�zk�@�g993�OV�T��(�`{l��B\�Lg�hZhOj�RM" �~3���/�w������5�-iv�tx�,�ȗ����5�9�¦^;!�O�(M����"+L�~������$[Co����䠋��ǿ�JQG�?�/I����QN|�mמ�KA4���5��*Ap�|�ĵiI�o*83d����e��ٺ� +�W D�Ę�cԒ����`��F�bna��4��8$:y�)�MG�u�Z9�}��E���( �@��=h��p�O�"M78LV܈�&c@�x�V�w}4�O/�՞�n�Yڏ��K��3�s�l��(1�˹��+X�$L�6-u��r1^���4�$݀o�n��&8O5�w (A�WCg�����+��;]�dm�a��7M|ΏɊ���簁�?�de��ȨH����u� +�]�G�ILpѣ�T�n������1(�^�6�^ @�a ۟n� ��*P>�խU���&u��Z���C��X�Y��/����������9�z�.y�~�tiE}L�x)�GŅ���'��nd6�����G<h-�9��.���W���I��҄:�d�:�.�p���%�v�42Z�/c��o��Țc��*G�r*bbA����g�b�#а�ț�y����X�tQ���������%����xǣ��s�]W-z1ŕ�/�:�8?�_o�N {@��#�n{)���oS�� ���rhR��(����j}8�ɱ5g,B'�F8�\ty����{�*X1Q<T#}�>廧�N�����ͽ漏U�zx%n]���z��q=p�W�T �PQ�&@��3q��}#� +�y���px@q���/L�oㅏ��1U�6sл\��;��J�� ++�9��B|��t�/}�u���*էE�)� ������O����=��u&0I~�3�i1Z���_�wf�fL��c��5r�Z⠘/��n�&������0Ѓ*�Zk�C��Tq���֬Uv��!�L4����M�����F���R>��8�^qƺ>�ı��y��@j��?�ۅ���A0�2h&���nP��U\�_<ጢa���z1U� ���'����$�2.�Y����90x�Ck9a� �*��|E/�܉�����O*f�8���fH��,E����e�j���_� +ꈙ�)��M�����8�?*��OP���� ����8��1J���"�S��G����{@y����t�N���ҲY�c +�4D�푑�}�a��z���;)� +=g#��Sƅ�^mG(���՝VN$L2��Y�S��Rίe)�ZJ��9,x�%~� +1�`�g���6 m#���s�|[���en�k-W��A���� \(s�7*�����f�b�X0�� ` ��o$�0o��Y=�:���@.��8f/"C�������}߇c�˲���� ��QJCc�R��dP�.���w��4�,��|�<T5�M�pڂ�$���N���>`(�s)�e��s�\\i����%���I���U���R�=�t��{ï��ےj���O�X S�j.f3?G;5��YG[0q�Ct���$�1��[$��-x�Т�� ���`�mU�!6�[ 5R��B�"whP,�2� +ⅸw�h�?!���l������i��'w��y�g��oƁ!M��o)��: 7�XfЌ�d=�F��rq\����s��JCۋ��0Pu�@�#�i@~>��Z������,Ef�s�{�G�b�vVZ�H�����]Ι�H��$�8� +6O@���*�~�+BcjJ��8"��d�BT@u�������#Z'���0 ��J�a��l�aTx<�ܨr�[�u,]��IKHV�аQ�ܶ��0��� �Hȩ���\�߾l��N��T�)Ί�-�v��c�~���%�g(�Y�ɝ�1���ue~��"թD,7��P�|'�0�߅���: ���M�T�~�eR�I�p���,F.;�����;�Au����Z�?��7b�&� �c��D��ye>�9�~�ե����f��Jh����W�mV��L�P�fWW_q�Ž��"ל�i�nMu�纫m�k[4�-p�C̨a��<~�c�����J��~"�5�����d�����J��$��F}�N(����a� +���"l- xR�۱d~�K��j��ߞ�T�| ��nj���7��ks>���r��=5 +�;!�� ����=}W�u5%�JL��� �#�eE]��ZSՀ�-0F�~l�8{}m.��7>X�ϖ�1�k ���uq�+W��"�~D�g�T�p@���n�O_ @��}1-`��)���?���qŒu��6P���A�r7>x.'+rڌ�1�.U�p����0L�P������j�4�s�-a�|q����" z�e��8+�� "�1+�|�ى��]kK? +��ϊi�͑��.��h��� +COJ��\"#�w_�V�=�U1o� ����!ư�u���O7P��x��w �ids��N(>u 36 +���D|������p?����U�ۂ7�R>}�4#7�g�UK�bL��2F]�t��#�����}<�<��������^�C�j���*��퀽"4�����Q�%�@���K;k��1B� �r�[��e�ۃ������S�q��[�=�d����d��i�[!���v���~q�SG�6}%�lu��&D�kQ����dX��bUy�*��@��#%�AB��ͱ�^�X(��uJNÜT��@���?t����%��h'"r�#mB���d��_���Yjg�����6)�q�ȹ=߅^��j��E�kUf +�} L�Ȼ���������Ṫ_\�~d|_���1�����ɴ��6I=��SKԒ�ݱ#�t�����b�S�K@�!̱sI"�5�2���r�'�����A8��?k����B{���q�A2��i'�"\��𨨅倖c�i��^�HZHԑ������i��l\��ْ>���g�o���Y��RK�^��!J�loig[u�@!�(�cR~\��^�y�WV<O�d� +=.�C��`I����:�νF�0���*�<R"��?x��(���^���)Hչ<��^'|g�.� ��kN�=g�Jl���?a/�/D��M�6��V�gPap< ����j�/�<����^�e�+�Ʒ�D�8�\-�� +笔U��M�Z8�O�\���w"w�&{oK0qh���/b� �B���D ]�4��Z�����l�bj��M +�w����!���Hdc?mvȗ�+�a��)(���m��3S`K��HUt�,�IU�%��|?;���LX�p� +�Y��K3�;v�羴FƌX���B�� SL�����`U=���t�8�>���y�}"���Gu$��!��U��FӾ��;�{xb�$/��*m~"c#mj�0�.�オ�<l0aH�祅����!_�$\���\�U*l��R_Ah]��,���h%�MLL-Т#�q� �,�9I4��a��<�YJ>�r��4:P#!@}�*���0�вݴnS�j4�y"���܋���z�͎�kHY�m��` �R9V?����Ӎa�8ҠrZ�������'�^�jp����< +�=Ӄ�H���5�T����i/���*J~LΓWe�O���Oז��ߣ��n3����ǏV���R�s�ۣG����n����N+��I8��4�8���ǐ�A�,>xzv��Z��hY�r�����Bp6PH��i��X��Kc��*!��O��Ϊ�����(_�����$G~���Yf=��)��g���CA�":Q���z\���_��=��w���@[V��Ds��� ��c���O�%�U��\�=����`*EQw�Ь��VF�b�y��s첱��g{��r�X�2XSh2>�<��zK�NbG��\K%�d��r!�F�CXӁ�� �a������MB���z�V��6E�ڰ��3�<2�� 蘬��PI��}�LrC������p9��2bR��u�G��q>k�dg�>��r�D�N��>�s���V$�z�= k���"��b�?�x'��cIBn}���/p�j#e�*Y�����H�������2�˻�ԝ"�� a�pM��H�b��E��"MW���zt�-���eF��f�W�v��72�D�7}sr��衪���b�#�1h�Π��Q�]��cY7�O��-rIF̂d�.����Q���f�E�Ű�U��s�U���&��8p�!3��AaPXH�yq��hG�g�`?�EL�.�\���<���S]s, +�^��9�)(���7�ևD3�Ԓs�g�(Í�3���jG��𥦵b+�W6�T^�D�a�W�e� �����W`q�{�z�ާ��A����9���u��w�7<�y���{?i��Dz9J}bR�4�sr��� F��$ ���=>Mr��z��8v}��T`! ���P�>�����É�R�ϑh�ٷƧbU�����-��M-ap��^L����_��U�)`K�a,�6O�6tź7�*���J��VOQ/[bӯw$u+�YћѰx���8�8%�k�tI^v�L:6D�m۞]*� +�)~X��|�%���a�a�ï=�;��L˧�H����ب�E���-V?�l�n��X�t�1a��%� +!MfW^'�KU��i*訢˞,rg����xΰ�aR�� �C�.{�'�);ߒ�P�b�]H|�䱾�36�Ӈ��]LY��0����I�pc`Д��х�2�<�>�A���L��F�I혳h����+�~��k����#��]��3�L���~2��v� &����"���%�ЅMf�t�U�ꭡ��@� +֨#S���T O���&�ޒ�Q�����u�+HN�T\6&��+�9���4����kՆ#��s��ydG�;����*>��'�B��4�Q>���Xff��E���]��CS����M�E����1]@]z3 +�$Z?U�͉QLjM��Z�P D��ܲ�7c��pEm{��h"������2���{)���&�U�� �:���.|�*����^�Q����ID(�l���4�����/\z����ь�YqY��,/�ڭnv �� �z��R�_���e�z���e�N�J���zD ��1Z�z..��z��"��l�53~��v�ept�v��Ev�8��0���ʲj��������!N���f���(�j6���R����'79���#,o�ǭ�ipjq�18L�(�P�=%��]�G1��G:!ӏ�����0�M�3�G�I�s�CS��N���@�*��̉8-���@��KGoV;�� ����k�H��"���M��7��uM���v�9H!#!�dot�^-��.:%4��NCku�La���CX*�N<�l�d����ˀ��,,ĭEA����!�l����"�п�Q*�1�!}헒��>��?���r�PH.���-�W�h�b�_�Q:Ķy����I&���g����K�oܒ8��9[��1z�+@�.}�x�q.��4 +ȟ�[����a��/�/L$�"���<��m!ǹ!\w�'��f��ý��v!����xc#2����\tM>Ĉ��r�}mL��߾/�����M_���T��.}���O(\�K�@�D�~�]F�M�9�O�8[�5+�_;� 8�XP�.�� �`�Oc��������V�|ү�_Νj�pD +`�SB3���� �U��G���:�&�Z�?����y�(R��$�Ic8PT��.�w��; +~�lߤz��ﺘ��X5;��V$���8��D��`/+F+���D��xY��6����\us܆�ߍ}�/���8������r\�}����D(���cm�lQ�m��C��������s��l�R������P3���[8+#~�A&~|ȹAZ�L�iJ��X��{)<]_�c� +ӡ�� t�x���Nk�^������=fuQr�;��E��NG]�2��M'�j�����q��)K����iw���m=ѧ�"Ə軈��/G5�oGDwwr��#�����Ȥ�Lfns=�F��UC�9&Ai��~������;�N�A�fێX�Wk4?���S�;��`�bE~�EI'�R��>Gd [�G@��������Y}����&A��놔/\��w?� +�\2�h��F�������$���p�V��E��U�n=�d�;�k��M��eX1�ˋ��� �)e6�-�u���R9V� +�����3��?Om��;�_`�&C^��I��/�R�ZC�o�����o�$*iT��Cn���R?Q�@�#B�(,&�ss7�C���.t8[u�R���5����_`J��7h%r6��q�&�p� ͍���"F��w���/[��[4\�,�1�J#3�c*dk��j�U[K嫅k&�;�3@ύ6���/kr�9��"P��u���i6ʍn�����gQn�g�2ϛ���)A���5�hJ;�|W����ӎ_��A'B�ԉ)E2���1ur�AmI�F$Ŧ���ӭ*E+�Q�[�n���C[ɼ^��A�^�����Ϝ]�vG���M\��<u3Ok�RO��Zu\�b�I�� �Ҏ�d�\���'�2���R��|�� ��jehgm�Etc[u���5Lh�s S*�������\���L_�E"��rI9����j�5���màO�u��Q�Z����y��%ﭟ^�_��`�u҈"V�>e�%;�I' {>�ҷ�h��τl�ȳ!���ǐ��J;K�k����I݊�s��bZt�6vW�Z��HġL����UQ"I������_���7�Ev��J��q!�F&pc4pɜ=��Qu\}����/fCF����-0���1f���y�M~0�[��5C ;L&�xZg��ђsqI��M��=ܣE�o�Оi{)���J�/Y��כ�RH�w +�������>c�M���� L{�r��yƸHn�O~e�]�[��X���ϸ��AF��#�Sf� +�ݾ���(�9�pv�ͻ<����6`�C�Ts�1�+��� �C�K"q<�_$�o2���'���lI�!@�UZq�;��Ga���a/ܧyܝ���E�k�2Gs�&?w7�/� �����&͞���s�X�����v$Y�a�9Zƕu +�WX�ϲ�]��� ���´R��b`X3�L�)U�h <�٠�7�h��2���Zr\��@<�����W�;�o�����9*6s�( (hs�ac��~�2!]��� +���f��Y�D����m +I��t!�,�Yc��x &���4�#]�\��y[1���:^�3$��hb͔έ�������l@ȅ��+8b6���7֠-�P�?1�G<+zӘ�H�R�z�j�YɁ��q�h��T��a8]� +�c,�� +� ��6��g���y�dw�9M����1D_͜6�}�2w_�@����f�gLiǤG�����.�����@��oR4\/f +����ǫ��0�,wT� +��XN���(;��&��$Ҵ��8T��B��'�7`=�C��F�����)�Bq{f�Q��憞�o�2���9�����ʁ���Y��)Ө]P��|v�a��f��%��2ҷHb~��vKB:m|�d%�QW'5cc%�윖L�� �J4��@Ng��@�ـȋt�M).^�n���xN��a&���D鋁���=r�,�Lz8k��*"^�a� ���n�F�դO�][�3h����S���s�82����U�b�ܼ��)a�<��j�}��l�Ny*�k1y���_d�U;��)�=t����z�G�B�"ޙ�X�r��~ +~|:T�·g����* ���}�����M��py�lDB��b��1�wٮ����L~v�S�����OC�x<�WB�O�M ��tuG�U�'_~m~�¿�$�0���J��cWQ�}�UE�]'��-Y������_G��Ƒ�o;R�Qǜ��81�2�[�v�F��JR]�a��Rx@�~�{c8�VD@"�l��;t�p��2��I�T�J��C5�(|�~rF-�q��4��k-*ʾ%Gc�,��k�nӞjK����V�Y +� +i�Ge��}�-Ć�eY�B�>�{������.��u4eL!x�W������z��o�$��j�����w��To�q�u���l�T]�m����=�[��&ɀ�#�Y$����?\�J�8vm!�C�=萟Z*_n�D-rj������t+����D&ى��A-��]�́E�����x�v��j��ú�E�:W��ɕ*d�����"���79e��e$_|�J��K�e�|��5��CA����Ķ��.9�p� �8豛�Mi���Po���ŁC]"sgSϖ����`�9�K��'�� 6�!?C���<��*˵��7�S7E]�[F������o�pg�l������`�\_��b f|�#�@��3&�{�����DE�-��֥�sI(,>X�tM�X���Z��B�d��R6Ъ�9Mpt���+�|ٓ����sB����IB��+V˙��9��9�T������B*�b���)e����$(AL�h�k~��!�d������.9@<��Q�䀙�?��s���F�W� +��3���`Co�+ɖ�4�G��N#N��~�>��B|D�JQ~�Ҏj�H��9��*�]!�=�hu�f�Z�'�@�;7��W�f3Wg�c��Lq�c���N���s�4ξ�\�j.h���Ml0=:x�Й�{}�˅�]*2��;}q5��X���?�df,0d?��W�dc�=�y�\k[��~g��^����Y>]r���®�[�\��81�T�|�ִ�#����0����n��,���j���lXis�Z���'Ѥ�]����6�Z�#�Y9O�r�8rQR�@*�X�!]�cࣼ�oT�5K��F2��b�vפ�t��| ��Η�+����A�@���0*nO�4,��U����V��U1�G1��^����t�\�t4��?�[?����:�I}��zխL))k>ۭfFqHPC���N0>�����`�I�1����w��'���A�����Ӄ��c�۷�r�bF�)� +#o���{d�D��0T- + +�8�ϩ�0��a�ߵ�w��, +ɹ5D�}<�2��[6�?��~� +J�Ej����-�W�=�оs��d{����3��u�AI��e���c�j|�(� ����_Ϊ��[���-�e�+���|gK�Qls+t��v;_d4��i� �bn�H��z~KMJ���5�o���ON�2�쿏\�-���Jg��6� +�4Ejv�|4�Sٜ'���[�a�`�X�1$N��T:|���e?j��d�C�g�N�r�!)N~�+�T��(HݵE(�/�̈-����ٙ͜P����ޱ�<��le�+P��������&hv�`.�����8z.S��-�������QB��jH \�՞���� +�8�*��Ѐ��x�Xy�,�0�i-QR�!k�Ȗ��Պ��5�KR���'�d���ZO��{����}�Z��ЌRYMʚ�tߟc�ytJ���}�Ӓ�gf"��F�!<���l��M��"eJ?��P,9Y�K��L�G<�s���q��F�����rn|K����k(��*�Ҭ���<�TBz�a?�����[�䫈 +x̯��(N.�" ]?�k������S�<Z1���۷5Q.��u�p'|�E�g8�8�J�d��x�&~#*үO�KG�� �V�Db�f||�͗ +!���t�՚u$��ɩ�IDF|әA;�^��X��8|ѡ��S�!�����c�b� �p�]\Ƽ0���0����vVWn=�;"83m���1l^�^�3M�@���h��s��mA��1�l��o�@Ț�xgl����ߠ���]���%�P�����ly�O��M��)G��sIy,��6u���v��+p@�ë���~N(!�}k�r�˦q�-J:^@z�$|������g4 Ohf���>��S��WPl���}B���|NR2#�VH��3WM�H���a�mfZ9�r:Z +��P�� �,b2�H ]��������a��Az��Z���5�]�3�x�r����8Gw-M�|��l3�:��^��ހsB����MA��$_6�)#��.u�D�V�|�9p���N�����0Cx�KE�?�9C�7Z�`������)�YW2�C��]��6v�n��@��"5���ߞ<T�I*��`��ᦠ�u�5gPk)q��>�^��F��L� �,�yjM�N�X.'mѹ3�����>�G�&h�"'r��>�u��2�<y`�� ��Tu�^��[�j��Z�����cv�2�]ժ��V�3$��31�pP,{4Δ�IJ+B�� �w���ccߍ��e��K+ݷ����L*6���ݽ\��8��H��K� +w����ͷI�ѸteBM�GeP=�b�L�B �I������� �JZ1��/��QY�n�$q�&L�J�|V�n�-���*�g�t}渻m���D��_e#\�!�E����9�T��Q't�*�M��)O1�e6�<v�w�m���¶�WC�y*3��5��`��0�H6�#��v�+��~g�^�៦�fE%R�Aa4���`S-�H�j8|`�0D�����߿���R�EA.d�M����| �_�kR�Q����fy�U�E�i�c#�\���o2����m^}O���A���{�!�,s,����/%�C&���������C�`��+�h߹d����8_Ci(X�\����T���Q�p�A-���aJ�x`�[�(�ѩ�������$�[�3�U��BΩ��%� �b�\�j�-µ]�,|rV����2��i3G�����DBs�В ���z��JF���Ĕ�\GY����/X�bJ����%/c?��I��4�'�1��ټ��Z���#["�Y��������i<�{����&�=��T;�2�&��)�k)-oƱ��}�Oy#GE +P�h��ͳ�Ɨ�*橸��揫���eD2f���%�0l���W�K��j�&�Fe�X�"��"=�ǧJ"�)'F���\������֛��\����F����w��I)gE]y��[ ����=��z�w +�,������5��ɯ�"�}w�W8m�j�KĔ��hS�N9Zy�~z�� �5?DEV �SfU�5"-���?f�R������2-4�7>:&��բ�M�DQ�� +��ʁ�N4b�V�Y64!���?�@����D�=�r�+AIJ4���B�N�0��]*��V�pc\�<��30�8 +c\* +�t�����i/���8�}E��7��x>��<�vpa��$ckǍ��.�tdҨ��G����=˦��M����T����BQ���D���({���u"Zt��w�| �b~��u�������Lxz�e��k]6ljYH̔�Il��9���ز��'B�*��飷�.?���T9+���߳�H���ڝ���đ�%T�'$�&��6f���:�̜�8��Ǵ�%�,�B�|�B�eiW�a0O ����v��P]d�H:���M�b�5^�S���#�a�Omf5����;�hBHFwj��e��7r��$��r���XD�0NFD\��j�:�}�*��W�x?g��g2(˨7^�( ���i��2� +41���C�$�|�Yr��J�X�Y�a��L7H��+���]_�g�[�Y�ہK�K��i���Te��F�������i<5����͛v�{M8��@Ԅpw�4U^�Z�3k��l/,�*�Lc���r=�ѓ�<@�e�8��GΏ�)\��=(HR̕�O� �PrU4�Q��<�cw��͘&�>ӊ�W_I�����:� ��Chjԇ�(�]�;�oy+�=V���X�g'�/]�CۗX��!��~b�*�̜i7]��s�/N5�7��d=` <0���@�3�f�i�M��C���e�\k���[�c�Dz�C�7�&[�6�SdQ�H��9c( +}Wܺ����|�:jY�@��F�><*�A���.�`v�X�9{���� ��}�6��"G��]TQ~�Yj{��1��`u�kT�t�t,��5ɟ^���jϫ]�Fѯ�I��g�!�JE�������(�2���g�nI6M�`Y���������|����89�_���{�#�S�nm7�Cƕ��Z���uk���Tkb6|J���a>&�_�'E#V�a7��Ko)3�w��8_H���W�X�.�ˢs"��9UNl� +���N'r ���crZ>�==E��/�Fy�����Ew-�p�C(C���)�u�:#s{��������݉��Vw&����� �]T���M����U�� [�61������߽�D���DZ�V\E|���u�1:ps����X�lI�]���H��ѥ�Rt�m0� +�xR뜲][:yL�:�2d���`�,9/��g{|��ź � ��'_�-Sk����.�4����ذ� ����YD�#�� �W)g����� ���J�0���C +�Vi-�gE�� +5��H�L<L">���I�������#_��]o2�6*zE�]��h*���c��GYS�-�=r��Rn�[q{�Z]���� X*���{��'��;��̫����OG�y���۸����,��0�7��/�D��7���V;����*5�a�#���#v#���({���BBT�욾ղ�P��z�[��M��3^��m���ȂB�u+�n;�ضao�z���օF@1��y�5Ӣt��� ��ޞ�� +��e���u@�;�M�fH}��Pa��x�它�u�l>�"5�@`��X)L��/��ށ�|���hY��}�r3�U + +�)���4�N����?��F�� �x��w{�tE/p}~��RTf�3�˂J� +� +BP�[���!����s�D��{�:J.;�NUrx�2˾��%��FG)8�Lp�_�&iA� d8ǒ�$݄Ç�Y�$B���0��s�I3mG��λ~�Oڝ���'B��[ia�"'N>N��}��YQF�RT*��tˍ��m�\-��F�ŰM�Ȍ�5��h^��&g/#�c���Z�v�53d�Ώ�R��2��?��:�r߄���[�D0�0O,���"��4�x��H�����?�o/�ZP�;���kv��?.8;��g��@��y4@��(���[u[Aĭ���&�8rZ 5fH�!HK�ml��M���$�GgF��)�B�΄?h�D�t�W������xƦfI��W&��� +��-���:)4%���}�q�^�J��GSg�ed���t�1j�<̏B����| + +���`X��8:2�����/2@j�w�0'�`bB�wIG��ʿ��O���̻�-���+2�Tw������_��3���6Ք��"VT�e'+��i��� D� �15���P�O>����$"i:��|�Lj�M�f/�R`2���j���:�����L�lb��ݞ�z��#����q�!����_�TZ��Cc������Q��{;������5�`��sS�M�5�]k��T��0�����X��z��C�������b�l�D�)�(���@�&~�}9Oi��wѩ��:Uo �u:[�ғk���~FU�;ه�kρ�y��s���I@"]� #��FE��J�Nb��!Z6 +� +F��1�O�Ƭhfm�#��Q�L��O��۴:�;oNb�����P�\���mH7�F��&�lP%e�q<4CC�Ge��$d�J��:���%~��8u ����Òi賲7�t�Nu�R��5#�24no�Ɍ��V\d�E�RZ�[�[��m�D�t�gq?�� �n�J��1�-�<��}D����(秳Nc�f����*���xG���֎���I`�?"�f-�{� ��@j���� ����s�4c��4�����z�"S�ob���a�d�X������ +5e�w��'i ����<�蘚$A n�A��14-�}P{��u���wA-H�{߀n �� �L�6�(�!�L����T�щ��/&B*Tib\����&߮t��I�c�����H-�&D���7t��16�B�����bv���d�f�|�,9ELX�e6�w���U��*,%��F����ns�W�L�.)���J�v�3>�_ +L*��;��}i�⃙��K������GTwk�I�/tv���W��^`�o������u�߰h.,hmK��՜�e}�|���<�ʟ�iN�B�������2��k�U6�wig� �t»�dz� LZ&�������L�Ed7�f��4Ol�a{�j�`�i<��\gj.���y����,E��3��>��gl�� z�C�ʼ��$��v�++Pual������$د#���D<�9k��Ȭ�7H\rY����L���m�_�d�z=e��@���0�kf_L������Dǟ�5��p�if���[:��8�(L?#�:�D�>��Bї�gp�A&�/�/\Yg�fq᧤��TA�6��y����X�ce�nC���������>?���V�S¬Nss5`URԛ�ug��ZJ�'V�u@}�= �a�ѕ+�����M"]g>�ze���~�t��ě�'���x��F���u��(ʒݶm۶m�m۶m۶m۶m��7��oX��U���L2�9�L(rlu��gHlp�l�o@I���П�H���6�ř�'�k�+.�����X�ފ�7CsnJv/y?�X��1��u:`K`���!�(DJ��s��bJ<���(� �WQ��ry��Ҋ� 2�a� +� +,������t�*Q����f<�Po/���w`@����.u����sAe#Oyf�斥��%��p60��&� �$��2�P�ܥO8Ja���<��]#o? 4�j�9`�z��ܯ֢8��$>4�9<tL����mف���:@+{k8�࣬�#:J*��:��7�M�H���\��j��g�,V��VY��r��zQ��@Ȉ�t7䳃O/l7|�����s��^�: �0���J�E���[,^*�,+[r� +�<��@�ї�8�;�I�����m�2�f��u&-aW؍{�zv{�V�c�Q����y��p[YL�6����?���hFd�`s*\e�ǯU��xO�OB��/��I5��YP���S�� o�� +�j�E";ը�S�&Q�����$�C1�6<��Q�a������=.Í+�M�%��E��}Q)ęp���0JH�|([@h!��O�;���ҋ�)$IR|a����7��dZ{7�r���"#A���/��@t1����y�>g��}_X��HO��Sb�8i���D�1��X��(��r�Ҹ�k!`Հ "���`to�#��5L�����V�1�xw���!����&�]ǐ��Y�0A��]�b��~lV�R��i�q�n�m���"���o7�,Nf� "���eL4��!/kv�C���!�5���ۂS�Z�$e���� �|π��?T�1k�P���q����F�H��U�U�%C�a�I<�rL���@3|1�Z��}k@��T� ����+Z�Ж�0��}N�W���9�ܜ���&>OC}]���U�*�7���9B@��*] +�#�e��/S|� K\4��Gf��nf�����g)�_��j��G�<������~_�ɂ���jļ[����T��A��2�j�-�_薪Ӗ��?R2�Qg�]trx��I��a�"�۩F>r���� ��*� �H�x���l��oX�e����1e�L}˭�c�7��V�A�^�כ����ݖ�茸���E�����[���[�= �b?2���{�����*�~pE�)�5�Ģ�� ��ʽ7������}~ާ�T��FJ�#o�� �gG��?{�ӑ�Y��mO����N�ުn*�����i��N��l ���R��\^Y�� ��jW��Np�[�Ą��R�(��y�PJVb�3�:�����/!E �e�濢����� +���i���%�dH�H[^�_�c��"�T,�>�%D�}�6���F�ia�#�2���a�����R�����ȥ8.�D�^a�T����\����r����`��Y����R�:�s; �`���`��v��k���٦~�/|��\�{`B��8��fZ�[����w��R��_�d]��!�Y ��8@K8Z���Hm�o��i�YI�����8�8������v���9r��A�o� .����M�)^r,�����O� ��a����!APBz�L�jc�ٲ�� ����Ǔ�3�$�M>���G9�5Rش_L}5�Xr,�V �<x��z�<!PR���Iįj� f#m����6�4���.�����b�{�r���A�l���Y�� �j����1DX��-�N�I�� �(�Zf{v\B�=r9z�U�/g;Y����}j:�[��Qm��q&Z&��� +��Dx���� Me���7�x�8�2����j�� �rÞG ��縱u����\-����d=��+����"*�Bĭ&�>�١�&,I�7^�� �����a�"���|����`���L�!�';���ҷҝ��x�1m��nc� ۙS�-�G�CI��l�qpm��'�}��?�r�꽳��捻Ӭ��'\䞶1�'�4���� f,Maɷ�X���N�f�gN���z�% +��*/����F�^�2I��y�����}��ݗ�(����֚��AR�a�@ҽ�T"�O����K["���Bkkl�q+N�PV�j�Wv����ʅ����ע��*Q(�+m���d꿿�P�*4�� �;��Pa�^�f�y����p���}���HR�c�n��!(!�&�����I�����3נyֵ��8=�Ez�R��c�Vh�kp�>^�ni~I����$cf��c�P"� �o�*Y��j������c�mb�:���2 +��&�&�[/(��I2\���s���eC�xLT���N��F��$~y��-�rM��$T�L�y��-L��;~��n3DЯw�c`�R� ͚N-�o������)��+�/v!��Zg�v������P>fX��6���Q��gψ�H�6C_j����n�6ed|Uh{��Q-��C�Z!'ܤKh�v����� 0�B��@�a�@결v�of��p���jH0 S�]�j��;;�2DM���C�}a�g`��˜\�' �h�W���j,-��Tǜ�Ο��GM0ȍT �6�9�o�*���4_g�d�#tN��2���4E����(�&:<���E9�+r�ZyB�������|���݇�ݴT�%�)͊�@�'!���6�b���9��t�U\�J%ˑ�;vw�P�ջ.3�ψ�tU�{�U_O~j"s�_�1����8h���0@�kV���qf���M��R�1c�f�OZM�H}d@jKS���,^��;�`ϩ�}� +:$�6.]Y��#=�q1�` ����ډ���?���j�(�@�C������H�����l����(=2$0�җ�����.��OE�*�?3�8�D5[8U�ɑ3���"�}H��<���H\l[}S���P* □A�o[$Q���gu����H� +�[�JKe��@u����`τ)zp��uU��p�S5¿Һ���1�6+�tqN��<�������6�p�HByQx��-i�D�Uv�' ���X���2�<���l#���sԆ����!��c�iH!awT�#��m�pG7��S�T*��������z���ϝ�+&��_�N �k����v���'�$Lg����c�W$ �xa���>t��Z��`��������3��ԫ�:�Pl�)8[�-N}>�'_u<Og�-Y� +&��Z��r���'E + +8I�7�u´�qo�W|,��+���M����oD�.���j��*�w�=h�1�P�?�fS I��k���0])N(_�S��x�])�K��*���x�qHI:gRY��i��%Rƙ�����U�s��Z�~���<o�����QRFU���l�Q�PP8z��Q,Y?ja.1x�e�e��!�ʧ�$g�z{g��sX �z�{�lr�����vR=�^m�B��f��b�����_?�K��jr�M�] +�b��S�*-�-�e�i'��`Ѽ�O@&�b���u-sT��A���f���F���=ɭ�D��W���*ɶ�o���vS� yW�)������t�h�T��W��&�+wrm�zvY�ah��-�{$�Xr�.���v���s�\Zk-5�[��0���������-14�b��+��BM_H/�h� +�ױ<�i*tM�ޯ�\h=��I��X|8C���(��� r�>��2rpR����~ +5�օTA�3-?g��#J��� +���rl �1;�T��Y� N�]'���l��/]����(r��yt ���㰽��0�*��b���G���� ���7�������nFt=�(���s��A�>o�����E=JN��9o`�SX`<��g��k��������X̒0���zaGUL� -��WѠ���JI�f9u�����SZ��(,�*�A�-�i/���D��>Kl�j�p��Ħ��_K\�#q$���7n��� n�NC5/� �EыF�>e��GDE����P@�6�!B+��D:Z��_�;Փ�����*y+=����ó��Е�*�ʰBi�)�K`;�0�e{ ip�n�h�U���>s��"DcO��=�5u˹@������$�"�I�z�ހ�� �I���ŷ��&�\��K�I�h4�r��.�ȈgU�n�$>F�����]f,��YR�r݀Ŝ���PF�?�P���.)}9���O�VZ����2dߜs��������[�!�씺O>0[���ʅ��wuʇw�H��?���^�u˥�����ܾ��O����7�63项yŷ�)�/0�rUq ���g��� +��c��U��ek>�{�=1�t�թ�X�u�ibM�t�/\�Nv]���+���U�V�����wP��̾PEn!�<��+ +Id��BTTD6�&���W��/�w&U��S9Q��RY�����is��ۂr<��0�z������ +��)��F�M�:��t�ٜQ�����Z�����-�@(�R\miQZ�ް�¥-�b���"��8��<Y����1�n���yX�a�;�ܧpFPb: E�;�~?�6EŢy.�r���r����2ù 9/��4�:@����r��q��܊�:A���z�I����-���y��V #ݢ�}�N�� Ǒ3t��`���':�K*�3k�� ������'s����'�\K����|�Zkއ�մ��p���)o�:88�1���q�����z��F��M��g�X�b8&��BH����[J��gX�V��Yb�p�P�#���u�<�(˼�|B�j��퍤tx˫7�/��N?eѫ=f��y�5����(<��l���%�qhX�ߟ>�� &#��j� ��Z�ˠT�4`�Ӵ*�y�W~dA��2k��Cw�����ٷ��ҥa4`�ϚL`c�EHײ���M"vp��=8�G~��\���cA`luT�����]��I�'�Z4���{:s*|���TđK��L��G,.S� +�Y�P Z+��t���H$��\\)�|��#�lc�H�Qu1��n���S��w�3��sn2�^�E'B�t�>���o�.�� EgO����H�?n~W������+���m��т�}��8[v)"�SE��t/[)����fa.���č&�2>{a���I�uY��LL�qmϧ/���O�%�7�Xf�\༖5c&g���{ãs~b��������ҍ�����#.d���X�4 ��_�;w�6����O�����X���"�j�3�<�Phn~Ǡ!���Zޥ�V����AΪ�_��D�`W���2Y��Sp�uޣ�Jf��T,���H� �Ĺ��=%K}䢟� �s�4e^39�|�%��吪�4Q��>���~�/[����ͪ�ҕ%��U(`bVG�I&G0���U쮻�7��������[3�1��OkhaI�]�\o<J�QPwc�P�N���� T�`���7;��>����P���ѳ�v�"+��G[�r�K=�~ZQ� S����j�]��`s�.��L�y�R���xo��v�C�(�XC�yCg�&34ԭ�ԓ�����<�N"�� �x�l"��]� �x����J���ψ"���J���7�i���Ŝ�$�٫S&����|�5Q�X�vc��6����4?�֟I��J�n����1CU��c)��If94��Ď�'F'�� ��IG�%�8���ݙ%�p���]2�b��q�61v���C������s`���W4nulR���,W��k9 �|0�J�4�uN/���5h�غ�ad��+@��@��npr9��ߌE�����@�z]���p�O��r +����(Xڍ�izzt�0�C8W�9�����=YT{�E� +����K��S��h��)h�N%ʥG8 1�vk�I�Q��*6u�3�m<��j�'`$�Jg�����.��(���J�}��b�d�B�2���9o�{K0�ڑr��cUz�cق����G�8"�`}� +�Zj?D���.��I�_��}a-���`�x�_=k��y��������Υ�P�lV)�AOgFm��i[^�L��=)4T��!��I��_�mad�2�_�\}��l���;Խ%4���GJ��+ʼn���*�㵈W�J�z���5{�\,� X=�>)~��ojK�b-<A�P�\��*= �p����{� �tbt]�%�"�y�:�J�v�ꢱ�M{O4�t�Y�Ra���*W^F$Y���!��y!�r��\qMx���}X.c�n���l��qFyC���_�R�S��vc��<��#��T��q�Q:�X1��܄� ٍ]ޗ^��b?bI��i�!��BS3���2^S���!��Q�z�����<:քE���蕌���+�X�?��4b��� ��c���Nu Ϝ�99 ����l�2�r�3������m����k�8�#[�}�9ߜ�1��NI-�� SQ֥E���nfV=�"iю�[��a�*P[��ke�t�E i�Eh�Z+�p�l�x +��#��K!�-O����,*�mOk��6cgc}�R�h:e�yXi�������v�`#��.�g��y~5��c{��������fm�C+y�Y��m�;d\�͘����zڣV���+�&_�x�a�Õ���u�&� |�t �u[�N�>w�U����g^�j)�# m_��q��/��n�"W�>�(�e +Blt���z=�r��\��Z���i�BƖQ��IC֎���.Y�v[��<Ue�F��֊o��f�o5ݩ[�ㄈʒM��3>�`K����ƍ���f[utI�9Y���UB�@�*'�[E;�.���41�� �i��>4��l;PUyV�{���t8P�3���k���P*۲M��8�[�#�5�!�@��cz��\l��m2�}A��R=��~����e>�&k����G�@�� �֤5��=�6�����N��X��u�u*OrK��/.� +'�B���@vm`,XbN��D��-�{c��#saA�'�~K2�������Vw��x����/��ntG�����1Մ1�y ��ek9g$�s~=pX��Ѐ4>W�W|��Ůy�7���L�y�T��` E���弈�=���;q��xB�B� E30oo*F�Wz4� ��ę�[�o9{��4�y7���[$�;>Ӆ�^��9�����I����ߣ��'��VKj�*A���� ��/�#E�>'�c�� D�4TR�z�Em�u����g��f�T�x��� s;��,�ܤ�E�'�ۂ�!� ��)�V�mk���)|��^��QiАHRF������絰%N��T�g�]:q��+ΧN\0��;W�2u}��&� g�>�aǐg������|��Io������*+8�3t~y�8Jڤ�|�U�KZQ�{^��&>b� �Jwvxr_7b���D�5"�|���.g';xZ�L�q�RP̾��d��L�D�"�Ӝ>S��LX�=��V��>�tQX���)0�J0u(�w����8Ć�B�l� ��ƿH��|$_M�Nx5LJ/<�m]��T��O�����D(���ºG������TS����j�!N��W4Yx���=<��"���pIU������!�g���߶�V�ȝ~O3>r�~���2C���P��rq�$O��B\碞��(ݲ��6r�����<��笀d�uyo��tEi�����n��:@�K��$��W(.�����јzȾ.�.wx�h��Kls�,���Ю���������Һ��q�X�y�~��s֥ނ���(v��U���b}�'�:А8O��p�(z���'��>qF�\ӧ�� +J8�)"�$�Wv�f�p����<>e�LLȠJ����%[q�����6��:�W<��Zp�y�]x��'xhc\�B�H.>%2���#���������R�}�/\kS�R?�XE`-B!J)F?n��3a����r8�;��f��g�m���D��Ɇ2I����b���t�� ,s.���"��5���+��R��'�tqO_:4���1�%�����ÆЯ�Pn/��#����d��g>�5�dM�ab��E����q��}���E�i�c +gd��;�SԊ4��$p弸�V/r� +�d,%f�A�Vf������1�[WR��eh +��W��r ��sF�h}��b�vk�J�_�]d�rڢ�����0D��??�D ���lm<�AG`�ijnΟ�N!c�lQ؆�����B�q�t�$�mH���6��4K��@�p�W_����?!DX?u�������\¥�,�+J�B�OrBx_���p�x>��VE�#�{k��d��z��{�PΤo�<�c�길��J�X��MGh�yf��㳕&=�����t��9B���K���P�()���-楘�B�.'�9�=��i�Ώ�Ď�G�+�<f��p�2�$t�؝!��9H��]�r#�ܕEa�L�*��E�^�{�97� +5���$��n3Q}��OF�lq��]'~�7���K��)W`�Ԇ?N�Bu%t-�k���i'#b�+��]���D�ԍ%���Tg��$��v�)H� ����9��Z�{�JL�v�����cO +Y6q�K"S/*F"�M,��]�%��������g/%Ѿ3�OG�z,��B����?�'��>��}����8A��R�h����3P���`� ��y.��cU9,�6�E�a�>J#ɭ�����#�Km����,rν�k_z&����!�,}#����e�ɓ������%�x��ta���ޭ���"W�0���M���k�Ȕ���K�]4"�|x��#!|(&�V�3��=�ؑs�t�g,���3� +�ͫ�:"Q��YS4��fN��Dǥ�)k%3�Lc�<5�=�K��{�5���n'�#�S��6��.j�2a꠩٦W4�_'<e�W�$Dnrl|z\V.8�2�p{�"� ����Q���&��[��ھ��?�WZ�(U�$Q�،��@E���i�V��E4B���U��@�\���ȟ���|T9�e\C�5��ί�Ke��hc����c��(�5�*(���A6���(ZQ��*�#��}����)��a�9C�ݛ�� ���c6\�c�8��b�bv��Qam�%�5>��/z��~b_EB��E�_�ث1�-D�f��mǶl��e)���?��m��(�;#/8|�|���k�_���g��c=���LP���ȵ[e$�Na��$6k��ҾAZ��s�������)�[��\$�t � +�K7n�)��j柸��Ie������$}�V6�����m�~���H�c�Hd��^� ��.����:>W"dg��e�S�B|6�{r�:�J����:чTQ�V�Mõpo|�zb4HQ���IeȂͮE]?I?������=����o8N�ǜ�1�' +�[�bx��=�����`�\��t�:4�x���IA�P'���_?�)7�o@���ѿ��Te��)� �M�30>�!��'�1u��n����'f���3�U���dk�/�AT�|g���DC:.�MY���\���� �%��Jvܥ!�]��@��QW�y��Q^�_�_N*7�R�SU�8��D �$<"���A/��;2��W(i�����:{W�5�R�fЀ���!E�3���1EN��7I/��#X��XD]�؈��^v�!�=M*�D��IE͗���|�;�� �\\,m ���V]�)��5v�πŖ7�V����/x,p_&���Ў��2���Kʃ�f�i6E�۬?�q��&0��(G��+Q��aj�o�<4E�D��\���e��;'�_�[� ʕƘ�Γ���_�lE�7"�D@����/lE?RQ�</��E��F������t$�٣�E͕���BBjEط@KL`���K�s/�N���� +���_���ro���#� �L����l:o߲�����w��i �c)�b�SOp����_�NoK��[%�V�+�خ�6�7����,��p�Q�5���Y�r�li�+��4�UI���!a�&S4*�J��@F��((�ӓ�?� +�ݐ�9��sX���+V�A �SƊ�vF�P�3'��M}@m� �ΝCZ�l��;"P�W +��B;���A�U2� �j�u� �{x~��覰\)�����t��(Y6��K����ΔW��Q�p�d�e��W�w!���6�"mMF�.}A|g��]�i����FK���N���~�,�j�|�����[*'����QFY�����������[)͛����:z)C�R<d�p����I�;S;��z������7a�}��w�?��C� +�Z d,���%���N��J��}���VMQ�W�/�� Xą��O�1i����`Ž�=a;9i�<͖bT�pM�o�p��G���;����G�.�S�4���)��d�7{�mT:c��zACwj(���M�6���y�A�����|p�G��)��/����u���G�, 0eCu��V���n�cAH���pf��gD���~��h���Z2�xb���:�8�# +ϼ/��:��M�ĉ<��v����SahB�f�x=�e��F^�"^.}y�T?ӑ-�IH��!�U:���D��mѪ5OZ��@+��Wf9���,Y�Ś��H�Sx,�!~O0r�"E����">uQ������G]H'�����8t:b�c���K���d! �bq�U�Rp5�'?�E�:F���Q>!�� �`�s���*���ɢ^5vF��t��c0uJ[)�_�]u��uҤ#�7�:��#� +�Xf� �ݧls�gܑZ9_�T<���\��R��z�N_L�rF"*�R���v���B�"�9�H�'�fHr�,��1� +Z=8�����5T4�d�q��� �C��(x����7[��|��q^��X��۠`oq�o���^�G�n;�Kn2�x�߰j��:Z�<q[Q-�Q��\GQ��ϩ\4�������i��$+���¯�$'l�#_���e�\r�X�0��T4�т$&Cr�#�)r{���q\� +�D�GQ���]�b/����0D�R���������Y�B����rr�,�2�+&�0oh��(�����դ�!�n4Z�����/�4�M��I�/�s��r��9�C��a�ܒ�{[r�~�m�͡�1$>��� �U~|d<��$>1o2�F��@f��v���l�}���Qޒ��L"7�"�*<�߰�DO��3�1E�S{����Z*Д$;g�����J/0I����T?#�5�>aF 9���d������'�^~g2Ģ]�܂9�C�V� ���C�؉bH�;+���:{�)�a1腙�y��yC\����U ?��G�{�g�MІ�)�GP:t�)w�>| �v�/o�"x��a ���z�� �dI�-y�M2����$��W�9�td���n&�S�!�WL�����,���S�h�;�]h=�*��F�%�m� +�R�X�����ȃv��h��"��bp��Y��=-\iJ�6Q���I+?���~v����he*���17�"�q}}����X�"J�G���(��I';���zks�ӥ��V��g��l?u�{��R�f�`��!��|k/ڄ��X6�hq�6Ѿ�I���,����xf�*��-��sP�ՉflY���}� 1ht�O��9ܚ �����s�_�ʺ!��<�ax���|��?� :��`�[�-��&;V�+I�`����f�7y:`jd9#�rl f+�9 ��ld�4now����6:r�l���S�I��~0���A�� ��8E�NCG��a����Պ�����wԵ�j��=/@`��˖J"�-K,p���4�&z��� +�}_�N�g�)U*�R���\�̒7�3>¬�4���l��#@\<~(�>6t�Ӥ�=�Ad傍���.��]���Y��36u����P��w�N�:T�B!���0I�q�Y[���g�(�(*4>Ƴ튳�"(Q�; +�<'W���/Vh��&������,�eDqِ���jř��Qf8`Z���㗭�A4O̱2T�%-��i�������){'�X��!�N���Lյ����<cL��'������RHoa�?<w +?�{5]7���͚hz�K[5�?�0�k�F7��c���|;4˓ט�W�m���Q"���rˮJN�q�Tـ�[�0Ľ�͞�6AТ�+ʾ�Hԥ���6R�`�����f~+��a�S�tyU�=m3�ss�x�a7���t��ڡ,�CU/S����G�lW�@��B3��Z�^B!+� ����ܱ ��/�9+O���p�E�����1�����)�����U�5�r&b����>�%�z�\at�� +�vMn���ߩ�;�.g�Ud�#�g�5�IJ(<Aq�d�^��QFI���[ʑ�dF-��>l�ϖ,���}�m����2Q�$zÈC4+�7ˉYZ�Q��Vu�9�(�� q$����j�Sˤ��1t���md�̾CBL��3�;]=���Y��I��O���x���:�R��0������� ��ք�(V�z]�b +����8Tы�9��zt�d�h�����s~���6�B3�N�9�� x�v�1"��+�?�A:tn��n����\�6�,�p�R� ����D�f�iQ�7������X�~�!3���V�J�2���s��{�H *�������:+��3�u �\ /��?�P���H�&N:Ĥ�<Q��%��3�iٰ.�m�^:��a���.�;������-fI7x���il/a���O����5�IeA���T�&T�|�¦�q�����)���}�V�d 6H����=�&�f��{_��Z�RCy8�d')[@7�ʰ"A��$�*/H[~�N"r3�[�[����_����BSG +�T��I�c�^��Y�=�����K��FF�i�~iH���ʕ%>t b�:�6-��Q���ôF�PZW#������oL�'ߧ��q�c��'���|%#tI��T �!���Z�O���w@D����C�z�ا9i�y'[����{"m����]*!��ޏ +b1Ea��9p)a�� �����E��� 2W�CM�����, ��M�-..#Uȳ@�\�<F�g�OԦCٛ꤮a���\�f��:�6���"��9��P;1s'��J�I�ә=��E&�s�Ӟ���p1^�ܐE|�_;z��[�(r�����E�-W���5 B��5�����J :1��"�y?��Uz3h��6��&,]�['�T�9��}Μ�j� +Z�,��?��\3/� ��}fhjJr}��ZT��0KG����)������ �1�4�H�Yu��QR��}o�"�����';�4��ς��?u,p��c:�K��x�nwa�P.�+���b�퉸���� 2���������H�u�F�zr��?��us��2ȟ�0n�e.bA=��,��+/6�W.����@4�j*4w����(�������iif��ދ�ϓ��k�%Y՜��_��\[����'L�r���^A�]r�$?"to����H*��P�� �{����N�b���]�c��$� �5j�c;s�2=��R�%�@��K��0��-�װ�FFE�� �t�5H\��7!�"�8<5�h2�چG5�1���kÓ����~��{B"Vá�����I]*����4�V�dT�*��é2��22 �R=����欽�������Px�#}��1������F̳��T :�$�$��F/�ěuC ��iˁ���m�t�� ,v�X� &VS�} +�w�q��%�,qXM�;�&?����v�u5��h�;�@x�`�}P�\�|W��_��c��9�}�_�&*e��i;�yaR��>)$����7r��7X���j�Ձ3՚������*Eh���>�M�W�� ΐ��Ba�`8#�#'��W= $/8�A�t*[˻-cJ�[r �)"!�:v% �}�MF4���1A��{�b(+�8�M�����m�����h���bԾ{?�gA���J��:�|����3k�u.���F��P}r{����H/��[��ѩh�:��vEy��QVZ�:�ϔO�+)�T��N�;����r�`�>=y��.L(��ja0C7��$,�=���j��k������D�/^0K��&�vp�<]�9���-p|��c�LFum#'���C�|(�����R�r�ߺ�fjQ'I*i�e���dw���F��mzfVI�n� ԥ�F$��m����Q;�t��~Mϐ�W���|n;�i��1-�T0*�zDlYe�;'��R����)+ ���>+?8��w�������(��I�C\���NU� +�g�#�<�K�}� ��~Q��7��� �c�~��'�<&I@�����oub�ut�Gpr�E?����뙍J����^ �.BZZkm� !ݯ�t �aU�x��K\���Mq���dWtg/��|·����X�����fD�n0���O�䴌�+�,):�W��%�ؚ���VbT��p��&�n����|5��=O��N.�g��A��[T��h)�n�j�H)|����ʱ*�6��d���^(A��� ��?2�/Ӫ�[NΥzq���_.��%pg�@1�+B8�'l?���t��^0��|o�G�C_ �{Uc.9[��aB6 xv]ʫú^�����S�]Jfw7�y�CS��������tE���.��{Y]l������#�,+:�l�����6�d#�1����X�`��;F�dhM�N`��L/#����V���T��8�̛���C�;s���&�&�9D�A3�ܦ�h�*��Q4c8~��_�� +D�� 5��ss��Ք������������Y2�(�ⷢ����lVk 3ᨗi����x�.'��P3��MF�� +Ȍ�YP�j��1�5��qfQ^0��N��%Î;�[vb8H� f1�U,t�8E�*�[�����Ҫ����J�ߤ�:G��A&C�\���Nҧ���{�������x��!&� ���RU��#v��!�0UA}:�Ħ)��MN|,/��25Q�*� +l�#;�����:8C�Z"d�k6"QAw���:|W�� +>������ Ki���ý`7D��:��Ra~+��ɏ}p1X�a�mCb*�q���--�(�0]�J{3���I9��T�LA�<�!17Y����}�3&���&����2��� ���ߺ���&�� �F�d~��ɔ�a%z�@�"�"�oڞ�g&�¢�m�I%`d�h\u�egNz�ό���"TM1�� �B�i>a�i���6=�)�����+�����& M���k�ʠ�↨\�d5��}�_Hܳ2k�R��j�sZ���QU7j�'�|�B���W�\2<J�ņ-�Lj��z� +m���.,\�� +���Hmݧ���wW����d�Y��v����&a~���6���.)0��N�QU�"�(g5�kP��T�����b� �y��Q�T���_\#�Z��r�W�*NK&-�ͦk�Q�2�Cf�����lE��qp9�0�`�����ȍ�� �q +a���,�3*��O�����Ȳ��+2�1��/ g�)+��t:]_�Bˎ���|��Ȭj( ��#͊�`'�næq�� ��q����}��'zFp־��|�+�4 ���-�y������N��P���Ԙ$�v�t�WB�.���N��W�����J������PFe[��L�W�ѷo_���)����V�\����؊������!�����IT�S�zxb�X���v��ڶ��v7V�Qr�O���j�x��ݪ�\�K`����ʔ7O��B�@yȷY���q�f(Ԓ� �!�\�H��r*c�S�}P�]�k17�:u Qn^q��u��f%��sF�p���n(!��{m�]� �~�f<��{��pk�4 +"l��7�_�*�)r�&��l�4����V"��.$6VL6ט:G���R��H��m�ژ�N��?�&T�]�l "hv�����0Y�6u�@� ��Y��ٓ�������B����ߢH�ůV*{��3-}r��uG�NKr?�:�1\K���8��0���+����jp�6 ��5j�C�C�� ^*%?A��wӼZ{�Pi1���Z�{��4���^!�NY rB_�r��)4#���{�]`���<��c��D[��*;�<��` �]��.D�����O%-�e��d�s��;���pa��ağ0#-�c�np���r@��D�V�I�^�F�`���^��4 �\,���ұ��Ӊ�X��G�*�ͨ��������p� ���w��1�T��Ǧ���D�N8�͓��#I��8q�a�|"���i�����Q!@Ô�XF�DBG+�{��G���E ����gڢ��L���s#����1_����/���2�C�E�w����$mp�����J �W����q����7_}��&.jµU�u��yݗ�"�o�����z�7'z/��^6<쭗��s��K��ٴͱh6C�O���YR�8Nn\y�G�v�_ҏiԃ��QQ|}6?$i`&���\��?Y@;4M��T�]������) ��ܚjc�O��_����Oz߽��H.��]Iry:��.��T�[��k�V���,�"�o����n���� ����KQxZ����u1oQ�މ/������Q{Sg��H�,���Q�.�&�� X�(���$iw�"l�c� ���o����@YSi���q�1�c;٦����O���|=�tOTO��O�&2C;��\������=݀���J��Zt�5ھa�q��Pn^b,��<�� +虰�H� l#�p�k�/y����N��B<7�5)e��T<^Rz�uj�`x�m�����f!�{� m����:��l���e��͵�=]�3D�����Y՚_6�)�JOS�P�l����p��We'��bT�Wr����X�B�U��~.���SN��'r�@��`��m0ޚ&�Ť'�l}O��(LJ�a�F/+̏�3i��+�ُJX&� ����)��!>8� +�-�k]y�z��=[�|�^�Ls��; l���e7r���3�����݈�)dJ�4Xŋ[���(�� �A��7[$�"fUlO��~6��kZlAy�?���ǔ�F���u�'�P�GZT�2��f'e���q�lKkM +�A�4��:�evق}h�)��iC�@� ��ý���>�RR���-�����'��M�o3�&z#�Ћ��W,��ʌ��(2̛X�)���)�aT����-I +�8q��Z�ᑣ�:�$K۰`���|�E��Y��i]��H��)z���N�&����|��ص\�2� �Χ��� �c}9,�o��v�*�M���*0��� +�T�9��5:Q�.�?�a�1ʉ�d�N�|#���[�a��_dH-S�ӆ<�J=�2�V/F!�M����Ln'V�SZ'�e9_)��ӣ��y��]���^^��h��� +�VV��"�^T�mLs@: +0z�n��������{{�|H��HYN�ॏJ�5 ��d90�2�I9���A�ߋvz�Z&�$y�eq�b�'C&��3�°�0:-��S��ph�j��`�!��&���r�`���,���X�m%uCÛj:/��&�ZfT��U<����u[1-�U'����e�d$pG���{�C@"j3G� b<(���������"�d�`{�D�wM_���[��t����sT��V�\:�U@�ײ3���ɩ�J�-Qo�O���ׅ���氂��RDQA�z �e1�d�0D>��ɑ�sϣ�}�.������G)���$�]�9��u�H4�w ����T�dN�����Mu��M������U +)W��~^9�)�� +x�G����E�+�f�ڷ��z.��+�W��? ���@�O%D ��.AXs��k��v��G�Q�NF"���<�7w:bX +�gȇ�NP<�$8M�V�dw�+�)�S �S��-<��?6X�p/ 7��;�VN/C��1�"��M�}Y7�Q�`�]#�����!���^e&�����|��W��M�Y��ض:��Ka<u*�K� �w�4��ϝ�@�1~�B�8d]����������'d����m�1f��H��%�D���0ٍ���R�U���j�搡ky�gN_"�c��9\��f�"f��ޱ0X�i�&��=/��pD��pl1��>���j��w�C<Nt����f��o �Q:��b����\<�hv��p�E�kM�(�>�����K�pZy���f����|�jH�O������uXXn���%a�nWɱ�\O����4Syf>�x���SD7��w�-&Tw*���sc9��6��{x�\f8_{�ű�o�q��1:�i?��4���l��C�+�3X�W�I�Z5l�)��ܞ@$�N���R4h 2 '�e ��r[�c�l��?��%u����S� +��\��/Q̯���Ѷ���`�-�F8�w�=)�GD0�ӗ��tٮ͙5��Ӷ��Ac�!8����ƴ��d��4m�n�劶���x�Ƀ��o�7�yLGճr�!\�@���jRA\T�E�����fN�і����G`)�$y��.�ܯc��@r-�jFy�RRaX�S՚��� +K��,�◟�C�����|;L\�8��][)�q=�|#�H[����]�W��;ke+�Ԏ�E�k�I��sL����*��'�ۻ'���l\I�/��KhAR�uz|��������Mj�6N�_��?tIɨ�&��Br��йK�~d��눱&��ALᶓ_c0����4؛�"���h�n�1��́pڱ���oE��/3'�-D��d� U�V8���T��.��IfSl�jiI�h�B�2��r�K��Ҋ����n]uŬ�``�q�4YuE�m����O\������3��?�4�"b��I��B�K�_����u�C��eX��,$I�l��Y�ǟ{#Tc�>dUk��a��~!.��md��"�&��TZ�srݥ7�o�Y�(�4�������g���<��Wp���U��r�F^�pƢ��+1͑�ȫ��v��|V�&-�'V��������m���A���%�a[��َ��Y���ٽ(�B5�8���p6���?�Հ Ft���n̸���ƣb�c�5�ħyq�c$�ׅP��#X���rW{�)�8���*����uPB[G�Αה7M��g0�����Ι�M��J��:�qL� �T��ɌW�t�ut��S�����LX)'���:K^Gߺ�p��7x���di�"�S�y����թ���夻�Ŧ1���.�^Lt��%�� +WL��-e+s!��S�o�NH÷�u��\���k��NTw���7t�4��D�5�Y� �j���zy�e~�br>���5�����������J��o���w����)����?\�/�y����p�B�J����4X ��������b����oM]Qa�����(N�}�g^�D+]��#�� +�"(��t_���L~?|2���E�;G&�^v�U�E�!��q���A��y��m+�ܮ� VKUx6{!e;��sY�I��Ŏǯ�L"�n)6�B�n;KV�%yk��;��p��s�;Dk�Z�� ��dx`���t�4y1��0�\�e>l�َ�X,��<�Иl�e4Z�+� �T�j|0 C�^P�U����l�%�&0�I �1���˺#�����ҳ��]�>�L��wM�2�X,H~��:4��Qz��N���v��;A�`C�Wj��B�$W�<�8� �{���/�R���闢{F=;�*I��K�B�R�Ш��TA�R����hYЂutBj�6!�A0��-f-����_/DDJ#7�,w�H|��r�.HJ��&= +�jA u"H1xN��xX$�����/t�1����M���jMg��.r�&��(O�CՔ�uTBP�?ɟ��Sc.�<��)�j����V�`s��p�&= �S}Z�4��t ����N��������j�~'EC~���o���e���&wB��4�+�6���!5�f4L\��}̗Y*�JN�3��lrS�A���ZXHO[p���i��Ԇ���$��"�w7{�#�`� v,�����0w� +T0G_L���ʾ�I����I+�������7@�L�X�8<i�����O"�N�$jw�TM�1XBb�����6b�'+�;,9�@2�iDC�Y��ê�X��}%�p� +�����nN:1&�� +��w\�%�WT�A,�����..�vv����Yi�~KRhs^2E�����U�Y��Όc�����h�i��P���;,(�O��T��A;�iǖ]���8ػ�?����=mI�R�<�������0�%=55��+���t��N�Ϯ'�_fM`�`-���C+��9t�BKTq5�����m=�O�G�����>�l���?�0��W�e߫Ա&d��I]���pT�N������tpD�$1�7S.ɺ��N7ȩ�������D{�)땷�{�U�r��iy~�S +H���p��}��q3�s��������Z�Z�i�U��D���##���y0�İF�H ��b��&��w+���P��w���F�@0�& K���wXa�a��I�<ī�����ImDp��A��x�i��]���BXn=��Q�p�f U�Gh4���Qӟ���X[�:�C�����Ԛh[�5G��i(���Zc�Erk�� +ڗ3��&�L��{��`���FA)HVy�ؤ`����6ӱ�So܀������m�ԓ���e�RK�3vAu&���q���͖��p �eH�|s�OO̔#֝V�l� ��o��^���-ㅌ(sF���9�^���2PX�0���ln�%�����D��/����OQ3�54gz�� �*�-�����(����G��0�%� ���K2w��S��~$��������P�_�(�}��vQ��-r����i��zI���f�,�"���CϘ;[2�+��h��������_���s�<����-/^4����"w,��+�˲��'dk;joۃ�}%�6����o��|�%���B�T�×:%%�WSE��Q4�RW����Ӫ�i���� ~��,2��x��� ��Qx#�ULzU�}j6�)��a�����[��{5!�/�\��Y/�����B�����nO���:��p:�XT�#�i��@�5xn��ݒSGw����4j1z�LU�'���8�Ԅ%V��q�I2�W���;K}X +���y�ah�M��S]�.y��V���O�qI��*n��4�;�u���Z���96!�����&�d�[;)jO�)[�*\���� ��Ut���88�.��Y��~0��c��+���'�/jшD6N�K�bS���N����q�S�55YQ�c&�AXX1���w�$�V4�N�����Z�{?cL���24RyA�t`�X���5Sor��%����䍸ET���'��{��{�?�[��&�a� V��zs��)/�R�@{;���qe�2V�ۉy�*�Y�q9�����vQ��a������07`�T3��ͅ��2�&���'k��J�N� ���<��Z9(?L��rNh��n�#���G�ٗ�v++<C�F-s�iB.oǧ���+`ӱ��G���Кiʚ���[�E�h�M�}����K���1��Tz�=�Q�Q�J<L +)Vu3�3 A$�xk@<���*K��U�b���5�Q0�Ĵ����zd�#f�em��o�)�+}�19?�+�Hw�^����!�����?A�X@;L�dk�}D�M�ӭR��������S�9"v8���gM �,���/�^>�3^C��h�J��;r� �kq�M`&�uah�@�g��w.��t�84c�|�{ pM��N���+E�[W�C 7����?�l����0�O�`�f�lx;F�| �b�q��vr�|�������`f�C�G)��+��]8��XDZ������P���EO�,�3.T=����@zPXa� ��멪GNx�ș�ҤC��;�2J~�D��6%��_j����l�2��̅�/�]��k�E�d�n���)� Lr�l�'��9��L=��g�.Z +}�[0÷�(�8�n�:y�eY5��Y��h���^\i܈��NU��,0<���DQ9"��X>8�}�>~t�4�c3fO�3Z� ��-�u��։i��(w� ٕ�[�sP��Ɩ��o�b�y�K�8L2$|�|�.,ٛ��=�I�՟���E��oɼ��`��zc��B���Y�C�B� ݕX�v,#����t)t6���Y��: +Bֳ���u�$�7��X��8u�i�n>���߾�N5EqO�����9W�G��XG���^]���%n8�\��+u��q�.�,���0���n-��N�9E�*� �`����.��X>箚�\c`�hLL��� +�E�7���qc354����Y>�-�?�HV�,�K������d�a`�{#���d@O~AKok��þ������q*U�]|dN�o��ny��i�U�û#���\����t������Nk���C�@VMF�je� ��$�au�b|�@d�]�������>T}�0����4��CV7��m} Dp��Ц4�g"���*���[����B���<���:Ra��:���V�%��ʣ~~�7΅�=L? �9.��������.8mܷO��%���,xŒ��� �U{ce�����a9o����[ q��HK G��J\_HBVzZ� �:�t�>�m���O&,~�ڼ��\�*��K��F��*�M�Wť� +\Y(�����Qb���$C�ꃊ��s����r�pb���J����{��>�S��Xf��Tug�����u왁�������C���R;�%�/<[v��� �)� ?�5���G��:Jp�X�ϡh`ǔ�b�6�-��������1�t�}<��D +endstream +endobj +1560 0 obj +<< +/Type /FontDescriptor +/FontName /ADYYFI+BoschOfficeSans-Regular +/Flags 4 +/FontBBox [-174 -300 1295 1118] +/Ascent 769 +/CapHeight 733 +/Descent -198 +/ItalicAngle 0 +/StemV 93 +/XHeight 523 +/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/backslash/bar/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/quotesingle/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 1559 0 R +>> +endobj +1561 0 obj +<< +/Length1 1664 +/Length2 94813 +/Length3 0 +/Length 94701 +/Filter /FlateDecode +>> +stream +x�t�s|dݖ���m۶m�c۶m۶��m;�v�q���;����7S�O=�k�}v�:�"!�S�0�50��q�a�����u44�51174VԷq��pҷ27�g�g`�7p�W�6vp������8$ ������������1'���9���>#>'3'�?�Y!I��lm\�������Ʉ�Ή������ L9�i��i�Ml���i��!�1���6�qr�d`�72��``ljnI���%lLl�9�%6r����;��wa��*���������^#[+w|#cH:[��f���������������˿l�5-���_���<��ͭ����i�jlnj�O�����T�������{�������Q����H���;��������6F�V�6�r����X�oOV���S237��1vt�ge��������=�6A'�.,�(H�l����8)����Wu�N��ƪ�FNf��#�?M���N�n���߭1|~���I�/+AA[7|O6V|�����X������Y����������_��A�����X�=�Ϳ�w�7v�����ӷ����7����?6+>��?D�"V|:��� �N�/�����1�Ӊ�EL�tѷ�Ͽ��O�?�N�O'�}�)�E��tJ�!��(�;>��_��M����NV�&Nə�#w��&������w0C[��}�o 3�?$��%d�:����;������~�51w���[b�7��o�W��ۙ����[f�7�^ ����0,��� X� �����+�[d���m���mkk�J�O:���߾v��6�m���%��Se�.������osb�n��o�ݸ���Kǿ���r��w4���wȿ�|�u2s0�{��>���w<�\ᎆ�������i��I���w����@<���;���ÿ��.=Cg��8��L�>K��&��'�����!�꒭!W�EZf�SZ��f�N��&q�<6���uo�C���E���(�1>���Go!t�h� U!1Ҟ�^��i$-��R��)x�ӗ��'���D�[��b��kL�)�ޝ���͟�?7?UU%�4NW����X���X$�JSő����r�E|N҅��Ҍ����]����{���Bk����ء/���Ӯ_��#�!���IvO��������^[%c�~T]�^�\7�jq`�.0����3��1e��=����)�p���.~ҎU�~(��vܡGУ�D����0��#MGIX��kb_�&3�"�&М.wBU����ͭ������:L�l3��d�^�%�q����1�+B�}��j��PT+}�e�}9����?/�ۗ��G�� F[����v� +�">4Ⱦ^��!!On��>��!Y��b���j�l2(Ԯ��f˯���BgD��Gum9sC�֤�*���y���Z$-؍w��K���\H��Z�����_!�oG-�2�����N�&jZ��$�mlj�-t�/Gӆ �hf���/(��461��jlBh�/�]��,����A��\���g���w���Ao�=B���5����/,OyA<��w���ر�����D���X�^6h�� &ؤy0DNM��J�UX���+7+�)��/}����+�4�*#�"�(��Wĥ�k���T�c��w�-��B�Gv$�&��مnK�~]dԯ���r�zq-O/X� p�fb��@JҎ��:��&�&����ANwc�]���"�f��>����"��xkJ��>��7����TM��"/A�hŭD?�:��|IѶ���d�,�� ��snjR�"� @��&�� d��g���T���'c{v�YT4��yS�o� +g�?�dی��F�Q�G�ކ���<vم��2�i�y}҅�X#$��w�JЎ�.r<�ǐ����c�կ}���xwQ�ҙr�~@i;�{[FX>���]\�d�Z��>0��F ȑ` ;5�N7��L�``�оH]d�ޑ&�z�B���%_|��_ֵ�Ԥ��-��'�0Q��6:�[�K9P���q��T�uG"(p=����t�H$E��f�����nzT�m^�K�kѴd8/1�L5T���^vuZND0Hi \�����OXz��I�%�b&�ݾ +��9��u��Fs&�V\1˾�Pǂ_�g��I�)�u�$��M��ey����\|O��!�K�nV�ξ��f@���F~�tO^���Ȕ�I����H��E���buH�?#��P���{���j���Nb���F,| +F�H�C�B1��c���QjL���X�U�*s5d��� +�!��頚F���a��f�K�Ɇ�d*�)�2Zذ-y��} �M������ 6Q����1H��xً7+D8�[�2�ۋ�Wn�ljm���!�]Z�� �,�փi,�+Bl*�= �n���;�5��~�}���_9�Qd� .Wx�.�"�c�|X �>Z3`U�"�e��4�1�x.[7ڊp$��Tʓ�,b���/�-��\!�Y�3���?�a�[��j�b#�RLEZ���U�p�f���� ؗ�V!��1��G�(pR�8L�J��ԯ�@_�� `sx���#�n��x�|�oX,����[��?F�Tv���Y�+w�"���v��j�`�z�����V(F%n�\�A��^�3A�3?씰G�G�6��?� ���p��>�͞z��U�F��Q�ǡ�^�-��a��]�fȖk(=(��t��2m-��kJ��Ԧ��L�/��"}��~y�&䘸��:&yoi���%���?��?����"X��:��1�� +c'/�G�|+�w��W�À����Mhτv��c��pL�r������u�UoRZ|���e�_s��C�#62|�ғrO���=@��kRcv��N +�>��9U"B�8��c��$Hn[��}���;�8u�U�t�� +�G��EW�u�Y@o�)Yv�WQ�;��;��*AN2�,]�N�{�q��:��k�%�-빘��9q��g#�5,k��I�E�Ȅ �$�0qC#��@gS�t` �$F�/�DM��:�)9�:*�m�%}�_�W�������3?�������ղ_�T��' ���M����Ƀ5VUwj�Nm]k�c���ƛ����+���Ǝ �4��q� &JQ����(�c�>�s%���������b�t�j*�^ij�v jn(���orR�"!�Բk�I?�:Z�$���$O�s��w��E!o,{�hҚk[MUU��B�ٯ{��͊j?F��UK��h�{~a�r|�)P8]���ߵAC�V�Q�y�}�{��of�S�v��jbuY��~+�IlI� �c:=�v՟�M�\$M��{����\�`t�u���C^BY�b,W"q��;��j>{�D̡6���03�HI6�BL�ʸ�{m��X��������.m=�X����,!����X�6'�����s�\��t��"��ȍ��sv.|��mY��a��\ba��ͰG�Ű�5Yϳ����f�;�R��g_ќj��!��<���"���0p��$�L��p�QH�����G�*ħ[i���a�+�ǻ�ɩ�z_S +��D�:���Ȉ�m�����r��u堖&�e����:�����r�x�h"5K�����!K&�f6q !�O�ji�ru�����9��9Tsy��a�H[ SX����<9� q�/�$^ I�w>���Pi��݊��_/���G�����Ȣ#%�7���\��I���� ;����g����P}�d��6O� ��\���Dj'����u��� -��Ǐ�2�Ѩߙ`����M=�F\^|f^���ι�/B}DŽ�\_�Z���nу,���8�/V���2�Y�&��{��Z [ܵ��gˈ���Q`V��fYF�gTEnnB�&�Һ�_{��af��f=�Μ` ��oy���1�m��.%�#zǏ� +��4W��c�/`;kYuo�x�`����%`������i�a'��$/M��(q�U����1Jŏ& +�r��� e����O�@aCa��O�bz{�v�n��a3��g�!��Z�R�;|{Q����5�0RVKF��S@K]���]���h�cu,�>i�^:��@�\RΫ��j� DHC��a�IKs-"W`1��=/6���j}|�����O���ڗ�wc���^*�-9����L?ړ��E�����VE�3��n�\FS?iX�W�m��[8��N�L�+�J�s��JVN���mL��r ��J�� 2�2�W6A5�+L�E�9�x� g�b����y�r1����6����{��ώ�*EZ4�uo���p��r����l}�C���l��_Ⱁ�,�^����U���JW�st=�p�~b���Dj�1�/��t�Tͩ�[�{nt�2��+��/�O;i }��^3jDv���[�Hn`ϛ_��ݫz�����ʨ;)>�������-�AiS�>� +�`���c��{o�I�6XI�O�.�"�u/\����#o&ܘYզ�m� �je�K?�%K��gM���Nu���%�J�1Q~"��l�,�P�^��\�k��."d�cs3�rgN��]Z��P ��S�6���n����բ�=M�����J"L\`N��?�7,T��h=[���������os��`F��X@Ej;��Y�ey�A�l�Mu��^s�W��dD�l��Kl��ȗ��(#�,�� +�m���R���)� �ܺ�5S��gP���S=�+4 ��Kf��Sb�������a��9)�|�"p��D��#s�@����о�S�mT��A~^�b "F�����E�z���>�������)����5��7�M� ����v"�jsT��������U��{�Ws�9~P4z{�))=Ԅ>��g.�/����~+T��gݎrj�g��O�n��6�|[�5F_Q<�Y, �\l�Km{*�/U� ���rk��5��s:�E�H��e�ꄔ��g����k)FN(6(�cI��C��%ќ.�=�H�mP�E�B~��!�<�%����I��69�#�h�TWO�������=��$.�'�4�� +V�֩ѣ�g�m0q����P!��`���qJ��K�҂�c/��Z������d)^���lNV��ׂ���["qe@t> Y�I<TI�[G�4�xMQ�,�Ipn�́�bqT���Dz]��sB��{3�My� ����� Z#p"C4mw J�0��w�I^�����D�`,4h�4r��U�K!�~����vH�X��6��$m:B�E�õ�������^�����s��$�fӣ�;|�N����_[(�6n�ٍ��� ��L�Q�0��p7��@}��-���D!w��Zx6�o5� �7���ހC�kU�ۛ�Û�q]�V I���C�uQQ����Y���BG�QK�M��ӱ,�H��-=���+�S)�3��P�d�r؉D�U�❽�(��{�W�9��� �w��\'�럓x8<�[w���Q��w�:5�}�:�gLĉ�P9m�)�� +�;��e��h�&��R{���X���+�r�A��S~�"�{�k0m;�F{�_�O���ͦc��{���C\bm��B���q/z��o�o�fD�jt����mP������p~���A�ic�z���:��/'m*$˰S[�6�n�g���9�L�Sh|�@���X��&������j����y�J��>�� +k�WrVk���0m�r3b�#l������[p(�j��̹{����f�����?��U���$_�m���xQ���r5痭٫ �G,��3d�兆�F�Š�.���I���B��u��&`�ԲbWz�܌��F]O��j���>II�55�'X�I��T��5���/V�^3 +���*mg����{c�X3��)F���9zU`5� (��w�����(�&�#e^�yC�?CM8R���ܷ�Hp���!uS�<!�GL���6��G�է�d���che��~o>��W4�.O���4�rT����wY(:����n˱%C����~`VkbN�v<�F� +������,�f2�dX���d�G�� 5��!��CG�Li��*�%m���M�B�g->�B��,���|!���<>�>�i7oap�䟰���'ODޢ�۩x���P���%��� e��SF'uV���o�|�©?�t�? �&'�pi@��'��S��*K� ��� �ٌ +&��0��ȧ���8.c[�-\��匤�v] -�����Փ�&�ƶQ��,�� +���B��h��3��u�뽨dz�oY-��Ne������8w���9{(�1Y��i����ο�Nx!t���Ne���"���d�~�X��#@t5wZ��������=W� +�)�A>�-�b@{c�U%BRsS�W�F����Q#�$��G}��e����+e����ڎ1�EVΈ���)$/]7o �QW'�����J-ק��Z����xz�����F��[�t�gw�� ���?����O� ��|�*tcDNj�O��c���� +��xh-������ij��J�2�Cհ����w�αRl˄+�'�<��uxT�,�;(߹�!Fe +9�I�%�D���[�؝��Qv��M�(2�3oH�fU�4�z��g���$[ h�]���~X���?�v�R: �6�����]��Wz�m�1�F�<Q0Xу�QvyL�U�*���� +��'Jf�u;,��5�_m?^6\��%=$ �� 8��y���i©��%C��Lsi㧤<����kƨ��A�ڂp�����9J7��3S�$�eG�B���zc����<���O��]�l`h��o[���T �P�������+Z�uX��E���b��hH�#Z��y��焦�AϟS�xku��[�7u9�;{���[�wpy�C�k��8�ȋY�$��-B�:�h^�}��zJX���V�'45v�ٗ��0�0`�i�����c5�U�Uޢ1,5*�.�E�o��$�X0*$�VŢ�A�P�?֪��!�Z�(x +J?�L��l����,��)j���Y[U��Zk�b�����l#�,�*?�`S�f��wk�o4�;|u�v�2v�5Yf{Kј��}>��>ڣh%�G\w^.X�Pw&�^r.��}��?��-?���8Vփ����;� v�2l��m���rֵ��9]���R�ˀ�JVS����kuH�do!%Gסd���D�"�h)�-�WE��12$[��Ez2Ѻ�0+J�_ m����s��)�K�"zA%����J0�q�� ��b#j�9a����[[�4w@�:��4�i��t�{�Ӭ���Y(��t��x��m�~|f�[�r�E��p߰p���x(B�=;h�^,#�v��R��z��G�T�h��o�K����:�����hr�����x^m�fd�4=b1��$c� �ۡ�R����U�?Cewc!��IHwǮ��?�(�^��G7.�� [,)���:�ɮ��EYm�$-���Ӊz0 +.�rG�A�ij���W o/�J���c<%Må� ������#��3�� �L���tm��<a��w4&v���|��\�Қ訨l>��j�a� s͝��y $t�� +����3(���YF��6�Un�KY���_��4nq�g�G2e�KGR��Լ��w��8��d����j,�B�UuJ�ף��U�_`�/����n��ꪷsˌ��=��kN���؞U֍?�T�xK��aRf���ىy)�@3�lX���a���w��r�.���t��b.�2 �����:8v�~�@��I���_�]卑% &Tߡ �).ʪ�\"�u�`Ե���e�y�A�_��I��� +F��E��I���<�����L��HU����D����V�I���Q`�%xw�w&�9z3����(��#��������>>�2^��>�W�q�_��n���N���>�2�沚��"����C�)z`t�c +ߨ���\J��\Z��?��>:�Vn\���� �)S��j;��#9���w�e�Y��'?$����H Z]��m�{(�G�Q��?�'�D��,�ˡ��Ilcװm��Z+��)G_�2d|�yu0�����K��T�,���hSm���3�uc�e���*� ��r���{Rm71�[������ +QS���S���OV|'Tk�o����8�#2��"s�:y �T��Z��*eRҘ��p+� �4�r��yu'�͔��~h߀I��Л%^�A^�j"�����M3��.��F-ū����Zn��O��P���nA���CL�� �Rh���ǟ�y�:��6���0dAػހrr��F��&�N���1]U�0kHvR���g��}��� 6`�,7�V#z.��w*A&¼D7����Q'8����*�){N��3�l�80�%�%2�hf�����X>v�%��V� ��@|���c�#?1����D竨T\��=N�ޑ�������֤���SDːժ���U���dqW$�F�Oɕ��n��� �øG �U�˷��h�Uy +��V�×!��~�R�C��:�\��䷚��N��c`kX�6�n�� `�aW1WG�I���g<�Y#e��fSf���ռX%�ԋ��E$"�#!A���mgJ�zKa�Sw:i.�kA�ik�����a��"m�C�����DT�@-f��(:�W���i�*�� L�(L<ש�K�<�Z{N(q�}�.�A66�7��Rj��@o �D�|����5h��o�p?M]ya�ayw����5�8Hk���֦z�>���[��:(I�������<jmSW5\�uM�yg�k���0xʹ9�vb]���!�5k�nJ~Ɵ`N*��zъ�uҧD�_Pj�]Q�Ŧ]���h�ď�����@��-��N��b�F� +QRkn�h�ク�XJ^d���"��C��g��H}={r��'D���[I��/ڷTn��d��tlF6��KJ^>x������M�ra���=�~�(�k�(��4[w"�yO8$�-^mAk!���-���U��k�T�,v?��c�'x��9��J0۽�5>���wϿ���z>�s^��4ޭ�u��kdzX�L^4�Ϡg��5y�L-f�ZQv�]⋙a6��`��&���5�7b.j���B���3q$~�'3�@&~�������~%)?�K��`�i��c%}���t����N�v�-���� ���d�|���X�Yڝ� Oq�]|y�0�0�q��`�z;0^$3bb�!(������~/��]�7<��� �똚y���Kv'=��_��0zuk2��j�I���F%7���onY���U��)�� %Z� ��-|��3B%vا��Os�ZoȨ'�,�����^6B UWر-��ҟ�Vs�!J�o'.+C���Xh3���8����x��T�Df�} S�/ }���E~Πa�C�8�������H����}�H�!�����vd�ePi$x���p�z������/r�z�0�d�J,�צ�>�@n��(u�6��jM�ů�����p:��G�3�S ++"��s�hyjE�}J�HG��9��p�Zm�b�L��&j��Ϝ�s^��:��:t���b?�'=�"R�6r�riM�if���8(?~��.�+�Zƴ�p3{��T�fRʏ`�/�,P���H��8q'cT[`,WsnX92�\�b��"F�ܜ��e��&�؞yJ��Lo\|�X/�n��n��+�)�I�<�;-��5#Jw��g4 +���Xk|�h���b�Z@� ��� �b�I���1���|�j�f�f?SD ��3�'A���㌥ҏB�� rL�B��`����nygg��a��(ip�O�i�cE�i�㱂�C"� �I.4������j�^G�~�7� �C�--&]V��6�uQ`j �g���p����q#1�~�Z�H�{��������-=��K�1�ne���pW�[�C��F0�Q��i+%�}I��Wי���R��� +b�t�Z051H����Vp��<�_�j����BT�H���\ߐ��fT9u��ô��`���E��L��X�������Be�9$ �>T�A�B<g2�T��gSQ�aGy&��Kz�f���w1Q}$:�C�LG.'&a�0��1`8g��A��S�h7���8���_�Z��Q�`ڡ�'�6�\t�Pr�����ղh8������>=!J�F� "3�KB�Z�kc�� +�s�@-/X��zc��hq�<�ϓ1���碃�0=��� u�<2I[��Q���o�`����k���/f�����)R��;k�oks��>�&�����ȼQ�������z�KƿJK�jw{�Z��)=�#���p(�M8Kʭ�Tw���̻̽4=�2"ƣS��=/�յ]��j�q��gB��,���2K�srӼy�����,�qg��W������Z�l/�D�����\d�da���݇\��&[��G�o�����+�:��_)���@�j)X�p���Dn�i�����1�~��)��g�K���7!�YP�'��r��'>�|-�=�����T�"/k��e���>r��Χ�ьJ� �v�S��V��A+̝f +l+�Bywad��(Mo*�Ǯy�W�$�>OT�TJؼ��x��~sw�c�2�i��#��H5៤��f� 9z���ز��I�x(A���x^�Q��W��&�Xmv/lAW�?N�X1!GӞ��nT�=�.N?n����',/�����L��N��8�����?�k��TEi���lӐ��>����H��-,9�SmW���2��*@����M�A�@az�LHrg��y/V���~u�Y$uۼ�;r�g�ǭTnI�+��\� +U�T���!k�@�?�]h�E�3�C���b9���+��8e�W��Ƌ�j�$�2{K����疍o�$�UkG��g�ߍ���=z��p����~�I�ҁ͇�/8~w�D�XO!�&C)�^T~&r�4YB� +�A���R4*����%M��"��h۽ <A��l(L����x�7Ľ�Nt�A�~1o��b��j%oզ[�o�3Vt�Xw�@��9f���![8����r����U��R����wdX�2m�rjiz�b��w�"ռ'�[�̯P�7`���2ߣz�hc��/�#��#���b���W6�=�$���+��C~�E��rD�\��g'��F��JO�ʋ8�d�T�z��ӓ)@p xO0�n_�5���/�64�\����3�ũ�Y���4wκ(��&٢��W�7 +���9-����>{�� ��R5� `��#7�3�Z\]2�2 H1�h���c����+�~���s�վ�ד����6�X��8$���i #�Kog�pҚ�xlt� wk��3"�Ʌ.�����>��˳�IGW�����TQfw}�*�|Ë5=�s<�e3��2�0�aW�*D�����T�w���D����^�����}z�VF�;�d�Ox٧��8������N�C�&��/j�,�_�t��������DV��N��A�HiS��LB?N�L +�k���Y���D4[x��6x�'����W{4*n2r9��5y�s2��<�w�a(�Ȱ�GN���Ec�����X��x/E�O��V���M7 �<��&o9�M��*E���g +�5q .1�aWƒۖE��r`!p\�y���.� +-F�.:�cy����h���Y�7_��C��.��`h���34C`�#����+���ӥ����Pw=G�z&�X���y2mb&h?k�^��B=i\95����֓�R���!>q����Y����D!����S6B:�8�m�YJR\��� �M���Ge�BW-b�Y�U��k�6A���7>Q������~��$�V �K�7MM�9_X������\�@6���A��ON��N +�K&<��"��O���hb@:�H1���#Z��d�~�?`�쳄A�A�)��y�b�%�`2�2.(AJ/P�bH_���U��)bڜ��6�G<�<�V�'��ଖ���F2~��cڜ�r�ڴR'Z�ī��?گj�Н���v<kv�7F'�����nH�E���\������Ԥ�F!�9�xt��$����Yt�"�wD���Ӝ�� +z�~hY��7XY�������&¸�����y��\m1�8�V�lhm;��>_��� [=w�Vg`�4-=s�O~`����^���lEy`�J[��F-����k���4̫ߒ� +��B?~��q���}3b[^��Ʃ��1��;D��K�(���:+@���&G��gh �%� ��8�~�3w����7��Q'���к�U"��J!?�)أ�f���?հ��������ϡ�~!���><���6���5峷k1��t$2X��O�ݵ�GqF��J������lu3������ ���2{�f��,�� +:�hU �����UkcW��h�мJ������0(b�y�L��mb��:���+_���&�%�/�Z@kdJ�f��x�ޛ��[u��i ���� �����I�3�t0ҧ�ta2�`p��{��^�2�|��_nv&�N?��բ4Jz�,�u2x���!������$r��湯��<��ǰ0L��e �I��8q=,��a�7����U-0A8�J�"g!�O��7v�g�m�r����XקN���wA�8s�R�YQ�E�A/����jklW��73&9q�j��5�:S� +anr� +�~T�'/��S��;��N��H{���0&��cj�.ɿi+d5���3�!�&�U4qP�Q��E:XaU:<D�+�Oc�=PW��0��T��rSC6ԬC�13�Z =_�-�������Z�}B�Ě���t4 ��Q���@�����ڇ�J7|S� T���-�G<c˸0 �0�$�np�?[�`&V+�8S��_�N��\gR����3~}�'���-rA���`�.A���G���o�2DJj��)~���>��Q��A�����O۟�X�%�c�ڬ"z�t��$�t�ֳ(�-�����R�3g�dYb�����n�t���u�a��;�L�^/�'��L �l��i���J�nu�oۿ@��l�h6�2W��ë��}�I��;S�p�f\��7����` |��0�}YB��%8uZz���Bf��-�����w#�g_q����e�+�~Y���eX�C �J��"�TWð�k���� �����*X�"�"� ${<��P�=*�0!<kBo��㬱S̴�e?�Z<7��ni�JV��$��"���r�c��4���k<��/����%����:BrZ]3I+��U{�'��>���9f�}���P�����`�,�K2�=��E�u��n�u�k�XR.8�W�$�cfd�xw=��+Eij�k�1�ws暮�#���:��hw�VU�Խ��O_q�f�\)� �P���\���ԑ��浥�թ��Ы� +G�ǯ���.�A�?�/�r��SS)Щ���ta ����՜�����BX@����9~���GLj �*��̨Xҫ�����)��X��V��e�T��뿩v�'�ڝ%�a����ՇHeaJ���z�W��e�d��FFߞ-9b/Q����%�2��@����E}x]l +���+.�ӆsÏ���fF�u�M���3^]���{ �?�[�-�6�==�u�u�e�^Z��T���eS?G,�����@i0��]?��}�C�M��[����`�.�=o7D�<��.�s�Y��ܤ���QȮ�Ĵv5��wR�*��� + +-�)[ukXu;����p���� +��������T0�v�>c��D�S����.D}�ӟm�H�e��E7�br���@(��D�)sۢS�(��=Nդ�����Lj���<�1�#��~))x�j��+�'��:S"]�.N�B3s +/��6��服O#�� +���H8ׇ�'��wx<V[?d�r����@�x�9����KoME�4�*�nF4}�PHz[R�x�G�3��22װ�-�8Ms�] -4'x<]���݃�~��\�xEvd܌�\ ��6��z����?dj!����[��"$$q]La{��)��k�Fn�R���p��R��R�mm�5��M����H:����y@{�_�4���Q�_� �y�*��r���N�y��G�>�G{�S��miI�^MBۘ\�Ƕ1do������!��`�tQ�������^�4���)�Vm�?��r%n|�P�N�e 3�_j5س�z���9�,R�V�D�ry���%L��G:��?�x�h�إe��>'u~ue�=P-d8GQ�8 �x&x����xs��� D �%�h&q}������<��b��^%Rz�d6L�\I�A�.��@FT�h��c%EE{�&}E])o�]���3E��z3��ER��6s�����`����(ӧ�Ѹ3�^��A��n���g���U�$�c#D,�YfQν�tiP�^[F�1'�Y���E�i��Kl�w"/�0���PCʁ�M�-�X��ce�y/�n)t�U��U����6V1 �fc�C��Cߤ���jQei��sE;��4����G���+]@M�����V�ޙǤ�T�T3�nj��M�"aA���pV/&]������[Icʅ�tݺ�X/O���*�*�W��c�y 7�Ms6k���Xf]�u +1E��-�I �� ��7{�+�s&$y�u�����Aqa��[e�/��I�S�?_� +6/<R9�k��L�N�LY؝u����B8N��e�JK5a�6�$3 �OYMY����Eʹ�B.]��F�}b@��O��5V�]�;��+B���V>Wz����AzX +��KO,\�E��:����=������L�Q�7O�L��a��Ϟ��j����e��C)��M � �`e��$c��PrbY���h�^t���>{#)�����n�&ل&���$%�L@�?i�y9k::QH�{@�gX5Z�K�zQ?�����K���6ސ�B�4�����2('���+�8���N�O���"�%>q �kD��5ڮ���+Ţy���I��=����NlUyhi�ߜ%�t�� Ѣߦ<���p!N]��s���q��jcN��{��Y�{����<����3�3�^�:#�08�)@wq��?�'_n0�<��ʢs!����T)솢���js�X��9�fB*�ʱ[�Kx��Fh��fǖ�m���7��<f��=&{�A�ְ�|5G���W����j�w8�JB��p��D�}4�C,���7��e�xʾ��y�I��3C��0!�)}��J�5j��y����NȪQX8���0Q��Z��&@`��G|�3�^���3����k�6=��L܅��cD�����o�m�N��ܔ�?7���Г%n�$�ℕ?�>�s_;��;s:��QNL�(�aCX�ɀ���ɩ�։r���� �jz�����,<}�x�,y �G�G��1J�ȕ��[ޟ��JrAw��M']٩��S�ӹ��_ߊ1���_g����`^�)�b�2�q�?�^(-Ü���2a�����K��f����Tm��L�W�^�����9��풅-ԧ]���@�XsG���b�nF���b�mr�w�A;!�Ov��'��DX + 7�4��?��-�������I���@�@�Ԋ�i$N)���ovܠzJd8u��T�X�h�a�z�>Ї`�Ln����U��Aַ˿�GF�K2coe���^��te�3nC��Q?�n��'��>��Gs�c"��� +�U�����6�L�z���+�R��k���0|�G���-.�L�3,] �ؔ�F��4j�qq%�o2ޯr��܂{o�~����>�� \���})����z���F��k�1����r�W��?u��� )�w� +K��r9�nZ��Y�@�{\�ZNhћ����W�= |�H�A#�q/I�~|yf���xbÌRe�O��:�����Lz�L�6�(>�z;���<�d�������Y�"�ߘ���G�+��Wa��iϪ�2� ���[YQ�(7F��G��"��NdS�N����T�4M{�(��CW�k��"<j�s2�Ֆ�+���~����ݫj�/Ω~>�� wځ ��<���̘��_���HO���ĕ$�"Q蝹�VY1ѸOź��7⏲����\]�q���֭�G�i�M����la�/�jq� ��IUX���P /�}��������C�!%B�l�<�d~�{^T�w\K$0H�.|�rX��^`h8J����?P��Q&ؒ�h�� W�<O�T����d���F�r��G-��"wAj���a�@1ǔ�4�u��iHPu�8 �'@k +(Յ����b\�z� +���Q���B��ᙢ��rԩq&y���R?�G��c��DQ�,��m۶oڶm۶m۶m۶���A���7��X�c����-tƇx�s=]J� -�yo#�����;�<�)_6� +��1UV�p[ +J*!"}����'�/uDy����!�Ң�w�v}�n��ԩ�!%�`:P �Y��J�S/wڀ���@�]�') +�C֩7�@Gڵ[�F'TAȻNk {j�\fT�]>�1�6��\�1�;G_r٫���F�~�l���M̑�����Q���H�5�e^8���{���;770N�����s����|�F��k)K|(��.,#���ߡ 3��$��7iy< >7$��:h�Ǿ���ܭ��~���8 ��0��O��;�� ��\ph�Z�s�[��/Rˊ��0��zi�a^����Y��ѩNП�������=��r��\8�U�*B���<��n�0���Ƕ�����SH 2|r��, �|�9�Iy�傎Av�_2�J�D�اj,�������YNkx���6&�.Q��÷"S۽!�.,��9'���@����B)��6%A����$��6)���J�!w�N��?U�����<��)}�^��`ع>L�Hk��<D�@�����91� [�"��>U�y����5�y�tp"M5ш�}�L@��asg�Vfo�_�Fj�c��J<g�gJ�:�;�� �n�JX���:)��I��u�8�M� �C�s�r�=�.q3�J n�%伖�b��V�Y�?�Uv�`F�W���ZF�l{�msП�"�H��RE�b#��u�9���F^��"C, �����2�&�����*�В[��#�͓9��4�}0ϰ^f(�;%N�b�?�)��}�܄��'�n�==��n��KV��������1�F�!�};y�*���(-Rf�Ӈtbm��I��'۱N֒� +�O�^����z��*�É��ǾS���3'�o�7��]��������L��5�c�7OL*�|�<�Er2,)\�ԭ��W����z���J�����wӘ�6�G<'�K-��QA_�,��YQ���_1���yu��A*aL�S��y���G%�1/I�R������P�iUO� Ѵ��M� �a<ͤ��˷]�>DR�L�q�v�l���aKI�&$���Jv_ +(����9���N֎@�q�����)�Pb��岞7[���j��P{��F�H^�{���fS�G[����<�R�@���T��GX�����7�|!P؝� q�Ց��}���@(=bFz%�#+:��7Ov7�ߝ�Ъ���� �Ae��v�S��Y����&��2����ވj��m�NJ@.Gg)������+v�Yi;:� /c���* ����d5u��r����I&�B*�[Κb�S����7�?H�djDD��l0>4���ї�r��3�Z��"%���$��c���4�aF�u/�Zx�4Q��ʬ�9��SNU�;!�����و�T��Aj�$J��X#�LrW2.��yap���j���ms��%��]��1�_� !Vա7��&���9̓�%���ΜP�Ks���D�����`k�6l���{ۢ��v{X{��|�����Lt ����l�Bb��]�A4`��C����" )���f�=��ߢ�ߴQHS�\s��;1�!�UqZ���7��S��J_�7J�P��x�1r�T_e���cJ�t�"�kX���Tq`��-���p�� +���)�OYE���"��-��k����^X��3�z���' ~��Y�D�"H�4��*F�H>2��{��m�#�MDk~�~�,}��IY���}�r$������f�s��m(���Њq�2�~�Gk�}�W���x����30�ڒ��d�xz�Hܨ�v_G���}1�4���U�P��c�q���p�J`ͣ/'4�����>S^�iGfV�z�E�����d +i�wo76���'����z� �#���H�}9���E�6��R�w�P�>��9�ylX@�z����GP�|ޘ����-O���2=�MP7i����x3"������{����6q�˱I�G�˃}|�>P����ʤ�j�<� +G��P-6�@��g�@�� ��*���-�7e�ʂ�Loy���L&��.Q[�j��TFg$�ӷ��/X���39<4M|�� �{��rx�o�����*oF\�F����r5�}(ݥ��o�Y�v����ͫiG�G������ +������Wh��0[C���K���E����|����H����K*�j��zr��X �Taz�?vc+���6���+���֖v�Q�ɗ!� ],�mp�Z�0-^��{-2D�ߒg�e��?Ҹ +&� �xg;&�i�5�=s��7tE�P{������C9A�D|��[4"q���j���x9n�O1���ʇ��LդúO���c?��)����i�R:�1�nl6��9튾�Iq6�[s��p�]��ф�!�`Rlf��yo���I}t4��� ���QU�זi��6�0��u��A��8�Y�.mMզ-@���l�����p�폭�H�6��<]C�4����s!��Z}Ex�Q��h����_'�E1�2"��K�8` +��H�ӾI)t|�ו�PAj���cgJ-�c##t.���"s��T7�Dǂ|����5�F�zS�&�W�ae|�]�K����-�g�sn��[�����=�ò�H���^�d�8-�#m��VZa0*@��NB�\����w&c��ZBF1Pֻ��j��k>�$S�{�7Z���D�5��p�%�Zĝ:��>�Rȴ�vok�˓cO���~�c,ϨTs/��D�P�`5�Ǵ�x���z#�h��|�=T�� ���4dD:�s���;α��������t�wU�~��:�C�[Z�L��ߜI/Ԕ��E��vp��k�� X�P�,<ʘp9�����Y��Z>��5�f���R�0 '�)�'7!}���x�iO���=��W�����{�]��Y ��e{I��H��P��l� +��Q��x=�UkND��t�#?��g����QR@�|}����n��G���8��U�a�(7��Z�K��g�:tf���;�����]v�=�@�F��PCB�3Ҝ�V�˄���[����Ιy�R��%#�]��z���F�p�ǶHyVj��SQkJ#�9�;K]i�0��Yo�=�#tK�9���= =eK,�j !�%�$����d�<8Uq:����=�.�"����Ɇ����{�vA�d(L*;CS�2B�/�8C+�28���%'ȍ`��D9 +�L�L)�k�ZS(��h➳Pu�tU����x�âZ�O���u���b����_�d�_���7*4�3�P[U�_�R������T%&i'T�5 �O�`�\�Q���J�ej����L�n��#n�ʺ!�z��S�EV�w64�<gA��^��&�*_����9 ��){�0�ˉY�-81ST/^tgz���%�J`3�4��i��Tu^��썵i�Ԋ�v̯\�^D�#���5[��7���cb-`/f���S�8�Kof��O� ��a������7r�������� +X.���b������P����:1��=!E^��F����:FA*k���0����"� r�����zD�t*km�K':�.)a�A��������S|�1�G�R<^��\{�2w��>��6"2�7� ���W6��-S��`��*�`�a���k�N�06�� �m>Yԗ����]��5K9삧T�� +{s�q�yYf;��<�S`WH���O~Xo�����M"L����Ƴ� +��]��|��Qɷ��i����AŊz�����3s�ꍒ2�Û�Z��3K��+@|B�JWH!�'�����R�n/ +�,]�h�(@J;g��:}1,D���f8���Fq3R˿>P2Ȍ<_����K�Bq����X+��#��#����$SV�:'c����,�a���/!�3#�U�N�ۢ|��qDn�S�%�vRJ/�rwї�S¬�i��hw.B�p��M� ��g��� �KxZv/�gs���V)�@Ņ��5ƬJL�n��4Ћ6���u��~�m���l�B��h��7��ޙ�GMn��t&�� ��� ���q�'U�&�!�:�JQ0%ʅ>'��vIq�k"�/r k���Eo�q�n��jM9��ԋt��h=I<�0F^����G]�E`:�ٞ���S��2t�b�C��R�H&�<|���0�F�` +���݈����� P<�D���i��h,��~� :o�6��{�R��-Գ���F_�^�P�2���G��<��~����z�%_���"5�?-�'�)��3U��aƩ\hcW&DŽ�]��Xe�qnX�&5��N{�gٿ�����W�*M�&<Jђ���,�Mm������M�����m)��|F��#��%����w����� ��I �x$0(� ��ôf�����3D8k�%^Z/���b?����K���;0@�2y=Q��H�z+�yQc<m6��[<�����T�2��B�s �L�8F�"oP8_~[W�<��*s3"<�-������h8 ������d�c4䓙�&��Up鯑�gx�&,�2�U�y��m�Fk=C�H�E�a���E���I�6�pw��[Τ@�,R�JW���@_�5J�����~�r}��6^7��Aa������@bOڝC�����}��':9z��П�qp��tiP/�'�Wz�zqU�~�ÿ��R�)��e�Ή�2��= +1�����q��`�Bz��F�-�b,���֧��p����V�ސ�N��m)o,��E�����$�sV�n|�8�[A)�,$8��dT��F�>t�9�\&���K�@Y�����`)�B�m8}T�� +��"��jTyѩo��v�Mh�v�=���kd=7ܕ��{S��h�; +]�Si��ⴝ���*Gsͽ�B�ԓ�H4��-s�6�G[��Gq�nhL�rgH���9�Z��i�0�Ԓe��3I��8$RL��%>�r���Z���M�淂�cxl�j4tt��,�c)���#�d�N�R�ن3=P�Ѡ{�</F�<~�2D3W��%LQ=�Q'tc��d��&���x��!*�8������=�l���okm�_�3��Te\�:/�9`R:�"�/���wn[����J�QY��q�A(AZ�=X��oұ����B���fI�R ��Ԙ����D�f���Ѡ������7���|���!J���=��le4��,�tͧ:M�w�=ꪗ��� +��[�{>�Ng�a�6'+�O��Re�\��>��T�?{Į��9���: U r�����~�\�l���Prg/l��d�H,~r!G ��h�kj3�z����<�T}i���Ѧ���!x��`#���¤hҿb�\����5�Y��g<�f�W��&����t�w�F�F�6G�d�Z�[�vn�N��\t!�#�-���M_��v. E�C�}'���d����(/����}�^hk:��A.���lT�U�6U�ؕ5��Yň2���v��ͱG�{���e��O�'�S���h2+7�-T�BJ�� �\�S����᧚r +9���rM��稼*Xd�ǃu�g� �R�2�Sо��4P�m��!"�7�R��� �U#g�[�v7��]��g�w��F_�'�_�@��'N!�A� w�5�CW�:��jy�TH���N����a��p��GR����y������j�c؇\�j�[�O������T\�ӥE� �<�1��c<�MfX0�mO��-MD�؆!ICb+���(I���V�����,�b�!��UeaC +]��>�W� +�˔�v�+�՟���Y4�Bc�9!���S�hʿ�-X����W�6�ah�����^�� t��QV�Eb�-L�D)M��s��։_��W4��ڪPH)v�������2s�.�p��'�B��!�y�W���w�,9]�Lݼ��Ht�?���}�M��C�QZQd�v)~U7|t�36�] yʪ��q���at�9�`����#DWF@V9�䋴(vcX)B]����AO*�:�Fù��F<����]1qW�h]��EОe�.�[>��/����ϧM;O/銎䭏¯�{~�K��Ƽ���a��<�J�yf����E��BM7���2��W��~���p�/0y�j�7�Y�=��U[66�Yo?'/�Cl�r�5�;%',+�9z�|��(�}~L�t�c�N�LV��蚪�Ph��:�P �������]��INO�?J��z�|����&��Z|Ƽo��S%Ոb!2��Dzp p�/R��̖��0�m��2��ȹU0��f�kY�K��Βxn���(�o��x;V[Ů� ��������`|��5�nyQ�M�d��������K7�Lu��5��=�>�f����LKA͛!�\'df� �^K�:�� J�M��)� \} ���gG���S�Ū���m��u�'bc��['W��5��B�u�O�`���i���;Y���^�M��Rd�yop�~�K(Vf��������ym.�@'��5}�L��� !�F�=����9��9�3EK!猺:�kK1%��d��%���3��&�&���t�l��/&s/i�"OsX|�Ԯ!���t�|���$] k�`o�,��5_�-̔b����2�J�F�J%��00��u����汓C�`�qɩ��fn����Lms�Eꏜ��� J�����_lQ��������כ� +c�b�����F�@k��6D����I�$�bW9���C���yࢯ��S}��+�}���Q$C��F�B�t���4�}�?I� +r�:Yv茍3�,�J%>J�n8RG�d��Ğ>�������@㧀V�a�q��x��9<&�gUk;�D�=�'4&Q��Ԅ����U����(&{f�w���P#�z"��gi)��Sv��X_.zև��i�4��N$8�~H�Q~P�H#��8� .���4�}�� �� �}��s�~�x�tY'��2�: +6�am�{�Y��^�t�H�\Q�_����al�w�.��C����A����,�iO���h�{��)�-��w�9ž�}RT���|�-� +�s���� +Be5��F,0#��G۷QLc��V!� ݛYf����e��&���% ����_��2�]�T��o Cr*�'������j۴K�#��w���a���U҈3qE�������)᪫�6`�Q$��dJ ��ۂ��|�^� +� ���f��i��S�|X�Qx�ʡ���&Ё�*��:���+�-vC{ ���l��(������N�z�]1P��6���X������-�����D��dXc�b��.ѩh����ؕEg�������3��!]הC�:r����V�����h�#�E7)[���_1�'پ7�~��2@�k�I֘�[L���%����h�Do%��%�-����!���[l&4v/D��I�ذ���H���`��BG�;�?��Ln���E��|��m�����(y{��M���Ն���a������Y^��v�j= +���d�Z�%��r�,צ�=�$����⼛G�*=RUw�X<>&ι�U�oN,��w-a�-�]�|��XM����9�z�������6��35l��A%�OlZ�5 � �������[z��5����_&U_�8d�����G�g���V������F�x�k�����ɖ���9m1{�I(��b�����W�k�3=!o]����s~��Q�iŬ�g��Ch>3���g+���ʼ=9̆����-yy�^ ����{���b{-���]C^M��S�����N|��&�!x�en�C�E�?¨l9�=�)��L"�lFV��]���K����F����ƍ���N �^��ь���;�T>�2�:� �~�rI�lO���H�/gb��H��ѽ�@jt��5�Ve���Lj��)�:\LX�Q?�϶�J3$ !�����v�$ ����l)�?r +,� �:�G&���C/1�^:�%�m��5q^B�)T�>w�H9@|��*=�l�_��P�z��;���������ZW�+�t��5*2���JSA��gm���}3�dM儏.@o�>ܔ��߹Qv��~�I���%s�'���K]��Y�4D��O���[+7�'I��wP�w ��˜'�B����ީC�A��Y��鼷��Ww[��Li��6�}��ez��� +�П �Gw� ��#dg�|���۲V��N� �HK�f0�9V`C�0T*d��y�5�[E�#�fl:C��f�����!q�*q~�$�8V6*z/ܲ�&����m�.��æO�5�2�c�R����orL����"�#J���o��pI�I%mr�BA�� +{��S��|���Cdw��@��λȞ��V��?�?Zd㯥�p����q���ҁ��P��lQx3aE�0��u_����|`�ME4���tN���qB��nj����S�ы��XP��5���Q�t�y����mE��F��R�u���f� b��������?�;����F�� +}�c��W�;!r�����e�XL~�������*Ȓ����I��d���&�p��lZ�v-�Q� � +d�n�CP�!;]��V.%˭a.��&��:y����4V�ˆ��vj���|s�&�59���qyҖS�5�({+� G�����<a��<��,�ж��6��ZA��A��c�i"��q�6��i~�o����G�/��놔�?@���G��Mޣ�l����|n�@�p� �<�:�#ErF���ᐻ���u���'a�~������ws=���V�i����s��9��;�����>}�mI�U����鼾3��"oA��Ek�bZ�>�H��� +�ӗ�v9n�>u���>�x-V>�ø����2�n����Hhw��i��� PE,wO왾\U��ę���k�y������XIV��Y������ܒ ����8�������å�S�9Si��)����=9B�Թ�#`g�}�"�Ϯ�598 �X2 ü)�:8���II�EtYW��|�d0sRйz�w�y�s���x��:O�v�w���C'-���'��ר +�/���>��ۋbt��h:tDH��e�i�`ߤ�!���/n�ut4]L��z��x��#�+|5; +�ם��[=��l���re������ a� +�K5���v �����躣����ҥ��Q�I ��J��g��u +,U�W�Wfi�eֲ<�K(�4���T����s�<��?������Xm�l��v�W�i74�u�nV��x���*,�����ɹ Z#�+��k/�!�r������`������T�V�9s���L�%�z�B��/�8� +VQ^�c+���3`*G_|E;���%o�y$���G1M�$eQf�4�{��h�� +[!ꏧ8��Z�����k}^D�:a��s� +�mo!�~*���L��]j�G���M\��<u3O+D�xdJ������?�p���*r9S��X�������=2��"�S���k@"�GW�����j^4%�:��W oc�a�v�lKȧm����T�K=��-v���)of_qN��;��7�rrМ8�1T�g@x��Ϭ�^�A��)��o�}���� �a�pZRZ!���8@KF��!�Qx�w�Bc<:y��d��s��g���h�q�bUo{ ����Ov�g=�@w��H�� �Toif~�[d�P�0���� 7}���)s�js�xT �*n�?����x��8v���^��q��ߠ�Թ<���ܪ#G��B,��bbv,�u�L�a\���I^־�g<���$��ȁ:���f�?jM���nrCövI��c#0���~�"Vjs��f���w>����_��|bݏ���'��[�L���菙�����I5hr&"�]1 +��j-��F�'cN«b�e#��1�yws� � ��� ���@���]qs�k�c��G>�g��9&�3z�� ˈ�v�dž+����6 4����Ʉ[rw+ދ�m�xuԄu��;!�.3��E�y@t���i�������"/���^���-���������k�4����戒A6�w.�9�n �u�/���H�3��gy�Vo+�%6n�/,O�Q�>�12���p,LS~���� i"_�A�R��y�-Ѻ�B�k��h�.�j�"���.B�Asb�r��R��\D�H�܀�m���\�s)F)t&�'�i�紐(]�������)����_�Bxm��2�2d�#o)/܀�M''�'�k1��#�wnD2�Y���� ȩ��b0Q��p�{��cBp�6WRew�T]��� ;�S�P5��Ŋ�qE]����Ik��)�B����K��9�Bi��ܩ�^E�/TOn<��1���j�m��A]H��7 �(ϋ��A%'W� +��}D�Y���Θ��hT�֦u�3Gn�{J��*��dn�TI� ��8�&�PN���(Đ�_�=��<��%�{��?��\��R�ѷ�D{��&�f�����]���c��E������BDZ +�]�u~?�)A��y,/;�:V~��N�?ʐ����g�ь������Q����: +k�r���keA���:�ܑ��P2��v� ��>��\i�*�D����M��+�)���6�I��Z1s�F%�H�=�ʠ�BIO<���Yp�?��r�\�K������e%}^����q~ݲ�L�)��7q�k��i2� �3K>Z?2�1 ��^���G1����}��DԾ���&OU�?b�@đ0ןO8L���b� �������(�n�z�Z���/Oxxq4n;,����/}���>���x��i��B�z�� +�W�H� ���e�1^ +ޝ���� +M�u6z�����ڰS�]�\0ܮ��#x�l�w���M�}⾑����Dz�ض儦J��~�Z?�3ς]�l]h��p�)�t�l����P��%�x Uͷ:?�� �1?g!ܺ?��%ISPii���o�>�Ԓq��=g ����SX�3g�������R�� ��� +a��1Ă�bFS���,���g-��7��.~��ָ���v�#)��u)�4�|�{T��p3n`�Kr٨找b~��wv�k�5�Z��l�!�K������a6��u�rթw���10LtV��S���X>f��*͎�v�!�#QbO�8��'.����0S���`Hsp���t�B�Fk�yH���� �o1�pHh9�6b<�R�Ld���:�Nj�')������8f<NT�9�1�,�о�1��>��k�����n��s�.41��_���N���i4r>X?��9���.��ɞ"�?Uպ�{��џ�0%?��Vxq�^M��B�l�������_�뵆w|wΡ +L��)8q +��N4��Ez��XVw�}зN��TJ}&!Ɠò��J���o�e����F�cL�In�슉(�����.P����@�7P��e�e*@�2�F��� <�%,Åa��4NJ�7]���'N57S�3�-�r#��>K1��Pu���=$O`*N��jh����y ���}s;mec��29u�|}�9V�Y>�>�ֲ�s��ޓ�x,(�8핪���祻�{If��:�&c�s�V�A����i)O�3�Z>A����Dc������cD��i<�M�������xTsBi���[G�FL��s�l5=�kZ0>8�L�7)�|�C��=P�Jh�<�hի6��|䙐<�LO�Qi�� ���>܇m=cmCe ��ob��7��!�� K*JM*��}R�#a'����-�K&�Q^"�M�azDzcn�#V���u��B����m��# �GI�T�,cP��t�k��BwdN�lZi�CL +�$Wr�T��W4&�!v��B� HX�@�Kk3����<V��{�b��1���'d�2%C����Rb�;+z7�}��$7�TN3���T�l�B��n���`搧ճ0����c�!�C7�����}�֜~���578��| ��� +$IǏ@@�^z�X_ہІ`��7�q�Z����ȿCܡ���p 3���ٰl?���ˋ����ݲ�P�=�fP��$��϶g�9<y�f�A��Z��'Y�J��F�}��a�Q� B���p�lb���k�������0r����8���Z�Z�X�ܑ�K�}�^���d�XXݜ�%����tHp�ti�Ee�a4%�n�CB2/�Ѫ�Cg5��<�@�\b�|�8����aO�ÈQ6o�����pI���B�b6��f�/��#Z��/� +� �dhJ!�C1�D�q�|�.��}]���Z +��,{����@+:C�do3��:pl�3}�XR5c(�|�.;��+c��r��0�&��n^�8=qx,!�@�����Õ�{Jn8\"� �*�*r �;j�M�u�x�����<IV� ��Q]Z��3�̳��~�ḑ~';,�RJ8�S�G�)�����i��vk���X���+��`�ꣷ?�x����|�!�A�M��X�p�IB��f��Sq{�,��^��Ҕ�-$���O������j 2ô�/�J�e����WVa�Fd� ��Z����m�����SK-G#`�4��~���*/iZ�2a���"QN� +o�y���f�@�J@�;��H�ޖ�(?����'x0��煏��5�?���흆���'f���,�Z��ʵe���n�H��_���)+᧠~z&��2�᪶1�[G��V�I�R�?�J��8I� ğ +#v�鈲�wڨm4��=YP��F!m]|v!��p�+g����g-�Q��4z�֮d@1&��N�Q��Xm��t|�ha�睽�s;� �� �mѐ3u��O�d�2:�/˄9��%j��t=\?��Ž6�|��È���ŪU�M�_���(�,���%p�8?EF�Fa}�\O!�\B�%�hߺǹ�h�~�9������W�yn����X��C���nBi'�-�F�h*T�џ"1���5�z���T� ӌ��~��a}c�x����q���6?������_��g;��-�����,:�N�����~��Ö�~nl�n�GA,=s���?=`$����H�m�o��M����2�Nwj��I�U�q9��-7�_Y��?��5H���r��/��`��Q�c%���B��:�!{��c��5�yգ�=L�b�m��Yy>@��u� +ͳN����Ǒ�-OQ���'^��������p�D������d�� �� ����=4BoiL�Z��� +���խ�)�J��O1�i4Hq�������z�Γ�X����"�]L�0����9r�0��J�9�Mт!$��!kൗ0ۍo�M0� NC��\�������ŵ��s-=䰄����sU���r�$�Ţ˜�g��H�¹�O�m8B����������N�~y��F<}GB +\�+���д.��d ���04�)��@m?�7ɯ2�������Sҕ�A��]����YO�$.� .�f"�jp�Af1;m�sޤ�M�f7��!�'��h?�%Ң>C��F<�!�����\T3�u�(�CO_�QW=&�����汱 ��'>��Hv�3��[�'�/���C�=����R�����K�Uv`�pw1�dҠI ��^���j8��� Rp�y0���9��yjH�e�]�w�<��[@��>�I�ć�*��E�̮2���%���\���U��ӣ�`�/<}p�74叒s"E!���CI�-�V�Z���$�9ӡ?�&��2�?P��#k,0}k��@פЪ��G�#*��R�+p�#��:;�ӽ�ʔ�Jv�����%�GȂ� �[jI"�Խ�KYY�\�[��Bv�����L��:� +�O�(^М�FMR5#���I1�/�Ŵ3�M�<ҳ�%��̗�(��Mb5�,Uė_�IZ�֕��@��^B�s�~�/ﵷA4�`H��#S��6�D���<�^|��,zĵ=��\��?���<b��r���%�2���-4�z�h������G�-��p�*�q?M�~w��} +���3�4j1B����.A/�a]JK7�>��D�I��i�m��$g�>b��� �1%K0ܬ qg���+OA��B?���%��N��ܤK��]�a�w�G�C�����������B���N,2Y����֎�k��2_�iہ�A��@!�����^��������|�n'l�T�=�d�������*�);���b&KԆZe_�7g���+).W컼��T�f�u�F��1�V����E�.P%6�@ϋav�=ț�s>�}��_���}M�m������N��e'8�p�̞{�����������)I8��7�6��B< ��W���Ť����y�j�G��B(j����d[T��F�n3��0�f���:Ш�u�.�:��)�\d�����0U��w)l)�nŤ��� �3�D��(䠗�hp��9�3&�"s?x��Kb��Xu1��{ҥ����]H4|͕�A�Az�F�[ߊn<��p�ڦ [�܃����'f���O��.t:b��~sf6��P4������vя��8`#�ł��&2�e�гa�l�0��ѢLt�/<9�W��k,��Es��CҊ�MJ��r�_��m� �����[��o�ќ �)���rO�*���I�e��1� =�p*V� +qK�N���͛c�m���ٸېA�1�){t���,ҝ�k@oదb%o[��x�3�y��E6D�[�q��7,�ݿn<��D�\Ͱfk?K0��U^M��!K�cwڟӼN*�|�J02�:���-F���y�y�B�N=n_��?0_����p����Z�G�Pt�0㟎`�b��� ��D��#��S�� ar�4������fp� B����_�'W�7wIT8>������2����,�F��^�3p@Y-"l;?.Z(R �F��]3�!C�?� ��(�9�&bxy�����0�\md��ֻ�t�! A�s��렚� �t�ުq�f���:�W���O{����J�uC�r̔N�-"�nFM�APg�Ѫ+Q�C +��Va�[yp�Y������h4��Z�ӏ�2��7�Qx�^�2�rj�1J����<�o5�f9�3��g�&��ӥ�l���y>�(O�W���P��4�B�_)&�=��-2�A<�2���� +��P����u,���w�ȲK1q�"���I�F� d{��[m�� �ތUǽ��� +=��Ӭ�x̸φX +�w���Z��j�R�q���wha9��J ��`�t�qwCwo��=����٤������q�r��?p@�ΰ���..����ՙv���RD�#��ø��w�,�?�o�\�%���ӷ".X�z䘀���w +�Z���ҫ������V�I��vp�.�*H����¯�(�Q@�A��aĘÉ��7�| 繭� �lC6~^��5)�v<�[����4Ɔ��'����7��R�S���N[���i�����\MB�6��R��츒K��f� ��SnC,�U'��q�;���|K䏰]��/i��h�ɟ~<�G�h&��ː��?ܕdq���fpi��{Z�1Pf2�\?E�fVL�K�l������?�����բO�R��߀ +���~�#���9����Kk�����v B�/L�{:�u=�$�� X�Xq(�����䟳����s���r�ɩ�W8�˚�Ү.��XaU���������EϽv6�w���Ա�v�F����;����þ5uS͛P���g<��:��I� BW��w>8�l�4Yp�!�9�g�ް���]E>����� ������O��,"���&_A1˛���I�"�O�U+���%�3�d�1k�i��t��AƠORYNvy�PO�X���lz2��I�,Lt#�C_z���CV��D;��X(���i�*�r��5~�E��N�u����W����B�玏g_ܱG��o��H��i�g��u�z.$�l��k���Ƭ\w8��*9���N?�M�(R#!*�����}Hc-�.C&�+L9U�B�����0d>����s.�X�w��ӳp���C��?�W\���d�{`E�9��^���?��&ys)�5G2�f��_9�ћf4V[?��vIL¹�@��⼎rV���j�"������ق�i�K3��| ������ʬ,B +�{eٳ3�'*��d���9�CE�����i:�;b�Bm�)�]� ��a랚ta�pA�m۶m�v?m�v�j۶m۶�ګm�w0�`ϼ�"�"3+2�K0��25�h��%_�1�J+���d�f�l��Q�ƀ��[����}����JZ�Q�M@�r͂m��b��v#`Bb�UsdˑNf�Q{�K��f��"��"��Ia��c )V�̷<�,�����uMJ�k�@ʔ���9�Pj�TO�+��(-�}z�qv��D�%�o�cTg) 3R`7�\�H�F�4��ebh��r� +��f������*�I�AҼ��>�_p���Gz���;od?��@<"��J�̒�o�.�u�f�r����a��H������˯O(�Y)W��� 0���1e�b�]5� �h��q?s�Q���SZ=0Ű�w/�c!P��X����:�Z�I���� q G�ZxufP�k%��e��� +gY����<!�>2��v��Z\�����#HX����}����DF&�m��J}+�����*�1���2�у�:q��6� +�AҼu�P(�43�o�f1],�?��%S�z�t�Є+��r�akC��ʺf�Ҿ����9_U^����@!���9q[���=?Փ�7&�O��n��h�XI��8���xT�bb፱��"��g�4�e_^��!M S�3�89��~���r�2U�nZ�v屢:i�3�a$ R� xh�v��\���W��AU�&���#�ҍh����)��;�+/�Y� ����N�=��} +tw��y�v_�W +|9|�Ԏ��Fރ*��jQLGTõx7�W�:˴Z��s=�a�����2\��?2�8���9�� �U���7|(W��JI��uA��e��uV<��uK�$A@蛏@��O5��h�����qp���r@��"���%C±���=����N�������O�7`hs=NY��u���f�I�I�$�A_�\<ԛ&��F�o.��E��{%���Ƶ�^+�����-��b��uL.~eVT4�O���Vtռ2�%d8K���G,{!�a�s̴��/���G��ij�mXەf)XKL�7����%�"03�x����P�zgxF^��]d�1���O2\J�&���r���NJ����#����nI�lH�Ջ�������_J����=h8�Ϝ +�3�d�m�Mdd����ʉB�%ө�K(pWH�\�;I�F���&e�*`�/e5���u]�� ��l1�5qU��J���z���Y�S^�A[�;s4"K'�{�cP#<M�~4�J'��k�Y���1����,Nk��٩Hê>ec��+@Wt����V��C�/����;)V� +��mg�!'���������B�K��M�i�h��q�J�?q�߶�RH,���=�-2�[S_���V�����<��Bn�y��0�Fs�����b�M���,���I)�3K�5j��+�*�ʱ�^.$~�%:?�[]6_��+�P^=-�פ"�!oVP�Q�3�Ob�+����9���VQ�K��is�폣���`�{(��[-ǧ���G.��'A]\�I�I Q{S�Uv/��K��B��K����~I �ct� �ȸ���!ȥj�!����`��IxG����A��+�jt� 80��sVp7p����T���� W��У�)�cV�qW�\v���{#9�jڢ���e��D�;�Qj��s+qLj?��}��� +���V~������r�T��D0�bt�)�q'.,ؤ�Ʈ_B L/jI�;�(3Qڸ4xp���Q��SK�N�Jf8����%��(��,rw�Q9| �Z�V�ʦb�L�n��VOhE���=��%�,���oxIZ� + ��w{�D��i�`�O�.���핸�UQ�iZc0вC[��J����>;���A�&�ݑ���|�u�\��4=<=ba⁰�*�K�b�J���[��m�y:��L�<�LKI*[ ��'l5�W���_�f�>���kPV��i�x��#Zr#P�-�}�V�:�w��b��1>�M�j��:'��y��o����4rgTi�ǜd��l�X��xb��c�����2R�� k�qjKJ&Q)���.�'k��Kl���˂F-ڭ��uG4����"=H�^�K����<�R`�,�?V�+�Ɨ�?�dHS]�Ƨ�¹sY����t��-�O��᷺7�z�a���{y�4��BQ�*O��]L%)���o�Mg���a)_Έ�0q �#Cn�����y�A_�ݩ�l���U�����Q�4�����u�1�GO �Ov����9Ѵ��.�sȊ��_ϰ��PC� �p�I�Cv�Y���~ +"�|�y����t/���n���P�s@��c��c�����w��_����˼����폧1�-�!*Y���g�_��t���ˢ\u#��gH/���/�EGY��x4iݪ�Q��Ƽ� ��v�xT�V��>�v�@A���־��Zc�',�7#�?�эϾ������r$�#�h�.�F�S9�A� "��C[�F ��f����X��~ڈ���EZ�Y�O�'��57��� ݼz��}���b�S=K�������e=W� +�-k�K�9�B�+�����wd�#+�Ħ�t�'9 +�����b�IǛ�H&�-2��qZ���0<���F�W_�'\���T��ͶW������a�������ςZ�`�9�]�g��Q����V��V��9;����� ߑ�8�'���wS �����*oU���zj\���P�X/�k*>n���E��r�M�#<�sXS��M�k.�fWM/��S���ē��D����_�.�悖��������R}W8��զ# �e���A� �<�h�ʬJ��_)�z~�ژQm_�1���M�{t��%q�b�l�ۙ˼g�T�_���[a@�\�Њ0�>���pbZ�N��e|�/Y���\�K���w<U��o�j&E�Ď���y�����7�{��23P��ئ�+l��ߤ�չRx�ԍ��$&��JC0�Xx6�I��R�oTt������8���Ѧφ�:��Q��[��[����5�D� Yܿ���u�.��$Q[(� +�&P�%��_գ�!r�s��Ȩ&�.������~u#�Gb��bDM�W�Fw�<���.�\ZH_I���\���y�I*;�����F�<�U�c�F��hM�?����/���!��6@i�c�Hܷ�in��Ri.��#���+����L���k���wp�@,O���O4:D�ײ�O�g<L����[M,n�g_!���7-*=�����o�����-�,�Vq:E�I!�u����NV�����!s}ؗ�d���(�'���OX!��?�v�m�b�}>d3D���,�N��}���Z�M�'S|<$�s]�WS��m�~'܆�q�Pޖ�~>�Y��2sd�;8y��h��]���������� +�Ƣe4 +�#f�5��P��3���C�]S��CoU#aM{��t��/k���pj���F[����mB��N8�y�ga�XD�+����@WX�V���� ����Jr�P���VNT��CxWaw3��De��)��q�"Z\�+�jh%'���@z��\�8!� �]3�IR�'���e� ��Ag#�C��1��-���;u^�*��Kiߔ����zd�.95:]M�D��#V�K�������z�h�N5�Di����Ɋ݄��\vr肀4Қ��4���R�� +���\�j��,��朵n���?ˇ��ں��� �D�����=��A��еX�]�D�B|���nkRue�s��x� ��l��}��2=�BT�-�M9��6n �h�7A������M�Bjʀ�Y�� 6 H���Y�u/73�T i �����!9)P�vC�h��X�$��� Hȝ�Bj�ݜ4�y٦a�*���U)HACP����|��kL�:;V+���ˉ{.T��� YQ!����~�͵cȂ; +=�(�M��vSDz�mux5|��Q����9�&ð����-H���?fϤ(Wo�B�^��L�Er���ڇXIGܤf����rmԷ@�k�+NP)�t��. ������C={�m��H���:7�3h#��d)�S����d8~P�~O��n`m"�eRfm�"��o���\oZ5�Q�W��x��M��:�*�r�M�m�r%�t����{�U���5��4R��-b���@W|ӊ\��'5kD]`��P<�l��,��Ocԩv�4��[�`��`t�����\!���G�xO������҃�~T7�U(h�W_oծ�_)�Yˏ��h����˺�Ixچ��Efa���{`�C��zcX�ca�Ѫ ���U�%��}� +��Б�C�AD�,��b�7}�������q��]�����ֳ�t��jr���]����9J�17ڼ�3���%/�)�F��i�H� ur:��� �!䯏�^�}k9.� �&6vU�.X/{!�m�+U@�n�����6U3������w��'�V����ptEPHs��)C�*f1��nO]��VS�V2�˕/�������#�:�j�ᲄ�Sִ[9�E��U��j�� բR�_�՛�n���`LQ��?1L�Ǵ�C�=����ju�c�=;�Y��v,���:���;}_���Ex����J�_�{���������,=�i���~~5�61\�����F߶ zg��$Ex^����g}r�2�?�x�a�����Y��` �%�s���`����Q��4x8X�8��i�1��Ъ� 3�H�"�)���p1k +dϘ�,FL_U,�����䛳��m�!gl�%8k��KWI�Ƒ���z/��)��ʐ�?�A�Zr(DO�������FA�t�{l�h�ɐm�/�c�1�Ϛ{]�m���Su�HTchBE���(O�]M��u �qU[�tu_����M�Xt&��44�xi�g��X�����#cZ�NS'D�6�7�i��#�,1d��'�����a���{4����>v�})�j%��l� ����9�� z(��Z��0,(V�Ee ���"]�2XՕ������r)��2�q�E�2hƪ���qme����T�ʡMT\Fr臱y��f����*:yޭWZ�\y�l���d<��x����{_F��c�Щ�Q:5e�M��ł�_�E��S�/�Dޣ.����h�7��c�a����x�/�ݒ��X�5oʂ���s{��Wx��{�����&� +�'ןs���4�e�,�rb�Kcq���ͮ��f��Fd% H�h��_J���MS���]v "�W����Ce�`�=y�C���X�q?^4N��''���͞}lB�8�EJ��lt=eA}尵Bp��n���D�uy��hqxR����K[$E�/:��6�3EР�iT��]�ז�qs��!�;�� +��~�@�s�y��蛹6ca�-i%+��ؔ�u�s��%��L���w�ߎR��M-c�m᤺�Di�$j�M S +�u���g���-�D�X;��+`�����_�Y�"�WW��D`?L�9��/eY����?$<v�k�uD���Ǿ��E�`� �g=I�[�.�U)O{��a\���w�8,Kr٘35��^g5��.^l�oyU�R��� Lb�X�AV=��Y|�Y)6�컬ʘo��O��m�^�>I��ê�X���(�_��q� ��X��g*oO �a����0~DjF��>}���(WC�Qu�M��(�z�&fh�Q������������\s���\� Ocs/��{^�Y���/���ł�I�Äb��&�c���J�!��(�� I�z�;�!TB����D� +��Ӫ�f������U:�Ή�o�qYu�����V{���X��HR#�v�_�e��=������4� �ꘞ6�^jhLG�Ig�u3n��~F1�ҩ<�#J�2�ߐӏ�����L��:U��u�8��R�]`{�#mP�@��&R=ߵ*����ש�����]���L�P�x5c���W�GY�pq���������j�ېђߥnniU�yx�f�4Oa� L�膑�U���2�Y�*}Vk��q�UR[��V�v�y����Ɨn'>Bwuz�)�JۣQ{��U���*�� mCI�@prX���������N�ʢ%�we���A�)er���c��r{���@i�\�vT�:���� �~�`/�߿��sP0���kJ���T3�%�����YJ��~���B�+E�t�*��i�]y�������k� `C�~�w4VG�[��(����C< +6F��zo9��0f�H������ +�p�� "�Tϐ�u�_�[ O�+��r�=h�'�;8x +�[�:Sx�3�fULx��&�)�{�gY�ݜ��6�?2p�-�)����m�� � 1£��ej�)}5T���pc�� +�EH�~Qn�(͐��0H��2�V�:bּ����W9���3 H;�����݄�+R�&�L �B�����ٞ!J����#�u]wr��� S��Z��~`��M�t��hĊ����iL��K� ����������]�ug�� [>�ƶ�rl�x G� �����\Q�V=ϰ� +�)�x��N�\�ׁP��m �s�6��̎Q�p����Z�����������%�+[� ���V��}��g1d�J%��o��&����yx��Y�UƵJ�LH����$ �1�+�b�MP�M���f�rOwy���!>��#�x I�>���g��k�G� ū��W�P��@Lۭ)ޑ�zQ�����ox��ܮ��JT~.�ʼnQ�����;W=�/��i��٭UnA��(�Y�P��=��֥J�F9l��qMRy�]�YV�솽�t�+�'Gl�B~H�?�#tw�D�R'�n��# ��nl�E_d}j��ӭ���7�i��q�%�Z�<V�uP�Ƞ�I:�F٦ ���[{�?Y]�b�7����T�S��g͕�Q���$OB�A`�Q,2?�A^���~�칞�u�ƭ[��u���d���E�$t�´X�g�|��=:�w���}q#H~���&�.#��ʃ�|�<u� �ˠ� #+��d;���y#B��t�����"���I�'Z$�V<i�2ʹ�1^���r����ߖ��^Z�+���Ђ+��(2����f;�e�Ŷq���^�����[>#�F*\s,��7�4'UH� N��yݦ%��'�ή7t�'�N��(o%Wۗ�<loCd���1��� +�~%�=6�`<�Q_!���'��iRb����g�@M�!� +$f:�N��H�@X���.%�ʺmRי� +L2��.��7�G�T����Up +�ߓJ,H�Oh���a�M���.�ރ6��Bf�L!(.�Yг l�E#.xY����������yW�5F�żf�h�ߚ庣 dS���{>�� ƶ ']ɺd�Q�f[�L�`Bƽ�F���R_�W�mX�i^�Э��pًg��[R�I-c#v�L�̕�Z�fO,<ֽ�_k.y/�P�1W����.r�\�<�����Pw�W�����H�r머�L��wҲ�^3�j�ZB�Iq���KF��?ҟL&_���!�ӌ1mAdxZ<�Hd�0ղ�b�p� ���v81����}0Ѣ����L��o���Y��ew����Y���0FV��q����vM��b�8 u�$�!�z��l���:á�H +����R��#�q���(�k��m^�䊭�x��f�Od���v��N��?\R�S����d5����.�sv�C�LO�î��Ո�m[�zd� ���RY�>��42�g*�^D�1���g�C�����A����������r��1�ƐX�%s<��j�W�j�\��I�'vO��f�x���S-��R���̄���k��.��w���S��00t�U+G�H/[���)1k������N��� �?����:(+� �%���J4�.��_ �- �Ё��I��m�#^4[�E���o��S�N�-$��@��=�N6���xt�2Y�b �@0�1 \e���tl�G唖L^�B=�n#�2�v�� +����|V���9ПNc�z��;�[<��, ݲ�qe��(ǽ*Ike��:��3�('�eq3���E���Ш�q/��5���Y�V{{W#bK�Z�/fK��4��Q�:��P�� +��K��KZf<������+���F���+�D�t�@�I6���P��7���E3�H�\ܽ{%���ֻ���f&o���L҄��R���8(��{ڟ�;Q�H���B�������̦�YA�T���l���t������d�@��]�����" ��4G��ٖ8qT(�НDN9*ywU���1�EŮw"������VY����,u&�ȼ�$W\HH,®l�G�:U�턛��������Y8ы�����"`����ɞt����.�S���֍�*���\� +��@r�y ��p� $��X�%��6v�줤\��wR�pN�4#��hV�Vt�C���˗e_�$~Ҳ�:�T�W��+���@*N���Y���E)aU���&��Cf�硴�\]f@�$�HѸm��XJ��)0��|�����1�"QQ\ �n�'J�c�;a�~/'��U/7�w���,SF�^3�0��� q%� +b����>��϶O�����!�C� xI���Lv�����o���<���FJgjF���H"����[�E%_����.���� L�a�vG�;��!�T*��5�<k�P=��C�n_7��J��m�\���h�~�֓WL�x��i����C A�I%!M��]�@!�����O�^��������3{B�|�gD���%��2���.���3$I_|����NJkT=����C=��7���� ��q�����& \ĝ�' qi��� �:�����&��>l�i��9�-R�^{�� �;zF�K�:dϣsm?2x���=V����m>�XP�h���p����*'�uš�v��YQ�~=�W���X*��C9��� -/-wN���������/��I���\/�;nK���P�5xN��X����Y]��j�[�-S��/�>~��ٔ_�_�m�������m^VvG��s�5|/���l��N�G ���� +��*������Ε��<���E�c֤�,>���>J� +%�����4| 0���k�{n�nX�Gw����&���_� l].��j̜�ˊ���R�3<��Vn��.�AX! \��ZY�c�Es��#r�Y�o����qJ�z?�f,���W�:�{�c�"�0x$�Ч�E4d��o=«���]��Sr�Mݍ~���R�{* +�I�!��C����Y�??�O4�:C�E�e9�§C{���C� ��e5.��g�� 6<�n��$��.:�ulߪQ�lԖ7���V�&�J��\�a�̗�=�B�߂�:3�j]w�ہ��Ȃ� �|�z�h��z��&�PI����~.�@lF�G ���e�d>=ߧ�|�==������+�hq���6R���3�^������ᾩ��<QH4�Ά��v����ݕdJ���L�X�tN^�e�^�#�t�OCL�����u�i�}�� �ۙ��C +����%jb�X�q�J鐶�%�N���6��*���Jd�W��_��� +��obǑ�z�ƾ�?��{;��E��y��8�P���VFg�x�1k�b�6�#u3�8s�W�g��;ɔ�ZK�ٟ��1��*;k��ԃU�5�f�X�SmR��))�aݺ*�X��Z%~�8u�(�~�Q���S����k��@�T)����h���Jz�il�j1gMք/j��ò��b6�mJr�+��J�U����z���Ai����S��.P���̒�k�Z�u)g��.�.VF%UHy��̭� +6d{�ur<ZI$+J���N�#�o\�1cn +I��Ym������=�C�`��?���!1�#�mb弆���-s�����e� ���jt2�<l^jzW#cB�ޗ�Y.���X�<> y�� �|f�}��?��#� X��."�P��mps�rg���`)��__A4L�:p�Ko���+�T�͇� � +y���=�#l��9nS|5�8$<YEBJ�N�r�?�5}�ۣ آ�N�����<JɎQ��awt�|c?��9���S�%P�Z�~@���Mf�O�k��#��gO��}�`ev�i뎟t �,;!�E�ZY����qo�7�*$�Ӑ���~l��a�>@����m�CI�8@H�T|�4�~�~<�&�R�/�Ě�Soฅ�.� �%U��:v,��#�82n�m����߈]���fo�A������Y���7��j��W��ɶ���Ljƌ� eǕ���@�MV*�t�:�'U�9��tU +�����.��{i�nn�H�P/p��9,&4�!F�����C���l��$*а~HLS��2t"��(��iV��j�Cc�&���;��[3��1Nޯ�ƻ�z�9�ҫT)�:��ɔ��Le���j����폣߂��8���5@7Ԅ�RW[�ȹ@2(��L5l�M�����r�C�����S-�\��岊q�/�-ސ��EG(�>���i/�����>�@��P��*�����;7�j-l8!�����<RZ��}g7U����} `��ʅ�ʑ*+h^�#�X��|/�!��knI��_��j�X��#�'�b��>�fX��b�W�h��m���j�?=0���"=k�j,�����R�ĽE����6�(�8�����O.���I�9,ѱ�Kՠ��s��E4��ZZ}��<�q/��G�_�`J�����ӯ������y5��Nj$ +�iB�o(�Ώ/'�z�)�c}��[5RL���e4�\rǤ�s�*]����=O\���lY�ivK;�˟�jԶ-�sV��BÐ�y.l��Z�H��J�5�~�l�B��9�^h�KSUaSgkF�M= <|�����G.e%�ss].�~B+i�N�����y��?&Lm���/fǩ�>��w�4W�>@�*�M��ADj�KZ5��=i&�Um�g�2�H��'�� �����2��`Q��w�xeo�}���:�>}�|�Py��R�O��]ETIb�dJ�J���~CrQ�㡢&w����"�}����Xa���fq3�ƏKO6/����I������M�_�J���s�Pޓ�O�א�=����N�����sܟ�SZ���r��3�Q�m�s���ƌ�(���ya5�a�D�����H����^�����|zW��r,���� +�v��a4V�r���jdnp����)ȃH��02~q�E������E��v�8+s��ш��:+��v��;�=��# ?�f�rN�_��+�}��d�zbfr�g�bRG���H9����6'F�-Uc +�����4��m{�U�r:��W;�)�zN�ؔB`x����.z����0=`ob�Xu��]���^T� )�<G@:��L�Oɱ��x��\68�wBg����xt��e���F�efXE��q �+摎��0=��_Α�m�)ь�e`��[��w���X����o�)�������N|���ĜH��D�5�z|0���p��@���oN����x��D�c�4��@����}M��m��n3��:�f���I]�˸����eO��6�M梿��\̯�Q]��G2�&�t���Z�}���Y�4e� +&��n]���ZoD`�PvR�αǖzAh`�<�Y����Y�f�<�Xq�<?�^�Khd�TW�lId4.���¿���E���a�m�hš)ڲ�!����~����es�~��E�Ÿ �s۔��ba�]��j����={yw�Ӓ=Y> ���[ni�.ǐn�(V��V0zɛ�!y��Jp�I�����ʃ�Ȇ�ҍ�<5��bn��Ծ�_#�$u(a��uw�}�@u Z�>�=�N�B�=�V<s��BM���s��}t�a�9�_ +o$JeQ~v�"E�|~�m}�k���>o]��x��� +�75��ZD�f�I���;�-5��m�e��T|eRu�jZ�v5X���}��"i��̞篋O�&P�\�I��dbԇ̀���H3��H��%���w!���Y�ݐM�̙^�_�:�t��,8�]0�|F�b-�Z�ށ�zYShl�A���t�VKDp�x���$ov5v��oB��Y���Ҫ�NH��$�W��Q�#��02�2�5�~�@�N�Fj`�9w��N�����31�����r�R���;�P�g%��H/�'��#W4�+H���}�&���r��P�^L{�#�i���]�����[�aۜM�W=�:�;2��`�o�*����#tT�P���?�����||�����u����.����ΪųF��%�.'F;ڤ<b���絋@�)���ʹj�2T�{�v��b�z��Ȼ���1�P <�-�ۏ�U��Ce�P��E��Vd�A�(:���f+8҅)���{���=� ���AĀi���q�1m�_��Pڦ��`����N�]�6z���Mm:���I�$ �����`�����*h!��L�v`_q�!��Ŋ�q��gB% �_�gY6��V���q��7.���l��Yt{f[ �=!nU����}pP5^�U)w�LJi�Ū�������O��.X��;�Ӛ�����e�++0�����"�=Rdb�<_���w4_�,�o�:�z5R0�%� OM8BҺd5���?X��_��.ӻ9�cE��P&�����G�߮ +�Ө��b�5j�Z\�a��Q?�x���w`� ��i����� nI1�M���G;��J�>v�P�9�rZ�NN�0ox!�о�T���y����89����5��B9E��(�-��d�Ft��IϬ����`�\�;���p�MA�q�w�xa $��X�F����c��|u��"Pes?CGq�*�Mk��8,�JE#�>�znLF(�Z�:��mH�Pc���19�f%������Z5�t:� +�B�01o��c�`T����O'J Q�O��rRFyv7t���;�pS�s�W�IК��sf�6�`��:E�9�b����q߂%�#���ƒ���ȼ�;��uO��E`���A���JK, QK�� �֥O�x�@@2&,o�4�m�ih��2k�_?��Y���1Э�,�c�넕�Ɓ��H ؿ+!��UŲ�|�ln���USI�#�x��XY��G*ӄA\8Cм��k�C��o?0�r�N����K���V��WEO�/��# )3���ʄ_�/�_�ŷ���&�N�$�cm�#ئb����N���ix�z-�wݐt�``#QT���d,^�Ds�.M�3 =S�لw$`c�}��/@'�0�*�g��g��bD��3nSG�i~�3�Z����O�oM�������T�����m@�c��HJ�[��V}�¬�U���:��ѷ'��a� C�͔VI3����� �D[sʐ8�*�.d���v�Rն�r����a�[�ܾ�Y,��$\[i�"9m!HH���L��⾬��b�f`��K+m��շp��1yUH���z9���F��U�7��{8 +0���8t����sE��2�l�Z�e�S���V.m�{B@4�/:�Ap%l<#�Qa��/K�tbcz�� ��Nu���z'`��U!�����֠{�e.M�doX���.�c��K��.��j�l=v#�����y�jYÇ ���Wa��B8�;ni���l#,Z���>o��KV��pd~���Bs�^�p������5P(s= +��;�5&�O�.��x�� ��(\���)a+e���DQ��L�h�iݔ��ezR�*���ٌg���o�[CJ� +�h@�S��j�n.��ƿ�ػ� +[�Dygb8X�.߱C�g�#�ŧHk&���*�Ykp���q\T��Q�/74\xyrL��k;ku�N���K�,��G}\��EC<~>�T��QT����t��� t�)�r��][ob����z�ݩ�R�P���N���&��43�aO-���v��Df:���O�]$/&N�ΘlLb�o�&�pt�r��Ĝ��7]SFt~��X��)���Zך�>%��bV����9��=8)����v�-���~Лe{� �M������A3W;Z�36�zu�;��Ƹ��l�K���ܽ^�`�v��J�R�9���1��c� �E�ѩI���Z�aN쩶��}�3����ejY{��s����XKۀ�̅�D �M�ݕ��X�lj�� Izk"��W���u���B ��,hGI� ��\t�����q�)H. q�xG�Yb©�a:��;Xg�Ӛ��_�R4�����O�߷������9�$���s�Ǟ1He��\T�~�W(��P����.�- O��P�03�2~�e�Ρ~��f1v�)z��<� ��Zc�K��6wb:+7��h�=���9����{�n�-�q:w�u����P� ��v~�Zt�V.����|$�&�������z샨 �a�����b�'�_���e���#��\"�6j��Z}Z���M� +�<p�)~� +U��t����i�|��i��FݴV�G�-Q�hĕ5�� �����{�AI��0L��~�����V|�[D�^���Ο��Q�ѧ��&�%�,��"��f�eH�Ʉ-]�g���4�E?� �C�$©�8X,�C�#j�t�Ys�����l��#���)E ����cVWI����G��!V,��k��y�2�|J�_f��;�[��������uNM�9�`]��^s����w�)_��кES� +Y�z�956{����!AI���㘞$Hlu:�Nϗ�6�': ꗟ��Y��B�0�(m��|�r�{�3�z>,��fvd[s����f�9�M�'7�بʽUTi ;�;�-:grp��Z~Gp��͟<�N�� Y&29(x����pL�wD�|���Ǭ���jZu<��P6��h�=��eW�a#Y�@<q��;�y~�L��-���ٵ��$>���7���à���g�%d��L�<&����5Y#�e��c�����b7m&ҭ7��-vb���hY�)�`�-~Q;7�8X4D�am�f�����drO7���^luX<9"�V�S19�*Ԭ�����@�G�A�����<.e��(����Sx��Ĝ�0KMz����K�#!b��D_���mT�S ;��ZU�:�m�ۆIB&��#���������\����� �4���f����v��^�.$�pm�� �K|���qe�4�8d�w�k����:e{q�yί=#�&&<���<'=�)��h������$/����VN�f��/���7���!.u�����0�?L8����p����8�inPV���v2�q���(��C7��#䇞�l�b˶��l+���Z%ɝ��5ʶ��a�vN���oK^�=�9<yB��B�_P���*��$s�O����H*�058FbYv��o+�����H�Ic�,��k>{u]��JR�.�_��ʚ4��O!(�Ѵ��sj(��_[���##� ��"�ksKΣ���ₑ �̈́N%�����q�Y�o|`�0�ǝ��iWY�z��}xW}���:��w�M�Or24�u"_�k�{�1������y������B7Փ���369}�", :72*�=��5Jշ_-�oH�S���W_��� á�xC�r齎ڵ��l��n�I��2�sִ[M����N��� +��n@�<�og������`f���i}Ir��������H�Nxw�,h_C��FH�6*�3:��>/�B�R +-l�����:����x�\��n��D+����5��f�8��Uߐ�F:�c�,ϝ���c���c����6�R?( +�����k��-��Kyy:֏��w�A�K�3B�غ�-��lN��Eh� ���s�z��x�Iс�}� 3�Û�< $�*�mNW�ǽ�$s�L:��#�&qਦ�1S0��y�4n���Z�m>�q�xS�\�����IBJi�%�n�ѝ��K�e��Ai�7�� +���f�c�H�ȯ������U�W6�Z}��ܣ���FO��oX��ćZ�[�$��A`|��Ԋ�'������ �V�qSDH=������6������w��r��7�e�hz�A4Moi�����y��"H=�;ۃ �',�z%��?7� +��%�lTJǘ��������"=������T�a +�P0&���R�"�ěq�@�H�Ea��Cwq���]2�AM��4�*���iIEI�m۶m۶m۶m۶m�ݻmۜ�>�**cE$�vv����6e���on*�d��'��k�����u��*>#a�u�Bd�<�0�Ǿ��Y�F��7��r�J�9m��R~�5����b ����_�vi�mU��oW fဖ{�R�W��Wߢ�1���m�?c���{Z�q��p�E�+Z�!.'>b�%)���e����z�M3N��B��MK1Z�ֺp=JK8�n��N0-�=�M�s��^��Rg���>�+�bӵ s�G�٘�LF�=P1v�F����������&�C�����R�%��B�ʛe�,��*��U�=�4vrE]��R�k*���0٩�f���t������ղ`!PZ��C�k4%���v*���� 5��;_��z01��#����T�,w�KY.�2o����û��ͦ +��P8�Rm�Ԇ�QC�A4mr,�z��@����R��9�t>� +��(o�:�R!�B����Hxa�j�N�?#0��a*����4���:�i��L������z�l�T����f+�F����npW�;#�K,��~!_l�Y<Q��-Dd~�W�vӚo�����{pK���S����Bo���CR��m�{�8����n�b�].��>~��kH��Χ�� ���I�SWa6A#�8�#��d9�jITpZgZp~��~�$zW���j�BrZ���Co�tS��6e�W� �L�/?2Jg<X0�Y��ͯ�0��W�`��V�=)ĚRY"l"I�%=����\�Eo#��q��x\��̭L���r�ʟc�D6|h=��Т� +�B�o + �V{����z�f���a]���W3�Ц���q��g]�x����o��W%���U_ysI��M���Y��1�;���^� +�zw��3"/j�Z���C��|�[?%ٶ9624�/[�O������~N�<7��iO���_��4�ò�����?)�@��f�� +�=@��+,@���i%��Pl����/�l��z�وݱK�i�Tu�B���y,p����<}�����/h��&�PzW��a�v'�\Ou�U��y~��v۷�b�s��R tA&��$�0n$|D�ɥ<<��,�i��_2K}��U��[�A�,��$��_����<b��i�UY�{�EE��Xg|�h�Ö� �t�͑�Z�X�Vˬ��5!���2��$���ֵU:�dD4f%��/S.�xϸ<'��? +�}��)>���8���� +��δu�-���2����~M;��[����Vw��m��^}/�E�c��ur�,-��|�����/��چ�**�F�/^��J�N̾�G� �?b�&�Q�x<��p�������gs>�CGs��nE���>�^o:���,f;~�F�a��V;��x��f�'<��x�`$ۜ_������S�a^^�H]�Mcj-�����VF�����o��� +�90^�2ۮ����H������`��Bߔ9�(�@!������7�4�8(���|�.+�eI�9�e�U29f���ך%�9y��i�ْש�Vʭ�;B"Nv�������E�����0�w��j��u�LE��+��$�������i��U�KJ�s��,��C�VV�[7}�d�Ud�<3�$)�pM̋]�9�qiI,x�T�zXwp����[��~�; ���Ek���h3g�x�u3����G��TΡ�"���q��KO��f1/�Շ5���~T@_C�Q�(����ge$�G�9��#���:�Ϥ�'�����,��$W��R�A`�d�9������C4�X��B��'��8�-տ,W�y~c�Ȩ�I�Kt*E.������3)3#RCsX�GT�>1�Np�� <]0�7��+J�D��Q����ddiVI�����U_I�gd�q�0� ���ݨ�� ��D>r�"�&;���.n%�������y�b�4'�@�/���1���Դ%x[Xf���(��gZT���:��sIV��!��ѭq#5��T�DJ���v�#�zK7TK�! Yz��-��ݏ�@a��&L�^�y�2=I��B$����Ղ�p���C���|I�<:V�R����~xa����/�L�qc�C�<o�n�o�7*%*ޣ^ �_������G"G$r��5V�J�����Lq��MZ�"�g�e'��Nþ�g�Y��W:$��3hi��?�n��)��Jp]xE��u�t��;�$Qb� a8mՐ/��q�@��:/t��6��-�9�@�rvI��7v��eO�F:�����#-�MK^4�%��k��+���K"5::�����?�7Erp.m�7�n�����ơ��� +z��=�,����܂�Ǖ*8ޚ����u���\^���Z� 8�g��\B:���U�H�Ń+��t �`����Z���p_�wj�B�t`uTD�uI��@O<�a�j���](���ٸ6�TOD��[�ཉR=����2=�~��u +%����AW@����躉��F�G�d�ǺdPi�ܩ8��ɵ��~8��g�|L* �����y�� A�ED�}�|�7�1�j�(���AZ�Ѹ�]��VHT����P ��p< Gu�qXk���;L�jK(��C�w��x+�����05����DMvߘ�R�\Z���y:3�Y�w�-���L=*��;9�H,T�ߩ��+�N�Sg��=6U����� +r�� u�M�Ƽ��p�CS[)_4e۹B����&U��1���,�bX^գ���țƵ��,M�ڝ����eP�2�T��vU&UX�<����4�R�ҡ��7�-;���-�� �*������|0��aH_xY�R���w/]�8.�\$'��`�Z���J�?0�-coy ���(@��z��6����Iz}~zvA^��8� {n9�Z� +� +�C�w�i���Kl��� ��&�>�S�儁ZD��-ˠ�Y��g$J�f5�ow�оL�l��ݠ.�m*GA��D=).ܓ�7�@H;Gv�f���eA 0���^w���e�ց�A����yY�2i���@d��к�?27���'���U�a��c�b,D�y�G��x�1w��_��?���q�յxBf� ���"T����0�̫a�������_�-��"U�@\yO��=�ݰ������a�C���fb�MX��Z�)趕��`3�y�_�vj8(���*�{Jkad'�?�jۼ%U��&�%3�R'���f����ɭA������:yX�˻5(�~!�Ye��)�&�����ͩOo7�?�� +`�Kip�{)�JId~eQ@~�}��N���-���"��uɺ� u{+�AXz�$�h@M$´��n"�(�^���)5v<�0��ߡ1�3-�d�� /qQ"Dx����>�m�9�5(���v�.d���<��B�v������Tj���5�?�뵱�%����s��r�ZA;婃z��U#]�&U��FR�n�U�ꭰ��Jl�NR�����:a"�| +@qꤗ�x~�N���p,�2��^��F����ΤoO.����ƾ����[�NG& ��Z��<�BR�Z��B)2;�F�������헶�A��8Q�d��'[h�p�Kv<�r���O���/2��.�eC����Z�� ,�97?��cW�Ԟ�[�M�̔s�/�a�[@_���p ��P���ѭ�w���Ŭ[���E�.��q���+FT��N��`"�q'� b���_�Ql���� +��%IoX9�.w�l�!M�����^4.LS���9{��f�o�N���R��ƺ͑��8u�'��ş�~�y�{?Nq���x�fҳV>�s@1*�~��=�N�r��4�}��9$_�2��SD+Ecl����SB0�ǿ]��R����������ĽƃQnO^�0�����Jduڌz�)|͉o��#j�r����~�P�igA>?�m�����eHb���tkM� +H�M-��{I��S��2Aćֽ0��p��y +U�韎~��EC�w ^{m�b�q�4��Þ�?�Ο�cUK<v�b=��TsϚ��GOs�#�O��T�}�d�����~#<4�q����|V7��oh �C�Q�}I�V���%��V�f�� ��@�/'���1�K����r�(S`�q��M7�������W4�~�w��K�No���$�\�<��\n���B#�We�Ɇ���S��؛>���t�ǯL-��)��0+Y�Ὰ++��2{�<�6;,kԖ��;� �"qu\2��,,5z��C�]���xL�*��M��xހ�㡂2�љ=��a!o�!m�]��"]J�/�� +|ѓ��4v��gڕ�{��Ul�qFg2�A�D)���wO�����H�7�giUo��=}�"磬r"�7��o�M�0q}��6�Xh<����AgGY0~���r.2#��Tl�r�I�,�]�{�d��P�y?<�i䍽Z8�X��{��U� �֟v����)IB�o��g���u%r�\�5�Ty�j�����o����^����'���,7���+:��F\�!Zw�뺯5���QL(i�FW�Y55�#g8ef�����{�s�/���ˀ�T/M?��6����'��1�8��&�c 3Z2�<\g�rt��l�K�E'��"�#������,%xIrVT�f����!�KS ���b��T|n!�w5��C} 0�Y;�_���@0Ãr9g�sz���P+�������l��̍K|C>�!�)��h~�y,k]S����U���dqe~J��A��{-��<@,��\貹eR&~$�7[%HI��*�E��z�PmV�ė_�����1�0����Ί΅G�u�|8E�*�� ��-�jNPə� +_��<�e�1�`�k�fѴ��.h�Ek����SX��Bv4����o�2�'ԹX�bHi ���L~3E]��W��-V�����xa_=쥺]:��szAy�Q����0��n��#�B�W_�O�X�衝��_�7{K�qt;�c�O~D�=�����wgF�>��dۅv���A���+5z�����7ع}�v�� �Qn����sR���~'N��D�i��R��Ӄ(�;���HcKǬ^������1��V����W�� �C�3"�Տ��e +�s�)��ZB��-A��z/�<���Q�3����^V~���&9�(��Dvz�!����ZR����ǭ� ��0�^ eL�^�ͩ]q��-�ܲܰĺ'�����0�u��P�=��R�n���.,,��hP��5S��Nv��C �ơ�ՅHL�բ���tp�a0��)H��ǻ#��dY�z�B�t�@�\�z��B�77úM��:M ����)r(�,lN�@��x�z�n���ٽĊ]������w?E�����t�,��-;�d���i�˶N4*l9(���~3ʭ#X���P�L���^� W�S3^Vp�}�%韟�H 7;u��g(x�.*�נ��$މ�����游a�I��� ��eQ8����;9�H + +˴s�$�T�����zu +;��n�G2ľ�R���;H~��vAe�Zpum*���0�5�e���A�~��}J��;X��yॳ�8�ˌ\��5�R�1��čH! +�qC*a:T3!�."[��mԛ'�6���r�����dG���>��c>v}.[���?9Y�(�B/B@ +�E���?2{�3���P�k<*x����(�艁�`��{�+�I����p�K�0������^�G���,�6�I��4R�����q?/�d��(cU��Z �V��C�"�,��*f����ʁ1՟8�E�ί6*a1�n���y懴V�a;b�:�jJ�淽�@ +���3�h'PͰ������t�¸*"��������O��-Z%�����aG�|X�V�=���@�IV�f�[��P�x�4n��-�^� ��Ҫ �$*jM����;�����d�DW��ZLYK�e�]�)qd��4X��J�(�l��|-B)��̈́ޒև��q�T�$&̧q$Q´��K�ı i~���&S|;9���jt�_�tF/B�����$N��/f����� 7��Ĩ�NpG��+�+�r;W��?`��}�F�dRҋ��y_} +2����}c' �Mdg;���QE�I���>�<#v�%h��M؉�� T�h,��M�t��'��E�pD� ܃���;��B�8�u��+�A]��I�Қ�����%��Х��fgЫ��A"N��R�e�u�W�{-�F��G�D���x�cĸ�xK���Fn��/iu;K��Y��=����* ,\?��^��+%�U9��O�za^X����ड����T���Xj���������ts����F~� +��$!m��� ��SԹ��<(4".4�����s�XV&�8�M>����b���1O^U�z�:-��������ղ�_�X��s�{�TX߹{���n�M�b��>�!+����ԉ��Ս��$~�v6 �7H:���_�e`���y/9y�6�j�c@8&�w*[�yn=�c^�z��� 螦)��ʀ6=Fh��M�Ĉ��؎0����z��Aݣ���@i:�J� �� �P˜0�,�����PǶ[#-� �D~�i_$F8+�!�Q�1��陶����0�p�p�zy�7�P�sT�='=�p˦p� +��k�2�(�TL8�I���bI�EP�ҷ�������ֆ�T�~L�3�wP�4����H��,��ń��Ŋ���͇n�]�$i�i �����x֙`��8,J�z���GQ�eF|��١�Ш��f�)L��c�9ۤX�"��v8K�=O}�X|��9��r!��j�r�y�T����'Γ�]��oP����tB�q��\ )}���a��1�M�t�@ޣ�V�Ѻ�O�G�g��`�>��9�/I�鵯j;�*���z�"]���[��y����Q��}��q(�VU,0������|�Y�r�w���\p|\( \��g��L�9tL�_T�*}L<����N�+�xx�������CP�O��w��b�p!�sw�w�T�wG�1&2//���X��Y9�>m5����~&�!偝qJ�09�QN�� b��|��N�rr�^ +i��|�����uװ��'��-p�ĥ���o� �4���K �qW�]ݢ��ד.29 +�jwymn���繅c+^�"����/F����;�u�,�终kܲy���Ʋ5���\�̪^� �vп !HPP5�H���IfR������l�I�i�ЦX�TD��'�l����Z��jB�`��I���O��M�b���VvƙM;�T/���J��-?4�&����,���a�Tl�Y���/t��o;_~�0�AK�SHX9�v���X%G�ܧ�\X�q���������t +�o>���e�~�Nb �xO���l ^�=>e0Db��a�+;/�˄h�����gb'x@Ny��bX��+�Z�t$�: +�|���U�� i��V|ٗi��r��q�!�QN�^�� +��z��~�@��,�t]���a<7�6�Y���\ߘ�/wS��ԦP�M"����%ػN�)|��=����m�z��tc��� �,�'6�)͉�W�ڢ�H�^3 <C[� + ��7oc��|7�GU��k{�����0|��`���}0>�ӹ��1������Mw�E����-��y�̞T�R2�a9h� +/��<<�n+�K�k+��?��K������h^bdh��f:`����s��j�>��i! K6�TP��N��D##Ji��ٷ% ���A+���6=�o`�_��6o���/��?�����,!P���_^%A�_�%�z�!N�Fި�/��|�����BP�miAT�]dAȣ2�i�����FF���ԭ&Q3�K��jnĖ�G�$f�T�C��/.j���s��^�G�"��c��0��Jd1�`�1�U���.B�kB5%,H����}�`�Q�+k��> +6i���Ѻc��u�DŽ���S �Y��L�">�~�=8Q��?&��cc��������L#��QX��� �^�m�i����й�l���AwL��%)�8��Z'�,߀�T�*v)���X�(����$� #��l�c�n��7�!�ݺm]���J�}�;n@�ш��mX�9�����g�v�k�c��њ�S-�F��`hN�p��{�1C,HPzy�vNs�l��w����ũ�8�x��f�o��I�]0�u�S���/��b5C�8��i�Y��� ���\)w�^��x� !��N��M������>�T���=�.�:[h��L���N>2�:��"��"F����)�>�[��OAB��e�Ӽ�����y�/��'��>��5��Q+�����ɡ�:��m��6��Z"�9�4�@��'4�b Y����Ed2�EI^SKu��]�S@_�I�?�0��A��]��{�C��̸����K�G����x�)(�[�l��B�&RlbU��E�r����&�MKy�ڕ��W`G�/ˋT���;O���e�s>�)���C��~͓ j��h9I@��/�fO@{����6$�儫�a^�ք�����ؕ�6iw���}���������}��O��T�=�k��*�f�<&�-�Ҭ��"a)��4�%�).����� N��\LF�$(MbZ�D�'U�d?=+���Բ�HF�oJ����H�6ꁌ��Z1��j}s��h}����0-҂Gt�-g�ˢ����}�����x�1�"'.�}2�k��&�� S"(����k����q�%�����"�>���1+��D�G�*;����aa)-��Ӻ�2�#��N�����Mu6e������8����A��*mmm����N+��a ��}n�D�� #^v�G��D��U�(��B��O�-@m���&sm�b�LE3��^�H�#�=���.�7��iMq�309iA���^���*>�J5C�o�T9�����O����Y���2x�k�* �A~M�`�F� f���� �}���b$���;��;���>�)���_��l~��{��4;��g����H!� ��I�X��������/c����'�{/����� �D�=���r.sHѣ]�r_���B_O�����]+���(!լԜ�N2Mh��ǃ��4�W#�@��$�����U��f�4������M����S���R�Sr�:E��7Tv�~�NJ/��7n@x�;9+R��6�5�@C$�=��!ye�uu��I�Մ+:�����:�����bM�` ���Ń�����9�Dy���B+2�0�A�N�F�3��繶�|�A�(��4��]�ʋ���&xh�nT%��K�~��u$�B;-l�!���r�rW�3JL�/g$�8ݶQͻF�t����/�`q��<�1,��9�/,"�E9�:����Ⱦ!]�WH=(S�y���YRe�R,��n���e��p���2=�R���;���J�`����FB\��z� /��o\{J�y�qL�l�d`����8O�p<i�=�R��[}T�BB5�0v� �:F�b��-I3�@nnN��P7�bge�U�&u�,m��Z���JcӮ2:��ɗ��V��I�ܽ�Y.��DV���U�ޮI����|�RJ�tA�a"v�&�|I��v~�g�S�� �?N��u����z"Jo��&�-�mC˦ �8��O�P�(_��8c��9��ߒ��� +fj#�X»��96O��F�*s���Cכ��9ԁ��RQ��_q����Kmа��S�E���<�` @]����|+*��L$$P��u��p"�q���'}�Y����<���d�Qg_O��^�� + =��;�Tf:�ȡ�^7�e��r鬌Db�N��^C�rI[���W"�i��d�u������b<t�Jf��[�Z�Ӟ�k��5�u|2� �,S��`���%���S�5���>���!�q��Z�����앥�G�}|6#;̳����>�`�_��1�{f�������dȝ:G/�ʽ٪��~�܅���,���j��q�Go�\��߈���$�?���K�m+"�1�wl�D��Ժ-��¥�ʂG����ܕT.9�3�wn��?tM�NT(V����5�,���a�G�xba��x?�}HG�Q�7��V�PP��:�E�.��(�SlK� �t��R7�x(��%7(o�bX~��%�B-��4+8���SO�c$�D�4#�,o��{��A�n����K>��=��>�[�8-0;��Ԍ���fO'G�q&s�uW��˿�҃t�����H���C��$u6� ��Q~��O&���amٔ�Vx?%���h��6��QN��Ux� +�S����U��R�צ���IL)N�JBx].vhD�ű�5��[ԥ���`�>���;���v�DY��f�X�>+�j@�-� ��ж��ح�i����O +�n����+�Ѫ�B���N�~�a�i��r�V����j�;�Eh��2e�m�s�'sܚ��z���o����N�Y��)���4����a`�cī��|��wzb� +KU ,�;��;N'ࡼX�����t�Ϙ��|������A�9*�����y�S�'tm��ߎ7�RX�͚�r�_�ी�g}�۱��{���0�{���.�i��w���@��~ ����+�He�z��,��l��N��������#�������0�I�� +~_�߿H�,b���"����-��x,�{A��/^?|f�E$��i�!��[9�?�8}!oo2�W.BG���� 5\l�w;SO3�!�h�k^������L���~�+a��z��,3�< ��� +� ��*N�[wT����D��N�#���-�<��xT}�k +ʮ�<8*�.EՃA]�)Cf S����^�3��$@k� x�p(=5Pz�q��S�}�P���)�H�� ��Ю4�~ +�所�H�ƛ�2���j.��o*F��F�w�����"g2/���8�d�밧�]�S�������[!�!�N�{��3��$�3Nd��4'Bւ���]x +U�j����'������1�"�eғ�L;�TxQ��S3�~���j�/���Vzɐ}���ꗑpCݓ�� d��:@-G���D��@��-�����T�!����k�%K�j��B�)�����)IjΛ=E͘�~�J.�zEc�-����P��Kw�������ȉ5\����qs�G�>=h�|��4����l�@ޡ��iS�\@k��3�^��{�_L﨟=]����R��pgg������<0F7�Lͦ����dK1^j�{�Q�w��Vb~��d�-���t�����)�}�C�e +�� +g:���c��(�K +��M��kۉT��|й[��������%C� �a>@�&��2���3�!6g�@�6 � ��̨�r^�$��o/y;�Q�MW�QH��E֎5���ӤB*/mV������`|U�",������Y�,�l4K[;_3����A�~%,�?v*-�T#*�'��X]��1�w�� #ӐOHr��Қ��V:˴�U|�;ur�˵���p����ހE���$ijv���7��tQ����d�\�q�Y��6^ ��g'kN�&�k��|2ޞs�����+����͗������ 歷�� ����u8��$U5�@���Ŭg7Bf+^���9���mE�W�Wbpd�?C��#���V�����5'����e��ORw�<1ݴi�f�*��Ʒ\�EZb�1{�Y���6��^W;x�y�����0bIr�G�<���dAb�E �p��ߑ*�������`Db/Q�ܬ֓{��B��Aw��a�x�p��}=}��x!9@뺜{��%2�+�W;��;�v��ޟhj_�Tÿ�G7J=�ad�IG|!�N�w)�DALC��h�&F�%�7 |to��I$�&����g-��V{M�rc=�W�i��~�B�]({H�P��'����[.�:nKM��u��Y�a���Γ��5<�k��g����ۤ�1I�w�ik(���ފ���3�/i���x�� <NW$�I�S��Խ�ѷ�֛��U����ҵѪ�l�(�>�q�Z�4����B�ćI����J2���8���:�F��r]|( �@��,ba;��bͱ� +X.� �v�m���)K��ۼ���x_U_�� +��|�p��ƿ��Ä �y)Z3��0 +_OD��D!,� ����x��Od7:s�@���ש� s?')G���_֛�kO��?^����)k��1�ٞ�,2��b�N6e (0�Iu�&MTQ%��Yyo�(��y��l T�O��U+�n#XJT.,�)S�rM�y�/n���@�d)�E.�����h�����Gk��m��J:-�N��#�<����Fe�3��(�.�nYM��ϱ�?�-^i�({��l�s�A��P��I�$EoBV_;O�h��\�hߠ!]��X�/"=XOe>�A����u�䙏�ѿ���fL����觺h{�� �Lz5���+��9��6_����p�]��F�͎ (�И�Yag��T���(z��2.��o��\�& ���!m4���'����dB��{g�F�B���ⶾ�YA*_+��R��~��X0�&8�laɽQ��X9K ��Xҭll�u����Kږae�Ӕ2C�Y'C�ϚJ�|v�ןG��[%�e%���^��Zj�1�rCϖ*9z�F*����� �G;�p���^='�M�DwcC�\�Ě������C�%zu�K�unw�[p� �FM~�����O��*���J����k��ӻ@��Ʈ������ͺ�G��ܬ�ƈ@�`6��{ټ`*_�w�2ޮ�vA,����Op�{qRo����=�M�Jy%!Xk�bAJ���́�E��]=�b��?~� �kkc�Լ��e<�FD�� ����:�WH-N�\��|Ϟ�w�s�Z�l���=�(�t��_`C.�*W��n�p\Fm\�F��"�W�!�`I�n��5v����[~o�8i�d���_�ad�7E���v���Eh⺮�6�B����f�Y�18� 9���)���,��W^���6M+�������O�TT��|p=i�J����z"� +dÂ�wJ�Aq~����Duf���l�۶�f0����ދ�i�Fo+t�6���x��G#3����u������?��U��~��\�R�J�dE��ǹ:Q +,8�F�U�aדB�`��9��3�v�sp�XJ�"S���ƇY~����L�t�kJ�m��x�7��CW�DߋW����b�M� �ޙOJT ��༹IWĽ������썽 ��� �¯I���(��N%�Af/��>����8��D�2r@��6� ܀��iKUx��0�dH��a�H7��=f{.�_8�Ō�v{/�UR"�ҩ�e�g��� vv��A���!ퟍř<���UtT�'b���}�Tf3��-��!H�y·5'�&~�7!�h�1��?.�65��9=�D��E�ry��Z����9�� +���6H���(��lc<<"�`�O�@*��j�0����r�P��=�D9i�ȣX%5�RHt����D�=���x[37-9�~�pV2��k�~�2>�j��n� k�ݜY�E�v�Cw�Y�P_�ٯwl��d4��H3��tY�� �M���X�a���\f��"n���=�-B�����s;�����CB �f$lQ�}(���o�ϧ�t�I;s��^�,�>�-�</9�����V(�=s�S�\uʿ�IESx�Ot�ʿ|���BC����e��� �9���tn������~r��u�8��`��Q��֊�"ss��ӉJ&��7�8WƁM5��AfCu�v`9�x�As�" o���`2Ƭ2q�/�o�eW���*W���BU�ݖ<c���>Q7���/���Y-4�� +Qd�i�~w�[�3b�J;�O�\����4���,D'x��F�&�"Q�r��Ϳ;08.�|ģ����=��Z���w�f��ٔ�2Dڈ���=�b�e�I��6��(6~�=Fߞ)A,U�Ճ�`�B��\乛C��r�g�`�iϼ�p2�[j'�"H:��]�&�3��:}�5�e�<���>^��eZ>��`r4��uz�PN KK�>Q�����<Gx�U�Y~�kZ#�h���|�.����A5w�kC��9x��1nԙ~\���VO�8P��j�J�Qцb�-�_��*"a��W�I=!���V�'�ɫ��Q^P����{���36�:�x���2�,fg���d~�y�������Q�Q�P�0̱V��Z�g�*�lqo���9e��Y/��U�e�� o��;}���S,�>9P$k�~�!���[���ϔV%N�K�eFQ(z�IU����̎Ј�ޭ`)nxM�~��!xz �1s�����cuDv��!wN�:%M=O�p�FZ�cFϸ=:��-������$=�f!Y����^��t��04X ���Wߤg ��B{R���kI���E������TCj��fVׂ9��㑨�,+�O ���}�P4a�\���}���*��H4�ʚg8,)92���|PL��^�C���Co��5u!�eDG?��-ts�]<�dk��c�6ij}K�� 4�n�B꧸�-SqO�X��x��焌6=�_$�"{��9VzoU(��x?�pN�v�ņ��e�_X~K��Ѷ��x�e��*�$�'�K���/�����A���S��(���YاǺ���NK�c��:_�ғ�*nlz��ӭ�� ��m�%Y ť���lح��Y��Z��I����X3���4�S㺞�w�������e?�cd��߫k_�����N�ʏR�ߡs��vt�4��h����&c�*�، +lyY��TG�F��s�� +����7�?i��EP���נ�i(_F�I�p�V����5jC�m/��,9��`�S��1��X��-QY� +[E"��j���4W��~aYဓ����K��0��r<'��0�IY���k���ƾ�t�?"v'���V��fʙ8F�e��'��~-���7� ++�ܡ�K/+�~��3y��~���o�zQ��ń\���@�p�p�rhߨ����>���rs� ���)1��=��^�&!\��ds$��Eاñ3��ev�1�/Q�������f�4�b� i� ���y�7iO�ڍ�p5T�6t��mdI��7���`re�?��n:����_6�����\���B;;PW����g����f������[�/��N�G��/�����,ׅ���N`�sS����O��@z�m3T[ÿ2�ՓB�[WTeX����n����r/�a.��)���&$���Z�/��S������$pv���e1p4�"l(�����陏=3��;���~4�e +<8�B���v����Q9� +qw�m��ߣZ,�������g��UchFFga����{�ľۆ"® ��C��K���Qp�<��B�*�g;:�KGZ$�f��� +(j��z�J�J�C�ʙY��@���F=ѝGbJ5�}��\���me_��A���4�}�o��-������3������H��2�7�;R [hJ{'���ӎ���jk=!����hV71��%O��������J��2ļﱐv��=X����·g*h�?6��YJ V����4r��v՝�>+F���^�B�*�[�T����(E�8�| ��m���۪|L>#�"�"��w��Jv��2Z��6��0�شl�����EF.��?��������+M�(�kĒ�I/�h1���ʴ��]Zki��*"H�H�>����OIv#�_�^��"0���n&����V@���f@�#yP�Ā��qװ�m�V��.VBdP$�*��m7���"R�7���\2�*� C��S���.�~������G��ҍU���t����>L��V�ţ�,���Q�yq�F&���U{��} ��G�z�&�{�A~d{��\�ߞ9_�,P�����׆�c�lñQa�>`;�b�z��2��`��_2�Ჽ��*�˵"�6V~d%�5�ZF�A��LW�*Q�<����v+&����6s���~�g�lmܬ����Z�� ���(`����^F��?��iAEW�m۶m۶m۶9۶m۶m��>�>����2���i�f�a@$��z%5E���hz:�ԇ.'r�=S'� ?H�pk��|t���i�ݺ{ni�.�G <�Y��:#��V��!�"� ����&2j�EH�'�">� +����+�%��d�j�E]T�Q���f���Dn5������1�G����H�: +�u�ٞ:���E(-w��L�G�Ѩ�'Eܛ1�K �����R��� +��N+a�I�&8�֎��Vk/�D��"��ɩa��M(�0�e�f�o'�,��+�ǣX6D~b�5�[��F���D�}c�7E3!s|J�/_��8�I�?���}����?)Ō��D�v�s�V�~��V7��e����(�,C��\�^-xjVN_P�=&�ԩ�-����� �������ݹk��jv��xeE��U�P�HsD�dd.& u<`�r1Dm�`������:� ��Chjԇ�(�j�Q.�;Gm�R�50�ۚH+��t`ͳ}�Ä�����Pm!k��`(���o����^.ղ�1��s����r�S#@/R�&�"��bZ s�dS�Ce�r1��4e�k"f�k���j��O:\�����Ξ�ݻ��]��+�����Ƌq�_���+K�8j+�2kj�C`}���aoe:*�����n�;�����|n��\4s�k���B"�S���mLӖ���ųV��Y��̓�H�1Z����Z��4I�Q�5�0���f��v9 a�D�J`�(�^%��=[��3��W�4�:��|�'��W1��~e ,�)�)���(��J���|�j��ϫ�*�ܐ��g�n,Uih^N�Пk�\+#ͤ��Ś�K�:tҭ�i_�L���I��Ӯ1��������mP>2�c&�#�BZs�SPg�o���f�%�%箬yz��e��q�W +w��ʀ��*���=���4Y6��'�NX��C���R0������ +���[��d���翎W����ӈ�꿿�o���� �I,+� ?�&��=��w�v��5���Fd1�N�I�V��OBD+��B��QG$���=��F�0�տ����o2־c2�˘-=r�� \�E�Y�����-�Ǩu���G=�E�� ��ѐ�S��b���0 Zo�`�Io�����+�O�ᕏsS~:$��K^F���0�!r��o%�hp!�Z<�T��ꆫ��c��%+6�wo�@Fuȵ���zJӬ�~x4�@`Jߧ9�*,c�JԸ�:� +� l�:�����gFԅw�&���� Az��L���bS��l/^Y����ȥ�\�t&���Ħ}�G�'�`,"Lh~$Y���^���h�����m��Nv�LYQ��K�[���%6\vO���ej��t-���*��� aP<9e� + =�yU���` =�3~�)�� +�?�e��l�@*+�o�|���ѩq��H�AN ?�8ٜ�g�WȤ?F?*h�%�]z���c� ���ըEͤVb#���t=&W�҉���BES"�z�U��uckI�Z�ڔ��F��&�0���3�'�F�kȶ�մ�iV����<(+mOY�� �����T��K��CBPxvQ-)�=� An��)ڷ�=�f����oVA����^��ᶘ����W��G[ܓiVE��d��Zȵ�,Y{���ܥ/��uO@����蔇v��;v�I�c�W�ꃢs���'q :��}���i1q���F�'��>� ��C�~�v�r�IJpǒ^AV�g�[u�z��tx��a#3g%�&����|����5SL�p�oa\�tyy0bJM���ˏ�;������P ��D��Z9����ؾM�r�3/�yA�ШR +�mc4�2ƹ��]����&��w}�����3�e�]A��R˶T. (.:2��G��[)�?� +��,p�Ǝw��ԉD-�|P�",��-n7s�y*L�Te\�5��|�u������B��@-�I��^?�����#6|�O�����`@�ɢ:�hbf+w����p�Mޔ���q�z>R��Ow����{e u�1A�}�˟}Y�2�`����=�J�����"n��Rш���L����l�'x�역��Y���?v/�%�Rt����U�Q��SE_'����TE�?�'����M��`���5�t�~��B����鰨.������V�8��D$�@������� �h��؋���=���(�0c�2��(�U�B�}�Cak���I=Z�#nO�ur)�l2�k$��5�����L Þ�.įK�R!�F[C'�����Q�d?Z��ҿ�]����.����X �&��I�A�`�������e3fRW$��놗`��Lu�� +�0>��3��PY,������&:�I�U/��~vRCmp��g�@���~��F�t��袚I���c�7'<�)������*`��@�¤pS��,C��U/F�-��[�S��?�����I'��2�t����Ƴ#��-Q]z�K���!ک�4�lfQ�lx�Ԏ�k�s +t|�M'œ $!��J,N�KƎ���V���o��V +� �$c�� ��R�!�E���nO����S���yY6m�ѠLOצ�o] ����L��3����L�eV앸��ٯ6��KYOW7�N�/���`�Y�m�I%s!� ��:�5���T����R�]�:�ɩ���raѮ�5�zD�6u� �N�;Ҡ�"7Hn�+��V\>/4��� +����,���|��k���Q�鯓�ȸ��5Y"�`3�V6� �QdE��Wz��} ����n�{٩���T��d\.����.�?��#�l����G���s��I��|�M����`L��9r�9cs�Ts�5���z�(I���a�Hm?泉B�O�i��ʿ��)o�)����yA�g3bv�H?TݝI����^瓮������q.I}���Z~|�,F^l���I�֑c�;��>Lֶ�,ϸ�������zN^1�DZ9�8pu�=�'2�'4B� T}C�����1��ם%�X`�� cYؿXL|r1�C=� _p2�w��,f����Q�h#��5��\ډw�&���\X����>J���>�z��Ғl�%�X�}f�*��k(=���:�-n�Y��t�_`��f�< �<DNC+o�>�ph,�6,���\�J�2p��/8(.������3 ���r�_"���-5y�b�������6����a�ρUь�#����^i$H{,�����@?^��>0��>�K,ڲ� ���,���⏑�����m�k�jpG�P� ����GR��#�e�����j5'L�� ��i=-������Ue�.�ιF�v�gyj�Ja��+ ~4�i8W�2� �'!,�6��m�Э��P +j���he+<٦����_X�v�bv7�@T�\BJ٩)����H�%�W�8����~���Xj��`mz�¹����<�(pآ�N�� +]�8u���38��8푝an�JZ�}d@9�u@d��#���?i��䙒�W{^@�k"RFI֫�**>#���*��m��ȣsǶ�Č7�����o� +�������)�I}����D�"�D,�>�-����|WV��j�Jnu@�S���F��aP������N�d �R>��\��ƍ2Pu܉�U��X��n�Uc��&��A x�P�Yߋ*�3�H��q�Ac�u��xe�$w��6��;ԒG�c���/��D��eo@�W����t��(�že���մN�[-�d�y�����B���1��6g�OM���|T��1=��͚���� p۠�ɻi7�bg[Uc�2I���q������BЙ�Lk�}�3,�� 3�뫨"��?�I^�d�X�A�Y�x���ِ��/ݩc���Ra{���u0`&.}�=�U- ?�b��T�B7�҄�z�� 7���^��I�����/Ad�����Y���H�NxWF;TZ���V�c��<ݪ���{�_3�],�������?Y���Yb�]Rץ�I>�83'���W�7���[�xڟ�<�g�K<M�e%��O7� ���v'8AO�����i�i�t�T�o��]#�H��[y�*=LJ +���,� ����"`G�;�-��w��R�bY���0��;I�������@�~��T�u���o<�"���3�Ws�ԋ ����H'� ���⛉�ym����t�iC������#�a� +�;��(x��������F�DLF�Z��a��!�N��:�q�%��Jլj�_��������d;�kȺ`�ꥩ�h�&A�P����Hr)p�+���H�L�{����`�|:Z����b�����aW�gu˼O��T-�w�A�3���j��n���2�}��E�4K�1�^�xiR�]�Q�h���d,����شV9M�"���ĉo@��@���uD�'�L�n{�֞�5Ӭ$�ԂQn� J +�x� vU�W���Ӧ����A$���V��N�� +^l��� n�6�/o��$�-�=9���`Ɏ�c�L J�o���_���g���p�Bg�m1��Xr��]1�֘Nԫښ*EU����V;�Dz�@U�+�MIT��a�Q*�Ps-?}R�21��b�`t�@i�6q}��s��xt���?e+3���EB� HF�r�}S�q^��/�҄��mj�ݏͺk�1'`Z���´������AE�y��p�TR8�����9\ҍ�>�Qx!�,o �V�>������?�����'�a�Q6��d��3��U��r[����Z��i���|��YW6��@'|&Wޛ�����>\oDH/�i�W-���M_S��0�h���<� ���u'��� �w� �f��X>n�*���ED�������A�A��_��6�k'ZE�A���3��xr�ALy)U���`�o������qx��/)����9��������QR��D�sTJI�mn�j�W��ǚ}�r"V�_����W.�G��h���w��a㪄��T^���Z��UiqB��R-��0�i�#�P�\em�-�D�^}�c��,}���hW@ļ�o��s�5�`/\КYy��Jr�b�t�[>��Y�ScALR��&l�E�Jv����^9�v?���D{?�N碘�̿�ï��osP{�9ѽEן|�6��:͆����%��$��j��#��^D��{8�&r����a���7��7�[4 ���NX=�V��d��g?�*�B�|�m�[�&�=\,ϨIO���L6Tl��G�2�ԝC%V�&���n}P�I%� �rBb�eLX�I�/a�Z��h+{�6"���S$S����1j7��|�+<��]�[(q&#���?�*:Þ0d>O���}���!m�fd�� �{��b]���"�ÉV��]���K��/����Ԥ��e���*<�0�z�w����H�ױs�(��^ �o釟�n�ظ��j2d�H� T3�^�Gv� �w�c�l�־��k +\� +@B�T�+cj4�Ro�3�1Ɂ�*ƙ^�m1�"$��P�y|f�/X ����TB#��]��b�C��<�5�x�� 3��~v���o�GҚ��R��fS�2�?��B(t7�����2���D��1;H���ƅ��5*�� �(�����*�>h���M|>ؘ��� �,Aɋ�Xu�W�=mp���]��B�%�Y��6Zx�)��3y�Rm����X�b��`��� ��f���rB.�[�e���9�57��҈�~�?x��c ����s]��y� �E�U+�ޚ��ͧ��v^��S�Vz�-����t��t�)4lH!�n⣂�,��zڬ|+�����)�$F�0A)�NI�}|���yȁ�r:H���Z�f���q�/k�� ��h��]e��r �(� �&kN f��|iS���.d9X���K�Fw�! hi_ꯦ��reb�5�M`�P�S��v� ��4>��1O;u�X��d�)P�a����*�Y����a�h�DFI�;�����>Ӻ�>�0�ϩ�&�O��tv��D�dIy�����; �GFJW��_�7�Z�S��R'��"#r5z��{2����wؐ��T4�js��r��bLw�~��[�>���R��V���f���2��ʞB� �>����LQ~A�p{��u�#�oB�A=ҴAM���.� �q`�Z+�ꅺ������� �����.�o�PvB�[`�0a��87y26�z�$��#ꢜ��0\�1�;C�T�9�~��s*���C�dU���fA$Q3O�\��s]�@_kb�.#l��T��XD��Ȑ��X9����Y� +7��Z� +�t���B�I� ���MD?����n�g�QEՉ��m5r���M�ƭ�!B1X�n�z���*o�wrX�A��#��|�C��g�.��)���"c�)�.SzP�3�ʥ��r2W?�//Lg��mxQ�p���!�rd��Ȋ�M�;Ig[�N��r���?��aR�W��_G�l�Q<�Ni�������@�c�*���B�hsr +�C6� V03����,�ߌC0���7�R����9������-��X0(a2Q�r�y��dݚE��ԫ����f�\I��oC��HG؞�b�9n�u�R������8�<g>m'x�kV `f�I3!�m�R� ����7�Tc����)�3����f[��w`(�݀� ����e����NK�$�1��i�E��(E��_��+\ �1�n�d�&#����3����a�`�d� r��p�Q6��R�����[M��� ��ٯӔVq��/Xc�xC5^���qb���������)�?�a��e5ݼg�%]O2�=�W��p���R/�u�'v���Le�`N+�����Y���cյă��o�_����i�VҴ���ֲQħ3��^Qu���"��в���^�eR�ۺ7��ۯ]g0��?�>��,�R#G���vKM�ʣ�O+���T^�3�+H7�9���>Qy�\��Bz!����Z�n�� �)��'�[�_v�~Zd�?�[)�������uC&Z��0!W*�n^�Mޘn�� K�[A[A�R�|!�Phs�=�S"�Yr kی���y�d. ��8��!�8�������MR�B�������@��4�f\��y�u�x��I� ��Nw( yDZ!�M����̡�&�&����?�=�!��n7h����}�?�� �CE�f�IřL�*�����L@���^&�i����u�l�{<�֚5���@K��JRg�t\�i��Z�k��5��O��a�H��r3L��#���0G�}&gH M����<�_�f��F:=��L� �d֪T.^O��)S^��d��s���R`-�ϲל-��ա&� ��Ŕ�Ǐp���� ��2�)��=H��r��� �p�J��>�]��"���c�o���W#�R�:���$���M�e?| +�X��_<Zjb���wU�ޯq:pS���9U��tނ岤w����W�2)_������J�vf��*:IM9�=FO���}_z~�SoUM�LCz>�&r��6pkػ��1�>7��J�сo�X��g�G�� Ě%e��E^�ɟ[uCE��ԁ�����xZVK��=i}����awԕ���Jz3A�a�@f�ṫo�:W}�ğ�R�j�5TxJ�I�`q�Ò��,G¢�bq�p��wQ6���e}���b����1t�P/�P�2��]�3��81����ey�o�]Y� �����*���t'FP�d�~>�e ~�Cr}!mխ�� +�1.sޒ�T��dЩ6a�;.N�n�mw�1Z���"��q _q?��z3�cK����LDĚ�����"g �Aw���5z{�"����P���>s��/�N�s��eWeN���i0��4��o�1:���\��N�)Z���,���`Vnl��ft8��;���>N�] 0����d�����&�Z�C����<��YO]�#�d�8�d�n4O��M�Ʉ�Q�7����Y˞1E��N�+��_���L?0�r0X���&$f�i`Jė���6�+���\����D:3��(?;c�rh=�9�S3�z�vN����[+�����i4!�8���Ċ�X�qB�ap�O��`N��ӫ1s-��SR9�N�-������`-�%���3�*�$?%����~Z%R���>r+��6��]�i U%�Nsɴ��y�0���r\����"�� +7�Z��yEf�Hh�K(�L�P��۽2�^R�~�RNZ�:x0�&�B6�~j�M"��Ou,�'\w;�}R@��=\I=3�Tؙ����,��_��=�We����� KԮU�V���vJ\��^n;*$mb����st��.B�=E�H p�������� +�Ug�(��}Eq� +���E�".˽N�#w�: P��[_��n�i�Z���c�vo4���8G0c?h;�?�F��%�Zy��S�n�~B�ڪ{�������3��[���_��{vԅ;�+iw�`�|]��=�� �������������#��#uxY����}b�"5^�x�l}ìm��V�����ָ%�9D��_}��,�b���P3�I�W@r>] +�8�b�6sW�Տn�� +�� �f�OQVK�9�"p��Ϳ�֦�=������=!�:Ā���*�O�w��4�Tgu������H�+1�WvbȐ�ٮ�'�T +/�Z'eI�{eG0�p���vA 5��t ɉ��h�'��Hͳ�+}�w(2` )_���v����ђ�>QPP\0zr+����� +%������b��.�<�i�!����;\znv��}��D�WCo"D��pU���N1 +�s��DK����Os����&�NJ�!J�&U�Rc?�9`��3�᠊�A�����Y����/�U�Y���6y��"{6��}J�uk�� +�f��N����P����L��A�U��#b�*(�?��� ��4�9�V��L����F���v:DU��:ߨ1.d�R�E��h�O����wv �}�V��� [$��f����o�����+���qi6V��'4�6���Y�ɰ���jB_X&a71��̋���}v���K�fv�HG@t�:��Y E���I*����$���[���a�ٓ}:�C6�&���0&@z�b���S�$�r:}Ӛ������B��6��<�QA�.�'y�6���D��6vbn<��F&k-�\?��SS���V%��j��f�dO��;"-��dQ��<$�x�_�6������Z0'��Q�s�c���U@����(��P����2�kGV-1S �t���y@�~)��{�njw~�q���-�5�ɦi�uc�>���>x;�G4��b�=�����Ć�� ��,\ڒ�Yԁ%inh�p�"W�P2���2jc0�D_���9a�a_��S^�k�����]�P@��G����w�]B���"WɎ�j������%�A��E(-J��y���)'�{��<���}�����k���$F76�D�������k�- ��M��O���?)��ҙى(�H�S_��"��n=s��� ��<����[��4�sY�Z�_����{=�\ZP����Nj[��JPB���s��{����w�͌��1v|�p�(���q�8q>��\\2��S,�$ ��~��p���_W��?���������tӡuݚ�C�fO�L|��b� i]}ѓ��763A���$ �œoA,r"o'6U�A�= +U�Ȑ���b���F�fa�0����F���V��w<0��������q ���Z��Ś��0Pr��-�F�"�s� �x�b�l�1��m����[�0Iՙ���v�[���r��y$�'q�V2�4q����]�=������ԡ"� iY�8X�6Q��/.Ua�!ɷ*k觯Z=JI��à��oLr�Q�0ibΡ�y!ӇWF��|��T��&���+p������n��H����"&�ћ �뢈h��W�M=hI���SD��6�n +a).:�������>B3b4n���c�ck�+�_��86��.@8����2m�k�!�6;B��G�|��I$ej2<�;&�8i>��q+tP�t�{=<�6b���<��� S���כ�N��� �«@�ǦG!=��f��v���=9�#�Hl��E>���/%���%5BQ��,5p4���E��4����(�[�����uxj���; /�Eq�jε3=����hS����o!͂��s�=g��7;>�Dc U��w�2�Ϩ� v��t��V��,<�i�S�,ד�_n���pB�Yj��n�(e��t�JxHx�:[�f�KR���� '���PY*�8�2��$�UI�r�J5���D����E%����La�궈�����`���*�8�$��6�߱p�3p�־�������ݘ�Ȱ�����m�r@�w�T)�7�Q���+ƽM���T02����YD�I*����|$�i��� ;�*ob�ؠ�&���S�)j]�9��S��U��?� -��2��T<e`%�,u)k~]��+/\~�i��'��C���?�QvH`0�w8�����%���2n +�YT�R�sJݿ�;�,�Z1�Q^� ��,$������}qr�6�]�y:�,�-F?7Y 3����&� +C�N,4�~�1�����N7�_�DvK��F�m�REPq�-e����}ީ�����#Z|)z����ky���߂I�^9��?�3I�JN2�I�3>�,0���k���;��1���r��Y�~d�>(5RHAm��z�5|B�e�6T���� ��^=�/GYCǮs�N'��}��[l����+J")��5o�zB�P��S�;����-�?g�r�W:���Ћ����V �}�|�[�Վ�/��h��4*)0P+�|�f�j��u����ҝ�q`�IaoР�f��U EoUl�pk��@�p�TP�-G�`U%�i,�bG����/;�5^��_���~���gw�zо�����x�"EjS̿F�6���� 0D=�{D�����啼JU�vF����W��ܧ*W�� +�\�[ɤde�%j��IJ:�;Ĵ��#r�V}^!6�pN[�ӚQ]��2�� ��v�ܿj����~X���ƶyd� +Ӏ�1�4���1�)W�a�9@9�s�Wwe�kY��9C����_�F�7�p��D٠Bv?J��U�pB���>��pr��[���;O�?��'-�ްR�g����a�7>fs�O� + X|Hnb�^�6ҾB"�! ��*�Y��{�}a�~�)�R:��p&\P��|FF�8զ洞z��..��#^��KϽ��$P-��!˦�!x�M���/I�~D�� ���e�h+�_�B���D���[�.��v ��C��hd݅0���Y05�6���+�����4�� =��\��pё��+u/�~�/�%U��"31g,0#�g�B(1n���eנ5�zO�>���w@�C�jd`���̤��R��M�j&<%���.-�h�����_B�'�+�>��͚��vG{� CEϊ`�Ɵ��]G���t��?6�_�}�p0�)�aT�"��3�����)0 V'��(ޕ�P|����w��T +,�$z�5Kg�R��(Y�I jo<V�Rv���;m�yZҸJx�:���/"��op���Zm�ql)�M���uZ�B*����|p9h�i��O�s8�BR�+qxU�G��'���>Rאg�l�'��5{�.�~�����DQ�[�h�2�iD`� d�t�WQʝN�-OK��OɎ�b�v9j\wн���}���5�Q[ +�R���z�����aRVĽ�+ӱg�.}nW)P�N�{U����+�6n}�9zHǽ��W~Nc��(Z-��1�Tl�K��6������,U닶�(����P�N�>Bq/�x*_yN��W +TVYX�8��-��-Q�E���}�FZ]h0�'���=��;�_��`���w�����*Y�#�f�7�m�~��s���ق�X���K�X/����UYy��`0y���]��rN�x���� 'X�h�]J]�O[����x��9S��8��Z( �<��ك-�N$��3B�97c���r�E�1�5��T�ϥ����� ��@'�L��6C��Ի(�;/��|���\_�H���J-��u����7Qt�+��00���_s�}�i#�)���U�^��;����ճ�USV{�W��l"����ω�s��7�w��D߆%��f�<�a��Q�����KG"�(��d�>�7�0�n9���:|?mf#�j���[eY\��䠜aԍ��͂��%����E�O*��b`�x�Q��P�|�>��H��d���~ë�sKxl�6��X��P��Z<d�U�K������KI��� ������-"��}���=��_D�kp���Po���b!&��@W(�-����tŏ����@���Z#��U�j?Mr����7W}����Rd߃�G���6�- D_~h]dλ�R� hu{��{)��s\�hb6!��Ex�`yF��a� ��$�Ū������{<�{D9�\ֺΟq�&�� �bsW���E"t�/��A��n��^��%� ����nd/��[�D�3����d���h�IY��F�=>��.R#P~�9�#��;ꭾ�|��K*R�X6������f��F�/��)� �n�������/�se�b%UW��um�լ��T��#ݑָ{!~�$l�$��Ř/�l��S��?��� o&�)'��;*�6�JNh��}�P�Y�����ڍ ��q��Ƕ����Nș�JXq�7yz�c�����i��>,<�<@1�t�u���H��6�Gf��?ǀQ����C]J��� ��;]%'�*tȃ�Ob�]��;�5�h��B�����8�mѹ�W�i��_ +��?�3D�OQ��O+���`��p:��^� ;�IJ��%��:B.�p��Z�7���,���D���5����Ѽ�[��1�*.'4P�� x��7Hz\���O�j���]eg���8�_��>,R���L���sO}�����;n�;�HTR����Q\� �!�F�#��H��E"��F�.��6���9*�N���2D���_G^d�C���<ɦvb�> +>[�Q(N���4�{�ҥRl�ȫ�a s������~R�s%3�B��S��^�*��*¬d-��2}���%��j>ɛ�'ow����b�*d�U�'k_`��i�1��W�C�������}@��~y���X�4���"��3�:�r3t�v�K�#Ν��q�'E�{���f��cnf7EZ�7�a8f�.,SVbͫܒa�}�H�� ���3�x4w1��MC�p5�����ڶ��M4��n�nŖ��Y��G X�d�]|�@gK�O�+ع�4��:�plά�Ĩ�ø��=��s�cV�j�ƥjJ�u�`��� �s����k ̕�x(���!���Q�x����"{'/�m��Q��̴`'ǹ� + �E�S������!��@95�X��F��5�,O��u�Fx�@W�����*Q�Љ[���1���ٹv�g/���`��d7Q�T"G-m�KA�rV��IE��rd�]G�y��jD8�RG�H�#J���gg�z��'�-���L� ���q��<4�l�۱S�Zg���q���\B�ӣ���>��k���Q�� ]�%?A�"N�R/,��7�1ځ���}�s�� `t���E�čpK�ـ�TL�L�!N߯��g�j��!�8B�9���E��1�������髼�0[�9EPe�ݳ��D��&�}1nщdK���qX�`r�a:�\�R ��:v!%�襉�-C�0k����;���RS���h���g�J�E�� �����AT�D���٫�e�w�N{���-�4KQ���uv6�rfKx�.�"�U +?H�*s���4H�<7��-��4�i/q���Z�<�f����Y���J�9��N%d8P�:����g��$��9؇t��Ւg������f*.ˆ����p��M�O���ۋ#C�odS���ꐿr��4����!2z5�F����� +2��w�������:s��pu�{R�' �����Ze�), ��o�R��?���zQ��X�顄-~o��}:�>30Q/�w���eg�Ɇ�t ۾������u#9�dES�~'�������q���kpi?�ס�.����η��lz�X\�ZRp�&Bk���լ���[�-�j��7����Xyj���W��t�U� �"�H>p��G�<P����s+��$���Ax� +�\N����wV��ꩌu�<��"4�d�m�(+R�/w�$��EK�̬?�X��g�]�!���[:� +��K����j���I�[1��� +q�n��P�K�>[���d�M9X�]gO�+�DV�_�͛d�9�*i��u���W�n�Ǣ�]�}�8H��r%������ɑ�3�cº;L�yn���a<��^R�a?'��Z*T0�cks�|�l=�W��n�y����Z���z�����d�V���j��kd��~���:"n�|����@)�T�̮��ֳ�����` Χ�3�7b�����)�s����.z� �B&9.}'0��B!|5�ߥ�nwO�7��#�3h�^q�`���vn�/��$M4 �tA�s ,�D��:هd7��1)��Ţ.�y N��g}���$b:��Y�U���č��?��9P,���)�]�; ��O�@�������)Ff|�gOc:��r�x��y�C� �=�3ʨ=�Ha��>K����Y0.AWC��R�sC� i�¬F� +I��T�#�j�m�� ;۷��r&�S�á�T�*�^�48X:� �S�<��/ud��c�>J�С'�*�Q�ݵ�_�-2p8��c�ީ��#����Y��b��rzJ��*6_��JB�}2���6,�ff���V����j§W���1p�G���F���)n�_,N��w���|�Ptk��Oƚry���"�".q>[�%�uo���g]ȟ���1 /W���؎��Ewn��Vڲ�D���Z,�̵��O �iuz�P������Y�+]�]�b�d͝��5����/E[�e�]�tUb!b�ۥ>�����ɒ} F�z�V�@�lᢰ�ē����������%�Pk6c)'G��͔L3*�Q��Jf��@#�);#�Q谄���Z���8����S��n�m�K�{Z�p� �B�)j����Q?g\[��Lo���f��d�Eʮ���c��&������$:o��a ��yD)�7��\���?6g��G�7���Q���k�8����B��Wr����^����<Pq<�oL)����E�I� �h���Wk�H�����p��6�e�,GJ�"%p���zT�ߺ�e�u{+��s�dt�P6@���U܃i�i�S��P5j�l��vrx{�(/�D� h�.�:wb��]�C������Bחm�z�t܅� ��bz> �� +2�Gqn�)q��-�N�T�N|c�Q7�-=q��& c�v��]kX���J���3CN&�#����d?dI��VIͭW�X�ՠ��q�A���z�<`�Ke���������^�<�>�!<�62��N��n��!�[�5��Ȓ�����l�&e�z#͊k!������ٓ��&U�JP�kG��aȏ�M_M��Tc�\N'�n�S�)Q�A�{��t�ޢ,�Wʕ��<�c���{mc�q�Ʉ��oy �X"�k��2חR��*UN�2���&9)����9���uj}��̌7+�}��!�oC��7�s)��fK:u8C�Z��W�Wת�G���'�觗�U�]+�*�&����v"���Ϋ�����;ol��L�נ����n>�r�����<*����졯8�{� �q�����p����z����U� <������\�J�R�m�2������S�����c�Қ|�95X���*/��2W0+���}�%gL0Gx���¸�����;)��[�d;�TF*��l�6�6�;I3�O�5î��S{�$���:��J�[���9�m۶m۶m۶mkb�v&���sw��ݫj5;S����3�G�E�W]���F����Se|��������s8�w��rj��SӖ.侍����jc`?���;�(�s��)Bh=��_$�ʠ8^zu��J�g��$s_h ��:XἯ`���������p/���/�>0�+� ��w^�X��Z̗���o��H�.:�^]]è��M�C�i) #c�'0��8���'͑]�����/�S�;����ӧp�w��n?Z�q~�7���,�LnGH7 ��T��(�����tXb%��F1�Ќ@�����-mo�^CQeb�3@�͖� +P�W��{��ie��S�!�Ph��7��o��ȪU +�ma��:���ey���e�O6��� � A"���K������#y��1z�Σ6\@P֡�� +x��܉�I�4d�gٟb�������E7P��ѷ�>��j�k�q��+zL|��>����g��2(��+��m,q����C�+&y�7+9��K�߉f�{$f���5�����쐛��S^0��,h ����sR�B�-W�n�����;����lĬ^Xx=���|q>C���|���3��r�ھ�ڇ4�(��e�Z�R/?���&�����F��d��m6o|5g�>��#�U���l��?E��WO�"px������ߨQ��^3���>�츈�Ja��i&�f�����}����ϱgT�.|�D3zҢ��!. Z���n�j�V��0����rq��\�K����.?>�Lr�N����z.����lD���1 }�E0�b��)�k��apH�o�7�Q�E3L��f5c��F�]�2o)����=j�o�r����~N#�^�����l��EFؗ�eHӷ�hڬhO9��6܀S�T+���M��k�~�,������_�>7/3�GH��ith���f�*&}��i��e?qX�B��[K���Ag�gẹ1��l��+�����b2����qR�3�>W1I8��3�a^� X�R��ѿ:y w!��X�m}�4ӑD�ʼ/�͜��E$�@�:�S#��9}�<����1)�ⷹmG?�B�,���Vw�5�&g;�4LꕢgD.�@��n�n�1$$]Ѡ>�� �B���v7EJ������ȼ4d���7�ؾ�f*�q�%`h����ݴ�(:��� V�i$j�4��hq�$vt3�Q�7j � �,�S�'��H$���M�s���4�ڥ�BrP�E�}�r�1c$��ܢ���*��AsT|3�3��cңaqZ4 ��G��W��D�ɪ���"������B*���ƾ\M�R�dy��q^�2/�Љ��^Fpy��5>=�u�l#J��ɲ�)Oy*�3W����V�GqQM�<�[������y��88{��� �+M�璃g�rq�z���˛2�qDg�7�La�bz�7�r��K6i�ع�� m8�<6�[�S��8�Z澒���+��/fޟ7��Ҭ�.�!��( n��&���"����S�8����0O: [�؏�������ixM�w�`� �P3,v�ŀ�j�[~�V�K�� =���7 +��zJRLI�z��l����yVVx��<�Bu���TS��Y���C�����, }�TK�ls㜅0���֪Ʃ2��I�m�g"{v��R9W�T��l�у�ť�b����/����T�MJ֢�s��?� ����Kb�;0?z`�{�d���f�(a�Sm쎖A�kO�{���4NՅ{BO��]Abf(�h���uf���k�;�Nd�R�C��RAD��k�������ds��e��<�m0���i,�"��5 /�|���q��ԛ��v!I<�~h��4�2onc��u�'�����*ʏ�ks. +K�\��4�S�n���烼�Y���Lj�s��� r�v ����+��T� �Z��N泚!�ffˈ�"�̑DZ閣���\�f5��Q�g�q��*5�$�ַ���%V{gl H#!��]��Ѷ�I�"@ٗc�,�.��h\m��:] %��},{�${��[T�1�s�>Cb?���v��UJh�A�H3���G���V�u/ϴ\q����_,J�L�2��}��-����[�?�m��l�u��;�f��z���ʖ���n���\�3���nxm�j�� +8H|���Ϗ�y�9�֊q���RA6���g�eY\�e�eL� ��6���$UR(�J���@�3ĕ�G:#�}N�8���ӝ��N� �*q_����r�h� �0�P +p\� Y�.ɑ�l�X]�R��*�P� �z�Rm��[09-o�_Y�����b D��/����,�v� �fX����}��G[W_�F,���]'4Uhi��b�ӄ��]/�E�TC4N�a�?�z�9 Qֵ�b��!#����"c���\�NF0JȹAh�mZ��A�[b��q��sh:�;�r[����x�ٮ*���#3���<��^���� +��?Y��^*�F<4�)t���R�Vǿ�Ml�L8��r4�=��;ܽ���g��0��K�"z +�P.�l���IW>O��7ط���~���Qs��4��F�̠��K��k�Y���[�Ű�dUp�zH�=h�$֜�{߫ԃ\�G�PE���ܓ�m�H�Ŝ�f�K�y�*�G��t`�*���I�I�k�z��4�I�?]��H9�a�{b�e� ؟��et�:TP��uP�j�`Q�T�zL������t���L�����Vխ�����k�u�"�dگ���ks`�6���C���({e����FWj}c +���q�s]bp�'QV�b�av��i�"�_ɞ����"��.M!���!S%W%����O������vԯ)��(c�kY^넟�P1����l+w�~W�RQ���7[����S`>>L��p�_k�3X_�����6���z�/`��9����9.��ӳP��O"���z���pn���s�*���EP8եdw�o���iO�fl�0�@J4��J�33�n�+�,�V��-<&�)�nu�Qg�f�����E��kR�?y���6���6H�Q��lM��F d8� +w�\!�S݃��}���х�?Z����c�C��+c;.�E��C����%�X��?�)�ݘcjl�����D ���/�(f�O^;����S�x +~��9����Z|���Ox��B�U�2 �sx÷��s(� ��Θ��{!�ۉb��W�yT�'�Y�2S�s �P +zσ��q��ҋ/tZ�L�p{��u�+y��r_5w/���"""W$�)�x�=�4��_��6����W5�4�W��J�!��E�L+Z�}�UEH)������7$�������x\(]�N-��6��.=Bê3�)g������-���?ȳBjj8��&�����~��0�2� ��A?#̒�5*?1�"�M��|�y?v�-g�%P�2x�������U{���R�� w\������\e��Y,��䐿F� �%B<\3���X;{�$�4v{���l4/~��J�VM:�e8o��j�Z�ә��a��b�����GqS�@�4����#�n�q��\L�ˌ����M�>3����ω=A?b����j�xt{&\�0������7�&گ)i����`<?����:��f?�ʁ{�ͪo���ҕ�._���\�m��=�ѭ|,���1[q�̶�8��b7^�y#JimZ�H�4aA��K�Uc�y��j[Y�d穂邩�#8 �ۂ�����M:@눝���FCb����.���_'&`2V-o"c�(�c���0Ɩ.}�!� &#NCt~��� � o<$����s�6�C� �/�<�k����HT���%v�˂��R �+�F�ԋ���ԘԾ��b{��,��L6�HZ�o3:4�~�N6pڝ�P&��[.��`�c�k��<�\�Q�C�|��&�䠊����|�9T<��f9P9$�@��H���3�� ���gdOE*��"'�&���zG~j�^ 2�5���O&Ȕ�+�J�!MrsN�5����z=v-[�jiQ�s��2h�nJ��[�r� �\���v6 �BUzp���:��\I��X�*3���Zb),pY�ɜ���Q�rh#�T�R��@��ֳ��6�a9(L�N��i��[���rN���%���[&��ﲖ2�G�Ke���F/x]��T_�-R-��a��n�9��\������E����<��ٹ��?)��aҟ���B%���v�yx[�Y��][,��In������]q��ό���[L���O>�i�C���� ��e���P��X�k����'�4ܯ�M�j^,����d@�^>k�ʆ�/�N� +q�������'�}���98<z��5��w�J��$Ev�l� #�y�Q(B.����L�\+�[����il���+EaDJ9����8�U�g4GW�n����m�v�ר� +߁��zSu�P(cW�� ���#�}MA��&)�2�̇��;;2n�5 ފx��ΛjQ +>G9v��v�_x4�H+�~����5W�Kt��Fu�Ÿ�W)�d9���CQ� Ҩ�9�?��D�:P��UB�����a�)ua���V:���� (�,��;sgE�pq-.8]���߰��[��Q��z7��'Q���Mm��=UB��E��gR����7B��HC���M�49�d�ڝ�8���H�����*��.Jp��t� :w�)B5�Y�o��|P1�b��|��3NG�u���f�)�O�+-�7f`.9�����Sz�t���ߠ��u�w�}��cN��0��0�й��q`Kܺ�v�!TC��� +�qv�^ғ],������&�4V<Bi�I�a�,:M�8\^7k �%�g"6�.J �?�D7�ݾc���aTd����%?�{��j9�`�~gt���߷�#����I׳b̍�}��pBTջz�a��ܛ>OC��Y��G��Jm��R�� �dM0c~wEN�x�B�G�3�o��H�*�*���L>k<��u���<���|�Eb\��c�a���öҩ��Ms�������zE���S�!դ�����16*}��ׇd�cT��Q�vG舍:�d�WW=�f�ҋ���`�F�O��|�;��-��A�}�4;��q�)<`�����XBT/�lF���Ey���>U��϶4뒾�/���}%�"| m�<2rN��M�yi) _�L�6����A�ff T���O�?��N���Y��g����n��Y�J'2잫eҡ��0гN?{Վ��:����G�����o�0����n�he3���������<�U��� a�s�c���+��� +��� �(��G�zk]/B�����>�IF;�C�B��+pdP�Ц�� �] m�MN6E���ǃpʋ!�bk�G'��/Ο�ZW� �6��o�WҦ�٨����%�ּA� +����g +~�����E��W�r���k-������l'f�������t���rR�Q�?���C ^�G(��*����QK���EV��ke/GL�l=�ė�<n�_D �����h�����O���}^ ��Ku��rY��&���3ƻے3�ѭof}��ј� _-�����E�K^|t�/��G�:w +k�g#�غ_�1�^���k���ҕ�����?Fl�f�O�I�?'���k�<WHt&P~e����0w}���`D�����?i9,�{�l������{�� �������-�L���g��mrzH�����]L��&M�"��"�U��L$|S��:��:�CA�)����[���\"� ' +s���[7(ȡ�ꔁؕ�_&U+ٌc��_�d��i0����LI��jH�B -��ŏ�HQq�*#����`QW<�)vr�?��D�2 �$]���s�:R�ֻ�K*����r�����(ѵ�Ϗ�g�q!ĵ�w �� ���G�Em��0U�ʿTIL<{%MGѕ��6�4�YѬ��+�V�QLF&�s�oR�?��T-h�%�%��5��R3S>�C͋��)���|(S5��Y�MM���3W���cnV�Z$��)/�3��N0w��5���Oί�)U n�L�����V�t�R�ꖾ��N��QRoz�ſF�7»�� �{=��-6�?9x����L�7/9:Ӹ�1KO40���oj���T���D(�h����)��n��<�.�f�Q��5��竈*���=gFN$O#���wm-fT��㩞⧹�QJ���C널�Zy���'�\�Jᴊ:��u�B��f��~� �K����k'z�&�YA!*K^/<1-�����v�i�Q���iiy�g�r���>$�̋������G��ybLP:�{�9ލT���X�AV��Q����5L��7���x����;��7�~�(钂"bvF ��~R�4��]Bؒ�6_vÞK�}7VU�4{Q�V�6��)�!~KtGh�K^����߶A�o���T �9��`�%�o�pLt� �_Qy��C�p?5qoӰ�_������C)���mkb��������F=p�CܦX&�s��a��^� T� C�:;�@�e�^u�tX��>3�S7��1��s�;�"�G�4��1G�\�4>����}�(���]��X�sw��lo)~�n*� 8����N~NDR�)��l-�����X�"����@� �%Ʃ�o���:P�uz��&��w<O�����?,�'�˭����3�أVrɌ�_¾a�*M��q��I��jN�����E?m֢����Kh�Ʌ���M�6�3��+��Z��I�$Sd� +�Z�\*Q۾� ?\~�@��B� ��ⶲ�tw���mE�[�"�s��Bc�ʎE�.~��s7�:G�}���w�o�� +�x,O�A��]��K H�Q�������Ͳ��e������o�*dc�Cċ|�.�^�7R��n��O�]Tob÷.���܊� +ԮX����`� ��PW���I���cc��@@t��w*��xtJNZ�A +c��;[�u;:rc��M��g����HP{�Y�����M�;���'|?�ԅ +~+�&_ ɔ��TG�r�w�V��%�] 7���7d���IVbt�z��K,���߳�^�h��oR�����������p~S���A��Ѧ�DF���Cf�����ъ2���7DGCm�&��d��{���{��H}�ӝ����E�i�/M�,��g���;������O$�0�>q$������K� ^_�q�(5۽Gkeas�EE�>S*azF�Gb��q�<����⺿������7�P�觪�lkr6�x�j��!�c1�6��-�T+�M%y� 8�,���9k������AMm$�)�RH�J12���j�-w��P��M�RB��^�~�M`2�./�h��Q�����Z�/��[��g�7���bŝ�%����h��@�\���/&n�X���?��J�AN}�4�=�i`b1�0�u蹙��[ #ނ�Q�1[��nݕ�4m��뙱0������<�..���d��cvf���=�%'S9����{�ǎ�!�4W9�����ΘZUs~6g�������y�Z-���$�}��s��)�98w,�$�ᦗ�e���.�;l�#�f�^�.JʤN���� +w�n�a Ɖ��s:������=K �c=�@LN�"2��`|�ϘN{<q�5�d�W^�"G�s�//�]^�]�n�EÔ��e�-J�$���$R]������9Y��uv"-�=� ^����3�ɞ����Y}��e ���I�r&�`]���w�;�&����`��Y�{ +�T�th��<l��^� ܵz<2�J����T�"��eȪ��h�����Ҭ�y%�� +�E�~���2r��.�t6�PY���`�O�<s����k�V��Ź����{�Ipʹ���*�e���pXr��қ����-q�SF��f���qo��v��!�;w��Gk��)��]i~��A�QQ�Rc�jHrU��,J��B��0�W^c'5�%����"��!�.�4# +�F?�"���7.�Ù�@C;?"t�?t�8�r,5������ӆ�}�����O�2�p���1�j@:t�/�= �8�%�~��B8��&$� �i��)I���� ~3�x:ˣq���xX}*W�8�YҀ�<h���Ѵ�ad�Y����ޮz�/�|������M�u�P'���eܨ�+�JĽI�� +�'�/1g����e~�h:�&�X��k �o\b�Λ +T�([��j%��݉(�\��_N����>�:��}Ɏ�.�۪�=�a��WGЮ��ȧ�<I�+��3I��gh���y��]����cY�Ḵ���Vw兺�_S;ڛ��%��I�l�7ʯF&b���m�EK��d�=Ő���L{�D1�Y��&��8��6rl\A�*����xEҀ���1b/�� �n6�J9`���ł,r,�Z�� �5���� k�."4�'���}��V#z���a���������G���@�����!����>�L|gy�<!��Yd�����hD���r7�o4G?v�>�Ce�Y��:�ʞ����a%��{�S(�%�+57�����Tl܅����a(��y��=fv�,�0�B�Tv��3�PZ>�'S��t�r��d����wܗ�GW�yZ�N%����ޥ +}=m�$T#b�zRz�j����Au�n��{�İΔu�3�]�eE�'g�D!)�R�J�cY$;M������� p�r��Ȍ���HY��Y�Q��Y�N[o�S� <k��9y������]��'�B�nqV!**��}�9ڗ=�>;U9�[���JA��5�?T��T3��o#/�K=� +�T�8�$�d�N�B_����V) �W^G�t��c�)�dtl���0�q�Z>�ꍆ�����"Ț5d���m ������W�(oy9"��ֲ��h�}՝�����S����A"���K2ϕșZ`@�X&b�zbJ�C.�fSi�_r��53�y���j�T[��=� �� �VY��y�ѯ4_�X;R���`U����Y�����5���z��s~��W���{��|�Y����e����e{ �����W<0�Ǔ���[Eq��@�1�m}���<��/��:"*�$�V��n�A��j�hq�@g��R�F�����w�ؑ(���#1� +�����i�XF��M�$zR:_�z���!�cy���B@֯&Uqc,C�&��c+���A�ˮ���_��7����O�a� KL~���R{M�aMQG�<����1B�^\��5V��g�u4c�pxt�p� �Æ��"9�>v�Å����H�0ɾX��}���{��pQ���l����::E��/'��ϸ%�Ax"�z�@I5!Iq�,�譧�S����c��Z�|2����E��cs �L�Hk��ߧ<9�v�\��&��DS4O ��@/���}��?�S�&��a��4����K�ŕ�%%��i22?��{�i��"�jdžݩ5L���p�.��?���c'�4}kY\��+$�5��$�H�{,��U��5�+�I�$�/���R���v�ﵡd=9������"��}>�=a��փG��T����� +e��&��\R]G�O�C?�`��Ըٽl�G\y@\��Q9�!/|���ڝ_d/ NIS�0���'���a����W.+^8���sQhۅxq����i[�U7�*h�����L^�a�7��s�D��ඞ��{:\(����$h�� �z�>v�/�;_Ϧa����,�F$4��!di{k �hA�I +IF� ���P%Re��=`����r��M�7�g2� ��5;Mevd[�`&�e�<�9�KM-|Q��Ž��g\���įnE�'n���f�:b���>s�d{_���@�\'a���q�}�����DN�g���5����eg]�J�0�KP��C���#�A����%����n��t(�ʧr�D4�ťj +��Lӏ� +$ڑ�-G�S��Xacc{@v�͆�*�+�u�p�V2 �C�L˚��,��|�#���Tq)�=J�Գ�ƃ�4Լi*e����[*�*2Y=B�3��G��R�C+<(���#e'k6�4�DC������t�|�k���$07N'�u:$̐�dR��6�j]���R�����ɒ��,���<�<<�ck�ʔ��ŎD,��������l��/B��b��"#!���R���j:�[X౨N� � +_,A�l�B�����3t�+mi���h��.b�9'�2�ȟ\5\H%�b5&Pt��F�h52 ������=���E�8p�q1��`pQ��k[�r�i����8�9�g�OT$C��LYvP/��H��uĀ���ht�t�N�������G�aͦ�N�Am�fkm��p�{�9�]U�q��3x��:�P��� `}7�<q����S�u�L��B�p�w+����Q��Q�Na��|��(�f5���m��'�1��>���UlDJ7:Ni���B@�9\�lS0�)������K�����qWh����a2۲gH�a#G�Ƈ�XO�`*qC9�;Ǔ����� +%�a�9���\U?��n}�F\�����_��.�(�s(�E_�Bc%4I����g�$�x)�.�s)�����q.3���U(�^������6�+�C�m4�-D�p%���-j�|��s�p�I8>q�]�ѓ$F\N�� +�W������\�i��t}WmO�<�2S>K�Cyq-oHQ�avQ6� +[���C�z_^����\���E�g�$��B$�\��|�C���k��;�|̤ +���gYc����Z�������|p �Z���c����r�2ł�M��?�-Yo���ѯUu����.Q��g�����+��sFt�ԝ�� �3��N7�p)���eb�<J~<�<q���]�� �?��'����̴��/�#��p(�(�GRt˽�����{)i��m +������ض�]t�O���#�������[z=����:@���)�JK����~Y�6C 3H/�z,�Z�R|��̊�1d��4�x�;\SV�8���_��N��LV��R��N�ݼ.�l���d��������C��z�;K1���P�U0��K�\�{����;��m�q�`��I�BJ���m�[\�_��rA�IM �=�T�ݙ�}$*�pj��@1-~>4FO;Lv:��'�%/�~_C��K����>䎋�M`�S��ᮥ��H���!fx�8� +�_f�)�������=��X�L�H���[]9J�Ѿ�/1ԉ� '�vʋA(� ��ɘ,���:�8��t��ᖃ�T�m���{!��EE�f�5t�\�͝�����NHx��z>Lo�e1���E��d������[�F/|��ۧ~�H�[\^&��)� ��Z�X[���Դl��+�ȓ�៌������:�=�����qЛ�GĪL�B"�S6:}�������'��ҧ���?������xV��̏wM��_�T.�zc(�Y�{��:Ȁ{&"'���V_�e��ύ�7��r86^��nb���S�A��{9��X�w��.���Zv��A��۹�×�&�F�W���7-�1#�[Ǐ-�04����R���Ŏn�� +�H�]��ez��W���lt8E��S�����G_2 �-� ��ә��i>�"8� ٔ9��$s��ބ����z�� +ct��t�@O/�9���_���ˌ�PF�_ɯ���ş.ه1+� �H�CMޱ�EKF���_}l U6"f��ɳ-��L��1�,����Yj,F���ڻL{!�3>�(��O:I��*g�R�d�ߖ���^c�\N�2`H�t1L<q�A�t�'ɂۥ���V�n#z�ں����-�'����� +endstream +endobj +1562 0 obj +<< +/Type /FontDescriptor +/FontName /GYDQSB+BoschOfficeSans-Italic +/Flags 4 +/FontBBox [-176 -300 1375 1139] +/Ascent 766 +/CapHeight 728 +/Descent -198 +/ItalicAngle -11 +/StemV 93 +/XHeight 523 +/CharSet (/A/B/C/E/H/I/M/O/P/S/T/a/b/bracketleft/bracketright/c/colon/comma/d/e/f/ff/fi/five/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/q/r/s/slash/t/three/u/underscore/v/w/x/y/z/zero) +/FontFile 1561 0 R +>> +endobj +1563 0 obj +<< +/Length1 1199 +/Length2 806 +/Length3 0 +/Length 1564 +/Filter /FlateDecode +>> +stream +xڕT{TMY�0�+�dH�ͪd��=���e<���T�(�{ξ��sϹ���5ɔA&�u���(Y�L2c��1�i����`E�<fߛX����c����{������?X��:�xD*�H0�� �v�s�XL�*|�8 P""� %A�y���C0�y���X�A���D��x5R�x@��X�(�3�@:B�H��j�*��h$�QAF"�!��j��| �}0|�g1$�Pf�#1P��-B��8 +A\$&e6�R ��Ȑ�Ȑp�"HR��SC�8� �W� �!��a<J4H� H���F8�x���F�#IF����蠁�eJ�,N� ���1�ڠ�*��$8�M ���rq��Kk' �؋����H�h��>!r�A� � ���쀁z�2^@�' �����М�ay�$+a��`�,XY���$��$�H�1� l��(^!��)àl�=M����)c+��l��.�����YC:�S���Qb{8QKG�BA��V��4� 2Z��@Oq�J�}�S��V�Xא퀤t���$�E ��v�`�\u(Sb�S��W��R,���&�:�BLa\+�>�˄|�L!���Y�BHlH�w���Vc� +6��S� � �D��Y�H��i�5'*u(�����M�V�L8_� @G���]�Ɍ�����s���`��VJd���?�i�(���z!X�����}��i��j��x^�:�o�o��*W�>ڀ������S��|t�!��3��M�2S7&�����W'G-�^�9]7|��g '��{�ҭ~��sb��>ג�tu<{c�2;�Ybַ8��Rɺr�A^���|Sy�cqrJJ̙��W.v3}z7�A۲;biuݞm�5~!Y��z|ֳ��u�&�,�~,����{�����mm��I�$�O2�I4�g�i�hͲ��£�O����ބ��c�fpsƝ=�a�����E����7Fn�iS���$tU*�Y'.���#���̽�b���������n�ŦI'�u.����6{#||aWUNo�ǑK.�"��Sbbmv/\��$n�������E������j=+�:��TEB�ܢf^U�е"�U2��Ɋ]�F6���VR;���Ƨ�׳����8������n>�K�ј�o�/6�(S��H�ڶNk�-�"�o4/�Q�lp�W5l�^R{;��������c�S �--/N:�����"��֏������˓�]Ą+#��.��x�q�;<{y��-�����d���|E>y(N�u������6�N��yRn�շ����q�G���}90�������k�Wzg��h�_b-��ϞB����+�D�G��j����_��E_4���#u�Ɣ7�Qu.[r,P�(��lQ�f��;]s�-TU�9��:#��%~]N��W6{���T}V�2]��*��M���:��~������|�Gs�ٱw�\���{o��>�k�u��{.� ^>�Q��<���^��[����<�<�����הn"�����!k�'r�sr��m웨��<�Z%�x0 +endstream +endobj +1564 0 obj +<< +/Type /FontDescriptor +/FontName /WJPRUX+MarVoSym +/Flags 4 +/FontBBox [-572 -214 3014 925] +/Ascent 733 +/CapHeight 733 +/Descent 0 +/ItalicAngle 0 +/StemV 16 +/XHeight 400 +/CharSet (/Forward) +/FontFile 1563 0 R +>> +endobj +1565 0 obj +<< +/Length1 2139 +/Length2 9316 +/Length3 0 +/Length 10476 +/Filter /FlateDecode +>> +stream +x�}uuT�k�6 ݝCJ�� �)ݒ2��0��ݒ�4"�R��!���ݩ��x��<�o�o=�<k�}FM�]�b +��8@ف\��(� +�pp�10H9�APk��4 +��9����\\\���a?j�03eW��o.n^����//7��� +0[Z;�q����`������:�W�vv����`����9���`�����٩��������?j�������@lmi0)�ͭ]��W���Y�I8Xځ\��]d�=��j�P3+�����X���lg��V��X�n ����?:-+k3[����?*�����J�U��SS��D�����7��������p�G�v0��6���W8%UUueY��_:3����%����rvy�q�0���a�{���b99 P������8���?�S��o��xD�N�G$��~DB�N����S��r���)��x�� +�Ʈ��`�J�Ʈ��`�*�Ʈ����="��#��k<"��#�pj="X.ڏƮ��`��]�$c�D0?�?���w��l�����r�@���.���0S�G31�ٺ\���a�&v�C�+��d�[@���G�����'*�o�-�/{!���������K�b;��T��[bo�X��[�i��Q�#�&��o��+��X��.��,�����[ q�� \0�Lj0��������cya���t�;�a�Y�a���ac���:�1?�d��k�Q��#���`�`�����\�M/�?R�zyL�+��Q �p9��5Y^����+,ة�k��c������A�5�����0��cXW�\!P���c7x��#�7%3�c"@Xя��`N.`{�/��6`�?���b��!����#�������3���k��,��㑇q����.f�?� �������c���&���3,��������@�P-O���ߛ�/�kB�!�`]ks�՟&� ���0�����7�������K") ��f烽p�u�� rs������vf�����������`3��i����ʐ�_���C�˫-qz]o���3Y�VJO��Ɲ$M�KIR�f��Ʀ}�Y�~ {�g.%����t�K��g�]��[���!d�#)�����&��t�oC:x�˶r�Z\�������84����̖}�(=�Uh��!N,��A������B��ݝ�^�a�p�Qh��͏ .3�Nt���o���O�r_�����×h +3g�!Ɍ�,'9%E��q�NΨ�"��E,MM�;�]*�r����gG�p�R �W&���]����k��: +�r;�'P�Vx՞B�'�!��{�b���T�1|��b�|����dH�t-���=�Ŵ]n�\cd֥�x"ת���:9�^3'�s(���ܭ$xMx>f�f��2�%�&q�H�������I`j �����\}\sP�e��Y�>�W� +�;��2*���P�_7��м�g���٥�����*>x��������R%棹��tC��}��w�ǚ�����.�;w�wıYD[�?.S6Lky�w�K�I��Oa&����Aw�m��{��8�wX�t {'�)^�G̎�|IbQ<+��H���k9��{u�����XŽ%�n��+���{�}�k��-�~�B���`�faQ`�e�\�M!��|�� ��(Q��{���I�J�NZ +Q0D���e��7�[8��DNn��K]8)��h�ž.�� +���"��6�"���Mޟnv;h��}�������d�-k���O�(�WC@�J�����^}(HCx�l�LK�KîJ�P�2j5��eB���c^����d����=����m;ƀ'chZxh�����DFmG����8?ݟ�":Cr���e2""�%:��~����VB)�zm^��Jmz�G�:[��:��`��hs\���=PwC�8�b�:Q��H�_ ,A�1�����Wb�11x#q���f�cz:�j���R�njGW��ҩ���1�gQ>�\�Y�(cX���<X�4E��6�ҭ^�C������/�CQ�� �s_t������:m"|��o�5Z@��R}�©�G2�38;D ��R��o7w��x��nv��r;��5\A\��,F�ĭ��로4G*~�3^�pl}�^��M�~��L�_��"������zϏ�Ϡ��(r��������ŝ�����[��K�|ۂQ�pn[L`�EC�������R #m��x�W��_�b�虲�~��skH(\Ƹ�Ɯ�-�ПQ?�W���C�vk�즓$_p�8a�&��'0Sg{��H���̾��F��2k�Q,/Z��,�a��e�pAS>���W�V��0Y���4ؖ�j1_q�g��ݒ2�|�z�r^p�NiHU/��!@��o�==�|�^�6m�ֺ�+crofPB��R߃A�� a�O�u�:2�!��dX����;�7���� ����1��9��C/$w���8!Z��|�<���CՎoW��i��ߏ��Ǣ�Zȿ�|j +�jo��g��CBސHD�b�אӼ�аe�����:"3����,�wg���=1s�A۾�]FO�=���I !�*�Y�K�i<����wr�;<o!�ZF>����������j�ߍ�A�����[����m-���%�&�I�ˤw�3>)Ӵ�ldo=�>�M.����`8)�\��&-Ƥa�p�@��gr1��8 +a��g��@�q� 6S�jk�=�Ϣ�9�l��N;� ]������=F��������M��k��Ձ�$��IR2wA]�I�ώ��rrg������p�=���l����5)�N7uMg������gJ�)��تf�S�9Y5���nu�m�QR���R!��};�3�Φ�8��6�����6>b~j����I�Nd �xrU�]N�0y3 +��(/�1<ɡ�^�3���G�,h�B�Ls�l8����h0�m������1������c�C%��'�B饝K#�4?�`si;Ȩ�����#R��G���6)Y8$%�S٬a@�1n���],��Cl�)\�jWtTkn=Lkp}|]�bV\�$j�w���V�.6��8�0,�t1���Z�e�纻�Ue��ȼ���xM���D����ns�dc��ޡ�Ʒy�}SR2�7"��!Q1�|���� o���Q�w?�TRE`�b�}*%Ok\@p�}���H5�=[���u�����٧/�f�N�IY��pB�9�.[����h�^��,�$5�/*$!~\=�W||dڢ�gN�P���7�Q��,Ay��_�!��o<J�V�� w�]�5=˜Si�7C?.�\��O�1�mO���ʛ.����(fSH�T�ZSޜ� Q2���~�:Q�3��9�crj㺂��=S[ײͬ�ec�$�Չg�_�i\?<�~�����J���Mj�� {��D!Y����XZa�=���V�kP\J�t&��W�T���38��sKyȰI%�Wp����n�70�c t���&|�I�2=�����3�����Q�V-/2ha`��ryV�����B<|���u�n�5ݠ6ݷW�?+ե��O�ɸ����Im��d]q�c=��Y��r.J&\)b��r����zd�֪��S����,dy�aUQ�'&��BZ�Pށ5�Ԝ��Z�3Zݟ�"lS,^6�����~�69'����ɀ.�:�(�;�lF���jӹ��\8�c��#i�]ӊ����v�7M���:q +:�G8��i�I�@�V�P�L�*����ן�>��0��G~8��U��!v��.{\F��N3��~�c'�b���V2#�+�>��:�K�g�(�%��ǩ�GGr�������s�����Ϋ��p��[ �-|��K:��%xВ��m� ����:6� ��1�s��t�k��:&�n� ��}�k�O������;���e���3���uϛ���Cwr����O��.:���(cۆ˝� +��=]b4��ͤ����\?��h��9Li|�e��ě�>~�H��n�H��3����@�G�82vE퓉�"���hl�o��IVO�M�5u�m���h���̪��Hk_>���R`e\a匠����Z�����+@WpS���FNuFƈ�d`�Ή�߂t�2��,+��q1r��0���F��S���r�� U����A�t�ᵱ������i��wV +�B�6N�7�Ve������U#f�ퟰ}g/���F�x)0����JI��Gx�z?2�\ 'K��z�4Ή.�g��O�Rt���q���*���3����*t�H��,-Dv�$继�~ݴW�;�L��=Cj�5��6%i�u��s>�H�;������ו�Ϝ�r^J�Μ�Q�N� +� l���Vp˖��چ� �����{=+��.��8�lds��07=��[���W�n3Vi(i����-" +n������ү��m�Mo��X"]ۄf�27�%�GO\E��㷤jy��q�� ��f�Pm��[2��˛gZZ�f*�2���O�[ +�O��7�ӯ|���9 +��� *ñ��;t�phj���#^S|U2��k$� 1�._1�s-j �u<�1"v�%h��A�����F���O�^�dS�/rF�6hn�VIH���؉�����2?�p���g��^�Y,)h�V]����+{l��:��Dpa��>����X��l�r�a�ˊ=5���b>�cQ�����P,��G|wPC>��Q�����iݸG����H���7?K#Y�����5B�.y�j5��+#S�rdmi5��G] +Q~|�%u�{��^w��I\�����wm�pSʗ��� +j�e���g� +��TE���*l����wj6�5_��Q��3��8�Q+��z�B��.��e*t�� �0�>��_�0��ro��ѾԴ�=��7wb���=C�m�{�%QI���k�f�����l�uP"UÂ&ջ�ےT�yu^Y�\�?]���T�28�ە�^�?�]�w�mpnl��|E7�8j�)�,���p����u^�Ǚq� :�z���ٕ��ٵ����Mc� +�F9r����Q<̔�����C�i k)�L��R��G�9���o$rs�[�>���᮲q'<_i$ޛ��=:��G��~h�E �G�η�1�!�aT���G5�������|i��p�Ⱥ8=����Q��r����V�._�,��2픷���/+�V���쩽�\�}0!p�C�N�Wd�N�(5v1V�JHZ��w�}��[Y�@��G�ڨd�~iS����g��y���6y=pq���m���+���t��*B��J!��kC�J��ϴ����"}�����f����`�8~Y�IZ*�i��ޯ�3x�F��l�t��/�V]��$]�Ѹ�X/H��@�mb�7m)���с��ZE�M��y�> GVmj��v.�o@r<}̉C����Q��%q����!�>�K1Q܇�O�OVwP��/���|Ԫ�ی�V��5���s���[1��ϡ�']�-}� �%�zӌN0�j|&VKZ;�������3.5�J�D�������QH(�_�\��� �|v����^W�+��:\�àN�]P�gO@�$�����F�s��P���d���mDE�`*��:e�D�Sɼ�0E�5]����?T��f9L6�犂{2�%w�J����tc�Db$�_$y[ԧ���P�rYe�{I��w�N���y��e���#�ѯr_b�ʔ�fm����2b�K�4E�$�)�Pg�7?7��v�>Ʊ`���μ�Hs���*�e�ԑ��������:��V���*<<��`Q��Su�P��)��T�DK����D����^�6f��OT���2��]ru�3�|�p��^�n���nD�ؚ�w�թ����ɟm�?+���a:�`kT�{ѷ�s��Q��[���f떀�0�Ӏ+���E�ˌ�쉥w<5�>��/2�5R��w���z ah�1����b�.�j�0��������HK���5ާ�x�u6I�mM#u��ي�D��;7��c��7r +�c9[Cз�I����{����8��h'b�/?�/0\Y���l�s�D��;���B�"!-�x�o�P�2%�U0����ș� ��M�ǣ���l��c�јڌݤ#�'�'���%��z�ء�-g�F�ڽ���Q�����/�+ �Z@ȯ���Pޞ^L8��L��5������*��_ETA�XDӱ��mS~+%4#�ɷ�����\�/a����&(��r��W|F��8��V�'d*z˳���p=��*����4�t��ӏ�.�������y�$���"i����%��Hk������fr�ݷ�V�#z�|����O p�X�ɂ����ޔ_�M��$�H*K�+�����q��~�g}�<�]��uA�R][a�B�H0���z�o �[�F �wT�F6��O��G��ܾ���ޓ ��� +�ۍ�"w�;پ��<P,�u����?�(�z��6^F>f��ѬAv��!f*ql�X�BQ��7c�ȅfq�\A)�Ya�F�'=�`xヌ�F-��06��V�P��w��L���=ot�L�r��y��"�Tԕ;��j$3/r+�N��4�]Kl�=�'���n�V~������V�� h��O�]���""���2�5� +���q�o�6��&ė��3��qK�yT�������8 +mnF�z��[��-\�� +v~��]��,I �eıAlt� +}������Y�����|���E7���"��w�ߗ��"��s�"jf�ُlQ/觚^BE�0��\C�%�f+�t����n�z8�a"���}�*yQ�Ϟ�t���wU"�/C�mݩኳ��|zXs�4тއUW\3�4�W�w`�( yɴ�m7<O&���lnU��3�+��YqC���qؽ>#:eEKbr�4{ˮ�1T�0�IH�ɮ0"M��'���չ�l�{��l��Q�5��$��b@�Y'/�����"6�3�֝�ղ��k�)~�.�-,(C�tE������N��b�ԣTMg��� +ЩW�?G'*^߇{j�ozul�����]2Q� ��k���_�+ܿGp:�!�"� �z�~��E1���U�TQ�z׃��U��L�}�<m<����rCA +;&�V�_8�C�pȼ\�sR��� ���x��k�W���ۈU�{�T;P��'�s���j��e�{���;z{z�Y�H�nʠ�S�n�zG��Yv�š�%9���xM�:)Ǟ2��zRo��������~ +��D������KEK�(R�z��o��EgKn��w�bXQ�u]��2v��+����}���V2��ږ}�aB�Oڋ��q�wU�!��v���T���8D~�^�/�e���5�G�-4��-�T����� �P���`���F�����<r +h��� +G�d꠱�승x��(s�=}���!�j3�d��נEWRT��%���]�ɤ�m&�Tk^���~���bT֔ *Ii8��ȁAc3��mi!��� �7��A�X荎ʵ��L���g��c�nKt�@�r<r��=����٫gʡ�5�[6�49�r��{!��I��]��?��-.�HM�D�k�O�O�ޗ*�z6�jU `6F`$/a���́V����k��df^��P<�Kʘ�,�P?i�KyMya��8�f!�ަ+*�;��Ѿ�G�5��/]yS�(��)j�Qj�p�������B�t���*���D)oX��w�YV⟓���͇G�e7 &���f2��"_[H���2Ԑ�Ȇ\��&{���T����_,*ND�h$�6��4���VL +��Rɐ��e��E+�) ���O#J�P2�(H����'!�jf�r�K��m����"d!�N�A�mԒI�Ԫ�o��գ�.�|1Q�o��b$���bOwh�Rf?���� �1��Y�!Z|�ST��\�������N�\���,��hb< 5�9r'��[��g�ޚ�I=��81|[[�/YZ�o�d�;�OD����wc��K���i&?��f��8|^v�3M��������@b�ן� +D����|���0�WB�!� ~���֠�N�!��Jc���z� _y�?��-Os7�i�T��/"{H9{��O�J�����tϓ�h"����.�-����R�1Zu�;ҋLl���M�(��9�CS���HvG?�H~V�J?8�Ρ��f̒�*���Q���I�U���;�2�.�KU��Q�u������q�����`}��<�YYz+�lr���m�C�y�Uc�}�иi�V8�;��x�cy��5���U�d�������&~A��%�i�k���`���E~� c2�ae�l���Mf�C�BFڻ D}QgN��e%�Z�Dv�'m��t�oHne�+���T*}�Џ��$g҅p��k�`�O�D�e8T2r�ێ-��Ye_����:�;"����kh��d0j�w���3=5����PF��� +���]ɕ�!2�֘Mo`B'�j����ʢH���D�,���a�o�^���c+>Q��^�樍J�َ���T�OPH���J ���s`����T�|���G�c��B�g��#�$@\�sd�����w[2j�J�\��^�f���EJ.rN��.�o�A@/�)G��=Kn��P +�R�~M��Vv�͉��U��G7��3�J� ��&"����>���s=�C��8Y岁~�sO^~ �Ҏ�f���ib�EhK6\ČWL-j\���4Q���&��,�l�R���I$˷��_<tL�2X�5M��+,�7�"A�,�I*�4�h|��o��OW�Y�t�O���5I/�.��=Z�::���:�Dz~�>���*���:����p(M�4)Ȝ�;Q.�a'����� 5�����/G�`q6��0�Ml��A��<o���85z�T$a���i]� ��g%���>M� ,-�u��P����I����u�W_Q�S�]%��F�LlU��yE�����Ż��,/���[o���s}�������8xv*!�w�m���u1e�M�W��cJ���Tj㯨�-�Zgا�9���#��Z�x��H!U�Kb+��.Y��(�l���RF��[gi�̛'쨅�I���Xa�R�Yj���� +!�+�=���/ iN�S�S�^�@�ZH5U�pqe�u��5��W�D�GD�;ul�K��0�H)0 +�.� ��̎�D�f�$������zxݹE�>�'���AN NU +P&>1<�VI�e�V��W����K�L� L� ޡO7��� +��}w+�%�, &/9e�[;-Ͱ�I�~��0��Z��1&+k��ܹ%�\��4��1GVt�͘�ƚw)bI��E=�8���/R(,��i�i�ʽph���Ӟoi�\����V��Od>_���V'C����O����tR�Vl��:�rHyzB���]��|�KS�R*�����33i�g�(�T38��lD���u�}b���˟���?�Lp7Lo��R��̎ё�b`�#�ȎI��u�f��OG<�F!4��S���to�MxN/{I�X����1�h^�n;�:����C�iFq��i?氃'���\���|���/�PZ(qL�?ڌ��ʉ#w��&LW.�v�*.�3"��K��^�o�M�i�J����Al��Q���z�#��G���'���n�~�4�kXjZ-�dk)v �`I�[?�o!?� +�zjeF�}iyi�4�;�\���d�HMm&��IAn`f��v�pZ�����h�'���)� +�Wm2v[��zHb�f|>[�{�,F�f��Q'��(4�S��W�(˽��N���$���(w�Ƨ��v���;Uͷ��A�|,X���6[Y9��%�d��uNZ��RYv%J�'�)�;��BK�H�J����o��VH=o(��(~��_�n>��\�R�T3�E]�kl�+x��0��F>w���ó!N��?����}#�����?$ah'cn��0X���� +w'J���� +�*X���2)���5Iz˝O��nmn����~�2�������X�i$�~י5[�6=9���,�-���dV��SD2��?S�}�����Ά0��o������D�sfy�>Ӏ馴�b��6=I�)1�lu�$�oU�v��\ �L�5��)wu12�>�s��N{���N��$0y���Y�������@Ԓ9��4�_ +�ٜ}O��]��X���S�tvj�JY��|����T��S�ь�|���Q����܋�Ӥ�hJ�����zRZu��4%e1�ƞլN��L3ϤʭS|�k~�#r�~�ŝ���9�V +endstream +endobj +1566 0 obj +<< +/Type /FontDescriptor +/FontName /BOOWFK+t1xtt +/Flags 4 +/FontBBox [-5 -183 1501 822] +/Ascent 676 +/CapHeight 618 +/Descent -167 +/ItalicAngle 0 +/StemV 84 +/XHeight 461 +/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/W/X/Y/Z/a/ampersand/asterisk/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 1565 0 R +>> +endobj +1567 0 obj +<< +/Length1 1134 +/Length2 3354 +/Length3 0 +/Length 4068 +/Filter /FlateDecode +>> +stream +x�}�y<�}��m)�,uY"یcW��o�2�`2c&[d��G��< +�PI�-al Q�E�lE��Mu�O��y�~]���s]�s>��=-dn%��"8�u x�,����$ ��8}Z��F�0�6��V�0����H�T�/�&�2[�7��g�,��p�,�¸��g�����+�*���Ȟ箢���&�zS ��E�c��ڕ��5E����_��'��a�~�O���NΘ�Q2��Y�q�Ļaр�2�$��;������Q���;@"�ѿ�6x������o�Oc�(݄��1.x��7 �Wʔ@¸���5(}Ni@����r�8�����Ɠ�������@�Q�6���/+ Vz��+�_��Xa�x�e����*����0y�I$"�8d(���(��O��}�cC�x�� �I&�"��3SV ȟ�ߤ@���2�q�/��t"�p�zA�A(�A�A�q݃r��m�����t!�=HW���Pz_���%�Az_�=H���c� ]��T� �=HWE�����s-�]�=�B�b��A�X�?H�9�=HW���y��H�d��d��/��f+����àH�{KL�$"���,X�n�,��)�s9��.��Z!��y��+�Pyz���:2�H��_�����+�~��h_�����E5�JEx�z�&���T'��x]t�ë(y�ػ���lz�^'T�q*�|�(���5~Ʌ�._dž���4�;$�W�K2�m� n�(�[�"%����DA.�,ē��#�~.�Q�=}^�� +W����Iq�9u_�b�D�I���� �t���M��pE���)ݎ� +*�#j 2�A'xFr���f�w���F���I�z�5G���.D�ND��]/=c#��^�fHl�Z��"��Z��C;�]f�PBo\(c��B��Z��4��ʴΏ�� β�F!^���_�����/��$��S���l��o���H�l�zJ���t����c����rO��"�E��̥����� C�y���4Rd��e:�>�K:���UIr�+�C������+��F�� + +Z��.B.�a���|�~jױʆ�g y���s?l���B�������=6T/rߪ�.�����[�'�.�5�-����+|$��-�����YڣJ�kVS^��[�̦���ARV���zV�Ў��x�H���W�a���⍠�u�3�,��⥲�εog9�$W'p'�i��]���O/Hx�h�X�vA���#z'$ظ��4��M0�b�ZW|\��q�+�э�mC-�U���l^8�Gq��Q��y�]M�g���H^�H �+�� 3��ns�Ɗ圠H����_h�O��)��y��t����nz�1s�P�u�Y��'�G�E�%���پ�9]{Ycfh�r�����A��u��o��$�s�U>2��pM��'^z&�U��R)�3��Rq����[����Ȳ��V�t(uZP���+�l���7)ma���S�nE2Ώl֜�>2�)��ƥr��=�vXHϳ%jf�慎���ay�F��z���c��Oj����xZ�~~��GՋ<�^m�<��?\�^��7��Z����V�N��U��xD���K�G��o�a?��t�V�s<�9�ֳ����O�@�h�xZ�� s�h!�m��jj@_[QU�~ͽ��3웧�����<��@�N;�U1��ABۖ�VbS��A���˥U��範�:(<'�P�k"��ۀ�_2C^���l_`���p��s�R��2%��v�箻ѱ��<0?��U��`��c7�8�uA��l?ޏ � +I^����%m���2�WAX��-r0��b��u�뼑�ak��XY�b>��ݵ��}�����\��RˎZ|f,bA�̇��� ��xpP��ǻ.��Զ�5G�泹�q��@����ݯ�x)n9x���P����KZ�]UGP�O�� +�J� G�}�x��nnm���q���� +ͫ qq3�<V�<��N�':��l��W�Ԏ��(v�����6�V�e���I������+CN��+�<�ns\�W�z��K�Jآޞ�~��j��jF��~�ֹ�%'`c]����I5e�۲����;]K)��wE���`����2���1�/ݘ>8���6�C����p�f2{^�=)��Bb�YXZt<�_]�$U)�i�P�����aum���Ӌ4yA�-��g�p�K�fա�>���NݪUQ�5����Q�*s���}��#����"��#���]i�9� G�F�˫�_�vi����O�-0���f�a5��ٚ5f���~��-�FՄ|�n��!�Ѷ��Zw�7�1K�v ~%��mTQ�RF)�z��zRà\��?Wq��,�f)� +����,��J��܌< x�2*|+ۨ^���7َY�;8� +�؏��d�{�|y'���=���"a/t����<�Gg�6��-k��-��X�6 +k���(Sws�-%��¾��:��n5�D;�鰚Q�l]����c@h�;ɵ)���m����=X^�V`�x_Ї���y����V^A9��&��a����`���ҘVx��#�6�n���\)�!�_<A�wV�%��l7ETQ�Gw$�;��؞��g�b:7������g�A:��{��-�W�X��o*S��>��3 ւc��b4X�ңw��mP�&��G�����٧�dx��J.9�&�P�Om���6���=�d�vDq�U�Ç�ZЁ*����j������3Wך r�h���G��|����꾬�F��H���NQ�Y� ²���?�뼍ꐹ��8��Nz�"��^Mq��;0���j�t�<�`]��ǎtk~m��AHٕ\�Rb7+� ok�~ú���l��I�]-|զa�٥� ?���e¶ (`Ơ�M�;��yc{u�����ۨ��"F6�?���T�WQ����]�?��b?������6|��^yC��|�j!�z�8m�R�cX�:?X��\�%9�{,�xo�b�#�+`�zKQ�XC�Y{�'e���������a�gޚ���hV�T��w_0o:$/�IE� ~N�j.�L�i%��QS�*gUq^���ݗb�P�d�/�w�~�s����I�gF�����E���ئ��-]q)I��Ȭ7]��}��O�mv�!ݔTڭjL�D�c��:3��ܼ��"���g���_Y�M��������ul��Ry2���p^c����M��ޖ���%2�j�~�5��x��ѱ����U��=��� +��p)0Ɖ�\h��^���L�b5� �#�y^G<��]�`���;i�#��y�=����G{���BI��M�k�@٥�(��M;dו��F%o�Z��D��[���ͺWt�=Ԋ�o\��Q���N��5�F{Y�G)�%7�/J=�N(�p,Xɶxf3z%T7�_��[�A#���'z? ��zj�����B �Q>/{0Z��ݨ��Pq�����uC�Ē0���y���s��������j��Lz����Ȝ���� +�6�w����aa3�tS��H�Y���W����B� �<p�'y:C94 �yN +�����͢�Z X��ZE��-C33֬�ϾS�m���NI�=����:,��<Q����ނ��Jr3���[���q�[a�����/�*���c���Rst���D*s�l�3��>�2�Jsc�g�O+is��h�'�U61��Ϳ��^�kW:�'�\��A�7|ʥ���6\���ps��:��k�6�:'�7�Il��˩��������l�H7vp6xr�5T�yu�,���"N�<=��i���k*|ga��t��@+�I�)V�=����xz��=?L��"\������jG<H�����fW��sپ�OW�f��S��3�vC�&qԩi;��ö2 z�'�Aֱ*�\�x�[������!IQ�g���̏��G�STf�L���VuU��iSX����Q�E:y�\�?�P|���̊������;x�����c�����,� +endstream +endobj +1568 0 obj +<< +/Type /FontDescriptor +/FontName /SGLLBS+t1xtt-Slant_167 +/Flags 4 +/FontBBox [-5 -183 1501 822] +/Ascent 676 +/CapHeight 618 +/Descent -167 +/ItalicAngle -9 +/StemV 84 +/XHeight 461 +/CharSet (/a/b/c/comma/d/e/f/g/i/k/l/m/n/o/p/q/r/s/t/u/underscore/v/w/x/z) +/FontFile 1567 0 R +>> +endobj +1541 0 obj +<< +/Type /Encoding +/Differences [2/fi/fl 19/ff/ffi 31/quotesingle 33/exclam/quotedbl 37/percent 40/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 63/question 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 124/bar] +>> +endobj +648 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /SYFPBV+CMMI10 +/FontDescriptor 1546 0 R +/FirstChar 60 +/LastChar 62 +/Widths 1535 0 R +>> +endobj +532 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /GNUTFA+CMMI8 +/FontDescriptor 1548 0 R +/FirstChar 45 +/LastChar 45 +/Widths 1537 0 R +>> +endobj +1366 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /QMHUCV+CMMI9 +/FontDescriptor 1550 0 R +/FirstChar 60 +/LastChar 60 +/Widths 1532 0 R +>> +endobj +514 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /UEIZYW+CMSY10 +/FontDescriptor 1552 0 R +/FirstChar 3 +/LastChar 3 +/Widths 1539 0 R +>> +endobj +531 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /HTWALK+CMSY8 +/FontDescriptor 1554 0 R +/FirstChar 32 +/LastChar 32 +/Widths 1538 0 R +>> +endobj +996 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /GJVTUN+CMSY9 +/FontDescriptor 1556 0 R +/FirstChar 3 +/LastChar 3 +/Widths 1534 0 R +>> +endobj +228 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /WRFWLY+BoschOfficeSans-Bold +/FontDescriptor 1558 0 R +/FirstChar 2 +/LastChar 121 +/Widths 1544 0 R +/Encoding 1541 0 R +>> +endobj +229 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /ADYYFI+BoschOfficeSans-Regular +/FontDescriptor 1560 0 R +/FirstChar 2 +/LastChar 124 +/Widths 1543 0 R +/Encoding 1541 0 R +>> +endobj +510 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /GYDQSB+BoschOfficeSans-Italic +/FontDescriptor 1562 0 R +/FirstChar 2 +/LastChar 122 +/Widths 1542 0 R +/Encoding 1541 0 R +>> +endobj +619 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /BOOWFK+t1xtt +/FontDescriptor 1566 0 R +/FirstChar 34 +/LastChar 125 +/Widths 1536 0 R +>> +endobj +997 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /SGLLBS+t1xtt-Slant_167 +/FontDescriptor 1568 0 R +/FirstChar 44 +/LastChar 122 +/Widths 1533 0 R +>> +endobj +511 0 obj +<< +/Type /Font +/Subtype /Type1 +/BaseFont /WJPRUX+MarVoSym +/FontDescriptor 1564 0 R +/FirstChar 183 +/LastChar 183 +/Widths 1540 0 R +>> +endobj +230 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1569 0 R +/Kids [217 0 R 425 0 R 470 0 R 487 0 R 491 0 R 506 0 R] +>> +endobj +535 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1569 0 R +/Kids [527 0 R 571 0 R 594 0 R 603 0 R 614 0 R 625 0 R] +>> +endobj +636 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1569 0 R +/Kids [633 0 R 639 0 R 645 0 R 670 0 R 682 0 R 687 0 R] +>> +endobj +714 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1569 0 R +/Kids [704 0 R 731 0 R 758 0 R 788 0 R 816 0 R 839 0 R] +>> +endobj +878 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1569 0 R +/Kids [866 0 R 900 0 R 928 0 R 947 0 R 975 0 R 992 0 R] +>> +endobj +1025 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1569 0 R +/Kids [1021 0 R 1044 0 R 1061 0 R 1085 0 R 1109 0 R 1128 0 R] +>> +endobj +1153 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1570 0 R +/Kids [1149 0 R 1178 0 R 1232 0 R 1239 0 R 1267 0 R 1310 0 R] +>> +endobj +1326 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1570 0 R +/Kids [1320 0 R 1328 0 R 1336 0 R 1358 0 R 1374 0 R 1384 0 R] +>> +endobj +1411 0 obj +<< +/Type /Pages +/Count 6 +/Parent 1570 0 R +/Kids [1406 0 R 1422 0 R 1442 0 R 1462 0 R 1474 0 R 1488 0 R] +>> +endobj +1523 0 obj +<< +/Type /Pages +/Count 2 +/Parent 1570 0 R +/Kids [1516 0 R 1525 0 R] +>> +endobj +1569 0 obj +<< +/Type /Pages +/Count 36 +/Parent 1571 0 R +/Kids [230 0 R 535 0 R 636 0 R 714 0 R 878 0 R 1025 0 R] +>> +endobj +1570 0 obj +<< +/Type /Pages +/Count 20 +/Parent 1571 0 R +/Kids [1153 0 R 1326 0 R 1411 0 R 1523 0 R] +>> +endobj +1571 0 obj +<< +/Type /Pages +/Count 56 +/Kids [1569 0 R 1570 0 R] +>> +endobj +1572 0 obj +<< +/Type /Outlines +/First 6 0 R +/Last 154 0 R +/Count 5 +>> +endobj +214 0 obj +<< +/Title 215 0 R +/A 212 0 R +/Parent 206 0 R +/Prev 210 0 R +>> +endobj +210 0 obj +<< +/Title 211 0 R +/A 208 0 R +/Parent 206 0 R +/Next 214 0 R +>> +endobj +206 0 obj +<< +/Title 207 0 R +/A 204 0 R +/Parent 154 0 R +/Prev 194 0 R +/First 210 0 R +/Last 214 0 R +/Count -2 +>> +endobj +202 0 obj +<< +/Title 203 0 R +/A 200 0 R +/Parent 194 0 R +/Prev 198 0 R +>> +endobj +198 0 obj +<< +/Title 199 0 R +/A 196 0 R +/Parent 194 0 R +/Next 202 0 R +>> +endobj +194 0 obj +<< +/Title 195 0 R +/A 192 0 R +/Parent 154 0 R +/Prev 182 0 R +/Next 206 0 R +/First 198 0 R +/Last 202 0 R +/Count -2 +>> +endobj +190 0 obj +<< +/Title 191 0 R +/A 188 0 R +/Parent 182 0 R +/Prev 186 0 R +>> +endobj +186 0 obj +<< +/Title 187 0 R +/A 184 0 R +/Parent 182 0 R +/Next 190 0 R +>> +endobj +182 0 obj +<< +/Title 183 0 R +/A 180 0 R +/Parent 154 0 R +/Prev 170 0 R +/Next 194 0 R +/First 186 0 R +/Last 190 0 R +/Count -2 +>> +endobj +178 0 obj +<< +/Title 179 0 R +/A 176 0 R +/Parent 170 0 R +/Prev 174 0 R +>> +endobj +174 0 obj +<< +/Title 175 0 R +/A 172 0 R +/Parent 170 0 R +/Next 178 0 R +>> +endobj +170 0 obj +<< +/Title 171 0 R +/A 168 0 R +/Parent 154 0 R +/Prev 158 0 R +/Next 182 0 R +/First 174 0 R +/Last 178 0 R +/Count -2 +>> +endobj +166 0 obj +<< +/Title 167 0 R +/A 164 0 R +/Parent 158 0 R +/Prev 162 0 R +>> +endobj +162 0 obj +<< +/Title 163 0 R +/A 160 0 R +/Parent 158 0 R +/Next 166 0 R +>> +endobj +158 0 obj +<< +/Title 159 0 R +/A 156 0 R +/Parent 154 0 R +/Next 170 0 R +/First 162 0 R +/Last 166 0 R +/Count -2 +>> +endobj +154 0 obj +<< +/Title 155 0 R +/A 152 0 R +/Parent 1572 0 R +/Prev 130 0 R +/First 158 0 R +/Last 206 0 R +/Count -5 +>> +endobj +150 0 obj +<< +/Title 151 0 R +/A 148 0 R +/Parent 134 0 R +/Prev 146 0 R +>> +endobj +146 0 obj +<< +/Title 147 0 R +/A 144 0 R +/Parent 134 0 R +/Prev 142 0 R +/Next 150 0 R +>> +endobj +142 0 obj +<< +/Title 143 0 R +/A 140 0 R +/Parent 134 0 R +/Prev 138 0 R +/Next 146 0 R +>> +endobj +138 0 obj +<< +/Title 139 0 R +/A 136 0 R +/Parent 134 0 R +/Next 142 0 R +>> +endobj +134 0 obj +<< +/Title 135 0 R +/A 132 0 R +/Parent 130 0 R +/First 138 0 R +/Last 150 0 R +/Count -4 +>> +endobj +130 0 obj +<< +/Title 131 0 R +/A 128 0 R +/Parent 1572 0 R +/Prev 98 0 R +/Next 154 0 R +/First 134 0 R +/Last 134 0 R +/Count -1 +>> +endobj +126 0 obj +<< +/Title 127 0 R +/A 124 0 R +/Parent 110 0 R +/Prev 122 0 R +>> +endobj +122 0 obj +<< +/Title 123 0 R +/A 120 0 R +/Parent 110 0 R +/Prev 118 0 R +/Next 126 0 R +>> +endobj +118 0 obj +<< +/Title 119 0 R +/A 116 0 R +/Parent 110 0 R +/Prev 114 0 R +/Next 122 0 R +>> +endobj +114 0 obj +<< +/Title 115 0 R +/A 112 0 R +/Parent 110 0 R +/Next 118 0 R +>> +endobj +110 0 obj +<< +/Title 111 0 R +/A 108 0 R +/Parent 98 0 R +/Prev 106 0 R +/First 114 0 R +/Last 126 0 R +/Count -4 +>> +endobj +106 0 obj +<< +/Title 107 0 R +/A 104 0 R +/Parent 98 0 R +/Prev 102 0 R +/Next 110 0 R +>> +endobj +102 0 obj +<< +/Title 103 0 R +/A 100 0 R +/Parent 98 0 R +/Next 106 0 R +>> +endobj +98 0 obj +<< +/Title 99 0 R +/A 96 0 R +/Parent 1572 0 R +/Prev 54 0 R +/Next 130 0 R +/First 102 0 R +/Last 110 0 R +/Count -3 +>> +endobj +94 0 obj +<< +/Title 95 0 R +/A 92 0 R +/Parent 54 0 R +/Prev 90 0 R +>> +endobj +90 0 obj +<< +/Title 91 0 R +/A 88 0 R +/Parent 54 0 R +/Prev 86 0 R +/Next 94 0 R +>> +endobj +86 0 obj +<< +/Title 87 0 R +/A 84 0 R +/Parent 54 0 R +/Prev 82 0 R +/Next 90 0 R +>> +endobj +82 0 obj +<< +/Title 83 0 R +/A 80 0 R +/Parent 54 0 R +/Prev 78 0 R +/Next 86 0 R +>> +endobj +78 0 obj +<< +/Title 79 0 R +/A 76 0 R +/Parent 54 0 R +/Prev 74 0 R +/Next 82 0 R +>> +endobj +74 0 obj +<< +/Title 75 0 R +/A 72 0 R +/Parent 54 0 R +/Prev 70 0 R +/Next 78 0 R +>> +endobj +70 0 obj +<< +/Title 71 0 R +/A 68 0 R +/Parent 54 0 R +/Prev 66 0 R +/Next 74 0 R +>> +endobj +66 0 obj +<< +/Title 67 0 R +/A 64 0 R +/Parent 54 0 R +/Prev 62 0 R +/Next 70 0 R +>> +endobj +62 0 obj +<< +/Title 63 0 R +/A 60 0 R +/Parent 54 0 R +/Prev 58 0 R +/Next 66 0 R +>> +endobj +58 0 obj +<< +/Title 59 0 R +/A 56 0 R +/Parent 54 0 R +/Next 62 0 R +>> +endobj +54 0 obj +<< +/Title 55 0 R +/A 52 0 R +/Parent 1572 0 R +/Prev 6 0 R +/Next 98 0 R +/First 58 0 R +/Last 94 0 R +/Count -10 +>> +endobj +50 0 obj +<< +/Title 51 0 R +/A 48 0 R +/Parent 34 0 R +/Prev 46 0 R +>> +endobj +46 0 obj +<< +/Title 47 0 R +/A 44 0 R +/Parent 34 0 R +/Prev 42 0 R +/Next 50 0 R +>> +endobj +42 0 obj +<< +/Title 43 0 R +/A 40 0 R +/Parent 34 0 R +/Prev 38 0 R +/Next 46 0 R +>> +endobj +38 0 obj +<< +/Title 39 0 R +/A 36 0 R +/Parent 34 0 R +/Next 42 0 R +>> +endobj +34 0 obj +<< +/Title 35 0 R +/A 32 0 R +/Parent 6 0 R +/Prev 14 0 R +/First 38 0 R +/Last 50 0 R +/Count -4 +>> +endobj +30 0 obj +<< +/Title 31 0 R +/A 28 0 R +/Parent 14 0 R +/Prev 26 0 R +>> +endobj +26 0 obj +<< +/Title 27 0 R +/A 24 0 R +/Parent 14 0 R +/Prev 22 0 R +/Next 30 0 R +>> +endobj +22 0 obj +<< +/Title 23 0 R +/A 20 0 R +/Parent 14 0 R +/Prev 18 0 R +/Next 26 0 R +>> +endobj +18 0 obj +<< +/Title 19 0 R +/A 16 0 R +/Parent 14 0 R +/Next 22 0 R +>> +endobj +14 0 obj +<< +/Title 15 0 R +/A 12 0 R +/Parent 6 0 R +/Prev 10 0 R +/Next 34 0 R +/First 18 0 R +/Last 30 0 R +/Count -4 +>> +endobj +10 0 obj +<< +/Title 11 0 R +/A 8 0 R +/Parent 6 0 R +/Next 14 0 R +>> +endobj +6 0 obj +<< +/Title 7 0 R +/A 4 0 R +/Parent 1572 0 R +/Next 54 0 R +/First 10 0 R +/Last 34 0 R +/Count -3 +>> +endobj +1573 0 obj +<< +/Names [(Doc-Start) 227 0 R (Item.1) 620 0 R (Item.2) 621 0 R (Item.3) 649 0 R (Item.4) 650 0 R (Item.5) 651 0 R] +/Limits [(Doc-Start) (Item.5)] +>> +endobj +1574 0 obj +<< +/Names [(chapter*.1) 473 0 R (chapter.1) 5 0 R (chapter.2) 53 0 R (chapter.3) 97 0 R (chapter.4) 129 0 R (chapter.5) 153 0 R] +/Limits [(chapter*.1) (chapter.5)] +>> +endobj +1575 0 obj +<< +/Names [(ex_step_by_step) 617 0 R (ex_step_by_step_exConclusion) 692 0 R (ex_step_by_step_exDataRate) 652 0 R (ex_step_by_step_exExampleCode) 628 0 R (ex_step_by_step_exHelloIaq) 629 0 R (ex_step_by_step_exMod) 653 0 R] +/Limits [(ex_step_by_step) (ex_step_by_step_exMod)] +>> +endobj +1576 0 obj +<< +/Names [(ex_step_by_step_exPrereq) 618 0 R (ex_step_by_step_exSelfHeating) 685 0 R (ex_step_by_step_exSetup) 622 0 R (ex_step_by_step_exSimMultSensors) 690 0 R (ex_step_by_step_exqULP) 691 0 R (faq) 707 0 R] +/Limits [(ex_step_by_step_exPrereq) (faq)] +>> +endobj +1577 0 obj +<< +/Names [(faq_faqErrorSensorControl) 936 0 R (faq_faqErrorSet) 873 0 R (faq_faqErrorUpdateSubscription) 791 0 R (faq_faqError_BSEC_E_CONFIG_CRCMISMATCH) 905 0 R (faq_faqError_BSEC_E_CONFIG_EMPTY) 908 0 R (faq_faqError_BSEC_E_CONFIG_FEATUREMISMATCH) 877 0 R] +/Limits [(faq_faqErrorSensorControl) (faq_faqError_BSEC_E_CONFIG_FEATUREMISMATCH)] +>> +endobj +1578 0 obj +<< +/Names [(faq_faqError_BSEC_E_CONFIG_INSUFFICIENTBUFFER) 934 0 R (faq_faqError_BSEC_E_CONFIG_INSUFFICIENTWORKBUFFER) 910 0 R (faq_faqError_BSEC_E_CONFIG_INVALIDSTRINGSIZE) 931 0 R (faq_faqError_BSEC_E_CONFIG_VERSIONMISMATCH) 874 0 R (faq_faqError_BSEC_E_DOSTEPS_DUPLICATEINPUT) 737 0 R (faq_faqError_BSEC_E_DOSTEPS_INVALIDINPUT) 712 0 R] +/Limits [(faq_faqError_BSEC_E_CONFIG_INSUFFICIENTBUFFER) (faq_faqError_BSEC_E_DOSTEPS_INVALIDINPUT)] +>> +endobj +1579 0 obj +<< +/Names [(faq_faqError_BSEC_E_DOSTEPS_VALUELIMITS) 735 0 R (faq_faqError_BSEC_E_SU_DUPLICATEGATE) 796 0 R (faq_faqError_BSEC_E_SU_GATECOUNTEXCEEDSARRAY) 821 0 R (faq_faqError_BSEC_E_SU_HIGHHEATERONDURATION) 844 0 R (faq_faqError_BSEC_E_SU_INVALIDSAMPLERATE) 819 0 R (faq_faqError_BSEC_E_SU_MULTGASSAMPLINTVL) 842 0 R] +/Limits [(faq_faqError_BSEC_E_DOSTEPS_VALUELIMITS) (faq_faqError_BSEC_E_SU_MULTGASSAMPLINTVL)] +>> +endobj +1580 0 obj +<< +/Names [(faq_faqError_BSEC_E_SU_SAMPLERATELIMITS) 794 0 R (faq_faqError_BSEC_E_SU_SAMPLINTVLINTEGERMULT) 823 0 R (faq_faqError_BSEC_E_SU_WRONGDATARATE) 792 0 R (faq_faqError_BSEC_I_DOSTEPS_NOOUTPUTSRETURNABLE) 761 0 R (faq_faqError_BSEC_I_SU_SUBSCRIBEDOUTPUTGATES) 848 0 R (faq_faqError_BSEC_W_DOSTEPS_EXCESSOUTPUTS) 764 0 R] +/Limits [(faq_faqError_BSEC_E_SU_SAMPLERATELIMITS) (faq_faqError_BSEC_W_DOSTEPS_EXCESSOUTPUTS)] +>> +endobj +1581 0 obj +<< +/Names [(faq_faqError_BSEC_W_DOSTEPS_TSINTRADIFFOUTOFRANGE) 767 0 R (faq_faqError_BSEC_W_SC_CALL_TIMING_VIOLATION) 937 0 R (faq_faqError_BSEC_W_SC_MODEXCEEDULPTIMELIMIT) 950 0 R (faq_faqError_BSEC_W_SC_MODINSUFFICIENTWAITTIME) 939 0 R (faq_faqError_BSEC_W_SU_MODINNOULP) 871 0 R (faq_faqError_BSEC_W_SU_UNKNOWNOUTPUTGATE) 846 0 R] +/Limits [(faq_faqError_BSEC_W_DOSTEPS_TSINTRADIFFOUTOFRANGE) (faq_faqError_BSEC_W_SU_UNKNOWNOUTPUTGATE)] +>> +endobj +1582 0 obj +<< +/Names [(faq_faqErrors) 710 0 R (faq_faqErrorsDoSteps) 711 0 R (faq_faqNoOutput) 708 0 R (faq_faqOutputZero) 709 0 R (figure.1.1) 598 0 R (group__bsec__interface) 978 0 R] +/Limits [(faq_faqErrors) (group__bsec__interface)] +>> +endobj +1583 0 obj +<< +/Names [(group__bsec__interface_ga109bf6e051d8635725da5bedeecf9eb2) 1346 0 R (group__bsec__interface_ga157748484a31501acfeee3df656adf54) 630 0 R (group__bsec__interface_ga216b6f4807227a2c6a183aaa9a8b8d7c) 1182 0 R (group__bsec__interface_ga339df4596b1c0e02eede5d54aa0f2858) 642 0 R (group__bsec__interface_ga49210a8ceb36d8610075b9220a0cdec6) 601 0 R (group__bsec__interface_ga51bcd13812ea62b35749284385a72f98) 536 0 R] +/Limits [(group__bsec__interface_ga109bf6e051d8635725da5bedeecf9eb2) (group__bsec__interface_ga51bcd13812ea62b35749284385a72f98)] +>> +endobj +1584 0 obj +<< +/Names [(group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) 739 0 R (group__bsec__interface_ga6c18af8c9be0813f7d8e3547e58428db) 678 0 R (group__bsec__interface_ga70e68dbe60e2ba462537540d60192a2e) 882 0 R (group__bsec__interface_ga78ceba2853489683f274831b41460d3e) 1348 0 R (group__bsec__interface_ga7a53a20ee206f9b4c30c1d63395b3c49) 1371 0 R (group__bsec__interface_ga832388c889417ed197609d9965625bfe) 770 0 R] +/Limits [(group__bsec__interface_ga5e4d504611e1c4a0219861bbcf2ad650) (group__bsec__interface_ga832388c889417ed197609d9965625bfe)] +>> +endobj +1585 0 obj +<< +/Names [(group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) 674 0 R (group__bsec__interface_ga853243e7f08cc25be117fca5c8216d99) 1049 0 R (group__bsec__interface_ga8798390d842b820e79e9cbf8ba4d516e) 916 0 R (group__bsec__interface_ga8967694b8e412412977488e3e6fdb3ed) 1362 0 R (group__bsec__interface_ga91d06ad8cd57ceae529b66dd30ca4d8c) 715 0 R (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8) 516 0 R] +/Limits [(group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) (group__bsec__interface_ga9de59ebc6a2504f15ba51d6d983faae8)] +>> +endobj +1586 0 obj +<< +/Names [(group__bsec__interface_ga9e190b85f103d75ede9477227567e799) 1364 0 R (group__bsec__interface_gaa8bb29e07b5b96d6f576962aef094466) 1369 0 R (group__bsec__interface_gab2122fa3909f67a2c786ecd2d8993977) 1068 0 R (group__bsec__interface_gac182d75bb2ca95c32ba4b98a136ad081) 1381 0 R (group__bsec__interface_gac4726411862aa2d383e3d3b9ca279a5d) 518 0 R (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f) 517 0 R] +/Limits [(group__bsec__interface_ga9e190b85f103d75ede9477227567e799) (group__bsec__interface_gac79a471c6e20fd8c17577f6f69a9469f)] +>> +endobj +1587 0 obj +<< +/Names [(group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) 654 0 R (group__bsec__interface_gad8f5b300b8cf00c73d837660a05e0507) 1367 0 R (group__bsec__interface_gae89eedb131288b72c267c02ec9dea8e5) 1089 0 R (group__bsec__interface_gae8fc6d614d6a40f0088262dccbb960dc) 883 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a06af666972edcebef3302d015f1d56c5) 675 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a0a7f6e18d053c4af5f26f3852ef6ae14) 771 0 R] +/Limits [(group__bsec__interface_gacf6a5816306dfc1e3c0b26a6d459fc71) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a0a7f6e18d053c4af5f26f3852ef6ae14)] +>> +endobj +1588 0 obj +<< +/Names [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a178d85d77cf448057897e9b0e0932e33) 800 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a17bf2f98e8c59e29a8eda42c692e5b3d) 716 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a1ba36727b09433f1ae925646864d8a61) 826 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a2175fa185bbcaafb28b5c73ca8ff2394) 825 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a360b54bd3d53b377010d3afa29e04b89) 1243 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a3975b1dfa3c35829ce97814e04c143ce) 941 0 R] +/Limits [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a178d85d77cf448057897e9b0e0932e33) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a3975b1dfa3c35829ce97814e04c143ce)] +>> +endobj +1589 0 obj +<< +/Names [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a465d9fc420b12cfe3d24e937c5e5f110) 798 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a5946f4a20c9ba0cd83fed96ce3103c06) 742 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a5fa05dbfcae3caa309d9f62422eb61f3) 1242 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a6d707845ea3200a1a45726c2700333e5) 772 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a76ee5462e14060fcc889bd889b6f7b3c) 914 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a7f2cea23dbdaeddb2d91d861c608f239) 879 0 R] +/Limits [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a465d9fc420b12cfe3d24e937c5e5f110) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a7f2cea23dbdaeddb2d91d861c608f239)] +>> +endobj +1590 0 obj +<< +/Names [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a81fd5b4436be253e0ef3ebdf51b3d193) 740 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a87428d7a4a5d52e48af8db92ab71c83e) 880 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a89e2eec8486c2880912af108bbed3593) 913 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a8d7a8938ef9616b935094ed223122914) 1244 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a978a12de4397b9c0814e07650f8a1b46) 1245 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa1a59666f0af5463087f528473d4ff8c) 827 0 R] +/Limits [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858a81fd5b4436be253e0ef3ebdf51b3d193) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa1a59666f0af5463087f528473d4ff8c)] +>> +endobj +1591 0 obj +<< +/Names [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa238cfe9b905deda6f1823ca32378f91) 944 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa5de81322b446f028934aa30c4826610) 799 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab5356ac211454109eac007fcc458a6dd) 915 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab78d6a66fc7a4205a6caf69ce4f161e4) 849 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab810ba8e0fc4425c37aa460e57dc8129) 850 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab87b5a5abeadc975488850bece3dbf84) 769 0 R] +/Limits [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa238cfe9b905deda6f1823ca32378f91) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ab87b5a5abeadc975488850bece3dbf84)] +>> +endobj +1592 0 obj +<< +/Names [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac2600415df086d1a9b36105ac29396de) 881 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac2eca8b900ce91ee50004c549a409024) 942 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac5899ebab7738c4c99b19ad9d934f8d1) 851 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ada34397de8a8e88ad72e8546748866cd) 943 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ae5d8b5de70152c09b4153bcb41997ee7) 912 0 R (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ae8e920ecde96d7d79b8962da38233880) 952 0 R] +/Limits [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ac2600415df086d1a9b36105ac29396de) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858ae8e920ecde96d7d79b8962da38233880)] +>> +endobj +1593 0 obj +<< +/Names [(group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a161b8c7ebab8fcea5590d37295d31b35) 1315 0 R (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a381b968290256e77d50c4f7e92bfb27c) 1030 0 R (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a3eb936f08a8f6f01d4c683a6ba0c9d3a) 741 0 R (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a9202c1504b464b16f432da6a4dd582a2) 1272 0 R (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650aaf8083737123a5c4d012783ee10a522d) 1313 0 R (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650ad30626f0de1be98802cb5e50c8b67207) 1027 0 R] +/Limits [(group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650a161b8c7ebab8fcea5590d37295d31b35) (group__bsec__interface_gga5e4d504611e1c4a0219861bbcf2ad650ad30626f0de1be98802cb5e50c8b67207)] +>> +endobj +1594 0 obj +<< +/Names [(group__bsec__interface_gga832388c889417ed197609d9965625bfea134c7c7f7bd544e304209368ec72467a) 1324 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea1369c4abd0a13602b197dfc94ae6ff7d) 1325 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea1aac5358fbe12702647de81cacd6d062) 590 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea1c0eee38a61b05c5239c871f9cdc85a4) 588 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea2368e219ebbce4e1ede7209486283a6e) 586 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9) 587 0 R] +/Limits [(group__bsec__interface_gga832388c889417ed197609d9965625bfea134c7c7f7bd544e304209368ec72467a) (group__bsec__interface_gga832388c889417ed197609d9965625bfea4e05ab48912e70486351f5199910fcb9)] +>> +endobj +1595 0 obj +<< +/Names [(group__bsec__interface_gga832388c889417ed197609d9965625bfea5f42ad42c6bb71627b5ce91d4c410985) 582 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea64d14f069c838de2d2c1f3f436ef6108) 585 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea684dc07fef8c1723e60211068365b30a) 1323 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea78b917ecbffc8eac6875644c4136a26d) 1342 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea792b0fbeffceea19513cc0bd31ce7ef7) 583 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfea9fe6dbe27991e3f9f1a444c40b30af3d) 589 0 R] +/Limits [(group__bsec__interface_gga832388c889417ed197609d9965625bfea5f42ad42c6bb71627b5ce91d4c410985) (group__bsec__interface_gga832388c889417ed197609d9965625bfea9fe6dbe27991e3f9f1a444c40b30af3d)] +>> +endobj +1596 0 obj +<< +/Names [(group__bsec__interface_gga832388c889417ed197609d9965625bfeab9d6e7e5bb1c5f99d339a649d588b3cc) 584 0 R (group__bsec__interface_gga832388c889417ed197609d9965625bfeaf2cfe69583f70b1196660122ab5a94b6) 1341 0 R (index) 494 0 R (index_intguideBSECConfiguration) 515 0 R (index_intguideBSECSolutions) 512 0 R (index_intguideLibrary) 500 0 R] +/Limits [(group__bsec__interface_gga832388c889417ed197609d9965625bfeab9d6e7e5bb1c5f99d339a649d588b3cc) (index_intguideLibrary)] +>> +endobj +1597 0 obj +<< +/Names [(index_intguideLibraryOutputs) 575 0 R (index_intguideOverviewSensors) 495 0 R (index_intguideQuickintroCodeBuild) 606 0 R (index_intguideRequirements) 579 0 R (index_intguideRequirementsFramework) 581 0 R (index_intguideRequirementsHardware) 580 0 R] +/Limits [(index_intguideLibraryOutputs) (index_intguideRequirementsHardware)] +>> +endobj +1598 0 obj +<< +/Names [(index_intguideRequirementsInputs) 599 0 R (index_intguideSolutionKeyfeature) 533 0 R (page.1) 225 0 R (page.10) 605 0 R (page.11) 616 0 R (page.12) 627 0 R] +/Limits [(index_intguideRequirementsInputs) (page.12)] +>> +endobj +1599 0 obj +<< +/Names [(page.13) 635 0 R (page.14) 641 0 R (page.15) 647 0 R (page.16) 672 0 R (page.17) 684 0 R (page.18) 689 0 R] +/Limits [(page.13) (page.18)] +>> +endobj +1600 0 obj +<< +/Names [(page.19) 706 0 R (page.2) 427 0 R (page.20) 733 0 R (page.21) 760 0 R (page.22) 790 0 R (page.23) 818 0 R] +/Limits [(page.19) (page.23)] +>> +endobj +1601 0 obj +<< +/Names [(page.24) 841 0 R (page.25) 868 0 R (page.26) 902 0 R (page.27) 930 0 R (page.28) 949 0 R (page.29) 977 0 R] +/Limits [(page.24) (page.29)] +>> +endobj +1602 0 obj +<< +/Names [(page.3) 472 0 R (page.30) 994 0 R (page.31) 1023 0 R (page.32) 1046 0 R (page.33) 1063 0 R (page.34) 1087 0 R] +/Limits [(page.3) (page.34)] +>> +endobj +1603 0 obj +<< +/Names [(page.35) 1111 0 R (page.36) 1130 0 R (page.37) 1151 0 R (page.38) 1180 0 R (page.39) 1234 0 R (page.4) 489 0 R] +/Limits [(page.35) (page.4)] +>> +endobj +1604 0 obj +<< +/Names [(page.40) 1241 0 R (page.41) 1269 0 R (page.42) 1312 0 R (page.43) 1322 0 R (page.44) 1330 0 R (page.45) 1338 0 R] +/Limits [(page.40) (page.45)] +>> +endobj +1605 0 obj +<< +/Names [(page.46) 1360 0 R (page.47) 1376 0 R (page.48) 1386 0 R (page.49) 1408 0 R (page.5) 493 0 R (page.50) 1424 0 R] +/Limits [(page.46) (page.50)] +>> +endobj +1606 0 obj +<< +/Names [(page.51) 1444 0 R (page.52) 1464 0 R (page.53) 1476 0 R (page.54) 1490 0 R (page.55) 1518 0 R (page.56) 1527 0 R] +/Limits [(page.51) (page.56)] +>> +endobj +1607 0 obj +<< +/Names [(page.6) 508 0 R (page.7) 529 0 R (page.8) 573 0 R (page.9) 596 0 R (section*.10) 984 0 R (section*.11) 1409 0 R] +/Limits [(page.6) (section*.11)] +>> +endobj +1608 0 obj +<< +/Names [(section*.12) 1447 0 R (section*.13) 1468 0 R (section*.14) 1495 0 R (section*.15) 1522 0 R (section*.2) 496 0 R (section*.3) 497 0 R] +/Limits [(section*.12) (section*.3)] +>> +endobj +1609 0 obj +<< +/Names [(section*.4) 498 0 R (section*.5) 499 0 R (section*.6) 509 0 R (section*.7) 534 0 R (section*.8) 574 0 R (section*.9) 979 0 R] +/Limits [(section*.4) (section*.9)] +>> +endobj +1610 0 obj +<< +/Names [(section.1.1) 9 0 R (section.1.2) 13 0 R (section.1.3) 33 0 R (section.2.1) 57 0 R (section.2.10) 93 0 R (section.2.2) 61 0 R] +/Limits [(section.1.1) (section.2.2)] +>> +endobj +1611 0 obj +<< +/Names [(section.2.3) 65 0 R (section.2.4) 69 0 R (section.2.5) 73 0 R (section.2.6) 77 0 R (section.2.7) 81 0 R (section.2.8) 85 0 R] +/Limits [(section.2.3) (section.2.8)] +>> +endobj +1612 0 obj +<< +/Names [(section.2.9) 89 0 R (section.3.1) 101 0 R (section.3.2) 105 0 R (section.3.3) 109 0 R (section.4.1) 133 0 R (section.5.1) 157 0 R] +/Limits [(section.2.9) (section.5.1)] +>> +endobj +1613 0 obj +<< +/Names [(section.5.2) 169 0 R (section.5.3) 181 0 R (section.5.4) 193 0 R (section.5.5) 205 0 R (structbsec__bme__settings__t) 1116 0 R (structbsec__bme__settings__t_a300b00f9580b9af76d441cd4db8d7083) 1117 0 R] +/Limits [(section.5.2) (structbsec__bme__settings__t_a300b00f9580b9af76d441cd4db8d7083)] +>> +endobj +1614 0 obj +<< +/Names [(structbsec__bme__settings__t_a4407b04a0d403a9fb35fd322999113a9) 1415 0 R (structbsec__bme__settings__t_a500cfa825fa7c6ead38eba7bf7b4b955) 1413 0 R (structbsec__bme__settings__t_a7984769929826a36f59e7b9dfd6e7447) 1418 0 R (structbsec__bme__settings__t_aa197109b334a2a443d9349812865bff1) 1412 0 R (structbsec__bme__settings__t_aa4a1eeae4e7fe44a8093a3862996fbac) 1419 0 R (structbsec__bme__settings__t_aecd99f57df2bc07663a7de83f877228e) 1416 0 R] +/Limits [(structbsec__bme__settings__t_a4407b04a0d403a9fb35fd322999113a9) (structbsec__bme__settings__t_aecd99f57df2bc07663a7de83f877228e)] +>> +endobj +1615 0 obj +<< +/Names [(structbsec__bme__settings__t_aed0450820cd910e06e26fba04256bc24) 1417 0 R (structbsec__bme__settings__t_afc3ab51b88f259e5cb76c10ee0732e5b) 1414 0 R (structbsec__input__t) 999 0 R (structbsec__input__t_a000803d39a2be521f2b5e7017c31303b) 1028 0 R (structbsec__input__t_a90d515d57b274dfde74a281de469a3ad) 1029 0 R (structbsec__input__t_a916867811b65988853b69f729b91c262) 1026 0 R] +/Limits [(structbsec__bme__settings__t_aed0450820cd910e06e26fba04256bc24) (structbsec__input__t_a916867811b65988853b69f729b91c262)] +>> +endobj +1616 0 obj +<< +/Names [(structbsec__input__t_ab535651a26b2e2c44c83e441385e3def) 1449 0 R (structbsec__output__t) 1000 0 R (structbsec__output__t_a1a046572bcb85189df10c9ac8f362999) 1470 0 R (structbsec__output__t_a74a917725569b67eb14e78a34fa9c55d) 1469 0 R (structbsec__output__t_a91006cd8f20e88a5ff2b6ebfbecdeb95) 1471 0 R (structbsec__output__t_ab188da3e58d458f4b94a64379404da46) 1318 0 R] +/Limits [(structbsec__input__t_ab535651a26b2e2c44c83e441385e3def) (structbsec__output__t_ab188da3e58d458f4b94a64379404da46)] +>> +endobj +1617 0 obj +<< +/Names [(structbsec__output__t_ac4e7ef20f713075472bc953efb13957f) 591 0 R (structbsec__sensor__configuration__t) 673 0 R (structbsec__sensor__configuration__t_a150ba3a737fb75f56052c60d55246ae4) 677 0 R (structbsec__sensor__configuration__t_a92665e4f2f3cd5237814488774c0f546) 676 0 R (structbsec__version__t) 1069 0 R (structbsec__version__t_a3d9b11a72027026f492a438342a2efbd) 1095 0 R] +/Limits [(structbsec__output__t_ac4e7ef20f713075472bc953efb13957f) (structbsec__version__t_a3d9b11a72027026f492a438342a2efbd)] +>> +endobj +1618 0 obj +<< +/Names [(structbsec__version__t_a5daac4534748c6f0be9f009273613b02) 1096 0 R (structbsec__version__t_a9d47d254d17740222791fa0f53c7ac52) 1094 0 R (structbsec__version__t_af823001b85e62b90279f9e6f3c478c23) 1093 0 R (subsection.1.2.1) 17 0 R (subsection.1.2.2) 21 0 R (subsection.1.2.3) 25 0 R] +/Limits [(structbsec__version__t_a5daac4534748c6f0be9f009273613b02) (subsection.1.2.3)] +>> +endobj +1619 0 obj +<< +/Names [(subsection.1.2.4) 29 0 R (subsection.1.3.1) 37 0 R (subsection.1.3.2) 41 0 R (subsection.1.3.3) 45 0 R (subsection.1.3.4) 49 0 R (subsection.3.3.1) 113 0 R] +/Limits [(subsection.1.2.4) (subsection.3.3.1)] +>> +endobj +1620 0 obj +<< +/Names [(subsection.3.3.2) 117 0 R (subsection.3.3.3) 121 0 R (subsection.3.3.4) 125 0 R (subsection.4.1.1) 137 0 R (subsection.4.1.2) 141 0 R (subsection.4.1.3) 145 0 R] +/Limits [(subsection.3.3.2) (subsection.4.1.3)] +>> +endobj +1621 0 obj +<< +/Names [(subsection.4.1.4) 149 0 R (subsection.5.1.1) 161 0 R (subsection.5.1.2) 165 0 R (subsection.5.2.1) 173 0 R (subsection.5.2.2) 177 0 R (subsection.5.3.1) 185 0 R] +/Limits [(subsection.4.1.4) (subsection.5.3.1)] +>> +endobj +1622 0 obj +<< +/Names [(subsection.5.3.2) 189 0 R (subsection.5.4.1) 197 0 R (subsection.5.4.2) 201 0 R (subsection.5.5.1) 209 0 R (subsection.5.5.2) 213 0 R (subsubsection.3.3.1.1) 713 0 R] +/Limits [(subsection.5.3.2) (subsubsection.3.3.1.1)] +>> +endobj +1623 0 obj +<< +/Names [(subsubsection.3.3.1.2) 736 0 R (subsubsection.3.3.1.3) 738 0 R (subsubsection.3.3.1.4) 762 0 R (subsubsection.3.3.1.5) 765 0 R (subsubsection.3.3.1.6) 768 0 R (subsubsection.3.3.2.1) 793 0 R] +/Limits [(subsubsection.3.3.1.2) (subsubsection.3.3.2.1)] +>> +endobj +1624 0 obj +<< +/Names [(subsubsection.3.3.2.10) 869 0 R (subsubsection.3.3.2.11) 872 0 R (subsubsection.3.3.2.2) 795 0 R (subsubsection.3.3.2.3) 797 0 R (subsubsection.3.3.2.4) 820 0 R (subsubsection.3.3.2.5) 822 0 R] +/Limits [(subsubsection.3.3.2.10) (subsubsection.3.3.2.5)] +>> +endobj +1625 0 obj +<< +/Names [(subsubsection.3.3.2.6) 824 0 R (subsubsection.3.3.2.7) 843 0 R (subsubsection.3.3.2.8) 845 0 R (subsubsection.3.3.2.9) 847 0 R (subsubsection.3.3.3.1) 875 0 R (subsubsection.3.3.3.2) 903 0 R] +/Limits [(subsubsection.3.3.2.6) (subsubsection.3.3.3.2)] +>> +endobj +1626 0 obj +<< +/Names [(subsubsection.3.3.3.3) 906 0 R (subsubsection.3.3.3.4) 909 0 R (subsubsection.3.3.3.5) 911 0 R (subsubsection.3.3.3.6) 932 0 R (subsubsection.3.3.3.7) 935 0 R (subsubsection.3.3.4.1) 938 0 R] +/Limits [(subsubsection.3.3.3.3) (subsubsection.3.3.4.1)] +>> +endobj +1627 0 obj +<< +/Names [(subsubsection.3.3.4.2) 940 0 R (subsubsection.3.3.4.3) 951 0 R (subsubsection.4.1.2.1) 995 0 R (subsubsection.4.1.2.10) 1152 0 R (subsubsection.4.1.2.2) 1024 0 R (subsubsection.4.1.2.3) 1048 0 R] +/Limits [(subsubsection.3.3.4.2) (subsubsection.4.1.2.3)] +>> +endobj +1628 0 obj +<< +/Names [(subsubsection.4.1.2.4) 1066 0 R (subsubsection.4.1.2.5) 1088 0 R (subsubsection.4.1.2.6) 1090 0 R (subsubsection.4.1.2.7) 1092 0 R (subsubsection.4.1.2.8) 1114 0 R (subsubsection.4.1.2.9) 1131 0 R] +/Limits [(subsubsection.4.1.2.4) (subsubsection.4.1.2.9)] +>> +endobj +1629 0 obj +<< +/Names [(subsubsection.4.1.3.1) 1235 0 R (subsubsection.4.1.3.2) 1270 0 R (subsubsection.4.1.3.3) 1316 0 R (subsubsection.4.1.4.1) 1343 0 R (subsubsection.4.1.4.10) 1372 0 R (subsubsection.4.1.4.11) 1377 0 R] +/Limits [(subsubsection.4.1.3.1) (subsubsection.4.1.4.11)] +>> +endobj +1630 0 obj +<< +/Names [(subsubsection.4.1.4.12) 1378 0 R (subsubsection.4.1.4.13) 1379 0 R (subsubsection.4.1.4.14) 1380 0 R (subsubsection.4.1.4.15) 1382 0 R (subsubsection.4.1.4.2) 1344 0 R (subsubsection.4.1.4.3) 1345 0 R] +/Limits [(subsubsection.4.1.4.12) (subsubsection.4.1.4.3)] +>> +endobj +1631 0 obj +<< +/Names [(subsubsection.4.1.4.4) 1347 0 R (subsubsection.4.1.4.5) 1361 0 R (subsubsection.4.1.4.6) 1363 0 R (subsubsection.4.1.4.7) 1365 0 R (subsubsection.4.1.4.8) 1368 0 R (subsubsection.4.1.4.9) 1370 0 R] +/Limits [(subsubsection.4.1.4.4) (subsubsection.4.1.4.9)] +>> +endobj +1632 0 obj +<< +/Names [(subsubsection.5.1.2.1) 1425 0 R (subsubsection.5.1.2.2) 1426 0 R (subsubsection.5.1.2.3) 1427 0 R (subsubsection.5.1.2.4) 1428 0 R (subsubsection.5.1.2.5) 1429 0 R (subsubsection.5.1.2.6) 1430 0 R] +/Limits [(subsubsection.5.1.2.1) (subsubsection.5.1.2.6)] +>> +endobj +1633 0 obj +<< +/Names [(subsubsection.5.1.2.7) 1431 0 R (subsubsection.5.1.2.8) 1445 0 R (subsubsection.5.1.2.9) 1446 0 R (subsubsection.5.2.2.1) 1448 0 R (subsubsection.5.2.2.2) 1465 0 R (subsubsection.5.2.2.3) 1466 0 R] +/Limits [(subsubsection.5.1.2.7) (subsubsection.5.2.2.3)] +>> +endobj +1634 0 obj +<< +/Names [(subsubsection.5.2.2.4) 1467 0 R (subsubsection.5.3.2.1) 1477 0 R (subsubsection.5.3.2.2) 1491 0 R (subsubsection.5.3.2.3) 1492 0 R (subsubsection.5.3.2.4) 1493 0 R (subsubsection.5.3.2.5) 1494 0 R] +/Limits [(subsubsection.5.2.2.4) (subsubsection.5.3.2.5)] +>> +endobj +1635 0 obj +<< +/Names [(subsubsection.5.4.2.1) 1519 0 R (subsubsection.5.4.2.2) 1520 0 R (subsubsection.5.5.2.1) 1528 0 R (subsubsection.5.5.2.2) 1529 0 R (subsubsection.5.5.2.3) 1530 0 R (subsubsection.5.5.2.4) 1531 0 R] +/Limits [(subsubsection.5.4.2.1) (subsubsection.5.5.2.4)] +>> +endobj +1636 0 obj +<< +/Names [(table.1.1) 513 0 R (table.1.2) 530 0 R (table.1.3) 576 0 R (table.1.4) 607 0 R (table.4.1) 980 0 R (table.4.10) 1113 0 R] +/Limits [(table.1.1) (table.4.10)] +>> +endobj +1637 0 obj +<< +/Names [(table.4.11) 1115 0 R (table.4.12) 1132 0 R (table.4.13) 1181 0 R (table.4.14) 1236 0 R (table.4.15) 1271 0 R (table.4.16) 1317 0 R] +/Limits [(table.4.11) (table.4.16)] +>> +endobj +1638 0 obj +<< +/Names [(table.4.2) 981 0 R (table.4.3) 982 0 R (table.4.4) 983 0 R (table.4.5) 998 0 R (table.4.6) 1047 0 R (table.4.7) 1065 0 R] +/Limits [(table.4.2) (table.4.7)] +>> +endobj +1639 0 obj +<< +/Names [(table.4.8) 1067 0 R (table.4.9) 1091 0 R (table.5.1) 1478 0 R (table.5.2) 1479 0 R (table.5.3) 1480 0 R (table.5.4) 1521 0 R] +/Limits [(table.4.8) (table.5.4)] +>> +endobj +1640 0 obj +<< +/Kids [1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R] +/Limits [(Doc-Start) (faq_faqError_BSEC_E_DOSTEPS_INVALIDINPUT)] +>> +endobj +1641 0 obj +<< +/Kids [1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R] +/Limits [(faq_faqError_BSEC_E_DOSTEPS_VALUELIMITS) (group__bsec__interface_ga832388c889417ed197609d9965625bfe)] +>> +endobj +1642 0 obj +<< +/Kids [1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R] +/Limits [(group__bsec__interface_ga847070d3ecfa970cb2f716a2d11fe219) (group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa1a59666f0af5463087f528473d4ff8c)] +>> +endobj +1643 0 obj +<< +/Kids [1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R] +/Limits [(group__bsec__interface_gga339df4596b1c0e02eede5d54aa0f2858aa238cfe9b905deda6f1823ca32378f91) (index_intguideLibrary)] +>> +endobj +1644 0 obj +<< +/Kids [1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R] +/Limits [(index_intguideLibraryOutputs) (page.34)] +>> +endobj +1645 0 obj +<< +/Kids [1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R] +/Limits [(page.35) (section*.3)] +>> +endobj +1646 0 obj +<< +/Kids [1609 0 R 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R] +/Limits [(section*.4) (structbsec__bme__settings__t_aecd99f57df2bc07663a7de83f877228e)] +>> +endobj +1647 0 obj +<< +/Kids [1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R] +/Limits [(structbsec__bme__settings__t_aed0450820cd910e06e26fba04256bc24) (subsection.4.1.3)] +>> +endobj +1648 0 obj +<< +/Kids [1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R] +/Limits [(subsection.4.1.4) (subsubsection.3.3.4.1)] +>> +endobj +1649 0 obj +<< +/Kids [1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R] +/Limits [(subsubsection.3.3.4.2) (subsubsection.5.1.2.6)] +>> +endobj +1650 0 obj +<< +/Kids [1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R] +/Limits [(subsubsection.5.1.2.7) (table.4.7)] +>> +endobj +1651 0 obj +<< +/Kids [1639 0 R] +/Limits [(table.4.8) (table.5.4)] +>> +endobj +1652 0 obj +<< +/Kids [1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R] +/Limits [(Doc-Start) (section*.3)] +>> +endobj +1653 0 obj +<< +/Kids [1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R] +/Limits [(section*.4) (table.5.4)] +>> +endobj +1654 0 obj +<< +/Kids [1652 0 R 1653 0 R] +/Limits [(Doc-Start) (table.5.4)] +>> +endobj +1655 0 obj +<< +/Dests 1654 0 R +>> +endobj +1656 0 obj +<< +/Type /Catalog +/Pages 1571 0 R +/Outlines 1572 0 R +/Names 1655 0 R +/PageMode/UseOutlines +/OpenAction 216 0 R +>> +endobj +1657 0 obj +<< +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() +/CreationDate (D:20190628134145+08'00') +/ModDate (D:20190628134145+08'00') +/Trapped /False +/PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.6362 (1.40.18)) +>> +endobj +xref +0 1658 +0000000519 65535 f +0000840812 00000 n +0000840832 00000 n +0000840852 00000 n +0000000015 00000 n +0000547474 00000 n +0001229897 00000 n +0000000060 00000 n +0000000222 00000 n +0000547655 00000 n +0001229825 00000 n +0000000269 00000 n +0000000458 00000 n +0000552570 00000 n +0001229702 00000 n +0000000506 00000 n +0000000730 00000 n +0000552751 00000 n +0001229628 00000 n +0000000783 00000 n +0000000926 00000 n +0000552934 00000 n +0001229541 00000 n +0000000979 00000 n +0000001147 00000 n +0000556966 00000 n +0001229454 00000 n +0000001200 00000 n +0000001290 00000 n +0000564100 00000 n +0001229380 00000 n +0000001343 00000 n +0000001577 00000 n +0000564283 00000 n +0001229270 00000 n +0000001625 00000 n +0000001798 00000 n +0000564404 00000 n +0001229196 00000 n +0000001851 00000 n +0000001918 00000 n +0000602032 00000 n +0001229109 00000 n +0000001971 00000 n +0000002091 00000 n +0000604706 00000 n +0001229022 00000 n +0000002144 00000 n +0000002325 00000 n +0000604828 00000 n +0001228948 00000 n +0000002378 00000 n +0000002501 00000 n +0000609616 00000 n +0001228822 00000 n +0000002547 00000 n +0000002705 00000 n +0000609799 00000 n +0001228748 00000 n +0000002753 00000 n +0000002845 00000 n +0000610043 00000 n +0001228661 00000 n +0000002893 00000 n +0000003031 00000 n +0000614559 00000 n +0001228574 00000 n +0000003079 00000 n +0000003192 00000 n +0000618304 00000 n +0001228487 00000 n +0000003240 00000 n +0000003416 00000 n +0000626182 00000 n +0001228400 00000 n +0000003464 00000 n +0000003627 00000 n +0000632926 00000 n +0001228313 00000 n +0000003675 00000 n +0000003788 00000 n +0000637047 00000 n +0001228226 00000 n +0000003836 00000 n +0000004147 00000 n +0000640369 00000 n +0001228139 00000 n +0000004195 00000 n +0000004500 00000 n +0000640489 00000 n +0001228052 00000 n +0000004548 00000 n +0000004763 00000 n +0000640610 00000 n +0001227978 00000 n +0000004812 00000 n +0000004889 00000 n +0000645524 00000 n +0001227849 00000 n +0000004935 00000 n +0000004977 00000 n +0000645706 00000 n +0001227771 00000 n +0000005026 00000 n +0000005225 00000 n +0000645828 00000 n +0001227679 00000 n +0000005274 00000 n +0000005566 00000 n +0000645950 00000 n +0001227562 00000 n +0000005615 00000 n +0000005830 00000 n +0000646073 00000 n +0001227483 00000 n +0000005884 00000 n +0000006103 00000 n +0000664192 00000 n +0001227390 00000 n +0000006157 00000 n +0000006431 00000 n +0000682056 00000 n +0001227297 00000 n +0000006485 00000 n +0000006862 00000 n +0000694561 00000 n +0001227218 00000 n +0000006916 00000 n +0000007165 00000 n +0000701856 00000 n +0001227086 00000 n +0000007212 00000 n +0000007343 00000 n +0000701978 00000 n +0001226982 00000 n +0000007392 00000 n +0000007506 00000 n +0000702039 00000 n +0001226903 00000 n +0000007560 00000 n +0000007666 00000 n +0000707601 00000 n +0001226810 00000 n +0000007720 00000 n +0000007846 00000 n +0000766265 00000 n +0001226717 00000 n +0000007900 00000 n +0000007988 00000 n +0000795693 00000 n +0001226638 00000 n +0000008042 00000 n +0000008105 00000 n +0000810346 00000 n +0001226519 00000 n +0000008152 00000 n +0000008326 00000 n +0000810471 00000 n +0001226401 00000 n +0000008375 00000 n +0000008598 00000 n +0000810596 00000 n +0001226322 00000 n +0000008652 00000 n +0000008783 00000 n +0000812920 00000 n +0001226243 00000 n +0000008837 00000 n +0000008963 00000 n +0000818632 00000 n +0001226111 00000 n +0000009012 00000 n +0000009197 00000 n +0000818757 00000 n +0001226032 00000 n +0000009251 00000 n +0000009382 00000 n +0000818819 00000 n +0001225953 00000 n +0000009436 00000 n +0000009562 00000 n +0000823380 00000 n +0001225821 00000 n +0000009611 00000 n +0000009801 00000 n +0000828199 00000 n +0001225742 00000 n +0000009855 00000 n +0000009986 00000 n +0000828261 00000 n +0001225663 00000 n +0000010040 00000 n +0000010166 00000 n +0000832790 00000 n +0001225531 00000 n +0000010215 00000 n +0000010478 00000 n +0000832915 00000 n +0001225452 00000 n +0000010532 00000 n +0000010663 00000 n +0000837684 00000 n +0001225373 00000 n +0000010717 00000 n +0000010843 00000 n +0000838123 00000 n +0001225255 00000 n +0000010892 00000 n +0000011087 00000 n +0000838248 00000 n +0001225176 00000 n +0000011141 00000 n +0000011272 00000 n +0000839998 00000 n +0001225097 00000 n +0000011326 00000 n +0000011452 00000 n +0000012595 00000 n +0000093858 00000 n +0000530398 00000 n +0000012730 00000 n +0000032812 00000 n +0000081329 00000 n +0000530592 00000 n +0000011502 00000 n +0000530469 00000 n +0000032736 00000 n +0000530531 00000 n +0001222552 00000 n +0001222730 00000 n +0001223540 00000 n +0000014448 00000 n +0000014578 00000 n +0000014802 00000 n +0000015026 00000 n +0000015250 00000 n +0000015474 00000 n +0000015698 00000 n +0000015922 00000 n +0000016146 00000 n +0000016369 00000 n +0000016593 00000 n +0000016817 00000 n +0000017041 00000 n +0000017265 00000 n +0000017489 00000 n +0000017713 00000 n +0000017937 00000 n +0000018161 00000 n +0000018385 00000 n +0000018609 00000 n +0000018629 00000 n +0000018719 00000 n +0000018739 00000 n +0000018829 00000 n +0000018849 00000 n +0000018939 00000 n +0000018959 00000 n +0000019049 00000 n +0000019069 00000 n +0000019159 00000 n +0000019179 00000 n +0000019269 00000 n +0000019289 00000 n +0000019379 00000 n +0000019399 00000 n +0000019489 00000 n +0000019509 00000 n +0000019599 00000 n +0000019619 00000 n +0000019709 00000 n +0000019729 00000 n +0000019819 00000 n +0000019839 00000 n +0000019929 00000 n +0000019949 00000 n +0000020039 00000 n +0000020059 00000 n +0000020149 00000 n +0000020169 00000 n +0000020259 00000 n +0000020279 00000 n +0000020369 00000 n +0000020389 00000 n +0000020479 00000 n +0000020499 00000 n +0000020589 00000 n +0000020830 00000 n +0000021078 00000 n +0000021332 00000 n +0000021579 00000 n +0000021826 00000 n +0000022090 00000 n +0000022338 00000 n +0000022680 00000 n +0000022928 00000 n +0000023181 00000 n +0000023434 00000 n +0000023682 00000 n +0000023930 00000 n +0000024164 00000 n +0000024418 00000 n +0000024673 00000 n +0000024927 00000 n +0000025179 00000 n +0000025199 00000 n +0000025290 00000 n +0000025310 00000 n +0000025401 00000 n +0000025422 00000 n +0000025513 00000 n +0000025533 00000 n +0000025624 00000 n +0000025644 00000 n +0000025735 00000 n +0000025756 00000 n +0000025818 00000 n +0000025838 00000 n +0000025929 00000 n +0000025950 00000 n +0000026012 00000 n +0000026032 00000 n +0000026124 00000 n +0000026145 00000 n +0000026237 00000 n +0000026258 00000 n +0000026350 00000 n +0000026370 00000 n +0000026462 00000 n +0000026482 00000 n +0000026574 00000 n +0000026594 00000 n +0000026656 00000 n +0000026677 00000 n +0000026769 00000 n +0000026790 00000 n +0000026882 00000 n +0000026903 00000 n +0000026995 00000 n +0000027016 00000 n +0000027108 00000 n +0000027242 00000 n +0000027376 00000 n +0000027510 00000 n +0000027644 00000 n +0000027778 00000 n +0000027912 00000 n +0000028046 00000 n +0000028180 00000 n +0000028314 00000 n +0000028448 00000 n +0000028582 00000 n +0000028716 00000 n +0000028850 00000 n +0000028984 00000 n +0000029118 00000 n +0000029262 00000 n +0000029426 00000 n +0000029570 00000 n +0000029693 00000 n +0000029816 00000 n +0000029980 00000 n +0000030103 00000 n +0000030225 00000 n +0000030352 00000 n +0000030475 00000 n +0000030602 00000 n +0000030725 00000 n +0000030848 00000 n +0000030971 00000 n +0000031097 00000 n +0000031222 00000 n +0000031348 00000 n +0000031475 00000 n +0000031602 00000 n +0000031725 00000 n +0000031850 00000 n +0000031977 00000 n +0000032104 00000 n +0000032231 00000 n +0000032357 00000 n +0000032483 00000 n +0000032609 00000 n +0000077106 00000 n +0000077339 00000 n +0000077376 00000 n +0000077504 00000 n +0000077630 00000 n +0000077755 00000 n +0000077882 00000 n +0000078003 00000 n +0000080702 00000 n +0000083580 00000 n +0000083833 00000 n +0000083870 00000 n +0000083998 00000 n +0000084021 00000 n +0000084137 00000 n +0000084253 00000 n +0000084369 00000 n +0000084485 00000 n +0000084601 00000 n +0000084717 00000 n +0000084833 00000 n +0000084949 00000 n +0000085065 00000 n +0000085181 00000 n +0000085297 00000 n +0000085413 00000 n +0000085529 00000 n +0000088228 00000 n +0000089163 00000 n +0000089477 00000 n +0000089848 00000 n +0000090368 00000 n +0000090878 00000 n +0000091275 00000 n +0000091694 00000 n +0000092028 00000 n +0000092428 00000 n +0000092742 00000 n +0000093079 00000 n +0000093498 00000 n +0000519964 00000 n +0000531148 00000 n +0000530966 00000 n +0000530859 00000 n +0000531086 00000 n +0000534209 00000 n +0000534359 00000 n +0000534512 00000 n +0000534665 00000 n +0000534823 00000 n +0000534980 00000 n +0000535138 00000 n +0000535296 00000 n +0000535449 00000 n +0000535607 00000 n +0000535765 00000 n +0000535922 00000 n +0000536080 00000 n +0000536229 00000 n +0000536382 00000 n +0000536535 00000 n +0000536687 00000 n +0000536840 00000 n +0000536993 00000 n +0000537146 00000 n +0000537299 00000 n +0000537451 00000 n +0000537603 00000 n +0000537757 00000 n +0000537907 00000 n +0000538060 00000 n +0000538213 00000 n +0000538365 00000 n +0000538522 00000 n +0000538679 00000 n +0000538836 00000 n +0000538994 00000 n +0000539145 00000 n +0000539298 00000 n +0000539456 00000 n +0000539614 00000 n +0000539772 00000 n +0000539929 00000 n +0000540078 00000 n +0000540228 00000 n +0000542344 00000 n +0000540507 00000 n +0000533757 00000 n +0000531296 00000 n +0000540384 00000 n +0000540446 00000 n +0000542502 00000 n +0000542655 00000 n +0000542813 00000 n +0000542971 00000 n +0000543122 00000 n +0000543280 00000 n +0000543438 00000 n +0000543591 00000 n +0000543746 00000 n +0000543904 00000 n +0000544057 00000 n +0000544215 00000 n +0000544435 00000 n +0000542108 00000 n +0000540740 00000 n +0000544373 00000 n +0000548017 00000 n +0000547292 00000 n +0000544655 00000 n +0000547412 00000 n +0000547533 00000 n +0000547594 00000 n +0000547714 00000 n +0000547774 00000 n +0000547835 00000 n +0000547896 00000 n +0000547957 00000 n +0000551712 00000 n +0000551911 00000 n +0000552110 00000 n +0000552310 00000 n +0000552994 00000 n +0000551548 00000 n +0000548250 00000 n +0000552508 00000 n +0000552630 00000 n +0001222911 00000 n +0001223391 00000 n +0000552690 00000 n +0000552811 00000 n +0001222123 00000 n +0000552872 00000 n +0000739405 00000 n +0000720396 00000 n +0000732735 00000 n +0000000520 00000 f +0000000521 00000 f +0000000522 00000 f +0000000524 00000 f +0000556382 00000 n +0000000537 00000 f +0000556582 00000 n +0000557087 00000 n +0000556234 00000 n +0000553266 00000 n +0000556781 00000 n +0000556843 00000 n +0001222266 00000 n +0001221834 00000 n +0000556904 00000 n +0000557026 00000 n +0001223658 00000 n +0000732421 00000 n +0000000538 00000 f +0000000539 00000 f +0000000540 00000 f +0000000541 00000 f +0000000542 00000 f +0000000543 00000 f +0000000544 00000 f +0000000545 00000 f +0000000546 00000 f +0000000547 00000 f +0000000548 00000 f +0000000549 00000 f +0000000550 00000 f +0000000551 00000 f +0000000552 00000 f +0000000553 00000 f +0000000554 00000 f +0000000953 00000 f +0000560960 00000 n +0000561193 00000 n +0000561426 00000 n +0000561659 00000 n +0000561890 00000 n +0000562122 00000 n +0000562588 00000 n +0000563054 00000 n +0000563287 00000 n +0000563520 00000 n +0000563718 00000 n +0000600974 00000 n +0000601373 00000 n +0000601572 00000 n +0000601772 00000 n +0000564525 00000 n +0000560724 00000 n +0000557359 00000 n +0000563916 00000 n +0000563978 00000 n +0000564039 00000 n +0000564160 00000 n +0000562355 00000 n +0000562821 00000 n +0000564221 00000 n +0000564343 00000 n +0000564464 00000 n +0000786152 00000 n +0000786090 00000 n +0000786215 00000 n +0000786278 00000 n +0000783020 00000 n +0000790478 00000 n +0000795505 00000 n +0000786341 00000 n +0000786403 00000 n +0000828323 00000 n +0000567083 00000 n +0000602213 00000 n +0000566911 00000 n +0000564797 00000 n +0000601970 00000 n +0000601174 00000 n +0000602092 00000 n +0000602153 00000 n +0000593452 00000 n +0000751830 00000 n +0000604949 00000 n +0000604524 00000 n +0000602501 00000 n +0000604644 00000 n +0000604766 00000 n +0000604888 00000 n +0000608564 00000 n +0000608737 00000 n +0000608961 00000 n +0000609142 00000 n +0000609346 00000 n +0000610102 00000 n +0000608392 00000 n +0000605208 00000 n +0000609554 00000 n +0000609676 00000 n +0000609737 00000 n +0001223091 00000 n +0000609859 00000 n +0000609920 00000 n +0000609981 00000 n +0000614236 00000 n +0000614678 00000 n +0000614096 00000 n +0000610362 00000 n +0000614435 00000 n +0000614497 00000 n +0000614619 00000 n +0000802768 00000 n +0000618043 00000 n +0000618364 00000 n +0000617903 00000 n +0000614938 00000 n +0000618242 00000 n +0001223776 00000 n +0000621477 00000 n +0000621737 00000 n +0000621337 00000 n +0000618611 00000 n +0000621675 00000 n +0000766327 00000 n +0000625676 00000 n +0000626302 00000 n +0000625536 00000 n +0000621971 00000 n +0000625876 00000 n +0001221689 00000 n +0000625938 00000 n +0000625999 00000 n +0000626060 00000 n +0000626121 00000 n +0000626242 00000 n +0000802893 00000 n +0000630051 00000 n +0000630229 00000 n +0000630407 00000 n +0000630606 00000 n +0000630806 00000 n +0000631005 00000 n +0000631239 00000 n +0000631452 00000 n +0000631686 00000 n +0000631898 00000 n +0000632097 00000 n +0000632296 00000 n +0000632496 00000 n +0000632693 00000 n +0000632986 00000 n +0000629807 00000 n +0000626601 00000 n +0000632864 00000 n +0000832728 00000 n +0000795754 00000 n +0000766515 00000 n +0000837871 00000 n +0000837746 00000 n +0000803018 00000 n +0000636725 00000 n +0000640046 00000 n +0000637107 00000 n +0000636585 00000 n +0000633233 00000 n +0000636924 00000 n +0000636986 00000 n +0000640670 00000 n +0000639906 00000 n +0000637354 00000 n +0000640246 00000 n +0000640308 00000 n +0000640429 00000 n +0000640549 00000 n +0000643634 00000 n +0000643834 00000 n +0000644034 00000 n +0000644234 00000 n +0000644434 00000 n +0000644634 00000 n +0000644834 00000 n +0000645034 00000 n +0000645266 00000 n +0000649023 00000 n +0000646256 00000 n +0000643430 00000 n +0000640917 00000 n +0000645462 00000 n +0000645584 00000 n +0000645645 00000 n +0000645767 00000 n +0000645889 00000 n +0000646011 00000 n +0000646134 00000 n +0000646195 00000 n +0001223894 00000 n +0000707662 00000 n +0000766578 00000 n +0000649223 00000 n +0000649422 00000 n +0000649621 00000 n +0000649821 00000 n +0000650021 00000 n +0000650419 00000 n +0000650618 00000 n +0000650851 00000 n +0000651051 00000 n +0000651285 00000 n +0000651484 00000 n +0000651684 00000 n +0000654802 00000 n +0000652221 00000 n +0000648779 00000 n +0000646528 00000 n +0000651915 00000 n +0000650221 00000 n +0000651977 00000 n +0000652038 00000 n +0000652099 00000 n +0000652160 00000 n +0000772854 00000 n +0000766640 00000 n +0000777485 00000 n +0000766703 00000 n +0000655002 00000 n +0000655236 00000 n +0000655469 00000 n +0000655668 00000 n +0000655866 00000 n +0000656098 00000 n +0000656297 00000 n +0000656496 00000 n +0000656893 00000 n +0000657126 00000 n +0000657326 00000 n +0000657525 00000 n +0000657923 00000 n +0000661175 00000 n +0000658581 00000 n +0000654542 00000 n +0000652507 00000 n +0000658153 00000 n +0000658215 00000 n +0000658276 00000 n +0000656694 00000 n +0000658337 00000 n +0000658398 00000 n +0000657724 00000 n +0000658459 00000 n +0000658520 00000 n +0000766765 00000 n +0000782832 00000 n +0000766827 00000 n +0000766888 00000 n +0000661375 00000 n +0000661574 00000 n +0000661807 00000 n +0000662039 00000 n +0000662238 00000 n +0000662436 00000 n +0000662607 00000 n +0000662840 00000 n +0000663072 00000 n +0000663271 00000 n +0000663469 00000 n +0000663640 00000 n +0000663871 00000 n +0000667278 00000 n +0000664617 00000 n +0000660931 00000 n +0000658867 00000 n +0000664069 00000 n +0000664131 00000 n +0000664253 00000 n +0000664314 00000 n +0000664375 00000 n +0000664435 00000 n +0000664496 00000 n +0000664556 00000 n +0000766950 00000 n +0000767013 00000 n +0000767076 00000 n +0000667510 00000 n +0000667743 00000 n +0000667941 00000 n +0000668141 00000 n +0000668374 00000 n +0000668607 00000 n +0000668804 00000 n +0000669003 00000 n +0000669174 00000 n +0000669407 00000 n +0000669607 00000 n +0000669806 00000 n +0000670001 00000 n +0000670232 00000 n +0000670857 00000 n +0000667026 00000 n +0000664877 00000 n +0000670429 00000 n +0000670491 00000 n +0000670552 00000 n +0000670613 00000 n +0000670674 00000 n +0000670735 00000 n +0000670796 00000 n +0000767139 00000 n +0000767202 00000 n +0000767264 00000 n +0000673436 00000 n +0000673607 00000 n +0000673840 00000 n +0000674073 00000 n +0000674306 00000 n +0000674506 00000 n +0000674705 00000 n +0000674905 00000 n +0000675103 00000 n +0000678628 00000 n +0000675786 00000 n +0000673232 00000 n +0000671143 00000 n +0000675300 00000 n +0000675362 00000 n +0000675423 00000 n +0000675484 00000 n +0000675545 00000 n +0000675605 00000 n +0000675666 00000 n +0000675727 00000 n +0000767325 00000 n +0000771732 00000 n +0000771794 00000 n +0000678861 00000 n +0000679060 00000 n +0000679260 00000 n +0000679493 00000 n +0000679692 00000 n +0000679892 00000 n +0000680290 00000 n +0000680523 00000 n +0000680723 00000 n +0000680956 00000 n +0000681155 00000 n +0000681553 00000 n +0000684876 00000 n +0000682296 00000 n +0000678376 00000 n +0000676046 00000 n +0000681750 00000 n +0000681812 00000 n +0000680092 00000 n +0000681873 00000 n +0000681934 00000 n +0000681995 00000 n +0000682117 00000 n +0000682177 00000 n +0000681355 00000 n +0000682237 00000 n +0001224012 00000 n +0000771919 00000 n +0000771856 00000 n +0000772107 00000 n +0000744805 00000 n +0000726605 00000 n +0000685109 00000 n +0000685308 00000 n +0000685707 00000 n +0000685940 00000 n +0000686140 00000 n +0000686539 00000 n +0000686772 00000 n +0000687005 00000 n +0000687205 00000 n +0000687405 00000 n +0000687605 00000 n +0000687804 00000 n +0000688001 00000 n +0000691472 00000 n +0000691672 00000 n +0000688685 00000 n +0000684616 00000 n +0000682582 00000 n +0000688196 00000 n +0000688258 00000 n +0000685508 00000 n +0000688319 00000 n +0000688380 00000 n +0000686340 00000 n +0000688441 00000 n +0000688502 00000 n +0000688563 00000 n +0000688624 00000 n +0000772169 00000 n +0000772229 00000 n +0000772292 00000 n +0000772355 00000 n +0000714773 00000 n +0000691870 00000 n +0000692103 00000 n +0000692302 00000 n +0000692501 00000 n +0000692900 00000 n +0000693131 00000 n +0000693330 00000 n +0000693530 00000 n +0000693763 00000 n +0000693963 00000 n +0000694865 00000 n +0000691236 00000 n +0000688957 00000 n +0000694194 00000 n +0000694256 00000 n +0000694317 00000 n +0000692701 00000 n +0000694378 00000 n +0000694439 00000 n +0000694500 00000 n +0000694621 00000 n +0000694682 00000 n +0000694743 00000 n +0000694804 00000 n +0000772417 00000 n +0000772479 00000 n +0000772668 00000 n +0000772792 00000 n +0000696644 00000 n +0000697060 00000 n +0000696504 00000 n +0000695137 00000 n +0000696877 00000 n +0000696939 00000 n +0000697000 00000 n +0000772730 00000 n +0000000954 00000 f +0000000955 00000 f +0000000956 00000 f +0000000957 00000 f +0000000958 00000 f +0000000962 00000 f +0000700396 00000 n +0000700596 00000 n +0000700796 00000 n +0000000963 00000 f +0000000965 00000 f +0000700996 00000 n +0000000966 00000 f +0000000967 00000 f +0000000968 00000 f +0000000971 00000 f +0000701195 00000 n +0000701395 00000 n +0000000972 00000 f +0000001183 00000 f +0000701595 00000 n +0000702465 00000 n +0000700208 00000 n +0000697306 00000 n +0000701794 00000 n +0000701917 00000 n +0000702099 00000 n +0000702160 00000 n +0000702221 00000 n +0000702282 00000 n +0000702343 00000 n +0000702404 00000 n +0000706417 00000 n +0000706616 00000 n +0000706779 00000 n +0000706940 00000 n +0000707140 00000 n +0000707340 00000 n +0000707844 00000 n +0000706237 00000 n +0000702711 00000 n +0000707539 00000 n +0000707723 00000 n +0001222410 00000 n +0001223236 00000 n +0000707784 00000 n +0000818570 00000 n +0000823316 00000 n +0000710853 00000 n +0000711013 00000 n +0000711175 00000 n +0000711375 00000 n +0000711572 00000 n +0000711806 00000 n +0000711998 00000 n +0000712195 00000 n +0000712391 00000 n +0000712624 00000 n +0000712820 00000 n +0000713017 00000 n +0000713214 00000 n +0000713449 00000 n +0000713645 00000 n +0000713842 00000 n +0000714041 00000 n +0000714275 00000 n +0000714509 00000 n +0000714898 00000 n +0000710546 00000 n +0000708145 00000 n +0000714709 00000 n +0000714835 00000 n +0001224130 00000 n +0000818880 00000 n +0000777548 00000 n +0000822939 00000 n +0000823190 00000 n +0000777421 00000 n +0000718266 00000 n +0000718466 00000 n +0000718667 00000 n +0000718868 00000 n +0000719068 00000 n +0000719269 00000 n +0000719469 00000 n +0000719670 00000 n +0000719869 00000 n +0000720069 00000 n +0000723951 00000 n +0000724350 00000 n +0000720520 00000 n +0000718040 00000 n +0000715187 00000 n +0000720269 00000 n +0000720333 00000 n +0000720457 00000 n +0000795879 00000 n +0000724551 00000 n +0000724752 00000 n +0000724951 00000 n +0000725152 00000 n +0000725353 00000 n +0000725550 00000 n +0000725751 00000 n +0000725950 00000 n +0000726150 00000 n +0000726315 00000 n +0000726793 00000 n +0000723698 00000 n +0000720809 00000 n +0000726478 00000 n +0000724152 00000 n +0000726542 00000 n +0000726667 00000 n +0000726730 00000 n +0000796006 00000 n +0000838060 00000 n +0000729766 00000 n +0000729929 00000 n +0000730128 00000 n +0000730328 00000 n +0000730528 00000 n +0000730727 00000 n +0000730927 00000 n +0000731127 00000 n +0000731327 00000 n +0000731525 00000 n +0000731725 00000 n +0000731925 00000 n +0000732159 00000 n +0000736735 00000 n +0000732859 00000 n +0000729513 00000 n +0000727108 00000 n +0000732357 00000 n +0000732483 00000 n +0000732546 00000 n +0000732609 00000 n +0000732672 00000 n +0000732796 00000 n +0000840060 00000 n +0000840312 00000 n +0000840186 00000 n +0000840438 00000 n +0000736906 00000 n +0000737105 00000 n +0000737305 00000 n +0000737703 00000 n +0000737901 00000 n +0000738072 00000 n +0000738273 00000 n +0000738473 00000 n +0000738678 00000 n +0000738878 00000 n +0000739078 00000 n +0000739593 00000 n +0000736482 00000 n +0000733160 00000 n +0000739278 00000 n +0000737506 00000 n +0000739342 00000 n +0000739467 00000 n +0000739530 00000 n +0000810408 00000 n +0000813360 00000 n +0000742941 00000 n +0000743141 00000 n +0000743341 00000 n +0000743542 00000 n +0000743741 00000 n +0000743941 00000 n +0000744141 00000 n +0000744341 00000 n +0000744542 00000 n +0000744993 00000 n +0000742724 00000 n +0000739921 00000 n +0000744741 00000 n +0000744867 00000 n +0000744930 00000 n +0000748807 00000 n +0000749006 00000 n +0000749207 00000 n +0000749408 00000 n +0000749608 00000 n +0000749807 00000 n +0000750006 00000 n +0000750185 00000 n +0000750364 00000 n +0000750563 00000 n +0000750764 00000 n +0000750965 00000 n +0000751165 00000 n +0000751365 00000 n +0000751566 00000 n +0000751954 00000 n +0000748536 00000 n +0000745282 00000 n +0000751766 00000 n +0000751891 00000 n +0001224255 00000 n +0000755403 00000 n +0000755604 00000 n +0000755805 00000 n +0000755982 00000 n +0000756182 00000 n +0000756381 00000 n +0000756559 00000 n +0000756773 00000 n +0000757008 00000 n +0000757222 00000 n +0000757423 00000 n +0000757637 00000 n +0000757872 00000 n +0000758086 00000 n +0000758287 00000 n +0000758500 00000 n +0000758734 00000 n +0000758948 00000 n +0000759149 00000 n +0000759328 00000 n +0000759528 00000 n +0000759728 00000 n +0000763396 00000 n +0000760053 00000 n +0000755069 00000 n +0000752243 00000 n +0000759926 00000 n +0000759990 00000 n +0000800801 00000 n +0000001184 00000 f +0000001185 00000 f +0000001186 00000 f +0000001187 00000 f +0000001188 00000 f +0000001189 00000 f +0000001190 00000 f +0000001191 00000 f +0000001192 00000 f +0000001193 00000 f +0000001194 00000 f +0000001195 00000 f +0000001196 00000 f +0000001197 00000 f +0000001198 00000 f +0000001199 00000 f +0000001200 00000 f +0000001201 00000 f +0000001202 00000 f +0000001203 00000 f +0000001204 00000 f +0000001205 00000 f +0000001206 00000 f +0000001207 00000 f +0000001208 00000 f +0000001209 00000 f +0000001210 00000 f +0000001211 00000 f +0000001212 00000 f +0000001213 00000 f +0000001214 00000 f +0000001251 00000 f +0000763596 00000 n +0000763795 00000 n +0000763996 00000 n +0000764197 00000 n +0000764398 00000 n +0000764599 00000 n +0000764800 00000 n +0000765000 00000 n +0000765200 00000 n +0000765400 00000 n +0000765599 00000 n +0000765800 00000 n +0000766001 00000 n +0000771066 00000 n +0000771267 00000 n +0000771468 00000 n +0000767387 00000 n +0000763134 00000 n +0000760314 00000 n +0000766201 00000 n +0000766389 00000 n +0000766452 00000 n +0000775614 00000 n +0000772914 00000 n +0000770903 00000 n +0000767648 00000 n +0000771668 00000 n +0000771980 00000 n +0000772043 00000 n +0000772541 00000 n +0000772604 00000 n +0000775814 00000 n +0000776012 00000 n +0000776226 00000 n +0000776426 00000 n +0000776604 00000 n +0000001252 00000 f +0000001253 00000 f +0000001254 00000 f +0000001255 00000 f +0000001256 00000 f +0000001257 00000 f +0000001258 00000 f +0000001259 00000 f +0000001260 00000 f +0000001279 00000 f +0000776766 00000 n +0000776967 00000 n +0000780581 00000 n +0000780816 00000 n +0000781286 00000 n +0000777612 00000 n +0000775406 00000 n +0000773174 00000 n +0000777167 00000 n +0000777231 00000 n +0000777294 00000 n +0000777357 00000 n +0000781487 00000 n +0000781687 00000 n +0000781885 00000 n +0000782099 00000 n +0000782299 00000 n +0000782477 00000 n +0000001280 00000 f +0000001281 00000 f +0000001282 00000 f +0000001283 00000 f +0000001284 00000 f +0000001285 00000 f +0000001286 00000 f +0000001287 00000 f +0000001288 00000 f +0000001289 00000 f +0000001290 00000 f +0000001291 00000 f +0000001292 00000 f +0000001293 00000 f +0000001294 00000 f +0000001295 00000 f +0000001296 00000 f +0000001297 00000 f +0000001298 00000 f +0000001497 00000 f +0000789006 00000 n +0000789241 00000 n +0000789476 00000 n +0000789709 00000 n +0000790179 00000 n +0000793198 00000 n +0000793433 00000 n +0000793667 00000 n +0000794136 00000 n +0000794371 00000 n +0000783083 00000 n +0000780355 00000 n +0000777860 00000 n +0000782641 00000 n +0000782705 00000 n +0000781051 00000 n +0000782769 00000 n +0000782894 00000 n +0000782957 00000 n +0000828637 00000 n +0000786466 00000 n +0000785712 00000 n +0000783357 00000 n +0000785836 00000 n +0000785900 00000 n +0000785964 00000 n +0000786027 00000 n +0001224380 00000 n +0000790540 00000 n +0000788816 00000 n +0000786687 00000 n +0000790414 00000 n +0000789944 00000 n +0000794839 00000 n +0000795039 00000 n +0000795240 00000 n +0000796322 00000 n +0000792972 00000 n +0000790814 00000 n +0000795441 00000 n +0000793901 00000 n +0000794605 00000 n +0000795567 00000 n +0000795630 00000 n +0000795816 00000 n +0000795943 00000 n +0000796070 00000 n +0000796133 00000 n +0000796197 00000 n +0000796260 00000 n +0000798421 00000 n +0000798656 00000 n +0000798827 00000 n +0000799062 00000 n +0000799233 00000 n +0000799468 00000 n +0000799639 00000 n +0000799873 00000 n +0000800862 00000 n +0000798213 00000 n +0000796596 00000 n +0000800042 00000 n +0000800106 00000 n +0000800169 00000 n +0000800233 00000 n +0000800296 00000 n +0000800360 00000 n +0001221978 00000 n +0000800423 00000 n +0000800486 00000 n +0000800549 00000 n +0000800612 00000 n +0000800675 00000 n +0000800738 00000 n +0000803271 00000 n +0000802517 00000 n +0000801125 00000 n +0000802641 00000 n +0000802705 00000 n +0000802830 00000 n +0000802955 00000 n +0000803081 00000 n +0000803144 00000 n +0000803208 00000 n +0000803815 00000 n +0000803627 00000 n +0000803519 00000 n +0000803751 00000 n +0000806410 00000 n +0000806615 00000 n +0000806820 00000 n +0000807021 00000 n +0000807226 00000 n +0000807430 00000 n +0000807635 00000 n +0000807840 00000 n +0000808045 00000 n +0000808250 00000 n +0000808455 00000 n +0000808655 00000 n +0000808861 00000 n +0000809064 00000 n +0000809270 00000 n +0000809474 00000 n +0000809672 00000 n +0000810078 00000 n +0000810658 00000 n +0000806103 00000 n +0000803964 00000 n +0000810282 00000 n +0000810533 00000 n +0000809875 00000 n +0001224505 00000 n +0000813612 00000 n +0000812982 00000 n +0000813108 00000 n +0000813738 00000 n +0000813486 00000 n +0000813864 00000 n +0000813234 00000 n +0000818446 00000 n +0000812655 00000 n +0000813926 00000 n +0000812510 00000 n +0000810944 00000 n +0000812856 00000 n +0000813045 00000 n +0000813171 00000 n +0000813297 00000 n +0000813423 00000 n +0000813549 00000 n +0000813675 00000 n +0000813801 00000 n +0000816536 00000 n +0000816733 00000 n +0000816928 00000 n +0000817125 00000 n +0000817322 00000 n +0000817523 00000 n +0000817721 00000 n +0000817918 00000 n +0000818119 00000 n +0000819006 00000 n +0000816319 00000 n +0000814187 00000 n +0000818319 00000 n +0000818383 00000 n +0000818509 00000 n +0000818694 00000 n +0000818943 00000 n +0000823064 00000 n +0000821291 00000 n +0000821491 00000 n +0000821690 00000 n +0000821888 00000 n +0000822084 00000 n +0000822283 00000 n +0000822481 00000 n +0000822679 00000 n +0000827338 00000 n +0000827537 00000 n +0000827736 00000 n +0000823505 00000 n +0000821083 00000 n +0000819280 00000 n +0000822875 00000 n +0000823002 00000 n +0000823127 00000 n +0000823253 00000 n +0000823442 00000 n +0000832603 00000 n +0000832351 00000 n +0000832477 00000 n +0000827936 00000 n +0000828698 00000 n +0000827166 00000 n +0000823779 00000 n +0000828135 00000 n +0000828385 00000 n +0000828448 00000 n +0000828511 00000 n +0000828574 00000 n +0000831003 00000 n +0000831202 00000 n +0000831401 00000 n +0000831600 00000 n +0000831813 00000 n +0000832026 00000 n +0000832977 00000 n +0000830813 00000 n +0000828959 00000 n +0000832224 00000 n +0000832288 00000 n +0000832414 00000 n +0000832540 00000 n +0000832665 00000 n +0000832852 00000 n +0000835628 00000 n +0000001498 00000 f +0000001499 00000 f +0000001500 00000 f +0000001501 00000 f +0000001502 00000 f +0000001503 00000 f +0000001504 00000 f +0000001506 00000 f +0000835828 00000 n +0000000000 00000 f +0000836028 00000 n +0000836228 00000 n +0000836429 00000 n +0000836629 00000 n +0000836828 00000 n +0000837025 00000 n +0000837224 00000 n +0000837422 00000 n +0000838310 00000 n +0000835402 00000 n +0000833251 00000 n +0000837620 00000 n +0000837808 00000 n +0000837934 00000 n +0000837997 00000 n +0000838185 00000 n +0001224630 00000 n +0000840564 00000 n +0000839810 00000 n +0000838584 00000 n +0000839934 00000 n +0000840123 00000 n +0000840249 00000 n +0000840375 00000 n +0000840501 00000 n +0000840905 00000 n +0000840931 00000 n +0000841267 00000 n +0000841293 00000 n +0000841329 00000 n +0000841717 00000 n +0000841743 00000 n +0000841770 00000 n +0000841794 00000 n +0001221259 00000 n +0000841818 00000 n +0000842319 00000 n +0000842828 00000 n +0000843326 00000 n +0000850466 00000 n +0000850701 00000 n +0000857718 00000 n +0000857954 00000 n +0000864965 00000 n +0000865191 00000 n +0000872302 00000 n +0000872537 00000 n +0000879594 00000 n +0000879825 00000 n +0000886938 00000 n +0000887172 00000 n +0001001184 00000 n +0001001647 00000 n +0001107858 00000 n +0001108433 00000 n +0001203256 00000 n +0001203685 00000 n +0001205369 00000 n +0001205597 00000 n +0001216194 00000 n +0001216778 00000 n +0001220967 00000 n +0001224719 00000 n +0001224840 00000 n +0001224948 00000 n +0001225021 00000 n +0001230007 00000 n +0001230176 00000 n +0001230361 00000 n +0001230657 00000 n +0001230932 00000 n +0001231296 00000 n +0001231758 00000 n +0001232194 00000 n +0001232640 00000 n +0001233100 00000 n +0001233347 00000 n +0001233920 00000 n +0001234493 00000 n +0001235066 00000 n +0001235641 00000 n +0001236316 00000 n +0001237160 00000 n +0001238004 00000 n +0001238849 00000 n +0001239692 00000 n +0001240535 00000 n +0001241383 00000 n +0001242228 00000 n +0001243073 00000 n +0001243567 00000 n +0001243929 00000 n +0001244174 00000 n +0001244345 00000 n +0001244515 00000 n +0001244686 00000 n +0001244859 00000 n +0001245033 00000 n +0001245210 00000 n +0001245385 00000 n +0001245562 00000 n +0001245741 00000 n +0001245945 00000 n +0001246140 00000 n +0001246337 00000 n +0001246534 00000 n +0001246736 00000 n +0001247060 00000 n +0001247677 00000 n +0001248219 00000 n +0001248744 00000 n +0001249281 00000 n +0001249684 00000 n +0001249922 00000 n +0001250165 00000 n +0001250408 00000 n +0001250661 00000 n +0001250944 00000 n +0001251230 00000 n +0001251513 00000 n +0001251796 00000 n +0001252083 00000 n +0001252372 00000 n +0001252664 00000 n +0001252958 00000 n +0001253247 00000 n +0001253536 00000 n +0001253825 00000 n +0001254114 00000 n +0001254403 00000 n +0001254593 00000 n +0001254794 00000 n +0001254983 00000 n +0001255176 00000 n +0001255327 00000 n +0001255525 00000 n +0001255775 00000 n +0001255989 00000 n +0001256126 00000 n +0001256245 00000 n +0001256419 00000 n +0001256599 00000 n +0001256738 00000 n +0001256882 00000 n +0001257014 00000 n +0001257089 00000 n +0001257210 00000 n +0001257331 00000 n +0001257415 00000 n +0001257455 00000 n +0001257587 00000 n +trailer +<< /Size 1658 +/Root 1656 0 R +/Info 1657 0 R +/ID [<B4CE6449C046D3C641B9AE46B2BC2AFB> <B4CE6449C046D3C641B9AE46B2BC2AFB>] >> +startxref +1257863 +%%EOF diff --git a/lib/vendor/Bosch/BSEC/meson.build b/lib/vendor/Bosch/BSEC/meson.build new file mode 100644 index 0000000000000000000000000000000000000000..ae8faf89b761de21ee87c979ff1db8b33f2d70d5 --- /dev/null +++ b/lib/vendor/Bosch/BSEC/meson.build @@ -0,0 +1,22 @@ +includes = include_directories( + 'examples/', + 'algo/normal_version/inc/', + 'config/' +) + +sources = files( + 'examples/bsec_integration.c', +# 'config/generic_18v_3s_28d/bsec_serialized_configurations_iaq.c' +) + +lib = static_library( + 'bsec', + sources, + dependencies: bme680, + include_directories: includes, +) + +bsec = declare_dependency( + include_directories: includes, + link_with: lib, +)