9ac63390db
Updates dht_polling sample to new sensor API. Signed-off-by: Lauren Murphy <lauren.murphy@intel.com>
171 lines
5 KiB
C
171 lines
5 KiB
C
/*
|
|
* Copyright (c) 2023 Google LLC
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_DATA_TYPES_H
|
|
#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_DATA_TYPES_H
|
|
|
|
#include <zephyr/dsp/types.h>
|
|
#include <zephyr/dsp/print_format.h>
|
|
|
|
#include <inttypes.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct sensor_data_header {
|
|
/**
|
|
* The closest timestamp for when the first frame was generated as attained by
|
|
* :c:func:`k_uptime_ticks`.
|
|
*/
|
|
uint64_t base_timestamp_ns;
|
|
/**
|
|
* The number of elements in the 'readings' array.
|
|
*
|
|
* This must be at least 1
|
|
*/
|
|
uint16_t reading_count;
|
|
};
|
|
|
|
/**
|
|
* Data for a sensor channel which reports on three axes. This is used by:
|
|
* - :c:enum:`SENSOR_CHAN_ACCEL_X`
|
|
* - :c:enum:`SENSOR_CHAN_ACCEL_Y`
|
|
* - :c:enum:`SENSOR_CHAN_ACCEL_Z`
|
|
* - :c:enum:`SENSOR_CHAN_ACCEL_XYZ`
|
|
* - :c:enum:`SENSOR_CHAN_GYRO_X`
|
|
* - :c:enum:`SENSOR_CHAN_GYRO_Y`
|
|
* - :c:enum:`SENSOR_CHAN_GYRO_Z`
|
|
* - :c:enum:`SENSOR_CHAN_GYRO_XYZ`
|
|
* - :c:enum:`SENSOR_CHAN_MAGN_X`
|
|
* - :c:enum:`SENSOR_CHAN_MAGN_Y`
|
|
* - :c:enum:`SENSOR_CHAN_MAGN_Z`
|
|
* - :c:enum:`SENSOR_CHAN_MAGN_XYZ`
|
|
* - :c:enum:`SENSOR_CHAN_POS_DX`
|
|
* - :c:enum:`SENSOR_CHAN_POS_DY`
|
|
* - :c:enum:`SENSOR_CHAN_POS_DZ`
|
|
* - :c:enum:`SENSOR_CHAN_POS_DXYZ`
|
|
*/
|
|
struct sensor_three_axis_data {
|
|
struct sensor_data_header header;
|
|
int8_t shift;
|
|
struct sensor_three_axis_sample_data {
|
|
uint32_t timestamp_delta;
|
|
union {
|
|
q31_t values[3];
|
|
q31_t v[3];
|
|
struct {
|
|
q31_t x;
|
|
q31_t y;
|
|
q31_t z;
|
|
};
|
|
};
|
|
} readings[1];
|
|
};
|
|
|
|
#define PRIsensor_three_axis_data PRIu64 "ns, (%" PRIq(6) ", %" PRIq(6) ", %" PRIq(6) ")"
|
|
|
|
#define PRIsensor_three_axis_data_arg(data_, readings_offset_) \
|
|
(data_).header.base_timestamp_ns + (data_).readings[(readings_offset_)].timestamp_delta, \
|
|
PRIq_arg((data_).readings[(readings_offset_)].x, 6, (data_).shift), \
|
|
PRIq_arg((data_).readings[(readings_offset_)].y, 6, (data_).shift), \
|
|
PRIq_arg((data_).readings[(readings_offset_)].z, 6, (data_).shift)
|
|
|
|
/**
|
|
* Data from a sensor where we only care about an event occurring. This is used to report triggers.
|
|
*/
|
|
struct sensor_occurrence_data {
|
|
struct sensor_data_header header;
|
|
struct sensor_occurrence_sample_data {
|
|
uint32_t timestamp_delta;
|
|
} readings[1];
|
|
};
|
|
|
|
#define PRIsensor_occurrence_data PRIu64 "ns"
|
|
|
|
#define PRIsensor_occurrence_data_arg(data_, readings_offset_) \
|
|
(data_).header.base_timestamp_ns + (data_).readings[(readings_offset_)].timestamp_delta
|
|
|
|
struct sensor_q31_data {
|
|
struct sensor_data_header header;
|
|
int8_t shift;
|
|
struct sensor_q31_sample_data {
|
|
uint32_t timestamp_delta;
|
|
union {
|
|
q31_t value;
|
|
q31_t light; /**< Unit: lux */
|
|
q31_t pressure; /**< Unit: kilopascal */
|
|
q31_t temperature; /**< Unit: degrees Celsius */
|
|
q31_t percent; /**< Unit: percent */
|
|
q31_t distance; /**< Unit: meters */
|
|
q31_t density; /**< Unit: ug/m^3 */
|
|
q31_t density_ppm; /**< Unit: parts per million */
|
|
q31_t density_ppb; /**< Unit: parts per billion */
|
|
q31_t resistance; /**< Unit: ohms */
|
|
q31_t voltage; /**< Unit: volts */
|
|
q31_t current; /**< Unit: amps */
|
|
q31_t power; /**< Unit: watts */
|
|
q31_t angle; /**< Unit: degrees */
|
|
q31_t electric_charge; /**< Unit: mAh */
|
|
q31_t humidity; /**< Unit: RH */
|
|
};
|
|
} readings[1];
|
|
};
|
|
|
|
#define PRIsensor_q31_data PRIu64 "ns (%" PRIq(6) ")"
|
|
|
|
#define PRIsensor_q31_data_arg(data_, readings_offset_) \
|
|
(data_).header.base_timestamp_ns + (data_).readings[(readings_offset_)].timestamp_delta, \
|
|
PRIq_arg((data_).readings[(readings_offset_)].value, 6, (data_).shift)
|
|
|
|
/**
|
|
* Data from a sensor that produces a byte of data. This is used by:
|
|
* - :c:enum:`SENSOR_CHAN_PROX`
|
|
*/
|
|
struct sensor_byte_data {
|
|
struct sensor_data_header header;
|
|
struct sensor_byte_sample_data {
|
|
uint32_t timestamp_delta;
|
|
union {
|
|
uint8_t value;
|
|
struct {
|
|
uint8_t is_near: 1;
|
|
uint8_t padding: 7;
|
|
};
|
|
};
|
|
} readings[1];
|
|
};
|
|
|
|
#define PRIsensor_byte_data(field_name_) PRIu64 "ns (" STRINGIFY(field_name_) " = %" PRIu8 ")"
|
|
|
|
#define PRIsensor_byte_data_arg(data_, readings_offset_, field_name_) \
|
|
(data_).header.base_timestamp_ns + (data_).readings[(readings_offset_)].timestamp_delta, \
|
|
(data_).readings[(readings_offset_)].field_name_
|
|
|
|
/**
|
|
* Data from a sensor that produces a count like value. This is used by:
|
|
* - :c:enum:`SENSOR_CHAN_GAUGE_CYCLE_COUNT`
|
|
*/
|
|
struct sensor_uint64_data {
|
|
struct sensor_data_header header;
|
|
struct sensor_uint64_sample_data {
|
|
uint32_t timestamp_delta;
|
|
uint64_t value;
|
|
} readings[1];
|
|
};
|
|
|
|
#define PRIsensor_uint64_data PRIu64 "ns (%" PRIu64 ")"
|
|
|
|
#define PRIsensor_uint64_data_arg(data_, readings_offset_) \
|
|
(data_).header.base_timestamp_ns + (data_).readings[(readings_offset_)].timestamp_delta, \
|
|
(data_).readings[(readings_offset_)].value
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_DATA_TYPES_H */
|