8
8
#include <zephyr/kernel.h>
9
9
#include <zephyr/device.h>
10
10
#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
17
11
18
12
bool sample_init_complete = false;
19
13
20
14
21
15
uint8_t reg_value ;
22
16
struct sensor_value temperature ;
23
17
struct sensor_value sensor_attr_val ;
24
- struct sensor_trigger trig ;
25
18
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 )
27
20
{
28
21
static unsigned int count ;
29
22
struct sensor_value accel [3 ];
@@ -56,66 +49,43 @@ static void trigger_and_display(const struct device *sensor)
56
49
sensor_value_to_double (& accel [2 ]));
57
50
}
58
51
#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" );
73
63
} else {
74
- printf ("\n\tUNKNOWN event was detected (%xh )\n" , (reg_value ));
64
+ printf ("\nUNKNOWN event was detected (%d )\n" , (trig -> type ));
75
65
}
76
66
}
77
67
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" );
90
77
}
91
78
}
92
79
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" );
119
89
}
120
90
}
121
91
@@ -131,7 +101,7 @@ static void trigger_and_display(const struct device *sensor)
131
101
#ifdef CONFIG_LIS2DW12_TRIGGER
132
102
static void trigger_handler (const struct device * dev , const struct sensor_trigger * trig )
133
103
{
134
- trigger_and_display (dev );
104
+ trigger_and_display (dev , trig );
135
105
}
136
106
#endif
137
107
@@ -166,71 +136,157 @@ void main(void)
166
136
#if CONFIG_LIS2DW12_TRIGGER
167
137
int rc ;
168
138
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 ;
171
142
172
143
struct sensor_value odr = {
173
- .val1 = 1 ,
144
+ .val1 = 2 ,
174
145
};
175
146
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 );
177
148
if (rc != 0 ) {
178
149
printf ("\tFailed to set odr: %d\n" , rc );
179
150
return ;
180
151
}
181
152
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 ;
184
167
185
- rc = sensor_trigger_set (sensor , & trig , trigger_handler );
168
+ rc = sensor_trigger_set (sensor , & dtap_xyz_trig , trigger_handler );
186
169
if (rc != 0 ) {
187
170
printf ("\tFailed to set Double Tap trigger: %d\n" , rc );
188
171
return ;
189
172
}
190
173
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 ;
193
177
194
- rc = sensor_trigger_set (sensor , & trig , trigger_handler );
178
+ rc = sensor_trigger_set (sensor , & stap_xyz_trig , trigger_handler );
195
179
if (rc != 0 ) {
196
- printf ("\tFailed to set Threshold trigger: %d\n" , rc );
180
+ printf ("\tFailed to set Single Tap trigger: %d\n" , rc );
197
181
return ;
198
182
}
199
183
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 ;
203
188
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 );
205
190
if (rc != 0 ) {
206
- printf ("\tFailed to set odr : %d\n" , rc );
191
+ printf ("\tFailed to set Double Tap X trigger : %d\n" , rc );
207
192
return ;
208
193
}
209
194
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 );
212
201
if (rc != 0 ) {
213
- printf ("\tFailed to get status : %d\n" , rc );
202
+ printf ("\tFailed to set Double Tap Y trigger : %d\n" , rc );
214
203
return ;
215
204
}
216
205
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 );
222
213
return ;
223
214
}
224
215
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 );
227
221
if (rc != 0 ) {
228
- printf ("\tFailed to get status : %d\n" , rc );
222
+ printf ("\tFailed to set Single Tap X trigger : %d\n" , rc );
229
223
return ;
230
224
}
231
225
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 ;
233
229
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 */
234
290
/* Let the interrupt handler know the sample is ready to run */
235
291
sample_init_complete = true;
236
292
@@ -242,7 +298,7 @@ void main(void)
242
298
243
299
#else /* CONFIG_LIS2DW12_TRIGGER */
244
300
while (true) {
245
- trigger_and_display (sensor );
301
+ trigger_and_display (sensor , NULL );
246
302
k_sleep (K_MSEC (2000 ));
247
303
}
248
304
#endif /* CONFIG_LIS2DW12_TRIGGER */
0 commit comments