Example of single tap and double tap detection for LSM6DSL in X-NUCLEO-IKS01A2

Dependencies:   X_NUCLEO_IKS01A2 mbed

Fork of SingleDoubleTap_IKS01A2 by ST Expansion SW Team

Single and Double Tap Demo Application based on sensor expansion board X-NUCLEO-IKS01A2

Main function is to show how to detect the single and double tap events using the sensor expansion board and send a notification using UART to a connected PC or Desktop and display it on terminal applications like TeraTerm.
After connection has been established:
- the user can try to tap the board and then view the notification using an hyper terminal. When the single tap is detected, the LED is switched on for a while.
- the user can press the user button to pass from the single tap detection to the double tap detection feature. The user can try to double tap the board and then view the notification using an hyper terminal. When the double tap is detected, the LED is switched on twice for a while.
- the user can press again the user button to disable the single and double tap detection feature.
- the user can press the user button to enable again the single tap detection feature and so on.

Files at this revision

API Documentation at this revision

Comitter:
cparata
Date:
Wed Nov 23 15:54:32 2016 +0000
Parent:
4:05f28412d61b
Child:
6:2380444e4c75
Commit message:
Improve Multi Event Management

Changed in this revision

X_NUCLEO_IKS01A2/Components/LSM6DSLSensor/LSM6DSLSensor.cpp Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_IKS01A2/x_nucleo_iks01a2_targets.h Show annotated file Show diff for this revision Revisions of this file
--- a/X_NUCLEO_IKS01A2/Components/LSM6DSLSensor/LSM6DSLSensor.cpp	Mon Nov 21 14:57:55 2016 +0000
+++ b/X_NUCLEO_IKS01A2/Components/LSM6DSLSensor/LSM6DSLSensor.cpp	Wed Nov 23 15:54:32 2016 +0000
@@ -1202,8 +1202,8 @@
     return 1;
   }
   
-  /* INT1_WU setting */
-  if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_WU_ENABLED ) == MEMS_ERROR )
+  /* INT2_WU setting */
+  if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_WU_ENABLED ) == MEMS_ERROR )
   {
     return 1;
   }
@@ -1217,8 +1217,8 @@
  */
 int LSM6DSLSensor::Disable_Wake_Up_Detection(void)
 {
-  /* INT1_WU setting */
-  if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt1( (void *)this, LSM6DSL_ACC_GYRO_INT1_WU_DISABLED ) == MEMS_ERROR )
+  /* INT2_WU setting */
+  if ( LSM6DSL_ACC_GYRO_W_WUEvOnInt2( (void *)this, LSM6DSL_ACC_GYRO_INT2_WU_DISABLED ) == MEMS_ERROR )
   {
     return 1;
   }
@@ -1853,7 +1853,7 @@
  */
 int LSM6DSLSensor::Get_Event_Status(LSM6DSL_Event_Status_t *status)
 {
-  uint8_t Wake_Up_Src = 0, Tap_Src = 0, D6D_Src = 0, Func_Src = 0;
+  uint8_t Wake_Up_Src = 0, Tap_Src = 0, D6D_Src = 0, Func_Src = 0, Md1_Cfg = 0, Md2_Cfg = 0, Int1_Ctrl = 0;
 
   memset((void *)status, 0x0, sizeof(LSM6DSL_Event_Status_t));
 
@@ -1877,39 +1877,75 @@
     return 1;
   }
 
-  if((Wake_Up_Src & LSM6DSL_ACC_GYRO_FF_EV_STATUS_MASK))
+  if(ReadReg(LSM6DSL_ACC_GYRO_MD1_CFG, &Md1_Cfg ) != 0 )
+  {
+    return 1;
+  }
+
+  if(ReadReg(LSM6DSL_ACC_GYRO_MD2_CFG, &Md2_Cfg ) != 0)
   {
-    status->FreeFallStatus = 1;  
+    return 1;
+  }
+
+  if(ReadReg(LSM6DSL_ACC_GYRO_INT1_CTRL, &Int1_Ctrl ) != 0)
+  {
+    return 1;
   }
 
-  if((Wake_Up_Src & LSM6DSL_ACC_GYRO_WU_EV_STATUS_MASK))
+  if(Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_FF_MASK)
   {
-    status->WakeUpStatus = 1;  
+    if((Wake_Up_Src & LSM6DSL_ACC_GYRO_FF_EV_STATUS_MASK))
+    {
+      status->FreeFallStatus = 1;  
+    }
   }
 
-  if((Tap_Src & LSM6DSL_ACC_GYRO_SINGLE_TAP_EV_STATUS_MASK))
+  if(Md2_Cfg & LSM6DSL_ACC_GYRO_INT2_WU_MASK)
   {
-    status->TapStatus = 1;  
+    if((Wake_Up_Src & LSM6DSL_ACC_GYRO_WU_EV_STATUS_MASK))
+    {
+      status->WakeUpStatus = 1;  
+    }
   }
 
-  if((Tap_Src & LSM6DSL_ACC_GYRO_DOUBLE_TAP_EV_STATUS_MASK))
+  if(Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_SINGLE_TAP_MASK)
   {
-    status->DoubleTapStatus = 1;  
+    if((Tap_Src & LSM6DSL_ACC_GYRO_SINGLE_TAP_EV_STATUS_MASK))
+    {
+      status->TapStatus = 1;  
+    }
+  }
+
+  if(Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_TAP_MASK)
+  {
+    if((Tap_Src & LSM6DSL_ACC_GYRO_DOUBLE_TAP_EV_STATUS_MASK))
+    {
+      status->DoubleTapStatus = 1;  
+    }
   }
 
-  if((D6D_Src & LSM6DSL_ACC_GYRO_D6D_EV_STATUS_MASK))
+  if(Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_6D_MASK)
   {
-    status->D6DOrientationStatus = 1;  
+    if((D6D_Src & LSM6DSL_ACC_GYRO_D6D_EV_STATUS_MASK))
+    {
+      status->D6DOrientationStatus = 1;  
+    }
   }
 
-  if((Func_Src & LSM6DSL_ACC_GYRO_PEDO_EV_STATUS_MASK))
+  if(Int1_Ctrl & LSM6DSL_ACC_GYRO_INT1_PEDO_MASK)
   {
-    status->StepStatus = 1;  
+    if((Func_Src & LSM6DSL_ACC_GYRO_PEDO_EV_STATUS_MASK))
+    {
+      status->StepStatus = 1;  
+    }
   }
 
-  if((Func_Src & LSM6DSL_ACC_GYRO_TILT_EV_STATUS_MASK))
+  if(Md1_Cfg & LSM6DSL_ACC_GYRO_INT1_TILT_MASK)
   {
-    status->TiltStatus = 1;  
+    if((Func_Src & LSM6DSL_ACC_GYRO_TILT_EV_STATUS_MASK))
+    {
+      status->TiltStatus = 1;  
+    }
   }
 
   return 0;
--- a/X_NUCLEO_IKS01A2/x_nucleo_iks01a2_targets.h	Mon Nov 21 14:57:55 2016 +0000
+++ b/X_NUCLEO_IKS01A2/x_nucleo_iks01a2_targets.h	Wed Nov 23 15:54:32 2016 +0000
@@ -48,5 +48,7 @@
 
 /* LSM6DSL INT1 */
 #define IKS01A2_PIN_LSM6DSL_INT1     (D4)
+/* LSM6DSL INT2 */
+#define IKS01A2_PIN_LSM6DSL_INT2     (D5)
 
 #endif // _X_NUCLEO_IKS01A2_TARGETS_H_