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