diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h
index d1b0ffab235c4b9f6371f87e20392e2c31310221..d0b1d3416f989db4b4d5b8fb905ae9b1ea0031de 100644
--- a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h
+++ b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h
@@ -22,419 +22,438 @@
  * THE SOFTWARE.
  */
 
-
 #pragma once
 #include <miosix.h>
 #include <array>
 
-#include "drivers/spi/SPIDriver.h"
 #include "../Sensor.h"
+#include "drivers/spi/SPIDriver.h"
 
 using miosix::GpioPin;
 using std::array;
 
-class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSensor
+class LSM9DS1_XLG : public GyroSensor,
+                    public AccelSensor,
+                    public TemperatureSensor
 {
-    public:
-
-        enum AxelFSR
+public:
+    enum AxelFSR
+    {
+        FS_2  = 0x00,
+        FS_16 = 0x01,
+        FS_4  = 0x02,
+        FS_8  = 0x03
+    };
+
+    enum GyroFSR
+    {
+        FS_245  = 0x00,
+        FS_500  = 0x01,
+        FS_2000 = 0x03  // 1 -> 3 jump is ok
+    };
+
+    enum ODR
+    {
+        PWR_DW  = 0X00,
+        ODR_15  = 0X01,
+        ODR_60  = 0X02,
+        ODR_119 = 0X03,
+        ODR_238 = 0X04,
+        ODR_476 = 0X05,
+        ODR_952 = 0X06
+    };
+
+    /**
+     * @brief Creates an instance of an LSM9DS1 accelerometer + gyroscope sensor
+     *
+     * @param    bus SPI bus the sensor is connected to
+     * @param    cs Chip Select GPIO
+     * @param    config (OPTIONAL) custom SPIBusConfig
+     * @param    axelRange accelerometer Full Scale Range (See datasheet)
+     * @param    gyroRange gyroscope Full Scale Range (See datasheet)
+     * @param    odr Output Data Rate (See datasheet)
+     * @param    fifo_enabled Fifo enabled
+     * @param    fifo_watermark FIFO watermark level in range [1,32] (used for
+     * interrupt generation, see datasheet).
+     */
+
+    LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs,
+                AxelFSR axelRange = AxelFSR::FS_2,
+                GyroFSR gyroRange = GyroFSR::FS_245, ODR odr = ODR::ODR_15,
+                bool fifo_enabled = false, unsigned int fifo_watermark = 24)
+        : fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
+          spislave(bus, cs), axelFSR(axelRange), gyroFSR(gyroRange), odr(odr)
+    {
+        // SPI config
+        spislave.config.clock_div = SPIClockDivider::DIV64;
+    }
+
+    LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs, SPIBusConfig config,
+                AxelFSR axelRange = AxelFSR::FS_2,
+                GyroFSR gyroRange = GyroFSR::FS_245, ODR odr = ODR::ODR_15,
+                bool fifo_enabled = false, unsigned int fifo_watermark = 24)
+        : fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
+          spislave(bus, cs, config), axelFSR(axelRange), gyroFSR(gyroRange),
+          odr(odr)
+    {
+    }
+
+    bool init() override
+    {
+        // Set FSR
+        switch (axelFSR)  // DA RIGUARDARE I COEFFICIENTI: SU DS C'E'
+                          // SENSITIVITY IN mg/LSB
         {
-            FS_2    = 0x00,
-            FS_16   = 0x01,
-            FS_4    = 0x02,
-            FS_8    = 0x03
-        };
+            case AxelFSR::FS_2:
+                axelSensitivity = 0.598f;
+                break;
+            case AxelFSR::FS_4:
+                axelSensitivity = 1.196f;
+                break;
+            case AxelFSR::FS_8:
+                axelSensitivity = 2.393f;
+                break;
+            case AxelFSR::FS_16:
+                axelSensitivity = 7.178f;
+                break;
+            default:
+                axelSensitivity = 0.598f;
+                break;
+        }
 
-        enum GyroFSR
+        switch (gyroFSR)
         {
-            FS_245  = 0x00,
-            FS_500  = 0x01,
-            FS_2000 = 0x03      //1 -> 3 jump is ok 
-        };
+            case GyroFSR::FS_245:
+                gyroSensitivity = 8.75f;
+                break;
+            case GyroFSR::FS_500:
+                gyroSensitivity = 17.50f;
+                break;
+            case GyroFSR::FS_2000:
+                gyroSensitivity = 70.0f;
+                break;
+            default:
+                gyroSensitivity = 8.75f;
+                break;
+        }
 
