@@ -232,14 +232,19 @@ void CurieIMUClass::setGyroRange(int range)
232
232
233
233
if (range >= 2000 ) {
234
234
bmiRange = BMI160_GYRO_RANGE_2000;
235
+ gyro_range = 2000 .0f ;
235
236
} else if (range >= 1000 ) {
236
237
bmiRange = BMI160_GYRO_RANGE_1000;
238
+ gyro_range = 1000 .0f ;
237
239
} else if (range >= 500 ) {
238
240
bmiRange = BMI160_GYRO_RANGE_500;
241
+ gyro_range = 500 .0f ;
239
242
} else if (range >= 250 ) {
240
243
bmiRange = BMI160_GYRO_RANGE_250;
244
+ gyro_range = 250 .0f ;
241
245
} else {
242
246
bmiRange = BMI160_GYRO_RANGE_125;
247
+ gyro_range = 125 .0f ;
243
248
}
244
249
245
250
setFullScaleGyroRange (bmiRange);
@@ -277,12 +282,16 @@ void CurieIMUClass::setAccelerometerRange(int range)
277
282
278
283
if (range <= 2 ) {
279
284
bmiRange = BMI160_ACCEL_RANGE_2G;
285
+ accel_range = 2 .0f ;
280
286
} else if (range <= 4 ) {
281
287
bmiRange = BMI160_ACCEL_RANGE_4G;
288
+ accel_range = 4 .0f ;
282
289
} else if (range <= 8 ) {
283
290
bmiRange = BMI160_ACCEL_RANGE_8G;
291
+ accel_range = 8 .0f ;
284
292
} else {
285
293
bmiRange = BMI160_ACCEL_RANGE_16G;
294
+ accel_range = 16 .0f ;
286
295
}
287
296
288
297
setFullScaleAccelRange (bmiRange);
@@ -1546,6 +1555,18 @@ void CurieIMUClass::setStepDetectionMode(int mode)
1546
1555
BMI160Class::setStepDetectionMode ((BMI160StepMode)mode);
1547
1556
}
1548
1557
1558
+ float CurieIMUClass::convertRaw (int16_t raw, float range_abs)
1559
+ {
1560
+ float slope;
1561
+ float val;
1562
+
1563
+ /* Input range will be -32768 to 32767
1564
+ * Output range must be -range_abs to range_abs */
1565
+ val = (float ) raw;
1566
+ slope = (range_abs * 2 .0f ) / BMI160_SENSOR_RANGE;
1567
+ return -(range_abs) + slope * (val + BMI160_SENSOR_LOW);
1568
+ }
1569
+
1549
1570
void CurieIMUClass::readMotionSensor (int & ax, int & ay, int & az, int & gx, int & gy, int & gz)
1550
1571
{
1551
1572
short sax, say, saz, sgx, sgy, sgz;
@@ -1560,6 +1581,21 @@ void CurieIMUClass::readMotionSensor(int& ax, int& ay, int& az, int& gx, int& gy
1560
1581
gz = sgz;
1561
1582
}
1562
1583
1584
+ void CurieIMUClass::readMotionSensorScaled (float & ax, float & ay, float & az,
1585
+ float & gx, float & gy, float & gz)
1586
+ {
1587
+ int16_t sax, say, saz, sgx, sgy, sgz;
1588
+
1589
+ getMotion6 (&sax, &say, &saz, &sgx, &sgy, &sgz);
1590
+
1591
+ ax = convertRaw (sax, accel_range);
1592
+ ay = convertRaw (say, accel_range);
1593
+ az = convertRaw (saz, accel_range);
1594
+ gx = convertRaw (sgx, gyro_range);
1595
+ gy = convertRaw (sgy, gyro_range);
1596
+ gz = convertRaw (sgz, gyro_range);
1597
+ }
1598
+
1563
1599
void CurieIMUClass::readAccelerometer (int & x, int & y, int & z)
1564
1600
{
1565
1601
short sx, sy, sz;
@@ -1571,6 +1607,17 @@ void CurieIMUClass::readAccelerometer(int& x, int& y, int& z)
1571
1607
z = sz;
1572
1608
}
1573
1609
1610
+ void CurieIMUClass::readAccelerometerScaled (float & x, float & y, float & z)
1611
+ {
1612
+ int16_t sx, sy, sz;
1613
+
1614
+ getAcceleration (&sx, &sy, &sz);
1615
+
1616
+ x = convertRaw (sx, accel_range);
1617
+ y = convertRaw (sy, accel_range);
1618
+ z = convertRaw (sz, accel_range);
1619
+ }
1620
+
1574
1621
void CurieIMUClass::readGyro (int & x, int & y, int & z)
1575
1622
{
1576
1623
short sx, sy, sz;
@@ -1582,6 +1629,17 @@ void CurieIMUClass::readGyro(int& x, int& y, int& z)
1582
1629
z = sz;
1583
1630
}
1584
1631
1632
+ void CurieIMUClass::readGyroScaled (float & x, float & y, float & z)
1633
+ {
1634
+ int16_t sx, sy, sz;
1635
+
1636
+ getRotation (&sx, &sy, &sz);
1637
+
1638
+ x = convertRaw (sx, gyro_range);
1639
+ y = convertRaw (sy, gyro_range);
1640
+ z = convertRaw (sz, gyro_range);
1641
+ }
1642
+
1585
1643
int CurieIMUClass::readAccelerometer (int axis)
1586
1644
{
1587
1645
if (axis == X_AXIS) {
@@ -1595,6 +1653,23 @@ int CurieIMUClass::readAccelerometer(int axis)
1595
1653
return 0 ;
1596
1654
}
1597
1655
1656
+ float CurieIMUClass::readAccelerometerScaled (int axis)
1657
+ {
1658
+ int16_t raw;
1659
+
1660
+ if (axis == X_AXIS) {
1661
+ raw = getAccelerationX ();
1662
+ } else if (axis == Y_AXIS) {
1663
+ raw = getAccelerationY ();
1664
+ } else if (axis == Z_AXIS) {
1665
+ raw = getAccelerationZ ();
1666
+ } else {
1667
+ return 0 ;
1668
+ }
1669
+
1670
+ return convertRaw (raw, accel_range);
1671
+ }
1672
+
1598
1673
int CurieIMUClass::readGyro (int axis)
1599
1674
{
1600
1675
if (axis == X_AXIS) {
@@ -1608,6 +1683,23 @@ int CurieIMUClass::readGyro(int axis)
1608
1683
return 0 ;
1609
1684
}
1610
1685
1686
+ float CurieIMUClass::readGyroScaled (int axis)
1687
+ {
1688
+ int16_t raw;
1689
+
1690
+ if (axis == X_AXIS) {
1691
+ raw = getRotationX ();
1692
+ } else if (axis == Y_AXIS) {
1693
+ raw = getRotationY ();
1694
+ } else if (axis == Z_AXIS) {
1695
+ raw = getRotationZ ();
1696
+ } else {
1697
+ return 0 ;
1698
+ }
1699
+
1700
+ return convertRaw (raw, gyro_range);
1701
+ }
1702
+
1611
1703
int CurieIMUClass::readTemperature ()
1612
1704
{
1613
1705
return getTemperature ();
0 commit comments