/*
 * 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`
 */
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 */
		};
	} 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 */
