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
1812bool sample_init_complete = false;
1913
2014
2115uint8_t reg_value ;
2216struct sensor_value temperature ;
2317struct 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
132102static 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 */
0 commit comments