diff --git a/samples/sensor/bme280/Kconfig b/samples/sensor/bme280/Kconfig index f82fbd83e9e5e5b..7623ae2880ae7be 100644 --- a/samples/sensor/bme280/Kconfig +++ b/samples/sensor/bme280/Kconfig @@ -7,9 +7,6 @@ config LOG config LOG_PRINTK default y -config SENSOR_LOG_LEVEL - default 4 - # Enable SPI and I2C support by default so that the sample works with # the device connected either way. These defaults can be overridden if # needed. diff --git a/samples/sensor/bme280/prj.conf b/samples/sensor/bme280/prj.conf index 42fcd3c973bcbe5..6dd7a1eac91a0ec 100644 --- a/samples/sensor/bme280/prj.conf +++ b/samples/sensor/bme280/prj.conf @@ -1 +1,2 @@ CONFIG_SENSOR=y +CONFIG_SENSOR_LOG_LEVEL_OFF=y diff --git a/samples/sensor/bme280/src/main.c b/samples/sensor/bme280/src/main.c index 07fa9a60eb64b33..406f39329db9818 100644 --- a/samples/sensor/bme280/src/main.c +++ b/samples/sensor/bme280/src/main.c @@ -5,11 +5,21 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include "zephyr/rtio/rtio.h" #include #include #include #include + +#define BME280_DT_NODE DT_COMPAT_GET_ANY_STATUS_OKAY(bosch_bme280) + +RTIO_DEFINE_WITH_MEMPOOL(r, 1, 1, 1, 32, 4); +SENSOR_DT_READ_IODEV(bme280_io, BME280_DT_NODE, + SENSOR_CHAN_AMBIENT_TEMP, SENSOR_CHAN_PRESS, SENSOR_CHAN_HUMIDITY); + +static const struct sensor_decoder_api *decoder; + /* * Get a device structure from a devicetree node with compatible * "bosch,bme280". (If there are multiple, just pick one.) @@ -35,25 +45,50 @@ static const struct device *get_bme280_device(void) return dev; } +#define B(x) (int32_t)FIELD_GET(GENMASK64(63, 31), x) +#define L(x) (int32_t)FIELD_GET(GENMASK(30, 0), x) + +void process(int result, uint8_t *buf, uint32_t buf_len, void *userdata) +{ + sensor_frame_iterator_t fit = {0}; + sensor_channel_iterator_t cit = {0}; + enum sensor_channel channels[3]; + q31_t values[3]; + int8_t shift[3]; + + decoder->decode(buf, &fit, &cit, channels, values, 3); + + decoder->get_shift(buf, channels[0], &shift[0]); + decoder->get_shift(buf, channels[0], &shift[1]); + decoder->get_shift(buf, channels[0], &shift[2]); + + int64_t scaled[] = { + values[0] << shift[0], + values[1] << shift[1], + values[2] << shift[2] + }; + + printk("temp: %d.%06d; press: %d.%06d; humidity: %d.%06d\n", + B(scaled[0]), L(scaled[0]), + B(scaled[1]), L(scaled[1]), + B(scaled[2]), L(scaled[2])); + +} + int main(void) { const struct device *dev = get_bme280_device(); + sensor_get_decoder(dev, &decoder); + if (dev == NULL) { return 0; } while (1) { - struct sensor_value temp, press, humidity; - - sensor_sample_fetch(dev); - sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp); - sensor_channel_get(dev, SENSOR_CHAN_PRESS, &press); - sensor_channel_get(dev, SENSOR_CHAN_HUMIDITY, &humidity); + sensor_read(&bme280_io, &r, NULL); - printk("temp: %d.%06d; press: %d.%06d; humidity: %d.%06d\n", - temp.val1, temp.val2, press.val1, press.val2, - humidity.val1, humidity.val2); + sensor_processing_with_callback(&r, process); k_sleep(K_MSEC(1000)); }