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:15 UTC
[1/6] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
Repository: incubator-mynewt-core
Updated Branches:
refs/heads/master afc404f83 -> b26a78d8f
MYNEWT-748 SensorAPI: Add BME280 support
- SensorAPI pressure, temperature and humidity support
- Compiles
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/ad7cdf09
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/ad7cdf09
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/ad7cdf09
Branch: refs/heads/master
Commit: ad7cdf093a9cf325df02b4a27bcf1d70529dce9f
Parents: afc404f
Author: Vipul Rahane <vi...@apache.org>
Authored: Mon Apr 24 11:54:02 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri May 12 17:08:08 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/pkg.yml | 1 +
apps/sensors_test/src/main.c | 20 +
apps/sensors_test/syscfg.yml | 10 +-
hw/bsp/nrf52dk/src/hal_bsp.c | 12 +
.../sensors/bme280/include/bme280/bme280.h | 245 +++++++
hw/drivers/sensors/bme280/pkg.yml | 32 +
hw/drivers/sensors/bme280/src/bme280.c | 714 +++++++++++++++++++
hw/drivers/sensors/bme280/src/bme280_priv.h | 110 +++
hw/drivers/sensors/bme280/src/bme280_shell.c | 364 ++++++++++
hw/drivers/sensors/bme280/syscfg.yml | 38 +
hw/sensor/src/sensor_shell.c | 14 +-
11 files changed, 1554 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/apps/sensors_test/pkg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/pkg.yml b/apps/sensors_test/pkg.yml
index 4f8e25c..9f56e7b 100644
--- a/apps/sensors_test/pkg.yml
+++ b/apps/sensors_test/pkg.yml
@@ -33,6 +33,7 @@ pkg.deps:
- hw/drivers/sensors/tsl2561
- hw/drivers/sensors/bno055
- hw/drivers/sensors/tcs34725
+ - hw/drivers/sensors/bme280
- boot/bootutil
- sys/shell
- sys/config
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index d05cb94..152d48e 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -34,6 +34,7 @@
#include <tsl2561/tsl2561.h>
#include <tcs34725/tcs34725.h>
#include <bno055/bno055.h>
+#include <bme280/bme280.h>
#include "flash_map/flash_map.h"
#include <hal/hal_system.h>
#if MYNEWT_VAL(SPLIT_LOADER)
@@ -386,6 +387,25 @@ config_sensor(void)
struct os_dev *dev;
int rc;
+#if MYNEWT_VAL(BME280_PRESENT)
+ struct bme280_cfg bmecfg;
+
+ dev = (struct os_dev *) os_dev_open("bme280", OS_TIMEOUT_NEVER, NULL);
+ assert(dev != NULL);
+ rc = bme280_init(dev, NULL);
+ if (rc) {
+ os_dev_close(dev);
+ goto err;
+ }
+
+ rc = bme280_config((struct bme280 *)dev, &bmecfg);
+ if (rc) {
+ os_dev_close(dev);
+ goto err;
+ }
+ os_dev_close(dev);
+#endif
+
#if MYNEWT_VAL(TCS34725_PRESENT)
struct tcs34725_cfg tcscfg;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/apps/sensors_test/syscfg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/syscfg.yml b/apps/sensors_test/syscfg.yml
index 81876bc..8172a62 100644
--- a/apps/sensors_test/syscfg.yml
+++ b/apps/sensors_test/syscfg.yml
@@ -42,8 +42,9 @@ syscfg.vals:
CONFIG_NEWTMGR: 0
TSL2561_CLI: 0
- BNO055_CLI: 1
- TCS34725_CLI: 1
+ BNO055_CLI: 0
+ TCS34725_CLI: 0
+ BME280_CLI: 0
# Setup Sensor BLE OIC GATT Server
SENSOR_OIC: 1
@@ -65,10 +66,13 @@ syscfg.defs:
value : 0
BNO055_PRESENT:
description: 'BNO055 is present'
+ value : 0
+ BME280_PRESENT:
+ description: 'BME280 is present'
value : 1
TCS34725_PRESENT:
description: 'TCS34725 is present'
- value : 1
+ value : 0
SIM_ACCEL_PRESENT:
description: 'SIM ACCEL is present'
value : 0
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/bsp/nrf52dk/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf52dk/src/hal_bsp.c b/hw/bsp/nrf52dk/src/hal_bsp.c
index c0031b1..46c084d 100644
--- a/hw/bsp/nrf52dk/src/hal_bsp.c
+++ b/hw/bsp/nrf52dk/src/hal_bsp.c
@@ -55,6 +55,9 @@ static struct lsm303dlhc lsm303dlhc;
#if MYNEWT_VAL(TCS34725_PRESENT)
#include <tcs34725/tcs34725.h>
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+#include <bme280/bme280.h>
+#endif
#if MYNEWT_VAL(LSM303DLHC_PRESENT)
static struct lsm303dlhc lsm303dlhc;
@@ -72,6 +75,10 @@ static struct tsl2561 tsl2561;
static struct tcs34725 tcs34725;
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+static struct bme280 bme280;
+#endif
+
#if MYNEWT_VAL(UART_0)
static struct uart_dev os_bsp_uart0;
static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
@@ -234,6 +241,11 @@ sensor_dev_create(void)
assert(rc == 0);
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+ rc = os_dev_create((struct os_dev *) &bme280, "bme280",
+ OS_DEV_INIT_PRIMARY, 0, color_init, NULL);
+ assert(rc == 0);
+#endif
}
void
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/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
new file mode 100644
index 0000000..f5ea131
--- /dev/null
+++ b/hw/drivers/sensors/bme280/include/bme280/bme280.h
@@ -0,0 +1,245 @@
+/*
+ * 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 __BME280_H__
+#define __BME280_H__
+
+#include <os/os.h>
+#include "os/os_dev.h"
+#include "sensor/sensor.h"
+
+#define BME280_SPI_READ_CMD_BIT 0x80
+
+/* Sampling */
+#define BME280_SAMPLING_NONE 0x0
+#define BME280_SAMPLING_X1 0x1
+#define BME280_SAMPLING_X2 0x2
+#define BME280_SAMPLING_X4 0x3
+#define BME280_SAMPLING_X8 0x4
+#define BME280_SAMPLING_X16 0x5
+
+/* Operating modes */
+#define BME280_MODE_SLEEP 0x0
+#define BME280_MODE_FORCED 0x1
+#define BME280_MODE_NORMAL 0x3
+
+/* Filter settings */
+#define BME280_FILTER_OFF 0x0
+#define BME280_FILTER_X2 0x1
+#define BME280_FILTER_X4 0x2
+#define BME280_FILTER_X8 0x3
+#define BME280_FILTER_X16 0x4
+
+/* Standby durations in ms */
+#define BME280_STANDBY_MS_0_5 0x0
+#define BME280_STANDBY_MS_10 0x6
+#define BME280_STANDBY_MS_20 0x7
+#define BME280_STANDBY_MS_62_5 0x1
+#define BME280_STANDBY_MS_125 0x2
+#define BME280_STANDBY_MS_250 0x3
+#define BME280_STANDBY_MS_500 0x4
+#define BME280_STANDBY_MS_1000 0x5
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct bme280_calib_data {
+ uint16_t bcd_dig_T1;
+ int16_t bcd_dig_T2;
+ int16_t bcd_dig_T3;
+
+ uint16_t bcd_dig_P1;
+ int16_t bcd_dig_P2;
+ int16_t bcd_dig_P3;
+ int16_t bcd_dig_P4;
+ int16_t bcd_dig_P5;
+ int16_t bcd_dig_P6;
+ int16_t bcd_dig_P7;
+ int16_t bcd_dig_P8;
+ int16_t bcd_dig_P9;
+
+ uint8_t bcd_dig_H1;
+ int16_t bcd_dig_H2;
+ uint8_t bcd_dig_H3;
+ int16_t bcd_dig_H4;
+ int16_t bcd_dig_H5;
+ int8_t bcd_dig_H6;
+};
+
+struct bme280_over_cfg {
+ sensor_type_t boc_type;
+ uint8_t boc_oversample;
+};
+
+struct bme280_cfg {
+ uint8_t bc_iir;
+ struct bme280_over_cfg bc_boc[3];
+ uint8_t bc_mode;
+};
+
+struct bme280 {
+ struct os_dev dev;
+ struct sensor sensor;
+ struct bme280_cfg cfg;
+ os_time_t last_read_time;
+};
+
+/**
+ * Initialize the bme280.
+ *
+ * @param dev Pointer to the bme280_dev device descriptor
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_init(struct os_dev *dev, void *arg);
+
+/**
+ * Sets IIR filter
+ *
+ * @param filter setting
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_set_iir(uint8_t iir);
+
+/**
+ * Get IIR filter setting
+ *
+ * @param ptr to fill up iir setting into
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+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);
+
+/**
+ * Gets pressure
+ *
+ * @param pressure
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_pressure(uint32_t *press);
+
+/**
+ * Gets humidity
+ *
+ * @param humidity
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_humidity(uint32_t *humidity);
+
+/**
+ * Sets the sampling rate
+ *
+ * @param sensor type
+ * @param sampling rate
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_set_oversample(sensor_type_t type, uint8_t rate);
+
+/**
+ * Gets the current sampling rate for the type of sensor
+ *
+ * @param Type of sensor to return sampling rate
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int bme280_get_oversample(sensor_type_t type, uint8_t *rate);
+
+/**
+ * Sets the operating mode
+ *
+ * @param mode
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_set_mode(uint8_t mode);
+
+/**
+ * Gets the operating mode
+ *
+ * @param ptr to the mode variable to be filled up
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_mode(uint8_t *mode);
+
+/**
+ * Resets the BME280 chip
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_reset(void);
+
+/**
+ * Configure BME280 sensor
+ *
+ * @param Sensor device BME280 structure
+ * @param Sensor device BME280 config
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg);
+
+/**
+ * Get the chip id
+ *
+ * @param ptr to fill up the chip id
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_chipid(uint8_t *chipid);
+
+#if MYNEWT_VAL(BME280_CLI)
+int bme280_shell_init(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BME280_H__ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/pkg.yml
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/pkg.yml b/hw/drivers/sensors/bme280/pkg.yml
new file mode 100644
index 0000000..496e35e
--- /dev/null
+++ b/hw/drivers/sensors/bme280/pkg.yml
@@ -0,0 +1,32 @@
+#
+# 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.
+#
+
+pkg.name: hw/drivers/sensors/bme280
+pkg.description: Driver for the BME280 light to digital sensor
+pkg.author: "Vipul Rahane <vi...@runtime.io>"
+pkg.homepage: "http://www.runtime.io/"
+pkg.keywords:
+ - adafruit
+ - bme280
+ - spi
+ - sensor
+
+pkg.deps:
+ - "@apache-mynewt-core/kernel/os"
+ - "@apache-mynewt-core/hw/hal"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/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
new file mode 100644
index 0000000..ca5ee0a
--- /dev/null
+++ b/hw/drivers/sensors/bme280/src/bme280.c
@@ -0,0 +1,714 @@
+/*
+ * 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.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include "defs/error.h"
+#include "os/os.h"
+#include "sysinit/sysinit.h"
+#include "hal/hal_spi.h"
+#include "sensor/sensor.h"
+#include "bme280/bme280.h"
+#include "bme280_priv.h"
+#include "hal/hal_gpio.h"
+
+#if MYNEWT_VAL(BME280_LOG)
+#include "log/log.h"
+#endif
+
+#if MYNEWT_VAL(BME280_STATS)
+#include "stats/stats.h"
+#endif
+
+static struct hal_spi_settings spi_bme280_settings = {
+ .data_order = HAL_SPI_MSB_FIRST,
+ .data_mode = HAL_SPI_MODE0,
+ .baudrate = 500,
+ .word_size = HAL_SPI_WORD_SIZE_8BIT,
+};
+
+#if MYNEWT_VAL(BME280_STATS)
+/* Define the stats section and records */
+STATS_SECT_START(bme280_stat_section)
+ STATS_SECT_ENTRY(errors)
+STATS_SECT_END
+
+/* Define stat names for querying */
+STATS_NAME_START(bme280_stat_section)
+ STATS_NAME(bme280_stat_section, errors)
+STATS_NAME_END(bme280_stat_section)
+
+/* Global variable used to hold stats data */
+STATS_SECT_DECL(bme280_stat_section) g_bme280stats;
+#endif
+
+#if MYNEWT_VAL(BME280_LOG)
+#define LOG_MODULE_BME280 (2561)
+#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;
+#else
+#define BME280_INFO(...)
+#define BME280_ERR(...)
+#endif
+
+/* Exports for the sensor interface.
+ */
+static void *bme280_sensor_get_interface(struct sensor *, sensor_type_t);
+static int bme280_sensor_read(struct sensor *, sensor_type_t,
+ sensor_data_func_t, void *, uint32_t);
+static int bme280_sensor_get_config(struct sensor *, sensor_type_t,
+ struct sensor_cfg *);
+
+static const struct sensor_driver g_bme280_sensor_driver = {
+ bme280_sensor_get_interface,
+ bme280_sensor_read,
+ bme280_sensor_get_config
+};
+
+static int
+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_oversample = BME280_SAMPLING_NONE;
+ cfg->bc_boc[1].boc_type = SENSOR_TYPE_PRESSURE;
+ cfg->bc_boc[1].boc_oversample = BME280_SAMPLING_NONE;
+ cfg->bc_boc[2].boc_type = SENSOR_TYPE_RELATIVE_HUMIDITY;
+ cfg->bc_boc[2].boc_oversample = BME280_SAMPLING_NONE;
+
+ return 0;
+}
+
+/**
+ * Expects to be called back through os_dev_create().
+ *
+ * @param The device object associated with bme280
+ * @param Argument passed to OS device init, unused
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+int
+bme280_init(struct os_dev *dev, void *arg)
+{
+ struct bme280 *bme280;
+ struct sensor *sensor;
+ int rc;
+
+ bme280 = (struct bme280 *) dev;
+
+ rc = bme280_default_cfg(&bme280->cfg);
+ if (rc) {
+ goto err;
+ }
+
+#if MYNEWT_VAL(BME280_LOG)
+ log_register("bme280", &_log, &log_console_handler, NULL, LOG_SYSLEVEL);
+#endif
+
+ sensor = &bme280->sensor;
+
+#if MYNEWT_VAL(BME280_STATS)
+ /* Initialise the stats entry */
+ rc = stats_init(
+ STATS_HDR(g_bme280stats),
+ STATS_SIZE_INIT_PARMS(g_bme280stats, STATS_SIZE_32),
+ STATS_NAME_INIT_PARMS(bme280_stat_section));
+ SYSINIT_PANIC_ASSERT(rc == 0);
+ /* Register the entry with the stats registry */
+ rc = stats_register("bme280", STATS_HDR(g_bme280stats));
+ SYSINIT_PANIC_ASSERT(rc == 0);
+#endif
+ rc = sensor_init(sensor, dev);
+ if (rc != 0) {
+ goto err;
+ }
+
+ /* Add the driver */
+ rc = sensor_set_driver(sensor, SENSOR_TYPE_TEMPERATURE |
+ SENSOR_TYPE_PRESSURE |
+ SENSOR_TYPE_RELATIVE_HUMIDITY,
+ (struct sensor_driver *) &g_bme280_sensor_driver);
+ if (rc != 0) {
+ goto err;
+ }
+
+ rc = sensor_mgr_register(sensor);
+ if (rc != 0) {
+ goto err;
+ }
+
+ rc = hal_spi_config(MYNEWT_VAL(BME280_SPINUM), &spi_bme280_settings);
+ if (rc) {
+ goto err;
+ }
+
+ rc = hal_spi_enable(MYNEWT_VAL(BME280_SPINUM));
+ if (rc) {
+ goto err;
+ }
+
+ rc = hal_gpio_init_out(MYNEWT_VAL(BME280_CSPIN), 1);
+ if (rc) {
+ goto err;
+ }
+
+ return (0);
+err:
+ return (rc);
+
+}
+
+static void *
+bme280_sensor_get_interface(struct sensor *sensor, sensor_type_t type)
+{
+ return (NULL);
+}
+
+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;
+ int rc;
+
+ if (!(type & SENSOR_TYPE_PRESSURE) ||
+ !(type & SENSOR_TYPE_TEMPERATURE) ||
+ !(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
+ rc = SYS_EINVAL;
+ goto err;
+ }
+
+ temp = press = humid = 0;
+
+ /* Get a new pressure sample */
+ if (type & SENSOR_TYPE_PRESSURE) {
+ rc = bme280_get_pressure(&press);
+ if (rc) {
+ goto err;
+ }
+
+ //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+
+ /* Call data function */
+ rc = data_func(sensor, data_arg, &press);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ /* Get a new temperature sample */
+ if (type & SENSOR_TYPE_TEMPERATURE) {
+ rc = bme280_get_temperature(&temp);
+ if (rc) {
+ goto err;
+ }
+
+ //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+
+ /* Call data function */
+ rc = data_func(sensor, data_arg, &temp);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ /* Get a new relative humidity sample */
+ if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
+ rc = bme280_get_humidity(&humid);
+ if (rc) {
+ goto err;
+ }
+
+ //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+
+ /* Call data function */
+ rc = data_func(sensor, data_arg, &humid);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+static int
+bme280_sensor_get_config(struct sensor *sensor, sensor_type_t type,
+ struct sensor_cfg *cfg)
+{
+ int rc;
+
+ if (!(type & SENSOR_TYPE_PRESSURE) ||
+ !(type & SENSOR_TYPE_TEMPERATURE) ||
+ !(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
+ rc = SYS_EINVAL;
+ goto err;
+ }
+
+ cfg->sc_valtype = SENSOR_VALUE_TYPE_INT32;
+
+ return (0);
+err:
+ return (rc);
+}
+
+/**
+ * Configure BME280 sensor
+ *
+ * @param Sensor device BME280 structure
+ * @param Sensor device BME280 config
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
+{
+ int rc;
+
+ rc = bme280_set_iir(cfg->bc_iir);
+
+ rc |= bme280_set_mode(cfg->bc_mode);
+
+ rc |= bme280_set_oversample(cfg->bc_boc[0].boc_type,
+ cfg->bc_boc[0].boc_oversample);
+
+ rc |= bme280_set_oversample(cfg->bc_boc[1].boc_type,
+ cfg->bc_boc[1].boc_oversample);
+
+ rc |= bme280_set_oversample(cfg->bc_boc[2].boc_type,
+ cfg->bc_boc[2].boc_oversample);
+
+ if (rc) {
+ goto err;
+ }
+
+ /* Overwrite the configuration data. */
+ memcpy(&bme280->cfg, cfg, sizeof(*cfg));
+
+err:
+ return (rc);
+}
+
+/**
+ * Read multiple length data from BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to read
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len)
+{
+ int i;
+ int rc;
+ uint8_t txdata;
+ uint8_t rxdata;
+
+ /* Select the device */
+ 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);
+ if (rc) {
+ goto err;
+ }
+
+ txdata = 0;
+
+ for (i = 0; i < len; i++) {
+ /* Read data */
+ rc = hal_spi_txrx(MYNEWT_VAL(BME280_SPINUM), &txdata, &rxdata, 1);
+ if (rc) {
+ goto err;
+ }
+
+ payload[i] = rxdata;
+ }
+
+ /* De-select the device */
+ hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Write multiple length data to BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to write
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len)
+{
+ int i;
+ int rc;
+
+ /* Select the device */
+ 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);
+ if (rc) {
+ goto err;
+ }
+
+ for (i = 0; i < len; i++) {
+ /* Read data */
+ rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), payload[i]);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ /* De-select the device */
+ hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Gets temperature
+ *
+ * @param temperature
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_temperature(uint32_t *temp)
+{
+ int rc;
+ uint8_t tmp[3];
+
+ rc = bme280_readlen(BME280_REG_ADDR_TEMP, tmp, 3);
+ if (rc) {
+ goto err;
+ }
+
+ *temp = (tmp[1] << 8 | tmp[0]) << 4 | (tmp[2] >> 4);
+
+err:
+ return rc;
+}
+
+/**
+ * Gets humidity
+ *
+ * @param humidity
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_humidity(uint32_t *humid)
+{
+ int rc;
+ uint8_t tmp[2];
+
+ rc = bme280_readlen(BME280_REG_ADDR_HUM, tmp, 2);
+ if (rc) {
+ goto err;
+ }
+
+ *humid = (tmp[1] << 8 | tmp[0]);
+
+err:
+ return rc;
+}
+
+/**
+ * Gets pressure
+ *
+ * @param pressure
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_pressure(uint32_t *press)
+{
+ int rc;
+ uint8_t tmp[3];
+
+ rc = bme280_readlen(BME280_REG_ADDR_PRESS, tmp, 2);
+ if (rc) {
+ goto err;
+ }
+
+ *press = (tmp[1] << 8 | tmp[0]) << 4 | (tmp[2] >> 4);
+
+err:
+ return rc;
+}
+
+/**
+ * Resets the BME280 chip
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_reset(void)
+{
+ uint8_t txdata;
+
+ txdata = 1;
+
+ return bme280_writelen(BME280_REG_ADDR_RESET, &txdata, 1);
+}
+
+/**
+ * Get IIR filter setting
+ *
+ * @param ptr to fill up iir setting into
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_iir(uint8_t *iir)
+{
+ int rc;
+ uint8_t tmp;
+
+ rc = bme280_readlen(BME280_REG_ADDR_CONFIG, &tmp, 1);
+ if (rc) {
+ goto err;
+ }
+
+ *iir = ((tmp & BME280_REG_CONFIG_FILTER) >> 5);
+
+err:
+ return rc;
+}
+
+/**
+ * Sets IIR filter
+ *
+ * @param filter setting
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_set_iir(uint8_t iir)
+{
+ int rc;
+ uint8_t cfg;
+
+ rc = bme280_readlen(BME280_REG_ADDR_CONFIG, &cfg, 1);
+ if (rc) {
+ goto err;
+ }
+
+ iir = cfg | ((iir << 5) & BME280_REG_CONFIG_FILTER);
+
+ rc = bme280_writelen(BME280_REG_ADDR_CONFIG, &iir, 1);
+ if (rc) {
+ goto err;
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Gets the operating mode
+ *
+ * @param ptr to the mode variable to be filled up
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_mode(uint8_t *mode)
+{
+ int rc;
+ uint8_t tmp;
+
+ rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &tmp, 1);
+ if (rc) {
+ goto err;
+ }
+
+ *mode = (tmp & BME280_REG_CTRL_MEAS_MODE);
+
+err:
+ return rc;
+}
+
+/**
+ * Sets the operating mode
+ *
+ * @param mode
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_set_mode(uint8_t mode)
+{
+ int rc;
+ uint8_t cfg;
+
+ rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
+ if (rc) {
+ goto err;
+ }
+
+ mode = cfg | (mode & BME280_REG_CTRL_MEAS_MODE);
+
+ rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &mode, 1);
+ if (rc) {
+ goto err;
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Gets the current sampling rate for the type of sensor
+ *
+ * @param Type of sensor to return sampling rate
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_oversample(sensor_type_t type, uint8_t *oversample)
+{
+ int rc;
+ uint8_t tmp;
+
+ if (type & SENSOR_TYPE_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
+ rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &tmp, 1);
+ if (rc) {
+ goto err;
+ }
+
+ if (type & SENSOR_TYPE_TEMPERATURE) {
+ *oversample = ((tmp & BME280_REG_CTRL_MEAS_TOVER) >> 5);
+ }
+
+ if (type & SENSOR_TYPE_PRESSURE) {
+ *oversample = ((tmp & BME280_REG_CTRL_MEAS_POVER) >> 3);
+ }
+ }
+
+ if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
+ rc = bme280_readlen(BME280_REG_ADDR_CTRL_HUM, &tmp, 1);
+ if (rc) {
+ goto err;
+ }
+ *oversample = (tmp & BME280_REG_CTRL_HUM_HOVER);
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Sets the sampling rate
+ *
+ * @param sensor type
+ * @param sampling rate
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_set_oversample(sensor_type_t type, uint8_t oversample)
+{
+ int rc;
+ uint8_t cfg;
+
+ if (type & SENSOR_TYPE_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
+ rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
+ if (rc) {
+ goto err;
+ }
+
+ if (type & SENSOR_TYPE_TEMPERATURE) {
+ oversample = cfg | ((oversample << 5) & BME280_REG_CTRL_MEAS_TOVER);
+ }
+
+ if (type & SENSOR_TYPE_PRESSURE) {
+ oversample = cfg | ((oversample << 3) & BME280_REG_CTRL_MEAS_POVER);
+ }
+
+ rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &oversample, 1);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
+ rc = bme280_readlen(BME280_REG_ADDR_CTRL_HUM, &cfg, 1);
+ if (rc) {
+ goto err;
+ }
+
+ oversample = cfg | (oversample & BME280_REG_CTRL_HUM_HOVER);
+
+ rc = bme280_writelen(BME280_REG_ADDR_CTRL_HUM, &oversample, 1);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+/**
+ * Get the chip id
+ *
+ * @param ptr to fill up the chip id
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_chipid(uint8_t *chipid)
+{
+ int rc;
+ uint8_t tmp;
+
+ rc = bme280_readlen(BME280_REG_ADDR_PRESS, &tmp, 1);
+ if (rc) {
+ goto err;
+ }
+
+ *chipid = tmp;
+
+err:
+ return rc;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/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
new file mode 100644
index 0000000..1c93aeb
--- /dev/null
+++ b/hw/drivers/sensors/bme280/src/bme280_priv.h
@@ -0,0 +1,110 @@
+/*
+ * 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 __BME280_PRIV_H__
+#define __BME280_PRIV_H__
+
+#define BME280_REG_ADDR_DIG_T1 0x88
+#define BME280_REG_ADDR_DIG_T2 0x8A
+#define BME280_REG_ADDR_DIG_T3 0x8C
+
+#define BME280_REG_ADDR_DIG_P1 0x8E
+#define BME280_REG_ADDR_DIG_P2 0x90
+#define BME280_REG_ADDR_DIG_P3 0x92
+#define BME280_REG_ADDR_DIG_P4 0x94
+#define BME280_REG_ADDR_DIG_P5 0x96
+#define BME280_REG_ADDR_DIG_P6 0x98
+#define BME280_REG_ADDR_DIG_P7 0x9A
+#define BME280_REG_ADDR_DIG_P8 0x9C
+#define BME280_REG_ADDR_DIG_P9 0x9E
+
+#define BME280_REG_ADDR_DIG_H1 0xA1
+#define BME280_REG_ADDR_DIG_H2 0xE1
+#define BME280_REG_ADDR_DIG_H3 0xE3
+#define BME280_REG_ADDR_DIG_H4 0xE4
+#define BME280_REG_ADDR_DIG_H5 0xE5
+#define BME280_REG_ADDR_DIG_H6 0xE7
+
+#define BME280_REG_ADDR_CHIPID 0xD0
+#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_CTRL_HUM 0xF2
+#define BME280_REG_CTRL_HUM_NONE (0x1F)
+#define BME280_REG_CTRL_HUM_HOVER (0x11)
+
+#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_ADDR_CONFIG 0xF5
+#define BME280_REG_CONFIG_STANDBY (0x11 << 5)
+#define BME280_REG_CONFIG_FILTER (0x11 << 3)
+#define BME280_REG_CONFIG_SPI3_EN (0x1)
+
+#define BME280_REG_ADDR_PRESS 0xF7
+#define BME280_REG_ADDR_PRESS_MSB 0xF7
+#define BME280_REG_ADDR_PRESS_LSB 0xF8
+#define BME280_REG_ADDR_PRESS_XLSB 0xF9
+
+#define BME280_REG_ADDR_TEMP 0xFA
+#define BME280_REG_ADDR_TEMP_MSB 0xFA
+#define BME280_REG_ADDR_TEMP_LSB 0xFB
+#define BME280_REG_ADDR_TEMP_XLSB 0xFC
+
+#define BME280_REG_ADDR_HUM 0xFD
+
+#define BME280_REG_ADDR_RESET 0xE0
+
+#define BME280_REG_CHIPID 0x60
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Write multiple length data to BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to write
+ */
+int bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len);
+
+/**
+ * Read multiple length data from BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to read
+ */
+int bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BME280_PRIV_H_ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/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
new file mode 100644
index 0000000..f9d3f46
--- /dev/null
+++ b/hw/drivers/sensors/bme280/src/bme280_shell.c
@@ -0,0 +1,364 @@
+/*
+ * 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.
+ */
+
+#include <string.h>
+#include <errno.h>
+#include "sysinit/sysinit.h"
+#include "console/console.h"
+#include "shell/shell.h"
+#include "hal/hal_gpio.h"
+#include "bme280/bme280.h"
+#include "bme280_priv.h"
+
+#if MYNEWT_VAL(BME280_CLI)
+
+static int bme280_shell_cmd(int argc, char **argv);
+
+static struct shell_cmd bme280_shell_cmd_struct = {
+ .sc_cmd = "bme280",
+ .sc_cmd_func = bme280_shell_cmd
+};
+
+static int
+bme280_shell_stol(char *param_val, long min, long max, long *output)
+{
+ char *endptr;
+ long lval;
+
+ lval = strtol(param_val, &endptr, 10); /* Base 10 */
+ if (param_val != '\0' && *endptr == '\0' &&
+ lval >= min && lval <= max) {
+ *output = lval;
+ } else {
+ return EINVAL;
+ }
+
+ return 0;
+}
+
+static int
+bme280_shell_err_too_many_args(char *cmd_name)
+{
+ console_printf("Error: too many arguments for command \"%s\"\n",
+ cmd_name);
+ return EINVAL;
+}
+
+static int
+bme280_shell_err_unknown_arg(char *cmd_name)
+{
+ console_printf("Error: unknown argument \"%s\"\n",
+ cmd_name);
+ return EINVAL;
+}
+
+static int
+bme280_shell_err_invalid_arg(char *cmd_name)
+{
+ console_printf("Error: invalid argument \"%s\"\n",
+ cmd_name);
+ return EINVAL;
+}
+
+static int
+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("\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("\tdump\n");
+
+ return 0;
+}
+
+static int
+bme280_shell_cmd_read_chipid(int argc, char **argv)
+{
+ int rc;
+ uint8_t chipid;
+
+ rc = bme280_get_chipid(&chipid);
+ if (rc) {
+ goto err;
+ }
+
+ console_printf("CHIP_ID:%02X", chipid);
+
+ return 0;
+err:
+ return rc;
+}
+
+static int
+bme280_shell_cmd_reset(int argc, char **argv)
+{
+ return bme280_reset();
+}
+
+static int
+bme280_shell_cmd_read(int argc, char **argv)
+{
+ uint32_t temp;
+ uint32_t press;
+ uint32_t humid;
+ uint16_t samples = 1;
+ long val;
+ int rc;
+ struct bme280 bme280;
+
+ if (argc > 3) {
+ return bme280_shell_err_too_many_args(argv[1]);
+ }
+
+ /* Check if more than one sample requested */
+ if (argc == 3) {
+ if (bme280_shell_stol(argv[2], 1, UINT16_MAX, &val)) {
+ return bme280_shell_err_invalid_arg(argv[2]);
+ }
+ samples = (uint16_t)val;
+ }
+
+ while(samples--) {
+
+ rc = bme280_get_data(&temp, &press, &humid, &bme280);
+ if (rc != 0) {
+ console_printf("Read failed: %d\n", rc);
+ return rc;
+ }
+ console_printf("temperature: %u\tpressure: %u\thumidity: %u\n",
+ temp, press, humid);
+ }
+
+ return 0;
+}
+
+static int
+bme280_shell_cmd_oversample(int argc, char **argv)
+{
+ long val;
+ int rc;
+ uint8_t oversample;
+ uint32_t type;
+
+ if (argc > 3) {
+ return bme280_shell_err_too_many_args(argv[1]);
+ }
+
+ /* Display the oversample */
+ if (argc == 3) {
+ if (bme280_shell_stol(argv[2], 4, 8, &val)) {
+ return bme280_shell_err_invalid_arg(argv[2]);
+ }
+ rc = bme280_get_oversampling(val, &oversample);
+ if (rc) {
+ goto err;
+ }
+ console_printf("%u\n", oversample);
+ }
+
+ /* Update the oversampling */
+ if (argc == 4) {
+ if (bme280_shell_stol(argv[2], 4, 8, &val)) {
+ return bme280_shell_err_invalid_arg(argv[2]);
+ }
+
+ type = val;
+
+ if (bme280_shell_stol(argv[3], 0, 5, &val)) {
+ return bme280_shell_err_invalid_arg(argv[2]);
+ }
+
+ oversample = val;
+
+ rc = bme280_set_oversample(type, oversample);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+static int
+bme280_shell_cmd_iir(int argc, char **argv)
+{
+ uint8_t iir;
+ long val;
+
+ if (argc > 3) {
+ return bme280_shell_err_too_many_args(argv[1]);
+ }
+
+ /* Display if iir enabled */
+ if (argc == 2) {
+ rc = bme280_get_iir(&iir);
+ if (rc) {
+ goto err;
+ }
+ console_printf("IIR: %02X", iir);
+ }
+
+ /* Enable/disable iir*/
+ if (argc == 3) {
+ if (bme280_shell_stol(argv[2], 0, 1, &val)) {
+ return bme280_shell_err_invalid_arg(argv[2]);
+ }
+ rc = bme280_set_iir(val);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ return 0;
+}
+
+static int
+bme280_shell_cmd_dump(int argc, char **argv)
+{
+ uint8_t val;
+
+ if (argc > 3) {
+ return bme280_shell_err_too_many_args(argv[1]);
+ }
+
+ /* Dump all the register values for debug purposes */
+ val = 0;
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_T1, &val, 1));
+ console_printf("0x%02X (DIG_T1): 0x%02X\n", BME280_REG_ADDR_DIG_T1, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_T2, &val, 1));
+ console_printf("0x%02X (DIG_T2): 0x%02X\n", BME280_REG_ADDR_DIG_T2, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_T3, &val, 1));
+ console_printf("0x%02X (DIG_T3): 0x%02X\n", BME280_REG_ADDR_DIG_T3, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P1, &val, 1));
+ console_printf("0x%02X (DIG_P1): 0x%02X\n", BME280_REG_ADDR_DIG_P1, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P2, &val, 1));
+ console_printf("0x%02X (DIG_P2): 0x%02X\n", BME280_REG_ADDR_DIG_P2, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P3, &val, 1));
+ console_printf("0x%02X (DIG_P3): 0x%02X\n", BME280_REG_ADDR_DIG_P3, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P4, &val, 1));
+ console_printf("0x%02X (DIG_P4): 0x%02X\n", BME280_REG_ADDR_DIG_P4, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P5, &val, 1));
+ console_printf("0x%02X (DIG_P5): 0x%02X\n", BME280_REG_ADDR_DIG_P5, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P6, &val, 1));
+ console_printf("0x%02X (DIG_P6): 0x%02X\n", BME280_REG_ADDR_DIG_P6, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P7, &val, 1));
+ console_printf("0x%02X (DIG_P7): 0x%02X\n", BME280_REG_ADDR_DIG_P7, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P8, &val, 1));
+ console_printf("0x%02X (DIG_P8): 0x%02X\n", BME280_REG_ADDR_DIG_P8, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P9, &val, 1));
+ console_printf("0x%02X (DIG_P9): 0x%02X\n", BME280_REG_ADDR_DIG_P9, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H1, &val, 1));
+ console_printf("0x%02X (DIG_H1): 0x%02X\n", BME280_REG_ADDR_DIG_H1, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H2, &val, 1));
+ console_printf("0x%02X (DIG_H2): 0x%02X\n", BME280_REG_ADDR_DIG_H2, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H3, &val, 1));
+ console_printf("0x%02X (DIG_H3): 0x%02X\n", BME280_REG_ADDR_DIG_H3, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H4, &val, 1));
+ console_printf("0x%02X (DIG_H4): 0x%02X\n", BME280_REG_ADDR_DIG_H4, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H5, &val, 1));
+ console_printf("0x%02X (DIG_H5): 0x%02X\n", BME280_REG_ADDR_DIG_H5, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H6, &val, 1));
+ console_printf("0x%02X (DIG_H6): 0x%02X\n", BME280_REG_ADDR_DIG_H6, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_CHIPID, &val, 1));
+ console_printf("0x%02X (CHIPID): 0x%02X\n", BME280_REG_ADDR_CHIPID, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_VERSION, &val, 1));
+ console_printf("0x%02X (VER): 0x%02X\n", BME280_REG_ADDR_VERSION, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_CTRL_HUM, &val, 1));
+ console_printf("0x%02X (CTRL_HUM): 0x%02X\n", BME280_REG_ADDR_CTRL_HUM, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_STATUS, &val, 1));
+ console_printf("0x%02X (STATUS): 0x%02X\n", BME280_REG_ADDR_STATUS, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &val, 1));
+ console_printf("0x%02X (CTRL_MEAS): 0x%02X\n", BME280_REG_ADDR_CTRL_MEAS, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_CONFIG, &val, 1));
+ console_printf("0x%02X (CONFIG): 0x%02X\n", BME280_REG_ADDR_CONFIG, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_PRESS, &val, 1));
+ console_printf("0x%02X (PRESS): 0x%02X\n", BME280_REG_ADDR_PRESS, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_TEMP, &val, 1));
+ console_printf("0x%02X (TEMP): 0x%02X\n", BME280_REG_ADDR_TEMP, val);
+ assert(0 == bme280_readlen(BME280_REG_ADDR_HUM, &val, 1));
+ console_printf("0x%02X (HUM): 0x%02X\n", BME280_REG_ADDR_HUM, val);
+
+ return 0;
+}
+
+static int
+bme280_shell_cmd(int argc, char **argv)
+{
+ if (argc == 1) {
+ return bme280_shell_help();
+ }
+
+ /* Read command (get a new data sample) */
+ if (argc > 1 && strcmp(argv[1], "r") == 0) {
+ return bme280_shell_cmd_read(argc, argv);
+ }
+
+ /* Mode command */
+ if (argc > 1 && strcmp(argv[1], "mode") == 0) {
+ return bme280_shell_cmd_mode(argc, argv);
+ }
+
+ /* IIR */
+ if (argc > 1 && strcmp(argv[1], "iir") == 0) {
+ return bme280_shell_cmd_iir(argc, argv);
+ }
+
+ /* Oversample */
+ if (argc > 1 && strcmp(argv[1], "oversample") == 0) {
+ return bme280_shell_cmd_oversample(argc, argv);
+ }
+
+ /* Reset */
+ if (argc > 1 && strcmp(argv[1], "reset") == 0) {
+ return bme280_shell_cmd_reset(argc, argv);
+ }
+
+ /* Chip ID */
+ if (argc > 1 && strcmp(argv[1], "chipid") == 0) {
+ return bme280_shell_cmd_read_chipid(argc, argv);
+ }
+
+ /* Dump */
+ if (argc > 1 && strcmp(argv[1], "dump") == 0) {
+ return bme280_shell_cmd_dump(argc, argv);
+ }
+
+ return bme280_shell_err_unknown_arg(argv[1]);
+}
+
+int
+bme280_shell_init(void)
+{
+ int rc;
+
+ rc = shell_cmd_register(&bme280_shell_cmd_struct);
+ SYSINIT_PANIC_ASSERT(rc == 0);
+
+ return rc;
+}
+
+#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/syscfg.yml
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/syscfg.yml b/hw/drivers/sensors/bme280/syscfg.yml
new file mode 100644
index 0000000..126ecda
--- /dev/null
+++ b/hw/drivers/sensors/bme280/syscfg.yml
@@ -0,0 +1,38 @@
+# The BSD License (BSD)
+#
+# Copyright (c) 2016 Adafruit Industries
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+syscfg.defs:
+ BME280_SPINUM:
+ description: 'SPI number for the BME280'
+ value: -1
+ BME280_CLI:
+ description: 'Enable shell support for the BME280'
+ value: 0
+ BME280_LOG:
+ description: 'Enable BME280 logging'
+ value: 0
+ BME280_STATS:
+ description: 'Enable BME280 statistics'
+ value: 0
+ BME280_CSPIN:
+ description: 'CS pin for BME280'
+ value : 0
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/sensor/src/sensor_shell.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_shell.c b/hw/sensor/src/sensor_shell.c
index 481e241..ebe3b1b 100644
--- a/hw/sensor/src/sensor_shell.c
+++ b/hw/sensor/src/sensor_shell.c
@@ -230,7 +230,6 @@ 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;
- int8_t *temperature;
char tmpstr[13];
ctx = (struct sensor_shell_read_ctx *) arg;
@@ -288,8 +287,7 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
}
if (ctx->type == SENSOR_TYPE_TEMPERATURE) {
- temperature = (int8_t *) data;
- console_printf("temprature = %d", *temperature);
+ console_printf("temprature = %d", *(int *)data);
console_printf("\n");
}
@@ -366,6 +364,16 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
console_printf("\n\n");
}
+ if (ctx->type == SENSOR_TYPE_PRESSURE) {
+ console_printf("pressure = %d", *(int *)data);
+ console_printf("\n");
+ }
+
+ if (ctx->type == SENSOR_TYPE_RELATIVE_HUMIDITY) {
+ console_printf("relative humidity = %d", *(int *)data);
+ console_printf("\n");
+ }
+
return (0);
}
[4/6] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
Posted by vi...@apache.org.
MYNEWT-748 SensorAPI: Add BME280 support
- SensorAPI pressure, temperature and humidity support
- OIC support
- ruuvi_tag_revb2 bsp, create sensor device
- nrf52840pdk bsp, create sensor device
- Add BMP280 sensor device support since BME280 and BMP280 are pin to
pin compatible
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/8d98e078
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/8d98e078
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/8d98e078
Branch: refs/heads/master
Commit: 8d98e078c7281265f7f20af1b97042289d2c5a27
Parents: ad7cdf0
Author: Vipul Rahane <vi...@apache.org>
Authored: Thu Apr 27 14:56:20 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri May 12 17:08:16 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/src/main.c | 6 ++
apps/sensors_test/syscfg.yml | 2 +-
hw/bsp/nrf52840pdk/src/hal_bsp.c | 20 ++++
hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c | 31 +++++-
.../sensors/bme280/include/bme280/bme280.h | 2 +-
hw/drivers/sensors/bme280/src/bme280.c | 105 ++++++++++++++-----
hw/drivers/sensors/bme280/src/bme280_priv.h | 4 +-
hw/drivers/sensors/bme280/src/bme280_shell.c | 61 ++++++++++-
hw/sensor/src/sensor_oic.c | 29 +++--
9 files changed, 209 insertions(+), 51 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index 152d48e..ce5f4bd 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -398,6 +398,8 @@ config_sensor(void)
goto err;
}
+ memset(&bmecfg, 0, sizeof(bmecfg));
+
rc = bme280_config((struct bme280 *)dev, &bmecfg);
if (rc) {
os_dev_close(dev);
@@ -566,6 +568,10 @@ sensors_dev_shell_init(void)
bno055_shell_init();
#endif
+#if MYNEWT_VAL(BME280_CLI)
+ bme280_shell_init();
+#endif
+
}
static void
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/apps/sensors_test/syscfg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/syscfg.yml b/apps/sensors_test/syscfg.yml
index 8172a62..fe8b2d7 100644
--- a/apps/sensors_test/syscfg.yml
+++ b/apps/sensors_test/syscfg.yml
@@ -44,7 +44,7 @@ syscfg.vals:
TSL2561_CLI: 0
BNO055_CLI: 0
TCS34725_CLI: 0
- BME280_CLI: 0
+ BME280_CLI: 1
# Setup Sensor BLE OIC GATT Server
SENSOR_OIC: 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/hw/bsp/nrf52840pdk/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf52840pdk/src/hal_bsp.c b/hw/bsp/nrf52840pdk/src/hal_bsp.c
index bf2dd36..88b42b0 100644
--- a/hw/bsp/nrf52840pdk/src/hal_bsp.c
+++ b/hw/bsp/nrf52840pdk/src/hal_bsp.c
@@ -48,6 +48,9 @@ static struct lsm303dlhc lsm303dlhc;
#if MYNEWT_VAL(TCS34725_PRESENT)
#include <tcs34725/tcs34725.h>
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+#include <bme280/bme280.h>
+#endif
#if MYNEWT_VAL(LSM303DLHC_PRESENT)
static struct lsm303dlhc lsm303dlhc;
@@ -65,6 +68,9 @@ static struct tsl2561 tsl2561;
static struct tcs34725 tcs34725;
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+static struct bme280 bme280;
+#endif
#if MYNEWT_VAL(UART_0)
static struct uart_dev os_bsp_uart0;
@@ -198,6 +204,14 @@ color_init(struct os_dev *dev, void *arg)
}
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+static int
+press_init(struct os_dev *dev, void *arg)
+{
+ return (0);
+}
+#endif
+
static void
sensor_dev_create(void)
{
@@ -227,6 +241,12 @@ sensor_dev_create(void)
OS_DEV_INIT_PRIMARY, 0, color_init, NULL);
assert(rc == 0);
#endif
+
+#if MYNEWT_VAL(BME280_PRESENT)
+ rc = os_dev_create((struct os_dev *) &bme280, "bme280",
+ OS_DEV_INIT_PRIMARY, 0, press_init, NULL);
+ assert(rc == 0);
+#endif
}
void
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/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 ab960ce..30da796 100644
--- a/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c
+++ b/hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c
@@ -55,6 +55,9 @@ static struct lsm303dlhc lsm303dlhc;
#if MYNEWT_VAL(TCS34725_PRESENT)
#include <tcs34725/tcs34725.h>
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+#include <bme280/bme280.h>
+#endif
#if MYNEWT_VAL(LSM303DLHC_PRESENT)
static struct lsm303dlhc lsm303dlhc;
@@ -72,6 +75,10 @@ static struct tsl2561 tsl2561;
static struct tcs34725 tcs34725;
#endif
+#if MYNEWT_VAL(BME280_PRESENT)
+static struct bme280 bme280;
+#endif
+
#if MYNEWT_VAL(UART_0)
static struct uart_dev os_bsp_uart0;
static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
@@ -198,7 +205,15 @@ slinky_light_init(struct os_dev *dev, void *arg)
#if MYNEWT_VAL(TCS34725_PRESENT)
static int
-slinky_color_init(struct os_dev *dev, void *arg)
+color_init(struct os_dev *dev, void *arg)
+{
+ return (0);
+}
+#endif
+
+#if MYNEWT_VAL(BME280_PRESENT)
+static int
+press_init(struct os_dev *dev, void *arg)
{
return (0);
}
@@ -212,25 +227,31 @@ sensor_dev_create(void)
(void)rc;
#if MYNEWT_VAL(LSM303DLHC_PRESENT)
rc = os_dev_create((struct os_dev *) &lsm303dlhc, "accel0",
- OS_DEV_INIT_PRIMARY, 0, slinky_accel_init, NULL);
+ OS_DEV_INIT_PRIMARY, 0, accel_init, NULL);
assert(rc == 0);
#endif
#if MYNEWT_VAL(BNO055_PRESENT)
rc = os_dev_create((struct os_dev *) &bno055, "accel1",
- OS_DEV_INIT_PRIMARY, 0, slinky_accel_init, NULL);
+ OS_DEV_INIT_PRIMARY, 0, accel_init, NULL);
assert(rc == 0);
#endif
#if MYNEWT_VAL(TSL2561_PRESENT)
rc = os_dev_create((struct os_dev *) &tsl2561, "light0",
- OS_DEV_INIT_PRIMARY, 0, slinky_light_init, NULL);
+ OS_DEV_INIT_PRIMARY, 0, light_init, NULL);
assert(rc == 0);
#endif
#if MYNEWT_VAL(TCS34725_PRESENT)
rc = os_dev_create((struct os_dev *) &tcs34725, "color0",
- OS_DEV_INIT_PRIMARY, 0, slinky_color_init, NULL);
+ OS_DEV_INIT_PRIMARY, 0, color_init, NULL);
+ assert(rc == 0);
+#endif
+
+#if MYNEWT_VAL(BME280_PRESENT)
+ rc = os_dev_create((struct os_dev *) &bme280, "bme280",
+ OS_DEV_INIT_PRIMARY, 0, press_init, NULL);
assert(rc == 0);
#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/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 f5ea131..4ef5d78 100644
--- a/hw/drivers/sensors/bme280/include/bme280/bme280.h
+++ b/hw/drivers/sensors/bme280/include/bme280/bme280.h
@@ -167,7 +167,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 *humidity);
+int bme280_get_humidity(uint32_t *humid);
/**
* Sets the sampling rate
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/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 ca5ee0a..e31cffc 100644
--- a/hw/drivers/sensors/bme280/src/bme280.c
+++ b/hw/drivers/sensors/bme280/src/bme280.c
@@ -195,8 +195,8 @@ bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
uint32_t humid;
int rc;
- if (!(type & SENSOR_TYPE_PRESSURE) ||
- !(type & SENSOR_TYPE_TEMPERATURE) ||
+ if (!(type & SENSOR_TYPE_PRESSURE) &&
+ !(type & SENSOR_TYPE_TEMPERATURE) &&
!(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
rc = SYS_EINVAL;
goto err;
@@ -289,26 +289,74 @@ int
bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
{
int rc;
+ uint8_t id;
- rc = bme280_set_iir(cfg->bc_iir);
+ /* Check if we can read the chip address */
+ rc = bme280_get_chipid(&id);
+ if (rc) {
+ goto err;
+ }
- rc |= bme280_set_mode(cfg->bc_mode);
+ if (id != BME280_CHIPID && id != BMP280_CHIPID) {
+ os_time_delay((OS_TICKS_PER_SEC * 100)/1000 + 1);
- rc |= bme280_set_oversample(cfg->bc_boc[0].boc_type,
- cfg->bc_boc[0].boc_oversample);
+ rc = bme280_get_chipid(&id);
+ if (rc) {
+ goto err;
+ }
- rc |= bme280_set_oversample(cfg->bc_boc[1].boc_type,
- cfg->bc_boc[1].boc_oversample);
+ if(id != BME280_CHIPID && id != BMP280_CHIPID) {
+ rc = SYS_EINVAL;
+ goto err;
+ }
+ }
- rc |= bme280_set_oversample(cfg->bc_boc[2].boc_type,
- cfg->bc_boc[2].boc_oversample);
+ rc = bme280_set_iir(cfg->bc_iir);
+ if (rc) {
+ goto err;
+ }
+ bme280->cfg.bc_iir = cfg->bc_iir;
+
+ rc = bme280_set_mode(cfg->bc_mode);
if (rc) {
goto err;
}
- /* Overwrite the configuration data. */
- memcpy(&bme280->cfg, cfg, sizeof(*cfg));
+ bme280->cfg.bc_mode = cfg->bc_mode;
+
+ 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) {
+ goto err;
+ }
+ }
+
+ 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) {
+ rc = bme280_set_oversample(cfg->bc_boc[1].boc_type,
+ cfg->bc_boc[1].boc_oversample);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ 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) {
+ rc = bme280_set_oversample(cfg->bc_boc[2].boc_type,
+ cfg->bc_boc[2].boc_oversample);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ 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;
err:
return (rc);
@@ -327,36 +375,35 @@ int
bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len)
{
int i;
+ uint16_t retval;
int rc;
- uint8_t txdata;
- uint8_t rxdata;
+
+ rc = 0;
/* Select the device */
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);
- if (rc) {
+ retval = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM),
+ addr | BME280_SPI_READ_CMD_BIT);
+ if (retval == 0xFFFF) {
+ rc = SYS_EINVAL;
goto err;
}
- txdata = 0;
-
for (i = 0; i < len; i++) {
/* Read data */
- rc = hal_spi_txrx(MYNEWT_VAL(BME280_SPINUM), &txdata, &rxdata, 1);
- if (rc) {
+ retval = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), 0);
+ if (retval == 0xFFFF) {
+ rc = SYS_EINVAL;
goto err;
}
-
- payload[i] = rxdata;
+ payload[i] = retval;
}
+err:
/* De-select the device */
hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
-
- return 0;
-err:
return rc;
}
@@ -380,14 +427,16 @@ bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len)
/* Send the address */
rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), addr | BME280_SPI_READ_CMD_BIT);
- if (rc) {
+ if (rc == 0xFFFF) {
+ rc = SYS_EINVAL;
goto err;
}
for (i = 0; i < len; i++) {
/* Read data */
rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), payload[i]);
- if (rc) {
+ if (rc == 0xFFFF) {
+ rc = SYS_EINVAL;
goto err;
}
}
@@ -702,7 +751,7 @@ bme280_get_chipid(uint8_t *chipid)
int rc;
uint8_t tmp;
- rc = bme280_readlen(BME280_REG_ADDR_PRESS, &tmp, 1);
+ rc = bme280_readlen(BME280_REG_ADDR_CHIPID, &tmp, 1);
if (rc) {
goto err;
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/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 1c93aeb..23d0aaf 100644
--- a/hw/drivers/sensors/bme280/src/bme280_priv.h
+++ b/hw/drivers/sensors/bme280/src/bme280_priv.h
@@ -79,7 +79,9 @@
#define BME280_REG_ADDR_RESET 0xE0
-#define BME280_REG_CHIPID 0x60
+#define BME280_CHIPID 0x60
+
+#define BMP280_CHIPID 0x58
#ifdef __cplusplus
extern "C" {
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/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 f9d3f46..78f5d2e 100644
--- a/hw/drivers/sensors/bme280/src/bme280_shell.c
+++ b/hw/drivers/sensors/bme280/src/bme280_shell.c
@@ -126,7 +126,6 @@ bme280_shell_cmd_read(int argc, char **argv)
uint16_t samples = 1;
long val;
int rc;
- struct bme280 bme280;
if (argc > 3) {
return bme280_shell_err_too_many_args(argv[1]);
@@ -142,13 +141,27 @@ bme280_shell_cmd_read(int argc, char **argv)
while(samples--) {
- rc = bme280_get_data(&temp, &press, &humid, &bme280);
- if (rc != 0) {
+ rc = bme280_get_pressure(&press);
+ if (rc) {
+ console_printf("Read failed: %d\n", rc);
+ return rc;
+ }
+
+ rc = bme280_get_temperature(&temp);
+ if (rc) {
+ console_printf("Read failed: %d\n", rc);
+ return rc;
+ }
+
+ rc = bme280_get_humidity(&humid);
+ if (rc) {
console_printf("Read failed: %d\n", rc);
return rc;
}
+
console_printf("temperature: %u\tpressure: %u\thumidity: %u\n",
- temp, press, humid);
+ (unsigned int)temp, (unsigned int)press,
+ (unsigned int)humid);
}
return 0;
@@ -171,7 +184,7 @@ bme280_shell_cmd_oversample(int argc, char **argv)
if (bme280_shell_stol(argv[2], 4, 8, &val)) {
return bme280_shell_err_invalid_arg(argv[2]);
}
- rc = bme280_get_oversampling(val, &oversample);
+ rc = bme280_get_oversample(val, &oversample);
if (rc) {
goto err;
}
@@ -204,10 +217,46 @@ err:
}
static int
+bme280_shell_cmd_mode(int argc, char **argv)
+{
+ uint8_t mode;
+ long val;
+ int rc;
+
+ if (argc > 3) {
+ return bme280_shell_err_too_many_args(argv[1]);
+ }
+
+ if (argc == 2) {
+ rc = bme280_get_mode(&mode);
+ if (rc) {
+ goto err;
+ }
+ console_printf("mode: %u", mode);
+ }
+
+ /* Chaneg mode */
+ if (argc == 3) {
+ if (bme280_shell_stol(argv[2], 0, 1, &val)) {
+ return bme280_shell_err_invalid_arg(argv[2]);
+ }
+ rc = bme280_set_mode(val);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ return 0;
+err:
+ return rc;
+}
+
+static int
bme280_shell_cmd_iir(int argc, char **argv)
{
uint8_t iir;
long val;
+ int rc;
if (argc > 3) {
return bme280_shell_err_too_many_args(argv[1]);
@@ -234,6 +283,8 @@ bme280_shell_cmd_iir(int argc, char **argv)
}
return 0;
+err:
+ return rc;
}
static int
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8d98e078/hw/sensor/src/sensor_oic.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_oic.c b/hw/sensor/src/sensor_oic.c
index de9e65a..879da5d 100644
--- a/hw/sensor/src/sensor_oic.c
+++ b/hw/sensor/src/sensor_oic.c
@@ -134,17 +134,19 @@ sensor_oic_encode(struct sensor* sensor, void *arg, void *databuf)
oc_rep_set_double(root, ambient_temp, *(double *)databuf);
break;
-#if 0
/* Pressure sensor supported */
- SENSOR_TYPE_PRESSURE:
- oc_rep_set_double(root, pressure, (double *)databuf);
-
+ case SENSOR_TYPE_PRESSURE:
+ oc_rep_set_uint(root, pressure, *(uint32_t *)databuf);
+ break;
+#if 0
/* Proximity sensor supported */
SENSOR_TYPE_PROXIMITY:
-
- /* Relative humidity supported */
- SENSOR_TYPE_RELATIVE_HUMIDITY:
#endif
+ /* Relative humidity supported */
+ case SENSOR_TYPE_RELATIVE_HUMIDITY:
+ oc_rep_set_uint(root, humidity, *(uint32_t *)databuf);
+ break;
+
/* Rotation vector (quaternion) supported */
case SENSOR_TYPE_ROTATION_VECTOR:
if (((struct sensor_quat_data *)(databuf))->sqd_x_is_valid) {
@@ -457,13 +459,20 @@ sensor_oic_get_data(oc_request_t *request, oc_interface_mask_t interface)
int rc;
struct sensor *sensor;
struct sensor_listener listener;
- char devname[COAP_MAX_URI] = {0};
+ char *devname;
char *typename;
sensor_type_t type;
+ char tmpstr[COAP_MAX_URI] = {0};
+ const char s[2] = "/";
- memcpy(devname, (char *)&(request->resource->uri.os_str[1]),
+ memcpy(tmpstr, (char *)&(request->resource->uri.os_str[1]),
request->resource->uri.os_sz - 1);
+ /* Parse the sensor device name from the uri */
+ devname = strtok(tmpstr, s);
+
+ typename = strtok(NULL, s);
+
/* Look up sensor by name */
sensor = sensor_mgr_find_next_bydevname(devname, NULL);
if (!sensor) {
@@ -563,7 +572,7 @@ sensor_oic_init(void)
}
memset(tmpstr, 0, sizeof(tmpstr));
- snprintf(tmpstr, sizeof(tmpstr), "/%s", sensor->s_dev->od_name);
+ snprintf(tmpstr, sizeof(tmpstr), "/%s/%s", sensor->s_dev->od_name, typename);
res = oc_new_resource(tmpstr, 1, 0);
[2/6] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
Posted by vi...@apache.org.
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
[3/6] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
Posted by vi...@apache.org.
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/master
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");
}
[5/6] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add
BME280 support
Posted by vi...@apache.org.
MYNEWT-748 SensorAPI: Add BME280 support
- Make OIC observe rate configurable
- Use the OIC observe rate as the LED blink rate in the app
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/f2a8e66a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f2a8e66a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f2a8e66a
Branch: refs/heads/master
Commit: f2a8e66af0947699269814ff13fa562fc27323d5
Parents: c9ca827
Author: Vipul Rahane <vi...@apache.org>
Authored: Fri May 12 17:13:38 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri May 12 17:13:38 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/src/main.c | 2 +-
hw/sensor/src/sensor_oic.c | 2 +-
hw/sensor/syscfg.yml | 4 ++++
3 files changed, 6 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f2a8e66a/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index 3c07e21..585a230 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -323,7 +323,7 @@ task1_handler(void *arg)
++g_task1_loops;
/* Wait one second */
- os_time_delay(OS_TICKS_PER_SEC);
+ os_time_delay(OS_TICKS_PER_SEC * MYNEWT_VAL(SENSOR_OIC_OBS_RATE));
/* Toggle the LED */
(void)hal_gpio_toggle(g_led_pin);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f2a8e66a/hw/sensor/src/sensor_oic.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_oic.c b/hw/sensor/src/sensor_oic.c
index 53c5406..651e0ff 100644
--- a/hw/sensor/src/sensor_oic.c
+++ b/hw/sensor/src/sensor_oic.c
@@ -598,7 +598,7 @@ sensor_oic_init(void)
oc_resource_set_default_interface(res, OC_IF_R);
oc_resource_set_discoverable(res);
- oc_resource_set_periodic_observable(res, 1);
+ oc_resource_set_periodic_observable(res, MYNEWT_VAL(SENSOR_OIC_OBS_RATE));
oc_resource_set_request_handler(res, OC_GET,
sensor_oic_get_data);
oc_add_resource(res);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f2a8e66a/hw/sensor/syscfg.yml
----------------------------------------------------------------------
diff --git a/hw/sensor/syscfg.yml b/hw/sensor/syscfg.yml
index 761d62b..581802f 100644
--- a/hw/sensor/syscfg.yml
+++ b/hw/sensor/syscfg.yml
@@ -36,3 +36,7 @@ syscfg.defs:
MATHLIB_SUPPORT:
description: 'Is MATHLIB support present'
value: 0
+
+ SENSOR_OIC_OBS_RATE:
+ description: 'Set OIC server observation rate in seconds'
+ value: 1
[6/6] incubator-mynewt-core git commit: This closes #273
Posted by vi...@apache.org.
This closes #273
Merge remote-tracking branch 'fork/sensor_bme280'
* fork/sensor_bme280:
MYNEWT-748 SensorAPI: Add BME280 support
MYNEWT-748 SensorAPI: Add BME280 support
MYNEWT-748 SensorAPI: Add BME280 support
MYNEWT-748 SensorAPI: Add BME280 support
MYNEWT-748 SensorAPI: Add BME280 support
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/b26a78d8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/b26a78d8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/b26a78d8
Branch: refs/heads/master
Commit: b26a78d8f040968512a082335fce372f924acb22
Parents: afc404f f2a8e66
Author: Vipul Rahane <vi...@apache.org>
Authored: Fri May 12 17:31:45 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri May 12 17:31:45 2017 -0700
----------------------------------------------------------------------
apps/sensors_test/pkg.yml | 1 +
apps/sensors_test/src/main.c | 38 +-
apps/sensors_test/syscfg.yml | 4 +
hw/bsp/nrf52840pdk/src/hal_bsp.c | 20 +
hw/bsp/nrf52dk/src/hal_bsp.c | 12 +
hw/bsp/ruuvi_tag_revb2/src/hal_bsp.c | 33 +-
.../sensors/bme280/include/bme280/bme280.h | 259 ++++
hw/drivers/sensors/bme280/pkg.yml | 32 +
hw/drivers/sensors/bme280/src/bme280.c | 1360 ++++++++++++++++++
hw/drivers/sensors/bme280/src/bme280_priv.h | 111 ++
hw/drivers/sensors/bme280/src/bme280_shell.c | 414 ++++++
hw/drivers/sensors/bme280/syscfg.yml | 41 +
.../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_oic.c | 54 +-
hw/sensor/src/sensor_shell.c | 35 +-
hw/sensor/syscfg.yml | 8 +
20 files changed, 2561 insertions(+), 30 deletions(-)
----------------------------------------------------------------------