-        enum ODR
+        switch (odr)
         {
-            PWR_DW      =   0X00,
-            ODR_15      =   0X01,
-            ODR_60      =   0X02,
-            ODR_119     =   0X03,
-            ODR_238     =   0X04,
-            ODR_476     =   0X05,
-            ODR_952     =   0X06
-        };
-
-         /**
-         * @brief Creates an instance of an LSM9DS1 accelerometer + gyroscope sensor
-         *
-         * @param    bus SPI bus the sensor is connected to
-         * @param    cs Chip Select GPIO
-         * @param    config (OPTIONAL) custom SPIBusConfig 
-         * @param    axelRange accelerometer Full Scale Range (See datasheet)
-         * @param    gyroRange gyroscope Full Scale Range (See datasheet)
-         * @param    odr Output Data Rate (See datasheet)
-         * @param    fifo_enabled Fifo enabled
-         * @param    fifo_watermark FIFO watermark level in range [1,32] (used for
-         * interrupt generation, see datasheet).
-         */
-
-        LSM9DS1_XLG(
-           SPIBusInterface& bus, 
-           GpioPin          cs,
-           AxelFSR          axelRange           = AxelFSR::FS_2,
-           GyroFSR          gyroRange           = GyroFSR::FS_245,
-           ODR              odr                 = ODR::ODR_15,
-           bool             fifo_enabled        = false,
-           unsigned int     fifo_watermark      = 24
-           ):fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
-          spislave(bus, cs), axelFSR(axelRange), gyroFSR(gyroRange), odr(odr){
-            //SPI config
-            spislave.config.clock_div = SPIClockDivider::DIV64; 
+            case ODR::PWR_DW:
+                odrHz = 0.0f;
+                break;
+            case ODR::ODR_15:
+                odrHz = 14.9f;
+                break;
+            case ODR::ODR_60:
+                odrHz = 59.5f;
+                break;
+            case ODR::ODR_119:
+                odrHz = 119.0f;
+                break;
+            case ODR::ODR_238:
+                odrHz = 238.0f;
+                break;
+            case ODR::ODR_476:
+                odrHz = 476.0f;
+                break;
+            case ODR::ODR_952:
+                odrHz = 952.0f;
+                break;
+            default:
+                odrHz = 14.9f;
+                break;
         }
 
-        LSM9DS1_XLG(
-           SPIBusInterface& bus, 
-           GpioPin          cs,
-           SPIBusConfig     config,
-           AxelFSR          axelRange           = AxelFSR::FS_2,
-           GyroFSR          gyroRange           = GyroFSR::FS_245,
-           ODR              odr                 = ODR::ODR_15,
-           bool             fifo_enabled        = false,
-           unsigned int     fifo_watermark      = 24
-           ):fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
-          spislave(bus, cs, config), axelFSR(axelRange), gyroFSR(gyroRange), odr(odr){
-            
-        }
+        SPITransaction spi(spislave);
 
-        bool init() override
+        // Who Am I check:
+        uint8_t whoami = spi.read(regMapXLG::WHO_AM_I);
+        if (whoami != WHO_AM_I_XLG_VAL)
         {
-            //Set FSR
-            switch(axelFSR)             //DA RIGUARDARE I COEFFICIENTI: SU DS C'E' SENSITIVITY IN mg/LSB
-            {
-                case AxelFSR::FS_2:
-                    axelSensitivity = 0.598f;
-                    break;
-                case AxelFSR::FS_4:
-                    axelSensitivity = 1.196f;
-                    break;
-                case AxelFSR::FS_8:
-                    axelSensitivity = 2.393f;
-                    break;
-                case AxelFSR::FS_16:
-                    axelSensitivity = 7.178f;
-                    break;
-                default:
-                    axelSensitivity = 0.598f;
-                    break;
-            }
-
-            switch(gyroFSR)
-            {
-                case GyroFSR::FS_245:
-                    gyroSensitivity = 8.75f;
-                    break;
-                case GyroFSR::FS_500:
-                    gyroSensitivity = 17.50f;
-                    break;
-                case GyroFSR::FS_2000:
-                    gyroSensitivity = 70.0f;
-                    break;
-                default:
-                    gyroSensitivity = 8.75f;
-                    break;
-            }
-
-            switch(odr)
-            {
-                case ODR::PWR_DW:
-                    odrHz = 0.0f;
-                    break;
-                case ODR::ODR_15:
-                    odrHz = 14.9f;
-                    break;
-                case ODR::ODR_60:
-                    odrHz = 59.5f;
-                    break;
-                case ODR::ODR_119:
-                    odrHz = 119.0f;
-                    break;
-                case ODR::ODR_238:
-                    odrHz = 238.0f;
-                    break;
-                case ODR::ODR_476:
-                    odrHz = 476.0f;
-                    break;
-                case ODR::ODR_952:
-                    odrHz = 952.0f;
-                    break;
-                default:
-                    odrHz = 14.9f;
-                    break; 
-            }
-
-            SPITransaction spi(spislave);
+            TRACE("LSM9DS1 AXEL+GYRO WAMI: %02X\n", whoami);
+            last_error = ERR_NOT_ME;
+            return false;
+        }
 
-            //Who Am I check:
-            uint8_t whoami = spi.read(regMapXLG::WHO_AM_I);
-            if(whoami != WHO_AM_I_XLG_VAL){
-                TRACE("LSM9DS1 AXEL+GYRO WAMI: %02X\n", whoami);
-                last_error = ERR_NOT_ME;
-                return false;
-            }
+        // common setup
+        spi.write(regMapXLG::CTRL_REG8,
+                  CTRL_REG8_VAL);  // addr auto-increment while reading/writing
 
