Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,60 @@ sensor events are sent to the ring buffer in the upper layer.
:width: 800px
:align: center

Problems to solve
=================
Sensor data type
================

The framework supports two types of sensor data:

#. ``float`` if ``CONFIG_SENSORS_USE_FLOAT=y``, not recommended for
targets without FPU.

#. ``b16_t`` if ``CONFIG_SENSORS_USE_B16=y``, recommended for targets without
FPU.

Currently all sensors support ``float``, support for ``b16_t`` is work-in-progress.

To create generic drivers that support both data types, you should use the dedicated
sensor data type:

.. code:: C

/* Data type for sensors */

#ifdef CONFIG_SENSORS_USE_B16
typedef b16_t sensor_data_t;
#else
typedef float sensor_data_t;
#endif

Mathematical operations on this type should only be performed using dedicated
macros:

- ``sensor_data_ftof(f1)`` - convert float to sensor data number.
Should be used only for compile-time constants.

- ``sensor_data_itof(i)`` - convert int to sensor data number.

- ``sensor_data_inv(i)`` - invert int and convert to sensor data number

- ``sensor_data_add(f1, f2)`` - add two sensor data numbers

- ``sensor_data_sub(f1, f2)`` - subtract two sensor data numbers

- ``sensor_data_subi(f1, i)`` - subtract int from sensor data number

- ``sensor_data_mul(f1, f2)`` - multiplicate two sensor data numbers

- ``sensor_data_muli(f1, i)`` - multiplicate sensor data with int

- ``sensor_data_div(f1, f2)`` - divide two sensor data numbers

- ``sensor_data_divi(f1, i)`` - divide sensor data with int

- ``sensor_data_abs(f1)`` - get absolute value for sensor data number

- ``sensor_data_sqrt(f1)`` - get sqrt for sensro data number

The current implementation uses the ``float`` type which may make it difficult
to use on platforms without FPU support.

