Skip to content

Commit 88a0623

Browse files
committed
Overhauled accelerometer samples
Added sample for motion/no-motion and overhauled the existing sample. Signed-off-by: Jared Baumann <jared.baumann8@t-mobile.com>
1 parent 65f2077 commit 88a0623

File tree

9 files changed

+506
-91
lines changed

9 files changed

+506
-91
lines changed

samples/lis2dw12_sample/Kconfig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Copyright (c) 2023 T-Mobile USA, Inc.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
#
5+
6+
mainmenu "LIS2DW12 sample application"
7+
8+
config LIS2DW12_SAMPLE_DRDY
9+
bool "Enable the data read trigger"
10+
depends on LIS2DW12_TRIGGER
11+
default n
12+
13+
source "Kconfig.zephyr"

samples/lis2dw12_sample/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ CONFIG_SENSOR=y
44
CONFIG_LIS2DW12=y
55
CONFIG_LIS2DW12_TRIGGER_GLOBAL_THREAD=y
66
CONFIG_LIS2DW12_TAP=y
7+
CONFIG_LIS2DW12_TAP_3D=y
78
CONFIG_LIS2DW12_THRESHOLD=y
9+
CONFIG_LIS2DW12_THRESHOLD_3D=y
810
CONFIG_LIS2DW12_FREEFALL=y
911
CONFIG_CBPRINTF_FP_SUPPORT=y
1012
CONFIG_ASSERT=y

samples/lis2dw12_sample/src/main.c

Lines changed: 147 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,15 @@
88
#include <zephyr/kernel.h>
99
#include <zephyr/device.h>
1010
#include <zephyr/drivers/sensor.h>
11-
#include <zephyr/drivers/sensor/lis2dw12.h>
12-
13-
#define DOUBLE_TAP_EVENT 0x10U
14-
#define SINGLE_TAP_EVENT 0x08U
15-
#define FREEFALL_EVENT 0x02U
16-
#define DATAREADY_EVENT 0x01U
1711

1812
bool sample_init_complete = false;
1913

2014

2115
uint8_t reg_value;
2216
struct sensor_value temperature;
2317
struct sensor_value sensor_attr_val;
24-
struct sensor_trigger trig;
2518

