1 /*
2  * Copyright (c) 2025 Croxel, Inc.
3  * Copyright (c) 2025 CogniPilot Foundation
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #ifndef ZEPHYR_DRIVERS_SENSOR_BMP581_DECODER_H_
9 #define ZEPHYR_DRIVERS_SENSOR_BMP581_DECODER_H_
10 
11 #include <stdint.h>
12 #include <zephyr/drivers/sensor.h>
13 #include "bmp581.h"
14 
15 struct bmp581_encoded_header {
16 		uint8_t channels;
17 		uint8_t events;
18 		uint64_t timestamp;
19 		uint8_t press_en;
20 		uint8_t fifo_count;
21 };
22 
23 struct bmp581_frame {
24 	uint8_t payload[6];
25 };
26 
27 struct bmp581_encoded_data {
28 	struct bmp581_encoded_header header;
29 	union {
30 		uint8_t payload[6]; /* 3 bytes temp + 3 bytes press */
31 		struct bmp581_frame frame[0]; /* Used for FIFO frames */
32 	};
33 };
34 
bmp581_encode_events_bitmask(const struct sensor_stream_trigger * const triggers,size_t count)35 static inline enum bmp581_event bmp581_encode_events_bitmask(
36 					const struct sensor_stream_trigger *const triggers,
37 					size_t count)
38 {
39 	enum bmp581_event result = 0;
40 
41 	for (size_t i = 0 ; i < count ; i++) {
42 		switch (triggers[i].trigger) {
43 		case SENSOR_TRIG_DATA_READY:
44 			result |= ((triggers[i].opt == SENSOR_STREAM_DATA_INCLUDE) ?
45 				   BMP581_EVENT_DRDY : 0);
46 			break;
47 		case SENSOR_TRIG_FIFO_WATERMARK:
48 			result |= ((triggers[i].opt == SENSOR_STREAM_DATA_INCLUDE) ?
49 				   BMP581_EVENT_FIFO_WM : 0);
50 			break;
51 		default:
52 			break;
53 		}
54 	}
55 
56 	return result;
57 }
58 
59 int bmp581_encode(const struct device *dev,
60 		   const struct sensor_read_config *read_config,
61 		   uint8_t trigger_status,
62 		   uint8_t *buf);
63 
64 int bmp581_get_decoder(const struct device *dev,
65 		       const struct sensor_decoder_api **decoder);
66 
67 #endif /* ZEPHYR_DRIVERS_SENSOR_BMP581_DECODER_H_ */
68