You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2017/05/17 09:55:52 UTC
[36/43] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
MYNEWT-748 SensorAPI: Add BME280 support
SensorAPI support for pressure, temperature and humidity
- Add temperature, pressure, humidity support
- change temperature handling for bno055
- fix bugs with register values
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/1dc16358
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/1dc16358
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/1dc16358
Branch: refs/heads/bluetooth5
Commit: 1dc1635810bd5b0eea1c3faed1675d9139e2a32d
Parents: 8d98e07
Author: Vipul Rahane <vi...@apache.org>
Authored: Tue May 2 18:52: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 +
.../sensors/bme280/include/bme280/bme280.h | 19 +
hw/drivers/sensors/bme280/src/bme280.c | 446 +++++++++++++++++--
hw/drivers/sensors/bme280/src/bme280_priv.h | 15 +-
hw/drivers/sensors/bme280/src/bme280_shell.c | 16 +-
.../sensors/bno055/include/bno055/bno055.h | 2 +-
hw/drivers/sensors/bno055/src/bno055.c | 32 +-
hw/sensor/include/sensor/humidity.h | 45 ++
hw/sensor/include/sensor/pressure.h | 45 ++
hw/sensor/include/sensor/temperature.h | 45 ++
hw/sensor/src/sensor_shell.c | 23 +-
11 files changed, 649 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index ce5f4bd..ace40af 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -400,6 +400,16 @@ 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_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[0].boc_oversample = BME280_SAMPLING_X1;
+ bmecfg.bc_boc[1].boc_oversample = BME280_SAMPLING_X1;
+ bmecfg.bc_boc[2].boc_oversample = BME280_SAMPLING_X1;
+
rc = bme280_config((struct bme280 *)dev, &bmecfg);
if (rc) {
os_dev_close(dev);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/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 4ef5d78..ff3daa3 100644
--- a/hw/drivers/sensors/bme280/include/bme280/bme280.h
+++ b/hw/drivers/sensors/bme280/include/bme280/bme280.h
@@ -93,6 +93,7 @@ struct bme280_cfg {
uint8_t bc_iir;
struct bme280_over_cfg bc_boc[3];
uint8_t bc_mode;
+ uint8_t bc_sby_dur;
};
struct bme280 {
@@ -234,6 +235,24 @@ int bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg);
int
bme280_get_chipid(uint8_t *chipid);
+/**
+ * Set the standy duration setting
+ *
+ * @param duration
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_set_sby_duration(uint8_t dur);
+
+/**
+ * Get the standy duration setting
+ *
+ * @param ptr to duration
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_sby_duration(uint8_t *dur);
+
#if MYNEWT_VAL(BME280_CLI)
int bme280_shell_init(void);
#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/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 e31cffc..7c66307 100644
--- a/hw/drivers/sensors/bme280/src/bme280.c
+++ b/hw/drivers/sensors/bme280/src/bme280.c
@@ -28,6 +28,9 @@
#include "hal/hal_spi.h"
#include "sensor/sensor.h"
#include "bme280/bme280.h"
+#include "sensor/humidity.h"
+#include "sensor/temperature.h"
+#include "sensor/pressure.h"
#include "bme280_priv.h"
#include "hal/hal_gpio.h"
@@ -46,6 +49,8 @@ static struct hal_spi_settings spi_bme280_settings = {
.word_size = HAL_SPI_WORD_SIZE_8BIT,
};
+struct bme280_calib_data bcd;
+
#if MYNEWT_VAL(BME280_STATS)
/* Define the stats section and records */
STATS_SECT_START(bme280_stat_section)
@@ -85,6 +90,8 @@ static const struct sensor_driver g_bme280_sensor_driver = {
bme280_sensor_get_config
};
+float g_t_fine;
+
static int
bme280_default_cfg(struct bme280_cfg *cfg)
{
@@ -186,13 +193,238 @@ bme280_sensor_get_interface(struct sensor *sensor, sensor_type_t type)
return (NULL);
}
+#if MYNEWT_VAL(BME280_SPEC_CALC)
+/**
+ * Returns temperature in DegC, as float
+ * 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)
+{
+ float 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);
+
+ g_t_fine = var1 + var2;
+
+ comptemp = (var1 + var2) / 5120.0;
+
+ return comptemp;
+}
+
+/**
+ * Returns pressure in Pa as float.
+ * 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)
+{
+ float var1, var2, p;
+ uint32_t temp;
+
+ if (!g_t_fine) {
+ if(!bme280_get_temperature(&temp)) {
+ (void)bme280_compensate_temperature(temp);
+ }
+ }
+
+ 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);
+
+ if (var1 == 0.0)
+ {
+ return 0;
+ }
+
+ p = 1048576.0 – (float)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;
+
+ p = p + (var1 + var2 + ((float)bcd->bcd_dig_P7)) / 16.0;
+
+ return p;
+}
+
+/**
+ * Returns humidity in %rH as float.
+ * 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)
+{
+ float h;
+ uint32_t temp;
+
+ if (!g_t_fine) {
+ if(!bme280_get_temperature(&temp)) {
+ (void)bme280_compensate_temperature(temp, 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 = h * (1.0 – ((float)bcd->bcd_dig_H1) * h / 524288.0);
+ if (h > 100.0) {
+ h = 100.0;
+ } else if (h < 0.0) {
+ h = 0.0;
+ }
+
+ return h;
+}
+
+#else
+
+/**
+ * Returns temperature in DegC, as float
+ * 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)
+{
+ float var1, var2, comptemp;
+
+ rawtemp >>= 4;
+
+ var1 = ((((rawtemp>>3) - ((int32_t)bcd->bcd_dig_T1 <<1))) *
+ ((int32_t)bcd->bcd_dig_T2)) >> 11;
+
+ var2 = (((((rawtemp>>4) - ((int32_t)bcd->bcd_dig_T1)) *
+ ((rawtemp>>4) - ((int32_t)bcd->bcd_dig_T1))) >> 12) *
+ ((int32_t)bcd->bcd_dig_T3)) >> 14;
+
+ g_t_fine = var1 + var2;
+
+ comptemp = ((int32_t)(g_t_fine * 5 + 128)) >> 8;
+
+ return comptemp/100;
+}
+
+/**
+ * Returns pressure in Pa as float.
+ * 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)
+{
+ float var1, var2, p;
+ uint32_t temp;
+
+ if (!g_t_fine) {
+ if(!bme280_get_temperature(&temp)) {
+ (void)bme280_compensate_temperature(temp, bcd);
+ }
+ }
+
+ rawpress >>= 4;
+
+ var1 = ((int64_t)g_t_fine) - 128000;
+ var2 = var1 * var1 * (int64_t)bcd->bcd_dig_P6;
+ var2 = var2 + ((int64_t)(var1*(int64_t)bcd->bcd_dig_P5) << 17);
+ var2 = var2 + (((int64_t)bcd->bcd_dig_P4) << 35);
+ var1 = ((int64_t)(var1 * var1 * (int64_t)bcd->bcd_dig_P3) >> 8) +
+ ((int64_t)(var1 * (int64_t)bcd->bcd_dig_P2) << 12);
+ var1 = (int64_t)((((((int64_t)1) << 47)+var1))*((int64_t)bcd->bcd_dig_P1)) >> 33;
+
+ if (var1 == 0) {
+ /* Avoid exception caused by division by zero */
+ return 0;
+ }
+
+ p = 1048576 - rawpress;
+ p = ((((int64_t)p << 31) - var2) * 3125) / var1;
+
+ var1 = (int64_t)(((int64_t)bcd->bcd_dig_P9) * ((int64_t)p >> 13) * ((int64_t)p >> 13)) >> 25;
+ var2 = (int64_t)(((int64_t)bcd->bcd_dig_P8) * (int64_t)p) >> 19;
+
+ p = ((int64_t)(p + var1 + var2) >> 8) + (((int64_t)bcd->bcd_dig_P7) << 4);
+
+ return (float)p/256;
+}
+
+/**
+ * Returns humidity in %rH as float.
+ * 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)
+{
+ float h;
+ uint32_t temp;
+ int32_t tmp32;
+
+ if (!g_t_fine) {
+ if(!bme280_get_temperature(&temp)) {
+ (void)bme280_compensate_temperature(temp, bcd);
+ }
+ }
+
+ tmp32 = (g_t_fine - ((int32_t)76800));
+
+ tmp32 = (((((rawhumid << 14) - (((int32_t)bcd->bcd_dig_H4) << 20) -
+ (((int32_t)bcd->bcd_dig_H5) * tmp32)) + ((int32_t)16384)) >> 15) *
+ (((((((tmp32 * ((int32_t)bcd->bcd_dig_H6)) >> 10) *
+ (((tmp32 * ((int32_t)bcd->bcd_dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
+ ((int32_t)2097152)) * ((int32_t)bcd->bcd_dig_H2) + 8192) >> 14));
+
+ tmp32 = (tmp32 - (((((tmp32 >> 15) * (tmp32 >> 15)) >> 7) *
+ ((int32_t)bcd->bcd_dig_H1)) >> 4));
+
+ tmp32 = (tmp32 < 0) ? 0 : tmp32;
+
+ tmp32 = (tmp32 > 419430400) ? 419430400 : tmp32;
+
+ h = (tmp32 >> 12);
+
+ return h / 1024.0;
+}
+
+#endif
+
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 temp;
- uint32_t press;
- uint32_t humid;
+ uint32_t rawtemp;
+ uint32_t rawpress;
+ uint32_t rawhumid;
+ struct sensor_temp_data std;
+ struct sensor_press_data spd;
+ struct sensor_humid_data shd;
int rc;
if (!(type & SENSOR_TYPE_PRESSURE) &&
@@ -202,19 +434,20 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
goto err;
}
- temp = press = humid = 0;
+ rawtemp = rawpress = rawhumid = 0;
/* Get a new pressure sample */
if (type & SENSOR_TYPE_PRESSURE) {
- rc = bme280_get_pressure(&press);
+ rc = bme280_get_pressure(&rawpress);
if (rc) {
goto err;
}
- //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+ spd.spd_press = bme280_compensate_pressure(rawpress, &bcd);
+ spd.spd_press_is_valid = 1;
/* Call data function */
- rc = data_func(sensor, data_arg, &press);
+ rc = data_func(sensor, data_arg, &spd);
if (rc) {
goto err;
}
@@ -222,15 +455,16 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
/* Get a new temperature sample */
if (type & SENSOR_TYPE_TEMPERATURE) {
- rc = bme280_get_temperature(&temp);
+ rc = bme280_get_temperature(&rawtemp);
if (rc) {
goto err;
}
- //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+ std.std_temp = bme280_compensate_temperature(rawtemp, &bcd);
+ std.std_temp_is_valid = 1;
/* Call data function */
- rc = data_func(sensor, data_arg, &temp);
+ rc = data_func(sensor, data_arg, &std);
if (rc) {
goto err;
}
@@ -238,15 +472,16 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
/* Get a new relative humidity sample */
if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
- rc = bme280_get_humidity(&humid);
+ rc = bme280_get_humidity(&rawhumid);
if (rc) {
goto err;
}
- //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+ shd.shd_humid = bme280_compensate_humidity(rawhumid, &bcd);
+ shd.shd_humid_is_valid = 1;
/* Call data function */
- rc = data_func(sensor, data_arg, &humid);
+ rc = data_func(sensor, data_arg, &shd);
if (rc) {
goto err;
}
@@ -270,7 +505,7 @@ bme280_sensor_get_config(struct sensor *sensor, sensor_type_t type,
goto err;
}
- cfg->sc_valtype = SENSOR_VALUE_TYPE_INT32;
+ cfg->sc_valtype = SENSOR_VALUE_TYPE_FLOAT;
return (0);
err:
@@ -278,6 +513,72 @@ err:
}
/**
+ * Check status to see if the sensor is reading calibration
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_is_calibrating(uint8_t *calibrating)
+{
+ uint8_t status;
+ int rc;
+
+ rc = bme280_readlen(BME280_REG_ADDR_STATUS, &status, 1);
+ if (rc) {
+ goto err;
+ }
+
+ *calibrating = (status & BME280_REG_STATUS_IM_UP) != 0;
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Get calibration info from the sensor
+ *
+ * @param ptr to the calib data info
+ * @return 0 in success, non-zero on failure
+ */
+static int
+bme280_get_calibinfo(struct bme280_calib_data *bcd)
+{
+ int rc;
+ uint8_t payload[33];
+
+ 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];
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
* Configure BME280 sensor
*
* @param Sensor device BME280 structure
@@ -290,6 +591,7 @@ bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
{
int rc;
uint8_t id;
+ uint8_t calibrating;
/* Check if we can read the chip address */
rc = bme280_get_chipid(&id);
@@ -311,11 +613,34 @@ bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
}
}
+ rc = bme280_reset();
+ if (rc) {
+ goto err;
+ }
+
+ os_time_delay((OS_TICKS_PER_SEC * 300)/1000 + 1);
+
+ calibrating = 1;
+
+ while(calibrating) {
+ rc = bme280_is_calibrating(&calibrating);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ rc = bme280_get_calibinfo(&bcd);
+ if (rc) {
+ goto err;
+ }
+
rc = bme280_set_iir(cfg->bc_iir);
if (rc) {
goto err;
}
+ os_time_delay((OS_TICKS_PER_SEC * 200)/1000 + 1);
+
bme280->cfg.bc_iir = cfg->bc_iir;
rc = bme280_set_mode(cfg->bc_mode);
@@ -323,9 +648,20 @@ bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
goto err;
}
+ os_time_delay((OS_TICKS_PER_SEC * 200)/1000 + 1);
+
bme280->cfg.bc_mode = cfg->bc_mode;
- if (!cfg->bc_boc[0].boc_type) {
+ rc = bme280_set_sby_duration(cfg->bc_sby_dur);
+ if (rc) {
+ goto err;
+ }
+
+ os_time_delay((OS_TICKS_PER_SEC * 200)/1000 + 1);
+
+ bme280->cfg.bc_sby_dur = cfg->bc_sby_dur;
+
+ if (cfg->bc_boc[0].boc_type) {
rc = bme280_set_oversample(cfg->bc_boc[0].boc_type,
cfg->bc_boc[0].boc_oversample);
if (rc) {
@@ -336,7 +672,7 @@ bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
bme280->cfg.bc_boc[0].boc_type = cfg->bc_boc[0].boc_type;
bme280->cfg.bc_boc[0].boc_oversample = cfg->bc_boc[0].boc_oversample;
- if (!cfg->bc_boc[1].boc_type) {
+ if (cfg->bc_boc[1].boc_type) {
rc = bme280_set_oversample(cfg->bc_boc[1].boc_type,
cfg->bc_boc[1].boc_oversample);
if (rc) {
@@ -347,7 +683,7 @@ bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
bme280->cfg.bc_boc[1].boc_type = cfg->bc_boc[1].boc_type;
bme280->cfg.bc_boc[1].boc_oversample = cfg->bc_boc[1].boc_oversample;
- if (!cfg->bc_boc[2].boc_type) {
+ if (cfg->bc_boc[2].boc_type) {
rc = bme280_set_oversample(cfg->bc_boc[2].boc_type,
cfg->bc_boc[2].boc_oversample);
if (rc) {
@@ -358,6 +694,9 @@ bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
bme280->cfg.bc_boc[2].boc_type = cfg->bc_boc[2].boc_type;
bme280->cfg.bc_boc[2].boc_oversample = cfg->bc_boc[2].boc_oversample;
+ os_time_delay((OS_TICKS_PER_SEC * 200)/1000 + 1);
+
+ return 0;
err:
return (rc);
}
@@ -426,7 +765,8 @@ bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len)
hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 0);
/* Send the address */
- rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), addr | BME280_SPI_READ_CMD_BIT);
+ rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM),
+ addr & ~BME280_SPI_READ_CMD_BIT);
if (rc == 0xFFFF) {
rc = SYS_EINVAL;
goto err;
@@ -531,7 +871,7 @@ bme280_reset(void)
{
uint8_t txdata;
- txdata = 1;
+ txdata = 0xB6;
return bme280_writelen(BME280_REG_ADDR_RESET, &txdata, 1);
}
@@ -632,9 +972,9 @@ bme280_set_mode(uint8_t mode)
goto err;
}
- mode = cfg | (mode & BME280_REG_CTRL_MEAS_MODE);
+ cfg = cfg | (mode & BME280_REG_CTRL_MEAS_MODE);
- rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &mode, 1);
+ rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
if (rc) {
goto err;
}
@@ -706,14 +1046,14 @@ bme280_set_oversample(sensor_type_t type, uint8_t oversample)
}
if (type & SENSOR_TYPE_TEMPERATURE) {
- oversample = cfg | ((oversample << 5) & BME280_REG_CTRL_MEAS_TOVER);
+ cfg = cfg | ((oversample << 5) & BME280_REG_CTRL_MEAS_TOVER);
}
if (type & SENSOR_TYPE_PRESSURE) {
- oversample = cfg | ((oversample << 3) & BME280_REG_CTRL_MEAS_POVER);
+ cfg = cfg | ((oversample << 2) & BME280_REG_CTRL_MEAS_POVER);
}
- rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &oversample, 1);
+ rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
if (rc) {
goto err;
}
@@ -725,9 +1065,9 @@ bme280_set_oversample(sensor_type_t type, uint8_t oversample)
goto err;
}
- oversample = cfg | (oversample & BME280_REG_CTRL_HUM_HOVER);
+ cfg = cfg | (oversample & BME280_REG_CTRL_HUM_HOVER);
- rc = bme280_writelen(BME280_REG_ADDR_CTRL_HUM, &oversample, 1);
+ rc = bme280_writelen(BME280_REG_ADDR_CTRL_HUM, &cfg, 1);
if (rc) {
goto err;
}
@@ -761,3 +1101,57 @@ bme280_get_chipid(uint8_t *chipid)
err:
return rc;
}
+
+/**
+ * Set the standy duration setting
+ *
+ * @param duration
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_set_sby_duration(uint8_t dur)
+{
+ int rc;
+ uint8_t cfg;
+
+ rc = bme280_readlen(BME280_REG_ADDR_CONFIG, &cfg, 1);
+ if (rc) {
+ goto err;
+ }
+
+ cfg = cfg | ((dur << 5) & BME280_REG_CONFIG_STANDBY);
+
+ rc = bme280_writelen(BME280_REG_ADDR_CONFIG, &cfg, 1);
+ if (rc) {
+ goto err;
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Get the standy duration setting
+ *
+ * @param ptr to duration
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_sby_duration(uint8_t *dur)
+{
+ int rc;
+ uint8_t tmp;
+
+ rc = bme280_readlen(BME280_REG_ADDR_CONFIG, &tmp, 1);
+ if (rc) {
+ goto err;
+ }
+
+ *dur = tmp & BME280_REG_CONFIG_STANDBY;
+
+ return 0;
+err:
+ return rc;
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/drivers/sensors/bme280/src/bme280_priv.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/src/bme280_priv.h b/hw/drivers/sensors/bme280/src/bme280_priv.h
index 23d0aaf..4b01e98 100644
--- a/hw/drivers/sensors/bme280/src/bme280_priv.h
+++ b/hw/drivers/sensors/bme280/src/bme280_priv.h
@@ -45,24 +45,23 @@
#define BME280_REG_ADDR_VERSION 0xD1
#define BME280_REG_ADDR_SOFTRESET 0xE0
-#define BME280_REG_ADDR_CAL26 0xE1 // R calibration stored in 0xE1-0xF0
+#define BME280_REG_ADDR_CAL26 0xE1 /* R calibration stored in 0xE1-0xF0 */
#define BME280_REG_ADDR_CTRL_HUM 0xF2
-#define BME280_REG_CTRL_HUM_NONE (0x1F)
-#define BME280_REG_CTRL_HUM_HOVER (0x11)
+#define BME280_REG_CTRL_HUM_HOVER (0x7)
#define BME280_REG_ADDR_STATUS 0XF3
#define BME280_REG_STATUS_MEAS 0x04
#define BME280_REG_STATUS_IM_UP 0x01
#define BME280_REG_ADDR_CTRL_MEAS 0xF4
-#define BME280_REG_CTRL_MEAS_TOVER (0x11 << 5)
-#define BME280_REG_CTRL_MEAS_POVER (0x11 << 3)
-#define BME280_REG_CTRL_MEAS_MODE (0x11)
+#define BME280_REG_CTRL_MEAS_TOVER (0x7 << 5)
+#define BME280_REG_CTRL_MEAS_POVER (0x7 << 2)
+#define BME280_REG_CTRL_MEAS_MODE (0x3)
#define BME280_REG_ADDR_CONFIG 0xF5
-#define BME280_REG_CONFIG_STANDBY (0x11 << 5)
-#define BME280_REG_CONFIG_FILTER (0x11 << 3)
+#define BME280_REG_CONFIG_STANDBY (0x7 << 5)
+#define BME280_REG_CONFIG_FILTER (0x7 << 3)
#define BME280_REG_CONFIG_SPI3_EN (0x1)
#define BME280_REG_ADDR_PRESS 0xF7
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/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 78f5d2e..aeea071 100644
--- a/hw/drivers/sensors/bme280/src/bme280_shell.c
+++ b/hw/drivers/sensors/bme280/src/bme280_shell.c
@@ -82,12 +82,12 @@ bme280_shell_help(void)
console_printf("%s cmd [flags...]\n", bme280_shell_cmd_struct.sc_cmd);
console_printf("cmd:\n");
console_printf("\tr [n_samples]\n");
- console_printf("\tmode [0-sleep | 1-forced | 3-normal]\n");
- console_printf("\tiir [1-enabled | 0-disabled]");
+ console_printf("\tmode [0-sleep | 1/2-forced | 3-normal]\n");
+ console_printf("\tiir [1-enabled | 0-disabled]\n");
console_printf("\toversample [type 5-temperature | 6-pressure | 8-humidity]\n"
" [0-none | 1-x1 | 2-x2 | 3-x4 | 4-x8 | 5-x16]\n");
console_printf("\treset\n");
- console_printf("\tchip_id");
+ console_printf("\tchipid\n");
console_printf("\tdump\n");
return 0;
@@ -104,7 +104,7 @@ bme280_shell_cmd_read_chipid(int argc, char **argv)
goto err;
}
- console_printf("CHIP_ID:%02X", chipid);
+ console_printf("CHIP_ID:0x%02X\n", chipid);
return 0;
err:
@@ -159,7 +159,7 @@ bme280_shell_cmd_read(int argc, char **argv)
return rc;
}
- console_printf("temperature: %u\tpressure: %u\thumidity: %u\n",
+ console_printf("temperature: %u pressure: %u\thumidity: %u\n",
(unsigned int)temp, (unsigned int)press,
(unsigned int)humid);
}
@@ -235,9 +235,9 @@ bme280_shell_cmd_mode(int argc, char **argv)
console_printf("mode: %u", mode);
}
- /* Chaneg mode */
+ /* Change mode */
if (argc == 3) {
- if (bme280_shell_stol(argv[2], 0, 1, &val)) {
+ if (bme280_shell_stol(argv[2], 0, 3, &val)) {
return bme280_shell_err_invalid_arg(argv[2]);
}
rc = bme280_set_mode(val);
@@ -268,7 +268,7 @@ bme280_shell_cmd_iir(int argc, char **argv)
if (rc) {
goto err;
}
- console_printf("IIR: %02X", iir);
+ console_printf("IIR: 0x%02X", iir);
}
/* Enable/disable iir*/
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/drivers/sensors/bno055/include/bno055/bno055.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bno055/include/bno055/bno055.h b/hw/drivers/sensors/bno055/include/bno055/bno055.h
index af1c836..f453871 100644
--- a/hw/drivers/sensors/bno055/include/bno055/bno055.h
+++ b/hw/drivers/sensors/bno055/include/bno055/bno055.h
@@ -223,7 +223,7 @@ bno055_get_quat_data(void *sqd);
* @return temperature in degree celcius
*/
int
-bno055_get_temp(int8_t *temp);
+bno055_get_temp(uint8_t *temp);
/**
* Gets current calibration status
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/drivers/sensors/bno055/src/bno055.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bno055/src/bno055.c b/hw/drivers/sensors/bno055/src/bno055.c
index 7502c5b..49eeb6e 100644
--- a/hw/drivers/sensors/bno055/src/bno055.c
+++ b/hw/drivers/sensors/bno055/src/bno055.c
@@ -30,6 +30,7 @@
#include "sensor/mag.h"
#include "sensor/quat.h"
#include "sensor/euler.h"
+#include "sensor/temperature.h"
#include "bno055/bno055.h"
#include "bno055_priv.h"
@@ -1018,13 +1019,13 @@ err:
* @return 0 on success, non-zero on error
*/
int
-bno055_get_temp(int8_t *temp)
+bno055_get_temp(uint8_t *temp)
{
int rc;
uint8_t units;
uint8_t div;
- rc = bno055_read8(BNO055_TEMP_ADDR, (uint8_t *)temp);
+ rc = bno055_read8(BNO055_TEMP_ADDR, temp);
if (rc) {
goto err;
}
@@ -1044,6 +1045,31 @@ err:
}
/**
+ * Get temperature data from bno055 sensor and mark it valid
+ *
+ * @param pointer to the temperature data structure
+ * @return 0 on success, non-zero on error
+ */
+static int
+bno055_get_temp_data(struct sensor_temp_data *std)
+{
+ int rc;
+ uint8_t temp;
+
+ rc = bno055_get_temp(&temp);
+ if (rc) {
+ goto err;
+ }
+
+ std->std_temp = temp;
+ std->std_temp_is_valid = 1;
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
* Get sensor data of specific type. This function also allocates a buffer
* to fill up the data in.
*
@@ -1071,7 +1097,7 @@ bno055_sensor_read(struct sensor *sensor, sensor_type_t type,
goto err;
}
} else if (type == SENSOR_TYPE_TEMPERATURE) {
- rc = bno055_get_temp(databuf);
+ rc = bno055_get_temp_data(databuf);
if (rc) {
goto err;
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/sensor/include/sensor/humidity.h
----------------------------------------------------------------------
diff --git a/hw/sensor/include/sensor/humidity.h b/hw/sensor/include/sensor/humidity.h
new file mode 100644
index 0000000..40f5350
--- /dev/null
+++ b/hw/sensor/include/sensor/humidity.h
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef __SENSOR_HUMIDITY_H__
+#define __SENSOR_HUMIDITY_H__
+
+#include "os/os.h"
+#include "os/os_dev.h"
+#include "sensor/sensor.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Data representing a singular read from a pressure sensor
+ * All values are in %rH
+ */
+struct sensor_humid_data {
+ float shd_humid;
+
+ /* Validity */
+ uint8_t shd_humid_is_valid:1;
+} __attribute__((packed));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SENSOR_HUMIDITY_H__ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/sensor/include/sensor/pressure.h
----------------------------------------------------------------------
diff --git a/hw/sensor/include/sensor/pressure.h b/hw/sensor/include/sensor/pressure.h
new file mode 100644
index 0000000..425fd91
--- /dev/null
+++ b/hw/sensor/include/sensor/pressure.h
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef __SENSOR_PRESSURE_H__
+#define __SENSOR_PRESSURE_H__
+
+#include "os/os.h"
+#include "os/os_dev.h"
+#include "sensor/sensor.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Data representing a singular read from a pressure sensor
+ * All values are in Pa
+ */
+struct sensor_press_data {
+ float spd_press;
+
+ /* Validity */
+ uint8_t spd_press_is_valid:1;
+} __attribute__((packed));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SENSOR_PRESSURE_H__ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/sensor/include/sensor/temperature.h
----------------------------------------------------------------------
diff --git a/hw/sensor/include/sensor/temperature.h b/hw/sensor/include/sensor/temperature.h
new file mode 100644
index 0000000..247631f
--- /dev/null
+++ b/hw/sensor/include/sensor/temperature.h
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef __SENSOR_TEMPERATURE_H__
+#define __SENSOR_TEMPERATURE_H__
+
+#include "os/os.h"
+#include "os/os_dev.h"
+#include "sensor/sensor.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Data representing a singular read from a temperature sensor
+ * All values are in Deg C
+ */
+struct sensor_temp_data {
+ float std_temp;
+
+ /* Validity */
+ uint8_t std_temp_is_valid:1;
+} __attribute__((packed));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SENSOR_TEMPERATURE_H__ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1dc16358/hw/sensor/src/sensor_shell.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_shell.c b/hw/sensor/src/sensor_shell.c
index ebe3b1b..69c1b94 100644
--- a/hw/sensor/src/sensor_shell.c
+++ b/hw/sensor/src/sensor_shell.c
@@ -37,6 +37,9 @@
#include "sensor/quat.h"
#include "sensor/euler.h"
#include "sensor/color.h"
+#include "sensor/temperature.h"
+#include "sensor/pressure.h"
+#include "sensor/humidity.h"
#include "console/console.h"
#include "shell/shell.h"
#include "hal/hal_i2c.h"
@@ -230,6 +233,9 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
struct sensor_euler_data *sed;
struct sensor_quat_data *sqd;
struct sensor_color_data *scd;
+ struct sensor_temp_data *std;
+ struct sensor_press_data *spd;
+ struct sensor_humid_data *shd;
char tmpstr[13];
ctx = (struct sensor_shell_read_ctx *) arg;
@@ -287,7 +293,10 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
}
if (ctx->type == SENSOR_TYPE_TEMPERATURE) {
- console_printf("temprature = %d", *(int *)data);
+ 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("\n");
}
@@ -365,12 +374,20 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
}
if (ctx->type == SENSOR_TYPE_PRESSURE) {
- console_printf("pressure = %d", *(int *)data);
+ spd = (struct sensor_press_data *) data;
+ if (spd->spd_press_is_valid) {
+ console_printf("pressure = %s Pa",
+ sensor_ftostr(spd->spd_press, tmpstr, 13));
+ }
console_printf("\n");
}
if (ctx->type == SENSOR_TYPE_RELATIVE_HUMIDITY) {
- console_printf("relative humidity = %d", *(int *)data);
+ shd = (struct sensor_humid_data *) data;
+ if (shd->shd_humid_is_valid) {
+ console_printf("relative humidity = %s",
+ sensor_ftostr(shd->shd_humid, tmpstr, 13));
+ }
console_printf("\n");
}