From 962273b10bf8c4c1607dbb25229cf1bc04c82820 Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Tue, 4 Feb 2020 09:11:46 +0100
Subject: [PATCH] When stopping, changed the mode after ending the thread. When
 starting, changed the mode before starting the thread.

---
 src/bno055_imu_driver.cpp | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/src/bno055_imu_driver.cpp b/src/bno055_imu_driver.cpp
index 83172a7..6159d77 100644
--- a/src/bno055_imu_driver.cpp
+++ b/src/bno055_imu_driver.cpp
@@ -473,17 +473,7 @@ void CBNO055IMUDriver::set_operation_mode(op_mode_t op_mode)
 {
   if(this->op_mode!=op_mode)
   {
-    try{
-      this->imu_access.enter();
-      this->change_register_page(0x00);
-      this->write_registers(0x3D,1,(unsigned char *)&op_mode);
-      this->imu_access.exit();
-    }catch(CException &e){
-      this->imu_access.exit();
-      throw;
-    }
-    this->op_mode=op_mode;  
-    if(this->op_mode==config_mode)
+    if(op_mode==config_mode)
     {
       if(this->thread_server->get_thread_state(this->data_thread_id)==starting ||
         this->thread_server->get_thread_state(this->data_thread_id)==active)
@@ -492,9 +482,29 @@ void CBNO055IMUDriver::set_operation_mode(op_mode_t op_mode)
         this->thread_server->end_thread(this->data_thread_id);
         this->event_server->reset_event(this->finish_thread_event_id);
       }  
+      try{
+        this->imu_access.enter();
+        this->change_register_page(0x00);
+        this->write_registers(0x3D,1,(unsigned char *)&op_mode);
+        this->imu_access.exit();
+      }catch(CException &e){
+        this->imu_access.exit();
+        throw;
+      }
+      this->op_mode=op_mode;  
     } 
     else
     {
+      try{
+        this->imu_access.enter();
+        this->change_register_page(0x00);
+        this->write_registers(0x3D,1,(unsigned char *)&op_mode);
+        this->imu_access.exit();
+      }catch(CException &e){
+        this->imu_access.exit();
+        throw;
+      }
+      this->op_mode=op_mode;  
       if(this->thread_server->get_thread_state(this->data_thread_id)==attached)
         this->thread_server->start_thread(this->data_thread_id);
     }
-- 
GitLab