-            //common setup
-            spi.write(regMapXLG::CTRL_REG8, CTRL_REG8_VAL); //addr auto-increment while reading/writing
+        // FIFO setup: FIFO enabled in continous mode, decimation OFF,
+        // temperature on FIFO ON.
+        if (fifo_enabled)
+        {
+            spi.write(regMapXLG::FIFO_CTRL,
+                      (FIFO_CTRL_VAL |
+                       fifo_watermark));  // FIFO continous mode + fifo
+                                          // watermark threshold setup
+            spi.write(regMapXLG::INT1_CTRL,
+                      INT1_CTRL_VAL);  // interrupt on FIFO treshold
+            spi.write(
+                regMapXLG::CTRL_REG9,
+                (CTRL_REG9_VAL | 0x02));  // DRDY_mask_bit OFF, I2C OFF, FIFO ON
+        }
+        else
+        {
+            spi.write(regMapXLG::CTRL_REG9,
+                      CTRL_REG9_VAL);  // DRDY_mask_bit OFF, I2C OFF, FIFO OFF
+        }
 
-            //FIFO setup: FIFO enabled in continous mode, decimation OFF, temperature on FIFO ON.
-            if(fifo_enabled)
+        // Axel Setup: ODR, FSR defined by constructor, auto anti-aliasing BW
+        // (max), LPF2/HPF bypassed and disabled, axel output enabled by default
+        // @ startup
+        uint8_t CTRL_REG6_XL_VAL = (int)odr << 5 | (int)axelFSR << 3;
+        spi.write(regMapXLG::CTRL_REG6_XL,
+                  CTRL_REG6_XL_VAL);  // ODR, FSR, auto BW (max) function of ODR
+
+        // Gyro Setup : ODR, FSR defined by constructor, LPF2/HPF bypassed and
+        // disabled, gyro output enabled by default @ startup
+        uint8_t CTRL_REG1_G_VAL = (int)odr << 5 | (int)gyroFSR << 3;
+        spi.write(regMapXLG::CTRL_REG1_G, CTRL_REG1_G_VAL);  // ODR,FSR
+        // spi.write(regMapXLG::ORIENT_CFG_G, ORIENT_CFG_VAL); //angular rate
+        // sign and orientation Setup <--- BOARD DEPENDENT
+
+        // Check all the registers have been written correctly
+        if (spi.read(regMapXLG::CTRL_REG8) != CTRL_REG8_VAL)
+        {
+            return false;
+        }
+        if (fifo_enabled)
+        {
+            if (spi.read(regMapXLG::FIFO_CTRL) !=
+                (FIFO_CTRL_VAL | fifo_watermark))
             {
-                spi.write(regMapXLG::FIFO_CTRL, (FIFO_CTRL_VAL|fifo_watermark)); //FIFO continous mode + fifo watermark threshold setup
-                spi.write(regMapXLG::INT1_CTRL, INT1_CTRL_VAL); //interrupt on FIFO treshold
-                spi.write(regMapXLG::CTRL_REG9, (CTRL_REG9_VAL|0x02)); //DRDY_mask_bit OFF, I2C OFF, FIFO ON
+                return false;
             }
-            else
+            if (spi.read(regMapXLG::INT1_CTRL) != INT1_CTRL_VAL)
             {
-                spi.write(regMapXLG::CTRL_REG9, CTRL_REG9_VAL); //DRDY_mask_bit OFF, I2C OFF, FIFO OFF
+                return false;
             }
-            
-            
-            //Axel Setup: ODR, FSR defined by constructor, auto anti-aliasing BW (max), LPF2/HPF bypassed and disabled, axel output enabled by default @ startup
-            uint8_t CTRL_REG6_XL_VAL = (int)odr << 5 | (int)axelFSR << 3;
-            spi.write(regMapXLG::CTRL_REG6_XL, CTRL_REG6_XL_VAL); //ODR, FSR, auto BW (max) function of ODR
-            
-
-
-            //Gyro Setup : ODR, FSR defined by constructor, LPF2/HPF bypassed and disabled, gyro output enabled by default @ startup
-            uint8_t CTRL_REG1_G_VAL = (int)odr<<5 | (int)gyroFSR<<3;
-            spi.write(regMapXLG::CTRL_REG1_G, CTRL_REG1_G_VAL); //ODR,FSR
-            //spi.write(regMapXLG::ORIENT_CFG_G, ORIENT_CFG_VAL); //angular rate sign and orientation Setup <--- BOARD DEPENDENT           
-            
-            //Check all the registers have been written correctly
-            if(spi.read(regMapXLG::CTRL_REG8)!=CTRL_REG8_VAL)                          {return false;}
-            if(fifo_enabled)
+            if (spi.read(regMapXLG::CTRL_REG9) != (CTRL_REG9_VAL | 0x02))
             {
-                if(spi.read(regMapXLG::FIFO_CTRL) != (FIFO_CTRL_VAL|fifo_watermark))   {return false;}
-                if(spi.read(regMapXLG::INT1_CTRL) != INT1_CTRL_VAL)                    {return false;}
-                if(spi.read(regMapXLG::CTRL_REG9) != (CTRL_REG9_VAL| 0x02))            {return false;}
+                return false;
             }
-            else
+        }
+        else
+        {
+            if (spi.read(regMapXLG::CTRL_REG9) != CTRL_REG9_VAL)
             {
-                if(spi.read(regMapXLG::CTRL_REG9) != CTRL_REG9_VAL)                    {return false;}
+                return false;
             }
-            if(spi.read(regMapXLG::CTRL_REG6_XL) != CTRL_REG6_XL_VAL)                  {return false;}
-            if(spi.read(regMapXLG::CTRL_REG1_G) != CTRL_REG1_G_VAL)                    {return false;}
-            
-            discardSamples();
-
-            return true;  
         }
