From 8b0c2ea068debd16a1c871197f10dd15e5650bd1 Mon Sep 17 00:00:00 2001
From: jtkenny <jtkenny@iastate.edu>
Date: Fri, 29 Mar 2024 19:38:28 +0100
Subject: [PATCH] readding cf firmware

---
 .../src/deck/api/deck_analog.c                |   40 +-
 .../src/drivers/src/ak8963.c                  |  196 +--
 .../src/drivers/src/cppm.c                    |  130 +-
 .../src/drivers/src/eeprom.c                  |    3 +-
 .../src/drivers/src/exti.c                    |  209 ++-
 .../src/drivers/src/fatfs_sd.c                |  878 +++++------
 .../src/drivers/src/hmc5883l.c                |  236 ++-
 .../src/drivers/src/i2c_drv.c                 |  538 ++++---
 .../src/drivers/src/i2cdev.c                  |   85 +-
 .../src/drivers/src/i2croutines.c             | 1299 ++++++++-------
 .../src/drivers/src/led.c                     |  113 +-
 .../src/drivers/src/lh_bootloader.c           |  174 +-
 .../src/drivers/src/lh_flasher.c              |  287 ++--
 .../src/drivers/src/lps25h.c                  |   97 +-
 .../src/drivers/src/maxsonar.c                |   93 +-
 .../src/drivers/src/motors.c                  |  404 ++---
 .../src/drivers/src/mpu6050.c                 | 1403 ++++++++---------
 .../src/drivers/src/mpu6500.c                 | 1246 ++++++++-------
 .../src/drivers/src/ms5611.c                  |  431 +++--
 .../src/drivers/src/nrf24l01.c                |  356 ++---
 .../src/drivers/src/nvic.c                    |  172 +-
 .../src/drivers/src/pca9685.c                 |   75 +-
 .../src/drivers/src/piezo.c                   |  118 +-
 .../src/drivers/src/pmw3901.c                 |  306 ++--
 .../src/drivers/src/swd.c                     |  179 ++-
 .../src/drivers/src/uart1.c                   |  165 +-
 .../src/drivers/src/uart2.c                   |  325 ++--
 .../src/drivers/src/uart_syslink.c            |  635 ++++----
 .../src/drivers/src/vl53l0x.c                 | 1386 ++++++++--------
 .../src/drivers/src/vl53l1x.c                 |  281 ++--
 .../src/drivers/src/watchdog.c                |   63 +-
 .../src/drivers/src/ws2812_cf2.c              |  327 ++--
 .../src/hal/src/ledseq.c                      |   56 +-
 .../src/hal/src/pm_stm32f4.c                  |  203 ++-
 .../src/hal/src/usb.c                         |   21 +-
 .../src/hal/src/usblink.c                     |   19 +-
 .../src/hal/src/usec_time.c                   |   53 +-
 .../src/init/main.c                           |    7 +-
 .../src/platform/platform.c                   |  124 +-
 .../src/platform/platform_cf2.c               |   17 +-
 .../src/platform/platform_stm32f4.c           |   44 +-
 .../src/platform/platform_tag.c               |   19 +-
 .../src/platform/platform_utils.c             |    7 +-
 43 files changed, 6274 insertions(+), 6546 deletions(-)

diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/deck/api/deck_analog.c b/crazyflie_software/crazyflie-firmware-2021.06/src/deck/api/deck_analog.c
index 27fed2489..f1ae95f9b 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/deck/api/deck_analog.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/deck/api/deck_analog.c
@@ -36,33 +36,33 @@ void adcInit(void)
   /*
    * Note: This function initializes only ADC2, and only for single channel, single conversion mode. No DMA, no interrupts, no bells or whistles.
    */
-  //COMMENTED FIRMWARE
+
   /* Note that this de-initializes registers for all ADCs (ADCx) */
-  // ADC_DeInit();
+  ADC_DeInit();
 
-  // /* Define ADC init structures */
-  // ADC_InitTypeDef       ADC_InitStructure;
-  // ADC_CommonInitTypeDef ADC_CommonInitStructure;
+  /* Define ADC init structures */
+  ADC_InitTypeDef       ADC_InitStructure;
+  ADC_CommonInitTypeDef ADC_CommonInitStructure;
 
-  // /* Populates structures with reset values */
-  // ADC_StructInit(&ADC_InitStructure);
-  // ADC_CommonStructInit(&ADC_CommonInitStructure);
+  /* Populates structures with reset values */
+  ADC_StructInit(&ADC_InitStructure);
+  ADC_CommonStructInit(&ADC_CommonInitStructure);
 
-  // /* enable ADC clock */
-  // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
+  /* enable ADC clock */
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
 
-  // /* init ADCs in independent mode, div clock by two */
-  // ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
-  // ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; /* HCLK = 168MHz, PCLK2 = 84MHz, ADCCLK = 42MHz (when using ADC_Prescaler_Div2) */
-  // ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
-  // ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
-  // ADC_CommonInit(&ADC_CommonInitStructure);
+  /* init ADCs in independent mode, div clock by two */
+  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
+  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; /* HCLK = 168MHz, PCLK2 = 84MHz, ADCCLK = 42MHz (when using ADC_Prescaler_Div2) */
+  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
+  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
+  ADC_CommonInit(&ADC_CommonInitStructure);
 
-  // /* Init ADC2: 12bit, single-conversion. For Arduino compatibility set 10bit */
-  // analogReadResolution(12);
+  /* Init ADC2: 12bit, single-conversion. For Arduino compatibility set 10bit */
+  analogReadResolution(12);
 
-  // /* Enable ADC2 */
-  // ADC_Cmd(ADC2, ENABLE);
+  /* Enable ADC2 */
+  ADC_Cmd(ADC2, ENABLE);
 }
 
 static uint16_t analogReadChannel(uint8_t channel)
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ak8963.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ak8963.c
index 7aa6b20c9..d248f41f8 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ak8963.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ak8963.c
@@ -66,57 +66,54 @@ void ak8963Init(I2C_Dev *i2cPort)
  */
 bool ak8963TestConnection()
 {
-  //COMMENTED FIRMWARE
-  // if (i2cdevReadByte(I2Cx, devAddr, AK8963_RA_WIA, buffer) == 1)
-  // {
-  //   return (buffer[0] == 0x48);
-  // }
-  // return false;
-  return true;
+  if (i2cdevReadByte(I2Cx, devAddr, AK8963_RA_WIA, buffer) == 1)
+  {
+    return (buffer[0] == 0x48);
+  }
+  return false;
 }
 
 bool ak8963SelfTest()
 {
   bool testStatus = true;
-  //COMMENTED FIRMWARE
-  // int16_t mx, my, mz;  // positive magnetometer measurements
-  // uint8_t confSave;
-  // uint8_t timeout = 20;
+  int16_t mx, my, mz;  // positive magnetometer measurements
+  uint8_t confSave;
+  uint8_t timeout = 20;
 
-  // // Save register values
-  // if (i2cdevReadByte(I2Cx, devAddr, AK8963_RA_CNTL, &confSave) == false)
-  // {
-  //   // TODO: error handling
-  //   return false;
-  // }
+  // Save register values
+  if (i2cdevReadByte(I2Cx, devAddr, AK8963_RA_CNTL, &confSave) == false)
+  {
+    // TODO: error handling
+    return false;
+  }
 
-  // // Power down
-  // ak8963SetMode(AK8963_MODE_POWERDOWN);
-  // ak8963SetSelfTest(true);
-  // ak8963SetMode(AK8963_MODE_16BIT | AK8963_MODE_SELFTEST);
-  // // Clear ST1 by reading ST2
-  // ak8963GetOverflowStatus();
-  // while (!ak8963GetDataReady() && timeout--)
-  // {
-  //   vTaskDelay(M2T(1));
-  // }
-  // ak8963GetHeading(&mx, &my, &mz);
-  // // Power down
-  // ak8963SetMode(AK8963_MODE_POWERDOWN);
+  // Power down
+  ak8963SetMode(AK8963_MODE_POWERDOWN);
+  ak8963SetSelfTest(true);
+  ak8963SetMode(AK8963_MODE_16BIT | AK8963_MODE_SELFTEST);
+  // Clear ST1 by reading ST2
+  ak8963GetOverflowStatus();
+  while (!ak8963GetDataReady() && timeout--)
+  {
+    vTaskDelay(M2T(1));
+  }
+  ak8963GetHeading(&mx, &my, &mz);
+  // Power down
+  ak8963SetMode(AK8963_MODE_POWERDOWN);
 
-  // if (ak8963EvaluateSelfTest(AK8963_ST_X_MIN, AK8963_ST_X_MAX, mx, "X") &&
-  //     ak8963EvaluateSelfTest(AK8963_ST_Y_MIN, AK8963_ST_Y_MAX, my, "Y") &&
-  //     ak8963EvaluateSelfTest(AK8963_ST_Z_MIN, AK8963_ST_Z_MAX, mz, "Z"))
-  //  {
-  //   DEBUG_PRINT("Self test [OK].\n");
-  // }
-  // else
-  // {
-  //   testStatus = false;
-  // }
+  if (ak8963EvaluateSelfTest(AK8963_ST_X_MIN, AK8963_ST_X_MAX, mx, "X") &&
+      ak8963EvaluateSelfTest(AK8963_ST_Y_MIN, AK8963_ST_Y_MAX, my, "Y") &&
+      ak8963EvaluateSelfTest(AK8963_ST_Z_MIN, AK8963_ST_Z_MAX, mz, "Z"))
+   {
+    DEBUG_PRINT("Self test [OK].\n");
+  }
+  else
+  {
+    testStatus = false;
+  }
 
-  // // Power up with saved config
-  // ak8963SetMode(confSave);
+  // Power up with saved config
+  ak8963SetMode(confSave);
 
   return testStatus;
 }
@@ -130,13 +127,12 @@ bool ak8963SelfTest()
  */
 static bool ak8963EvaluateSelfTest(int16_t min, int16_t max, int16_t value, char* string)
 {
-  //COMMENTED FIRMWARE
-  // if (value < min || value > max)
-  // {
-  //   DEBUG_PRINT("Self test %s [FAIL]. low: %d, high: %d, measured: %d\n",
-  //               string, min, max, value);
-  //   return false;
-  // }
+  if (value < min || value > max)
+  {
+    DEBUG_PRINT("Self test %s [FAIL]. low: %d, high: %d, measured: %d\n",
+                string, min, max, value);
+    return false;
+  }
   return true;
 }
 
@@ -144,8 +140,7 @@ static bool ak8963EvaluateSelfTest(int16_t min, int16_t max, int16_t value, char
 
 uint8_t ak8963GetDeviceID()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, AK8963_RA_WIA, buffer);
+  i2cdevReadByte(I2Cx, devAddr, AK8963_RA_WIA, buffer);
   return buffer[0];
 }
 
@@ -153,8 +148,7 @@ uint8_t ak8963GetDeviceID()
 
 uint8_t ak8963GetInfo()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, AK8963_RA_INFO, buffer);
+  i2cdevReadByte(I2Cx, devAddr, AK8963_RA_INFO, buffer);
   return buffer[0];
 }
 
@@ -162,8 +156,7 @@ uint8_t ak8963GetInfo()
 
 bool ak8963GetDataReady()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBit(I2Cx, devAddr, AK8963_RA_ST1, AK8963_ST1_DRDY_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, AK8963_RA_ST1, AK8963_ST1_DRDY_BIT, buffer);
   return buffer[0];
 }
 
@@ -172,131 +165,112 @@ void ak8963GetHeading(int16_t *x, int16_t *y, int16_t *z)
 {
 //  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
 //  delay(10);
-//COMMENTED FIRMWARE
-  // i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HXL, 6, buffer);
-  // *x = (((int16_t) buffer[1]) << 8) | buffer[0];
-  // *y = (((int16_t) buffer[3]) << 8) | buffer[2];
-  // *z = (((int16_t) buffer[5]) << 8) | buffer[4];
+  i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HXL, 6, buffer);
+  *x = (((int16_t) buffer[1]) << 8) | buffer[0];
+  *y = (((int16_t) buffer[3]) << 8) | buffer[2];
+  *z = (((int16_t) buffer[5]) << 8) | buffer[4];
 }
 int16_t ak8963GetHeadingX()
 {
-  //COMMENTED FIRMWARE
-//   i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
-// //  delay(10);
-//   i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HXL, 2, buffer);
-//   return (((int16_t) buffer[1]) << 8) | buffer[0];
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
+//  delay(10);
+  i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HXL, 2, buffer);
+  return (((int16_t) buffer[1]) << 8) | buffer[0];
 }
 int16_t ak8963GetHeadingY()
 {
-  //COMMENTED FIRMWARE
-//   i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
-// //  delay(10);
-//   i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HYL, 2, buffer);
-//   return (((int16_t) buffer[1]) << 8) | buffer[0];
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
+//  delay(10);
+  i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HYL, 2, buffer);
+  return (((int16_t) buffer[1]) << 8) | buffer[0];
 }
 int16_t ak8963GetHeadingZ()
 {
-  //COMMENTED FIRMWARE
-//   i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
-// //  delay(10);
-//   i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HZL, 2, buffer);
-//   return (((int16_t) buffer[1]) << 8) | buffer[0];
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_MODE_SINGLE);
+//  delay(10);
+  i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_HZL, 2, buffer);
+  return (((int16_t) buffer[1]) << 8) | buffer[0];
 }
 
 // ST2 register
 bool ak8963GetOverflowStatus()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBit(I2Cx, devAddr, AK8963_RA_ST2, AK8963_ST2_HOFL_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, AK8963_RA_ST2, AK8963_ST2_HOFL_BIT, buffer);
   return buffer[0];
 }
 bool ak8963GetDataError()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBit(I2Cx, devAddr, AK8963_RA_ST2, AK8963_ST2_DERR_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, AK8963_RA_ST2, AK8963_ST2_DERR_BIT, buffer);
   return buffer[0];
 }
 
 // CNTL register
 uint8_t ak8963GetMode()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, AK8963_RA_CNTL, buffer);
+  i2cdevReadByte(I2Cx, devAddr, AK8963_RA_CNTL, buffer);
   return buffer[0];
 }
 void ak8963SetMode(uint8_t mode)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, mode);
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_CNTL, mode);
 }
 void ak8963Reset()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteBits(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_CNTL_MODE_BIT,
+  i2cdevWriteBits(I2Cx, devAddr, AK8963_RA_CNTL, AK8963_CNTL_MODE_BIT,
       AK8963_CNTL_MODE_LENGTH, AK8963_MODE_POWERDOWN);
 }
 
 // ASTC register
 void ak8963SetSelfTest(bool enabled)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteBit(I2Cx, devAddr, AK8963_RA_ASTC, AK8963_ASTC_SELF_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, AK8963_RA_ASTC, AK8963_ASTC_SELF_BIT, enabled);
 }
 
 // I2CDIS
 void ak8963DisableI2C()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteBit(I2Cx, devAddr, AK8963_RA_I2CDIS, AK8963_I2CDIS_BIT, true);
+  i2cdevWriteBit(I2Cx, devAddr, AK8963_RA_I2CDIS, AK8963_I2CDIS_BIT, true);
 }
 
 // ASA* registers
 void ak8963GetAdjustment(int8_t *x, int8_t *y, int8_t *z)
 {
-  //COMMENTED FIRMWARE
-  // i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_ASAX, 3, buffer);
-  // *x = buffer[0];
-  // *y = buffer[1];
-  // *z = buffer[2];
+  i2cdevReadReg8(I2Cx, devAddr, AK8963_RA_ASAX, 3, buffer);
+  *x = buffer[0];
+  *y = buffer[1];
+  *z = buffer[2];
 }
 void ak8963SetAdjustment(int8_t x, int8_t y, int8_t z)
 {
-  //COMMENTED FIRMWARE
-  // buffer[0] = x;
-  // buffer[1] = y;
-  // buffer[2] = z;
-  // i2cdevWriteReg8(I2Cx, devAddr, AK8963_RA_ASAX, 3, buffer);
+  buffer[0] = x;
+  buffer[1] = y;
+  buffer[2] = z;
+  i2cdevWriteReg8(I2Cx, devAddr, AK8963_RA_ASAX, 3, buffer);
 }
 uint8_t ak8963GetAdjustmentX()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, AK8963_RA_ASAX, buffer);
+  i2cdevReadByte(I2Cx, devAddr, AK8963_RA_ASAX, buffer);
   return buffer[0];
 }
 void ak8963SetAdjustmentX(uint8_t x)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_ASAX, x);
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_ASAX, x);
 }
 uint8_t ak8963GetAdjustmentY()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, AK8963_RA_ASAY, buffer);
+  i2cdevReadByte(I2Cx, devAddr, AK8963_RA_ASAY, buffer);
   return buffer[0];
 }
 void ak8963SetAdjustmentY(uint8_t y)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_ASAY, y);
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_ASAY, y);
 }
 uint8_t ak8963GetAdjustmentZ()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, AK8963_RA_ASAZ, buffer);
+  i2cdevReadByte(I2Cx, devAddr, AK8963_RA_ASAZ, buffer);
   return buffer[0];
 }
 void ak8963SetAdjustmentZ(uint8_t z)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_ASAZ, z);
+  i2cdevWriteByte(I2Cx, devAddr, AK8963_RA_ASAZ, z);
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/cppm.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/cppm.c
index a3cf95cee..e0ac6de67 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/cppm.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/cppm.c
@@ -65,43 +65,42 @@ static bool isAvailible;
 
 void cppmInit(void)
 {
-  //COMMENTED FIRMWARE
-  // TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-  // TIM_ICInitTypeDef  TIM_ICInitStructure;
-  // GPIO_InitTypeDef GPIO_InitStructure;
-  // NVIC_InitTypeDef NVIC_InitStructure;
-
-  // RCC_AHB1PeriphClockCmd(CPPM_GPIO_RCC, ENABLE);
-  // RCC_APB1PeriphClockCmd(CPPM_TIMER_RCC, ENABLE);
-
-  // // Configure the GPIO for the timer input
-  // GPIO_StructInit(&GPIO_InitStructure);
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
-  // GPIO_InitStructure.GPIO_Pin = CPPM_GPIO_PIN;
-  // GPIO_Init(CPPM_GPIO_PORT, &GPIO_InitStructure);
-
-  // GPIO_PinAFConfig(CPPM_GPIO_PORT, CPPM_GPIO_SOURCE, CPPM_GPIO_AF);
-
-  // // Time base configuration. 1us tick.
-  // TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
-  // TIM_TimeBaseStructure.TIM_Prescaler = CPPM_TIM_PRESCALER;
-  // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-  // TIM_TimeBaseInit(CPPM_TIMER, &TIM_TimeBaseStructure);
-
-  // // Setup input capture using default config.
-  // TIM_ICStructInit(&TIM_ICInitStructure);
-  // TIM_ICInit(CPPM_TIMER, &TIM_ICInitStructure);
-
-  // NVIC_InitStructure.NVIC_IRQChannel = TIM8_TRG_COM_TIM14_IRQn;
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_CPPM_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // NVIC_Init(&NVIC_InitStructure);
-
-  // captureQueue = STATIC_MEM_QUEUE_CREATE(captureQueue);
-
-  // TIM_ITConfig(CPPM_TIMER, TIM_IT_Update | TIM_IT_CC1, ENABLE);
-  // TIM_Cmd(CPPM_TIMER, ENABLE);
+  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+  TIM_ICInitTypeDef  TIM_ICInitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
+
+  RCC_AHB1PeriphClockCmd(CPPM_GPIO_RCC, ENABLE);
+  RCC_APB1PeriphClockCmd(CPPM_TIMER_RCC, ENABLE);
+
+  // Configure the GPIO for the timer input
+  GPIO_StructInit(&GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_Pin = CPPM_GPIO_PIN;
+  GPIO_Init(CPPM_GPIO_PORT, &GPIO_InitStructure);
+
+  GPIO_PinAFConfig(CPPM_GPIO_PORT, CPPM_GPIO_SOURCE, CPPM_GPIO_AF);
+
+  // Time base configuration. 1us tick.
+  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
+  TIM_TimeBaseStructure.TIM_Prescaler = CPPM_TIM_PRESCALER;
+  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+  TIM_TimeBaseInit(CPPM_TIMER, &TIM_TimeBaseStructure);
+
+  // Setup input capture using default config.
+  TIM_ICStructInit(&TIM_ICInitStructure);
+  TIM_ICInit(CPPM_TIMER, &TIM_ICInitStructure);
+
+  NVIC_InitStructure.NVIC_IRQChannel = TIM8_TRG_COM_TIM14_IRQn;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_CPPM_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
+
+  captureQueue = STATIC_MEM_QUEUE_CREATE(captureQueue);
+
+  TIM_ITConfig(CPPM_TIMER, TIM_IT_Update | TIM_IT_CC1, ENABLE);
+  TIM_Cmd(CPPM_TIMER, ENABLE);
 }
 
 bool cppmIsAvailible(void)
@@ -155,33 +154,32 @@ uint16_t cppmConvert2uint16(uint16_t timestamp)
 
 void __attribute__((used)) TIM8_TRG_COM_TIM14_IRQHandler()
 {
-  //COMMENTED FIRMWARE
-  // uint16_t capureVal;
-  // uint16_t capureValDiff;
-  // portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
-
-  // if (TIM_GetITStatus(CPPM_TIMER, TIM_IT_CC1) != RESET)
-  // {
-  //   if (TIM_GetFlagStatus(CPPM_TIMER, TIM_FLAG_CC1OF) != RESET)
-  //   {
-  //     //TODO: Handle overflow error
-  //   }
-
-  //   capureVal = TIM_GetCapture1(CPPM_TIMER);
-  //   capureValDiff = capureVal - prevCapureVal;
-  //   prevCapureVal = capureVal;
-
-  //   xQueueSendFromISR(captureQueue, &capureValDiff, &xHigherPriorityTaskWoken);
-
-  //   captureFlag = true;
-  //   TIM_ClearITPendingBit(CPPM_TIMER, TIM_IT_CC1);
-  // }
-
-  // if (TIM_GetITStatus(CPPM_TIMER, TIM_IT_Update) != RESET)
-  // {
-  //   // Update input status
-  //   isAvailible = (captureFlag == true);
-  //   captureFlag = false;
-  //   TIM_ClearITPendingBit(CPPM_TIMER, TIM_IT_Update);
-  // }
+  uint16_t capureVal;
+  uint16_t capureValDiff;
+  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+  if (TIM_GetITStatus(CPPM_TIMER, TIM_IT_CC1) != RESET)
+  {
+    if (TIM_GetFlagStatus(CPPM_TIMER, TIM_FLAG_CC1OF) != RESET)
+    {
+      //TODO: Handle overflow error
+    }
+
+    capureVal = TIM_GetCapture1(CPPM_TIMER);
+    capureValDiff = capureVal - prevCapureVal;
+    prevCapureVal = capureVal;
+
+    xQueueSendFromISR(captureQueue, &capureValDiff, &xHigherPriorityTaskWoken);
+
+    captureFlag = true;
+    TIM_ClearITPendingBit(CPPM_TIMER, TIM_IT_CC1);
+  }
+
+  if (TIM_GetITStatus(CPPM_TIMER, TIM_IT_Update) != RESET)
+  {
+    // Update input status
+    isAvailible = (captureFlag == true);
+    captureFlag = false;
+    TIM_ClearITPendingBit(CPPM_TIMER, TIM_IT_Update);
+  }
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/eeprom.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/eeprom.c
index 422e688eb..9aedf5cc5 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/eeprom.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/eeprom.c
@@ -131,8 +131,7 @@ bool eepromTestConnection(void)
   if (!isInit)
     return false;
 
-  //COMMENTED FIRMWARE
-  status = true;//i2cdevRead16(I2Cx, devAddr, 0, 1, &tmp);
+  status = i2cdevRead16(I2Cx, devAddr, 0, 1, &tmp);
 
   return status;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/exti.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/exti.c
index 79810be14..86675d7a0 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/exti.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/exti.c
@@ -40,46 +40,46 @@ void extiInit()
 
   if (isInit)
     return;
-  //COMMENTED FIRMWARE
-  // // This is required for the EXTI interrupt configuration since EXTI
-  // // lines are set via the SYSCFG peripheral; eg.
-  // // SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
-  // RCC_AHB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
 
-  // // Here we enable all EXTI interrupt handlers to save conflicting
-  // // reinitialization code for the 9_5 and 15_10 handlers. Note that
-  // // the individual EXTI interrupts still need to be enabled.
+  // This is required for the EXTI interrupt configuration since EXTI
+  // lines are set via the SYSCFG peripheral; eg.
+  // SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
+  RCC_AHB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
 
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  // Here we enable all EXTI interrupt handlers to save conflicting
+  // reinitialization code for the 9_5 and 15_10 handlers. Note that
+  // the individual EXTI interrupts still need to be enabled.
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI0_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI1_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI0_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI2_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI1_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI3_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI2_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI4_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI3_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI9_5_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI4_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI15_10_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI9_5_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
+
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EXTI15_10_PRI;
+  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
+  NVIC_Init(&NVIC_InitStructure);
 
   isInit = true;
 }
@@ -91,107 +91,100 @@ bool extiTest(void)
 
 void __attribute__((used)) EXTI0_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI0_IRQn);
-  // EXTI_ClearITPendingBit(EXTI_Line0);
-  // EXTI0_Callback();
+  NVIC_ClearPendingIRQ(EXTI0_IRQn);
+  EXTI_ClearITPendingBit(EXTI_Line0);
+  EXTI0_Callback();
 }
 
 void __attribute__((used)) EXTI1_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI1_IRQn);
-  // EXTI_ClearITPendingBit(EXTI_Line1);
-  // EXTI1_Callback();
+  NVIC_ClearPendingIRQ(EXTI1_IRQn);
+  EXTI_ClearITPendingBit(EXTI_Line1);
+  EXTI1_Callback();
 }
 
 void __attribute__((used)) EXTI2_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI2_IRQn);
-  // EXTI_ClearITPendingBit(EXTI_Line2);
-  // EXTI2_Callback();
+  NVIC_ClearPendingIRQ(EXTI2_IRQn);
+  EXTI_ClearITPendingBit(EXTI_Line2);
+  EXTI2_Callback();
 }
 
 void __attribute__((used)) EXTI3_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI3_IRQn);
-  // EXTI_ClearITPendingBit(EXTI_Line3);
-  // EXTI3_Callback();
+  NVIC_ClearPendingIRQ(EXTI3_IRQn);
+  EXTI_ClearITPendingBit(EXTI_Line3);
+  EXTI3_Callback();
 }
 
 void __attribute__((used)) EXTI4_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI4_IRQn);
-  // EXTI_ClearITPendingBit(EXTI_Line4);
-  // EXTI4_Callback();
+  NVIC_ClearPendingIRQ(EXTI4_IRQn);
+  EXTI_ClearITPendingBit(EXTI_Line4);
+  EXTI4_Callback();
 }
 
 void __attribute__((used)) EXTI9_5_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
-  // if (EXTI_GetITStatus(EXTI_Line5) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line5);
-  //   EXTI5_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line6) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line6);
-  //   EXTI6_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line7) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line7);
-  //   EXTI7_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line8) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line8);
-  //   EXTI8_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line9) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line9);
-  //   EXTI9_Callback();
-  // }
+  NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
+  if (EXTI_GetITStatus(EXTI_Line5) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line5);
+    EXTI5_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line6) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line6);
+    EXTI6_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line7) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line7);
+    EXTI7_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line8) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line8);
+    EXTI8_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line9) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line9);
+    EXTI9_Callback();
+  }
 }
 
 void __attribute__((used)) EXTI15_10_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
-  // if (EXTI_GetITStatus(EXTI_Line10) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line10);
-  //   EXTI10_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line11) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line11);
-  //   EXTI11_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line12) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line12);
-  //   EXTI12_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line13) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line13);
-  //   EXTI13_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line14) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line14);
-  //   EXTI14_Callback();
-  // }
-
-  // if (EXTI_GetITStatus(EXTI_Line15) == SET) {
-  //   EXTI_ClearITPendingBit(EXTI_Line15);
-  //   EXTI15_Callback();
-  // }
+  NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
+  if (EXTI_GetITStatus(EXTI_Line10) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line10);
+    EXTI10_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line11) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line11);
+    EXTI11_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line12) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line12);
+    EXTI12_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line13) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line13);
+    EXTI13_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line14) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line14);
+    EXTI14_Callback();
+  }
+
+  if (EXTI_GetITStatus(EXTI_Line15) == SET) {
+    EXTI_ClearITPendingBit(EXTI_Line15);
+    EXTI15_Callback();
+  }
 }
 
 void __attribute__((weak)) EXTI0_Callback(void) { }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/fatfs_sd.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/fatfs_sd.c
index 1fe8a06ee..d424cc8c9 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/fatfs_sd.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/fatfs_sd.c
@@ -54,15 +54,14 @@ static int waitForCardReady(sdSpiContext_t *context, UINT timeoutMs) {
   BYTE d;
   uint32_t timeout = timeoutMs;
 
-  //COMMENTED FIRMWARE
-  // while ((d = context->xchgSpi(0xFF)) != 0xFF && timeout)
-  // {
-  //   // Waiting can take a while so release the SPI bus in between
-  //   context->csHigh(0);
-  //   context->delayMs(1);
-  //   context->csLow();
-  //   timeout--;
-  // }
+  while ((d = context->xchgSpi(0xFF)) != 0xFF && timeout)
+  {
+    // Waiting can take a while so release the SPI bus in between
+    context->csHigh(0);
+    context->delayMs(1);
+    context->csLow();
+    timeout--;
+  }
 
   return (d == 0xFF) ? INT_READY : INT_TIMEOUT;
 }
@@ -94,37 +93,36 @@ static int select(sdSpiContext_t *context) {
 /* power on */
 static void powerOn(sdSpiContext_t *context)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t cmdbuff[6];
-  // uint32_t cnt = 0x1FFF;
-
-  // deselect(context);
-  // // Send 80 dummy clocks (10 * 8) to wake up
-  // for (BYTE n = 10; n; n--) {
-  //   context->xchgSpi(0xFF);
-  // }
-  // /* slave select without wait*/
-  // context->csLow();
-
-  // /* make idle state */
-  // cmdbuff[0] = 0x40 | CMD0;   /* CMD0:GO_IDLE_STATE */
-  // cmdbuff[1] = 0;
-  // cmdbuff[2] = 0;
-  // cmdbuff[3] = 0;
-  // cmdbuff[4] = 0;
-  // cmdbuff[5] = 0x95;   /* CRC */
-
-  // context->xmitSpiMulti(cmdbuff, sizeof(cmdbuff));
-
-  // /* wait response */
-  // while ((context->xchgSpi(0xFF) != 0x01) && cnt)
-  // {
-  //   cnt--;
-  // }
-
-  // deselect(context);
-
-  // powerFlag = 1;
+  uint8_t cmdbuff[6];
+  uint32_t cnt = 0x1FFF;
+
+  deselect(context);
+  // Send 80 dummy clocks (10 * 8) to wake up
+  for (BYTE n = 10; n; n--) {
+    context->xchgSpi(0xFF);
+  }
+  /* slave select without wait*/
+  context->csLow();
+
+  /* make idle state */
+  cmdbuff[0] = 0x40 | CMD0;   /* CMD0:GO_IDLE_STATE */
+  cmdbuff[1] = 0;
+  cmdbuff[2] = 0;
+  cmdbuff[3] = 0;
+  cmdbuff[4] = 0;
+  cmdbuff[5] = 0x95;   /* CRC */
+
+  context->xmitSpiMulti(cmdbuff, sizeof(cmdbuff));
+
+  /* wait response */
+  while ((context->xchgSpi(0xFF) != 0x01) && cnt)
+  {
+    cnt--;
+  }
+
+  deselect(context);
+
+  powerFlag = 1;
 }
 
 /* power off */
@@ -141,52 +139,50 @@ static uint8_t checkPower(sdSpiContext_t *context)
 
 
 static int receiveDataBlock(sdSpiContext_t *context, BYTE *data, UINT length) {
-  //COMMENTED FIRMWARE
-  // BYTE token;
+  BYTE token;
 
-  // context->timer1 = 2; // In centi-seconds
-  // do {
-  //   token = context->xchgSpi(0xFF);
-  // } while ((token == 0xFF) && context->timer1);
+  context->timer1 = 2; // In centi-seconds
+  do {
+    token = context->xchgSpi(0xFF);
+  } while ((token == 0xFF) && context->timer1);
 
-  // if(token != 0xFE){
-  //   return INT_ERROR;
-  // }
+  if(token != 0xFE){
+    return INT_ERROR;
+  }
 
-  // // Store trailing data to the buffer
-  // context->rcvrSpiMulti(data, length);
+  // Store trailing data to the buffer
+  context->rcvrSpiMulti(data, length);
 
-  // // Discard CRC
-  // context->xchgSpi(0xFF);
-  // context->xchgSpi(0xFF);
+  // Discard CRC
+  context->xchgSpi(0xFF);
+  context->xchgSpi(0xFF);
 
   return INT_READY;
 }
 
 
 static int transmitDataBlock(sdSpiContext_t *context, const BYTE *data, BYTE token) {
-  //COMMENTED FIRMWARE
-  // if (!waitForCardReady(context, 500)) {
-  //   return INT_TIMEOUT;
-  // }
+  if (!waitForCardReady(context, 500)) {
+    return INT_TIMEOUT;
+  }
   
-  // context->xchgSpi(token);
+  context->xchgSpi(token);
 
-  // // Send data if token is other than StopTran
-  // if (token != 0xFD) {
-  //   context->xmitSpiMulti(data, 512);
+  // Send data if token is other than StopTran
+  if (token != 0xFD) {
+    context->xmitSpiMulti(data, 512);
 
-  //   // Dummy CRC
-  //   context->xchgSpi(0xFF);
-  //   context->xchgSpi(0xFF);
+    // Dummy CRC
+    context->xchgSpi(0xFF);
+    context->xchgSpi(0xFF);
 
-  //   BYTE resp = context->xchgSpi(0xFF);
+    BYTE resp = context->xchgSpi(0xFF);
 
-  //   if ((resp & 0x1F) != 0x05) {
-  //     // Data packet was not accepted
-  //     return INT_ERROR;
-  //   }
-  // }
+    if ((resp & 0x1F) != 0x05) {
+      // Data packet was not accepted
+      return INT_ERROR;
+    }
+  }
 
   return INT_READY;
 }
@@ -194,60 +190,60 @@ static int transmitDataBlock(sdSpiContext_t *context, const BYTE *data, BYTE tok
 
 static BYTE sendCommand(sdSpiContext_t *context, BYTE cmd, DWORD arg) {
   BYTE cmdbuff[6];
-  //COMMENTED FIRMWARE
-  // // Send a CMD55 prior to ACMD<n>
-  // if (cmd & 0x80) {
-  //   cmd &= 0x7F;
-  //   BYTE res = sendCommand(context, CMD55, 0);
 
-  //   if (res > 1) {
-  //     return res;
-  //   }
-  // }
+  // Send a CMD55 prior to ACMD<n>
+  if (cmd & 0x80) {
+    cmd &= 0x7F;
+    BYTE res = sendCommand(context, CMD55, 0);
+
+    if (res > 1) {
+      return res;
+    }
+  }
 
 
-  // if (waitForCardReady(context, 500) != INT_READY) {
-  //   return INT_ERROR;
-  // }
+  if (waitForCardReady(context, 500) != INT_READY) {
+    return INT_ERROR;
+  }
 
 
-  // // Start + command index
-  // cmdbuff[0] = (0x40 | cmd);
+  // Start + command index
+  cmdbuff[0] = (0x40 | cmd);
 
-  // // Argument[31..24]
-  // cmdbuff[1] = ((BYTE)(arg >> 24));
-  // // Argument[23..16]
-  // cmdbuff[2] = ((BYTE)(arg >> 16));
-  // // Argument[15..8]
-  // cmdbuff[3] = ((BYTE)(arg >> 8));
-  // // Argument[7..0]
-  // cmdbuff[4] = ((BYTE)arg);
+  // Argument[31..24]
+  cmdbuff[1] = ((BYTE)(arg >> 24));
+  // Argument[23..16]
+  cmdbuff[2] = ((BYTE)(arg >> 16));
+  // Argument[15..8]
+  cmdbuff[3] = ((BYTE)(arg >> 8));
+  // Argument[7..0]
+  cmdbuff[4] = ((BYTE)arg);
 
-  // // Dummy CRC + Stop
-  // BYTE crc = 0x01;
-  // if (cmd == CMD0) {
-  //   crc = 0x95;
-  // }
-  // if (cmd == CMD8) {
-  //   crc = 0x87;
-  // }
-  // cmdbuff[5] = (crc);
+  // Dummy CRC + Stop
+  BYTE crc = 0x01;
+  if (cmd == CMD0) {
+    crc = 0x95;
+  }
+  if (cmd == CMD8) {
+    crc = 0x87;
+  }
+  cmdbuff[5] = (crc);
 
-  // context->xmitSpiMulti(cmdbuff, 6);
+  context->xmitSpiMulti(cmdbuff, 6);
 
 
-  // if (cmd == CMD12) {
-  //   // Discard one byte when CMD12
-  //   context->xchgSpi(0xFF);
-  // }
+  if (cmd == CMD12) {
+    // Discard one byte when CMD12
+    context->xchgSpi(0xFF);
+  }
 
   // Receive command resp
   {
-    // BYTE maxTries = 10;
-    // BYTE res;
-    // do {
-    //   res = context->xchgSpi(0xFF);
-    // } while ((res & 0x80) && --maxTries);
+    BYTE maxTries = 10;
+    BYTE res;
+    do {
+      res = context->xchgSpi(0xFF);
+    } while ((res & 0x80) && --maxTries);
 
     // Return value: R1 resp (bit7==1:Failed to send)
     return res;
@@ -257,96 +253,95 @@ static BYTE sendCommand(sdSpiContext_t *context, BYTE cmd, DWORD arg) {
 
 DSTATUS SD_disk_initialize(void* usrOps) {
   sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
-  //COMMENTED FIRMWARE
-  // BYTE cardType = 0;
-
-  // if (!usrOps) {
-  //   return RES_PARERR;
-  // }
-
-  // context->initSpi();
-
-  // // Check is card is inserted
-  // if (context->stat & STA_NODISK) {
-  //   return context->stat;
-  // }
-
-  // if (checkPower(context))
-  // {
-  //   powerOff(context);
-  // }
-
-  // context->setSlowSpiMode();
-
-  // powerOn(context);
-
-  // if (select(context) == INT_READY)
-  // {
-  //   // Put the card SPI/Idle state
-  //   if (sendCommand(context, CMD0, 0) == 1) {
-  //     context->timer1 = 10;
-
-  //     // SDv2?
-  //     if (sendCommand(context, CMD8, 0x1AA) == 1) {
-  //       BYTE ocr[4];
-
-  //       // Get 32 bit return value of R7 resp
-  //       for (BYTE n = 0; n < 4; n++) {
-  //         ocr[n] = context->xchgSpi(0xFF);
-  //       }
-
-  //       // Does the card support vcc of 2.7-3.6V?
-  //       if (ocr[2] == 0x01 && ocr[3] == 0xAA) {
-  //         // Wait for end of initialization with ACMD41(HCS)
-  //         while (context->timer1 && sendCommand(context, ACMD41, 1UL << 30)) { /* Do nothing */ }
-
-  //         // Check CCS bit in the OCR
-  //         if (context->timer1 && sendCommand(context, CMD58, 0) == 0) {
-  //           for (BYTE n = 0; n < 4; n++) {
-  //             ocr[n] = context->xchgSpi(0xFF);
-  //           }
-
-  //           // Card id SDv2
-  //           cardType = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;
-  //         }
-  //       }
-  //     } else {
-  //       BYTE cmd;
-
-  //       // SDv1 or MMC?
-  //       if (sendCommand(context, ACMD41, 0) <= 1)  {
-  //         // SDv1
-  //         cardType = CT_SD1;
-  //         cmd = ACMD41;
-  //       } else {
-  //         // MMCv3
-  //         cardType = CT_MMC;
-  //         cmd = CMD1;
-  //       }
-
-  //       // Wait for end of initialization
-  //       while (context->timer1 && sendCommand(context, cmd, 0)) { /* Do nothing */ }
-
-  //       // Set block length to 512
-  //       if (!context->timer1 || sendCommand(context, CMD16, 512) != 0) {
-  //         cardType = 0;
-  //       }
-  //     }
-  //   }
-
-  //   context->cardType = cardType;
-  //   deselect(context);
-  // }
-
-  // if (cardType) {
-  //   // OK
-  //   context->setFastSpiMode();
-
-  //   // Clear STA_NOINIT flag
-  //   context->stat &= ~STA_NOINIT;
-  // } else {   /* Failed */
-  //   context->stat = STA_NOINIT;
-  // }
+  BYTE cardType = 0;
+
+  if (!usrOps) {
+    return RES_PARERR;
+  }
+
+  context->initSpi();
+
+  // Check is card is inserted
+  if (context->stat & STA_NODISK) {
+    return context->stat;
+  }
+
+  if (checkPower(context))
+  {
+    powerOff(context);
+  }
+
+  context->setSlowSpiMode();
+
+  powerOn(context);
+
+  if (select(context) == INT_READY)
+  {
+    // Put the card SPI/Idle state
+    if (sendCommand(context, CMD0, 0) == 1) {
+      context->timer1 = 10;
+
+      // SDv2?
+      if (sendCommand(context, CMD8, 0x1AA) == 1) {
+        BYTE ocr[4];
+
+        // Get 32 bit return value of R7 resp
+        for (BYTE n = 0; n < 4; n++) {
+          ocr[n] = context->xchgSpi(0xFF);
+        }
+
+        // Does the card support vcc of 2.7-3.6V?
+        if (ocr[2] == 0x01 && ocr[3] == 0xAA) {
+          // Wait for end of initialization with ACMD41(HCS)
+          while (context->timer1 && sendCommand(context, ACMD41, 1UL << 30)) { /* Do nothing */ }
+
+          // Check CCS bit in the OCR
+          if (context->timer1 && sendCommand(context, CMD58, 0) == 0) {
+            for (BYTE n = 0; n < 4; n++) {
+              ocr[n] = context->xchgSpi(0xFF);
+            }
+
+            // Card id SDv2
+            cardType = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;
+          }
+        }
+      } else {
+        BYTE cmd;
+
+        // SDv1 or MMC?
+        if (sendCommand(context, ACMD41, 0) <= 1)  {
+          // SDv1
+          cardType = CT_SD1;
+          cmd = ACMD41;
+        } else {
+          // MMCv3
+          cardType = CT_MMC;
+          cmd = CMD1;
+        }
+
+        // Wait for end of initialization
+        while (context->timer1 && sendCommand(context, cmd, 0)) { /* Do nothing */ }
+
+        // Set block length to 512
+        if (!context->timer1 || sendCommand(context, CMD16, 512) != 0) {
+          cardType = 0;
+        }
+      }
+    }
+
+    context->cardType = cardType;
+    deselect(context);
+  }
+
+  if (cardType) {
+    // OK
+    context->setFastSpiMode();
+
+    // Clear STA_NOINIT flag
+    context->stat &= ~STA_NOINIT;
+  } else {   /* Failed */
+    context->stat = STA_NOINIT;
+  }
 
   return context->stat;
 }
@@ -360,246 +355,243 @@ DSTATUS SD_disk_status(void * usrOps) {
 
 
 DRESULT SD_disk_read(BYTE *buff, DWORD sector, UINT count, void * usrOps) {
-  //COMMENTED FIRMWARE
-  // sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
-
-  // if (!usrOps || !count) {
-  //   return RES_PARERR;
-  // }
-
-  // // Check if drive is ready
-  // if (context->stat & STA_NOINIT) {
-  //   return RES_NOTRDY;
-  // }
-
-  // // LBA ot BA conversion (byte addressing cards)
-  // if (!(context->cardType & CT_BLOCK)) {
-  //   sector *= 512;
-  // }
-
-  // if (select(context) == INT_READY)
-  // {
-
-  //   if (count == 1) {
-  //     // Single sector read
-  //     // READ_SINGLE_BLOCK
-  //     if ((sendCommand(context, CMD17, sector) == 0) && receiveDataBlock(context, buff, 512)) {
-  //       count = 0;
-  //     }
-  //   } else {
-  //     // Multiple sector read
-  //     // READ_MULTIPLE_BLOCK
-  //     if (sendCommand(context, CMD18, sector) == 0) {
-  //       do {
-  //         if (!receiveDataBlock(context, buff, 512)) {
-  //           break;
-  //         }
-  //         buff += 512;
-  //       } while (--count);
-
-  //       // STOP_TRANSMISSION
-  //       sendCommand(context, CMD12, 0);
-  //     }
-  //   }
-
-  //   deselect(context);
-  // }
+  sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
+
+  if (!usrOps || !count) {
+    return RES_PARERR;
+  }
+
+  // Check if drive is ready
+  if (context->stat & STA_NOINIT) {
+    return RES_NOTRDY;
+  }
+
+  // LBA ot BA conversion (byte addressing cards)
+  if (!(context->cardType & CT_BLOCK)) {
+    sector *= 512;
+  }
+
+  if (select(context) == INT_READY)
+  {
+
+    if (count == 1) {
+      // Single sector read
+      // READ_SINGLE_BLOCK
+      if ((sendCommand(context, CMD17, sector) == 0) && receiveDataBlock(context, buff, 512)) {
+        count = 0;
+      }
+    } else {
+      // Multiple sector read
+      // READ_MULTIPLE_BLOCK
+      if (sendCommand(context, CMD18, sector) == 0) {
+        do {
+          if (!receiveDataBlock(context, buff, 512)) {
+            break;
+          }
+          buff += 512;
+        } while (--count);
+
+        // STOP_TRANSMISSION
+        sendCommand(context, CMD12, 0);
+      }
+    }
+
+    deselect(context);
+  }
 
   return count ? RES_ERROR : RES_OK;
 }
 
 
 DRESULT SD_disk_write(const BYTE *buff, DWORD sector, UINT count, void * usrOps) {
-  //COMMENTED FIRMWARE
-  // sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
-
-  // if (!usrOps || !count) {
-  //   return RES_PARERR;
-  // }
-
-  // // Check drive status
-  // if (context->stat & STA_NOINIT) {
-  //   return RES_NOTRDY;
-  // }
-
-  // // Check write protect
-  // if (context->stat & STA_PROTECT) {
-  //   return RES_WRPRT;
-  // }
-
-  // // LBA ==> BA conversion (byte addressing cards)
-  // if (!(context->cardType & CT_BLOCK)) {
-  //   sector *= 512;
-  // }
-
-  // if (select(context) == INT_READY)
-  // {
-  //   if (count == 1) {
-  //     // Single sector write
-  //     // WRITE_BLOCK
-  //     if ((sendCommand(context, CMD24, sector) == 0) && transmitDataBlock(context, buff, 0xFE)) {
-  //       count = 0;
-  //     }
-  //   } else {
-  //     // Multiple sector write
-  //     // Set number of sectors
-  //     if (context->cardType & CT_SDC) sendCommand(context, ACMD23, count);
-
-  //     // WRITE_MULTIPLE_BLOCK
-  //     if (sendCommand(context, CMD25, sector) == 0) {
-  //       do {
-  //         if (!transmitDataBlock(context, buff, 0xFC)) {
-  //           break;
-  //         }
-
-  //         buff += 512;
-  //       } while (--count);
-
-  //       // STOP_TRAN
-  //       if (!transmitDataBlock(context, 0, 0xFD)) {
-  //         count = 1;
-  //       }
-  //     }
-  //   }
-
-  //   deselect(context);
-  // }
+  sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
+
+  if (!usrOps || !count) {
+    return RES_PARERR;
+  }
+
+  // Check drive status
+  if (context->stat & STA_NOINIT) {
+    return RES_NOTRDY;
+  }
+
+  // Check write protect
+  if (context->stat & STA_PROTECT) {
+    return RES_WRPRT;
+  }
+
+  // LBA ==> BA conversion (byte addressing cards)
+  if (!(context->cardType & CT_BLOCK)) {
+    sector *= 512;
+  }
+
+  if (select(context) == INT_READY)
+  {
+    if (count == 1) {
+      // Single sector write
+      // WRITE_BLOCK
+      if ((sendCommand(context, CMD24, sector) == 0) && transmitDataBlock(context, buff, 0xFE)) {
+        count = 0;
+      }
+    } else {
+      // Multiple sector write
+      // Set number of sectors
+      if (context->cardType & CT_SDC) sendCommand(context, ACMD23, count);
+
+      // WRITE_MULTIPLE_BLOCK
+      if (sendCommand(context, CMD25, sector) == 0) {
+        do {
+          if (!transmitDataBlock(context, buff, 0xFC)) {
+            break;
+          }
+
+          buff += 512;
+        } while (--count);
+
+        // STOP_TRAN
+        if (!transmitDataBlock(context, 0, 0xFD)) {
+          count = 1;
+        }
+      }
+    }
+
+    deselect(context);
+  }
 
   return count ? RES_ERROR : RES_OK;
 }
 
 
 DRESULT SD_disk_ioctl(BYTE cmd, void* buff, void* usrOps) {
-  //COMMENTED FIRMWARE
-  // sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
-  // BYTE csd[16];
+  sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
+  BYTE csd[16];
 
-  // if (!usrOps) {
-  //   return RES_PARERR;
-  // }
+  if (!usrOps) {
+    return RES_PARERR;
+  }
 
-  // // Check if drive is ready
-  // if (context->stat & STA_NOINIT) {
-  //   return RES_NOTRDY;
-  // }
+  // Check if drive is ready
+  if (context->stat & STA_NOINIT) {
+    return RES_NOTRDY;
+  }
 
   DRESULT res = RES_ERROR;
 
-  // if (select(context) == INT_READY)
-  // {
-  //   switch (cmd) {
-  //     case CTRL_SYNC :
-  //       // Wait for end of internal write process of the drive
-  //       if (waitForCardReady(context, 500)) {
-  //         res = RES_OK;
-  //       }
-  //       break;
-
-  //     case GET_SECTOR_COUNT :
-  //       // Get drive capacity in unit of sector (DWORD)
-  //       if ((sendCommand(context, CMD9, 0) == 0) &&
-  //            receiveDataBlock(context, csd, 16))
-  //       {
-  //         if ((csd[0] >> 6) == 1)
-  //         {
-  //           // SDC ver 2.00
-  //           DWORD csize = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1;
-  //           *(DWORD*)buff = csize << 10;
-  //         } else {
-  //           // SDC ver 1.XX or MMC ver 3
-  //           BYTE n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
-  //           DWORD csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1;
-  //           *(DWORD*)buff = csize << (n - 9);
-  //         }
-  //         res = RES_OK;
-  //       }
-  //       break;
-
-  //     case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */
-  //       if (context->cardType & CT_SD2)
-  //       {
-  //         // SDC ver 2.00
-  //         if (sendCommand(context, ACMD13, 0) == 0)
-  //         {
-  //           // Read SD status
-  //           context->xchgSpi(0xFF);
-  //           if (receiveDataBlock(context, csd, 16))
-  //           {
-  //             // Read partial block
-  //             for (BYTE n = 64 - 16; n; n--)
-  //             {
-  //               // Purge trailing data
-  //               context->xchgSpi(0xFF);
-  //             }
-
-  //             *(DWORD*)buff = 16UL << (csd[10] >> 4);
-  //             res = RES_OK;
-  //           }
-  //         }
-  //       } else {
-  //         // SDC ver 1.XX or MMC
-  //         if ((sendCommand(context, CMD9, 0) == 0) &&
-  //              receiveDataBlock(context, csd, 16))
-  //         {
-  //           // Read CSD
-  //           if (context->cardType & CT_SD1)
-  //           {
-  //             // SDC ver 1.XX
-  //             *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1);
-  //           } else {
-  //             // MMC
-  //             *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1);
-  //           }
-
-  //           res = RES_OK;
-  //         }
-  //       }
-  //       break;
-
-  //     case CTRL_TRIM :
-  //       // Erase a block of sectors (used when _USE_ERASE == 1)
-  //       // Check if the card is SDC
-  //       if (!(context->cardType & CT_SDC)) {
-  //         break;
-  //       }
-
-  //       // Get CSD
-  //       if (SD_disk_ioctl(MMC_GET_CSD, csd, context)) {
-  //         break;
-  //       }
-
-  //       // Check if sector erase can be applied to the card
-  //       if (!(csd[0] >> 6) && !(csd[10] & 0x40)) {
-  //         break;
-  //       }
-
-  //       // Load sector block
-  //       {
-  //         DWORD* dp = buff;
-  //         DWORD st = dp[0];
-  //         DWORD ed = dp[1];
-  //         if (!(context->cardType & CT_BLOCK)) {
-  //           st *= 512;
-  //           ed *= 512;
-  //         }
-
-  //         /* Erase sector block */
-  //         if (sendCommand(context, CMD32, st) == 0 &&
-  //             sendCommand(context, CMD33, ed) == 0 &&
-  //             sendCommand(context, CMD38, 0) == 0 &&
-  //             waitForCardReady(context, 30000)) {
-  //           // FatFs does not check result of this command
-  //           res = RES_OK;
-  //         }
-  //       }
-  //       break;
-
-  //     default:
-  //       res = RES_PARERR;
-  //   }
-
-  //   deselect(context);
-  // }
+  if (select(context) == INT_READY)
+  {
+    switch (cmd) {
+      case CTRL_SYNC :
+        // Wait for end of internal write process of the drive
+        if (waitForCardReady(context, 500)) {
+          res = RES_OK;
+        }
+        break;
+
+      case GET_SECTOR_COUNT :
+        // Get drive capacity in unit of sector (DWORD)
+        if ((sendCommand(context, CMD9, 0) == 0) &&
+             receiveDataBlock(context, csd, 16))
+        {
+          if ((csd[0] >> 6) == 1)
+          {
+            // SDC ver 2.00
+            DWORD csize = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1;
+            *(DWORD*)buff = csize << 10;
+          } else {
+            // SDC ver 1.XX or MMC ver 3
+            BYTE n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
+            DWORD csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1;
+            *(DWORD*)buff = csize << (n - 9);
+          }
+          res = RES_OK;
+        }
+        break;
+
+      case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */
+        if (context->cardType & CT_SD2)
+        {
+          // SDC ver 2.00
+          if (sendCommand(context, ACMD13, 0) == 0)
+          {
+            // Read SD status
+            context->xchgSpi(0xFF);
+            if (receiveDataBlock(context, csd, 16))
+            {
+              // Read partial block
+              for (BYTE n = 64 - 16; n; n--)
+              {
+                // Purge trailing data
+                context->xchgSpi(0xFF);
+              }
+
+              *(DWORD*)buff = 16UL << (csd[10] >> 4);
+              res = RES_OK;
+            }
+          }
+        } else {
+          // SDC ver 1.XX or MMC
+          if ((sendCommand(context, CMD9, 0) == 0) &&
+               receiveDataBlock(context, csd, 16))
+          {
+            // Read CSD
+            if (context->cardType & CT_SD1)
+            {
+              // SDC ver 1.XX
+              *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1);
+            } else {
+              // MMC
+              *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1);
+            }
+
+            res = RES_OK;
+          }
+        }
+        break;
+
+      case CTRL_TRIM :
+        // Erase a block of sectors (used when _USE_ERASE == 1)
+        // Check if the card is SDC
+        if (!(context->cardType & CT_SDC)) {
+          break;
+        }
+
+        // Get CSD
+        if (SD_disk_ioctl(MMC_GET_CSD, csd, context)) {
+          break;
+        }
+
+        // Check if sector erase can be applied to the card
+        if (!(csd[0] >> 6) && !(csd[10] & 0x40)) {
+          break;
+        }
+
+        // Load sector block
+        {
+          DWORD* dp = buff;
+          DWORD st = dp[0];
+          DWORD ed = dp[1];
+          if (!(context->cardType & CT_BLOCK)) {
+            st *= 512;
+            ed *= 512;
+          }
+
+          /* Erase sector block */
+          if (sendCommand(context, CMD32, st) == 0 &&
+              sendCommand(context, CMD33, ed) == 0 &&
+              sendCommand(context, CMD38, 0) == 0 &&
+              waitForCardReady(context, 30000)) {
+            // FatFs does not check result of this command
+            res = RES_OK;
+          }
+        }
+        break;
+
+      default:
+        res = RES_PARERR;
+    }
+
+    deselect(context);
+  }
 
   return res;
 }
@@ -609,29 +601,29 @@ DRESULT SD_disk_ioctl(BYTE cmd, void* buff, void* usrOps) {
 // Changed to 100ms to relax timers as all waits are 200ms or more --TA
 void SD_disk_timerproc (void* usrOps) {
   sdSpiContext_t *context = (sdSpiContext_t *)usrOps;
-  //COMMENTED FIRMWARE
-  // {
-  //   WORD n = context->timer1;
-  //   if (n) {
-  //     context->timer1 = --n;
-  //   }
-  // }
-
-  // {
-  //   WORD n = context->timer2;
-  //   if (n) {
-  //     context->timer2 = --n;
-  //   }
-  // }
+
+  {
+    WORD n = context->timer1;
+    if (n) {
+      context->timer1 = --n;
+    }
+  }
+
+  {
+    WORD n = context->timer2;
+    if (n) {
+      context->timer2 = --n;
+    }
+  }
 
 
   BYTE s = context->stat;
 
-  // // Write enabled
-  // s &= ~STA_PROTECT;
+  // Write enabled
+  s &= ~STA_PROTECT;
 
-  // // Card is in socket
-  // s &= ~STA_NODISK;
+  // Card is in socket
+  s &= ~STA_NODISK;
 
   context->stat = s;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/hmc5883l.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/hmc5883l.c
index da45f4a51..a77e22720 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/hmc5883l.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/hmc5883l.c
@@ -57,18 +57,18 @@ void hmc5883lInit(I2C_Dev *i2cPort)
 {
   if (isInit)
     return;
-  //COMMENTED FIRMWARE
-  // I2Cx = i2cPort;
-  // devAddr = HMC5883L_ADDRESS;
 
-  // // write CONFIG_A register
-  // i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
-  //     (HMC5883L_AVERAGING_8 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
-  //     (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
-  //     (HMC5883L_BIAS_NORMAL << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));
+  I2Cx = i2cPort;
+  devAddr = HMC5883L_ADDRESS;
 
-  // // write CONFIG_B register
-  // hmc5883lSetGain(HMC5883L_GAIN_660);
+  // write CONFIG_A register
+  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
+      (HMC5883L_AVERAGING_8 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
+      (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
+      (HMC5883L_BIAS_NORMAL << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));
+
+  // write CONFIG_B register
+  hmc5883lSetGain(HMC5883L_GAIN_660);
 
   isInit = true;
 }
@@ -79,11 +79,10 @@ void hmc5883lInit(I2C_Dev *i2cPort)
  */
 bool hmc5883lTestConnection()
 {
-  //COMMENTED FIRMWARE
-  // if (i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_ID_A, 3, buffer))
-  // {
-  //   return (buffer[0] == 'H' && buffer[1] == '4' && buffer[2] == '3');
-  // }
+  if (i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_ID_A, 3, buffer))
+  {
+    return (buffer[0] == 'H' && buffer[1] == '4' && buffer[2] == '3');
+  }
 
   return false;
 }
@@ -94,67 +93,66 @@ bool hmc5883lTestConnection()
 bool hmc5883lSelfTest()
 {
   bool testStatus = true;
-  //COMMENTED FIRMWARE
-  // int16_t mxp, myp, mzp;  // positive magnetometer measurements
-  // int16_t mxn, myn, mzn;  // negative magnetometer measurements
-  // struct
-  // {
-  //   uint8_t configA;
-  //   uint8_t configB;
-  //   uint8_t mode;
-  // } regSave;
-
-  // // Save register values
-  // if (i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, sizeof(regSave), (uint8_t *)&regSave) == false)
-  // {
-  //   // TODO: error handling
-  //   return false;
-  // }
-  // // Set gain (sensitivity)
-  // hmc5883lSetGain(HMC5883L_ST_GAIN);
-
-  // // Write CONFIG_A register and do positive test
-  // i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
-  //     (HMC5883L_AVERAGING_1 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
-  //     (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
-  //     (HMC5883L_BIAS_POSITIVE << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));
-
-  // /* Perform test measurement & check results */
-  // hmc5883lSetMode(HMC5883L_MODE_SINGLE);
-  // vTaskDelay(M2T(HMC5883L_ST_DELAY_MS));
-  // hmc5883lGetHeading(&mxp, &myp, &mzp);
-
-  // // Write CONFIG_A register and do negative test
-  // i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
-  //     (HMC5883L_AVERAGING_1 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
-  //     (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
-  //     (HMC5883L_BIAS_NEGATIVE << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));
-
-  // /* Perform test measurement & check results */
-  // hmc5883lSetMode(HMC5883L_MODE_SINGLE);
-  // vTaskDelay(M2T(HMC5883L_ST_DELAY_MS));
-  // hmc5883lGetHeading(&mxn, &myn, &mzn);
-
-  // if (hmc5883lEvaluateSelfTest(HMC5883L_ST_X_MIN, HMC5883L_ST_X_MAX, mxp, "pos X") &&
-  //     hmc5883lEvaluateSelfTest(HMC5883L_ST_Y_MIN, HMC5883L_ST_Y_MAX, myp, "pos Y") &&
-  //     hmc5883lEvaluateSelfTest(HMC5883L_ST_Z_MIN, HMC5883L_ST_Z_MAX, mzp, "pos Z") &&
-  //     hmc5883lEvaluateSelfTest(-HMC5883L_ST_X_MAX, -HMC5883L_ST_X_MIN, mxn, "neg X") &&
-  //     hmc5883lEvaluateSelfTest(-HMC5883L_ST_Y_MAX, -HMC5883L_ST_Y_MIN, myn, "neg Y") &&
-  //     hmc5883lEvaluateSelfTest(-HMC5883L_ST_Z_MAX, -HMC5883L_ST_Z_MIN, mzn, "neg Z"))
-  // {
-  //   DEBUG_PRINT("Self test [OK].\n");
-  // }
-  // else
-  // {
-  //   testStatus = false;
-  // }
-
-  // // Restore registers
-  // if (i2cdevWriteReg8(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, sizeof(regSave), (uint8_t *)&regSave) == false)
-  // {
-  //   // TODO: error handling
-  //   return false;
-  // }
+  int16_t mxp, myp, mzp;  // positive magnetometer measurements
+  int16_t mxn, myn, mzn;  // negative magnetometer measurements
+  struct
+  {
+    uint8_t configA;
+    uint8_t configB;
+    uint8_t mode;
+  } regSave;
+
+  // Save register values
+  if (i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, sizeof(regSave), (uint8_t *)&regSave) == false)
+  {
+    // TODO: error handling
+    return false;
+  }
+  // Set gain (sensitivity)
+  hmc5883lSetGain(HMC5883L_ST_GAIN);
+
+  // Write CONFIG_A register and do positive test
+  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
+      (HMC5883L_AVERAGING_1 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
+      (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
+      (HMC5883L_BIAS_POSITIVE << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));
+
+  /* Perform test measurement & check results */
+  hmc5883lSetMode(HMC5883L_MODE_SINGLE);
+  vTaskDelay(M2T(HMC5883L_ST_DELAY_MS));
+  hmc5883lGetHeading(&mxp, &myp, &mzp);
+
+  // Write CONFIG_A register and do negative test
+  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
+      (HMC5883L_AVERAGING_1 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
+      (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
+      (HMC5883L_BIAS_NEGATIVE << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));
+
+  /* Perform test measurement & check results */
+  hmc5883lSetMode(HMC5883L_MODE_SINGLE);
+  vTaskDelay(M2T(HMC5883L_ST_DELAY_MS));
+  hmc5883lGetHeading(&mxn, &myn, &mzn);
+
+  if (hmc5883lEvaluateSelfTest(HMC5883L_ST_X_MIN, HMC5883L_ST_X_MAX, mxp, "pos X") &&
+      hmc5883lEvaluateSelfTest(HMC5883L_ST_Y_MIN, HMC5883L_ST_Y_MAX, myp, "pos Y") &&
+      hmc5883lEvaluateSelfTest(HMC5883L_ST_Z_MIN, HMC5883L_ST_Z_MAX, mzp, "pos Z") &&
+      hmc5883lEvaluateSelfTest(-HMC5883L_ST_X_MAX, -HMC5883L_ST_X_MIN, mxn, "neg X") &&
+      hmc5883lEvaluateSelfTest(-HMC5883L_ST_Y_MAX, -HMC5883L_ST_Y_MIN, myn, "neg Y") &&
+      hmc5883lEvaluateSelfTest(-HMC5883L_ST_Z_MAX, -HMC5883L_ST_Z_MIN, mzn, "neg Z"))
+  {
+    DEBUG_PRINT("Self test [OK].\n");
+  }
+  else
+  {
+    testStatus = false;
+  }
+
+  // Restore registers
+  if (i2cdevWriteReg8(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, sizeof(regSave), (uint8_t *)&regSave) == false)
+  {
+    // TODO: error handling
+    return false;
+  }
 
   return testStatus;
 }
@@ -168,13 +166,12 @@ bool hmc5883lSelfTest()
  */
 bool hmc5883lEvaluateSelfTest(int16_t min, int16_t max, int16_t value, char* string)
 {
-  //COMMENTED FIRMWARE
-  // if (value < min || value > max)
-  // {
-  //   DEBUG_PRINT("Self test %s [FAIL]. low: %d, high: %d, measured: %d\n",
-  //               string, min, max, value);
-  //   return false;
-  // }
+  if (value < min || value > max)
+  {
+    DEBUG_PRINT("Self test %s [FAIL]. low: %d, high: %d, measured: %d\n",
+                string, min, max, value);
+    return false;
+  }
   return true;
 }
 
@@ -189,8 +186,7 @@ bool hmc5883lEvaluateSelfTest(int16_t min, int16_t max, int16_t value, char* str
  */
 uint8_t hmc5883lGetSampleAveraging()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_AVERAGE_BIT, HMC5883L_CRA_AVERAGE_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_AVERAGE_BIT, HMC5883L_CRA_AVERAGE_LENGTH, buffer);
   return buffer[0];
 }
 /** Set number of samples averaged per measurement.
@@ -201,8 +197,7 @@ uint8_t hmc5883lGetSampleAveraging()
  */
 void hmc5883lSetSampleAveraging(uint8_t averaging)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_AVERAGE_BIT, HMC5883L_CRA_AVERAGE_LENGTH, averaging);
+  i2cdevWriteBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_AVERAGE_BIT, HMC5883L_CRA_AVERAGE_LENGTH, averaging);
 }
 /** Get data output rate value.
  * The Table below shows all selectable output rates in continuous measurement
@@ -229,8 +224,7 @@ void hmc5883lSetSampleAveraging(uint8_t averaging)
  */
 uint8_t hmc5883lGetDataRate()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_RATE_BIT, HMC5883L_CRA_RATE_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_RATE_BIT, HMC5883L_CRA_RATE_LENGTH, buffer);
   return buffer[0];
 }
 /** Set data output rate value.
@@ -243,8 +237,7 @@ uint8_t hmc5883lGetDataRate()
  */
 void hmc5883lSetDataRate(uint8_t rate)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_RATE_BIT, HMC5883L_CRA_RATE_LENGTH, rate);
+  i2cdevWriteBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_RATE_BIT, HMC5883L_CRA_RATE_LENGTH, rate);
 }
 /** Get measurement bias value.
  * @return Current bias value (0-2 for normal/positive/negative respectively)
@@ -255,8 +248,7 @@ void hmc5883lSetDataRate(uint8_t rate)
  */
 uint8_t hmc5883lGetMeasurementBias()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_BIAS_BIT, HMC5883L_CRA_BIAS_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_BIAS_BIT, HMC5883L_CRA_BIAS_LENGTH, buffer);
   return buffer[0];
 }
 /** Set measurement bias value.
@@ -268,8 +260,7 @@ uint8_t hmc5883lGetMeasurementBias()
  */
 void hmc5883lSetMeasurementBias(uint8_t bias)
 {
-  //COMMENTED FIRMWARE
-  //i2cdevWriteBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_BIAS_BIT, HMC5883L_CRA_BIAS_LENGTH, bias);
+  i2cdevWriteBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, HMC5883L_CRA_BIAS_BIT, HMC5883L_CRA_BIAS_LENGTH, bias);
 }
 
 // CONFIG_B register
@@ -299,8 +290,7 @@ void hmc5883lSetMeasurementBias(uint8_t bias)
  */
 uint8_t hmc5883lGetGain()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_B, HMC5883L_CRB_GAIN_BIT, HMC5883L_CRB_GAIN_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_CONFIG_B, HMC5883L_CRB_GAIN_BIT, HMC5883L_CRB_GAIN_LENGTH, buffer);
   return buffer[0];
 }
 /** Set magnetic field gain value.
@@ -315,8 +305,7 @@ void hmc5883lSetGain(uint8_t gain)
   // use this method to guarantee that bits 4-0 are set to zero, which is a
   // requirement specified in the datasheet; it's actually more efficient than
   // using the I2Cdev.writeBits method
-  //COMMENTED FIRMWARE
-  //i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_B, gain << (HMC5883L_CRB_GAIN_BIT - HMC5883L_CRB_GAIN_LENGTH + 1));
+  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_B, gain << (HMC5883L_CRB_GAIN_BIT - HMC5883L_CRB_GAIN_LENGTH + 1));
 }
 
 // MODE register
@@ -345,8 +334,7 @@ void hmc5883lSetGain(uint8_t gain)
  */
 uint8_t hmc5883lGetMode()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODEREG_BIT, HMC5883L_MODEREG_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODEREG_BIT, HMC5883L_MODEREG_LENGTH, buffer);
   return buffer[0];
 }
 /** Set measurement mode.
@@ -364,9 +352,8 @@ void hmc5883lSetMode(uint8_t newMode)
   // use this method to guarantee that bits 7-2 are set to zero, which is a
   // requirement specified in the datasheet; it's actually more efficient than
   // using the I2Cdev.writeBits method
-  //COMMENTED FIRMWARE
-  // i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, mode << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
-  // mode = newMode;// track to tell if we have to clear bit 7 after a read
+  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, mode << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
+  mode = newMode;// track to tell if we have to clear bit 7 after a read
 }
 
 // DATA* registers
@@ -384,12 +371,11 @@ void hmc5883lSetMode(uint8_t newMode)
  */
 void hmc5883lGetHeading(int16_t *x, int16_t *y, int16_t *z)
 {
-  //COMMENTED FIRMWARE
-  // i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
-  // if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
-  // *x = (((int16_t)buffer[0]) << 8) | buffer[1];
-  // *y = (((int16_t)buffer[4]) << 8) | buffer[5];
-  // *z = (((int16_t)buffer[2]) << 8) | buffer[3];
+  i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
+  if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
+  *x = (((int16_t)buffer[0]) << 8) | buffer[1];
+  *y = (((int16_t)buffer[4]) << 8) | buffer[5];
+  *z = (((int16_t)buffer[2]) << 8) | buffer[3];
 }
 /** Get X-axis heading measurement.
  * @return 16-bit signed integer with X-axis heading
@@ -399,9 +385,8 @@ int16_t hmc5883lGetHeadingX()
 {
   // each axis read requires that ALL axis registers be read, even if only
   // one is used; this was not done ineffiently in the code by accident
-  //COMMENTED FIRMWARE
-  // i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
-  // if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
+  i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
+  if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
   return (((int16_t)buffer[0]) << 8) | buffer[1];
 }
 /** Get Y-axis heading measurement.
@@ -412,9 +397,8 @@ int16_t hmc5883lGetHeadingY()
 {
   // each axis read requires that ALL axis registers be read, even if only
   // one is used; this was not done ineffiently in the code by accident
-  //COMMENTED FIRMWARE
-  // i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
-  // if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
+  i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
+  if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
   return (((int16_t)buffer[4]) << 8) | buffer[5];
 }
 /** Get Z-axis heading measurement.
@@ -425,9 +409,8 @@ int16_t hmc5883lGetHeadingZ()
 {
   // each axis read requires that ALL axis registers be read, even if only
   // one is used; this was not done ineffiently in the code by accident
-  //COMMENTED FIRMWARE
-  // i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
-  // if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
+  i2cdevReadReg8(I2Cx, devAddr, HMC5883L_RA_DATAX_H, 6, buffer);
+  if (mode == HMC5883L_MODE_SINGLE) i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_MODE, HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1));
   return (((int16_t)buffer[2]) << 8) | buffer[3];
 }
 
@@ -446,8 +429,7 @@ int16_t hmc5883lGetHeadingZ()
  */
 bool hmc5883lGetLockStatus()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBit(I2Cx, devAddr, HMC5883L_RA_STATUS, HMC5883L_STATUS_LOCK_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, HMC5883L_RA_STATUS, HMC5883L_STATUS_LOCK_BIT, buffer);
   return buffer[0];
 }
 /** Get data ready status.
@@ -462,8 +444,7 @@ bool hmc5883lGetLockStatus()
  */
 bool hmc5883lGetReadyStatus()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadBit(I2Cx, devAddr, HMC5883L_RA_STATUS, HMC5883L_STATUS_READY_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, HMC5883L_RA_STATUS, HMC5883L_STATUS_READY_BIT, buffer);
   return buffer[0];
 }
 
@@ -474,8 +455,7 @@ bool hmc5883lGetReadyStatus()
  */
 uint8_t hmc5883lGetIDA()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, HMC5883L_RA_ID_A, buffer);
+  i2cdevReadByte(I2Cx, devAddr, HMC5883L_RA_ID_A, buffer);
   return buffer[0];
 }
 /** Get identification byte B
@@ -483,8 +463,7 @@ uint8_t hmc5883lGetIDA()
  */
 uint8_t hmc5883lGetIDB()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, HMC5883L_RA_ID_B, buffer);
+  i2cdevReadByte(I2Cx, devAddr, HMC5883L_RA_ID_B, buffer);
   return buffer[0];
 }
 /** Get identification byte C
@@ -492,7 +471,6 @@ uint8_t hmc5883lGetIDB()
  */
 uint8_t hmc5883lGetIDC()
 {
-  //COMMENTED FIRMWARE
-  //i2cdevReadByte(I2Cx, devAddr, HMC5883L_RA_ID_C, buffer);
+  i2cdevReadByte(I2Cx, devAddr, HMC5883L_RA_ID_C, buffer);
   return buffer[0];
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2c_drv.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2c_drv.c
index 869a29ba6..79bd7ed9e 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2c_drv.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2c_drv.c
@@ -221,62 +221,61 @@ static void i2cNotifyClient(I2cDrv* i2c)
 
 static void i2cdrvTryToRestartBus(I2cDrv* i2c)
 {
-  //COMMENTED FIRMWARE
-  // I2C_InitTypeDef I2C_InitStructure;
-  // NVIC_InitTypeDef NVIC_InitStructure;
-  // GPIO_InitTypeDef GPIO_InitStructure;
-
-  // // Enable GPIOA clock
-  // RCC_AHB1PeriphClockCmd(i2c->def->gpioSDAPerif, ENABLE);
-  // RCC_AHB1PeriphClockCmd(i2c->def->gpioSCLPerif, ENABLE);
-  // // Enable I2C_SENSORS clock
-  // RCC_APB1PeriphClockCmd(i2c->def->i2cPerif, ENABLE);
-
-  // // Configure I2C_SENSORS pins to unlock bus.
-  // GPIO_StructInit(&GPIO_InitStructure);
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  // GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
-  // GPIO_InitStructure.GPIO_Pin = i2c->def->gpioSCLPin; // SCL
-  // GPIO_Init(i2c->def->gpioSCLPort, &GPIO_InitStructure);
-  // GPIO_InitStructure.GPIO_Pin =  i2c->def->gpioSDAPin; // SDA
-  // GPIO_Init(i2c->def->gpioSDAPort, &GPIO_InitStructure);
-
-  // i2cdrvdevUnlockBus(i2c->def->gpioSCLPort, i2c->def->gpioSDAPort, i2c->def->gpioSCLPin, i2c->def->gpioSDAPin);
-
-  // // Configure I2C_SENSORS pins for AF.
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
-  // GPIO_InitStructure.GPIO_Pin = i2c->def->gpioSCLPin; // SCL
-  // GPIO_Init(i2c->def->gpioSCLPort, &GPIO_InitStructure);
-  // GPIO_InitStructure.GPIO_Pin =  i2c->def->gpioSDAPin; // SDA
-  // GPIO_Init(i2c->def->gpioSDAPort, &GPIO_InitStructure);
-
-  // //Map gpios to alternate functions
-  // GPIO_PinAFConfig(i2c->def->gpioSCLPort, i2c->def->gpioSCLPinSource, i2c->def->gpioAF);
-  // GPIO_PinAFConfig(i2c->def->gpioSDAPort, i2c->def->gpioSDAPinSource, i2c->def->gpioAF);
-
-  // // I2C_SENSORS configuration
-  // I2C_DeInit(i2c->def->i2cPort);
-  // I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
-  // I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
-  // I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;
-  // I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
-  // I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
-  // I2C_InitStructure.I2C_ClockSpeed = i2c->def->i2cClockSpeed;
-  // I2C_Init(i2c->def->i2cPort, &I2C_InitStructure);
-
-  // // Enable I2C_SENSORS error interrupts
-  // I2C_ITConfig(i2c->def->i2cPort, I2C_IT_ERR, ENABLE);
-
-  // NVIC_InitStructure.NVIC_IRQChannel = i2c->def->i2cEVIRQn;
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // NVIC_Init(&NVIC_InitStructure);
-  // NVIC_InitStructure.NVIC_IRQChannel = i2c->def->i2cERIRQn;
-  // NVIC_Init(&NVIC_InitStructure);
-
-  // i2cdrvDmaSetupBus(i2c);
+  I2C_InitTypeDef I2C_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
+
+  // Enable GPIOA clock
+  RCC_AHB1PeriphClockCmd(i2c->def->gpioSDAPerif, ENABLE);
+  RCC_AHB1PeriphClockCmd(i2c->def->gpioSCLPerif, ENABLE);
+  // Enable I2C_SENSORS clock
+  RCC_APB1PeriphClockCmd(i2c->def->i2cPerif, ENABLE);
+
+  // Configure I2C_SENSORS pins to unlock bus.
+  GPIO_StructInit(&GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
+  GPIO_InitStructure.GPIO_Pin = i2c->def->gpioSCLPin; // SCL
+  GPIO_Init(i2c->def->gpioSCLPort, &GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Pin =  i2c->def->gpioSDAPin; // SDA
+  GPIO_Init(i2c->def->gpioSDAPort, &GPIO_InitStructure);
+
+  i2cdrvdevUnlockBus(i2c->def->gpioSCLPort, i2c->def->gpioSDAPort, i2c->def->gpioSCLPin, i2c->def->gpioSDAPin);
+
+  // Configure I2C_SENSORS pins for AF.
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_Pin = i2c->def->gpioSCLPin; // SCL
+  GPIO_Init(i2c->def->gpioSCLPort, &GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Pin =  i2c->def->gpioSDAPin; // SDA
+  GPIO_Init(i2c->def->gpioSDAPort, &GPIO_InitStructure);
+
+  //Map gpios to alternate functions
+  GPIO_PinAFConfig(i2c->def->gpioSCLPort, i2c->def->gpioSCLPinSource, i2c->def->gpioAF);
+  GPIO_PinAFConfig(i2c->def->gpioSDAPort, i2c->def->gpioSDAPinSource, i2c->def->gpioAF);
+
+  // I2C_SENSORS configuration
+  I2C_DeInit(i2c->def->i2cPort);
+  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
+  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
+  I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;
+  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
+  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
+  I2C_InitStructure.I2C_ClockSpeed = i2c->def->i2cClockSpeed;
+  I2C_Init(i2c->def->i2cPort, &I2C_InitStructure);
+
+  // Enable I2C_SENSORS error interrupts
+  I2C_ITConfig(i2c->def->i2cPort, I2C_IT_ERR, ENABLE);
+
+  NVIC_InitStructure.NVIC_IRQChannel = i2c->def->i2cEVIRQn;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannel = i2c->def->i2cERIRQn;
+  NVIC_Init(&NVIC_InitStructure);
+
+  i2cdrvDmaSetupBus(i2c);
 }
 
 static void i2cdrvDmaSetupBus(I2cDrv* i2c)
@@ -402,27 +401,26 @@ bool i2cdrvMessageTransfer(I2cDrv* i2c, I2cMessage* message)
 {
   bool status = false;
 
-  //COMMENTED FIRMWARE
-  // xSemaphoreTake(i2c->isBusFreeMutex, portMAX_DELAY); // Protect message data
-  // // Copy message
-  // memcpy((char*)&i2c->txMessage, (char*)message, sizeof(I2cMessage));
-  // // We can now start the ISR sending this message.
-  // i2cdrvStartTransfer(i2c);
-  // // Wait for transaction to be done
-  // if (xSemaphoreTake(i2c->isBusFreeSemaphore, I2C_MESSAGE_TIMEOUT) == pdTRUE)
-  // {
-  //   if (i2c->txMessage.status == i2cAck)
-  //   {
-  //     status = true;
-  //   }
-  // }
-  // else
-  // {
-  //   i2cdrvClearDMA(i2c);
-  //   i2cdrvTryToRestartBus(i2c);
-  //   //TODO: If bus is really hanged... fail safe
-  // }
-  // xSemaphoreGive(i2c->isBusFreeMutex);
+  xSemaphoreTake(i2c->isBusFreeMutex, portMAX_DELAY); // Protect message data
+  // Copy message
+  memcpy((char*)&i2c->txMessage, (char*)message, sizeof(I2cMessage));
+  // We can now start the ISR sending this message.
+  i2cdrvStartTransfer(i2c);
+  // Wait for transaction to be done
+  if (xSemaphoreTake(i2c->isBusFreeSemaphore, I2C_MESSAGE_TIMEOUT) == pdTRUE)
+  {
+    if (i2c->txMessage.status == i2cAck)
+    {
+      status = true;
+    }
+  }
+  else
+  {
+    i2cdrvClearDMA(i2c);
+    i2cdrvTryToRestartBus(i2c);
+    //TODO: If bus is really hanged... fail safe
+  }
+  xSemaphoreGive(i2c->isBusFreeMutex);
 
   return status;
 }
@@ -430,214 +428,210 @@ bool i2cdrvMessageTransfer(I2cDrv* i2c, I2cMessage* message)
 
 static void i2cdrvEventIsrHandler(I2cDrv* i2c)
 {
-  //COMMENTED FIRMWARE
-//   uint16_t SR1;
-//   uint16_t SR2;
-
-//   // read the status register first
-//   SR1 = i2c->def->i2cPort->SR1;
-
-// #ifdef I2CDRV_DEBUG_LOG_EVENTS
-//   // Debug code
-//   eventDebug[eventPos][0] = usecTimestamp();
-//   eventDebug[eventPos][1] = SR1;
-//   if (++eventPos == 1024)
-//   {
-//     eventPos = 0;
-//   }
-// #endif
-
-//   // Start bit event
-//   if (SR1 & I2C_SR1_SB)
-//   {
-//     i2c->messageIndex = 0;
-
-//     if(i2c->txMessage.direction == i2cWrite ||
-//        i2c->txMessage.internalAddress != I2C_NO_INTERNAL_ADDRESS)
-//     {
-//       I2C_Send7bitAddress(i2c->def->i2cPort, i2c->txMessage.slaveAddress << 1, I2C_Direction_Transmitter);
-//     }
-//     else
-//     {
-//       I2C_AcknowledgeConfig(i2c->def->i2cPort, ENABLE);
-//       I2C_Send7bitAddress(i2c->def->i2cPort, i2c->txMessage.slaveAddress << 1, I2C_Direction_Receiver);
-//     }
-//   }
-//   // Address event
-//   else if (SR1 & I2C_SR1_ADDR)
-//   {
-//     if(i2c->txMessage.direction == i2cWrite ||
-//        i2c->txMessage.internalAddress != I2C_NO_INTERNAL_ADDRESS)
-//     {
-//       SR2 = i2c->def->i2cPort->SR2;                               // clear ADDR
-//       // In write mode transmit is always empty so can send up to two bytes
-//       if (i2c->txMessage.internalAddress != I2C_NO_INTERNAL_ADDRESS)
-//       {
-//         if (i2c->txMessage.isInternal16bit)
-//         {
-//           I2C_SendData(i2c->def->i2cPort, (i2c->txMessage.internalAddress & 0xFF00) >> 8);
-//           I2C_SendData(i2c->def->i2cPort, (i2c->txMessage.internalAddress & 0x00FF));
-//         }
-//         else
-//         {
-//           I2C_SendData(i2c->def->i2cPort, (i2c->txMessage.internalAddress & 0x00FF));
-//         }
-//         i2c->txMessage.internalAddress = I2C_NO_INTERNAL_ADDRESS;
-//       }
-//       I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, ENABLE);        // allow us to have an EV7
-//     }
-//     else // Reading, start DMA transfer
-//     {
-//       if(i2c->txMessage.messageLength == 1)
-//       {
-//         I2C_AcknowledgeConfig(i2c->def->i2cPort, DISABLE);
-//       }
-//       else
-//       {
-//         I2C_DMALastTransferCmd(i2c->def->i2cPort, ENABLE); // No repetitive start
-//       }
-//       // Disable buffer I2C interrupts
-//       I2C_ITConfig(i2c->def->i2cPort, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
-//       // Enable the Transfer Complete interrupt
-//       DMA_ITConfig(i2c->def->dmaRxStream, DMA_IT_TC | DMA_IT_TE, ENABLE);
-//       I2C_DMACmd(i2c->def->i2cPort, ENABLE); // Enable before ADDR clear
-
-//       // Workaround to enable DMA for Renode simulation.
-//       // The I2C uses the DMA for reading, but the Renode implementation lacks some functionality
-//       // and for a message to be read the DMA needs to be enabled manually.
-//       // Without setting this bit the I2C reading fails.
-//       // With added functionality it should be possible to remove.
-//       DMA_Cmd(i2c->def->dmaRxStream, ENABLE); // Workaround
-
-//       __DMB();                         // Make sure instructions (clear address) are in correct order
-//       SR2 = i2c->def->i2cPort->SR2;    // clear ADDR
-//     }
-//   }
-//   // Byte transfer finished
-//   else if (SR1 & I2C_SR1_BTF)
-//   {
-//     SR2 = i2c->def->i2cPort->SR2;
-//     if (SR2 & I2C_SR2_TRA) // In write mode?
-//     {
-//       if (i2c->txMessage.direction == i2cRead) // internal address read
-//       {
-//         /* Internal address written, switch to read */
-//         i2c->def->i2cPort->CR1 = (I2C_CR1_START | I2C_CR1_PE); // Generate start
-//       }
-//       else
-//       {
-//         i2cNotifyClient(i2c);
-//         // Are there any other messages to transact? If so stop else repeated start.
-//         i2cTryNextMessage(i2c);
-//       }
-//     }
-//     else // Reading. Shouldn't happen since we use DMA for reading.
-//     {
-//       ASSERT(1);
-//       i2c->txMessage.buffer[i2c->messageIndex++] = I2C_ReceiveData(i2c->def->i2cPort);
-//       if(i2c->messageIndex == i2c->txMessage.messageLength)
-//       {
-//         i2cNotifyClient(i2c);
-//         // Are there any other messages to transact?
-//         i2cTryNextMessage(i2c);
-//       }
-//     }
-//     // A second BTF interrupt might occur if we don't wait for it to clear.
-//     // TODO Implement better method.
-//     while (i2c->def->i2cPort->CR1 & 0x0100) { ; }
-//   }
-//   // Byte received
-//   else if (SR1 & I2C_SR1_RXNE) // Should not happen when we use DMA for reception.
-//   {
-//     i2c->txMessage.buffer[i2c->messageIndex++] = I2C_ReceiveData(i2c->def->i2cPort);
-//     if(i2c->messageIndex == i2c->txMessage.messageLength)
-//     {
-//       I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, DISABLE);   // disable RXE to get BTF
-//     }
-//   }
-//   // Byte ready to be transmitted
-//   else if (SR1 & I2C_SR1_TXE)
-//   {
-//     if (i2c->txMessage.direction == i2cRead)
-//     {
-//       // Disable TXE to flush and get BTF to switch to read.
-//       // Switch must be done in BTF or strange things happen.
-//       I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, DISABLE);
-//     }
-//     else
-//     {
-//       I2C_SendData(i2c->def->i2cPort, i2c->txMessage.buffer[i2c->messageIndex++]);
-//       if(i2c->messageIndex == i2c->txMessage.messageLength)
-//       {
-//         // Disable TXE to allow the buffer to flush and get BTF
-//         I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, DISABLE);
-//       }
-//     }
-//   }
+  uint16_t SR1;
+  uint16_t SR2;
+
+  // read the status register first
+  SR1 = i2c->def->i2cPort->SR1;
+
+#ifdef I2CDRV_DEBUG_LOG_EVENTS
+  // Debug code
+  eventDebug[eventPos][0] = usecTimestamp();
+  eventDebug[eventPos][1] = SR1;
+  if (++eventPos == 1024)
+  {
+    eventPos = 0;
+  }
+#endif
+
+  // Start bit event
+  if (SR1 & I2C_SR1_SB)
+  {
+    i2c->messageIndex = 0;
+
+    if(i2c->txMessage.direction == i2cWrite ||
+       i2c->txMessage.internalAddress != I2C_NO_INTERNAL_ADDRESS)
+    {
+      I2C_Send7bitAddress(i2c->def->i2cPort, i2c->txMessage.slaveAddress << 1, I2C_Direction_Transmitter);
+    }
+    else
+    {
+      I2C_AcknowledgeConfig(i2c->def->i2cPort, ENABLE);
+      I2C_Send7bitAddress(i2c->def->i2cPort, i2c->txMessage.slaveAddress << 1, I2C_Direction_Receiver);
+    }
+  }
+  // Address event
+  else if (SR1 & I2C_SR1_ADDR)
+  {
+    if(i2c->txMessage.direction == i2cWrite ||
+       i2c->txMessage.internalAddress != I2C_NO_INTERNAL_ADDRESS)
+    {
+      SR2 = i2c->def->i2cPort->SR2;                               // clear ADDR
+      // In write mode transmit is always empty so can send up to two bytes
+      if (i2c->txMessage.internalAddress != I2C_NO_INTERNAL_ADDRESS)
+      {
+        if (i2c->txMessage.isInternal16bit)
+        {
+          I2C_SendData(i2c->def->i2cPort, (i2c->txMessage.internalAddress & 0xFF00) >> 8);
+          I2C_SendData(i2c->def->i2cPort, (i2c->txMessage.internalAddress & 0x00FF));
+        }
+        else
+        {
+          I2C_SendData(i2c->def->i2cPort, (i2c->txMessage.internalAddress & 0x00FF));
+        }
+        i2c->txMessage.internalAddress = I2C_NO_INTERNAL_ADDRESS;
+      }
+      I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, ENABLE);        // allow us to have an EV7
+    }
+    else // Reading, start DMA transfer
+    {
+      if(i2c->txMessage.messageLength == 1)
+      {
+        I2C_AcknowledgeConfig(i2c->def->i2cPort, DISABLE);
+      }
+      else
+      {
+        I2C_DMALastTransferCmd(i2c->def->i2cPort, ENABLE); // No repetitive start
+      }
+      // Disable buffer I2C interrupts
+      I2C_ITConfig(i2c->def->i2cPort, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
+      // Enable the Transfer Complete interrupt
+      DMA_ITConfig(i2c->def->dmaRxStream, DMA_IT_TC | DMA_IT_TE, ENABLE);
+      I2C_DMACmd(i2c->def->i2cPort, ENABLE); // Enable before ADDR clear
+
+      // Workaround to enable DMA for Renode simulation.
+      // The I2C uses the DMA for reading, but the Renode implementation lacks some functionality
+      // and for a message to be read the DMA needs to be enabled manually.
+      // Without setting this bit the I2C reading fails.
+      // With added functionality it should be possible to remove.
+      DMA_Cmd(i2c->def->dmaRxStream, ENABLE); // Workaround
+
+      __DMB();                         // Make sure instructions (clear address) are in correct order
+      SR2 = i2c->def->i2cPort->SR2;    // clear ADDR
+    }
+  }
+  // Byte transfer finished
+  else if (SR1 & I2C_SR1_BTF)
+  {
+    SR2 = i2c->def->i2cPort->SR2;
+    if (SR2 & I2C_SR2_TRA) // In write mode?
+    {
+      if (i2c->txMessage.direction == i2cRead) // internal address read
+      {
+        /* Internal address written, switch to read */
+        i2c->def->i2cPort->CR1 = (I2C_CR1_START | I2C_CR1_PE); // Generate start
+      }
+      else
+      {
+        i2cNotifyClient(i2c);
+        // Are there any other messages to transact? If so stop else repeated start.
+        i2cTryNextMessage(i2c);
+      }
+    }
+    else // Reading. Shouldn't happen since we use DMA for reading.
+    {
+      ASSERT(1);
+      i2c->txMessage.buffer[i2c->messageIndex++] = I2C_ReceiveData(i2c->def->i2cPort);
+      if(i2c->messageIndex == i2c->txMessage.messageLength)
+      {
+        i2cNotifyClient(i2c);
+        // Are there any other messages to transact?
+        i2cTryNextMessage(i2c);
+      }
+    }
+    // A second BTF interrupt might occur if we don't wait for it to clear.
+    // TODO Implement better method.
+    while (i2c->def->i2cPort->CR1 & 0x0100) { ; }
+  }
+  // Byte received
+  else if (SR1 & I2C_SR1_RXNE) // Should not happen when we use DMA for reception.
+  {
+    i2c->txMessage.buffer[i2c->messageIndex++] = I2C_ReceiveData(i2c->def->i2cPort);
+    if(i2c->messageIndex == i2c->txMessage.messageLength)
+    {
+      I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, DISABLE);   // disable RXE to get BTF
+    }
+  }
+  // Byte ready to be transmitted
+  else if (SR1 & I2C_SR1_TXE)
+  {
+    if (i2c->txMessage.direction == i2cRead)
+    {
+      // Disable TXE to flush and get BTF to switch to read.
+      // Switch must be done in BTF or strange things happen.
+      I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, DISABLE);
+    }
+    else
+    {
+      I2C_SendData(i2c->def->i2cPort, i2c->txMessage.buffer[i2c->messageIndex++]);
+      if(i2c->messageIndex == i2c->txMessage.messageLength)
+      {
+        // Disable TXE to allow the buffer to flush and get BTF
+        I2C_ITConfig(i2c->def->i2cPort, I2C_IT_BUF, DISABLE);
+      }
+    }
+  }
 }
 
 
 static void i2cdrvErrorIsrHandler(I2cDrv* i2c)
 {
-  //COMMENTED FIRMWARE
-  // if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_AF))
-  // {
-  //   if(i2c->txMessage.nbrOfRetries-- > 0)
-  //   {
-  //     // Retry by generating start
-  //     i2c->def->i2cPort->CR1 = (I2C_CR1_START | I2C_CR1_PE);
-  //   }
-  //   else
-  //   {
-  //     // Failed so notify client and try next message if any.
-  //     i2c->txMessage.status = i2cNack;
-  //     i2cNotifyClient(i2c);
-  //     i2cTryNextMessage(i2c);
-  //   }
-  //   I2C_ClearFlag(i2c->def->i2cPort, I2C_FLAG_AF);
-  // }
-  // if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_BERR))
-  // {
-  //     I2C_ClearFlag(i2c->def->i2cPort, I2C_FLAG_BERR);
-  // }
-  // if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_OVR))
-  // {
-  //     I2C_ClearFlag(i2c->def->i2cPort, I2C_FLAG_OVR);
-  // }
-  // if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_ARLO))
-  // {
-  //     I2C_ClearFlag(i2c->def->i2cPort,I2C_FLAG_ARLO);
-  // }
+  if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_AF))
+  {
+    if(i2c->txMessage.nbrOfRetries-- > 0)
+    {
+      // Retry by generating start
+      i2c->def->i2cPort->CR1 = (I2C_CR1_START | I2C_CR1_PE);
+    }
+    else
+    {
+      // Failed so notify client and try next message if any.
+      i2c->txMessage.status = i2cNack;
+      i2cNotifyClient(i2c);
+      i2cTryNextMessage(i2c);
+    }
+    I2C_ClearFlag(i2c->def->i2cPort, I2C_FLAG_AF);
+  }
+  if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_BERR))
+  {
+      I2C_ClearFlag(i2c->def->i2cPort, I2C_FLAG_BERR);
+  }
+  if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_OVR))
+  {
+      I2C_ClearFlag(i2c->def->i2cPort, I2C_FLAG_OVR);
+  }
+  if (I2C_GetFlagStatus(i2c->def->i2cPort, I2C_FLAG_ARLO))
+  {
+      I2C_ClearFlag(i2c->def->i2cPort,I2C_FLAG_ARLO);
+  }
 }
 
 static void i2cdrvClearDMA(I2cDrv* i2c)
 {
-  //COMMENTED FIRMWARE
-  // DMA_Cmd(i2c->def->dmaRxStream, DISABLE);
-  // DMA_ClearITPendingBit(i2c->def->dmaRxStream, i2c->def->dmaRxTCFlag);
-  // I2C_DMACmd(i2c->def->i2cPort, DISABLE);
-  // I2C_DMALastTransferCmd(i2c->def->i2cPort, DISABLE);
-  // DMA_ITConfig(i2c->def->dmaRxStream, DMA_IT_TC | DMA_IT_TE, DISABLE);
+  DMA_Cmd(i2c->def->dmaRxStream, DISABLE);
+  DMA_ClearITPendingBit(i2c->def->dmaRxStream, i2c->def->dmaRxTCFlag);
+  I2C_DMACmd(i2c->def->i2cPort, DISABLE);
+  I2C_DMALastTransferCmd(i2c->def->i2cPort, DISABLE);
+  DMA_ITConfig(i2c->def->dmaRxStream, DMA_IT_TC | DMA_IT_TE, DISABLE);
 }
 
 static void i2cdrvDmaIsrHandler(I2cDrv* i2c)
 {
-  //COMMENTED FIRMWARE
-  // if (DMA_GetFlagStatus(i2c->def->dmaRxStream, i2c->def->dmaRxTCFlag)) // Tranasfer complete
-  // {
-  //   i2cdrvClearDMA(i2c);
-  //   i2cNotifyClient(i2c);
-  //   // Are there any other messages to transact?
-  //   i2cTryNextMessage(i2c);
-  // }
-  // if (DMA_GetFlagStatus(i2c->def->dmaRxStream, i2c->def->dmaRxTEFlag)) // Transfer error
-  // {
-  //   DMA_ClearITPendingBit(i2c->def->dmaRxStream, i2c->def->dmaRxTEFlag);
-  //   //TODO: Best thing we could do?
-  //   i2c->txMessage.status = i2cNack;
-  //   i2cNotifyClient(i2c);
-  //   i2cTryNextMessage(i2c);
-  // }
+  if (DMA_GetFlagStatus(i2c->def->dmaRxStream, i2c->def->dmaRxTCFlag)) // Tranasfer complete
+  {
+    i2cdrvClearDMA(i2c);
+    i2cNotifyClient(i2c);
+    // Are there any other messages to transact?
+    i2cTryNextMessage(i2c);
+  }
+  if (DMA_GetFlagStatus(i2c->def->dmaRxStream, i2c->def->dmaRxTEFlag)) // Transfer error
+  {
+    DMA_ClearITPendingBit(i2c->def->dmaRxStream, i2c->def->dmaRxTEFlag);
+    //TODO: Best thing we could do?
+    i2c->txMessage.status = i2cNack;
+    i2cNotifyClient(i2c);
+    i2cTryNextMessage(i2c);
+  }
 }
 
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2cdev.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2cdev.c
index 81dd6ab1a..3fa753bf2 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2cdev.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2cdev.c
@@ -41,8 +41,7 @@
 
 int i2cdevInit(I2C_Dev *dev)
 {
-  //COMMENTED FIRMWARE
-  //i2cdrvInit(dev);
+  i2cdrvInit(dev);
 
   return true;
 }
@@ -58,9 +57,9 @@ bool i2cdevReadBit(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
 {
   uint8_t byte;
   bool status;
-  //COMMENTED FIRMWARE
-  // status = i2cdevReadReg8(dev, devAddress, memAddress, 1, &byte);
-  // *data = byte & (1 << bitNum);
+
+  status = i2cdevReadReg8(dev, devAddress, memAddress, 1, &byte);
+  *data = byte & (1 << bitNum);
 
   return status;
 }
@@ -69,16 +68,15 @@ bool i2cdevReadBits(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
                     uint8_t bitStart, uint8_t length, uint8_t *data)
 {
   bool status;
-  //COMMENTED FIRMWARE
-  // uint8_t byte;
-
-  // if ((status = i2cdevReadByte(dev, devAddress, memAddress, &byte)) == true)
-  // {
-  //     uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);
-  //     byte &= mask;
-  //     byte >>= (bitStart - length + 1);
-  //     *data = byte;
-  // }
+  uint8_t byte;
+
+  if ((status = i2cdevReadByte(dev, devAddress, memAddress, &byte)) == true)
+  {
+      uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);
+      byte &= mask;
+      byte >>= (bitStart - length + 1);
+      *data = byte;
+  }
   return status;
 }
 
@@ -86,8 +84,7 @@ bool i2cdevRead(I2C_Dev *dev, uint8_t devAddress, uint16_t len, uint8_t *data)
 {
   I2cMessage message;
 
-  //COMMENTED FIRMWARE
-  //i2cdrvCreateMessage(&message, devAddress, i2cRead, len, data);
+  i2cdrvCreateMessage(&message, devAddress, i2cRead, len, data);
 
   return i2cdrvMessageTransfer(dev, &message);
 }
@@ -96,9 +93,9 @@ bool i2cdevReadReg8(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
                     uint16_t len, uint8_t *data)
 {
   I2cMessage message;
-  //COMMENTED FIRMWARE
-  // i2cdrvCreateMessageIntAddr(&message, devAddress, false, memAddress,
-  //                           i2cRead, len, data);
+
+  i2cdrvCreateMessageIntAddr(&message, devAddress, false, memAddress,
+                            i2cRead, len, data);
 
   return i2cdrvMessageTransfer(dev, &message);
 }
@@ -106,11 +103,10 @@ bool i2cdevReadReg8(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
 bool i2cdevReadReg16(I2C_Dev *dev, uint8_t devAddress, uint16_t memAddress,
                      uint16_t len, uint8_t *data)
 {
-  //COMMENTED FIRMWARE
-  // I2cMessage message;
+  I2cMessage message;
 
-  // i2cdrvCreateMessageIntAddr(&message, devAddress, true, memAddress,
-  //                         i2cRead, len, data);
+  i2cdrvCreateMessageIntAddr(&message, devAddress, true, memAddress,
+                          i2cRead, len, data);
 
   return i2cdrvMessageTransfer(dev, &message);
 }
@@ -125,9 +121,8 @@ bool i2cdevWriteBit(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
                     uint8_t bitNum, uint8_t data)
 {
     uint8_t byte;
-    //COMMENTED FIRMWARE
-    // i2cdevReadByte(dev, devAddress, memAddress, &byte);
-    // byte = (data != 0) ? (byte | (1 << bitNum)) : (byte & ~(1 << bitNum));
+    i2cdevReadByte(dev, devAddress, memAddress, &byte);
+    byte = (data != 0) ? (byte | (1 << bitNum)) : (byte & ~(1 << bitNum));
     return i2cdevWriteByte(dev, devAddress, memAddress, byte);
 }
 
@@ -135,18 +130,17 @@ bool i2cdevWriteBits(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
                      uint8_t bitStart, uint8_t length, uint8_t data)
 {
   bool status;
-  //COMMENTED FIRMWARE
-  // uint8_t byte;
-
-  // if ((status = i2cdevReadByte(dev, devAddress, memAddress, &byte)) == true)
-  // {
-  //     uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);
-  //     data <<= (bitStart - length + 1); // shift data into correct position
-  //     data &= mask; // zero all non-important bits in data
-  //     byte &= ~(mask); // zero all important bits in existing byte
-  //     byte |= data; // combine data with existing byte
-  //     status = i2cdevWriteByte(dev, devAddress, memAddress, byte);
-  // }
+  uint8_t byte;
+
+  if ((status = i2cdevReadByte(dev, devAddress, memAddress, &byte)) == true)
+  {
+      uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);
+      data <<= (bitStart - length + 1); // shift data into correct position
+      data &= mask; // zero all non-important bits in data
+      byte &= ~(mask); // zero all important bits in existing byte
+      byte |= data; // combine data with existing byte
+      status = i2cdevWriteByte(dev, devAddress, memAddress, byte);
+  }
 
   return status;
 }
@@ -155,8 +149,7 @@ bool i2cdevWrite(I2C_Dev *dev, uint8_t devAddress, uint16_t len, const uint8_t *
 {
   I2cMessage message;
 
-  //COMMENTED FIRMWARE
-  //i2cdrvCreateMessage(&message, devAddress, i2cWrite, len, data);
+  i2cdrvCreateMessage(&message, devAddress, i2cWrite, len, data);
 
   return i2cdrvMessageTransfer(dev, &message);
 }
@@ -166,9 +159,8 @@ bool i2cdevWriteReg8(I2C_Dev *dev, uint8_t devAddress, uint8_t memAddress,
 {
   I2cMessage message;
 
-  //COMMENTED FIRMWARE
-  // i2cdrvCreateMessageIntAddr(&message, devAddress, false, memAddress,
-  //                            i2cWrite, len, data);
+  i2cdrvCreateMessageIntAddr(&message, devAddress, false, memAddress,
+                             i2cWrite, len, data);
 
   return i2cdrvMessageTransfer(dev, &message);
 }
@@ -178,9 +170,8 @@ bool i2cdevWriteReg16(I2C_Dev *dev, uint8_t devAddress, uint16_t memAddress,
 {
   I2cMessage message;
 
-  //COMMENTED FIRMWARE
-  // i2cdrvCreateMessageIntAddr(&message, devAddress, true, memAddress,
-  //                            i2cWrite, len, data);
+  i2cdrvCreateMessageIntAddr(&message, devAddress, true, memAddress,
+                             i2cWrite, len, data);
 
   return i2cdrvMessageTransfer(dev, &message);
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2croutines.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2croutines.c
index d0171b93a..b0f8a2f52 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2croutines.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/i2croutines.c
@@ -66,112 +66,111 @@ ErrorStatus I2C_Master_BufferRead(I2C_TypeDef* I2Cx, uint8_t* pBuffer,
     uint32_t timeoutMs)
 
 {
-  //COMMENTED FIRMWARE
-  // __IO uint32_t temp = 0;
-  // __IO uint32_t Timeout = 0;
-
-  // /* Enable I2C errors interrupts (used in all modes: Polling, DMA and Interrupts */
-  // I2Cx->CR2 |= I2C_IT_ERR;
-
-  // if (Mode == DMA) /* I2Cx Master Reception using DMA */
-  // {
-  //   /* Configure I2Cx DMA channel */
-  //   I2C_DMAConfig(I2Cx, pBuffer, NumByteToRead, I2C_DIRECTION_RX);
-  //   /* Set Last bit to have a NACK on the last received byte */
-  //   I2Cx->CR2 |= CR2_LAST_Set;
-  //   /* Enable I2C DMA requests */
-  //   I2Cx->CR2 |= CR2_DMAEN_Set;
-  //   Timeout = 0xFFFF;
-  //   /* Send START condition */
-  //   I2Cx->CR1 |= CR1_START_Set;
-  //   /* Wait until SB flag is set: EV5  */
-  //   while ((I2Cx->SR1 & 0x0001) != 0x0001)
-  //   {
-  //     if (Timeout-- == 0)
-  //       return ERROR;
-  //   }
-  //   Timeout = 0xFFFF;
-  //   /* Send slave address */
-  //   /* Set the address bit0 for read */
-  //   SlaveAddress |= OAR1_ADD0_Set;
-  //   I2Cx->DR = SlaveAddress;
-  //   /* Wait until ADDR is set: EV6 */
-  //   while ((I2Cx->SR1 & 0x0002) != 0x0002)
-  //   {
-  //     if (Timeout-- == 0)
-  //       return ERROR;
-  //   }
-  //   /* Clear ADDR flag by reading SR2 register */
-  //   temp = I2Cx->SR2;
-  //   if (I2Cx == I2C1)
-  //   {
-  //     /* Wait until DMA end of transfer */
-  //     //while (!DMA_GetFlagStatus(DMA1_FLAG_TC7));
-  //     xSemaphoreTake(i2cdevDmaEventI2c1, M2T(timeoutMs));
-  //     /* Disable DMA Channel */
-  //     DMA_Cmd(I2C1_DMA_CHANNEL_RX, DISABLE);
-  //     /* Clear the DMA Transfer Complete flag */
-  //     DMA_ClearFlag(DMA1_FLAG_TC7);
-  //   }
-  //   else /* I2Cx = I2C2*/
-  //   {
-  //     /* Wait until DMA end of transfer */
-  //     //while (!DMA_GetFlagStatus(DMA1_FLAG_TC5))
-  //     xSemaphoreTake(i2cdevDmaEventI2c2, M2T(timeoutMs));
-  //     /* Disable DMA Channel */
-  //     DMA_Cmd(I2C2_DMA_CHANNEL_RX, DISABLE);
-  //     /* Clear the DMA Transfer Complete flag */
-  //     DMA_ClearFlag(DMA1_FLAG_TC5);
-  //   }
-  //   /* Program the STOP */
-  //   I2Cx->CR1 |= CR1_STOP_Set;
-  //   /* Make sure that the STOP bit is cleared by Hardware before CR1 write access */
-  //   while ((I2Cx->CR1 & 0x200) == 0x200)
-  //     ;
-  // }
-  // /* I2Cx Master Reception using Interrupts with highest priority in an application */
-  // else
-  // {
-  //   /* Enable EVT IT*/
-  //   I2Cx->CR2 |= I2C_IT_EVT;
-  //   /* Enable BUF IT */
-  //   I2Cx->CR2 |= I2C_IT_BUF;
-  //   SlaveAddress |= OAR1_ADD0_Set;
-  //   if (I2Cx== I2C1)
-  //   {
-  //     /* Set the I2C direction to reception */
-  //     I2CDirection1 = I2C_DIRECTION_RX;
-  //     Buffer_Rx1 = pBuffer;
-  //     Address1 = SlaveAddress;
-  //     NumbOfBytes1 = NumByteToRead;
-  //   }
-  //   else
-  //   {
-  //     /* Set the I2C direction to reception */
-  //     I2CDirection2 = I2C_DIRECTION_RX;
-  //     Buffer_Rx2 = pBuffer;
-  //     Address2 = SlaveAddress;
-  //     NumbOfBytes2 = NumByteToRead;
-  //   }
-  //   /* Send START condition */
-  //   I2Cx->CR1 |= CR1_START_Set;
-  //   Timeout = timeoutMs * I2CDEV_LOOPS_PER_MS;
-  //   /* Wait until the START condition is generated on the bus: START bit is cleared by hardware */
-  //   while ((I2Cx->CR1 & 0x100) == 0x100 && Timeout)
-  //   {
-  //     Timeout--;
-  //   }
-  //   /* Wait until BUSY flag is reset (until a STOP is generated) */
-  //   while ((I2Cx->SR2 & 0x0002) == 0x0002 && Timeout)
-  //   {
-  //     Timeout--;
-  //   }
-  //   /* Enable Acknowledgement to be ready for another reception */
-  //   I2Cx->CR1 |= CR1_ACK_Set;
-
-  //   if (Timeout == 0)
-  //     return ERROR;
-  // }
+  __IO uint32_t temp = 0;
+  __IO uint32_t Timeout = 0;
+
+  /* Enable I2C errors interrupts (used in all modes: Polling, DMA and Interrupts */
+  I2Cx->CR2 |= I2C_IT_ERR;
+
+  if (Mode == DMA) /* I2Cx Master Reception using DMA */
+  {
+    /* Configure I2Cx DMA channel */
+    I2C_DMAConfig(I2Cx, pBuffer, NumByteToRead, I2C_DIRECTION_RX);
+    /* Set Last bit to have a NACK on the last received byte */
+    I2Cx->CR2 |= CR2_LAST_Set;
+    /* Enable I2C DMA requests */
+    I2Cx->CR2 |= CR2_DMAEN_Set;
+    Timeout = 0xFFFF;
+    /* Send START condition */
+    I2Cx->CR1 |= CR1_START_Set;
+    /* Wait until SB flag is set: EV5  */
+    while ((I2Cx->SR1 & 0x0001) != 0x0001)
+    {
+      if (Timeout-- == 0)
+        return ERROR;
+    }
+    Timeout = 0xFFFF;
+    /* Send slave address */
+    /* Set the address bit0 for read */
+    SlaveAddress |= OAR1_ADD0_Set;
+    I2Cx->DR = SlaveAddress;
+    /* Wait until ADDR is set: EV6 */
+    while ((I2Cx->SR1 & 0x0002) != 0x0002)
+    {
+      if (Timeout-- == 0)
+        return ERROR;
+    }
+    /* Clear ADDR flag by reading SR2 register */
+    temp = I2Cx->SR2;
+    if (I2Cx == I2C1)
+    {
+      /* Wait until DMA end of transfer */
+      //while (!DMA_GetFlagStatus(DMA1_FLAG_TC7));
+      xSemaphoreTake(i2cdevDmaEventI2c1, M2T(timeoutMs));
+      /* Disable DMA Channel */
+      DMA_Cmd(I2C1_DMA_CHANNEL_RX, DISABLE);
+      /* Clear the DMA Transfer Complete flag */
+      DMA_ClearFlag(DMA1_FLAG_TC7);
+    }
+    else /* I2Cx = I2C2*/
+    {
+      /* Wait until DMA end of transfer */
+      //while (!DMA_GetFlagStatus(DMA1_FLAG_TC5))
+      xSemaphoreTake(i2cdevDmaEventI2c2, M2T(timeoutMs));
+      /* Disable DMA Channel */
+      DMA_Cmd(I2C2_DMA_CHANNEL_RX, DISABLE);
+      /* Clear the DMA Transfer Complete flag */
+      DMA_ClearFlag(DMA1_FLAG_TC5);
+    }
+    /* Program the STOP */
+    I2Cx->CR1 |= CR1_STOP_Set;
+    /* Make sure that the STOP bit is cleared by Hardware before CR1 write access */
+    while ((I2Cx->CR1 & 0x200) == 0x200)
+      ;
+  }
+  /* I2Cx Master Reception using Interrupts with highest priority in an application */
+  else
+  {
+    /* Enable EVT IT*/
+    I2Cx->CR2 |= I2C_IT_EVT;
+    /* Enable BUF IT */
+    I2Cx->CR2 |= I2C_IT_BUF;
+    SlaveAddress |= OAR1_ADD0_Set;
+    if (I2Cx== I2C1)
+    {
+      /* Set the I2C direction to reception */
+      I2CDirection1 = I2C_DIRECTION_RX;
+      Buffer_Rx1 = pBuffer;
+      Address1 = SlaveAddress;
+      NumbOfBytes1 = NumByteToRead;
+    }
+    else
+    {
+      /* Set the I2C direction to reception */
+      I2CDirection2 = I2C_DIRECTION_RX;
+      Buffer_Rx2 = pBuffer;
+      Address2 = SlaveAddress;
+      NumbOfBytes2 = NumByteToRead;
+    }
+    /* Send START condition */
+    I2Cx->CR1 |= CR1_START_Set;
+    Timeout = timeoutMs * I2CDEV_LOOPS_PER_MS;
+    /* Wait until the START condition is generated on the bus: START bit is cleared by hardware */
+    while ((I2Cx->CR1 & 0x100) == 0x100 && Timeout)
+    {
+      Timeout--;
+    }
+    /* Wait until BUSY flag is reset (until a STOP is generated) */
+    while ((I2Cx->SR2 & 0x0002) == 0x0002 && Timeout)
+    {
+      Timeout--;
+    }
+    /* Enable Acknowledgement to be ready for another reception */
+    I2Cx->CR1 |= CR1_ACK_Set;
+
+    if (Timeout == 0)
+      return ERROR;
+  }
 
   return SUCCESS;
 
@@ -190,114 +189,114 @@ ErrorStatus I2C_Master_BufferWrite(I2C_TypeDef* I2Cx, uint8_t* pBuffer,
     uint32_t NumByteToWrite, I2C_ProgrammingModel Mode, uint8_t SlaveAddress,
     uint32_t timeoutMs)
 {
-    //COMMENTED FIRMWARE
-//   __IO uint32_t temp = 0;
-//   __IO uint32_t Timeout = 0;
-
-//   /* Enable Error IT (used in all modes: DMA, Polling and Interrupts */
-//   I2Cx->CR2 |= I2C_IT_ERR;
-//   if (Mode == DMA) /* I2Cx Master Transmission using DMA */
-//   {
-//     Timeout = 0xFFFF;
-//     /* Configure the DMA channel for I2Cx transmission */
-//     I2C_DMAConfig(I2Cx, pBuffer, NumByteToWrite, I2C_DIRECTION_TX);
-//     /* Enable the I2Cx DMA requests */
-//     I2Cx->CR2 |= CR2_DMAEN_Set;
-//     /* Send START condition */
-//     I2Cx->CR1 |= CR1_START_Set;
-//     /* Wait until SB flag is set: EV5 */
-//     while ((I2Cx->SR1 & 0x0001) != 0x0001)
-//     {
-//       if (Timeout-- == 0)
-//         return ERROR;
-//     }
-//     Timeout = 0xFFFF;
-//     /* Send slave address */
-//     /* Reset the address bit0 for write */
-//     SlaveAddress &= OAR1_ADD0_Reset;
-//     I2Cx->DR = SlaveAddress;
-//     /* Wait until ADDR is set: EV6 */
-//     while ((I2Cx->SR1 & 0x0002) != 0x0002)
-//     {
-//       if (Timeout-- == 0)
-//         return ERROR;
-//     }
-
-//     /* Clear ADDR flag by reading SR2 register */
-//     temp = I2Cx->SR2;
-//     if (I2Cx == I2C1)
-//     {
-//       /* Wait until DMA end of transfer */
-// //            while (!DMA_GetFlagStatus(DMA1_FLAG_TC6));
-//       xSemaphoreTake(i2cdevDmaEventI2c1, M2T(5));
-//       /* Disable the DMA1 Channel 6 */
-//       DMA_Cmd(I2C1_DMA_CHANNEL_TX, DISABLE);
-//       /* Clear the DMA Transfer complete flag */
-//       DMA_ClearFlag(DMA1_FLAG_TC6);
-//     }
-//     else /* I2Cx = I2C2 */
-//     {
-//       /* Wait until DMA end of transfer */
-//       //while (!DMA_GetFlagStatus(DMA1_FLAG_TC4))
-//       xSemaphoreTake(i2cdevDmaEventI2c2, M2T(5));
-//       /* Disable the DMA1 Channel 4 */
-//       DMA_Cmd(I2C2_DMA_CHANNEL_TX, DISABLE);
-//       /* Clear the DMA Transfer complete flag */
-//       DMA_ClearFlag(DMA1_FLAG_TC4);
-//     }
-
-//     /* EV8_2: Wait until BTF is set before programming the STOP */
-//     while ((I2Cx->SR1 & 0x00004) != 0x000004)
-//       ;
-//     /* Program the STOP */
-//     I2Cx->CR1 |= CR1_STOP_Set;
-//     /* Make sure that the STOP bit is cleared by Hardware */
-//     while ((I2Cx->CR1 & 0x200) == 0x200)
-//       ;
-//   }
-//   /* I2Cx Master Transmission using Interrupt with highest priority in the application */
-//   else
-//   {
-//     /* Enable EVT IT*/
-//     I2Cx->CR2 |= I2C_IT_EVT;
-//     /* Enable BUF IT */
-//     I2Cx->CR2 |= I2C_IT_BUF;
-//     /* Set the I2C direction to Transmission */
-//     SlaveAddress &= OAR1_ADD0_Reset;
-//     if (I2Cx== I2C1)
-//     {
-//       /* Set the I2C direction to reception */
-//       I2CDirection1 = I2C_DIRECTION_TX;
-//       Buffer_Tx1 = pBuffer;
-//       Address1 = SlaveAddress;
-//       NumbOfBytes1 = NumByteToWrite;
-//     }
-//     else
-//     {
-//       /* Set the I2C direction to reception */
-//       I2CDirection2 = I2C_DIRECTION_TX;
-//       Buffer_Tx2 = pBuffer;
-//       Address2 = SlaveAddress;
-//       NumbOfBytes2 = NumByteToWrite;
-//     }
-//     /* Send START condition */
-//     I2Cx->CR1 |= CR1_START_Set;
-//     Timeout = timeoutMs * I2CDEV_LOOPS_PER_MS;
-//     /* Wait until the START condition is generated on the bus: the START bit is cleared by hardware */
-//     while ((I2Cx->CR1 & 0x100) == 0x100 && Timeout)
-//     {
-//       Timeout--;
-//     }
-//     /* Wait until BUSY flag is reset: a STOP has been generated on the bus signaling the end
-//      of transmission */
-//     while ((I2Cx->SR2 & 0x0002) == 0x0002 && Timeout)
-//     {
-//       Timeout--;
-//     }
-
-//     if (Timeout == 0)
-//       return ERROR;
-//   }
+
+  __IO uint32_t temp = 0;
+  __IO uint32_t Timeout = 0;
+
+  /* Enable Error IT (used in all modes: DMA, Polling and Interrupts */
+  I2Cx->CR2 |= I2C_IT_ERR;
+  if (Mode == DMA) /* I2Cx Master Transmission using DMA */
+  {
+    Timeout = 0xFFFF;
+    /* Configure the DMA channel for I2Cx transmission */
+    I2C_DMAConfig(I2Cx, pBuffer, NumByteToWrite, I2C_DIRECTION_TX);
+    /* Enable the I2Cx DMA requests */
+    I2Cx->CR2 |= CR2_DMAEN_Set;
+    /* Send START condition */
+    I2Cx->CR1 |= CR1_START_Set;
+    /* Wait until SB flag is set: EV5 */
+    while ((I2Cx->SR1 & 0x0001) != 0x0001)
+    {
+      if (Timeout-- == 0)
+        return ERROR;
+    }
+    Timeout = 0xFFFF;
+    /* Send slave address */
+    /* Reset the address bit0 for write */
+    SlaveAddress &= OAR1_ADD0_Reset;
+    I2Cx->DR = SlaveAddress;
+    /* Wait until ADDR is set: EV6 */
+    while ((I2Cx->SR1 & 0x0002) != 0x0002)
+    {
+      if (Timeout-- == 0)
+        return ERROR;
+    }
+
+    /* Clear ADDR flag by reading SR2 register */
+    temp = I2Cx->SR2;
+    if (I2Cx == I2C1)
+    {
+      /* Wait until DMA end of transfer */
+//            while (!DMA_GetFlagStatus(DMA1_FLAG_TC6));
+      xSemaphoreTake(i2cdevDmaEventI2c1, M2T(5));
+      /* Disable the DMA1 Channel 6 */
+      DMA_Cmd(I2C1_DMA_CHANNEL_TX, DISABLE);
+      /* Clear the DMA Transfer complete flag */
+      DMA_ClearFlag(DMA1_FLAG_TC6);
+    }
+    else /* I2Cx = I2C2 */
+    {
+      /* Wait until DMA end of transfer */
+      //while (!DMA_GetFlagStatus(DMA1_FLAG_TC4))
+      xSemaphoreTake(i2cdevDmaEventI2c2, M2T(5));
+      /* Disable the DMA1 Channel 4 */
+      DMA_Cmd(I2C2_DMA_CHANNEL_TX, DISABLE);
+      /* Clear the DMA Transfer complete flag */
+      DMA_ClearFlag(DMA1_FLAG_TC4);
+    }
+
+    /* EV8_2: Wait until BTF is set before programming the STOP */
+    while ((I2Cx->SR1 & 0x00004) != 0x000004)
+      ;
+    /* Program the STOP */
+    I2Cx->CR1 |= CR1_STOP_Set;
+    /* Make sure that the STOP bit is cleared by Hardware */
+    while ((I2Cx->CR1 & 0x200) == 0x200)
+      ;
+  }
+  /* I2Cx Master Transmission using Interrupt with highest priority in the application */
+  else
+  {
+    /* Enable EVT IT*/
+    I2Cx->CR2 |= I2C_IT_EVT;
+    /* Enable BUF IT */
+    I2Cx->CR2 |= I2C_IT_BUF;
+    /* Set the I2C direction to Transmission */
+    SlaveAddress &= OAR1_ADD0_Reset;
+    if (I2Cx== I2C1)
+    {
+      /* Set the I2C direction to reception */
+      I2CDirection1 = I2C_DIRECTION_TX;
+      Buffer_Tx1 = pBuffer;
+      Address1 = SlaveAddress;
+      NumbOfBytes1 = NumByteToWrite;
+    }
+    else
+    {
+      /* Set the I2C direction to reception */
+      I2CDirection2 = I2C_DIRECTION_TX;
+      Buffer_Tx2 = pBuffer;
+      Address2 = SlaveAddress;
+      NumbOfBytes2 = NumByteToWrite;
+    }
+    /* Send START condition */
+    I2Cx->CR1 |= CR1_START_Set;
+    Timeout = timeoutMs * I2CDEV_LOOPS_PER_MS;
+    /* Wait until the START condition is generated on the bus: the START bit is cleared by hardware */
+    while ((I2Cx->CR1 & 0x100) == 0x100 && Timeout)
+    {
+      Timeout--;
+    }
+    /* Wait until BUSY flag is reset: a STOP has been generated on the bus signaling the end
+     of transmission */
+    while ((I2Cx->SR2 & 0x0002) == 0x0002 && Timeout)
+    {
+      Timeout--;
+    }
+
+    if (Timeout == 0)
+      return ERROR;
+  }
   return SUCCESS;
 
   temp++; //To avoid GCC warning!
@@ -312,22 +311,21 @@ ErrorStatus I2C_Master_BufferWrite(I2C_TypeDef* I2Cx, uint8_t* pBuffer,
 void I2C_Slave_BufferReadWrite(I2C_TypeDef* I2Cx, I2C_ProgrammingModel Mode)
 
 {
-  //COMMENTED FIRMWARE
-  // /* Enable Event IT needed for ADDR and STOPF events ITs */
-  // I2Cx->CR2 |= I2C_IT_EVT;
-  // /* Enable Error IT */
-  // I2Cx->CR2 |= I2C_IT_ERR;
-
-  // if (Mode == DMA) /* I2Cx Slave Transmission using DMA */
-  // {
-  //   /* Enable I2Cx DMA requests */
-  //   I2Cx->CR2 |= CR2_DMAEN_Set;
-  // }
-  // else /* I2Cx Slave Transmission using Interrupt with highest priority in the application */
-  // {
-  //   /* Enable Buffer IT (TXE and RXNE ITs) */
-  //   I2Cx->CR2 |= I2C_IT_BUF;
-  // }
+  /* Enable Event IT needed for ADDR and STOPF events ITs */
+  I2Cx->CR2 |= I2C_IT_EVT;
+  /* Enable Error IT */
+  I2Cx->CR2 |= I2C_IT_ERR;
+
+  if (Mode == DMA) /* I2Cx Slave Transmission using DMA */
+  {
+    /* Enable I2Cx DMA requests */
+    I2Cx->CR2 |= CR2_DMAEN_Set;
+  }
+  else /* I2Cx Slave Transmission using Interrupt with highest priority in the application */
+  {
+    /* Enable Buffer IT (TXE and RXNE ITs) */
+    I2Cx->CR2 |= I2C_IT_BUF;
+  }
 }
 
 /**
@@ -337,127 +335,126 @@ void I2C_Slave_BufferReadWrite(I2C_TypeDef* I2Cx, I2C_ProgrammingModel Mode)
  */
 void I2C_LowLevel_Init(I2C_TypeDef* I2Cx)
 {
-  //COMMENTED FIRMWARE
-  // GPIO_InitTypeDef GPIO_InitStructure;
-  // I2C_InitTypeDef I2C_InitStructure;
-  // NVIC_InitTypeDef NVIC_InitStructure;
-
-  // /* GPIOB clock enable */
-  // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-  // /* Enable the DMA1 clock */
-  // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
-  // if (I2Cx == I2C1)
-  // {
-  //   /* I2C1 clock enable */
-  //   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
-  //   /* I2C1 SDA and SCL configuration */
-  //   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
-  //   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  //   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
-  //   GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-  //   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
-  //   GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-  //   /* Enable I2C1 reset state */
-  //   RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
-  //   /* Release I2C1 from reset state */
-  //   RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
-
-  //   NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
-  //   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_HIGH_PRI;
-  //   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  //   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  //   NVIC_Init(&NVIC_InitStructure);
-  //   NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
-  //   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_LOW_PRI;
-  //   NVIC_Init(&NVIC_InitStructure);
-  // }
-  // else /* I2Cx = I2C2 */
-  // {
-
-  //   /* I2C2 clock enable */
-  //   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
-  //   /* I2C1 SDA and SCL configuration */
-  //   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
-  //   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  //   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
-  //   GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-  //   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
-  //   GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-  //   /* Enable I2C2 reset state */
-  //   RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
-  //   /* Release I2C2 from reset state */
-  //   RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
-
-  //   NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQn;
-  //   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_HIGH_PRI;
-  //   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  //   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  //   NVIC_Init(&NVIC_InitStructure);
-  //   NVIC_InitStructure.NVIC_IRQChannel = I2C2_ER_IRQn;
-  //   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_LOW_PRI;
-  //   NVIC_Init(&NVIC_InitStructure);
-  // }
-
-  // /* I2C1 and I2C2 configuration */
-  // I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
-  // I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
-  // I2C_InitStructure.I2C_OwnAddress1 = OwnAddress1;
-  // I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
-  // I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
-  // I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
-  // I2C_Init(I2C1, &I2C_InitStructure);
-  // I2C_InitStructure.I2C_OwnAddress1 = OwnAddress2;
-  // I2C_Init(I2C2, &I2C_InitStructure);
-
-  // if (I2Cx == I2C1)
-
-  // { /* I2C1 TX DMA Channel configuration */
-  //   DMA_DeInit(I2C1_DMA_CHANNEL_TX);
-  //   I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C1_DR_Address;
-  //   I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) 0; /* This parameter will be configured durig communication */
-  //   I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /* This parameter will be configured durig communication */
-  //   I2CDMA_InitStructure.DMA_BufferSize = 0xFFFF; /* This parameter will be configured durig communication */
-  //   I2CDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-  //   I2CDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
-  //   I2CDMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
-  //   I2CDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
-  //   I2CDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
-  //   I2CDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
-  //   I2CDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
-  //   DMA_Init(I2C1_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
-
-  //   /* I2C1 RX DMA Channel configuration */
-  //   DMA_DeInit(I2C1_DMA_CHANNEL_RX);
-  //   DMA_Init(I2C1_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
-  // }
-
-  // else /* I2Cx = I2C2 */
-
-  // {
-  //   /* I2C2 TX DMA Channel configuration */
-  //   DMA_DeInit(I2C2_DMA_CHANNEL_TX);
-  //   I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C2_DR_Address;
-  //   I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) 0; /* This parameter will be configured durig communication */
-  //   I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /* This parameter will be configured durig communication */
-  //   I2CDMA_InitStructure.DMA_BufferSize = 0xFFFF; /* This parameter will be configured durig communication */
-  //   I2CDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-  //   I2CDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
-  //   I2CDMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
-  //   I2CDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
-  //   I2CDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
-  //   I2CDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
-  //   I2CDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
-  //   DMA_Init(I2C2_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
-
-  //   /* I2C2 RX DMA Channel configuration */
-  //   DMA_DeInit(I2C2_DMA_CHANNEL_RX);
-  //   DMA_Init(I2C2_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
-
-  // }
+  GPIO_InitTypeDef GPIO_InitStructure;
+  I2C_InitTypeDef I2C_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
+
+  /* GPIOB clock enable */
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+  /* Enable the DMA1 clock */
+  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
+  if (I2Cx == I2C1)
+  {
+    /* I2C1 clock enable */
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
+    /* I2C1 SDA and SCL configuration */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    /* Enable I2C1 reset state */
+    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
+    /* Release I2C1 from reset state */
+    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
+
+    NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_HIGH_PRI;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+    NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_LOW_PRI;
+    NVIC_Init(&NVIC_InitStructure);
+  }
+  else /* I2Cx = I2C2 */
+  {
+
+    /* I2C2 clock enable */
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
+    /* I2C1 SDA and SCL configuration */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    /* Enable I2C2 reset state */
+    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
+    /* Release I2C2 from reset state */
+    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
+
+    NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_HIGH_PRI;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+    NVIC_InitStructure.NVIC_IRQChannel = I2C2_ER_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_LOW_PRI;
+    NVIC_Init(&NVIC_InitStructure);
+  }
+
+  /* I2C1 and I2C2 configuration */
+  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
+  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
+  I2C_InitStructure.I2C_OwnAddress1 = OwnAddress1;
+  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
+  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
+  I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
+  I2C_Init(I2C1, &I2C_InitStructure);
+  I2C_InitStructure.I2C_OwnAddress1 = OwnAddress2;
+  I2C_Init(I2C2, &I2C_InitStructure);
+
+  if (I2Cx == I2C1)
+
+  { /* I2C1 TX DMA Channel configuration */
+    DMA_DeInit(I2C1_DMA_CHANNEL_TX);
+    I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C1_DR_Address;
+    I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) 0; /* This parameter will be configured durig communication */
+    I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /* This parameter will be configured durig communication */
+    I2CDMA_InitStructure.DMA_BufferSize = 0xFFFF; /* This parameter will be configured durig communication */
+    I2CDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+    I2CDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+    I2CDMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
+    I2CDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+    I2CDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
+    I2CDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
+    I2CDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
+    DMA_Init(I2C1_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
+
+    /* I2C1 RX DMA Channel configuration */
+    DMA_DeInit(I2C1_DMA_CHANNEL_RX);
+    DMA_Init(I2C1_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
+  }
+
+  else /* I2Cx = I2C2 */
+
+  {
+    /* I2C2 TX DMA Channel configuration */
+    DMA_DeInit(I2C2_DMA_CHANNEL_TX);
+    I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C2_DR_Address;
+    I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) 0; /* This parameter will be configured durig communication */
+    I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /* This parameter will be configured durig communication */
+    I2CDMA_InitStructure.DMA_BufferSize = 0xFFFF; /* This parameter will be configured durig communication */
+    I2CDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+    I2CDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+    I2CDMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
+    I2CDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+    I2CDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
+    I2CDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
+    I2CDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
+    DMA_Init(I2C2_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
+
+    /* I2C2 RX DMA Channel configuration */
+    DMA_DeInit(I2C2_DMA_CHANNEL_RX);
+    DMA_Init(I2C2_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
+
+  }
 }
 
 /**
@@ -468,55 +465,54 @@ void I2C_LowLevel_Init(I2C_TypeDef* I2Cx)
 void I2C_DMAConfig(I2C_TypeDef* I2Cx, uint8_t* pBuffer, uint32_t BufferSize,
     uint32_t Direction)
 {
-  //COMMENTED FIRMWARE
-  // /* Initialize the DMA with the new parameters */
-  // if (Direction == I2C_DIRECTION_TX)
-  // {
-  //   /* Configure the DMA Tx Channel with the buffer address and the buffer size */
-  //   I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) pBuffer;
-  //   I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
-  //   I2CDMA_InitStructure.DMA_BufferSize = (uint32_t) BufferSize;
-
-  //   if (I2Cx == I2C1)
-  //   {
-  //     I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C1_DR_Address;
-  //     DMA_Cmd(I2C1_DMA_CHANNEL_TX, DISABLE);
-  //     DMA_Init(I2C1_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
-  //     DMA_Cmd(I2C1_DMA_CHANNEL_TX, ENABLE);
-  //   }
-  //   else
-  //   {
-  //     I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C2_DR_Address;
-  //     DMA_Cmd(I2C2_DMA_CHANNEL_TX, DISABLE);
-  //     DMA_Init(I2C2_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
-  //     DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
-  //     DMA_Cmd(I2C2_DMA_CHANNEL_TX, ENABLE);
-  //   }
-  // }
-  // else /* Reception */
-  // {
-  //   /* Configure the DMA Rx Channel with the buffer address and the buffer size */
-  //   I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) pBuffer;
-  //   I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
-  //   I2CDMA_InitStructure.DMA_BufferSize = (uint32_t) BufferSize;
-  //   if (I2Cx == I2C1)
-  //   {
-
-  //     I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C1_DR_Address;
-  //     DMA_Cmd(I2C1_DMA_CHANNEL_RX, DISABLE);
-  //     DMA_Init(I2C1_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
-  //     DMA_Cmd(I2C1_DMA_CHANNEL_RX, ENABLE);
-  //   }
-
-  //   else
-  //   {
-  //     I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C2_DR_Address;
-  //     DMA_Cmd(I2C2_DMA_CHANNEL_RX, DISABLE);
-  //     DMA_Init(I2C2_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
-  //     DMA_Cmd(I2C2_DMA_CHANNEL_RX, ENABLE);
-  //   }
-
-  // }
+  /* Initialize the DMA with the new parameters */
+  if (Direction == I2C_DIRECTION_TX)
+  {
+    /* Configure the DMA Tx Channel with the buffer address and the buffer size */
+    I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) pBuffer;
+    I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
+    I2CDMA_InitStructure.DMA_BufferSize = (uint32_t) BufferSize;
+
+    if (I2Cx == I2C1)
+    {
+      I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C1_DR_Address;
+      DMA_Cmd(I2C1_DMA_CHANNEL_TX, DISABLE);
+      DMA_Init(I2C1_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
+      DMA_Cmd(I2C1_DMA_CHANNEL_TX, ENABLE);
+    }
+    else
+    {
+      I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C2_DR_Address;
+      DMA_Cmd(I2C2_DMA_CHANNEL_TX, DISABLE);
+      DMA_Init(I2C2_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
+      DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
+      DMA_Cmd(I2C2_DMA_CHANNEL_TX, ENABLE);
+    }
+  }
+  else /* Reception */
+  {
+    /* Configure the DMA Rx Channel with the buffer address and the buffer size */
+    I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) pBuffer;
+    I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
+    I2CDMA_InitStructure.DMA_BufferSize = (uint32_t) BufferSize;
+    if (I2Cx == I2C1)
+    {
+
+      I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C1_DR_Address;
+      DMA_Cmd(I2C1_DMA_CHANNEL_RX, DISABLE);
+      DMA_Init(I2C1_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
+      DMA_Cmd(I2C1_DMA_CHANNEL_RX, ENABLE);
+    }
+
+    else
+    {
+      I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) I2C2_DR_Address;
+      DMA_Cmd(I2C2_DMA_CHANNEL_RX, DISABLE);
+      DMA_Init(I2C2_DMA_CHANNEL_RX, &I2CDMA_InitStructure);
+      DMA_Cmd(I2C2_DMA_CHANNEL_RX, ENABLE);
+    }
+
+  }
 }
 
 /**
@@ -526,116 +522,116 @@ void I2C_DMAConfig(I2C_TypeDef* I2Cx, uint8_t* pBuffer, uint32_t BufferSize,
  */
 void __attribute__((used)) I2C1_EV_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // __IO uint32_t SR1Register = 0;
-  // __IO uint32_t SR2Register = 0;
-
-  // /* Read the I2C SR1 and SR2 status registers */
-  // SR1Register = I2C1->SR1;
-  // SR2Register = I2C1->SR2;
-
-  // /* If SB = 1, I2C master sent a START on the bus: EV5) */
-  // if ((SR1Register & 0x0001) == 0x0001)
-  // {
-  //   /* Send the slave address for transmssion or for reception (according to the configured value
-  //    in the write master write routine */
-  //   I2C1->DR = Address1;
-  //   SR1Register = 0;
-  //   SR2Register = 0;
-  // }
-  // /* If I2C is Master (MSL flag = 1) */
-
-  // if ((SR2Register & 0x0001) == 0x0001)
-  // {
-  //   /* If ADDR = 1, EV6 */
-  //   if ((SR1Register & 0x0002) == 0x0002)
-  //   {
-  //     /* Write the first data in case the Master is Transmitter */
-  //     if (I2CDirection1 == I2C_DIRECTION_TX)
-  //     {
-  //       /* Initialize the Transmit counter */
-  //       Tx_Idx1 = 0;
-  //       /* Write the first data in the data register */
-  //       I2C1->DR = Buffer_Tx1[Tx_Idx1++];
-  //       /* Decrement the number of bytes to be written */
-  //       NumbOfBytes1--;
-  //       /* If no further data to be sent, disable the I2C BUF IT
-  //        in order to not have a TxE  interrupt */
-  //       if (NumbOfBytes1 == 0)
-  //       {
-  //         I2C1->CR2 &= (uint16_t) ~I2C_IT_BUF;
-  //       }
-  //     }
-  //     /* Master Receiver */
-  //     else
-  //     {
-  //       /* Initialize Receive counter */
-  //       Rx_Idx1 = 0;
-  //       /* At this stage, ADDR is cleared because both SR1 and SR2 were read.*/
-  //       /* EV6_1: used for single byte reception. The ACK disable and the STOP
-  //        Programming should be done just after ADDR is cleared. */
-  //       if (NumbOfBytes1 == 1)
-  //       {
-  //         /* Clear ACK */
-  //         I2C1->CR1 &= CR1_ACK_Reset;
-  //         /* Program the STOP */
-  //         I2C1->CR1 |= CR1_STOP_Set;
-  //       }
-  //     }
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  //   /* Master transmits the remaing data: from data2 until the last one.  */
-  //   /* If TXE is set */
-  //   if ((SR1Register & 0x0084) == 0x0080)
-  //   {
-  //     /* If there is still data to write */
-  //     if (NumbOfBytes1 != 0)
-  //     {
-  //       /* Write the data in DR register */
-  //       I2C1->DR = Buffer_Tx1[Tx_Idx1++];
-  //       /* Decrment the number of data to be written */
-  //       NumbOfBytes1--;
-  //       /* If  no data remains to write, disable the BUF IT in order
-  //        to not have again a TxE interrupt. */
-  //       if (NumbOfBytes1 == 0)
-  //       {
-  //         /* Disable the BUF IT */
-  //         I2C1->CR2 &= (uint16_t) ~I2C_IT_BUF;
-  //       }
-  //     }
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  //   /* If BTF and TXE are set (EV8_2), program the STOP */
-  //   if ((SR1Register & 0x0084) == 0x0084)
-  //   {
-  //     /* Program the STOP */
-  //     I2C1->CR1 |= CR1_STOP_Set;
-  //     /* Disable EVT IT In order to not have again a BTF IT */
-  //     I2C1->CR2 &= (uint16_t) ~I2C_IT_EVT;
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  //   /* If RXNE is set */
-  //   if ((SR1Register & 0x0040) == 0x0040)
-  //   {
-  //     /* Read the data register */
-  //     Buffer_Rx1[Rx_Idx1++] = I2C1->DR;
-  //     /* Decrement the number of bytes to be read */
-  //     NumbOfBytes1--;
-  //     /* If it remains only one byte to read, disable ACK and program the STOP (EV7_1) */
-  //     if (NumbOfBytes1 == 1)
-  //     {
-  //       /* Clear ACK */
-  //       I2C1->CR1 &= CR1_ACK_Reset;
-  //       /* Program the STOP */
-  //       I2C1->CR1 |= CR1_STOP_Set;
-  //     }
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  // }
+
+  __IO uint32_t SR1Register = 0;
+  __IO uint32_t SR2Register = 0;
+
+  /* Read the I2C SR1 and SR2 status registers */
+  SR1Register = I2C1->SR1;
+  SR2Register = I2C1->SR2;
+
+  /* If SB = 1, I2C master sent a START on the bus: EV5) */
+  if ((SR1Register & 0x0001) == 0x0001)
+  {
+    /* Send the slave address for transmssion or for reception (according to the configured value
+     in the write master write routine */
+    I2C1->DR = Address1;
+    SR1Register = 0;
+    SR2Register = 0;
+  }
+  /* If I2C is Master (MSL flag = 1) */
+
+  if ((SR2Register & 0x0001) == 0x0001)
+  {
+    /* If ADDR = 1, EV6 */
+    if ((SR1Register & 0x0002) == 0x0002)
+    {
+      /* Write the first data in case the Master is Transmitter */
+      if (I2CDirection1 == I2C_DIRECTION_TX)
+      {
+        /* Initialize the Transmit counter */
+        Tx_Idx1 = 0;
+        /* Write the first data in the data register */
+        I2C1->DR = Buffer_Tx1[Tx_Idx1++];
+        /* Decrement the number of bytes to be written */
+        NumbOfBytes1--;
+        /* If no further data to be sent, disable the I2C BUF IT
+         in order to not have a TxE  interrupt */
+        if (NumbOfBytes1 == 0)
+        {
+          I2C1->CR2 &= (uint16_t) ~I2C_IT_BUF;
+        }
+      }
+      /* Master Receiver */
+      else
+      {
+        /* Initialize Receive counter */
+        Rx_Idx1 = 0;
+        /* At this stage, ADDR is cleared because both SR1 and SR2 were read.*/
+        /* EV6_1: used for single byte reception. The ACK disable and the STOP
+         Programming should be done just after ADDR is cleared. */
+        if (NumbOfBytes1 == 1)
+        {
+          /* Clear ACK */
+          I2C1->CR1 &= CR1_ACK_Reset;
+          /* Program the STOP */
+          I2C1->CR1 |= CR1_STOP_Set;
+        }
+      }
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+    /* Master transmits the remaing data: from data2 until the last one.  */
+    /* If TXE is set */
+    if ((SR1Register & 0x0084) == 0x0080)
+    {
+      /* If there is still data to write */
+      if (NumbOfBytes1 != 0)
+      {
+        /* Write the data in DR register */
+        I2C1->DR = Buffer_Tx1[Tx_Idx1++];
+        /* Decrment the number of data to be written */
+        NumbOfBytes1--;
+        /* If  no data remains to write, disable the BUF IT in order
+         to not have again a TxE interrupt. */
+        if (NumbOfBytes1 == 0)
+        {
+          /* Disable the BUF IT */
+          I2C1->CR2 &= (uint16_t) ~I2C_IT_BUF;
+        }
+      }
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+    /* If BTF and TXE are set (EV8_2), program the STOP */
+    if ((SR1Register & 0x0084) == 0x0084)
+    {
+      /* Program the STOP */
+      I2C1->CR1 |= CR1_STOP_Set;
+      /* Disable EVT IT In order to not have again a BTF IT */
+      I2C1->CR2 &= (uint16_t) ~I2C_IT_EVT;
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+    /* If RXNE is set */
+    if ((SR1Register & 0x0040) == 0x0040)
+    {
+      /* Read the data register */
+      Buffer_Rx1[Rx_Idx1++] = I2C1->DR;
+      /* Decrement the number of bytes to be read */
+      NumbOfBytes1--;
+      /* If it remains only one byte to read, disable ACK and program the STOP (EV7_1) */
+      if (NumbOfBytes1 == 1)
+      {
+        /* Clear ACK */
+        I2C1->CR1 &= CR1_ACK_Reset;
+        /* Program the STOP */
+        I2C1->CR1 |= CR1_STOP_Set;
+      }
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+  }
 }
 
 /**
@@ -645,128 +641,125 @@ void __attribute__((used)) I2C1_EV_IRQHandler(void)
  */
 void __attribute__((used)) I2C2_EV_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // __IO uint32_t SR1Register = 0;
-  // __IO uint32_t SR2Register = 0;
-
-  // /* Read the I2C SR1 and SR2 status registers */
-  // SR1Register = I2C2->SR1;
-  // SR2Register = I2C2->SR2;
-
-  // /* If SB = 1, I2C master sent a START on the bus: EV5) */
-  // if ((SR1Register & 0x0001) == 0x0001)
-  // {
-  //   /* Send the slave address for transmssion or for reception (according to the configured value
-  //    in the write master write routine */
-  //   I2C2->DR = Address2;
-  //   SR1Register = 0;
-  //   SR2Register = 0;
-  // }
-  // /* If I2C is Master (MSL flag = 1) */
-
-  // if ((SR2Register & 0x0001) == 0x0001)
-  // {
-  //   /* If ADDR = 1, EV6 */
-  //   if ((SR1Register & 0x0002) == 0x0002)
-  //   {
-  //     /* Write the first data in case the Master is Transmitter */
-  //     if (I2CDirection2 == I2C_DIRECTION_TX)
-  //     {
-  //       /* Initialize the Transmit counter */
-  //       Tx_Idx2 = 0;
-  //       /* Write the first data in the data register */
-  //       I2C2->DR = Buffer_Tx2[Tx_Idx2++];
-  //       /* Decrement the number of bytes to be written */
-  //       NumbOfBytes2--;
-  //       /* If no further data to be sent, disable the I2C BUF IT
-  //        in order to not have a TxE  interrupt */
-  //       if (NumbOfBytes2 == 0)
-  //       {
-  //         I2C2->CR2 &= (uint16_t) ~I2C_IT_BUF;
-  //       }
-  //     }
-  //     /* Master Receiver */
-  //     else
-  //     {
-  //       /* Initialize Receive counter */
-  //       Rx_Idx2 = 0;
-  //       /* At this stage, ADDR is cleared because both SR1 and SR2 were read.*/
-  //       /* EV6_1: used for single byte reception. The ACK disable and the STOP
-  //        Programming should be done just after ADDR is cleared. */
-  //       if (NumbOfBytes2 == 1)
-  //       {
-  //         /* Clear ACK */
-  //         I2C2->CR1 &= CR1_ACK_Reset;
-  //         /* Program the STOP */
-  //         I2C2->CR1 |= CR1_STOP_Set;
-  //       }
-  //     }
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  //   /* Master transmits the remaing data: from data2 until the last one.  */
-  //   /* If TXE is set */
-  //   if ((SR1Register & 0x0084) == 0x0080)
-  //   {
-  //     /* If there is still data to write */
-  //     if (NumbOfBytes2 != 0)
-  //     {
-  //       /* Write the data in DR register */
-  //       I2C2->DR = Buffer_Tx2[Tx_Idx2++];
-  //       /* Decrment the number of data to be written */
-  //       NumbOfBytes2--;
-  //       /* If  no data remains to write, disable the BUF IT in order
-  //        to not have again a TxE interrupt. */
-  //       if (NumbOfBytes2 == 0)
-  //       {
-  //         /* Disable the BUF IT */
-  //         I2C2->CR2 &= (uint16_t) ~I2C_IT_BUF;
-  //       }
-  //     }
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  //   /* If BTF and TXE are set (EV8_2), program the STOP */
-  //   if ((SR1Register & 0x0084) == 0x0084)
-  //   {
-  //     /* Program the STOP */
-  //     I2C2->CR1 |= CR1_STOP_Set;
-  //     /* Disable EVT IT In order to not have again a BTF IT */
-  //     I2C2->CR2 &= (uint16_t) ~I2C_IT_EVT;
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  //   /* If RXNE is set */
-  //   if ((SR1Register & 0x0040) == 0x0040)
-  //   {
-  //     /* Read the data register */
-  //     Buffer_Rx2[Rx_Idx2++] = I2C2->DR;
-  //     /* Decrement the number of bytes to be read */
-  //     NumbOfBytes2--;
-  //     /* If it remains only one byte to read, disable ACK and program the STOP (EV7_1) */
-  //     if (NumbOfBytes2 == 1)
-  //     {
-  //       /* Clear ACK */
-  //       I2C2->CR1 &= CR1_ACK_Reset;
-  //       /* Program the STOP */
-  //       I2C2->CR1 |= CR1_STOP_Set;
-  //     }
-  //     SR1Register = 0;
-  //     SR2Register = 0;
-  //   }
-  // }
+  __IO uint32_t SR1Register = 0;
+  __IO uint32_t SR2Register = 0;
+
+  /* Read the I2C SR1 and SR2 status registers */
+  SR1Register = I2C2->SR1;
+  SR2Register = I2C2->SR2;
+
+  /* If SB = 1, I2C master sent a START on the bus: EV5) */
+  if ((SR1Register & 0x0001) == 0x0001)
+  {
+    /* Send the slave address for transmssion or for reception (according to the configured value
+     in the write master write routine */
+    I2C2->DR = Address2;
+    SR1Register = 0;
+    SR2Register = 0;
+  }
+  /* If I2C is Master (MSL flag = 1) */
+
+  if ((SR2Register & 0x0001) == 0x0001)
+  {
+    /* If ADDR = 1, EV6 */
+    if ((SR1Register & 0x0002) == 0x0002)
+    {
+      /* Write the first data in case the Master is Transmitter */
+      if (I2CDirection2 == I2C_DIRECTION_TX)
+      {
+        /* Initialize the Transmit counter */
+        Tx_Idx2 = 0;
+        /* Write the first data in the data register */
+        I2C2->DR = Buffer_Tx2[Tx_Idx2++];
+        /* Decrement the number of bytes to be written */
+        NumbOfBytes2--;
+        /* If no further data to be sent, disable the I2C BUF IT
+         in order to not have a TxE  interrupt */
+        if (NumbOfBytes2 == 0)
+        {
+          I2C2->CR2 &= (uint16_t) ~I2C_IT_BUF;
+        }
+      }
+      /* Master Receiver */
+      else
+      {
+        /* Initialize Receive counter */
+        Rx_Idx2 = 0;
+        /* At this stage, ADDR is cleared because both SR1 and SR2 were read.*/
+        /* EV6_1: used for single byte reception. The ACK disable and the STOP
+         Programming should be done just after ADDR is cleared. */
+        if (NumbOfBytes2 == 1)
+        {
+          /* Clear ACK */
+          I2C2->CR1 &= CR1_ACK_Reset;
+          /* Program the STOP */
+          I2C2->CR1 |= CR1_STOP_Set;
+        }
+      }
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+    /* Master transmits the remaing data: from data2 until the last one.  */
+    /* If TXE is set */
+    if ((SR1Register & 0x0084) == 0x0080)
+    {
+      /* If there is still data to write */
+      if (NumbOfBytes2 != 0)
+      {
+        /* Write the data in DR register */
+        I2C2->DR = Buffer_Tx2[Tx_Idx2++];
+        /* Decrment the number of data to be written */
+        NumbOfBytes2--;
+        /* If  no data remains to write, disable the BUF IT in order
+         to not have again a TxE interrupt. */
+        if (NumbOfBytes2 == 0)
+        {
+          /* Disable the BUF IT */
+          I2C2->CR2 &= (uint16_t) ~I2C_IT_BUF;
+        }
+      }
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+    /* If BTF and TXE are set (EV8_2), program the STOP */
+    if ((SR1Register & 0x0084) == 0x0084)
+    {
+      /* Program the STOP */
+      I2C2->CR1 |= CR1_STOP_Set;
+      /* Disable EVT IT In order to not have again a BTF IT */
+      I2C2->CR2 &= (uint16_t) ~I2C_IT_EVT;
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+    /* If RXNE is set */
+    if ((SR1Register & 0x0040) == 0x0040)
+    {
+      /* Read the data register */
+      Buffer_Rx2[Rx_Idx2++] = I2C2->DR;
+      /* Decrement the number of bytes to be read */
+      NumbOfBytes2--;
+      /* If it remains only one byte to read, disable ACK and program the STOP (EV7_1) */
+      if (NumbOfBytes2 == 1)
+      {
+        /* Clear ACK */
+        I2C2->CR1 &= CR1_ACK_Reset;
+        /* Program the STOP */
+        I2C2->CR1 |= CR1_STOP_Set;
+      }
+      SR1Register = 0;
+      SR2Register = 0;
+    }
+  }
 }
 
 void __attribute__((used)) I2C1_ER_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  //i2cErrorInterruptHandler(I2C1);
+  i2cErrorInterruptHandler(I2C1);
 }
 
 void __attribute__((used)) I2C2_ER_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  //i2cErrorInterruptHandler(I2C2);
+  i2cErrorInterruptHandler(I2C2);
 }
 
 /**
@@ -776,35 +769,35 @@ void __attribute__((used)) I2C2_ER_IRQHandler(void)
  */
 void i2cErrorInterruptHandler(I2C_TypeDef* I2Cx)
 {
-  //COMMENTED FIRMWARE
-  // __IO uint32_t SR1Register = 0;
-
-  // /* Read the I2C status register */
-  // SR1Register = I2Cx->SR1;
-  // /* If AF = 1 */
-  // if ((SR1Register & 0x0400) == 0x0400)
-  // {
-  //   I2Cx->SR1 &= 0xFBFF;
-  //   SR1Register = 0;
-  // }
-  // /* If ARLO = 1 */
-  // if ((SR1Register & 0x0200) == 0x0200)
-  // {
-  //   I2Cx->SR1 &= 0xFBFF;
-  //   SR1Register = 0;
-  // }
-  // /* If BERR = 1 */
-  // if ((SR1Register & 0x0100) == 0x0100)
-  // {
-  //   I2Cx->SR1 &= 0xFEFF;
-  //   SR1Register = 0;
-  // }
-  // /* If OVR = 1 */
-  // if ((SR1Register & 0x0800) == 0x0800)
-  // {
-  //   I2Cx->SR1 &= 0xF7FF;
-  //   SR1Register = 0;
-  // }
+
+  __IO uint32_t SR1Register = 0;
+
+  /* Read the I2C status register */
+  SR1Register = I2Cx->SR1;
+  /* If AF = 1 */
+  if ((SR1Register & 0x0400) == 0x0400)
+  {
+    I2Cx->SR1 &= 0xFBFF;
+    SR1Register = 0;
+  }
+  /* If ARLO = 1 */
+  if ((SR1Register & 0x0200) == 0x0200)
+  {
+    I2Cx->SR1 &= 0xFBFF;
+    SR1Register = 0;
+  }
+  /* If BERR = 1 */
+  if ((SR1Register & 0x0100) == 0x0100)
+  {
+    I2Cx->SR1 &= 0xFEFF;
+    SR1Register = 0;
+  }
+  /* If OVR = 1 */
+  if ((SR1Register & 0x0800) == 0x0800)
+  {
+    I2Cx->SR1 &= 0xF7FF;
+    SR1Register = 0;
+  }
 }
 
 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/led.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/led.c
index c538e7aab..ade1a6859 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/led.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/led.c
@@ -63,90 +63,85 @@ static bool isInit = false;
 //Initialize the green led pin as output
 void ledInit()
 {
-  //COMMENTED FIRMWARE
-  // int i;
+  int i;
 
-  // if(isInit)
-  //   return;
+  if(isInit)
+    return;
 
-  // GPIO_InitTypeDef GPIO_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
 
-  // // Enable GPIO
-  // RCC_AHB1PeriphClockCmd(LED_GPIO_PERIF, ENABLE);
+  // Enable GPIO
+  RCC_AHB1PeriphClockCmd(LED_GPIO_PERIF, ENABLE);
 
-  // for (i = 0; i < LED_NUM; i++)
-  // {
-  //   //Initialize the LED pins as an output
-  //   GPIO_InitStructure.GPIO_Pin = led_pin[i];
-  //   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
-  //   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  //   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
-  //   GPIO_Init(led_port[i], &GPIO_InitStructure);
+  for (i = 0; i < LED_NUM; i++)
+  {
+    //Initialize the LED pins as an output
+    GPIO_InitStructure.GPIO_Pin = led_pin[i];
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
+    GPIO_Init(led_port[i], &GPIO_InitStructure);
 
-  //   //Turn off the LED:s
-  //   ledSet(i, 0);
-  // }
+    //Turn off the LED:s
+    ledSet(i, 0);
+  }
 
-  // isInit = true;
+  isInit = true;
 }
 
 bool ledTest(void)
 {
-  //COMMENTED FIRMWARE
-  // ledSet(LED_GREEN_L, 1);
-  // ledSet(LED_GREEN_R, 1);
-  // ledSet(LED_RED_L, 0);
-  // ledSet(LED_RED_R, 0);
-  // vTaskDelay(M2T(250));
-  // ledSet(LED_GREEN_L, 0);
-  // ledSet(LED_GREEN_R, 0);
-  // ledSet(LED_RED_L, 1);
-  // ledSet(LED_RED_R, 1);
-  // vTaskDelay(M2T(250));
-
-  // // LED test end
-  // ledClearAll();
-  // ledSet(LED_BLUE_L, 1);
+  ledSet(LED_GREEN_L, 1);
+  ledSet(LED_GREEN_R, 1);
+  ledSet(LED_RED_L, 0);
+  ledSet(LED_RED_R, 0);
+  vTaskDelay(M2T(250));
+  ledSet(LED_GREEN_L, 0);
+  ledSet(LED_GREEN_R, 0);
+  ledSet(LED_RED_L, 1);
+  ledSet(LED_RED_R, 1);
+  vTaskDelay(M2T(250));
+
+  // LED test end
+  ledClearAll();
+  ledSet(LED_BLUE_L, 1);
 
   return isInit;
 }
 
 void ledClearAll(void)
 {
-  //COMMENTED FIRMWARE
-  // int i;
-
-  // for (i = 0; i < LED_NUM; i++)
-  // {
-  //   //Turn off the LED:s
-  //   ledSet(i, 0);
-  // }
+  int i;
+
+  for (i = 0; i < LED_NUM; i++)
+  {
+    //Turn off the LED:s
+    ledSet(i, 0);
+  }
 }
 
 void ledSetAll(void)
 {
-  //COMMENTED FIRMWARE
-  // int i;
-
-  // for (i = 0; i < LED_NUM; i++)
-  // {
-  //   //Turn on the LED:s
-  //   ledSet(i, 1);
-  // }
+  int i;
+
+  for (i = 0; i < LED_NUM; i++)
+  {
+    //Turn on the LED:s
+    ledSet(i, 1);
+  }
 }
 void ledSet(led_t led, bool value)
 {
-  //COMMENTED FIRMWARE
-  // if (led>LED_NUM)
-  //   return;
+  if (led>LED_NUM)
+    return;
 
-  // if (led_polarity[led]==LED_POL_NEG)
-  //   value = !value;
+  if (led_polarity[led]==LED_POL_NEG)
+    value = !value;
   
-  // if(value)
-  //   GPIO_SetBits(led_port[led], led_pin[led]);
-  // else
-  //   GPIO_ResetBits(led_port[led], led_pin[led]); 
+  if(value)
+    GPIO_SetBits(led_port[led], led_pin[led]);
+  else
+    GPIO_ResetBits(led_port[led], led_pin[led]); 
 }
 
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_bootloader.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_bootloader.c
index 1c3715cd4..8bf183247 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_bootloader.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_bootloader.c
@@ -60,12 +60,11 @@ static bool lhExchange(uint16_t writeLen, uint8_t* writeData, uint16_t readLen,
 {
   bool status = false;
 
-  //COMMENTED FIRMWARE
-  // status = i2cdevWrite(I2C1_DEV, devAddr, writeLen, writeData);
-  // if (status && readLen && readData)
-  // {
-  //   status = i2cdevRead(I2C1_DEV, devAddr, readLen, readData);
-  // }
+  status = i2cdevWrite(I2C1_DEV, devAddr, writeLen, writeData);
+  if (status && readLen && readData)
+  {
+    status = i2cdevRead(I2C1_DEV, devAddr, readLen, readData);
+  }
 
   return status;
 }
@@ -111,30 +110,27 @@ bool lhblTest()
 
 static bool lhblFlashReadStatus(uint8_t* status)
 {
-  //COMMENTED FIRMWARE
-  // lhblHeaderPrepare(1, 1, flashWriteBuf);
-  // flashWriteBuf[5] = FLASH_CMD_READ_STATUS;
+  lhblHeaderPrepare(1, 1, flashWriteBuf);
+  flashWriteBuf[5] = FLASH_CMD_READ_STATUS;
 
   return lhExchange(5+1, flashWriteBuf, 1, status);
 }
 
 static bool lhblFlashWriteEnable(void)
 {
-  //COMMENTED FIRMWARE
-  // lhblHeaderPrepare(1, 0, flashWriteBuf);
-  // flashWriteBuf[5] = FLASH_CMD_WRITE_EN;
+  lhblHeaderPrepare(1, 0, flashWriteBuf);
+  flashWriteBuf[5] = FLASH_CMD_WRITE_EN;
 
   return lhExchange(5 + 1, flashWriteBuf, 0, 0);
 }
 
 static bool lhblFlashEraseBlock64k(uint32_t address)
 {
-  //COMMENTED FIRMWARE
-  // lhblHeaderPrepare(4, 0, flashWriteBuf);
-  // flashWriteBuf[5] = FLASH_CMD_ERASE_SECTOR;
-  // flashWriteBuf[6] = (uint8_t)((address >> 16) & 0x000000FF);
-  // flashWriteBuf[7] = (uint8_t)((address >> 8)  & 0x000000FF);
-  // flashWriteBuf[8] = (uint8_t)((address >> 0)  & 0x000000FF);
+  lhblHeaderPrepare(4, 0, flashWriteBuf);
+  flashWriteBuf[5] = FLASH_CMD_ERASE_SECTOR;
+  flashWriteBuf[6] = (uint8_t)((address >> 16) & 0x000000FF);
+  flashWriteBuf[7] = (uint8_t)((address >> 8)  & 0x000000FF);
+  flashWriteBuf[8] = (uint8_t)((address >> 0)  & 0x000000FF);
 
   return lhExchange(5 + 4, flashWriteBuf, 0, 0);
 }
@@ -142,35 +138,33 @@ static bool lhblFlashEraseBlock64k(uint32_t address)
 static bool lhblFlashWaitComplete(void)
 {
   bool status;
-  //COMMENTED FIRMWARE
-  // uint8_t flashStatus;
+  uint8_t flashStatus;
 
-  // status = lhblFlashReadStatus(&flashStatus);
+  status = lhblFlashReadStatus(&flashStatus);
 
-  // while ((flashStatus & 0x01) != 0)
-  // {
-  //   vTaskDelay(M2T(1));
-  //   status &= lhblFlashReadStatus(&flashStatus);
-  // }
+  while ((flashStatus & 0x01) != 0)
+  {
+    vTaskDelay(M2T(1));
+    status &= lhblFlashReadStatus(&flashStatus);
+  }
 
   return status;
 }
 
 bool lhblFlashWritePage(uint32_t address, uint16_t length, const uint8_t *data)
 {
-  //COMMENTED FIRMWARE
-  // ASSERT(address >= LH_FW_ADDR);
-  // ASSERT(length <= LH_FLASH_PAGE_SIZE);
+  ASSERT(address >= LH_FW_ADDR);
+  ASSERT(length <= LH_FLASH_PAGE_SIZE);
 
-  // lhblFlashWriteEnable();
+  lhblFlashWriteEnable();
 
-  // lhblHeaderPrepare(4 + length, 0, flashWriteBuf);
-  // flashWriteBuf[5] = FLASH_CMD_WRITE_PAGE;
-  // flashWriteBuf[6] = (uint8_t)((address >> 16) & 0x000000FF);
-  // flashWriteBuf[7] = (uint8_t)((address >> 8)  & 0x000000FF);
-  // flashWriteBuf[8] = (uint8_t)((address >> 0)  & 0x000000FF);
+  lhblHeaderPrepare(4 + length, 0, flashWriteBuf);
+  flashWriteBuf[5] = FLASH_CMD_WRITE_PAGE;
+  flashWriteBuf[6] = (uint8_t)((address >> 16) & 0x000000FF);
+  flashWriteBuf[7] = (uint8_t)((address >> 8)  & 0x000000FF);
+  flashWriteBuf[8] = (uint8_t)((address >> 0)  & 0x000000FF);
 
-  // memcpy(&flashWriteBuf[9], data, length);
+  memcpy(&flashWriteBuf[9], data, length);
 
   return lhExchange(5 + 4 + length, flashWriteBuf, 0, 0);
 }
@@ -197,21 +191,19 @@ bool lhblFlashGetProtocolVersion(void)
 
 bool lhblFlashRead(uint32_t address, uint16_t length, uint8_t *data)
 {
-  //COMMENTED FIRMWARE
-  // lhblHeaderPrepare(4, length, flashWriteBuf);
-  // flashWriteBuf[5] = FLASH_CMD_READ;
-  // flashWriteBuf[6] = (uint8_t)((address >> 16) & 0x000000FF);
-  // flashWriteBuf[7] = (uint8_t)((address >> 8)  & 0x000000FF);
-  // flashWriteBuf[8] = (uint8_t)((address >> 0)  & 0x000000FF);
+  lhblHeaderPrepare(4, length, flashWriteBuf);
+  flashWriteBuf[5] = FLASH_CMD_READ;
+  flashWriteBuf[6] = (uint8_t)((address >> 16) & 0x000000FF);
+  flashWriteBuf[7] = (uint8_t)((address >> 8)  & 0x000000FF);
+  flashWriteBuf[8] = (uint8_t)((address >> 0)  & 0x000000FF);
 
   return lhExchange(5 + 4, flashWriteBuf, length, data);
 }
 
 bool lhblFlashWakeup(void)
 {
-  //COMMENTED FIRMWARE
-  // lhblHeaderPrepare(1, 0, flashWriteBuf);
-  // flashWriteBuf[5] = FLASH_CMD_WAKEUP;
+  lhblHeaderPrepare(1, 0, flashWriteBuf);
+  flashWriteBuf[5] = FLASH_CMD_WAKEUP;
 
   return lhExchange(5 + 1, flashWriteBuf, 0, 0);
 }
@@ -220,15 +212,14 @@ bool lhblFlashEraseFirmware(void)
 {
   bool status;
 
-//COMMENTED FIRMWARE
   /* Erase first 64K */
-  // lhblFlashWriteEnable();
-  // status = lhblFlashEraseBlock64k(LH_FW_ADDR);
-  // status &= lhblFlashWaitComplete();
-  // /* Erase last 64K */
-  // lhblFlashWriteEnable();
-  // status &= lhblFlashEraseBlock64k(LH_FW_ADDR + 0x10000);
-  // status &= lhblFlashWaitComplete();
+  lhblFlashWriteEnable();
+  status = lhblFlashEraseBlock64k(LH_FW_ADDR);
+  status &= lhblFlashWaitComplete();
+  /* Erase last 64K */
+  lhblFlashWriteEnable();
+  status &= lhblFlashEraseBlock64k(LH_FW_ADDR + 0x10000);
+  status &= lhblFlashWaitComplete();
 
   return status;
 }
@@ -236,45 +227,44 @@ bool lhblFlashEraseFirmware(void)
 bool lhblFlashWriteFW(uint8_t *data, uint32_t length)
 {
   bool status = true;
-  //COMMENTED FIRMWARE
-  // int pageCount = 0;
-  // int nbrPages = length / LH_FLASH_PAGE_SIZE;
-  // int lastPageSize = length % LH_FLASH_PAGE_SIZE;
-
-  // ASSERT(length <= LH_FW_SIZE);
-
-  // for (pageCount = 0; pageCount < nbrPages && status; pageCount++)
-  // {
-  //   status = lhblFlashWritePage(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
-  //                               LH_FLASH_PAGE_SIZE,
-  //                               &data[pageCount * LH_FLASH_PAGE_SIZE]);
-  //   lhblFlashWaitComplete();
-
-  //   lhblFlashRead(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
-  //                 LH_FLASH_PAGE_SIZE,
-  //                 flashReadBuf);
-
-  //   if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, LH_FLASH_PAGE_SIZE) == false)
-  //   {
-  //     return false;
-  //   }
-  // }
-  // if (lastPageSize && status)
-  // {
-  //   status = lhblFlashWritePage(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
-  //                               lastPageSize,
-  //                               &data[pageCount * LH_FLASH_PAGE_SIZE]);
-  //   lhblFlashWaitComplete();
-
-  //   lhblFlashRead(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
-  //                 lastPageSize,
-  //                 flashReadBuf);
-
-  //   if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, lastPageSize) == false)
-  //   {
-  //     return false;
-  //   }
-  // }
+  int pageCount = 0;
+  int nbrPages = length / LH_FLASH_PAGE_SIZE;
+  int lastPageSize = length % LH_FLASH_PAGE_SIZE;
+
+  ASSERT(length <= LH_FW_SIZE);
+
+  for (pageCount = 0; pageCount < nbrPages && status; pageCount++)
+  {
+    status = lhblFlashWritePage(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
+                                LH_FLASH_PAGE_SIZE,
+                                &data[pageCount * LH_FLASH_PAGE_SIZE]);
+    lhblFlashWaitComplete();
+
+    lhblFlashRead(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
+                  LH_FLASH_PAGE_SIZE,
+                  flashReadBuf);
+
+    if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, LH_FLASH_PAGE_SIZE) == false)
+    {
+      return false;
+    }
+  }
+  if (lastPageSize && status)
+  {
+    status = lhblFlashWritePage(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
+                                lastPageSize,
+                                &data[pageCount * LH_FLASH_PAGE_SIZE]);
+    lhblFlashWaitComplete();
+
+    lhblFlashRead(LH_FW_ADDR + pageCount * LH_FLASH_PAGE_SIZE,
+                  lastPageSize,
+                  flashReadBuf);
+
+    if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, lastPageSize) == false)
+    {
+      return false;
+    }
+  }
 
   return status;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_flasher.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_flasher.c
index b13fdb0e2..9f18fe769 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_flasher.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lh_flasher.c
@@ -93,39 +93,37 @@ static uint32_t statusCode = 0;
 
 static bool lhExchange(uint16_t writeLen, uint8_t* writeData, uint16_t readLen, uint8_t* readData)
 {
-  //COMMENTED FIRMWARE
-  // static uint8_t wbuffer[1024];
-  // static uint8_t rbuffer[1024];
+  static uint8_t wbuffer[1024];
+  static uint8_t rbuffer[1024];
 
-  // memcpy(wbuffer, writeData, writeLen);
+  memcpy(wbuffer, writeData, writeLen);
 
-  // spiBeginTransaction(SPI_BAUDRATE_2MHZ);
+  spiBeginTransaction(SPI_BAUDRATE_2MHZ);
 
-  // digitalWrite(LH_SPI_CS, 0);
+  digitalWrite(LH_SPI_CS, 0);
 
-  // spiExchange(writeLen+readLen, wbuffer, rbuffer);
+  spiExchange(writeLen+readLen, wbuffer, rbuffer);
 
-  // digitalWrite(LH_SPI_CS, 1);
+  digitalWrite(LH_SPI_CS, 1);
   
-  // spiEndTransaction();
+  spiEndTransaction();
 
-  // if (readLen > 0) {
-  //    memcpy(readData, &rbuffer[writeLen], readLen);
-  // }
+  if (readLen > 0) {
+     memcpy(readData, &rbuffer[writeLen], readLen);
+  }
 
   return true;
 }
 
 static bool verify(uint8_t *dataA, uint8_t *dataB, uint16_t length)
 {
-  //COMMENTED FIRMWARE
-  // for (int i = 0; i < length; i++)
-  // {
-  //   if (dataA[i] != dataB[i])
-  //   {
-  //     return false;
-  //   }
-  // }
+  for (int i = 0; i < length; i++)
+  {
+    if (dataA[i] != dataB[i])
+    {
+      return false;
+    }
+  }
 
   return true;
 }
@@ -135,16 +133,15 @@ bool lhflashInit()
   if (isInit)
     return true;
 
-  //COMMENTED FIRMWARE
-  // spiBegin();
+  spiBegin();
 
-  // pinMode(LH_FPGA_RESET, OUTPUT);
-  // pinMode(LH_SPI_CS, INPUT);
+  pinMode(LH_FPGA_RESET, OUTPUT);
+  pinMode(LH_SPI_CS, INPUT);
 
-  // digitalWrite(LH_FPGA_RESET, 1);
+  digitalWrite(LH_FPGA_RESET, 1);
 
 
-  // isInit = true;
+  isInit = true;
 
   return true;
 }
@@ -159,27 +156,25 @@ static bool flashReadStatus(uint8_t* status)
 static bool flashWriteEnable(void)
 {
   bool status = true;
-  //COMMENTED FIRMWARE
-  // uint8_t flash_status = 0;
+  uint8_t flash_status = 0;
 
-  // do {
-  //   flashWriteBuf[0] = FLASH_CMD_WRITE_EN;
+  do {
+    flashWriteBuf[0] = FLASH_CMD_WRITE_EN;
 
-  //   status &= lhExchange(1, flashWriteBuf, 0, 0);
+    status &= lhExchange(1, flashWriteBuf, 0, 0);
 
-  //   status &= flashReadStatus(&flash_status);
-  // } while ((flash_status & 0x02) == 0);
+    status &= flashReadStatus(&flash_status);
+  } while ((flash_status & 0x02) == 0);
   
   return status;
 }
 
 static bool flashEraseBlock64k(uint32_t address)
 {
-  //COMMENTED FIRMWARE
-  // flashWriteBuf[0] = FLASH_CMD_ERASE_SECTOR;
-  // flashWriteBuf[1] = (uint8_t)((address >> 16) & 0x000000FF);
-  // flashWriteBuf[2] = (uint8_t)((address >> 8)  & 0x000000FF);
-  // flashWriteBuf[3] = (uint8_t)((address >> 0)  & 0x000000FF);
+  flashWriteBuf[0] = FLASH_CMD_ERASE_SECTOR;
+  flashWriteBuf[1] = (uint8_t)((address >> 16) & 0x000000FF);
+  flashWriteBuf[2] = (uint8_t)((address >> 8)  & 0x000000FF);
+  flashWriteBuf[3] = (uint8_t)((address >> 0)  & 0x000000FF);
 
   return lhExchange(4, flashWriteBuf, 0, 0);
 }
@@ -187,67 +182,61 @@ static bool flashEraseBlock64k(uint32_t address)
 static bool flashWaitComplete(void)
 {
   bool status;
-  //COMMENTED FIRMWARE
-  // uint8_t flashStatus;
+  uint8_t flashStatus;
 
-  // status = flashReadStatus(&flashStatus);
+  status = flashReadStatus(&flashStatus);
 
-  // while ((flashStatus & 0x01) != 0)
-  // {
-  //   vTaskDelay(M2T(1));
-  //   status &= flashReadStatus(&flashStatus);
-  // }
+  while ((flashStatus & 0x01) != 0)
+  {
+    vTaskDelay(M2T(1));
+    status &= flashReadStatus(&flashStatus);
+  }
 
   return status;
 }
 
 static bool flashWritePage(uint32_t address, uint16_t length, uint8_t *data)
 {
-  //COMMENTED FIRMWARE
-  // ASSERT(length <= LH_FLASH_PAGE_SIZE);
+  ASSERT(length <= LH_FLASH_PAGE_SIZE);
 
-  // flashWriteEnable();
+  flashWriteEnable();
 
-  // flashWriteBuf[0] = FLASH_CMD_WRITE_PAGE;
-  // flashWriteBuf[1] = (uint8_t)((address >> 16) & 0x000000FF);
-  // flashWriteBuf[2] = (uint8_t)((address >> 8)  & 0x000000FF);
-  // flashWriteBuf[3] = (uint8_t)((address >> 0)  & 0x000000FF);
+  flashWriteBuf[0] = FLASH_CMD_WRITE_PAGE;
+  flashWriteBuf[1] = (uint8_t)((address >> 16) & 0x000000FF);
+  flashWriteBuf[2] = (uint8_t)((address >> 8)  & 0x000000FF);
+  flashWriteBuf[3] = (uint8_t)((address >> 0)  & 0x000000FF);
 
-  // memcpy(&flashWriteBuf[4], data, length);
+  memcpy(&flashWriteBuf[4], data, length);
 
   return lhExchange(4 + length, flashWriteBuf, 0, 0);
 }
 
 static void fpgaHoldReset(void)
 {
-  //COMMENTED FIRMWARE
-  // digitalWrite(LH_FPGA_RESET, 0);
-  // pinMode(LH_SPI_CS, OUTPUT);
-  // digitalWrite(LH_SPI_CS, 1);
+  digitalWrite(LH_FPGA_RESET, 0);
+  pinMode(LH_SPI_CS, OUTPUT);
+  digitalWrite(LH_SPI_CS, 1);
 }
 
 static void fpgaReleaseReset(void)
 {
-  //COMMENTED FIRMWARE
-  // pinMode(LH_SPI_CS, INPUT);
-  // digitalWrite(LH_FPGA_RESET, 1);
+  pinMode(LH_SPI_CS, INPUT);
+  digitalWrite(LH_FPGA_RESET, 1);
 }
 
 static bool flashRead(uint32_t address, uint16_t length, uint8_t *data)
 {
-  //COMMENTED FIRMWARE
-  // flashWriteBuf[0] = FLASH_CMD_READ;
-  // flashWriteBuf[1] = (uint8_t)((address >> 16) & 0x000000FF);
-  // flashWriteBuf[2] = (uint8_t)((address >> 8)  & 0x000000FF);
-  // flashWriteBuf[3] = (uint8_t)((address >> 0)  & 0x000000FF);
+  flashWriteBuf[0] = FLASH_CMD_READ;
+  flashWriteBuf[1] = (uint8_t)((address >> 16) & 0x000000FF);
+  flashWriteBuf[2] = (uint8_t)((address >> 8)  & 0x000000FF);
+  flashWriteBuf[3] = (uint8_t)((address >> 0)  & 0x000000FF);
 
   return lhExchange(4, flashWriteBuf, length, data);
 }
 
 static bool flashWakeup(void)
 {
-  //COMMENTED FIRMWARE
-  //flashWriteBuf[0] = FLASH_CMD_WAKEUP;
+  flashWriteBuf[0] = FLASH_CMD_WAKEUP;
 
   return lhExchange(1, flashWriteBuf, 0, 0);
 }
@@ -263,15 +252,13 @@ static bool flashReset()
 {
   bool status = true;
 
-  //COMMENTED FIRMWARE
-
-  // flashWriteBuf[0] = 0x66;
+  flashWriteBuf[0] = 0x66;
 
-  // status &= lhExchange(1, flashWriteBuf, 0, 0);
+  status &= lhExchange(1, flashWriteBuf, 0, 0);
 
-  // flashWriteBuf[0] = 0x99;
+  flashWriteBuf[0] = 0x99;
 
-  // status &= lhExchange(1, flashWriteBuf, 0, 0);
+  status &= lhExchange(1, flashWriteBuf, 0, 0);
 
   return status;
 }
@@ -281,26 +268,24 @@ static bool flashErase(void)
   bool status = true;
 
   /* Disable write protection */
-  //COMMENTED FIRMWARE
-  // flashWriteEnable();
+  flashWriteEnable();
 
-  // flashWriteBuf[0] = FLASH_CMD_WRITE_STATUS;
-  // flashWriteBuf[1] = 0;
+  flashWriteBuf[0] = FLASH_CMD_WRITE_STATUS;
+  flashWriteBuf[1] = 0;
 
-  // lhExchange(2, flashWriteBuf, 0, NULL);
+  lhExchange(2, flashWriteBuf, 0, NULL);
   
-  // status &= flashWaitComplete();
+  status &= flashWaitComplete();
 
-  // /* Erase first 128K */
-  // flashWriteEnable();
-  // status = flashEraseBlock64k(0);
-  // status &= flashWaitComplete();
+  /* Erase first 128K */
+  flashWriteEnable();
+  status = flashEraseBlock64k(0);
+  status &= flashWaitComplete();
   
-  // flashWriteEnable();
-  // status &= flashEraseBlock64k(0x10000);
-  // status &= flashWaitComplete();
+  flashWriteEnable();
+  status &= flashEraseBlock64k(0x10000);
+  status &= flashWaitComplete();
 
-  //THIS WAS ALREADY COMMENTED
   // flashWriteEnable();
   // status = flashEraseBlock64k(0x20000);
   // status &= flashWaitComplete();
@@ -314,59 +299,57 @@ static bool flashErase(void)
 
 static void flashProtectBootloader()
 {
-  //COMMENTED FIRMWARE
-  // flashWriteEnable();
+  flashWriteEnable();
 
-  // flashWriteBuf[0] = FLASH_CMD_WRITE_STATUS;
-  // flashWriteBuf[1] = 0x28;
+  flashWriteBuf[0] = FLASH_CMD_WRITE_STATUS;
+  flashWriteBuf[1] = 0x28;
 
-  // lhExchange(2, flashWriteBuf, 0, NULL);
+  lhExchange(2, flashWriteBuf, 0, NULL);
 
-  // flashWaitComplete();
+  flashWaitComplete();
 }
 
 static bool flashWriteFW(uint8_t *data, uint32_t length)
 {
   bool status = true;
-  //COMMENTED FIRMWARE
-  // int pageCount = 0;
-  // int nbrPages = length / LH_FLASH_PAGE_SIZE;
-  // int lastPageSize = length % LH_FLASH_PAGE_SIZE;
-
-  // for (pageCount = 0; pageCount < nbrPages && status; pageCount++)
-  // {
-  //   status = flashWritePage(pageCount * LH_FLASH_PAGE_SIZE,
-  //                               LH_FLASH_PAGE_SIZE,
-  //                               &data[pageCount * LH_FLASH_PAGE_SIZE]);
-  //   flashWaitComplete();
-
-  //   flashRead(pageCount * LH_FLASH_PAGE_SIZE,
-  //                 LH_FLASH_PAGE_SIZE,
-  //                 flashReadBuf);
-
-  //   if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, LH_FLASH_PAGE_SIZE) == false)
-  //   {
-  //     DEBUG_PRINT("Verify fail page %d!\n", pageCount);
-  //     statusCode = 0x80000000 | pageCount;
-  //     return false;
-  //   }
-  // }
-  // if (lastPageSize && status)
-  // {
-  //   status = flashWritePage(pageCount * LH_FLASH_PAGE_SIZE,
-  //                               lastPageSize,
-  //                               &data[pageCount * LH_FLASH_PAGE_SIZE]);
-  //   flashWaitComplete();
-
-  //   flashRead(pageCount * LH_FLASH_PAGE_SIZE,
-  //                 lastPageSize,
-  //                 flashReadBuf);
-
-  //   if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, lastPageSize) == false)
-  //   {
-  //     return false;
-  //   }
-  // }
+  int pageCount = 0;
+  int nbrPages = length / LH_FLASH_PAGE_SIZE;
+  int lastPageSize = length % LH_FLASH_PAGE_SIZE;
+
+  for (pageCount = 0; pageCount < nbrPages && status; pageCount++)
+  {
+    status = flashWritePage(pageCount * LH_FLASH_PAGE_SIZE,
+                                LH_FLASH_PAGE_SIZE,
+                                &data[pageCount * LH_FLASH_PAGE_SIZE]);
+    flashWaitComplete();
+
+    flashRead(pageCount * LH_FLASH_PAGE_SIZE,
+                  LH_FLASH_PAGE_SIZE,
+                  flashReadBuf);
+
+    if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, LH_FLASH_PAGE_SIZE) == false)
+    {
+      DEBUG_PRINT("Verify fail page %d!\n", pageCount);
+      statusCode = 0x80000000 | pageCount;
+      return false;
+    }
+  }
+  if (lastPageSize && status)
+  {
+    status = flashWritePage(pageCount * LH_FLASH_PAGE_SIZE,
+                                lastPageSize,
+                                &data[pageCount * LH_FLASH_PAGE_SIZE]);
+    flashWaitComplete();
+
+    flashRead(pageCount * LH_FLASH_PAGE_SIZE,
+                  lastPageSize,
+                  flashReadBuf);
+
+    if (verify(&data[pageCount * LH_FLASH_PAGE_SIZE], flashReadBuf, lastPageSize) == false)
+    {
+      return false;
+    }
+  }
 
   return status;
 }
@@ -374,35 +357,35 @@ static bool flashWriteFW(uint8_t *data, uint32_t length)
 bool lhflashFlashBootloader()
 {
   bool pass = true;
-  //COMMENTED FIRMWARE
-  // fpgaHoldReset();
 
-  // vTaskDelay(M2T(10));
+  fpgaHoldReset();
+
+  vTaskDelay(M2T(10));
 
-  // flashWakeup();
-  // vTaskDelay(M2T(10));
+  flashWakeup();
+  vTaskDelay(M2T(10));
 
-  // flashErase();
+  flashErase();
 
-  // pass &= flashWriteFW((uint8_t *)bootloader, bootloaderSize);
+  pass &= flashWriteFW((uint8_t *)bootloader, bootloaderSize);
 
-  // // Freeze here if the flashing is unsuccessful
-  // if (pass == false) {
-  //   statusDone = true;
-  //   while(1) {
-  //     vTaskDelay(portMAX_DELAY);
-  //   }
-  // }
+  // Freeze here if the flashing is unsuccessful
+  if (pass == false) {
+    statusDone = true;
+    while(1) {
+      vTaskDelay(portMAX_DELAY);
+    }
+  }
 
-  // flashProtectBootloader();
+  flashProtectBootloader();
 
-  // flashReset();
+  flashReset();
 
-  // fpgaReleaseReset();
+  fpgaReleaseReset();
 
-  // vTaskDelay(M2T(200));
+  vTaskDelay(M2T(200));
 
-  // statusDone = true;
+  statusDone = true;
 
   return pass;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lps25h.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lps25h.c
index 4cb77a181..f724fc6d6 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lps25h.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/lps25h.c
@@ -44,11 +44,11 @@ bool lps25hInit(I2C_Dev *i2cPort)
 {
   if (isInit)
     return true;
-  //COMMENTED FIRMWARE
-  // I2Cx = i2cPort;
-  // devAddr = LPS25H_I2C_ADDR;
 
-  // vTaskDelay(M2T(5));
+  I2Cx = i2cPort;
+  devAddr = LPS25H_I2C_ADDR;
+
+  vTaskDelay(M2T(5));
 
   isInit = true;
 
@@ -57,18 +57,17 @@ bool lps25hInit(I2C_Dev *i2cPort)
 
 bool lps25hTestConnection(void)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t id;
-  // bool status;
+  uint8_t id;
+  bool status;
 
-  // if (!isInit)
-	// return false;
+  if (!isInit)
+	return false;
 
 
-  // status = i2cdevReadReg8(I2Cx, devAddr, LPS25H_WHO_AM_I, 1, &id);
+  status = i2cdevReadReg8(I2Cx, devAddr, LPS25H_WHO_AM_I, 1, &id);
 
-  // if (status == true && id == LPS25H_WAI_ID)
-	//   return true;
+  if (status == true && id == LPS25H_WAI_ID)
+	  return true;
 
   return false;
 }
@@ -97,13 +96,12 @@ bool lps25hSelfTest(void)
 
 bool lps25hEvaluateSelfTest(float min, float max, float value, char* string)
 {
-  //COMMENTED FIRMWARE
-  // if (value < min || value > max)
-  // {
-  //   DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
-  //               string, (double)min, (double)max, (double)value);
-  //   return false;
-  // }
+  if (value < min || value > max)
+  {
+    DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
+                string, (double)min, (double)max, (double)value);
+    return false;
+  }
   return true;
 }
 
@@ -111,28 +109,28 @@ bool lps25hSetEnabled(bool enable)
 {
   uint8_t enable_mask;
   bool status;
-  //COMMENTED FIRMWARE
-	// if (!isInit)
-	//   return false;
-
-	// if (enable)
-	// {
-	//   enable_mask = 0b11000110; // Power on, 25Hz, BDU, reset zero
-	//   status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_CTRL_REG1, 1, &enable_mask);
-	//   enable_mask = 0b00001111; // AVG-P 512, AVG-T 64
-	//   status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_RES_CONF, 1, &enable_mask);
-	//   // FIFO averaging. This requres temp reg to be read in different read as reg auto inc
-	//   // wraps back to LPS25H_PRESS_OUT_L after LPS25H_PRESS_OUT_H is read.
-	//   enable_mask = 0b11000011; // FIFO Mean mode, 4 moving average
-	//   status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_FIFO_CTRL, 1, &enable_mask);
-	//   enable_mask = 0b01000000; // FIFO Enable
-	//   status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_CTRL_REG2, 1, &enable_mask);
-	// }
-	// else
-	// {
-	//   enable_mask = 0x00; // Power off and default values
-	//   status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_CTRL_REG1, 1, &enable_mask);
-	// }
+
+	if (!isInit)
+	  return false;
+
+	if (enable)
+	{
+	  enable_mask = 0b11000110; // Power on, 25Hz, BDU, reset zero
+	  status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_CTRL_REG1, 1, &enable_mask);
+	  enable_mask = 0b00001111; // AVG-P 512, AVG-T 64
+	  status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_RES_CONF, 1, &enable_mask);
+	  // FIFO averaging. This requres temp reg to be read in different read as reg auto inc
+	  // wraps back to LPS25H_PRESS_OUT_L after LPS25H_PRESS_OUT_H is read.
+	  enable_mask = 0b11000011; // FIFO Mean mode, 4 moving average
+	  status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_FIFO_CTRL, 1, &enable_mask);
+	  enable_mask = 0b01000000; // FIFO Enable
+	  status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_CTRL_REG2, 1, &enable_mask);
+	}
+	else
+	{
+	  enable_mask = 0x00; // Power off and default values
+	  status = i2cdevWriteReg8(I2Cx, devAddr, LPS25H_CTRL_REG1, 1, &enable_mask);
+	}
 
 	return status;
 }
@@ -144,18 +142,17 @@ bool lps25hGetData(float* pressure, float* temperature, float* asl)
   int16_t rawTemp;
   bool status;
 
-  //COMMENTED FIRMWARE
-  // status =  i2cdevReadReg8(I2Cx, devAddr, LPS25H_PRESS_OUT_XL | LPS25H_ADDR_AUTO_INC, 3, data);
-  // // If LPS25H moving avg filter is activated the temp must be read out in separate read.
-  // status &= i2cdevReadReg8(I2Cx, devAddr, LPS25H_TEMP_OUT_L | LPS25H_ADDR_AUTO_INC, 2, &data[3]);
+  status =  i2cdevReadReg8(I2Cx, devAddr, LPS25H_PRESS_OUT_XL | LPS25H_ADDR_AUTO_INC, 3, data);
+  // If LPS25H moving avg filter is activated the temp must be read out in separate read.
+  status &= i2cdevReadReg8(I2Cx, devAddr, LPS25H_TEMP_OUT_L | LPS25H_ADDR_AUTO_INC, 2, &data[3]);
 
-  // rawPressure = ((uint32_t)data[2] << 16) | ((uint32_t)data[1] << 8) | data[0];
-  // *pressure = (float)rawPressure / LPS25H_LSB_PER_MBAR;
+  rawPressure = ((uint32_t)data[2] << 16) | ((uint32_t)data[1] << 8) | data[0];
+  *pressure = (float)rawPressure / LPS25H_LSB_PER_MBAR;
 
-  // rawTemp = ((int16_t)data[4] << 8) | data[3];
-  // *temperature = LPS25H_TEMP_OFFSET + ((float)rawTemp / LPS25H_LSB_PER_CELSIUS);
+  rawTemp = ((int16_t)data[4] << 8) | data[3];
+  *temperature = LPS25H_TEMP_OFFSET + ((float)rawTemp / LPS25H_LSB_PER_CELSIUS);
 
-  // *asl = lps25hPressureToAltitude(pressure);
+  *asl = lps25hPressureToAltitude(pressure);
 
   return status;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/maxsonar.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/maxsonar.c
index 4286fbb6d..cebebe40e 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/maxsonar.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/maxsonar.c
@@ -55,37 +55,37 @@ LOG_GROUP_STOP(maxSonar)
 static uint32_t maxSonarGetAccuracyMB1040(uint32_t distance)
 {
   /* Specify the accuracy of the measurement from the MB1040 (LV-MaxBotix-EZ4) sensor. */
-  //COMMENTED FIRMWARE
-  // if(distance <= IN2MM(6)) {
-  //   /**
-  //    * The datasheet for the MB1040 specifies that any distance below 6 inches is reported as 6 inches.
-  //    * Since all measurements are given in 1 inch steps, the actual distance can be anything
-  //    * from 7 (exclusive) to 0 (inclusive) inches.
-  //    *
-  //    * The accuracy is therefore set to 7(!) inches.
-  //    */
-  //   maxSonarAccuracy = IN2MM(7);
-  // }
-  // else if(distance >= IN2MM(20)) {
-  //   /**
-  //    * The datasheet for the MB1040 specifies that any distance between 6 and 20 inches may result in
-  //    * measurement inaccuracies up to 2 inches.
-  //    */
-  //   maxSonarAccuracy = IN2MM(2);
-  // }
-  // else if(distance > IN2MM(254)) {
-  //   /**
-  //    * The datasheet for the MB1040 specifies that maximum reported distance is 254 inches. If we for
-  //    * some reason should measure more than this, set the accuracy to 0.
-  //    */
-  //   maxSonarAccuracy = 0;
-  // }
-  // else {
-  //   /**
-  //    * Otherwise the accuracy is specified by the datasheet for the MB1040 to be 1 inch.
-  //    */
-  //   maxSonarAccuracy = IN2MM(1);
-  // }
+
+  if(distance <= IN2MM(6)) {
+    /**
+     * The datasheet for the MB1040 specifies that any distance below 6 inches is reported as 6 inches.
+     * Since all measurements are given in 1 inch steps, the actual distance can be anything
+     * from 7 (exclusive) to 0 (inclusive) inches.
+     *
+     * The accuracy is therefore set to 7(!) inches.
+     */
+    maxSonarAccuracy = IN2MM(7);
+  }
+  else if(distance >= IN2MM(20)) {
+    /**
+     * The datasheet for the MB1040 specifies that any distance between 6 and 20 inches may result in
+     * measurement inaccuracies up to 2 inches.
+     */
+    maxSonarAccuracy = IN2MM(2);
+  }
+  else if(distance > IN2MM(254)) {
+    /**
+     * The datasheet for the MB1040 specifies that maximum reported distance is 254 inches. If we for
+     * some reason should measure more than this, set the accuracy to 0.
+     */
+    maxSonarAccuracy = 0;
+  }
+  else {
+    /**
+     * Otherwise the accuracy is specified by the datasheet for the MB1040 to be 1 inch.
+     */
+    maxSonarAccuracy = IN2MM(1);
+  }
 
   /* Report accuracy if the caller asked for this. */
   return maxSonarAccuracy;
@@ -121,12 +121,12 @@ static uint32_t maxSonarReadDistanceMB1040AN(const deckPin_t pin, uint32_t *accu
    * According to the datasheet for the MB1040, the sensor draws typically 2mA, so powering it with
    * the VCC pin on the deck port is safe.
    */
-  //COMMENTED FIRMWARE
-  // maxSonarDistance = (uint32_t) (IN2MM(analogRead(pin)) / 8);
 
-  // if(NULL != accuracy) {
-  //   *accuracy = maxSonarGetAccuracyMB1040(maxSonarDistance);
-  // }
+  maxSonarDistance = (uint32_t) (IN2MM(analogRead(pin)) / 8);
+
+  if(NULL != accuracy) {
+    *accuracy = maxSonarGetAccuracyMB1040(maxSonarDistance);
+  }
   return maxSonarDistance;
 }
 
@@ -140,18 +140,17 @@ static uint32_t maxSonarReadDistanceMB1040AN(const deckPin_t pin, uint32_t *accu
  */
 uint32_t maxSonarReadDistance(maxSonarSensor_t type, uint32_t *accuracy)
 {
-  //COMMENTED FIRMWARE
-  // switch(type) {
-  //   case MAXSONAR_MB1040_AN: {
-  //     return maxSonarReadDistanceMB1040AN(MAXSONAR_DECK_GPIO, accuracy);
-  //   }
-  // }
+  switch(type) {
+    case MAXSONAR_MB1040_AN: {
+      return maxSonarReadDistanceMB1040AN(MAXSONAR_DECK_GPIO, accuracy);
+    }
+  }
 
-  // maxSonarDistance = 0;
-  // maxSonarAccuracy = 0;
-  // if(accuracy) {
-  //   *accuracy = maxSonarAccuracy;
-  // }
+  maxSonarDistance = 0;
+  maxSonarAccuracy = 0;
+  if(accuracy) {
+    *accuracy = maxSonarAccuracy;
+  }
 
   return(maxSonarDistance);
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/motors.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/motors.c
index ea2712d94..24bccfb73 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/motors.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/motors.c
@@ -67,22 +67,22 @@ static bool isInit = false;
 
 static uint16_t motorsBLConvBitsTo16(uint16_t bits)
 {
-  // return (0xFFFF * (bits - MOTORS_BL_PWM_CNT_FOR_HIGH) / MOTORS_BL_PWM_CNT_FOR_HIGH);
+  return (0xFFFF * (bits - MOTORS_BL_PWM_CNT_FOR_HIGH) / MOTORS_BL_PWM_CNT_FOR_HIGH);
 }
 
 static uint16_t motorsBLConv16ToBits(uint16_t bits)
 {
-  // return (MOTORS_BL_PWM_CNT_FOR_HIGH + ((bits * MOTORS_BL_PWM_CNT_FOR_HIGH) / 0xFFFF));
+  return (MOTORS_BL_PWM_CNT_FOR_HIGH + ((bits * MOTORS_BL_PWM_CNT_FOR_HIGH) / 0xFFFF));
 }
 
 static uint16_t motorsConvBitsTo16(uint16_t bits)
 {
-  // return ((bits) << (16 - MOTORS_PWM_BITS));
+  return ((bits) << (16 - MOTORS_PWM_BITS));
 }
 
 static uint16_t motorsConv16ToBits(uint16_t bits)
 {
-  // return ((bits) >> (16 - MOTORS_PWM_BITS) & ((1 << MOTORS_PWM_BITS) - 1));
+  return ((bits) >> (16 - MOTORS_PWM_BITS) & ((1 << MOTORS_PWM_BITS) - 1));
 }
 
 // We have data that maps PWM to thrust at different supply voltage levels.
@@ -130,12 +130,12 @@ static uint16_t motorsConv16ToBits(uint16_t bits)
 // Voltage needed with the Supply voltage.
 static uint16_t motorsCompensateBatteryVoltage(uint16_t ithrust)
 {
-  // float thrust = ((float) ithrust / 65536.0f) * 60;
-  // float volts = -0.0006239f * thrust * thrust + 0.088f * thrust;
-  // float supply_voltage = pmGetBatteryVoltage();
-  // float percentage = volts / supply_voltage;
-  // percentage = percentage > 1.0f ? 1.0f : percentage;
-  // return percentage * UINT16_MAX;
+  float thrust = ((float) ithrust / 65536.0f) * 60;
+  float volts = -0.0006239f * thrust * thrust + 0.088f * thrust;
+  float supply_voltage = pmGetBatteryVoltage();
+  float percentage = volts / supply_voltage;
+  percentage = percentage > 1.0f ? 1.0f : percentage;
+  return percentage * UINT16_MAX;
 }
 
 /* Public functions */
@@ -143,83 +143,83 @@ static uint16_t motorsCompensateBatteryVoltage(uint16_t ithrust)
 //Initialization. Will set all motors ratio to 0%
 void motorsInit(const MotorPerifDef** motorMapSelect)
 {
-  // int i;
-  // //Init structures
-  // GPIO_InitTypeDef GPIO_InitStructure;
-  // TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
-  // TIM_OCInitTypeDef  TIM_OCInitStructure;
-
-  // if (isInit)
-  // {
-  //   // First to init will configure it
-  //   // return;
-  // }
-
-  // // motorMap = motorMapSelect;
-
-  // DEBUG_PRINT("Using %s motor driver\n", motorMap[0]->drvType == BRUSHED ? "brushed" : "brushless");
-
-  // for (i = 0; i < NBR_OF_MOTORS; i++)
-  // {
-  //   // //Clock the gpio and the timers
-  //   // MOTORS_RCC_GPIO_CMD(motorMap[i]->gpioPerif, ENABLE);
-  //   // MOTORS_RCC_GPIO_CMD(motorMap[i]->gpioPowerswitchPerif, ENABLE);
-  //   // MOTORS_RCC_TIM_CMD(motorMap[i]->timPerif, ENABLE);
-
-  //   // If there is a power switch, as on Bolt, enable power to ESC by
-  //   // switching on mosfet.
-  //   if (motorMap[i]->gpioPowerswitchPin != 0)
-  //   {
-  //     // GPIO_StructInit(&GPIO_InitStructure);
-  //     // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
-  //     // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  //     // GPIO_InitStructure.GPIO_Pin = motorMap[i]->gpioPowerswitchPin;
-  //     // GPIO_Init(motorMap[i]->gpioPowerswitchPort, &GPIO_InitStructure);
-  //     // GPIO_WriteBit(motorMap[i]->gpioPowerswitchPort, motorMap[i]->gpioPowerswitchPin, 1);
-  //   }
-
-  //   // Configure the GPIO for the timer output
-  //   GPIO_StructInit(&GPIO_InitStructure);
-  //   GPIO_InitStructure.GPIO_Mode = MOTORS_GPIO_MODE;
-  //   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  //   GPIO_InitStructure.GPIO_OType = motorMap[i]->gpioOType;
-  //   GPIO_InitStructure.GPIO_Pin = motorMap[i]->gpioPin;
-  //   GPIO_Init(motorMap[i]->gpioPort, &GPIO_InitStructure);
-
-  //   //Map timers to alternate functions
-  //   MOTORS_GPIO_AF_CFG(motorMap[i]->gpioPort, motorMap[i]->gpioPinSource, motorMap[i]->gpioAF);
-
-  //   //Timer configuration
-  //   TIM_TimeBaseStructure.TIM_Period = motorMap[i]->timPeriod;
-  //   TIM_TimeBaseStructure.TIM_Prescaler = motorMap[i]->timPrescaler;
-  //   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
-  //   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-  //   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
-  //   TIM_TimeBaseInit(motorMap[i]->tim, &TIM_TimeBaseStructure);
-
-  //   // PWM channels configuration (All identical!)
-  //   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
-  //   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
-  //   TIM_OCInitStructure.TIM_Pulse = 0;
-  //   TIM_OCInitStructure.TIM_OCPolarity = motorMap[i]->timPolarity;
-  //   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
-
-  //   // Configure Output Compare for PWM
-  //   motorMap[i]->ocInit(motorMap[i]->tim, &TIM_OCInitStructure);
-  //   motorMap[i]->preloadConfig(motorMap[i]->tim, TIM_OCPreload_Enable);
-
-  //   MOTORS_TIM_DBG_CFG(motorMap[i]->timDbgStop, ENABLE);
-  //   //Enable the timer PWM outputs
-  //   TIM_CtrlPWMOutputs(motorMap[i]->tim, ENABLE);
-  // }
-
-  // // Start the timers
-  // for (i = 0; i < NBR_OF_MOTORS; i++)
-  // {
-  //   TIM_Cmd(motorMap[i]->tim, ENABLE);
-  // }
-
-  // isInit = true;
+  int i;
+  //Init structures
+  GPIO_InitTypeDef GPIO_InitStructure;
+  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
+  TIM_OCInitTypeDef  TIM_OCInitStructure;
+
+  if (isInit)
+  {
+    // First to init will configure it
+    return;
+  }
+
+  motorMap = motorMapSelect;
+
+  DEBUG_PRINT("Using %s motor driver\n", motorMap[0]->drvType == BRUSHED ? "brushed" : "brushless");
+
+  for (i = 0; i < NBR_OF_MOTORS; i++)
+  {
+    //Clock the gpio and the timers
+    MOTORS_RCC_GPIO_CMD(motorMap[i]->gpioPerif, ENABLE);
+    MOTORS_RCC_GPIO_CMD(motorMap[i]->gpioPowerswitchPerif, ENABLE);
+    MOTORS_RCC_TIM_CMD(motorMap[i]->timPerif, ENABLE);
+
+    // If there is a power switch, as on Bolt, enable power to ESC by
+    // switching on mosfet.
+    if (motorMap[i]->gpioPowerswitchPin != 0)
+    {
+      GPIO_StructInit(&GPIO_InitStructure);
+      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+      GPIO_InitStructure.GPIO_Pin = motorMap[i]->gpioPowerswitchPin;
+      GPIO_Init(motorMap[i]->gpioPowerswitchPort, &GPIO_InitStructure);
+      GPIO_WriteBit(motorMap[i]->gpioPowerswitchPort, motorMap[i]->gpioPowerswitchPin, 1);
+    }
+
+    // Configure the GPIO for the timer output
+    GPIO_StructInit(&GPIO_InitStructure);
+    GPIO_InitStructure.GPIO_Mode = MOTORS_GPIO_MODE;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_InitStructure.GPIO_OType = motorMap[i]->gpioOType;
+    GPIO_InitStructure.GPIO_Pin = motorMap[i]->gpioPin;
+    GPIO_Init(motorMap[i]->gpioPort, &GPIO_InitStructure);
+
+    //Map timers to alternate functions
+    MOTORS_GPIO_AF_CFG(motorMap[i]->gpioPort, motorMap[i]->gpioPinSource, motorMap[i]->gpioAF);
+
+    //Timer configuration
+    TIM_TimeBaseStructure.TIM_Period = motorMap[i]->timPeriod;
+    TIM_TimeBaseStructure.TIM_Prescaler = motorMap[i]->timPrescaler;
+    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
+    TIM_TimeBaseInit(motorMap[i]->tim, &TIM_TimeBaseStructure);
+
+    // PWM channels configuration (All identical!)
+    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
+    TIM_OCInitStructure.TIM_Pulse = 0;
+    TIM_OCInitStructure.TIM_OCPolarity = motorMap[i]->timPolarity;
+    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
+
+    // Configure Output Compare for PWM
+    motorMap[i]->ocInit(motorMap[i]->tim, &TIM_OCInitStructure);
+    motorMap[i]->preloadConfig(motorMap[i]->tim, TIM_OCPreload_Enable);
+
+    MOTORS_TIM_DBG_CFG(motorMap[i]->timDbgStop, ENABLE);
+    //Enable the timer PWM outputs
+    TIM_CtrlPWMOutputs(motorMap[i]->tim, ENABLE);
+  }
+
+  // Start the timers
+  for (i = 0; i < NBR_OF_MOTORS; i++)
+  {
+    TIM_Cmd(motorMap[i]->tim, ENABLE);
+  }
+
+  isInit = true;
 
   // Output zero power
   motorsSetRatio(MOTOR_M1, 0);
@@ -230,149 +230,149 @@ void motorsInit(const MotorPerifDef** motorMapSelect)
 
 void motorsDeInit(const MotorPerifDef** motorMapSelect)
 {
-  // int i;
-  // GPIO_InitTypeDef GPIO_InitStructure;
-
-  // for (i = 0; i < NBR_OF_MOTORS; i++)
-  // {
-  //   // Configure default
-  //   GPIO_StructInit(&GPIO_InitStructure);
-  //   GPIO_InitStructure.GPIO_Pin = motorMap[i]->gpioPin;
-  //   GPIO_Init(motorMap[i]->gpioPort, &GPIO_InitStructure);
-
-  //   //Map timers to alternate functions
-  //   GPIO_PinAFConfig(motorMap[i]->gpioPort, motorMap[i]->gpioPinSource, 0x00);
-
-  //   //Deinit timer
-  //   TIM_DeInit(motorMap[i]->tim);
-  // }
+  int i;
+  GPIO_InitTypeDef GPIO_InitStructure;
+
+  for (i = 0; i < NBR_OF_MOTORS; i++)
+  {
+    // Configure default
+    GPIO_StructInit(&GPIO_InitStructure);
+    GPIO_InitStructure.GPIO_Pin = motorMap[i]->gpioPin;
+    GPIO_Init(motorMap[i]->gpioPort, &GPIO_InitStructure);
+
+    //Map timers to alternate functions
+    GPIO_PinAFConfig(motorMap[i]->gpioPort, motorMap[i]->gpioPinSource, 0x00);
+
+    //Deinit timer
+    TIM_DeInit(motorMap[i]->tim);
+  }
 }
 
 bool motorsTest(void)
 {
-//   int i;
-
-//   for (i = 0; i < sizeof(MOTORS) / sizeof(*MOTORS); i++)
-//   {
-//     if (motorMap[i]->drvType == BRUSHED)
-//     {
-// #ifdef ACTIVATE_STARTUP_SOUND
-//       motorsBeep(MOTORS[i], true, testsound[i], (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / A4)/ 20);
-//       vTaskDelay(M2T(MOTORS_TEST_ON_TIME_MS));
-//       motorsBeep(MOTORS[i], false, 0, 0);
-//       vTaskDelay(M2T(MOTORS_TEST_DELAY_TIME_MS));
-// #else
-//       motorsSetRatio(MOTORS[i], MOTORS_TEST_RATIO);
-//       vTaskDelay(M2T(MOTORS_TEST_ON_TIME_MS));
-//       motorsSetRatio(MOTORS[i], 0);
-//       vTaskDelay(M2T(MOTORS_TEST_DELAY_TIME_MS));
-// #endif
-//     }
-//   }
-
-//   return isInit;
+  int i;
+
+  for (i = 0; i < sizeof(MOTORS) / sizeof(*MOTORS); i++)
+  {
+    if (motorMap[i]->drvType == BRUSHED)
+    {
+#ifdef ACTIVATE_STARTUP_SOUND
+      motorsBeep(MOTORS[i], true, testsound[i], (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / A4)/ 20);
+      vTaskDelay(M2T(MOTORS_TEST_ON_TIME_MS));
+      motorsBeep(MOTORS[i], false, 0, 0);
+      vTaskDelay(M2T(MOTORS_TEST_DELAY_TIME_MS));
+#else
+      motorsSetRatio(MOTORS[i], MOTORS_TEST_RATIO);
+      vTaskDelay(M2T(MOTORS_TEST_ON_TIME_MS));
+      motorsSetRatio(MOTORS[i], 0);
+      vTaskDelay(M2T(MOTORS_TEST_DELAY_TIME_MS));
+#endif
+    }
+  }
+
+  return isInit;
 }
 
 // Ithrust is thrust mapped for 65536 <==> 60 grams
 void motorsSetRatio(uint32_t id, uint16_t ithrust)
 {
-//   if (isInit) {
-//     uint16_t ratio;
-
-//     ASSERT(id < NBR_OF_MOTORS);
-
-//     ratio = ithrust;
-
-// #ifdef ENABLE_THRUST_BAT_COMPENSATED
-//     if (motorMap[id]->drvType == BRUSHED)
-//     {
-//       // To make sure we provide the correct PWM given current supply voltage
-//       // from the battery, we do calculations based on measurements of PWM,
-//       // voltage and thrust. See comment at function definition for details.
-//       ratio = motorsCompensateBatteryVoltage(ithrust);
-//       motor_ratios[id] = ratio;
-//     }
-// #endif
-//     if (motorMap[id]->drvType == BRUSHLESS)
-//     {
-//       motorMap[id]->setCompare(motorMap[id]->tim, motorsBLConv16ToBits(ratio));
-//     }
-//     else
-//     {
-//       motorMap[id]->setCompare(motorMap[id]->tim, motorsConv16ToBits(ratio));
-//     }
-//   }
+  if (isInit) {
+    uint16_t ratio;
+
+    ASSERT(id < NBR_OF_MOTORS);
+
+    ratio = ithrust;
+
+#ifdef ENABLE_THRUST_BAT_COMPENSATED
+    if (motorMap[id]->drvType == BRUSHED)
+    {
+      // To make sure we provide the correct PWM given current supply voltage
+      // from the battery, we do calculations based on measurements of PWM,
+      // voltage and thrust. See comment at function definition for details.
+      ratio = motorsCompensateBatteryVoltage(ithrust);
+      motor_ratios[id] = ratio;
+    }
+#endif
+    if (motorMap[id]->drvType == BRUSHLESS)
+    {
+      motorMap[id]->setCompare(motorMap[id]->tim, motorsBLConv16ToBits(ratio));
+    }
+    else
+    {
+      motorMap[id]->setCompare(motorMap[id]->tim, motorsConv16ToBits(ratio));
+    }
+  }
 }
 
 int motorsGetRatio(uint32_t id)
 {
-  // int ratio;
-
-  // ASSERT(id < NBR_OF_MOTORS);
-  // if (motorMap[id]->drvType == BRUSHLESS)
-  // {
-  //   ratio = motorsBLConvBitsTo16(motorMap[id]->getCompare(motorMap[id]->tim));
-  // }
-  // else
-  // {
-  //   ratio = motorsConvBitsTo16(motorMap[id]->getCompare(motorMap[id]->tim));
-  // }
-
-  // return ratio;
+  int ratio;
+
+  ASSERT(id < NBR_OF_MOTORS);
+  if (motorMap[id]->drvType == BRUSHLESS)
+  {
+    ratio = motorsBLConvBitsTo16(motorMap[id]->getCompare(motorMap[id]->tim));
+  }
+  else
+  {
+    ratio = motorsConvBitsTo16(motorMap[id]->getCompare(motorMap[id]->tim));
+  }
+
+  return ratio;
 }
 
 void motorsBeep(int id, bool enable, uint16_t frequency, uint16_t ratio)
 {
-  // TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
-
-  // ASSERT(id < NBR_OF_MOTORS);
-
-  // TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
-
-  // if (enable)
-  // {
-  //   TIM_TimeBaseStructure.TIM_Prescaler = (5 - 1);
-  //   TIM_TimeBaseStructure.TIM_Period = (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency);
-  // }
-  // else
-  // {
-  //   TIM_TimeBaseStructure.TIM_Period = motorMap[id]->timPeriod;
-  //   TIM_TimeBaseStructure.TIM_Prescaler = motorMap[id]->timPrescaler;
-  // }
-
-  // // Timer configuration
-  // TIM_TimeBaseInit(motorMap[id]->tim, &TIM_TimeBaseStructure);
-  // motorMap[id]->setCompare(motorMap[id]->tim, ratio);
+  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
+
+  ASSERT(id < NBR_OF_MOTORS);
+
+  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
+
+  if (enable)
+  {
+    TIM_TimeBaseStructure.TIM_Prescaler = (5 - 1);
+    TIM_TimeBaseStructure.TIM_Period = (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency);
+  }
+  else
+  {
+    TIM_TimeBaseStructure.TIM_Period = motorMap[id]->timPeriod;
+    TIM_TimeBaseStructure.TIM_Prescaler = motorMap[id]->timPrescaler;
+  }
+
+  // Timer configuration
+  TIM_TimeBaseInit(motorMap[id]->tim, &TIM_TimeBaseStructure);
+  motorMap[id]->setCompare(motorMap[id]->tim, ratio);
 }
 
 
 // Play a tone with a given frequency and a specific duration in milliseconds (ms)
 void motorsPlayTone(uint16_t frequency, uint16_t duration_msec)
 {
-  // motorsBeep(MOTOR_M1, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
-  // motorsBeep(MOTOR_M2, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
-  // motorsBeep(MOTOR_M3, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
-  // motorsBeep(MOTOR_M4, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
-  // vTaskDelay(M2T(duration_msec));
-  // motorsBeep(MOTOR_M1, false, frequency, 0);
-  // motorsBeep(MOTOR_M2, false, frequency, 0);
-  // motorsBeep(MOTOR_M3, false, frequency, 0);
-  // motorsBeep(MOTOR_M4, false, frequency, 0);
+  motorsBeep(MOTOR_M1, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
+  motorsBeep(MOTOR_M2, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
+  motorsBeep(MOTOR_M3, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
+  motorsBeep(MOTOR_M4, true, frequency, (uint16_t)(MOTORS_TIM_BEEP_CLK_FREQ / frequency)/ 20);
+  vTaskDelay(M2T(duration_msec));
+  motorsBeep(MOTOR_M1, false, frequency, 0);
+  motorsBeep(MOTOR_M2, false, frequency, 0);
+  motorsBeep(MOTOR_M3, false, frequency, 0);
+  motorsBeep(MOTOR_M4, false, frequency, 0);
 }
 
 // Plays a melody from a note array
 void motorsPlayMelody(uint16_t *notes)
 {
-  // int i = 0;
-  // uint16_t note;      // Note in hz
-  // uint16_t duration;  // Duration in ms
-
-  // do
-  // {
-  //   note = notes[i++];
-  //   duration = notes[i++];
-  //   motorsPlayTone(note, duration);
-  // } while (duration != 0);
+  int i = 0;
+  uint16_t note;      // Note in hz
+  uint16_t duration;  // Duration in ms
+
+  do
+  {
+    note = notes[i++];
+    duration = notes[i++];
+    motorsPlayTone(note, duration);
+  } while (duration != 0);
 }
 /**
  * Logging variables of the motors PWM output
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6050.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6050.c
index fd3ae6282..ba0aa1a14 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6050.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6050.c
@@ -50,25 +50,24 @@ static bool isInit;
  */
 void mpu6050Init(I2C_Dev *i2cPort)
 {
-//   if (isInit)
-//     return;
+  if (isInit)
+    return;
 
-//   I2Cx = i2cPort;
-//   devAddr = MPU6050_ADDRESS_AD0_HIGH;
-// //FIXME    devAddr = MPU6050_ADDRESS_AD0_LOW;
+  I2Cx = i2cPort;
+  devAddr = MPU6050_ADDRESS_AD0_HIGH;
+//FIXME    devAddr = MPU6050_ADDRESS_AD0_LOW;
 
   isInit = true;
 }
 
 bool mpu6050Test(void)
 {
-  // bool testStatus;
-  bool testStatus = true;
+  bool testStatus;
 
-  // if (!isInit)
-  //   return false;
+  if (!isInit)
+    return false;
 
-  // testStatus = mpu6050TestConnection();
+  testStatus = mpu6050TestConnection();
 
   return testStatus;
 }
@@ -79,7 +78,7 @@ bool mpu6050Test(void)
  */
 bool mpu6050TestConnection()
 {
-  // return mpu6050GetDeviceID() == 0b110100;
+  return mpu6050GetDeviceID() == 0b110100;
 }
 
 /** Do a MPU6050 self test.
@@ -87,100 +86,99 @@ bool mpu6050TestConnection()
  */
 bool mpu6050SelfTest()
 {
-//   bool testStatus = true;
-//   int16_t axi16, ayi16, azi16;
-//   int16_t gxi16, gyi16, gzi16;
-// //  int8_t axfi8, ayfi8, azfi8;
-// //  int8_t gxfi8, gyfi8, gzfi8;
-//   float axf, ayf, azf;
-//   float gxf, gyf, gzf;
-//   float axfTst, ayfTst, azfTst;
-//   float gxfTst, gyfTst, gzfTst;
-//   float axfDiff, ayfDiff, azfDiff;
-//   float gxfDiff, gyfDiff, gzfDiff;
-//   float gRange, aRange;
-//   uint32_t scrap;
-
-//   aRange = mpu6050GetFullScaleAccelGPL();
-//   gRange = mpu6050GetFullScaleGyroDPL();
-
-//   // First values after startup can be read as zero. Scrap a couple to be sure.
-//   for (scrap = 0; scrap < 20; scrap++)
-//   {
-//     mpu6050GetMotion6(&axi16, &ayi16, &azi16, &gxi16, &gyi16, &gzi16);
-//     vTaskDelay(M2T(2));
-//   }
-//   // First measurement
-//   gxf = gxi16 * gRange;
-//   gyf = gyi16 * gRange;
-//   gzf = gzi16 * gRange;
-//   axf = axi16 * aRange;
-//   ayf = ayi16 * aRange;
-//   azf = azi16 * aRange;
-
-//   // Enable self test
-//   mpu6050SetGyroXSelfTest(true);
-//   mpu6050SetGyroYSelfTest(true);
-//   mpu6050SetGyroZSelfTest(true);
-//   mpu6050SetAccelXSelfTest(true);
-//   mpu6050SetAccelYSelfTest(true);
-//   mpu6050SetAccelZSelfTest(true);
-
-//   // Wait for self test to take effect
-//   vTaskDelay(M2T(MPU6050_SELF_TEST_DELAY_MS));
-//   // Take second measurement
-//   mpu6050GetMotion6(&axi16, &ayi16, &azi16, &gxi16, &gyi16, &gzi16);
-//   gxfTst = gxi16 * gRange;
-//   gyfTst = gyi16 * gRange;
-//   gzfTst = gzi16 * gRange;
-//   axfTst = axi16 * aRange;
-//   ayfTst = ayi16 * aRange;
-//   azfTst = azi16 * aRange;
-
-//   // Disable self test
-//   mpu6050SetGyroXSelfTest(false);
-//   mpu6050SetGyroYSelfTest(false);
-//   mpu6050SetGyroZSelfTest(false);
-//   mpu6050SetAccelXSelfTest(false);
-//   mpu6050SetAccelYSelfTest(false);
-//   mpu6050SetAccelZSelfTest(false);
-
-// //  // Read factory values
-// //  i2cdevReadByte(I2Cx, devAddr, 0x00, (uint8_t *)&gxfi8);
-// //  i2cdevReadByte(I2Cx, devAddr, 0x01, (uint8_t *)&gyfi8);
-// //  i2cdevReadByte(I2Cx, devAddr, 0x02, (uint8_t *)&gzfi8);
-// //  i2cdevReadByte(I2Cx, devAddr, 0x0D, (uint8_t *)&axfi8);
-// //  i2cdevReadByte(I2Cx, devAddr, 0x0E, (uint8_t *)&ayfi8);
-// //  i2cdevReadByte(I2Cx, devAddr, 0x0F, (uint8_t *)&azfi8);
-// //
-// //  DEBUG_PRINT("gxf:%i, gyf:%i, gzf:%i, axf:%i, ayf:%i, azf:%i\n",
-// //              (int)gxfi8, (int)gyfi8, (int)gzfi8, (int)axfi8, (int)ayfi8, (int)azfi8);
-
-//   // Calculate difference
-//   gxfDiff = gxfTst - gxf;
-//   gyfDiff = gyfTst - gyf;
-//   gzfDiff = gzfTst - gzf;
-//   axfDiff = axfTst - axf;
-//   ayfDiff = ayfTst - ayf;
-//   azfDiff = azfTst - azf;
-
-//   // Check result
-//   if (mpu6050EvaluateSelfTest(MPU6050_ST_GYRO_LOW, MPU6050_ST_GYRO_HIGH, gxfDiff, "gyro X") &&
-//       mpu6050EvaluateSelfTest(-MPU6050_ST_GYRO_HIGH, -MPU6050_ST_GYRO_LOW, gyfDiff, "gyro Y") &&
-//       mpu6050EvaluateSelfTest(MPU6050_ST_GYRO_LOW, MPU6050_ST_GYRO_HIGH, gzfDiff, "gyro Z") &&
-//       mpu6050EvaluateSelfTest(MPU6050_ST_ACCEL_LOW, MPU6050_ST_ACCEL_HIGH, axfDiff, "acc X") &&
-//       mpu6050EvaluateSelfTest(MPU6050_ST_ACCEL_LOW, MPU6050_ST_ACCEL_HIGH, ayfDiff, "acc Y") &&
-//       mpu6050EvaluateSelfTest(MPU6050_ST_ACCEL_LOW, MPU6050_ST_ACCEL_HIGH, azfDiff, "acc Z"))
-//   {
-//     DEBUG_PRINT("Self test [OK].\n");
-//   }
-//   else
-//   {
-//     testStatus = false;
-//   }
-
-  // return testStatus;
-  return false;
+  bool testStatus = true;
+  int16_t axi16, ayi16, azi16;
+  int16_t gxi16, gyi16, gzi16;
+//  int8_t axfi8, ayfi8, azfi8;
+//  int8_t gxfi8, gyfi8, gzfi8;
+  float axf, ayf, azf;
+  float gxf, gyf, gzf;
+  float axfTst, ayfTst, azfTst;
+  float gxfTst, gyfTst, gzfTst;
+  float axfDiff, ayfDiff, azfDiff;
+  float gxfDiff, gyfDiff, gzfDiff;
+  float gRange, aRange;
+  uint32_t scrap;
+
+  aRange = mpu6050GetFullScaleAccelGPL();
+  gRange = mpu6050GetFullScaleGyroDPL();
+
+  // First values after startup can be read as zero. Scrap a couple to be sure.
+  for (scrap = 0; scrap < 20; scrap++)
+  {
+    mpu6050GetMotion6(&axi16, &ayi16, &azi16, &gxi16, &gyi16, &gzi16);
+    vTaskDelay(M2T(2));
+  }
+  // First measurement
+  gxf = gxi16 * gRange;
+  gyf = gyi16 * gRange;
+  gzf = gzi16 * gRange;
+  axf = axi16 * aRange;
+  ayf = ayi16 * aRange;
+  azf = azi16 * aRange;
+
+  // Enable self test
+  mpu6050SetGyroXSelfTest(true);
+  mpu6050SetGyroYSelfTest(true);
+  mpu6050SetGyroZSelfTest(true);
+  mpu6050SetAccelXSelfTest(true);
+  mpu6050SetAccelYSelfTest(true);
+  mpu6050SetAccelZSelfTest(true);
+
+  // Wait for self test to take effect
+  vTaskDelay(M2T(MPU6050_SELF_TEST_DELAY_MS));
+  // Take second measurement
+  mpu6050GetMotion6(&axi16, &ayi16, &azi16, &gxi16, &gyi16, &gzi16);
+  gxfTst = gxi16 * gRange;
+  gyfTst = gyi16 * gRange;
+  gzfTst = gzi16 * gRange;
+  axfTst = axi16 * aRange;
+  ayfTst = ayi16 * aRange;
+  azfTst = azi16 * aRange;
+
+  // Disable self test
+  mpu6050SetGyroXSelfTest(false);
+  mpu6050SetGyroYSelfTest(false);
+  mpu6050SetGyroZSelfTest(false);
+  mpu6050SetAccelXSelfTest(false);
+  mpu6050SetAccelYSelfTest(false);
+  mpu6050SetAccelZSelfTest(false);
+
+//  // Read factory values
+//  i2cdevReadByte(I2Cx, devAddr, 0x00, (uint8_t *)&gxfi8);
+//  i2cdevReadByte(I2Cx, devAddr, 0x01, (uint8_t *)&gyfi8);
+//  i2cdevReadByte(I2Cx, devAddr, 0x02, (uint8_t *)&gzfi8);
+//  i2cdevReadByte(I2Cx, devAddr, 0x0D, (uint8_t *)&axfi8);
+//  i2cdevReadByte(I2Cx, devAddr, 0x0E, (uint8_t *)&ayfi8);
+//  i2cdevReadByte(I2Cx, devAddr, 0x0F, (uint8_t *)&azfi8);
+//
+//  DEBUG_PRINT("gxf:%i, gyf:%i, gzf:%i, axf:%i, ayf:%i, azf:%i\n",
+//              (int)gxfi8, (int)gyfi8, (int)gzfi8, (int)axfi8, (int)ayfi8, (int)azfi8);
+
+  // Calculate difference
+  gxfDiff = gxfTst - gxf;
+  gyfDiff = gyfTst - gyf;
+  gzfDiff = gzfTst - gzf;
+  axfDiff = axfTst - axf;
+  ayfDiff = ayfTst - ayf;
+  azfDiff = azfTst - azf;
+
+  // Check result
+  if (mpu6050EvaluateSelfTest(MPU6050_ST_GYRO_LOW, MPU6050_ST_GYRO_HIGH, gxfDiff, "gyro X") &&
+      mpu6050EvaluateSelfTest(-MPU6050_ST_GYRO_HIGH, -MPU6050_ST_GYRO_LOW, gyfDiff, "gyro Y") &&
+      mpu6050EvaluateSelfTest(MPU6050_ST_GYRO_LOW, MPU6050_ST_GYRO_HIGH, gzfDiff, "gyro Z") &&
+      mpu6050EvaluateSelfTest(MPU6050_ST_ACCEL_LOW, MPU6050_ST_ACCEL_HIGH, axfDiff, "acc X") &&
+      mpu6050EvaluateSelfTest(MPU6050_ST_ACCEL_LOW, MPU6050_ST_ACCEL_HIGH, ayfDiff, "acc Y") &&
+      mpu6050EvaluateSelfTest(MPU6050_ST_ACCEL_LOW, MPU6050_ST_ACCEL_HIGH, azfDiff, "acc Z"))
+  {
+    DEBUG_PRINT("Self test [OK].\n");
+  }
+  else
+  {
+    testStatus = false;
+  }
+
+  return testStatus;
 }
 
 /** Evaluate the values from a MPU6050 self test.
@@ -192,12 +190,12 @@ bool mpu6050SelfTest()
  */
 bool mpu6050EvaluateSelfTest(float low, float high, float value, char* string)
 {
-  // if (value < low || value > high)
-  // {
-  //   DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
-  //               string, (double)low, (double)high, (double)value);
-  //   return false;
-  // }
+  if (value < low || value > high)
+  {
+    DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
+                string, (double)low, (double)high, (double)value);
+    return false;
+  }
   return true;
 }
 
@@ -211,7 +209,7 @@ bool mpu6050EvaluateSelfTest(float low, float high, float value, char* string)
  */
 uint8_t mpu6050GetAuxVDDIOLevel()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer);
   return buffer[0];
 }
 /** Set the auxiliary I2C supply voltage level.
@@ -222,7 +220,7 @@ uint8_t mpu6050GetAuxVDDIOLevel()
  */
 void mpu6050SetAuxVDDIOLevel(uint8_t level)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level);
 }
 
 // SMPLRT_DIV register
@@ -250,7 +248,7 @@ void mpu6050SetAuxVDDIOLevel(uint8_t level)
  */
 uint8_t mpu6050GetRate()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_SMPLRT_DIV, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_SMPLRT_DIV, buffer);
   return buffer[0];
 }
 /** Set gyroscope sample rate divider.
@@ -260,7 +258,7 @@ uint8_t mpu6050GetRate()
  */
 void mpu6050SetRate(uint8_t rate)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_SMPLRT_DIV, rate);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_SMPLRT_DIV, rate);
 }
 
 // CONFIG register
@@ -294,8 +292,8 @@ void mpu6050SetRate(uint8_t rate)
  */
 uint8_t mpu6050GetExternalFrameSync()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT,
-  //     MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT,
+      MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer);
   return buffer[0];
 }
 /** Set external FSYNC configuration.
@@ -305,8 +303,8 @@ uint8_t mpu6050GetExternalFrameSync()
  */
 void mpu6050SetExternalFrameSync(uint8_t sync)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT,
-  //     MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT,
+      MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync);
 }
 /** Get digital low-pass filter configuration.
  * The DLPF_CFG parameter sets the digital low pass filter configuration. It
@@ -338,8 +336,8 @@ void mpu6050SetExternalFrameSync(uint8_t sync)
  */
 uint8_t mpu6050GetDLPFMode()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT,
-  //     MPU6050_CFG_DLPF_CFG_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT,
+      MPU6050_CFG_DLPF_CFG_LENGTH, buffer);
   return buffer[0];
 }
 /** Set digital low-pass filter configuration.
@@ -352,8 +350,8 @@ uint8_t mpu6050GetDLPFMode()
  */
 void mpu6050SetDLPFMode(uint8_t mode)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT,
-  //     MPU6050_CFG_DLPF_CFG_LENGTH, mode);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT,
+      MPU6050_CFG_DLPF_CFG_LENGTH, mode);
 }
 
 // GYRO_CONFIG register
@@ -377,8 +375,8 @@ void mpu6050SetDLPFMode(uint8_t mode)
  */
 uint8_t mpu6050GetFullScaleGyroRangeId()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT,
-  //     MPU6050_GCONFIG_FS_SEL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT,
+      MPU6050_GCONFIG_FS_SEL_LENGTH, buffer);
   return buffer[0];
 }
 
@@ -392,30 +390,28 @@ uint8_t mpu6050GetFullScaleGyroRangeId()
  */
 float mpu6050GetFullScaleGyroDPL()
 {
-  float range = 1.0;
-
-  // int32_t rangeId;
-  // float range;
-
-  // rangeId = mpu6050GetFullScaleGyroRangeId();
-  // switch (rangeId)
-  // {
-  //   case MPU6050_GYRO_FS_250:
-  //     range = MPU6050_DEG_PER_LSB_250;
-  //     break;
-  //   case MPU6050_GYRO_FS_500:
-  //     range = MPU6050_DEG_PER_LSB_500;
-  //     break;
-  //   case MPU6050_GYRO_FS_1000:
-  //     range = MPU6050_DEG_PER_LSB_1000;
-  //     break;
-  //   case MPU6050_GYRO_FS_2000:
-  //     range = MPU6050_DEG_PER_LSB_2000;
-  //     break;
-  //   default:
-  //     range = MPU6050_DEG_PER_LSB_1000;
-  //     break;
-  // }
+  int32_t rangeId;
+  float range;
+
+  rangeId = mpu6050GetFullScaleGyroRangeId();
+  switch (rangeId)
+  {
+    case MPU6050_GYRO_FS_250:
+      range = MPU6050_DEG_PER_LSB_250;
+      break;
+    case MPU6050_GYRO_FS_500:
+      range = MPU6050_DEG_PER_LSB_500;
+      break;
+    case MPU6050_GYRO_FS_1000:
+      range = MPU6050_DEG_PER_LSB_1000;
+      break;
+    case MPU6050_GYRO_FS_2000:
+      range = MPU6050_DEG_PER_LSB_2000;
+      break;
+    default:
+      range = MPU6050_DEG_PER_LSB_1000;
+      break;
+  }
 
   return range;
 }
@@ -430,23 +426,23 @@ float mpu6050GetFullScaleGyroDPL()
  */
 void mpu6050SetFullScaleGyroRange(uint8_t range)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT,
-  //     MPU6050_GCONFIG_FS_SEL_LENGTH, range);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT,
+      MPU6050_GCONFIG_FS_SEL_LENGTH, range);
 }
 
 void mpu6050SetGyroXSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_XG_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_XG_ST_BIT, enabled);
 }
 
 void mpu6050SetGyroYSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_YG_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_YG_ST_BIT, enabled);
 }
 
 void mpu6050SetGyroZSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_ZG_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_ZG_ST_BIT, enabled);
 }
 
 // ACCEL_CONFIG register
@@ -457,7 +453,7 @@ void mpu6050SetGyroZSelfTest(bool enabled)
  */
 bool mpu6050GetAccelXSelfTest()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer);
   return buffer[0];
 }
 /** Get self-test enabled setting for accelerometer X axis.
@@ -466,7 +462,7 @@ bool mpu6050GetAccelXSelfTest()
  */
 void mpu6050SetAccelXSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled);
 }
 /** Get self-test enabled value for accelerometer Y axis.
  * @return Self-test enabled value
@@ -474,7 +470,7 @@ void mpu6050SetAccelXSelfTest(bool enabled)
  */
 bool mpu6050GetAccelYSelfTest()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer);
   return buffer[0];
 }
 /** Get self-test enabled value for accelerometer Y axis.
@@ -483,7 +479,7 @@ bool mpu6050GetAccelYSelfTest()
  */
 void mpu6050SetAccelYSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled);
 }
 /** Get self-test enabled value for accelerometer Z axis.
  * @return Self-test enabled value
@@ -491,7 +487,7 @@ void mpu6050SetAccelYSelfTest(bool enabled)
  */
 bool mpu6050GetAccelZSelfTest()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer);
   return buffer[0];
 }
 /** Set self-test enabled value for accelerometer Z axis.
@@ -500,7 +496,7 @@ bool mpu6050GetAccelZSelfTest()
  */
 void mpu6050SetAccelZSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled);
 }
 /** Get full-scale accelerometer range.
  * The FS_SEL parameter allows setting the full-scale range of the accelerometer
@@ -521,8 +517,8 @@ void mpu6050SetAccelZSelfTest(bool enabled)
  */
 uint8_t mpu6050GetFullScaleAccelRangeId()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT,
-  //     MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT,
+      MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer);
   return buffer[0];
 }
 
@@ -536,30 +532,28 @@ uint8_t mpu6050GetFullScaleAccelRangeId()
  */
 float mpu6050GetFullScaleAccelGPL()
 {
-  float range = 1.0;
-
-  // int32_t rangeId;
-  // float range;
-
-  // rangeId = mpu6050GetFullScaleAccelRangeId();
-  // switch (rangeId)
-  // {
-  //   case MPU6050_ACCEL_FS_2:
-  //     range = MPU6050_G_PER_LSB_2;
-  //     break;
-  //   case MPU6050_ACCEL_FS_4:
-  //     range = MPU6050_G_PER_LSB_4;
-  //     break;
-  //   case MPU6050_ACCEL_FS_8:
-  //     range = MPU6050_G_PER_LSB_8;
-  //     break;
-  //   case MPU6050_ACCEL_FS_16:
-  //     range = MPU6050_G_PER_LSB_16;
-  //     break;
-  //   default:
-  //     range = MPU6050_DEG_PER_LSB_1000;
-  //     break;
-  // }
+  int32_t rangeId;
+  float range;
+
+  rangeId = mpu6050GetFullScaleAccelRangeId();
+  switch (rangeId)
+  {
+    case MPU6050_ACCEL_FS_2:
+      range = MPU6050_G_PER_LSB_2;
+      break;
+    case MPU6050_ACCEL_FS_4:
+      range = MPU6050_G_PER_LSB_4;
+      break;
+    case MPU6050_ACCEL_FS_8:
+      range = MPU6050_G_PER_LSB_8;
+      break;
+    case MPU6050_ACCEL_FS_16:
+      range = MPU6050_G_PER_LSB_16;
+      break;
+    default:
+      range = MPU6050_DEG_PER_LSB_1000;
+      break;
+  }
 
   return range;
 }
@@ -570,7 +564,7 @@ float mpu6050GetFullScaleAccelGPL()
  */
 void mpu6050SetFullScaleAccelRange(uint8_t range)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT,
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT,
       MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
 }
 /** Get the high-pass filter configuration.
@@ -610,8 +604,8 @@ void mpu6050SetFullScaleAccelRange(uint8_t range)
  */
 uint8_t mpu6050GetDHPFMode()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT,
-      // MPU6050_ACONFIG_ACCEL_HPF_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT,
+      MPU6050_ACONFIG_ACCEL_HPF_LENGTH, buffer);
   return buffer[0];
 }
 /** Set the high-pass filter configuration.
@@ -622,8 +616,8 @@ uint8_t mpu6050GetDHPFMode()
  */
 void mpu6050SetDHPFMode(uint8_t bandwidth)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT,
-      // MPU6050_ACONFIG_ACCEL_HPF_LENGTH, bandwidth);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT,
+      MPU6050_ACONFIG_ACCEL_HPF_LENGTH, bandwidth);
 }
 
 // FF_THR register
@@ -645,7 +639,7 @@ void mpu6050SetDHPFMode(uint8_t bandwidth)
  */
 uint8_t mpu6050GetFreefallDetectionThreshold()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_FF_THR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_FF_THR, buffer);
   return buffer[0];
 }
 /** Get free-fall event acceleration threshold.
@@ -655,7 +649,7 @@ uint8_t mpu6050GetFreefallDetectionThreshold()
  */
 void mpu6050SetFreefallDetectionThreshold(uint8_t threshold)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_FF_THR, threshold);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_FF_THR, threshold);
 }
 
 // FF_DUR register
@@ -679,7 +673,7 @@ void mpu6050SetFreefallDetectionThreshold(uint8_t threshold)
  */
 uint8_t mpu6050GetFreefallDetectionDuration()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_FF_DUR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_FF_DUR, buffer);
   return buffer[0];
 }
 /** Get free-fall event duration threshold.
@@ -689,7 +683,7 @@ uint8_t mpu6050GetFreefallDetectionDuration()
  */
 void mpu6050SetFreefallDetectionDuration(uint8_t duration)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_FF_DUR, duration);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_FF_DUR, duration);
 }
 
 // MOT_THR register
@@ -715,7 +709,7 @@ void mpu6050SetFreefallDetectionDuration(uint8_t duration)
  */
 uint8_t mpu6050GetMotionDetectionThreshold()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_MOT_THR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_MOT_THR, buffer);
   return buffer[0];
 }
 /** Set free-fall event acceleration threshold.
@@ -725,7 +719,7 @@ uint8_t mpu6050GetMotionDetectionThreshold()
  */
 void mpu6050SetMotionDetectionThreshold(uint8_t threshold)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MOT_THR, threshold);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MOT_THR, threshold);
 }
 
 // MOT_DUR register
@@ -747,7 +741,7 @@ void mpu6050SetMotionDetectionThreshold(uint8_t threshold)
  */
 uint8_t mpu6050GetMotionDetectionDuration()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_MOT_DUR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_MOT_DUR, buffer);
   return buffer[0];
 }
 /** Set motion detection event duration threshold.
@@ -757,7 +751,7 @@ uint8_t mpu6050GetMotionDetectionDuration()
  */
 void mpu6050SetMotionDetectionDuration(uint8_t duration)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MOT_DUR, duration);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MOT_DUR, duration);
 }
 
 // ZRMOT_THR register
@@ -789,7 +783,7 @@ void mpu6050SetMotionDetectionDuration(uint8_t duration)
  */
 uint8_t mpu6050GetZeroMotionDetectionThreshold()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_THR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_THR, buffer);
   return buffer[0];
 }
 /** Set zero motion detection event acceleration threshold.
@@ -799,7 +793,7 @@ uint8_t mpu6050GetZeroMotionDetectionThreshold()
  */
 void mpu6050SetZeroMotionDetectionThreshold(uint8_t threshold)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_THR, threshold);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_THR, threshold);
 }
 
 // ZRMOT_DUR register
@@ -822,7 +816,7 @@ void mpu6050SetZeroMotionDetectionThreshold(uint8_t threshold)
  */
 uint8_t mpu6050GetZeroMotionDetectionDuration()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_DUR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_DUR, buffer);
   return buffer[0];
 }
 /** Set zero motion detection event duration threshold.
@@ -832,7 +826,7 @@ uint8_t mpu6050GetZeroMotionDetectionDuration()
  */
 void mpu6050SetZeroMotionDetectionDuration(uint8_t duration)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_DUR, duration);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_ZRMOT_DUR, duration);
 }
 
 // FIFO_EN register
@@ -845,7 +839,7 @@ void mpu6050SetZeroMotionDetectionDuration(uint8_t duration)
  */
 bool mpu6050GetTempFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set temperature FIFO enabled value.
@@ -855,7 +849,7 @@ bool mpu6050GetTempFIFOEnabled()
  */
 void mpu6050SetTempFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled);
 }
 /** Get gyroscope X-axis FIFO enabled value.
  * When set to 1, this bit enables GYRO_XOUT_H and GYRO_XOUT_L (Registers 67 and
@@ -865,7 +859,7 @@ void mpu6050SetTempFIFOEnabled(bool enabled)
  */
 bool mpu6050GetXGyroFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set gyroscope X-axis FIFO enabled value.
@@ -875,7 +869,7 @@ bool mpu6050GetXGyroFIFOEnabled()
  */
 void mpu6050SetXGyroFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled);
 }
 /** Get gyroscope Y-axis FIFO enabled value.
  * When set to 1, this bit enables GYRO_YOUT_H and GYRO_YOUT_L (Registers 69 and
@@ -885,7 +879,7 @@ void mpu6050SetXGyroFIFOEnabled(bool enabled)
  */
 bool mpu6050GetYGyroFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set gyroscope Y-axis FIFO enabled value.
@@ -895,7 +889,7 @@ bool mpu6050GetYGyroFIFOEnabled()
  */
 void mpu6050SetYGyroFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled);
 }
 /** Get gyroscope Z-axis FIFO enabled value.
  * When set to 1, this bit enables GYRO_ZOUT_H and GYRO_ZOUT_L (Registers 71 and
@@ -905,7 +899,7 @@ void mpu6050SetYGyroFIFOEnabled(bool enabled)
  */
 bool mpu6050GetZGyroFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set gyroscope Z-axis FIFO enabled value.
@@ -915,7 +909,7 @@ bool mpu6050GetZGyroFIFOEnabled()
  */
 void mpu6050SetZGyroFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled);
 }
 /** Get accelerometer FIFO enabled value.
  * When set to 1, this bit enables ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H,
@@ -926,7 +920,7 @@ void mpu6050SetZGyroFIFOEnabled(bool enabled)
  */
 bool mpu6050GetAccelFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set accelerometer FIFO enabled value.
@@ -946,7 +940,7 @@ void mpu6050SetAccelFIFOEnabled(bool enabled)
  */
 bool mpu6050GetSlave2FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 2 FIFO enabled value.
@@ -966,7 +960,7 @@ void mpu6050SetSlave2FIFOEnabled(bool enabled)
  */
 bool mpu6050GetSlave1FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 1 FIFO enabled value.
@@ -976,7 +970,7 @@ bool mpu6050GetSlave1FIFOEnabled()
  */
 void mpu6050SetSlave1FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled);
 }
 /** Get Slave 0 FIFO enabled value.
  * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96)
@@ -986,7 +980,7 @@ void mpu6050SetSlave1FIFOEnabled(bool enabled)
  */
 bool mpu6050GetSlave0FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 0 FIFO enabled value.
@@ -996,7 +990,7 @@ bool mpu6050GetSlave0FIFOEnabled()
  */
 void mpu6050SetSlave0FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled);
 }
 
 // I2C_MST_CTRL register
@@ -1018,7 +1012,7 @@ void mpu6050SetSlave0FIFOEnabled(bool enabled)
  */
 bool mpu6050GetMultiMasterEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set multi-master enabled value.
@@ -1028,7 +1022,7 @@ bool mpu6050GetMultiMasterEnabled()
  */
 void mpu6050SetMultiMasterEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled);
 }
 /** Get wait-for-external-sensor-data enabled value.
  * When the WAIT_FOR_ES bit is set to 1, the Data Ready interrupt will be
@@ -1043,7 +1037,7 @@ void mpu6050SetMultiMasterEnabled(bool enabled)
  */
 bool mpu6050GetWaitForExternalSensorEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer);
   return buffer[0];
 }
 /** Set wait-for-external-sensor-data enabled value.
@@ -1053,7 +1047,7 @@ bool mpu6050GetWaitForExternalSensorEnabled()
  */
 void mpu6050SetWaitForExternalSensorEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled);
 }
 /** Get Slave 3 FIFO enabled value.
  * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96)
@@ -1063,7 +1057,7 @@ void mpu6050SetWaitForExternalSensorEnabled(bool enabled)
  */
 bool mpu6050GetSlave3FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 3 FIFO enabled value.
@@ -1073,7 +1067,7 @@ bool mpu6050GetSlave3FIFOEnabled()
  */
 void mpu6050SetSlave3FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled);
 }
 /** Get slave read/write transition enabled value.
  * The I2C_MST_P_NSR bit configures the I2C Master's transition from one slave
@@ -1087,7 +1081,7 @@ void mpu6050SetSlave3FIFOEnabled(bool enabled)
  */
 bool mpu6050GetSlaveReadWriteTransitionEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer);
   return buffer[0];
 }
 /** Set slave read/write transition enabled value.
@@ -1130,8 +1124,8 @@ void mpu6050SetSlaveReadWriteTransitionEnabled(bool enabled)
  */
 uint8_t mpu6050GetMasterClockSpeed()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT,
-  //     MPU6050_I2C_MST_CLK_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT,
+      MPU6050_I2C_MST_CLK_LENGTH, buffer);
   return buffer[0];
 }
 /** Set I2C master clock speed.
@@ -1140,8 +1134,8 @@ uint8_t mpu6050GetMasterClockSpeed()
  */
 void mpu6050SetMasterClockSpeed(uint8_t speed)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT,
-  //     MPU6050_I2C_MST_CLK_LENGTH, speed);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT,
+      MPU6050_I2C_MST_CLK_LENGTH, speed);
 }
 
 // I2C_SLV* registers (Slave 0-3)
@@ -1189,9 +1183,9 @@ void mpu6050SetMasterClockSpeed(uint8_t speed)
  */
 uint8_t mpu6050GetSlaveAddress(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_ADDR + num * 3, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_ADDR + num * 3, buffer);
   return buffer[0];
 }
 /** Set the I2C address of the specified slave (0-3).
@@ -1202,9 +1196,9 @@ uint8_t mpu6050GetSlaveAddress(uint8_t num)
  */
 void mpu6050SetSlaveAddress(uint8_t num, uint8_t address)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_ADDR + num * 3, address);
+  if (num > 3)
+    return;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_ADDR + num * 3, address);
 }
 /** Get the active internal register for the specified slave (0-3).
  * Read/write operations for this slave will be done to whatever internal
@@ -1219,9 +1213,9 @@ void mpu6050SetSlaveAddress(uint8_t num, uint8_t address)
  */
 uint8_t mpu6050GetSlaveRegister(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_REG + num * 3, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_REG + num * 3, buffer);
   return buffer[0];
 }
 /** Set the active internal register for the specified slave (0-3).
@@ -1232,9 +1226,9 @@ uint8_t mpu6050GetSlaveRegister(uint8_t num)
  */
 void mpu6050SetSlaveRegister(uint8_t num, uint8_t reg)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_REG + num * 3, reg);
+  if (num > 3)
+    return;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_REG + num * 3, reg);
 }
 /** Get the enabled value for the specified slave (0-3).
  * When set to 1, this bit enables Slave 0 for data transfer operations. When
@@ -1245,11 +1239,10 @@ void mpu6050SetSlaveRegister(uint8_t num, uint8_t reg)
  */
 bool mpu6050GetSlaveEnabled(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set the enabled value for the specified slave (0-3).
  * @param num Slave number (0-3)
@@ -1259,10 +1252,10 @@ bool mpu6050GetSlaveEnabled(uint8_t num)
  */
 void mpu6050SetSlaveEnabled(uint8_t num, bool enabled)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_EN_BIT,
-  //     enabled);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_EN_BIT,
+      enabled);
 }
 /** Get word pair byte-swapping enabled for the specified slave (0-3).
  * When set to 1, this bit enables byte swapping. When byte swapping is enabled,
@@ -1277,12 +1270,11 @@ void mpu6050SetSlaveEnabled(uint8_t num, bool enabled)
  */
 bool mpu6050GetSlaveWordByteSwap(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_BYTE_SW_BIT,
-  //     buffer);
-  // return buffer[0];
-  return true;
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_BYTE_SW_BIT,
+      buffer);
+  return buffer[0];
 }
 /** Set word pair byte-swapping enabled for the specified slave (0-3).
  * @param num Slave number (0-3)
@@ -1292,10 +1284,10 @@ bool mpu6050GetSlaveWordByteSwap(uint8_t num)
  */
 void mpu6050SetSlaveWordByteSwap(uint8_t num, bool enabled)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_BYTE_SW_BIT,
-  //     enabled);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_BYTE_SW_BIT,
+      enabled);
 }
 /** Get write mode for the specified slave (0-3).
  * When set to 1, the transaction will read or write data only. When cleared to
@@ -1309,12 +1301,11 @@ void mpu6050SetSlaveWordByteSwap(uint8_t num, bool enabled)
  */
 bool mpu6050GetSlaveWriteMode(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_REG_DIS_BIT,
-  //     buffer);
-  // return buffer[0];
-  return true;
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_REG_DIS_BIT,
+      buffer);
+  return buffer[0];
 }
 /** Set write mode for the specified slave (0-3).
  * @param num Slave number (0-3)
@@ -1324,11 +1315,10 @@ bool mpu6050GetSlaveWriteMode(uint8_t num)
  */
 void mpu6050SetSlaveWriteMode(uint8_t num, bool mode)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_REG_DIS_BIT,
-  //     mode);
-
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_REG_DIS_BIT,
+      mode);
 }
 /** Get word pair grouping order offset for the specified slave (0-3).
  * This sets specifies the grouping order of word pairs received from registers.
@@ -1343,11 +1333,10 @@ void mpu6050SetSlaveWriteMode(uint8_t num, bool mode)
  */
 bool mpu6050GetSlaveWordGroupOffset(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_GRP_BIT, buffer);
-  // return buffer[0];
-  return true;
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_GRP_BIT, buffer);
+  return buffer[0];
 }
 /** Set word pair grouping order offset for the specified slave (0-3).
  * @param num Slave number (0-3)
@@ -1357,10 +1346,10 @@ bool mpu6050GetSlaveWordGroupOffset(uint8_t num)
  */
 void mpu6050SetSlaveWordGroupOffset(uint8_t num, bool enabled)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_GRP_BIT,
-  //     enabled);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_GRP_BIT,
+      enabled);
 }
 /** Get number of bytes to read for the specified slave (0-3).
  * Specifies the number of bytes transferred to and from Slave 0. Clearing this
@@ -1371,12 +1360,11 @@ void mpu6050SetSlaveWordGroupOffset(uint8_t num, bool enabled)
  */
 uint8_t mpu6050GetSlaveDataLength(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_LEN_BIT,
-  //     MPU6050_I2C_SLV_LEN_LENGTH, buffer);
-  // return buffer[0];
-  return 1;
+  if (num > 3)
+    return 0;
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_LEN_BIT,
+      MPU6050_I2C_SLV_LEN_LENGTH, buffer);
+  return buffer[0];
 }
 /** Set number of bytes to read for the specified slave (0-3).
  * @param num Slave number (0-3)
@@ -1386,10 +1374,10 @@ uint8_t mpu6050GetSlaveDataLength(uint8_t num)
  */
 void mpu6050SetSlaveDataLength(uint8_t num, uint8_t length)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_LEN_BIT,
-  //     MPU6050_I2C_SLV_LEN_LENGTH, length);
+  if (num > 3)
+    return;
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_CTRL + num * 3, MPU6050_I2C_SLV_LEN_BIT,
+      MPU6050_I2C_SLV_LEN_LENGTH, length);
 }
 
 // I2C_SLV* registers (Slave 4)
@@ -1405,10 +1393,8 @@ void mpu6050SetSlaveDataLength(uint8_t num, uint8_t length)
  */
 uint8_t mpu6050GetSlave4Address()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer);
-  // return buffer[0];
-
-  return 1;
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer);
+  return buffer[0];
 }
 /** Set the I2C address of Slave 4.
  * @param address New address for Slave 4
@@ -1438,7 +1424,7 @@ uint8_t mpu6050GetSlave4Register()
  */
 void mpu6050SetSlave4Register(uint8_t reg)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_REG, reg);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_REG, reg);
 }
 /** Set new byte to write to Slave 4.
  * This register stores the data to be written into the Slave 4. If I2C_SLV4_RW
@@ -1448,7 +1434,7 @@ void mpu6050SetSlave4Register(uint8_t reg)
  */
 void mpu6050SetSlave4OutputByte(uint8_t data)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_DO, data);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_DO, data);
 }
 /** Get the enabled value for the Slave 4.
  * When set to 1, this bit enables Slave 4 for data transfer operations. When
@@ -1458,9 +1444,8 @@ void mpu6050SetSlave4OutputByte(uint8_t data)
  */
 bool mpu6050GetSlave4Enabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set the enabled value for Slave 4.
  * @param enabled New enabled value for Slave 4
@@ -1469,7 +1454,7 @@ bool mpu6050GetSlave4Enabled()
  */
 void mpu6050SetSlave4Enabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled);
 }
 /** Get the enabled value for Slave 4 transaction interrupts.
  * When set to 1, this bit enables the generation of an interrupt signal upon
@@ -1482,9 +1467,8 @@ void mpu6050SetSlave4Enabled(bool enabled)
  */
 bool mpu6050GetSlave4InterruptEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set the enabled value for Slave 4 transaction interrupts.
  * @param enabled New enabled value for Slave 4 transaction interrupts.
@@ -1493,7 +1477,7 @@ bool mpu6050GetSlave4InterruptEnabled()
  */
 void mpu6050SetSlave4InterruptEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, enabled);
 }
 /** Get write mode for Slave 4.
  * When set to 1, the transaction will read or write data only. When cleared to
@@ -1506,9 +1490,8 @@ void mpu6050SetSlave4InterruptEnabled(bool enabled)
  */
 bool mpu6050GetSlave4WriteMode()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, buffer);
+  return buffer[0];
 }
 /** Set write mode for the Slave 4.
  * @param mode New write mode for Slave 4 (0 = register address + data, 1 = data only)
@@ -1517,7 +1500,7 @@ bool mpu6050GetSlave4WriteMode()
  */
 void mpu6050SetSlave4WriteMode(bool mode)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, mode);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, mode);
 }
 /** Get Slave 4 master delay value.
  * This configures the reduced access rate of I2C slaves relative to the Sample
@@ -1536,10 +1519,9 @@ void mpu6050SetSlave4WriteMode(bool mode)
  */
 uint8_t mpu6050GetSlave4MasterDelay()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT,
-  //     MPU6050_I2C_SLV4_MST_DLY_LENGTH, buffer);
-  // return buffer[0];
-  return 1;
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT,
+      MPU6050_I2C_SLV4_MST_DLY_LENGTH, buffer);
+  return buffer[0];
 }
 /** Set Slave 4 master delay value.
  * @param delay New Slave 4 master delay value
@@ -1548,8 +1530,8 @@ uint8_t mpu6050GetSlave4MasterDelay()
  */
 void mpu6050SetSlave4MasterDelay(uint8_t delay)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT,
-  //     MPU6050_I2C_SLV4_MST_DLY_LENGTH, delay);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT,
+      MPU6050_I2C_SLV4_MST_DLY_LENGTH, delay);
 }
 /** Get last available byte read from Slave 4.
  * This register stores the data read from Slave 4. This field is populated
@@ -1559,9 +1541,8 @@ void mpu6050SetSlave4MasterDelay(uint8_t delay)
  */
 uint8_t mpu6050GetSlate4InputByte()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_DI, buffer);
-  // return buffer[0];
-  return 1;
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV4_DI, buffer);
+  return buffer[0];
 }
 
 // I2C_MST_STATUS register
@@ -1577,9 +1558,8 @@ uint8_t mpu6050GetSlate4InputByte()
  */
 bool mpu6050GetPassthroughStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_PASS_THROUGH_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_PASS_THROUGH_BIT, buffer);
+  return buffer[0];
 }
 /** Get Slave 4 transaction done status.
  * Automatically sets to 1 when a Slave 4 transaction has completed. This
@@ -1591,9 +1571,8 @@ bool mpu6050GetPassthroughStatus()
  */
 bool mpu6050GetSlave4IsDone()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_DONE_BIT, buffer);
-  // return buffer[0];
-  return 1;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_DONE_BIT, buffer);
+  return buffer[0];
 }
 /** Get master arbitration lost status.
  * This bit automatically sets to 1 when the I2C Master has lost arbitration of
@@ -1604,9 +1583,8 @@ bool mpu6050GetSlave4IsDone()
  */
 bool mpu6050GetLostArbitration()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_LOST_ARB_BIT, buffer);
-  // return buffer[0];
-  return 1;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_LOST_ARB_BIT, buffer);
+  return buffer[0];
 }
 /** Get Slave 4 NACK status.
  * This bit automatically sets to 1 when the I2C Master receives a NACK in a
@@ -1617,9 +1595,8 @@ bool mpu6050GetLostArbitration()
  */
 bool mpu6050GetSlave4Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_NACK_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_NACK_BIT, buffer);
+  return buffer[0];
 }
 /** Get Slave 3 NACK status.
  * This bit automatically sets to 1 when the I2C Master receives a NACK in a
@@ -1630,9 +1607,8 @@ bool mpu6050GetSlave4Nack()
  */
 bool mpu6050GetSlave3Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV3_NACK_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV3_NACK_BIT, buffer);
+  return buffer[0];
 }
 /** Get Slave 2 NACK status.
  * This bit automatically sets to 1 when the I2C Master receives a NACK in a
@@ -1643,9 +1619,8 @@ bool mpu6050GetSlave3Nack()
  */
 bool mpu6050GetSlave2Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV2_NACK_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV2_NACK_BIT, buffer);
+  return buffer[0];
 }
 /** Get Slave 1 NACK status.
  * This bit automatically sets to 1 when the I2C Master receives a NACK in a
@@ -1656,9 +1631,8 @@ bool mpu6050GetSlave2Nack()
  */
 bool mpu6050GetSlave1Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV1_NACK_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV1_NACK_BIT, buffer);
+  return buffer[0];
 }
 /** Get Slave 0 NACK status.
  * This bit automatically sets to 1 when the I2C Master receives a NACK in a
@@ -1669,9 +1643,8 @@ bool mpu6050GetSlave1Nack()
  */
 bool mpu6050GetSlave0Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV0_NACK_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV0_NACK_BIT, buffer);
+  return buffer[0];
 }
 
 // INT_PIN_CFG register
@@ -1684,9 +1657,8 @@ bool mpu6050GetSlave0Nack()
  */
 bool mpu6050GetInterruptMode()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, buffer);
+  return buffer[0];
 }
 /** Set interrupt logic level mode.
  * @param mode New interrupt mode (0=active-high, 1=active-low)
@@ -1696,7 +1668,7 @@ bool mpu6050GetInterruptMode()
  */
 void mpu6050SetInterruptMode(bool mode)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, mode);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, mode);
 }
 /** Get interrupt drive mode.
  * Will be set 0 for push-pull, 1 for open-drain.
@@ -1706,9 +1678,8 @@ void mpu6050SetInterruptMode(bool mode)
  */
 bool mpu6050GetInterruptDrive()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, buffer);
+  return buffer[0];
 }
 /** Set interrupt drive mode.
  * @param drive New interrupt drive mode (0=push-pull, 1=open-drain)
@@ -1718,7 +1689,7 @@ bool mpu6050GetInterruptDrive()
  */
 void mpu6050SetInterruptDrive(bool drive)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, drive);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, drive);
 }
 /** Get interrupt latch mode.
  * Will be set 0 for 50us-pulse, 1 for latch-until-int-cleared.
@@ -1728,9 +1699,8 @@ void mpu6050SetInterruptDrive(bool drive)
  */
 bool mpu6050GetInterruptLatch()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set interrupt latch mode.
  * @param latch New latch mode (0=50us-pulse, 1=latch-until-int-cleared)
@@ -1740,7 +1710,7 @@ bool mpu6050GetInterruptLatch()
  */
 void mpu6050SetInterruptLatch(bool latch)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, latch);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, latch);
 }
 /** Get interrupt latch clear mode.
  * Will be set 0 for status-read-only, 1 for any-register-read.
@@ -1750,9 +1720,8 @@ void mpu6050SetInterruptLatch(bool latch)
  */
 bool mpu6050GetInterruptLatchClear()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, buffer);
+  return buffer[0];
 }
 /** Set interrupt latch clear mode.
  * @param clear New latch clear mode (0=status-read-only, 1=any-register-read)
@@ -1762,7 +1731,7 @@ bool mpu6050GetInterruptLatchClear()
  */
 void mpu6050SetInterruptLatchClear(bool clear)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, clear);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, clear);
 }
 /** Get FSYNC interrupt logic level mode.
  * @return Current FSYNC interrupt mode (0=active-high, 1=active-low)
@@ -1772,9 +1741,8 @@ void mpu6050SetInterruptLatchClear(bool clear)
  */
 bool mpu6050GetFSyncInterruptLevel()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, buffer);
+  return buffer[0];
 }
 /** Set FSYNC interrupt logic level mode.
  * @param mode New FSYNC interrupt mode (0=active-high, 1=active-low)
@@ -1784,7 +1752,7 @@ bool mpu6050GetFSyncInterruptLevel()
  */
 void mpu6050SetFSyncInterruptLevel(bool level)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, level);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, level);
 }
 /** Get FSYNC pin interrupt enabled setting.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1794,9 +1762,8 @@ void mpu6050SetFSyncInterruptLevel(bool level)
  */
 bool mpu6050GetFSyncInterruptEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set FSYNC pin interrupt enabled setting.
  * @param enabled New FSYNC pin interrupt enabled setting
@@ -1806,7 +1773,7 @@ bool mpu6050GetFSyncInterruptEnabled()
  */
 void mpu6050SetFSyncInterruptEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, enabled);
 }
 /** Get I2C bypass enabled status.
  * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to
@@ -1821,9 +1788,8 @@ void mpu6050SetFSyncInterruptEnabled(bool enabled)
  */
 bool mpu6050GetI2CBypassEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set I2C bypass enabled status.
  * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to
@@ -1838,7 +1804,7 @@ bool mpu6050GetI2CBypassEnabled()
  */
 void mpu6050SetI2CBypassEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
 }
 /** Get reference clock output enabled status.
  * When this bit is equal to 1, a reference clock output is provided at the
@@ -1851,9 +1817,8 @@ void mpu6050SetI2CBypassEnabled(bool enabled)
  */
 bool mpu6050GetClockOutputEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, buffer);
+  return buffer[0];
 }
 /** Set reference clock output enabled status.
  * When this bit is equal to 1, a reference clock output is provided at the
@@ -1866,7 +1831,7 @@ bool mpu6050GetClockOutputEnabled()
  */
 void mpu6050SetClockOutputEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, enabled);
 }
 
 // INT_ENABLE register
@@ -1880,9 +1845,8 @@ void mpu6050SetClockOutputEnabled(bool enabled)
  **/
 uint8_t mpu6050GetIntEnabled()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, buffer);
-  // return buffer[0];
-  return 1;
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, buffer);
+  return buffer[0];
 }
 /** Set full interrupt enabled status.
  * Full register byte for all interrupts, for quick reading. Each bit should be
@@ -1894,7 +1858,7 @@ uint8_t mpu6050GetIntEnabled()
  **/
 void mpu6050SetIntEnabled(uint8_t enabled)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, enabled);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, enabled);
 }
 /** Get Free Fall interrupt enabled status.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1904,9 +1868,8 @@ void mpu6050SetIntEnabled(uint8_t enabled)
  **/
 bool mpu6050GetIntFreefallEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, buffer);
-  // return buffer[0];
-  return true;
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, buffer);
+  return buffer[0];
 }
 /** Set Free Fall interrupt enabled status.
  * @param enabled New interrupt enabled status
@@ -1926,7 +1889,7 @@ void mpu6050SetIntFreefallEnabled(bool enabled)
  **/
 bool mpu6050GetIntMotionEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, buffer);
   return buffer[0];
 }
 /** Set Motion Detection interrupt enabled status.
@@ -1937,7 +1900,7 @@ bool mpu6050GetIntMotionEnabled()
  **/
 void mpu6050SetIntMotionEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, enabled);
 }
 /** Get Zero Motion Detection interrupt enabled status.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1947,7 +1910,7 @@ void mpu6050SetIntMotionEnabled(bool enabled)
  **/
 bool mpu6050GetIntZeroMotionEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, buffer);
   return buffer[0];
 }
 /** Set Zero Motion Detection interrupt enabled status.
@@ -1958,7 +1921,7 @@ bool mpu6050GetIntZeroMotionEnabled()
  **/
 void mpu6050SetIntZeroMotionEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, enabled);
 }
 /** Get FIFO Buffer Overflow interrupt enabled status.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1968,7 +1931,7 @@ void mpu6050SetIntZeroMotionEnabled(bool enabled)
  **/
 bool mpu6050GetIntFIFOBufferOverflowEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer);
   return buffer[0];
 }
 /** Set FIFO Buffer Overflow interrupt enabled status.
@@ -1979,7 +1942,7 @@ bool mpu6050GetIntFIFOBufferOverflowEnabled()
  **/
 void mpu6050SetIntFIFOBufferOverflowEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, enabled);
 }
 /** Get I2C Master interrupt enabled status.
  * This enables any of the I2C Master interrupt sources to generate an
@@ -1990,7 +1953,7 @@ void mpu6050SetIntFIFOBufferOverflowEnabled(bool enabled)
  **/
 bool mpu6050GetIntI2CMasterEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer);
   return buffer[0];
 }
 /** Set I2C Master interrupt enabled status.
@@ -2001,7 +1964,7 @@ bool mpu6050GetIntI2CMasterEnabled()
  **/
 void mpu6050SetIntI2CMasterEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, enabled);
 }
 /** Get Data Ready interrupt enabled setting.
  * This event occurs each time a write operation to all of the sensor registers
@@ -2012,7 +1975,7 @@ void mpu6050SetIntI2CMasterEnabled(bool enabled)
  */
 bool mpu6050GetIntDataReadyEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer);
   return buffer[0];
 }
 /** Set Data Ready interrupt enabled status.
@@ -2023,7 +1986,7 @@ bool mpu6050GetIntDataReadyEnabled()
  */
 void mpu6050SetIntDataReadyEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, enabled);
 }
 
 // INT_STATUS register
@@ -2037,7 +2000,7 @@ void mpu6050SetIntDataReadyEnabled(bool enabled)
  */
 uint8_t mpu6050GetIntStatus()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_INT_STATUS, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_INT_STATUS, buffer);
   return buffer[0];
 }
 /** Get Free Fall interrupt status.
@@ -2049,7 +2012,7 @@ uint8_t mpu6050GetIntStatus()
  */
 bool mpu6050GetIntFreefallStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FF_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FF_BIT, buffer);
   return buffer[0];
 }
 /** Get Motion Detection interrupt status.
@@ -2061,7 +2024,7 @@ bool mpu6050GetIntFreefallStatus()
  */
 bool mpu6050GetIntMotionStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_MOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_MOT_BIT, buffer);
   return buffer[0];
 }
 /** Get Zero Motion Detection interrupt status.
@@ -2073,7 +2036,7 @@ bool mpu6050GetIntMotionStatus()
  */
 bool mpu6050GetIntZeroMotionStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_ZMOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_ZMOT_BIT, buffer);
   return buffer[0];
 }
 /** Get FIFO Buffer Overflow interrupt status.
@@ -2085,7 +2048,7 @@ bool mpu6050GetIntZeroMotionStatus()
  */
 bool mpu6050GetIntFIFOBufferOverflowStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer);
   return buffer[0];
 }
 /** Get I2C Master interrupt status.
@@ -2098,7 +2061,7 @@ bool mpu6050GetIntFIFOBufferOverflowStatus()
  */
 bool mpu6050GetIntI2CMasterStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer);
   return buffer[0];
 }
 /** Get Data Ready interrupt status.
@@ -2110,7 +2073,7 @@ bool mpu6050GetIntI2CMasterStatus()
  */
 bool mpu6050GetIntDataReadyStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer);
   return buffer[0];
 }
 
@@ -2135,7 +2098,7 @@ bool mpu6050GetIntDataReadyStatus()
 void mpu6050GetMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz,
     int16_t* mx, int16_t* my, int16_t* mz)
 {
-  // mpu6050GetMotion6(ax, ay, az, gx, gy, gz);
+  mpu6050GetMotion6(ax, ay, az, gx, gy, gz);
   // TODO: magnetometer integration
 }
 /** Get raw 6-axis motion sensor readings (accel/gyro).
@@ -2152,13 +2115,13 @@ void mpu6050GetMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16
  */
 void mpu6050GetMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer);
-  // *ax = (((int16_t) buffer[0]) << 8) | buffer[1];
-  // *ay = (((int16_t) buffer[2]) << 8) | buffer[3];
-  // *az = (((int16_t) buffer[4]) << 8) | buffer[5];
-  // *gx = (((int16_t) buffer[8]) << 8) | buffer[9];
-  // *gy = (((int16_t) buffer[10]) << 8) | buffer[11];
-  // *gz = (((int16_t) buffer[12]) << 8) | buffer[13];
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer);
+  *ax = (((int16_t) buffer[0]) << 8) | buffer[1];
+  *ay = (((int16_t) buffer[2]) << 8) | buffer[3];
+  *az = (((int16_t) buffer[4]) << 8) | buffer[5];
+  *gx = (((int16_t) buffer[8]) << 8) | buffer[9];
+  *gy = (((int16_t) buffer[10]) << 8) | buffer[11];
+  *gz = (((int16_t) buffer[12]) << 8) | buffer[13];
 }
 /** Get 3-axis accelerometer readings.
  * These registers store the most recent accelerometer measurements.
@@ -2198,10 +2161,10 @@ void mpu6050GetMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16
  */
 void mpu6050GetAcceleration(int16_t* x, int16_t* y, int16_t* z)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_XOUT_H, 6, buffer);
-  // *x = (((int16_t) buffer[0]) << 8) | buffer[1];
-  // *y = (((int16_t) buffer[2]) << 8) | buffer[3];
-  // *z = (((int16_t) buffer[4]) << 8) | buffer[5];
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_XOUT_H, 6, buffer);
+  *x = (((int16_t) buffer[0]) << 8) | buffer[1];
+  *y = (((int16_t) buffer[2]) << 8) | buffer[3];
+  *z = (((int16_t) buffer[4]) << 8) | buffer[5];
 }
 /** Get X-axis accelerometer reading.
  * @return X-axis acceleration measurement in 16-bit 2's complement format
@@ -2210,7 +2173,7 @@ void mpu6050GetAcceleration(int16_t* x, int16_t* y, int16_t* z)
  */
 int16_t mpu6050GetAccelerationX()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Y-axis accelerometer reading.
@@ -2220,7 +2183,7 @@ int16_t mpu6050GetAccelerationX()
  */
 int16_t mpu6050GetAccelerationY()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_YOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_YOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Z-axis accelerometer reading.
@@ -2230,7 +2193,7 @@ int16_t mpu6050GetAccelerationY()
  */
 int16_t mpu6050GetAccelerationZ()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_ZOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ACCEL_ZOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2242,7 +2205,7 @@ int16_t mpu6050GetAccelerationZ()
  */
 int16_t mpu6050GetTemperature()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_TEMP_OUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_TEMP_OUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2282,10 +2245,10 @@ int16_t mpu6050GetTemperature()
  */
 void mpu6050GetRotation(int16_t* x, int16_t* y, int16_t* z)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_XOUT_H, 6, buffer);
-  // *x = (((int16_t) buffer[0]) << 8) | buffer[1];
-  // *y = (((int16_t) buffer[2]) << 8) | buffer[3];
-  // *z = (((int16_t) buffer[4]) << 8) | buffer[5];
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_XOUT_H, 6, buffer);
+  *x = (((int16_t) buffer[0]) << 8) | buffer[1];
+  *y = (((int16_t) buffer[2]) << 8) | buffer[3];
+  *z = (((int16_t) buffer[4]) << 8) | buffer[5];
 }
 /** Get X-axis gyroscope reading.
  * @return X-axis rotation measurement in 16-bit 2's complement format
@@ -2294,7 +2257,7 @@ void mpu6050GetRotation(int16_t* x, int16_t* y, int16_t* z)
  */
 int16_t mpu6050GetRotationX()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_XOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_XOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Y-axis gyroscope reading.
@@ -2304,7 +2267,7 @@ int16_t mpu6050GetRotationX()
  */
 int16_t mpu6050GetRotationY()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_YOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_YOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Z-axis gyroscope reading.
@@ -2314,7 +2277,7 @@ int16_t mpu6050GetRotationY()
  */
 int16_t mpu6050GetRotationZ()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_ZOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_GYRO_ZOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2396,7 +2359,7 @@ int16_t mpu6050GetRotationZ()
  */
 uint8_t mpu6050GetExternalSensorByte(int position)
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, buffer);
   return buffer[0];
 }
 /** Read word (2 bytes) from external sensor data registers.
@@ -2406,7 +2369,7 @@ uint8_t mpu6050GetExternalSensorByte(int position)
  */
 uint16_t mpu6050GetExternalSensorWord(int position)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 2, buffer);
   return (((uint16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Read double word (4 bytes) from external sensor data registers.
@@ -2416,7 +2379,7 @@ uint16_t mpu6050GetExternalSensorWord(int position)
  */
 uint32_t mpu6050GetExternalSensorDWord(int position)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 4, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 4, buffer);
   return (((uint32_t) buffer[0]) << 24) | (((uint32_t) buffer[1]) << 16)
       | (((uint16_t) buffer[2]) << 8) | buffer[3];
 }
@@ -2430,7 +2393,7 @@ uint32_t mpu6050GetExternalSensorDWord(int position)
  */
 bool mpu6050GetXNegMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XNEG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XNEG_BIT, buffer);
   return buffer[0];
 }
 /** Get X-axis positive motion detection interrupt status.
@@ -2440,7 +2403,7 @@ bool mpu6050GetXNegMotionDetected()
  */
 bool mpu6050GetXPosMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XPOS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XPOS_BIT, buffer);
   return buffer[0];
 }
 /** Get Y-axis negative motion detection interrupt status.
@@ -2450,7 +2413,7 @@ bool mpu6050GetXPosMotionDetected()
  */
 bool mpu6050GetYNegMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YNEG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YNEG_BIT, buffer);
   return buffer[0];
 }
 /** Get Y-axis positive motion detection interrupt status.
@@ -2460,7 +2423,7 @@ bool mpu6050GetYNegMotionDetected()
  */
 bool mpu6050GetYPosMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YPOS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YPOS_BIT, buffer);
   return buffer[0];
 }
 /** Get Z-axis negative motion detection interrupt status.
@@ -2470,7 +2433,7 @@ bool mpu6050GetYPosMotionDetected()
  */
 bool mpu6050GetZNegMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZNEG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZNEG_BIT, buffer);
   return buffer[0];
 }
 /** Get Z-axis positive motion detection interrupt status.
@@ -2480,7 +2443,7 @@ bool mpu6050GetZNegMotionDetected()
  */
 bool mpu6050GetZPosMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZPOS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZPOS_BIT, buffer);
   return buffer[0];
 }
 /** Get zero motion detection interrupt status.
@@ -2490,7 +2453,7 @@ bool mpu6050GetZPosMotionDetected()
  */
 bool mpu6050GetZeroMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZRMOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZRMOT_BIT, buffer);
   return buffer[0];
 }
 
@@ -2506,9 +2469,9 @@ bool mpu6050GetZeroMotionDetected()
  */
 void mpu6050SetSlaveOutputByte(uint8_t num, uint8_t data)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_DO + num, data);
+  if (num > 3)
+    return;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_I2C_SLV0_DO + num, data);
 }
 
 // I2C_MST_DELAY_CTRL register
@@ -2523,8 +2486,8 @@ void mpu6050SetSlaveOutputByte(uint8_t num, uint8_t data)
  */
 bool mpu6050GetExternalShadowDelayEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT,
-  //     buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT,
+      buffer);
   return buffer[0];
 }
 /** Set external data shadow delay enabled status.
@@ -2535,8 +2498,8 @@ bool mpu6050GetExternalShadowDelayEnabled()
  */
 void mpu6050SetExternalShadowDelayEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL,
-  //     MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL,
+      MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled);
 }
 /** Get slave delay enabled status.
  * When a particular slave delay is enabled, the rate of access for the that
@@ -2561,7 +2524,7 @@ bool mpu6050GetSlaveDelayEnabled(uint8_t num)
   // MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT is 4, SLV3 is 3, etc.
   if (num > 4)
     return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, buffer);
   return buffer[0];
 }
 /** Set slave delay enabled status.
@@ -2572,7 +2535,7 @@ bool mpu6050GetSlaveDelayEnabled(uint8_t num)
  */
 void mpu6050SetSlaveDelayEnabled(uint8_t num, bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, enabled);
 }
 
 // SIGNAL_PATH_RESET register
@@ -2585,7 +2548,7 @@ void mpu6050SetSlaveDelayEnabled(uint8_t num, bool enabled)
  */
 void mpu6050ResetGyroscopePath()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_GYRO_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_GYRO_RESET_BIT, 1);
 }
 /** Reset accelerometer signal path.
  * The reset will revert the signal path analog to digital converters and
@@ -2595,7 +2558,7 @@ void mpu6050ResetGyroscopePath()
  */
 void mpu6050ResetAccelerometerPath()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_ACCEL_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_ACCEL_RESET_BIT, 1);
 }
 /** Reset temperature sensor signal path.
  * The reset will revert the signal path analog to digital converters and
@@ -2605,7 +2568,7 @@ void mpu6050ResetAccelerometerPath()
  */
 void mpu6050ResetTemperaturePath()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_TEMP_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_TEMP_RESET_BIT, 1);
 }
 
 // MOT_DETECT_CTRL register
@@ -2626,8 +2589,8 @@ void mpu6050ResetTemperaturePath()
  */
 uint8_t mpu6050GetAccelerometerPowerOnDelay()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT,
-  //     MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT,
+      MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, buffer);
   return buffer[0];
 }
 /** Set accelerometer power-on delay.
@@ -2638,8 +2601,8 @@ uint8_t mpu6050GetAccelerometerPowerOnDelay()
  */
 void mpu6050SetAccelerometerPowerOnDelay(uint8_t delay)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT,
-  //     MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, delay);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT,
+      MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, delay);
 }
 /** Get Free Fall detection counter decrement configuration.
  * Detection is registered by the Free Fall detection module after accelerometer
@@ -2669,8 +2632,8 @@ void mpu6050SetAccelerometerPowerOnDelay(uint8_t delay)
  */
 uint8_t mpu6050GetFreefallDetectionCounterDecrement()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT,
-  //     MPU6050_DETECT_FF_COUNT_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT,
+      MPU6050_DETECT_FF_COUNT_LENGTH, buffer);
   return buffer[0];
 }
 /** Set Free Fall detection counter decrement configuration.
@@ -2681,8 +2644,8 @@ uint8_t mpu6050GetFreefallDetectionCounterDecrement()
  */
 void mpu6050SetFreefallDetectionCounterDecrement(uint8_t decrement)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT,
-  //     MPU6050_DETECT_FF_COUNT_LENGTH, decrement);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT,
+      MPU6050_DETECT_FF_COUNT_LENGTH, decrement);
 }
 /** Get Motion detection counter decrement configuration.
  * Detection is registered by the Motion detection module after accelerometer
@@ -2709,8 +2672,8 @@ void mpu6050SetFreefallDetectionCounterDecrement(uint8_t decrement)
  */
 uint8_t mpu6050GetMotionDetectionCounterDecrement()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT,
-  //     MPU6050_DETECT_MOT_COUNT_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT,
+      MPU6050_DETECT_MOT_COUNT_LENGTH, buffer);
   return buffer[0];
 }
 /** Set Motion detection counter decrement configuration.
@@ -2721,8 +2684,8 @@ uint8_t mpu6050GetMotionDetectionCounterDecrement()
  */
 void mpu6050SetMotionDetectionCounterDecrement(uint8_t decrement)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT,
-  //     MPU6050_DETECT_MOT_COUNT_LENGTH, decrement);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT,
+      MPU6050_DETECT_MOT_COUNT_LENGTH, decrement);
 }
 
 // USER_CTRL register
@@ -2737,7 +2700,7 @@ void mpu6050SetMotionDetectionCounterDecrement(uint8_t decrement)
  */
 bool mpu6050GetFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set FIFO enabled status.
@@ -2748,7 +2711,7 @@ bool mpu6050GetFIFOEnabled()
  */
 void mpu6050SetFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, enabled);
 }
 /** Get I2C Master Mode enabled status.
  * When this mode is enabled, the MPU-60X0 acts as the I2C Master to the
@@ -2763,7 +2726,7 @@ void mpu6050SetFIFOEnabled(bool enabled)
  */
 bool mpu6050GetI2CMasterModeEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set I2C Master Mode enabled status.
@@ -2774,7 +2737,7 @@ bool mpu6050GetI2CMasterModeEnabled()
  */
 void mpu6050SetI2CMasterModeEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
 }
 /** Switch from I2C to SPI mode (MPU-6000 only)
  * If this is set, the primary SPI interface will be enabled in place of the
@@ -2782,7 +2745,7 @@ void mpu6050SetI2CMasterModeEnabled(bool enabled)
  */
 void mpu6050SwitchSPIEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_IF_DIS_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_IF_DIS_BIT, enabled);
 }
 /** Reset the FIFO.
  * This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This
@@ -2792,7 +2755,7 @@ void mpu6050SwitchSPIEnabled(bool enabled)
  */
 void mpu6050ResetFIFO()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_RESET_BIT, 1);
 }
 /** Reset the I2C Master.
  * This bit resets the I2C Master when set to 1 while I2C_MST_EN equals 0.
@@ -2802,7 +2765,7 @@ void mpu6050ResetFIFO()
  */
 void mpu6050ResetI2CMaster()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_RESET_BIT, 1);
 }
 /** Reset all sensor registers and signal paths.
  * When set to 1, this bit resets the signal paths for all sensors (gyroscopes,
@@ -2818,7 +2781,7 @@ void mpu6050ResetI2CMaster()
  */
 void mpu6050ResetSensors()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_SIG_COND_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_SIG_COND_RESET_BIT, 1);
 }
 
 // PWR_MGMT_1 register
@@ -2830,7 +2793,7 @@ void mpu6050ResetSensors()
  */
 void mpu6050Reset()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, 1);
 }
 /** Get sleep mode status.
  * Setting the SLEEP bit in the register puts the device into very low power
@@ -2845,7 +2808,7 @@ void mpu6050Reset()
  */
 bool mpu6050GetSleepEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, buffer);
   return buffer[0];
 }
 /** Set sleep mode status.
@@ -2856,7 +2819,7 @@ bool mpu6050GetSleepEnabled()
  */
 void mpu6050SetSleepEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
 }
 /** Get wake cycle enabled status.
  * When this bit is set to 1 and SLEEP is disabled, the MPU-60X0 will cycle
@@ -2868,7 +2831,7 @@ void mpu6050SetSleepEnabled(bool enabled)
  */
 bool mpu6050GetWakeCycleEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, buffer);
   return buffer[0];
 }
 /** Set wake cycle enabled status.
@@ -2879,7 +2842,7 @@ bool mpu6050GetWakeCycleEnabled()
  */
 void mpu6050SetWakeCycleEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CYCLE_BIT, enabled);
 }
 /** Get temperature sensor enabled status.
  * Control the usage of the internal temperature sensor.
@@ -2894,7 +2857,7 @@ void mpu6050SetWakeCycleEnabled(bool enabled)
  */
 bool mpu6050GetTempSensorEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, buffer);
   return buffer[0] == 0; // 1 is actually disabled here
 }
 /** Set temperature sensor enabled status.
@@ -2910,7 +2873,7 @@ bool mpu6050GetTempSensorEnabled()
 void mpu6050SetTempSensorEnabled(bool enabled)
 {
   // 1 is actually disabled here
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, !enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_TEMP_DIS_BIT, !enabled);
 }
 /** Get clock source setting.
  * @return Current clock source setting
@@ -2920,8 +2883,8 @@ void mpu6050SetTempSensorEnabled(bool enabled)
  */
 uint8_t mpu6050GetClockSource()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT,
-  //     MPU6050_PWR1_CLKSEL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT,
+      MPU6050_PWR1_CLKSEL_LENGTH, buffer);
   return buffer[0];
 }
 /** Set clock source setting.
@@ -2956,8 +2919,8 @@ uint8_t mpu6050GetClockSource()
  */
 void mpu6050SetClockSource(uint8_t source)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT,
-  //     MPU6050_PWR1_CLKSEL_LENGTH, source);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT,
+      MPU6050_PWR1_CLKSEL_LENGTH, source);
 }
 
 // PWR_MGMT_2 register
@@ -2987,8 +2950,8 @@ void mpu6050SetClockSource(uint8_t source)
  */
 uint8_t mpu6050GetWakeFrequency()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT,
-  //     MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT,
+      MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, buffer);
   return buffer[0];
 }
 /** Set wake frequency in Accel-Only Low Power Mode.
@@ -2997,8 +2960,8 @@ uint8_t mpu6050GetWakeFrequency()
  */
 void mpu6050SetWakeFrequency(uint8_t frequency)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT,
-  //     MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, frequency);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_LP_WAKE_CTRL_BIT,
+      MPU6050_PWR2_LP_WAKE_CTRL_LENGTH, frequency);
 }
 
 /** Get X-axis accelerometer standby enabled status.
@@ -3009,7 +2972,7 @@ void mpu6050SetWakeFrequency(uint8_t frequency)
  */
 bool mpu6050GetStandbyXAccelEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, buffer);
   return buffer[0];
 }
 /** Set X-axis accelerometer standby enabled status.
@@ -3020,7 +2983,7 @@ bool mpu6050GetStandbyXAccelEnabled()
  */
 void mpu6050SetStandbyXAccelEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XA_BIT, enabled);
 }
 /** Get Y-axis accelerometer standby enabled status.
  * If enabled, the Y-axis will not gather or report data (or use power).
@@ -3030,7 +2993,7 @@ void mpu6050SetStandbyXAccelEnabled(bool enabled)
  */
 bool mpu6050GetStandbyYAccelEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, buffer);
   return buffer[0];
 }
 /** Set Y-axis accelerometer standby enabled status.
@@ -3041,7 +3004,7 @@ bool mpu6050GetStandbyYAccelEnabled()
  */
 void mpu6050SetStandbyYAccelEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YA_BIT, enabled);
 }
 /** Get Z-axis accelerometer standby enabled status.
  * If enabled, the Z-axis will not gather or report data (or use power).
@@ -3051,7 +3014,7 @@ void mpu6050SetStandbyYAccelEnabled(bool enabled)
  */
 bool mpu6050GetStandbyZAccelEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, buffer);
   return buffer[0];
 }
 /** Set Z-axis accelerometer standby enabled status.
@@ -3062,7 +3025,7 @@ bool mpu6050GetStandbyZAccelEnabled()
  */
 void mpu6050SetStandbyZAccelEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZA_BIT, enabled);
 }
 /** Get X-axis gyroscope standby enabled status.
  * If enabled, the X-axis will not gather or report data (or use power).
@@ -3072,7 +3035,7 @@ void mpu6050SetStandbyZAccelEnabled(bool enabled)
  */
 bool mpu6050GetStandbyXGyroEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, buffer);
   return buffer[0];
 }
 /** Set X-axis gyroscope standby enabled status.
@@ -3083,7 +3046,7 @@ bool mpu6050GetStandbyXGyroEnabled()
  */
 void mpu6050SetStandbyXGyroEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_XG_BIT, enabled);
 }
 /** Get Y-axis gyroscope standby enabled status.
  * If enabled, the Y-axis will not gather or report data (or use power).
@@ -3093,7 +3056,7 @@ void mpu6050SetStandbyXGyroEnabled(bool enabled)
  */
 bool mpu6050GetStandbyYGyroEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, buffer);
   return buffer[0];
 }
 /** Set Y-axis gyroscope standby enabled status.
@@ -3104,7 +3067,7 @@ bool mpu6050GetStandbyYGyroEnabled()
  */
 void mpu6050SetStandbyYGyroEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_YG_BIT, enabled);
 }
 /** Get Z-axis gyroscope standby enabled status.
  * If enabled, the Z-axis will not gather or report data (or use power).
@@ -3114,7 +3077,7 @@ void mpu6050SetStandbyYGyroEnabled(bool enabled)
  */
 bool mpu6050GetStandbyZGyroEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, buffer);
   return buffer[0];
 }
 /** Set Z-axis gyroscope standby enabled status.
@@ -3125,7 +3088,7 @@ bool mpu6050GetStandbyZGyroEnabled()
  */
 void mpu6050SetStandbyZGyroEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_PWR_MGMT_2, MPU6050_PWR2_STBY_ZG_BIT, enabled);
 }
 
 // FIFO_COUNT* registers
@@ -3139,7 +3102,7 @@ void mpu6050SetStandbyZGyroEnabled(bool enabled)
  */
 uint16_t mpu6050GetFIFOCount()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_FIFO_COUNTH, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_FIFO_COUNTH, 2, buffer);
   return (((uint16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -3172,12 +3135,12 @@ uint16_t mpu6050GetFIFOCount()
  */
 uint8_t mpu6050GetFIFOByte()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_FIFO_R_W, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_FIFO_R_W, buffer);
   return buffer[0];
 }
 void mpu6050GetFIFOBytes(uint8_t *data, uint8_t length)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_FIFO_R_W, length, data);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_FIFO_R_W, length, data);
 }
 /** Write byte to FIFO buffer.
  * @see getFIFOByte()
@@ -3185,7 +3148,7 @@ void mpu6050GetFIFOBytes(uint8_t *data, uint8_t length)
  */
 void mpu6050SetFIFOByte(uint8_t data)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_FIFO_R_W, data);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_FIFO_R_W, data);
 }
 
 // WHO_AM_I register
@@ -3199,8 +3162,8 @@ void mpu6050SetFIFOByte(uint8_t data)
  */
 uint8_t mpu6050GetDeviceID()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH,
-  //     buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH,
+      buffer);
   return buffer[0];
 }
 /** Set Device ID.
@@ -3214,8 +3177,8 @@ uint8_t mpu6050GetDeviceID()
  */
 void mpu6050SetDeviceID(uint8_t id)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH,
-  //     id);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_WHO_AM_I, MPU6050_WHO_AM_I_BIT, MPU6050_WHO_AM_I_LENGTH,
+      id);
 }
 
 // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
@@ -3224,212 +3187,212 @@ void mpu6050SetDeviceID(uint8_t id)
 
 uint8_t mpu6050GetOTPBankValid()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, buffer);
   return buffer[0];
 }
 void mpu6050SetOTPBankValid(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OTP_BNK_VLD_BIT, enabled);
 }
 int8_t mpu6050GetXGyroOffset()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
-  //     MPU6050_TC_OFFSET_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
+      MPU6050_TC_OFFSET_LENGTH, buffer);
   return buffer[0];
 }
 void mpu6050SetXGyroOffset(int8_t offset)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
-  //     MPU6050_TC_OFFSET_LENGTH, offset);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_XG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
+      MPU6050_TC_OFFSET_LENGTH, offset);
 }
 
 // YG_OFFS_TC register
 
 int8_t mpu6050GetYGyroOffset()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
-  //     MPU6050_TC_OFFSET_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
+      MPU6050_TC_OFFSET_LENGTH, buffer);
   return buffer[0];
 }
 void mpu6050SetYGyroOffset(int8_t offset)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
-  //     MPU6050_TC_OFFSET_LENGTH, offset);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
+      MPU6050_TC_OFFSET_LENGTH, offset);
 }
 
 // ZG_OFFS_TC register
 
 int8_t mpu6050GetZGyroOffset()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
-  //     MPU6050_TC_OFFSET_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
+      MPU6050_TC_OFFSET_LENGTH, buffer);
   return buffer[0];
 }
 void mpu6050SetZGyroOffset(int8_t offset)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
-  //     MPU6050_TC_OFFSET_LENGTH, offset);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_TC, MPU6050_TC_OFFSET_BIT,
+      MPU6050_TC_OFFSET_LENGTH, offset);
 }
 
 // X_FINE_GAIN register
 
 int8_t mpu6050GetXFineGain()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_X_FINE_GAIN, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_X_FINE_GAIN, buffer);
   return buffer[0];
 }
 void mpu6050SetXFineGain(int8_t gain)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_X_FINE_GAIN, gain);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_X_FINE_GAIN, gain);
 }
 
 // Y_FINE_GAIN register
 
 int8_t mpu6050GetYFineGain()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_Y_FINE_GAIN, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_Y_FINE_GAIN, buffer);
   return buffer[0];
 }
 void mpu6050SetYFineGain(int8_t gain)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_Y_FINE_GAIN, gain);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_Y_FINE_GAIN, gain);
 }
 
 // Z_FINE_GAIN register
 
 int8_t mpu6050GetZFineGain()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_Z_FINE_GAIN, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_Z_FINE_GAIN, buffer);
   return buffer[0];
 }
 void mpu6050SetZFineGain(int8_t gain)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_Z_FINE_GAIN, gain);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_Z_FINE_GAIN, gain);
 }
 
 // XA_OFFS_* registers
 
 int16_t mpu6050GetXAccelOffset()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_XA_OFFS_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_XA_OFFS_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 void mpu6050SetXAccelOffset(int16_t offset)
 {
-  // i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_XA_OFFS_H, 2, (uint8_t *)&offset);
+  i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_XA_OFFS_H, 2, (uint8_t *)&offset);
 }
 
 // YA_OFFS_* register
 
 int16_t mpu6050GetYAccelOffset()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_YA_OFFS_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_YA_OFFS_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 void mpu6050SetYAccelOffset(int16_t offset)
 {
-  // i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_YA_OFFS_H, 2, (uint8_t *)&offset);
+  i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_YA_OFFS_H, 2, (uint8_t *)&offset);
 }
 
 // ZA_OFFS_* register
 
 int16_t mpu6050GetZAccelOffset()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ZA_OFFS_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ZA_OFFS_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 void mpu6050SetZAccelOffset(int16_t offset)
 {
-  // i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_ZA_OFFS_H, 2, (uint8_t *)&offset);
+  i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_ZA_OFFS_H, 2, (uint8_t *)&offset);
 }
 
 // XG_OFFS_USR* registers
 
 int16_t mpu6050GetXGyroOffsetUser()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_XG_OFFS_USRH, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_XG_OFFS_USRH, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 void mpu6050SetXGyroOffsetUser(int16_t offset)
 {
-  // i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_XG_OFFS_USRH, 2, (uint8_t *)&offset);
+  i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_XG_OFFS_USRH, 2, (uint8_t *)&offset);
 }
 
 // YG_OFFS_USR* register
 
 int16_t mpu6050GetYGyroOffsetUser()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_YG_OFFS_USRH, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_YG_OFFS_USRH, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 void mpu6050SetYGyroOffsetUser(int16_t offset)
 {
-  // i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_YG_OFFS_USRH, 2, (uint8_t *)&offset);
+  i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_YG_OFFS_USRH, 2, (uint8_t *)&offset);
 }
 
 // ZG_OFFS_USR* register
 
 int16_t mpu6050GetZGyroOffsetUser()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 void mpu6050SetZGyroOffsetUser(int16_t offset)
 {
-  // i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, (uint8_t *)&offset);
+  i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_ZG_OFFS_USRH, 2, (uint8_t *)&offset);
 }
 
 // INT_ENABLE register (DMP functions)
 
 bool mpu6050GetIntPLLReadyEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
   return buffer[0];
 }
 void mpu6050SetIntPLLReadyEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, enabled);
 }
 bool mpu6050GetIntDMPEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
   return buffer[0];
 }
 void mpu6050SetIntDMPEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DMP_INT_BIT, enabled);
 }
 
 // DMP_INT_STATUS
 
 bool mpu6050GetDMPInt5Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_5_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_5_BIT, buffer);
   return buffer[0];
 }
 bool mpu6050GetDMPInt4Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_4_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_4_BIT, buffer);
   return buffer[0];
 }
 bool mpu6050GetDMPInt3Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_3_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_3_BIT, buffer);
   return buffer[0];
 }
 bool mpu6050GetDMPInt2Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_2_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_2_BIT, buffer);
   return buffer[0];
 }
 bool mpu6050GetDMPInt1Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_1_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_1_BIT, buffer);
   return buffer[0];
 }
 bool mpu6050GetDMPInt0Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_0_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_DMP_INT_STATUS, MPU6050_DMPINT_0_BIT, buffer);
   return buffer[0];
 }
 
@@ -3437,12 +3400,12 @@ bool mpu6050GetDMPInt0Status()
 
 bool mpu6050GetIntPLLReadyStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_PLL_RDY_INT_BIT, buffer);
   return buffer[0];
 }
 bool mpu6050GetIntDMPStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DMP_INT_BIT, buffer);
   return buffer[0];
 }
 
@@ -3450,165 +3413,165 @@ bool mpu6050GetIntDMPStatus()
 
 bool mpu6050GetDMPEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, buffer);
   return buffer[0];
 }
 void mpu6050SetDMPEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_EN_BIT, enabled);
 }
 void mpu6050ResetDMP()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_DMP_RESET_BIT, 1);
 }
 
 // BANK_SEL register
 
 void mpu6050SetMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank)
 {
-  // bank &= 0x1F;
-  // if (userBank)
-  //   bank |= 0x20;
-  // if (prefetchEnabled)
-  //   bank |= 0x40;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_BANK_SEL, bank);
+  bank &= 0x1F;
+  if (userBank)
+    bank |= 0x20;
+  if (prefetchEnabled)
+    bank |= 0x40;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_BANK_SEL, bank);
 }
 
 // MEM_START_ADDR register
 
 void mpu6050SetMemoryStartAddress(uint8_t address)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MEM_START_ADDR, address);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MEM_START_ADDR, address);
 }
 
 // MEM_R_W register
 
 uint8_t mpu6050ReadMemoryByte()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_MEM_R_W, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_MEM_R_W, buffer);
   return buffer[0];
 }
 void mpu6050WriteMemoryByte(uint8_t data)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MEM_R_W, data);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_MEM_R_W, data);
 }
 void mpu6050ReadMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address)
 {
-  // mpu6050SetMemoryBank(bank, true, true);
-  // mpu6050SetMemoryStartAddress(address);
-  // uint8_t chunkSize;
-  // uint16_t i;
+  mpu6050SetMemoryBank(bank, true, true);
+  mpu6050SetMemoryStartAddress(address);
+  uint8_t chunkSize;
+  uint16_t i;
 
-  // for (i = 0; i < dataSize;)
-  // {
-  //   // determine correct chunk size according to bank position and data size
-  //   chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
+  for (i = 0; i < dataSize;)
+  {
+    // determine correct chunk size according to bank position and data size
+    chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
 
-  //   // make sure we don't go past the data size
-  //   if (i + chunkSize > dataSize)
-  //     chunkSize = dataSize - i;
+    // make sure we don't go past the data size
+    if (i + chunkSize > dataSize)
+      chunkSize = dataSize - i;
 
-  //   // make sure this chunk doesn't go past the bank boundary (256 bytes)
-  //   if (chunkSize > 256 - address)
-  //     chunkSize = 256 - address;
+    // make sure this chunk doesn't go past the bank boundary (256 bytes)
+    if (chunkSize > 256 - address)
+      chunkSize = 256 - address;
 
-  //   // read the chunk of data as specified
-  //   i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i);
+    // read the chunk of data as specified
+    i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i);
 
-  //   // increase byte index by [chunkSize]
-  //   i += chunkSize;
+    // increase byte index by [chunkSize]
+    i += chunkSize;
 
-  //   // uint8_t automatically wraps to 0 at 256
-  //   address += chunkSize;
+    // uint8_t automatically wraps to 0 at 256
+    address += chunkSize;
 
-  //   // if we aren't done, update bank (if necessary) and address
-  //   if (i < dataSize)
-  //   {
-  //     if (address == 0)
-  //       bank++;
-  //     mpu6050SetMemoryBank(bank, true, true);
-  //     mpu6050SetMemoryStartAddress(address);
-  //   }
-  // }
+    // if we aren't done, update bank (if necessary) and address
+    if (i < dataSize)
+    {
+      if (address == 0)
+        bank++;
+      mpu6050SetMemoryBank(bank, true, true);
+      mpu6050SetMemoryStartAddress(address);
+    }
+  }
 }
 bool mpu6050WriteMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address,
     bool verify)
 {
-  // static uint8_t verifyBuffer[MPU6050_DMP_MEMORY_CHUNK_SIZE];
-  // uint8_t chunkSize;
-  // uint8_t *progBuffer;
-  // uint16_t i;
-
-  // mpu6050SetMemoryBank(bank, true, true);
-  // mpu6050SetMemoryStartAddress(address);
-
-  // for (i = 0; i < dataSize;)
-  // {
-  //   // determine correct chunk size according to bank position and data size
-  //   chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
-
-  //   // make sure we don't go past the data size
-  //   if (i + chunkSize > dataSize)
-  //     chunkSize = dataSize - i;
-
-  //   // make sure this chunk doesn't go past the bank boundary (256 bytes)
-  //   if (chunkSize > 256 - address)
-  //     chunkSize = 256 - address;
-
-  //   // write the chunk of data as specified
-  //   progBuffer = (uint8_t *) data + i;
-
-  //   i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_MEM_R_W, chunkSize, progBuffer);
-
-  //   // verify data if needed
-  //   if (verify)
-  //   {
-  //     uint32_t j;
-  //     mpu6050SetMemoryBank(bank, true, true);
-  //     mpu6050SetMemoryStartAddress(address);
-  //     i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_MEM_R_W, chunkSize, verifyBuffer);
-
-  //     for (j = 0; j < chunkSize; j++)
-  //     {
-  //       if (progBuffer[j] != verifyBuffer[j])
-  //       {
-  //         /*Serial.print("Block write verification error, bank ");
-  //          Serial.print(bank, DEC);
-  //          Serial.print(", address ");
-  //          Serial.print(address, DEC);
-  //          Serial.print("!\nExpected:");
-  //          for (j = 0; j < chunkSize; j++) {
-  //          Serial.print(" 0x");
-  //          if (progBuffer[j] < 16) Serial.print("0");
-  //          Serial.print(progBuffer[j], HEX);
-  //          }
-  //          Serial.print("\nReceived:");
-  //          for (uint8_t j = 0; j < chunkSize; j++) {
-  //          Serial.print(" 0x");
-  //          if (verifyBuffer[i + j] < 16) Serial.print("0");
-  //          Serial.print(verifyBuffer[i + j], HEX);
-  //          }
-  //          Serial.print("\n");*/
-  //         return false;
-  //       }
-  //     }
-  //   }
-
-  //   // increase byte index by [chunkSize]
-  //   i += chunkSize;
-
-  //   // uint8_t automatically wraps to 0 at 256
-  //   address += chunkSize;
-
-  //   // if we aren't done, update bank (if necessary) and address
-  //   if (i < dataSize)
-  //   {
-  //     if (address == 0)
-  //       bank++;
-  //     mpu6050SetMemoryBank(bank, true, true);
-  //     mpu6050SetMemoryStartAddress(address);
-  //   }
-  // }
+  static uint8_t verifyBuffer[MPU6050_DMP_MEMORY_CHUNK_SIZE];
+  uint8_t chunkSize;
+  uint8_t *progBuffer;
+  uint16_t i;
+
+  mpu6050SetMemoryBank(bank, true, true);
+  mpu6050SetMemoryStartAddress(address);
+
+  for (i = 0; i < dataSize;)
+  {
+    // determine correct chunk size according to bank position and data size
+    chunkSize = MPU6050_DMP_MEMORY_CHUNK_SIZE;
+
+    // make sure we don't go past the data size
+    if (i + chunkSize > dataSize)
+      chunkSize = dataSize - i;
+
+    // make sure this chunk doesn't go past the bank boundary (256 bytes)
+    if (chunkSize > 256 - address)
+      chunkSize = 256 - address;
+
+    // write the chunk of data as specified
+    progBuffer = (uint8_t *) data + i;
+
+    i2cdevWriteReg8(I2Cx, devAddr, MPU6050_RA_MEM_R_W, chunkSize, progBuffer);
+
+    // verify data if needed
+    if (verify)
+    {
+      uint32_t j;
+      mpu6050SetMemoryBank(bank, true, true);
+      mpu6050SetMemoryStartAddress(address);
+      i2cdevReadReg8(I2Cx, devAddr, MPU6050_RA_MEM_R_W, chunkSize, verifyBuffer);
+
+      for (j = 0; j < chunkSize; j++)
+      {
+        if (progBuffer[j] != verifyBuffer[j])
+        {
+          /*Serial.print("Block write verification error, bank ");
+           Serial.print(bank, DEC);
+           Serial.print(", address ");
+           Serial.print(address, DEC);
+           Serial.print("!\nExpected:");
+           for (j = 0; j < chunkSize; j++) {
+           Serial.print(" 0x");
+           if (progBuffer[j] < 16) Serial.print("0");
+           Serial.print(progBuffer[j], HEX);
+           }
+           Serial.print("\nReceived:");
+           for (uint8_t j = 0; j < chunkSize; j++) {
+           Serial.print(" 0x");
+           if (verifyBuffer[i + j] < 16) Serial.print("0");
+           Serial.print(verifyBuffer[i + j], HEX);
+           }
+           Serial.print("\n");*/
+          return false;
+        }
+      }
+    }
+
+    // increase byte index by [chunkSize]
+    i += chunkSize;
+
+    // uint8_t automatically wraps to 0 at 256
+    address += chunkSize;
+
+    // if we aren't done, update bank (if necessary) and address
+    if (i < dataSize)
+    {
+      if (address == 0)
+        bank++;
+      mpu6050SetMemoryBank(bank, true, true);
+      mpu6050SetMemoryStartAddress(address);
+    }
+  }
   return true;
 }
 bool mpu6050WriteProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank,
@@ -3619,66 +3582,66 @@ bool mpu6050WriteProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t
 #define MPU6050_DMP_CONFIG_BLOCK_SIZE 6
 bool mpu6050WriteDMPConfigurationSet(const uint8_t *data, uint16_t dataSize)
 {
-  // uint8_t *progBuffer, success, special;
-  // uint16_t i;
-
-  // // config set data is a long string of blocks with the following structure:
-  // // [bank] [offset] [length] [byte[0], byte[1], ..., byte[length]]
-  // uint8_t bank=0;
-  // uint8_t offset=0;
-  // uint8_t length=0;
-  // for (i = 0; i < dataSize;)
-  // {
-  //   bank = data[i++];
-  //   offset = data[i++];
-  //   length = data[i++];
-  // }
-
-  // // write data or perform special action
-  // if (length > 0)
-  // {
-  //   // regular block of data to write
-  //   /*Serial.print("Writing config block to bank ");
-  //    Serial.print(bank);
-  //    Serial.print(", offset ");
-  //    Serial.print(offset);
-  //    Serial.print(", length=");
-  //    Serial.println(length);*/
-  //   progBuffer = (uint8_t *) data + i;
-  //   success = mpu6050WriteMemoryBlock(progBuffer, length, bank, offset, true);
-  //   i += length;
-  // }
-  // else
-  // {
-  //   // special instruction
-  //   // NOTE: this kind of behavior (what and when to do certain things)
-  //   // is totally undocumented. This code is in here based on observed
-  //   // behavior only, and exactly why (or even whether) it has to be here
-  //   // is anybody's guess for now.
-  //   special = data[i++];
-  //   /*Serial.print("Special command code ");
-  //    Serial.print(special, HEX);
-  //    Serial.println(" found...");*/
-  //   if (special == 0x01)
-  //   {
-  //     // enable DMP-related interrupts
-  //     mpu6050SetIntZeroMotionEnabled(true);
-  //     mpu6050SetIntFIFOBufferOverflowEnabled(true);
-  //     mpu6050SetIntDMPEnabled(true);
-  //     //i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, 0x32);
-  //     success = true;
-  //   }
-  //   else
-  //   {
-  //     // unknown special command
-  //     success = false;
-  //   }
-  // }
-
-  // if (!success)
-  // {
-  //   return false; // uh oh
-  // }
+  uint8_t *progBuffer, success, special;
+  uint16_t i;
+
+  // config set data is a long string of blocks with the following structure:
+  // [bank] [offset] [length] [byte[0], byte[1], ..., byte[length]]
+  uint8_t bank=0;
+  uint8_t offset=0;
+  uint8_t length=0;
+  for (i = 0; i < dataSize;)
+  {
+    bank = data[i++];
+    offset = data[i++];
+    length = data[i++];
+  }
+
+  // write data or perform special action
+  if (length > 0)
+  {
+    // regular block of data to write
+    /*Serial.print("Writing config block to bank ");
+     Serial.print(bank);
+     Serial.print(", offset ");
+     Serial.print(offset);
+     Serial.print(", length=");
+     Serial.println(length);*/
+    progBuffer = (uint8_t *) data + i;
+    success = mpu6050WriteMemoryBlock(progBuffer, length, bank, offset, true);
+    i += length;
+  }
+  else
+  {
+    // special instruction
+    // NOTE: this kind of behavior (what and when to do certain things)
+    // is totally undocumented. This code is in here based on observed
+    // behavior only, and exactly why (or even whether) it has to be here
+    // is anybody's guess for now.
+    special = data[i++];
+    /*Serial.print("Special command code ");
+     Serial.print(special, HEX);
+     Serial.println(" found...");*/
+    if (special == 0x01)
+    {
+      // enable DMP-related interrupts
+      mpu6050SetIntZeroMotionEnabled(true);
+      mpu6050SetIntFIFOBufferOverflowEnabled(true);
+      mpu6050SetIntDMPEnabled(true);
+      //i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_INT_ENABLE, 0x32);
+      success = true;
+    }
+    else
+    {
+      // unknown special command
+      success = false;
+    }
+  }
+
+  if (!success)
+  {
+    return false; // uh oh
+  }
   return true;
 }
 
@@ -3691,22 +3654,22 @@ bool mpu6050WriteProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize)
 
 uint8_t mpu6050GetDMPConfig1()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_1, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_1, buffer);
   return buffer[0];
 }
 void mpu6050SetDMPConfig1(uint8_t config)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_1, config);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_1, config);
 }
 
 // DMP_CFG_2 register
 
 uint8_t mpu6050GetDMPConfig2()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_2, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_2, buffer);
   return buffer[0];
 }
 void mpu6050SetDMPConfig2(uint8_t config)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_2, config);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6050_RA_DMP_CFG_2, config);
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6500.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6500.c
index 9a29f7930..e54b85c95 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6500.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/mpu6500.c
@@ -121,131 +121,129 @@ bool mpu6500TestConnection()
  */
 bool mpu6500SelfTest()
 {
-//   uint8_t rawData[6] = {0, 0, 0, 0, 0, 0};
-//   uint8_t saveReg[5];
-//   uint8_t selfTest[6];
-//   int32_t gAvg[3]={0}, aAvg[3]={0}, aSTAvg[3]={0}, gSTAvg[3]={0};
-//   int32_t factoryTrim[6];
-//   float aDiff[3], gDiff[3];
-//   uint8_t FS = 0;
-//   int i;
-
-//   // Save old configuration
-//   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, &saveReg[0]);
-//   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_CONFIG, &saveReg[1]);
-//   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, &saveReg[2]);
-//   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, &saveReg[3]);
-//   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, &saveReg[4]);
-//   // Write test configuration
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, 0x00); // Set gyro sample rate to 1 kHz
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_CONFIG, 0x02); // Set gyro sample rate to 1 kHz and DLPF to 92 Hz
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, 1<<FS); // Set full scale range for the gyro to 250 dps
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, 0x02); // Set accelerometer rate to 1 kHz and bandwidth to 92 Hz
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, 1<<FS); // Set full scale range for the accelerometer to 2 g
-
-//   for(i = 0; i < 200; i++)
-//   {
-//     // get average current values of gyro and acclerometer
-//     i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 6, &rawData[0]); // Read the six raw data registers into data array
-//     aAvg[0] += (int16_t)(((int16_t)rawData[0] << 8) | rawData[1]) ; // Turn the MSB and LSB into a signed 16-bit value
-//     aAvg[1] += (int16_t)(((int16_t)rawData[2] << 8) | rawData[3]) ;
-//     aAvg[2] += (int16_t)(((int16_t)rawData[4] << 8) | rawData[5]) ;
-
-//     i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 6, &rawData[0]); // Read the six raw data registers sequentially into data array
-//     gAvg[0] += (int16_t)((int16_t)rawData[0] << 8) | rawData[1]; // Turn the MSB and LSB into a signed 16-bit value
-//     gAvg[1] += (int16_t)((int16_t)rawData[2] << 8) | rawData[3];
-//     gAvg[2] += (int16_t)((int16_t)rawData[4] << 8) | rawData[5];
-//   }
-
-//   for (i = 0; i < 3; i++)
-//   { // Get average of 200 values and store as average current readings
-//     aAvg[i] /= 200;
-//     gAvg[i] /= 200;
-//   }
-
-//   // Configure the accelerometer for self-test
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, 0xE0); // Enable self test on all three axes and set accelerometer range to +/- 2 g
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, 0xE0); // Enable self test on all three axes and set gyro range to +/- 250 degrees/s
-//   vTaskDelay(M2T(25)); // Delay a while to let the device stabilize
-
-//   for(i = 0; i < 200; i++)
-//   {
-//     // get average self-test values of gyro and acclerometer
-//     i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 6, &rawData[0]); // Read the six raw data registers into data array
-//     aSTAvg[0] += (int16_t)(((int16_t)rawData[0] << 8) | rawData[1]) ; // Turn the MSB and LSB into a signed 16-bit value
-//     aSTAvg[1] += (int16_t)(((int16_t)rawData[2] << 8) | rawData[3]) ;
-//     aSTAvg[2] += (int16_t)(((int16_t)rawData[4] << 8) | rawData[5]) ;
-
-//     i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 6, &rawData[0]); // Read the six raw data registers sequentially into data array
-//     gSTAvg[0] += (int16_t)(((int16_t)rawData[0] << 8) | rawData[1]) ; // Turn the MSB and LSB into a signed 16-bit value
-//     gSTAvg[1] += (int16_t)(((int16_t)rawData[2] << 8) | rawData[3]) ;
-//     gSTAvg[2] += (int16_t)(((int16_t)rawData[4] << 8) | rawData[5]) ;
-//   }
-
-//   for (i =0; i < 3; i++)
-//   { // Get average of 200 values and store as average self-test readings
-//     aSTAvg[i] /= 200;
-//     gSTAvg[i] /= 200;
-//   }
-
-//    // Configure the gyro and accelerometer for normal operation
-//    i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, 0x00);
-//    i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, 0x00);
-//    vTaskDelay(M2T(25)); // Delay a while to let the device stabilize
-
-//    // Retrieve accelerometer and gyro factory Self-Test Code from USR_Reg
-//    i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_X_ACCEL, &selfTest[0]); // X-axis accel self-test results
-//    i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Y_ACCEL, &selfTest[1]); // Y-axis accel self-test results
-//    i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Z_ACCEL, &selfTest[2]); // Z-axis accel self-test results
-//    i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_X_GYRO, &selfTest[3]); // X-axis gyro self-test results
-//    i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Y_GYRO, &selfTest[4]); // Y-axis gyro self-test results
-//    i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Z_GYRO, &selfTest[5]); // Z-axis gyro self-test results
-
-//    for (i = 0; i < 6; i++)
-//    {
-//       if (selfTest[i] != 0)
-//       {
-//         factoryTrim[i] = mpu6500StTb[selfTest[i] - 1];
-//       }
-//       else
-//       {
-//         factoryTrim[i] = 0;
-//       }
-//     }
-
-//   // Report results as a ratio of (STR - FT)/FT; the change from Factory Trim of the Self-Test Response
-//   // To get percent, must multiply by 100
-//   for (i = 0; i < 3; i++)
-//   {
-//    aDiff[i] = 100.0f*((float)((aSTAvg[i] - aAvg[i]) - factoryTrim[i]))/factoryTrim[i]; // Report percent differences
-//    gDiff[i] = 100.0f*((float)((gSTAvg[i] - gAvg[i]) - factoryTrim[i+3]))/factoryTrim[i+3]; // Report percent differences
-// //   DEBUG_PRINT("a[%d] Avg:%d, StAvg:%d, Shift:%d, FT:%d, Diff:%0.2f\n", i, aAvg[i], aSTAvg[i], aSTAvg[i] - aAvg[i], factoryTrim[i], aDiff[i]);
-// //   DEBUG_PRINT("g[%d] Avg:%d, StAvg:%d, Shift:%d, FT:%d, Diff:%0.2f\n", i, gAvg[i], gSTAvg[i], gSTAvg[i] - gAvg[i], factoryTrim[i+3], gDiff[i]);
-//   }
-
-//   // Restore old configuration
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, saveReg[0]);
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_CONFIG, saveReg[1]);
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, saveReg[2]);
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, saveReg[3]);
-//   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, saveReg[4]);
-
-//    // Check result
-//   if (mpu6500EvaluateSelfTest(MPU6500_ST_GYRO_LOW, MPU6500_ST_GYRO_HIGH, gDiff[0], "gyro X") &&
-//       mpu6500EvaluateSelfTest(MPU6500_ST_GYRO_LOW, MPU6500_ST_GYRO_HIGH, gDiff[1], "gyro Y") &&
-//       mpu6500EvaluateSelfTest(MPU6500_ST_GYRO_LOW, MPU6500_ST_GYRO_HIGH, gDiff[2], "gyro Z") &&
-//       mpu6500EvaluateSelfTest(MPU6500_ST_ACCEL_LOW, MPU6500_ST_ACCEL_HIGH, aDiff[0], "acc X") &&
-//       mpu6500EvaluateSelfTest(MPU6500_ST_ACCEL_LOW, MPU6500_ST_ACCEL_HIGH, aDiff[1], "acc Y") &&
-//       mpu6500EvaluateSelfTest(MPU6500_ST_ACCEL_LOW, MPU6500_ST_ACCEL_HIGH, aDiff[2], "acc Z"))
-//   {
-//     return true;
-//   }
-//   else
-//   {
-//     return false;
-//   }
-
-return true;
+  uint8_t rawData[6] = {0, 0, 0, 0, 0, 0};
+  uint8_t saveReg[5];
+  uint8_t selfTest[6];
+  int32_t gAvg[3]={0}, aAvg[3]={0}, aSTAvg[3]={0}, gSTAvg[3]={0};
+  int32_t factoryTrim[6];
+  float aDiff[3], gDiff[3];
+  uint8_t FS = 0;
+  int i;
+
+  // Save old configuration
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, &saveReg[0]);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_CONFIG, &saveReg[1]);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, &saveReg[2]);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, &saveReg[3]);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, &saveReg[4]);
+  // Write test configuration
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, 0x00); // Set gyro sample rate to 1 kHz
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_CONFIG, 0x02); // Set gyro sample rate to 1 kHz and DLPF to 92 Hz
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, 1<<FS); // Set full scale range for the gyro to 250 dps
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, 0x02); // Set accelerometer rate to 1 kHz and bandwidth to 92 Hz
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, 1<<FS); // Set full scale range for the accelerometer to 2 g
+
+  for(i = 0; i < 200; i++)
+  {
+    // get average current values of gyro and acclerometer
+    i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 6, &rawData[0]); // Read the six raw data registers into data array
+    aAvg[0] += (int16_t)(((int16_t)rawData[0] << 8) | rawData[1]) ; // Turn the MSB and LSB into a signed 16-bit value
+    aAvg[1] += (int16_t)(((int16_t)rawData[2] << 8) | rawData[3]) ;
+    aAvg[2] += (int16_t)(((int16_t)rawData[4] << 8) | rawData[5]) ;
+
+    i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 6, &rawData[0]); // Read the six raw data registers sequentially into data array
+    gAvg[0] += (int16_t)((int16_t)rawData[0] << 8) | rawData[1]; // Turn the MSB and LSB into a signed 16-bit value
+    gAvg[1] += (int16_t)((int16_t)rawData[2] << 8) | rawData[3];
+    gAvg[2] += (int16_t)((int16_t)rawData[4] << 8) | rawData[5];
+  }
+
+  for (i = 0; i < 3; i++)
+  { // Get average of 200 values and store as average current readings
+    aAvg[i] /= 200;
+    gAvg[i] /= 200;
+  }
+
+  // Configure the accelerometer for self-test
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, 0xE0); // Enable self test on all three axes and set accelerometer range to +/- 2 g
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, 0xE0); // Enable self test on all three axes and set gyro range to +/- 250 degrees/s
+  vTaskDelay(M2T(25)); // Delay a while to let the device stabilize
+
+  for(i = 0; i < 200; i++)
+  {
+    // get average self-test values of gyro and acclerometer
+    i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 6, &rawData[0]); // Read the six raw data registers into data array
+    aSTAvg[0] += (int16_t)(((int16_t)rawData[0] << 8) | rawData[1]) ; // Turn the MSB and LSB into a signed 16-bit value
+    aSTAvg[1] += (int16_t)(((int16_t)rawData[2] << 8) | rawData[3]) ;
+    aSTAvg[2] += (int16_t)(((int16_t)rawData[4] << 8) | rawData[5]) ;
+
+    i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 6, &rawData[0]); // Read the six raw data registers sequentially into data array
+    gSTAvg[0] += (int16_t)(((int16_t)rawData[0] << 8) | rawData[1]) ; // Turn the MSB and LSB into a signed 16-bit value
+    gSTAvg[1] += (int16_t)(((int16_t)rawData[2] << 8) | rawData[3]) ;
+    gSTAvg[2] += (int16_t)(((int16_t)rawData[4] << 8) | rawData[5]) ;
+  }
+
+  for (i =0; i < 3; i++)
+  { // Get average of 200 values and store as average self-test readings
+    aSTAvg[i] /= 200;
+    gSTAvg[i] /= 200;
+  }
+
+   // Configure the gyro and accelerometer for normal operation
+   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, 0x00);
+   i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, 0x00);
+   vTaskDelay(M2T(25)); // Delay a while to let the device stabilize
+
+   // Retrieve accelerometer and gyro factory Self-Test Code from USR_Reg
+   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_X_ACCEL, &selfTest[0]); // X-axis accel self-test results
+   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Y_ACCEL, &selfTest[1]); // Y-axis accel self-test results
+   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Z_ACCEL, &selfTest[2]); // Z-axis accel self-test results
+   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_X_GYRO, &selfTest[3]); // X-axis gyro self-test results
+   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Y_GYRO, &selfTest[4]); // Y-axis gyro self-test results
+   i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_ST_Z_GYRO, &selfTest[5]); // Z-axis gyro self-test results
+
+   for (i = 0; i < 6; i++)
+   {
+      if (selfTest[i] != 0)
+      {
+        factoryTrim[i] = mpu6500StTb[selfTest[i] - 1];
+      }
+      else
+      {
+        factoryTrim[i] = 0;
+      }
+    }
+
+  // Report results as a ratio of (STR - FT)/FT; the change from Factory Trim of the Self-Test Response
+  // To get percent, must multiply by 100
+  for (i = 0; i < 3; i++)
+  {
+   aDiff[i] = 100.0f*((float)((aSTAvg[i] - aAvg[i]) - factoryTrim[i]))/factoryTrim[i]; // Report percent differences
+   gDiff[i] = 100.0f*((float)((gSTAvg[i] - gAvg[i]) - factoryTrim[i+3]))/factoryTrim[i+3]; // Report percent differences
+//   DEBUG_PRINT("a[%d] Avg:%d, StAvg:%d, Shift:%d, FT:%d, Diff:%0.2f\n", i, aAvg[i], aSTAvg[i], aSTAvg[i] - aAvg[i], factoryTrim[i], aDiff[i]);
+//   DEBUG_PRINT("g[%d] Avg:%d, StAvg:%d, Shift:%d, FT:%d, Diff:%0.2f\n", i, gAvg[i], gSTAvg[i], gSTAvg[i] - gAvg[i], factoryTrim[i+3], gDiff[i]);
+  }
+
+  // Restore old configuration
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, saveReg[0]);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_CONFIG, saveReg[1]);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, saveReg[2]);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, saveReg[3]);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, saveReg[4]);
+
+   // Check result
+  if (mpu6500EvaluateSelfTest(MPU6500_ST_GYRO_LOW, MPU6500_ST_GYRO_HIGH, gDiff[0], "gyro X") &&
+      mpu6500EvaluateSelfTest(MPU6500_ST_GYRO_LOW, MPU6500_ST_GYRO_HIGH, gDiff[1], "gyro Y") &&
+      mpu6500EvaluateSelfTest(MPU6500_ST_GYRO_LOW, MPU6500_ST_GYRO_HIGH, gDiff[2], "gyro Z") &&
+      mpu6500EvaluateSelfTest(MPU6500_ST_ACCEL_LOW, MPU6500_ST_ACCEL_HIGH, aDiff[0], "acc X") &&
+      mpu6500EvaluateSelfTest(MPU6500_ST_ACCEL_LOW, MPU6500_ST_ACCEL_HIGH, aDiff[1], "acc Y") &&
+      mpu6500EvaluateSelfTest(MPU6500_ST_ACCEL_LOW, MPU6500_ST_ACCEL_HIGH, aDiff[2], "acc Z"))
+  {
+    return true;
+  }
+  else
+  {
+    return false;
+  }
 }
 
 /** Evaluate the values from a MPU6500 self test.
@@ -257,12 +255,12 @@ return true;
  */
 bool mpu6500EvaluateSelfTest(float low, float high, float value, char* string)
 {
-  // if (value < low || value > high)
-  // {
-  //   DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
-  //               string, (double)low, (double)high, (double)value);
-  //   return false;
-  // }
+  if (value < low || value > high)
+  {
+    DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
+                string, (double)low, (double)high, (double)value);
+    return false;
+  }
   return true;
 }
 
@@ -291,7 +289,7 @@ bool mpu6500EvaluateSelfTest(float low, float high, float value, char* string)
  */
 uint8_t mpu6500GetRate()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, buffer);
   return buffer[0];
 }
 /** Set gyroscope sample rate divider.
@@ -301,7 +299,7 @@ uint8_t mpu6500GetRate()
  */
 void mpu6500SetRate(uint8_t rate)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, rate);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_SMPLRT_DIV, rate);
 }
 
 // CONFIG register
@@ -335,8 +333,8 @@ void mpu6500SetRate(uint8_t rate)
  */
 uint8_t mpu6500GetExternalFrameSync()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_EXT_SYNC_SET_BIT,
-  //     MPU6500_CFG_EXT_SYNC_SET_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_EXT_SYNC_SET_BIT,
+      MPU6500_CFG_EXT_SYNC_SET_LENGTH, buffer);
   return buffer[0];
 }
 /** Set external FSYNC configuration.
@@ -346,8 +344,8 @@ uint8_t mpu6500GetExternalFrameSync()
  */
 void mpu6500SetExternalFrameSync(uint8_t sync)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_EXT_SYNC_SET_BIT,
-  //     MPU6500_CFG_EXT_SYNC_SET_LENGTH, sync);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_EXT_SYNC_SET_BIT,
+      MPU6500_CFG_EXT_SYNC_SET_LENGTH, sync);
 }
 /** Get digital low-pass filter configuration.
  * The DLPF_CFG parameter sets the digital low pass filter configuration. It
@@ -379,8 +377,8 @@ void mpu6500SetExternalFrameSync(uint8_t sync)
  */
 uint8_t mpu6500GetDLPFMode()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_DLPF_CFG_BIT,
-  //     MPU6500_CFG_DLPF_CFG_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_DLPF_CFG_BIT,
+      MPU6500_CFG_DLPF_CFG_LENGTH, buffer);
   return buffer[0];
 }
 /** Set digital low-pass filter configuration.
@@ -393,8 +391,8 @@ uint8_t mpu6500GetDLPFMode()
  */
 void mpu6500SetDLPFMode(uint8_t mode)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_DLPF_CFG_BIT,
-  //     MPU6500_CFG_DLPF_CFG_LENGTH, mode);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_CONFIG, MPU6500_CFG_DLPF_CFG_BIT,
+      MPU6500_CFG_DLPF_CFG_LENGTH, mode);
 }
 
 // GYRO_CONFIG register
@@ -418,8 +416,8 @@ void mpu6500SetDLPFMode(uint8_t mode)
  */
 uint8_t mpu6500GetFullScaleGyroRangeId()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_FS_SEL_BIT,
-  //     MPU6500_GCONFIG_FS_SEL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_FS_SEL_BIT,
+      MPU6500_GCONFIG_FS_SEL_LENGTH, buffer);
   return buffer[0];
 }
 
@@ -436,25 +434,25 @@ float mpu6500GetFullScaleGyroDPL()
   int32_t rangeId;
   float range;
 
-  // rangeId = mpu6500GetFullScaleGyroRangeId();
-  // switch (rangeId)
-  // {
-  //   case MPU6500_GYRO_FS_250:
-  //     range = MPU6500_DEG_PER_LSB_250;
-  //     break;
-  //   case MPU6500_GYRO_FS_500:
-  //     range = MPU6500_DEG_PER_LSB_500;
-  //     break;
-  //   case MPU6500_GYRO_FS_1000:
-  //     range = MPU6500_DEG_PER_LSB_1000;
-  //     break;
-  //   case MPU6500_GYRO_FS_2000:
-  //     range = MPU6500_DEG_PER_LSB_2000;
-  //     break;
-  //   default:
-  //     range = MPU6500_DEG_PER_LSB_1000;
-  //     break;
-  // }
+  rangeId = mpu6500GetFullScaleGyroRangeId();
+  switch (rangeId)
+  {
+    case MPU6500_GYRO_FS_250:
+      range = MPU6500_DEG_PER_LSB_250;
+      break;
+    case MPU6500_GYRO_FS_500:
+      range = MPU6500_DEG_PER_LSB_500;
+      break;
+    case MPU6500_GYRO_FS_1000:
+      range = MPU6500_DEG_PER_LSB_1000;
+      break;
+    case MPU6500_GYRO_FS_2000:
+      range = MPU6500_DEG_PER_LSB_2000;
+      break;
+    default:
+      range = MPU6500_DEG_PER_LSB_1000;
+      break;
+  }
 
   return range;
 }
@@ -469,23 +467,23 @@ float mpu6500GetFullScaleGyroDPL()
  */
 void mpu6500SetFullScaleGyroRange(uint8_t range)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_FS_SEL_BIT,
-  //     MPU6500_GCONFIG_FS_SEL_LENGTH, range);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_FS_SEL_BIT,
+      MPU6500_GCONFIG_FS_SEL_LENGTH, range);
 }
 
 void mpu6500SetGyroXSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_XG_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_XG_ST_BIT, enabled);
 }
 
 void mpu6500SetGyroYSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_YG_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_YG_ST_BIT, enabled);
 }
 
 void mpu6500SetGyroZSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_ZG_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_GYRO_CONFIG, MPU6500_GCONFIG_ZG_ST_BIT, enabled);
 }
 
 // ACCEL_CONFIG register
@@ -496,7 +494,7 @@ void mpu6500SetGyroZSelfTest(bool enabled)
  */
 bool mpu6500GetAccelXSelfTest()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_XA_ST_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_XA_ST_BIT, buffer);
   return buffer[0];
 }
 /** Get self-test enabled setting for accelerometer X axis.
@@ -505,7 +503,7 @@ bool mpu6500GetAccelXSelfTest()
  */
 void mpu6500SetAccelXSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_XA_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_XA_ST_BIT, enabled);
 }
 /** Get self-test enabled value for accelerometer Y axis.
  * @return Self-test enabled value
@@ -513,7 +511,7 @@ void mpu6500SetAccelXSelfTest(bool enabled)
  */
 bool mpu6500GetAccelYSelfTest()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_YA_ST_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_YA_ST_BIT, buffer);
   return buffer[0];
 }
 /** Get self-test enabled value for accelerometer Y axis.
@@ -522,7 +520,7 @@ bool mpu6500GetAccelYSelfTest()
  */
 void mpu6500SetAccelYSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_YA_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_YA_ST_BIT, enabled);
 }
 /** Get self-test enabled value for accelerometer Z axis.
  * @return Self-test enabled value
@@ -530,7 +528,7 @@ void mpu6500SetAccelYSelfTest(bool enabled)
  */
 bool mpu6500GetAccelZSelfTest()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ZA_ST_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ZA_ST_BIT, buffer);
   return buffer[0];
 }
 /** Set self-test enabled value for accelerometer Z axis.
@@ -539,7 +537,7 @@ bool mpu6500GetAccelZSelfTest()
  */
 void mpu6500SetAccelZSelfTest(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ZA_ST_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ZA_ST_BIT, enabled);
 }
 /** Get full-scale accelerometer range.
  * The FS_SEL parameter allows setting the full-scale range of the accelerometer
@@ -560,8 +558,8 @@ void mpu6500SetAccelZSelfTest(bool enabled)
  */
 uint8_t mpu6500GetFullScaleAccelRangeId()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_AFS_SEL_BIT,
-  //     MPU6500_ACONFIG_AFS_SEL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_AFS_SEL_BIT,
+      MPU6500_ACONFIG_AFS_SEL_LENGTH, buffer);
   return buffer[0];
 }
 
@@ -578,25 +576,25 @@ float mpu6500GetFullScaleAccelGPL()
   int32_t rangeId;
   float range;
 
-  // rangeId = mpu6500GetFullScaleAccelRangeId();
-  // switch (rangeId)
-  // {
-  //   case MPU6500_ACCEL_FS_2:
-  //     range = MPU6500_G_PER_LSB_2;
-  //     break;
-  //   case MPU6500_ACCEL_FS_4:
-  //     range = MPU6500_G_PER_LSB_4;
-  //     break;
-  //   case MPU6500_ACCEL_FS_8:
-  //     range = MPU6500_G_PER_LSB_8;
-  //     break;
-  //   case MPU6500_ACCEL_FS_16:
-  //     range = MPU6500_G_PER_LSB_16;
-  //     break;
-  //   default:
-  //     range = MPU6500_DEG_PER_LSB_1000;
-  //     break;
-  // }
+  rangeId = mpu6500GetFullScaleAccelRangeId();
+  switch (rangeId)
+  {
+    case MPU6500_ACCEL_FS_2:
+      range = MPU6500_G_PER_LSB_2;
+      break;
+    case MPU6500_ACCEL_FS_4:
+      range = MPU6500_G_PER_LSB_4;
+      break;
+    case MPU6500_ACCEL_FS_8:
+      range = MPU6500_G_PER_LSB_8;
+      break;
+    case MPU6500_ACCEL_FS_16:
+      range = MPU6500_G_PER_LSB_16;
+      break;
+    default:
+      range = MPU6500_DEG_PER_LSB_1000;
+      break;
+  }
 
   return range;
 }
@@ -607,8 +605,8 @@ float mpu6500GetFullScaleAccelGPL()
  */
 void mpu6500SetFullScaleAccelRange(uint8_t range)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_AFS_SEL_BIT,
-  //     MPU6500_ACONFIG_AFS_SEL_LENGTH, range);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_AFS_SEL_BIT,
+      MPU6500_ACONFIG_AFS_SEL_LENGTH, range);
 }
 
 /** Set accelerometer digital low pass filter.
@@ -623,8 +621,8 @@ void mpu6500SetFullScaleAccelRange(uint8_t range)
  */
 void mpu6500SetAccelDLPF(uint8_t range)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, MPU6500_ACONFIG2_DLPF_BIT,
-  //     MPU6500_ACONFIG2_DLPF_LENGTH, range);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG_2, MPU6500_ACONFIG2_DLPF_BIT,
+      MPU6500_ACONFIG2_DLPF_LENGTH, range);
 }
 
 /** Get the high-pass filter configuration.
@@ -664,8 +662,8 @@ void mpu6500SetAccelDLPF(uint8_t range)
  */
 uint8_t mpu6500GetDHPFMode()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ACCEL_HPF_BIT,
-  //     MPU6500_ACONFIG_ACCEL_HPF_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ACCEL_HPF_BIT,
+      MPU6500_ACONFIG_ACCEL_HPF_LENGTH, buffer);
   return buffer[0];
 }
 /** Set the high-pass filter configuration.
@@ -676,8 +674,8 @@ uint8_t mpu6500GetDHPFMode()
  */
 void mpu6500SetDHPFMode(uint8_t bandwidth)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ACCEL_HPF_BIT,
-  //     MPU6500_ACONFIG_ACCEL_HPF_LENGTH, bandwidth);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_ACCEL_CONFIG, MPU6500_ACONFIG_ACCEL_HPF_BIT,
+      MPU6500_ACONFIG_ACCEL_HPF_LENGTH, bandwidth);
 }
 
 // FIFO_EN register
@@ -690,7 +688,7 @@ void mpu6500SetDHPFMode(uint8_t bandwidth)
  */
 bool mpu6500GetTempFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_TEMP_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_TEMP_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set temperature FIFO enabled value.
@@ -700,7 +698,7 @@ bool mpu6500GetTempFIFOEnabled()
  */
 void mpu6500SetTempFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_TEMP_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_TEMP_FIFO_EN_BIT, enabled);
 }
 /** Get gyroscope X-axis FIFO enabled value.
  * When set to 1, this bit enables GYRO_XOUT_H and GYRO_XOUT_L (Registers 67 and
@@ -710,7 +708,7 @@ void mpu6500SetTempFIFOEnabled(bool enabled)
  */
 bool mpu6500GetXGyroFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_XG_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_XG_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set gyroscope X-axis FIFO enabled value.
@@ -720,7 +718,7 @@ bool mpu6500GetXGyroFIFOEnabled()
  */
 void mpu6500SetXGyroFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_XG_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_XG_FIFO_EN_BIT, enabled);
 }
 /** Get gyroscope Y-axis FIFO enabled value.
  * When set to 1, this bit enables GYRO_YOUT_H and GYRO_YOUT_L (Registers 69 and
@@ -730,7 +728,7 @@ void mpu6500SetXGyroFIFOEnabled(bool enabled)
  */
 bool mpu6500GetYGyroFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_YG_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_YG_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set gyroscope Y-axis FIFO enabled value.
@@ -740,7 +738,7 @@ bool mpu6500GetYGyroFIFOEnabled()
  */
 void mpu6500SetYGyroFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_YG_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_YG_FIFO_EN_BIT, enabled);
 }
 /** Get gyroscope Z-axis FIFO enabled value.
  * When set to 1, this bit enables GYRO_ZOUT_H and GYRO_ZOUT_L (Registers 71 and
@@ -750,7 +748,7 @@ void mpu6500SetYGyroFIFOEnabled(bool enabled)
  */
 bool mpu6500GetZGyroFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ZG_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ZG_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set gyroscope Z-axis FIFO enabled value.
@@ -760,7 +758,7 @@ bool mpu6500GetZGyroFIFOEnabled()
  */
 void mpu6500SetZGyroFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ZG_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ZG_FIFO_EN_BIT, enabled);
 }
 /** Get accelerometer FIFO enabled value.
  * When set to 1, this bit enables ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H,
@@ -771,7 +769,7 @@ void mpu6500SetZGyroFIFOEnabled(bool enabled)
  */
 bool mpu6500GetAccelFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ACCEL_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ACCEL_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set accelerometer FIFO enabled value.
@@ -781,7 +779,7 @@ bool mpu6500GetAccelFIFOEnabled()
  */
 void mpu6500SetAccelFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ACCEL_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_ACCEL_FIFO_EN_BIT, enabled);
 }
 /** Get Slave 2 FIFO enabled value.
  * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96)
@@ -791,7 +789,7 @@ void mpu6500SetAccelFIFOEnabled(bool enabled)
  */
 bool mpu6500GetSlave2FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV2_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV2_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 2 FIFO enabled value.
@@ -801,7 +799,7 @@ bool mpu6500GetSlave2FIFOEnabled()
  */
 void mpu6500SetSlave2FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV2_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV2_FIFO_EN_BIT, enabled);
 }
 /** Get Slave 1 FIFO enabled value.
  * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96)
@@ -811,7 +809,7 @@ void mpu6500SetSlave2FIFOEnabled(bool enabled)
  */
 bool mpu6500GetSlave1FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV1_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV1_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 1 FIFO enabled value.
@@ -821,7 +819,7 @@ bool mpu6500GetSlave1FIFOEnabled()
  */
 void mpu6500SetSlave1FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV1_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV1_FIFO_EN_BIT, enabled);
 }
 /** Get Slave 0 FIFO enabled value.
  * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96)
@@ -831,7 +829,7 @@ void mpu6500SetSlave1FIFOEnabled(bool enabled)
  */
 bool mpu6500GetSlave0FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV0_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV0_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 0 FIFO enabled value.
@@ -841,7 +839,7 @@ bool mpu6500GetSlave0FIFOEnabled()
  */
 void mpu6500SetSlave0FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV0_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_FIFO_EN, MPU6500_SLV0_FIFO_EN_BIT, enabled);
 }
 
 // I2C_MST_CTRL register
@@ -863,7 +861,7 @@ void mpu6500SetSlave0FIFOEnabled(bool enabled)
  */
 bool mpu6500GetMultiMasterEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_MULT_MST_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_MULT_MST_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set multi-master enabled value.
@@ -873,7 +871,7 @@ bool mpu6500GetMultiMasterEnabled()
  */
 void mpu6500SetMultiMasterEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_MULT_MST_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_MULT_MST_EN_BIT, enabled);
 }
 /** Get wait-for-external-sensor-data enabled value.
  * When the WAIT_FOR_ES bit is set to 1, the Data Ready interrupt will be
@@ -888,7 +886,7 @@ void mpu6500SetMultiMasterEnabled(bool enabled)
  */
 bool mpu6500GetWaitForExternalSensorEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_WAIT_FOR_ES_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_WAIT_FOR_ES_BIT, buffer);
   return buffer[0];
 }
 /** Set wait-for-external-sensor-data enabled value.
@@ -898,7 +896,7 @@ bool mpu6500GetWaitForExternalSensorEnabled()
  */
 void mpu6500SetWaitForExternalSensorEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_WAIT_FOR_ES_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_WAIT_FOR_ES_BIT, enabled);
 }
 /** Get Slave 3 FIFO enabled value.
  * When set to 1, this bit enables EXT_SENS_DATA registers (Registers 73 to 96)
@@ -908,7 +906,7 @@ void mpu6500SetWaitForExternalSensorEnabled(bool enabled)
  */
 bool mpu6500GetSlave3FIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_SLV_3_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_SLV_3_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set Slave 3 FIFO enabled value.
@@ -918,7 +916,7 @@ bool mpu6500GetSlave3FIFOEnabled()
  */
 void mpu6500SetSlave3FIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_SLV_3_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_SLV_3_FIFO_EN_BIT, enabled);
 }
 /** Get slave read/write transition enabled value.
  * The I2C_MST_P_NSR bit configures the I2C Master's transition from one slave
@@ -932,7 +930,7 @@ void mpu6500SetSlave3FIFOEnabled(bool enabled)
  */
 bool mpu6500GetSlaveReadWriteTransitionEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_P_NSR_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_P_NSR_BIT, buffer);
   return buffer[0];
 }
 /** Set slave read/write transition enabled value.
@@ -942,7 +940,7 @@ bool mpu6500GetSlaveReadWriteTransitionEnabled()
  */
 void mpu6500SetSlaveReadWriteTransitionEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_P_NSR_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_P_NSR_BIT, enabled);
 }
 /** Get I2C master clock speed.
  * I2C_MST_CLK is a 4 bit unsigned value which configures a divider on the
@@ -975,8 +973,8 @@ void mpu6500SetSlaveReadWriteTransitionEnabled(bool enabled)
  */
 uint8_t mpu6500GetMasterClockSpeed()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_CLK_BIT,
-      // MPU6500_I2C_MST_CLK_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_CLK_BIT,
+      MPU6500_I2C_MST_CLK_LENGTH, buffer);
   return buffer[0];
 }
 /** Set I2C master clock speed.
@@ -985,8 +983,8 @@ uint8_t mpu6500GetMasterClockSpeed()
  */
 void mpu6500SetMasterClockSpeed(uint8_t speed)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_CLK_BIT,
-  //     MPU6500_I2C_MST_CLK_LENGTH, speed);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_I2C_MST_CTRL, MPU6500_I2C_MST_CLK_BIT,
+      MPU6500_I2C_MST_CLK_LENGTH, speed);
 }
 
 // I2C_SLV* registers (Slave 0-3)
@@ -1034,9 +1032,9 @@ void mpu6500SetMasterClockSpeed(uint8_t speed)
  */
 uint8_t mpu6500GetSlaveAddress(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_ADDR + num * 3, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_ADDR + num * 3, buffer);
   return buffer[0];
 }
 /** Set the I2C address of the specified slave (0-3).
@@ -1047,9 +1045,9 @@ uint8_t mpu6500GetSlaveAddress(uint8_t num)
  */
 void mpu6500SetSlaveAddress(uint8_t num, uint8_t address)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_ADDR + num * 3, address);
+  if (num > 3)
+    return;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_ADDR + num * 3, address);
 }
 /** Get the active internal register for the specified slave (0-3).
  * Read/write operations for this slave will be done to whatever internal
@@ -1064,9 +1062,9 @@ void mpu6500SetSlaveAddress(uint8_t num, uint8_t address)
  */
 uint8_t mpu6500GetSlaveRegister(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_REG + num * 3, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_REG + num * 3, buffer);
   return buffer[0];
 }
 /** Set the active internal register for the specified slave (0-3).
@@ -1077,9 +1075,9 @@ uint8_t mpu6500GetSlaveRegister(uint8_t num)
  */
 void mpu6500SetSlaveRegister(uint8_t num, uint8_t reg)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_REG + num * 3, reg);
+  if (num > 3)
+    return;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_REG + num * 3, reg);
 }
 /** Get the enabled value for the specified slave (0-3).
  * When set to 1, this bit enables Slave 0 for data transfer operations. When
@@ -1090,9 +1088,9 @@ void mpu6500SetSlaveRegister(uint8_t num, uint8_t reg)
  */
 bool mpu6500GetSlaveEnabled(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_EN_BIT, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set the enabled value for the specified slave (0-3).
@@ -1103,10 +1101,10 @@ bool mpu6500GetSlaveEnabled(uint8_t num)
  */
 void mpu6500SetSlaveEnabled(uint8_t num, bool enabled)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_EN_BIT,
-  //     enabled);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_EN_BIT,
+      enabled);
 }
 /** Get word pair byte-swapping enabled for the specified slave (0-3).
  * When set to 1, this bit enables byte swapping. When byte swapping is enabled,
@@ -1121,10 +1119,10 @@ void mpu6500SetSlaveEnabled(uint8_t num, bool enabled)
  */
 bool mpu6500GetSlaveWordByteSwap(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_BYTE_SW_BIT,
-  //     buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_BYTE_SW_BIT,
+      buffer);
   return buffer[0];
 }
 /** Set word pair byte-swapping enabled for the specified slave (0-3).
@@ -1135,10 +1133,10 @@ bool mpu6500GetSlaveWordByteSwap(uint8_t num)
  */
 void mpu6500SetSlaveWordByteSwap(uint8_t num, bool enabled)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_BYTE_SW_BIT,
-  //     enabled);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_BYTE_SW_BIT,
+      enabled);
 }
 /** Get write mode for the specified slave (0-3).
  * When set to 1, the transaction will read or write data only. When cleared to
@@ -1152,10 +1150,10 @@ void mpu6500SetSlaveWordByteSwap(uint8_t num, bool enabled)
  */
 bool mpu6500GetSlaveWriteMode(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_REG_DIS_BIT,
-  //     buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_REG_DIS_BIT,
+      buffer);
   return buffer[0];
 }
 /** Set write mode for the specified slave (0-3).
@@ -1166,10 +1164,10 @@ bool mpu6500GetSlaveWriteMode(uint8_t num)
  */
 void mpu6500SetSlaveWriteMode(uint8_t num, bool mode)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_REG_DIS_BIT,
-  //     mode);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_REG_DIS_BIT,
+      mode);
 }
 /** Get word pair grouping order offset for the specified slave (0-3).
  * This sets specifies the grouping order of word pairs received from registers.
@@ -1184,9 +1182,9 @@ void mpu6500SetSlaveWriteMode(uint8_t num, bool mode)
  */
 bool mpu6500GetSlaveWordGroupOffset(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_GRP_BIT, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_GRP_BIT, buffer);
   return buffer[0];
 }
 /** Set word pair grouping order offset for the specified slave (0-3).
@@ -1197,10 +1195,10 @@ bool mpu6500GetSlaveWordGroupOffset(uint8_t num)
  */
 void mpu6500SetSlaveWordGroupOffset(uint8_t num, bool enabled)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_GRP_BIT,
-  //     enabled);
+  if (num > 3)
+    return;
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_GRP_BIT,
+      enabled);
 }
 /** Get number of bytes to read for the specified slave (0-3).
  * Specifies the number of bytes transferred to and from Slave 0. Clearing this
@@ -1211,10 +1209,10 @@ void mpu6500SetSlaveWordGroupOffset(uint8_t num, bool enabled)
  */
 uint8_t mpu6500GetSlaveDataLength(uint8_t num)
 {
-  // if (num > 3)
-  //   return 0;
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_LEN_BIT,
-  //     MPU6500_I2C_SLV_LEN_LENGTH, buffer);
+  if (num > 3)
+    return 0;
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_LEN_BIT,
+      MPU6500_I2C_SLV_LEN_LENGTH, buffer);
   return buffer[0];
 }
 /** Set number of bytes to read for the specified slave (0-3).
@@ -1225,10 +1223,10 @@ uint8_t mpu6500GetSlaveDataLength(uint8_t num)
  */
 void mpu6500SetSlaveDataLength(uint8_t num, uint8_t length)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_LEN_BIT,
-  //     MPU6500_I2C_SLV_LEN_LENGTH, length);
+  if (num > 3)
+    return;
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_CTRL + num * 3, MPU6500_I2C_SLV_LEN_BIT,
+      MPU6500_I2C_SLV_LEN_LENGTH, length);
 }
 
 // I2C_SLV* registers (Slave 4)
@@ -1244,7 +1242,7 @@ void mpu6500SetSlaveDataLength(uint8_t num, uint8_t length)
  */
 uint8_t mpu6500GetSlave4Address()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_ADDR, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_ADDR, buffer);
   return buffer[0];
 }
 /** Set the I2C address of Slave 4.
@@ -1254,7 +1252,7 @@ uint8_t mpu6500GetSlave4Address()
  */
 void mpu6500SetSlave4Address(uint8_t address)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_ADDR, address);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_ADDR, address);
 }
 /** Get the active internal register for the Slave 4.
  * Read/write operations for this slave will be done to whatever internal
@@ -1265,7 +1263,7 @@ void mpu6500SetSlave4Address(uint8_t address)
  */
 uint8_t mpu6500GetSlave4Register()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_REG, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_REG, buffer);
   return buffer[0];
 }
 /** Set the active internal register for Slave 4.
@@ -1275,7 +1273,7 @@ uint8_t mpu6500GetSlave4Register()
  */
 void mpu6500SetSlave4Register(uint8_t reg)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_REG, reg);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_REG, reg);
 }
 /** Set new byte to write to Slave 4.
  * This register stores the data to be written into the Slave 4. If I2C_SLV4_RW
@@ -1285,7 +1283,7 @@ void mpu6500SetSlave4Register(uint8_t reg)
  */
 void mpu6500SetSlave4OutputByte(uint8_t data)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_DO, data);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_DO, data);
 }
 /** Get the enabled value for the Slave 4.
  * When set to 1, this bit enables Slave 4 for data transfer operations. When
@@ -1295,7 +1293,7 @@ void mpu6500SetSlave4OutputByte(uint8_t data)
  */
 bool mpu6500GetSlave4Enabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set the enabled value for Slave 4.
@@ -1305,7 +1303,7 @@ bool mpu6500GetSlave4Enabled()
  */
 void mpu6500SetSlave4Enabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_EN_BIT, enabled);
 }
 /** Get the enabled value for Slave 4 transaction interrupts.
  * When set to 1, this bit enables the generation of an interrupt signal upon
@@ -1318,7 +1316,7 @@ void mpu6500SetSlave4Enabled(bool enabled)
  */
 bool mpu6500GetSlave4InterruptEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_INT_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_INT_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set the enabled value for Slave 4 transaction interrupts.
@@ -1328,7 +1326,7 @@ bool mpu6500GetSlave4InterruptEnabled()
  */
 void mpu6500SetSlave4InterruptEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_INT_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_INT_EN_BIT, enabled);
 }
 /** Get write mode for Slave 4.
  * When set to 1, the transaction will read or write data only. When cleared to
@@ -1341,7 +1339,7 @@ void mpu6500SetSlave4InterruptEnabled(bool enabled)
  */
 bool mpu6500GetSlave4WriteMode()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_REG_DIS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_REG_DIS_BIT, buffer);
   return buffer[0];
 }
 /** Set write mode for the Slave 4.
@@ -1351,7 +1349,7 @@ bool mpu6500GetSlave4WriteMode()
  */
 void mpu6500SetSlave4WriteMode(bool mode)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_REG_DIS_BIT, mode);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_REG_DIS_BIT, mode);
 }
 /** Get Slave 4 master delay value.
  * This configures the reduced access rate of I2C slaves relative to the Sample
@@ -1370,8 +1368,8 @@ void mpu6500SetSlave4WriteMode(bool mode)
  */
 uint8_t mpu6500GetSlave4MasterDelay()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_MST_DLY_BIT,
-  //     MPU6500_I2C_SLV4_MST_DLY_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_MST_DLY_BIT,
+      MPU6500_I2C_SLV4_MST_DLY_LENGTH, buffer);
   return buffer[0];
 }
 /** Set Slave 4 master delay value.
@@ -1381,8 +1379,8 @@ uint8_t mpu6500GetSlave4MasterDelay()
  */
 void mpu6500SetSlave4MasterDelay(uint8_t delay)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_MST_DLY_BIT,
-  //     MPU6500_I2C_SLV4_MST_DLY_LENGTH, delay);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_CTRL, MPU6500_I2C_SLV4_MST_DLY_BIT,
+      MPU6500_I2C_SLV4_MST_DLY_LENGTH, delay);
 }
 /** Get last available byte read from Slave 4.
  * This register stores the data read from Slave 4. This field is populated
@@ -1392,7 +1390,7 @@ void mpu6500SetSlave4MasterDelay(uint8_t delay)
  */
 uint8_t mpu6500GetSlate4InputByte()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_DI, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV4_DI, buffer);
   return buffer[0];
 }
 
@@ -1409,7 +1407,7 @@ uint8_t mpu6500GetSlate4InputByte()
  */
 bool mpu6500GetPassthroughStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_PASS_THROUGH_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_PASS_THROUGH_BIT, buffer);
   return buffer[0];
 }
 /** Get Slave 4 transaction done status.
@@ -1422,7 +1420,7 @@ bool mpu6500GetPassthroughStatus()
  */
 bool mpu6500GetSlave4IsDone()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV4_DONE_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV4_DONE_BIT, buffer);
   return buffer[0];
 }
 /** Get master arbitration lost status.
@@ -1434,7 +1432,7 @@ bool mpu6500GetSlave4IsDone()
  */
 bool mpu6500GetLostArbitration()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_LOST_ARB_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_LOST_ARB_BIT, buffer);
   return buffer[0];
 }
 /** Get Slave 4 NACK status.
@@ -1446,7 +1444,7 @@ bool mpu6500GetLostArbitration()
  */
 bool mpu6500GetSlave4Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV4_NACK_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV4_NACK_BIT, buffer);
   return buffer[0];
 }
 /** Get Slave 3 NACK status.
@@ -1458,7 +1456,7 @@ bool mpu6500GetSlave4Nack()
  */
 bool mpu6500GetSlave3Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV3_NACK_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV3_NACK_BIT, buffer);
   return buffer[0];
 }
 /** Get Slave 2 NACK status.
@@ -1470,7 +1468,7 @@ bool mpu6500GetSlave3Nack()
  */
 bool mpu6500GetSlave2Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV2_NACK_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV2_NACK_BIT, buffer);
   return buffer[0];
 }
 /** Get Slave 1 NACK status.
@@ -1482,7 +1480,7 @@ bool mpu6500GetSlave2Nack()
  */
 bool mpu6500GetSlave1Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV1_NACK_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV1_NACK_BIT, buffer);
   return buffer[0];
 }
 /** Get Slave 0 NACK status.
@@ -1494,7 +1492,7 @@ bool mpu6500GetSlave1Nack()
  */
 bool mpu6500GetSlave0Nack()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV0_NACK_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_STATUS, MPU6500_MST_I2C_SLV0_NACK_BIT, buffer);
   return buffer[0];
 }
 
@@ -1508,7 +1506,7 @@ bool mpu6500GetSlave0Nack()
  */
 bool mpu6500GetInterruptMode()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_LEVEL_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_LEVEL_BIT, buffer);
   return buffer[0];
 }
 /** Set interrupt logic level mode.
@@ -1519,7 +1517,7 @@ bool mpu6500GetInterruptMode()
  */
 void mpu6500SetInterruptMode(bool mode)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_LEVEL_BIT, mode);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_LEVEL_BIT, mode);
 }
 /** Get interrupt drive mode.
  * Will be set 0 for push-pull, 1 for open-drain.
@@ -1529,7 +1527,7 @@ void mpu6500SetInterruptMode(bool mode)
  */
 bool mpu6500GetInterruptDrive()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_OPEN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_OPEN_BIT, buffer);
   return buffer[0];
 }
 /** Set interrupt drive mode.
@@ -1540,7 +1538,7 @@ bool mpu6500GetInterruptDrive()
  */
 void mpu6500SetInterruptDrive(bool drive)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_OPEN_BIT, drive);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_OPEN_BIT, drive);
 }
 /** Get interrupt latch mode.
  * Will be set 0 for 50us-pulse, 1 for latch-until-int-cleared.
@@ -1550,7 +1548,7 @@ void mpu6500SetInterruptDrive(bool drive)
  */
 bool mpu6500GetInterruptLatch()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_LATCH_INT_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_LATCH_INT_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set interrupt latch mode.
@@ -1561,7 +1559,7 @@ bool mpu6500GetInterruptLatch()
  */
 void mpu6500SetInterruptLatch(bool latch)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_LATCH_INT_EN_BIT, latch);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_LATCH_INT_EN_BIT, latch);
 }
 /** Get interrupt latch clear mode.
  * Will be set 0 for status-read-only, 1 for any-register-read.
@@ -1571,7 +1569,7 @@ void mpu6500SetInterruptLatch(bool latch)
  */
 bool mpu6500GetInterruptLatchClear()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_RD_CLEAR_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_RD_CLEAR_BIT, buffer);
   return buffer[0];
 }
 /** Set interrupt latch clear mode.
@@ -1582,7 +1580,7 @@ bool mpu6500GetInterruptLatchClear()
  */
 void mpu6500SetInterruptLatchClear(bool clear)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_RD_CLEAR_BIT, clear);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_INT_RD_CLEAR_BIT, clear);
 }
 /** Get FSYNC interrupt logic level mode.
  * @return Current FSYNC interrupt mode (0=active-high, 1=active-low)
@@ -1592,7 +1590,7 @@ void mpu6500SetInterruptLatchClear(bool clear)
  */
 bool mpu6500GetFSyncInterruptLevel()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_LEVEL_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_LEVEL_BIT, buffer);
   return buffer[0];
 }
 /** Set FSYNC interrupt logic level mode.
@@ -1603,7 +1601,7 @@ bool mpu6500GetFSyncInterruptLevel()
  */
 void mpu6500SetFSyncInterruptLevel(bool level)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_LEVEL_BIT, level);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_LEVEL_BIT, level);
 }
 /** Get FSYNC pin interrupt enabled setting.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1613,7 +1611,7 @@ void mpu6500SetFSyncInterruptLevel(bool level)
  */
 bool mpu6500GetFSyncInterruptEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set FSYNC pin interrupt enabled setting.
@@ -1624,7 +1622,7 @@ bool mpu6500GetFSyncInterruptEnabled()
  */
 void mpu6500SetFSyncInterruptEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_FSYNC_INT_EN_BIT, enabled);
 }
 /** Get I2C bypass enabled status.
  * When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to
@@ -1639,7 +1637,7 @@ void mpu6500SetFSyncInterruptEnabled(bool enabled)
  */
 bool mpu6500GetI2CBypassEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_I2C_BYPASS_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_I2C_BYPASS_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set I2C bypass enabled status.
@@ -1655,7 +1653,7 @@ bool mpu6500GetI2CBypassEnabled()
  */
 void mpu6500SetI2CBypassEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_I2C_BYPASS_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_I2C_BYPASS_EN_BIT, enabled);
 }
 /** Get reference clock output enabled status.
  * When this bit is equal to 1, a reference clock output is provided at the
@@ -1668,7 +1666,7 @@ void mpu6500SetI2CBypassEnabled(bool enabled)
  */
 bool mpu6500GetClockOutputEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_CLKOUT_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_CLKOUT_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set reference clock output enabled status.
@@ -1682,7 +1680,7 @@ bool mpu6500GetClockOutputEnabled()
  */
 void mpu6500SetClockOutputEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_CLKOUT_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_PIN_CFG, MPU6500_INTCFG_CLKOUT_EN_BIT, enabled);
 }
 
 // INT_ENABLE register
@@ -1696,7 +1694,7 @@ void mpu6500SetClockOutputEnabled(bool enabled)
  **/
 uint8_t mpu6500GetIntEnabled()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, buffer);
   return buffer[0];
 }
 /** Set full interrupt enabled status.
@@ -1709,7 +1707,7 @@ uint8_t mpu6500GetIntEnabled()
  **/
 void mpu6500SetIntEnabled(uint8_t enabled)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, enabled);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, enabled);
 }
 /** Get Free Fall interrupt enabled status.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1719,7 +1717,7 @@ void mpu6500SetIntEnabled(uint8_t enabled)
  **/
 bool mpu6500GetIntFreefallEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_FF_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_FF_BIT, buffer);
   return buffer[0];
 }
 /** Set Free Fall interrupt enabled status.
@@ -1740,7 +1738,7 @@ void mpu6500SetIntFreefallEnabled(bool enabled)
  **/
 bool mpu6500GetIntMotionEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_MOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_MOT_BIT, buffer);
   return buffer[0];
 }
 /** Set Motion Detection interrupt enabled status.
@@ -1751,7 +1749,7 @@ bool mpu6500GetIntMotionEnabled()
  **/
 void mpu6500SetIntMotionEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_MOT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_MOT_BIT, enabled);
 }
 /** Get Zero Motion Detection interrupt enabled status.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1761,7 +1759,7 @@ void mpu6500SetIntMotionEnabled(bool enabled)
  **/
 bool mpu6500GetIntZeroMotionEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_ZMOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_ZMOT_BIT, buffer);
   return buffer[0];
 }
 /** Set Zero Motion Detection interrupt enabled status.
@@ -1772,7 +1770,7 @@ bool mpu6500GetIntZeroMotionEnabled()
  **/
 void mpu6500SetIntZeroMotionEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_ZMOT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_ZMOT_BIT, enabled);
 }
 /** Get FIFO Buffer Overflow interrupt enabled status.
  * Will be set 0 for disabled, 1 for enabled.
@@ -1782,7 +1780,7 @@ void mpu6500SetIntZeroMotionEnabled(bool enabled)
  **/
 bool mpu6500GetIntFIFOBufferOverflowEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_FIFO_OFLOW_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_FIFO_OFLOW_BIT, buffer);
   return buffer[0];
 }
 /** Set FIFO Buffer Overflow interrupt enabled status.
@@ -1793,7 +1791,7 @@ bool mpu6500GetIntFIFOBufferOverflowEnabled()
  **/
 void mpu6500SetIntFIFOBufferOverflowEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_FIFO_OFLOW_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_FIFO_OFLOW_BIT, enabled);
 }
 /** Get I2C Master interrupt enabled status.
  * This enables any of the I2C Master interrupt sources to generate an
@@ -1804,7 +1802,7 @@ void mpu6500SetIntFIFOBufferOverflowEnabled(bool enabled)
  **/
 bool mpu6500GetIntI2CMasterEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_I2C_MST_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_I2C_MST_INT_BIT, buffer);
   return buffer[0];
 }
 /** Set I2C Master interrupt enabled status.
@@ -1815,7 +1813,7 @@ bool mpu6500GetIntI2CMasterEnabled()
  **/
 void mpu6500SetIntI2CMasterEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_I2C_MST_INT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_I2C_MST_INT_BIT, enabled);
 }
 /** Get Data Ready interrupt enabled setting.
  * This event occurs each time a write operation to all of the sensor registers
@@ -1826,7 +1824,7 @@ void mpu6500SetIntI2CMasterEnabled(bool enabled)
  */
 bool mpu6500GetIntDataReadyEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DATA_RDY_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DATA_RDY_BIT, buffer);
   return buffer[0];
 }
 /** Set Data Ready interrupt enabled status.
@@ -1837,7 +1835,7 @@ bool mpu6500GetIntDataReadyEnabled()
  */
 void mpu6500SetIntDataReadyEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DATA_RDY_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DATA_RDY_BIT, enabled);
 }
 
 // INT_STATUS register
@@ -1851,7 +1849,7 @@ void mpu6500SetIntDataReadyEnabled(bool enabled)
  */
 uint8_t mpu6500GetIntStatus()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_INT_STATUS, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_INT_STATUS, buffer);
   return buffer[0];
 }
 /** Get Free Fall interrupt status.
@@ -1863,7 +1861,7 @@ uint8_t mpu6500GetIntStatus()
  */
 bool mpu6500GetIntFreefallStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_FF_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_FF_BIT, buffer);
   return buffer[0];
 }
 /** Get Motion Detection interrupt status.
@@ -1875,7 +1873,7 @@ bool mpu6500GetIntFreefallStatus()
  */
 bool mpu6500GetIntMotionStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_MOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_MOT_BIT, buffer);
   return buffer[0];
 }
 /** Get Zero Motion Detection interrupt status.
@@ -1887,7 +1885,7 @@ bool mpu6500GetIntMotionStatus()
  */
 bool mpu6500GetIntZeroMotionStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_ZMOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_ZMOT_BIT, buffer);
   return buffer[0];
 }
 /** Get FIFO Buffer Overflow interrupt status.
@@ -1899,7 +1897,7 @@ bool mpu6500GetIntZeroMotionStatus()
  */
 bool mpu6500GetIntFIFOBufferOverflowStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_FIFO_OFLOW_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_FIFO_OFLOW_BIT, buffer);
   return buffer[0];
 }
 /** Get I2C Master interrupt status.
@@ -1912,7 +1910,7 @@ bool mpu6500GetIntFIFOBufferOverflowStatus()
  */
 bool mpu6500GetIntI2CMasterStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_I2C_MST_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_I2C_MST_INT_BIT, buffer);
   return buffer[0];
 }
 /** Get Data Ready interrupt status.
@@ -1924,7 +1922,7 @@ bool mpu6500GetIntI2CMasterStatus()
  */
 bool mpu6500GetIntDataReadyStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_DATA_RDY_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_DATA_RDY_BIT, buffer);
   return buffer[0];
 }
 
@@ -1966,13 +1964,13 @@ void mpu6500GetMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16
  */
 void mpu6500GetMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 14, buffer);
-  // *ax = (((int16_t) buffer[0]) << 8) | buffer[1];
-  // *ay = (((int16_t) buffer[2]) << 8) | buffer[3];
-  // *az = (((int16_t) buffer[4]) << 8) | buffer[5];
-  // *gx = (((int16_t) buffer[8]) << 8) | buffer[9];
-  // *gy = (((int16_t) buffer[10]) << 8) | buffer[11];
-  // *gz = (((int16_t) buffer[12]) << 8) | buffer[13];
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 14, buffer);
+  *ax = (((int16_t) buffer[0]) << 8) | buffer[1];
+  *ay = (((int16_t) buffer[2]) << 8) | buffer[3];
+  *az = (((int16_t) buffer[4]) << 8) | buffer[5];
+  *gx = (((int16_t) buffer[8]) << 8) | buffer[9];
+  *gy = (((int16_t) buffer[10]) << 8) | buffer[11];
+  *gz = (((int16_t) buffer[12]) << 8) | buffer[13];
 }
 /** Get 3-axis accelerometer readings.
  * These registers store the most recent accelerometer measurements.
@@ -2012,10 +2010,10 @@ void mpu6500GetMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16
  */
 void mpu6500GetAcceleration(int16_t* x, int16_t* y, int16_t* z)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 6, buffer);
-  // *x = (((int16_t) buffer[0]) << 8) | buffer[1];
-  // *y = (((int16_t) buffer[2]) << 8) | buffer[3];
-  // *z = (((int16_t) buffer[4]) << 8) | buffer[5];
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 6, buffer);
+  *x = (((int16_t) buffer[0]) << 8) | buffer[1];
+  *y = (((int16_t) buffer[2]) << 8) | buffer[3];
+  *z = (((int16_t) buffer[4]) << 8) | buffer[5];
 }
 /** Get X-axis accelerometer reading.
  * @return X-axis acceleration measurement in 16-bit 2's complement format
@@ -2024,7 +2022,7 @@ void mpu6500GetAcceleration(int16_t* x, int16_t* y, int16_t* z)
  */
 int16_t mpu6500GetAccelerationX()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_XOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Y-axis accelerometer reading.
@@ -2034,7 +2032,7 @@ int16_t mpu6500GetAccelerationX()
  */
 int16_t mpu6500GetAccelerationY()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_YOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_YOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Z-axis accelerometer reading.
@@ -2044,7 +2042,7 @@ int16_t mpu6500GetAccelerationY()
  */
 int16_t mpu6500GetAccelerationZ()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_ZOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_ACCEL_ZOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2056,7 +2054,7 @@ int16_t mpu6500GetAccelerationZ()
  */
 int16_t mpu6500GetTemperature()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_TEMP_OUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_TEMP_OUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2096,10 +2094,10 @@ int16_t mpu6500GetTemperature()
  */
 void mpu6500GetRotation(int16_t* x, int16_t* y, int16_t* z)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 6, buffer);
-  // *x = (((int16_t) buffer[0]) << 8) | buffer[1];
-  // *y = (((int16_t) buffer[2]) << 8) | buffer[3];
-  // *z = (((int16_t) buffer[4]) << 8) | buffer[5];
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 6, buffer);
+  *x = (((int16_t) buffer[0]) << 8) | buffer[1];
+  *y = (((int16_t) buffer[2]) << 8) | buffer[3];
+  *z = (((int16_t) buffer[4]) << 8) | buffer[5];
 }
 /** Get X-axis gyroscope reading.
  * @return X-axis rotation measurement in 16-bit 2's complement format
@@ -2108,7 +2106,7 @@ void mpu6500GetRotation(int16_t* x, int16_t* y, int16_t* z)
  */
 int16_t mpu6500GetRotationX()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_XOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Y-axis gyroscope reading.
@@ -2118,7 +2116,7 @@ int16_t mpu6500GetRotationX()
  */
 int16_t mpu6500GetRotationY()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_YOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_YOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Get Z-axis gyroscope reading.
@@ -2128,7 +2126,7 @@ int16_t mpu6500GetRotationY()
  */
 int16_t mpu6500GetRotationZ()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_ZOUT_H, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_GYRO_ZOUT_H, 2, buffer);
   return (((int16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2210,7 +2208,7 @@ int16_t mpu6500GetRotationZ()
  */
 uint8_t mpu6500GetExternalSensorByte(int position)
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_EXT_SENS_DATA_00 + position, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_EXT_SENS_DATA_00 + position, buffer);
   return buffer[0];
 }
 /** Read word (2 bytes) from external sensor data registers.
@@ -2220,7 +2218,7 @@ uint8_t mpu6500GetExternalSensorByte(int position)
  */
 uint16_t mpu6500GetExternalSensorWord(int position)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_EXT_SENS_DATA_00 + position, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_EXT_SENS_DATA_00 + position, 2, buffer);
   return (((uint16_t) buffer[0]) << 8) | buffer[1];
 }
 /** Read double word (4 bytes) from external sensor data registers.
@@ -2230,7 +2228,7 @@ uint16_t mpu6500GetExternalSensorWord(int position)
  */
 uint32_t mpu6500GetExternalSensorDWord(int position)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_EXT_SENS_DATA_00 + position, 4, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_EXT_SENS_DATA_00 + position, 4, buffer);
   return (((uint32_t) buffer[0]) << 24) | (((uint32_t) buffer[1]) << 16)
       | (((uint16_t) buffer[2]) << 8) | buffer[3];
 }
@@ -2244,7 +2242,7 @@ uint32_t mpu6500GetExternalSensorDWord(int position)
  */
 bool mpu6500GetXNegMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_XNEG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_XNEG_BIT, buffer);
   return buffer[0];
 }
 /** Get X-axis positive motion detection interrupt status.
@@ -2254,7 +2252,7 @@ bool mpu6500GetXNegMotionDetected()
  */
 bool mpu6500GetXPosMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_XPOS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_XPOS_BIT, buffer);
   return buffer[0];
 }
 /** Get Y-axis negative motion detection interrupt status.
@@ -2264,7 +2262,7 @@ bool mpu6500GetXPosMotionDetected()
  */
 bool mpu6500GetYNegMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_YNEG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_YNEG_BIT, buffer);
   return buffer[0];
 }
 /** Get Y-axis positive motion detection interrupt status.
@@ -2274,7 +2272,7 @@ bool mpu6500GetYNegMotionDetected()
  */
 bool mpu6500GetYPosMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_YPOS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_YPOS_BIT, buffer);
   return buffer[0];
 }
 /** Get Z-axis negative motion detection interrupt status.
@@ -2284,7 +2282,7 @@ bool mpu6500GetYPosMotionDetected()
  */
 bool mpu6500GetZNegMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_ZNEG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_ZNEG_BIT, buffer);
   return buffer[0];
 }
 /** Get Z-axis positive motion detection interrupt status.
@@ -2294,7 +2292,7 @@ bool mpu6500GetZNegMotionDetected()
  */
 bool mpu6500GetZPosMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_ZPOS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_ZPOS_BIT, buffer);
   return buffer[0];
 }
 /** Get zero motion detection interrupt status.
@@ -2304,7 +2302,7 @@ bool mpu6500GetZPosMotionDetected()
  */
 bool mpu6500GetZeroMotionDetected()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_ZRMOT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_STATUS, MPU6500_MOTION_MOT_ZRMOT_BIT, buffer);
   return buffer[0];
 }
 
@@ -2320,9 +2318,9 @@ bool mpu6500GetZeroMotionDetected()
  */
 void mpu6500SetSlaveOutputByte(uint8_t num, uint8_t data)
 {
-  // if (num > 3)
-  //   return;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_DO + num, data);
+  if (num > 3)
+    return;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_I2C_SLV0_DO + num, data);
 }
 
 // I2C_MST_DELAY_CTRL register
@@ -2337,8 +2335,8 @@ void mpu6500SetSlaveOutputByte(uint8_t num, uint8_t data)
  */
 bool mpu6500GetExternalShadowDelayEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL, MPU6500_DELAYCTRL_DELAY_ES_SHADOW_BIT,
-  //     buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL, MPU6500_DELAYCTRL_DELAY_ES_SHADOW_BIT,
+      buffer);
   return buffer[0];
 }
 /** Set external data shadow delay enabled status.
@@ -2349,8 +2347,8 @@ bool mpu6500GetExternalShadowDelayEnabled()
  */
 void mpu6500SetExternalShadowDelayEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL,
-  //     MPU6500_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL,
+      MPU6500_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled);
 }
 /** Get slave delay enabled status.
  * When a particular slave delay is enabled, the rate of access for the that
@@ -2373,9 +2371,9 @@ void mpu6500SetExternalShadowDelayEnabled(bool enabled)
 bool mpu6500GetSlaveDelayEnabled(uint8_t num)
 {
   // MPU6500_DELAYCTRL_I2C_SLV4_DLY_EN_BIT is 4, SLV3 is 3, etc.
-  // if (num > 4)
-  //   return 0;
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL, num, buffer);
+  if (num > 4)
+    return 0;
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL, num, buffer);
   return buffer[0];
 }
 /** Set slave delay enabled status.
@@ -2386,7 +2384,7 @@ bool mpu6500GetSlaveDelayEnabled(uint8_t num)
  */
 void mpu6500SetSlaveDelayEnabled(uint8_t num, bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL, num, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_I2C_MST_DELAY_CTRL, num, enabled);
 }
 
 // SIGNAL_PATH_RESET register
@@ -2399,7 +2397,7 @@ void mpu6500SetSlaveDelayEnabled(uint8_t num, bool enabled)
  */
 void mpu6500ResetGyroscopePath()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_SIGNAL_PATH_RESET, MPU6500_PATHRESET_GYRO_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_SIGNAL_PATH_RESET, MPU6500_PATHRESET_GYRO_RESET_BIT, 1);
 }
 /** Reset accelerometer signal path.
  * The reset will revert the signal path analog to digital converters and
@@ -2409,7 +2407,7 @@ void mpu6500ResetGyroscopePath()
  */
 void mpu6500ResetAccelerometerPath()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_SIGNAL_PATH_RESET, MPU6500_PATHRESET_ACCEL_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_SIGNAL_PATH_RESET, MPU6500_PATHRESET_ACCEL_RESET_BIT, 1);
 }
 /** Reset temperature sensor signal path.
  * The reset will revert the signal path analog to digital converters and
@@ -2419,7 +2417,7 @@ void mpu6500ResetAccelerometerPath()
  */
 void mpu6500ResetTemperaturePath()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_SIGNAL_PATH_RESET, MPU6500_PATHRESET_TEMP_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_SIGNAL_PATH_RESET, MPU6500_PATHRESET_TEMP_RESET_BIT, 1);
 }
 
 // MOT_DETECT_CTRL register
@@ -2440,8 +2438,8 @@ void mpu6500ResetTemperaturePath()
  */
 uint8_t mpu6500GetAccelerometerPowerOnDelay()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_ACCEL_ON_DELAY_BIT,
-  //     MPU6500_DETECT_ACCEL_ON_DELAY_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_ACCEL_ON_DELAY_BIT,
+      MPU6500_DETECT_ACCEL_ON_DELAY_LENGTH, buffer);
   return buffer[0];
 }
 /** Set accelerometer power-on delay.
@@ -2452,8 +2450,8 @@ uint8_t mpu6500GetAccelerometerPowerOnDelay()
  */
 void mpu6500SetAccelerometerPowerOnDelay(uint8_t delay)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_ACCEL_ON_DELAY_BIT,
-  //     MPU6500_DETECT_ACCEL_ON_DELAY_LENGTH, delay);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_ACCEL_ON_DELAY_BIT,
+      MPU6500_DETECT_ACCEL_ON_DELAY_LENGTH, delay);
 }
 /** Get Free Fall detection counter decrement configuration.
  * Detection is registered by the Free Fall detection module after accelerometer
@@ -2483,8 +2481,8 @@ void mpu6500SetAccelerometerPowerOnDelay(uint8_t delay)
  */
 uint8_t mpu6500GetFreefallDetectionCounterDecrement()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_FF_COUNT_BIT,
-  //     MPU6500_DETECT_FF_COUNT_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_FF_COUNT_BIT,
+      MPU6500_DETECT_FF_COUNT_LENGTH, buffer);
   return buffer[0];
 }
 /** Set Free Fall detection counter decrement configuration.
@@ -2495,8 +2493,8 @@ uint8_t mpu6500GetFreefallDetectionCounterDecrement()
  */
 void mpu6500SetFreefallDetectionCounterDecrement(uint8_t decrement)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_FF_COUNT_BIT,
-  //     MPU6500_DETECT_FF_COUNT_LENGTH, decrement);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_FF_COUNT_BIT,
+      MPU6500_DETECT_FF_COUNT_LENGTH, decrement);
 }
 /** Get Motion detection counter decrement configuration.
  * Detection is registered by the Motion detection module after accelerometer
@@ -2523,8 +2521,8 @@ void mpu6500SetFreefallDetectionCounterDecrement(uint8_t decrement)
  */
 uint8_t mpu6500GetMotionDetectionCounterDecrement()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_MOT_COUNT_BIT,
-  //     MPU6500_DETECT_MOT_COUNT_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_MOT_COUNT_BIT,
+      MPU6500_DETECT_MOT_COUNT_LENGTH, buffer);
   return buffer[0];
 }
 /** Set Motion detection counter decrement configuration.
@@ -2535,8 +2533,8 @@ uint8_t mpu6500GetMotionDetectionCounterDecrement()
  */
 void mpu6500SetMotionDetectionCounterDecrement(uint8_t decrement)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_MOT_COUNT_BIT,
-  //     MPU6500_DETECT_MOT_COUNT_LENGTH, decrement);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_MOT_DETECT_CTRL, MPU6500_DETECT_MOT_COUNT_BIT,
+      MPU6500_DETECT_MOT_COUNT_LENGTH, decrement);
 }
 
 // USER_CTRL register
@@ -2551,7 +2549,7 @@ void mpu6500SetMotionDetectionCounterDecrement(uint8_t decrement)
  */
 bool mpu6500GetFIFOEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_FIFO_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_FIFO_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set FIFO enabled status.
@@ -2562,7 +2560,7 @@ bool mpu6500GetFIFOEnabled()
  */
 void mpu6500SetFIFOEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_FIFO_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_FIFO_EN_BIT, enabled);
 }
 /** Get I2C Master Mode enabled status.
  * When this mode is enabled, the MPU-60X0 acts as the I2C Master to the
@@ -2577,7 +2575,7 @@ void mpu6500SetFIFOEnabled(bool enabled)
  */
 bool mpu6500GetI2CMasterModeEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_MST_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_MST_EN_BIT, buffer);
   return buffer[0];
 }
 /** Set I2C Master Mode enabled status.
@@ -2588,7 +2586,7 @@ bool mpu6500GetI2CMasterModeEnabled()
  */
 void mpu6500SetI2CMasterModeEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_MST_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_MST_EN_BIT, enabled);
 }
 /** Switch from I2C to SPI mode (MPU-6000 only)
  * If this is set, the primary SPI interface will be enabled in place of the
@@ -2596,7 +2594,7 @@ void mpu6500SetI2CMasterModeEnabled(bool enabled)
  */
 void mpu6500SwitchSPIEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_IF_DIS_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_IF_DIS_BIT, enabled);
 }
 /** Reset the FIFO.
  * This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This
@@ -2606,7 +2604,7 @@ void mpu6500SwitchSPIEnabled(bool enabled)
  */
 void mpu6500ResetFIFO()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_FIFO_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_FIFO_RESET_BIT, 1);
 }
 /** Reset the I2C Master.
  * This bit resets the I2C Master when set to 1 while I2C_MST_EN equals 0.
@@ -2616,7 +2614,7 @@ void mpu6500ResetFIFO()
  */
 void mpu6500ResetI2CMaster()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_MST_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_I2C_MST_RESET_BIT, 1);
 }
 /** Reset all sensor registers and signal paths.
  * When set to 1, this bit resets the signal paths for all sensors (gyroscopes,
@@ -2632,7 +2630,7 @@ void mpu6500ResetI2CMaster()
  */
 void mpu6500ResetSensors()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_SIG_COND_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_SIG_COND_RESET_BIT, 1);
 }
 
 // PWR_MGMT_1 register
@@ -2644,7 +2642,7 @@ void mpu6500ResetSensors()
  */
 void mpu6500Reset()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_DEVICE_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_DEVICE_RESET_BIT, 1);
 }
 /** Get sleep mode status.
  * Setting the SLEEP bit in the register puts the device into very low power
@@ -2659,7 +2657,7 @@ void mpu6500Reset()
  */
 bool mpu6500GetSleepEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_SLEEP_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_SLEEP_BIT, buffer);
   return buffer[0];
 }
 /** Set sleep mode status.
@@ -2670,7 +2668,7 @@ bool mpu6500GetSleepEnabled()
  */
 void mpu6500SetSleepEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_SLEEP_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_SLEEP_BIT, enabled);
 }
 /** Get wake cycle enabled status.
  * When this bit is set to 1 and SLEEP is disabled, the MPU-60X0 will cycle
@@ -2682,7 +2680,7 @@ void mpu6500SetSleepEnabled(bool enabled)
  */
 bool mpu6500GetWakeCycleEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CYCLE_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CYCLE_BIT, buffer);
   return buffer[0];
 }
 /** Set wake cycle enabled status.
@@ -2693,7 +2691,7 @@ bool mpu6500GetWakeCycleEnabled()
  */
 void mpu6500SetWakeCycleEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CYCLE_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CYCLE_BIT, enabled);
 }
 /** Get temperature sensor enabled status.
  * Control the usage of the internal temperature sensor.
@@ -2708,7 +2706,7 @@ void mpu6500SetWakeCycleEnabled(bool enabled)
  */
 bool mpu6500GetTempSensorEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_TEMP_DIS_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_TEMP_DIS_BIT, buffer);
   return buffer[0] == 0; // 1 is actually disabled here
 }
 /** Set temperature sensor enabled status.
@@ -2724,7 +2722,7 @@ bool mpu6500GetTempSensorEnabled()
 void mpu6500SetTempSensorEnabled(bool enabled)
 {
   // 1 is actually disabled here
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_TEMP_DIS_BIT, !enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_TEMP_DIS_BIT, !enabled);
 }
 /** Get clock source setting.
  * @return Current clock source setting
@@ -2734,8 +2732,8 @@ void mpu6500SetTempSensorEnabled(bool enabled)
  */
 uint8_t mpu6500GetClockSource()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CLKSEL_BIT,
-  //     MPU6500_PWR1_CLKSEL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CLKSEL_BIT,
+      MPU6500_PWR1_CLKSEL_LENGTH, buffer);
   return buffer[0];
 }
 /** Set clock source setting.
@@ -2770,8 +2768,8 @@ uint8_t mpu6500GetClockSource()
  */
 void mpu6500SetClockSource(uint8_t source)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CLKSEL_BIT,
-  //     MPU6500_PWR1_CLKSEL_LENGTH, source);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_1, MPU6500_PWR1_CLKSEL_BIT,
+      MPU6500_PWR1_CLKSEL_LENGTH, source);
 }
 
 // PWR_MGMT_2 register
@@ -2801,8 +2799,8 @@ void mpu6500SetClockSource(uint8_t source)
  */
 uint8_t mpu6500GetWakeFrequency()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_LP_WAKE_CTRL_BIT,
-  //     MPU6500_PWR2_LP_WAKE_CTRL_LENGTH, buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_LP_WAKE_CTRL_BIT,
+      MPU6500_PWR2_LP_WAKE_CTRL_LENGTH, buffer);
   return buffer[0];
 }
 /** Set wake frequency in Accel-Only Low Power Mode.
@@ -2811,8 +2809,8 @@ uint8_t mpu6500GetWakeFrequency()
  */
 void mpu6500SetWakeFrequency(uint8_t frequency)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_LP_WAKE_CTRL_BIT,
-  //     MPU6500_PWR2_LP_WAKE_CTRL_LENGTH, frequency);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_LP_WAKE_CTRL_BIT,
+      MPU6500_PWR2_LP_WAKE_CTRL_LENGTH, frequency);
 }
 
 /** Get X-axis accelerometer standby enabled status.
@@ -2823,7 +2821,7 @@ void mpu6500SetWakeFrequency(uint8_t frequency)
  */
 bool mpu6500GetStandbyXAccelEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XA_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XA_BIT, buffer);
   return buffer[0];
 }
 /** Set X-axis accelerometer standby enabled status.
@@ -2834,7 +2832,7 @@ bool mpu6500GetStandbyXAccelEnabled()
  */
 void mpu6500SetStandbyXAccelEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XA_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XA_BIT, enabled);
 }
 /** Get Y-axis accelerometer standby enabled status.
  * If enabled, the Y-axis will not gather or report data (or use power).
@@ -2844,7 +2842,7 @@ void mpu6500SetStandbyXAccelEnabled(bool enabled)
  */
 bool mpu6500GetStandbyYAccelEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YA_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YA_BIT, buffer);
   return buffer[0];
 }
 /** Set Y-axis accelerometer standby enabled status.
@@ -2855,7 +2853,7 @@ bool mpu6500GetStandbyYAccelEnabled()
  */
 void mpu6500SetStandbyYAccelEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YA_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YA_BIT, enabled);
 }
 /** Get Z-axis accelerometer standby enabled status.
  * If enabled, the Z-axis will not gather or report data (or use power).
@@ -2865,7 +2863,7 @@ void mpu6500SetStandbyYAccelEnabled(bool enabled)
  */
 bool mpu6500GetStandbyZAccelEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZA_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZA_BIT, buffer);
   return buffer[0];
 }
 /** Set Z-axis accelerometer standby enabled status.
@@ -2876,7 +2874,7 @@ bool mpu6500GetStandbyZAccelEnabled()
  */
 void mpu6500SetStandbyZAccelEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZA_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZA_BIT, enabled);
 }
 /** Get X-axis gyroscope standby enabled status.
  * If enabled, the X-axis will not gather or report data (or use power).
@@ -2886,7 +2884,7 @@ void mpu6500SetStandbyZAccelEnabled(bool enabled)
  */
 bool mpu6500GetStandbyXGyroEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XG_BIT, buffer);
   return buffer[0];
 }
 /** Set X-axis gyroscope standby enabled status.
@@ -2897,7 +2895,7 @@ bool mpu6500GetStandbyXGyroEnabled()
  */
 void mpu6500SetStandbyXGyroEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XG_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_XG_BIT, enabled);
 }
 /** Get Y-axis gyroscope standby enabled status.
  * If enabled, the Y-axis will not gather or report data (or use power).
@@ -2907,7 +2905,7 @@ void mpu6500SetStandbyXGyroEnabled(bool enabled)
  */
 bool mpu6500GetStandbyYGyroEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YG_BIT, buffer);
   return buffer[0];
 }
 /** Set Y-axis gyroscope standby enabled status.
@@ -2918,7 +2916,7 @@ bool mpu6500GetStandbyYGyroEnabled()
  */
 void mpu6500SetStandbyYGyroEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YG_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_YG_BIT, enabled);
 }
 /** Get Z-axis gyroscope standby enabled status.
  * If enabled, the Z-axis will not gather or report data (or use power).
@@ -2928,7 +2926,7 @@ void mpu6500SetStandbyYGyroEnabled(bool enabled)
  */
 bool mpu6500GetStandbyZGyroEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZG_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZG_BIT, buffer);
   return buffer[0];
 }
 /** Set Z-axis gyroscope standby enabled status.
@@ -2939,7 +2937,7 @@ bool mpu6500GetStandbyZGyroEnabled()
  */
 void mpu6500SetStandbyZGyroEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZG_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_PWR_MGMT_2, MPU6500_PWR2_STBY_ZG_BIT, enabled);
 }
 
 // FIFO_COUNT* registers
@@ -2953,7 +2951,7 @@ void mpu6500SetStandbyZGyroEnabled(bool enabled)
  */
 uint16_t mpu6500GetFIFOCount()
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_FIFO_COUNTH, 2, buffer);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_FIFO_COUNTH, 2, buffer);
   return (((uint16_t) buffer[0]) << 8) | buffer[1];
 }
 
@@ -2986,12 +2984,12 @@ uint16_t mpu6500GetFIFOCount()
  */
 uint8_t mpu6500GetFIFOByte()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_FIFO_R_W, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_FIFO_R_W, buffer);
   return buffer[0];
 }
 void mpu6500GetFIFOBytes(uint8_t *data, uint8_t length)
 {
-  // i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_FIFO_R_W, length, data);
+  i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_FIFO_R_W, length, data);
 }
 /** Write byte to FIFO buffer.
  * @see getFIFOByte()
@@ -2999,7 +2997,7 @@ void mpu6500GetFIFOBytes(uint8_t *data, uint8_t length)
  */
 void mpu6500SetFIFOByte(uint8_t data)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_FIFO_R_W, data);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_FIFO_R_W, data);
 }
 
 // WHO_AM_I register
@@ -3013,8 +3011,8 @@ void mpu6500SetFIFOByte(uint8_t data)
  */
 uint8_t mpu6500GetDeviceID()
 {
-  // i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_WHO_AM_I, MPU6500_WHO_AM_I_BIT, MPU6500_WHO_AM_I_LENGTH,
-  //     buffer);
+  i2cdevReadBits(I2Cx, devAddr, MPU6500_RA_WHO_AM_I, MPU6500_WHO_AM_I_BIT, MPU6500_WHO_AM_I_LENGTH,
+      buffer);
   return buffer[0];
 }
 /** Set Device ID.
@@ -3028,8 +3026,8 @@ uint8_t mpu6500GetDeviceID()
  */
 void mpu6500SetDeviceID(uint8_t id)
 {
-  // i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_WHO_AM_I, MPU6500_WHO_AM_I_BIT, MPU6500_WHO_AM_I_LENGTH,
-      // id);
+  i2cdevWriteBits(I2Cx, devAddr, MPU6500_RA_WHO_AM_I, MPU6500_WHO_AM_I_BIT, MPU6500_WHO_AM_I_LENGTH,
+      id);
 }
 
 // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
@@ -3040,53 +3038,53 @@ void mpu6500SetDeviceID(uint8_t id)
 
 bool mpu6500GetIntPLLReadyEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_PLL_RDY_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_PLL_RDY_INT_BIT, buffer);
   return buffer[0];
 }
 void mpu6500SetIntPLLReadyEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_PLL_RDY_INT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_PLL_RDY_INT_BIT, enabled);
 }
 bool mpu6500GetIntDMPEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DMP_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DMP_INT_BIT, buffer);
   return buffer[0];
 }
 void mpu6500SetIntDMPEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DMP_INT_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, MPU6500_INTERRUPT_DMP_INT_BIT, enabled);
 }
 
 // DMP_INT_STATUS
 
 bool mpu6500GetDMPInt5Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_5_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_5_BIT, buffer);
   return buffer[0];
 }
 bool mpu6500GetDMPInt4Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_4_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_4_BIT, buffer);
   return buffer[0];
 }
 bool mpu6500GetDMPInt3Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_3_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_3_BIT, buffer);
   return buffer[0];
 }
 bool mpu6500GetDMPInt2Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_2_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_2_BIT, buffer);
   return buffer[0];
 }
 bool mpu6500GetDMPInt1Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_1_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_1_BIT, buffer);
   return buffer[0];
 }
 bool mpu6500GetDMPInt0Status()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_0_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_DMP_INT_STATUS, MPU6500_DMPINT_0_BIT, buffer);
   return buffer[0];
 }
 
@@ -3094,12 +3092,12 @@ bool mpu6500GetDMPInt0Status()
 
 bool mpu6500GetIntPLLReadyStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_PLL_RDY_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_PLL_RDY_INT_BIT, buffer);
   return buffer[0];
 }
 bool mpu6500GetIntDMPStatus()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_DMP_INT_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_INT_STATUS, MPU6500_INTERRUPT_DMP_INT_BIT, buffer);
   return buffer[0];
 }
 
@@ -3107,47 +3105,47 @@ bool mpu6500GetIntDMPStatus()
 
 bool mpu6500GetDMPEnabled()
 {
-  // i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_DMP_EN_BIT, buffer);
+  i2cdevReadBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_DMP_EN_BIT, buffer);
   return buffer[0];
 }
 void mpu6500SetDMPEnabled(bool enabled)
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_DMP_EN_BIT, enabled);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_DMP_EN_BIT, enabled);
 }
 void mpu6500ResetDMP()
 {
-  // i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_DMP_RESET_BIT, 1);
+  i2cdevWriteBit(I2Cx, devAddr, MPU6500_RA_USER_CTRL, MPU6500_USERCTRL_DMP_RESET_BIT, 1);
 }
 
 // BANK_SEL register
 
 void mpu6500SetMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank)
 {
-  // bank &= 0x1F;
-  // if (userBank)
-  //   bank |= 0x20;
-  // if (prefetchEnabled)
-  //   bank |= 0x40;
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_BANK_SEL, bank);
+  bank &= 0x1F;
+  if (userBank)
+    bank |= 0x20;
+  if (prefetchEnabled)
+    bank |= 0x40;
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_BANK_SEL, bank);
 }
 
 // MEM_START_ADDR register
 
 void mpu6500SetMemoryStartAddress(uint8_t address)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_MEM_START_ADDR, address);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_MEM_START_ADDR, address);
 }
 
 // MEM_R_W register
 
 uint8_t mpu6500ReadMemoryByte()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_MEM_R_W, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_MEM_R_W, buffer);
   return buffer[0];
 }
 void mpu6500WriteMemoryByte(uint8_t data)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_MEM_R_W, data);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_MEM_R_W, data);
 }
 void mpu6500ReadMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address)
 {
@@ -3156,37 +3154,37 @@ void mpu6500ReadMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint
   uint8_t chunkSize;
   uint16_t i;
 
-  // for (i = 0; i < dataSize;)
-  // {
-  //   // determine correct chunk size according to bank position and data size
-  //   chunkSize = MPU6500_DMP_MEMORY_CHUNK_SIZE;
+  for (i = 0; i < dataSize;)
+  {
+    // determine correct chunk size according to bank position and data size
+    chunkSize = MPU6500_DMP_MEMORY_CHUNK_SIZE;
 
-  //   // make sure we don't go past the data size
-  //   if (i + chunkSize > dataSize)
-  //     chunkSize = dataSize - i;
+    // make sure we don't go past the data size
+    if (i + chunkSize > dataSize)
+      chunkSize = dataSize - i;
 
-  //   // make sure this chunk doesn't go past the bank boundary (256 bytes)
-  //   if (chunkSize > 256 - address)
-  //     chunkSize = 256 - address;
+    // make sure this chunk doesn't go past the bank boundary (256 bytes)
+    if (chunkSize > 256 - address)
+      chunkSize = 256 - address;
 
-  //   // read the chunk of data as specified
-  //   i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_MEM_R_W, chunkSize, data + i);
+    // read the chunk of data as specified
+    i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_MEM_R_W, chunkSize, data + i);
 
-  //   // increase byte index by [chunkSize]
-  //   i += chunkSize;
+    // increase byte index by [chunkSize]
+    i += chunkSize;
 
-  //   // uint8_t automatically wraps to 0 at 256
-  //   address += chunkSize;
+    // uint8_t automatically wraps to 0 at 256
+    address += chunkSize;
 
-  //   // if we aren't done, update bank (if necessary) and address
-  //   if (i < dataSize)
-  //   {
-  //     if (address == 0)
-  //       bank++;
-  //     mpu6500SetMemoryBank(bank, true, true);
-  //     mpu6500SetMemoryStartAddress(address);
-  //   }
-  // }
+    // if we aren't done, update bank (if necessary) and address
+    if (i < dataSize)
+    {
+      if (address == 0)
+        bank++;
+      mpu6500SetMemoryBank(bank, true, true);
+      mpu6500SetMemoryStartAddress(address);
+    }
+  }
 }
 bool mpu6500WriteMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address,
     bool verify)
@@ -3196,76 +3194,76 @@ bool mpu6500WriteMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t ban
   uint8_t *progBuffer;
   uint16_t i;
 
-  // mpu6500SetMemoryBank(bank, true, true);
-  // mpu6500SetMemoryStartAddress(address);
-
-  // for (i = 0; i < dataSize;)
-  // {
-  //   // determine correct chunk size according to bank position and data size
-  //   chunkSize = MPU6500_DMP_MEMORY_CHUNK_SIZE;
-
-  //   // make sure we don't go past the data size
-  //   if (i + chunkSize > dataSize)
-  //     chunkSize = dataSize - i;
-
-  //   // make sure this chunk doesn't go past the bank boundary (256 bytes)
-  //   if (chunkSize > 256 - address)
-  //     chunkSize = 256 - address;
-
-  //   // write the chunk of data as specified
-  //   progBuffer = (uint8_t *) data + i;
-
-  //   i2cdevWriteReg8(I2Cx, devAddr, MPU6500_RA_MEM_R_W, chunkSize, progBuffer);
-
-  //   // verify data if needed
-  //   if (verify)
-  //   {
-  //     uint32_t j;
-  //     mpu6500SetMemoryBank(bank, true, true);
-  //     mpu6500SetMemoryStartAddress(address);
-  //     i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_MEM_R_W, chunkSize, verifyBuffer);
-
-  //     for (j = 0; j < chunkSize; j++)
-  //     {
-  //       if (progBuffer[j] != verifyBuffer[j])
-  //       {
-  //         /*Serial.print("Block write verification error, bank ");
-  //          Serial.print(bank, DEC);
-  //          Serial.print(", address ");
-  //          Serial.print(address, DEC);
-  //          Serial.print("!\nExpected:");
-  //          for (j = 0; j < chunkSize; j++) {
-  //          Serial.print(" 0x");
-  //          if (progBuffer[j] < 16) Serial.print("0");
-  //          Serial.print(progBuffer[j], HEX);
-  //          }
-  //          Serial.print("\nReceived:");
-  //          for (uint8_t j = 0; j < chunkSize; j++) {
-  //          Serial.print(" 0x");
-  //          if (verifyBuffer[i + j] < 16) Serial.print("0");
-  //          Serial.print(verifyBuffer[i + j], HEX);
-  //          }
-  //          Serial.print("\n");*/
-  //         return false;
-  //       }
-  //     }
-  //   }
-
-  //   // increase byte index by [chunkSize]
-  //   i += chunkSize;
-
-  //   // uint8_t automatically wraps to 0 at 256
-  //   address += chunkSize;
-
-  //   // if we aren't done, update bank (if necessary) and address
-  //   if (i < dataSize)
-  //   {
-  //     if (address == 0)
-  //       bank++;
-  //     mpu6500SetMemoryBank(bank, true, true);
-  //     mpu6500SetMemoryStartAddress(address);
-  //   }
-  // }
+  mpu6500SetMemoryBank(bank, true, true);
+  mpu6500SetMemoryStartAddress(address);
+
+  for (i = 0; i < dataSize;)
+  {
+    // determine correct chunk size according to bank position and data size
+    chunkSize = MPU6500_DMP_MEMORY_CHUNK_SIZE;
+
+    // make sure we don't go past the data size
+    if (i + chunkSize > dataSize)
+      chunkSize = dataSize - i;
+
+    // make sure this chunk doesn't go past the bank boundary (256 bytes)
+    if (chunkSize > 256 - address)
+      chunkSize = 256 - address;
+
+    // write the chunk of data as specified
+    progBuffer = (uint8_t *) data + i;
+
+    i2cdevWriteReg8(I2Cx, devAddr, MPU6500_RA_MEM_R_W, chunkSize, progBuffer);
+
+    // verify data if needed
+    if (verify)
+    {
+      uint32_t j;
+      mpu6500SetMemoryBank(bank, true, true);
+      mpu6500SetMemoryStartAddress(address);
+      i2cdevReadReg8(I2Cx, devAddr, MPU6500_RA_MEM_R_W, chunkSize, verifyBuffer);
+
+      for (j = 0; j < chunkSize; j++)
+      {
+        if (progBuffer[j] != verifyBuffer[j])
+        {
+          /*Serial.print("Block write verification error, bank ");
+           Serial.print(bank, DEC);
+           Serial.print(", address ");
+           Serial.print(address, DEC);
+           Serial.print("!\nExpected:");
+           for (j = 0; j < chunkSize; j++) {
+           Serial.print(" 0x");
+           if (progBuffer[j] < 16) Serial.print("0");
+           Serial.print(progBuffer[j], HEX);
+           }
+           Serial.print("\nReceived:");
+           for (uint8_t j = 0; j < chunkSize; j++) {
+           Serial.print(" 0x");
+           if (verifyBuffer[i + j] < 16) Serial.print("0");
+           Serial.print(verifyBuffer[i + j], HEX);
+           }
+           Serial.print("\n");*/
+          return false;
+        }
+      }
+    }
+
+    // increase byte index by [chunkSize]
+    i += chunkSize;
+
+    // uint8_t automatically wraps to 0 at 256
+    address += chunkSize;
+
+    // if we aren't done, update bank (if necessary) and address
+    if (i < dataSize)
+    {
+      if (address == 0)
+        bank++;
+      mpu6500SetMemoryBank(bank, true, true);
+      mpu6500SetMemoryStartAddress(address);
+    }
+  }
   return true;
 }
 bool mpu6500WriteProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank,
@@ -3276,66 +3274,66 @@ bool mpu6500WriteProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t
 #define MPU6500_DMP_CONFIG_BLOCK_SIZE 6
 bool mpu6500WriteDMPConfigurationSet(const uint8_t *data, uint16_t dataSize)
 {
-  // uint8_t *progBuffer, success, special;
-  // uint16_t i;
-
-  // // config set data is a long string of blocks with the following structure:
-  // // [bank] [offset] [length] [byte[0], byte[1], ..., byte[length]]
-  // uint8_t bank=0;
-  // uint8_t offset=0;
-  // uint8_t length=0;
-  // for (i = 0; i < dataSize;)
-  // {
-  //   bank = data[i++];
-  //   offset = data[i++];
-  //   length = data[i++];
-  // }
-
-  // // write data or perform special action
-  // if (length > 0)
-  // {
-  //   // regular block of data to write
-  //   /*Serial.print("Writing config block to bank ");
-  //    Serial.print(bank);
-  //    Serial.print(", offset ");
-  //    Serial.print(offset);
-  //    Serial.print(", length=");
-  //    Serial.println(length);*/
-  //   progBuffer = (uint8_t *) data + i;
-  //   success = mpu6500WriteMemoryBlock(progBuffer, length, bank, offset, true);
-  //   i += length;
-  // }
-  // else
-  // {
-  //   // special instruction
-  //   // NOTE: this kind of behavior (what and when to do certain things)
-  //   // is totally undocumented. This code is in here based on observed
-  //   // behavior only, and exactly why (or even whether) it has to be here
-  //   // is anybody's guess for now.
-  //   special = data[i++];
-  //   /*Serial.print("Special command code ");
-  //    Serial.print(special, HEX);
-  //    Serial.println(" found...");*/
-  //   if (special == 0x01)
-  //   {
-  //     // enable DMP-related interrupts
-  //     mpu6500SetIntZeroMotionEnabled(true);
-  //     mpu6500SetIntFIFOBufferOverflowEnabled(true);
-  //     mpu6500SetIntDMPEnabled(true);
-  //     //i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, 0x32);
-  //     success = true;
-  //   }
-  //   else
-  //   {
-  //     // unknown special command
-  //     success = false;
-  //   }
-  // }
-
-  // if (!success)
-  // {
-  //   return false; // uh oh
-  // }
+  uint8_t *progBuffer, success, special;
+  uint16_t i;
+
+  // config set data is a long string of blocks with the following structure:
+  // [bank] [offset] [length] [byte[0], byte[1], ..., byte[length]]
+  uint8_t bank=0;
+  uint8_t offset=0;
+  uint8_t length=0;
+  for (i = 0; i < dataSize;)
+  {
+    bank = data[i++];
+    offset = data[i++];
+    length = data[i++];
+  }
+
+  // write data or perform special action
+  if (length > 0)
+  {
+    // regular block of data to write
+    /*Serial.print("Writing config block to bank ");
+     Serial.print(bank);
+     Serial.print(", offset ");
+     Serial.print(offset);
+     Serial.print(", length=");
+     Serial.println(length);*/
+    progBuffer = (uint8_t *) data + i;
+    success = mpu6500WriteMemoryBlock(progBuffer, length, bank, offset, true);
+    i += length;
+  }
+  else
+  {
+    // special instruction
+    // NOTE: this kind of behavior (what and when to do certain things)
+    // is totally undocumented. This code is in here based on observed
+    // behavior only, and exactly why (or even whether) it has to be here
+    // is anybody's guess for now.
+    special = data[i++];
+    /*Serial.print("Special command code ");
+     Serial.print(special, HEX);
+     Serial.println(" found...");*/
+    if (special == 0x01)
+    {
+      // enable DMP-related interrupts
+      mpu6500SetIntZeroMotionEnabled(true);
+      mpu6500SetIntFIFOBufferOverflowEnabled(true);
+      mpu6500SetIntDMPEnabled(true);
+      //i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_INT_ENABLE, 0x32);
+      success = true;
+    }
+    else
+    {
+      // unknown special command
+      success = false;
+    }
+  }
+
+  if (!success)
+  {
+    return false; // uh oh
+  }
   return true;
 }
 
@@ -3348,22 +3346,22 @@ bool mpu6500WriteProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize)
 
 uint8_t mpu6500GetDMPConfig1()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_1, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_1, buffer);
   return buffer[0];
 }
 void mpu6500SetDMPConfig1(uint8_t config)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_1, config);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_1, config);
 }
 
 // DMP_CFG_2 register
 
 uint8_t mpu6500GetDMPConfig2()
 {
-  // i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_2, buffer);
+  i2cdevReadByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_2, buffer);
   return buffer[0];
 }
 void mpu6500SetDMPConfig2(uint8_t config)
 {
-  // i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_2, config);
+  i2cdevWriteByte(I2Cx, devAddr, MPU6500_RA_DMP_CFG_2, config);
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ms5611.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ms5611.c
index 129c1b056..33dabcffe 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ms5611.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ms5611.c
@@ -70,109 +70,106 @@ static int32_t tempDeltaT;
 
 bool ms5611Init(I2C_Dev *i2cPort)
 {
-  // if (isInit)
-  //   return true;
+  if (isInit)
+    return true;
 
-  // I2Cx = i2cPort;
-  // devAddr = MS5611_ADDR_CSB_LOW;
+  I2Cx = i2cPort;
+  devAddr = MS5611_ADDR_CSB_LOW;
 
-  // ms5611Reset(); // reset the device to populate its internal PROM registers
-  // vTaskDelay(M2T(5));
-  // if (ms5611ReadPROM() == false) // reads the PROM into object variables for later use
-  // {
-  //   return false;
-  // }
+  ms5611Reset(); // reset the device to populate its internal PROM registers
+  vTaskDelay(M2T(5));
+  if (ms5611ReadPROM() == false) // reads the PROM into object variables for later use
+  {
+    return false;
+  }
 
-  // isInit = true;
+  isInit = true;
 
   return true;
 }
 
 bool ms5611SelfTest(void)
 {
-  // bool testStatus = true;
-  // int32_t rawPress;
-  // int32_t rawTemp;
-  // int32_t deltaT;
-  // float pressure;
-  // float temperature;
-
-  // if (!isInit)
-  //   return false;
-
-  // ms5611StartConversion(MS5611_D1 + MS5611_OSR_4096);
-  // vTaskDelay(M2T(CONVERSION_TIME_MS));
-  // rawPress = ms5611GetConversion(MS5611_D1 + MS5611_OSR_4096);
-
-  // ms5611StartConversion(MS5611_D2 + MS5611_OSR_4096);
-  // vTaskDelay(M2T(CONVERSION_TIME_MS));
-  // rawTemp = ms5611GetConversion(MS5611_D2 + MS5611_OSR_4096);
-
-  // deltaT = ms5611CalcDeltaTemp(rawTemp);
-  // temperature = ms5611CalcTemp(deltaT);
-  // pressure = ms5611CalcPressure(rawPress, deltaT);
-
-  // if (ms5611EvaluateSelfTest(MS5611_ST_PRESS_MIN, MS5611_ST_PRESS_MAX, pressure, "pressure") &&
-  //     ms5611EvaluateSelfTest(MS5611_ST_TEMP_MIN, MS5611_ST_TEMP_MAX, temperature, "temperature"))
-  // {
-  //   DEBUG_PRINT("Self test [OK].\n");
-  // }
-  // else
-  // {
-  //  testStatus = false;
-  // }
-
-  // return testStatus;
-  return true;
+  bool testStatus = true;
+  int32_t rawPress;
+  int32_t rawTemp;
+  int32_t deltaT;
+  float pressure;
+  float temperature;
+
+  if (!isInit)
+    return false;
+
+  ms5611StartConversion(MS5611_D1 + MS5611_OSR_4096);
+  vTaskDelay(M2T(CONVERSION_TIME_MS));
+  rawPress = ms5611GetConversion(MS5611_D1 + MS5611_OSR_4096);
+
+  ms5611StartConversion(MS5611_D2 + MS5611_OSR_4096);
+  vTaskDelay(M2T(CONVERSION_TIME_MS));
+  rawTemp = ms5611GetConversion(MS5611_D2 + MS5611_OSR_4096);
+
+  deltaT = ms5611CalcDeltaTemp(rawTemp);
+  temperature = ms5611CalcTemp(deltaT);
+  pressure = ms5611CalcPressure(rawPress, deltaT);
+
+  if (ms5611EvaluateSelfTest(MS5611_ST_PRESS_MIN, MS5611_ST_PRESS_MAX, pressure, "pressure") &&
+      ms5611EvaluateSelfTest(MS5611_ST_TEMP_MIN, MS5611_ST_TEMP_MAX, temperature, "temperature"))
+  {
+    DEBUG_PRINT("Self test [OK].\n");
+  }
+  else
+  {
+   testStatus = false;
+  }
+
+  return testStatus;
 }
 
 bool ms5611EvaluateSelfTest(float min, float max, float value, char* string)
 {
-  // if (value < min || value > max)
-  // {
-  //   DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
-  //               string, (double)min, (double)max, (double)value);
-  //   return false;
-  // }
+  if (value < min || value > max)
+  {
+    DEBUG_PRINT("Self test %s [FAIL]. low: %0.2f, high: %0.2f, measured: %0.2f\n",
+                string, (double)min, (double)max, (double)value);
+    return false;
+  }
   return true;
 }
 
 float ms5611GetPressure(uint8_t osr)
 {
-  // // see datasheet page 7 for formulas
-  // int32_t rawPress = ms5611RawPressure(osr);
-  // int64_t dT = (int64_t)ms5611GetDeltaTemp(osr);
-  // if (dT == 0)
-  // {
-  //   return 0;
-  // }
-  // int64_t off = (((int64_t)calReg.off) << 16) + ((calReg.tco * dT) >> 7);
-  // int64_t sens = (((int64_t)calReg.psens) << 15) + ((calReg.tcs * dT) >> 8);
-  // if (rawPress != 0)
-  // {
-  //   return ((((rawPress * sens) >> 21) - off) >> (15 - EXTRA_PRECISION))
-  //       / ((1 << EXTRA_PRECISION) * 100.0);
-  // }
-  // else
-  // {
-  //   return 0;
-  // }
-
-  return 1.0;
+  // see datasheet page 7 for formulas
+  int32_t rawPress = ms5611RawPressure(osr);
+  int64_t dT = (int64_t)ms5611GetDeltaTemp(osr);
+  if (dT == 0)
+  {
+    return 0;
+  }
+  int64_t off = (((int64_t)calReg.off) << 16) + ((calReg.tco * dT) >> 7);
+  int64_t sens = (((int64_t)calReg.psens) << 15) + ((calReg.tcs * dT) >> 8);
+  if (rawPress != 0)
+  {
+    return ((((rawPress * sens) >> 21) - off) >> (15 - EXTRA_PRECISION))
+        / ((1 << EXTRA_PRECISION) * 100.0);
+  }
+  else
+  {
+    return 0;
+  }
 }
 
 float ms5611CalcPressure(int32_t rawPress, int32_t dT)
 {
-  // int64_t off;
-  // int64_t sens;
+  int64_t off;
+  int64_t sens;
 
-  // if (rawPress == 0 || dT == 0)
-  // {
-  //   return 0;
-  // }
+  if (rawPress == 0 || dT == 0)
+  {
+    return 0;
+  }
 
-  // off = (((int64_t)calReg.off) << 16) + ((calReg.tco * (int64_t)dT) >> 7);
-  // sens = (((int64_t)calReg.psens) << 15) + ((calReg.tcs * (int64_t)dT) >> 8);
+  off = (((int64_t)calReg.off) << 16) + ((calReg.tco * (int64_t)dT) >> 7);
+  sens = (((int64_t)calReg.psens) << 15) + ((calReg.tcs * (int64_t)dT) >> 8);
 
   return ((((rawPress * sens) >> 21) - off) >> (15 - EXTRA_PRECISION))
           / ((1 << EXTRA_PRECISION) * 100.0);
@@ -180,10 +177,10 @@ float ms5611CalcPressure(int32_t rawPress, int32_t dT)
 
 float ms5611GetTemperature(uint8_t osr)
 {
-  // // see datasheet page 7 for formulas
-  // int32_t dT;
+  // see datasheet page 7 for formulas
+  int32_t dT;
 
-  // dT = ms5611GetDeltaTemp(osr);
+  dT = ms5611GetDeltaTemp(osr);
   if (dT != 0)
   {
     return ms5611CalcTemp(dT);
@@ -196,7 +193,7 @@ float ms5611GetTemperature(uint8_t osr)
 
 int32_t ms5611GetDeltaTemp(uint8_t osr)
 {
-  // int32_t rawTemp = ms5611RawTemperature(osr);
+  int32_t rawTemp = ms5611RawTemperature(osr);
   if (rawTemp != 0)
   {
     return ms5611CalcDeltaTemp(rawTemp);
@@ -209,92 +206,87 @@ int32_t ms5611GetDeltaTemp(uint8_t osr)
 
 float ms5611CalcTemp(int32_t deltaT)
 {
-  // if (deltaT == 0)
-  // {
-  //   return 0;
-  // }
-  // else
-  // {
-  //   return (float)(((1 << EXTRA_PRECISION) * 2000)
-  //           + (((int64_t)deltaT * calReg.tsens) >> (23 - EXTRA_PRECISION)))
-  //           / ((1 << EXTRA_PRECISION)* 100.0f);
-  // }
-  return 1.0;
+  if (deltaT == 0)
+  {
+    return 0;
+  }
+  else
+  {
+    return (float)(((1 << EXTRA_PRECISION) * 2000)
+            + (((int64_t)deltaT * calReg.tsens) >> (23 - EXTRA_PRECISION)))
+            / ((1 << EXTRA_PRECISION)* 100.0f);
+  }
 }
 
 int32_t ms5611CalcDeltaTemp(int32_t rawTemp)
 {
-  // if (rawTemp == 0)
-  // {
-  //   return 0;
-  // }
-  // else
-  // {
-  //   return rawTemp - (((int32_t)calReg.tref) << 8);
-  // }
-  return 1.0;
+  if (rawTemp == 0)
+  {
+    return 0;
+  }
+  else
+  {
+    return rawTemp - (((int32_t)calReg.tref) << 8);
+  }
 }
 
 int32_t ms5611RawPressure(uint8_t osr)
 {
-  // uint32_t now = xTaskGetTickCount();
-  // if (lastPresConv != 0 && (now - lastPresConv) >= CONVERSION_TIME_MS)
-  // {
-  //   lastPresConv = 0;
-  //   return ms5611GetConversion(MS5611_D1 + osr);
-  // }
-  // else
-  // {
-  //   if (lastPresConv == 0 && lastTempConv == 0)
-  //   {
-  //     ms5611StartConversion(MS5611_D1 + osr);
-  //     lastPresConv = now;
-  //   }
-  //   return 0;
-  // }
-  return 1.0;
+  uint32_t now = xTaskGetTickCount();
+  if (lastPresConv != 0 && (now - lastPresConv) >= CONVERSION_TIME_MS)
+  {
+    lastPresConv = 0;
+    return ms5611GetConversion(MS5611_D1 + osr);
+  }
+  else
+  {
+    if (lastPresConv == 0 && lastTempConv == 0)
+    {
+      ms5611StartConversion(MS5611_D1 + osr);
+      lastPresConv = now;
+    }
+    return 0;
+  }
 }
 
 int32_t ms5611RawTemperature(uint8_t osr)
 {
-  // uint32_t now = xTaskGetTickCount();
-  // if (lastTempConv != 0 && (now - lastTempConv) >= CONVERSION_TIME_MS)
-  // {
-  //   lastTempConv = 0;
-  //   tempCache = ms5611GetConversion(MS5611_D2 + osr);
-  //   return tempCache;
-  // }
-  // else
-  // {
-  //   if (lastTempConv == 0 && lastPresConv == 0)
-  //   {
-  //     ms5611StartConversion(MS5611_D2 + osr);
-  //     lastTempConv = now;
-  //   }
-  //   return tempCache;
-  // }
-  return 1;
-
+  uint32_t now = xTaskGetTickCount();
+  if (lastTempConv != 0 && (now - lastTempConv) >= CONVERSION_TIME_MS)
+  {
+    lastTempConv = 0;
+    tempCache = ms5611GetConversion(MS5611_D2 + osr);
+    return tempCache;
+  }
+  else
+  {
+    if (lastTempConv == 0 && lastPresConv == 0)
+    {
+      ms5611StartConversion(MS5611_D2 + osr);
+      lastTempConv = now;
+    }
+    return tempCache;
+  }
 }
 
 // see page 11 of the datasheet
 void ms5611StartConversion(uint8_t command)
 {
   // initialize pressure conversion
-  // i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR, command);
+  i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR, command);
 }
 
 int32_t ms5611GetConversion(uint8_t command)
 {
-  // int32_t conversion = 0;
-  // uint8_t buffer[MS5611_D1D2_SIZE];
+  int32_t conversion = 0;
+  uint8_t buffer[MS5611_D1D2_SIZE];
 
-  // // start read sequence
-  // i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR, 0);
-  // // Read conversion
-  // i2cdevRead(I2Cx, devAddr, MS5611_D1D2_SIZE, buffer);
-  // conversion = ((int32_t)buffer[0] << 16) |
-  //              ((int32_t)buffer[1] << 8) | buffer[2];
+  // start read sequence
+  i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR, 0);
+  // Read conversion
+  i2cdevRead(I2Cx, devAddr, MS5611_D1D2_SIZE, buffer);
+  conversion = ((int32_t)buffer[0] << 16) |
+               ((int32_t)buffer[1] << 8) | buffer[2];
 
   return conversion;
 }
@@ -304,23 +296,23 @@ int32_t ms5611GetConversion(uint8_t command)
  */
 bool ms5611ReadPROM()
 {
-  // uint8_t buffer[MS5611_PROM_REG_SIZE];
-  // uint16_t* pCalRegU16 = (uint16_t*)&calReg;
-  // int32_t i = 0;
-  // bool status = false;
-
-  // for (i = 0; i < MS5611_PROM_REG_COUNT; i++)
-  // {
-  //   // start read sequence
-  //   status = i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR,
-  //                            MS5611_PROM_BASE_ADDR + (i * MS5611_PROM_REG_SIZE));
-  //   // Read conversion
-  //   if (status)
-  //   {
-  //     status = i2cdevRead(I2Cx, devAddr, MS5611_PROM_REG_SIZE, buffer);
-  //     pCalRegU16[i] = ((uint16_t)buffer[0] << 8) | buffer[1];
-  //   }
-  // }
+  uint8_t buffer[MS5611_PROM_REG_SIZE];
+  uint16_t* pCalRegU16 = (uint16_t*)&calReg;
+  int32_t i = 0;
+  bool status = false;
+
+  for (i = 0; i < MS5611_PROM_REG_COUNT; i++)
+  {
+    // start read sequence
+    status = i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR,
+                             MS5611_PROM_BASE_ADDR + (i * MS5611_PROM_REG_SIZE));
+    // Read conversion
+    if (status)
+    {
+      status = i2cdevRead(I2Cx, devAddr, MS5611_PROM_REG_SIZE, buffer);
+      pCalRegU16[i] = ((uint16_t)buffer[0] << 8) | buffer[1];
+    }
+  }
 
   return status;
 }
@@ -331,7 +323,7 @@ bool ms5611ReadPROM()
  */
 void ms5611Reset()
 {
-  // i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR, MS5611_RESET);
+  i2cdevWriteByte(I2Cx, devAddr, I2CDEV_NO_MEM_ADDR, MS5611_RESET);
 }
 
 
@@ -344,51 +336,51 @@ void ms5611Reset()
  */
 void ms5611GetData(float* pressure, float* temperature, float* asl)
 {
-    // int32_t tempPressureRaw, tempTemperatureRaw;
-    // static float savedPress, savedTemp;
-
-    // // Dont reader faster than we can
-    // uint32_t now = xTaskGetTickCount();
-    // if ((now - lastConv) < CONVERSION_TIME_MS)
-    // {
-    //   *pressure = savedPress;
-    //   *temperature = savedTemp;
-    //   return;
-    // }
-    // lastConv = now;
-
-    // if (readState == 0)
-    // {
-    //     // read temp
-    //     ++readState;
-    //     tempTemperatureRaw = ms5611GetConversion(MS5611_D2 + MS5611_OSR_DEFAULT);
-    //     tempDeltaT = ms5611CalcDeltaTemp(tempTemperatureRaw);
-    //     *temperature = ms5611CalcTemp(tempDeltaT);
-    //     savedTemp = *temperature;
-    //     *pressure = savedPress;
-    //     // cmd to read pressure
-    //     ms5611StartConversion(MS5611_D1 + MS5611_OSR_DEFAULT);
-    // }
-    // else
-    // {
-    //     // read pressure
-    //     ++readState;
-    //     tempPressureRaw = ms5611GetConversion(MS5611_D1 + MS5611_OSR_DEFAULT);
-    //     *pressure = ms5611CalcPressure(tempPressureRaw, tempDeltaT);
-    //     savedPress = *pressure;
-    //     *asl = ms5611PressureToAltitude(pressure);
-    //     *temperature = savedTemp;
-    //     if (readState == PRESSURE_PER_TEMP){
-    //         // cmd to read temp
-    //         ms5611StartConversion(MS5611_D2 + MS5611_OSR_DEFAULT);
-    //         readState = 0;
-    //     }
-    //     else
-    //     {
-    //         // cmd to read pressure
-    //         ms5611StartConversion(MS5611_D1 + MS5611_OSR_DEFAULT);
-    //     }
-    // }
+    int32_t tempPressureRaw, tempTemperatureRaw;
+    static float savedPress, savedTemp;
+
+    // Dont reader faster than we can
+    uint32_t now = xTaskGetTickCount();
+    if ((now - lastConv) < CONVERSION_TIME_MS)
+    {
+      *pressure = savedPress;
+      *temperature = savedTemp;
+      return;
+    }
+    lastConv = now;
+
+    if (readState == 0)
+    {
+        // read temp
+        ++readState;
+        tempTemperatureRaw = ms5611GetConversion(MS5611_D2 + MS5611_OSR_DEFAULT);
+        tempDeltaT = ms5611CalcDeltaTemp(tempTemperatureRaw);
+        *temperature = ms5611CalcTemp(tempDeltaT);
+        savedTemp = *temperature;
+        *pressure = savedPress;
+        // cmd to read pressure
+        ms5611StartConversion(MS5611_D1 + MS5611_OSR_DEFAULT);
+    }
+    else
+    {
+        // read pressure
+        ++readState;
+        tempPressureRaw = ms5611GetConversion(MS5611_D1 + MS5611_OSR_DEFAULT);
+        *pressure = ms5611CalcPressure(tempPressureRaw, tempDeltaT);
+        savedPress = *pressure;
+        *asl = ms5611PressureToAltitude(pressure);
+        *temperature = savedTemp;
+        if (readState == PRESSURE_PER_TEMP){
+            // cmd to read temp
+            ms5611StartConversion(MS5611_D2 + MS5611_OSR_DEFAULT);
+            readState = 0;
+        }
+        else
+        {
+            // cmd to read pressure
+            ms5611StartConversion(MS5611_D1 + MS5611_OSR_DEFAULT);
+        }
+    }
 }
 
 //TODO: pretty expensive function. Rather smooth the pressure estimates and only call this when needed
@@ -398,15 +390,14 @@ void ms5611GetData(float* pressure, float* temperature, float* asl)
  */
 float ms5611PressureToAltitude(float* pressure/*, float* ground_pressure, float* ground_temp*/)
 {
-    // if (*pressure > 0)
-    // {
-    //     //return (1.f - powf(*pressure / CONST_SEA_PRESSURE, CONST_PF)) * CONST_PF2;
-    //     //return ((powf((1015.7f / *pressure), CONST_PF) - 1.0f) * (25.f + 273.15f)) / 0.0065f;
-    //     return ((powf((1015.7f / *pressure), CONST_PF) - 1.0f) * (FIX_TEMP + 273.15f)) / 0.0065f;
-    // }
-    // else
-    // {
-    //     return 0;
-    // }
-    return 1.0;
+    if (*pressure > 0)
+    {
+        //return (1.f - powf(*pressure / CONST_SEA_PRESSURE, CONST_PF)) * CONST_PF2;
+        //return ((powf((1015.7f / *pressure), CONST_PF) - 1.0f) * (25.f + 273.15f)) / 0.0065f;
+        return ((powf((1015.7f / *pressure), CONST_PF) - 1.0f) * (FIX_TEMP + 273.15f)) / 0.0065f;
+    }
+    else
+    {
+        return 0;
+    }
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nrf24l01.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nrf24l01.c
index eb6cec301..c50d3fa5c 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nrf24l01.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nrf24l01.c
@@ -105,14 +105,14 @@ static void (*interruptCb)(void) = NULL;
  ***********************/
 static char spiSendByte(char byte)
 {
-  // /* Loop while DR register in not emplty */
-  // while (SPI_I2S_GetFlagStatus(RADIO_SPI, SPI_I2S_FLAG_TXE) == RESET);
+  /* Loop while DR register in not emplty */
+  while (SPI_I2S_GetFlagStatus(RADIO_SPI, SPI_I2S_FLAG_TXE) == RESET);
 
-  // /* Send byte through the SPI1 peripheral */
-  // SPI_I2S_SendData(RADIO_SPI, byte);
+  /* Send byte through the SPI1 peripheral */
+  SPI_I2S_SendData(RADIO_SPI, byte);
 
-  // /* Wait to receive a byte */
-  // while (SPI_I2S_GetFlagStatus(RADIO_SPI, SPI_I2S_FLAG_RXNE) == RESET);
+  /* Wait to receive a byte */
+  while (SPI_I2S_GetFlagStatus(RADIO_SPI, SPI_I2S_FLAG_RXNE) == RESET);
 
   /* Return the byte read from the SPI bus */
   return SPI_I2S_ReceiveData(RADIO_SPI);
@@ -130,18 +130,18 @@ static char spiReceiveByte()
 /* Read len bytes from a nRF24L register. 5 Bytes max */
 unsigned char nrfReadReg(unsigned char address, char *buffer, int len)
 {
-  // unsigned char status;
-  // int i;
+  unsigned char status;
+  int i;
 
-  // RADIO_EN_CS();
+  RADIO_EN_CS();
 
-  // /* Send the read command with the address */
-  // status = spiSendByte( CMD_R_REG | (address&0x1F) );
-  // /* Read LEN bytes */
-  // for(i=0; i<len; i++)
-  //   buffer[i]=spiReceiveByte();
+  /* Send the read command with the address */
+  status = spiSendByte( CMD_R_REG | (address&0x1F) );
+  /* Read LEN bytes */
+  for(i=0; i<len; i++)
+    buffer[i]=spiReceiveByte();
 
-  // RADIO_DIS_CS();
+  RADIO_DIS_CS();
 
   return status;
 }
@@ -149,18 +149,18 @@ unsigned char nrfReadReg(unsigned char address, char *buffer, int len)
 /* Write len bytes a nRF24L register. 5 Bytes max */
 unsigned char nrfWriteReg(unsigned char address, char *buffer, int len)
 {
-  // unsigned char status;
-  // int i;
+  unsigned char status;
+  int i;
 
-  // RADIO_EN_CS();
+  RADIO_EN_CS();
 
-  // /* Send the write command with the address */
-  // status = spiSendByte( CMD_W_REG | (address&0x1F) );
-  // /* Write LEN bytes */
-  // for(i=0; i<len; i++)
-  //   spiSendByte(buffer[i]);
+  /* Send the write command with the address */
+  status = spiSendByte( CMD_W_REG | (address&0x1F) );
+  /* Write LEN bytes */
+  for(i=0; i<len; i++)
+    spiSendByte(buffer[i]);
 
-  // RADIO_DIS_CS();
+  RADIO_DIS_CS();
 
   return status;
 }
@@ -173,9 +173,9 @@ unsigned char nrfWrite1Reg(unsigned char address, char byte)
 
 /* Read only one byte (useful for most of the reg.) */
 unsigned char nrfRead1Reg(unsigned char address) {
-  // char byte;
+  char byte;
 
-  // nrfReadReg(address, &byte, 1);
+  nrfReadReg(address, &byte, 1);
 
   return byte;
 }
@@ -183,33 +183,33 @@ unsigned char nrfRead1Reg(unsigned char address) {
 /* Sent the NOP command. Used to get the status byte */
 unsigned char nrfNop()
 {
-  // unsigned char status;
+  unsigned char status;
 
-  // RADIO_EN_CS();
-  // status = spiSendByte(CMD_NOP);
-  // RADIO_DIS_CS();
+  RADIO_EN_CS();
+  status = spiSendByte(CMD_NOP);
+  RADIO_DIS_CS();
 
   return status;
 }
 
 unsigned char nrfFlushRx()
 {
-  // unsigned char status;
+  unsigned char status;
 
-  // RADIO_EN_CS();
-  // status = spiSendByte(CMD_FLUSH_RX);
-  // RADIO_DIS_CS();
+  RADIO_EN_CS();
+  status = spiSendByte(CMD_FLUSH_RX);
+  RADIO_DIS_CS();
 
   return status;
 }
 
 unsigned char nrfFlushTx()
 {
-  // unsigned char status;
+  unsigned char status;
 
-  // RADIO_EN_CS();
-  // status = spiSendByte(CMD_FLUSH_TX);
-  // RADIO_DIS_CS();
+  RADIO_EN_CS();
+  status = spiSendByte(CMD_FLUSH_TX);
+  RADIO_DIS_CS();
 
   return status;
 }
@@ -217,24 +217,24 @@ unsigned char nrfFlushTx()
 // Return the payload length
 unsigned char nrfRxLength(unsigned int pipe)
 {
-  // unsigned char length;
+  unsigned char length;
 
-  // RADIO_EN_CS();
-  // spiSendByte(CMD_RX_PL_WID);
-  // length = spiReceiveByte();
-  // RADIO_DIS_CS();
+  RADIO_EN_CS();
+  spiSendByte(CMD_RX_PL_WID);
+  length = spiReceiveByte();
+  RADIO_DIS_CS();
 
   return length;
 }
 
 unsigned char nrfActivate()
 {
-  // unsigned char status;
+  unsigned char status;
   
-  // RADIO_EN_CS();
-  // status = spiSendByte(CMD_ACTIVATE);
-  // spiSendByte(ACTIVATE_DATA);
-  // RADIO_DIS_CS();
+  RADIO_EN_CS();
+  status = spiSendByte(CMD_ACTIVATE);
+  spiSendByte(ACTIVATE_DATA);
+  RADIO_DIS_CS();
 
   return status;
 }
@@ -242,20 +242,20 @@ unsigned char nrfActivate()
 // Write the ack payload of the pipe 0
 unsigned char nrfWriteAck(unsigned int pipe, char *buffer, int len)
 {
-  // unsigned char status;
-  // int i;
+  unsigned char status;
+  int i;
 
-  // ASSERT(pipe<6);
+  ASSERT(pipe<6);
 
-  // RADIO_EN_CS();
+  RADIO_EN_CS();
 
-  // /* Send the read command with the address */
-  // status = spiSendByte(CMD_W_ACK_PAYLOAD(pipe));
-  // /* Read LEN bytes */
-  // for(i=0; i<len; i++)
-  //   spiSendByte(buffer[i]);
+  /* Send the read command with the address */
+  status = spiSendByte(CMD_W_ACK_PAYLOAD(pipe));
+  /* Read LEN bytes */
+  for(i=0; i<len; i++)
+    spiSendByte(buffer[i]);
 
-  // RADIO_DIS_CS();
+  RADIO_DIS_CS();
 
   return status;
 }
@@ -263,18 +263,18 @@ unsigned char nrfWriteAck(unsigned int pipe, char *buffer, int len)
 // Read the RX payload
 unsigned char nrfReadRX(char *buffer, int len)
 {
-  // unsigned char status;
-  // int i;
+  unsigned char status;
+  int i;
 
-  // RADIO_EN_CS();
+  RADIO_EN_CS();
 
-  // /* Send the read command with the address */
-  // status = spiSendByte(CMD_R_RX_PAYLOAD);
-  // /* Read LEN bytes */
-  // for(i=0; i<len; i++)
-  //   buffer[i]=spiReceiveByte();
+  /* Send the read command with the address */
+  status = spiSendByte(CMD_R_RX_PAYLOAD);
+  /* Read LEN bytes */
+  for(i=0; i<len; i++)
+    buffer[i]=spiReceiveByte();
 
-  // RADIO_DIS_CS();
+  RADIO_DIS_CS();
 
   return status;
 }
@@ -282,150 +282,150 @@ unsigned char nrfReadRX(char *buffer, int len)
 /* Interrupt service routine, call the interrupt callback */
 void __attribute__((used)) EXTI9_Callback(void)
 {
-  // if (interruptCb)
-  // {
-  //   interruptCb();
-  // }
+  if (interruptCb)
+  {
+    interruptCb();
+  }
 }
 
 void nrfSetInterruptCallback(void (*cb)(void))
 {
-  // interruptCb = cb;
+  interruptCb = cb;
 }
 
 void nrfSetChannel(unsigned int channel)
 {
-  // if (channel<126)
-  //   nrfWrite1Reg(REG_RF_CH, channel);
+  if (channel<126)
+    nrfWrite1Reg(REG_RF_CH, channel);
 }
 
 void nrfSetDatarate(int datarate)
 {
-  // switch(datarate)
-  // {
-  //   case RADIO_RATE_250K:
-  //     nrfWrite1Reg(REG_RF_SETUP, VAL_RF_SETUP_250K);
-  //     break;
-  //   case RADIO_RATE_1M:
-  //     nrfWrite1Reg(REG_RF_SETUP, VAL_RF_SETUP_1M);
-  //     break;
-  //   case RADIO_RATE_2M:
-  //     nrfWrite1Reg(REG_RF_SETUP, VAL_RF_SETUP_2M);
-  //     break;
-  // }  
+  switch(datarate)
+  {
+    case RADIO_RATE_250K:
+      nrfWrite1Reg(REG_RF_SETUP, VAL_RF_SETUP_250K);
+      break;
+    case RADIO_RATE_1M:
+      nrfWrite1Reg(REG_RF_SETUP, VAL_RF_SETUP_1M);
+      break;
+    case RADIO_RATE_2M:
+      nrfWrite1Reg(REG_RF_SETUP, VAL_RF_SETUP_2M);
+      break;
+  }  
 }
 
 void nrfSetAddress(unsigned int pipe, char* address)
 {
-  // int len = 5;
+  int len = 5;
 
-  // ASSERT(pipe<6);
+  ASSERT(pipe<6);
 
-  // if (pipe > 1)
-  //   len = 1;
+  if (pipe > 1)
+    len = 1;
 
-  // nrfWriteReg(REG_RX_ADDR_P0 + pipe, address, len);
+  nrfWriteReg(REG_RX_ADDR_P0 + pipe, address, len);
 }
 
 void nrfSetEnable(bool enable)
 {
-  // if (enable)
-  // {
-  //   RADIO_EN_CE();
-  // } 
-  // else
-  // {
-  //   RADIO_DIS_CE();
-  // }
+  if (enable)
+  {
+    RADIO_EN_CE();
+  } 
+  else
+  {
+    RADIO_DIS_CE();
+  }
 }
 
 unsigned char nrfGetStatus()
 {
-  // return nrfNop();
+  return nrfNop();
 }
 
 /* Initialisation */
 void nrfInit(void)
 {
-  // SPI_InitTypeDef  SPI_InitStructure;
-  // EXTI_InitTypeDef EXTI_InitStructure;
-  // GPIO_InitTypeDef GPIO_InitStructure;
-
-  // if (isInit)
-  //   return;
-
-  // /* Enable SPI and GPIO clocks */
-  // RCC_APB2PeriphClockCmd(RADIO_GPIO_SPI_CLK | RADIO_GPIO_CS_PERIF | 
-  //                        RADIO_GPIO_CE_PERIF | RADIO_GPIO_IRQ_PERIF, ENABLE);
-
-  // /* Enable SPI and GPIO clocks */
-  // RCC_APB1PeriphClockCmd(RADIO_SPI_CLK, ENABLE);
-
-  // /* Configure main clock */
-  // GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_CLK;
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  // GPIO_Init(RADIO_GPIO_CLK_PORT, &GPIO_InitStructure);
-
-  // /* Configure SPI pins: SCK, MISO and MOSI */
-  // GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_SPI_SCK |  RADIO_GPIO_SPI_MOSI;
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  // GPIO_Init(RADIO_GPIO_SPI_PORT, &GPIO_InitStructure);
-
-  // //* Configure MISO */
-  // GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_SPI_MISO;
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-  // GPIO_Init(RADIO_GPIO_SPI_PORT, &GPIO_InitStructure);
-
-  // /* Configure I/O for the Chip select */
-  // GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_CS;
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-  // GPIO_Init(RADIO_GPIO_CS_PORT, &GPIO_InitStructure);
-
-  // /* Configure the interruption (EXTI Source) */
-  // GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_IRQ;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-  // GPIO_Init(RADIO_GPIO_IRQ_PORT, &GPIO_InitStructure);
-
-  // GPIO_EXTILineConfig(RADIO_GPIO_IRQ_SRC_PORT, RADIO_GPIO_IRQ_SRC);
-  // EXTI_InitStructure.EXTI_Line = RADIO_GPIO_IRQ_LINE;
-  // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
-  // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
-  // EXTI_InitStructure.EXTI_LineCmd = ENABLE;
-  // EXTI_Init(&EXTI_InitStructure);
-
-  // // Clock the radio with 16MHz
-  // RCC_MCOConfig(RCC_MCO_HSE);
-
-  // /* disable the chip select */
-  // RADIO_DIS_CS();
-
-  // /* Configure I/O for the Chip Enable */
-  // GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_CE;
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-  // GPIO_Init(RADIO_GPIO_CE_PORT, &GPIO_InitStructure);
-
-  // /* disable the chip enable */
-  // RADIO_DIS_CE();
-
-  // /* SPI configuration */
-  // SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
-  // SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
-  // SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
-  // SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
-  // SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
-  // SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
-  // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
-  // SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
-  // SPI_InitStructure.SPI_CRCPolynomial = 7;
-  // SPI_Init(RADIO_SPI, &SPI_InitStructure);
-
-  // /* Enable the SPI  */
-  // SPI_Cmd(RADIO_SPI, ENABLE);
+  SPI_InitTypeDef  SPI_InitStructure;
+  EXTI_InitTypeDef EXTI_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
+
+  if (isInit)
+    return;
+
+  /* Enable SPI and GPIO clocks */
+  RCC_APB2PeriphClockCmd(RADIO_GPIO_SPI_CLK | RADIO_GPIO_CS_PERIF | 
+                         RADIO_GPIO_CE_PERIF | RADIO_GPIO_IRQ_PERIF, ENABLE);
+
+  /* Enable SPI and GPIO clocks */
+  RCC_APB1PeriphClockCmd(RADIO_SPI_CLK, ENABLE);
+
+  /* Configure main clock */
+  GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_CLK;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_Init(RADIO_GPIO_CLK_PORT, &GPIO_InitStructure);
+
+  /* Configure SPI pins: SCK, MISO and MOSI */
+  GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_SPI_SCK |  RADIO_GPIO_SPI_MOSI;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_Init(RADIO_GPIO_SPI_PORT, &GPIO_InitStructure);
+
+  //* Configure MISO */
+  GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_SPI_MISO;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+  GPIO_Init(RADIO_GPIO_SPI_PORT, &GPIO_InitStructure);
+
+  /* Configure I/O for the Chip select */
+  GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_CS;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+  GPIO_Init(RADIO_GPIO_CS_PORT, &GPIO_InitStructure);
+
+  /* Configure the interruption (EXTI Source) */
+  GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_IRQ;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+  GPIO_Init(RADIO_GPIO_IRQ_PORT, &GPIO_InitStructure);
+
+  GPIO_EXTILineConfig(RADIO_GPIO_IRQ_SRC_PORT, RADIO_GPIO_IRQ_SRC);
+  EXTI_InitStructure.EXTI_Line = RADIO_GPIO_IRQ_LINE;
+  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
+  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
+  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
+  EXTI_Init(&EXTI_InitStructure);
+
+  // Clock the radio with 16MHz
+  RCC_MCOConfig(RCC_MCO_HSE);
+
+  /* disable the chip select */
+  RADIO_DIS_CS();
+
+  /* Configure I/O for the Chip Enable */
+  GPIO_InitStructure.GPIO_Pin = RADIO_GPIO_CE;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+  GPIO_Init(RADIO_GPIO_CE_PORT, &GPIO_InitStructure);
+
+  /* disable the chip enable */
+  RADIO_DIS_CE();
+
+  /* SPI configuration */
+  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
+  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
+  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
+  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
+  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+  SPI_InitStructure.SPI_CRCPolynomial = 7;
+  SPI_Init(RADIO_SPI, &SPI_InitStructure);
+
+  /* Enable the SPI  */
+  SPI_Cmd(RADIO_SPI, ENABLE);
   
-  // isInit = true;
+  isInit = true;
 }
 
 bool nrfTest(void)
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nvic.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nvic.c
index 9cc83b178..a5c777c0e 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nvic.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/nvic.c
@@ -36,8 +36,7 @@
 
 void nvicInit(void)
 {
-  //COMMENTED FIRMWARE
-  //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
+  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
 }
 
 /**
@@ -86,84 +85,81 @@ void DONT_DISCARD HardFault_Handler(void)
   // asm (" MOVS r0, #1 \n"
   // " LDM r0,{r1-r2} \n"
   // " BX LR; \n");
-  //COMMENTED FIRMWARE
-  // asm( "TST LR, #4 \n"
-  // "ITE EQ \n"
-  // "MRSEQ R0, MSP \n"
-  // "MRSNE R0, PSP \n"
-  // "B printHardFault");
+  asm( "TST LR, #4 \n"
+  "ITE EQ \n"
+  "MRSEQ R0, MSP \n"
+  "MRSNE R0, PSP \n"
+  "B printHardFault");
 }
 
 void DONT_DISCARD printHardFault(uint32_t* hardfaultArgs)
 {
-  //COMMENTED FIRMWARE
-  // unsigned int stacked_r0;
-  // unsigned int stacked_r1;
-  // unsigned int stacked_r2;
-  // unsigned int stacked_r3;
-  // unsigned int stacked_r12;
-  // unsigned int stacked_lr;
-  // unsigned int stacked_pc;
-  // unsigned int stacked_psr;
-
-  // stacked_r0 = ((unsigned long) hardfaultArgs[0]);
-  // stacked_r1 = ((unsigned long) hardfaultArgs[1]);
-  // stacked_r2 = ((unsigned long) hardfaultArgs[2]);
-  // stacked_r3 = ((unsigned long) hardfaultArgs[3]);
-
-  // stacked_r12 = ((unsigned long) hardfaultArgs[4]);
-  // stacked_lr = ((unsigned long) hardfaultArgs[5]);
-  // stacked_pc = ((unsigned long) hardfaultArgs[6]);
-  // stacked_psr = ((unsigned long) hardfaultArgs[7]);
-
-
-  // UART_PRINT("[Hard fault handler]\n");
-  // UART_PRINT("R0 = %x\n", stacked_r0);
-  // UART_PRINT("R1 = %x\n", stacked_r1);
-  // UART_PRINT("R2 = %x\n", stacked_r2);
-  // UART_PRINT("R3 = %x\n", stacked_r3);
-  // UART_PRINT("R12 = %x\n", stacked_r12);
-  // UART_PRINT("LR = %x\n", stacked_lr);
-  // UART_PRINT("PC = %x\n", stacked_pc);
-  // UART_PRINT("PSR = %x\n", stacked_psr);
-  // UART_PRINT("BFAR = %x\n", (*((volatile unsigned int *)(0xE000ED38))));
-  // UART_PRINT("CFSR = %x\n", (*((volatile unsigned int *)(0xE000ED28))));
-  // UART_PRINT("HFSR = %x\n", (*((volatile unsigned int *)(0xE000ED2C))));
-  // UART_PRINT("DFSR = %x\n", (*((volatile unsigned int *)(0xE000ED30))));
-  // UART_PRINT("AFSR = %x\n", (*((volatile unsigned int *)(0xE000ED3C))));
-
-  // ledClearAll();
-  // ledSet(ERR_LED1, 1);
-  // ledSet(ERR_LED2, 1);
-  // powerStop();
-
-  // storeAssertHardfaultData(
-  //   stacked_r0,
-  //   stacked_r1,
-  //   stacked_r2,
-  //   stacked_r3,
-  //   stacked_r12,
-  //   stacked_lr,
-  //   stacked_pc,
-  //   stacked_psr);
-  // while (1)
-  // {}
+  unsigned int stacked_r0;
+  unsigned int stacked_r1;
+  unsigned int stacked_r2;
+  unsigned int stacked_r3;
+  unsigned int stacked_r12;
+  unsigned int stacked_lr;
+  unsigned int stacked_pc;
+  unsigned int stacked_psr;
+
+  stacked_r0 = ((unsigned long) hardfaultArgs[0]);
+  stacked_r1 = ((unsigned long) hardfaultArgs[1]);
+  stacked_r2 = ((unsigned long) hardfaultArgs[2]);
+  stacked_r3 = ((unsigned long) hardfaultArgs[3]);
+
+  stacked_r12 = ((unsigned long) hardfaultArgs[4]);
+  stacked_lr = ((unsigned long) hardfaultArgs[5]);
+  stacked_pc = ((unsigned long) hardfaultArgs[6]);
+  stacked_psr = ((unsigned long) hardfaultArgs[7]);
+
+
+  UART_PRINT("[Hard fault handler]\n");
+  UART_PRINT("R0 = %x\n", stacked_r0);
+  UART_PRINT("R1 = %x\n", stacked_r1);
+  UART_PRINT("R2 = %x\n", stacked_r2);
+  UART_PRINT("R3 = %x\n", stacked_r3);
+  UART_PRINT("R12 = %x\n", stacked_r12);
+  UART_PRINT("LR = %x\n", stacked_lr);
+  UART_PRINT("PC = %x\n", stacked_pc);
+  UART_PRINT("PSR = %x\n", stacked_psr);
+  UART_PRINT("BFAR = %x\n", (*((volatile unsigned int *)(0xE000ED38))));
+  UART_PRINT("CFSR = %x\n", (*((volatile unsigned int *)(0xE000ED28))));
+  UART_PRINT("HFSR = %x\n", (*((volatile unsigned int *)(0xE000ED2C))));
+  UART_PRINT("DFSR = %x\n", (*((volatile unsigned int *)(0xE000ED30))));
+  UART_PRINT("AFSR = %x\n", (*((volatile unsigned int *)(0xE000ED3C))));
+
+  ledClearAll();
+  ledSet(ERR_LED1, 1);
+  ledSet(ERR_LED2, 1);
+  powerStop();
+
+  storeAssertHardfaultData(
+    stacked_r0,
+    stacked_r1,
+    stacked_r2,
+    stacked_r3,
+    stacked_r12,
+    stacked_lr,
+    stacked_pc,
+    stacked_psr);
+  while (1)
+  {}
 }
 /**
  * @brief  This function handles Memory Manage exception.
  */
 void DONT_DISCARD MemManage_Handler(void)
 {
-  //COMMENTED FIRMWARE
-  // /* Go to infinite loop when Memory Manage exception occurs */
-  // ledClearAll();
-  // ledSet(ERR_LED1, 1);
-  // ledSet(ERR_LED2, 1);
-  // powerStop();
-
-  // storeAssertTextData("MemManage");
-  // while (1)
-  // {}
+  /* Go to infinite loop when Memory Manage exception occurs */
+  ledClearAll();
+  ledSet(ERR_LED1, 1);
+  ledSet(ERR_LED2, 1);
+  powerStop();
+
+  storeAssertTextData("MemManage");
+  while (1)
+  {}
 }
 
 /**
@@ -171,16 +167,15 @@ void DONT_DISCARD MemManage_Handler(void)
  */
 void DONT_DISCARD BusFault_Handler(void)
 {
-  //COMMENTED FIRMWARE
   /* Go to infinite loop when Bus Fault exception occurs */
-  // ledClearAll();
-  // ledSet(ERR_LED1, 1);
-  // ledSet(ERR_LED2, 1);
-  // powerStop();
-
-  // storeAssertTextData("BusFault");
-  // while (1)
-  // {}
+  ledClearAll();
+  ledSet(ERR_LED1, 1);
+  ledSet(ERR_LED2, 1);
+  powerStop();
+
+  storeAssertTextData("BusFault");
+  while (1)
+  {}
 }
 
 /**
@@ -188,16 +183,15 @@ void DONT_DISCARD BusFault_Handler(void)
  */
 void DONT_DISCARD UsageFault_Handler(void)
 {
-  //COMMENTED FIRMWARE
-  // /* Go to infinite loop when Usage Fault exception occurs */
-  // ledClearAll();
-  // ledSet(ERR_LED1, 1);
-  // ledSet(ERR_LED2, 1);
-  // powerStop();
-
-  // storeAssertTextData("UsageFault");
-  // while (1)
-  // {}
+  /* Go to infinite loop when Usage Fault exception occurs */
+  ledClearAll();
+  ledSet(ERR_LED1, 1);
+  ledSet(ERR_LED2, 1);
+  powerStop();
+
+  storeAssertTextData("UsageFault");
+  while (1)
+  {}
 }
 
 /**
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pca9685.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pca9685.c
index 92a19eeee..abab44e8d 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pca9685.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pca9685.c
@@ -92,9 +92,8 @@ static void durationToBytes(uint16_t duration, uint8_t *bytes)
 
 static uint16_t dutyToDuration(float duty)
 {
-  //COMMENTED FIRMWARE
-  // duty = fmax(duty, 0.0f);
-  // duty = fmin(duty, 1.0f);
+  duty = fmax(duty, 0.0f);
+  duty = fmin(duty, 1.0f);
   return duty * 4096.0f;
 }
 
@@ -178,59 +177,55 @@ STATIC_MEM_QUEUE_ALLOC(queue, 1, sizeof(struct asyncRequest));
 
 static void asyncTask(__attribute__((unused)) void *param)
 {
-
-  // while (true) {
-  //   BaseType_t ok = xQueueReceive(queue, &reqPop, portMAX_DELAY);
-  //   if (ok == pdTRUE) {
-  //     // blocking message send.
-  //     pca9685setDurations(
-  //       reqPop.addr, reqPop.chanBegin, reqPop.nChan, reqPop.durations);
-  //   }
-  // }
+  while (true) {
+    BaseType_t ok = xQueueReceive(queue, &reqPop, portMAX_DELAY);
+    if (ok == pdTRUE) {
+      // blocking message send.
+      pca9685setDurations(
+        reqPop.addr, reqPop.chanBegin, reqPop.nChan, reqPop.durations);
+    }
+  }
 }
 
 bool pca9685startAsyncTask()
 {
-  //COMMENTED FIRMWARE
-  // queue = STATIC_MEM_QUEUE_CREATE(queue);
-  // if (queue == 0) {
-  //   return false;
-  // }
+  queue = STATIC_MEM_QUEUE_CREATE(queue);
+  if (queue == 0) {
+    return false;
+  }
 
-  // task = STATIC_MEM_TASK_CREATE(task, asyncTask, PCA9685_TASK_NAME, NULL, PCA9685_TASK_PRI);
+  task = STATIC_MEM_TASK_CREATE(task, asyncTask, PCA9685_TASK_NAME, NULL, PCA9685_TASK_PRI);
   return true;
 }
 
 bool pca9685setDutiesAsync(
   int addr, int chanBegin, int nChan, float const *duties)
 {
-  //COMMENTED FIRMWARE
-  // struct asyncRequest reqPush = {
-  //   .addr = addr,
-  //   .chanBegin = chanBegin,
-  //   .nChan = nChan,
-  // };
-  // for (int i = 0; i < nChan; ++i) {
-  //   reqPush.durations[i] = dutyToDuration(duties[i]);
-  // }
-  // // drop message unless queue is empty!
-  // xQueueSend(queue, &reqPush, 0);
+  struct asyncRequest reqPush = {
+    .addr = addr,
+    .chanBegin = chanBegin,
+    .nChan = nChan,
+  };
+  for (int i = 0; i < nChan; ++i) {
+    reqPush.durations[i] = dutyToDuration(duties[i]);
+  }
+  // drop message unless queue is empty!
+  xQueueSend(queue, &reqPush, 0);
   return true;
 }
 
 bool pca9685setDurationsAsync(
   int addr, int chanBegin, int nChan, uint16_t const *durations)
 {
-  //COMMENTED FIRMWARE
-  // struct asyncRequest reqPush = {
-  //   .addr = addr,
-  //   .chanBegin = chanBegin,
-  //   .nChan = nChan,
-  // };
-  // for (int i = 0; i < nChan; ++i) {
-  //   reqPush.durations[i] = durations[i];
-  // }
-  // // drop message unless queue is empty!
-  // xQueueSend(queue, &reqPush, 0);
+  struct asyncRequest reqPush = {
+    .addr = addr,
+    .chanBegin = chanBegin,
+    .nChan = nChan,
+  };
+  for (int i = 0; i < nChan; ++i) {
+    reqPush.durations[i] = durations[i];
+  }
+  // drop message unless queue is empty!
+  xQueueSend(queue, &reqPush, 0);
   return true;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/piezo.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/piezo.c
index 78acc40f6..e28ef7129 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/piezo.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/piezo.c
@@ -71,61 +71,61 @@ void piezoInit()
 {
   if (isInit)
     return;
-  //COMMENTED FIRMWARE
-  // //Init structures
-  // GPIO_InitTypeDef GPIO_InitStructure;
-  // TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
-  // TIM_OCInitTypeDef  TIM_OCInitStructure;
-
-  // //Clock the gpio and the timers
-  // RCC_AHB1PeriphClockCmd(PIEZO_GPIO_POS_PERIF | PIEZO_GPIO_NEG_PERIF, ENABLE);
-  // RCC_APB1PeriphClockCmd(PIEZO_TIM_PERIF, ENABLE);
-
-  // // Configure the GPIO for the timer output
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
-  // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  // GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
-  // GPIO_InitStructure.GPIO_Pin = PIEZO_GPIO_POS_PIN;
-  // GPIO_Init(PIEZO_GPIO_POS_PORT, &GPIO_InitStructure);
-  // GPIO_InitStructure.GPIO_Pin = PIEZO_GPIO_NEG_PIN;
-  // GPIO_Init(PIEZO_GPIO_NEG_PORT, &GPIO_InitStructure);
-
-  // //Map timers to alternate functions
-  // GPIO_PinAFConfig(PIEZO_GPIO_POS_PORT, PIEZO_GPIO_AF_POS_PIN, PIEZO_GPIO_AF_POS);
-  // GPIO_PinAFConfig(PIEZO_GPIO_NEG_PORT, PIEZO_GPIO_AF_NEG_PIN, PIEZO_GPIO_AF_NEG);
-
-  // //Timer configuration
-  // TIM_TimeBaseStructure.TIM_Period = PIEZO_PWM_PERIOD;
-  // TIM_TimeBaseStructure.TIM_Prescaler = PIEZO_PWM_PRESCALE;
-  // TIM_TimeBaseStructure.TIM_ClockDivision = 0;
-  // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-  // TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
-  // TIM_TimeBaseInit(PIEZO_TIM, &TIM_TimeBaseStructure);
-
-  // // PWM channels configuration
-  // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
-  // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
-  // TIM_OCInitStructure.TIM_Pulse = 0;
-  // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
-  // TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
-
-  // // Configure OC3
-  // TIM_OC3Init(PIEZO_TIM, &TIM_OCInitStructure);
-  // TIM_OC3PreloadConfig(PIEZO_TIM, TIM_OCPreload_Enable);
-
-  // // Configure OC4 inverted
-  // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
-  // TIM_OC4Init(PIEZO_TIM, &TIM_OCInitStructure);
-  // TIM_OC4PreloadConfig(PIEZO_TIM, TIM_OCPreload_Enable);
-
-  // //Enable the timer PWM outputs
-  // TIM_CtrlPWMOutputs(PIEZO_TIM, ENABLE);
-  // TIM_SetCompare3(PIEZO_TIM, 0x00);
-  // TIM_SetCompare4(PIEZO_TIM, 0x00);
-
-  // //Enable the timer
-  // TIM_Cmd(PIEZO_TIM, ENABLE);
+
+  //Init structures
+  GPIO_InitTypeDef GPIO_InitStructure;
+  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
+  TIM_OCInitTypeDef  TIM_OCInitStructure;
+
+  //Clock the gpio and the timers
+  RCC_AHB1PeriphClockCmd(PIEZO_GPIO_POS_PERIF | PIEZO_GPIO_NEG_PERIF, ENABLE);
+  RCC_APB1PeriphClockCmd(PIEZO_TIM_PERIF, ENABLE);
+
+  // Configure the GPIO for the timer output
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+  GPIO_InitStructure.GPIO_Pin = PIEZO_GPIO_POS_PIN;
+  GPIO_Init(PIEZO_GPIO_POS_PORT, &GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Pin = PIEZO_GPIO_NEG_PIN;
+  GPIO_Init(PIEZO_GPIO_NEG_PORT, &GPIO_InitStructure);
+
+  //Map timers to alternate functions
+  GPIO_PinAFConfig(PIEZO_GPIO_POS_PORT, PIEZO_GPIO_AF_POS_PIN, PIEZO_GPIO_AF_POS);
+  GPIO_PinAFConfig(PIEZO_GPIO_NEG_PORT, PIEZO_GPIO_AF_NEG_PIN, PIEZO_GPIO_AF_NEG);
+
+  //Timer configuration
+  TIM_TimeBaseStructure.TIM_Period = PIEZO_PWM_PERIOD;
+  TIM_TimeBaseStructure.TIM_Prescaler = PIEZO_PWM_PRESCALE;
+  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
+  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
+  TIM_TimeBaseInit(PIEZO_TIM, &TIM_TimeBaseStructure);
+
+  // PWM channels configuration
+  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
+  TIM_OCInitStructure.TIM_Pulse = 0;
+  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
+  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
+
+  // Configure OC3
+  TIM_OC3Init(PIEZO_TIM, &TIM_OCInitStructure);
+  TIM_OC3PreloadConfig(PIEZO_TIM, TIM_OCPreload_Enable);
+
+  // Configure OC4 inverted
+  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
+  TIM_OC4Init(PIEZO_TIM, &TIM_OCInitStructure);
+  TIM_OC4PreloadConfig(PIEZO_TIM, TIM_OCPreload_Enable);
+
+  //Enable the timer PWM outputs
+  TIM_CtrlPWMOutputs(PIEZO_TIM, ENABLE);
+  TIM_SetCompare3(PIEZO_TIM, 0x00);
+  TIM_SetCompare4(PIEZO_TIM, 0x00);
+
+  //Enable the timer
+  TIM_Cmd(PIEZO_TIM, ENABLE);
 
   isInit = true;
 }
@@ -137,13 +137,11 @@ bool piezoTest(void)
 
 void piezoSetRatio(uint8_t ratio)
 {
-  //COMMENTED FIRMWARE
-  // TIM_SetCompare3(PIEZO_TIM, ratio);
-  // TIM_SetCompare4(PIEZO_TIM, ratio);
+  TIM_SetCompare3(PIEZO_TIM, ratio);
+  TIM_SetCompare4(PIEZO_TIM, ratio);
 }
 
 void piezoSetFreq(uint16_t freq)
 {
-  //COMMENTED FIRMWARE
-  //TIM_PrescalerConfig(PIEZO_TIM, (PIEZO_BASE_FREQ/freq), TIM_PSCReloadMode_Update);
+  TIM_PrescalerConfig(PIEZO_TIM, (PIEZO_BASE_FREQ/freq), TIM_PSCReloadMode_Update);
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pmw3901.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pmw3901.c
index 4777db247..111af0eca 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pmw3901.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/pmw3901.c
@@ -41,136 +41,133 @@ static bool isInit = false;
 
 static void registerWrite(const deckPin_t csPin, uint8_t reg, uint8_t value)
 {
-  //COMMENTED FIRMWARE
-  // // Set MSB to 1 for write
-  // reg |= 0x80u;
+  // Set MSB to 1 for write
+  reg |= 0x80u;
 
-  // spiBeginTransaction(SPI_BAUDRATE_2MHZ);
-  // digitalWrite(csPin, LOW);
+  spiBeginTransaction(SPI_BAUDRATE_2MHZ);
+  digitalWrite(csPin, LOW);
 
-  // sleepus(50);
+  sleepus(50);
 
-  // spiExchange(1, &reg, &reg);
-  // sleepus(50);
-  // spiExchange(1, &value, &value);
+  spiExchange(1, &reg, &reg);
+  sleepus(50);
+  spiExchange(1, &value, &value);
 
-  // sleepus(50);
+  sleepus(50);
 
-  // digitalWrite(csPin, HIGH);
-  // spiEndTransaction();
-  // sleepus(200);
+  digitalWrite(csPin, HIGH);
+  spiEndTransaction();
+  sleepus(200);
 }
 
 static uint8_t registerRead(const deckPin_t csPin, uint8_t reg)
 {
   uint8_t data = 0;
-  //COMMENTED FIRMWARE
-  // uint8_t dummy = 0;
+  uint8_t dummy = 0;
 
-  // // Set MSB to 0 for read
-  // reg &= ~0x80u;
+  // Set MSB to 0 for read
+  reg &= ~0x80u;
 
-  // spiBeginTransaction(SPI_BAUDRATE_2MHZ);
-  // digitalWrite(csPin, LOW);
+  spiBeginTransaction(SPI_BAUDRATE_2MHZ);
+  digitalWrite(csPin, LOW);
 
-  // sleepus(50);
+  sleepus(50);
 
-  // spiExchange(1, &reg, &reg);
-  // sleepus(500);
-  // spiExchange(1, &dummy, &data);
+  spiExchange(1, &reg, &reg);
+  sleepus(500);
+  spiExchange(1, &dummy, &data);
 
-  // sleepus(50);
+  sleepus(50);
 
-  // digitalWrite(csPin, HIGH);
-  // spiEndTransaction();
-  // sleepus(200);
+  digitalWrite(csPin, HIGH);
+  spiEndTransaction();
+  sleepus(200);
 
   return data;
 }
 
 static void InitRegisters(const deckPin_t csPin)
 {
-  //COMMENTED FIRMWARE
-  // registerWrite(csPin, 0x7F, 0x00);
-  // registerWrite(csPin, 0x61, 0xAD);
-  // registerWrite(csPin, 0x7F, 0x03);
-  // registerWrite(csPin, 0x40, 0x00);
-  // registerWrite(csPin, 0x7F, 0x05);
-  // registerWrite(csPin, 0x41, 0xB3);
-  // registerWrite(csPin, 0x43, 0xF1);
-  // registerWrite(csPin, 0x45, 0x14);
-  // registerWrite(csPin, 0x5B, 0x32);
-  // registerWrite(csPin, 0x5F, 0x34);
-  // registerWrite(csPin, 0x7B, 0x08);
-  // registerWrite(csPin, 0x7F, 0x06);
-  // registerWrite(csPin, 0x44, 0x1B);
-  // registerWrite(csPin, 0x40, 0xBF);
-  // registerWrite(csPin, 0x4E, 0x3F);
-  // registerWrite(csPin, 0x7F, 0x08);
-  // registerWrite(csPin, 0x65, 0x20);
-  // registerWrite(csPin, 0x6A, 0x18);
-  // registerWrite(csPin, 0x7F, 0x09);
-  // registerWrite(csPin, 0x4F, 0xAF);
-  // registerWrite(csPin, 0x5F, 0x40);
-  // registerWrite(csPin, 0x48, 0x80);
-  // registerWrite(csPin, 0x49, 0x80);
-  // registerWrite(csPin, 0x57, 0x77);
-  // registerWrite(csPin, 0x60, 0x78);
-  // registerWrite(csPin, 0x61, 0x78);
-  // registerWrite(csPin, 0x62, 0x08);
-  // registerWrite(csPin, 0x63, 0x50);
-  // registerWrite(csPin, 0x7F, 0x0A);
-  // registerWrite(csPin, 0x45, 0x60);
-  // registerWrite(csPin, 0x7F, 0x00);
-  // registerWrite(csPin, 0x4D, 0x11);
-  // registerWrite(csPin, 0x55, 0x80);
-  // registerWrite(csPin, 0x74, 0x1F);
-  // registerWrite(csPin, 0x75, 0x1F);
-  // registerWrite(csPin, 0x4A, 0x78);
-  // registerWrite(csPin, 0x4B, 0x78);
-  // registerWrite(csPin, 0x44, 0x08);
-  // registerWrite(csPin, 0x45, 0x50);
-  // registerWrite(csPin, 0x64, 0xFF);
-  // registerWrite(csPin, 0x65, 0x1F);
-  // registerWrite(csPin, 0x7F, 0x14);
-  // registerWrite(csPin, 0x65, 0x67);
-  // registerWrite(csPin, 0x66, 0x08);
-  // registerWrite(csPin, 0x63, 0x70);
-  // registerWrite(csPin, 0x7F, 0x15);
-  // registerWrite(csPin, 0x48, 0x48);
-  // registerWrite(csPin, 0x7F, 0x07);
-  // registerWrite(csPin, 0x41, 0x0D);
-  // registerWrite(csPin, 0x43, 0x14);
-  // registerWrite(csPin, 0x4B, 0x0E);
-  // registerWrite(csPin, 0x45, 0x0F);
-  // registerWrite(csPin, 0x44, 0x42);
-  // registerWrite(csPin, 0x4C, 0x80);
-  // registerWrite(csPin, 0x7F, 0x10);
-  // registerWrite(csPin, 0x5B, 0x02);
-  // registerWrite(csPin, 0x7F, 0x07);
-  // registerWrite(csPin, 0x40, 0x41);
-  // registerWrite(csPin, 0x70, 0x00);
-
-  // vTaskDelay(M2T(10)); // delay 10ms
-
-  // registerWrite(csPin, 0x32, 0x44);
-  // registerWrite(csPin, 0x7F, 0x07);
-  // registerWrite(csPin, 0x40, 0x40);
-  // registerWrite(csPin, 0x7F, 0x06);
-  // registerWrite(csPin, 0x62, 0xF0);
-  // registerWrite(csPin, 0x63, 0x00);
-  // registerWrite(csPin, 0x7F, 0x0D);
-  // registerWrite(csPin, 0x48, 0xC0);
-  // registerWrite(csPin, 0x6F, 0xD5);
-  // registerWrite(csPin, 0x7F, 0x00);
-  // registerWrite(csPin, 0x5B, 0xA0);
-  // registerWrite(csPin, 0x4E, 0xA8);
-  // registerWrite(csPin, 0x5A, 0x50);
-  // registerWrite(csPin, 0x40, 0x80);
-
-  // registerWrite(csPin, 0x7F, 0x00);
-  // registerWrite(csPin, 0x5A, 0x10);
-  // registerWrite(csPin, 0x54, 0x00);
+  registerWrite(csPin, 0x7F, 0x00);
+  registerWrite(csPin, 0x61, 0xAD);
+  registerWrite(csPin, 0x7F, 0x03);
+  registerWrite(csPin, 0x40, 0x00);
+  registerWrite(csPin, 0x7F, 0x05);
+  registerWrite(csPin, 0x41, 0xB3);
+  registerWrite(csPin, 0x43, 0xF1);
+  registerWrite(csPin, 0x45, 0x14);
+  registerWrite(csPin, 0x5B, 0x32);
+  registerWrite(csPin, 0x5F, 0x34);
+  registerWrite(csPin, 0x7B, 0x08);
+  registerWrite(csPin, 0x7F, 0x06);
+  registerWrite(csPin, 0x44, 0x1B);
+  registerWrite(csPin, 0x40, 0xBF);
+  registerWrite(csPin, 0x4E, 0x3F);
+  registerWrite(csPin, 0x7F, 0x08);
+  registerWrite(csPin, 0x65, 0x20);
+  registerWrite(csPin, 0x6A, 0x18);
+  registerWrite(csPin, 0x7F, 0x09);
+  registerWrite(csPin, 0x4F, 0xAF);
+  registerWrite(csPin, 0x5F, 0x40);
+  registerWrite(csPin, 0x48, 0x80);
+  registerWrite(csPin, 0x49, 0x80);
+  registerWrite(csPin, 0x57, 0x77);
+  registerWrite(csPin, 0x60, 0x78);
+  registerWrite(csPin, 0x61, 0x78);
+  registerWrite(csPin, 0x62, 0x08);
+  registerWrite(csPin, 0x63, 0x50);
+  registerWrite(csPin, 0x7F, 0x0A);
+  registerWrite(csPin, 0x45, 0x60);
+  registerWrite(csPin, 0x7F, 0x00);
+  registerWrite(csPin, 0x4D, 0x11);
+  registerWrite(csPin, 0x55, 0x80);
+  registerWrite(csPin, 0x74, 0x1F);
+  registerWrite(csPin, 0x75, 0x1F);
+  registerWrite(csPin, 0x4A, 0x78);
+  registerWrite(csPin, 0x4B, 0x78);
+  registerWrite(csPin, 0x44, 0x08);
+  registerWrite(csPin, 0x45, 0x50);
+  registerWrite(csPin, 0x64, 0xFF);
+  registerWrite(csPin, 0x65, 0x1F);
+  registerWrite(csPin, 0x7F, 0x14);
+  registerWrite(csPin, 0x65, 0x67);
+  registerWrite(csPin, 0x66, 0x08);
+  registerWrite(csPin, 0x63, 0x70);
+  registerWrite(csPin, 0x7F, 0x15);
+  registerWrite(csPin, 0x48, 0x48);
+  registerWrite(csPin, 0x7F, 0x07);
+  registerWrite(csPin, 0x41, 0x0D);
+  registerWrite(csPin, 0x43, 0x14);
+  registerWrite(csPin, 0x4B, 0x0E);
+  registerWrite(csPin, 0x45, 0x0F);
+  registerWrite(csPin, 0x44, 0x42);
+  registerWrite(csPin, 0x4C, 0x80);
+  registerWrite(csPin, 0x7F, 0x10);
+  registerWrite(csPin, 0x5B, 0x02);
+  registerWrite(csPin, 0x7F, 0x07);
+  registerWrite(csPin, 0x40, 0x41);
+  registerWrite(csPin, 0x70, 0x00);
+
+  vTaskDelay(M2T(10)); // delay 10ms
+
+  registerWrite(csPin, 0x32, 0x44);
+  registerWrite(csPin, 0x7F, 0x07);
+  registerWrite(csPin, 0x40, 0x40);
+  registerWrite(csPin, 0x7F, 0x06);
+  registerWrite(csPin, 0x62, 0xF0);
+  registerWrite(csPin, 0x63, 0x00);
+  registerWrite(csPin, 0x7F, 0x0D);
+  registerWrite(csPin, 0x48, 0xC0);
+  registerWrite(csPin, 0x6F, 0xD5);
+  registerWrite(csPin, 0x7F, 0x00);
+  registerWrite(csPin, 0x5B, 0xA0);
+  registerWrite(csPin, 0x4E, 0xA8);
+  registerWrite(csPin, 0x5A, 0x50);
+  registerWrite(csPin, 0x40, 0x80);
+
+  registerWrite(csPin, 0x7F, 0x00);
+  registerWrite(csPin, 0x5A, 0x10);
+  registerWrite(csPin, 0x54, 0x00);
 }
 
 bool pmw3901Init(const deckPin_t csPin)
@@ -178,65 +175,64 @@ bool pmw3901Init(const deckPin_t csPin)
   if (isInit) {
     return true;
   }
-  //COMMENTED FIRMWARE
-  // // Initialize CS Pin
-  // pinMode(csPin, OUTPUT);
-  // digitalWrite(csPin, HIGH);
 
-  // spiBegin();
-  // vTaskDelay(M2T(40));
+  // Initialize CS Pin
+  pinMode(csPin, OUTPUT);
+  digitalWrite(csPin, HIGH);
 
-  // digitalWrite(csPin, HIGH);
-  // vTaskDelay(M2T(2));
-  // digitalWrite(csPin, LOW);
-  // vTaskDelay(M2T(2));
-  // digitalWrite(csPin, HIGH);
-  // vTaskDelay(M2T(2));
+  spiBegin();
+  vTaskDelay(M2T(40));
 
-  // uint8_t chipId    = registerRead(csPin, 0x00);
-  // uint8_t invChipId = registerRead(csPin, 0x5f);
+  digitalWrite(csPin, HIGH);
+  vTaskDelay(M2T(2));
+  digitalWrite(csPin, LOW);
+  vTaskDelay(M2T(2));
+  digitalWrite(csPin, HIGH);
+  vTaskDelay(M2T(2));
 
-  // DEBUG_PRINT("Motion chip id: 0x%x:0x%x\n", chipId, invChipId);
+  uint8_t chipId    = registerRead(csPin, 0x00);
+  uint8_t invChipId = registerRead(csPin, 0x5f);
 
-  // if (chipId == 0x49 && invChipId == 0xB6)
-  // {
-  //   // Power on reset
-  //   registerWrite(csPin, 0x3a, 0x5a);
-  //   vTaskDelay(M2T(5));
+  DEBUG_PRINT("Motion chip id: 0x%x:0x%x\n", chipId, invChipId);
 
-  //   // Reading the motion registers one time
-  //   registerRead(csPin, 0x02);
-  //   registerRead(csPin, 0x03);
-  //   registerRead(csPin, 0x04);
-  //   registerRead(csPin, 0x05);
-  //   registerRead(csPin, 0x06);
-  //   vTaskDelay(M2T(1));
+  if (chipId == 0x49 && invChipId == 0xB6)
+  {
+    // Power on reset
+    registerWrite(csPin, 0x3a, 0x5a);
+    vTaskDelay(M2T(5));
 
-  //   InitRegisters(csPin);
+    // Reading the motion registers one time
+    registerRead(csPin, 0x02);
+    registerRead(csPin, 0x03);
+    registerRead(csPin, 0x04);
+    registerRead(csPin, 0x05);
+    registerRead(csPin, 0x06);
+    vTaskDelay(M2T(1));
 
-  //   isInit = true;
-  // }
+    InitRegisters(csPin);
+
+    isInit = true;
+  }
 
   return isInit;
 }
 
 void pmw3901ReadMotion(const deckPin_t csPin, motionBurst_t * motion)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t address = 0x16;
-
-  // spiBeginTransaction(SPI_BAUDRATE_2MHZ);
-  // digitalWrite(csPin,LOW);
-  // sleepus(50);
-  // spiExchange(1, &address, &address);
-  // sleepus(50);
-  // spiExchange(sizeof(motionBurst_t), (uint8_t*)motion, (uint8_t*)motion);
-  // sleepus(50);
-  // digitalWrite(csPin, HIGH);
-  // spiEndTransaction();
-  // sleepus(50);
-
-  // uint16_t realShutter = (motion->shutter >> 8) & 0x0FF;
-  // realShutter |= (motion->shutter & 0x0ff) << 8;
-  // motion->shutter = realShutter;
+  uint8_t address = 0x16;
+
+  spiBeginTransaction(SPI_BAUDRATE_2MHZ);
+  digitalWrite(csPin,LOW);
+  sleepus(50);
+  spiExchange(1, &address, &address);
+  sleepus(50);
+  spiExchange(sizeof(motionBurst_t), (uint8_t*)motion, (uint8_t*)motion);
+  sleepus(50);
+  digitalWrite(csPin, HIGH);
+  spiEndTransaction();
+  sleepus(50);
+
+  uint16_t realShutter = (motion->shutter >> 8) & 0x0FF;
+  realShutter |= (motion->shutter & 0x0ff) << 8;
+  motion->shutter = realShutter;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/swd.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/swd.c
index a553065d7..bccba0424 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/swd.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/swd.c
@@ -53,50 +53,49 @@ static bool isInit = false;
 
 
 static void initGPIO(void) {
-  //COMMENTED FIRMWARE
-  // GPIO_InitTypeDef GPIO_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
 
-  // SWD_SPI_CLK_INIT(SWD_SPI_CLK, ENABLE);
+  SWD_SPI_CLK_INIT(SWD_SPI_CLK, ENABLE);
 
-  // RCC_AHB1PeriphClockCmd(SWD_SPI_SCK_GPIO_CLK | SWD_SPI_MISO_GPIO_CLK, ENABLE);
+  RCC_AHB1PeriphClockCmd(SWD_SPI_SCK_GPIO_CLK | SWD_SPI_MISO_GPIO_CLK, ENABLE);
 
-  // GPIO_PinAFConfig(SWD_SPI_SCK_GPIO_PORT, SWD_SPI_SCK_SOURCE, SWD_SPI_SCK_AF);
-  // GPIO_PinAFConfig(SWD_SPI_MISO_GPIO_PORT, SWD_SPI_MISO_SOURCE, SWD_SPI_MISO_AF);
+  GPIO_PinAFConfig(SWD_SPI_SCK_GPIO_PORT, SWD_SPI_SCK_SOURCE, SWD_SPI_SCK_AF);
+  GPIO_PinAFConfig(SWD_SPI_MISO_GPIO_PORT, SWD_SPI_MISO_SOURCE, SWD_SPI_MISO_AF);
 
-  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  // GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
 
-  // GPIO_InitStructure.GPIO_Pin = SWD_SPI_SCK_PIN;
-  // GPIO_Init(SWD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Pin = SWD_SPI_SCK_PIN;
+  GPIO_Init(SWD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
 
-  // /* In bi-directional mode only MISO is used */
-  // GPIO_InitStructure.GPIO_Pin =  SWD_SPI_MISO_PIN;
-  // GPIO_Init(SWD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
+  /* In bi-directional mode only MISO is used */
+  GPIO_InitStructure.GPIO_Pin =  SWD_SPI_MISO_PIN;
+  GPIO_Init(SWD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
 
 }
 
 static void initSPI(void) {
-  //COMMENTED FIRMWARE
-  // SPI_InitTypeDef  SPI_InitStructure;
 
-  // initGPIO();
+  SPI_InitTypeDef  SPI_InitStructure;
 
-  // /* Set up SPI in bi-directional mode */
-  // SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
-  // SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
-  // SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
-  // SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
-  // SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
-  // SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
-  // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
+  initGPIO();
 
-  // SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
-  // SPI_InitStructure.SPI_CRCPolynomial = 7;
-  // SPI_Init(SWD_SPI, &SPI_InitStructure);
+  /* Set up SPI in bi-directional mode */
+  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
+  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
+  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
 
-  // SPI_Cmd(SWD_SPI, ENABLE);
+  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+  SPI_InitStructure.SPI_CRCPolynomial = 7;
+  SPI_Init(SWD_SPI, &SPI_InitStructure);
+
+  SPI_Cmd(SWD_SPI, ENABLE);
 }
 
 //Initialize the green led pin as output
@@ -104,8 +103,8 @@ void swdInit()
 {
   if(isInit)
     return;
-  //COMMENTED FIRMWARE
-  // initSPI();
+
+  initSPI();
 
   isInit = true;
 }
@@ -142,64 +141,64 @@ bool swdTest(void) {
   // Should read out (and does):0x0BB11477 (according to OpenOCD)
   //T ACK |------------DATA--------------|P
   //? 100 111011100010100010001101110100001
-//COMMENTED FIRMWARE
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-// #if 0
-//   tx_data[idx++] = 0x9E;
-//   tx_data[idx++] = 0xE7;
-// #else
-//   tx_data[idx++] = 0x79;
-//   tx_data[idx++] = 0xE7;
-// #endif
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFF;
-//   tx_data[idx++] = 0xFC;
-//   tx_data[idx++] = header;
-//   // Rest is 0x00
-
-//   /* As long as the SPI is enabled in bi-di mode the clock is enabled. So
-//    * we write data as normal, but when reading there's no need to output any
-//    * data to trigger the clock. Direction needs to be set accordingly.
-//    */
-
-//   while(number_of_txd_bytes < transfer_size)
-//   {
-//     if (number_of_txd_bytes < idx)
-//     {
-//       SPI_BiDirectionalLineConfig(SWD_SPI, SPI_Direction_Tx);
-
-//       /*!< Loop while DR register in not emplty */
-//       while (SPI_I2S_GetFlagStatus(SWD_SPI, SPI_I2S_FLAG_TXE) == RESET);
-
-//       SPI_I2S_SendData(SWD_SPI, tx_data[number_of_txd_bytes]);
-
-//       // Make sure that we have sent data in case next loop will be RX, the
-//       // mode is switched before we manage to send the data!
-//       while (SPI_I2S_GetFlagStatus(SWD_SPI, SPI_I2S_FLAG_BSY) == SET);
-//     }
-//     else
-//     {
-//       SPI_BiDirectionalLineConfig(SWD_SPI, SPI_Direction_Rx);
-//       while (SPI_I2S_GetFlagStatus(SWD_SPI, SPI_I2S_FLAG_RXNE) == RESET);
-
-//       /*!< Return the byte read from the SPI bus */
-//       rx_data[number_of_txd_bytes] = (uint8_t) SPI_I2S_ReceiveData(SWD_SPI);
-//     }
-//     number_of_txd_bytes++;
-//   }
-//   SPI_Cmd(SWD_SPI, DISABLE);
+
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+#if 0
+  tx_data[idx++] = 0x9E;
+  tx_data[idx++] = 0xE7;
+#else
+  tx_data[idx++] = 0x79;
+  tx_data[idx++] = 0xE7;
+#endif
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFF;
+  tx_data[idx++] = 0xFC;
+  tx_data[idx++] = header;
+  // Rest is 0x00
+
+  /* As long as the SPI is enabled in bi-di mode the clock is enabled. So
+   * we write data as normal, but when reading there's no need to output any
+   * data to trigger the clock. Direction needs to be set accordingly.
+   */
+
+  while(number_of_txd_bytes < transfer_size)
+  {
+    if (number_of_txd_bytes < idx)
+    {
+      SPI_BiDirectionalLineConfig(SWD_SPI, SPI_Direction_Tx);
+
+      /*!< Loop while DR register in not emplty */
+      while (SPI_I2S_GetFlagStatus(SWD_SPI, SPI_I2S_FLAG_TXE) == RESET);
+
+      SPI_I2S_SendData(SWD_SPI, tx_data[number_of_txd_bytes]);
+
+      // Make sure that we have sent data in case next loop will be RX, the
+      // mode is switched before we manage to send the data!
+      while (SPI_I2S_GetFlagStatus(SWD_SPI, SPI_I2S_FLAG_BSY) == SET);
+    }
+    else
+    {
+      SPI_BiDirectionalLineConfig(SWD_SPI, SPI_Direction_Rx);
+      while (SPI_I2S_GetFlagStatus(SWD_SPI, SPI_I2S_FLAG_RXNE) == RESET);
+
+      /*!< Return the byte read from the SPI bus */
+      rx_data[number_of_txd_bytes] = (uint8_t) SPI_I2S_ReceiveData(SWD_SPI);
+    }
+    number_of_txd_bytes++;
+  }
+  SPI_Cmd(SWD_SPI, DISABLE);
   return isInit;
 }
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart1.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart1.c
index dabca42bb..213cce235 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart1.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart1.c
@@ -109,76 +109,74 @@ static void uart1DmaInit(void)
 }
 
 void uart1Init(const uint32_t baudrate) {
-  //COMMENTED FIRMWARE
-  //uart1InitWithParity(baudrate, uart1ParityNone);
+  uart1InitWithParity(baudrate, uart1ParityNone);
 }
 
 void uart1InitWithParity(const uint32_t baudrate, const uart1Parity_t parity)
 {
-  //COMMENTED FIRMWARE
 
-  // USART_InitTypeDef USART_InitStructure;
-  // GPIO_InitTypeDef GPIO_InitStructure;
-  // NVIC_InitTypeDef NVIC_InitStructure;
-
-  // /* Enable GPIO and USART clock */
-  // RCC_AHB1PeriphClockCmd(UART1_GPIO_PERIF, ENABLE);
-  // ENABLE_UART1_RCC(UART1_PERIF, ENABLE);
-
-  // /* Configure USART Rx as input floating */
-  // GPIO_InitStructure.GPIO_Pin   = UART1_GPIO_RX_PIN;
-  // GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
-  // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-  // GPIO_Init(UART1_GPIO_PORT, &GPIO_InitStructure);
-
-  // /* Configure USART Tx as alternate function */
-  // GPIO_InitStructure.GPIO_Pin   = UART1_GPIO_TX_PIN;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
-  // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  // GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
-  // GPIO_Init(UART1_GPIO_PORT, &GPIO_InitStructure);
-
-  // //Map uart to alternate functions
-  // GPIO_PinAFConfig(UART1_GPIO_PORT, UART1_GPIO_AF_TX_PIN, UART1_GPIO_AF_TX);
-  // GPIO_PinAFConfig(UART1_GPIO_PORT, UART1_GPIO_AF_RX_PIN, UART1_GPIO_AF_RX);
+  USART_InitTypeDef USART_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
 
-  // USART_InitStructure.USART_BaudRate            = baudrate;
-  // USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
-  // if (parity == uart1ParityEven || parity == uart1ParityOdd) {
-  //   USART_InitStructure.USART_WordLength        = USART_WordLength_9b;
-  // } else {
-  //   USART_InitStructure.USART_WordLength        = USART_WordLength_8b;
-  // }
+  /* Enable GPIO and USART clock */
+  RCC_AHB1PeriphClockCmd(UART1_GPIO_PERIF, ENABLE);
+  ENABLE_UART1_RCC(UART1_PERIF, ENABLE);
+
+  /* Configure USART Rx as input floating */
+  GPIO_InitStructure.GPIO_Pin   = UART1_GPIO_RX_PIN;
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_Init(UART1_GPIO_PORT, &GPIO_InitStructure);
+
+  /* Configure USART Tx as alternate function */
+  GPIO_InitStructure.GPIO_Pin   = UART1_GPIO_TX_PIN;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+  GPIO_Init(UART1_GPIO_PORT, &GPIO_InitStructure);
+
+  //Map uart to alternate functions
+  GPIO_PinAFConfig(UART1_GPIO_PORT, UART1_GPIO_AF_TX_PIN, UART1_GPIO_AF_TX);
+  GPIO_PinAFConfig(UART1_GPIO_PORT, UART1_GPIO_AF_RX_PIN, UART1_GPIO_AF_RX);
+
+  USART_InitStructure.USART_BaudRate            = baudrate;
+  USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
+  if (parity == uart1ParityEven || parity == uart1ParityOdd) {
+    USART_InitStructure.USART_WordLength        = USART_WordLength_9b;
+  } else {
+    USART_InitStructure.USART_WordLength        = USART_WordLength_8b;
+  }
 
-  // USART_InitStructure.USART_StopBits            = USART_StopBits_1;
+  USART_InitStructure.USART_StopBits            = USART_StopBits_1;
 
-  // if (parity == uart1ParityEven) {
-  //   USART_InitStructure.USART_Parity            = USART_Parity_Even;
-  // } else if (parity == uart1ParityOdd) {
-  //   USART_InitStructure.USART_Parity            = USART_Parity_Odd;
-  // } else {
-  //   USART_InitStructure.USART_Parity            = USART_Parity_No;
-  // }
+  if (parity == uart1ParityEven) {
+    USART_InitStructure.USART_Parity            = USART_Parity_Even;
+  } else if (parity == uart1ParityOdd) {
+    USART_InitStructure.USART_Parity            = USART_Parity_Odd;
+  } else {
+    USART_InitStructure.USART_Parity            = USART_Parity_No;
+  }
 
-  // USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
-  // USART_Init(UART1_TYPE, &USART_InitStructure);
+  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+  USART_Init(UART1_TYPE, &USART_InitStructure);
 
-  // uart1DmaInit();
+  uart1DmaInit();
 
-  // NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQ;
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_MID_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQ;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_MID_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // uart1queue = STATIC_MEM_QUEUE_CREATE(uart1queue);
+  uart1queue = STATIC_MEM_QUEUE_CREATE(uart1queue);
 
-  // USART_ITConfig(UART1_TYPE, USART_IT_RXNE, ENABLE);
+  USART_ITConfig(UART1_TYPE, USART_IT_RXNE, ENABLE);
 
-  // //Enable UART
-  // USART_Cmd(UART1_TYPE, ENABLE);
+  //Enable UART
+  USART_Cmd(UART1_TYPE, ENABLE);
 
-  // USART_ITConfig(UART1_TYPE, USART_IT_RXNE, ENABLE);
+  USART_ITConfig(UART1_TYPE, USART_IT_RXNE, ENABLE);
 
   isInit = true;
 }
@@ -206,17 +204,16 @@ bool uart1GetDataWithDefaultTimeout(uint8_t *c)
 
 void uart1SendData(uint32_t size, uint8_t* data)
 {
-  //COMMENTED FIRMWARE
-  // uint32_t i;
+  uint32_t i;
 
-  // if (!isInit)
-  //   return;
+  if (!isInit)
+    return;
 
-  // for(i = 0; i < size; i++)
-  // {
-  //   while (!(UART1_TYPE->SR & USART_FLAG_TXE));
-  //   UART1_TYPE->DR = (data[i] & 0x00FF);
-  // }
+  for(i = 0; i < size; i++)
+  {
+    while (!(UART1_TYPE->SR & USART_FLAG_TXE));
+    UART1_TYPE->DR = (data[i] & 0x00FF);
+  }
 }
 
 #ifdef ENABLE_UART1_DMA
@@ -249,8 +246,7 @@ void uart1SendDataDmaBlocking(uint32_t size, uint8_t* data)
 
 int uart1Putchar(int ch)
 {
-    //COMMENTED FIRMWARE
-    //uart1SendData(1, (uint8_t *)&ch);
+    uart1SendData(1, (uint8_t *)&ch);
 
     return (unsigned char)ch;
 }
@@ -285,23 +281,22 @@ void __attribute__((used)) DMA1_Stream3_IRQHandler(void)
 
 void __attribute__((used)) USART3_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t rxData;
-  // portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
-
-  // if (USART_GetITStatus(UART1_TYPE, USART_IT_RXNE))
-  // {
-  //   rxData = USART_ReceiveData(UART1_TYPE) & 0x00FF;
-  //   xQueueSendFromISR(uart1queue, &rxData, &xHigherPriorityTaskWoken);
-  // } else {
-  //   /** if we get here, the error is most likely caused by an overrun!
-  //    * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun error)
-  //    * - and IDLE (Idle line detected) pending bits are cleared by software sequence:
-  //    * - reading USART_SR register followed reading the USART_DR register.
-  //    */
-  //   asm volatile ("" : "=m" (UART1_TYPE->SR) : "r" (UART1_TYPE->SR)); // force non-optimizable reads
-  //   asm volatile ("" : "=m" (UART1_TYPE->DR) : "r" (UART1_TYPE->DR)); // of these two registers
-
-  //   hasOverrun = true;
-  // }
+  uint8_t rxData;
+  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+  if (USART_GetITStatus(UART1_TYPE, USART_IT_RXNE))
+  {
+    rxData = USART_ReceiveData(UART1_TYPE) & 0x00FF;
+    xQueueSendFromISR(uart1queue, &rxData, &xHigherPriorityTaskWoken);
+  } else {
+    /** if we get here, the error is most likely caused by an overrun!
+     * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun error)
+     * - and IDLE (Idle line detected) pending bits are cleared by software sequence:
+     * - reading USART_SR register followed reading the USART_DR register.
+     */
+    asm volatile ("" : "=m" (UART1_TYPE->SR) : "r" (UART1_TYPE->SR)); // force non-optimizable reads
+    asm volatile ("" : "=m" (UART1_TYPE->DR) : "r" (UART1_TYPE->DR)); // of these two registers
+
+    hasOverrun = true;
+  }
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart2.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart2.c
index 3eca14c49..53419a3ae 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart2.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart2.c
@@ -83,113 +83,111 @@ static bool hasOverrun = false;
   */
 static void uart2DmaInit(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_InitTypeDef NVIC_InitStructure;
-
-  // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
-
-  // // USART TX DMA Channel Config
-  // DMA_InitStructureShare.DMA_PeripheralBaseAddr = (uint32_t)&UART2_TYPE->DR;
-  // DMA_InitStructureShare.DMA_Memory0BaseAddr = (uint32_t)dmaBuffer;
-  // DMA_InitStructureShare.DMA_MemoryInc = DMA_MemoryInc_Enable;
-  // DMA_InitStructureShare.DMA_MemoryBurst = DMA_MemoryBurst_Single;
-  // DMA_InitStructureShare.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
-  // DMA_InitStructureShare.DMA_BufferSize = 0;
-  // DMA_InitStructureShare.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-  // DMA_InitStructureShare.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
-  // DMA_InitStructureShare.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
-  // DMA_InitStructureShare.DMA_DIR = DMA_DIR_MemoryToPeripheral;
-  // DMA_InitStructureShare.DMA_Mode = DMA_Mode_Normal;
-  // DMA_InitStructureShare.DMA_FIFOMode = DMA_FIFOMode_Disable;
-  // DMA_InitStructureShare.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
-  // DMA_InitStructureShare.DMA_Channel = UART2_DMA_CH;
-  // #ifdef UART2_LINK_COMM
-  // DMA_InitStructureShare.DMA_Priority = DMA_Priority_High;
-  // #else
-  // DMA_InitStructureShare.DMA_Priority = DMA_Priority_Low;
-  // #endif
-
-  // NVIC_InitStructure.NVIC_IRQChannel = UART2_DMA_IRQ;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // #ifdef UART2_LINK_COMM
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI;
-  // #else
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_MID_PRI;
-  // #endif
-  // NVIC_Init(&NVIC_InitStructure);
-
-  // isUartDmaInitialized = true;
+  NVIC_InitTypeDef NVIC_InitStructure;
+
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
+
+  // USART TX DMA Channel Config
+  DMA_InitStructureShare.DMA_PeripheralBaseAddr = (uint32_t)&UART2_TYPE->DR;
+  DMA_InitStructureShare.DMA_Memory0BaseAddr = (uint32_t)dmaBuffer;
+  DMA_InitStructureShare.DMA_MemoryInc = DMA_MemoryInc_Enable;
+  DMA_InitStructureShare.DMA_MemoryBurst = DMA_MemoryBurst_Single;
+  DMA_InitStructureShare.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+  DMA_InitStructureShare.DMA_BufferSize = 0;
+  DMA_InitStructureShare.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+  DMA_InitStructureShare.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+  DMA_InitStructureShare.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
+  DMA_InitStructureShare.DMA_DIR = DMA_DIR_MemoryToPeripheral;
+  DMA_InitStructureShare.DMA_Mode = DMA_Mode_Normal;
+  DMA_InitStructureShare.DMA_FIFOMode = DMA_FIFOMode_Disable;
+  DMA_InitStructureShare.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
+  DMA_InitStructureShare.DMA_Channel = UART2_DMA_CH;
+  #ifdef UART2_LINK_COMM
+  DMA_InitStructureShare.DMA_Priority = DMA_Priority_High;
+  #else
+  DMA_InitStructureShare.DMA_Priority = DMA_Priority_Low;
+  #endif
+
+  NVIC_InitStructure.NVIC_IRQChannel = UART2_DMA_IRQ;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  #ifdef UART2_LINK_COMM
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI;
+  #else
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_MID_PRI;
+  #endif
+  NVIC_Init(&NVIC_InitStructure);
+
+  isUartDmaInitialized = true;
 }
 
 void uart2Init(const uint32_t baudrate)
 {
-  //COMMENTED FIRMWARE
-
-  // USART_InitTypeDef USART_InitStructure;
-  // GPIO_InitTypeDef GPIO_InitStructure;
-  // NVIC_InitTypeDef NVIC_InitStructure;
-
-  // // initialize the FreeRTOS structures first, to prevent null pointers in interrupts
-  // waitUntilSendDone = xSemaphoreCreateBinaryStatic(&waitUntilSendDoneBuffer); // initialized as blocking
-  // uartBusy = xSemaphoreCreateBinaryStatic(&uartBusyBuffer); // initialized as blocking
-  // xSemaphoreGive(uartBusy); // but we give it because the uart isn't busy at initialization
-
-  // /* Enable GPIO and USART clock */
-  // RCC_AHB1PeriphClockCmd(UART2_GPIO_PERIF, ENABLE);
-  // ENABLE_UART2_RCC(UART2_PERIF, ENABLE);
-
-  // /* Configure USART Rx as input floating */
-  // GPIO_InitStructure.GPIO_Pin   = UART2_GPIO_RX_PIN;
-  // GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
-  // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-  // GPIO_Init(UART2_GPIO_PORT, &GPIO_InitStructure);
-
-  // /* Configure USART Tx as alternate function */
-  // GPIO_InitStructure.GPIO_Pin   = UART2_GPIO_TX_PIN;
-  // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
-  // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  // GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
-  // GPIO_Init(UART2_GPIO_PORT, &GPIO_InitStructure);
-
-  // //Map uart to alternate functions
-  // GPIO_PinAFConfig(UART2_GPIO_PORT, UART2_GPIO_AF_TX_PIN, UART2_GPIO_AF_TX);
-  // GPIO_PinAFConfig(UART2_GPIO_PORT, UART2_GPIO_AF_RX_PIN, UART2_GPIO_AF_RX);
-
-  // USART_InitStructure.USART_BaudRate            = baudrate;
-  // USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
-  // USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
-  // USART_InitStructure.USART_StopBits            = USART_StopBits_1;
-  // USART_InitStructure.USART_Parity              = USART_Parity_No ;
-  // USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
-  // USART_Init(UART2_TYPE, &USART_InitStructure);
-
-  // uart2DmaInit();
-
-  // // Configure Rx buffer not empty interrupt
-  // NVIC_InitStructure.NVIC_IRQChannel = UART2_IRQ;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // #ifdef UART2_LINK_COMM
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_SYSLINK_PRI;
-  // #else
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_MID_PRI;
-  // #endif
-  // NVIC_Init(&NVIC_InitStructure);
-
-  // #ifdef UART2_LINK_COMM
-  // uart2PacketDelivery = STATIC_MEM_QUEUE_CREATE(uart2PacketDelivery);
-  // DEBUG_QUEUE_MONITOR_REGISTER(uart2PacketDelivery);
-  // #else
-  // uart2queue = STATIC_MEM_QUEUE_CREATE(uart2queue);
-  // #endif
-
-  // USART_ITConfig(UART2_TYPE, USART_IT_RXNE, ENABLE);
-
-  // //Enable UART
-  // USART_Cmd(UART2_TYPE, ENABLE);
-
-  // USART_ITConfig(UART2_TYPE, USART_IT_RXNE, ENABLE);
+
+  USART_InitTypeDef USART_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
+
+  // initialize the FreeRTOS structures first, to prevent null pointers in interrupts
+  waitUntilSendDone = xSemaphoreCreateBinaryStatic(&waitUntilSendDoneBuffer); // initialized as blocking
+  uartBusy = xSemaphoreCreateBinaryStatic(&uartBusyBuffer); // initialized as blocking
+  xSemaphoreGive(uartBusy); // but we give it because the uart isn't busy at initialization
+
+  /* Enable GPIO and USART clock */
+  RCC_AHB1PeriphClockCmd(UART2_GPIO_PERIF, ENABLE);
+  ENABLE_UART2_RCC(UART2_PERIF, ENABLE);
+
+  /* Configure USART Rx as input floating */
+  GPIO_InitStructure.GPIO_Pin   = UART2_GPIO_RX_PIN;
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_Init(UART2_GPIO_PORT, &GPIO_InitStructure);
+
+  /* Configure USART Tx as alternate function */
+  GPIO_InitStructure.GPIO_Pin   = UART2_GPIO_TX_PIN;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+  GPIO_Init(UART2_GPIO_PORT, &GPIO_InitStructure);
+
+  //Map uart to alternate functions
+  GPIO_PinAFConfig(UART2_GPIO_PORT, UART2_GPIO_AF_TX_PIN, UART2_GPIO_AF_TX);
+  GPIO_PinAFConfig(UART2_GPIO_PORT, UART2_GPIO_AF_RX_PIN, UART2_GPIO_AF_RX);
+
+  USART_InitStructure.USART_BaudRate            = baudrate;
+  USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
+  USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
+  USART_InitStructure.USART_StopBits            = USART_StopBits_1;
+  USART_InitStructure.USART_Parity              = USART_Parity_No ;
+  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+  USART_Init(UART2_TYPE, &USART_InitStructure);
+
+  uart2DmaInit();
+
+  // Configure Rx buffer not empty interrupt
+  NVIC_InitStructure.NVIC_IRQChannel = UART2_IRQ;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  #ifdef UART2_LINK_COMM
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_SYSLINK_PRI;
+  #else
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_MID_PRI;
+  #endif
+  NVIC_Init(&NVIC_InitStructure);
+
+  #ifdef UART2_LINK_COMM
+  uart2PacketDelivery = STATIC_MEM_QUEUE_CREATE(uart2PacketDelivery);
+  DEBUG_QUEUE_MONITOR_REGISTER(uart2PacketDelivery);
+  #else
+  uart2queue = STATIC_MEM_QUEUE_CREATE(uart2queue);
+  #endif
+
+  USART_ITConfig(UART2_TYPE, USART_IT_RXNE, ENABLE);
+
+  //Enable UART
+  USART_Cmd(UART2_TYPE, ENABLE);
+
+  USART_ITConfig(UART2_TYPE, USART_IT_RXNE, ENABLE);
 
   isInit = true;
 }
@@ -201,50 +199,47 @@ bool uart2Test(void)
 
 void uart2SendData(uint32_t size, uint8_t* data)
 {
-  //COMMENTED FIRMWARE
-  // uint32_t i;
+  uint32_t i;
 
-  // if (!isInit)
-  //   return;
+  if (!isInit)
+    return;
 
-  // for(i = 0; i < size; i++)
-  // {
-  //   while (!(UART2_TYPE->SR & USART_FLAG_TXE));
-  //   UART2_TYPE->DR = (data[i] & 0x00FF);
-  // }
+  for(i = 0; i < size; i++)
+  {
+    while (!(UART2_TYPE->SR & USART_FLAG_TXE));
+    UART2_TYPE->DR = (data[i] & 0x00FF);
+  }
 }
 
 void uart2SendDataDmaBlocking(uint32_t size, uint8_t* data)
 {
-  //COMMENTED FIRMWARE
-  // if (isUartDmaInitialized)
-  // {
-  //   xSemaphoreTake(uartBusy, portMAX_DELAY);
-  //   // Wait for DMA to be free
-  //   while(DMA_GetCmdStatus(UART2_DMA_STREAM) != DISABLE);
-  //   //Copy data in DMA buffer
-  //   memcpy(dmaBuffer, data, size);
-  //   DMA_InitStructureShare.DMA_BufferSize = size;
-  //   initialDMACount = size;
-  //   // Init new DMA stream
-  //   DMA_Init(UART2_DMA_STREAM, &DMA_InitStructureShare);
-  //   // Enable the Transfer Complete interrupt
-  //   DMA_ITConfig(UART2_DMA_STREAM, DMA_IT_TC, ENABLE);
-  //   /* Enable USART DMA TX Requests */
-  //   USART_DMACmd(UART2_TYPE, USART_DMAReq_Tx, ENABLE);
-  //   /* Clear transfer complete */
-  //   USART_ClearFlag(UART2_TYPE, USART_FLAG_TC);
-  //   /* Enable DMA USART TX Stream */
-  //   DMA_Cmd(UART2_DMA_STREAM, ENABLE);
-  //   xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
-  //   xSemaphoreGive(uartBusy);
-  // }
+  if (isUartDmaInitialized)
+  {
+    xSemaphoreTake(uartBusy, portMAX_DELAY);
+    // Wait for DMA to be free
+    while(DMA_GetCmdStatus(UART2_DMA_STREAM) != DISABLE);
+    //Copy data in DMA buffer
+    memcpy(dmaBuffer, data, size);
+    DMA_InitStructureShare.DMA_BufferSize = size;
+    initialDMACount = size;
+    // Init new DMA stream
+    DMA_Init(UART2_DMA_STREAM, &DMA_InitStructureShare);
+    // Enable the Transfer Complete interrupt
+    DMA_ITConfig(UART2_DMA_STREAM, DMA_IT_TC, ENABLE);
+    /* Enable USART DMA TX Requests */
+    USART_DMACmd(UART2_TYPE, USART_DMAReq_Tx, ENABLE);
+    /* Clear transfer complete */
+    USART_ClearFlag(UART2_TYPE, USART_FLAG_TC);
+    /* Enable DMA USART TX Stream */
+    DMA_Cmd(UART2_DMA_STREAM, ENABLE);
+    xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
+    xSemaphoreGive(uartBusy);
+  }
 }
 
 int uart2Putchar(int ch)
 {
-  //COMMENTED FIRMWARE
-    //uart2SendData(1, (uint8_t *)&ch);
+    uart2SendData(1, (uint8_t *)&ch);
 
     return (unsigned char)ch;
 }
@@ -368,16 +363,15 @@ bool uart2DidOverrun()
 
 void __attribute__((used)) DMA1_Stream6_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 
-  // // Stop and cleanup DMA stream
-  // DMA_ITConfig(UART2_DMA_STREAM, DMA_IT_TC, DISABLE);
-  // DMA_ClearITPendingBit(UART2_DMA_STREAM, UART2_DMA_FLAG_TCIF);
-  // USART_DMACmd(UART2_TYPE, USART_DMAReq_Tx, DISABLE);
-  // DMA_Cmd(UART2_DMA_STREAM, DISABLE);
+  // Stop and cleanup DMA stream
+  DMA_ITConfig(UART2_DMA_STREAM, DMA_IT_TC, DISABLE);
+  DMA_ClearITPendingBit(UART2_DMA_STREAM, UART2_DMA_FLAG_TCIF);
+  USART_DMACmd(UART2_TYPE, USART_DMAReq_Tx, DISABLE);
+  DMA_Cmd(UART2_DMA_STREAM, DISABLE);
 
-  // xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
+  xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
 }
 
 #ifdef UART2_LINK_COMM
@@ -409,27 +403,26 @@ void __attribute__((used)) USART2_IRQHandler(void)
 
 void __attribute__((used)) USART2_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t rxData;
-  // portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
-
-  // if ((UART2_TYPE->SR & (1<<5)) != 0) // fast check if the RXNE interrupt has occurred
-  // {
-  //   rxData = USART_ReceiveData(UART2_TYPE) & 0x00FF;
-  //   xQueueSendFromISR(uart2queue, &rxData, &xHigherPriorityTaskWoken);
-  // }
-  // else
-  // {
-  //   /** if we get here, the error is most likely caused by an overrun!
-  //    * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun error)
-  //    * - and IDLE (Idle line detected) pending bits are cleared by software sequence:
-  //    * - reading USART_SR register followed reading the USART_DR register.
-  //    */
-  //   asm volatile ("" : "=m" (UART2_TYPE->SR) : "r" (UART2_TYPE->SR)); // force non-optimizable reads
-  //   asm volatile ("" : "=m" (UART2_TYPE->DR) : "r" (UART2_TYPE->DR)); // of these two registers
-
-  //   hasOverrun = true;
-  // }
+  uint8_t rxData;
+  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+  if ((UART2_TYPE->SR & (1<<5)) != 0) // fast check if the RXNE interrupt has occurred
+  {
+    rxData = USART_ReceiveData(UART2_TYPE) & 0x00FF;
+    xQueueSendFromISR(uart2queue, &rxData, &xHigherPriorityTaskWoken);
+  }
+  else
+  {
+    /** if we get here, the error is most likely caused by an overrun!
+     * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun error)
+     * - and IDLE (Idle line detected) pending bits are cleared by software sequence:
+     * - reading USART_SR register followed reading the USART_DR register.
+     */
+    asm volatile ("" : "=m" (UART2_TYPE->SR) : "r" (UART2_TYPE->SR)); // force non-optimizable reads
+    asm volatile ("" : "=m" (UART2_TYPE->DR) : "r" (UART2_TYPE->DR)); // of these two registers
+
+    hasOverrun = true;
+  }
 }
 
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart_syslink.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart_syslink.c
index c960da880..fd5df3e31 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart_syslink.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/uart_syslink.c
@@ -83,118 +83,116 @@ static void uartslkResumeDma();
   */
 void uartslkDmaInit(void)
 {
-  //COMMENTED FIRMWARE
-  // NVIC_InitTypeDef NVIC_InitStructure;
-
-  // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
-
-  // // USART TX DMA Channel Config
-  // DMA_InitStructureShare.DMA_PeripheralBaseAddr = (uint32_t)&UARTSLK_TYPE->DR;
-  // DMA_InitStructureShare.DMA_Memory0BaseAddr = (uint32_t)dmaBuffer;
-  // DMA_InitStructureShare.DMA_MemoryInc = DMA_MemoryInc_Enable;
-  // DMA_InitStructureShare.DMA_MemoryBurst = DMA_MemoryBurst_Single;
-  // DMA_InitStructureShare.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
-  // DMA_InitStructureShare.DMA_BufferSize = 0;
-  // DMA_InitStructureShare.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-  // DMA_InitStructureShare.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
-  // DMA_InitStructureShare.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
-  // DMA_InitStructureShare.DMA_DIR = DMA_DIR_MemoryToPeripheral;
-  // DMA_InitStructureShare.DMA_Mode = DMA_Mode_Normal;
-  // DMA_InitStructureShare.DMA_Priority = DMA_Priority_High;
-  // DMA_InitStructureShare.DMA_FIFOMode = DMA_FIFOMode_Disable;
-  // DMA_InitStructureShare.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
-  // DMA_InitStructureShare.DMA_Channel = UARTSLK_DMA_CH;
-
-  // NVIC_InitStructure.NVIC_IRQChannel = UARTSLK_DMA_IRQ;
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // NVIC_Init(&NVIC_InitStructure);
-
-  // isUartDmaInitialized = true;
+  NVIC_InitTypeDef NVIC_InitStructure;
+
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
+
+  // USART TX DMA Channel Config
+  DMA_InitStructureShare.DMA_PeripheralBaseAddr = (uint32_t)&UARTSLK_TYPE->DR;
+  DMA_InitStructureShare.DMA_Memory0BaseAddr = (uint32_t)dmaBuffer;
+  DMA_InitStructureShare.DMA_MemoryInc = DMA_MemoryInc_Enable;
+  DMA_InitStructureShare.DMA_MemoryBurst = DMA_MemoryBurst_Single;
+  DMA_InitStructureShare.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+  DMA_InitStructureShare.DMA_BufferSize = 0;
+  DMA_InitStructureShare.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+  DMA_InitStructureShare.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+  DMA_InitStructureShare.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
+  DMA_InitStructureShare.DMA_DIR = DMA_DIR_MemoryToPeripheral;
+  DMA_InitStructureShare.DMA_Mode = DMA_Mode_Normal;
+  DMA_InitStructureShare.DMA_Priority = DMA_Priority_High;
+  DMA_InitStructureShare.DMA_FIFOMode = DMA_FIFOMode_Disable;
+  DMA_InitStructureShare.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
+  DMA_InitStructureShare.DMA_Channel = UARTSLK_DMA_CH;
+
+  NVIC_InitStructure.NVIC_IRQChannel = UARTSLK_DMA_IRQ;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_HIGH_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
+
+  isUartDmaInitialized = true;
 }
 
 void uartslkInit(void)
 {
-  //COMMENTED FIRMWARE
-//   // initialize the FreeRTOS structures first, to prevent null pointers in interrupts
-//   waitUntilSendDone = xSemaphoreCreateBinaryStatic(&waitUntilSendDoneBuffer); // initialized as blocking
-//   uartBusy = xSemaphoreCreateBinaryStatic(&uartBusyBuffer); // initialized as blocking
-//   xSemaphoreGive(uartBusy); // but we give it because the uart isn't busy at initialization
-
-//   syslinkPacketDelivery = STATIC_MEM_QUEUE_CREATE(syslinkPacketDelivery);
-//   DEBUG_QUEUE_MONITOR_REGISTER(syslinkPacketDelivery);
-
-//   USART_InitTypeDef USART_InitStructure;
-//   GPIO_InitTypeDef GPIO_InitStructure;
-//   NVIC_InitTypeDef NVIC_InitStructure;
-//   EXTI_InitTypeDef extiInit;
-
-//   /* Enable GPIO and USART clock */
-//   RCC_AHB1PeriphClockCmd(UARTSLK_GPIO_PERIF, ENABLE);
-//   ENABLE_UARTSLK_RCC(UARTSLK_PERIF, ENABLE);
-
-//   /* Configure USART Rx as input floating */
-//   GPIO_InitStructure.GPIO_Pin   = UARTSLK_GPIO_RX_PIN;
-//   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
-//   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-//   GPIO_Init(UARTSLK_GPIO_PORT, &GPIO_InitStructure);
-
-//   /* Configure USART Tx as alternate function */
-//   GPIO_InitStructure.GPIO_Pin   = UARTSLK_GPIO_TX_PIN;
-//   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
-//   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-//   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
-//   GPIO_Init(UARTSLK_GPIO_PORT, &GPIO_InitStructure);
-
-//   //Map uartslk to alternate functions
-//   GPIO_PinAFConfig(UARTSLK_GPIO_PORT, UARTSLK_GPIO_AF_TX_PIN, UARTSLK_GPIO_AF_TX);
-//   GPIO_PinAFConfig(UARTSLK_GPIO_PORT, UARTSLK_GPIO_AF_RX_PIN, UARTSLK_GPIO_AF_RX);
-
-// #if defined(UARTSLK_OUTPUT_TRACE_DATA) || defined(ADC_OUTPUT_RAW_DATA) || defined(IMU_OUTPUT_RAW_DATA_ON_UART)
-//   USART_InitStructure.USART_BaudRate            = 2000000;
-//   USART_InitStructure.USART_Mode                = USART_Mode_Tx;
-// #else
-//   USART_InitStructure.USART_BaudRate            = 1000000;
-//   USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
-// #endif
-//   USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
-//   USART_InitStructure.USART_StopBits            = USART_StopBits_1;
-//   USART_InitStructure.USART_Parity              = USART_Parity_No ;
-//   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
-//   USART_Init(UARTSLK_TYPE, &USART_InitStructure);
-
-//   uartslkDmaInit();
-
-//   // Configure Rx buffer not empty interrupt
-//   NVIC_InitStructure.NVIC_IRQChannel = UARTSLK_IRQ;
-//   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_SYSLINK_PRI;
-//   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-//   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-//   NVIC_Init(&NVIC_InitStructure);
-
-//   USART_ITConfig(UARTSLK_TYPE, USART_IT_RXNE, ENABLE);
-
-//   //Setting up TXEN pin (NRF flow control)
-//   RCC_AHB1PeriphClockCmd(UARTSLK_TXEN_PERIF, ENABLE);
-
-//   bzero(&GPIO_InitStructure, sizeof(GPIO_InitStructure));
-//   GPIO_InitStructure.GPIO_Pin = UARTSLK_TXEN_PIN;
-//   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
-//   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-//   GPIO_Init(UARTSLK_TXEN_PORT, &GPIO_InitStructure);
-
-//   extiInit.EXTI_Line = UARTSLK_TXEN_EXTI;
-//   extiInit.EXTI_Mode = EXTI_Mode_Interrupt;
-//   extiInit.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
-//   extiInit.EXTI_LineCmd = ENABLE;
-//   EXTI_Init(&extiInit);
-//   EXTI_ClearITPendingBit(UARTSLK_TXEN_EXTI);
-
-//   NVIC_EnableIRQ(EXTI4_IRQn);
-
-//   //Enable UART
-//   USART_Cmd(UARTSLK_TYPE, ENABLE);
+  // initialize the FreeRTOS structures first, to prevent null pointers in interrupts
+  waitUntilSendDone = xSemaphoreCreateBinaryStatic(&waitUntilSendDoneBuffer); // initialized as blocking
+  uartBusy = xSemaphoreCreateBinaryStatic(&uartBusyBuffer); // initialized as blocking
+  xSemaphoreGive(uartBusy); // but we give it because the uart isn't busy at initialization
+
+  syslinkPacketDelivery = STATIC_MEM_QUEUE_CREATE(syslinkPacketDelivery);
+  DEBUG_QUEUE_MONITOR_REGISTER(syslinkPacketDelivery);
+
+  USART_InitTypeDef USART_InitStructure;
+  GPIO_InitTypeDef GPIO_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
+  EXTI_InitTypeDef extiInit;
+
+  /* Enable GPIO and USART clock */
+  RCC_AHB1PeriphClockCmd(UARTSLK_GPIO_PERIF, ENABLE);
+  ENABLE_UARTSLK_RCC(UARTSLK_PERIF, ENABLE);
+
+  /* Configure USART Rx as input floating */
+  GPIO_InitStructure.GPIO_Pin   = UARTSLK_GPIO_RX_PIN;
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_Init(UARTSLK_GPIO_PORT, &GPIO_InitStructure);
+
+  /* Configure USART Tx as alternate function */
+  GPIO_InitStructure.GPIO_Pin   = UARTSLK_GPIO_TX_PIN;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+  GPIO_Init(UARTSLK_GPIO_PORT, &GPIO_InitStructure);
+
+  //Map uartslk to alternate functions
+  GPIO_PinAFConfig(UARTSLK_GPIO_PORT, UARTSLK_GPIO_AF_TX_PIN, UARTSLK_GPIO_AF_TX);
+  GPIO_PinAFConfig(UARTSLK_GPIO_PORT, UARTSLK_GPIO_AF_RX_PIN, UARTSLK_GPIO_AF_RX);
+
+#if defined(UARTSLK_OUTPUT_TRACE_DATA) || defined(ADC_OUTPUT_RAW_DATA) || defined(IMU_OUTPUT_RAW_DATA_ON_UART)
+  USART_InitStructure.USART_BaudRate            = 2000000;
+  USART_InitStructure.USART_Mode                = USART_Mode_Tx;
+#else
+  USART_InitStructure.USART_BaudRate            = 1000000;
+  USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
+#endif
+  USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
+  USART_InitStructure.USART_StopBits            = USART_StopBits_1;
+  USART_InitStructure.USART_Parity              = USART_Parity_No ;
+  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+  USART_Init(UARTSLK_TYPE, &USART_InitStructure);
+
+  uartslkDmaInit();
+
+  // Configure Rx buffer not empty interrupt
+  NVIC_InitStructure.NVIC_IRQChannel = UARTSLK_IRQ;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_SYSLINK_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
+
+  USART_ITConfig(UARTSLK_TYPE, USART_IT_RXNE, ENABLE);
+
+  //Setting up TXEN pin (NRF flow control)
+  RCC_AHB1PeriphClockCmd(UARTSLK_TXEN_PERIF, ENABLE);
+
+  bzero(&GPIO_InitStructure, sizeof(GPIO_InitStructure));
+  GPIO_InitStructure.GPIO_Pin = UARTSLK_TXEN_PIN;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_Init(UARTSLK_TXEN_PORT, &GPIO_InitStructure);
+
+  extiInit.EXTI_Line = UARTSLK_TXEN_EXTI;
+  extiInit.EXTI_Mode = EXTI_Mode_Interrupt;
+  extiInit.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
+  extiInit.EXTI_LineCmd = ENABLE;
+  EXTI_Init(&extiInit);
+  EXTI_ClearITPendingBit(UARTSLK_TXEN_EXTI);
+
+  NVIC_EnableIRQ(EXTI4_IRQn);
+
+  //Enable UART
+  USART_Cmd(UARTSLK_TYPE, ENABLE);
   isInit = true;
 }
 
@@ -210,273 +208,260 @@ void uartslkGetPacketBlocking(SyslinkPacket* packet)
 
 void uartslkSendData(uint32_t size, uint8_t* data)
 {
-  //COMMENTED FIRMWARE
-//   uint32_t i;
-
-//   if (!isInit)
-//     return;
-
-//   for(i = 0; i < size; i++)
-//   {
-// #ifdef UARTSLK_SPINLOOP_FLOWCTRL
-//     while(GPIO_ReadInputDataBit(UARTSLK_TXEN_PORT, UARTSLK_TXEN_PIN) == Bit_SET);
-// #endif
-//     while (!(UARTSLK_TYPE->SR & USART_FLAG_TXE));
-//     UARTSLK_TYPE->DR = (data[i] & 0x00FF);
-//   }
+  uint32_t i;
+
+  if (!isInit)
+    return;
+
+  for(i = 0; i < size; i++)
+  {
+#ifdef UARTSLK_SPINLOOP_FLOWCTRL
+    while(GPIO_ReadInputDataBit(UARTSLK_TXEN_PORT, UARTSLK_TXEN_PIN) == Bit_SET);
+#endif
+    while (!(UARTSLK_TYPE->SR & USART_FLAG_TXE));
+    UARTSLK_TYPE->DR = (data[i] & 0x00FF);
+  }
 }
 
 void uartslkSendDataIsrBlocking(uint32_t size, uint8_t* data)
 {
-  //COMMENTED FIRMWARE
-  // xSemaphoreTake(uartBusy, portMAX_DELAY);
-  // outDataIsr = data;
-  // dataSizeIsr = size;
-  // dataIndexIsr = 1;
-  // uartslkSendData(1, &data[0]);
-  // USART_ITConfig(UARTSLK_TYPE, USART_IT_TXE, ENABLE);
-  // xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
-  // outDataIsr = 0;
-  // xSemaphoreGive(uartBusy);
+  xSemaphoreTake(uartBusy, portMAX_DELAY);
+  outDataIsr = data;
+  dataSizeIsr = size;
+  dataIndexIsr = 1;
+  uartslkSendData(1, &data[0]);
+  USART_ITConfig(UARTSLK_TYPE, USART_IT_TXE, ENABLE);
+  xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
+  outDataIsr = 0;
+  xSemaphoreGive(uartBusy);
 }
 
 int uartslkPutchar(int ch)
 {
-  //COMMENTED FIRMWARE
-    //uartslkSendData(1, (uint8_t *)&ch);
+    uartslkSendData(1, (uint8_t *)&ch);
 
     return (unsigned char)ch;
 }
 
 void uartslkSendDataDmaBlocking(uint32_t size, uint8_t* data)
 {
-  //COMMENTED FIRMWARE
-  // if (isUartDmaInitialized)
-  // {
-  //   xSemaphoreTake(uartBusy, portMAX_DELAY);
-  //   // Wait for DMA to be free
-  //   while(DMA_GetCmdStatus(UARTSLK_DMA_STREAM) != DISABLE);
-  //   //Copy data in DMA buffer
-  //   memcpy(dmaBuffer, data, size);
-  //   DMA_InitStructureShare.DMA_BufferSize = size;
-  //   initialDMACount = size;
-  //   // Init new DMA stream
-  //   DMA_Init(UARTSLK_DMA_STREAM, &DMA_InitStructureShare);
-  //   // Enable the Transfer Complete interrupt
-  //   DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, ENABLE);
-  //   /* Enable USART DMA TX Requests */
-  //   USART_DMACmd(UARTSLK_TYPE, USART_DMAReq_Tx, ENABLE);
-  //   /* Clear transfer complete */
-  //   USART_ClearFlag(UARTSLK_TYPE, USART_FLAG_TC);
-  //   /* Enable DMA USART TX Stream */
-  //   DMA_Cmd(UARTSLK_DMA_STREAM, ENABLE);
-  //   xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
-  //   xSemaphoreGive(uartBusy);
-  // }
+  if (isUartDmaInitialized)
+  {
+    xSemaphoreTake(uartBusy, portMAX_DELAY);
+    // Wait for DMA to be free
+    while(DMA_GetCmdStatus(UARTSLK_DMA_STREAM) != DISABLE);
+    //Copy data in DMA buffer
+    memcpy(dmaBuffer, data, size);
+    DMA_InitStructureShare.DMA_BufferSize = size;
+    initialDMACount = size;
+    // Init new DMA stream
+    DMA_Init(UARTSLK_DMA_STREAM, &DMA_InitStructureShare);
+    // Enable the Transfer Complete interrupt
+    DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, ENABLE);
+    /* Enable USART DMA TX Requests */
+    USART_DMACmd(UARTSLK_TYPE, USART_DMAReq_Tx, ENABLE);
+    /* Clear transfer complete */
+    USART_ClearFlag(UARTSLK_TYPE, USART_FLAG_TC);
+    /* Enable DMA USART TX Stream */
+    DMA_Cmd(UARTSLK_DMA_STREAM, ENABLE);
+    xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
+    xSemaphoreGive(uartBusy);
+  }
 }
 
 static void uartslkPauseDma()
 {
-  //COMMENTED FIRMWARE
-  // if (DMA_GetCmdStatus(UARTSLK_DMA_STREAM) == ENABLE)
-  // {
-  //   // Disable transfer complete interrupt
-  //   DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, DISABLE);
-  //   // Disable stream to pause it
-  //   DMA_Cmd(UARTSLK_DMA_STREAM, DISABLE);
-  //   // Wait for it to be disabled
-  //   while(DMA_GetCmdStatus(UARTSLK_DMA_STREAM) != DISABLE);
-  //   // Disable transfer complete
-  //   DMA_ClearITPendingBit(UARTSLK_DMA_STREAM, UARTSLK_DMA_FLAG_TCIF);
-  //   // Read remaining data count
-  //   remainingDMACount = DMA_GetCurrDataCounter(UARTSLK_DMA_STREAM);
-  //   dmaIsPaused = true;
-  // }
+  if (DMA_GetCmdStatus(UARTSLK_DMA_STREAM) == ENABLE)
+  {
+    // Disable transfer complete interrupt
+    DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, DISABLE);
+    // Disable stream to pause it
+    DMA_Cmd(UARTSLK_DMA_STREAM, DISABLE);
+    // Wait for it to be disabled
+    while(DMA_GetCmdStatus(UARTSLK_DMA_STREAM) != DISABLE);
+    // Disable transfer complete
+    DMA_ClearITPendingBit(UARTSLK_DMA_STREAM, UARTSLK_DMA_FLAG_TCIF);
+    // Read remaining data count
+    remainingDMACount = DMA_GetCurrDataCounter(UARTSLK_DMA_STREAM);
+    dmaIsPaused = true;
+  }
 }
 
 static void uartslkResumeDma()
 {
-  //COMMENTED FIRMWARE
-  // if (dmaIsPaused)
-  // {
-  //   // Update DMA counter
-  //   DMA_SetCurrDataCounter(UARTSLK_DMA_STREAM, remainingDMACount);
-  //   // Update memory read address
-  //   UARTSLK_DMA_STREAM->M0AR = (uint32_t)&dmaBuffer[initialDMACount - remainingDMACount];
-  //   // Enable the Transfer Complete interrupt
-  //   DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, ENABLE);
-  //   /* Clear transfer complete */
-  //   USART_ClearFlag(UARTSLK_TYPE, USART_FLAG_TC);
-  //   /* Enable DMA USART TX Stream */
-  //   DMA_Cmd(UARTSLK_DMA_STREAM, ENABLE);
-  //   dmaIsPaused = false;
-  // }
+  if (dmaIsPaused)
+  {
+    // Update DMA counter
+    DMA_SetCurrDataCounter(UARTSLK_DMA_STREAM, remainingDMACount);
+    // Update memory read address
+    UARTSLK_DMA_STREAM->M0AR = (uint32_t)&dmaBuffer[initialDMACount - remainingDMACount];
+    // Enable the Transfer Complete interrupt
+    DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, ENABLE);
+    /* Clear transfer complete */
+    USART_ClearFlag(UARTSLK_TYPE, USART_FLAG_TC);
+    /* Enable DMA USART TX Stream */
+    DMA_Cmd(UARTSLK_DMA_STREAM, ENABLE);
+    dmaIsPaused = false;
+  }
 }
 
 void uartslkDmaIsr(void)
 {
-  //COMMENTED FIRMWARE
-  // portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 
-  // // Stop and cleanup DMA stream
-  // DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, DISABLE);
-  // DMA_ClearITPendingBit(UARTSLK_DMA_STREAM, UARTSLK_DMA_FLAG_TCIF);
-  // USART_DMACmd(UARTSLK_TYPE, USART_DMAReq_Tx, DISABLE);
-  // DMA_Cmd(UARTSLK_DMA_STREAM, DISABLE);
+  // Stop and cleanup DMA stream
+  DMA_ITConfig(UARTSLK_DMA_STREAM, DMA_IT_TC, DISABLE);
+  DMA_ClearITPendingBit(UARTSLK_DMA_STREAM, UARTSLK_DMA_FLAG_TCIF);
+  USART_DMACmd(UARTSLK_TYPE, USART_DMAReq_Tx, DISABLE);
+  DMA_Cmd(UARTSLK_DMA_STREAM, DISABLE);
 
-  // remainingDMACount = 0;
-  // xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
+  remainingDMACount = 0;
+  xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
 }
 
 void uartslkHandleDataFromISR(uint8_t c, BaseType_t * const pxHigherPriorityTaskWoken)
 {
-  //COMMENTED FIRMWARE
-  // switch (rxState)
-  // {
-  // case waitForFirstStart:
-  //   rxState = (c == SYSLINK_START_BYTE1) ? waitForSecondStart : waitForFirstStart;
-  //   break;
-  // case waitForSecondStart:
-  //   rxState = (c == SYSLINK_START_BYTE2) ? waitForType : waitForFirstStart;
-  //   break;
-  // case waitForType:
-  //   cksum[0] = c;
-  //   cksum[1] = c;
-  //   slp.type = c;
-  //   rxState = waitForLength;
-  //   break;
-  // case waitForLength:
-  //   if (c <= SYSLINK_MTU)
-  //   {
-  //     slp.length = c;
-  //     cksum[0] += c;
-  //     cksum[1] += cksum[0];
-  //     dataIndex = 0;
-  //     rxState = (c > 0) ? waitForData : waitForChksum1;
-  //   }
-  //   else
-  //   {
-  //     rxState = waitForFirstStart;
-  //   }
-  //   break;
-  // case waitForData:
-  //   slp.data[dataIndex] = c;
-  //   cksum[0] += c;
-  //   cksum[1] += cksum[0];
-  //   dataIndex++;
-  //   if (dataIndex == slp.length)
-  //   {
-  //     rxState = waitForChksum1;
-  //   }
-  //   break;
-  // case waitForChksum1:
-  //   if (cksum[0] == c)
-  //   {
-  //     rxState = waitForChksum2;
-  //   }
-  //   else
-  //   {
-  //     rxState = waitForFirstStart; //Checksum error
-  //     ASSERT(0);
-  //   }
-  //   break;
-  // case waitForChksum2:
-  //   if (cksum[1] == c)
-  //   {
-  //     // Post the packet to the queue if there's room
-  //     if (!xQueueIsQueueFullFromISR(syslinkPacketDelivery))
-  //     {
-  //       xQueueSendFromISR(syslinkPacketDelivery, (void *)&slp, pxHigherPriorityTaskWoken);
-  //     }
-  //     else
-  //     {
-  //       ASSERT(0); // Queue overflow
-  //     }
-  //   }
-  //   else
-  //   {
-  //     rxState = waitForFirstStart; //Checksum error
-  //     ASSERT(0);
-  //   }
-  //   rxState = waitForFirstStart;
-  //   break;
-  // default:
-  //   ASSERT(0);
-  //   break;
-  // }
+  switch (rxState)
+  {
+  case waitForFirstStart:
+    rxState = (c == SYSLINK_START_BYTE1) ? waitForSecondStart : waitForFirstStart;
+    break;
+  case waitForSecondStart:
+    rxState = (c == SYSLINK_START_BYTE2) ? waitForType : waitForFirstStart;
+    break;
+  case waitForType:
+    cksum[0] = c;
+    cksum[1] = c;
+    slp.type = c;
+    rxState = waitForLength;
+    break;
+  case waitForLength:
+    if (c <= SYSLINK_MTU)
+    {
+      slp.length = c;
+      cksum[0] += c;
+      cksum[1] += cksum[0];
+      dataIndex = 0;
+      rxState = (c > 0) ? waitForData : waitForChksum1;
+    }
+    else
+    {
+      rxState = waitForFirstStart;
+    }
+    break;
+  case waitForData:
+    slp.data[dataIndex] = c;
+    cksum[0] += c;
+    cksum[1] += cksum[0];
+    dataIndex++;
+    if (dataIndex == slp.length)
+    {
+      rxState = waitForChksum1;
+    }
+    break;
+  case waitForChksum1:
+    if (cksum[0] == c)
+    {
+      rxState = waitForChksum2;
+    }
+    else
+    {
+      rxState = waitForFirstStart; //Checksum error
+      ASSERT(0);
+    }
+    break;
+  case waitForChksum2:
+    if (cksum[1] == c)
+    {
+      // Post the packet to the queue if there's room
+      if (!xQueueIsQueueFullFromISR(syslinkPacketDelivery))
+      {
+        xQueueSendFromISR(syslinkPacketDelivery, (void *)&slp, pxHigherPriorityTaskWoken);
+      }
+      else
+      {
+        ASSERT(0); // Queue overflow
+      }
+    }
+    else
+    {
+      rxState = waitForFirstStart; //Checksum error
+      ASSERT(0);
+    }
+    rxState = waitForFirstStart;
+    break;
+  default:
+    ASSERT(0);
+    break;
+  }
 }
 
 void uartslkIsr(void)
 {
-  //COMMENTED FIRMWARE
-  // portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
-
-  // // the following if statement replaces:
-  // //   if (USART_GetITStatus(UARTSLK_TYPE, USART_IT_RXNE) == SET)
-  // // we do this check as fast as possible to minimize the chance of an overrun,
-  // // which occasionally cause problems and cause packet loss at high CPU usage
-  // if ((UARTSLK_TYPE->SR & (1<<5)) != 0) // if the RXNE interrupt has occurred
-  // {
-  //   uint8_t rxDataInterrupt = (uint8_t)(UARTSLK_TYPE->DR & 0xFF);
-  //   uartslkHandleDataFromISR(rxDataInterrupt, &xHigherPriorityTaskWoken);
-  // }
-  // else if (USART_GetITStatus(UARTSLK_TYPE, USART_IT_TXE) == SET)
-  // {
-  //   if (outDataIsr && (dataIndexIsr < dataSizeIsr))
-  //   {
-  //     USART_SendData(UARTSLK_TYPE, outDataIsr[dataIndexIsr] & 0x00FF);
-  //     dataIndexIsr++;
-  //   }
-  //   else
-  //   {
-  //     USART_ITConfig(UARTSLK_TYPE, USART_IT_TXE, DISABLE);
-  //     xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
-  //   }
-  // }
-  // else
-  // {
-  //   /** if we get here, the error is most likely caused by an overrun!
-  //    * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun error)
-  //    * - and IDLE (Idle line detected) pending bits are cleared by software sequence:
-  //    * - reading USART_SR register followed reading the USART_DR register.
-  //    */
-  //   asm volatile ("" : "=m" (UARTSLK_TYPE->SR) : "r" (UARTSLK_TYPE->SR)); // force non-optimizable reads
-  //   asm volatile ("" : "=m" (UARTSLK_TYPE->DR) : "r" (UARTSLK_TYPE->DR)); // of these two registers
-  // }
-
-  // portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+  // the following if statement replaces:
+  //   if (USART_GetITStatus(UARTSLK_TYPE, USART_IT_RXNE) == SET)
+  // we do this check as fast as possible to minimize the chance of an overrun,
+  // which occasionally cause problems and cause packet loss at high CPU usage
+  if ((UARTSLK_TYPE->SR & (1<<5)) != 0) // if the RXNE interrupt has occurred
+  {
+    uint8_t rxDataInterrupt = (uint8_t)(UARTSLK_TYPE->DR & 0xFF);
+    uartslkHandleDataFromISR(rxDataInterrupt, &xHigherPriorityTaskWoken);
+  }
+  else if (USART_GetITStatus(UARTSLK_TYPE, USART_IT_TXE) == SET)
+  {
+    if (outDataIsr && (dataIndexIsr < dataSizeIsr))
+    {
+      USART_SendData(UARTSLK_TYPE, outDataIsr[dataIndexIsr] & 0x00FF);
+      dataIndexIsr++;
+    }
+    else
+    {
+      USART_ITConfig(UARTSLK_TYPE, USART_IT_TXE, DISABLE);
+      xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
+    }
+  }
+  else
+  {
+    /** if we get here, the error is most likely caused by an overrun!
+     * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun error)
+     * - and IDLE (Idle line detected) pending bits are cleared by software sequence:
+     * - reading USART_SR register followed reading the USART_DR register.
+     */
+    asm volatile ("" : "=m" (UARTSLK_TYPE->SR) : "r" (UARTSLK_TYPE->SR)); // force non-optimizable reads
+    asm volatile ("" : "=m" (UARTSLK_TYPE->DR) : "r" (UARTSLK_TYPE->DR)); // of these two registers
+  }
+
+  portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 void uartslkTxenFlowctrlIsr()
 {
-  //COMMENTED FIRMWARE
-  // EXTI_ClearFlag(UARTSLK_TXEN_EXTI);
-  // if (GPIO_ReadInputDataBit(UARTSLK_TXEN_PORT, UARTSLK_TXEN_PIN) == Bit_SET)
-  // {
-  //   uartslkPauseDma();
-  //   //ledSet(LED_GREEN_R, 1);
-  // }
-  // else
-  // {
-  //   uartslkResumeDma();
-  //   //ledSet(LED_GREEN_R, 0);
-  // }
+  EXTI_ClearFlag(UARTSLK_TXEN_EXTI);
+  if (GPIO_ReadInputDataBit(UARTSLK_TXEN_PORT, UARTSLK_TXEN_PIN) == Bit_SET)
+  {
+    uartslkPauseDma();
+    //ledSet(LED_GREEN_R, 1);
+  }
+  else
+  {
+    uartslkResumeDma();
+    //ledSet(LED_GREEN_R, 0);
+  }
 }
 
 void __attribute__((used)) EXTI4_Callback(void)
 {
-  //COMMENTED FIRMWARE
-  //uartslkTxenFlowctrlIsr();
+  uartslkTxenFlowctrlIsr();
 }
 
 void __attribute__((used)) USART6_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  //uartslkIsr();
+  uartslkIsr();
 }
 
 void __attribute__((used)) DMA2_Stream7_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  //uartslkDmaIsr();
+  uartslkDmaIsr();
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l0x.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l0x.c
index 49b006c39..b28be495c 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l0x.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l0x.c
@@ -104,27 +104,26 @@ static int nextI2CAddress = VL53L0X_DEFAULT_ADDRESS+1;
 
 bool vl53l0xInit(VL53L0xDev* dev, I2C_Dev *I2Cx, bool io_2V8)
 {
-  //COMMENTED FIRMWARE
-  // dev->I2Cx = I2Cx;
-  // dev->devAddr = VL53L0X_DEFAULT_ADDRESS;
-
-  // dev->io_timeout = 0;
-  // dev->did_timeout = 0;
-  // dev->timeout_start_ms = 0;
-  // dev->stop_variable = 0;
-  // dev->measurement_timing_budget_us = 0;
-  // dev->measurement_timing_budget_ms = 0;
-
-  // if (!vl53l0xInitSensor(dev, io_2V8)) {
-  //   return false;
-  // }
+  dev->I2Cx = I2Cx;
+  dev->devAddr = VL53L0X_DEFAULT_ADDRESS;
+
+  dev->io_timeout = 0;
+  dev->did_timeout = 0;
+  dev->timeout_start_ms = 0;
+  dev->stop_variable = 0;
+  dev->measurement_timing_budget_us = 0;
+  dev->measurement_timing_budget_ms = 0;
+
+  if (!vl53l0xInitSensor(dev, io_2V8)) {
+    return false;
+  }
 
-  // /* Move initialized sensor to a new I2C address */
-  // int newAddress;
+  /* Move initialized sensor to a new I2C address */
+  int newAddress;
 
-  // taskENTER_CRITICAL();
-  // newAddress = nextI2CAddress++;
-  // taskEXIT_CRITICAL();
+  taskENTER_CRITICAL();
+  newAddress = nextI2CAddress++;
+  taskEXIT_CRITICAL();
 
   return vl53l0xSetI2CAddress(dev, newAddress);
 }
@@ -136,9 +135,8 @@ bool vl53l0xInit(VL53L0xDev* dev, I2C_Dev *I2Cx, bool io_2V8)
 bool vl53l0xTestConnection(VL53L0xDev* dev)
 {
   bool ret = true;
-  //COMMENTED FIRMWARE
-  // ret &= vl53l0xGetModelID(dev) == VL53L0X_IDENTIFICATION_MODEL_ID;
-  // ret &= vl53l0xGetRevisionID(dev) == VL53L0X_IDENTIFICATION_REVISION_ID;
+  ret &= vl53l0xGetModelID(dev) == VL53L0X_IDENTIFICATION_MODEL_ID;
+  ret &= vl53l0xGetRevisionID(dev) == VL53L0X_IDENTIFICATION_REVISION_ID;
   return ret;
 }
 
@@ -164,8 +162,7 @@ uint16_t vl53l0xGetModelID(VL53L0xDev* dev)
 uint8_t vl53l0xGetRevisionID(VL53L0xDev* dev)
 {
   uint8_t output = 0;
-  //COMMENTED FIRMWARE
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_IDENTIFICATION_REVISION_ID, &output);
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_IDENTIFICATION_REVISION_ID, &output);
   return output;
 }
 
@@ -176,8 +173,7 @@ uint8_t vl53l0xGetRevisionID(VL53L0xDev* dev)
  */
 bool vl53l0xSetI2CAddress(VL53L0xDev* dev, uint8_t address) {
   bool pass = i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, address);
-  //COMMENTED FIRMWARE
-  //dev->devAddr = address;
+  dev->devAddr = address;
   return pass;
 }
 
@@ -191,226 +187,225 @@ bool vl53l0xSetI2CAddress(VL53L0xDev* dev, uint8_t address) {
 // mode.
 bool vl53l0xInitSensor(VL53L0xDev* dev, bool io_2v8)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t temp;
-  // // VL53L0X_DataInit() begin
-
-  // // sensor uses 1V8 mode for I/O by default; switch to 2V8 mode if necessary
-  // if (io_2v8)
-  // {
-  //   i2cdevWriteBit(dev->I2Cx, dev->devAddr, VL53L0X_RA_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, 0, 0x01);
-  // }
-
-  // // "Set I2C standard mode"
-  // if (!i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x88, 0x00)) {
-  //   return false;
-  // }
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, 0x91, &dev->stop_variable);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
-
-  // // disable SIGNAL_RATE_MSRC (bit 1) and SIGNAL_RATE_PRE_RANGE (bit 4) limit checks
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_CONTROL, &temp);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_CONTROL, temp | 0x12);
-
-  // // set final range signal rate limit to 0.25 MCPS (million counts per second)
-  // vl53l0xSetSignalRateLimit(dev, 0.25);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0xFF);
-
-  // // VL53L0X_DataInit() end
-
-  // // VL53L0X_StaticInit() begin
-
-  // uint8_t spad_count;
-  // bool spad_type_is_aperture;
-  // if (!vl53l0xGetSpadInfo(dev, &spad_count, &spad_type_is_aperture)) { return false; }
-
-  // // The SPAD map (RefGoodSpadMap) is read by VL53L0X_get_info_from_device() in
-  // // the API, but the same data seems to be more easily readable from
-  // // GLOBAL_CONFIG_SPAD_ENABLES_REF_0 through _6, so read it from there
-  // uint8_t ref_spad_map[6];
-  // i2cdevReadReg8(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, 6, ref_spad_map);
-
-  // // -- VL53L0X_set_reference_spads() begin (assume NVM values are valid)
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4);
-
-  // uint8_t first_spad_to_enable = spad_type_is_aperture ? 12 : 0; // 12 is the first aperture spad
-  // uint8_t spads_enabled = 0;
-
-  // for (uint8_t i = 0; i < 48; i++)
-  // {
-  //   if (i < first_spad_to_enable || spads_enabled == spad_count)
-  //   {
-  //     // This bit is lower than the first one that should be enabled, or
-  //     // (reference_spad_count) bits have already been enabled, so zero this bit
-  //     ref_spad_map[i / 8] &= ~(1 << (i % 8));
-  //   }
-  //   else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1)
-  //   {
-  //     spads_enabled++;
-  //   }
-  // }
-
-  // i2cdevWriteReg8(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, 6, ref_spad_map);
-
-  // // -- VL53L0X_set_reference_spads() end
-
-  // // -- VL53L0X_load_tuning_settings() begin
-  // // DefaultTuningSettings from vl53l0x_tuning.h
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x09, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x10, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x11, 0x00);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x24, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x25, 0xFF);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x75, 0x00);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4E, 0x2C);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x48, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x30, 0x20);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x30, 0x09);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x54, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x31, 0x04);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x32, 0x03);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x40, 0x83);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x46, 0x25);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x60, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x27, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x50, 0x06);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x51, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x52, 0x96);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x56, 0x08);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x57, 0x30);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x61, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x62, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x64, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x65, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x66, 0xA0);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x22, 0x32);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x47, 0x14);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x49, 0xFF);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4A, 0x00);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x7A, 0x0A);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x7B, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x78, 0x21);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x23, 0x34);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x42, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x44, 0xFF);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x45, 0x26);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x46, 0x05);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x40, 0x40);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x0E, 0x06);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x20, 0x1A);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x43, 0x40);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x34, 0x03);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x35, 0x44);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x31, 0x04);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4B, 0x09);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4C, 0x05);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4D, 0x04);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x44, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x45, 0x20);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x47, 0x08);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x48, 0x28);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x67, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x70, 0x04);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x71, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x72, 0xFE);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x76, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x77, 0x00);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x0D, 0x01);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x01, 0xF8);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x8E, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
-
-  // // -- VL53L0X_load_tuning_settings() end
-
-  // // "Set interrupt config to new sample ready"
-  // // -- VL53L0X_SetGpioConfig() begin
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CONFIG_GPIO, 0x04);
-  // i2cdevWriteBit(dev->I2Cx, dev->devAddr, VL53L0X_RA_GPIO_HV_MUX_ACTIVE_HIGH, 4, 0); // active low
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CLEAR, 0x01);
-
-  // // -- VL53L0X_SetGpioConfig() end
-
-  // dev->measurement_timing_budget_us = vl53l0xGetMeasurementTimingBudget(dev);
-  // dev->measurement_timing_budget_ms = (uint16_t)(dev->measurement_timing_budget_us / 1000.0f);
-
-  // // "Disable MSRC and TCC by default"
-  // // MSRC = Minimum Signal Rate Check
-  // // TCC = Target CentreCheck
-  // // -- VL53L0X_SetSequenceStepEnable() begin
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0xE8);
-
-  // // -- VL53L0X_SetSequenceStepEnable() end
-
-  // // "Recalculate timing budget"
-  // vl53l0xSetMeasurementTimingBudget(dev, dev->measurement_timing_budget_us);
-
-  // // VL53L0X_StaticInit() end
-
-  // // VL53L0X_PerformRefCalibration() begin (VL53L0X_perform_ref_calibration())
-
-  // // -- VL53L0X_perform_vhv_calibration() begin
+  uint8_t temp;
+  // VL53L0X_DataInit() begin
+
+  // sensor uses 1V8 mode for I/O by default; switch to 2V8 mode if necessary
+  if (io_2v8)
+  {
+    i2cdevWriteBit(dev->I2Cx, dev->devAddr, VL53L0X_RA_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, 0, 0x01);
+  }
+
+  // "Set I2C standard mode"
+  if (!i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x88, 0x00)) {
+    return false;
+  }
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, 0x91, &dev->stop_variable);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
+
+  // disable SIGNAL_RATE_MSRC (bit 1) and SIGNAL_RATE_PRE_RANGE (bit 4) limit checks
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_CONTROL, &temp);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_CONTROL, temp | 0x12);
+
+  // set final range signal rate limit to 0.25 MCPS (million counts per second)
+  vl53l0xSetSignalRateLimit(dev, 0.25);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0xFF);
+
+  // VL53L0X_DataInit() end
+
+  // VL53L0X_StaticInit() begin
+
+  uint8_t spad_count;
+  bool spad_type_is_aperture;
+  if (!vl53l0xGetSpadInfo(dev, &spad_count, &spad_type_is_aperture)) { return false; }
+
+  // The SPAD map (RefGoodSpadMap) is read by VL53L0X_get_info_from_device() in
+  // the API, but the same data seems to be more easily readable from
+  // GLOBAL_CONFIG_SPAD_ENABLES_REF_0 through _6, so read it from there
+  uint8_t ref_spad_map[6];
+  i2cdevReadReg8(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, 6, ref_spad_map);
+
+  // -- VL53L0X_set_reference_spads() begin (assume NVM values are valid)
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4);
+
+  uint8_t first_spad_to_enable = spad_type_is_aperture ? 12 : 0; // 12 is the first aperture spad
+  uint8_t spads_enabled = 0;
+
+  for (uint8_t i = 0; i < 48; i++)
+  {
+    if (i < first_spad_to_enable || spads_enabled == spad_count)
+    {
+      // This bit is lower than the first one that should be enabled, or
+      // (reference_spad_count) bits have already been enabled, so zero this bit
+      ref_spad_map[i / 8] &= ~(1 << (i % 8));
+    }
+    else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1)
+    {
+      spads_enabled++;
+    }
+  }
+
+  i2cdevWriteReg8(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, 6, ref_spad_map);
+
+  // -- VL53L0X_set_reference_spads() end
+
+  // -- VL53L0X_load_tuning_settings() begin
+  // DefaultTuningSettings from vl53l0x_tuning.h
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x09, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x10, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x11, 0x00);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x24, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x25, 0xFF);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x75, 0x00);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4E, 0x2C);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x48, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x30, 0x20);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x30, 0x09);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x54, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x31, 0x04);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x32, 0x03);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x40, 0x83);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x46, 0x25);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x60, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x27, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x50, 0x06);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x51, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x52, 0x96);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x56, 0x08);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x57, 0x30);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x61, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x62, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x64, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x65, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x66, 0xA0);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x22, 0x32);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x47, 0x14);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x49, 0xFF);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4A, 0x00);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x7A, 0x0A);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x7B, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x78, 0x21);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x23, 0x34);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x42, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x44, 0xFF);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x45, 0x26);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x46, 0x05);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x40, 0x40);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x0E, 0x06);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x20, 0x1A);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x43, 0x40);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x34, 0x03);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x35, 0x44);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x31, 0x04);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4B, 0x09);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4C, 0x05);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x4D, 0x04);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x44, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x45, 0x20);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x47, 0x08);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x48, 0x28);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x67, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x70, 0x04);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x71, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x72, 0xFE);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x76, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x77, 0x00);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x0D, 0x01);
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0x01);
-  // if (!vl53l0xPerformSingleRefCalibration(dev, 0x40)) { DEBUG_PRINT("Failed VHV calibration\n"); return false; }
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x01, 0xF8);
 
-  // // -- VL53L0X_perform_vhv_calibration() end
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x8E, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
+
+  // -- VL53L0X_load_tuning_settings() end
+
+  // "Set interrupt config to new sample ready"
+  // -- VL53L0X_SetGpioConfig() begin
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CONFIG_GPIO, 0x04);
+  i2cdevWriteBit(dev->I2Cx, dev->devAddr, VL53L0X_RA_GPIO_HV_MUX_ACTIVE_HIGH, 4, 0); // active low
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CLEAR, 0x01);
+
+  // -- VL53L0X_SetGpioConfig() end
+
+  dev->measurement_timing_budget_us = vl53l0xGetMeasurementTimingBudget(dev);
+  dev->measurement_timing_budget_ms = (uint16_t)(dev->measurement_timing_budget_us / 1000.0f);
+
+  // "Disable MSRC and TCC by default"
+  // MSRC = Minimum Signal Rate Check
+  // TCC = Target CentreCheck
+  // -- VL53L0X_SetSequenceStepEnable() begin
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0xE8);
+
+  // -- VL53L0X_SetSequenceStepEnable() end
+
+  // "Recalculate timing budget"
+  vl53l0xSetMeasurementTimingBudget(dev, dev->measurement_timing_budget_us);
+
+  // VL53L0X_StaticInit() end
+
+  // VL53L0X_PerformRefCalibration() begin (VL53L0X_perform_ref_calibration())
+
+  // -- VL53L0X_perform_vhv_calibration() begin
 
-  // // -- VL53L0X_perform_phase_calibration() begin
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0x01);
+  if (!vl53l0xPerformSingleRefCalibration(dev, 0x40)) { DEBUG_PRINT("Failed VHV calibration\n"); return false; }
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0x02);
-  // if (!vl53l0xPerformSingleRefCalibration(dev, 0x00)) { DEBUG_PRINT("Failed phase calibration\n"); return false; }
+  // -- VL53L0X_perform_vhv_calibration() end
 
-  // // -- VL53L0X_perform_phase_calibration() end
+  // -- VL53L0X_perform_phase_calibration() begin
 
-  // // "restore the previous Sequence Config"
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0xE8);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0x02);
+  if (!vl53l0xPerformSingleRefCalibration(dev, 0x00)) { DEBUG_PRINT("Failed phase calibration\n"); return false; }
 
-  // // VL53L0X_PerformRefCalibration() end
+  // -- VL53L0X_perform_phase_calibration() end
+
+  // "restore the previous Sequence Config"
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0xE8);
+
+  // VL53L0X_PerformRefCalibration() end
 
   return true;
 }
@@ -425,11 +420,10 @@ bool vl53l0xInitSensor(VL53L0xDev* dev, bool io_2v8)
 // Defaults to 0.25 MCPS as initialized by the ST API and this library.
 bool vl53l0xSetSignalRateLimit(VL53L0xDev* dev, float limit_Mcps)
 {
-  //COMMENTED FIRMWARE
-  // if (limit_Mcps < 0 || limit_Mcps > 511.99f) { return false; }
+  if (limit_Mcps < 0 || limit_Mcps > 511.99f) { return false; }
 
-  // // Q9.7 fixed point format (9 integer bits, 7 fractional bits)
-  // uint16_t fixed_pt = limit_Mcps * (1 << 7);
+  // Q9.7 fixed point format (9 integer bits, 7 fractional bits)
+  uint16_t fixed_pt = limit_Mcps * (1 << 7);
   return vl53l0xWriteReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, fixed_pt);
 }
 
@@ -442,89 +436,88 @@ bool vl53l0xSetSignalRateLimit(VL53L0xDev* dev, float limit_Mcps)
 // based on VL53L0X_set_measurement_timing_budget_micro_seconds()
 bool vl53l0xSetMeasurementTimingBudget(VL53L0xDev* dev, uint32_t budget_us)
 {
-  //COMMENTED FIRMWARE
-  // SequenceStepEnables enables;
-  // SequenceStepTimeouts timeouts;
-
-  // uint16_t const StartOverhead      = 1320; // note that this is different than the value in get_
-  // uint16_t const EndOverhead        = 960;
-  // uint16_t const MsrcOverhead       = 660;
-  // uint16_t const TccOverhead        = 590;
-  // uint16_t const DssOverhead        = 690;
-  // uint16_t const PreRangeOverhead   = 660;
-  // uint16_t const FinalRangeOverhead = 550;
-
-  // uint32_t const MinTimingBudget = 20000;
-
-  // if (budget_us < MinTimingBudget) { return false; }
-
-  // uint32_t used_budget_us = StartOverhead + EndOverhead;
-
-  // vl53l0xGetSequenceStepEnables(dev, &enables);
-  // vl53l0xGetSequenceStepTimeouts(dev, &enables, &timeouts);
-
-  // if (enables.tcc)
-  // {
-  //   used_budget_us += (timeouts.msrc_dss_tcc_us + TccOverhead);
-  // }
-
-  // if (enables.dss)
-  // {
-  //   used_budget_us += 2 * (timeouts.msrc_dss_tcc_us + DssOverhead);
-  // }
-  // else if (enables.msrc)
-  // {
-  //   used_budget_us += (timeouts.msrc_dss_tcc_us + MsrcOverhead);
-  // }
-
-  // if (enables.pre_range)
-  // {
-  //   used_budget_us += (timeouts.pre_range_us + PreRangeOverhead);
-  // }
-
-  // if (enables.final_range)
-  // {
-  //   used_budget_us += FinalRangeOverhead;
-
-  //   // "Note that the final range timeout is determined by the timing
-  //   // budget and the sum of all other timeouts within the sequence.
-  //   // If there is no room for the final range timeout, then an error
-  //   // will be set. Otherwise the remaining time will be applied to
-  //   // the final range."
-
-  //   if (used_budget_us > budget_us)
-  //   {
-  //     // "Requested timeout too big."
-  //     return false;
-  //   }
-
-  //   uint32_t final_range_timeout_us = budget_us - used_budget_us;
-
-  //   // set_sequence_step_timeout() begin
-  //   // (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE)
-
-  //   // "For the final range timeout, the pre-range timeout
-  //   //  must be added. To do this both final and pre-range
-  //   //  timeouts must be expressed in macro periods MClks
-  //   //  because they have different vcsel periods."
-
-  //   uint16_t final_range_timeout_mclks =
-  //     vl53l0xTimeoutMicrosecondsToMclks(final_range_timeout_us,
-  //                                timeouts.final_range_vcsel_period_pclks);
-
-  //   if (enables.pre_range)
-  //   {
-  //     final_range_timeout_mclks += timeouts.pre_range_mclks;
-  //   }
-
-  //   uint16_t temp = vl53l0xEncodeTimeout(final_range_timeout_mclks);
-  //   vl53l0xWriteReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, temp);
-
-  //   // set_sequence_step_timeout() end
-
-  //   dev->measurement_timing_budget_us = budget_us; // store for internal reuse
-  //   dev->measurement_timing_budget_ms = (uint16_t)(dev->measurement_timing_budget_us / 1000.0f);
-  // }
+  SequenceStepEnables enables;
+  SequenceStepTimeouts timeouts;
+
+  uint16_t const StartOverhead      = 1320; // note that this is different than the value in get_
+  uint16_t const EndOverhead        = 960;
+  uint16_t const MsrcOverhead       = 660;
+  uint16_t const TccOverhead        = 590;
+  uint16_t const DssOverhead        = 690;
+  uint16_t const PreRangeOverhead   = 660;
+  uint16_t const FinalRangeOverhead = 550;
+
+  uint32_t const MinTimingBudget = 20000;
+
+  if (budget_us < MinTimingBudget) { return false; }
+
+  uint32_t used_budget_us = StartOverhead + EndOverhead;
+
+  vl53l0xGetSequenceStepEnables(dev, &enables);
+  vl53l0xGetSequenceStepTimeouts(dev, &enables, &timeouts);
+
+  if (enables.tcc)
+  {
+    used_budget_us += (timeouts.msrc_dss_tcc_us + TccOverhead);
+  }
+
+  if (enables.dss)
+  {
+    used_budget_us += 2 * (timeouts.msrc_dss_tcc_us + DssOverhead);
+  }
+  else if (enables.msrc)
+  {
+    used_budget_us += (timeouts.msrc_dss_tcc_us + MsrcOverhead);
+  }
+
+  if (enables.pre_range)
+  {
+    used_budget_us += (timeouts.pre_range_us + PreRangeOverhead);
+  }
+
+  if (enables.final_range)
+  {
+    used_budget_us += FinalRangeOverhead;
+
+    // "Note that the final range timeout is determined by the timing
+    // budget and the sum of all other timeouts within the sequence.
+    // If there is no room for the final range timeout, then an error
+    // will be set. Otherwise the remaining time will be applied to
+    // the final range."
+
+    if (used_budget_us > budget_us)
+    {
+      // "Requested timeout too big."
+      return false;
+    }
+
+    uint32_t final_range_timeout_us = budget_us - used_budget_us;
+
+    // set_sequence_step_timeout() begin
+    // (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE)
+
+    // "For the final range timeout, the pre-range timeout
+    //  must be added. To do this both final and pre-range
+    //  timeouts must be expressed in macro periods MClks
+    //  because they have different vcsel periods."
+
+    uint16_t final_range_timeout_mclks =
+      vl53l0xTimeoutMicrosecondsToMclks(final_range_timeout_us,
+                                 timeouts.final_range_vcsel_period_pclks);
+
+    if (enables.pre_range)
+    {
+      final_range_timeout_mclks += timeouts.pre_range_mclks;
+    }
+
+    uint16_t temp = vl53l0xEncodeTimeout(final_range_timeout_mclks);
+    vl53l0xWriteReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, temp);
+
+    // set_sequence_step_timeout() end
+
+    dev->measurement_timing_budget_us = budget_us; // store for internal reuse
+    dev->measurement_timing_budget_ms = (uint16_t)(dev->measurement_timing_budget_us / 1000.0f);
+  }
   return true;
 }
 
@@ -546,36 +539,36 @@ uint32_t vl53l0xGetMeasurementTimingBudget(VL53L0xDev* dev)
 
   // "Start and end overhead times always present"
   uint32_t budget_us = StartOverhead + EndOverhead;
-  //COMMENTED FIRMWARE
-  // vl53l0xGetSequenceStepEnables(dev, &enables);
-  // vl53l0xGetSequenceStepTimeouts(dev, &enables, &timeouts);
-
-  // if (enables.tcc)
-  // {
-  //   budget_us += (timeouts.msrc_dss_tcc_us + TccOverhead);
-  // }
-
-  // if (enables.dss)
-  // {
-  //   budget_us += 2 * (timeouts.msrc_dss_tcc_us + DssOverhead);
-  // }
-  // else if (enables.msrc)
-  // {
-  //   budget_us += (timeouts.msrc_dss_tcc_us + MsrcOverhead);
-  // }
-
-  // if (enables.pre_range)
-  // {
-  //   budget_us += (timeouts.pre_range_us + PreRangeOverhead);
-  // }
-
-  // if (enables.final_range)
-  // {
-  //   budget_us += (timeouts.final_range_us + FinalRangeOverhead);
-  // }
-
-  // dev->measurement_timing_budget_us = budget_us; // store for internal reuse
-  // dev->measurement_timing_budget_ms = (uint16_t)(dev->measurement_timing_budget_us / 1000.0f);
+
+  vl53l0xGetSequenceStepEnables(dev, &enables);
+  vl53l0xGetSequenceStepTimeouts(dev, &enables, &timeouts);
+
+  if (enables.tcc)
+  {
+    budget_us += (timeouts.msrc_dss_tcc_us + TccOverhead);
+  }
+
+  if (enables.dss)
+  {
+    budget_us += 2 * (timeouts.msrc_dss_tcc_us + DssOverhead);
+  }
+  else if (enables.msrc)
+  {
+    budget_us += (timeouts.msrc_dss_tcc_us + MsrcOverhead);
+  }
+
+  if (enables.pre_range)
+  {
+    budget_us += (timeouts.pre_range_us + PreRangeOverhead);
+  }
+
+  if (enables.final_range)
+  {
+    budget_us += (timeouts.final_range_us + FinalRangeOverhead);
+  }
+
+  dev->measurement_timing_budget_us = budget_us; // store for internal reuse
+  dev->measurement_timing_budget_ms = (uint16_t)(dev->measurement_timing_budget_us / 1000.0f);
   return budget_us;
 }
 
@@ -589,177 +582,176 @@ uint32_t vl53l0xGetMeasurementTimingBudget(VL53L0xDev* dev)
 // based on VL53L0X_set_vcsel_pulse_period()
 bool vl53l0xSetVcselPulsePeriod(VL53L0xDev* dev, vcselPeriodType type, uint8_t period_pclks)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t vcsel_period_reg = encodeVcselPeriod(period_pclks);
-
-  // SequenceStepEnables enables;
-  // SequenceStepTimeouts timeouts;
-
-  // vl53l0xGetSequenceStepEnables(dev, &enables);
-  // vl53l0xGetSequenceStepTimeouts(dev, &enables, &timeouts);
-
-  // // "Apply specific settings for the requested clock period"
-  // // "Re-calculate and apply timeouts, in macro periods"
-
-  // // "When the VCSEL period for the pre or final range is changed,
-  // // the corresponding timeout must be read from the device using
-  // // the current VCSEL period, then the new VCSEL period can be
-  // // applied. The timeout then must be written back to the device
-  // // using the new VCSEL period.
-  // //
-  // // For the MSRC timeout, the same applies - this timeout being
-  // // dependant on the pre-range vcsel period."
-
-
-  // if (type == VcselPeriodPreRange)
-  // {
-  //   // "Set phase check limits"
-  //   switch (period_pclks)
-  //   {
-  //     case 12:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x18);
-  //       break;
-
-  //     case 14:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x30);
-  //       break;
-
-  //     case 16:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x40);
-  //       break;
-
-  //     case 18:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x50);
-  //       break;
-
-  //     default:
-  //       // invalid period
-  //       return false;
-  //   }
-  //   i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_LOW, 0x08);
-
-  //   // apply new VCSEL period
-  //   i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VCSEL_PERIOD, vcsel_period_reg);
-
-  //   // update timeouts
-
-  //   // set_sequence_step_timeout() begin
-  //   // (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE)
-
-  //   uint16_t new_pre_range_timeout_mclks =
-  //     vl53l0xTimeoutMicrosecondsToMclks(timeouts.pre_range_us, period_pclks);
-
-  //   uint16_t new_pre_range_timeout_encoded = vl53l0xEncodeTimeout(new_pre_range_timeout_mclks);
-  //   vl53l0xWriteReg16Bit(dev, VL53L0X_RA_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, new_pre_range_timeout_encoded);
-
-  //   // set_sequence_step_timeout() end
-
-  //   // set_sequence_step_timeout() begin
-  //   // (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)
-
-  //   uint16_t new_msrc_timeout_mclks =
-  //     vl53l0xTimeoutMicrosecondsToMclks(timeouts.msrc_dss_tcc_us, period_pclks);
-
-  //   i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_TIMEOUT_MACROP,
-  //     (new_msrc_timeout_mclks > 256) ? 255 : (new_msrc_timeout_mclks - 1));
-
-  //   // set_sequence_step_timeout() end
-  // }
-  // else if (type == VcselPeriodFinalRange)
-  // {
-  //   switch (period_pclks)
-  //   {
-  //     case 8:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x10);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x30);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  //       break;
-
-  //     case 10:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x28);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x20);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  //       break;
-
-  //     case 12:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x38);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x20);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  //       break;
-
-  //     case 14:
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x48);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x20);
-  //       i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  //       break;
-
-  //     default:
-  //       // invalid period
-  //       return false;
-  //   }
-
-  //   // apply new VCSEL period
-  //   i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VCSEL_PERIOD, vcsel_period_reg);
-
-  //   // update timeouts
-
-  //   // set_sequence_step_timeout() begin
-  //   // (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE)
-
-  //   // "For the final range timeout, the pre-range timeout
-  //   //  must be added. To do this both final and pre-range
-  //   //  timeouts must be expressed in macro periods MClks
-  //   //  because they have different vcsel periods."
-
-  //   uint16_t new_final_range_timeout_mclks =
-  //     vl53l0xTimeoutMicrosecondsToMclks(timeouts.final_range_us, period_pclks);
-
-  //   if (enables.pre_range)
-  //   {
-  //     new_final_range_timeout_mclks += timeouts.pre_range_mclks;
-  //   }
-
-  //   uint16_t new_final_range_timeout_encoded = vl53l0xEncodeTimeout(new_final_range_timeout_mclks);
-  //   vl53l0xWriteReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, new_final_range_timeout_encoded);
-
-  //   // set_sequence_step_timeout end
-  // }
-  // else
-  // {
-  //   // invalid type
-  //   return false;
-  // }
-
-  // // "Finally, the timing budget must be re-applied"
-
-  // vl53l0xSetMeasurementTimingBudget(dev, dev->measurement_timing_budget_us);
-
-  // // "Perform the phase calibration. This is needed after changing on vcsel period."
-  // // VL53L0X_perform_phase_calibration() begin
-
-  // uint8_t sequence_config = 0;
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, &sequence_config);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0x02);
+  uint8_t vcsel_period_reg = encodeVcselPeriod(period_pclks);
+
+  SequenceStepEnables enables;
+  SequenceStepTimeouts timeouts;
+
+  vl53l0xGetSequenceStepEnables(dev, &enables);
+  vl53l0xGetSequenceStepTimeouts(dev, &enables, &timeouts);
+
+  // "Apply specific settings for the requested clock period"
+  // "Re-calculate and apply timeouts, in macro periods"
+
+  // "When the VCSEL period for the pre or final range is changed,
+  // the corresponding timeout must be read from the device using
+  // the current VCSEL period, then the new VCSEL period can be
+  // applied. The timeout then must be written back to the device
+  // using the new VCSEL period.
+  //
+  // For the MSRC timeout, the same applies - this timeout being
+  // dependant on the pre-range vcsel period."
+
+
+  if (type == VcselPeriodPreRange)
+  {
+    // "Set phase check limits"
+    switch (period_pclks)
+    {
+      case 12:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x18);
+        break;
+
+      case 14:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x30);
+        break;
+
+      case 16:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x40);
+        break;
+
+      case 18:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, 0x50);
+        break;
+
+      default:
+        // invalid period
+        return false;
+    }
+    i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VALID_PHASE_LOW, 0x08);
+
+    // apply new VCSEL period
+    i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VCSEL_PERIOD, vcsel_period_reg);
+
+    // update timeouts
+
+    // set_sequence_step_timeout() begin
+    // (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE)
+
+    uint16_t new_pre_range_timeout_mclks =
+      vl53l0xTimeoutMicrosecondsToMclks(timeouts.pre_range_us, period_pclks);
+
+    uint16_t new_pre_range_timeout_encoded = vl53l0xEncodeTimeout(new_pre_range_timeout_mclks);
+    vl53l0xWriteReg16Bit(dev, VL53L0X_RA_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, new_pre_range_timeout_encoded);
+
+    // set_sequence_step_timeout() end
+
+    // set_sequence_step_timeout() begin
+    // (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)
+
+    uint16_t new_msrc_timeout_mclks =
+      vl53l0xTimeoutMicrosecondsToMclks(timeouts.msrc_dss_tcc_us, period_pclks);
+
+    i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_TIMEOUT_MACROP,
+      (new_msrc_timeout_mclks > 256) ? 255 : (new_msrc_timeout_mclks - 1));
+
+    // set_sequence_step_timeout() end
+  }
+  else if (type == VcselPeriodFinalRange)
+  {
+    switch (period_pclks)
+    {
+      case 8:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x10);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x30);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+        break;
+
+      case 10:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x28);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x20);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+        break;
+
+      case 12:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x38);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x20);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+        break;
+
+      case 14:
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, 0x48);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,  0x08);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_ALGO_PHASECAL_LIM, 0x20);
+        i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+        break;
+
+      default:
+        // invalid period
+        return false;
+    }
+
+    // apply new VCSEL period
+    i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VCSEL_PERIOD, vcsel_period_reg);
+
+    // update timeouts
+
+    // set_sequence_step_timeout() begin
+    // (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE)
+
+    // "For the final range timeout, the pre-range timeout
+    //  must be added. To do this both final and pre-range
+    //  timeouts must be expressed in macro periods MClks
+    //  because they have different vcsel periods."
+
+    uint16_t new_final_range_timeout_mclks =
+      vl53l0xTimeoutMicrosecondsToMclks(timeouts.final_range_us, period_pclks);
+
+    if (enables.pre_range)
+    {
+      new_final_range_timeout_mclks += timeouts.pre_range_mclks;
+    }
+
+    uint16_t new_final_range_timeout_encoded = vl53l0xEncodeTimeout(new_final_range_timeout_mclks);
+    vl53l0xWriteReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, new_final_range_timeout_encoded);
+
+    // set_sequence_step_timeout end
+  }
+  else
+  {
+    // invalid type
+    return false;
+  }
+
+  // "Finally, the timing budget must be re-applied"
+
+  vl53l0xSetMeasurementTimingBudget(dev, dev->measurement_timing_budget_us);
+
+  // "Perform the phase calibration. This is needed after changing on vcsel period."
+  // VL53L0X_perform_phase_calibration() begin
+
+  uint8_t sequence_config = 0;
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, &sequence_config);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, 0x02);
   bool ret = vl53l0xPerformSingleRefCalibration(dev, 0x0);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, sequence_config);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, sequence_config);
 
-  // // VL53L0X_perform_phase_calibration() end
+  // VL53L0X_perform_phase_calibration() end
 
   return ret;
 }
@@ -768,21 +760,19 @@ bool vl53l0xSetVcselPulsePeriod(VL53L0xDev* dev, vcselPeriodType type, uint8_t p
 // based on VL53L0X_get_vcsel_pulse_period()
 uint8_t vl53l0xGetVcselPulsePeriod(VL53L0xDev* dev, vcselPeriodType type)
 {
-  //COMMENTED FIRMWARE
-  // if (type == VcselPeriodPreRange)
-  // {
-  //   uint8_t temp = 0;
-  //   i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VCSEL_PERIOD, &temp);
-  //   return decodeVcselPeriod(temp);
-  // }
-  // else if (type == VcselPeriodFinalRange)
-  // {
-  //   uint8_t temp = 0;
-  //   i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &temp);
-  //   return decodeVcselPeriod(temp);
-  // }
-  // else { return 255; }
-  return 255;
+  if (type == VcselPeriodPreRange)
+  {
+    uint8_t temp = 0;
+    i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_PRE_RANGE_CONFIG_VCSEL_PERIOD, &temp);
+    return decodeVcselPeriod(temp);
+  }
+  else if (type == VcselPeriodFinalRange)
+  {
+    uint8_t temp = 0;
+    i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &temp);
+    return decodeVcselPeriod(temp);
+  }
+  else { return 255; }
 }
 
 // Start continuous ranging measurements. If period_ms (optional) is 0 or not
@@ -793,53 +783,51 @@ uint8_t vl53l0xGetVcselPulsePeriod(VL53L0xDev* dev, vcselPeriodType type)
 // based on VL53L0X_StartMeasurement()
 void vl53l0xStartContinuous(VL53L0xDev* dev, uint32_t period_ms)
 {
-  //COMMENTED FIRMWARE
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x91, dev->stop_variable);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
-
-  // if (period_ms != 0)
-  // {
-  //   // continuous timed mode
-
-  //   // VL53L0X_SetInterMeasurementPeriodMilliSeconds() begin
-
-  //   uint16_t osc_calibrate_val = vl53l0xReadReg16Bit(dev, VL53L0X_RA_OSC_CALIBRATE_VAL);
-
-  //   if (osc_calibrate_val != 0)
-  //   {
-  //     period_ms *= osc_calibrate_val;
-  //   }
-
-  //   vl53l0xWriteReg32Bit(dev, VL53L0X_RA_SYSTEM_INTERMEASUREMENT_PERIOD, period_ms);
-
-  //   // VL53L0X_SetInterMeasurementPeriodMilliSeconds() end
-
-  //   i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x04); // VL53L0X_REG_SYSRANGE_MODE_TIMED
-  // }
-  // else
-  // {
-  //   // continuous back-to-back mode
-  //   i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x02); // VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK
-  // }
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x91, dev->stop_variable);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
+
+  if (period_ms != 0)
+  {
+    // continuous timed mode
+
+    // VL53L0X_SetInterMeasurementPeriodMilliSeconds() begin
+
+    uint16_t osc_calibrate_val = vl53l0xReadReg16Bit(dev, VL53L0X_RA_OSC_CALIBRATE_VAL);
+
+    if (osc_calibrate_val != 0)
+    {
+      period_ms *= osc_calibrate_val;
+    }
+
+    vl53l0xWriteReg32Bit(dev, VL53L0X_RA_SYSTEM_INTERMEASUREMENT_PERIOD, period_ms);
+
+    // VL53L0X_SetInterMeasurementPeriodMilliSeconds() end
+
+    i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x04); // VL53L0X_REG_SYSRANGE_MODE_TIMED
+  }
+  else
+  {
+    // continuous back-to-back mode
+    i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x02); // VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK
+  }
 }
 
 // Stop continuous measurements
 // based on VL53L0X_StopMeasurement()
 void vl53l0xStopContinuous(VL53L0xDev* dev)
 {
-  //COMMENTED FIRMWARE
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x01); // VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x91, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x01); // VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x91, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
 }
 
 // Returns a range reading in millimeters when continuous mode is active
@@ -847,30 +835,28 @@ void vl53l0xStopContinuous(VL53L0xDev* dev)
 // single-shot range measurement)
 uint16_t vl53l0xReadRangeContinuousMillimeters(VL53L0xDev* dev)
 {
-  //COMMENTED FIRMWARE
-  // startTimeout();
-  // uint8_t val = 0;
-  // while ((val & 0x07) == 0)
-  // {
-  //   i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_RESULT_INTERRUPT_STATUS, &val);
-  //   if ((val & 0x07) == 0)
-  //   {
-  //     // Relaxation delay when polling interrupt
-  //     vTaskDelay(M2T(1));
-  //   }
-  //   if (checkTimeoutExpired())
-  //   {
-  //     dev->did_timeout = true;
-  //     return 65535;
-  //   }
-  // }
+  startTimeout();
+  uint8_t val = 0;
+  while ((val & 0x07) == 0)
+  {
+    i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_RESULT_INTERRUPT_STATUS, &val);
+    if ((val & 0x07) == 0)
+    {
+      // Relaxation delay when polling interrupt
+      vTaskDelay(M2T(1));
+    }
+    if (checkTimeoutExpired())
+    {
+      dev->did_timeout = true;
+      return 65535;
+    }
+  }
 
   // assumptions: Linearity Corrective Gain is 1000 (default);
   // fractional ranging is not enabled
   uint16_t range = vl53l0xReadReg16Bit(dev, VL53L0X_RA_RESULT_RANGE_STATUS + 10);
 
-  //COMMENTED FIRMWARE
-  //i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CLEAR, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CLEAR, 0x01);
 
   return range;
 }
@@ -880,29 +866,28 @@ uint16_t vl53l0xReadRangeContinuousMillimeters(VL53L0xDev* dev)
 // based on VL53L0X_PerformSingleRangingMeasurement()
 uint16_t vl53l0xReadRangeSingleMillimeters(VL53L0xDev* dev)
 {
-  //COMMENTED FIRMWARE
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x91, dev->stop_variable);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
-
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x01);
-
-  // // "Wait until start bit has been cleared"
-  // startTimeout();
-  // uint8_t val = 0x01;
-  // while (val & 0x01)
-  // {
-  //   i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, &val);
-  //   if (checkTimeoutExpired())
-  //   {
-  //     dev->did_timeout = true;
-  //     return 65535;
-  //   }
-  // }
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x91, dev->stop_variable);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
+
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x01);
+
+  // "Wait until start bit has been cleared"
+  startTimeout();
+  uint8_t val = 0x01;
+  while (val & 0x01)
+  {
+    i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, &val);
+    if (checkTimeoutExpired())
+    {
+      dev->did_timeout = true;
+      return 65535;
+    }
+  }
 
   return vl53l0xReadRangeContinuousMillimeters(dev);
 }
@@ -912,43 +897,42 @@ uint16_t vl53l0xReadRangeSingleMillimeters(VL53L0xDev* dev)
 // but only gets reference SPAD count and type
 bool vl53l0xGetSpadInfo(VL53L0xDev* dev, uint8_t * count, bool * type_is_aperture)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t tmp;
+  uint8_t tmp;
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x00);
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x06);
-  // i2cdevWriteBit(dev->I2Cx, dev->devAddr, 0x83, 2, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x07);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x81, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x06);
+  i2cdevWriteBit(dev->I2Cx, dev->devAddr, 0x83, 2, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x07);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x81, 0x01);
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x01);
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x94, 0x6b);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x83, 0x00);
-  // startTimeout();
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x94, 0x6b);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x83, 0x00);
+  startTimeout();
 
-  // uint8_t val = 0x00;
-  // while (val == 0x00) {
-  //   i2cdevReadByte(dev->I2Cx, dev->devAddr, 0x83, &val);
-  //   if (checkTimeoutExpired()) { return false; }
-  // };
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x83, 0x01);
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, 0x92, &tmp);
+  uint8_t val = 0x00;
+  while (val == 0x00) {
+    i2cdevReadByte(dev->I2Cx, dev->devAddr, 0x83, &val);
+    if (checkTimeoutExpired()) { return false; }
+  };
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x83, 0x01);
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, 0x92, &tmp);
 
-  // *count = tmp & 0x7f;
-  // *type_is_aperture = (tmp >> 7) & 0x01;
+  *count = tmp & 0x7f;
+  *type_is_aperture = (tmp >> 7) & 0x01;
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x81, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x06);
-  // i2cdevWriteBit(dev->I2Cx, dev->devAddr, 0x83, 2, 0);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x81, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x06);
+  i2cdevWriteBit(dev->I2Cx, dev->devAddr, 0x83, 2, 0);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x00, 0x01);
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0xFF, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, 0x80, 0x00);
 
   return true;
 }
@@ -957,15 +941,14 @@ bool vl53l0xGetSpadInfo(VL53L0xDev* dev, uint8_t * count, bool * type_is_apertur
 // based on VL53L0X_GetSequenceStepEnables()
 void vl53l0xGetSequenceStepEnables(VL53L0xDev* dev, SequenceStepEnables * enables)
 {
-  //COMMENTED FIRMWARE
-  // uint8_t sequence_config = 0;
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, &sequence_config);
-
-  // enables->tcc          = (sequence_config >> 4) & 0x1;
-  // enables->dss          = (sequence_config >> 3) & 0x1;
-  // enables->msrc         = (sequence_config >> 2) & 0x1;
-  // enables->pre_range    = (sequence_config >> 6) & 0x1;
-  // enables->final_range  = (sequence_config >> 7) & 0x1;
+  uint8_t sequence_config = 0;
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_SEQUENCE_CONFIG, &sequence_config);
+
+  enables->tcc          = (sequence_config >> 4) & 0x1;
+  enables->dss          = (sequence_config >> 3) & 0x1;
+  enables->msrc         = (sequence_config >> 2) & 0x1;
+  enables->pre_range    = (sequence_config >> 6) & 0x1;
+  enables->final_range  = (sequence_config >> 7) & 0x1;
 }
 
 // Get sequence step timeouts
@@ -974,35 +957,34 @@ void vl53l0xGetSequenceStepEnables(VL53L0xDev* dev, SequenceStepEnables * enable
 // intermediate values
 void vl53l0xGetSequenceStepTimeouts(VL53L0xDev* dev, SequenceStepEnables const * enables, SequenceStepTimeouts * timeouts)
 {
-  //COMMENTED FIRMWARE
-  // timeouts->pre_range_vcsel_period_pclks = vl53l0xGetVcselPulsePeriod(dev, VcselPeriodPreRange);
-
-  // uint8_t temp = 0;
-  // i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_TIMEOUT_MACROP, &temp);
-  // timeouts->msrc_dss_tcc_mclks = temp + 1;
-  // timeouts->msrc_dss_tcc_us =
-  //   vl53l0xTimeoutMclksToMicroseconds(timeouts->msrc_dss_tcc_mclks,
-  //                              timeouts->pre_range_vcsel_period_pclks);
-
-  // uint16_t pre_range_encoded = vl53l0xReadReg16Bit(dev, VL53L0X_RA_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI);
-  // timeouts->pre_range_mclks = vl53l0xDecodeTimeout(pre_range_encoded);
-  // timeouts->pre_range_us =
-  //   vl53l0xTimeoutMclksToMicroseconds(timeouts->pre_range_mclks,
-  //                              timeouts->pre_range_vcsel_period_pclks);
-
-  // timeouts->final_range_vcsel_period_pclks = vl53l0xGetVcselPulsePeriod(dev, VcselPeriodFinalRange);
-
-  // uint16_t final_range_encoded = vl53l0xReadReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI);
-  // timeouts->final_range_mclks = vl53l0xDecodeTimeout(final_range_encoded);
-
-  // if (enables->pre_range)
-  // {
-  //   timeouts->final_range_mclks -= timeouts->pre_range_mclks;
-  // }
-
-  // timeouts->final_range_us =
-  //   vl53l0xTimeoutMclksToMicroseconds(timeouts->final_range_mclks,
-  //                              timeouts->final_range_vcsel_period_pclks);
+  timeouts->pre_range_vcsel_period_pclks = vl53l0xGetVcselPulsePeriod(dev, VcselPeriodPreRange);
+
+  uint8_t temp = 0;
+  i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_MSRC_CONFIG_TIMEOUT_MACROP, &temp);
+  timeouts->msrc_dss_tcc_mclks = temp + 1;
+  timeouts->msrc_dss_tcc_us =
+    vl53l0xTimeoutMclksToMicroseconds(timeouts->msrc_dss_tcc_mclks,
+                               timeouts->pre_range_vcsel_period_pclks);
+
+  uint16_t pre_range_encoded = vl53l0xReadReg16Bit(dev, VL53L0X_RA_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI);
+  timeouts->pre_range_mclks = vl53l0xDecodeTimeout(pre_range_encoded);
+  timeouts->pre_range_us =
+    vl53l0xTimeoutMclksToMicroseconds(timeouts->pre_range_mclks,
+                               timeouts->pre_range_vcsel_period_pclks);
+
+  timeouts->final_range_vcsel_period_pclks = vl53l0xGetVcselPulsePeriod(dev, VcselPeriodFinalRange);
+
+  uint16_t final_range_encoded = vl53l0xReadReg16Bit(dev, VL53L0X_RA_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI);
+  timeouts->final_range_mclks = vl53l0xDecodeTimeout(final_range_encoded);
+
+  if (enables->pre_range)
+  {
+    timeouts->final_range_mclks -= timeouts->pre_range_mclks;
+  }
+
+  timeouts->final_range_us =
+    vl53l0xTimeoutMclksToMicroseconds(timeouts->final_range_mclks,
+                               timeouts->final_range_vcsel_period_pclks);
 }
 
 // Decode sequence step timeout in MCLKs from register value
@@ -1063,20 +1045,19 @@ uint32_t vl53l0xTimeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t v
 // based on VL53L0X_perform_single_ref_calibration()
 bool vl53l0xPerformSingleRefCalibration(VL53L0xDev* dev, uint8_t vhv_init_byte)
 {
-  //COMMENTED FIRMWARE
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x01 | vhv_init_byte); // VL53L0X_REG_SYSRANGE_MODE_START_STOP
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x01 | vhv_init_byte); // VL53L0X_REG_SYSRANGE_MODE_START_STOP
 
-  // startTimeout();
-  // uint8_t temp = 0x00;
-  // while ((temp & 0x07) == 0)
-  // {
-  //   i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_RESULT_INTERRUPT_STATUS, &temp);
-  //   if (checkTimeoutExpired()) { return false; }
-  // }
+  startTimeout();
+  uint8_t temp = 0x00;
+  while ((temp & 0x07) == 0)
+  {
+    i2cdevReadByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_RESULT_INTERRUPT_STATUS, &temp);
+    if (checkTimeoutExpired()) { return false; }
+  }
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CLEAR, 0x01);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSTEM_INTERRUPT_CLEAR, 0x01);
 
-  // i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x00);
+  i2cdevWriteByte(dev->I2Cx, dev->devAddr, VL53L0X_RA_SYSRANGE_START, 0x00);
 
   return true;
 }
@@ -1084,8 +1065,7 @@ bool vl53l0xPerformSingleRefCalibration(VL53L0xDev* dev, uint8_t vhv_init_byte)
 uint16_t vl53l0xReadReg16Bit(VL53L0xDev* dev, uint8_t reg)
 {
   uint8_t buffer[2] = {};
-  //COMMENTED FIRMWARE
-  // i2cdevReadReg8(dev->I2Cx, dev->devAddr, reg, 2, (uint8_t *)&buffer);
+  i2cdevReadReg8(dev->I2Cx, dev->devAddr, reg, 2, (uint8_t *)&buffer);
   return ((uint16_t)(buffer[0]) << 8) | buffer[1];
 }
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l1x.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l1x.c
index e8b39e0f1..ace2d8a2b 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l1x.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/vl53l1x.c
@@ -55,25 +55,25 @@ static int nextI2CAddress = VL53L1X_DEFAULT_ADDRESS+8;
 bool vl53l1xInit(VL53L1_Dev_t *pdev, I2C_Dev *I2Cx)
 {
   VL53L1_Error status = VL53L1_ERROR_NONE;
-//COMMENTED FIRMWARE
-//   pdev->I2Cx = I2Cx;
-//   pdev->devAddr = VL53L1X_DEFAULT_ADDRESS;
 
-//   /* Move initialized sensor to a new I2C address */
-//   int newAddress;
+  pdev->I2Cx = I2Cx;
+  pdev->devAddr = VL53L1X_DEFAULT_ADDRESS;
 
-//   taskENTER_CRITICAL();
-//   newAddress = nextI2CAddress++;
-//   taskEXIT_CRITICAL();
+  /* Move initialized sensor to a new I2C address */
+  int newAddress;
 
-//   vl53l1xSetI2CAddress(pdev, newAddress);
+  taskENTER_CRITICAL();
+  newAddress = nextI2CAddress++;
+  taskEXIT_CRITICAL();
 
-//   status = VL53L1_DataInit(pdev);
+  vl53l1xSetI2CAddress(pdev, newAddress);
 
-//   if (status == VL53L1_ERROR_NONE)
-//   {
-//     status = VL53L1_StaticInit(pdev);
-//   }
+  status = VL53L1_DataInit(pdev);
+
+  if (status == VL53L1_ERROR_NONE)
+  {
+    status = VL53L1_StaticInit(pdev);
+  }
 
   return status == VL53L1_ERROR_NONE;
 }
@@ -82,8 +82,8 @@ bool vl53l1xTestConnection(VL53L1_Dev_t* pdev)
 {
   VL53L1_DeviceInfo_t info;
   VL53L1_Error status = VL53L1_ERROR_NONE;
-	//COMMENTED FIRMWARE
-//   status = VL53L1_GetDeviceInfo(pdev, &info);
+
+  status = VL53L1_GetDeviceInfo(pdev, &info);
 
   return status == VL53L1_ERROR_NONE;
 }
@@ -96,9 +96,9 @@ bool vl53l1xTestConnection(VL53L1_Dev_t* pdev)
 VL53L1_Error vl53l1xSetI2CAddress(VL53L1_Dev_t* pdev, uint8_t address)
 {
   VL53L1_Error status = VL53L1_ERROR_NONE;
-//COMMENTED FIRMWARE
-//   status = VL53L1_SetDeviceAddress(pdev, address);
-//   pdev->devAddr = address;
+
+  status = VL53L1_SetDeviceAddress(pdev, address);
+  pdev->devAddr = address;
   return  status;
 }
 
@@ -114,11 +114,11 @@ VL53L1_Error VL53L1_WriteMulti(
 	uint32_t      count)
 {
 	VL53L1_Error status         = VL53L1_ERROR_NONE;
-//COMMENTED FIRMWARE
-//   if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, count, pdata))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
+
+  if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, count, pdata))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
 
 	return status;
 }
@@ -130,11 +130,11 @@ VL53L1_Error VL53L1_ReadMulti(
 	uint32_t      count)
 {
 	VL53L1_Error status         = VL53L1_ERROR_NONE;
-	//COMMENTED FIRMWARE
-//   if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, count, pdata))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
+
+  if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, count, pdata))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
 
 	return status;
 }
@@ -146,11 +146,11 @@ VL53L1_Error VL53L1_WrByte(
 	uint8_t       data)
 {
 	VL53L1_Error status         = VL53L1_ERROR_NONE;
-//COMMENTED FIRMWARE
-	// if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, 1, &data))
-	// {
-	//   status = VL53L1_ERROR_CONTROL_INTERFACE;
-	// }
+
+	if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, 1, &data))
+	{
+	  status = VL53L1_ERROR_CONTROL_INTERFACE;
+	}
 
 	return status;
 }
@@ -162,11 +162,11 @@ VL53L1_Error VL53L1_WrWord(
 	uint16_t      data)
 {
   VL53L1_Error status         = VL53L1_ERROR_NONE;
-	//COMMENTED FIRMWARE
-//   if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, 2, (uint8_t *)&data))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
+
+  if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, 2, (uint8_t *)&data))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
 
 	return status;
 }
@@ -178,11 +178,11 @@ VL53L1_Error VL53L1_WrDWord(
 	uint32_t      data)
 {
 	VL53L1_Error status         = VL53L1_ERROR_NONE;
-	//COMMENTED FIRMWARE
-// 	if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, 4, (uint8_t *)&data))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
+
+	if (!i2cdevWrite16(pdev->I2Cx, pdev->devAddr, index, 4, (uint8_t *)&data))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
 
 	return status;
 }
@@ -194,14 +194,13 @@ VL53L1_Error VL53L1_RdByte(
 	uint8_t      *pdata)
 {
   VL53L1_Error status         = VL53L1_ERROR_NONE;
-  //COMMENTED FIRMWARE
-//   static uint8_t r8data;
+  static uint8_t r8data;
 
-//   if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, 1, &r8data))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
-//   *pdata = r8data;
+  if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, 1, &r8data))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
+  *pdata = r8data;
 
   return status;
 }
@@ -213,14 +212,13 @@ VL53L1_Error VL53L1_RdWord(
 	uint16_t     *pdata)
 {
   VL53L1_Error status         = VL53L1_ERROR_NONE;
-  //COMMENTED FIRMWARE
-//   static uint16_t r16data;
-
-//   if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, 2, (uint8_t *)&r16data))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
-//   *pdata = r16data;
+  static uint16_t r16data;
+
+  if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, 2, (uint8_t *)&r16data))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
+  *pdata = r16data;
   
   return status;
 }
@@ -232,14 +230,13 @@ VL53L1_Error VL53L1_RdDWord(
 	uint32_t     *pdata)
 {
   VL53L1_Error status = VL53L1_ERROR_NONE;
-  //COMMENTED FIRMWARE
-//   static uint32_t r32data;
+  static uint32_t r32data;
 
-//   if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, 4, (uint8_t *)&r32data))
-//   {
-//     status = VL53L1_ERROR_CONTROL_INTERFACE;
-//   }
-//   *pdata = r32data;
+  if (!i2cdevRead16(pdev->I2Cx, pdev->devAddr, index, 4, (uint8_t *)&r32data))
+  {
+    status = VL53L1_ERROR_CONTROL_INTERFACE;
+  }
+  *pdata = r32data;
 
   return status;
 }
@@ -253,15 +250,14 @@ VL53L1_Error VL53L1_WaitUs(
 	int32_t       wait_us)
 {
 	VL53L1_Error status         = VL53L1_ERROR_NONE;
-	//COMMENTED FIRMWARE
-	// uint32_t delay_ms = (wait_us + 900) / 1000;
+	uint32_t delay_ms = (wait_us + 900) / 1000;
 
-	// if(delay_ms == 0)
-	// {
-	//   delay_ms = 1;
-	// }
+	if(delay_ms == 0)
+	{
+	  delay_ms = 1;
+	}
 
-	// vTaskDelay(M2T(delay_ms));
+	vTaskDelay(M2T(delay_ms));
 
 	return status;
 }
@@ -271,8 +267,7 @@ VL53L1_Error VL53L1_WaitMs(
 	VL53L1_Dev_t *pdev,
 	int32_t       wait_ms)
 {
-	//COMMENTED FIRMWARE
-  //vTaskDelay(M2T(wait_ms));
+  vTaskDelay(M2T(wait_ms));
 
   return VL53L1_ERROR_NONE;
 }
@@ -285,8 +280,7 @@ VL53L1_Error VL53L1_GetTickCount(
 	uint32_t *ptick_count_ms)
 {
 	/* Returns current tick count in [ms] */
-	//COMMENTED FIRMWARE
-	//*ptick_count_ms = xTaskGetTickCount();
+	*ptick_count_ms = xTaskGetTickCount();
 
 	return VL53L1_ERROR_NONE;
 }
@@ -311,73 +305,72 @@ VL53L1_Error VL53L1_WaitValueMaskEx(
 	 *          poll_delay_ms);
 	 */
 
- 	VL53L1_Error status         = VL53L1_ERROR_NONE;
-	 //COMMENTED FIRMWARE
-// 	uint32_t     start_time_ms   = 0;
-// 	uint32_t     current_time_ms = 0;
-// 	uint8_t      byte_value      = 0;
-// 	uint8_t      found           = 0;
-// #ifdef VL53L1_LOG_ENABLE
-// 	uint32_t     trace_functions = 0;
-// #endif
-
-// 	SUPPRESS_UNUSED_WARNING(poll_delay_ms);
-
-// #ifdef VL53L1_LOG_ENABLE
-// 	/* look up register name */
-// 	VL53L1_get_register_name(
-// 			index,
-// 			register_name);
-
-// 	/* Output to I2C logger for FMT/DFT  */
-// 	trace_i2c("WaitValueMaskEx(%5d, %s, 0x%02X, 0x%02X, %5d);\n",
-// 		timeout_ms, register_name, value, mask, poll_delay_ms);
-// #endif // VL53L1_LOG_ENABLE
-
-// 	/* calculate time limit in absolute time */
-
-// 	VL53L1_GetTickCount(&start_time_ms);
-// 	pdev->new_data_ready_poll_duration_ms = 0;
-
-// 	/* remember current trace functions and temporarily disable
-// 	 * function logging
-// 	 */
-
-// #ifdef VL53L1_LOG_ENABLE
-// 	trace_functions = _LOG_GET_TRACE_FUNCTIONS();
-// #endif
-
-// 	/* wait until value is found, timeout reached on error occurred */
-
-// 	while ((status == VL53L1_ERROR_NONE) &&
-// 		   (pdev->new_data_ready_poll_duration_ms < timeout_ms) &&
-// 		   (found == 0))
-// 	{
-// 		status = VL53L1_RdByte(
-// 						pdev,
-// 						index,
-// 						&byte_value);
-
-// 		if ((byte_value & mask) == value)
-// 		{
-// 			found = 1;
-// 		}
-
-// 		if (status == VL53L1_ERROR_NONE  &&
-// 			found == 0 &&
-// 			poll_delay_ms > 0)
-// 			status = VL53L1_WaitMs(
-// 							pdev,
-// 							poll_delay_ms);
-
-// 		/* Update polling time (Compare difference rather than absolute to
-// 		negate 32bit wrap around issue) */
-// 		VL53L1_GetTickCount(&current_time_ms);
-// 		pdev->new_data_ready_poll_duration_ms = current_time_ms - start_time_ms;
-// 	}
-
-// 	if (found == 0 && status == VL53L1_ERROR_NONE)
-// 		status = VL53L1_ERROR_TIME_OUT;
+	VL53L1_Error status         = VL53L1_ERROR_NONE;
+	uint32_t     start_time_ms   = 0;
+	uint32_t     current_time_ms = 0;
+	uint8_t      byte_value      = 0;
+	uint8_t      found           = 0;
+#ifdef VL53L1_LOG_ENABLE
+	uint32_t     trace_functions = 0;
+#endif
+
+	SUPPRESS_UNUSED_WARNING(poll_delay_ms);
+
+#ifdef VL53L1_LOG_ENABLE
+	/* look up register name */
+	VL53L1_get_register_name(
+			index,
+			register_name);
+
+	/* Output to I2C logger for FMT/DFT  */
+	trace_i2c("WaitValueMaskEx(%5d, %s, 0x%02X, 0x%02X, %5d);\n",
+		timeout_ms, register_name, value, mask, poll_delay_ms);
+#endif // VL53L1_LOG_ENABLE
+
+	/* calculate time limit in absolute time */
+
+	VL53L1_GetTickCount(&start_time_ms);
+	pdev->new_data_ready_poll_duration_ms = 0;
+
+	/* remember current trace functions and temporarily disable
+	 * function logging
+	 */
+
+#ifdef VL53L1_LOG_ENABLE
+	trace_functions = _LOG_GET_TRACE_FUNCTIONS();
+#endif
+
+	/* wait until value is found, timeout reached on error occurred */
+
+	while ((status == VL53L1_ERROR_NONE) &&
+		   (pdev->new_data_ready_poll_duration_ms < timeout_ms) &&
+		   (found == 0))
+	{
+		status = VL53L1_RdByte(
+						pdev,
+						index,
+						&byte_value);
+
+		if ((byte_value & mask) == value)
+		{
+			found = 1;
+		}
+
+		if (status == VL53L1_ERROR_NONE  &&
+			found == 0 &&
+			poll_delay_ms > 0)
+			status = VL53L1_WaitMs(
+							pdev,
+							poll_delay_ms);
+
+		/* Update polling time (Compare difference rather than absolute to
+		negate 32bit wrap around issue) */
+		VL53L1_GetTickCount(&current_time_ms);
+		pdev->new_data_ready_poll_duration_ms = current_time_ms - start_time_ms;
+	}
+
+	if (found == 0 && status == VL53L1_ERROR_NONE)
+		status = VL53L1_ERROR_TIME_OUT;
 
 	return status;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/watchdog.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/watchdog.c
index 46089f6fe..2bb339487 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/watchdog.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/watchdog.c
@@ -33,12 +33,12 @@
 bool watchdogNormalStartTest(void)
 {
   bool wasNormalStart = true;
-  //COMMENTED FIRMWARE
-	// if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST)) {
-	// 	RCC_ClearFlag();
-	// 	wasNormalStart = false;
-	// 	DEBUG_PRINT("The system resumed after watchdog timeout [WARNING]\n");
-	// }
+
+	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST)) {
+		RCC_ClearFlag();
+		wasNormalStart = false;
+		DEBUG_PRINT("The system resumed after watchdog timeout [WARNING]\n");
+	}
 
 	return wasNormalStart;
 }
@@ -46,32 +46,31 @@ bool watchdogNormalStartTest(void)
 
 void watchdogInit(void)
 {
-  //COMMENTED FIRMWARE
-  // IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
+  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
 
-  // // The watchdog uses the LSI oscillator for checking the timeout. The LSI
-  // // oscillator frequency is not very exact and the range is fairly large
-  // // and also differs between the Crazyflie 1.0 and 2.0:
-  // //                 MIN  TYP  MAX
-  // // Crazyflie 1.0   30   40   60   (in kHz)
-  // // Crazyflie 2.0   17   32   47   (in kHz)
-  // //
-  // IWDG_SetPrescaler(IWDG_Prescaler_32);
-  // // Divide the clock with 32 which gives
-  // // an interval of 17kHz/32 (CF2 min) to 60kHz/32 (CF1 max) =>
-  // // 1875 Hz to 531 Hz for the watchdog timer.
-  // //
-  // // The goal timeout is >100 ms, but it's acceptable
-  // // that the max timeout is a bit higher. Scaling the
-  // // reload counter for the fastest LSI then gives a
-  // // timeout of 100ms, which in turn gives a timeout
-  // // of 353ms for the slowest LSI. So the watchdog timeout
-  // // will be between 100ms and 353ms on all platforms.
-  // //
-  // // At prescaler 32 each bit is 1 ms this gives:
-  // // 1875 Hz * 0.1 s / 1 => 188
-  // IWDG_SetReload(188);
+  // The watchdog uses the LSI oscillator for checking the timeout. The LSI
+  // oscillator frequency is not very exact and the range is fairly large
+  // and also differs between the Crazyflie 1.0 and 2.0:
+  //                 MIN  TYP  MAX
+  // Crazyflie 1.0   30   40   60   (in kHz)
+  // Crazyflie 2.0   17   32   47   (in kHz)
+  //
+  IWDG_SetPrescaler(IWDG_Prescaler_32);
+  // Divide the clock with 32 which gives
+  // an interval of 17kHz/32 (CF2 min) to 60kHz/32 (CF1 max) =>
+  // 1875 Hz to 531 Hz for the watchdog timer.
+  //
+  // The goal timeout is >100 ms, but it's acceptable
+  // that the max timeout is a bit higher. Scaling the
+  // reload counter for the fastest LSI then gives a
+  // timeout of 100ms, which in turn gives a timeout
+  // of 353ms for the slowest LSI. So the watchdog timeout
+  // will be between 100ms and 353ms on all platforms.
+  //
+  // At prescaler 32 each bit is 1 ms this gives:
+  // 1875 Hz * 0.1 s / 1 => 188
+  IWDG_SetReload(188);
 
-  // watchdogReset();
-  // IWDG_Enable();
+  watchdogReset();
+  IWDG_Enable();
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ws2812_cf2.c b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ws2812_cf2.c
index c3f217631..34e5bd7b9 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ws2812_cf2.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/drivers/src/ws2812_cf2.c
@@ -64,109 +64,107 @@ static union {
 
 void ws2812Init(void)
 {
-  //COMMENTED FIRMWARE
-// 	uint16_t PrescalerValue;
-
-//   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
-//   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-// 	/* GPIOB Configuration: TIM3 Channel 1 as alternate function push-pull */
-//   // Configure the GPIO PB4 for the timer output
-//   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
-//   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-//   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
-//   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
-//   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
-//   GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-//   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
-//   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
-//   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
-//   GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-//   //Map timer to alternate functions
-//   GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);
-
-// 	/* Compute the prescaler value */
-// 	PrescalerValue = 0;
-// 	/* Time base configuration */
-// 	TIM_TimeBaseStructure.TIM_Period = (105 - 1); // 800kHz
-// 	TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
-// 	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
-// 	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-//   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
-// 	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
-
-// 	/* PWM1 Mode configuration: Channel1 */
-// 	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
-//   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
-// 	TIM_OCInitStructure.TIM_Pulse = 0;
-// 	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
-// 	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
-
-// //  TIM_Cmd(TIM3, ENABLE);                      // Go!!!
-// 	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
-// 	TIM_CtrlPWMOutputs(TIM3, ENABLE);           // enable Timer 3
-
-// 	/* configure DMA */
-// 	/* DMA clock enable */
-// 	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
-
-// 	/* DMA1 Channel5 Config TM */
-// 	DMA_DeInit(DMA1_Stream5);
-
-// 	ASSERT_DMA_SAFE(led_dma.buffer);
-//   // USART TX DMA Channel Config
-//   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM3->CCR2;
-//   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)led_dma.buffer;    // this is the buffer memory
-//   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
-//   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
-//   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
-//   DMA_InitStructure.DMA_BufferSize = 0;
-//   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-//   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
-//   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
-//   DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
-//   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
-//   DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
-//   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
-//   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
-//   DMA_InitStructure.DMA_Channel = DMA_Channel_5;
-// 	DMA_Init(DMA1_Stream5, &DMA_InitStructure);
-
-//   NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;
-//   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_LOW_PRI;
-//   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-//   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-//   NVIC_Init(&NVIC_InitStructure);
-
-//   vSemaphoreCreateBinary(allLedDone);
-
-//   DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE);
-//   DMA_ITConfig(DMA1_Stream5, DMA_IT_HT, ENABLE);
-
-// 	/* TIM3 CC2 DMA Request enable */
-// 	TIM_DMACmd(TIM3, TIM_DMA_CC2, ENABLE);
+	uint16_t PrescalerValue;
+
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
+  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
+	/* GPIOB Configuration: TIM3 Channel 1 as alternate function push-pull */
+  // Configure the GPIO PB4 for the timer output
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
+  GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
+  GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+  //Map timer to alternate functions
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);
+
+	/* Compute the prescaler value */
+	PrescalerValue = 0;
+	/* Time base configuration */
+	TIM_TimeBaseStructure.TIM_Period = (105 - 1); // 800kHz
+	TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
+	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
+	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
+	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
+
+	/* PWM1 Mode configuration: Channel1 */
+	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
+	TIM_OCInitStructure.TIM_Pulse = 0;
+	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
+	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
+
+//  TIM_Cmd(TIM3, ENABLE);                      // Go!!!
+	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
+	TIM_CtrlPWMOutputs(TIM3, ENABLE);           // enable Timer 3
+
+	/* configure DMA */
+	/* DMA clock enable */
+	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
+
+	/* DMA1 Channel5 Config TM */
+	DMA_DeInit(DMA1_Stream5);
+
+	ASSERT_DMA_SAFE(led_dma.buffer);
+  // USART TX DMA Channel Config
+  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM3->CCR2;
+  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)led_dma.buffer;    // this is the buffer memory
+  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
+  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
+  DMA_InitStructure.DMA_BufferSize = 0;
+  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
+  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
+  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
+  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
+  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
+  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
+  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
+  DMA_InitStructure.DMA_Channel = DMA_Channel_5;
+	DMA_Init(DMA1_Stream5, &DMA_InitStructure);
+
+  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_LOW_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
+
+  vSemaphoreCreateBinary(allLedDone);
+
+  DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE);
+  DMA_ITConfig(DMA1_Stream5, DMA_IT_HT, ENABLE);
+
+	/* TIM3 CC2 DMA Request enable */
+	TIM_DMACmd(TIM3, TIM_DMA_CC2, ENABLE);
 
 
 }
 
 static void fillLed(uint16_t *buffer, uint8_t *color)
 {
-  //COMMENTED FIRMWARE
-  //   int i;
-
-  //   for(i=0; i<8; i++) // GREEN data
-	// {
-	//     buffer[i] = ((color[1]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
-	// }
-	// for(i=0; i<8; i++) // RED
-	// {
-	//     buffer[8+i] = ((color[0]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
-	// }
-	// for(i=0; i<8; i++) // BLUE
-	// {
-	//     buffer[16+i] = ((color[2]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
-	// }
+    int i;
+
+    for(i=0; i<8; i++) // GREEN data
+	{
+	    buffer[i] = ((color[1]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
+	}
+	for(i=0; i<8; i++) // RED
+	{
+	    buffer[8+i] = ((color[0]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
+	}
+	for(i=0; i<8; i++) // BLUE
+	{
+	    buffer[16+i] = ((color[2]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
+	}
 }
 
 static int current_led = 0;
@@ -175,83 +173,80 @@ static uint8_t (*color_led)[3] = NULL;
 
 void ws2812Send(uint8_t (*color)[3], uint16_t len)
 {
-  //COMMENTED FIRMWARE
-  //   int i;
-	// if(len<1) return;
-
-	// //Wait for previous transfer to be finished
-	// xSemaphoreTake(allLedDone, portMAX_DELAY);
-
-	// // Set interrupt context ...
-	// current_led = 0;
-	// total_led = len;
-	// color_led = color;
-
-  //   for(i=0; (i<LED_PER_HALF) && (current_led<total_led+2); i++, current_led++) {
-  //       if (current_led<total_led)
-  //           fillLed(led_dma.begin+(24*i), color_led[current_led]);
-  //       else
-  //           bzero(led_dma.begin+(24*i), sizeof(led_dma.begin));
-  //   }
-
-  //   for(i=0; (i<LED_PER_HALF) && (current_led<total_led+2); i++, current_led++) {
-  //       if (current_led<total_led)
-  //           fillLed(led_dma.end+(24*i), color_led[current_led]);
-  //       else
-  //           bzero(led_dma.end+(24*i), sizeof(led_dma.end));
-  //   }
-
-	// DMA1_Stream5->NDTR = sizeof(led_dma.buffer) / sizeof(led_dma.buffer[0]); // load number of bytes to be transferred
-	// DMA_Cmd(DMA1_Stream5, ENABLE); 			// enable DMA channel 2
-	// TIM_Cmd(TIM3, ENABLE);                      // Go!!!
+    int i;
+	if(len<1) return;
+
+	//Wait for previous transfer to be finished
+	xSemaphoreTake(allLedDone, portMAX_DELAY);
+
+	// Set interrupt context ...
+	current_led = 0;
+	total_led = len;
+	color_led = color;
+
+    for(i=0; (i<LED_PER_HALF) && (current_led<total_led+2); i++, current_led++) {
+        if (current_led<total_led)
+            fillLed(led_dma.begin+(24*i), color_led[current_led]);
+        else
+            bzero(led_dma.begin+(24*i), sizeof(led_dma.begin));
+    }
+
+    for(i=0; (i<LED_PER_HALF) && (current_led<total_led+2); i++, current_led++) {
+        if (current_led<total_led)
+            fillLed(led_dma.end+(24*i), color_led[current_led]);
+        else
+            bzero(led_dma.end+(24*i), sizeof(led_dma.end));
+    }
+
+	DMA1_Stream5->NDTR = sizeof(led_dma.buffer) / sizeof(led_dma.buffer[0]); // load number of bytes to be transferred
+	DMA_Cmd(DMA1_Stream5, ENABLE); 			// enable DMA channel 2
+	TIM_Cmd(TIM3, ENABLE);                      // Go!!!
 }
 
 void ws2812DmaIsr(void)
 {
-  //COMMENTED FIRMWARE
-    // portBASE_TYPE xHigherPriorityTaskWoken;
-    // uint16_t * buffer;
-    // int i;
-
-    // if (total_led == 0)
-    // {
-    //   TIM_Cmd(TIM3, DISABLE);
-    // 	DMA_Cmd(DMA1_Stream5, DISABLE);
-    // }
-
-    // if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_HTIF5))
-    // {
-    //   DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_HTIF5);
-    //   buffer = led_dma.begin;
-    // }
-
-    // if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5))
-    // {
-    //   DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5);
-    //   buffer = led_dma.end;
-    // }
-
-    // for(i=0; (i<LED_PER_HALF) && (current_led<total_led+2); i++, current_led++) {
-    //   if (current_led<total_led)
-    //       fillLed(buffer+(24*i), color_led[current_led]);
-    //   else
-    //       bzero(buffer+(24*i), sizeof(led_dma.end));
-    // }
-
-    // if (current_led >= total_led+2) {
-    //   xSemaphoreGiveFromISR(allLedDone, &xHigherPriorityTaskWoken);
-
-	  //   TIM_Cmd(TIM3, DISABLE); 					// disable Timer 3
-	  //   DMA_Cmd(DMA1_Stream5, DISABLE); 			// disable DMA stream4
-
-	  //   total_led = 0;
-    // }
+    portBASE_TYPE xHigherPriorityTaskWoken;
+    uint16_t * buffer;
+    int i;
+
+    if (total_led == 0)
+    {
+      TIM_Cmd(TIM3, DISABLE);
+    	DMA_Cmd(DMA1_Stream5, DISABLE);
+    }
+
+    if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_HTIF5))
+    {
+      DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_HTIF5);
+      buffer = led_dma.begin;
+    }
+
+    if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5))
+    {
+      DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5);
+      buffer = led_dma.end;
+    }
+
+    for(i=0; (i<LED_PER_HALF) && (current_led<total_led+2); i++, current_led++) {
+      if (current_led<total_led)
+          fillLed(buffer+(24*i), color_led[current_led]);
+      else
+          bzero(buffer+(24*i), sizeof(led_dma.end));
+    }
+
+    if (current_led >= total_led+2) {
+      xSemaphoreGiveFromISR(allLedDone, &xHigherPriorityTaskWoken);
+
+	    TIM_Cmd(TIM3, DISABLE); 					// disable Timer 3
+	    DMA_Cmd(DMA1_Stream5, DISABLE); 			// disable DMA stream4
+
+	    total_led = 0;
+    }
 }
 
 #ifndef USDDECK_USE_ALT_PINS_AND_SPI
 void __attribute__((used)) DMA1_Stream5_IRQHandler(void)
 {
-  //COMMENTED FIRMWARE
-  //ws2812DmaIsr();
+  ws2812DmaIsr();
 }
 #endif
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/ledseq.c b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/ledseq.c
index ff5cd881a..94b5dffab 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/ledseq.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/ledseq.c
@@ -192,39 +192,37 @@ static bool ledseqEnabled = false;
 static void lesdeqCmdTask(void* param);
 
 void ledseqInit() {
-
   if(isInit) {
     return;
   }
 
-  //COMMENTED FIRMWARE
-  // ledInit();
-
-  // /* Led sequence priority */
-  // ledseqRegisterSequence(&seq_testPassed);
-  // ledseqRegisterSequence(&seq_testFailed);
-  // ledseqRegisterSequence(&seq_lowbat);
-  // ledseqRegisterSequence(&seq_charged);
-  // ledseqRegisterSequence(&seq_charging);
-  // ledseqRegisterSequence(&seq_calibrated);
-  // ledseqRegisterSequence(&seq_alive);
-  // ledseqRegisterSequence(&seq_linkUp);
-  // ledseqRegisterSequence(&seq_linkDown);
-
-  // //Initialise the sequences state
-  // for(int i=0; i<LED_NUM; i++) {
-  //   activeSeq[i] = 0;
-  // }
-
-  // //Init the soft timers that runs the led sequences for each leds
-  // for(int i=0; i<LED_NUM; i++) {
-  //   timer[i] = xTimerCreateStatic("ledseqTimer", M2T(1000), pdFALSE, (void*)i, runLedseq, &timerBuffer[i]);
-  // }
-
-  // ledseqMutex = xSemaphoreCreateMutex();
-
-  // ledseqCmdQueue = xQueueCreate(10, sizeof(struct ledseqCmd_s));
-  // xTaskCreate(lesdeqCmdTask, LEDSEQCMD_TASK_NAME, LEDSEQCMD_TASK_STACKSIZE, NULL, LEDSEQCMD_TASK_PRI, NULL);
+  ledInit();
+
+  /* Led sequence priority */
+  ledseqRegisterSequence(&seq_testPassed);
+  ledseqRegisterSequence(&seq_testFailed);
+  ledseqRegisterSequence(&seq_lowbat);
+  ledseqRegisterSequence(&seq_charged);
+  ledseqRegisterSequence(&seq_charging);
+  ledseqRegisterSequence(&seq_calibrated);
+  ledseqRegisterSequence(&seq_alive);
+  ledseqRegisterSequence(&seq_linkUp);
+  ledseqRegisterSequence(&seq_linkDown);
+
+  //Initialise the sequences state
+  for(int i=0; i<LED_NUM; i++) {
+    activeSeq[i] = 0;
+  }
+
+  //Init the soft timers that runs the led sequences for each leds
+  for(int i=0; i<LED_NUM; i++) {
+    timer[i] = xTimerCreateStatic("ledseqTimer", M2T(1000), pdFALSE, (void*)i, runLedseq, &timerBuffer[i]);
+  }
+
+  ledseqMutex = xSemaphoreCreateMutex();
+
+  ledseqCmdQueue = xQueueCreate(10, sizeof(struct ledseqCmd_s));
+  xTaskCreate(lesdeqCmdTask, LEDSEQCMD_TASK_NAME, LEDSEQCMD_TASK_STACKSIZE, NULL, LEDSEQCMD_TASK_PRI, NULL);
 
   isInit = true;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/pm_stm32f4.c b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/pm_stm32f4.c
index d522e268d..2b2c74460 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/pm_stm32f4.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/pm_stm32f4.c
@@ -116,9 +116,9 @@ void pmInit(void)
   STATIC_MEM_TASK_CREATE(pmTask, pmTask, PM_TASK_NAME, NULL, PM_TASK_PRI);
 
   isInit = true;
-  //COMMENTED FIRMWARE
-  // pmSyslinkInfo.vBat = 3.7f;
-  // pmSetBatteryVoltage(pmSyslinkInfo.vBat); //TODO remove
+
+  pmSyslinkInfo.vBat = 3.7f;
+  pmSetBatteryVoltage(pmSyslinkInfo.vBat); //TODO remove
 }
 
 bool pmTest(void)
@@ -307,105 +307,104 @@ bool pmIsDischarging(void) {
 
 void pmTask(void *param)
 {
-  //COMMENTED FIRMWARE
-  // PMStates pmStateOld = battery;
-  // uint32_t tickCount;
-
-  // vTaskSetApplicationTaskTag(0, (void*)TASK_PM_ID_NBR);
-
-  // tickCount = xTaskGetTickCount();
-  // batteryLowTimeStamp = tickCount;
-  // batteryCriticalLowTimeStamp = tickCount;
-
-  // pmSetChargeState(charge500mA);
-  // systemWaitStart();
-
-  // while(1)
-  // {
-  //   vTaskDelay(100);
-  //   tickCount = xTaskGetTickCount();
-
-  //   extBatteryVoltage = pmMeasureExtBatteryVoltage();
-  //   extBatteryVoltageMV = (uint16_t)(extBatteryVoltage * 1000);
-  //   extBatteryCurrent = pmMeasureExtBatteryCurrent();
-  //   batteryLevel = pmBatteryChargeFromVoltage(pmGetBatteryVoltage()) * 10;
-
-  //   if (pmGetBatteryVoltage() > PM_BAT_LOW_VOLTAGE)
-  //   {
-  //     batteryLowTimeStamp = tickCount;
-  //   }
-  //   if (pmGetBatteryVoltage() > PM_BAT_CRITICAL_LOW_VOLTAGE)
-  //   {
-  //     batteryCriticalLowTimeStamp = tickCount;
-  //   }
-
-  //   pmState = pmUpdateState();
-
-  //   if (pmState != pmStateOld)
-  //   {
-  //     // Actions on state change
-  //     switch (pmState)
-  //     {
-  //       case charged:
-  //         ledseqStop(&seq_charging);
-  //         ledseqRunBlocking(&seq_charged);
-  //         soundSetEffect(SND_BAT_FULL);
-  //         break;
-  //       case charging:
-  //         ledseqStop(&seq_lowbat);
-  //         ledseqStop(&seq_charged);
-  //         ledseqRunBlocking(&seq_charging);
-  //         soundSetEffect(SND_USB_CONN);
-  //         break;
-  //       case lowPower:
-  //         ledseqRunBlocking(&seq_lowbat);
-  //         soundSetEffect(SND_BAT_LOW);
-  //         break;
-  //       case battery:
-  //         ledseqRunBlocking(&seq_charging);
-  //         ledseqRun(&seq_charged);
-  //         soundSetEffect(SND_USB_DISC);
-  //         break;
-  //       default:
-  //         break;
-  //     }
-  //     pmStateOld = pmState;
-  //   }
-  //   // Actions during state
-  //   switch (pmState)
-  //   {
-  //     case charged:
-  //       break;
-  //     case charging:
-  //       {
-  //         // Charge level between 0.0 and 1.0
-  //         float chargeLevel = pmBatteryChargeFromVoltage(pmGetBatteryVoltage()) / 10.0f;
-  //         ledseqSetChargeLevel(chargeLevel);
-  //       }
-  //       break;
-  //     case lowPower:
-  //       {
-  //         uint32_t batteryCriticalLowTime;
-
-  //         batteryCriticalLowTime = tickCount - batteryCriticalLowTimeStamp;
-  //         if (batteryCriticalLowTime > PM_BAT_CRITICAL_LOW_TIMEOUT)
-  //         {
-  //           pmSystemShutdown();
-  //         }
-  //       }
-  //       break;
-  //     case battery:
-  //       {
-  //         if ((commanderGetInactivityTime() > PM_SYSTEM_SHUTDOWN_TIMEOUT))
-  //         {
-  //           pmSystemShutdown();
-  //         }
-  //       }
-  //       break;
-  //     default:
-  //       break;
-  //   }
-  // }
+  PMStates pmStateOld = battery;
+  uint32_t tickCount;
+
+  vTaskSetApplicationTaskTag(0, (void*)TASK_PM_ID_NBR);
+
+  tickCount = xTaskGetTickCount();
+  batteryLowTimeStamp = tickCount;
+  batteryCriticalLowTimeStamp = tickCount;
+
+  pmSetChargeState(charge500mA);
+  systemWaitStart();
+
+  while(1)
+  {
+    vTaskDelay(100);
+    tickCount = xTaskGetTickCount();
+
+    extBatteryVoltage = pmMeasureExtBatteryVoltage();
+    extBatteryVoltageMV = (uint16_t)(extBatteryVoltage * 1000);
+    extBatteryCurrent = pmMeasureExtBatteryCurrent();
+    batteryLevel = pmBatteryChargeFromVoltage(pmGetBatteryVoltage()) * 10;
+
+    if (pmGetBatteryVoltage() > PM_BAT_LOW_VOLTAGE)
+    {
+      batteryLowTimeStamp = tickCount;
+    }
+    if (pmGetBatteryVoltage() > PM_BAT_CRITICAL_LOW_VOLTAGE)
+    {
+      batteryCriticalLowTimeStamp = tickCount;
+    }
+
+    pmState = pmUpdateState();
+
+    if (pmState != pmStateOld)
+    {
+      // Actions on state change
+      switch (pmState)
+      {
+        case charged:
+          ledseqStop(&seq_charging);
+          ledseqRunBlocking(&seq_charged);
+          soundSetEffect(SND_BAT_FULL);
+          break;
+        case charging:
+          ledseqStop(&seq_lowbat);
+          ledseqStop(&seq_charged);
+          ledseqRunBlocking(&seq_charging);
+          soundSetEffect(SND_USB_CONN);
+          break;
+        case lowPower:
+          ledseqRunBlocking(&seq_lowbat);
+          soundSetEffect(SND_BAT_LOW);
+          break;
+        case battery:
+          ledseqRunBlocking(&seq_charging);
+          ledseqRun(&seq_charged);
+          soundSetEffect(SND_USB_DISC);
+          break;
+        default:
+          break;
+      }
+      pmStateOld = pmState;
+    }
+    // Actions during state
+    switch (pmState)
+    {
+      case charged:
+        break;
+      case charging:
+        {
+          // Charge level between 0.0 and 1.0
+          float chargeLevel = pmBatteryChargeFromVoltage(pmGetBatteryVoltage()) / 10.0f;
+          ledseqSetChargeLevel(chargeLevel);
+        }
+        break;
+      case lowPower:
+        {
+          uint32_t batteryCriticalLowTime;
+
+          batteryCriticalLowTime = tickCount - batteryCriticalLowTimeStamp;
+          if (batteryCriticalLowTime > PM_BAT_CRITICAL_LOW_TIMEOUT)
+          {
+            pmSystemShutdown();
+          }
+        }
+        break;
+      case battery:
+        {
+          if ((commanderGetInactivityTime() > PM_SYSTEM_SHUTDOWN_TIMEOUT))
+          {
+            pmSystemShutdown();
+          }
+        }
+        break;
+      default:
+        break;
+    }
+  }
 }
 
 /**
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usb.c b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usb.c
index 1f300a9b3..2a10496e6 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usb.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usb.c
@@ -402,17 +402,16 @@ void USBD_USR_DeviceDisconnected(void)
 
 void usbInit(void)
 {
-  //COMMENTED FIRMWARE
-  // USBD_Init(&USB_OTG_dev,
-  //           USB_OTG_FS_CORE_ID,
-  //           &USR_desc,
-  //           &cf_usb_cb,
-  //           &USR_cb);
-
-  // usbDataRx = STATIC_MEM_QUEUE_CREATE(usbDataRx);
-  // DEBUG_QUEUE_MONITOR_REGISTER(usbDataRx);
-  // usbDataTx = STATIC_MEM_QUEUE_CREATE(usbDataTx);
-  // DEBUG_QUEUE_MONITOR_REGISTER(usbDataTx);
+  USBD_Init(&USB_OTG_dev,
+            USB_OTG_FS_CORE_ID,
+            &USR_desc,
+            &cf_usb_cb,
+            &USR_cb);
+
+  usbDataRx = STATIC_MEM_QUEUE_CREATE(usbDataRx);
+  DEBUG_QUEUE_MONITOR_REGISTER(usbDataRx);
+  usbDataTx = STATIC_MEM_QUEUE_CREATE(usbDataTx);
+  DEBUG_QUEUE_MONITOR_REGISTER(usbDataTx);
 
   isInit = true;
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usblink.c b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usblink.c
index 225edc6ad..05958a83e 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usblink.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usblink.c
@@ -69,16 +69,15 @@ static USBPacket usbIn;
 static CRTPPacket p;
 static void usblinkTask(void *param)
 {
-  //COMMENTED FIRMWARE
-  // while(1)
-  // {
-  //   // Fetch a USB packet off the queue
-  //   usbGetDataBlocking(&usbIn);
-  //   p.size = usbIn.size - 1;
-  //   memcpy(&p.raw, usbIn.data, usbIn.size);
-  //   // This queuing will copy a CRTP packet size from usbIn
-  //   xQueueSend(crtpPacketDelivery, &p, portMAX_DELAY);
-  // }
+  while(1)
+  {
+    // Fetch a USB packet off the queue
+    usbGetDataBlocking(&usbIn);
+    p.size = usbIn.size - 1;
+    memcpy(&p.raw, usbIn.data, usbIn.size);
+    // This queuing will copy a CRTP packet size from usbIn
+    xQueueSend(crtpPacketDelivery, &p, portMAX_DELAY);
+  }
 
 }
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usec_time.c b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usec_time.c
index 736434172..6971d308e 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usec_time.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/hal/src/usec_time.c
@@ -36,40 +36,39 @@ static uint32_t usecTimerHighCount;
 
 void initUsecTimer(void)
 {
-  //COMMENTED FIRMWARE
-  // if (isInit) {
-  //   return;
-  // }
+  if (isInit) {
+    return;
+  }
 
-  // usecTimerHighCount = 0;
+  usecTimerHighCount = 0;
 
-  // TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
-  // NVIC_InitTypeDef NVIC_InitStructure;
+  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
 
-  // //Enable the Timer
-  // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
+  //Enable the Timer
+  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
 
-  // //Timer configuration
-  // TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
-  // // APB1 clock is /4, but APB clock inputs to timers are doubled when
-  // // the APB clock runs slower than /1, so APB1 timers see a /2 clock
-  // TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / (1000 * 1000) / 2;
-  // TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-  // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-  // TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
-  // TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
+  //Timer configuration
+  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
+  // APB1 clock is /4, but APB clock inputs to timers are doubled when
+  // the APB clock runs slower than /1, so APB1 timers see a /2 clock
+  TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / (1000 * 1000) / 2;
+  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
+  TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
 
-  // NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
-  // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_TRACE_TIM_PRI;
-  // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  // NVIC_Init(&NVIC_InitStructure);
+  NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_TRACE_TIM_PRI;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
 
-  // DBGMCU_APB1PeriphConfig(DBGMCU_TIM7_STOP, ENABLE);
-  // TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
-  // TIM_Cmd(TIM7, ENABLE);
+  DBGMCU_APB1PeriphConfig(DBGMCU_TIM7_STOP, ENABLE);
+  TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
+  TIM_Cmd(TIM7, ENABLE);
 
-  // isInit = true;
+  isInit = true;
 }
 
 uint64_t usecTimestamp(void)
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/init/main.c b/crazyflie_software/crazyflie-firmware-2021.06/src/init/main.c
index 97d331ab8..1faf554a5 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/init/main.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/init/main.c
@@ -62,10 +62,9 @@ int main()
   vTaskStartScheduler();
 
   //TODO: Move to platform launch failed
-  //COMMENTED FIRMWARE
-  // ledInit();
-  // ledSet(0, 1);
-  // ledSet(1, 1);
+  ledInit();
+  ledSet(0, 1);
+  ledSet(1, 1);
 
   //Should never reach this point!
   while(1);
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform.c b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform.c
index cc8f668b4..afb09ba94 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform.c
@@ -31,94 +31,86 @@
 static const platformConfig_t* active_config = 0;
 
 int platformInit(void) {
-  //COMMENTED FIRMWARE
-  // int nrOfConfigs = 0;
-  // const platformConfig_t* configs = platformGetListOfConfigurations(&nrOfConfigs);
-
-  // int err = platformInitConfiguration(configs, nrOfConfigs);
-  // if (err != 0)
-  // {
-  //   // This firmware is not compatible, abort init
-  //   return 1;
-  // }
-
-  // platformInitHardware();
+  int nrOfConfigs = 0;
+  const platformConfig_t* configs = platformGetListOfConfigurations(&nrOfConfigs);
+
+  int err = platformInitConfiguration(configs, nrOfConfigs);
+  if (err != 0)
+  {
+    // This firmware is not compatible, abort init
+    return 1;
+  }
+
+  platformInitHardware();
   return 0;
 }
 
 int platformParseDeviceTypeString(const char* deviceTypeString, char* deviceType) {
-  //COMMENTED FIRMWARE
-  // if (deviceTypeString[0] != '0' || deviceTypeString[1] != ';') {
-  //   return 1;
-  // }
-
-  // const int start = 2;
-  // const int last = start + PLATFORM_DEVICE_TYPE_MAX_LEN - 1;
-  // int end = 0;
-  // for (end = start; end <= last; end++) {
-  //   if (deviceTypeString[end] == '\0' || deviceTypeString[end] == ';') {
-  //     break;
-  //   }
-  // }
-
-  // if (end > last) {
-  //   return 1;
-  // }
-
-  // int length = end - start;
-  // memcpy(deviceType, &deviceTypeString[start], length);
-  // deviceType[length] = '\0';
+  if (deviceTypeString[0] != '0' || deviceTypeString[1] != ';') {
+    return 1;
+  }
+
+  const int start = 2;
+  const int last = start + PLATFORM_DEVICE_TYPE_MAX_LEN - 1;
+  int end = 0;
+  for (end = start; end <= last; end++) {
+    if (deviceTypeString[end] == '\0' || deviceTypeString[end] == ';') {
+      break;
+    }
+  }
+
+  if (end > last) {
+    return 1;
+  }
+
+  int length = end - start;
+  memcpy(deviceType, &deviceTypeString[start], length);
+  deviceType[length] = '\0';
   return 0;
 }
 
 int platformInitConfiguration(const platformConfig_t* configs, const int nrOfConfigs) {
-//COMMENTED FIRMWARE
-// #ifndef DEVICE_TYPE_STRING_FORCE
-//   char deviceTypeString[PLATFORM_DEVICE_TYPE_STRING_MAX_LEN];
-//   char deviceType[PLATFORM_DEVICE_TYPE_MAX_LEN];
-
-//   platformGetDeviceTypeString(deviceTypeString);
-//   platformParseDeviceTypeString(deviceTypeString, deviceType);
-// #else
-//   #define xstr(s) str(s)
-//   #define str(s) #s
-
-//   char* deviceType = xstr(DEVICE_TYPE_STRING_FORCE);
-// #endif
-
-//   for (int i = 0; i < nrOfConfigs; i++) {
-//     const platformConfig_t* config = &configs[i];
-//     if (strcmp(config->deviceType, deviceType) == 0) {
-//       active_config = config;
-       return 0;
-//     }
-//   }
-
-//   return 1;
+#ifndef DEVICE_TYPE_STRING_FORCE
+  char deviceTypeString[PLATFORM_DEVICE_TYPE_STRING_MAX_LEN];
+  char deviceType[PLATFORM_DEVICE_TYPE_MAX_LEN];
+
+  platformGetDeviceTypeString(deviceTypeString);
+  platformParseDeviceTypeString(deviceTypeString, deviceType);
+#else
+  #define xstr(s) str(s)
+  #define str(s) #s
+
+  char* deviceType = xstr(DEVICE_TYPE_STRING_FORCE);
+#endif
+
+  for (int i = 0; i < nrOfConfigs; i++) {
+    const platformConfig_t* config = &configs[i];
+    if (strcmp(config->deviceType, deviceType) == 0) {
+      active_config = config;
+      return 0;
+    }
+  }
+
+  return 1;
 }
 
 const char* platformConfigGetDeviceType() {
-  //COMMENTED FIRMWARE
-  // return active_config->deviceType;
+  return active_config->deviceType;
 }
 
 const char* platformConfigGetDeviceTypeName() {
-  //COMMENTED FIRMWARE
-  // return active_config->deviceTypeName;
+  return active_config->deviceTypeName;
 }
 
 SensorImplementation_t platformConfigGetSensorImplementation() {
-  //COMMENTED FIRMWARE
-  // return active_config->sensorImplementation;
+  return active_config->sensorImplementation;
 }
 
 bool platformConfigPhysicalLayoutAntennasAreClose() {
-  //COMMENTED FIRMWARE
-  // return active_config->physicalLayoutAntennasAreClose;
+  return active_config->physicalLayoutAntennasAreClose;
 }
 
 const MotorPerifDef** platformConfigGetMotorMapping() {
-  //COMMENTED FIRMWARE
-  // return active_config->motorMap;
+  return active_config->motorMap;
 }
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_cf2.c b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_cf2.c
index 76c5299bd..fb250dad5 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_cf2.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_cf2.c
@@ -37,28 +37,28 @@ static platformConfig_t configs[] = {
   {
     .deviceType = "CF20",
     .deviceTypeName = "Crazyflie 2.0",
-    // .sensorImplementation = SensorImplementation_mpu9250_lps25h,
+    .sensorImplementation = SensorImplementation_mpu9250_lps25h,
     .physicalLayoutAntennasAreClose = true,
     .motorMap = motorMapDefaultBrushed,
   },
   {
     .deviceType = "CF21",
     .deviceTypeName = "Crazyflie 2.1",
-    // .sensorImplementation = SensorImplementation_bmi088_bmp388,
+    .sensorImplementation = SensorImplementation_bmi088_bmp388,
     .physicalLayoutAntennasAreClose = false,
     .motorMap = motorMapDefaultBrushed,
   },
   {  // Old ID of Crzyflie Bolt
     .deviceType = "RZ10",
     .deviceTypeName = "Crazyflie Bolt",
-    // .sensorImplementation = SensorImplementation_bmi088_spi_bmp388,
+    .sensorImplementation = SensorImplementation_bmi088_spi_bmp388,
     .physicalLayoutAntennasAreClose = false,
     .motorMap = motorMapBoltBrushless,
   },
   {
     .deviceType = "CB10",
     .deviceTypeName = "Crazyflie Bolt",
-    // .sensorImplementation = SensorImplementation_bmi088_spi_bmp388,
+    .sensorImplementation = SensorImplementation_bmi088_spi_bmp388,
     .physicalLayoutAntennasAreClose = false,
     .motorMap = motorMapBoltBrushless,
   }
@@ -70,12 +70,11 @@ const platformConfig_t* platformGetListOfConfigurations(int* nrOfConfigs) {
 }
 
 void platformInitHardware() {
-  //COMMENTED FIRMWARE
-  // //Low level init: Clock and Interrupt controller
-  // nvicInit();
+  //Low level init: Clock and Interrupt controller
+  nvicInit();
 
-  // //EXTI interrupts
-  // extiInit();
+  //EXTI interrupts
+  extiInit();
 }
 
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_stm32f4.c b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_stm32f4.c
index b4bc0bb04..77f5072b0 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_stm32f4.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_stm32f4.c
@@ -38,35 +38,33 @@
 #define DEFAULT_PLATFORM_STRING "0;CF20"
 
 
-//COMMENTED FIRMWARE
-// #ifndef UNIT_TEST_MODE
-// static char* getAddressOfOtpMemoryBlock(int blockNr) {
-//   return (char*)(0x1fff7800 + blockNr * 0x20);
-// }
-// #else
-//   // This function is replaced by a mock in unit tests
-//   char* getAddressOfOtpMemoryBlock(const int blockNr);
-// #endif
+#ifndef UNIT_TEST_MODE
+static char* getAddressOfOtpMemoryBlock(int blockNr) {
+  return (char*)(0x1fff7800 + blockNr * 0x20);
+}
+#else
+  // This function is replaced by a mock in unit tests
+  char* getAddressOfOtpMemoryBlock(const int blockNr);
+#endif
 
 
 
 
 void platformGetDeviceTypeString(char* deviceTypeString) {
-  //COMMENTED FIRMWARE
-  // char* block = 0;
+  char* block = 0;
 
-  // for (int i = 0; i < PLATFORM_INFO_OTP_NR_OF_BLOCKS; i++) {
-  //   char* candidateBlock = getAddressOfOtpMemoryBlock(i);
-  //   if (candidateBlock[0] != 0) {
-  //     block = candidateBlock;
-  //     break;
-  //   }
-  // }
+  for (int i = 0; i < PLATFORM_INFO_OTP_NR_OF_BLOCKS; i++) {
+    char* candidateBlock = getAddressOfOtpMemoryBlock(i);
+    if (candidateBlock[0] != 0) {
+      block = candidateBlock;
+      break;
+    }
+  }
 
-  // if (!block || ((unsigned char)block[0]) == 0xff) {
-  //   block = DEFAULT_PLATFORM_STRING;
-  // }
+  if (!block || ((unsigned char)block[0]) == 0xff) {
+    block = DEFAULT_PLATFORM_STRING;
+  }
 
-  // strncpy(deviceTypeString, block, PLATFORM_INFO_OTP_BLOCK_LEN);
-  // deviceTypeString[PLATFORM_INFO_OTP_BLOCK_LEN] = '\0';
+  strncpy(deviceTypeString, block, PLATFORM_INFO_OTP_BLOCK_LEN);
+  deviceTypeString[PLATFORM_INFO_OTP_BLOCK_LEN] = '\0';
 }
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_tag.c b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_tag.c
index 7cb8eaa62..cc15b5445 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_tag.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_tag.c
@@ -37,32 +37,29 @@ static platformConfig_t configs[] = {
   {
     .deviceType = "RR10",
     .deviceTypeName = "Roadrunner 1.0",
-    // .sensorImplementation = SensorImplementation_bmi088_bmp388,
+    .sensorImplementation = SensorImplementation_bmi088_bmp388,
     .physicalLayoutAntennasAreClose = false,
     .motorMap = motorMapNoMotors,
   },
 };
 
 const platformConfig_t* platformGetListOfConfigurations(int* nrOfConfigs) {
-  //COMMENTED FIRMWARE
-  // *nrOfConfigs = sizeof(configs) / sizeof(platformConfig_t);
-  // return configs;
+  *nrOfConfigs = sizeof(configs) / sizeof(platformConfig_t);
+  return configs;
 }
 
 void platformInitHardware() {
-  //COMMENTED FIRMWARE
-  // //Low level init: Clock and Interrupt controller
-  // nvicInit();
+  //Low level init: Clock and Interrupt controller
+  nvicInit();
 
-  // //EXTI interrupts
-  // extiInit();
+  //EXTI interrupts
+  extiInit();
 }
 
 
 // Config functions ------------------------
 
 const char* platformConfigGetPlatformName() {
-  //COMMENTED FIRMWARE
-  // return "tag";
+  return "tag";
 }
 
diff --git a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_utils.c b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_utils.c
index e2d275fa9..3f136b00e 100644
--- a/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_utils.c
+++ b/crazyflie_software/crazyflie-firmware-2021.06/src/platform/platform_utils.c
@@ -38,9 +38,8 @@
 
 
 void platformSetLowInterferenceRadioMode(void) {
-    //COMMENTED FIRMWARE
-//  // Decrease the nRF51 Tx power to reduce interference
-//  radiolinkSetPowerDbm(PLATFORM_NRF51_LOW_INTERFERENCE_TX_POWER_DBM);
-//  DEBUG_PRINT("Low interference mode. NRF51 TX power offset by %ddb.\r\n", PLATFORM_NRF51_LOW_INTERFERENCE_TX_POWER_DBM);
+ // Decrease the nRF51 Tx power to reduce interference
+ radiolinkSetPowerDbm(PLATFORM_NRF51_LOW_INTERFERENCE_TX_POWER_DBM);
+ DEBUG_PRINT("Low interference mode. NRF51 TX power offset by %ddb.\r\n", PLATFORM_NRF51_LOW_INTERFERENCE_TX_POWER_DBM);
 }
 
-- 
GitLab