@@ -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);
@@ -1556,6 +1565,18 @@ void CurieIMUClass::setStepDetectionMode(int mode)
1556
1565
BMI160Class::setStepDetectionMode ((BMI160StepMode)mode);
1557
1566
}
1558
1567
1568
+ float CurieIMUClass::convertRaw (int16_t raw, float range_abs)
1569
+ {
1570
+ float slope;
1571
+ float val;
1572
+
1573
+ /* Input range will be -32768 to 32767
1574
+ * Output range must be -range_abs to range_abs */
1575
+ val = (float ) raw;
1576
+ slope = (range_abs * 2 .0f ) / BMI160_SENSOR_RANGE;
1577
+ return -(range_abs) + slope * (val + BMI160_SENSOR_LOW);
1578
+ }
1579
+
1559
1580
void CurieIMUClass::readMotionSensor (int & ax, int & ay, int & az, int & gx, int & gy, int & gz)
1560
1581
{
1561
1582
short sax, say, saz, sgx, sgy, sgz;
@@ -1570,6 +1591,21 @@ void CurieIMUClass::readMotionSensor(int& ax, int& ay, int& az, int& gx, int& gy
1570
1591
gz = sgz;
1571
1592
}
1572
1593
1594
+ void CurieIMUClass::readMotionSensorScaled (float & ax, float & ay, float & az,
1595
+ float & gx, float & gy, float & gz)
1596
+ {
1597
+ int16_t sax, say, saz, sgx, sgy, sgz;
1598
+
1599
+ getMotion6 (&sax, &say, &saz, &sgx, &sgy, &sgz);
1600
+
1601
+ ax = convertRaw (sax, accel_range);
1602
+ ay = convertRaw (say, accel_range);
1603
+ az = convertRaw (saz, accel_range);
1604
+ gx = convertRaw (sgx, gyro_range);
1605
+ gy = convertRaw (sgy, gyro_range);
1606
+ gz = convertRaw (sgz, gyro_range);
1607
+ }
1608
+
1573
1609
void CurieIMUClass::readAccelerometer (int & x, int & y, int & z)
1574
1610
{
1575
1611
short sx, sy, sz;
@@ -1581,6 +1617,17 @@ void CurieIMUClass::readAccelerometer(int& x, int& y, int& z)
1581
1617
z = sz;
1582
1618
}
1583
1619
1620
+ void CurieIMUClass::readAccelerometerScaled (float & x, float & y, float & z)
1621
+ {
1622
+ int16_t sx, sy, sz;
1623
+
1624
+ getAcceleration (&sx, &sy, &sz);
1625
+
1626
+ x = convertRaw (sx, accel_range);
1627
+ y = convertRaw (sy, accel_range);
1628
+ z = convertRaw (sz, accel_range);
1629
+ }
1630
+
1584
1631
void CurieIMUClass::readGyro (int & x, int & y, int & z)
1585
1632
{
1586
1633
short sx, sy, sz;
@@ -1592,6 +1639,17 @@ void CurieIMUClass::readGyro(int& x, int& y, int& z)
1592
1639
z = sz;
1593
1640
}
1594
1641
1642
+ void CurieIMUClass::readGyroScaled (float & x, float & y, float & z)
1643
+ {
1644
+ int16_t sx, sy, sz;
1645
+
1646
+ getRotation (&sx, &sy, &sz);
1647
+
1648
+ x = convertRaw (sx, gyro_range);
1649
+ y = convertRaw (sy, gyro_range);
1650
+ z = convertRaw (sz, gyro_range);
1651
+ }
1652
+
1595
1653
int CurieIMUClass::readAccelerometer (int axis)
1596
1654
{
1597
1655
if (axis == X_AXIS) {
@@ -1605,6 +1663,23 @@ int CurieIMUClass::readAccelerometer(int axis)
1605
1663
return 0 ;
1606
1664
}
1607
1665
1666
+ float CurieIMUClass::readAccelerometerScaled (int axis)
1667
+ {
1668
+ int16_t raw;
1669
+
1670
+ if (axis == X_AXIS) {
1671
+ raw = getAccelerationX ();
1672
+ } else if (axis == Y_AXIS) {
1673
+ raw = getAccelerationY ();
1674
+ } else if (axis == Z_AXIS) {
1675
+ raw = getAccelerationZ ();
1676
+ } else {
1677
+ return 0 ;
1678
+ }
1679
+
1680
+ return convertRaw (raw, accel_range);
1681
+ }
1682
+
1608
1683
int CurieIMUClass::readGyro (int axis)
1609
1684
{
1610
1685
if (axis == X_AXIS) {
@@ -1618,6 +1693,23 @@ int CurieIMUClass::readGyro(int axis)
1618
1693
return 0 ;
1619
1694
}
1620
1695
1696
+ float CurieIMUClass::readGyroScaled (int axis)
1697
+ {
1698
+ int16_t raw;
1699
+
1700
+ if (axis == X_AXIS) {
1701
+ raw = getRotationX ();
1702
+ } else if (axis == Y_AXIS) {
1703
+ raw = getRotationY ();
1704
+ } else if (axis == Z_AXIS) {
1705
+ raw = getRotationZ ();
1706
+ } else {
1707
+ return 0 ;
1708
+ }
1709
+
1710
+ return convertRaw (raw, gyro_range);
1711
+ }
1712
+
1621
1713
int CurieIMUClass::readTemperature ()
1622
1714
{
1623
1715
return getTemperature ();
0 commit comments