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(-)
----------------------------------------------------------------------