-
-        bool selfTest() override
-        {   
-            return true;
+        if (spi.read(regMapXLG::CTRL_REG6_XL) != CTRL_REG6_XL_VAL)
+        {
+            return false;
         }
-        
-        bool onSimpleUpdate() override 
+        if (spi.read(regMapXLG::CTRL_REG1_G) != CTRL_REG1_G_VAL)
         {
-            
-            if(!fifo_enabled){ //if FIFO disabled
-               uint8_t data[12], tempData[2];
-                // Read output axel+gyro data X,Y,Z
-                {
-                    SPITransaction spi(spislave);
-                    spi.read(regMapXLG::OUT_X_L_G, data, 12);
-                    spi.read(regMapXLG::OUT_TEMP_L, tempData, 2); 
-                }
-
-                int16_t x_gy = data[0]  |  data[1] << 8;
-                int16_t y_gy = data[2]  |  data[3] << 8;
-                int16_t z_gy = data[4]  |  data[5] << 8;
-
-                int16_t x_xl = data[6]  |  data[7] << 8;
-                int16_t y_xl = data[8]  |  data[9] << 8;
-                int16_t z_xl = data[10] |  data[11] << 8;
-
-                int16_t temp = tempData[0] | tempData[1] << 8;
-                
-                mLastAccel = 
-                    Vec3(x_xl  * axelSensitivity / 1000,
-                         y_xl  * axelSensitivity / 1000,
-                         z_xl  * axelSensitivity / 1000);
-                
-                mLastGyro =
-                    Vec3(x_gy  * gyroSensitivity / 1000,
-                         y_gy  * gyroSensitivity / 1000,
-                         z_gy  * gyroSensitivity / 1000);
-
-                mLastTemp =  tempZero + (temp / tempSensistivity); //25°C + TEMP*S devo castare a float "temp"?
-            }
-            else{ //if FIFO enabled: do not store temperature, it can be read using "temperatureUpdate()" function at low sampling frequency
-                uint8_t buf[384]; //2 bytes per data * 3 axes * 2 (axel+gyro) * 32(FIFO DEPTH MAX) = 384 samples 
-                {
-                    SPITransaction spi(spislave);
-                    //read FIFO status and dump all the samples inside the FIFO
-                    //uint8_t fifo_src = spi.read(FIFO_SRC);
-                    //fifo_samples = fifo_src & 0x3F;
-                    //sanity check
-                    /*if(fifo_samples > 32)
-                    {
-                        fifo_samples = 32;
-                    }*/
-                    spi.read(OUT_X_L_G, buf, fifo_watermark*12); //format: gxl,gxh,gyl,gyh,gzl,gzh,axl,axh,ayl,ayh,azl,azh for each sample
-                }
-                //convert & store
-                for(int i=0; i<fifo_samples; i++ )
-                {
-                    uint16_t x_gy = buf[i*12]      | buf[i*12 + 1]  << 8;
-                    uint16_t y_gy = buf[i*12 + 2]  | buf[i*12 + 3]  << 8;
-                    uint16_t z_gy = buf[i*12 + 4]  | buf[i*12 + 5]  << 8;
-                    
-                    uint16_t x_xl = buf[i*12 + 6]  | buf[i*12 + 7]  << 8;
-                    uint16_t y_xl = buf[i*12 + 8]  | buf[i*12 + 9]  << 8;
-                    uint16_t z_xl = buf[i*12 + 10] | buf[i*12 + 11] << 8;
-
-                    gyro_fifo[i] = 
-                                Vec3(x_gy * gyroSensitivity / 1000,
-                                     y_gy * gyroSensitivity / 1000,
-                                     z_gy * gyroSensitivity / 1000);
-                    axel_fifo[i] = 
-                                Vec3(x_xl * axelSensitivity / 1000,
-                                     y_xl * axelSensitivity / 1000,
-                                     z_xl * axelSensitivity / 1000);
-                }
-            }
-            return true; 
+            return false;
         }
 
-        bool temperatureUpdate()
-        {
-            uint8_t tempData[2];
+        discardSamples();
+
+        return true;
+    }
+
+    bool selfTest() override { return true; }
+
+    bool onSimpleUpdate() override
+    {
+
+        if (!fifo_enabled)
+        {  // if FIFO disabled
+            uint8_t data[12], tempData[2];
+            // Read output axel+gyro data X,Y,Z
             {
                 SPITransaction spi(spislave);
+                spi.read(regMapXLG::OUT_X_L_G, data, 12);
                 spi.read(regMapXLG::OUT_TEMP_L, tempData, 2);
             }
 
+            int16_t x_gy = data[0] | data[1] << 8;
+            int16_t y_gy = data[2] | data[3] << 8;
+            int16_t z_gy = data[4] | data[5] << 8;
+
+            int16_t x_xl = data[6] | data[7] << 8;
+            int16_t y_xl = data[8] | data[9] << 8;
+            int16_t z_xl = data[10] | data[11] << 8;
+
             int16_t temp = tempData[0] | tempData[1] << 8;
-            mLastTemp = tempZero + temp / tempSensistivity; //25°C + TEMP/S devo castare a float "temp"?
-            return true;
+
+            mLastAccel = Vec3(x_xl * axelSensitivity / 1000,
+                              y_xl * axelSensitivity / 1000,
+                              z_xl * axelSensitivity / 1000);
+
+            mLastGyro = Vec3(x_gy * gyroSensitivity / 1000,
+                             y_gy * gyroSensitivity / 1000,
+                             z_gy * gyroSensitivity / 1000);
+
+            mLastTemp =
+                tempZero + (temp / tempSensistivity);  // 25°C + TEMP*S devo
+                                                       // castare a float "temp"?
         }
+        else
+        {  // if FIFO enabled: do not store temperature, it can be read using
+           // "temperatureUpdate()" function at low sampling frequency
+            uint8_t buf[384];  // 2 bytes per data * 3 axes * 2 (axel+gyro) *
+                               // 32(FIFO DEPTH MAX) = 384 samples
+            {
+                SPITransaction spi(spislave);
 
-        void clearFIFO() //FIFO clearing routine (see datasheet)
+                spi.read(OUT_X_L_G, buf,
+                         fifo_watermark * 12);  // format:
+                                                // gxl,gxh,gyl,gyh,gzl,gzh,axl,axh,ayl,ayh,azl,azh
+                                                // for each sample
+            }
+            // convert & store
+            for (int i = 0; i < fifo_watermark; i++)
+            {
+                int16_t x_gy = buf[i * 12] | buf[i * 12 + 1] << 8;
+                int16_t y_gy = buf[i * 12 + 2] | buf[i * 12 + 3] << 8;
+                int16_t z_gy = buf[i * 12 + 4] | buf[i * 12 + 5] << 8;
+
+                int16_t x_xl = buf[i * 12 + 6] | buf[i * 12 + 7] << 8;
+                int16_t y_xl = buf[i * 12 + 8] | buf[i * 12 + 9] << 8;
+                int16_t z_xl = buf[i * 12 + 10] | buf[i * 12 + 11] << 8;
+
+                gyro_fifo[i] = Vec3(x_gy * gyroSensitivity / 1000,
+                                    y_gy * gyroSensitivity / 1000,
+                                    z_gy * gyroSensitivity / 1000);
+                axel_fifo[i] = Vec3(x_xl * axelSensitivity / 1000,
+                                    y_xl * axelSensitivity / 1000,
+                                    z_xl * axelSensitivity / 1000);
+            }
+        }
+        return true;
+    }
+
+    bool temperatureUpdate()
+    {
+        uint8_t tempData[2];
         {
             SPITransaction spi(spislave);
-            spi.write(FIFO_CTRL, 0); //Bypass Mode
-            miosix::Thread::sleep(20); //Wait
-            spi.write(FIFO_CTRL, FIFO_CTRL_VAL | fifo_watermark); //re-enable FIFO
-            discardSamples();
-
+            spi.read(regMapXLG::OUT_TEMP_L, tempData, 2);
         }
 
-        const array<Vec3, 32>& getGyroFIFO() const { return gyro_fifo; }
-        const array<Vec3, 32>& getAxelFIFO() const { return axel_fifo; }
-        uint8_t getFIFOSamples() const { return fifo_samples;} //fifo_samples is the same for both axel & gyro FIFOs
-        
-    private:
-
-        bool fifo_enabled;
-        uint8_t fifo_watermark;
-        uint8_t fifo_samples = 0;
-        array<Vec3, 32> gyro_fifo, axel_fifo; 
-
-        SPISlave spislave; 
-
-        AxelFSR axelFSR;
-        GyroFSR gyroFSR;
-        ODR odr;
-        
-        float axelSensitivity;
-        float gyroSensitivity;
-        float odrHz; 
-        float tempZero = 25.0f;
-        float tempSensistivity = 16.0f;
-        static const uint8_t samplesToDiscard = 8; //max possible val
-
-        void discardSamples()
+        int16_t temp = tempData[0] | tempData[1] << 8;
+        mLastTemp =
+            tempZero +
+            temp /
+                tempSensistivity;  // 25°C + TEMP/S devo castare a float "temp"?
+        return true;
+    }
+
+    void clearFIFO()  // FIFO clearing routine (see datasheet)
+    {
+        SPITransaction spi(spislave);
+        spi.write(FIFO_CTRL, 0);                               // Bypass Mode
+        miosix::Thread::sleep(20);                             // Wait
+        spi.write(FIFO_CTRL, FIFO_CTRL_VAL | fifo_watermark);  // re-enable FIFO
+        discardSamples();
+    }
+
+    const array<Vec3, 32>& getGyroFIFO() const { return gyro_fifo; }
+    const array<Vec3, 32>& getAxelFIFO() const { return axel_fifo; }
+
+private:
+    bool fifo_enabled;
+    uint8_t fifo_watermark;
+    array<Vec3, 32> gyro_fifo, axel_fifo;
+
+    SPISlave spislave;
+
+    AxelFSR axelFSR;
+    GyroFSR gyroFSR;
+    ODR odr;
+
+    float axelSensitivity;
+    float gyroSensitivity;
+    float odrHz;
+    float tempZero                        = 25.0f;
+    float tempSensistivity                = 16.0f;
+    static const uint8_t samplesToDiscard = 8;  // max possible val
+
+    void discardSamples()
+    {
+
+        //@ startup, some samples have to be discarded (datasheet)
+        if (odr != ODR::PWR_DW)
         {
-                        
-            //@ startup, some samples have to be discarded (datasheet)
-            if(odr != ODR::PWR_DW)
-            {   
-                uint16_t toWait_ms = samplesToDiscard * 1000 / odrHz;
-                //TRACE("toWait_ms: %d", toWait_ms); 
-                miosix::Thread::sleep(toWait_ms); //if FIFO is disabled, just wait 
-                if(fifo_enabled)
+            uint16_t toWait_ms = samplesToDiscard * 1000 / odrHz;
+            // TRACE("toWait_ms: %d", toWait_ms);
+            miosix::Thread::sleep(toWait_ms);  // if FIFO is disabled, just wait
+            if (fifo_enabled)
+            {
+                // if FIFO is enabled, read first <samplesToDiscard> samples and
+                // discard them
+                SPITransaction spi(spislave);
+                for (int i = 0; i < samplesToDiscard; i++)
                 {
-                    //if FIFO is enabled, read first <samplesToDiscard> samples and discard them
-                    SPITransaction spi(spislave);
-                    for(int i=0; i < samplesToDiscard; i++)
-                    {
-                        spi.read(regMapXLG::OUT_X_L_XL, 6);
-                        spi.read(regMapXLG::OUT_X_L_G,  6);
-                    }
+                    spi.read(regMapXLG::OUT_X_L_XL, 6);
+                    spi.read(regMapXLG::OUT_X_L_G, 6);
                 }
             }
-
         }
-
-        enum regMapXLG
-        {
-            ACT_THS             =   0x04,
-            ACT_DUR             =   0x05,    
-            INT_GEN_CFG_XL      =   0x06,
-            INT_GEN_THS_X_XL    =   0x07,
-            INT_GEN_THS_Y_XL    =   0x08,
-            INT_GEN_THS_Z_XL    =   0x09,
-            INT_GEN_DUR_XL      =   0x0A,
-            REFERENCE_G         =   0x0B,
-            INT1_CTRL           =   0x0C,
-            INT2_CTRL           =   0x0D,
-            WHO_AM_I            =   0x0F,
-            CTRL_REG1_G         =   0x10,
-            CTRL_REG2_G         =   0x11,
-            CTRL_REG3_G         =   0x12,
-            ORIENT_CFG_G        =   0x13,
-            INT_GEN_SRC_G       =   0x14,
-            OUT_TEMP_L          =   0x15,
-            OUT_TEMP_H          =   0x16,
-            STATUS_REG_G        =   0x17,  // per check stato
-            OUT_X_L_G           =   0x18,
-            OUT_X_H_G           =   0x19,
-            OUT_Y_L_G           =   0x1A,
-            OUT_Y_H_G           =   0x1B,
-            OUT_Z_L_G           =   0x1C,
-            OUT_Z_H_G           =   0x1D,
-            CTRL_REG4           =   0x1E,
-            CTRL_REG5_XL        =   0x1F,
-            CTRL_REG6_XL        =   0x20,
-            CTRL_REG7_XL        =   0x21,
-            CTRL_REG8           =   0x22,
-            CTRL_REG9           =   0x23,
-            CTRL_REG10          =   0x24, //per self-test ma n.u.
-            INT_GEN_SRC_XL      =   0x26,
-            STATUS_REG_XL       =   0x27,   // per check stato
-            OUT_X_L_XL          =   0x28,
-            OUT_X_H_XL          =   0x29,
-            OUT_Y_L_XL          =   0x2A,
-            OUT_Y_H_XL          =   0x2B,
-            OUT_Z_L_XL          =   0x2C,
-            OUT_Z_H_XL          =   0x2D,
-            FIFO_CTRL           =   0x2E,
-            FIFO_SRC            =   0x2F, //FIFO status register
-            INT_GEN_CFG_G       =   0x30,
-            INT_GEN_THS_XH_G    =   0x31,
-            INT_GEN_THS_XL_G    =   0x32,
-            INT_GEN_THS_YH_G    =   0x33,
-            INT_GEN_THS_YL_G    =   0x34,
-            INT_GEN_THS_ZH_G    =   0x35,
-            INT_GEN_THS_ZL_G    =   0x36,
-            INT_GEN_DUR_G       =   0x37
-        };
-
-        static const uint8_t INT1_CTRL_VAL      = 0x08;
-        static const uint8_t WHO_AM_I_XLG_VAL   = 0x68;
-        static const uint8_t CTRL_REG8_VAL      = 0x04;
-        static const uint8_t CTRL_REG9_VAL      = 0x04;
-        static const uint8_t FIFO_CTRL_VAL      = 0xC0;
-
-
+    }
+
+    enum regMapXLG
+    {
+        ACT_THS          = 0x04,
+        ACT_DUR          = 0x05,
+        INT_GEN_CFG_XL   = 0x06,
+        INT_GEN_THS_X_XL = 0x07,
+        INT_GEN_THS_Y_XL = 0x08,
+        INT_GEN_THS_Z_XL = 0x09,
+        INT_GEN_DUR_XL   = 0x0A,
+        REFERENCE_G      = 0x0B,
+        INT1_CTRL        = 0x0C,
+        INT2_CTRL        = 0x0D,
+        WHO_AM_I         = 0x0F,
+        CTRL_REG1_G      = 0x10,
+        CTRL_REG2_G      = 0x11,
+        CTRL_REG3_G      = 0x12,
+        ORIENT_CFG_G     = 0x13,
+        INT_GEN_SRC_G    = 0x14,
+        OUT_TEMP_L       = 0x15,
+        OUT_TEMP_H       = 0x16,
+        STATUS_REG_G     = 0x17,  // per check stato
+        OUT_X_L_G        = 0x18,
+        OUT_X_H_G        = 0x19,
+        OUT_Y_L_G        = 0x1A,
+        OUT_Y_H_G        = 0x1B,
+        OUT_Z_L_G        = 0x1C,
+        OUT_Z_H_G        = 0x1D,
+        CTRL_REG4        = 0x1E,
+        CTRL_REG5_XL     = 0x1F,
+        CTRL_REG6_XL     = 0x20,
+        CTRL_REG7_XL     = 0x21,
+        CTRL_REG8        = 0x22,
+        CTRL_REG9        = 0x23,
+        CTRL_REG10       = 0x24,  // per self-test ma n.u.
+        INT_GEN_SRC_XL   = 0x26,
+        STATUS_REG_XL    = 0x27,  // per check stato
+        OUT_X_L_XL       = 0x28,
+        OUT_X_H_XL       = 0x29,
+        OUT_Y_L_XL       = 0x2A,
+        OUT_Y_H_XL       = 0x2B,
+        OUT_Z_L_XL       = 0x2C,
+        OUT_Z_H_XL       = 0x2D,
+        FIFO_CTRL        = 0x2E,
+        FIFO_SRC         = 0x2F,  // FIFO status register
+        INT_GEN_CFG_G    = 0x30,
+        INT_GEN_THS_XH_G = 0x31,
+        INT_GEN_THS_XL_G = 0x32,
+        INT_GEN_THS_YH_G = 0x33,
+        INT_GEN_THS_YL_G = 0x34,
+        INT_GEN_THS_ZH_G = 0x35,
+        INT_GEN_THS_ZL_G = 0x36,
+        INT_GEN_DUR_G    = 0x37
+    };
+
+    static const uint8_t INT1_CTRL_VAL    = 0x08;
+    static const uint8_t WHO_AM_I_XLG_VAL = 0x68;
+    static const uint8_t CTRL_REG8_VAL    = 0x04;
+    static const uint8_t CTRL_REG9_VAL    = 0x04;
+    static const uint8_t FIFO_CTRL_VAL    = 0xC0;
 };
-
diff --git a/src/tests/drivers/test-lsm9ds1-fifo.cpp b/src/tests/drivers/test-lsm9ds1-fifo.cpp
index 5ed77b7f9877b91d5cf1c5bd2f285028a48a915f..174a78af6d9454a132a3c8c544633aba8245d377 100644
--- a/src/tests/drivers/test-lsm9ds1-fifo.cpp
+++ b/src/tests/drivers/test-lsm9ds1-fifo.cpp
@@ -39,7 +39,7 @@ typedef Gpio<GPIOA_BASE, 7> GpioMosi;
 typedef Gpio<GPIOA_BASE, 1> GpioINT1;
 
 static const bool FIFO_ENABLED      = true;
-static const uint8_t FIFO_WATERMARK = 12;
+static const uint8_t FIFO_WATERMARK = 20;
 static const uint8_t FIFO_SAMPLES   = 5;
 
 // SPI
@@ -53,15 +53,18 @@ GpioPin LED1(GPIOD_BASE, 15);
 volatile bool flagSPIReadRequest = false;
 
 // High Resolution hardware timer using TIM5
-HardwareTimer<uint32_t> hrclock{
-    TIM5, TimerUtils::getPrescalerInputFrequency(TimerUtils::InputClock::APB1)};
+HardwareTimer<uint32_t> hrclock(
+    TIM5, TimerUtils::getPrescalerInputFrequency(TimerUtils::InputClock::APB1));
 
 // Last interrupt tick & delta
 volatile uint32_t last_tick;
 volatile uint32_t delta;
 
-//LSM9DS1 obj
-LSM9DS1_XLG* lsm9ds1 = nullptr; 
+// Arrays for samples
+array<Vec3, 32> axelData[FIFO_SAMPLES], gyroData[FIFO_SAMPLES];
+
+// LSM9DS1 obj
+LSM9DS1_XLG* lsm9ds1 = nullptr;
 
 // Interrupt handlers
 void __attribute__((naked)) EXTI1_IRQHandler()
@@ -97,26 +100,21 @@ int main()
 
     uint8_t fifo_counter = 0;
     uint32_t dt[FIFO_SAMPLES];
-    //array<Vec3, 32> axelData[FIFO_SAMPLES], gyroData[FIFO_SAMPLES];
 
     gpioConfig();
 
-    
-    Thread::sleep(4000);
+    Thread::sleep(1000);
     LED1.low();
 
     timer5Config();
     EXTI1Config();
 
-    std::cout << "Before allocation" << std::endl; //FA ANCORA STACK OVERFLOW DOPO QUI GRRRR
-    
-    lsm9ds1 = new LSM9DS1_XLG(bus, cs_XLG, LSM9DS1_XLG::AxelFSR::FS_8,
-                        LSM9DS1_XLG::GyroFSR::FS_245, LSM9DS1_XLG::ODR::ODR_15,
-                        FIFO_ENABLED, FIFO_WATERMARK);
-
-    std::cout << "After allocation" << std::endl;
+    lsm9ds1 = new LSM9DS1_XLG(
+        bus, cs_XLG, LSM9DS1_XLG::AxelFSR::FS_8, LSM9DS1_XLG::GyroFSR::FS_245,
+        LSM9DS1_XLG::ODR::ODR_952, FIFO_ENABLED, FIFO_WATERMARK);
 
-    while (!lsm9ds1->init());
+    while (!lsm9ds1->init())
+        ;
 
     lsm9ds1->clearFIFO();
 
@@ -125,10 +123,10 @@ int main()
         if (flagSPIReadRequest && fifo_counter < FIFO_SAMPLES)
         {
             flagSPIReadRequest = false;
-            dt[fifo_counter]   = delta;
+            dt[fifo_counter]   = hrclock.toMicroSeconds(delta);
             lsm9ds1->onSimpleUpdate();
-            //axelData[fifo_counter] = lsm9ds1->getAxelFIFO();
-            //gyroData[fifo_counter] = lsm9ds1->getGyroFIFO();
+            axelData[fifo_counter] = lsm9ds1->getAxelFIFO();
+            gyroData[fifo_counter] = lsm9ds1->getGyroFIFO();
             LED1.low();
             fifo_counter++;
         }
@@ -139,9 +137,20 @@ int main()
         }
     }
 
