Example of wake up detection for LSM6DSL in X-NUCLEO-IKS01A2

Dependencies:   X_NUCLEO_IKS01A2 mbed

Fork of WakeUp_IKS01A2 by ST Expansion SW Team

Wake up Demo Application based on sensor expansion board X-NUCLEO-IKS01A2

Main function is to show how to detect the wake up event 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 shake the board and then view the notification using an hyper terminal. When the wake up event is detected, the LED is switched on for a while.
- the user button can be used to enable/disable the wake up detection feature.

Files at this revision

API Documentation at this revision

Comitter:
cparata
Date:
Wed Nov 23 15:55:10 2016 +0000
Parent:
4:fbffbdc722a5
Child:
6:06f4a71c4743
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
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/X_NUCLEO_IKS01A2/Components/LSM6DSLSensor/LSM6DSLSensor.cpp	Mon Nov 21 14:58:19 2016 +0000
+++ b/X_NUCLEO_IKS01A2/Components/LSM6DSLSensor/LSM6DSLSensor.cpp	Wed Nov 23 15:55:10 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:58:19 2016 +0000
+++ b/X_NUCLEO_IKS01A2/x_nucleo_iks01a2_targets.h	Wed Nov 23 15:55:10 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_
--- a/main.cpp	Mon Nov 21 14:58:19 2016 +0000
+++ b/main.cpp	Wed Nov 23 15:55:10 2016 +0000
@@ -46,7 +46,7 @@
 /* Retrieve the composing elements of the expansion board */
 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
 
-InterruptIn lsm6dsl_int1(IKS01A2_PIN_LSM6DSL_INT1);
+InterruptIn lsm6dsl_int2(IKS01A2_PIN_LSM6DSL_INT2);
 InterruptIn mybutton(USER_BUTTON);
 DigitalOut myled(LED1);
 
@@ -62,7 +62,7 @@
   /* Attach callback to User button press */
   mybutton.fall(&pressed);
   /* Attach callback to LSM6DSL INT1 */
-  lsm6dsl_int1.rise(&wakeup);
+  lsm6dsl_int2.rise(&wakeup);
   
   /* Enable LSM6DSL accelerometer */
   acc_gyro->Enable_X();