From 7d91227eb0ce9de2ddac145b22fa363cf94894f6 Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Wed, 15 May 2019 14:37:47 +0200
Subject: [PATCH] Modified the Dynamixel server to allow multiple instances of
 a single device.

---
 src/dynamixelserver.cpp        | 103 +++------------------------------
 src/dynamixelserver.h          |  11 +---
 src/dynamixelserver_ftdi.cpp   |  15 ++---
 src/dynamixelserver_serial.cpp |   4 +-
 4 files changed, 16 insertions(+), 117 deletions(-)

diff --git a/src/dynamixelserver.cpp b/src/dynamixelserver.cpp
index c48e6a8..37c91fc 100644
--- a/src/dynamixelserver.cpp
+++ b/src/dynamixelserver.cpp
@@ -194,9 +194,7 @@ unsigned char CDynamixelServer::receive_status_packet_v1(unsigned char **data,un
       do{
         if((num=this->comm_dev->get_num_data())==0)
         {
-          this->dynamixel_access.exit();
           this->event_server->wait_all(events,20);
-          this->dynamixel_access.enter();
           num=this->comm_dev->get_num_data();
         }
         if((read+num)>1024)
@@ -217,9 +215,7 @@ unsigned char CDynamixelServer::receive_status_packet_v1(unsigned char **data,un
       {
         if((num=this->comm_dev->get_num_data())==0)
         {
-          this->dynamixel_access.exit();
           this->event_server->wait_all(events,20);
-          this->dynamixel_access.enter();
           num=this->comm_dev->get_num_data();
         }
         if((read-start+num)>length)
@@ -281,9 +277,7 @@ unsigned char CDynamixelServer::receive_status_packet_v2(unsigned char **data,un
       do{
         if((num=this->comm_dev->get_num_data())==0)
         {
-          this->dynamixel_access.exit();
           this->event_server->wait_all(events,20);
-          this->dynamixel_access.enter();
           num=this->comm_dev->get_num_data();
         }
         if((read+num)>1024)
@@ -304,9 +298,7 @@ unsigned char CDynamixelServer::receive_status_packet_v2(unsigned char **data,un
       {
         if((num=this->comm_dev->get_num_data())==0)
         {
-          this->dynamixel_access.exit();
           this->event_server->wait_all(events,20);
-          this->dynamixel_access.enter();
           num=this->comm_dev->get_num_data();
         }
         if((read-start+num)>length)
@@ -579,7 +571,6 @@ void CDynamixelServer::sync_packet_v2(unsigned char *data,unsigned int length,in
 void *CDynamixelServer::scan_thread(void *param)
 {
   CDynamixelServer *dyn_server=(CDynamixelServer *)param;
-  TDynDevice device;
   int freq=0,id=0;
   bool end=false,found=false;
 
@@ -618,15 +609,10 @@ void *CDynamixelServer::scan_thread(void *param)
             }catch(CEventTimeoutException &e){
               continue;
             }
-            dyn_server->dynamixel_access.enter();
-            device.id=id;
-            device.version=dyn_server->scan_version;
-            device.used=false;
-            dyn_server->dynamixel_access.exit();
             if(dyn_server->scan_version==dyn_version1)
-              dyn_server->devices_v1.push_back(device);
+              dyn_server->devices_v1.push_back(id);
             else
-              dyn_server->devices_v2.push_back(device);
+              dyn_server->devices_v2.push_back(id);
             found=true;
           }
         }
@@ -735,15 +721,12 @@ int CDynamixelServer::get_num_devices(dyn_version_t version)
 std::vector<int> CDynamixelServer::get_device_ids(dyn_version_t version)
 {
   std::vector<int> ids;
-  unsigned int i=0;
 
   this->dynamixel_access.enter();
   if(version==dyn_version1)
-    for(i=0;i<this->devices_v1.size();i++)
-      ids.push_back(this->devices_v1[i].id);
+    ids=this->devices_v1;
   else
-    for(i=0;i<this->devices_v2.size();i++)
-      ids.push_back(this->devices_v2[i].id);
+    ids=this->devices_v2;
   this->dynamixel_access.exit();
 
   return ids;
@@ -755,7 +738,6 @@ CDynamixel *CDynamixelServer::get_device(int dev_id,dyn_version_t version)
   CDynamixel *dynamixel=NULL;
   std::string name,serial;
   bool updated=false;
-  TDynDevice device;
   unsigned int i=0;
 
   this->dynamixel_access.enter();
@@ -765,35 +747,6 @@ CDynamixel *CDynamixelServer::get_device(int dev_id,dyn_version_t version)
     /* handle exceptions */
     throw CDynamixelServerException(_HERE_,"No communication device has been initialized.");
   }
-  else
-  {
-    if(version==dyn_version1)
-    {
-      for(i=0;i<this->devices_v1.size();i++)
-        if(this->devices_v1[i].id==dev_id)
-        {
-          if(this->devices_v1[i].used)
-          {
-            /* handle exceptions */
-            this->dynamixel_access.exit();
-            throw CDynamixelServerException(_HERE_,"Device has already been assigned.");
-          }
-        }
-    }
-    else
-    {
-      for(i=0;i<this->devices_v2.size();i++)
-        if(this->devices_v2[i].id==dev_id)
-        {
-          if(this->devices_v2[i].used)
-          {
-            /* handle exceptions */
-            this->dynamixel_access.exit();
-            throw CDynamixelServerException(_HERE_,"Device has already been assigned.");
-          }
-        }
-    }
-  }
   this->dynamixel_access.exit();
   if(dynamixel==NULL)
   {
@@ -819,37 +772,21 @@ CDynamixel *CDynamixelServer::get_device(int dev_id,dyn_version_t version)
     {
       for(i=0;i<devices_v1.size();i++)
       {
-        if(this->devices_v1[i].id==dev_id)
-        {
-          this->devices_v1[i].used=true;
+        if(this->devices_v1[i]==dev_id)
           updated=true;
-        }
       }
       if(!updated)
-      {
-        device.id=dev_id;
-        device.version=version;
-        device.used=true;
-        this->devices_v1.push_back(device);
-      }
+        this->devices_v1.push_back(dev_id);
     }
     else
     {
       for(i=0;i<devices_v2.size();i++)
       {
-        if(this->devices_v2[i].id==dev_id)
-        {
-          this->devices_v2[i].used=true;
+        if(this->devices_v2[i]==dev_id)
           updated=true;
-        }
       }
       if(!updated)
-      {
-        device.id=dev_id;
-        device.version=version;
-        device.used=true;
-        this->devices_v2.push_back(device);
-      }
+        this->devices_v2.push_back(dev_id);
     }
   }
   this->dynamixel_access.exit();
@@ -859,30 +796,6 @@ CDynamixel *CDynamixelServer::get_device(int dev_id,dyn_version_t version)
 
 void CDynamixelServer::free_device(int dev_id,dyn_version_t version)
 {
-  unsigned int i=0;
-
-  if(version==dyn_version1)
-  {
-    for(i=0;i<this->devices_v1.size();i++)
-    {
-      if(this->devices_v1[i].id==dev_id)
-      {
-        if(this->devices_v1[i].used)
-          this->devices_v1[i].used=false;
-      }
-    }
-  }
-  else
-  {
-    for(i=0;i<this->devices_v2.size();i++)
-    {
-      if(this->devices_v2[i].id==dev_id)
-      {
-        if(this->devices_v2[i].used)
-          this->devices_v2[i].used=false;
-      }
-    }
-  }
 }
 
 void CDynamixelServer::action(dyn_version_t version)
diff --git a/src/dynamixelserver.h b/src/dynamixelserver.h
index eba9a86..9c5559a 100644
--- a/src/dynamixelserver.h
+++ b/src/dynamixelserver.h
@@ -37,13 +37,6 @@ class CDynamixel;
  */
 typedef enum {dyn_created,dyn_scanning,dyn_scan_done} dynamixel_state;
 
-typedef struct
-{
-  unsigned char id; 
-  dyn_version_t version;
-  bool used;
-}TDynDevice;
-
 /**
  * \brief
  *
@@ -137,12 +130,12 @@ class CDynamixelServer
      * \brief 
      *
      */ 
-    std::vector<TDynDevice> devices_v1;
+    std::vector<int> devices_v1;
     /**
      * \brief 
      *
      */ 
-    std::vector<TDynDevice> devices_v2;
+    std::vector<int> devices_v2;
     /**
      * \brief 
      *
diff --git a/src/dynamixelserver_ftdi.cpp b/src/dynamixelserver_ftdi.cpp
index 19c2306..fad0e4e 100644
--- a/src/dynamixelserver_ftdi.cpp
+++ b/src/dynamixelserver_ftdi.cpp
@@ -106,19 +106,12 @@ void CDynamixelServerFTDI::config(std::string &filename)
 int CDynamixelServerFTDI::get_num_buses(void)
 {
   CFTDIServer *ftdi_server=CFTDIServer::instance();
-  int num_dev=0,i=0,num_buses=0;
-  std::string description;
+  int num_buses=0;
 
   this->dynamixel_access.enter();
   try{
     ftdi_server->scan_bus();// rescan all the present FTDI devices
-    num_dev=ftdi_server->get_num_devices();
-    for(i=0;i<num_dev;i++)
-    {
-      description=ftdi_server->get_description(i);
-      if(description=="FT232R USB UART")
-        num_buses++; 
-    }
+    num_buses=ftdi_server->get_num_devices();
   }catch(CException &e){
     /* handle exceptions */
     this->dynamixel_access.exit();
@@ -235,7 +228,7 @@ void CDynamixelServerFTDI::set_baudrate(int baudrate)
           data.resize(this->devices_v1.size());
           for(i=0;i<this->devices_v1.size();i++)
           {
-            servo_ids.push_back(devices_v1[i].id);
+            servo_ids.push_back(devices_v1[i]);
             data[i].clear();
             data[i].push_back(((2000000/baudrate)-1));
           }
@@ -247,7 +240,7 @@ void CDynamixelServerFTDI::set_baudrate(int baudrate)
           data.resize(this->devices_v2.size());
           for(i=0;i<this->devices_v2.size();i++)
           {
-            servo_ids.push_back(devices_v2[i].id);
+            servo_ids.push_back(devices_v2[i]);
             data[i].clear();
             data[i].push_back(((2000000/baudrate)-1));
           }
diff --git a/src/dynamixelserver_serial.cpp b/src/dynamixelserver_serial.cpp
index 94e44e0..26c6587 100644
--- a/src/dynamixelserver_serial.cpp
+++ b/src/dynamixelserver_serial.cpp
@@ -110,7 +110,7 @@ void CDynamixelServerSerial::set_baudrate(int baudrate)
           data.resize(this->devices_v1.size());
           for(i=0;i<this->devices_v1.size();i++)
           {
-            servo_ids.push_back(devices_v1[i].id);
+            servo_ids.push_back(devices_v1[i]);
             data[i].clear();
             data[i].push_back(((2000000/baudrate)-1));
           }
@@ -122,7 +122,7 @@ void CDynamixelServerSerial::set_baudrate(int baudrate)
           data.resize(this->devices_v2.size());
           for(i=0;i<this->devices_v2.size();i++)
           {
-            servo_ids.push_back(devices_v2[i].id);
+            servo_ids.push_back(devices_v2[i]);
             data[i].clear();
             data[i].push_back(((2000000/baudrate)-1));
           }
-- 
GitLab