+    // print data
+    uint32_t timestamp = 0;
+
     for (uint8_t i = 0; i < FIFO_SAMPLES; i++)
     {
-        std::cout << dt[i] << std::endl;
+        std::cout << "FIFO " << (int)i + 1 << std::endl;
+        for (uint8_t j = 0; j < FIFO_WATERMARK; j++)
+        {
+            timestamp += dt[i] / FIFO_WATERMARK;
+            printf("%d>>%ld>>%.3f,%.3f,%.3f,%.3f,%.3f,%.3f\n", j,timestamp,
+                   axelData[i][j].getX(), axelData[i][j].getY(),
+                   axelData[i][j].getZ(), gyroData[i][j].getX(),
+                   gyroData[i][j].getY(), gyroData[i][j].getZ());
+        }
     }
 
     return 0;
@@ -188,9 +197,11 @@ void timer5Config()
         // Enable high resolution TIM5
         RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
     }
+    hrclock.setPrescaler(382);
+    hrclock.start();
 }
 
-void EXTI1Config() //PC13
+void EXTI1Config()  // PC13
 {
     // Enable SYSCFG for setting interrupts
     {
diff --git a/src/tests/drivers/test-lsm9ds1.cpp b/src/tests/drivers/test-lsm9ds1.cpp
index 68b30977551376c46b0e0f78fa9a03d71075c042..f595cd209d6d03566c12c9ed30932a02b701d485 100644
--- a/src/tests/drivers/test-lsm9ds1.cpp
+++ b/src/tests/drivers/test-lsm9ds1.cpp
@@ -135,6 +135,7 @@ int main(){
                 gdata.getX(), gdata.getY(), gdata.getZ(),
                 mdata.getX(), mdata.getY(), mdata.getZ(),
                 tdata);
+        //printf("%.3f,%.3f,%.3f\n", mdata.getX(), mdata.getY(), mdata.getZ());
     }