You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2017/05/13 00:32:16 UTC
[2/6] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
MYNEWT-748 SensorAPI: Add BME280 support
- SensorAPI support for pressure, temperature and humidity
- Check for validity of values
- Fix calculations
- Add BME280 shell support
- Fix sensors_test app
- cleanup
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/c9ca8275
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/c9ca8275
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/c9ca8275
Branch: refs/heads/master
Commit: c9ca827561a1c1fbc35ca15864be6dd20cc0bd14
Parents: 1dc1635
Author: Vipul Rahane <vi...@apache.org>
Authored: Wed May 3 18:11:45 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri May 12 17:08:16 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/src/main.c | 10 +-
apps/sensors_test/syscfg.yml | 8 +-
hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c | 2 +-
.../sensors/bme280/include/bme280/bme280.h | 27 +-
hw/drivers/sensors/bme280/src/bme280.c | 409 ++++++++++++++-----
hw/drivers/sensors/bme280/src/bme280_shell.c | 11 +-
hw/drivers/sensors/bme280/syscfg.yml | 3 +
hw/sensor/src/sensor_oic.c | 27 +-
hw/sensor/src/sensor_shell.c | 8 +-
hw/sensor/syscfg.yml | 4 +
10 files changed, 365 insertions(+), 144 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index ace40af..3c07e21 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -401,14 +401,14 @@ config_sensor(void)
memset(&bmecfg, 0, sizeof(bmecfg));
bmecfg.bc_mode = BME280_MODE_NORMAL;
- bmecfg.bc_iir = BME280_FILTER_OFF;
- bmecfg.bc_sby_dur = BME280_STANDBY_MS_1000;
+ bmecfg.bc_iir = BME280_FILTER_X16;
+ bmecfg.bc_sby_dur = BME280_STANDBY_MS_0_5;
bmecfg.bc_boc[0].boc_type = SENSOR_TYPE_RELATIVE_HUMIDITY;
bmecfg.bc_boc[1].boc_type = SENSOR_TYPE_PRESSURE;
- bmecfg.bc_boc[2].boc_type = SENSOR_TYPE_TEMPERATURE;
+ bmecfg.bc_boc[2].boc_type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
bmecfg.bc_boc[0].boc_oversample = BME280_SAMPLING_X1;
- bmecfg.bc_boc[1].boc_oversample = BME280_SAMPLING_X1;
- bmecfg.bc_boc[2].boc_oversample = BME280_SAMPLING_X1;
+ bmecfg.bc_boc[1].boc_oversample = BME280_SAMPLING_X16;
+ bmecfg.bc_boc[2].boc_oversample = BME280_SAMPLING_X2;
rc = bme280_config((struct bme280 *)dev, &bmecfg);
if (rc) {
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/apps/sensors_test/syscfg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/syscfg.yml b/apps/sensors_test/syscfg.yml
index fe8b2d7..8d5e407 100644
--- a/apps/sensors_test/syscfg.yml
+++ b/apps/sensors_test/syscfg.yml
@@ -42,8 +42,8 @@ syscfg.vals:
CONFIG_NEWTMGR: 0
TSL2561_CLI: 0
- BNO055_CLI: 0
- TCS34725_CLI: 0
+ BNO055_CLI: 1
+ TCS34725_CLI: 1
BME280_CLI: 1
# Setup Sensor BLE OIC GATT Server
@@ -66,13 +66,13 @@ syscfg.defs:
value : 0
BNO055_PRESENT:
description: 'BNO055 is present'
- value : 0
+ value : 1
BME280_PRESENT:
description: 'BME280 is present'
value : 1
TCS34725_PRESENT:
description: 'TCS34725 is present'
- value : 0
+ value : 1
SIM_ACCEL_PRESENT:
description: 'SIM ACCEL is present'
value : 0
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c b/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c
index 30da796..7916f1f 100644
--- a/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c
+++ b/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c
@@ -189,7 +189,7 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
#if MYNEWT_VAL(LSM303DLHC_PRESENT) || MYNEWT_VAL(BNO055_PRESENT)
static int
-slinky_accel_init(struct os_dev *dev, void *arg)
+accel_init(struct os_dev *dev, void *arg)
{
return (0);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/drivers/sensors/bme280/include/bme280/bme280.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/include/bme280/bme280.h b/hw/drivers/sensors/bme280/include/bme280/bme280.h
index ff3daa3..d881812 100644
--- a/hw/drivers/sensors/bme280/include/bme280/bme280.h
+++ b/hw/drivers/sensors/bme280/include/bme280/bme280.h
@@ -131,26 +131,13 @@ int bme280_set_iir(uint8_t iir);
int bme280_get_iir(uint8_t *iir);
/**
- * Gets a new data sample from the sensor.
- *
- * @param temperature sensor output
- * @param pressure sensor output
- * @param humidity sensor output
- * @param bme280 config and OS device structure
- *
- * @return 0 on success, and non-zero error code on failure
- */
-int bme280_get_data(uint32_t *temp, uint32_t *press, uint32_t *humidity,
- struct bme280 *bme280);
-
-/**
* Gets temperature
*
* @param temperature
*
* @return 0 on success, and non-zero error code on failure
*/
-int bme280_get_temperature(uint32_t *temp);
+int bme280_get_temperature(int32_t *temp);
/**
* Gets pressure
@@ -159,7 +146,7 @@ int bme280_get_temperature(uint32_t *temp);
*
* @return 0 on success, and non-zero error code on failure
*/
-int bme280_get_pressure(uint32_t *press);
+int bme280_get_pressure(int32_t *press);
/**
* Gets humidity
@@ -168,7 +155,7 @@ int bme280_get_pressure(uint32_t *press);
*
* @return 0 on success, and non-zero error code on failure
*/
-int bme280_get_humidity(uint32_t *humid);
+int bme280_get_humidity(int32_t *humid);
/**
* Sets the sampling rate
@@ -253,6 +240,14 @@ bme280_set_sby_duration(uint8_t dur);
int
bme280_get_sby_duration(uint8_t *dur);
+/**
+ * Take forced measurement
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_forced_mode_measurement(void);
+
#if MYNEWT_VAL(BME280_CLI)
int bme280_shell_init(void);
#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/drivers/sensors/bme280/src/bme280.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/src/bme280.c b/hw/drivers/sensors/bme280/src/bme280.c
index 7c66307..c88a79c 100644
--- a/hw/drivers/sensors/bme280/src/bme280.c
+++ b/hw/drivers/sensors/bme280/src/bme280.c
@@ -42,6 +42,14 @@
#include "stats/stats.h"
#endif
+#ifndef MATHLIB_SUPPORT
+
+double NAN = 0.0/0.0;
+double POS_INF = 1.0 /0.0;
+double NEG_INF = -1.0/0.0;
+
+#endif
+
static struct hal_spi_settings spi_bme280_settings = {
.data_order = HAL_SPI_MSB_FIRST,
.data_mode = HAL_SPI_MODE0,
@@ -54,12 +62,16 @@ struct bme280_calib_data bcd;
#if MYNEWT_VAL(BME280_STATS)
/* Define the stats section and records */
STATS_SECT_START(bme280_stat_section)
- STATS_SECT_ENTRY(errors)
+ STATS_SECT_ENTRY(read_errors)
+ STATS_SECT_ENTRY(write_errors)
+ STATS_SECT_ENTRY(invalid_data_errors)
STATS_SECT_END
/* Define stat names for querying */
STATS_NAME_START(bme280_stat_section)
- STATS_NAME(bme280_stat_section, errors)
+ STATS_NAME(bme280_stat_section, read_errors)
+ STATS_NAME(bme280_stat_section, write_errors)
+ STATS_NAME(bme280_stat_section, invalid_data_errors)
STATS_NAME_END(bme280_stat_section)
/* Global variable used to hold stats data */
@@ -67,7 +79,7 @@ STATS_SECT_DECL(bme280_stat_section) g_bme280stats;
#endif
#if MYNEWT_VAL(BME280_LOG)
-#define LOG_MODULE_BME280 (2561)
+#define LOG_MODULE_BME280 (280)
#define BME280_INFO(...) LOG_INFO(&_log, LOG_MODULE_BME280, __VA_ARGS__)
#define BME280_ERR(...) LOG_ERROR(&_log, LOG_MODULE_BME280, __VA_ARGS__)
static struct log _log;
@@ -90,7 +102,7 @@ static const struct sensor_driver g_bme280_sensor_driver = {
bme280_sensor_get_config
};
-float g_t_fine;
+int32_t g_t_fine;
static int
bme280_default_cfg(struct bme280_cfg *cfg)
@@ -98,7 +110,7 @@ bme280_default_cfg(struct bme280_cfg *cfg)
cfg->bc_iir = BME280_FILTER_OFF;
cfg->bc_mode = BME280_MODE_NORMAL;
- cfg->bc_boc[0].boc_type = SENSOR_TYPE_TEMPERATURE;
+ cfg->bc_boc[0].boc_type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
cfg->bc_boc[0].boc_oversample = BME280_SAMPLING_NONE;
cfg->bc_boc[1].boc_type = SENSOR_TYPE_PRESSURE;
cfg->bc_boc[1].boc_oversample = BME280_SAMPLING_NONE;
@@ -153,7 +165,7 @@ bme280_init(struct os_dev *dev, void *arg)
}
/* Add the driver */
- rc = sensor_set_driver(sensor, SENSOR_TYPE_TEMPERATURE |
+ rc = sensor_set_driver(sensor, SENSOR_TYPE_AMBIENT_TEMPERATURE |
SENSOR_TYPE_PRESSURE |
SENSOR_TYPE_RELATIVE_HUMIDITY,
(struct sensor_driver *) &g_bme280_sensor_driver);
@@ -195,22 +207,30 @@ bme280_sensor_get_interface(struct sensor *sensor, sensor_type_t type)
#if MYNEWT_VAL(BME280_SPEC_CALC)
/**
- * Returns temperature in DegC, as float
- * Output value of “51.23” equals 51.23 DegC.
+ * Returns temperature in DegC, as double
+ * Output value of "51.23" equals 51.23 DegC.
*
* @param uncompensated raw temperature value
* @return 0 on success, non-zero on failure
*/
-static float
-bme280_compensate_temperature(uint32_t rawtemp, struct bme280_calib_data *bcd)
+static double
+bme280_compensate_temperature(int32_t rawtemp, struct bme280_calib_data *bcd)
{
- float var1, var2, comptemp;
+ double var1, var2, comptemp;
- var1 = (((float)rawtemp)/16384.0 – ((float)bcd->bcd_dig_T1)/1024.0) *
- ((float)bcd->bcd_dig_T2);
- var2 = ((((float)rawtemp)/131072.0 – ((float)bcd->bcd_dig_T1)/8192.0) *
- (((float)rawtemp)/131072.0 – ((float)bcd->bcd_dig_T1)/8192.0)) *
- ((float)bcd->bcd_dig_T3);
+ if (rawtemp == 0x800000) {
+ BME280_ERR("Invalid temp data\n");
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, invalid_data_errors);
+#endif
+ return NAN;
+ }
+
+ var1 = (((double)rawtemp)/16384.0 - ((double)bcd->bcd_dig_T1)/1024.0) *
+ ((double)bcd->bcd_dig_T2);
+ var2 = ((((double)rawtemp)/131072.0 - ((double)bcd->bcd_dig_T1)/8192.0) *
+ (((double)rawtemp)/131072.0 - ((double)bcd->bcd_dig_T1)/8192.0)) *
+ ((double)bcd->bcd_dig_T3);
g_t_fine = var1 + var2;
@@ -220,60 +240,76 @@ bme280_compensate_temperature(uint32_t rawtemp, struct bme280_calib_data *bcd)
}
/**
- * Returns pressure in Pa as float.
- * Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa
+ * Returns pressure in Pa as double.
+ * Output value of "96386.2" equals 96386.2 Pa = 963.862 hPa
*
* @param uncompensated raw pressure value
* @return 0 on success, non-zero on failure
*/
-static float
-bme280_compensate_pressure(uint32_t rawpress, struct bme280_calib_data *bcd)
+static double
+bme280_compensate_pressure(int32_t rawpress, struct bme280_calib_data *bcd)
{
- float var1, var2, p;
- uint32_t temp;
+ double var1, var2, p;
+ int32_t temp;
+
+ if (rawpress == 0x800000) {
+ BME280_ERR("Invalid press data\n");
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, invalid_data_errors);
+#endif
+ return NAN;
+ }
if (!g_t_fine) {
if(!bme280_get_temperature(&temp)) {
- (void)bme280_compensate_temperature(temp);
+ (void)bme280_compensate_temperature(temp, bcd);
}
}
- var1 = ((float)g_t_fine/2.0) – 64000.0;
- var2 = var1 * var1 * ((float)bcd->bcd_dig_P6) / 32768.0;
- var2 = var2 + var1 * ((float)bcd->bcd_dig_P5) * 2.0;
- var2 = (var2/4.0)+(((float)bcd->bcd_dig_P4) * 65536.0);
- var1 = (((float)bcd->bcd_dig_P3) * var1 * var1 / 524288.0 +
- ((float)bcd->bcd_dig_P2) * var1) / 524288.0;
- var1 = (1.0 + var1 / 32768.0)*((float)bcd->bcd_dig_P1);
+ var1 = ((double)g_t_fine/2.0) - 64000.0;
+ var2 = var1 * var1 * ((double)bcd->bcd_dig_P6) / 32768.0;
+ var2 = var2 + var1 * ((double)bcd->bcd_dig_P5) * 2.0;
+ var2 = (var2/4.0)+(((double)bcd->bcd_dig_P4) * 65536.0);
+ var1 = (((double)bcd->bcd_dig_P3) * var1 * var1 / 524288.0 +
+ ((double)bcd->bcd_dig_P2) * var1) / 524288.0;
+ var1 = (1.0 + var1 / 32768.0)*((double)bcd->bcd_dig_P1);
if (var1 == 0.0)
{
return 0;
}
- p = 1048576.0 – (float)rawpress;
- p = (p – (var2 / 4096.0)) * 6250.0 / var1;
+ p = 1048576.0 - (double)rawpress;
+ p = (p - (var2 / 4096.0)) * 6250.0 / var1;
- var1 = ((float)bcd->bcd_dig_P9) * p * p / 2147483648.0;
- var2 = p * ((float)bcd->bcd_dig_P8) / 32768.0;
+ var1 = ((double)bcd->bcd_dig_P9) * p * p / 2147483648.0;
+ var2 = p * ((double)bcd->bcd_dig_P8) / 32768.0;
- p = p + (var1 + var2 + ((float)bcd->bcd_dig_P7)) / 16.0;
+ p = p + (var1 + var2 + ((double)bcd->bcd_dig_P7)) / 16.0;
return p;
}
/**
- * Returns humidity in %rH as float.
- * Output value of “46.332” represents 46.332 %rH
+ * Returns humidity in %rH as double.
+ * Output value of "46.332" represents 46.332 %rH
*
* @param uncompensated raw humidity value
* @return 0 on success, non-zero on failure
*/
-static float
-bme280_compensate_humidity(uint32_t rawhumid, struct bme280_calib_data *bcd)
+static double
+bme280_compensate_humidity(int32_t rawhumid, struct bme280_calib_data *bcd)
{
- float h;
- uint32_t temp;
+ double h;
+ int32_t temp;
+
+ if (rawhumid == 0x8000) {
+ BME280_ERR("Invalid humidity data\n");
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, invalid_data_errors);
+#endif
+ return NAN;
+ }
if (!g_t_fine) {
if(!bme280_get_temperature(&temp)) {
@@ -281,14 +317,14 @@ bme280_compensate_humidity(uint32_t rawhumid, struct bme280_calib_data *bcd)
}
}
- h = (((float)g_t_fine) – 76800.0);
- h = (rawhumid – (((float)bcd->bcd_dig_H4) * 64.0 +
- ((float)bcd->bcd_dig_H5) / 16384.0 * h)) *
- (((float)bcd->bcd_dig_H2) / 65536.0 * (1.0 +
- ((float)bcd->bcd_dig_H6) / 67108864.0 * h *
- (1.0 + ((float)bcd->bcd_dig_H3) / 67108864.0 * h)));
+ h = (((double)g_t_fine) - 76800.0);
+ h = (rawhumid - (((double)bcd->bcd_dig_H4) * 64.0 +
+ ((double)bcd->bcd_dig_H5) / 16384.0 * h)) *
+ (((double)bcd->bcd_dig_H2) / 65536.0 * (1.0 +
+ ((double)bcd->bcd_dig_H6) / 67108864.0 * h *
+ (1.0 + ((double)bcd->bcd_dig_H3) / 67108864.0 * h)));
- h = h * (1.0 – ((float)bcd->bcd_dig_H1) * h / 524288.0);
+ h = h * (1.0 - ((double)bcd->bcd_dig_H1) * h / 524288.0);
if (h > 100.0) {
h = 100.0;
} else if (h < 0.0) {
@@ -302,15 +338,23 @@ bme280_compensate_humidity(uint32_t rawhumid, struct bme280_calib_data *bcd)
/**
* Returns temperature in DegC, as float
- * Output value of “51.23” equals 51.23 DegC.
+ * Output value of "51.23" equals 51.23 DegC.
*
* @param uncompensated raw temperature value
* @return 0 on success, non-zero on failure
*/
static float
-bme280_compensate_temperature(uint32_t rawtemp, struct bme280_calib_data *bcd)
+bme280_compensate_temperature(int32_t rawtemp, struct bme280_calib_data *bcd)
{
- float var1, var2, comptemp;
+ int32_t var1, var2, comptemp;
+
+ if (rawtemp == 0x800000) {
+ BME280_ERR("Invalid temp data\n");
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, invalid_data_errors);
+#endif
+ return NAN;
+ }
rawtemp >>= 4;
@@ -325,21 +369,29 @@ bme280_compensate_temperature(uint32_t rawtemp, struct bme280_calib_data *bcd)
comptemp = ((int32_t)(g_t_fine * 5 + 128)) >> 8;
- return comptemp/100;
+ return (float)comptemp/100;
}
/**
* Returns pressure in Pa as float.
- * Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa
+ * Output value of "96386.2" equals 96386.2 Pa = 963.862 hPa
*
* @param uncompensated raw pressure value
* @return 0 on success, non-zero on failure
*/
static float
-bme280_compensate_pressure(uint32_t rawpress, struct bme280_calib_data *bcd)
+bme280_compensate_pressure(int32_t rawpress, struct bme280_calib_data *bcd)
{
- float var1, var2, p;
- uint32_t temp;
+ int64_t var1, var2, p;
+ int32_t temp;
+
+ if (rawpress == 0x800000) {
+ BME280_ERR("Invalid pressure data\n");
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, invalid_data_errors);
+#endif
+ return NAN;
+ }
if (!g_t_fine) {
if(!bme280_get_temperature(&temp)) {
@@ -375,7 +427,7 @@ bme280_compensate_pressure(uint32_t rawpress, struct bme280_calib_data *bcd)
/**
* Returns humidity in %rH as float.
- * Output value of “46.332” represents 46.332 %rH
+ * Output value of "46.332" represents 46.332 %rH
*
* @param uncompensated raw humidity value
* @return 0 on success, non-zero on failure
@@ -383,10 +435,18 @@ bme280_compensate_pressure(uint32_t rawpress, struct bme280_calib_data *bcd)
static float
bme280_compensate_humidity(uint32_t rawhumid, struct bme280_calib_data *bcd)
{
- float h;
- uint32_t temp;
+ int32_t h;
+ int32_t temp;
int32_t tmp32;
+ if (rawhumid == 0x8000) {
+ BME280_ERR("Invalid humidity data\n");
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, invalid_data_errors);
+#endif
+ return NAN;
+ }
+
if (!g_t_fine) {
if(!bme280_get_temperature(&temp)) {
(void)bme280_compensate_temperature(temp, bcd);
@@ -419,21 +479,35 @@ static int
bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
sensor_data_func_t data_func, void *data_arg, uint32_t timeout)
{
- uint32_t rawtemp;
- uint32_t rawpress;
- uint32_t rawhumid;
+ int32_t rawtemp;
+ int32_t rawpress;
+ int32_t rawhumid;
struct sensor_temp_data std;
struct sensor_press_data spd;
struct sensor_humid_data shd;
+ struct bme280 *bme280;
int rc;
if (!(type & SENSOR_TYPE_PRESSURE) &&
- !(type & SENSOR_TYPE_TEMPERATURE) &&
+ !(type & SENSOR_TYPE_AMBIENT_TEMPERATURE) &&
!(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
rc = SYS_EINVAL;
goto err;
}
+ bme280 = (struct bme280 *)SENSOR_GET_DEVICE(sensor);
+
+ /*
+ * For forced mode the sensor goes to sleep after setting the sensor to
+ * forced mode and grabbing sensor data
+ */
+ if (bme280->cfg.bc_mode == BME280_MODE_FORCED) {
+ rc = bme280_forced_mode_measurement();
+ if (rc) {
+ goto err;
+ }
+ }
+
rawtemp = rawpress = rawhumid = 0;
/* Get a new pressure sample */
@@ -444,7 +518,10 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
}
spd.spd_press = bme280_compensate_pressure(rawpress, &bcd);
- spd.spd_press_is_valid = 1;
+
+ if (spd.spd_press != NAN) {
+ spd.spd_press_is_valid = 1;
+ }
/* Call data function */
rc = data_func(sensor, data_arg, &spd);
@@ -454,14 +531,17 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
}
/* Get a new temperature sample */
- if (type & SENSOR_TYPE_TEMPERATURE) {
+ if (type & SENSOR_TYPE_AMBIENT_TEMPERATURE) {
rc = bme280_get_temperature(&rawtemp);
if (rc) {
goto err;
}
std.std_temp = bme280_compensate_temperature(rawtemp, &bcd);
- std.std_temp_is_valid = 1;
+
+ if (std.std_temp != NAN) {
+ std.std_temp_is_valid = 1;
+ }
/* Call data function */
rc = data_func(sensor, data_arg, &std);
@@ -478,7 +558,10 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
}
shd.shd_humid = bme280_compensate_humidity(rawhumid, &bcd);
- shd.shd_humid_is_valid = 1;
+
+ if (shd.shd_humid != NAN) {
+ shd.shd_humid_is_valid = 1;
+ }
/* Call data function */
rc = data_func(sensor, data_arg, &shd);
@@ -499,7 +582,7 @@ bme280_sensor_get_config(struct sensor *sensor, sensor_type_t type,
int rc;
if (!(type & SENSOR_TYPE_PRESSURE) ||
- !(type & SENSOR_TYPE_TEMPERATURE) ||
+ !(type & SENSOR_TYPE_AMBIENT_TEMPERATURE) ||
!(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
rc = SYS_EINVAL;
goto err;
@@ -547,31 +630,68 @@ bme280_get_calibinfo(struct bme280_calib_data *bcd)
int rc;
uint8_t payload[33];
+ /**
+ *------------|------------------|--------------------|
+ * trimming | reg addrs | bits |
+ *____________|__________________|____________________|
+ * dig_T1 | 0x88 | 0x89 | from 0 : 7 to 8: 15
+ * dig_T2 | 0x8A | 0x8B | from 0 : 7 to 8: 15
+ * dig_T3 | 0x8C | 0x8D | from 0 : 7 to 8: 15
+ * dig_P1 | 0x8E | 0x8F | from 0 : 7 to 8: 15
+ * dig_P2 | 0x90 | 0x91 | from 0 : 7 to 8: 15
+ * dig_P3 | 0x92 | 0x93 | from 0 : 7 to 8: 15
+ * dig_P4 | 0x94 | 0x95 | from 0 : 7 to 8: 15
+ * dig_P5 | 0x96 | 0x97 | from 0 : 7 to 8: 15
+ * dig_P6 | 0x98 | 0x99 | from 0 : 7 to 8: 15
+ * dig_P7 | 0x9A | 0x9B | from 0 : 7 to 8: 15
+ * dig_P8 | 0x9C | 0x9D | from 0 : 7 to 8: 15
+ * dig_P9 | 0x9E | 0x9F | from 0 : 7 to 8: 15
+ * dig_H1 | 0xA1 | from 0 to 7
+ * dig_H2 | 0xE1 | 0xE2 | from 0 : 7 to 8: 15
+ * dig_H3 | 0xE3 | from 0 to 7
+ * dig_H4 | 0xE4 | 0xE5 | from 4 : 11 to 0: 3
+ * dig_H5 | 0xE5 | 0xE6 | from 0 : 3 to 4: 11
+ * dig_H6 | 0xE7 | from 0 to 7
+ *------------|------------------|--------------------|
+ * Hence, we read it in two transactions, one starting at
+ * BME280_REG_ADDR_DIG_T1, second one starting at
+ * BME280_REG_ADDR_DIG_H2.
+ */
+
rc = bme280_readlen(BME280_REG_ADDR_DIG_T1, payload, sizeof(payload));
if (rc) {
goto err;
}
- bcd->bcd_dig_T1 = payload[0] | payload[1] << 8;
- bcd->bcd_dig_T2 = payload[3] | payload[2] << 8;
- bcd->bcd_dig_T3 = payload[5] | payload[4] << 8;
-
- bcd->bcd_dig_P1 = payload[7] | payload[6] << 8;
- bcd->bcd_dig_P2 = payload[9] | payload[8] << 8;
- bcd->bcd_dig_P3 = payload[11] | payload[10] << 8;
- bcd->bcd_dig_P4 = payload[13] | payload[12] << 8;
- bcd->bcd_dig_P5 = payload[15] | payload[14] << 8;
- bcd->bcd_dig_P6 = payload[17] | payload[16] << 8;
- bcd->bcd_dig_P7 = payload[19] | payload[18] << 8;
- bcd->bcd_dig_P8 = payload[21] | payload[20] << 8;
- bcd->bcd_dig_P9 = payload[23] | payload[22] << 8;
-
- bcd->bcd_dig_H1 = payload[24];
- bcd->bcd_dig_H2 = payload[26] | payload[25] << 8;
- bcd->bcd_dig_H3 = payload[27];
- bcd->bcd_dig_H4 = (payload[28] << 4) | (payload[29] & 0xF);
- bcd->bcd_dig_H5 = (payload[31] << 4) | (payload[30] >> 4);
- bcd->bcd_dig_H6 = (int8_t)payload[32];
+ bcd->bcd_dig_T1 = (uint16_t)(payload[0] | (uint16_t)(((uint8_t)payload[1]) << 8));
+ bcd->bcd_dig_T2 = (int16_t) (payload[2] | (int16_t)((int8_t)payload[3]) << 8);
+ bcd->bcd_dig_T3 = (int16_t) (payload[4] | (int16_t)((int8_t)payload[5]) << 8);
+
+ bcd->bcd_dig_P1 = (uint16_t) (payload[6] | (uint16_t)(((uint8_t)payload[7]) << 8));
+ bcd->bcd_dig_P2 = (int16_t) (payload[8] | (int16_t)(((int8_t)payload[9]) << 8));
+ bcd->bcd_dig_P3 = (int16_t) (payload[10] | (int16_t)(((int8_t)payload[11]) << 8));
+ bcd->bcd_dig_P4 = (int16_t) (payload[12] | (int16_t)(((int8_t)payload[13]) << 8));
+ bcd->bcd_dig_P5 = (int16_t) (payload[14] | (int16_t)(((int8_t)payload[15]) << 8));
+ bcd->bcd_dig_P6 = (int16_t) (payload[16] | (int16_t)(((int8_t)payload[17]) << 8));
+ bcd->bcd_dig_P7 = (int16_t) (payload[18] | (int16_t)(((int8_t)payload[19]) << 8));
+ bcd->bcd_dig_P8 = (int16_t) (payload[20] | (int16_t)(((int8_t)payload[21]) << 8));
+ bcd->bcd_dig_P9 = (int16_t) (payload[22] | (int16_t)(((int8_t)payload[23]) << 8));
+
+ bcd->bcd_dig_H1 = payload[25];
+
+ memset(payload, 0, 7);
+ rc = bme280_readlen(BME280_REG_ADDR_DIG_H2, payload, 7);
+ if (rc) {
+ goto err;
+ }
+
+ bcd->bcd_dig_H2 = (int16_t) (payload[0] | (int16_t)(((int8_t)payload[1]) << 8));
+ bcd->bcd_dig_H3 = payload[2];
+ bcd->bcd_dig_H4 = (int16_t)(((int16_t)((int8_t)payload[3]) << 4) |
+ (payload[4] & 0x0F));
+ bcd->bcd_dig_H5 = (int16_t)(((int16_t)((int8_t)payload[5]) << 4) |
+ (((int8_t)payload[6]) >> 4));
+ bcd->bcd_dig_H6 = (int8_t)payload[7];
return 0;
err:
@@ -727,6 +847,11 @@ bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len)
addr | BME280_SPI_READ_CMD_BIT);
if (retval == 0xFFFF) {
rc = SYS_EINVAL;
+ BME280_ERR("SPI_%u register write failed addr:0x%02X\n",
+ MYNEWT_VAL(BME280_SPINUM), addr);
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, read_errors);
+#endif
goto err;
}
@@ -735,14 +860,22 @@ bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len)
retval = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), 0);
if (retval == 0xFFFF) {
rc = SYS_EINVAL;
+ BME280_ERR("SPI_%u read failed addr:0x%02X\n",
+ MYNEWT_VAL(BME280_SPINUM), addr);
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, read_errors);
+#endif
goto err;
}
payload[i] = retval;
}
+ rc = 0;
+
err:
/* De-select the device */
hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
+
return rc;
}
@@ -769,6 +902,11 @@ bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len)
addr & ~BME280_SPI_READ_CMD_BIT);
if (rc == 0xFFFF) {
rc = SYS_EINVAL;
+ BME280_ERR("SPI_%u register write failed addr:0x%02X\n",
+ MYNEWT_VAL(BME280_SPINUM), addr);
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, write_errors);
+#endif
goto err;
}
@@ -777,15 +915,24 @@ bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len)
rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), payload[i]);
if (rc == 0xFFFF) {
rc = SYS_EINVAL;
+ BME280_ERR("SPI_%u write failed addr:0x%02X:0x%02X\n",
+ MYNEWT_VAL(BME280_SPINUM), addr);
+#if MYNEWT_VAL(BME280_STATS)
+ STATS_INC(g_bme280stats, write_errors);
+#endif
goto err;
}
}
+
+ rc = 0;
+
+err:
/* De-select the device */
hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
- return 0;
-err:
+ os_time_delay((OS_TICKS_PER_SEC * 30)/1000 + 1);
+
return rc;
}
@@ -797,7 +944,7 @@ err:
* @return 0 on success, and non-zero error code on failure
*/
int
-bme280_get_temperature(uint32_t *temp)
+bme280_get_temperature(int32_t *temp)
{
int rc;
uint8_t tmp[3];
@@ -807,8 +954,15 @@ bme280_get_temperature(uint32_t *temp)
goto err;
}
- *temp = (tmp[1] << 8 | tmp[0]) << 4 | (tmp[2] >> 4);
+#if MYNEWT_VAL(BME280_SPEC_CALC)
+ *temp = (int32_t)((((uint32_t)(tmp[0])) << 12) |
+ (((uint32_t)(tmp[1])) << 4) |
+ ((uint32_t)tmp[2] >> 4));
+#else
+ *temp = ((tmp[0] << 16) | (tmp[1] << 8) | tmp[2]);
+#endif
+ return 0;
err:
return rc;
}
@@ -821,7 +975,7 @@ err:
* @return 0 on success, and non-zero error code on failure
*/
int
-bme280_get_humidity(uint32_t *humid)
+bme280_get_humidity(int32_t *humid)
{
int rc;
uint8_t tmp[2];
@@ -830,9 +984,13 @@ bme280_get_humidity(uint32_t *humid)
if (rc) {
goto err;
}
+#if MYNEWT_VAL(BME280_SPEC_CALC)
+ *humid = (tmp[0] << 8 | tmp[1]);
+#else
+ *humid = (tmp[0] << 8 | tmp[1]);
+#endif
- *humid = (tmp[1] << 8 | tmp[0]);
-
+ return 0;
err:
return rc;
}
@@ -845,18 +1003,25 @@ err:
* @return 0 on success, and non-zero error code on failure
*/
int
-bme280_get_pressure(uint32_t *press)
+bme280_get_pressure(int32_t *press)
{
int rc;
uint8_t tmp[3];
- rc = bme280_readlen(BME280_REG_ADDR_PRESS, tmp, 2);
+ rc = bme280_readlen(BME280_REG_ADDR_PRESS, tmp, 3);
if (rc) {
goto err;
}
- *press = (tmp[1] << 8 | tmp[0]) << 4 | (tmp[2] >> 4);
+#if MYNEWT_VAL(BME280_SPEC_CALC)
+ *press = (int32_t)((((uint32_t)(tmp[0])) << 12) |
+ (((uint32_t)(tmp[1])) << 4) |
+ ((uint32_t)tmp[2] >> 4));
+#else
+ *press = ((tmp[0] << 16) | (tmp[1] << 8) | tmp[2]);
+#endif
+ return 0;
err:
return rc;
}
@@ -896,6 +1061,7 @@ bme280_get_iir(uint8_t *iir)
*iir = ((tmp & BME280_REG_CONFIG_FILTER) >> 5);
+ return 0;
err:
return rc;
}
@@ -950,6 +1116,7 @@ bme280_get_mode(uint8_t *mode)
*mode = (tmp & BME280_REG_CTRL_MEAS_MODE);
+ return 0;
err:
return rc;
}
@@ -997,18 +1164,18 @@ bme280_get_oversample(sensor_type_t type, uint8_t *oversample)
int rc;
uint8_t tmp;
- if (type & SENSOR_TYPE_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
+ if (type & SENSOR_TYPE_AMBIENT_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &tmp, 1);
if (rc) {
goto err;
}
- if (type & SENSOR_TYPE_TEMPERATURE) {
+ if (type & SENSOR_TYPE_AMBIENT_TEMPERATURE) {
*oversample = ((tmp & BME280_REG_CTRL_MEAS_TOVER) >> 5);
}
if (type & SENSOR_TYPE_PRESSURE) {
- *oversample = ((tmp & BME280_REG_CTRL_MEAS_POVER) >> 3);
+ *oversample = ((tmp & BME280_REG_CTRL_MEAS_POVER) >> 2);
}
}
@@ -1039,13 +1206,13 @@ bme280_set_oversample(sensor_type_t type, uint8_t oversample)
int rc;
uint8_t cfg;
- if (type & SENSOR_TYPE_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
+ if (type & SENSOR_TYPE_AMBIENT_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
if (rc) {
goto err;
}
- if (type & SENSOR_TYPE_TEMPERATURE) {
+ if (type & SENSOR_TYPE_AMBIENT_TEMPERATURE) {
cfg = cfg | ((oversample << 5) & BME280_REG_CTRL_MEAS_TOVER);
}
@@ -1098,6 +1265,7 @@ bme280_get_chipid(uint8_t *chipid)
*chipid = tmp;
+ return 0;
err:
return rc;
}
@@ -1155,3 +1323,38 @@ err:
return rc;
}
+/**
+ * Take forced measurement
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_forced_mode_measurement(void)
+{
+ uint8_t status;
+ int rc;
+
+ /*
+ * If we are in forced mode, the BME sensor goes back to sleep after each
+ * measurement and we need to set it to forced mode once at this point, so
+ * it will take the next measurement and then return to sleep again.
+ * In normal mode simply does new measurements periodically.
+ */
+ rc = bme280_set_mode(BME280_MODE_FORCED);
+ if (rc) {
+ goto err;
+ }
+
+ status = 1;
+ while(status) {
+ rc = bme280_readlen(BME280_REG_ADDR_STATUS, &status, 1);
+ if (rc) {
+ goto err;
+ }
+ os_time_delay(OS_TICKS_PER_SEC/1000);
+ }
+
+ return 0;
+err:
+ return rc;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/drivers/sensors/bme280/src/bme280_shell.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/src/bme280_shell.c b/hw/drivers/sensors/bme280/src/bme280_shell.c
index aeea071..7366b2d 100644
--- a/hw/drivers/sensors/bme280/src/bme280_shell.c
+++ b/hw/drivers/sensors/bme280/src/bme280_shell.c
@@ -120,9 +120,9 @@ bme280_shell_cmd_reset(int argc, char **argv)
static int
bme280_shell_cmd_read(int argc, char **argv)
{
- uint32_t temp;
- uint32_t press;
- uint32_t humid;
+ int32_t temp;
+ int32_t press;
+ int32_t humid;
uint16_t samples = 1;
long val;
int rc;
@@ -159,9 +159,8 @@ bme280_shell_cmd_read(int argc, char **argv)
return rc;
}
- console_printf("temperature: %u pressure: %u\thumidity: %u\n",
- (unsigned int)temp, (unsigned int)press,
- (unsigned int)humid);
+ console_printf("temperature: %d pressure: %d\thumidity: %d\n",
+ (int)temp, (int)press, (int)humid);
}
return 0;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/drivers/sensors/bme280/syscfg.yml
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/syscfg.yml b/hw/drivers/sensors/bme280/syscfg.yml
index 126ecda..c5318df 100644
--- a/hw/drivers/sensors/bme280/syscfg.yml
+++ b/hw/drivers/sensors/bme280/syscfg.yml
@@ -36,3 +36,6 @@ syscfg.defs:
BME280_CSPIN:
description: 'CS pin for BME280'
value : 0
+ BME280_SPEC_CALC:
+ description: 'BME280 Spec calculation insetad of built in one'
+ value : 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/sensor/src/sensor_oic.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_oic.c b/hw/sensor/src/sensor_oic.c
index 879da5d..53c5406 100644
--- a/hw/sensor/src/sensor_oic.c
+++ b/hw/sensor/src/sensor_oic.c
@@ -37,13 +37,16 @@
#include "sensor/quat.h"
#include "sensor/euler.h"
#include "sensor/color.h"
+#include "sensor/temperature.h"
+#include "sensor/pressure.h"
+#include "sensor/humidity.h"
/* OIC */
#include <oic/oc_rep.h>
#include <oic/oc_ri.h>
#include <oic/oc_api.h>
-static const char g_s_oic_dn[] = "x.mynewt.sensors.r.";
+static const char g_s_oic_dn[] = "x.mynewt.snsr.";
static int
sensor_oic_encode(struct sensor* sensor, void *arg, void *databuf)
@@ -126,17 +129,26 @@ sensor_oic_encode(struct sensor* sensor, void *arg, void *databuf)
/* Temperature supported */
case SENSOR_TYPE_TEMPERATURE:
- oc_rep_set_double(root, temp, *(double *)databuf);
+ if (((struct sensor_temp_data *)(databuf))->std_temp_is_valid) {
+ oc_rep_set_double(root, temp,
+ ((struct sensor_temp_data *)(databuf))->std_temp);
+ }
break;
/* Ambient temperature supported */
case SENSOR_TYPE_AMBIENT_TEMPERATURE:
- oc_rep_set_double(root, ambient_temp, *(double *)databuf);
+ if (((struct sensor_temp_data *)(databuf))->std_temp_is_valid) {
+ oc_rep_set_double(root, temp,
+ ((struct sensor_temp_data *)(databuf))->std_temp);
+ }
break;
/* Pressure sensor supported */
case SENSOR_TYPE_PRESSURE:
- oc_rep_set_uint(root, pressure, *(uint32_t *)databuf);
+ if (((struct sensor_press_data *)(databuf))->spd_press_is_valid) {
+ oc_rep_set_double(root, press,
+ ((struct sensor_press_data *)(databuf))->spd_press);
+ }
break;
#if 0
/* Proximity sensor supported */
@@ -144,7 +156,10 @@ sensor_oic_encode(struct sensor* sensor, void *arg, void *databuf)
#endif
/* Relative humidity supported */
case SENSOR_TYPE_RELATIVE_HUMIDITY:
- oc_rep_set_uint(root, humidity, *(uint32_t *)databuf);
+ if (((struct sensor_humid_data *)(databuf))->shd_humid_is_valid) {
+ oc_rep_set_double(root, humid,
+ ((struct sensor_humid_data *)(databuf))->shd_humid);
+ }
break;
/* Rotation vector (quaternion) supported */
@@ -577,7 +592,7 @@ sensor_oic_init(void)
res = oc_new_resource(tmpstr, 1, 0);
memset(tmpstr, 0, sizeof(tmpstr));
- snprintf(tmpstr, sizeof(tmpstr), "x.mynewt.sensors.r.%s", typename);
+ snprintf(tmpstr, sizeof(tmpstr), "%s%s", g_s_oic_dn, typename);
oc_resource_bind_resource_type(res, tmpstr);
oc_resource_bind_resource_interface(res, OC_IF_R);
oc_resource_set_default_interface(res, OC_IF_R);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/sensor/src/sensor_shell.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_shell.c b/hw/sensor/src/sensor_shell.c
index 69c1b94..318cbe6 100644
--- a/hw/sensor/src/sensor_shell.c
+++ b/hw/sensor/src/sensor_shell.c
@@ -292,10 +292,12 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
console_printf("\n");
}
- if (ctx->type == SENSOR_TYPE_TEMPERATURE) {
+ if (ctx->type == SENSOR_TYPE_TEMPERATURE ||
+ ctx->type == SENSOR_TYPE_AMBIENT_TEMPERATURE) {
+
std = (struct sensor_temp_data *) data;
if (std->std_temp_is_valid) {
- console_printf("temprature = %s", sensor_ftostr(std->std_temp, tmpstr, 13));
+ console_printf("temperature = %s Deg C", sensor_ftostr(std->std_temp, tmpstr, 13));
}
console_printf("\n");
}
@@ -385,7 +387,7 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
if (ctx->type == SENSOR_TYPE_RELATIVE_HUMIDITY) {
shd = (struct sensor_humid_data *) data;
if (shd->shd_humid_is_valid) {
- console_printf("relative humidity = %s",
+ console_printf("relative humidity = %s%%rh",
sensor_ftostr(shd->shd_humid, tmpstr, 13));
}
console_printf("\n");
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c9ca8275/hw/sensor/syscfg.yml
----------------------------------------------------------------------
diff --git a/hw/sensor/syscfg.yml b/hw/sensor/syscfg.yml
index 3495534..761d62b 100644
--- a/hw/sensor/syscfg.yml
+++ b/hw/sensor/syscfg.yml
@@ -32,3 +32,7 @@ syscfg.defs:
value: 1
restrictions:
- OC_SERVER
+
+ MATHLIB_SUPPORT:
+ description: 'Is MATHLIB support present'
+ value: 0