LCOV - code coverage report
Current view: top level - zephyr/sensing - sensing_datatypes.h Hit Total Coverage
Test: new.info Lines: 23 24 95.8 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2022-2023 Intel Corporation.
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_SENSING_DATATYPES_H_
       8             : #define ZEPHYR_INCLUDE_SENSING_DATATYPES_H_
       9             : 
      10             : #include <stdint.h>
      11             : #include <zephyr/dsp/types.h>
      12             : 
      13             : /**
      14             :  * @brief Data Types
      15             :  * @addtogroup sensing_datatypes
      16             :  * @{
      17             :  */
      18             : 
      19             : /**
      20             :  * @struct sensing_sensor_value_header
      21             :  * @brief sensor value header
      22             :  *
      23             :  * Each sensor value data structure should have this header
      24             :  *
      25             :  * Here use 'base_timestamp' (uint64_t) and 'timestamp_delta' (uint32_t) to
      26             :  * save memory usage in batching mode.
      27             :  *
      28             :  * The 'base_timestamp' is for readings[0], the 'timestamp_delta' is relation
      29             :  * to the previous 'readings'. So,
      30             :  * timestamp of readings[0] is
      31             :  *      header.base_timestamp + readings[0].timestamp_delta.
      32             :  * timestamp of readings[1] is
      33             :  *      timestamp of readings[0] + readings[1].timestamp_delta.
      34             :  *
      35             :  * Since timestamp unit is micro seconds, the max 'timestamp_delta' (uint32_t)
      36             :  * is 4295 seconds.
      37             :  *
      38             :  * If a sensor has batched data where two consecutive readings differ by
      39             :  * more than 4295 seconds, the sensor subsystem core will split them
      40             :  * across multiple instances of the readings structure, and send multiple
      41             :  * events.
      42             :  *
      43             :  * This concept is borrowed from CHRE:
      44             :  * https://cs.android.com/android/platform/superproject/+/master:\
      45             :  * system/chre/chre_api/include/chre_api/chre/sensor_types.h
      46             :  */
      47           1 : struct sensing_sensor_value_header {
      48             :         /** Base timestamp of this data readings, unit is micro seconds */
      49           1 :         uint64_t base_timestamp;
      50             :         /** Count of this data readings */
      51           1 :         uint16_t reading_count;
      52             : };
      53             : 
      54             : /**
      55             :  * @brief Sensor value data structure types based on common data types.
      56             :  * Suitable for common sensors, such as IMU, Light sensors and orientation sensors.
      57             :  */
      58             : 
      59             : /**
      60             :  * @brief Sensor value data structure for 3-axis sensors.
      61             :  * struct sensing_sensor_value_3d_q31 can be used by 3D IMU sensors like:
      62             :  * SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
      63             :  * SENSING_SENSOR_TYPE_MOTION_UNCALIB_ACCELEROMETER_3D,
      64             :  * SENSING_SENSOR_TYPE_MOTION_GYROMETER_3D,
      65             :  * q31 version
      66             :  */
      67           1 : struct sensing_sensor_value_3d_q31 {
      68             :         /** Header of the sensor value data structure. */
      69           1 :         struct sensing_sensor_value_header header;
      70           1 :         int8_t shift; /**< The shift value for the q31_t v[3] reading. */
      71             :         struct {
      72             :                 /** Timestamp delta of the reading. Unit is micro seconds. */
      73           1 :                 uint32_t timestamp_delta;
      74             :                 union {
      75             :                         /**
      76             :                          * 3D vector of the reading represented as an array.
      77             :                          * For SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D and
      78             :                          * SENSING_SENSOR_TYPE_MOTION_UNCALIB_ACCELEROMETER_3D,
      79             :                          * the unit is Gs (gravitational force).
      80             :                          * For SENSING_SENSOR_TYPE_MOTION_GYROMETER_3D, the unit is degrees.
      81             :                          */
      82           1 :                         q31_t v[3];
      83             :                         struct {
      84           1 :                                 q31_t x; /**< X value of the 3D vector. */
      85           1 :                                 q31_t y; /**< Y value of the 3D vector. */
      86           1 :                                 q31_t z; /**< Z value of the 3D vector. */
      87             :                         };
      88             :                 };
      89           1 :         } readings[1]; /**< Array of readings. */
      90             : };
      91             : 
      92             : /**
      93             :  * @brief Sensor value data structure for single 1-axis value.
      94             :  * struct sensing_sensor_value_uint32 can be used by SENSING_SENSOR_TYPE_LIGHT_AMBIENTLIGHT sensor
      95             :  * uint32_t version
      96             :  */
      97           1 : struct sensing_sensor_value_uint32 {
      98             :         /** Header of the sensor value data structure. */
      99           1 :         struct sensing_sensor_value_header header;
     100             :         struct {
     101             :                 /** Timestamp delta of the reading. Unit is micro seconds. */
     102           1 :                 uint32_t timestamp_delta;
     103             :                 /**
     104             :                  * Value of the reading.
     105             :                  * For SENSING_SENSOR_TYPE_LIGHT_AMBIENTLIGHT, the unit is luxs.
     106             :                  */
     107           1 :                 uint32_t v;
     108           1 :         } readings[1];      /**< Array of readings. */
     109             : };
     110             : 
     111             : /**
     112             :  * @brief Sensor value data structure for single 1-axis value.
     113             :  * struct sensing_sensor_value_q31 can be used by SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE sensor
     114             :  * q31 version
     115             :  */
     116           1 : struct sensing_sensor_value_q31 {
     117             :         /** Header of the sensor value data structure. */
     118           1 :         struct sensing_sensor_value_header header;
     119           1 :         int8_t shift; /**< The shift value for the q31_t v reading. */
     120             :         struct {
     121             :                 /** Timestamp delta of the reading. Unit is micro seconds. */
     122           1 :                 uint32_t timestamp_delta;
     123             :                 /**
     124             :                  * Value of the reading.
     125             :                  * For SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE, the unit is degrees.
     126             :                  */
     127           1 :                 q31_t v;
     128           1 :         } readings[1];   /**< Array of readings. */
     129             : };
     130             : 
     131             : /**
     132             :  * @}
     133             :  */
     134             : 
     135             : #endif /*ZEPHYR_INCLUDE_SENSING_DATATYPES_H_*/

Generated by: LCOV version 1.14