**Code**
========
Expand Down Expand Up @@ -313,9 +362,9 @@ being ``sensor_device_info_s``.
struct sensor_device_info_s
{
uint32_t version;
float power;
float max_range;
float resolution;
sensor_data_t power;
sensor_data_t max_range;
sensor_data_t resolution;
int32_t min_delay;
int32_t max_delay;
uint32_t fifo_reserved_event_count;
Expand Down
18 changes: 18 additions & 0 deletions drivers/sensors/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,24 @@ config USENSOR
---help---
Allow application to register user sensor by /dev/usensor.

choice
prompt "Sensor framework data type"
default SENSORS_USE_FLOAT

config SENSORS_USE_FLOAT
bool "Use float as data type for sensors"
---help---
Use float as data type for sensors.
This option is recommended if for targets with FPU support.

config SENSORS_USE_B16
bool "Use b16_t as data type for sensors"
---help---
Use b16_t (fixed-point type) as data type for sensors.
This option is recommended if for targets without FPU support.

endchoice # Sensor framework data type

config SENSORS_RPMSG
bool "Sensor RPMSG Support"
default n
Expand Down
27 changes: 16 additions & 11 deletions drivers/sensors/adxl362_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ struct adxl362_sensor_s
struct sensor_lowerhalf_s lower;
FAR struct spi_dev_s *spi;
int devno;
float scale;
sensor_data_t scale;
#ifdef CONFIG_SENSORS_ADXL362_POLL
bool enabled;
uint32_t interval;
Expand Down Expand Up @@ -482,10 +482,12 @@ static int adxl362_fetch(FAR struct sensor_lowerhalf_s *lower,
adxl362_getregs(priv, ADXL362_XDATA_L, (FAR uint8_t *)data, 8);

accel.timestamp = sensor_get_timestamp();
accel.x = (float)adxl362_data(&data[0]) * priv->scale;
accel.y = (float)adxl362_data(&data[2]) * priv->scale;
accel.z = (float)adxl362_data(&data[4]) * priv->scale;
accel.temperature = (float)adxl362_data(&data[6]) * ADXL362_TEMP_SCALE;

accel.x = sensor_data_muli(priv->scale, adxl362_data(&data[0]));
accel.y = sensor_data_muli(priv->scale, adxl362_data(&data[2]));
accel.z = sensor_data_muli(priv->scale, adxl362_data(&data[4]));
accel.temperature = sensor_data_muli(
sensor_data_ftof(ADXL362_TEMP_SCALE), adxl362_data(&data[6]));

memcpy(buffer, &accel, sizeof(accel));

Expand Down Expand Up @@ -539,11 +541,14 @@ static int adxl362_thread(int argc, FAR char **argv)
adxl362_getregs(priv, ADXL362_XDATA_L, (FAR uint8_t *)data, 8);

accel.timestamp = sensor_get_timestamp();
accel.x = (float)adxl362_data(&data[0]) * priv->scale;
accel.y = (float)adxl362_data(&data[2]) * priv->scale;
accel.z = (float)adxl362_data(&data[4]) * priv->scale;
accel.temperature =
(float)adxl362_data(&data[6]) * ADXL362_TEMP_SCALE;
accel.x = sensor_data_muli(priv->scale,
adxl362_data(&data[0]));
accel.y = sensor_data_muli(priv->scale,
adxl362_data(&data[2]));
accel.z = sensor_data_muli(priv->scale,
adxl362_data(&data[4]));
accel.temperature = sensor_data_muli(
sensor_data_ftof(ADXL362_TEMP_SCALE), adxl362_data(&data[6]));

priv->lower.push_event(priv->lower.priv, &accel, sizeof(accel));
}
Expand Down Expand Up @@ -602,7 +607,7 @@ int adxl362_register(int devno, FAR struct spi_dev_s *spi)
priv->lower.ops = &g_adxl362_accel_ops;
priv->lower.type = SENSOR_TYPE_ACCELEROMETER;
priv->lower.nbuffer = 1;
priv->scale = (CONSTANTS_ONE_G / 1000.0f);
priv->scale = sensor_data_ftof(CONSTANTS_ONE_G / 1000.0f);
priv->devno = devno;
#ifdef CONFIG_SENSORS_ADXL362_POLL
priv->enabled = false;
Expand Down
19 changes: 11 additions & 8 deletions drivers/sensors/adxl372_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ struct adxl372_sensor_s
{
struct sensor_lowerhalf_s lower;
FAR struct spi_dev_s *spi;
float scale;
sensor_data_t scale;
int devno;
#ifdef CONFIG_SENSORS_ADXL372_POLL
bool enabled;
Expand Down Expand Up @@ -447,9 +447,9 @@ static int adxl372_fetch(FAR struct sensor_lowerhalf_s *lower,
adxl372_getregs(priv, ADXL372_XDATA_H, (FAR uint8_t *)data, 6);

accel.timestamp = sensor_get_timestamp();
accel.x = (float)adxl372_data(&data[0]) * priv->scale;
accel.y = (float)adxl372_data(&data[2]) * priv->scale;
accel.z = (float)adxl372_data(&data[4]) * priv->scale;
accel.x = sensor_data_muli(priv->scale, adxl372_data(&data[0]));
accel.y = sensor_data_muli(priv->scale, adxl372_data(&data[2]));
accel.z = sensor_data_muli(priv->scale, adxl372_data(&data[4]));
accel.temperature = 0;

memcpy(buffer, &accel, sizeof(accel));
Expand Down Expand Up @@ -504,9 +504,12 @@ static int adxl372_thread(int argc, FAR char **argv)
adxl372_getregs(priv, ADXL372_XDATA_H, (FAR uint8_t *)data, 6);

accel.timestamp = sensor_get_timestamp();
accel.x = (float)adxl372_data(&data[0]) * priv->scale;
accel.y = (float)adxl372_data(&data[2]) * priv->scale;
accel.z = (float)adxl372_data(&data[4]) * priv->scale;
accel.x = sensor_data_muli(priv->scale,
adxl372_data(&data[0]));
accel.y = sensor_data_muli(priv->scale,
adxl372_data(&data[2]));
accel.z = sensor_data_muli(priv->scale,
adxl372_data(&data[4]));
accel.temperature = 0;

priv->lower.push_event(priv->lower.priv, &accel, sizeof(accel));
Expand Down Expand Up @@ -566,7 +569,7 @@ int adxl372_register_uorb(int devno, FAR struct spi_dev_s *spi)
priv->lower.ops = &g_adxl372_accel_ops;
priv->lower.type = SENSOR_TYPE_ACCELEROMETER;
priv->lower.nbuffer = 1;
priv->scale = (CONSTANTS_ONE_G / 10.0f);
priv->scale = sensor_data_ftof(CONSTANTS_ONE_G / 10.0f);
priv->devno = devno;
#ifdef CONFIG_SENSORS_ADXL372_POLL
priv->enabled = false;
Expand Down
32 changes: 16 additions & 16 deletions drivers/sensors/bh1749nuc_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ struct bh1749nuc_sensor_dev_s
{
struct bh1749nuc_sensor_s priv[BH1749NUC_MAX_IDX];
struct bh1749nuc_dev_s dev;
float scale_r;
float scale_g;
float scale_b;
float scale_ir;
sensor_data_t scale_r;
sensor_data_t scale_g;
sensor_data_t scale_b;
sensor_data_t scale_ir;
mutex_t lock;
#ifdef CONFIG_SENSORS_BH1749NUC_POLL
sem_t run;
Expand Down Expand Up @@ -231,11 +231,11 @@ static int bh1749nuc_fetch(FAR struct sensor_lowerhalf_s *lower,

rgb_data.timestamp = now;
tmp = bh1749nuc_read16(dev, BH1749NUC_RED_DATA_LSB);
rgb_data.r = (tmp * priv->dev->scale_r);
rgb_data.r = sensor_data_muli(priv->dev->scale_r, tmp);
tmp = bh1749nuc_read16(dev, BH1749NUC_GREEN_DATA_LSB);
rgb_data.g = (tmp * priv->dev->scale_g);
rgb_data.g = sensor_data_muli(priv->dev->scale_g, tmp);
tmp = bh1749nuc_read16(dev, BH1749NUC_BLUE_DATA_LSB);
rgb_data.b = (tmp * priv->dev->scale_b);
rgb_data.b = sensor_data_muli(priv->dev->scale_b, tmp);

memcpy(buffer, &rgb_data, sizeof(rgb_data));
ret = sizeof(rgb_data);
Expand All @@ -250,7 +250,7 @@ static int bh1749nuc_fetch(FAR struct sensor_lowerhalf_s *lower,

ir_data.timestamp = now;
tmp = bh1749nuc_read16(dev, BH1749NUC_IR_DATA_LSB);
ir_data.ir = (tmp * priv->dev->scale_ir);
ir_data.ir = sensor_data_muli(priv->dev->scale_ir, tmp);

memcpy(buffer, &ir_data, sizeof(ir_data));
ret = sizeof(ir_data);
Expand Down Expand Up @@ -361,11 +361,11 @@ static int bh1749nuc_thread(int argc, FAR char **argv)
{
rgb_data.timestamp = now;
tmp = bh1749nuc_read16(&dev->dev, BH1749NUC_RED_DATA_LSB);
rgb_data.r = (tmp * dev->scale_r);
rgb_data.r = sensor_data_muli(dev->scale_r, tmp);
tmp = bh1749nuc_read16(&dev->dev, BH1749NUC_GREEN_DATA_LSB);
rgb_data.g = (tmp * dev->scale_g);
rgb_data.g = sensor_data_muli(dev->scale_g, tmp);
tmp = bh1749nuc_read16(&dev->dev, BH1749NUC_BLUE_DATA_LSB);
rgb_data.b = (tmp * dev->scale_b);
rgb_data.b = sensor_data_muli(dev->scale_b, tmp);

rgb->lower.push_event(rgb->lower.priv,
&rgb_data, sizeof(rgb_data));
Expand All @@ -375,7 +375,7 @@ static int bh1749nuc_thread(int argc, FAR char **argv)
{
ir_data.timestamp = now;
tmp = bh1749nuc_read16(&dev->dev, BH1749NUC_IR_DATA_LSB);
ir_data.ir = (tmp * dev->scale_ir);
ir_data.ir = sensor_data_muli(dev->scale_ir, tmp);

ir->lower.push_event(ir->lower.priv,
&ir_data, sizeof(ir_data));
Expand Down Expand Up @@ -459,10 +459,10 @@ int bh1749nuc_register_uorb(int devno, FAR struct bh1749nuc_config_s *config)

/* Return data in lux unit for RGB and IR */

dev->scale_r = (20.0f / 71.0f) * (1e-6 / 1.46e-7);
dev->scale_g = (20.0f / 99.0f) * (1e-6 / 1.46e-7);
dev->scale_b = (20.0f / 70.0f) * (1e-6 / 1.46e-7);
dev->scale_ir = (20.0f / 25.0f) * (1e-6 / 1.46e-7);
dev->scale_r = sensor_data_ftof((20.0f / 71.0f) * (1e-6 / 1.46e-7));
dev->scale_g = sensor_data_ftof((20.0f / 99.0f) * (1e-6 / 1.46e-7));
dev->scale_b = sensor_data_ftof((20.0f / 70.0f) * (1e-6 / 1.46e-7));
dev->scale_ir = sensor_data_ftof((20.0f / 25.0f) * (1e-6 / 1.46e-7));

/* Register sensor */

Expand Down
6 changes: 6 additions & 0 deletions drivers/sensors/bme680_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@
* Pre-processor Definitions
****************************************************************************/

/* Only float data type supported now */

#ifdef CONFIG_SENSORS_USE_B16
# error fixed-point data type not supported yet
#endif

#define BME680_ADDR 0x76 /* I2C Slave Address */
#define BME680_FREQ CONFIG_BME680_I2C_FREQUENCY
#define BME680_DEVID 0x61
Expand Down
6 changes: 6 additions & 0 deletions drivers/sensors/bme688_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@
* Pre-processor Definitions
****************************************************************************/

/* Only float data type supported now */

#ifdef CONFIG_SENSORS_USE_B16
# error fixed-point data type not supported yet
#endif

#define BME688_ADDR 0x76 /* I2C Slave Address */
#define BME688_FREQ CONFIG_BME688_I2C_FREQUENCY
#define BME688_DEVID 0x61
Expand Down
6 changes: 6 additions & 0 deletions drivers/sensors/bmi088_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@
* Pre-processor Definitions
****************************************************************************/

/* Only float data type supported now */

#ifdef CONFIG_SENSORS_USE_B16
# error fixed-point data type not supported yet
#endif

#define BMI088_DEFAULT_INTERVAL 10000 /* Default conversion interval. */

/****************************************************************************
Expand Down
6 changes: 6 additions & 0 deletions drivers/sensors/bmi160_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@
* Pre-processor Definitions
****************************************************************************/

/* Only float data type supported now */

#ifdef CONFIG_SENSORS_USE_B16
# error fixed-point data type not supported yet
#endif

#define BMI160_DEFAULT_INTERVAL 10000 /* Default conversion interval. */

/****************************************************************************
Expand Down
6 changes: 6 additions & 0 deletions drivers/sensors/bmi270_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@
* Pre-processor Definitions
****************************************************************************/

/* Only float data type supported now */

#ifdef CONFIG_SENSORS_USE_B16
# error fixed-point data type not supported yet
#endif

#define CONSTANTS_ONE_G 9.8f

/****************************************************************************
Expand Down
6 changes: 6 additions & 0 deletions drivers/sensors/bmm150_uorb.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@
* Pre-processor Definitions
****************************************************************************/

/* Only float data type supported now */

#ifdef CONFIG_SENSORS_USE_B16
# error fixed-point data type not supported yet
#endif

#define BMM150_CHIPID_VAL 0x32

#define BMM150_CHIPID 0x40
Expand Down
4 changes: 3 additions & 1 deletion drivers/sensors/bmp180_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ void bmp180_read_press_temp(FAR struct bmp180_dev_s *priv)
****************************************************************************/

int bmp180_getpressure(FAR struct bmp180_dev_s *priv,
FAR float *temperature)
FAR int *temperature)
{
int32_t x1;
int32_t x2;
Expand Down Expand Up @@ -338,7 +338,9 @@ int bmp180_getpressure(FAR struct bmp180_dev_s *priv,
sninfo("Compensated temperature = %" PRId32 "\n", temp);

if (temperature != NULL)
{
*temperature = temp;
}

/* Calculate true pressure */

Expand Down
2 changes: 1 addition & 1 deletion drivers/sensors/bmp180_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,6 @@ int bmp180_checkid(FAR struct bmp180_dev_s *priv);
void bmp180_updatecaldata(FAR struct bmp180_dev_s *priv);
void bmp180_read_press_temp(FAR struct bmp180_dev_s *priv);
int bmp180_getpressure(FAR struct bmp180_dev_s *priv,
FAR float *temperature);
FAR int *temperature);

#endif /* CONFIG_I2C && CONFIG_SENSORS_BMP180 */
Loading
Loading