ruuvi.drivers.c ${PROJECT_VERSION}
Drivers for external sensors and peripherals on embedded systems.
Loading...
Searching...
No Matches
ruuvi_driver_sensor.h
Go to the documentation of this file.
1#ifndef RUUVI_DRIVER_SENSOR_H
2#define RUUVI_DRIVER_SENSOR_H
64#include "ruuvi_driver_error.h"
65#include <stdbool.h>
66#include <stddef.h>
67#include <stdint.h>
68
69#define RD_SENSOR_INVALID_VALUE RD_FLOAT_INVALID
70#define RD_SENSOR_INVALID_TIMSTAMP RD_UINT64_INVALID
71
72// Constants for sensor configuration and status
73#define RD_SENSOR_CFG_DEFAULT (0U)
74#define RD_SENSOR_CFG_CUSTOM_1 (0xC9U)
75#define RD_SENSOR_CFG_CUSTOM_2 (0xCAU)
76#define RD_SENSOR_CFG_CUSTOM_3 (0xCBU)
77#define RD_SENSOR_CFG_CUSTOM_4 (0xCCU)
78#define RD_SENSOR_CFG_CUSTOM_5 (0xCDU)
79#define RD_SENSOR_CFG_CUSTOM_6 (0xCEU)
80#define RD_SENSOR_ERR_INVALID (0xE0U)
81#define RD_SENSOR_ERR_NOT_IMPLEMENTED (0xE1U)
82#define RD_SENSOR_ERR_NOT_SUPPORTED (0xE2U)
83#define RD_SENSOR_CFG_MIN (0xF0U)
84#define RD_SENSOR_CFG_MAX (0xF1U)
85#define RD_SENSOR_CFG_SLEEP (0xF2U)
86#define RD_SENSOR_CFG_SINGLE (0xF3U)
87#define RD_SENSOR_CFG_CONTINUOUS (0xF4U)
88#define RD_SENSOR_CFG_NO_CHANGE (0xFFU)
89
90// DSP functions, complemented by DSP parameter
91#define RD_SENSOR_DSP_LAST (0U)
92#define RD_SENSOR_DSP_LOW_PASS (1U<<1U)
93#define RD_SENSOR_DSP_HIGH_PASS (1U<<2U)
94#define RD_SENSOR_DSP_OS (1U<<3U)
95
97#define RD_GPIO_TO_HANDLE(handle) ((((handle) >> 3U) & 0xE0U) + ((handle) & 0x1FU))
99#define RD_HANDLE_TO_GPIO(handle) ((((handle) & 0xE0U) << 3U) + ((handle) & 0x1FU))
101#define RD_HANDLE_UNUSED (0xFFU)
102
103#ifndef UNUSED_VARIABLE
104# define UNUSED_VARIABLE(X) ((void)(X))
105#endif
106
110typedef struct __attribute__ ( (packed, aligned (4)))
111{
112 uint8_t samplerate;
113 uint8_t resolution;
114 uint8_t scale;
115 uint8_t dsp_function;
117 uint8_t mode;
118 uint8_t reserved0;
119 uint8_t reserved1;
120}
122
126typedef enum
127{
133 RD_BUS_FAIL = 5U
135
139typedef struct
140{
141 unsigned int acceleration_x_g : 1;
142 unsigned int acceleration_y_g : 1;
143 unsigned int acceleration_z_g : 1;
144 unsigned int co2_ppm : 1;
145 unsigned int gyro_x_dps : 1;
146 unsigned int gyro_y_dps : 1;
147 unsigned int gyro_z_dps : 1;
148 unsigned int humidity_rh : 1;
150 unsigned int luminosity : 1;
151 unsigned int magnetometer_x_g : 1;
152 unsigned int magnetometer_y_g : 1;
153 unsigned int magnetometer_z_g : 1;
154 unsigned int pm_1_ugm3 : 1;
155 unsigned int pm_2_ugm3 : 1;
156 unsigned int pm_4_ugm3 : 1;
157 unsigned int pm_10_ugm3 : 1;
158 unsigned int pressure_pa : 1;
159 unsigned int spl_dbz : 1;
160 unsigned int temperature_c : 1;
161 unsigned int voc_ppm : 1;
162 unsigned int voltage_v : 1;
163 unsigned int voltage_ratio : 1;
164 unsigned int reserved: 10;
166
176#define RD_SENSOR_ACC_X_FIELD ((rd_sensor_data_fields_t){.datas.acceleration_x_g=1})
178#define RD_SENSOR_ACC_Y_FIELD ((rd_sensor_data_fields_t){.datas.acceleration_y_g=1})
180#define RD_SENSOR_ACC_Z_FIELD ((rd_sensor_data_fields_t){.datas.acceleration_z_g=1})
182#define RD_SENSOR_GYR_X_FIELD ((rd_sensor_data_fields_t){.datas.gyro_x_dps=1})
184#define RD_SENSOR_GYR_Y_FIELD ((rd_sensor_data_fields_t){.datas.gyro_y_dps=1})
186#define RD_SENSOR_GYR_Z_FIELD ((rd_sensor_data_fields_t){.datas.gyro_z_dps=1})
188#define RD_SENSOR_HUMI_FIELD ((rd_sensor_data_fields_t){.datas.humidity_rh=1})
190#define RD_SENSOR_PRES_FIELD ((rd_sensor_data_fields_t){.datas.pressure_pa=1})
192#define RD_SENSOR_TEMP_FIELD ((rd_sensor_data_fields_t){.datas.temperature_c=1})
193
194
195
207typedef union // -V2514
208{
209 uint32_t bitfield;
212
229
232
250 p_sensor, const rd_bus_t bus, const uint8_t handle);
251
262typedef rd_status_t (*rd_sensor_setup_fp) (uint8_t * parameter);
263
279typedef rd_status_t (*rd_sensor_dsp_fp) (uint8_t * dsp_function,
280 uint8_t * dsp_parameter);
281
299
312 const rd_sensor_t * const p_sensor,
313 rd_sensor_configuration_t * const p_configuration);
314
328typedef rd_status_t (*rd_sensor_fifo_read_fp) (size_t * const num_elements,
329 rd_sensor_data_t * const data);
330
340typedef rd_status_t (*rd_sensor_fifo_enable_fp) (const bool enable);
341
368typedef rd_status_t (*rd_sensor_level_interrupt_use_fp) (const bool enable,
369 float * limit_g);
370
377typedef uint64_t (*rd_sensor_timestamp_fp) (void);
378
431
436 sensor, rd_sensor_configuration_t * config);
437
442 sensor, rd_sensor_configuration_t * config);
443
452 const rd_sensor_timestamp_fp timestamp_fp);
453
459uint64_t rd_sensor_timestamp_get (void);
460
471void rd_sensor_initialize (rd_sensor_t * const p_sensor);
472
479void rd_sensor_uninitialize (rd_sensor_t * const p_sensor);
480
487bool rd_sensor_is_init (const rd_sensor_t * const sensor);
488
531void rd_sensor_data_populate (rd_sensor_data_t * const target,
532 const rd_sensor_data_t * const provided,
533 const rd_sensor_data_fields_t requested);
534
543float rd_sensor_data_parse (const rd_sensor_data_t * const provided,
544 const rd_sensor_data_fields_t requested);
545
552uint8_t rd_sensor_data_fieldcount (const rd_sensor_data_t * const target);
553
568void rd_sensor_data_set (rd_sensor_data_t * const target,
569 const rd_sensor_data_fields_t field,
570 const float value);
571
579rd_status_t validate_default_input_set (uint8_t * const input, const uint8_t mode);
580
589rd_status_t validate_default_input_get (uint8_t * const input);
590
617bool rd_sensor_has_valid_data (const rd_sensor_data_t * const target,
618 const uint8_t index);
619
640 const uint8_t index);
641
643#endif
uint32_t rd_status_t
bitfield for representing errors
rd_status_t(* rd_sensor_init_fp)(rd_sensor_t *const p_sensor, const rd_bus_t bus, const uint8_t handle)
Initialize and uninitialize sensor. Init and uninit will setup sensor with function pointers....
bool rd_sensor_is_init(const rd_sensor_t *const sensor)
Check if given sensor structure is already initialized.
rd_status_t(* rd_sensor_level_interrupt_use_fp)(const bool enable, float *limit_g)
Enable level interrupt on sensor.
bool rd_sensor_has_valid_data(const rd_sensor_data_t *const target, const uint8_t index)
Check if sensor has valid data at given index.
rd_status_t(* rd_sensor_dsp_fp)(uint8_t *dsp_function, uint8_t *dsp_parameter)
Configure sensor digital signal processing. Takes DSP function and a DSP parameter as input,...
rd_status_t(* rd_sensor_data_fp)(rd_sensor_data_t *const p_data)
Read latest data from sensor registers Return latest data from sensor. Does not take a new sample,...
uint8_t rd_sensor_data_fieldcount(const rd_sensor_data_t *const target)
Count number of floats required for this data structure.
void rd_sensor_uninitialize(rd_sensor_t *const p_sensor)
Mark sensor as uninitialized by calling the generic initialization. Will not clear the name of the se...
rd_sensor_data_bitfield_t rd_sensor_field_type(const rd_sensor_data_t *const target, const uint8_t index)
Check the type of data at given index.
rd_status_t rd_sensor_timestamp_function_set(const rd_sensor_timestamp_fp timestamp_fp)
Setup timestamping. Set to NULL to disable timestamps.
rd_status_t rd_sensor_configuration_get(const rd_sensor_t *sensor, rd_sensor_configuration_t *config)
Implementation of ref rd_configuration_fp.
void rd_sensor_initialize(rd_sensor_t *const p_sensor)
Initialize sensor struct with non-null pointers which return RD_ERROR_NOT_INITIALIZED.
rd_status_t(* rd_sensor_fifo_read_fp)(size_t *const num_elements, rd_sensor_data_t *const data)
Read First-in-first-out (FIFO) buffer in sensor. Reads up to num_elements data points from FIFO and p...
rd_status_t validate_default_input_set(uint8_t *const input, const uint8_t mode)
Validate that given setting can be set on a sensor which supports only default value.
rd_status_t(* rd_sensor_setup_fp)(uint8_t *parameter)
Setup a parameter of a sensor. The function will modify the pointed data to the actual value which wa...
void rd_sensor_data_populate(rd_sensor_data_t *const target, const rd_sensor_data_t *const provided, const rd_sensor_data_fields_t requested)
Populate given target data with data provided by sensor as requested.
rd_status_t(* rd_sensor_fifo_enable_fp)(const bool enable)
Enable FIFO or FIFO interrupt full interrupt on sensor. FIFO interrupt Triggers an interrupt once FIF...
rd_status_t(* rd_configuration_fp)(const rd_sensor_t *const p_sensor, rd_sensor_configuration_t *const p_configuration)
Convenience function to write/read entire configuration in one call. Modifies input parameters to act...
rd_status_t rd_sensor_configuration_set(const rd_sensor_t *sensor, rd_sensor_configuration_t *config)
Implementation of ref rd_configuration_fp.
rd_bus_t
Type of bus sensor uses.
void rd_sensor_data_set(rd_sensor_data_t *const target, const rd_sensor_data_fields_t field, const float value)
Set a desired value to target data.
uint64_t rd_sensor_timestamp_get(void)
Calls the timestamp function and returns its value.
rd_status_t validate_default_input_get(uint8_t *const input)
Validate and get input when only allowed value is default.
float rd_sensor_data_parse(const rd_sensor_data_t *const provided, const rd_sensor_data_fields_t requested)
Parse data from provided struct.
uint64_t(* rd_sensor_timestamp_fp)(void)
Return number of milliseconds since the start of RTC.
@ RD_BUS_SPI
SPI bus.
@ RD_BUS_NONE
No bus, internal to IC.
@ RD_BUS_FAIL
Test behaviour on invalid bus with this value.
@ RD_BUS_UART
UART bus.
@ RD_BUS_PDM
PDM bus.
@ RD_BUS_I2C
I2C bus.
Ruuvi error codes and error check function.
All sensors must implement configuration functions which accept this struct.
uint8_t reserved1
Reserved for future use.
uint8_t resolution
Resolution, in bits.
uint8_t mode
Mode, RD_SENSOR_SLEEP, _SINGLE, _CONTINOUS.
uint8_t reserved0
Reserved for future use.
uint8_t samplerate
Samplerate, in Hz.
uint8_t scale
Scale, in relevant Si-unit.
uint8_t dsp_parameter
Parameter to DSP functions.
uint8_t dsp_function
DSP function, one of RD_SENSOR_DSP_*.
Bitfield to describe related sensor data.
unsigned int luminosity
Light level, dimensionless. Comparable only between identical devices.
unsigned int reserved
Reserved bits, force remainder of bitfield to 0.
unsigned int humidity_rh
Relative humidity, %.
unsigned int magnetometer_y_g
Magnetic flux along Y-axis, Gauss.
unsigned int gyro_z_dps
Rotation along Z-axis, degrees per second.
unsigned int acceleration_x_g
Acceleration along X-axis, gravities.
unsigned int pm_10_ugm3
Coarse particulate matter, microgram per m^3.
unsigned int pm_4_ugm3
Medium particulate matter, microgram per m^3.
unsigned int magnetometer_z_g
Magnetic flux along Z-axis, Gauss.
unsigned int pm_1_ugm3
Ultra-fine particulate matter, microgram per m^3.
unsigned int temperature_c
Temperature, celcius.
unsigned int voltage_v
Voltage, volts.
unsigned int gyro_y_dps
Rotation along Y-axis, degrees per second.
unsigned int gyro_x_dps
Rotation along X-axis, degrees per second.
unsigned int pressure_pa
Pressure, pascals.
unsigned int co2_ppm
CO2, Parts per million.
unsigned int pm_2_ugm3
Fine particulate matter, microgram per m^3.
unsigned int magnetometer_x_g
Magnetic flux along X-axis, Gauss.
unsigned int acceleration_z_g
Acceleration along Z-axis, gravities.
unsigned int acceleration_y_g
Acceleration along Y-axis, gravities.
unsigned int voltage_ratio
Voltage, ratio to maximum.
unsigned int spl_dbz
Unweighted sound pressure level.
unsigned int voc_ppm
Volatile organic compounds, parts per million.
Generic sensor data struct.
float * data
Data of sensor. Must contain as many elements as fields has bits set.
uint64_t timestamp_ms
Timestamp of the event, rd_sensor_timestamp_get.
rd_sensor_data_fields_t valid
Listing of valid data in this sample.
rd_sensor_data_fields_t fields
Description of datafields which may be contained in this sample.
Interface to sensor. Some sensors can implement additional functions. The additional functions are de...
rd_sensor_data_fp data_get
rd_sensor_data_fp
rd_configuration_fp configuration_set
rd_configuration_fp
rd_sensor_setup_fp samplerate_get
rd_sensor_setup_fp
rd_sensor_setup_fp resolution_get
rd_sensor_setup_fp
rd_sensor_init_fp uninit
rd_sensor_init_fp
rd_configuration_fp configuration_get
rd_configuration_fp
void * p_ctx
handle for sensor internal context
rd_sensor_dsp_fp dsp_get
rd_sensor_dsp_fp
rd_sensor_data_fields_t provides
Description of data fields the sensor is able to provide.
rd_sensor_dsp_fp dsp_set
rd_sensor_dsp_fp
rd_sensor_setup_fp mode_set
rd_sensor_setup_fp
const char * name
Sensor human-readable name. Should be at most 8 bytes long.
rd_sensor_fifo_read_fp fifo_read
rd_sensor_level_interrupt_use_fp
rd_sensor_fifo_enable_fp fifo_interrupt_enable
rd_sensor_level_interrupt_use_fp
rd_sensor_level_interrupt_use_fp level_interrupt_set
rd_sensor_level_interrupt_use_fp
rd_sensor_setup_fp mode_get
rd_sensor_setup_fp
rd_sensor_setup_fp samplerate_set
rd_sensor_setup_fp
rd_sensor_fifo_enable_fp fifo_enable
rd_sensor_fifo_enable_fp
rd_sensor_init_fp init
rd_sensor_init_fp
rd_sensor_setup_fp scale_set
rd_sensor_setup_fp
rd_sensor_setup_fp resolution_set
rd_sensor_setup_fp
rd_sensor_setup_fp scale_get
rd_sensor_setup_fp
Union to access sensor data.
uint32_t bitfield
Bitfield used to access sensor data.
rd_sensor_data_bitfield_t datas
Structured data field.