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