Modified getOffset for calibrating Thermal Drift coefficients.
Fork of ITG3200 by
Modified to make getOffset() function easier to use.
Revision 5:0a0315f0f34e, committed 2012-09-12
- Comitter:
- gltest26
- Date:
- Wed Sep 12 22:56:04 2012 +0000
- Parent:
- 4:155c44407af5
- Child:
- 6:a7ad6046824c
- Commit message:
- Made byte ordering and sign extending portable.
Changed in this revision
ITG3200.cpp | Show annotated file Show diff for this revision Revisions of this file |
ITG3200.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/ITG3200.cpp Wed Sep 12 15:23:29 2012 +0000 +++ b/ITG3200.cpp Wed Sep 12 22:56:04 2012 +0000 @@ -205,14 +205,7 @@ i2c_.read(I2C_ADDRESS, rx, 2); - // Readings are expressed in 16bit 2's complement, so we must first - // concatenate two bytes to make a word and sign extend it to obtain - // correct negative values. - // ARMCC compiles char as unsigned, which means no sign extension is - // performed during bitwise operations to chars. But we should make sure - // that lower byte won't extend its sign past upper byte for other - // compilers if we want to keep it portable. - return int16_t(((unsigned)rx[0] << 8) | (unsigned)rx[1]); + return swapExtend(rx); } float ITG3200::getTemperature(){ @@ -231,7 +224,7 @@ i2c_.read(I2C_ADDRESS, rx, 6); for(int i = 0; i < 3; i++) - readings[i] = int16_t((unsigned) rx[i * 2 + 0] << 8) | ((unsigned) rx[i * 2 + 1]); + readings[i] = swapExtend(&rx[i * 2]); } char ITG3200::getPowerManagement(void){
--- a/ITG3200.h Wed Sep 12 15:23:29 2012 +0000 +++ b/ITG3200.h Wed Sep 12 22:56:04 2012 +0000 @@ -425,6 +425,22 @@ I2C i2c_; + /** + * Converts big-endian 2's complement byte pair to native byte order of + * the CPU and then sign extend it to the CPU's register size. + * + * Implemented here to make the compiler inline expand it. + */ + int swapExtend(const char rx[2]){ + // Readings are expressed in 16bit 2's complement, so we must first + // concatenate two bytes to make a word and sign extend it to obtain + // correct negative values. + // ARMCC compiles char as unsigned, which means no sign extension is + // performed during bitwise operations to chars. But we should make sure + // that lower byte won't extend its sign past upper byte for other + // compilers if we want to keep it portable. + return int16_t(((unsigned char)rx[0] << 8) | (unsigned char)rx[1]); + } };