26-
static void trigger_and_display(const struct device *sensor)
19+
static void trigger_and_display(const struct device *sensor, const struct sensor_trigger *trig)
2720
{
2821
static unsigned int count;
2922
struct sensor_value accel[3];
@@ -56,66 +49,43 @@ static void trigger_and_display(const struct device *sensor)
5649
sensor_value_to_double(&accel[2]));
5750
}
5851
#endif
59-
rc = sensor_attr_get(sensor, trig.chan, SENSOR_ATTR_STATUS,
60-
(struct sensor_value *)&sensor_attr_val);
61-
if (rc < 0) {
62-
printf("\n\tERROR: Unable to read register 0X27 :%d\n", rc);
63-
} else {
64-
reg_value = (uint8_t)sensor_attr_val.val1;
65-
if ((reg_value & SINGLE_TAP_EVENT) == SINGLE_TAP_EVENT) {
66-
printf("\n\tSINGLE TAP was detected (%xh)\n", (reg_value));
67-
} else if ((reg_value & DOUBLE_TAP_EVENT) == DOUBLE_TAP_EVENT) {
68-
printf("\n\tDOUBLE TAP was detected (%xh)\n", (reg_value));
69-
} else if ((reg_value & FREEFALL_EVENT) == FREEFALL_EVENT) {
70-
printf("\n\tFREE FALL was detected (%xh)\n", (reg_value));
71-
} else if ((reg_value & DATAREADY_EVENT) == DATAREADY_EVENT) {
72-
printf("\n\tDATAREADY was detected (%xh)\n", (reg_value));
52+
if (trig) {
53+
if (trig->type == SENSOR_TRIG_TAP) {
54+
printf("\nSINGLE TAP was detected\n");
55+
} else if (trig->type == SENSOR_TRIG_DOUBLE_TAP) {
56+
printf("\nDOUBLE TAP was detected\n");
57+
} else if (trig->type == SENSOR_TRIG_FREEFALL) {
58+
printf("\nFREE FALL was detected\n");
59+
} else if (trig->type == SENSOR_TRIG_DATA_READY) {
60+
printf("\nDATAREADY was detected\n");
61+
} else if (trig->type == SENSOR_TRIG_THRESHOLD) {
62+
printf("\nTHRESHOLD event was detected\n");
7363
} else {
74-
printf("\n\tUNKNOWN event was detected (%xh)\n", (reg_value));
64+
printf("\nUNKNOWN event was detected (%d)\n", (trig->type));
7565
}
7666
}
7767

78-
uint8_t reg_array[5] = {0};
79-
rc = sensor_attr_get(sensor, trig.chan, SENSOR_ATTR_ALL_WAKE_UP_SRC,
80-
(struct sensor_value *)&reg_array[0]);
81-
if (rc < 0) {
82-
printf("\n\tERROR: Unable to read register 0x38 :%d\n", rc);
83-
} else {
84-
if (reg_array[1]) {
85-
if ((reg_array[1] & 0x20) == 0x20) {
86-
printf("\tReg 38h - FREE FALL detected (%xh)\n", (reg_array[1]));
87-
}
88-
} else {
89-
printf("\tReg 38h - No WAKE SRC detected (%xh)\n", (reg_array[1]));
68+
if (trig->type == SENSOR_TRIG_THRESHOLD) {
69+
if (trig->chan == SENSOR_CHAN_ACCEL_X) {
70+
printf("\tTHRESHOLD X-Axis detected\n");
71+
}
72+
if (trig->chan == SENSOR_CHAN_ACCEL_Y) {
73+
printf("\tTHRESHOLD Y-Axis detected\n");
74+
}
75+
if (trig->chan == SENSOR_CHAN_ACCEL_Z) {
76+
printf("\tTHRESHOLD Z-Axis detected\n");
9077
}
9178
}
9279

93-
reg_value = 0;
94-
rc = sensor_attr_get(sensor, trig.chan, SENSOR_ATTR_TAP_SRC,
95-
(struct sensor_value *)&reg_value);
96-
if (rc < 0) {
97-
printf("\n\tERROR: Unable to read register 0x39 :%d\n", rc);
98-
} else {
99-
100-
if (reg_value) {
101-
if ((reg_value & 0x01) == 0x01) {
102-
printf("\tReg 39h - TAP_EVENT Negative Accel detected (%xh)\n",
103-
(reg_value));
104-
} else {
105-
printf("\tReg 39h - TAP_EVENT Positive Accel detected (%xh)\n",
106-
(reg_value));
107-
}
108-
if ((reg_value & 0x04) == 0x04) {
109-
printf("\tReg 39h - TAP_EVENT X-Axis detected\n");
110-
}
111-
if ((reg_value & 0x02) == 0x02) {
112-
printf("\tReg 39h - TAP_EVENT Y-Axis detected\n");
113-
}
114-
if ((reg_value & 0x01) == 0x01) {
115-
printf("\tReg 39h - TAP_EVENT Z-Axis detected\n");
116-
}
117-
} else {
118-
printf("\tReg 39h - No TAP_EVENT detected (%xh)\n", (reg_value));
80+
if (trig->type == SENSOR_TRIG_TAP || trig->type == SENSOR_TRIG_DOUBLE_TAP) {
81+
if (trig->chan == SENSOR_CHAN_ACCEL_X) {
82+
printf("\tTAP_EVENT X-Axis detected\n");
83+
}
84+
if (trig->chan == SENSOR_CHAN_ACCEL_Y) {
85+
printf("\tTAP_EVENT Y-Axis detected\n");
86+
}
87+
if (trig->chan == SENSOR_CHAN_ACCEL_Z) {
88+
printf("\tTAP_EVENT Z-Axis detected\n");
11989
}
12090
}
12191

@@ -131,7 +101,7 @@ static void trigger_and_display(const struct device *sensor)
131101
#ifdef CONFIG_LIS2DW12_TRIGGER
132102
static void trigger_handler(const struct device *dev, const struct sensor_trigger *trig)
133103
{
134-
trigger_and_display(dev);
104+
trigger_and_display(dev, trig);
135105
}
136106
#endif
137107

@@ -166,71 +136,157 @@ void main(void)
166136
#if CONFIG_LIS2DW12_TRIGGER
167137
int rc;
168138

169-
trig.type = SENSOR_TRIG_DATA_READY;
170-
trig.chan = SENSOR_CHAN_ACCEL_XYZ;
139+
static struct sensor_trigger drdy_trig;
140+
drdy_trig.type = SENSOR_TRIG_DATA_READY;
141+
drdy_trig.chan = SENSOR_CHAN_ACCEL_XYZ;
171142

172143
struct sensor_value odr = {
173-
.val1 = 1,
144+
.val1 = 2,
174145
};
175146

176-
rc = sensor_attr_set(sensor, trig.chan, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr);
147+
rc = sensor_attr_set(sensor, drdy_trig.chan, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr);
177148
if (rc != 0) {
178149
printf("\tFailed to set odr: %d\n", rc);
179150
return;
180151
}
181152

182-
trig.type = SENSOR_TRIG_DOUBLE_TAP;
183-
trig.chan = SENSOR_CHAN_ACCEL_XYZ;
153+
#if CONFIG_LIS2DW12_SAMPLE_DRDY
154+
rc = sensor_trigger_set(sensor, &drdy_trig, trigger_handler);
155+
#endif
156+
157+
static struct sensor_trigger ff_trig;
158+
ff_trig.type = SENSOR_TRIG_FREEFALL;
159+
ff_trig.chan = SENSOR_CHAN_ACCEL_XYZ;
160+
161+
#if CONFIG_LIS2DW12_TAP
162+
rc = sensor_trigger_set(sensor, &ff_trig, trigger_handler);
163+
164+
static struct sensor_trigger dtap_xyz_trig;
165+
dtap_xyz_trig.type = SENSOR_TRIG_DOUBLE_TAP;
166+
dtap_xyz_trig.chan = SENSOR_CHAN_ACCEL_XYZ;
184167

185-
rc = sensor_trigger_set(sensor, &trig, trigger_handler);
168+
rc = sensor_trigger_set(sensor, &dtap_xyz_trig, trigger_handler);
186169
if (rc != 0) {
187170
printf("\tFailed to set Double Tap trigger: %d\n", rc);
188171
return;
189172
}
190173

191-
trig.type = SENSOR_TRIG_THRESHOLD;
192-
trig.chan = SENSOR_CHAN_ACCEL_XYZ;
174+
static struct sensor_trigger stap_xyz_trig;
175+
stap_xyz_trig.type = SENSOR_TRIG_TAP;
176+
stap_xyz_trig.chan = SENSOR_CHAN_ACCEL_XYZ;
193177

194-
rc = sensor_trigger_set(sensor, &trig, trigger_handler);
178+
rc = sensor_trigger_set(sensor, &stap_xyz_trig, trigger_handler);
195179
if (rc != 0) {
196-
printf("\tFailed to set Threshold trigger: %d\n", rc);
180+
printf("\tFailed to set Single Tap trigger: %d\n", rc);
197181
return;
198182
}
199183

200-
struct sensor_value ctrl4_reg = {
201-
.val1 = 0x58,
202-
};
184+
#if CONFIG_LIS2DW12_TAP_3D
185+
static struct sensor_trigger dtap_x_trig;
186+
dtap_x_trig.type = SENSOR_TRIG_DOUBLE_TAP;
187+
dtap_x_trig.chan = SENSOR_CHAN_ACCEL_X;
203188

204-
rc = sensor_attr_set(sensor, trig.chan, SENSOR_ATTR_ENABLE_EVENT_INTERRUPT, &ctrl4_reg);
189+
rc = sensor_trigger_set(sensor, &dtap_x_trig, trigger_handler);
205190
if (rc != 0) {
206-
printf("\tFailed to set odr: %d\n", rc);
191+
printf("\tFailed to set Double Tap X trigger: %d\n", rc);
207192
return;
208193
}
209194

210-
rc = sensor_attr_get(sensor, trig.chan, SENSOR_ATTR_CHIP_ID,
211-
(struct sensor_value *)&sensor_attr_val);
195+
196+
static struct sensor_trigger dtap_y_trig;
197+
dtap_y_trig.type = SENSOR_TRIG_DOUBLE_TAP;
198+
dtap_y_trig.chan = SENSOR_CHAN_ACCEL_Y;
199+
200+
rc = sensor_trigger_set(sensor, &dtap_y_trig, trigger_handler);
212201
if (rc != 0) {
213-
printf("\tFailed to get status: %d\n", rc);
202+
printf("\tFailed to set Double Tap Y trigger: %d\n", rc);
214203
return;
215204
}
216205

217-
if (sensor_attr_val.val1 == 0x44) {
218-
printf("\tWHOAMI: (%xh)\n", (uint8_t)sensor_attr_val.val1);
219-
} else {
220-
printf("\tError : WHOAMI (%xh) doesnt match the LIS2DW12 ?\n",
221-
(sensor_attr_val.val1));
206+
static struct sensor_trigger dtap_z_trig;
207+
dtap_z_trig.type = SENSOR_TRIG_DOUBLE_TAP;
208+
dtap_z_trig.chan = SENSOR_CHAN_ACCEL_Z;
209+
210+
rc = sensor_trigger_set(sensor, &dtap_z_trig, trigger_handler);
211+
if (rc != 0) {
212+
printf("\tFailed to set Double Tap Z trigger: %d\n", rc);
222213
return;
223214
}
224215

225-
rc = sensor_attr_get(sensor, trig.chan, SENSOR_ATTR_STATUS,
226-
(struct sensor_value *)&sensor_attr_val);
216+
static struct sensor_trigger stap_x_trig;
217+
stap_x_trig.type = SENSOR_TRIG_TAP;
218+
stap_x_trig.chan = SENSOR_CHAN_ACCEL_X;
219+
220+
rc = sensor_trigger_set(sensor, &stap_x_trig, trigger_handler);
227221
if (rc != 0) {
228-
printf("\tFailed to get status: %d\n", rc);
222+
printf("\tFailed to set Single Tap X trigger: %d\n", rc);
229223
return;
230224
}
231225

232-
printf("\tSENSOR_ATTR_STATUS: (%xh)\n", sensor_attr_val.val1);
226+
static struct sensor_trigger stap_y_trig;
227+
stap_y_trig.type = SENSOR_TRIG_TAP;
228+
stap_y_trig.chan = SENSOR_CHAN_ACCEL_Y;
233229

230+
rc = sensor_trigger_set(sensor, &stap_y_trig, trigger_handler);
231+
if (rc != 0) {
232+
printf("\tFailed to set Single Tap Y trigger: %d\n", rc);
233+
return;
234+
}
235+
236+
static struct sensor_trigger stap_z_trig;
237+
stap_z_trig.type = SENSOR_TRIG_TAP;
238+
stap_z_trig.chan = SENSOR_CHAN_ACCEL_Z;
239+
240+
rc = sensor_trigger_set(sensor, &stap_z_trig, trigger_handler);
241+
if (rc != 0) {
242+
printf("\tFailed to set Single Tap Z trigger: %d\n", rc);
243+
return;
244+
}
245+
#endif /* CONFIG_LIS2DW12_TAP_3D */
246+
#endif /* CONFIG_LIS2DW12_TAP */
247+
#if CONFIG_LIS2DW12_THRESHOLD
248+
static struct sensor_trigger thresh_xyz_trig;
249+
thresh_xyz_trig.type = SENSOR_TRIG_THRESHOLD;
250+
thresh_xyz_trig.chan = SENSOR_CHAN_ACCEL_XYZ;
251+
252+
rc = sensor_trigger_set(sensor, &thresh_xyz_trig, trigger_handler);
253+
if (rc != 0) {
254+
printf("\tFailed to set Threshold trigger: %d\n", rc);
255+
return;
256+
}
257+
258+
#if CONFIG_LIS2DW12_THRESHOLD_3D
259+
static struct sensor_trigger thresh_x_trig;
260+
thresh_x_trig.type = SENSOR_TRIG_THRESHOLD;
261+
thresh_x_trig.chan = SENSOR_CHAN_ACCEL_X;
262+
263+
rc = sensor_trigger_set(sensor, &thresh_x_trig, trigger_handler);
264+
if (rc != 0) {
265+
printf("\tFailed to set Threshold X trigger: %d\n", rc);
266+
return;
267+
}
268+
269+
static struct sensor_trigger thresh_y_trig;
270+
thresh_y_trig.type = SENSOR_TRIG_THRESHOLD;
271+
thresh_y_trig.chan = SENSOR_CHAN_ACCEL_Y;
272+
273+
rc = sensor_trigger_set(sensor, &thresh_y_trig, trigger_handler);
274+
if (rc != 0) {
275+
printf("\tFailed to set Threshold Y trigger: %d\n", rc);
276+
return;
277+
}
278+
279+
static struct sensor_trigger thresh_z_trig;
280+
thresh_z_trig.type = SENSOR_TRIG_THRESHOLD;
281+
thresh_z_trig.chan = SENSOR_CHAN_ACCEL_Z;
282+
283+
rc = sensor_trigger_set(sensor, &thresh_z_trig, trigger_handler);
284+
if (rc != 0) {
285+
printf("\tFailed to set Threshold Z trigger: %d\n", rc);
286+
return;
287+
}
288+
#endif /* CONFIG_LIS2DW12_THRESHOLD_3D */
289+
#endif /* CONFIG_LIS2DW12_THRESHOLD */
234290
/* Let the interrupt handler know the sample is ready to run */
235291
sample_init_complete = true;
236292

@@ -242,7 +298,7 @@ void main(void)
242298

243299
#else /* CONFIG_LIS2DW12_TRIGGER */
244300
while (true) {
245-
trigger_and_display(sensor);
301+
trigger_and_display(sensor, NULL);
246302
k_sleep(K_MSEC(2000));
247303
}
248304
#endif /* CONFIG_LIS2DW12_TRIGGER */
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#
2+
# Copyright (c) 2018, Yannis Damigos
3+
#
4+
# SPDX-License-Identifier: Apache-2.0
5+
#
6+
7+
cmake_minimum_required(VERSION 3.20.0)
8+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
9+
project(lis2dw12_sample)
10+
11+
FILE(GLOB app_sources src/*.c)
12+
target_sources(app PRIVATE ${app_sources})
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Copyright (c) 2023 T-Mobile USA, Inc.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
#
5+
6+
mainmenu "LIS2DW12 sample application"
7+
8+
config LIS2DW12_SAMPLE_DRDY
9+
bool "Enable the data read trigger"
10+
depends on LIS2DW12_TRIGGER
11+
default n
12+
13+
source "Kconfig.zephyr"

0 commit comments

Comments
 (0)