/*
 * Copyright (c) 2025 Croxel, Inc.
 * Copyright (c) 2025 CogniPilot Foundation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_DRIVERS_SENSOR_PNI_RM3100_H_
#define ZEPHYR_DRIVERS_SENSOR_PNI_RM3100_H_

#include <zephyr/drivers/sensor.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/rtio/rtio.h>
#include "rm3100_reg.h"

/* RM3100 produces 3 bytes (24-bit) of data per axis */
#define RM3100_BYTES_PER_AXIS 3
#define RM3100_TOTAL_BYTES (RM3100_BYTES_PER_AXIS * 3)

struct rm3100_encoded_data {
	struct {
		uint64_t timestamp;
		uint8_t channels : 3;
		uint16_t cycle_count;
		uint8_t status;
		struct {
			bool drdy : 1;
		} events;
	} header;
	union {
		uint8_t payload[RM3100_TOTAL_BYTES];
		struct {
			uint32_t x : 24;
			uint32_t y : 24;
			uint32_t z : 24;
		} __attribute__((__packed__)) magn;
	};
};

struct rm3100_config {
	struct gpio_dt_spec int_gpio;
};

struct rm3100_stream {
	struct gpio_callback cb;
	const struct device *dev;
	struct rtio_iodev_sqe *iodev_sqe;
	struct {
		struct {
			bool drdy : 1;
		} enabled;
		struct {
			enum sensor_stream_data_opt drdy;
		} opt;
	} settings;
};

struct rm3100_data {
	/* RTIO context */
	struct {
		struct rtio_iodev *iodev;
		struct rtio *ctx;
	} rtio;
	struct {
		uint8_t odr;
	} settings;
#if defined(CONFIG_RM3100_STREAM)
	struct rm3100_stream stream;
#endif /* CONFIG_RM3100_STREAM */
};

#endif /* ZEPHYR_DRIVERS_SENSOR_PNI_RM3100_H_ */
