From 124bb8a7d19660248291454c850613e964d142d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sergi=20Hern=C3=A0ndez=20Juan?= <shernand@iri.upc.edu>
Date: Wed, 16 Mar 2016 11:46:03 +0000
Subject: [PATCH] Added event activations in the main thread to avoid getting
 stuck when an scanning error occurs or the scan is cancelled.

---
 src/dynamixelserver.cpp | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/dynamixelserver.cpp b/src/dynamixelserver.cpp
index 7f503a1..822a9c0 100644
--- a/src/dynamixelserver.cpp
+++ b/src/dynamixelserver.cpp
@@ -584,7 +584,8 @@ void *CDynamixelServer::scan_thread(void *param)
         dyn_server->dynamixel_access.enter();
         dyn_server->state=dyn_created;
         dyn_server->scan_error="communication device not initialized";
-        dyn_server->event_server->set_event(dyn_server->scan_error_event_id);
+        if(!dyn_server->event_server->event_is_set(dyn_server->scan_error_event_id))
+          dyn_server->event_server->set_event(dyn_server->scan_error_event_id);
         dyn_server->dynamixel_access.exit();
         pthread_exit(NULL);
       }
@@ -596,6 +597,8 @@ void *CDynamixelServer::scan_thread(void *param)
           if(dyn_server->event_server->event_is_set(dyn_server->stop_scan_event_id))
           {
             dyn_server->event_server->reset_event(dyn_server->stop_scan_event_id);
+            if(!dyn_server->event_server->event_is_set(dyn_server->scan_done_event_id))
+              dyn_server->event_server->set_event(dyn_server->scan_done_event_id);
             dyn_server->devices_v1.clear();
             dyn_server->devices_v2.clear();
             pthread_exit(NULL);
@@ -632,14 +635,16 @@ void *CDynamixelServer::scan_thread(void *param)
       dyn_server->devices_v2.clear();
       dyn_server->state=dyn_created;
       dyn_server->scan_error=e.what();
-      dyn_server->event_server->set_event(dyn_server->scan_error_event_id);
+      if(!dyn_server->event_server->event_is_set(dyn_server->scan_error_event_id))
+        dyn_server->event_server->set_event(dyn_server->scan_error_event_id);
       dyn_server->dynamixel_access.exit();
       pthread_exit(NULL);
     }
   }
   dyn_server->dynamixel_access.enter();
   dyn_server->state=dyn_scan_done;
-  dyn_server->event_server->set_event(dyn_server->scan_done_event_id);
+  if(!dyn_server->event_server->event_is_set(dyn_server->scan_done_event_id))
+    dyn_server->event_server->set_event(dyn_server->scan_done_event_id);
   dyn_server->dynamixel_access.exit();
   pthread_exit(NULL);
 }
-- 
GitLab