BME680 driver trailing whitespaces removed

This commit is contained in:
Gunar Schorcht 2017-10-28 17:17:54 +02:00
parent 1af3f2e033
commit f431f831f6
8 changed files with 318 additions and 325 deletions

View file

@ -13,7 +13,7 @@
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
@ -21,7 +21,7 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
@ -29,7 +29,7 @@
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* 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
@ -46,7 +46,7 @@
*/
#include <string.h>
#include "FreeRTOS.h"
#include "task.h"
@ -200,9 +200,9 @@
#define BME680_CDM_OFF2 BME680_REG_CD1_LEN
#define BME680_CDM_OFF3 BME680_CDM_OFF2 + BME680_REG_CD2_LEN
// calibration parameter offsets in calibration data map
// calibration parameter offsets in calibration data map
// calibration data from 0x89
#define BME680_CDM_T2 1
#define BME680_CDM_T2 1
#define BME680_CDM_T3 3
#define BME680_CDM_P1 5
#define BME680_CDM_P2 7
@ -229,7 +229,7 @@
// device specific calibration data from 0x00
#define BME680_CDM_RHV 41 // 0x00 - res_heat_val
#define BME680_CDM_RHR 43 // 0x02 - res_heat_range
#define BME680_CDM_RSWE 45 // 0x04 - range_sw_error
#define BME680_CDM_RSWE 45 // 0x04 - range_sw_error
/**
@ -239,13 +239,13 @@ typedef struct {
bool gas_valid; // indicate that gas measurement results are valid
bool heater_stable; // indicate that heater temperature was stable
uint32_t temperature; // degree celsius x100
uint32_t pressure; // pressure in Pascal
uint16_t humidity; // relative humidity x1000 in %
uint16_t gas_resistance; // gas resistance data
uint8_t gas_range; // gas resistance range
uint8_t gas_index; // heater profile used (0 ... 9)
uint8_t meas_index;
@ -284,10 +284,10 @@ static bool bme680_spi_write (bme680_sensor_t* dev, uint8_t reg, uint8_t *da
bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
{
bme680_sensor_t* dev;
if ((dev = malloc (sizeof(bme680_sensor_t))) == NULL)
return NULL;
// init sensor data structure
dev->bus = bus;
dev->addr = addr;
@ -302,22 +302,22 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
dev->settings.heater_profile = BME680_HEATER_NOT_USED;
memset(dev->settings.heater_temperature, 0, sizeof(uint16_t)*10);
memset(dev->settings.heater_duration, 0, sizeof(uint16_t)*10);
if (!addr)
{
// SPI interface used
gpio_enable(dev->spi_cs_pin, GPIO_OUTPUT);
gpio_write (dev->spi_cs_pin, true);
}
// reset the sensor
// reset the sensor
if (!bme680_reset(dev))
{
error_dev ("Could not reset the sensor device.", __FUNCTION__, dev);
free (dev);
return NULL;
}
// check availability of the sensor
if (!bme680_is_available (dev))
{
@ -327,7 +327,7 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
}
uint8_t buf[BME680_CDM_SIZE];
// read all calibration parameters from sensor
if (bme680_read_reg(dev, BME680_REG_CD1_ADDR, buf+BME680_CDM_OFF1, BME680_REG_CD1_LEN) &&
bme680_read_reg(dev, BME680_REG_CD2_ADDR, buf+BME680_CDM_OFF2, BME680_REG_CD2_LEN) &&
@ -344,15 +344,15 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
dev->calib_data.par_p4 = lsb_msb_to_type ( int16_t, buf, BME680_CDM_P4);
dev->calib_data.par_p5 = lsb_msb_to_type ( int16_t, buf, BME680_CDM_P5);
dev->calib_data.par_p6 = lsb_to_type ( int8_t, buf, BME680_CDM_P6);
dev->calib_data.par_p7 = lsb_to_type ( int8_t, buf, BME680_CDM_P7);
dev->calib_data.par_p7 = lsb_to_type ( int8_t, buf, BME680_CDM_P7);
dev->calib_data.par_p8 = lsb_msb_to_type ( int16_t, buf, BME680_CDM_P8);
dev->calib_data.par_p9 = lsb_msb_to_type ( int16_t, buf, BME680_CDM_P9);
dev->calib_data.par_p10 = lsb_to_type ( uint8_t, buf, BME680_CDM_P10);
// humidity compensation parameters
dev->calib_data.par_h1 = (uint16_t)(((uint16_t)buf[BME680_CDM_H1+1] << 4) |
dev->calib_data.par_h1 = (uint16_t)(((uint16_t)buf[BME680_CDM_H1+1] << 4) |
(buf[BME680_CDM_H1] & 0x0F));
dev->calib_data.par_h2 = (uint16_t)(((uint16_t)buf[BME680_CDM_H2] << 4) |
dev->calib_data.par_h2 = (uint16_t)(((uint16_t)buf[BME680_CDM_H2] << 4) |
(buf[BME680_CDM_H2+1] >> 4));
dev->calib_data.par_h3 = lsb_to_type ( int8_t, buf, BME680_CDM_H3);
dev->calib_data.par_h4 = lsb_to_type ( int8_t, buf, BME680_CDM_H4);
@ -365,11 +365,11 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
dev->calib_data.par_gh2 = lsb_msb_to_type ( int16_t, buf, BME680_CDM_GH2);
dev->calib_data.par_gh3 = lsb_to_type ( int8_t, buf, BME680_CDM_GH3);
dev->calib_data.res_heat_range = (lsb_to_type (uint8_t, buf ,BME680_CDM_RHR) &
dev->calib_data.res_heat_range = (lsb_to_type (uint8_t, buf ,BME680_CDM_RHR) &
BME680_RHR_BITS) >>
BME680_RHR_SHIFT;
dev->calib_data.res_heat_val = (lsb_to_type ( int8_t, buf, BME680_CDM_RHV));
dev->calib_data.range_sw_err = (lsb_to_type ( int8_t, buf, BME680_CDM_RSWE) &
dev->calib_data.range_sw_err = (lsb_to_type ( int8_t, buf, BME680_CDM_RSWE) &
BME680_RSWE_BITS) >>
BME680_RSWE_SHIFT;
}
@ -379,13 +379,13 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
dev->error_code |= BME680_READ_CALIB_DATA_FAILED;
free (dev);
return NULL;
}
// Set the default temperature, pressure and humidity settings
if (!bme680_set_oversampling_rates (dev, osr_1x, osr_1x, osr_1x) ||
!bme680_set_filter_size (dev, iir_size_3))
{
{
error_dev ("Could not configure default sensor settings for TPH.", __FUNCTION__, dev);
free (dev);
return NULL;
@ -393,7 +393,7 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
// Set ambient temperature of sensor to default value (25 degree C)
dev->settings.ambient_temperature = 25;
// Set heater default profile 0 to 320 degree Celcius for 150 ms
if (!bme680_set_heater_profile (dev, 0, 320, 150))
{
@ -401,21 +401,21 @@ bme680_sensor_t* bme680_init_sensor(uint8_t bus, uint8_t addr, uint8_t cs)
free (dev);
return NULL;
}
if (!bme680_use_heater_profile (dev, 0))
{
error_dev ("Could not configure default heater profile.", __FUNCTION__, dev);
free (dev);
return NULL;
}
return dev;
}
bool bme680_force_measurement (bme680_sensor_t* dev)
{
if (!dev) return false;
dev->error_code = BME680_OK;
// return remaining time when measurement is already running
@ -433,14 +433,14 @@ bool bme680_force_measurement (bme680_sensor_t* dev)
dev->error_code |= BME680_FORCE_MODE_FAILED;
return false;
}
dev->meas_started = true;
dev->meas_start_tick = xTaskGetTickCount (); // system time in RTOS ticks
dev->meas_status = 0;
debug_dev ("Started measurement at %.3f.", __FUNCTION__, dev,
debug_dev ("Started measurement at %.3f.", __FUNCTION__, dev,
(double)sdk_system_get_time()*1e-3);
return true;
}
@ -456,20 +456,20 @@ bool bme680_force_measurement (bme680_sensor_t* dev)
uint32_t bme680_get_measurement_duration (const bme680_sensor_t *dev)
{
if (!dev) return 0;
int32_t duration = 0; /* Calculate in us */
// wake up duration from sleep into forced mode
duration += 1250;
// THP cycle duration which consumes 1963 µs for each measurement at maximum
if (dev->settings.osr_temperature) duration += (1 << (dev->settings.osr_temperature-1)) * 2300;
if (dev->settings.osr_pressure ) duration += (1 << (dev->settings.osr_pressure-1)) * 2300 + 575;
if (dev->settings.osr_humidity ) duration += (1 << (dev->settings.osr_humidity-1)) * 2300 + 575;
// if gas measurement is used
if (dev->settings.heater_profile != BME680_HEATER_NOT_USED &&
dev->settings.heater_duration[dev->settings.heater_profile] &&
dev->settings.heater_duration[dev->settings.heater_profile] &&
dev->settings.heater_temperature[dev->settings.heater_profile])
{
// gas heating time
@ -477,19 +477,19 @@ uint32_t bme680_get_measurement_duration (const bme680_sensor_t *dev)
// gas measurement duration;
duration += 2300 + 575;
}
// round up to next ms (1 us ... 1000 us => 1 ms)
duration += 999;
duration /= 1000;
// some ms tolerance
duration += 5;
// ceil to next integer value that is divisible by portTICK_PERIOD_MS and
// compute RTOS ticks (1 ... portTICK_PERIOD_MS = 1 tick)
duration = (duration + portTICK_PERIOD_MS-1) / portTICK_PERIOD_MS;
// Since first RTOS tick can be shorter than the half of defined tick period,
// Since first RTOS tick can be shorter than the half of defined tick period,
// the delay caused by vTaskDelay(duration) might be 1 or 2 ms shorter than
// computed duration in rare cases. Since the duration is computed for maximum
// and not for the typical durations and therefore tends to be too long, this
@ -512,16 +512,16 @@ bool bme680_is_measuring (bme680_sensor_t* dev)
}
uint8_t raw[2];
// read maesurment status from sensor
if (!bme680_read_reg(dev, BME680_REG_MEAS_STATUS_0, raw, 2))
{
error_dev ("Could not read measurement status from sensor.", __FUNCTION__, dev);
return false;
}
dev->meas_status = raw[0];
// test whether measuring bit is set
return (dev->meas_status & BME680_MEASURING_BITS);
}
@ -544,10 +544,10 @@ bool bme680_get_results_fixed (bme680_sensor_t* dev, bme680_values_fixed_t* resu
if (!bme680_get_raw_data(dev, &raw))
// return invalid values
return false;
// use compensation algorithms to compute sensor values in fixed point format
if (dev->settings.osr_temperature)
if (dev->settings.osr_temperature)
results->temperature = bme680_convert_temperature (dev, raw.temperature);
if (dev->settings.osr_pressure)
@ -557,7 +557,7 @@ bool bme680_get_results_fixed (bme680_sensor_t* dev, bme680_values_fixed_t* resu
results->humidity = bme680_convert_humidity (dev, raw.humidity);
if (dev->settings.heater_profile != BME680_HEATER_NOT_USED)
{
{
// convert gas only if raw data are valid and heater was stable
if (raw.gas_valid && raw.heater_stable)
results->gas_resistance = bme680_convert_gas (dev, raw.gas_resistance,
@ -568,7 +568,7 @@ bool bme680_get_results_fixed (bme680_sensor_t* dev, bme680_values_fixed_t* resu
dev->error_code = BME680_HEATER_NOT_STABLE;
}
debug_dev ("Fixed point sensor valus - %d ms: %d/100 C, %d/1000 Percent, %d Pascal, %d Ohm",
debug_dev ("Fixed point sensor valus - %d ms: %d/100 C, %d/1000 Percent, %d Pascal, %d Ohm",
__FUNCTION__, dev, sdk_system_get_time (),
results->temperature,
results->humidity,
@ -584,15 +584,15 @@ bool bme680_get_results_float (bme680_sensor_t* dev, bme680_values_float_t* resu
if (!dev || !results) return false;
bme680_values_fixed_t fixed;
if (!bme680_get_results_fixed (dev, &fixed))
return false;
results->temperature = fixed.temperature / 100.0f;
results->pressure = fixed.pressure / 100.0f;
results->humidity = fixed.humidity / 1000.0f;
results->gas_resistance = fixed.gas_resistance;
return true;
}
@ -600,13 +600,13 @@ bool bme680_get_results_float (bme680_sensor_t* dev, bme680_values_float_t* resu
bool bme680_measure_fixed (bme680_sensor_t* dev, bme680_values_fixed_t* results)
{
int32_t duration = bme680_force_measurement (dev);
if (duration == BME680_NOK)
if (duration == BME680_NOK)
return false; // measurment couldn't be started
else if (duration > 0) // wait for results
vTaskDelay (duration);
return bme680_get_results_fixed (dev, results);
}
@ -614,13 +614,13 @@ bool bme680_measure_fixed (bme680_sensor_t* dev, bme680_values_fixed_t* results)
bool bme680_measure_float (bme680_sensor_t* dev, bme680_values_float_t* results)
{
int32_t duration = bme680_force_measurement (dev);
if (duration == BME680_NOK)
if (duration == BME680_NOK)
return false; // measurment couldn't be started
else if (duration > 0) // wait for results
vTaskDelay (duration);
return bme680_get_results_float (dev, results);
}
@ -629,7 +629,7 @@ bool bme680_measure_float (bme680_sensor_t* dev, bme680_values_float_t* results)
#define bme_set_reg_bit(byte, bitname, bit) ( (byte & ~bitname##_BITS) | \
((bit << bitname##_SHIFT) & bitname##_BITS) )
#define bme_get_reg_bit(byte, bitname) ( (byte & bitname##_BITS) >> bitname##_SHIFT )
bool bme680_set_oversampling_rates (bme680_sensor_t* dev,
bme680_oversampling_rate_t ost,
bme680_oversampling_rate_t osp,
@ -642,7 +642,7 @@ bool bme680_set_oversampling_rates (bme680_sensor_t* dev,
bool ost_changed = dev->settings.osr_temperature != ost;
bool osp_changed = dev->settings.osr_pressure != osp;
bool osh_changed = dev->settings.osr_humidity != osh;
if (!ost_changed && !osp_changed && !osh_changed)
return true;
@ -650,7 +650,7 @@ bool bme680_set_oversampling_rates (bme680_sensor_t* dev,
dev->settings.osr_temperature = ost;
dev->settings.osr_pressure = osp;
dev->settings.osr_humidity = osh;
uint8_t reg;
if (ost_changed || osp_changed)
@ -658,7 +658,7 @@ bool bme680_set_oversampling_rates (bme680_sensor_t* dev,
// read the current register value
if (!bme680_read_reg(dev, BME680_REG_CTRL_MEAS, &reg, 1))
return false;
// set changed bit values
if (ost_changed) reg = bme_set_reg_bit (reg, BME680_OSR_T, ost);
if (osp_changed) reg = bme_set_reg_bit (reg, BME680_OSR_P, osp);
@ -667,7 +667,7 @@ bool bme680_set_oversampling_rates (bme680_sensor_t* dev,
if (!bme680_write_reg(dev, BME680_REG_CTRL_MEAS, &reg, 1))
return false;
}
if (osh_changed)
{
// read the current register value
@ -676,18 +676,18 @@ bool bme680_set_oversampling_rates (bme680_sensor_t* dev,
// set changed bit value
reg = bme_set_reg_bit (reg, BME680_OSR_H, osh);
// write back the new register value
if (!bme680_write_reg(dev, BME680_REG_CTRL_HUM, &reg, 1))
return false;
}
debug_dev ("Setting oversampling rates done: osrt=%d osp=%d osrh=%d",
debug_dev ("Setting oversampling rates done: osrt=%d osp=%d osrh=%d",
__FUNCTION__, dev,
dev->settings.osr_temperature,
dev->settings.osr_pressure,
dev->settings.osr_temperature,
dev->settings.osr_pressure,
dev->settings.osr_humidity);
return true;
}
@ -699,7 +699,7 @@ bool bme680_set_filter_size(bme680_sensor_t* dev, bme680_filter_size_t size)
dev->error_code = BME680_OK;
bool size_changed = dev->settings.filter_size != size;
if (!size_changed) return true;
/* Set the temperature, pressure and humidity settings */
@ -713,18 +713,18 @@ bool bme680_set_filter_size(bme680_sensor_t* dev, bme680_filter_size_t size)
// set changed bit value
reg = bme_set_reg_bit (reg, BME680_FILTER, size);
// write back the new register value
if (!bme680_write_reg(dev, BME680_REG_CONFIG, &reg, 1))
return false;
debug_dev ("Setting filter size done: size=%d", __FUNCTION__, dev,
dev->settings.filter_size);
return true;
}
bool bme680_set_heater_profile (bme680_sensor_t* dev, uint8_t profile,
bool bme680_set_heater_profile (bme680_sensor_t* dev, uint8_t profile,
uint16_t temperature, uint16_t duration)
{
if (!dev) return false;
@ -751,23 +751,23 @@ bool bme680_set_heater_profile (bme680_sensor_t* dev, uint8_t profile,
// compute internal gas sensor configuration parameters
uint8_t heat_dur = bme680_heater_duration(duration); // internal duration value
uint8_t heat_res = bme680_heater_resistance(dev, temperature); // internal temperature value
// set internal gas sensor configuration parameters if changed
if (temperature_changed &&
if (temperature_changed &&
!bme680_write_reg(dev, BME680_REG_RES_HEAT_BASE+profile, &heat_res, 1))
return false;
if (duration_changed &&
if (duration_changed &&
!bme680_write_reg(dev, BME680_REG_GAS_WAIT_BASE+profile, &heat_dur, 1))
return false;
debug_dev ("Setting heater profile %d done: temperature=%d duration=%d "
"heater_resistance=%02x heater_duration=%02x",
__FUNCTION__, dev, profile,
dev->settings.heater_temperature[profile],
dev->settings.heater_duration[profile],
dev->settings.heater_temperature[profile],
dev->settings.heater_duration[profile],
heat_dur, heat_res);
return true;
}
@ -784,21 +784,21 @@ bool bme680_use_heater_profile (bme680_sensor_t* dev, int8_t profile)
if (dev->settings.heater_profile == profile)
return false;
dev->settings.heater_profile = profile;
uint8_t reg = 0; // set
uint8_t reg = 0; // set
// set active profile
reg = bme_set_reg_bit (reg, BME680_NB_CONV, profile != BME680_HEATER_NOT_USED ? profile : 0);
// enable or disable gas measurement
reg = bme_set_reg_bit (reg, BME680_RUN_GAS, (profile != BME680_HEATER_NOT_USED &&
dev->settings.heater_temperature[profile] &&
dev->settings.heater_temperature[profile] &&
dev->settings.heater_duration[profile]));
if (!bme680_write_reg(dev, BME680_REG_CTRL_GAS_1, &reg, 1))
return false;
return true;
}
@ -816,15 +816,15 @@ bool bme680_set_ambient_temperature (bme680_sensor_t* dev, int16_t ambient)
// set ambient temperature configuration
dev->settings.ambient_temperature = ambient; // degree Celsius
// update all valid heater profiles
// takes 894 us for only one defined profile and 1585 us for 10 defined profiles
uint8_t data[10];
for (int i = 0; i < BME680_HEATER_PROFILES; i++)
{
data[i] = dev->settings.heater_temperature[i] ?
data[i] = dev->settings.heater_temperature[i] ?
bme680_heater_resistance(dev, dev->settings.heater_temperature[i]) : 0;
}
if (!bme680_write_reg(dev, BME680_REG_RES_HEAT_BASE, data, 10))
@ -835,31 +835,31 @@ bool bme680_set_ambient_temperature (bme680_sensor_t* dev, int16_t ambient)
for (int i = 0; i < BME680_HEATER_PROFILES; i++)
if (dev->settings.heater_temperature[i])
{
uint8_t heat_res = bme680_heater_resistance(dev, dev->settings.heater_temperature[i]);
uint8_t heat_res = bme680_heater_resistance(dev, dev->settings.heater_temperature[i]);
if (!bme680_write_reg(dev, BME680_REG_RES_HEAT_BASE+i, &heat_res, 1))
return false;
}
*/
debug_dev ("Setting heater ambient temperature done: ambient=%d",
__FUNCTION__, dev, dev->settings.ambient_temperature);
return true;
}
bool bme680_set_mode (bme680_sensor_t *dev, uint8_t mode)
{
if (!dev) return false;
dev->error_code = BME680_OK;
uint8_t reg;
if (!bme680_read_reg(dev, BME680_REG_CTRL_MEAS, &reg, 1))
return false;
reg = bme_set_reg_bit (reg, BME680_MODE, mode);
if (!bme680_write_reg(dev, BME680_REG_CTRL_MEAS, &reg, 1))
return false;
@ -877,19 +877,19 @@ static bool bme680_is_available (bme680_sensor_t* dev)
uint8_t chip_id;
if (!dev) return false;
dev->error_code = BME680_OK;
if (!bme680_read_reg (dev, BME680_REG_ID, &chip_id, 1))
return false;
if (chip_id != 0x61)
{
error_dev ("Chip id %02x is wrong, should be 0x61.", __FUNCTION__, dev, chip_id);
dev->error_code = BME680_WRONG_CHIP_ID;
return false;
}
return true;
}
@ -897,7 +897,7 @@ static bool bme680_is_available (bme680_sensor_t* dev)
static bool bme680_reset (bme680_sensor_t* dev)
{
if (!dev) return false;
dev->error_code = BME680_OK;
uint8_t reg = BME680_RESET_CMD;
@ -905,7 +905,7 @@ static bool bme680_reset (bme680_sensor_t* dev)
// send reset command
if (!bme680_write_reg(dev, BME680_REG_RESET, &reg, 1))
return false;
// wait the time the sensor needs for reset
bme680_delay_ms (BME680_RESET_PERIOD);
@ -929,15 +929,15 @@ static int16_t bme680_convert_temperature (bme680_sensor_t *dev, uint32_t raw_te
if (!dev) return 0;
bme680_calib_data_t* cd = &dev->calib_data;
int64_t var1;
int64_t var2;
int16_t temperature;
var1 = ((((raw_temperature >> 3) - ((int32_t)cd->par_t1 << 1))) *
var1 = ((((raw_temperature >> 3) - ((int32_t)cd->par_t1 << 1))) *
((int32_t)cd->par_t2)) >> 11;
var2 = (((((raw_temperature >> 4) - ((int32_t)cd->par_t1)) *
((raw_temperature >> 4) - ((int32_t)cd->par_t1))) >> 12) *
var2 = (((((raw_temperature >> 4) - ((int32_t)cd->par_t1)) *
((raw_temperature >> 4) - ((int32_t)cd->par_t1))) >> 12) *
((int32_t)cd->par_t3)) >> 14;
cd->t_fine = (int32_t)(var1 + var2);
temperature = (cd->t_fine * 5 + 128) >> 8;
@ -968,13 +968,13 @@ static uint32_t bme680_convert_pressure (bme680_sensor_t *dev, uint32_t raw_pres
int32_t var3;
int32_t var4;
int32_t pressure;
var1 = (((int32_t) cd->t_fine) >> 1) - 64000;
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * (int32_t) cd->par_p6) >> 2;
var2 = ((var2) * (int32_t) cd->par_p6) >> 2;
var2 = var2 + ((var1 * (int32_t)cd->par_p5) << 1);
var2 = (var2 >> 2) + ((int32_t) cd->par_p4 << 16);
var1 = (((var1 >> 2) * (var1 >> 2)) >> 13);
var1 = (((var1 >> 2) * (var1 >> 2)) >> 13);
var1 = (((var1) * ((int32_t) cd->par_p3 << 5)) >> 3) + (((int32_t) cd->par_p2 * var1) >> 1);
var1 = var1 >> 18;
var1 = ((32768 + var1) * (int32_t) cd->par_p1) >> 15;
@ -985,8 +985,8 @@ static uint32_t bme680_convert_pressure (bme680_sensor_t *dev, uint32_t raw_pres
: ((pressure << 1) / (uint32_t) var1);
var1 = ((int32_t) cd->par_p9 * (int32_t) (((pressure >> 3) * (pressure >> 3)) >> 13)) >> 12;
var2 = ((int32_t)(pressure >> 2) * (int32_t) cd->par_p8) >> 13;
var3 = ((int32_t)(pressure >> 8) * (int32_t)(pressure >> 8)
* (int32_t)(pressure >> 8)
var3 = ((int32_t)(pressure >> 8) * (int32_t)(pressure >> 8)
* (int32_t)(pressure >> 8)
* (int32_t)cd->par_p10) >> 17;
pressure = (int32_t)(pressure) + ((var1 + var2 + var3 + ((int32_t)cd->par_p7 << 7)) >> 4);
@ -1008,7 +1008,7 @@ static uint32_t bme680_convert_humidity (bme680_sensor_t *dev, uint16_t raw_humi
if (!dev) return 0;
bme680_calib_data_t* cd = &dev->calib_data;
int32_t var1;
int32_t var2;
int32_t var3;
@ -1019,9 +1019,9 @@ static uint32_t bme680_convert_humidity (bme680_sensor_t *dev, uint16_t raw_humi
int32_t humidity;
temp_scaled = (((int32_t) cd->t_fine * 5) + 128) >> 8;
var1 = (int32_t) (raw_humidity - ((int32_t) ((int32_t) cd->par_h1 << 4))) -
var1 = (int32_t) (raw_humidity - ((int32_t) ((int32_t) cd->par_h1 << 4))) -
(((temp_scaled * (int32_t) cd->par_h3) / ((int32_t) 100)) >> 1);
var2 = ((int32_t) cd->par_h2 *
var2 = ((int32_t) cd->par_h2 *
(((temp_scaled * (int32_t) cd->par_h4) / ((int32_t) 100)) +
(((temp_scaled * ((temp_scaled * (int32_t) cd->par_h5) / ((int32_t) 100))) >> 6) /
((int32_t) 100)) + (int32_t) (1 << 14))) >> 10;
@ -1073,7 +1073,7 @@ static uint32_t bme680_convert_gas (bme680_sensor_t *dev, uint16_t gas, uint8_t
if (!dev) return 0;
bme680_calib_data_t* cd = &dev->calib_data;
float var1 = (1340.0 + 5.0 * cd->range_sw_err) * lookup_table[gas_range][0];
return var1 * lookup_table[gas_range][1] / (gas - 512.0 + var1);
}
@ -1082,7 +1082,7 @@ static uint32_t bme680_convert_gas (bme680_sensor_t *dev, uint16_t gas, uint8_t
#define msb_lsb_to_type(t,b,o) (t)(((t)b[o] << 8) | b[o+1])
#define BME680_RAW_P_OFF BME680_REG_PRESS_MSB_0-BME680_REG_MEAS_STATUS_0
#define BME680_RAW_T_OFF (BME680_RAW_P_OFF + BME680_REG_TEMP_MSB_0 - BME680_REG_PRESS_MSB_0)
#define BME680_RAW_T_OFF (BME680_RAW_P_OFF + BME680_REG_TEMP_MSB_0 - BME680_REG_PRESS_MSB_0)
#define BME680_RAW_H_OFF (BME680_RAW_T_OFF + BME680_REG_HUM_MSB_0 - BME680_REG_TEMP_MSB_0)
#define BME680_RAW_G_OFF (BME680_RAW_H_OFF + BME680_REG_GAS_R_MSB_0 - BME680_REG_HUM_MSB_0)
@ -1109,7 +1109,7 @@ static bool bme680_get_raw_data(bme680_sensor_t *dev, bme680_raw_data_t* raw_dat
error_dev ("Could not read measurement status from sensor.", __FUNCTION__, dev);
return false;
}
dev->meas_status = raw[0];
if (dev->meas_status & BME680_MEASURING_BITS)
{
@ -1117,7 +1117,7 @@ static bool bme680_get_raw_data(bme680_sensor_t *dev, bme680_raw_data_t* raw_dat
dev->error_code = BME680_MEAS_STILL_RUNNING;
return false;
}
// test whether there are new data
if (!(dev->meas_status & BME680_NEW_DATA_BITS))
{
@ -1131,7 +1131,7 @@ static bool bme680_get_raw_data(bme680_sensor_t *dev, bme680_raw_data_t* raw_dat
raw_data->gas_index = (dev->meas_status & BME680_GAS_MEAS_INDEX_BITS);
// if there are new data, read raw data from sensor
if (!bme680_read_reg(dev, BME680_REG_RAW_DATA_0, raw, BME680_REG_RAW_DATA_LEN))
{
error_dev ("Could not read raw data from sensor.", __FUNCTION__, dev);
@ -1161,11 +1161,11 @@ static bool bme680_get_raw_data(bme680_sensor_t *dev, bme680_raw_data_t* raw_dat
return false;
}
*/
debug ("Raw data: %d %d %d %d %d",__FUNCTION__,
raw_data->temperature, raw_data->pressure,
debug ("Raw data: %d %d %d %d %d",__FUNCTION__,
raw_data->temperature, raw_data->pressure,
raw_data->humidity, raw_data->gas_resistance, raw_data->gas_range);
return true;
return true;
}
@ -1176,7 +1176,7 @@ static bool bme680_get_raw_data(bme680_sensor_t *dev, bme680_raw_data_t* raw_dat
*
* duration = value<5:0> * multiplier<7:6>
*
* where the multiplier is 1, 4, 16, or 64. Maximum duration is therefore
* where the multiplier is 1, 4, 16, or 64. Maximum duration is therefore
* 64*64 = 4032 ms. The function takes a real world duration value given
* in milliseconds and computes the internal representation.
*
@ -1186,7 +1186,7 @@ static uint8_t bme680_heater_duration (uint16_t duration)
{
uint8_t multiplier = 0;
while (duration > 63)
while (duration > 63)
{
duration = duration / 4;
multiplier++;
@ -1218,23 +1218,23 @@ static uint8_t bme680_heater_resistance (const bme680_sensor_t *dev, uint16_t te
double var4;
double var5;
uint8_t res_heat_x;
var1 = ((double)cd->par_gh1 / 16.0) + 49.0;
var2 = (((double)cd->par_gh2 / 32768.0) * 0.0005) + 0.00235;
var3 = (double)cd->par_gh3 / 1024.0;
var4 = var1 * (1.0 + (var2 * (double) temp));
var5 = var4 + (var3 * (double)dev->settings.ambient_temperature);
res_heat_x = (uint8_t)(3.4 * ((var5 * (4.0 / (4.0 + (double)cd->res_heat_range)) *
res_heat_x = (uint8_t)(3.4 * ((var5 * (4.0 / (4.0 + (double)cd->res_heat_range)) *
(1.0/(1.0 + ((double)cd->res_heat_val * 0.002)))) - 25));
return res_heat_x;
}
static void bme680_delay_ms(uint32_t period)
{
uint32_t start_time = sdk_system_get_time () / 1000;
vTaskDelay((period + portTICK_PERIOD_MS-1) / portTICK_PERIOD_MS);
while (sdk_system_get_time()/1000 - start_time < period)
@ -1256,7 +1256,7 @@ static const spi_settings_t bus_settings = {
static bool bme680_read_reg(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, uint16_t len)
{
if (!dev || !data) return false;
return (dev->addr) ? bme680_i2c_read (dev, reg, data, len)
: bme680_spi_read (dev, reg, data, len);
}
@ -1265,7 +1265,7 @@ static bool bme680_read_reg(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, ui
static bool bme680_write_reg(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, uint16_t len)
{
if (!dev || !data) return false;
return (dev->addr) ? bme680_i2c_write (dev, reg, data, len)
: bme680_spi_write (dev, reg, data, len);
}
@ -1277,18 +1277,18 @@ static bool bme680_write_reg(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, u
static bool bme680_spi_set_mem_page (bme680_sensor_t* dev, uint8_t reg)
{
// mem pages (reg 0x00 .. 0x7f = 1, reg 0x80 ... 0xff = 0
uint8_t mem_page = (reg < 0x80) ? BME680_BIT_SWITCH_MEM_PAGE_1
uint8_t mem_page = (reg < 0x80) ? BME680_BIT_SWITCH_MEM_PAGE_1
: BME680_BIT_SWITCH_MEM_PAGE_0;
debug_dev ("Set mem page for register %02x to %d.", __FUNCTION__, dev, reg, mem_page);
if (!bme680_spi_write (dev, BME680_REG_SWITCH_MEM_PAGE, &mem_page, 1))
{
dev->error_code |= BME680_SPI_SET_PAGE_FAILED;
return false;
}
// sdk_os_delay_us (100);
return true;
}
@ -1301,7 +1301,7 @@ static bool bme680_spi_read(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, ui
{
dev->error_code |= BME680_SPI_BUFFER_OVERFLOW;
error_dev ("Error on read from SPI slave on bus 1. Tried to transfer "
"more than %d byte in one read operation.",
"more than %d byte in one read operation.",
__FUNCTION__, dev, BME680_SPI_BUF_SIZE);
return false;
}
@ -1309,24 +1309,24 @@ static bool bme680_spi_read(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, ui
// set mem page first
if (!bme680_spi_set_mem_page (dev, reg))
{
error_dev ("Error on read from SPI slave on bus 1. Could not set mem page.",
error_dev ("Error on read from SPI slave on bus 1. Could not set mem page.",
__FUNCTION__, dev);
return false;
}
reg &= 0x7f;
reg |= 0x80;
spi_settings_t old_settings;
static uint8_t mosi[BME680_SPI_BUF_SIZE];
static uint8_t miso[BME680_SPI_BUF_SIZE];
memset (mosi, 0xff, BME680_SPI_BUF_SIZE);
memset (miso, 0xff, BME680_SPI_BUF_SIZE);
mosi[0] = reg;
spi_get_settings(dev->bus, &old_settings);
spi_set_settings(dev->bus, &bus_settings);
gpio_write(dev->spi_cs_pin, false);
@ -1342,19 +1342,19 @@ static bool bme680_spi_read(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, ui
dev->error_code |= BME680_SPI_READ_FAILED;
return false;
}
// shift data one by left, first byte received while sending register address is invalid
for (int i=0; i < len; i++)
data[i] = miso[i+1];
# ifdef BME680_DEBUG_LEVEL_2
printf("BME680 %s: read the following bytes: ", __FUNCTION__);
printf("%0x ", reg);
for (int i=0; i < len; i++)
printf("%0x ", data[i]);
printf("\n");
# endif
# endif
return true;
}
@ -1364,33 +1364,33 @@ static bool bme680_spi_write(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, u
if (!dev || !data) return false;
static uint8_t mosi[BME680_SPI_BUF_SIZE];
if (len >= BME680_SPI_BUF_SIZE)
{
dev->error_code |= BME680_SPI_BUFFER_OVERFLOW;
error_dev ("Error on write to SPI slave on bus 1. Tried to transfer more"
"than %d byte in one write operation.", __FUNCTION__, dev, BME680_SPI_BUF_SIZE);
return false;
return false;
}
// set mem page first if not mem page register is used
if (reg != BME680_REG_STATUS && !bme680_spi_set_mem_page (dev, reg))
{
error_dev ("Error on write from SPI slave on bus 1. Could not set mem page.",
error_dev ("Error on write from SPI slave on bus 1. Could not set mem page.",
__FUNCTION__, dev);
return false;
}
reg &= 0x7f;
// first byte in output is the register address
mosi[0] = reg;
// shift data one byte right, first byte in output is the register address
for (int i = 0; i < len; i++)
mosi[i+1] = data[i];
# ifdef BME680_DEBUG_LEVEL_2
printf("BME680 %s: Write the following bytes: ", __FUNCTION__);
for (int i = 0; i < len+1; i++)
@ -1399,7 +1399,7 @@ static bool bme680_spi_write(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, u
# endif
spi_settings_t old_settings;
spi_get_settings(dev->bus, &old_settings);
spi_set_settings(dev->bus, &bus_settings);
gpio_write(dev->spi_cs_pin, false);
@ -1434,7 +1434,7 @@ static bool bme680_i2c_read(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, ui
if (result)
{
dev->error_code |= (result == -EBUSY) ? BME680_I2C_BUSY : BME680_I2C_READ_FAILED;
error_dev ("Error %d on read %d byte from I2C slave register %02x.",
error_dev ("Error %d on read %d byte from I2C slave register %02x.",
__FUNCTION__, dev, result, len, reg);
return false;
}
@ -1454,7 +1454,7 @@ static bool bme680_i2c_read(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, ui
static bool bme680_i2c_write(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, uint16_t len)
{
if (!dev || !data) return false;
debug_dev ("Write %d byte to i2c slave register %02x.", __FUNCTION__, dev, len, reg);
int result;
@ -1466,7 +1466,7 @@ static bool bme680_i2c_write(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, u
if (result)
{
dev->error_code |= (result == -EBUSY) ? BME680_I2C_BUSY : BME680_I2C_WRITE_FAILED;
error_dev ("Error %d on write %d byte to i2c slave register %02x.",
error_dev ("Error %d on write %d byte to i2c slave register %02x.",
__FUNCTION__, dev, result, len, reg);
return false;
}
@ -1478,8 +1478,6 @@ static bool bme680_i2c_write(bme680_sensor_t* dev, uint8_t reg, uint8_t *data, u
printf("%0x ", data[i]);
printf("\n");
# endif
return true;
}