1 /*
2  * Copyright 2024 NXP
3  * Copyright (c) 2018 Phytec Messtechnik GmbH
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <zephyr/kernel.h>
9 #include <zephyr/drivers/sensor.h>
10 #include <stdio.h>
11 
12 K_SEM_DEFINE(sem, 0, 1); /* starts off "not available" */
13 
14 #ifdef CONFIG_SAMPLE_TAP_DETECTION
tap_trigger_handler(const struct device * dev,const struct sensor_trigger * trigger)15 static void tap_trigger_handler(const struct device *dev, const struct sensor_trigger *trigger)
16 {
17 	ARG_UNUSED(trigger);
18 	printf("TAP detected\n");
19 
20 	if (sensor_sample_fetch_chan(dev, SENSOR_CHAN_ACCEL_XYZ) < 0) {
21 		printf("ERROR: SENSOR_CHAN_ACCEL_XYZ fetch failed\n");
22 	}
23 
24 	k_sem_give(&sem);
25 }
26 #else
trigger_handler(const struct device * dev,const struct sensor_trigger * trigger)27 static void trigger_handler(const struct device *dev, const struct sensor_trigger *trigger)
28 {
29 	ARG_UNUSED(trigger);
30 
31 	/* Always fetch the sample to clear the data ready interrupt in the
32 	 * sensor.
33 	 */
34 	if (sensor_sample_fetch(dev)) {
35 		printf("sensor_sample_fetch failed\n");
36 		return;
37 	}
38 
39 	k_sem_give(&sem);
40 }
41 #endif
42 
main(void)43 int main(void)
44 {
45 	struct sensor_value data[3];
46 	const struct device *const dev = DEVICE_DT_GET(DT_ALIAS(accel0));
47 
48 	struct sensor_trigger trig = {
49 		.type = SENSOR_TRIG_DATA_READY,
50 		.chan = SENSOR_CHAN_ACCEL_XYZ,
51 	};
52 
53 	if (!device_is_ready(dev)) {
54 		printf("Device %s is not ready\n", dev->name);
55 		return 0;
56 	}
57 
58 #ifdef CONFIG_SAMPLE_TAP_DETECTION
59 	trig.type = SENSOR_TRIG_DOUBLE_TAP;
60 	trig.chan = SENSOR_CHAN_ACCEL_XYZ;
61 	if (sensor_trigger_set(dev, &trig, tap_trigger_handler) < 0) {
62 		printf("Could not set tap trigger\n");
63 		return 0;
64 	}
65 #else
66 	if (sensor_trigger_set(dev, &trig, trigger_handler)) {
67 		printf("Could not set trigger\n");
68 		return 0;
69 	}
70 #endif
71 
72 	while (1) {
73 		k_sem_take(&sem, K_FOREVER);
74 		sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, data);
75 
76 		/* Print accel x,y,z data */
77 		printf("%16s [m/s^2]:    (%12.6f, %12.6f, %12.6f)\n", dev->name,
78 		       sensor_value_to_double(&data[0]), sensor_value_to_double(&data[1]),
79 		       sensor_value_to_double(&data[2]));
80 	}
81 }
82