blob: b18b22b41800a968ed5cb6f3fb623d114e897f40 [file] [log] [blame]
/*
* Copyright (c) 2022-2023 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_SENSING_DATATYPES_H_
#define ZEPHYR_INCLUDE_SENSING_DATATYPES_H_
#include <stdint.h>
#include <zephyr/dsp/types.h>
/**
* @brief Data Types
* @addtogroup sensing_datatypes
* @{
*/
/**
* @struct sensing_sensor_value_header
* @brief sensor value header
*
* Each sensor value data structure should have this header
*
* Here use 'base_timestamp' (uint64_t) and 'timestamp_delta' (uint32_t) to
* save memory usage in batching mode.
*
* The 'base_timestamp' is for readings[0], the 'timestamp_delta' is relation
* to the previous 'readings'. So,
* timestamp of readings[0] is
* header.base_timestamp + readings[0].timestamp_delta.
* timestamp of readings[1] is
* timestamp of readings[0] + readings[1].timestamp_delta.
*
* Since timestamp unit is micro seconds, the max 'timestamp_delta' (uint32_t)
* is 4295 seconds.
*
* If a sensor has batched data where two consecutive readings differ by
* more than 4295 seconds, the sensor subsystem core will split them
* across multiple instances of the readings structure, and send multiple
* events.
*
* This concept is borrowed from CHRE:
* https://cs.android.com/android/platform/superproject/+/master:\
* system/chre/chre_api/include/chre_api/chre/sensor_types.h
*/
struct sensing_sensor_value_header {
/** Base timestamp of this data readings, unit is micro seconds */
uint64_t base_timestamp;
/** Count of this data readings */
uint16_t reading_count;
};
/**
* @brief Sensor value data structure types based on common data types.
* Suitable for common sensors, such as IMU, Light sensors and orientation sensors.
*/
/**
* @brief Sensor value data structure for 3-axis sensors.
* struct sensing_sensor_value_3d_q31 can be used by 3D IMU sensors like:
* SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
* SENSING_SENSOR_TYPE_MOTION_UNCALIB_ACCELEROMETER_3D,
* SENSING_SENSOR_TYPE_MOTION_GYROMETER_3D,
* q31 version
*/
struct sensing_sensor_value_3d_q31 {
/** Header of the sensor value data structure. */
struct sensing_sensor_value_header header;
int8_t shift; /**< The shift value for the q31_t v[3] reading. */
struct {
/** Timestamp delta of the reading. Unit is micro seconds. */
uint32_t timestamp_delta;
union {
/**
* 3D vector of the reading represented as an array.
* For SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D and
* SENSING_SENSOR_TYPE_MOTION_UNCALIB_ACCELEROMETER_3D,
* the unit is Gs (gravitational force).
* For SENSING_SENSOR_TYPE_MOTION_GYROMETER_3D, the unit is degrees.
*/
q31_t v[3];
struct {
q31_t x; /**< X value of the 3D vector. */
q31_t y; /**< Y value of the 3D vector. */
q31_t z; /**< Z value of the 3D vector. */
};
};
} readings[1]; /**< Array of readings. */
};
/**
* @brief Sensor value data structure for single 1-axis value.
* struct sensing_sensor_value_uint32 can be used by SENSING_SENSOR_TYPE_LIGHT_AMBIENTLIGHT sensor
* uint32_t version
*/
struct sensing_sensor_value_uint32 {
/** Header of the sensor value data structure. */
struct sensing_sensor_value_header header;
struct {
/** Timestamp delta of the reading. Unit is micro seconds. */
uint32_t timestamp_delta;
/**
* Value of the reading.
* For SENSING_SENSOR_TYPE_LIGHT_AMBIENTLIGHT, the unit is luxs.
*/
uint32_t v;
} readings[1]; /**< Array of readings. */
};
/**
* @brief Sensor value data structure for single 1-axis value.
* struct sensing_sensor_value_q31 can be used by SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE sensor
* q31 version
*/
struct sensing_sensor_value_q31 {
/** Header of the sensor value data structure. */
struct sensing_sensor_value_header header;
int8_t shift; /**< The shift value for the q31_t v reading. */
struct {
/** Timestamp delta of the reading. Unit is micro seconds. */
uint32_t timestamp_delta;
/**
* Value of the reading.
* For SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE, the unit is degrees.
*/
q31_t v;
} readings[1]; /**< Array of readings. */
};
/**
* @}
*/
#endif /*ZEPHYR_INCLUDE_SENSING_DATATYPES_H_*/