1 /*
2  * Copyright (c) 2025 Daniel Kampert
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/kernel.h>
8 #include <zephyr/devicetree.h>
9 #include <zephyr/logging/log.h>
10 #include <zephyr/drivers/sensor.h>
11 
12 #include <zephyr/drivers/sensor/max32664c.h>
13 
14 static const struct device *const sensor_hub = DEVICE_DT_GET(DT_ALIAS(sensor));
15 
16 LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
17 
update(void)18 static void update(void)
19 {
20 	struct sensor_value value;
21 
22 	sensor_sample_fetch(sensor_hub);
23 	sensor_attr_get(sensor_hub, SENSOR_CHAN_MAX32664C_HEARTRATE, SENSOR_ATTR_MAX32664C_OP_MODE,
24 			&value);
25 	if (value.val1 == MAX32664C_OP_MODE_RAW) {
26 		struct sensor_value x;
27 		struct sensor_value y;
28 		struct sensor_value z;
29 
30 		if (sensor_channel_get(sensor_hub, SENSOR_CHAN_ACCEL_X, &x) ||
31 		    sensor_channel_get(sensor_hub, SENSOR_CHAN_ACCEL_Y, &y) ||
32 		    sensor_channel_get(sensor_hub, SENSOR_CHAN_ACCEL_Z, &z)) {
33 			LOG_ERR("Failed to get accelerometer data");
34 			return;
35 		}
36 
37 		LOG_INF("\tx: %i", x.val1);
38 		LOG_INF("\ty: %i", y.val1);
39 		LOG_INF("\tz: %i", z.val1);
40 	} else if (value.val1 == MAX32664C_OP_MODE_ALGO_AEC) {
41 		struct sensor_value hr;
42 
43 		if (sensor_channel_get(sensor_hub, SENSOR_CHAN_MAX32664C_HEARTRATE, &hr)) {
44 			LOG_ERR("Failed to get heart rate data");
45 			return;
46 		}
47 
48 		LOG_INF("HR: %u bpm", hr.val1);
49 		LOG_INF("HR Confidence: %u", hr.val2);
50 	} else {
51 		LOG_WRN("Operation mode not implemented: %u", value.val1);
52 	}
53 }
54 
main(void)55 int main(void)
56 {
57 	struct sensor_value value;
58 
59 	if (!device_is_ready(sensor_hub)) {
60 		LOG_ERR("Sensor hub not ready!");
61 		return -1;
62 	}
63 
64 	LOG_INF("Sensor hub ready");
65 
66 	value.val1 = MAX32664C_OP_MODE_ALGO_AEC;
67 	value.val2 = MAX32664C_ALGO_MODE_CONT_HRM;
68 	sensor_attr_set(sensor_hub, SENSOR_CHAN_MAX32664C_HEARTRATE, SENSOR_ATTR_MAX32664C_OP_MODE,
69 			&value);
70 
71 	while (1) {
72 		update();
73 		k_msleep(1000);
74 	}
75 
76 	return 0;
77 }
78