From 020e558772c23d4df03802acebf9decec56c709b Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Sat, 29 Nov 2025 21:37:11 +0100 Subject: [PATCH 1/7] drivers/sensors: add initial support for fixed-point data for sensors new sensor framework can now select between float data type and fixed-point data type Signed-off-by: raiden00pl --- .../drivers/special/sensors/sensors_uorb.rst | 63 ++- drivers/sensors/Kconfig | 18 + drivers/sensors/adxl362_uorb.c | 6 + drivers/sensors/bme680_uorb.c | 6 + drivers/sensors/bme688_uorb.c | 6 + drivers/sensors/bmi088_uorb.c | 6 + drivers/sensors/bmi160_uorb.c | 6 + drivers/sensors/bmi270_uorb.c | 6 + drivers/sensors/bmm150_uorb.c | 6 + drivers/sensors/bmp180_uorb.c | 6 + drivers/sensors/bmp280_uorb.c | 6 + drivers/sensors/ds18b20_uorb.c | 6 + drivers/sensors/fakesensor_uorb.c | 10 + drivers/sensors/fs3000_uorb.c | 6 + drivers/sensors/gnss_uorb.c | 6 + drivers/sensors/goldfish_gnss_uorb.c | 10 + drivers/sensors/goldfish_sensor_uorb.c | 6 + drivers/sensors/hyt271_uorb.c | 6 + drivers/sensors/l3gd20_uorb.c | 10 + drivers/sensors/l86xxx_uorb.c | 6 + drivers/sensors/lis2mdl_uorb.c | 6 + drivers/sensors/lsm6dso32_uorb.c | 6 + drivers/sensors/lsm9ds1_uorb.c | 6 + drivers/sensors/ltr308_uorb.c | 6 + drivers/sensors/mcp9600_uorb.c | 6 + drivers/sensors/mpu9250_uorb.c | 6 + drivers/sensors/ms56xx_uorb.c | 6 + drivers/sensors/sht4x_uorb.c | 6 + drivers/sensors/wtgahrs2_uorb.c | 6 + include/nuttx/uorb.h | 410 +++++++++++------- 30 files changed, 490 insertions(+), 175 deletions(-) diff --git a/Documentation/components/drivers/special/sensors/sensors_uorb.rst b/Documentation/components/drivers/special/sensors/sensors_uorb.rst index 75187b66541e0..77bb44d7ac178 100644 --- a/Documentation/components/drivers/special/sensors/sensors_uorb.rst +++ b/Documentation/components/drivers/special/sensors/sensors_uorb.rst @@ -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** ======== @@ -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; diff --git a/drivers/sensors/Kconfig b/drivers/sensors/Kconfig index f78e3449b912e..3553e34580387 100644 --- a/drivers/sensors/Kconfig +++ b/drivers/sensors/Kconfig @@ -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 diff --git a/drivers/sensors/adxl362_uorb.c b/drivers/sensors/adxl362_uorb.c index dbb7ad628e458..f64a607e8dc7d 100644 --- a/drivers/sensors/adxl362_uorb.c +++ b/drivers/sensors/adxl362_uorb.c @@ -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 ADXL362_SPI_FREQUENCY 1000000 #define ADXL362_SPI_MODE SPIDEV_MODE0 diff --git a/drivers/sensors/bme680_uorb.c b/drivers/sensors/bme680_uorb.c index f23d2ea849ec5..b33a8629de647 100644 --- a/drivers/sensors/bme680_uorb.c +++ b/drivers/sensors/bme680_uorb.c @@ -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 diff --git a/drivers/sensors/bme688_uorb.c b/drivers/sensors/bme688_uorb.c index 8b41137b67823..9edb4be4e583a 100644 --- a/drivers/sensors/bme688_uorb.c +++ b/drivers/sensors/bme688_uorb.c @@ -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 diff --git a/drivers/sensors/bmi088_uorb.c b/drivers/sensors/bmi088_uorb.c index 267670a2aa275..d0ccfebd3b9c4 100644 --- a/drivers/sensors/bmi088_uorb.c +++ b/drivers/sensors/bmi088_uorb.c @@ -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. */ /**************************************************************************** diff --git a/drivers/sensors/bmi160_uorb.c b/drivers/sensors/bmi160_uorb.c index 6acd1e0386a24..ac96c096c2408 100644 --- a/drivers/sensors/bmi160_uorb.c +++ b/drivers/sensors/bmi160_uorb.c @@ -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. */ /**************************************************************************** diff --git a/drivers/sensors/bmi270_uorb.c b/drivers/sensors/bmi270_uorb.c index 9140504371079..d6efebe831782 100644 --- a/drivers/sensors/bmi270_uorb.c +++ b/drivers/sensors/bmi270_uorb.c @@ -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 /**************************************************************************** diff --git a/drivers/sensors/bmm150_uorb.c b/drivers/sensors/bmm150_uorb.c index 09fda966f9d61..4f390680a5b3c 100644 --- a/drivers/sensors/bmm150_uorb.c +++ b/drivers/sensors/bmm150_uorb.c @@ -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 diff --git a/drivers/sensors/bmp180_uorb.c b/drivers/sensors/bmp180_uorb.c index b3c553219d925..305a7bf91dc3e 100644 --- a/drivers/sensors/bmp180_uorb.c +++ b/drivers/sensors/bmp180_uorb.c @@ -37,6 +37,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 BMP180_MIN_INTERVAL 30000 /**************************************************************************** diff --git a/drivers/sensors/bmp280_uorb.c b/drivers/sensors/bmp280_uorb.c index 421af2ec9247b..fef7ce64ad4b3 100644 --- a/drivers/sensors/bmp280_uorb.c +++ b/drivers/sensors/bmp280_uorb.c @@ -45,6 +45,12 @@ * Pre-processor Definitions ****************************************************************************/ +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + #ifdef CONFIG_BMP280_I2C_ADDR_76 #define BMP280_ADDR 0x76 #else diff --git a/drivers/sensors/ds18b20_uorb.c b/drivers/sensors/ds18b20_uorb.c index 7849f73bac4a4..ac3b811f8fc61 100644 --- a/drivers/sensors/ds18b20_uorb.c +++ b/drivers/sensors/ds18b20_uorb.c @@ -50,6 +50,12 @@ * Pre-processor Definitions ****************************************************************************/ +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + #ifndef CONFIG_ENDIAN_BIG # define ds18b20_leuint64(x) (x) #endif diff --git a/drivers/sensors/fakesensor_uorb.c b/drivers/sensors/fakesensor_uorb.c index 6077cf9e32c80..8a296da198a24 100644 --- a/drivers/sensors/fakesensor_uorb.c +++ b/drivers/sensors/fakesensor_uorb.c @@ -43,6 +43,16 @@ #include #include +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + /**************************************************************************** * Private Types ****************************************************************************/ diff --git a/drivers/sensors/fs3000_uorb.c b/drivers/sensors/fs3000_uorb.c index 4713500379960..949a2ec786deb 100644 --- a/drivers/sensors/fs3000_uorb.c +++ b/drivers/sensors/fs3000_uorb.c @@ -45,6 +45,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 FS3000_ADDR 0x28 /**************************************************************************** diff --git a/drivers/sensors/gnss_uorb.c b/drivers/sensors/gnss_uorb.c index 49db97eafdc63..d955b75cc6fb3 100644 --- a/drivers/sensors/gnss_uorb.c +++ b/drivers/sensors/gnss_uorb.c @@ -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 GNSS_PATH_FMT "/dev/ttyGNSS%d" #define GNSS_PARSE_BUFFERSIZE 256 diff --git a/drivers/sensors/goldfish_gnss_uorb.c b/drivers/sensors/goldfish_gnss_uorb.c index 86c45de1ec134..a815d2a0e375d 100644 --- a/drivers/sensors/goldfish_gnss_uorb.c +++ b/drivers/sensors/goldfish_gnss_uorb.c @@ -39,6 +39,16 @@ #include #include +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + /**************************************************************************** * Private Types ****************************************************************************/ diff --git a/drivers/sensors/goldfish_sensor_uorb.c b/drivers/sensors/goldfish_sensor_uorb.c index f108e7a5e3cff..96e2b619bd12b 100644 --- a/drivers/sensors/goldfish_sensor_uorb.c +++ b/drivers/sensors/goldfish_sensor_uorb.c @@ -42,6 +42,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 GOLDFISH_ACCELERATION 0 #define GOLDFISH_GYROSCOPE 1 #define GOLDFISH_MAGNETIC_FIELD 2 diff --git a/drivers/sensors/hyt271_uorb.c b/drivers/sensors/hyt271_uorb.c index 4c3d9367b8cf7..30cdf198b2df7 100644 --- a/drivers/sensors/hyt271_uorb.c +++ b/drivers/sensors/hyt271_uorb.c @@ -47,6 +47,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 HYT271_TEMPDATA_MASK 0x3fff #define HYT271_HUMIDATA_MASK 0x3fff diff --git a/drivers/sensors/l3gd20_uorb.c b/drivers/sensors/l3gd20_uorb.c index db7bb0cfdbb90..20b3d479db814 100644 --- a/drivers/sensors/l3gd20_uorb.c +++ b/drivers/sensors/l3gd20_uorb.c @@ -46,6 +46,16 @@ #if defined(CONFIG_SPI) && defined(CONFIG_SENSORS_L3GD20) +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + /**************************************************************************** * Private Types ****************************************************************************/ diff --git a/drivers/sensors/l86xxx_uorb.c b/drivers/sensors/l86xxx_uorb.c index 5aeb0b2b444f3..cf305950e7e4b 100644 --- a/drivers/sensors/l86xxx_uorb.c +++ b/drivers/sensors/l86xxx_uorb.c @@ -58,6 +58,12 @@ * Pre-processor Definitions ****************************************************************************/ +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + #ifndef CONFIG_SENSORS_L86_XXX_THREAD_STACKSIZE #define CONFIG_SENSORS_L86_XXX_THREAD_STACKSIZE 10000 #endif diff --git a/drivers/sensors/lis2mdl_uorb.c b/drivers/sensors/lis2mdl_uorb.c index e7b194ce77d76..431b28df9c313 100644 --- a/drivers/sensors/lis2mdl_uorb.c +++ b/drivers/sensors/lis2mdl_uorb.c @@ -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 + /* The value that should be in the "who am I" register */ #define WHO_AM_I_VAL 0x40 diff --git a/drivers/sensors/lsm6dso32_uorb.c b/drivers/sensors/lsm6dso32_uorb.c index 4220c523c3b21..8e5f92ba34ce5 100644 --- a/drivers/sensors/lsm6dso32_uorb.c +++ b/drivers/sensors/lsm6dso32_uorb.c @@ -46,6 +46,12 @@ * Pre-processor Definitions ****************************************************************************/ +/* Only float data type supported now */ + +#ifdef CONFIG_SENSORS_USE_B16 +# error fixed-point data type not supported yet +#endif + /* The value that should be in the WHO_AM_I register. */ #define WHO_AM_I_VAL 0x6c diff --git a/drivers/sensors/lsm9ds1_uorb.c b/drivers/sensors/lsm9ds1_uorb.c index 70ac95191b87b..c891e26df5042 100644 --- a/drivers/sensors/lsm9ds1_uorb.c +++ b/drivers/sensors/lsm9ds1_uorb.c @@ -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 /**************************************************************************** diff --git a/drivers/sensors/ltr308_uorb.c b/drivers/sensors/ltr308_uorb.c index 90d52d6a1fc3f..2f55b5bb93dbb 100644 --- a/drivers/sensors/ltr308_uorb.c +++ b/drivers/sensors/ltr308_uorb.c @@ -45,6 +45,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 LTR308_ADDR 0x53 #define DEVID 0xB1 diff --git a/drivers/sensors/mcp9600_uorb.c b/drivers/sensors/mcp9600_uorb.c index beafed9f2d3c1..65f1b56612a68 100644 --- a/drivers/sensors/mcp9600_uorb.c +++ b/drivers/sensors/mcp9600_uorb.c @@ -47,6 +47,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 REG_THERMO_HOT_JUNC 0x0 /* Thermocouple Hot-Junction, T H */ #define REG_JUNC_TEMP_DELTA 0x1 /* Junctions Temperature Delta, TΔ */ #define REG_COLD_JUNC_TEMP 0x2 /* Cold-Junction Temperature, T C */ diff --git a/drivers/sensors/mpu9250_uorb.c b/drivers/sensors/mpu9250_uorb.c index e5bbe22f0187a..e6f3542cc7917 100644 --- a/drivers/sensors/mpu9250_uorb.c +++ b/drivers/sensors/mpu9250_uorb.c @@ -51,6 +51,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 MPU9250_AKM_DEV_ID 0x48 /* Magnetometer device ID */ #define MIN(x, y) (x) > (y) ? (y) : (x) diff --git a/drivers/sensors/ms56xx_uorb.c b/drivers/sensors/ms56xx_uorb.c index 359fccc6caea4..d604da005f0d5 100644 --- a/drivers/sensors/ms56xx_uorb.c +++ b/drivers/sensors/ms56xx_uorb.c @@ -52,6 +52,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 MS56XX_CMD_RESET 0x1e #define MS56XX_CMD_START_ADC_READ 0x00 #define MS56XX_CMD_CONV_D1_OSR_256 0x40 /* D1 = uncompensated pressure */ diff --git a/drivers/sensors/sht4x_uorb.c b/drivers/sensors/sht4x_uorb.c index 9ac0cecdcf321..0d5fa74ffa9c8 100644 --- a/drivers/sensors/sht4x_uorb.c +++ b/drivers/sensors/sht4x_uorb.c @@ -47,6 +47,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 SHT4X_CRC_INIT 0xFF /* Initial value of the calculated CRC. */ #define SHT4X_CRC_POLY 0x31 /* CRC calculation polynomial. */ diff --git a/drivers/sensors/wtgahrs2_uorb.c b/drivers/sensors/wtgahrs2_uorb.c index c72b9db5bfabc..088447749a097 100644 --- a/drivers/sensors/wtgahrs2_uorb.c +++ b/drivers/sensors/wtgahrs2_uorb.c @@ -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 WTGAHRS2_ACCEL_IDX 0 #define WTGAHRS2_GYRO_IDX 1 #define WTGAHRS2_MAG_IDX 2 diff --git a/include/nuttx/uorb.h b/include/nuttx/uorb.h index 4b74ddfbedb68..358283e8f1f5c 100644 --- a/include/nuttx/uorb.h +++ b/include/nuttx/uorb.h @@ -36,10 +36,76 @@ #include +#ifdef CONFIG_SENSORS_USE_B16 +# include +#endif + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +/* Sensor data math operations. Sensors driver must use these macros to + * create portable code! + * + * Available 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 + * + */ + +#ifdef CONFIG_SENSORS_USE_B16 +# define sensor_data_ftof(f1) ftob16(((float)f1)) +# define sensor_data_itof(i) itob16((i)) +# define sensor_data_inv(i) b16inv((i)) +# define sensor_data_add(f1, f2) b16addb16((f1), (f2)) +# define sensor_data_sub(f1, f2) b16subb16((f1), (f2)) +# define sensor_data_subi(f1, i) b16subi((f1), (i)) +# define sensor_data_mul(f1, f2) b16mulb16((f1), (f2)) +# define sensor_data_muli(f1, i) b16muli((f1), (i)) +# define sensor_data_div(f1, f2) b16divb16((f1), (f2)) +# define sensor_data_divi(f1, i) b16divi((f1), (i)) +# define sensor_data_abs(f1) b16abs((f1)) +# define sensor_data_sqrt(f1) b16sqrt((f1)) +#else +# define sensor_data_ftof(f1) ((float)f1) +# define sensor_data_itof(i) ((float)i) +# define sensor_data_inv(i) ((1.0f) / (i)) +# define sensor_data_add(f1, f2) ((f1) + (f2)) +# define sensor_data_sub(f1, f2) ((f1) - (f2)) +# define sensor_data_subi(f1, i) ((f1) - ((float)i)) +# define sensor_data_mul(f1, f2) ((f1) * (f2)) +# define sensor_data_muli(f1, i) ((f1) * ((float)i)) +# define sensor_data_div(f1, f2) ((f1) / (f2)) +# define sensor_data_divi(f1, i) ((f1) / ((float)i)) +# define sensor_data_abs(f1) absf(f1) +# define sensor_data_sqrt(f1) sqrtf(f1) +#endif + /* sensor type definition */ /* Note: Some of the types of these sensors are aligned with Android, and @@ -625,238 +691,246 @@ * Public Types ****************************************************************************/ +/* Data type for sensors */ + +#ifdef CONFIG_SENSORS_USE_B16 +typedef b16_t sensor_data_t; +#else +typedef float sensor_data_t; +#endif + /* These structures prefixed with sensor_event are sensor data, and member * that are not used must be written as NAN or INT_MIN/INT_MAX, than * reported. */ -struct sensor_event /* Type: Sensor Common Event */ +struct sensor_event /* Type: Sensor Common Event */ { - uint64_t timestamp; /* Units is microseconds */ - uint32_t event; /* Common events */ + uint64_t timestamp; /* Units is microseconds */ + uint32_t event; /* Common events */ }; -struct sensor_accel /* Type: Accerometer */ +struct sensor_accel /* Type: Accerometer */ { - uint64_t timestamp; /* Units is microseconds */ - float x; /* Axis X in m/s^2 */ - float y; /* Axis Y in m/s^2 */ - float z; /* Axis Z in m/s^2 */ - float temperature; /* Temperature in degrees celsius */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t x; /* Axis X in m/s^2 */ + sensor_data_t y; /* Axis Y in m/s^2 */ + sensor_data_t z; /* Axis Z in m/s^2 */ + sensor_data_t temperature; /* Temperature in degrees celsius */ }; -struct sensor_mag /* Type: Magnetic Field */ +struct sensor_mag /* Type: Magnetic Field */ { - uint64_t timestamp; /* Units is microseconds */ - float x; /* Axis X in Gauss or micro Tesla (uT) */ - float y; /* Axis Y in Gauss or micro Tesla (uT) */ - float z; /* Axis Z in Gauss or micro Tesla (uT) */ - float temperature; /* Temperature in degrees celsius */ - int32_t status; /* Status of calibration */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t x; /* Axis X in Gauss or micro Tesla (uT) */ + sensor_data_t y; /* Axis Y in Gauss or micro Tesla (uT) */ + sensor_data_t z; /* Axis Z in Gauss or micro Tesla (uT) */ + sensor_data_t temperature; /* Temperature in degrees celsius */ + int32_t status; /* Status of calibration */ }; -struct sensor_orientation /* Type: Orientation */ +struct sensor_orientation /* Type: Orientation */ { - uint64_t timestamp; /* Units is microseconds */ - float x; /* azimuth */ - float y; /* pitch */ - float z; /* roll */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t x; /* azimuth */ + sensor_data_t y; /* pitch */ + sensor_data_t z; /* roll */ }; -struct sensor_gyro /* Type: Gyroscope */ +struct sensor_gyro /* Type: Gyroscope */ { - uint64_t timestamp; /* Units is microseconds */ - float x; /* Axis X in rad/s */ - float y; /* Axis Y in rad/s */ - float z; /* Axis Z in rad/s */ - float temperature; /* Temperature in degrees celsius */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t x; /* Axis X in rad/s */ + sensor_data_t y; /* Axis Y in rad/s */ + sensor_data_t z; /* Axis Z in rad/s */ + sensor_data_t temperature; /* Temperature in degrees celsius */ }; -struct sensor_light /* Type: Light */ +struct sensor_light /* Type: Light */ { - uint64_t timestamp; /* Units is microseconds */ - float light; /* in SI lux units */ - float ir; /* in SI lux units */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t light; /* in SI lux units */ + sensor_data_t ir; /* in SI lux units */ }; -struct sensor_baro /* Type: Barometer */ +struct sensor_baro /* Type: Barometer */ { - uint64_t timestamp; /* Units is microseconds */ - float pressure; /* pressure measurement in millibar or hpa */ - float temperature; /* Temperature in degrees celsius */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t pressure; /* pressure measurement in millibar or hpa */ + sensor_data_t temperature; /* Temperature in degrees celsius */ }; -struct sensor_noise /* Type: Noise Loudness */ +struct sensor_noise /* Type: Noise Loudness */ { - uint64_t timestamp; /* Units is microseconds */ - float db; /* in SI units db */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t db; /* in SI units db */ }; -struct sensor_prox /* Type: proximity */ +struct sensor_prox /* Type: proximity */ { - uint64_t timestamp; /* Units is microseconds */ - float proximity; /* distance to the nearest object in centimeters */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t proximity; /* distance to the nearest object in centimeters */ }; -struct sensor_rgb /* Type: RGB */ +struct sensor_rgb /* Type: RGB */ { - uint64_t timestamp; /* Units is microseconds */ - float r; /* Units is percent */ - float g; /* Units is percent */ - float b; /* Units is percent */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t r; /* Units is percent */ + sensor_data_t g; /* Units is percent */ + sensor_data_t b; /* Units is percent */ }; -struct sensor_rotation /* Type: Rotation */ +struct sensor_rotation /* Type: Rotation */ { - uint64_t timestamp; /* Units is microseconds */ - float x; /* x*sin(θ/2) */ - float y; /* y*sin(θ/2) */ - float z; /* z*sin(θ/2) */ - float w; /* cos(θ/2) */ - float status; /* estimated heading Accuracy (in radians) (-1 if unavailable) */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t x; /* x*sin(θ/2) */ + sensor_data_t y; /* y*sin(θ/2) */ + sensor_data_t z; /* z*sin(θ/2) */ + sensor_data_t w; /* cos(θ/2) */ + sensor_data_t status; /* estimated heading Accuracy (in radians) (-1 if unavailable) */ }; -struct sensor_humi /* Type: Relative Humidity */ +struct sensor_humi /* Type: Relative Humidity */ { - uint64_t timestamp; /* Units is microseconds */ - float humidity; /* in percent */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t humidity; /* in percent */ }; -struct sensor_temp /* Type: Ambient Temperature */ +struct sensor_temp /* Type: Ambient Temperature */ { - uint64_t timestamp; /* Units is microseconds */ - float temperature; /* Temperature in degrees celsius */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t temperature; /* Temperature in degrees celsius */ }; -struct sensor_pm25 /* Type: PM25 */ +struct sensor_pm25 /* Type: PM25 */ { - uint64_t timestamp; /* Units is microseconds */ - float pm25; /* in SI units ug/m^3 */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t pm25; /* in SI units ug/m^3 */ }; -struct sensor_pm1p0 /* Type: PM1P0 */ +struct sensor_pm1p0 /* Type: PM1P0 */ { - uint64_t timestamp; /* Units is microseconds */ - float pm1p0; /* in SI units ug/m^3 */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t pm1p0; /* in SI units ug/m^3 */ }; -struct sensor_pm10 /* Type: PM10 */ +struct sensor_pm10 /* Type: PM10 */ { - uint64_t timestamp; /* Units is microseconds */ - float pm10; /* in SI units ug/m^3 */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t pm10; /* in SI units ug/m^3 */ }; -struct sensor_step_counter /* Type: Step Coun */ +struct sensor_step_counter /* Type: Step Coun */ { - uint64_t timestamp; /* Units is microseconds */ - uint32_t steps; /* Step counting */ - uint32_t cadence; /* Stride frequency */ + uint64_t timestamp; /* Units is microseconds */ + uint32_t steps; /* Step counting */ + uint32_t cadence; /* Stride frequency */ }; -struct sensor_ph /* Type: PH */ +struct sensor_ph /* Type: PH */ { - uint64_t timestamp; /* Units is microseconds */ - float ph; /* PH = 7.0 neutral, PH < 7.0 acidic, PH > 7.0 alkaline */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t ph; /* PH = 7.0 neutral, PH < 7.0 acidic, PH > 7.0 alkaline */ }; -struct sensor_hrate /* Type: Heart Rate */ +struct sensor_hrate /* Type: Heart Rate */ { - uint64_t timestamp; /* Units is microseconds */ - float bpm; /* is SI units BPM */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t bpm; /* is SI units BPM */ }; -struct sensor_pose_6dof /* Type: Pose 6dof */ +struct sensor_pose_6dof /* Type: Pose 6dof */ { - uint64_t timestamp; /* Units is microseconds */ - float x; /* x*sin(theta/2) */ - float y; /* y*sin(theta/2) */ - float z; /* z*sin(theta/2) */ - float w; /* cos(theta/2) */ - float tx; /* Translation along x axis from an arbitrary origin. */ - float ty; /* Translation along y axis from an arbitrary origin. */ - float tz; /* Translation along z axis from an arbitrary origin. */ - float dx; /* Delta quaternion rotation x*sin(theta/2) */ - float dy; /* Delta quaternion rotation y*sin(theta/2) */ - float dz; /* Delta quaternion rotation z*sin(theta/2) */ - float dw; /* Delta quaternion rotation cos(theta/2) */ - float dtx; /* Delta translation along x axis. */ - float dty; /* Delta translation along y axis. */ - float dtz; /* Delta translation along z axis. */ - uint64_t number; /* Sequence number; ascending sequentially from 0 */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t x; /* x*sin(theta/2) */ + sensor_data_t y; /* y*sin(theta/2) */ + sensor_data_t z; /* z*sin(theta/2) */ + sensor_data_t w; /* cos(theta/2) */ + sensor_data_t tx; /* Translation along x axis from an arbitrary origin. */ + sensor_data_t ty; /* Translation along y axis from an arbitrary origin. */ + sensor_data_t tz; /* Translation along z axis from an arbitrary origin. */ + sensor_data_t dx; /* Delta quaternion rotation x*sin(theta/2) */ + sensor_data_t dy; /* Delta quaternion rotation y*sin(theta/2) */ + sensor_data_t dz; /* Delta quaternion rotation z*sin(theta/2) */ + sensor_data_t dw; /* Delta quaternion rotation cos(theta/2) */ + sensor_data_t dtx; /* Delta translation along x axis. */ + sensor_data_t dty; /* Delta translation along y axis. */ + sensor_data_t dtz; /* Delta translation along z axis. */ + uint64_t number; /* Sequence number; ascending sequentially from 0 */ }; -struct sensor_gas /* Type: Gas */ +struct sensor_gas /* Type: Gas */ { - uint64_t timestamp; /* Units is microseconds */ - float gas_resistance; /* Gas resistance in kOhm */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t gas_resistance; /* Gas resistance in kOhm */ }; struct sensor_hbeat /* Type: Heart Beat */ { - uint64_t timestamp; /* Units is microseconds */ - float beat; /* Units is times/minutes */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t beat; /* Units is times/minutes */ }; struct sensor_force /* Type: Force */ { - uint64_t timestamp; /* Unit is microseconds */ - float force; /* Force value, units is N */ - int32_t event; /* Force event */ + uint64_t timestamp; /* Unit is microseconds */ + sensor_data_t force; /* Force value, units is N */ + int32_t event; /* Force event */ }; struct sensor_velocity /* Type: Velocity */ { - uint64_t timestamp; /* Unit is microseconds */ - float velocity; /* Velocity value, units is m/s (SI) */ + uint64_t timestamp; /* Unit is microseconds */ + sensor_data_t velocity; /* Velocity value, units is m/s (SI) */ }; struct sensor_hall /* Type: HALL */ { uint64_t timestamp; /* Units is microseconds */ - int32_t hall; /* Hall state */ + int32_t hall; /* Hall state */ }; struct sensor_uv /* Type: Ultraviolet Light */ { - uint64_t timestamp; /* Units is microseconds */ - float uvi; /* the value range is 0 - 15 */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t uvi; /* the value range is 0 - 15 */ }; struct sensor_angle /* Type: Angle */ { - uint64_t timestamp; /* Units is microseconds */ - float angle; /* Angle. Unit is degree */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t angle; /* Angle. Unit is degree */ }; struct sensor_ir /* Type: Infrared Ray */ { - uint64_t timestamp; /* Units is microseconds */ - float ir; /* in SI units lux */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t ir; /* in SI units lux */ }; struct sensor_hcho /* Type: HCHO */ { - uint64_t timestamp; /* Units is microseconds */ - float hcho; /* in SI units ppm */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t hcho; /* in SI units ppm */ }; struct sensor_tvoc /* Type: TVOC */ { - uint64_t timestamp; /* Units is microseconds */ - float tvoc; /* in SI units ppm */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t tvoc; /* in SI units ppm */ }; struct sensor_dust /* Type: DUST */ { - uint64_t timestamp; /* Units is microseconds */ - float dust; /* is SI units ug/m^3 */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t dust; /* is SI units ug/m^3 */ }; struct sensor_ecg /* Type: ECG */ { - uint64_t timestamp; /* Unit is microseconds */ - float ecg; /* Unit is μV */ - uint32_t status; /* Status info */ + uint64_t timestamp; /* Unit is microseconds */ + sensor_data_t ecg; /* Unit is μV */ + uint32_t status; /* Status info */ }; struct sensor_ppgd /* Type: PPGD */ @@ -877,29 +951,29 @@ struct sensor_ppgq /* Type: PPDQ */ struct sensor_impd /* Type: Impedance */ { - uint64_t timestamp; /* Unit is microseconds */ - float real; /* Real part, unit is Ohm(Ω) */ - float imag; /* Imaginary part, unit is Ohm(Ω) */ + uint64_t timestamp; /* Unit is microseconds */ + sensor_data_t real; /* Real part, unit is Ohm(Ω) */ + sensor_data_t imag; /* Imaginary part, unit is Ohm(Ω) */ }; struct sensor_ots /* Type: OTS */ { uint64_t timestamp; /* Unit is microseconds */ - int32_t x; /* Axis X in counts */ - int32_t y; /* Axis Y in counts */ + int32_t x; /* Axis X in counts */ + int32_t y; /* Axis Y in counts */ }; struct sensor_co2 /* Type: CO2 */ { - uint64_t timestamp; /* Units is microseconds */ - float co2; /* in SI units ppm */ + uint64_t timestamp; /* Units is microseconds */ + sensor_data_t co2; /* in SI units ppm */ }; struct sensor_cap /* Type: Capacitance */ { uint64_t timestamp; /* Unit is microseconds */ - int32_t status; /* Detection status */ - int32_t rawdata[4]; /* in SI units pF */ + int32_t status; /* Detection status */ + int32_t rawdata[4]; /* in SI units pF */ }; struct sensor_gnss /* Type: GNSS */ @@ -913,25 +987,25 @@ struct sensor_gnss /* Type: GNSS */ uint64_t time_utc; - float latitude; /* Unit is degrees */ - float longitude; /* Unit is degrees */ - float altitude; /* Altitude above MSL(mean seal level), Unit is SI m */ - float altitude_ellipsoid; /* Altitude bove Ellipsoid, Unit is SI m */ + sensor_data_t latitude; /* Unit is degrees */ + sensor_data_t longitude; /* Unit is degrees */ + sensor_data_t altitude; /* Altitude above MSL(mean seal level), Unit is SI m */ + sensor_data_t altitude_ellipsoid; /* Altitude bove Ellipsoid, Unit is SI m */ - float eph; /* GNSS horizontal position accuracy (metres) */ - float epv; /* GNSS vertical position accuracy (metres) */ + sensor_data_t eph; /* GNSS horizontal position accuracy (metres) */ + sensor_data_t epv; /* GNSS vertical position accuracy (metres) */ - float hdop; /* Horizontal dilution of precision */ - float pdop; /* Position dilution of precision */ - float vdop; /* Vertical dilution of precision */ + sensor_data_t hdop; /* Horizontal dilution of precision */ + sensor_data_t pdop; /* Position dilution of precision */ + sensor_data_t vdop; /* Vertical dilution of precision */ - float ground_speed; /* GNSS ground speed, Unit is m/s */ + sensor_data_t ground_speed; /* GNSS ground speed, Unit is m/s */ /* Course over ground (NOT heading, but direction of movement), * Unit is Si degrees */ - float course; + sensor_data_t course; uint32_t satellites_used; /* Number of satellites used */ uint32_t firmware_ver; /* Version of GNSS firmware */ @@ -966,7 +1040,7 @@ struct sensor_gnss_satellite * Flag: SENSOR_GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY */ - float cf; + sensor_data_t cf; struct satellite { @@ -1017,14 +1091,14 @@ struct sensor_gnss_measurement * nanoseconds. */ - float time_offset_ns; + sensor_data_t time_offset_ns; /* The received GNSS Time-of-Week at the measurement time, in * nanoseconds. */ - int64_t received_sv_time_in_ns; - int64_t received_sv_time_uncertainty_in_ns; + int64_t received_sv_time_in_ns; + int64_t received_sv_time_uncertainty_in_ns; /* GNSS measurement state, see SENSOR_GNSS_MEASUREMENT_STATE_*. */ @@ -1032,18 +1106,18 @@ struct sensor_gnss_measurement /* dBHz, Carrier-to-noise density. */ - float c_n0_dbhz; + sensor_data_t c_n0_dbhz; /* Pseudorange rate(m/s) at the timestamp. */ - float pseudorange_rate_mps; - float pseudorange_rate_uncertainty_mps; + sensor_data_t pseudorange_rate_mps; + sensor_data_t pseudorange_rate_uncertainty_mps; /* Accumulated delta range. */ - uint32_t accumulated_delta_range_state; - float accumulated_delta_range_m; - float accumulated_delta_range_uncertainty_m; + uint32_t accumulated_delta_range_state; + sensor_data_t accumulated_delta_range_m; + sensor_data_t accumulated_delta_range_uncertainty_m; /* Carrier related between the satellite and the receiver. * flags: @@ -1053,10 +1127,10 @@ struct sensor_gnss_measurement * SENSOR_GNSS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY */ - float carrier_frequency_hz; - int64_t carrier_cycles; - float carrier_phase; - float carrier_phase_uncertainty; + sensor_data_t carrier_frequency_hz; + int64_t carrier_cycles; + sensor_data_t carrier_phase; + sensor_data_t carrier_phase_uncertainty; uint32_t multipath_indicator; @@ -1088,8 +1162,8 @@ struct sensor_gnss_clock * SENSOR_GNSS_CLOCK_HAS_TIME_UNCERTAINTY */ - int64_t time_ns; - float time_uncertainty_ns; + int64_t time_ns; + sensor_data_t time_uncertainty_ns; /* Discontinuities in the HW clock. */ @@ -1104,9 +1178,9 @@ struct sensor_gnss_clock * SENSOR_GNSS_CLOCK_HAS_BIAS_UNCERTAINTY */ - int64_t full_bias_ns; - float bias_ns; /* Sub-nanosecond bias */ - float bias_uncertainty_ns; + int64_t full_bias_ns; + sensor_data_t bias_ns; /* Sub-nanosecond bias */ + sensor_data_t bias_uncertainty_ns; /* The clock's drift in nanoseconds (per second). * A positive value means that the frequency is higher than @@ -1116,8 +1190,8 @@ struct sensor_gnss_clock * SENSOR_GNSS_CLOCK_HAS_DRIFT_UNCERTAINTY */ - float drift_nsps; - float drift_uncertainty_nsps; + sensor_data_t drift_nsps; + sensor_data_t drift_uncertainty_nsps; }; /* GNSS Geofence events */ @@ -1170,9 +1244,9 @@ struct sensor_gnss_geofence_param int32_t type; int32_t geofence_id; - float latitude; - float longitude; - float radius_meters; + sensor_data_t latitude; + sensor_data_t longitude; + sensor_data_t radius_meters; /* Which transitions to monitor. * Available: see SENSOR_GNSS_GEOFENCE_TRANS_*. @@ -1242,15 +1316,15 @@ struct sensor_device_info_s /* Rough estimate of this sensor's power consumption in mA. */ - float power; + sensor_data_t power; /* Maximum range of this sensor's value in SI units. */ - float max_range; + sensor_data_t max_range; /* Smallest difference between two values reported by this sensor. */ - float resolution; + sensor_data_t resolution; /* This value depends on the reporting mode: * From 97b9241dacecfc67dc15722f692e7a11c8f8c317 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Sat, 29 Nov 2025 22:05:39 +0100 Subject: [PATCH 2/7] sensors/bmp280_uorb: support for fixed-point data support for fixed-point data for bmp280_uorb Signed-off-by: raiden00pl --- drivers/sensors/bmp280_uorb.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/sensors/bmp280_uorb.c b/drivers/sensors/bmp280_uorb.c index fef7ce64ad4b3..2b2abaf3961ba 100644 --- a/drivers/sensors/bmp280_uorb.c +++ b/drivers/sensors/bmp280_uorb.c @@ -45,12 +45,6 @@ * Pre-processor Definitions ****************************************************************************/ -/* Only float data type supported now */ - -#ifdef CONFIG_SENSORS_USE_B16 -# error fixed-point data type not supported yet -#endif - #ifdef CONFIG_BMP280_I2C_ADDR_76 #define BMP280_ADDR 0x76 #else @@ -665,8 +659,8 @@ static int bmp280_fetch(FAR struct sensor_lowerhalf_s *lower, clock_systime_timespec(&ts); baro_data.timestamp = 1000000ull * ts.tv_sec + ts.tv_nsec / 1000; - baro_data.pressure = press / 100.0f; - baro_data.temperature = temp / 100.0f; + baro_data.pressure = sensor_data_divi(press, 100); + baro_data.temperature = sensor_data_divi(temp, 100); memcpy(buffer, &baro_data, sizeof(baro_data)); From 4732b81cd4454fd3ad899590bc0b328edfe367b4 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Sat, 29 Nov 2025 22:15:37 +0100 Subject: [PATCH 3/7] sensors/bmp180_uorb: support for fixed-point data support for fixed-point data for bmp180_uorb Signed-off-by: raiden00pl --- drivers/sensors/bmp180_base.c | 4 +++- drivers/sensors/bmp180_base.h | 2 +- drivers/sensors/bmp180_uorb.c | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/sensors/bmp180_base.c b/drivers/sensors/bmp180_base.c index e388e1ea33aa1..3ad89e389455b 100644 --- a/drivers/sensors/bmp180_base.c +++ b/drivers/sensors/bmp180_base.c @@ -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; @@ -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 */ diff --git a/drivers/sensors/bmp180_base.h b/drivers/sensors/bmp180_base.h index 8b8f0d700f685..ca1c8d6e4e5f2 100644 --- a/drivers/sensors/bmp180_base.h +++ b/drivers/sensors/bmp180_base.h @@ -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 */ diff --git a/drivers/sensors/bmp180_uorb.c b/drivers/sensors/bmp180_uorb.c index 305a7bf91dc3e..b9c4deea1a389 100644 --- a/drivers/sensors/bmp180_uorb.c +++ b/drivers/sensors/bmp180_uorb.c @@ -197,6 +197,8 @@ static void bmp180_worker(FAR void *arg) { FAR struct bmp180_dev_uorb_s *priv = arg; struct sensor_baro baro; + int press; + int templ DEBUGASSERT(priv != NULL); @@ -204,7 +206,9 @@ static void bmp180_worker(FAR void *arg) bmp180_worker, priv, priv->interval / USEC_PER_TICK); - baro.pressure = bmp180_getpressure(&priv->dev, &baro.temperature) / 100.0f; + press = bmp180_getpressure(&priv->dev, &temp); + baro.temperature = sensor_data_itof(temp); + baro.pressure = sensor_data_divi(press, 100); baro.timestamp = sensor_get_timestamp(); priv->lower.push_event(priv->lower.priv, &baro, sizeof(baro)); From 362b53c26abf236bae2ca6313cf88ab077201c25 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Mon, 1 Dec 2025 10:06:25 +0100 Subject: [PATCH 4/7] sensors/hyt271_uorb: support for fixed-point data support for fixed-point data for hyt271_uorb Signed-off-by: raiden00pl --- drivers/sensors/hyt271_uorb.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/sensors/hyt271_uorb.c b/drivers/sensors/hyt271_uorb.c index 30cdf198b2df7..9348f2106e971 100644 --- a/drivers/sensors/hyt271_uorb.c +++ b/drivers/sensors/hyt271_uorb.c @@ -47,12 +47,6 @@ * Pre-processor Definitions ****************************************************************************/ -/* Only float data type supported now */ - -#ifdef CONFIG_SENSORS_USE_B16 -# error fixed-point data type not supported yet -#endif - #define HYT271_TEMPDATA_MASK 0x3fff #define HYT271_HUMIDATA_MASK 0x3fff @@ -67,9 +61,6 @@ #define HYT271_HUMIRAWEQUAL(x, y) \ (HYT271_HUMIRAWDATA(x) == HYT271_HUMIRAWDATA(y)) -#define HYT271_TEMPDATA(x) (HYT271_TEMPRAWDATA(x) * 165.0 / 16383.0 - 40.0) -#define HYT271_HUMIDATA(x) (HYT271_HUMIRAWDATA(x) * 100.0 / 16383.0) - #define HYT271_SENSOR_HUMI 0 #define HYT271_SENSOR_TEMP 1 #define HYT271_SENSOR_MAX 2 @@ -165,8 +156,12 @@ static const struct sensor_ops_s g_hyt271_ops = static void hyt271_humi_from_rawdata(FAR struct hyt271_sensor_data_s *data, FAR struct sensor_humi *humi) { - humi->timestamp = data->timestamp; - humi->humidity = HYT271_HUMIDATA(data->data); + /* hum = (HUM_RAW * 100) / 16383 */ + + humi->timestamp = data->timestamp; + humi->humidity = sensor_data_divi( + sensor_data_muli(HYT271_HUMIRAWDATA(data->data), 100), + 16383); } /**************************************************************************** @@ -183,8 +178,13 @@ static void hyt271_humi_from_rawdata(FAR struct hyt271_sensor_data_s *data, static void hyt271_temp_from_rawdata(FAR struct hyt271_sensor_data_s *data, FAR struct sensor_temp *temp) { + /* temp = ((TEMP_RAW * 165) / 16383) - 40 */ + temp->timestamp = data->timestamp; - temp->temperature = HYT271_TEMPDATA(data->data); + temp->temperature = sensor_data_subi(sensor_data_divi( + sensor_data_muli(HYT271_TEMPRAWDATA(data->data), 165), + 16383), + 40); } /**************************************************************************** From 368b21fe8565da3b311c4ce17fedf9675c61285a Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Mon, 1 Dec 2025 15:08:53 +0100 Subject: [PATCH 5/7] sensors/adxl362_uorb: support for fixed-point data support for fixed-point data for adxl362_uorb Signed-off-by: raiden00pl --- drivers/sensors/adxl362_uorb.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/drivers/sensors/adxl362_uorb.c b/drivers/sensors/adxl362_uorb.c index f64a607e8dc7d..71bf684257e5b 100644 --- a/drivers/sensors/adxl362_uorb.c +++ b/drivers/sensors/adxl362_uorb.c @@ -43,12 +43,6 @@ * Pre-processor Definitions ****************************************************************************/ -/* Only float data type supported now */ - -#ifdef CONFIG_SENSORS_USE_B16 -# error fixed-point data type not supported yet -#endif - #define ADXL362_SPI_FREQUENCY 1000000 #define ADXL362_SPI_MODE SPIDEV_MODE0 @@ -112,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; @@ -488,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)); @@ -545,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)); } @@ -608,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; From 0d2035fe2e87bb944922f3c6e5b76cfb08f2ab88 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Mon, 1 Dec 2025 17:37:13 +0100 Subject: [PATCH 6/7] sensors/adxl372_uorb: support for fixed-point data support for fixed-point data for adxl372_uorb Signed-off-by: raiden00pl --- drivers/sensors/adxl372_uorb.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/sensors/adxl372_uorb.c b/drivers/sensors/adxl372_uorb.c index 460d4a9c642ab..43ee71231c01b 100644 --- a/drivers/sensors/adxl372_uorb.c +++ b/drivers/sensors/adxl372_uorb.c @@ -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; @@ -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)); @@ -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)); @@ -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; From dde5a820b2528d4a14a54472593cbae5e7dd3552 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Mon, 1 Dec 2025 17:40:58 +0100 Subject: [PATCH 7/7] sensors/bh1749nuc_uorb: support for fixed-point data support for fixed-point data for bh1749nuc_uorb Signed-off-by: raiden00pl --- drivers/sensors/bh1749nuc_uorb.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/sensors/bh1749nuc_uorb.c b/drivers/sensors/bh1749nuc_uorb.c index 4ccaeaa186c5e..4426a3266639e 100644 --- a/drivers/sensors/bh1749nuc_uorb.c +++ b/drivers/sensors/bh1749nuc_uorb.c @@ -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; @@ -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); @@ -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); @@ -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)); @@ -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)); @@ -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 */