Library for Bosch Sensortec BMI160 IMU

Dependents:   Rocket MAX32630FTHR_JOYSTICK MAX32630FTHR_IMU_Hello_World Pike_the_Flipper_Main_Branch ... more

Fork of BMI160 by Justin Jordan

Revision:
15:dc35ccc0b08e
Parent:
14:646eb94fa2eb
Child:
16:12782f5d4aa4
--- a/bmi160.cpp	Tue Dec 20 19:32:26 2016 +0000
+++ b/bmi160.cpp	Tue Dec 20 21:20:22 2016 +0000
@@ -130,21 +130,20 @@
         data.raw = ((localData[1] << 8) | localData[0]);
         switch(range)
         {
-            //magic numbers are typical values for LSB/g from EC table
             case SENS_2G:
-                data.scaled = (data.raw/16384.0F);
+                data.scaled = (data.raw/SENS_2G_LSB_PER_G);
             break;
             
             case SENS_4G:
-                data.scaled = (data.raw/8192.0F);
+                data.scaled = (data.raw/SENS_4G_LSB_PER_G);
             break;
             
             case SENS_8G:
-                data.scaled = (data.raw/4096.0F);
+                data.scaled = (data.raw/SENS_8G_LSB_PER_G);
             break;
             
             case SENS_16G:
-                data.scaled = (data.raw/2048.0F);
+                data.scaled = (data.raw/SENS_16G_LSB_PER_G);
             break;
         }
     }
@@ -167,29 +166,28 @@
         
         switch(range)
         {
-            //magic numbers are typical values for LSB/g from EC table
             case SENS_2G:
-                data.xAxis.scaled = (data.xAxis.raw/16384.0F);
-                data.yAxis.scaled = (data.yAxis.raw/16384.0F);
-                data.zAxis.scaled = (data.zAxis.raw/16384.0F);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
             break;
             
             case SENS_4G:
-                data.xAxis.scaled = (data.xAxis.raw/8192.0F);
-                data.yAxis.scaled = (data.yAxis.raw/8192.0F);
-                data.zAxis.scaled = (data.zAxis.raw/8192.0F);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
             break;
             
             case SENS_8G:
-                data.xAxis.scaled = (data.xAxis.raw/4096.0F);
-                data.yAxis.scaled = (data.yAxis.raw/4096.0F);
-                data.zAxis.scaled = (data.zAxis.raw/4096.0F);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
             break;
             
             case SENS_16G:
-                data.xAxis.scaled = (data.xAxis.raw/2048.0F);
-                data.yAxis.scaled = (data.yAxis.raw/2048.0F);
-                data.zAxis.scaled = (data.zAxis.raw/2048.0F);
+                data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
             break;
         }
     }
@@ -199,14 +197,63 @@
 
 
 //***************************************************************************** 
-int32_t BMI160::getSensorTime(float *data)
+int32_t BMI160::getAccXYZandSensorTime(SensorData &data, SensorTime &sensorTime, AccRange range)
+{
+    uint8_t localData[9];
+    int32_t rtnVal = readBlock(DATA_14, SENSORTIME_2, localData);
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+        
+        switch(range)
+        {
+            case SENS_2G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
+            break;
+            
+            case SENS_4G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
+            break;
+            
+            case SENS_8G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
+            break;
+            
+            case SENS_16G:
+                data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
+                data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
+                data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
+            break;
+        }
+        
+        sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) | 
+                           localData[6]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
+    }
+    
+    return rtnVal;
+}
+
+
+//***************************************************************************** 
+int32_t BMI160::getSensorTime(SensorTime &sensorTime)
 {
     uint8_t localData[3];
     int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
     
     if(rtnVal == RTN_NO_ERROR)
     {
-        *data = (((localData[2] << 16) | (localData[1] << 8) | localData[0]) * 39e-6);
+        sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) | 
+                           localData[0]);
+        sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
     }
     
     return rtnVal;