From 497252e128f91291fd723301a8d5b7149799aa96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sergi=20Hern=C3=A1ndez?= <shernand@iri.upc.edu>
Date: Sun, 3 Apr 2016 18:27:07 +0000
Subject: [PATCH] IMU module workng. Chnaged the priorities of the IMU and
 dynamixel slave interrupts to avoid hanging when calling the imu_stop()
 function.

---
 include/darwin_registers.h |  2 +-
 src/adc_dma.c              |  2 +-
 src/darwin_dyn_slave.c     |  2 +-
 src/imu.c                  | 17 ++++++++++++-----
 4 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/include/darwin_registers.h b/include/darwin_registers.h
index 27921e9..3a579af 100644
--- a/include/darwin_registers.h
+++ b/include/darwin_registers.h
@@ -375,7 +375,7 @@ typedef enum {
 #define      IMU_MEM_LENGTH          15
 #define      IMU_START               0x01
 #define      IMU_STOP                0x02
-#define      IMU_START_CAL           0x03
+#define      IMU_START_CAL           0x04
 #define      IMU_RUNNING             0x10
 #define      IMU_CALIBRATING         0x20
 #define      IMU_ACCEL_DET           0x40
diff --git a/src/adc_dma.c b/src/adc_dma.c
index 8185492..1928371 100755
--- a/src/adc_dma.c
+++ b/src/adc_dma.c
@@ -106,7 +106,7 @@ uint16_t adc_convert_temperature(uint16_t value)
 {
   float conv_value;
 
-  conv_value=(TEMP_V25-value*VOLTAGE_DELTA)*TEMP_INV_SLOPE+25.0;
+  conv_value=(value*VOLTAGE_DELTA-TEMP_V25)*TEMP_INV_SLOPE+25.0;
 
   return conv_value*(1<<10);// fixed point format 6 | 10
 }
diff --git a/src/darwin_dyn_slave.c b/src/darwin_dyn_slave.c
index 3c701a1..e00f195 100755
--- a/src/darwin_dyn_slave.c
+++ b/src/darwin_dyn_slave.c
@@ -134,7 +134,7 @@ void darwin_dyn_slave_init(void)
   darwin_dyn_slave_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
   HAL_TIM_Base_Init(&darwin_dyn_slave_tim_handle);
   // initialize the timer interrupts
-  HAL_NVIC_SetPriority(DYN_SLAVE_TIMER_IRQn, 2, 0);
+  HAL_NVIC_SetPriority(DYN_SLAVE_TIMER_IRQn, 2, 2);
   HAL_NVIC_EnableIRQ(DYN_SLAVE_TIMER_IRQn);
 
 }
diff --git a/src/imu.c b/src/imu.c
index 02b924b..8175e80 100755
--- a/src/imu.c
+++ b/src/imu.c
@@ -1,6 +1,5 @@
 #include "imu.h"
 #include "ram.h"
-#include "gpio.h"
 
 #define        IMU_SPI                 SPI2
 #define        IMU_ENABEL_SPI_CLK      __SPI2_CLK_ENABLE()
@@ -106,7 +105,7 @@ const uint8_t gyro_data_len=6;
 int16_t gyro_center[3];
 int32_t gyro_data[3];
 uint8_t gyro_calibration;
-uint8_t gyro_calibration_num_samples;
+uint16_t gyro_calibration_num_samples;
 // accelerometer variables
 const uint8_t accel_conf_reg=ACCEL_CNTRL_REG1;
 const uint8_t accel_conf_len=5;
@@ -259,7 +258,7 @@ void imu_accel_convert_data(uint8_t *data_in,uint8_t *data_out)
 
   for(i=0;i<3;i++)
   {
-    value=(data_in[i*2]+(data_in[i*2+1]<<8))<<1;
+    value=(data_in[i*2]+(data_in[i*2+1]<<8));
     data_out[i*2]=value%256;
     data_out[i*2+1]=value/256;
   }
@@ -506,7 +505,7 @@ void imu_init(void)
   HAL_SPI_Init(&hspi2);
 
   /* Configure the SPI interrupt priority */
-  HAL_NVIC_SetPriority(IMU_SPI_IRQn, 2, 1);
+  HAL_NVIC_SetPriority(IMU_SPI_IRQn, 1, 2);
   HAL_NVIC_EnableIRQ(IMU_SPI_IRQn);
 
   /* imu timer configuration */
@@ -519,7 +518,7 @@ void imu_init(void)
   HAL_TIM_Base_Init(&htim);
   IMU_ENABLE_TIMER_CLK;  
 
-  HAL_NVIC_SetPriority(IMU_TIMER_IRQn, 2, 0);
+  HAL_NVIC_SetPriority(IMU_TIMER_IRQn, 1, 3);
   HAL_NVIC_EnableIRQ(IMU_TIMER_IRQn);
 
   __HAL_SPI_ENABLE_IT(&hspi2, SPI_IT_RXNE);
@@ -604,6 +603,8 @@ uint8_t imu_in_range(unsigned short int address,unsigned short int length)
 
 void imu_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
 {
+  uint16_t num_samples;
+
   if(ram_in_range(DARWIN_IMU_CNTRL,address,length))
   {
     if(data[DARWIN_IMU_CNTRL-address]&IMU_START)
@@ -613,5 +614,11 @@ void imu_process_write_cmd(unsigned short int address,unsigned short int length,
     else if(data[DARWIN_IMU_CNTRL-address]&IMU_START_CAL)
       imu_start_gyro_cal();
   }
+  ram_read_word(DARWIN_IMU_CAL_SAMPLES_L,&num_samples);
+  if(ram_in_range(DARWIN_IMU_CAL_SAMPLES_L,address,length))
+    num_samples=(num_samples&0xFF00)+data[DARWIN_IMU_CAL_SAMPLES_L-address];
+  if(ram_in_range(DARWIN_IMU_CAL_SAMPLES_H,address,length))
+    num_samples=(num_samples&0x00FF)+(data[DARWIN_IMU_CAL_SAMPLES_H-address]<<8);
+  imu_set_calibration_samples(num_samples);
 }
 
-- 
GitLab