Example of 6D orientation recognition for LSM6DSL in X-NUCLEO-IKS01A2

Dependencies:   X_NUCLEO_IKS01A2 mbed

Fork of 6DOrientation_IKS01A2 by ST Expansion SW Team

6D Orientation Demo Application based on sensor expansion board X-NUCLEO-IKS01A2

Main function is to show how to use sensor expansion board to find out the 6D orientation and send data using UART to a connected PC or Desktop and display it on terminal applications like TeraTerm.
After connection has been established:
- the user can rotate the board to change the 6D orientation and then view the data using an hyper terminal.
- the user button can be used to display the current 6D orientation.

Files at this revision

API Documentation at this revision

Comitter:
cparata
Date:
Wed Nov 23 15:52:58 2016 +0000
Parent:
4:1adb1ce17b05
Child:
6:f215defe10e4
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:06 2016 +0000
+++ b/X_NUCLEO_IKS01A2/Components/LSM6DSLSensor/LSM6DSLSensor.cpp	Wed Nov 23 15:52:58 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:06 2016 +0000
+++ b/X_NUCLEO_IKS01A2/x_nucleo_iks01a2_targets.h	Wed Nov 23 15:52:58 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_