@@ -49,14 +49,29 @@ bool QwDevKX13X::initialize(uint8_t settings)
4949 if (!enableAccel (true ))
5050 return false ;
5151
52+ sfe_kx13x_cntl1_bitfield_t cntl1;
53+ cntl1.all = 0 ; // Reset Value
54+
5255 if (settings == DEFAULT_SETTINGS)
56+ {
5357 retVal = writeRegisterByte (SFE_KX13X_CNTL1, DEFAULT_SETTINGS);
58+ if (retVal == 0 ) // Check the write was successful
59+ {
60+ cntl1.all = DEFAULT_SETTINGS;
61+ _range = cntl1.bits .gsel ; // Record the G-range
62+ }
63+ }
5464
5565 if (settings == INT_SETTINGS)
5666 {
5767 enablePhysInterrupt ();
5868 routeHardwareInterrupt (0x10 );
5969 retVal = writeRegisterByte (SFE_KX13X_CNTL1, INT_SETTINGS);
70+ if (retVal == 0 ) // Check the write was successful
71+ {
72+ cntl1.all = INT_SETTINGS;
73+ _range = cntl1.bits .gsel ; // Record the G-range
74+ }
6075 }
6176
6277 if (settings == BUFFER_SETTINGS)
@@ -66,6 +81,11 @@ bool QwDevKX13X::initialize(uint8_t settings)
6681 enableSampleBuffer (); // Enable buffer
6782 setBufferOperationMode (0x00 ); // FIFO
6883 retVal = writeRegisterByte (SFE_KX13X_CNTL1, INT_SETTINGS);
84+ if (retVal == 0 ) // Check the write was successful
85+ {
86+ cntl1.all = INT_SETTINGS;
87+ _range = cntl1.bits .gsel ; // Record the G-range
88+ }
6989 }
7090
7191 if (retVal != 0 )
@@ -79,9 +99,10 @@ bool QwDevKX13X::initialize(uint8_t settings)
7999//
80100// Resets the accelerometer
81101//
102+ // To change the value of the SRST bit, the PC1 bit in CNTL1 register must first be set to 0.
103+ //
82104bool QwDevKX13X::softwareReset ()
83105{
84-
85106 sfe_kx13x_cntl2_bitfield_t cntl2;
86107 cntl2.all = 0 ;
87108 cntl2.bits .srst = 1 ; // This is a long winded, but definitive way of setting the software reset bit
@@ -125,6 +146,7 @@ bool QwDevKX13X::enableAccel(bool enable)
125146 sfe_kx13x_cntl1_bitfield_t cntl1;
126147 cntl1.all = tempVal;
127148 cntl1.bits .pc1 = enable; // This is a long winded but definitive way of setting/clearing the operating mode bit
149+ _range = cntl1.bits .gsel ; // Update the G-range
128150 tempVal = cntl1.all ;
129151
130152 retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -154,6 +176,7 @@ int8_t QwDevKX13X::getOperatingMode()
154176
155177 sfe_kx13x_cntl1_bitfield_t cntl1;
156178 cntl1.all = tempVal; // This is a long winded but definitive way of getting the operating mode bit
179+ _range = cntl1.bits .gsel ; // Update the G-range
157180
158181 return (cntl1.bits .pc1 ); // Return the operating mode bit
159182}
@@ -192,6 +215,8 @@ bool QwDevKX13X::setRange(uint8_t range)
192215 if (retVal != 0 )
193216 return false ;
194217
218+ _range = range; // Update our local copy
219+
195220 return true ;
196221}
197222
@@ -216,6 +241,7 @@ bool QwDevKX13X::enableDataEngine(bool enable)
216241 sfe_kx13x_cntl1_bitfield_t cntl1;
217242 cntl1.all = tempVal;
218243 cntl1.bits .drdye = enable; // This is a long winded but definitive way of setting/clearing the data ready engine bit
244+ _range = cntl1.bits .gsel ; // Update the G-range
219245 tempVal = cntl1.all ;
220246
221247 retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -247,6 +273,7 @@ bool QwDevKX13X::enableTapEngine(bool enable)
247273 sfe_kx13x_cntl1_bitfield_t cntl1;
248274 cntl1.all = tempVal;
249275 cntl1.bits .tdte = enable; // This is a long winded but definitive way of setting/clearing the tap engine bit
276+ _range = cntl1.bits .gsel ; // Update the G-range
250277 tempVal = cntl1.all ;
251278
252279 retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -278,6 +305,7 @@ bool QwDevKX13X::enableTiltEngine(bool enable)
278305 sfe_kx13x_cntl1_bitfield_t cntl1;
279306 cntl1.all = tempVal;
280307 cntl1.bits .tpe = enable; // This is a long winded but definitive way of setting/clearing the tilt engine bit
308+ _range = cntl1.bits .gsel ; // Update the G-range
281309 tempVal = cntl1.all ;
282310
283311 retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -1621,21 +1649,23 @@ bool QwDevKX132::getAccelData(outputData *userData)
16211649//
16221650bool QwDevKX132::convAccelData (outputData *userAccel, rawOutputData *rawAccelData)
16231651{
1624- uint8_t regVal;
1625- uint8_t range;
1626- int retVal;
1652+ if (_range < 0 ) // If the G-range is unknown, read it
1653+ {
1654+ uint8_t regVal;
1655+ int retVal;
16271656
1628- retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
1657+ retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
16291658
1630- if (retVal != 0 )
1631- return false ;
1659+ if (retVal != 0 )
1660+ return false ;
16321661
1633- sfe_kx13x_cntl1_bitfield_t cntl1;
1634- cntl1.all = regVal;
1662+ sfe_kx13x_cntl1_bitfield_t cntl1;
1663+ cntl1.all = regVal;
16351664
1636- range = cntl1.bits .gsel ;
1665+ _range = cntl1.bits .gsel ; // Record the range
1666+ }
16371667
1638- switch (range )
1668+ switch (_range )
16391669 {
16401670 case SFE_KX132_RANGE2G:
16411671 userAccel->xData = (float )rawAccelData->xData * convRange2G;
@@ -1720,21 +1750,23 @@ bool QwDevKX134::getAccelData(outputData *userData)
17201750//
17211751bool QwDevKX134::convAccelData (outputData *userAccel, rawOutputData *rawAccelData)
17221752{
1723- uint8_t regVal;
1724- uint8_t range;
1725- int retVal;
1753+ if (_range < 0 ) // If the G-range is unknown, read it
1754+ {
1755+ uint8_t regVal;
1756+ int retVal;
17261757
1727- retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
1758+ retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
17281759
1729- if (retVal != 0 )
1730- return false ;
1760+ if (retVal != 0 )
1761+ return false ;
17311762
1732- sfe_kx13x_cntl1_bitfield_t cntl1;
1733- cntl1.all = regVal;
1763+ sfe_kx13x_cntl1_bitfield_t cntl1;
1764+ cntl1.all = regVal;
17341765
1735- range = cntl1.bits .gsel ;
1766+ _range = cntl1.bits .gsel ; // Record the range
1767+ }
17361768
1737- switch (range )
1769+ switch (_range )
17381770 {
17391771 case SFE_KX134_RANGE8G:
17401772 userAccel->xData = (float )rawAccelData->xData * convRange8G;
0 commit comments