compiled unsuccessful but not sure if it works

Fork of LSM6DS3 by adam&chuang

Revision:
0:301b2cb34ead
Child:
1:cc2caaf5536c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LSM6DS3.cpp	Fri Feb 19 09:50:40 2016 +0000
@@ -0,0 +1,857 @@
+/******************************************************************************
+SparkFunLSM6DS3.cpp
+LSM6DS3 Arduino and Teensy Driver
+
+Marshall Taylor @ SparkFun Electronics
+May 20, 2015
+https://github.com/sparkfun/LSM6DS3_Breakout
+https://github.com/sparkfun/SparkFun_LSM6DS3_Arduino_Library
+
+Resources:
+Uses Wire.h for i2c operation
+Uses SPI.h for SPI operation
+Either can be omitted if not used
+
+Development environment specifics:
+Arduino IDE 1.6.4
+Teensy loader 1.23
+
+This code is released under the [MIT License](http://opensource.org/licenses/MIT).
+
+Please review the LICENSE.md file included with this example. If you have any questions
+or concerns with licensing, please contact techsupport@sparkfun.com.
+
+Distributed as-is; no warranty is given.
+******************************************************************************/
+
+//See SparkFunLSM6DS3.h for additional topology notes.
+#include "mbed.h"
+#include "LSM6DS3.h"
+#include "LSM6DS3_Types.h"
+#include "LSM6DS3_Registers.h"
+#include "stdint.h"
+#include "math.h"
+
+I2C i2c(D14,D15);
+SPI spi(D11,D12,D13);
+//****************************************************************************//
+//
+//  LSM6DS3Core functions.
+//
+//  Construction arguments:
+//  ( uint8_t busType, uint8_t inputArg ),
+//
+//    where inputArg is address for I2C_MODE and chip select pin
+//    number for SPI_MODE
+//
+//  For SPI, construct LSM6DS3Core myIMU(SPI_MODE, 10);
+//  For I2C, construct LSM6DS3Core myIMU(I2C_MODE, 0x6B);
+//
+//  Default construction is I2C mode, address 0x6B.
+//
+
+//=================================
+
+//=================================
+//****************************************************************************//
+LSM6DS3Core::LSM6DS3Core( uint8_t busType, uint8_t inputArg) : commInterface(SPI_MODE), I2CAddress(0x6B), chipSelectPin(D10)
+{
+    commInterface = busType;
+    if( commInterface == I2C_MODE ) {
+        I2CAddress = inputArg;
+    }
+    if( commInterface == SPI_MODE ) {
+        chipSelectPin = inputArg;
+    }
+    
+
+}
+
+status_t LSM6DS3Core::beginCore(void)
+{
+    status_t returnError = IMU_SUCCESS;
+
+    switch (commInterface) {
+
+        case I2C_MODE:
+
+            break;
+
+        case SPI_MODE:
+            // start the SPI library:
+
+            DigitalOut cs(chipSelectPin);
+            // Maximum SPI frequency is 10MHz, could divide by 2 here:
+            spi.frequency(5000000);
+            // Data is read and written MSb first.
+            spi.format(8,0);
+            // Data is captured on rising edge of clock (CPHA = 0)
+            // Base value of the clock is HIGH (CPOL = 1)
+
+            /*      // MODE3 for 328p operation
+            #ifdef __AVR__
+                    SPI.setDataMode(SPI_MODE3);
+            #else
+            #endif
+
+                    // MODE0 for Teensy 3.1 operation
+            #ifdef __MK20DX256__
+                    SPI.setDataMode(SPI_MODE0);
+            #else
+            #endif
+            */
+            //SPI.format(8,0);//8 bits mode0
+            // initalize the  data ready and chip select pins:
+
+            cs = 1;
+            break;
+        default:
+            break;
+    }
+
+    //Spin for a few ms
+    volatile uint8_t temp = 0;
+    for( uint16_t i = 0; i < 10000; i++ ) {
+        temp++;
+    }
+
+    //Check the ID register to determine if the operation was a success.
+    uint8_t readCheck;
+    readRegister(&readCheck, LSM6DS3_ACC_GYRO_WHO_AM_I_REG);
+    if( readCheck != 0x69 ) {
+        returnError = IMU_HW_ERROR;
+    }
+
+    return returnError;
+
+}
+
+//****************************************************************************//
+//
+//  ReadRegisterRegion
+//
+//  Parameters:
+//    *outputPointer -- Pass &variable (base address of) to save read data to
+//    offset -- register to read
+//    length -- number of bytes to read
+//
+//  Note:  Does not know if the target memory space is an array or not, or
+//    if there is the array is big enough.  if the variable passed is only
+//    two bytes long and 3 bytes are requested, this will over-write some
+//    other memory!
+//
+//****************************************************************************//
+status_t LSM6DS3Core::readRegisterRegion(uint8_t *outputPointer , uint8_t offset, uint8_t length)
+{
+    status_t returnError = IMU_SUCCESS;
+
+    //define pointer that will point to the external space
+    uint8_t i = 0;
+    uint8_t c = 0;
+    uint8_t tempFFCounter = 0;
+
+    switch (commInterface) {
+
+        case I2C_MODE:
+
+            i2c.write(offset);
+            if( i2c.stop() != 0 ) {
+                returnError = IMU_HW_ERROR;
+            } else { //OK, all worked, keep going
+                // request 6 bytes from slave device
+                Wire.requestFrom(I2CAddress, length);
+                while ( (Wire.available()) && (i < length)) { // slave may send less than requested
+                    c = Wire.read(); // receive a byte as character
+                    *outputPointer = c;
+                    outputPointer++;
+                    i++;
+                }
+            }
+            break;
+
+        case SPI_MODE:
+            // take the chip select low to select the device:
+            digitalWrite(chipSelectPin, LOW);
+            // send the device the register you want to read:
+            SPI.transfer(offset | 0x80);  //Ored with "read request" bit
+            while ( i < length ) { // slave may send less than requested
+                c = SPI.transfer(0x00); // receive a byte as character
+                if( c == 0xFF ) {
+                    //May have problem
+                    tempFFCounter++;
+                }
+                *outputPointer = c;
+                outputPointer++;
+                i++;
+            }
+            if( tempFFCounter == i ) {
+                //Ok, we've recieved all ones, report
+                returnError = IMU_ALL_ONES_WARNING;
+            }
+            // take the chip select high to de-select:
+            digitalWrite(chipSelectPin, HIGH);
+            break;
+
+        default:
+            break;
+    }
+
+    return returnError;
+}
+
+//****************************************************************************//
+//
+//  ReadRegister
+//
+//  Parameters:
+//    *outputPointer -- Pass &variable (address of) to save read data to
+//    offset -- register to read
+//
+//****************************************************************************//
+status_t LSM6DS3Core::readRegister(uint8_t* outputPointer, uint8_t offset)
+{
+    //Return value
+    uint8_t result;
+    uint8_t numBytes = 1;
+    status_t returnError = IMU_SUCCESS;
+
+    switch (commInterface) {
+
+        case I2C_MODE:
+            Wire.beginTransmission(I2CAddress);
+            Wire.write(offset);
+            if( Wire.endTransmission() != 0 ) {
+                returnError = IMU_HW_ERROR;
+            }
+            Wire.requestFrom(I2CAddress, numBytes);
+            while ( Wire.available() ) { // slave may send less than requested
+                result = Wire.read(); // receive a byte as a proper uint8_t
+            }
+            break;
+
+        case SPI_MODE:
+            // take the chip select low to select the device:
+            digitalWrite(chipSelectPin, LOW);
+            // send the device the register you want to read:
+            SPI.transfer(offset | 0x80);  //Ored with "read request" bit
+            // send a value of 0 to read the first byte returned:
+            result = SPI.transfer(0x00);
+            // take the chip select high to de-select:
+            digitalWrite(chipSelectPin, HIGH);
+
+            if( result == 0xFF ) {
+                //we've recieved all ones, report
+                returnError = IMU_ALL_ONES_WARNING;
+            }
+            break;
+
+        default:
+            break;
+    }
+
+    *outputPointer = result;
+    return returnError;
+}
+
+//****************************************************************************//
+//
+//  readRegisterInt16
+//
+//  Parameters:
+//    *outputPointer -- Pass &variable (base address of) to save read data to
+//    offset -- register to read
+//
+//****************************************************************************//
+status_t LSM6DS3Core::readRegisterInt16( int16_t* outputPointer, uint8_t offset )
+{
+    uint8_t myBuffer[2];
+    status_t returnError = readRegisterRegion(myBuffer, offset, 2);  //Does memory transfer
+    int16_t output = (int16_t)myBuffer[0] | int16_t(myBuffer[1] << 8);
+
+    *outputPointer = output;
+    return returnError;
+}
+
+//****************************************************************************//
+//
+//  writeRegister
+//
+//  Parameters:
+//    offset -- register to write
+//    dataToWrite -- 8 bit data to write to register
+//
+//****************************************************************************//
+status_t LSM6DS3Core::writeRegister(uint8_t offset, uint8_t dataToWrite)
+{
+    status_t returnError = IMU_SUCCESS;
+    switch (commInterface) {
+        case I2C_MODE:
+            //Write the byte
+            Wire.beginTransmission(I2CAddress);
+            Wire.write(offset);
+            Wire.write(dataToWrite);
+            if( Wire.endTransmission() != 0 ) {
+                returnError = IMU_HW_ERROR;
+            }
+            break;
+
+        case SPI_MODE:
+            // take the chip select low to select the device:
+            digitalWrite(chipSelectPin, LOW);
+            // send the device the register you want to read:
+            SPI.transfer(offset);
+            // send a value of 0 to read the first byte returned:
+            SPI.transfer(dataToWrite);
+            // decrement the number of bytes left to read:
+            // take the chip select high to de-select:
+            digitalWrite(chipSelectPin, HIGH);
+            break;
+
+            //No way to check error on this write (Except to read back but that's not reliable)
+
+        default:
+            break;
+    }
+
+    return returnError;
+}
+
+status_t LSM6DS3Core::embeddedPage( void )
+{
+    status_t returnError = writeRegister( LSM6DS3_ACC_GYRO_RAM_ACCESS, 0x80 );
+
+    return returnError;
+}
+
+status_t LSM6DS3Core::basePage( void )
+{
+    status_t returnError = writeRegister( LSM6DS3_ACC_GYRO_RAM_ACCESS, 0x00 );
+
+    return returnError;
+}
+
+
+//****************************************************************************//
+//
+//  Main user class -- wrapper for the core class + maths
+//
+//  Construct with same rules as the core ( uint8_t busType, uint8_t inputArg )
+//
+//****************************************************************************//
+LSM6DS3::LSM6DS3( uint8_t busType, uint8_t inputArg ) : LSM6DS3Core( busType, inputArg )
+{
+    //Construct with these default settings
+
+    settings.gyroEnabled = 1;  //Can be 0 or 1
+    settings.gyroRange = 2000;   //Max deg/s.  Can be: 125, 245, 500, 1000, 2000
+    settings.gyroSampleRate = 833;   //Hz.  Can be: 13, 26, 52, 104, 208, 416, 833, 1666
+    settings.gyroBandWidth = 400;  //Hz.  Can be: 50, 100, 200, 400;
+    settings.gyroFifoEnabled = 0;  //Set to include gyro in FIFO
+    settings.gyroFifoDecimation = 1;  //set 1 for on /1
+
+    settings.accelEnabled = 1;
+    settings.accelODROff = 1;
+    settings.accelRange = 8;      //Max G force readable.  Can be: 2, 4, 8, 16
+    settings.accelSampleRate = 833;  //Hz.  Can be: 13, 26, 52, 104, 208, 416, 833, 1666, 3332, 6664, 13330
+    settings.accelBandWidth = 400;  //Hz.  Can be: 50, 100, 200, 400;
+    settings.accelFifoEnabled = 0;  //Set to include accelerometer in the FIFO
+    settings.accelFifoDecimation = 1;  //set 1 for on /1
+
+    settings.tempEnabled = 1;
+
+    //Select interface mode
+    settings.commMode = 1;  //Can be modes 1, 2 or 3
+
+    //FIFO control data
+    settings.fifoThreshold = 3000;  //Can be 0 to 4096 (16 bit bytes)
+    settings.fifoSampleRate = 10;  //default 10Hz
+    settings.fifoModeWord = 0;  //Default off
+
+    allOnesCounter = 0;
+    nonSuccessCounter = 0;
+
+}
+
+//****************************************************************************//
+//
+//  Configuration section
+//
+//  This uses the stored SensorSettings to start the IMU
+//  Use statements such as "myIMU.settings.commInterface = SPI_MODE;" or
+//  "myIMU.settings.accelEnabled = 1;" to configure before calling .begin();
+//
+//****************************************************************************//
+status_t LSM6DS3::begin()
+{
+    //Check the settings structure values to determine how to setup the device
+    uint8_t dataToWrite = 0;  //Temporary variable
+
+    //Begin the inherited core.  This gets the physical wires connected
+    status_t returnError = beginCore();
+
+    //setOffset(-61, -25, -66, 35, -81, -32);
+
+    //Setup the accelerometer******************************
+    dataToWrite = 0; //Start Fresh!
+    if ( settings.accelEnabled == 1) {
+        //Build config reg
+        //First patch in filter bandwidth
+        switch (settings.accelBandWidth) {
+            case 50:
+                dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_50Hz;
+                break;
+            case 100:
+                dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_100Hz;
+                break;
+            case 200:
+                dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_200Hz;
+                break;
+            default:  //set default case to max passthrough
+            case 400:
+                dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_400Hz;
+                break;
+        }
+        //Next, patch in full scale
+        switch (settings.accelRange) {
+            case 2:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_2g;
+                break;
+            case 4:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_4g;
+                break;
+            case 8:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_8g;
+                break;
+            default:  //set default case to 16(max)
+            case 16:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_16g;
+                break;
+        }
+        //Lastly, patch in accelerometer ODR
+        switch (settings.accelSampleRate) {
+            case 13:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_13Hz;
+                break;
+            case 26:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_26Hz;
+                break;
+            case 52:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_52Hz;
+                break;
+            default:  //Set default to 104
+            case 104:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_104Hz;
+                break;
+            case 208:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_208Hz;
+                break;
+            case 416:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_416Hz;
+                break;
+            case 833:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_833Hz;
+                break;
+            case 1660:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_1660Hz;
+                break;
+            case 3330:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_3330Hz;
+                break;
+            case 6660:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_6660Hz;
+                break;
+            case 13330:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_13330Hz;
+                break;
+        }
+    } else {
+        //dataToWrite already = 0 (powerdown);
+    }
+
+    //Now, write the patched together data
+    writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, dataToWrite);
+
+    //Set the ODR bit
+    readRegister(&dataToWrite, LSM6DS3_ACC_GYRO_CTRL4_C);
+    dataToWrite &= ~((uint8_t)LSM6DS3_ACC_GYRO_BW_SCAL_ODR_ENABLED);
+    if ( settings.accelODROff == 1) {
+        dataToWrite |= LSM6DS3_ACC_GYRO_BW_SCAL_ODR_ENABLED;
+    }
+    writeRegister(LSM6DS3_ACC_GYRO_CTRL4_C, dataToWrite);
+
+    //Setup the gyroscope**********************************************
+    dataToWrite = 0; //Start Fresh!
+    if ( settings.gyroEnabled == 1) {
+        //Build config reg
+        //First, patch in full scale
+        switch (settings.gyroRange) {
+            case 125:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_125_ENABLED;
+                break;
+            case 245:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_G_245dps;
+                break;
+            case 500:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_G_500dps;
+                break;
+            case 1000:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_G_1000dps;
+                break;
+            default:  //Default to full 2000DPS range
+            case 2000:
+                dataToWrite |= LSM6DS3_ACC_GYRO_FS_G_2000dps;
+                break;
+        }
+        //Lastly, patch in gyro ODR
+        switch (settings.gyroSampleRate) {
+            case 13:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_13Hz;
+                break;
+            case 26:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_26Hz;
+                break;
+            case 52:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_52Hz;
+                break;
+            default:  //Set default to 104
+            case 104:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_104Hz;
+                break;
+            case 208:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_208Hz;
+                break;
+            case 416:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_416Hz;
+                break;
+            case 833:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_833Hz;
+                break;
+            case 1660:
+                dataToWrite |= LSM6DS3_ACC_GYRO_ODR_G_1660Hz;
+                break;
+        }
+    } else {
+        //dataToWrite already = 0 (powerdown);
+    }
+    //Write the byte
+    writeRegister(LSM6DS3_ACC_GYRO_CTRL2_G, dataToWrite);
+
+    //Setup the internal temperature sensor
+    if ( settings.tempEnabled == 1) {
+    }
+
+    //Return WHO AM I reg  //Not no mo!
+    uint8_t result;
+    readRegister(&result, LSM6DS3_ACC_GYRO_WHO_AM_I_REG);
+
+    return returnError;
+}
+
+//****************************************************************************//
+//
+//  Accelerometer section
+//
+//****************************************************************************//
+
+void LSM6DS3::setOffset(int16_t ax, int16_t ay, int16_t az, int16_t gx, int16_t gy, int16_t gz)
+{
+    accelOffset[0] = ax;
+    accelOffset[1] = ay;
+    accelOffset[2] = az;
+    gyroOffset[0] = gx;
+    gyroOffset[1] = gy;
+    gyroOffset[2] = gz;
+}
+
+int16_t LSM6DS3::readRawAccelX( void )
+{
+    int16_t output;
+    status_t errorLevel = readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUTX_L_XL );
+    if( errorLevel != IMU_SUCCESS ) {
+        if( errorLevel == IMU_ALL_ONES_WARNING ) {
+            allOnesCounter++;
+        } else {
+            nonSuccessCounter++;
+        }
+    }
+    return output;
+}
+float LSM6DS3::readFloatAccelX( void )
+{
+    float output = calcAccel((int32_t)readRawAccelX()  - (int32_t)accelOffset[0]);
+    return output;
+}
+
+int16_t LSM6DS3::readRawAccelY( void )
+{
+    int16_t output;
+    status_t errorLevel = readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUTY_L_XL );
+    if( errorLevel != IMU_SUCCESS ) {
+        if( errorLevel == IMU_ALL_ONES_WARNING ) {
+            allOnesCounter++;
+        } else {
+            nonSuccessCounter++;
+        }
+    }
+    return output;
+}
+float LSM6DS3::readFloatAccelY( void )
+{
+    float output = calcAccel((int32_t)readRawAccelY() - (int32_t)accelOffset[1]);
+    return output;
+}
+
+int16_t LSM6DS3::readRawAccelZ( void )
+{
+    int16_t output;
+    status_t errorLevel = readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUTZ_L_XL );
+    if( errorLevel != IMU_SUCCESS ) {
+        if( errorLevel == IMU_ALL_ONES_WARNING ) {
+            allOnesCounter++;
+        } else {
+            nonSuccessCounter++;
+        }
+    }
+    return output;
+}
+float LSM6DS3::readFloatAccelZ( void )
+{
+    float output = calcAccel((int32_t)readRawAccelZ() - (int32_t)accelOffset[2]);
+    return output;
+}
+
+float LSM6DS3::calcAccel( int32_t input )
+{
+    float output = (float)input * 0.061 * (settings.accelRange >> 1) / 1000;
+    return output;
+}
+
+//****************************************************************************//
+//
+//  Gyroscope section
+//
+//****************************************************************************//
+int16_t LSM6DS3::readRawGyroX( void )
+{
+    int16_t output;
+    status_t errorLevel = readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUTX_L_G );
+    if( errorLevel != IMU_SUCCESS ) {
+        if( errorLevel == IMU_ALL_ONES_WARNING ) {
+            allOnesCounter++;
+        } else {
+            nonSuccessCounter++;
+        }
+    }
+    return output;
+}
+float LSM6DS3::readFloatGyroX( void )
+{
+    float output = calcGyro((int32_t)readRawGyroX() - (int32_t)gyroOffset[0]);
+    return output;
+}
+
+int16_t LSM6DS3::readRawGyroY( void )
+{
+    int16_t output;
+    status_t errorLevel = readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUTY_L_G );
+    if( errorLevel != IMU_SUCCESS ) {
+        if( errorLevel == IMU_ALL_ONES_WARNING ) {
+            allOnesCounter++;
+        } else {
+            nonSuccessCounter++;
+        }
+    }
+    return output;
+}
+float LSM6DS3::readFloatGyroY( void )
+{
+    float output = calcGyro((int32_t)readRawGyroY() - (int32_t)gyroOffset[1]);
+    return output;
+}
+
+int16_t LSM6DS3::readRawGyroZ( void )
+{
+    int16_t output;
+    status_t errorLevel = readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUTZ_L_G );
+    if( errorLevel != IMU_SUCCESS ) {
+        if( errorLevel == IMU_ALL_ONES_WARNING ) {
+            allOnesCounter++;
+        } else {
+            nonSuccessCounter++;
+        }
+    }
+    return output;
+}
+float LSM6DS3::readFloatGyroZ( void )
+{
+    float output = calcGyro((int32_t)readRawGyroZ() - (int32_t)gyroOffset[2]);
+    return output;
+}
+
+float LSM6DS3::calcGyro( int32_t input )
+{
+    uint8_t gyroRangeDivisor = settings.gyroRange / 125;
+    if ( settings.gyroRange == 245 ) {
+        gyroRangeDivisor = 2;
+    }
+
+    float output = (float)input * 4.375 * (gyroRangeDivisor) / 1000;
+    return output;
+}
+
+//****************************************************************************//
+//
+//  Temperature section
+//
+//****************************************************************************//
+int16_t LSM6DS3::readRawTemp( void )
+{
+    int16_t output;
+    readRegisterInt16( &output, LSM6DS3_ACC_GYRO_OUT_TEMP_L );
+    return output;
+}
+
+float LSM6DS3::readTempC( void )
+{
+    float output = (float)readRawTemp() / 16; //divide by 16 to scale
+    output += 25; //Add 25 degrees to remove offset
+
+    return output;
+
+}
+
+float LSM6DS3::readTempF( void )
+{
+    float output = (float)readRawTemp() / 16; //divide by 16 to scale
+    output += 25; //Add 25 degrees to remove offset
+    output = (output * 9) / 5 + 32;
+
+    return output;
+
+}
+
+//****************************************************************************//
+//
+//  FIFO section
+//
+//****************************************************************************//
+void LSM6DS3::fifoBegin( void )
+{
+    //CONFIGURE THE VARIOUS FIFO SETTINGS
+    //
+    //
+    //This section first builds a bunch of config words, then goes through
+    //and writes them all.
+
+    //Split and mask the threshold
+    uint8_t thresholdLByte = settings.fifoThreshold & 0x00FF;
+    uint8_t thresholdHByte = (settings.fifoThreshold & 0x0F00) >> 8;
+    //Pedo bits not configured (ctl2)
+
+    //CONFIGURE FIFO_CTRL3
+    uint8_t tempFIFO_CTRL3 = 0;
+    if (settings.gyroFifoEnabled == 1) {
+        //Set up gyro stuff
+        //Build on FIFO_CTRL3
+        //Set decimation
+        tempFIFO_CTRL3 |= (settings.gyroFifoDecimation & 0x07) << 3;
+
+    }
+    if (settings.accelFifoEnabled == 1) {
+        //Set up accelerometer stuff
+        //Build on FIFO_CTRL3
+        //Set decimation
+        tempFIFO_CTRL3 |= (settings.accelFifoDecimation & 0x07);
+    }
+
+    //CONFIGURE FIFO_CTRL4  (nothing for now-- sets data sets 3 and 4
+    uint8_t tempFIFO_CTRL4 = 0;
+
+
+    //CONFIGURE FIFO_CTRL5
+    uint8_t tempFIFO_CTRL5 = 0;
+    switch (settings.fifoSampleRate) {
+        default:  //set default case to 10Hz(slowest)
+        case 10:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_10Hz;
+            break;
+        case 25:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_25Hz;
+            break;
+        case 50:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_50Hz;
+            break;
+        case 100:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_100Hz;
+            break;
+        case 200:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_200Hz;
+            break;
+        case 400:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_400Hz;
+            break;
+        case 800:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_800Hz;
+            break;
+        case 1600:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_1600Hz;
+            break;
+        case 3300:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_3300Hz;
+            break;
+        case 6600:
+            tempFIFO_CTRL5 |= LSM6DS3_ACC_GYRO_ODR_FIFO_6600Hz;
+            break;
+    }
+    //Hard code the fifo mode here:
+    tempFIFO_CTRL5 |= settings.fifoModeWord = 6;  //set mode:
+
+    //Write the data
+    writeRegister(LSM6DS3_ACC_GYRO_FIFO_CTRL1, thresholdLByte);
+    //Serial.println(thresholdLByte, HEX);
+    writeRegister(LSM6DS3_ACC_GYRO_FIFO_CTRL2, thresholdHByte);
+    //Serial.println(thresholdHByte, HEX);
+    writeRegister(LSM6DS3_ACC_GYRO_FIFO_CTRL3, tempFIFO_CTRL3);
+    writeRegister(LSM6DS3_ACC_GYRO_FIFO_CTRL4, tempFIFO_CTRL4);
+    writeRegister(LSM6DS3_ACC_GYRO_FIFO_CTRL5, tempFIFO_CTRL5);
+
+}
+void LSM6DS3::fifoClear( void )
+{
+    //Drain the fifo data and dump it
+    while( (fifoGetStatus() & 0x1000 ) == 0 ) {
+        fifoRead();
+    }
+
+}
+int16_t LSM6DS3::fifoRead( void )
+{
+    //Pull the last data from the fifo
+    uint8_t tempReadByte = 0;
+    uint16_t tempAccumulator = 0;
+    readRegister(&tempReadByte, LSM6DS3_ACC_GYRO_FIFO_DATA_OUT_L);
+    tempAccumulator = tempReadByte;
+    readRegister(&tempReadByte, LSM6DS3_ACC_GYRO_FIFO_DATA_OUT_H);
+    tempAccumulator |= ((uint16_t)tempReadByte << 8);
+
+    return tempAccumulator;
+}
+
+uint16_t LSM6DS3::fifoGetStatus( void )
+{
+    //Return some data on the state of the fifo
+    uint8_t tempReadByte = 0;
+    uint16_t tempAccumulator = 0;
+    readRegister(&tempReadByte, LSM6DS3_ACC_GYRO_FIFO_STATUS1);
+    tempAccumulator = tempReadByte;
+    readRegister(&tempReadByte, LSM6DS3_ACC_GYRO_FIFO_STATUS2);
+    tempAccumulator |= (tempReadByte << 8);
+
+    return tempAccumulator;
+
+}
+void LSM6DS3::fifoEnd( void )
+{
+    // turn off the fifo
+    writeRegister(LSM6DS3_ACC_GYRO_FIFO_STATUS1, 0x00);  //Disable
+}